diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..13a79154d8 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,289 @@ +# Python CircleCI 2.0 configuration file +# +# Check https://circleci.com/docs/2.0/language-python/ for more details +# +version: 2 +jobs: + build: + docker: + # specify the version you desire here + # use `-browsers` prefix for selenium tests, e.g. `3.6.1-browsers` + - image: circleci/python:2.7.13 + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/postgres:9.4 + environment: + TEST_PLATFORM: "-e megaatmega2560" + + working_directory: ~/Marlin + + steps: + - checkout + + - restore_cache: + paths: + - ~/.platformio + - ~/Marlin/.piolibdeps + keys: + - v1-dependencies-{{ checksum "~/Marlin/platformio.ini" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: + name: install dependencies + command: | + sudo pip install -U platformio + + # run tests! + - run: + name: run tests + command: | + # + # + # Fetch the tag information for the current branch + ls -la + git fetch origin --tags + # + # Publish the buildroot script folder + chmod +x buildroot/bin/* + export PATH=`pwd`/buildroot/bin/:${PATH} + + # Generate custom version include + generate_version_header_for_marlin ./Marlin/src/inc + cat ./Marlin/src/inc/_Version.h + # + # Backup pins_RAMPS.h + # + cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup + # + + ################################# + # Build all sample configurations + ################################# + + echo testing megaatmega2560 targets... + export TEST_PLATFORM="-e megaatmega2560" + restore_configs + echo use_example_configs adafruit/ST7565 + use_example_configs adafruit/ST7565 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/Hephestos + use_example_configs BQ/Hephestos + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/Hephestos_2 + use_example_configs BQ/Hephestos_2 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/WITBOX + use_example_configs BQ/WITBOX + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs AliExpress/CL-260 + use_example_configs AliExpress/CL-260 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Cartesio + use_example_configs Cartesio + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/FLSUN/auto_calibrate + use_example_configs delta/FLSUN/auto_calibrate + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/FLSUN/kossel_mini + use_example_configs delta/FLSUN/kossel_mini + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/generic + use_example_configs delta/generic + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/kossel_mini + use_example_configs delta/kossel_mini + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/kossel_xl + use_example_configs delta/kossel_xl + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Felix + use_example_configs Felix + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Felix/DUAL + use_example_configs Felix/DUAL + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs gCreate/gMax1.5+ + use_example_configs gCreate/gMax1.5+ + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Geeetech/GT2560 + use_example_configs Geeetech/GT2560 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Geeetech/I3_Pro_X-GT2560 + use_example_configs Geeetech/I3_Pro_X-GT2560 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Infitary/i3-M508 + use_example_configs Infitary/i3-M508 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + # + # Disabled due to compile failure on E0_AUTO_FAN_PIN PB8 + # + # use_example_configs Malyan/M200 + # build_marlin_pio ./ ${TEST_PLATFORM} + # restore_configs + echo use_example_configs Micromake/C1/basic + use_example_configs Micromake/C1/basic + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Micromake/C1/enhanced + use_example_configs Micromake/C1/enhanced + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs RepRapWorld/Megatronics + use_example_configs RepRapWorld/Megatronics + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs RigidBot + use_example_configs RigidBot + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs SCARA + use_example_configs SCARA + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8200 + use_example_configs Velleman/K8200 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8400/Dual-head + use_example_configs Velleman/K8400/Dual-head + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8400 + use_example_configs Velleman/K8400 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Wanhao/Duplicator6 + use_example_configs Wanhao/Duplicator6 + build_marlin_pio ./ ${TEST_PLATFORM} + # + # Disabled due to compile failure on https://github.com/stawel/SlowSoftI2CMaster + # + # - Requires https://github.com/stawel/SlowSoftI2CMaster + # restore_configs + # use_example_configs wt150 + # build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing anet10 targets... + export TEST_PLATFORM="-e anet10" + restore_configs + echo use_example_configs Anet/A6 + use_example_configs Anet/A6 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Anet/A8 + use_example_configs Anet/A8 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Creality/CR-10 + use_example_configs Creality/CR-10 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Malyan/M150 + use_example_configs Malyan/M150 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Sanguinololu + use_example_configs Sanguinololu + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs TinyBoy2 + use_example_configs TinyBoy2 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing rambo targets... + export TEST_PLATFORM="-e rambo" + restore_configs + echo use_example_configs AlephObjects/TAZ4 + use_example_configs AlephObjects/TAZ4 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing teensy20 targets... + export TEST_PLATFORM="-e teensy20" + # + # Disabled due to Z_MIN_PIN related compile failure + # + # restore_configs + # use_example_configs delta/kossel_pro + # build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs makibox + use_example_configs makibox + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing sanguino_atmega644p targets... + export TEST_PLATFORM="-e sanguino_atmega644p" + restore_configs + echo use_example_configs tvrrug/Round2 + use_example_configs tvrrug/Round2 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing LPC1768 targets... + export TEST_PLATFORM="-e LPC1768" + restore_configs + echo use_example_configs FolgerTech/i3-2020 + use_example_configs FolgerTech/i3-2020 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Mks/Sbase + use_example_configs Mks/Sbase + build_marlin_pio ./ ${TEST_PLATFORM} + + # + # Disabled due to numerous compile failures + # + # echo testing STM32F1 targets... + # export TEST_PLATFORM="-e STM32F1" + # restore_configs + # use_example_configs STM32F10 + # build_marlin_pio ./ ${TEST_PLATFORM} + # restore_configs + # use_example_configs stm32f103ret6 + # build_marlin_pio ./ ${TEST_PLATFORM} + + + # + # Disabled due do pin related compile failures + # + # echo testing DUE targets... + # export TEST_PLATFORM="-e DUE" + # restore_configs + # use_example_configs UltiMachine/Archim2 + # build_marlin_pio ./ ${TEST_PLATFORM} + + # + # Remove temp files from dependencies tree prior to caching + rm -rf ~/Marlin/.piolibdeps/_tmp_* + + + + - save_cache: + paths: + - ~/.platformio + - ~/Marlin/.piolibdeps + key: v1-dependencies-{{ checksum "~/Marlin/platformio.ini" }} + diff --git a/.gitattributes b/.gitattributes index d511b4ea94..2588229e05 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,4 +17,3 @@ *.png binary *.jpg binary *.fon binary - diff --git a/.gitignore b/.gitignore index 2d9b8212f8..7a364bbd42 100755 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ _Version.h applet/ *.DS_Store - # # Misc # @@ -120,11 +119,37 @@ tags .pio* .pioenvs .piolibdeps -lib/readme.txt +.clang_complete +.gcc-flags.json +/lib/ + +# Workaround for Deviot+platformio quirks +Marlin/lib +Marlin/platformio.ini +Marlin/*/platformio.ini +Marlin/*/*/platformio.ini +Marlin/*/*/*/platformio.ini +Marlin/*/*/*/*/platformio.ini +Marlin/.travis.yml +Marlin/*/.travis.yml +Marlin/*/*/.travis.yml +Marlin/*/*/*/.travis.yml +Marlin/*/*/*/*/.travis.yml +Marlin/.gitignore +Marlin/*/.gitignore +Marlin/*/*/.gitignore +Marlin/*/*/*/.gitignore +Marlin/*/*/*/*/.gitignore +Marlin/readme.txt +Marlin/*/readme.txt +Marlin/*/*/readme.txt +Marlin/*/*/*/readme.txt +Marlin/*/*/*/*/readme.txt #Visual Studio *.sln *.vcxproj +*.vcxproj.user *.vcxproj.filters Release/ Debug/ @@ -132,7 +157,7 @@ __vm/ .vs/ vc-fileutils.settings -#VScode +#Visual Studio Code .vscode .vscode/.browse.c_cpp.db* .vscode/c_cpp_properties.json @@ -141,7 +166,7 @@ vc-fileutils.settings #cmake CMakeLists.txt -Marlin/CMakeLists.txt +src/CMakeLists.txt CMakeListsPrivate.txt #CLion diff --git a/.travis.yml b/.travis.yml index 568f9c6cd2..f30515c63a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,23 @@ dist: trusty -sudo: true - # -language: c - # +sudo: false + +language: python +python: + - "2.7" + notifications: email: false - # + +# Cache PlatformIO packages using Travis CI container-based infrastructure +sudo: false +cache: + pip: true + directories: + - "~/.platformio" + +env: + - TEST_PLATFORM="-e megaatmega2560" + before_install: # # Fetch the tag information for the current branch @@ -14,72 +26,32 @@ before_install: # Publish the buildroot script folder - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/bin/* - export PATH=${TRAVIS_BUILD_DIR}/buildroot/bin/:${PATH} - # - # Start fb X server - - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16" - - sleep 3 - - export DISPLAY=:1.0 - # + install: - # - # Install arduino 1.8.5 - - wget http://downloads-02.arduino.cc/arduino-1.8.5-linux64.tar.xz - - tar xf arduino-1.8.5-linux64.tar.xz - - sudo mv arduino-1.8.5 /usr/local/share/arduino - - ln -s /usr/local/share/arduino/arduino ${TRAVIS_BUILD_DIR}/buildroot/bin/arduino - # - # Install: LiquidCrystal_I2C library - - git clone https://github.com/kiyoshigawa/LiquidCrystal_I2C.git - - mv LiquidCrystal_I2C/LiquidCrystal_I2C /usr/local/share/arduino/libraries/LiquidCrystal_I2C - # - # Install: LiquidTWI2 library - - git clone https://github.com/lincomatic/LiquidTWI2.git - - sudo mv LiquidTWI2 /usr/local/share/arduino/libraries/LiquidTWI2 - # - # Install: Monochrome Graphics Library for LCDs and OLEDs - - git clone https://github.com/olikraus/U8glib_Arduino.git - - sudo mv U8glib_Arduino /usr/local/share/arduino/libraries/U8glib - # - # Install: L6470 Stepper Motor Driver library - # - git clone https://github.com/ameyer/Arduino-L6470.git - # - sudo mv Arduino-L6470/L6470 /usr/local/share/arduino/libraries/L6470 - # - # Install: TMC26X Stepper Motor Controller library - # - git clone https://github.com/trinamic/TMC26XStepper.git - # - sudo mv TMC26XStepper /usr/local/share/arduino/libraries/TMC26XStepper - # - # Install: TMC2130 Stepper Motor Controller library - - git clone https://github.com/teemuatlut/TMC2130Stepper.git - - sudo mv TMC2130Stepper /usr/local/share/arduino/libraries/TMC2130Stepper - # - # Install: TMC2208 Stepper Motor Controller library - - git clone https://github.com/teemuatlut/TMC2208Stepper.git - - sudo mv TMC2208Stepper /usr/local/share/arduino/libraries/TMC2208Stepper - # - # Install: Adafruit Neopixel library - - git clone https://github.com/adafruit/Adafruit_NeoPixel.git - - sudo mv Adafruit_NeoPixel /usr/local/share/arduino/libraries/Adafruit_NeoPixel - # + #- pip install -U platformio + - pip install -U https://github.com/platformio/platformio-core/archive/develop.zip + before_script: + # Update PlatformIO packages + - platformio update # # Change current working directory to the build dir - cd ${TRAVIS_BUILD_DIR} # # Generate custom version include - - generate_version_header_for_marlin ${TRAVIS_BUILD_DIR}/Marlin - - cat ${TRAVIS_BUILD_DIR}/Marlin/_Version.h + - generate_version_header_for_marlin ${TRAVIS_BUILD_DIR}/Marlin/src/inc + - cat ${TRAVIS_BUILD_DIR}/Marlin/src/inc/_Version.h # script: # - # Backup Configuration.h, Configuration_adv.h, and pins_RAMPS.h + # Backup pins_RAMPS.h # - - cp Marlin/Configuration.h Marlin/Configuration.h.backup - - cp Marlin/Configuration_adv.h Marlin/Configuration_adv.h.backup - - cp Marlin/pins_RAMPS.h Marlin/pins_RAMPS.h.backup + - cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup # # Build with the default configurations # - - build_marlin + - restore_configs + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test 2 extruders (one MAX6675) and heated bed on basic RAMPS 1.4 # Test a "Fix Mounted" Probe with Safe Homing, some arc options, @@ -92,14 +64,14 @@ script: - opt_set TEMP_SENSOR_BED 1 - opt_set POWER_SUPPLY 1 - opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING - - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS + - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS PINS_DEBUGGING - opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR - opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE - opt_enable_adv ARC_P_CIRCLES ADVANCED_PAUSE_FEATURE CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS POWER_LOSS_RECOVERY - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING - opt_set GRID_MAX_POINTS_X 16 - opt_set_adv FANMUX0_PIN 53 - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders # @@ -111,17 +83,18 @@ script: - opt_set TEMP_SENSOR_3 20 - opt_set TEMP_SENSOR_4 999 - opt_set TEMP_SENSOR_BED 1 - - opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_EDITING ENABLE_LEVELING_FADE_HEIGHT EEPROM_SETTINGS EEPROM_CHITCHAT G3D_PANEL SKEW_CORRECTION - - opt_enable_adv CUSTOM_USER_MENUS I2C_POSITION_ENCODERS BABYSTEPPING BABYSTEP_XY LIN_ADVANCE NANODLP_Z_SYNC QUICK_HOME - - build_marlin + - opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_EDITING ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION + - opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + - opt_enable_adv CUSTOM_USER_MENUS I2C_POSITION_ENCODERS BABYSTEPPING BABYSTEP_XY LIN_ADVANCE NANODLP_Z_SYNC QUICK_HOME JUNCTION_DEVIATION + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language # - - opt_set LANGUAGE kana_utf8 - - opt_enable Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE BEZIER_JERK_CONTROL + - opt_enable Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE + - opt_set LCD_LANGUAGE jp-kana - opt_disable SEGMENT_LEVELED_MOVES - opt_enable_adv BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test a Servo Probe # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES @@ -131,20 +104,20 @@ script: - opt_set NUM_SERVOS 1 - opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT - opt_enable_adv NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test MESH_BED_LEVELING feature, with LCD # - restore_configs - opt_enable MESH_BED_LEVELING G26_MESH_EDITING MESH_G28_REST_ORIGIN LCD_BED_LEVELING ULTIMAKERCONTROLLER - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test MINIRAMBO for PWM_MOTOR_CURRENT # PROBE_MANUALLY feature, with LCD support, # ULTIMAKERCONTROLLER, FILAMENT_LCD_DISPLAY, FILAMENT_WIDTH_SENSOR, # PRINTCOUNTER, NOZZLE_PARK_FEATURE, NOZZLE_CLEAN_FEATURE, PCA9632, # Z_DUAL_ENDSTOPS, BEZIER_CURVE_SUPPORT, EXPERIMENTAL_I2CBUS, - # ADVANCED_PAUSE_FEATURE, ADVANCED_PAUSE_CONTINUOUS_PURGE, PARK_HEAD_ON_PAUSE, LCD_INFO_MENU, M114_DETAIL + # ADVANCED_PAUSE_FEATURE, ADVANCED_PAUSE_CONTINUOUS_PURGE, PARK_HEAD_ON_PAUSE, LCD_INFO_MENU, # EEPROM_SETTINGS, EEPROM_CHITCHAT, M100_FREE_MEMORY_WATCHER, # INCH_MODE_SUPPORT, TEMPERATURE_UNITS_SUPPORT # @@ -158,28 +131,16 @@ script: - opt_enable_adv ADVANCED_PAUSE_FEATURE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE LCD_INFO_MENU M114_DETAIL - opt_set_adv PWM_MOTOR_CURRENT {1300,1300,1250} - opt_set_adv I2C_SLAVE_ADDRESS 63 - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # - # Test 5 extruders on AZTEEG_X3_PRO (can use any board with >=5 extruders defined) - # Include a test for LIN_ADVANCE here also - # - - opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO - - opt_set EXTRUDERS 5 - - opt_set TEMP_SENSOR_1 1 - - opt_set TEMP_SENSOR_2 5 - - opt_set TEMP_SENSOR_3 20 - - opt_set TEMP_SENSOR_4 999 - - opt_set TEMP_SENSOR_BED 1 - - opt_enable_adv LIN_ADVANCE - - build_marlin - # - # Mixing Extruder with 5 steppers + # Mixing Extruder with 5 steppers, Cyrillic # - restore_configs - opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO - - opt_enable MIXING_EXTRUDER + - opt_enable MIXING_EXTRUDER CR10_STOCKDISPLAY - opt_set MIXING_STEPPERS 5 - - build_marlin + - opt_set LCD_LANGUAGE ru + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test DUAL_X_CARRIAGE # @@ -189,15 +150,15 @@ script: - opt_set TEMP_SENSOR_1 1 - opt_enable USE_XMAX_PLUG - opt_enable_adv DUAL_X_CARRIAGE - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER # - - restore_configs - - opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D - - opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 - - opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 - - opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER + #- restore_configs + #- opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D + #- opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 + #- opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 + #- opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER # # Test SWITCHING_EXTRUDER # @@ -206,15 +167,14 @@ script: - opt_set EXTRUDERS 2 - opt_enable NUM_SERVOS - opt_set NUM_SERVOS 1 - - opt_set TEMP_SENSOR_1 1 - opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Enable COREXY # - - restore_configs - - opt_enable COREXY - - build_marlin + #- restore_configs + #- opt_enable COREXY + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Test many less common options # @@ -228,70 +188,74 @@ script: - opt_enable_adv VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS ACTION_ON_KILL - opt_enable_adv EXTRA_FAN_SPEED FWERETRACT Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS - opt_enable_adv MENU_ADDAUTOSTART SDCARD_SORT_ALPHA - - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER + - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT - opt_enable FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR - opt_enable ENDSTOP_INTERRUPTS_FEATURE FAN_SOFT_PWM SDSUPPORT - opt_enable USE_XMAX_PLUG - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # ######## Other Standard LCD/Panels ############## # # ULTRA_LCD # - - restore_configs - - opt_enable ULTRA_LCD - - build_marlin + #- restore_configs + #- opt_enable ULTRA_LCD + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # DOGLCD # - - restore_configs - - opt_enable DOGLCD - - build_marlin + #- restore_configs + #- opt_enable DOGLCD + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # MAKRPANEL # Needs to use Melzi and Sanguino hardware # #- restore_configs #- opt_enable MAKRPANEL - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # REPRAP_DISCOUNT_SMART_CONTROLLER, SDSUPPORT, BABYSTEPPING, RIGIDBOARD_V2, and DAC_MOTOR_CURRENT_DEFAULT # - - restore_configs - - opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 - - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT - - build_marlin - # + #- restore_configs + #- opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 + #- opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # # # G3D_PANEL with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING # + #- restore_configs + #- opt_enable G3D_PANEL SDSUPPORT + #- opt_enable_adv SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES + #- opt_set_adv SDSORT_GCODE true + #- opt_set_adv SDSORT_USES_RAM true + #- opt_set_adv SDSORT_USES_STACK true + #- opt_set_adv SDSORT_CACHE_NAMES true + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with LIGHTWEIGHT_UI + # - restore_configs - - opt_enable G3D_PANEL SDSUPPORT + - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT - opt_enable_adv SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES LIGHTWEIGHT_UI - opt_set_adv SDSORT_GCODE true - opt_set_adv SDSORT_USES_RAM true - opt_set_adv SDSORT_USES_STACK true - opt_set_adv SDSORT_CACHE_NAMES true - - build_marlin - # - # REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING - # - - restore_configs - - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT - - opt_enable_adv SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # REPRAPWORLD_KEYPAD # # Cant find configuration details to get it to compile #- restore_configs #- opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # RA_CONTROL_PANEL # - - restore_configs - - opt_enable RA_CONTROL_PANEL PINS_DEBUGGING - - build_marlin + #- restore_configs + #- opt_enable RA_CONTROL_PANEL PINS_DEBUGGING + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # ######## I2C LCD/PANELS ############## # @@ -303,25 +267,35 @@ script: # #- restore_configs #- opt_enable LCD_SAINSMART_I2C_1602 - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # LCD_I2C_PANELOLU2 # #- restore_configs #- opt_enable LCD_I2C_PANELOLU2 - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # LCD_I2C_VIKI # #- restore_configs #- opt_enable LCD_I2C_VIKI - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # LCM1602 # - - restore_configs - - opt_enable LCM1602 - - build_marlin + #- restore_configs + #- opt_enable LCM1602 + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + # + #- restore_configs + #- opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT + #- for lang in an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM}; done + # + #- restore_configs + #- opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT + #- for lang in an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM}; done # # ######## Example Configurations ############## @@ -329,45 +303,182 @@ script: # BQ Hephestos 2 #- restore_configs #- use_example_configs Hephestos_2 - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Delta Config (generic) + ABL bilinear + PROBE_MANUALLY - use_example_configs delta/generic - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS # - use_example_configs delta/generic - - opt_disable DISABLE_MIN_ENDSTOPS - - opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 Z_PROBE_ALLEN_KEY EEPROM_SETTINGS EEPROM_CHITCHAT OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY - - build_marlin + - opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 Z_PROBE_ALLEN_KEY EEPROM_SETTINGS EEPROM_CHITCHAT + - opt_enable OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Delta Config (FLSUN AC because it's complex) # - use_example_configs delta/FLSUN/auto_calibrate - - build_marlin + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # Makibox Config need to check board type for Teensy++ 2.0 # #- use_example_configs makibox - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # - # SCARA with TMC2130 and TMC2208 + # SCARA with TMC2130 # - use_example_configs SCARA - - opt_enable AUTO_BED_LEVELING_BILINEAR FIX_MOUNTED_PROBE USE_ZMIN_PLUG EEPROM_SETTINGS EEPROM_CHITCHAT ULTIMAKERCONTROLLER SCARA_FEEDRATE_SCALING - - opt_enable_adv HAVE_TMC2130 HAVE_TMC2208 X_IS_TMC2130 Y_IS_TMC2130 Z_IS_TMC2208 E0_IS_TMC2208 - - opt_enable_adv MONITOR_DRIVER_STATUS STEALTHCHOP HYBRID_THRESHOLD TMC_DEBUG SENSORLESS_HOMING TMC_Z_CALIBRATION - - build_marlin + - opt_enable AUTO_BED_LEVELING_BILINEAR FIX_MOUNTED_PROBE USE_ZMIN_PLUG EEPROM_SETTINGS EEPROM_CHITCHAT ULTIMAKERCONTROLLER + - opt_enable_adv HAVE_TMC2130 X_IS_TMC2130 Y_IS_TMC2130 Z_IS_TMC2130 + - opt_enable_adv MONITOR_DRIVER_STATUS STEALTHCHOP HYBRID_THRESHOLD SENSORLESS_HOMING + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # TMC2208 Config + # + - restore_configs + - opt_enable_adv HAVE_TMC2208 X_IS_TMC2208 Y_IS_TMC2208 Z_IS_TMC2208 + - opt_enable_adv MONITOR_DRIVER_STATUS STEALTHCHOP HYBRID_THRESHOLD TMC_DEBUG + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # tvrrug Config need to check board type for sanguino atmega644p # #- use_example_configs tvrrug/Round2 - #- build_marlin + #- build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} # # ######## Board Types ############# # # To be added in nightly test branch # + + - export TEST_PLATFORM="-e teensy35" + - restore_configs + - opt_set MOTHERBOARD BOARD_TEENSY35_36 + - update_defaults + - cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup + # + # Test Teensy3.5 with default config + # + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Test as many features together as possible + # + - restore_configs + - opt_set EXTRUDERS 2 + - opt_set TEMP_SENSOR_0 1 + - opt_set TEMP_SENSOR_1 5 + - opt_set TEMP_SENSOR_BED 1 + - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT + - opt_enable FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY + - opt_enable FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE + - opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY + - opt_enable PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER + - opt_enable_adv ADVANCED_PAUSE_FEATURE LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA PARK_HEAD_ON_PAUSE + - opt_set_adv I2C_SLAVE_ADDRESS 63 + - opt_set GRID_MAX_POINTS_X 16 + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Test a Sled Z Probe with Linear leveling + # + - restore_configs + - opt_enable Z_PROBE_SLED + - opt_enable AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE EEPROM_SETTINGS + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Test a Servo Probe + # + - restore_configs + - opt_enable NUM_SERVOS Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE + - opt_set NUM_SERVOS 1 + - opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES + # + - opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS + - opt_enable_adv EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Test MESH_BED_LEVELING feature, with LCD + # + - restore_configs + - opt_enable MESH_BED_LEVELING MESH_G28_REST_ORIGIN MANUAL_BED_LEVELING ULTIMAKERCONTROLLER + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Mixing Extruder + # + - restore_configs + - opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 + - opt_set MIXING_STEPPERS 2 + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Test SWITCHING_EXTRUDER + # + - restore_configs + - opt_set EXTRUDERS 2 + - opt_enable NUM_SERVOS + - opt_set NUM_SERVOS 1 + - opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Enable COREXY + # + - restore_configs + - opt_enable COREXY + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Enable COREXZ + # + - restore_configs + - opt_enable COREXZ + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Enable Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS + # + - restore_configs + - opt_enable_adv Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS + - pins_set RAMPS X_MAX_PIN -1 + - opt_add_adv Z2_MAX_PIN 2 + - opt_enable USE_XMAX_PLUG + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + + ############################# + # DUE default config test + ############################# + + - export TEST_PLATFORM="-e DUE" + - restore_configs + - opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB + - opt_set S_CURVE_ACCELERATION + - update_defaults + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + + ############################# + # LPC1768 default config test + ############################# + + - export TEST_PLATFORM="-e LPC1768" + - restore_configs + - opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB + - update_defaults + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + # + # Enable VIKI2, SDSUPPORT + # + - restore_configs + - opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB + - update_defaults + - opt_enable VIKI2 SDSUPPORT + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} + + ############################# + # STM32F1 default config test + ############################# + + - export TEST_PLATFORM="-e STM32F1" + - restore_configs + - opt_set MOTHERBOARD BOARD_STM32F1R + - update_defaults + - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} diff --git a/Marlin/Conditionals_LCD.h b/Marlin/Conditionals_LCD.h deleted file mode 100644 index 5a858a68cd..0000000000 --- a/Marlin/Conditionals_LCD.h +++ /dev/null @@ -1,510 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Conditionals_LCD.h - * Conditionals that need to be set before Configuration_adv.h or pins.h - */ - -#ifndef CONDITIONALS_LCD_H // Get the LCD defines which are needed first -#define CONDITIONALS_LCD_H - - #define LCD_HAS_DIRECTIONAL_BUTTONS (BUTTON_EXISTS(UP) || BUTTON_EXISTS(DWN) || BUTTON_EXISTS(LFT) || BUTTON_EXISTS(RT)) - - #if ENABLED(CARTESIO_UI) - - #define DOGLCD - #define ULTIPANEL - #define DEFAULT_LCD_CONTRAST 90 - #define LCD_CONTRAST_MIN 60 - #define LCD_CONTRAST_MAX 140 - - #elif ENABLED(MAKRPANEL) - - #define U8GLIB_ST7565_64128N - - #elif ENABLED(ZONESTAR_LCD) - - #define REPRAPWORLD_KEYPAD - #define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 - #define ADC_KEYPAD - #define ADC_KEY_NUM 8 - #define ULTIPANEL - - // this helps to implement ADC_KEYPAD menus - #define ENCODER_PULSES_PER_STEP 1 - #define ENCODER_STEPS_PER_MENU_ITEM 1 - #define ENCODER_FEEDRATE_DEADZONE 2 - #define REVERSE_MENU_DIRECTION - - #elif ENABLED(ANET_FULL_GRAPHICS_LCD) - - #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - - #elif ENABLED(BQ_LCD_SMART_CONTROLLER) - - #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - - #elif ENABLED(miniVIKI) || ENABLED(VIKI2) || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define ULTRA_LCD //general LCD support, also 16x2 - #define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) - #define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. - - #if ENABLED(miniVIKI) - #define LCD_CONTRAST_MIN 75 - #define LCD_CONTRAST_MAX 115 - #define DEFAULT_LCD_CONTRAST 95 - #define U8GLIB_ST7565_64128N - #elif ENABLED(VIKI2) - #define LCD_CONTRAST_MIN 0 - #define LCD_CONTRAST_MAX 255 - #define DEFAULT_LCD_CONTRAST 140 - #define U8GLIB_ST7565_64128N - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define LCD_CONTRAST_MIN 90 - #define LCD_CONTRAST_MAX 130 - #define DEFAULT_LCD_CONTRAST 110 - #define U8GLIB_LM6059_AF - #define SD_DETECT_INVERTED - #endif - - #elif ENABLED(OLED_PANEL_TINYBOY2) - - #define U8GLIB_SSD1306 - #define ULTIPANEL - #define REVERSE_ENCODER_DIRECTION - #define REVERSE_MENU_DIRECTION - - #elif ENABLED(RA_CONTROL_PANEL) - - #define LCD_I2C_TYPE_PCA8574 - #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander - #define ULTIPANEL - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define DOGLCD - #define U8GLIB_ST7920 - #define ULTIPANEL - - #elif ENABLED(CR10_STOCKDISPLAY) - - #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_2_NOP - #endif - #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_2_NOP - #endif - #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_2_NOP - #endif - - #elif ENABLED(MKS_12864OLED) - - #define REPRAP_DISCOUNT_SMART_CONTROLLER - #define U8GLIB_SH1106 - - #elif ENABLED(MKS_12864OLED_SSD1306) - - #define REPRAP_DISCOUNT_SMART_CONTROLLER - #define U8GLIB_SSD1306 - - #elif ENABLED(MKS_MINI_12864) - - #define MINIPANEL - - #endif - - #if ENABLED(MAKRPANEL) || ENABLED(MINIPANEL) - #define DOGLCD - #define ULTIPANEL - #define DEFAULT_LCD_CONTRAST 17 - #endif - - #if ENABLED(ULTI_CONTROLLER) - #define U8GLIB_SSD1309 - #define REVERSE_ENCODER_DIRECTION - #define LCD_RESET_PIN LCD_PINS_D6 // This controller need a reset pin - #define LCD_CONTRAST_MIN 0 - #define LCD_CONTRAST_MAX 254 - #define DEFAULT_LCD_CONTRAST 127 - #define ENCODER_PULSES_PER_STEP 2 - #define ENCODER_STEPS_PER_MENU_ITEM 2 - #endif - - // Generic support for SSD1306 / SSD1309 / SH1106 OLED based LCDs. - #if ENABLED(U8GLIB_SSD1306) || ENABLED(U8GLIB_SSD1309) || ENABLED(U8GLIB_SH1106) - #define ULTRA_LCD //general LCD support, also 16x2 - #define DOGLCD // Support for I2C LCD 128x64 (Controller SSD1306 / SSD1309 / SH1106 graphic Display Family) - #endif - - #if ENABLED(PANEL_ONE) || ENABLED(U8GLIB_SH1106) - - #define ULTIMAKERCONTROLLER - - #elif ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) - - #define REPRAP_DISCOUNT_SMART_CONTROLLER - #define LCD_WIDTH 16 - #define LCD_HEIGHT 2 - - #endif - - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(LCD_FOR_MELZI) || ENABLED(SILVER_GATE_GLCD_CONTROLLER) - #define DOGLCD - #define U8GLIB_ST7920 - #define REPRAP_DISCOUNT_SMART_CONTROLLER - #endif - - #if ENABLED(ULTIMAKERCONTROLLER) \ - || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ - || ENABLED(G3D_PANEL) \ - || ENABLED(RIGIDBOT_PANEL) \ - || ENABLED(ULTI_CONTROLLER) - #define ULTIPANEL - #endif - - #if ENABLED(REPRAPWORLD_KEYPAD) - #define NEWPANEL - #if ENABLED(ULTIPANEL) && !defined(REPRAPWORLD_KEYPAD_MOVE_STEP) - #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 - #endif - #endif - - /** - * I2C PANELS - */ - - #if ENABLED(LCD_SAINSMART_I2C_1602) || ENABLED(LCD_SAINSMART_I2C_2004) - - #define LCD_I2C_TYPE_PCF8575 - #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander - #define ULTRA_LCD - - #if ENABLED(LCD_SAINSMART_I2C_2004) - #define LCD_WIDTH 20 - #define LCD_HEIGHT 4 - #endif - - #elif ENABLED(LCD_I2C_PANELOLU2) - - // PANELOLU2 LCD with status LEDs, separate encoder and click inputs - - #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander - #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (optional) - #define ULTIPANEL - - #elif ENABLED(LCD_I2C_VIKI) - - /** - * Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs - * - * This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) - * Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. - * Note: The pause/stop/resume LCD button pin should be connected to the Arduino - * BTN_ENC pin (or set BTN_ENC to -1 if not used) - */ - #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander - #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) - #define ULTIPANEL - - #define ENCODER_FEEDRATE_DEADZONE 4 - - #define STD_ENCODER_PULSES_PER_STEP 1 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 2 - - #elif ENABLED(G3D_PANEL) - - #define STD_ENCODER_PULSES_PER_STEP 2 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - - #elif ENABLED(miniVIKI) || ENABLED(VIKI2) \ - || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ - || ENABLED(OLED_PANEL_TINYBOY2) \ - || ENABLED(BQ_LCD_SMART_CONTROLLER) \ - || ENABLED(LCD_I2C_PANELOLU2) \ - || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define STD_ENCODER_PULSES_PER_STEP 4 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - #endif - - #ifndef STD_ENCODER_PULSES_PER_STEP - #define STD_ENCODER_PULSES_PER_STEP 5 - #endif - #ifndef STD_ENCODER_STEPS_PER_MENU_ITEM - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - #endif - #ifndef ENCODER_PULSES_PER_STEP - #define ENCODER_PULSES_PER_STEP STD_ENCODER_PULSES_PER_STEP - #endif - #ifndef ENCODER_STEPS_PER_MENU_ITEM - #define ENCODER_STEPS_PER_MENU_ITEM STD_ENCODER_STEPS_PER_MENU_ITEM - #endif - #ifndef ENCODER_FEEDRATE_DEADZONE - #define ENCODER_FEEDRATE_DEADZONE 6 - #endif - - // Shift register panels - // --------------------- - // 2 wire Non-latching LCD SR from: - // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection - - #if ENABLED(SAV_3DLCD) - #define SR_LCD_2W_NL // Non latching 2 wire shift register - #define ULTIPANEL - #endif - - #if ENABLED(DOGLCD) // Change number of lines to match the DOG graphic display - #ifndef LCD_WIDTH - #ifdef LCD_WIDTH_OVERRIDE - #define LCD_WIDTH LCD_WIDTH_OVERRIDE - #else - #define LCD_WIDTH 22 - #endif - #endif - #ifndef LCD_HEIGHT - #define LCD_HEIGHT 5 - #endif - #endif - - #if ENABLED(ULTIPANEL) - #define NEWPANEL // Disable this if you actually have no click-encoder panel - #define ULTRA_LCD - #ifndef LCD_WIDTH - #define LCD_WIDTH 20 - #endif - #ifndef LCD_HEIGHT - #define LCD_HEIGHT 4 - #endif - #elif ENABLED(ULTRA_LCD) // no panel but just LCD - #ifndef LCD_WIDTH - #define LCD_WIDTH 16 - #endif - #ifndef LCD_HEIGHT - #define LCD_HEIGHT 2 - #endif - #endif - - #if ENABLED(DOGLCD) - /* Custom characters defined in font dogm_font_data_Marlin_symbols.h / Marlin_symbols.fon */ - // \x00 intentionally skipped to avoid problems in strings - #define LCD_STR_REFRESH "\x01" - #define LCD_STR_FOLDER "\x02" - #define LCD_STR_ARROW_RIGHT "\x03" - #define LCD_STR_UPLEVEL "\x04" - #define LCD_STR_CLOCK "\x05" - #define LCD_STR_FEEDRATE "\x06" - #define LCD_STR_BEDTEMP "\x07" - #define LCD_STR_THERMOMETER "\x08" - #define LCD_STR_DEGREE "\x09" - - #define LCD_STR_SPECIAL_MAX '\x09' - // Maximum here is 0x1F because 0x20 is ' ' (space) and the normal charsets begin. - // Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here. - - // Symbol characters - #define LCD_STR_FILAM_DIA "\xf8" - #define LCD_STR_FILAM_MUL "\xa4" - #else - // Custom characters defined in the first 8 characters of the LCD - #define LCD_BEDTEMP_CHAR 0x00 // Print only as a char. This will have 'unexpected' results when used in a string! - #define LCD_DEGREE_CHAR 0x01 - #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation - #define LCD_UPLEVEL_CHAR 0x03 - #define LCD_STR_REFRESH "\x04" - #define LCD_STR_FOLDER "\x05" - #define LCD_FEEDRATE_CHAR 0x06 - #define LCD_CLOCK_CHAR 0x07 - #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ - #endif - - /** - * Default LCD contrast for dogm-like LCD displays - */ - #if ENABLED(DOGLCD) - - #define HAS_LCD_CONTRAST ( \ - ENABLED(MAKRPANEL) \ - || ENABLED(CARTESIO_UI) \ - || ENABLED(VIKI2) \ - || ENABLED(miniVIKI) \ - || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ - ) - - #if HAS_LCD_CONTRAST - #ifndef LCD_CONTRAST_MIN - #define LCD_CONTRAST_MIN 0 - #endif - #ifndef LCD_CONTRAST_MAX - #define LCD_CONTRAST_MAX 63 - #endif - #ifndef DEFAULT_LCD_CONTRAST - #define DEFAULT_LCD_CONTRAST 32 - #endif - #endif - #endif - - #if ENABLED(NO_LCD_MENUS) - #undef ULTIPANEL - #undef NEWPANEL - #endif - - // Boot screens - #if DISABLED(ULTRA_LCD) - #undef SHOW_BOOTSCREEN - #elif !defined(BOOTSCREEN_TIMEOUT) - #define BOOTSCREEN_TIMEOUT 2500 - #endif - - #define HAS_DEBUG_MENU (ENABLED(ULTIPANEL) && ENABLED(LCD_PROGRESS_BAR_TEST)) - - // MK2 Multiplexer forces SINGLENOZZLE and kills DISABLE_INACTIVE_EXTRUDER - #if ENABLED(MK2_MULTIPLEXER) - #define SINGLENOZZLE - #undef DISABLE_INACTIVE_EXTRUDER - #endif - - /** - * Extruders have some combination of stepper motors and hotends - * so we separate these concepts into the defines: - * - * EXTRUDERS - Number of Selectable Tools - * HOTENDS - Number of hotends, whether connected or separate - * E_STEPPERS - Number of actual E stepper motors - * E_MANUAL - Number of E steppers for LCD move options - * - */ - #if ENABLED(SINGLENOZZLE) || ENABLED(MIXING_EXTRUDER) // One hotend, one thermistor, no XY offset - #define HOTENDS 1 - #undef TEMP_SENSOR_1_AS_REDUNDANT - #undef HOTEND_OFFSET_X - #undef HOTEND_OFFSET_Y - #else // Two hotends - #define HOTENDS EXTRUDERS - #if ENABLED(SWITCHING_NOZZLE) && !defined(HOTEND_OFFSET_Z) - #define HOTEND_OFFSET_Z { 0 } - #endif - #endif - - #if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS - #if EXTRUDERS > 4 - #define E_STEPPERS 3 - #define E_MANUAL 3 - #elif EXTRUDERS > 2 - #define E_STEPPERS 2 - #define E_MANUAL 2 - #else - #define E_STEPPERS 1 - #endif - #define E_MANUAL EXTRUDERS - #elif ENABLED(MIXING_EXTRUDER) - #define E_STEPPERS MIXING_STEPPERS - #define E_MANUAL 1 - #else - #define E_STEPPERS EXTRUDERS - #define E_MANUAL EXTRUDERS - #endif - - /** - * DISTINCT_E_FACTORS affects how some E factors are accessed - */ - #if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1 - #define XYZE_N (XYZ + E_STEPPERS) - #define E_AXIS_N (E_AXIS + extruder) - #else - #undef DISTINCT_E_FACTORS - #define XYZE_N XYZE - #define E_AXIS_N E_AXIS - #endif - - /** - * The BLTouch Probe emulates a servo probe - * and uses "special" angles for its state. - */ - #if ENABLED(BLTOUCH) - #ifndef Z_PROBE_SERVO_NR - #define Z_PROBE_SERVO_NR 0 - #endif - #ifndef NUM_SERVOS - #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) - #endif - #undef DEACTIVATE_SERVOS_AFTER_MOVE - #if NUM_SERVOS == 1 - #undef SERVO_DELAY - #define SERVO_DELAY { 50 } - #endif - #ifndef BLTOUCH_DELAY - #define BLTOUCH_DELAY 375 - #endif - #undef Z_SERVO_ANGLES - #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } - - #define BLTOUCH_DEPLOY 10 - #define BLTOUCH_STOW 90 - #define BLTOUCH_SELFTEST 120 - #define BLTOUCH_RESET 160 - #define _TEST_BLTOUCH(P) (READ(P##_PIN) != P##_ENDSTOP_INVERTING) - - // Always disable probe pin inverting for BLTouch - #undef Z_MIN_PROBE_ENDSTOP_INVERTING - #define Z_MIN_PROBE_ENDSTOP_INVERTING false - - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #undef Z_MIN_ENDSTOP_INVERTING - #define Z_MIN_ENDSTOP_INVERTING Z_MIN_PROBE_ENDSTOP_INVERTING - #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN) - #else - #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN_PROBE) - #endif - #endif - - /** - * Set a flag for a servo probe - */ - #define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0) - - /** - * Set flags for enabled probes - */ - #define HAS_BED_PROBE (ENABLED(FIX_MOUNTED_PROBE) || ENABLED(Z_PROBE_ALLEN_KEY) || HAS_Z_SERVO_PROBE || ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) - #define PROBE_SELECTED (HAS_BED_PROBE || ENABLED(PROBE_MANUALLY)) - - #if !HAS_BED_PROBE - // Clear probe pin settings when no probe is selected - #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - #undef Z_MIN_PROBE_ENDSTOP - #elif ENABLED(Z_PROBE_ALLEN_KEY) - // Extra test for Allen Key Probe - #define PROBE_IS_TRIGGERED_WHEN_STOWED_TEST - #endif - - #define HOMING_Z_WITH_PROBE (HAS_BED_PROBE && Z_HOME_DIR < 0 && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) - - #define HAS_SOFTWARE_ENDSTOPS (ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS)) - #define HAS_RESUME_CONTINUE (ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER)) - #define HAS_COLOR_LEDS (ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED)) - -#endif // CONDITIONALS_LCD_H diff --git a/Marlin/Conditionals_post.h b/Marlin/Conditionals_post.h deleted file mode 100644 index 73d5cb775a..0000000000 --- a/Marlin/Conditionals_post.h +++ /dev/null @@ -1,1306 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Conditionals_post.h - * Defines that depend on configuration but are not editable. - */ - -#ifndef CONDITIONALS_POST_H -#define CONDITIONALS_POST_H - - #define IS_SCARA (ENABLED(MORGAN_SCARA) || ENABLED(MAKERARM_SCARA)) - #define IS_KINEMATIC (ENABLED(DELTA) || IS_SCARA) - #define IS_CARTESIAN !IS_KINEMATIC - - /** - * Axis lengths and center - */ - #define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) - #define Y_MAX_LENGTH (Y_MAX_POS - (Y_MIN_POS)) - #define Z_MAX_LENGTH (Z_MAX_POS - (Z_MIN_POS)) - - // Defined only if the sanity-check is bypassed - #ifndef X_BED_SIZE - #define X_BED_SIZE X_MAX_LENGTH - #endif - #ifndef Y_BED_SIZE - #define Y_BED_SIZE Y_MAX_LENGTH - #endif - - // Require 0,0 bed center for Delta and SCARA - #if IS_KINEMATIC - #define BED_CENTER_AT_0_0 - #endif - - // Define center values for future use - #if ENABLED(BED_CENTER_AT_0_0) - #define X_CENTER 0 - #define Y_CENTER 0 - #else - #define X_CENTER ((X_BED_SIZE) / 2) - #define Y_CENTER ((Y_BED_SIZE) / 2) - #endif - #define Z_CENTER ((Z_MIN_POS + Z_MAX_POS) / 2) - - // Get the linear boundaries of the bed - #define X_MIN_BED (X_CENTER - (X_BED_SIZE) / 2) - #define X_MAX_BED (X_CENTER + (X_BED_SIZE) / 2) - #define Y_MIN_BED (Y_CENTER - (Y_BED_SIZE) / 2) - #define Y_MAX_BED (Y_CENTER + (Y_BED_SIZE) / 2) - - /** - * CoreXY, CoreXZ, and CoreYZ - and their reverse - */ - #define CORE_IS_XY (ENABLED(COREXY) || ENABLED(COREYX)) - #define CORE_IS_XZ (ENABLED(COREXZ) || ENABLED(COREZX)) - #define CORE_IS_YZ (ENABLED(COREYZ) || ENABLED(COREZY)) - #define IS_CORE (CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ) - #if IS_CORE - #if CORE_IS_XY - #define CORE_AXIS_1 A_AXIS - #define CORE_AXIS_2 B_AXIS - #define NORMAL_AXIS Z_AXIS - #elif CORE_IS_XZ - #define CORE_AXIS_1 A_AXIS - #define NORMAL_AXIS Y_AXIS - #define CORE_AXIS_2 C_AXIS - #elif CORE_IS_YZ - #define NORMAL_AXIS X_AXIS - #define CORE_AXIS_1 B_AXIS - #define CORE_AXIS_2 C_AXIS - #endif - #if ENABLED(COREYX) || ENABLED(COREZX) || ENABLED(COREZY) - #define CORESIGN(n) (-(n)) - #else - #define CORESIGN(n) (n) - #endif - #endif - - /** - * No adjustable bed on non-cartesians - */ - #if IS_KINEMATIC - #undef LEVEL_BED_CORNERS - #endif - - /** - * SCARA cannot use SLOWDOWN and requires QUICKHOME - */ - #if IS_SCARA - #undef SLOWDOWN - #define QUICK_HOME - #endif - - /** - * Set the home position based on settings or manual overrides - */ - #ifdef MANUAL_X_HOME_POS - #define X_HOME_POS MANUAL_X_HOME_POS - #elif ENABLED(BED_CENTER_AT_0_0) - #if ENABLED(DELTA) - #define X_HOME_POS 0 - #else - #define X_HOME_POS ((X_BED_SIZE) * (X_HOME_DIR) * 0.5) - #endif - #else - #if ENABLED(DELTA) - #define X_HOME_POS (X_MIN_POS + (X_BED_SIZE) * 0.5) - #else - #define X_HOME_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) - #endif - #endif - - #ifdef MANUAL_Y_HOME_POS - #define Y_HOME_POS MANUAL_Y_HOME_POS - #elif ENABLED(BED_CENTER_AT_0_0) - #if ENABLED(DELTA) - #define Y_HOME_POS 0 - #else - #define Y_HOME_POS ((Y_BED_SIZE) * (Y_HOME_DIR) * 0.5) - #endif - #else - #if ENABLED(DELTA) - #define Y_HOME_POS (Y_MIN_POS + (Y_BED_SIZE) * 0.5) - #else - #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) - #endif - #endif - - #ifdef MANUAL_Z_HOME_POS - #define Z_HOME_POS MANUAL_Z_HOME_POS - #else - #define Z_HOME_POS (Z_HOME_DIR < 0 ? Z_MIN_POS : Z_MAX_POS) - #endif - - /** - * If DELTA_HEIGHT isn't defined use the old setting - */ - #if ENABLED(DELTA) && !defined(DELTA_HEIGHT) - #define DELTA_HEIGHT Z_HOME_POS - #endif - - /** - * Z Sled Probe requires Z_SAFE_HOMING - */ - #if ENABLED(Z_PROBE_SLED) - #define Z_SAFE_HOMING - #endif - - /** - * DELTA should ignore Z_SAFE_HOMING and SLOWDOWN - */ - #if ENABLED(DELTA) - #undef Z_SAFE_HOMING - #undef SLOWDOWN - #endif - - /** - * Safe Homing Options - */ - #if ENABLED(Z_SAFE_HOMING) - #ifndef Z_SAFE_HOMING_X_POINT - #define Z_SAFE_HOMING_X_POINT X_CENTER - #endif - #ifndef Z_SAFE_HOMING_Y_POINT - #define Z_SAFE_HOMING_Y_POINT Y_CENTER - #endif - #define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT - #define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT - #else - #define X_TILT_FULCRUM X_HOME_POS - #define Y_TILT_FULCRUM Y_HOME_POS - #endif - - /** - * Host keep alive - */ - #ifndef DEFAULT_KEEPALIVE_INTERVAL - #define DEFAULT_KEEPALIVE_INTERVAL 2 - #endif - - /** - * Provide a MAX_AUTORETRACT for older configs - */ - #if ENABLED(FWRETRACT) && !defined(MAX_AUTORETRACT) - #define MAX_AUTORETRACT 99 - #endif - - /** - * MAX_STEP_FREQUENCY differs for TOSHIBA - */ - #if ENABLED(CONFIG_STEPPERS_TOSHIBA) - #define MAX_STEP_FREQUENCY 10000 // Max step frequency for Toshiba Stepper Controllers - #else - #define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step) - #endif - - // MS1 MS2 Stepper Driver Microstepping mode table - #define MICROSTEP1 LOW,LOW - #if ENABLED(HEROIC_STEPPER_DRIVERS) - #define MICROSTEP128 LOW,HIGH - #else - #define MICROSTEP2 HIGH,LOW - #define MICROSTEP4 LOW,HIGH - #endif - #define MICROSTEP8 HIGH,HIGH - #define MICROSTEP16 HIGH,HIGH - - /** - * Override here because this is set in Configuration_adv.h - */ - #if ENABLED(ULTIPANEL) && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #undef SD_DETECT_INVERTED - #endif - - /** - * Set defaults for missing (newer) options - */ - #ifndef DISABLE_INACTIVE_X - #define DISABLE_INACTIVE_X DISABLE_X - #endif - #ifndef DISABLE_INACTIVE_Y - #define DISABLE_INACTIVE_Y DISABLE_Y - #endif - #ifndef DISABLE_INACTIVE_Z - #define DISABLE_INACTIVE_Z DISABLE_Z - #endif - #ifndef DISABLE_INACTIVE_E - #define DISABLE_INACTIVE_E DISABLE_E - #endif - - // Power Signal Control Definitions - // By default use ATX definition - #ifndef POWER_SUPPLY - #define POWER_SUPPLY 1 - #endif - #if (POWER_SUPPLY == 1) // 1 = ATX - #define PS_ON_AWAKE LOW - #define PS_ON_ASLEEP HIGH - #elif (POWER_SUPPLY == 2) // 2 = X-Box 360 203W - #define PS_ON_AWAKE HIGH - #define PS_ON_ASLEEP LOW - #endif - #define HAS_POWER_SWITCH (POWER_SUPPLY > 0 && PIN_EXISTS(PS_ON)) - - /** - * Temp Sensor defines - */ - #if TEMP_SENSOR_0 == -4 - #define HEATER_0_USES_AD8495 - #elif TEMP_SENSOR_0 == -3 - #define HEATER_0_USES_MAX6675 - #define MAX6675_IS_MAX31855 - #define MAX6675_TMIN -270 - #define MAX6675_TMAX 1800 - #elif TEMP_SENSOR_0 == -2 - #define HEATER_0_USES_MAX6675 - #define MAX6675_TMIN 0 - #define MAX6675_TMAX 1024 - #elif TEMP_SENSOR_0 == -1 - #define HEATER_0_USES_AD595 - #elif TEMP_SENSOR_0 == 0 - #undef HEATER_0_MINTEMP - #undef HEATER_0_MAXTEMP - #elif TEMP_SENSOR_0 > 0 - #define THERMISTORHEATER_0 TEMP_SENSOR_0 - #define HEATER_0_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_1 == -4 - #define HEATER_1_USES_AD8495 - #elif TEMP_SENSOR_1 == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_1" - #elif TEMP_SENSOR_1 == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_1" - #elif TEMP_SENSOR_1 == -1 - #define HEATER_1_USES_AD595 - #elif TEMP_SENSOR_1 == 0 - #undef HEATER_1_MINTEMP - #undef HEATER_1_MAXTEMP - #elif TEMP_SENSOR_1 > 0 - #define THERMISTORHEATER_1 TEMP_SENSOR_1 - #define HEATER_1_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_2 == -4 - #define HEATER_2_USES_AD8495 - #elif TEMP_SENSOR_2 == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_2" - #elif TEMP_SENSOR_2 == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_2" - #elif TEMP_SENSOR_2 == -1 - #define HEATER_2_USES_AD595 - #elif TEMP_SENSOR_2 == 0 - #undef HEATER_2_MINTEMP - #undef HEATER_2_MAXTEMP - #elif TEMP_SENSOR_2 > 0 - #define THERMISTORHEATER_2 TEMP_SENSOR_2 - #define HEATER_2_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_3 == -4 - #define HEATER_3_USES_AD8495 - #elif TEMP_SENSOR_3 == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_3" - #elif TEMP_SENSOR_3 == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_3" - #elif TEMP_SENSOR_3 == -1 - #define HEATER_3_USES_AD595 - #elif TEMP_SENSOR_3 == 0 - #undef HEATER_3_MINTEMP - #undef HEATER_3_MAXTEMP - #elif TEMP_SENSOR_3 > 0 - #define THERMISTORHEATER_3 TEMP_SENSOR_3 - #define HEATER_3_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_4 == -4 - #define HEATER_4_USES_AD8495 - #elif TEMP_SENSOR_4 == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_4" - #elif TEMP_SENSOR_4 == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_4" - #elif TEMP_SENSOR_4 == -1 - #define HEATER_4_USES_AD595 - #elif TEMP_SENSOR_4 == 0 - #undef HEATER_4_MINTEMP - #undef HEATER_4_MAXTEMP - #elif TEMP_SENSOR_4 > 0 - #define THERMISTORHEATER_4 TEMP_SENSOR_4 - #define HEATER_4_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_BED == -4 - #define BED_USES_AD8495 - #elif TEMP_SENSOR_BED == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_BED" - #elif TEMP_SENSOR_BED == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_BED" - #elif TEMP_SENSOR_BED == -1 - #define BED_USES_AD595 - #elif TEMP_SENSOR_BED == 0 - #undef BED_MINTEMP - #undef BED_MAXTEMP - #elif TEMP_SENSOR_BED > 0 - #define THERMISTORBED TEMP_SENSOR_BED - #define BED_USES_THERMISTOR - #endif - - #if TEMP_SENSOR_CHAMBER == -4 - #define CHAMBER_USES_AD8495 - #elif TEMP_SENSOR_CHAMBER == -3 - #error "MAX31855 Thermocouples not supported for TEMP_SENSOR_CHAMBER" - #elif TEMP_SENSOR_CHAMBER == -2 - #error "MAX6675 Thermocouples not supported for TEMP_SENSOR_CHAMBER" - #elif TEMP_SENSOR_CHAMBER == -1 - #define CHAMBER_USES_AD595 - #elif TEMP_SENSOR_CHAMBER > 0 - #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER - #define CHAMBER_USES_THERMISTOR - #endif - - #define HEATER_USES_AD8495 (ENABLED(HEATER_0_USES_AD8495) || ENABLED(HEATER_1_USES_AD8495) || ENABLED(HEATER_2_USES_AD8495) || ENABLED(HEATER_3_USES_AD8495) || ENABLED(HEATER_4_USES_AD8495)) - #define HEATER_USES_AD595 (ENABLED(HEATER_0_USES_AD595) || ENABLED(HEATER_1_USES_AD595) || ENABLED(HEATER_2_USES_AD595) || ENABLED(HEATER_3_USES_AD595) || ENABLED(HEATER_4_USES_AD595)) - - /** - * Default hotend offsets, if not defined - */ - #if HOTENDS > 1 - #ifndef HOTEND_OFFSET_X - #define HOTEND_OFFSET_X { 0 } // X offsets for each extruder - #endif - #ifndef HOTEND_OFFSET_Y - #define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder - #endif - #if !defined(HOTEND_OFFSET_Z) && (ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE)) - #define HOTEND_OFFSET_Z { 0 } - #endif - #endif - - /** - * ARRAY_BY_EXTRUDERS based on EXTRUDERS - */ - #define ARRAY_BY_EXTRUDERS(...) ARRAY_N(EXTRUDERS, __VA_ARGS__) - #define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1, v1, v1) - - /** - * ARRAY_BY_HOTENDS based on HOTENDS - */ - #define ARRAY_BY_HOTENDS(...) ARRAY_N(HOTENDS, __VA_ARGS__) - #define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1) - - /** - * X_DUAL_ENDSTOPS endstop reassignment - */ - #if ENABLED(X_DUAL_ENDSTOPS) - #if X_HOME_DIR > 0 - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define X2_MAX_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define X2_MAX_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define X2_MAX_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define X2_MAX_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define X2_MAX_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define X2_MAX_PIN Z_MAX_PIN - #else - #define X2_MAX_ENDSTOP_INVERTING false - #endif - #define X2_MIN_ENDSTOP_INVERTING false - #else - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define X2_MIN_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define X2_MIN_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define X2_MIN_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define X2_MIN_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define X2_MIN_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define X2_MIN_PIN Z_MAX_PIN - #else - #define X2_MIN_ENDSTOP_INVERTING false - #endif - #define X2_MAX_ENDSTOP_INVERTING false - #endif - #endif - - // Is an endstop plug used for the X2 endstop? - #define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) - - /** - * Y_DUAL_ENDSTOPS endstop reassignment - */ - #if ENABLED(Y_DUAL_ENDSTOPS) - #if Y_HOME_DIR > 0 - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define Y2_MAX_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define Y2_MAX_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define Y2_MAX_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define Y2_MAX_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define Y2_MAX_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define Y2_MAX_PIN Z_MAX_PIN - #else - #define Y2_MAX_ENDSTOP_INVERTING false - #endif - #define Y2_MIN_ENDSTOP_INVERTING false - #else - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define Y2_MIN_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define Y2_MIN_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define Y2_MIN_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define Y2_MIN_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define Y2_MIN_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define Y2_MIN_PIN Z_MAX_PIN - #else - #define Y2_MIN_ENDSTOP_INVERTING false - #endif - #define Y2_MAX_ENDSTOP_INVERTING false - #endif - #endif - - // Is an endstop plug used for the Y2 endstop or the bed probe? - #define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) - - /** - * Z_DUAL_ENDSTOPS endstop reassignment - */ - #if ENABLED(Z_DUAL_ENDSTOPS) - #if Z_HOME_DIR > 0 - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define Z2_MAX_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define Z2_MAX_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define Z2_MAX_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define Z2_MAX_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define Z2_MAX_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define Z2_MAX_PIN Z_MAX_PIN - #else - #define Z2_MAX_ENDSTOP_INVERTING false - #endif - #define Z2_MIN_ENDSTOP_INVERTING false - #else - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #define Z2_MIN_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #define Z2_MIN_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #define Z2_MIN_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #define Z2_MIN_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #define Z2_MIN_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #define Z2_MIN_PIN Z_MAX_PIN - #else - #define Z2_MIN_ENDSTOP_INVERTING false - #endif - #define Z2_MAX_ENDSTOP_INVERTING false - #endif - #endif - - // Is an endstop plug used for the Z2 endstop or the bed probe? - #define IS_Z2_OR_PROBE(A,M) ( \ - (ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) \ - || (ENABLED(Z_MIN_PROBE_ENDSTOP) && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) - - /** - * Set ENDSTOPPULLUPS for active endstop switches - */ - #if ENABLED(ENDSTOPPULLUPS) - #if ENABLED(USE_XMAX_PLUG) - #define ENDSTOPPULLUP_XMAX - #endif - #if ENABLED(USE_YMAX_PLUG) - #define ENDSTOPPULLUP_YMAX - #endif - #if ENABLED(USE_ZMAX_PLUG) - #define ENDSTOPPULLUP_ZMAX - #endif - #if ENABLED(USE_XMIN_PLUG) - #define ENDSTOPPULLUP_XMIN - #endif - #if ENABLED(USE_YMIN_PLUG) - #define ENDSTOPPULLUP_YMIN - #endif - #if ENABLED(USE_ZMIN_PLUG) - #define ENDSTOPPULLUP_ZMIN - #endif - #endif - - /** - * Shorthand for pin tests, used wherever needed - */ - - // Steppers - #define HAS_X_ENABLE (PIN_EXISTS(X_ENABLE)) - #define HAS_X_DIR (PIN_EXISTS(X_DIR)) - #define HAS_X_STEP (PIN_EXISTS(X_STEP)) - #define HAS_X_MICROSTEPS (PIN_EXISTS(X_MS1)) - - #define HAS_X2_ENABLE (PIN_EXISTS(X2_ENABLE)) - #define HAS_X2_DIR (PIN_EXISTS(X2_DIR)) - #define HAS_X2_STEP (PIN_EXISTS(X2_STEP)) - #define HAS_Y_MICROSTEPS (PIN_EXISTS(Y_MS1)) - - #define HAS_Y_ENABLE (PIN_EXISTS(Y_ENABLE)) - #define HAS_Y_DIR (PIN_EXISTS(Y_DIR)) - #define HAS_Y_STEP (PIN_EXISTS(Y_STEP)) - #define HAS_Z_MICROSTEPS (PIN_EXISTS(Z_MS1)) - - #define HAS_Y2_ENABLE (PIN_EXISTS(Y2_ENABLE)) - #define HAS_Y2_DIR (PIN_EXISTS(Y2_DIR)) - #define HAS_Y2_STEP (PIN_EXISTS(Y2_STEP)) - - #define HAS_Z_ENABLE (PIN_EXISTS(Z_ENABLE)) - #define HAS_Z_DIR (PIN_EXISTS(Z_DIR)) - #define HAS_Z_STEP (PIN_EXISTS(Z_STEP)) - - #define HAS_Z2_ENABLE (PIN_EXISTS(Z2_ENABLE)) - #define HAS_Z2_DIR (PIN_EXISTS(Z2_DIR)) - #define HAS_Z2_STEP (PIN_EXISTS(Z2_STEP)) - - // Extruder steppers and solenoids - #define HAS_E0_ENABLE (PIN_EXISTS(E0_ENABLE)) - #define HAS_E0_DIR (PIN_EXISTS(E0_DIR)) - #define HAS_E0_STEP (PIN_EXISTS(E0_STEP)) - #define HAS_E0_MICROSTEPS (PIN_EXISTS(E0_MS1)) - #define HAS_SOLENOID_0 (PIN_EXISTS(SOL0)) - - #define HAS_E1_ENABLE (PIN_EXISTS(E1_ENABLE)) - #define HAS_E1_DIR (PIN_EXISTS(E1_DIR)) - #define HAS_E1_STEP (PIN_EXISTS(E1_STEP)) - #define HAS_E1_MICROSTEPS (PIN_EXISTS(E1_MS1)) - #define HAS_SOLENOID_1 (PIN_EXISTS(SOL1)) - - #define HAS_E2_ENABLE (PIN_EXISTS(E2_ENABLE)) - #define HAS_E2_DIR (PIN_EXISTS(E2_DIR)) - #define HAS_E2_STEP (PIN_EXISTS(E2_STEP)) - #define HAS_E2_MICROSTEPS (PIN_EXISTS(E2_MS1)) - #define HAS_SOLENOID_2 (PIN_EXISTS(SOL2)) - - #define HAS_E3_ENABLE (PIN_EXISTS(E3_ENABLE)) - #define HAS_E3_DIR (PIN_EXISTS(E3_DIR)) - #define HAS_E3_STEP (PIN_EXISTS(E3_STEP)) - #define HAS_E3_MICROSTEPS (PIN_EXISTS(E3_MS1)) - #define HAS_SOLENOID_3 (PIN_EXISTS(SOL3)) - - #define HAS_E4_ENABLE (PIN_EXISTS(E4_ENABLE)) - #define HAS_E4_DIR (PIN_EXISTS(E4_DIR)) - #define HAS_E4_STEP (PIN_EXISTS(E4_STEP)) - #define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1)) - #define HAS_SOLENOID_4 (PIN_EXISTS(SOL4)) - - // Trinamic Stepper Drivers - #define HAS_TRINAMIC (ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) || ENABLED(IS_TRAMS)) - #define X_IS_TRINAMIC (ENABLED( X_IS_TMC2130) || ENABLED( X_IS_TMC2208) || ENABLED(IS_TRAMS)) - #define X2_IS_TRINAMIC (ENABLED(X2_IS_TMC2130) || ENABLED(X2_IS_TMC2208)) - #define Y_IS_TRINAMIC (ENABLED( Y_IS_TMC2130) || ENABLED( Y_IS_TMC2208) || ENABLED(IS_TRAMS)) - #define Y2_IS_TRINAMIC (ENABLED(Y2_IS_TMC2130) || ENABLED(Y2_IS_TMC2208)) - #define Z_IS_TRINAMIC (ENABLED( Z_IS_TMC2130) || ENABLED( Z_IS_TMC2208) || ENABLED(IS_TRAMS)) - #define Z2_IS_TRINAMIC (ENABLED(Z2_IS_TMC2130) || ENABLED(Z2_IS_TMC2208)) - #define E0_IS_TRINAMIC (ENABLED(E0_IS_TMC2130) || ENABLED(E0_IS_TMC2208) || ENABLED(IS_TRAMS)) - #define E1_IS_TRINAMIC (ENABLED(E1_IS_TMC2130) || ENABLED(E1_IS_TMC2208)) - #define E2_IS_TRINAMIC (ENABLED(E2_IS_TMC2130) || ENABLED(E2_IS_TMC2208)) - #define E3_IS_TRINAMIC (ENABLED(E3_IS_TMC2130) || ENABLED(E3_IS_TMC2208)) - #define E4_IS_TRINAMIC (ENABLED(E4_IS_TMC2130) || ENABLED(E4_IS_TMC2208)) - - #if ENABLED(SENSORLESS_HOMING) - // Disable Z axis sensorless homing if a probe is used to home the Z axis - #if HOMING_Z_WITH_PROBE - #undef Z_HOMING_SENSITIVITY - #endif - #define X_SENSORLESS (ENABLED(X_IS_TMC2130) && defined(X_HOMING_SENSITIVITY)) - #define Y_SENSORLESS (ENABLED(Y_IS_TMC2130) && defined(Y_HOMING_SENSITIVITY)) - #define Z_SENSORLESS (ENABLED(Z_IS_TMC2130) && defined(Z_HOMING_SENSITIVITY)) - #endif - - // Endstops and bed probe - #define HAS_STOP_TEST(A,M) (PIN_EXISTS(A##_##M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_OR_PROBE(A,M)) - #define HAS_X_MIN HAS_STOP_TEST(X,MIN) - #define HAS_X_MAX HAS_STOP_TEST(X,MAX) - #define HAS_Y_MIN HAS_STOP_TEST(Y,MIN) - #define HAS_Y_MAX HAS_STOP_TEST(Y,MAX) - #define HAS_Z_MIN HAS_STOP_TEST(Z,MIN) - #define HAS_Z_MAX HAS_STOP_TEST(Z,MAX) - #define HAS_X2_MIN (PIN_EXISTS(X2_MIN)) - #define HAS_X2_MAX (PIN_EXISTS(X2_MAX)) - #define HAS_Y2_MIN (PIN_EXISTS(Y2_MIN)) - #define HAS_Y2_MAX (PIN_EXISTS(Y2_MAX)) - #define HAS_Z2_MIN (PIN_EXISTS(Z2_MIN)) - #define HAS_Z2_MAX (PIN_EXISTS(Z2_MAX)) - #define HAS_Z_MIN_PROBE_PIN (PIN_EXISTS(Z_MIN_PROBE)) - - // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) - #define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && TEMP_SENSOR_##P > -2) - #define HAS_TEMP_ADC_0 (HAS_ADC_TEST(0) && DISABLED(HEATER_0_USES_MAX6675)) - #define HAS_TEMP_ADC_1 HAS_ADC_TEST(1) - #define HAS_TEMP_ADC_2 HAS_ADC_TEST(2) - #define HAS_TEMP_ADC_3 HAS_ADC_TEST(3) - #define HAS_TEMP_ADC_4 HAS_ADC_TEST(4) - #define HAS_TEMP_ADC_BED HAS_ADC_TEST(BED) - #define HAS_TEMP_ADC_CHAMBER HAS_ADC_TEST(CHAMBER) - - #define HAS_TEMP_HOTEND (HAS_TEMP_ADC_0 || ENABLED(HEATER_0_USES_MAX6675)) - #define HAS_TEMP_BED HAS_TEMP_ADC_BED - #define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER - - // Heaters - #define HAS_HEATER_0 (PIN_EXISTS(HEATER_0)) - #define HAS_HEATER_1 (PIN_EXISTS(HEATER_1)) - #define HAS_HEATER_2 (PIN_EXISTS(HEATER_2)) - #define HAS_HEATER_3 (PIN_EXISTS(HEATER_3)) - #define HAS_HEATER_4 (PIN_EXISTS(HEATER_4)) - #define HAS_HEATER_BED (PIN_EXISTS(HEATER_BED)) - - // Shorthand for common combinations - #define HAS_HEATED_BED (HAS_TEMP_BED && HAS_HEATER_BED) - #define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_TEMP_CHAMBER) - - // PID heating - #if !HAS_HEATED_BED - #undef PIDTEMPBED - #endif - #define HAS_PID_HEATING (ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)) - #define HAS_PID_FOR_BOTH (ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED)) - - // Thermal protection - #define HAS_THERMALLY_PROTECTED_BED (HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED)) - #define WATCH_HOTENDS (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0) - #define WATCH_THE_BED (HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0) - - // Auto fans - #define HAS_AUTO_FAN_0 (PIN_EXISTS(E0_AUTO_FAN)) - #define HAS_AUTO_FAN_1 (HOTENDS > 1 && PIN_EXISTS(E1_AUTO_FAN)) - #define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN)) - #define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN)) - #define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN)) - #define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN)) - #define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN) - #define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_3_IS_0 (E3_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_3_IS_1 (E3_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_3_IS_2 (E3_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_4_IS_0 (E4_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) - #define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) - - // Other fans - #define HAS_FAN0 (PIN_EXISTS(FAN)) - #define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLER_FAN_PIN != FAN1_PIN && E0_AUTO_FAN_PIN != FAN1_PIN && E1_AUTO_FAN_PIN != FAN1_PIN && E2_AUTO_FAN_PIN != FAN1_PIN && E3_AUTO_FAN_PIN != FAN1_PIN) - #define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLER_FAN_PIN != FAN2_PIN && E0_AUTO_FAN_PIN != FAN2_PIN && E1_AUTO_FAN_PIN != FAN2_PIN && E2_AUTO_FAN_PIN != FAN2_PIN && E3_AUTO_FAN_PIN != FAN2_PIN) - #define HAS_CONTROLLER_FAN (PIN_EXISTS(CONTROLLER_FAN)) - - // Servos - #define HAS_SERVO_0 (PIN_EXISTS(SERVO0)) - #define HAS_SERVO_1 (PIN_EXISTS(SERVO1)) - #define HAS_SERVO_2 (PIN_EXISTS(SERVO2)) - #define HAS_SERVO_3 (PIN_EXISTS(SERVO3)) - #define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0 && (HAS_SERVO_0 || HAS_SERVO_1 || HAS_SERVO_2 || HAS_SERVO_3)) - - #if HAS_SERVOS && !defined(Z_PROBE_SERVO_NR) - #define Z_PROBE_SERVO_NR -1 - #endif - - // Sensors - #define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH)) - - // User Interface - #define HAS_HOME (PIN_EXISTS(HOME)) - #define HAS_KILL (PIN_EXISTS(KILL)) - #define HAS_SUICIDE (PIN_EXISTS(SUICIDE)) - #define HAS_PHOTOGRAPH (PIN_EXISTS(PHOTOGRAPH)) - #define HAS_BUZZER (PIN_EXISTS(BEEPER) || ENABLED(LCD_USE_I2C_BUZZER)) - #define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE)) - - // Digital control - #define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS) - #define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET)) - #define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) - #define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E)) - - #if !HAS_TEMP_SENSOR - #undef AUTO_REPORT_TEMPERATURES - #endif - - #define HAS_AUTO_REPORTING (ENABLED(AUTO_REPORT_TEMPERATURES) || ENABLED(AUTO_REPORT_SD_STATUS)) - - /** - * This setting is also used by M109 when trying to calculate - * a ballpark safe margin to prevent wait-forever situation. - */ - #ifndef EXTRUDE_MINTEMP - #define EXTRUDE_MINTEMP 170 - #endif - - /** - * Helper Macros for heaters and extruder fan - */ - #define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, v) - #if HOTENDS > 1 || ENABLED(HEATERS_PARALLEL) - #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, v) - #if HOTENDS > 2 - #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, v) - #if HOTENDS > 3 - #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, v) - #if HOTENDS > 4 - #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, v) - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HOTENDS > 1 - #if ENABLED(HEATERS_PARALLEL) - #define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); } - #else - #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) - #endif - - /** - * Heated bed requires settings - */ - #if HAS_HEATED_BED - #ifndef MAX_BED_POWER - #define MAX_BED_POWER 255 - #endif - #ifndef HEATER_BED_INVERTING - #define HEATER_BED_INVERTING false - #endif - #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, (v) ^ HEATER_BED_INVERTING) - #endif - - /** - * Up to 3 PWM fans - */ - #if HAS_FAN2 - #define FAN_COUNT 3 - #elif HAS_FAN1 - #define FAN_COUNT 2 - #elif HAS_FAN0 - #define FAN_COUNT 1 - #else - #define FAN_COUNT 0 - #endif - - #if HAS_FAN0 - #define WRITE_FAN(v) WRITE(FAN_PIN, v) - #define WRITE_FAN0(v) WRITE_FAN(v) - #endif - #if HAS_FAN1 - #define WRITE_FAN1(v) WRITE(FAN1_PIN, v) - #endif - #if HAS_FAN2 - #define WRITE_FAN2(v) WRITE(FAN2_PIN, v) - #endif - #define WRITE_FAN_N(n, v) WRITE_FAN##n(v) - - /** - * Part Cooling fan multipliexer - */ - #define HAS_FANMUX PIN_EXISTS(FANMUX0) - - /** - * Bed Probe dependencies - */ - #if HAS_BED_PROBE - #if ENABLED(ENDSTOPPULLUPS) && HAS_Z_MIN_PROBE_PIN - #define ENDSTOPPULLUP_ZMIN_PROBE - #endif - #ifndef Z_PROBE_OFFSET_RANGE_MIN - #define Z_PROBE_OFFSET_RANGE_MIN -20 - #endif - #ifndef Z_PROBE_OFFSET_RANGE_MAX - #define Z_PROBE_OFFSET_RANGE_MAX 20 - #endif - #ifndef XY_PROBE_SPEED - #ifdef HOMING_FEEDRATE_XY - #define XY_PROBE_SPEED HOMING_FEEDRATE_XY - #else - #define XY_PROBE_SPEED 4000 - #endif - #endif - #else - #undef X_PROBE_OFFSET_FROM_EXTRUDER - #undef Y_PROBE_OFFSET_FROM_EXTRUDER - #undef Z_PROBE_OFFSET_FROM_EXTRUDER - #define X_PROBE_OFFSET_FROM_EXTRUDER 0 - #define Y_PROBE_OFFSET_FROM_EXTRUDER 0 - #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 - #endif - - /** - * XYZ Bed Skew Correction - */ - #if ENABLED(SKEW_CORRECTION) - #define SKEW_FACTOR_MIN -1 - #define SKEW_FACTOR_MAX 1 - - #define _GET_SIDE(a,b,c) (SQRT(2*sq(a)+2*sq(b)-4*sq(c))*0.5) - #define _SKEW_SIDE(a,b,c) tan(M_PI*0.5-acos((sq(a)-sq(b)-sq(c))/(2*c*b))) - #define _SKEW_FACTOR(a,b,c) _SKEW_SIDE(float(a),_GET_SIDE(float(a),float(b),float(c)),float(c)) - - #ifndef XY_SKEW_FACTOR - constexpr float XY_SKEW_FACTOR = ( - #if defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD) - _SKEW_FACTOR(XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD) - #else - 0.0 - #endif - ); - #endif - #ifndef XZ_SKEW_FACTOR - #if defined(XY_SIDE_AD) && !defined(XZ_SIDE_AD) - #define XZ_SIDE_AD XY_SIDE_AD - #endif - constexpr float XZ_SKEW_FACTOR = ( - #if defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD) - _SKEW_FACTOR(XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD) - #else - 0.0 - #endif - ); - #endif - #ifndef YZ_SKEW_FACTOR - constexpr float YZ_SKEW_FACTOR = ( - #if defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD) - _SKEW_FACTOR(YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD) - #else - 0.0 - #endif - ); - #endif - #endif // SKEW_CORRECTION - - /** - * Set granular options based on the specific type of leveling - */ - #define UBL_SEGMENTED (ENABLED(AUTO_BED_LEVELING_UBL) && (ENABLED(DELTA))) - #define ABL_PLANAR (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT)) - #define ABL_GRID (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)) - #define OLDSCHOOL_ABL (ABL_PLANAR || ABL_GRID) - #define HAS_ABL (OLDSCHOOL_ABL || ENABLED(AUTO_BED_LEVELING_UBL)) - #define HAS_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING)) - #define HAS_AUTOLEVEL (HAS_ABL && DISABLED(PROBE_MANUALLY)) - #define HAS_MESH (ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(MESH_BED_LEVELING)) - #define PLANNER_LEVELING (OLDSCHOOL_ABL || ENABLED(MESH_BED_LEVELING) || UBL_SEGMENTED || ENABLED(SKEW_CORRECTION)) - #define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) - #define HAS_UBL_AND_CURVES (ENABLED(AUTO_BED_LEVELING_UBL) && !PLANNER_LEVELING && (ENABLED(ARC_SUPPORT) || ENABLED(BEZIER_CURVE_SUPPORT))) - - #if ENABLED(AUTO_BED_LEVELING_UBL) - #undef LCD_BED_LEVELING - #endif - - /** - * Heater & Fan Pausing - */ - #if FAN_COUNT == 0 - #undef PROBING_FANS_OFF - #endif - #define QUIET_PROBING (HAS_BED_PROBE && (ENABLED(PROBING_HEATERS_OFF) || ENABLED(PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)) - #define HEATER_IDLE_HANDLER (ENABLED(ADVANCED_PAUSE_FEATURE) || ENABLED(PROBING_HEATERS_OFF)) - - #if ENABLED(ADVANCED_PAUSE_FEATURE) && !defined(FILAMENT_CHANGE_SLOW_LOAD_LENGTH) - #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 - #endif - - /** - * Only constrain Z on DELTA / SCARA machines - */ - #if IS_KINEMATIC - #undef MIN_SOFTWARE_ENDSTOP_X - #undef MIN_SOFTWARE_ENDSTOP_Y - #undef MAX_SOFTWARE_ENDSTOP_X - #undef MAX_SOFTWARE_ENDSTOP_Y - #endif - - /** - * Bed Probing rectangular bounds - * These can be further constrained in code for Delta and SCARA - */ - - #ifndef MIN_PROBE_EDGE - #define MIN_PROBE_EDGE 0 - #endif - - #if ENABLED(DELTA) - /** - * Delta radius/rod trimmers/angle trimmers - */ - #define _PROBE_RADIUS (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) - #ifndef DELTA_CALIBRATION_RADIUS - #ifdef X_PROBE_OFFSET_FROM_EXTRUDER - #define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - MAX3(abs(X_PROBE_OFFSET_FROM_EXTRUDER), abs(Y_PROBE_OFFSET_FROM_EXTRUDER), abs(MIN_PROBE_EDGE))) - #else - #define DELTA_CALIBRATION_RADIUS _PROBE_RADIUS - #endif - #endif - #ifndef DELTA_ENDSTOP_ADJ - #define DELTA_ENDSTOP_ADJ { 0, 0, 0 } - #endif - #ifndef DELTA_TOWER_ANGLE_TRIM - #define DELTA_TOWER_ANGLE_TRIM {0, 0, 0} - #endif - #ifndef DELTA_RADIUS_TRIM_TOWER - #define DELTA_RADIUS_TRIM_TOWER {0, 0, 0} - #endif - #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER - #define DELTA_DIAGONAL_ROD_TRIM_TOWER {0, 0, 0} - #endif - - // Probing points may be verified at compile time within the radius - // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") - // so that may be added to SanityCheck.h in the future. - #define _MIN_PROBE_X (X_CENTER - (_PROBE_RADIUS)) - #define _MIN_PROBE_Y (Y_CENTER - (_PROBE_RADIUS)) - #define _MAX_PROBE_X (X_CENTER + _PROBE_RADIUS) - #define _MAX_PROBE_Y (Y_CENTER + _PROBE_RADIUS) - - #elif IS_SCARA - - #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) - #define _PROBE_RADIUS (SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) - #define _MIN_PROBE_X (X_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) - #define _MIN_PROBE_Y (Y_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) - #define _MAX_PROBE_X (X_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) - #define _MAX_PROBE_Y (Y_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) - - #else - - // Boundaries for Cartesian probing based on bed limits - #define _MIN_PROBE_X (max(X_MIN_BED + MIN_PROBE_EDGE, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MIN_PROBE_Y (max(Y_MIN_BED + MIN_PROBE_EDGE, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MAX_PROBE_X (min(X_MAX_BED - (MIN_PROBE_EDGE), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MAX_PROBE_Y (min(Y_MAX_BED - (MIN_PROBE_EDGE), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) - - #endif - - #if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) - #define LEVELED_SEGMENT_LENGTH 5 - #endif - - // These may be overridden in Configuration.h if a smaller area is desired - #ifndef MIN_PROBE_X - #define MIN_PROBE_X _MIN_PROBE_X - #endif - #ifndef MIN_PROBE_Y - #define MIN_PROBE_Y _MIN_PROBE_Y - #endif - #ifndef MAX_PROBE_X - #define MAX_PROBE_X _MAX_PROBE_X - #endif - #ifndef MAX_PROBE_Y - #define MAX_PROBE_Y _MAX_PROBE_Y - #endif - - /** - * Default mesh area is an area with an inset margin on the print area. - */ - #if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) - #if IS_KINEMATIC - // Probing points may be verified at compile time within the radius - // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") - // so that may be added to SanityCheck.h in the future. - #define _MESH_MIN_X (X_MIN_BED + MESH_INSET) - #define _MESH_MIN_Y (Y_MIN_BED + MESH_INSET) - #define _MESH_MAX_X (X_MAX_BED - (MESH_INSET)) - #define _MESH_MAX_Y (Y_MAX_BED - (MESH_INSET)) - #else - // Boundaries for Cartesian probing based on set limits - #if ENABLED(AUTO_BED_LEVELING_UBL) - #define _MESH_MIN_X (max(X_MIN_BED + MESH_INSET, X_MIN_POS)) // UBL is careful not to probe off the bed. It does not - #define _MESH_MIN_Y (max(Y_MIN_BED + MESH_INSET, Y_MIN_POS)) // need *_PROBE_OFFSET_FROM_EXTRUDER in the mesh dimensions - #define _MESH_MAX_X (min(X_MAX_BED - (MESH_INSET), X_MAX_POS)) - #define _MESH_MAX_Y (min(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) - #else - #define _MESH_MIN_X (max(X_MIN_BED + MESH_INSET, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MESH_MIN_Y (max(Y_MIN_BED + MESH_INSET, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MESH_MAX_X (min(X_MAX_BED - (MESH_INSET), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) - #define _MESH_MAX_Y (min(Y_MAX_BED - (MESH_INSET), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) - #endif - #endif - - // These may be overridden in Configuration.h if a smaller area is desired - #ifndef MESH_MIN_X - #define MESH_MIN_X _MESH_MIN_X - #endif - #ifndef MESH_MIN_Y - #define MESH_MIN_Y _MESH_MIN_Y - #endif - #ifndef MESH_MAX_X - #define MESH_MAX_X _MESH_MAX_X - #endif - #ifndef MESH_MAX_Y - #define MESH_MAX_Y _MESH_MAX_Y - #endif - - #endif // MESH_BED_LEVELING || AUTO_BED_LEVELING_UBL - - #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_3POINT) - #if IS_KINEMATIC - #define SIN0 0.0 - #define SIN120 0.866025 - #define SIN240 -0.866025 - #define COS0 1.0 - #define COS120 -0.5 - #define COS240 -0.5 - #ifndef PROBE_PT_1_X - #define PROBE_PT_1_X (X_CENTER + (_PROBE_RADIUS) * COS0) - #endif - #ifndef PROBE_PT_1_Y - #define PROBE_PT_1_Y (Y_CENTER + (_PROBE_RADIUS) * SIN0) - #endif - #ifndef PROBE_PT_2_X - #define PROBE_PT_2_X (X_CENTER + (_PROBE_RADIUS) * COS120) - #endif - #ifndef PROBE_PT_2_Y - #define PROBE_PT_2_Y (Y_CENTER + (_PROBE_RADIUS) * SIN120) - #endif - #ifndef PROBE_PT_3_X - #define PROBE_PT_3_X (X_CENTER + (_PROBE_RADIUS) * COS240) - #endif - #ifndef PROBE_PT_3_Y - #define PROBE_PT_3_Y (Y_CENTER + (_PROBE_RADIUS) * SIN240) - #endif - #else - #ifndef PROBE_PT_1_X - #define PROBE_PT_1_X MIN_PROBE_X - #endif - #ifndef PROBE_PT_1_Y - #define PROBE_PT_1_Y MIN_PROBE_Y - #endif - #ifndef PROBE_PT_2_X - #define PROBE_PT_2_X MAX_PROBE_X - #endif - #ifndef PROBE_PT_2_Y - #define PROBE_PT_2_Y MIN_PROBE_Y - #endif - #ifndef PROBE_PT_3_X - #define PROBE_PT_3_X X_CENTER - #endif - #ifndef PROBE_PT_3_Y - #define PROBE_PT_3_Y MAX_PROBE_Y - #endif - #endif - #endif - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) - #ifndef LEFT_PROBE_BED_POSITION - #define LEFT_PROBE_BED_POSITION MIN_PROBE_X - #endif - #ifndef RIGHT_PROBE_BED_POSITION - #define RIGHT_PROBE_BED_POSITION MAX_PROBE_X - #endif - #ifndef FRONT_PROBE_BED_POSITION - #define FRONT_PROBE_BED_POSITION MIN_PROBE_Y - #endif - #ifndef BACK_PROBE_BED_POSITION - #define BACK_PROBE_BED_POSITION MAX_PROBE_Y - #endif - #endif - - /** - * Buzzer/Speaker - */ - #if ENABLED(LCD_USE_I2C_BUZZER) - #ifndef LCD_FEEDBACK_FREQUENCY_HZ - #define LCD_FEEDBACK_FREQUENCY_HZ 1000 - #endif - #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS - #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 - #endif - #else - #ifndef LCD_FEEDBACK_FREQUENCY_HZ - #define LCD_FEEDBACK_FREQUENCY_HZ 5000 - #endif - #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS - #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 - #endif - #endif - - /** - * VIKI2, miniVIKI, AZSMZ_12864, and MKS_12864OLED_SSD1306 require DOGLCD_SCK and DOGLCD_MOSI to be defined. - */ - #if ENABLED(VIKI2) || ENABLED(miniVIKI) || ENABLED(AZSMZ_12864) || ENABLED(MKS_12864OLED_SSD1306) - #ifndef DOGLCD_SCK - #define DOGLCD_SCK SCK_PIN - #endif - #ifndef DOGLCD_MOSI - #define DOGLCD_MOSI MOSI_PIN - #endif - #endif - - /** - * Z_HOMING_HEIGHT / Z_CLEARANCE_BETWEEN_PROBES - */ - #ifndef Z_HOMING_HEIGHT - #ifndef Z_CLEARANCE_BETWEEN_PROBES - #define Z_HOMING_HEIGHT 0 - #else - #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES - #endif - #endif - #ifndef Z_CLEARANCE_BETWEEN_PROBES - #define Z_CLEARANCE_BETWEEN_PROBES Z_HOMING_HEIGHT - #endif - #if Z_CLEARANCE_BETWEEN_PROBES > Z_HOMING_HEIGHT - #define MANUAL_PROBE_HEIGHT Z_CLEARANCE_BETWEEN_PROBES - #else - #define MANUAL_PROBE_HEIGHT Z_HOMING_HEIGHT - #endif - - // Stepper pulse duration, in cycles - #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND) - - // Updated G92 behavior shifts the workspace - #define HAS_POSITION_SHIFT DISABLED(NO_WORKSPACE_OFFSETS) - // The home offset also shifts the coordinate space - #define HAS_HOME_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA)) - // Either offset yields extra calculations on all moves - #define HAS_WORKSPACE_OFFSET (HAS_POSITION_SHIFT || HAS_HOME_OFFSET) - // M206 doesn't apply to DELTA - #define HAS_M206_COMMAND (HAS_HOME_OFFSET && DISABLED(DELTA)) - - // LCD timeout to status screen default is 15s - #ifndef LCD_TIMEOUT_TO_STATUS - #define LCD_TIMEOUT_TO_STATUS 15000 - #endif - - // Shorthand - #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) - - // Add commands that need sub-codes to this list - #define USE_GCODE_SUBCODES ENABLED(G38_PROBE_TARGET) || ENABLED(CNC_COORDINATE_SYSTEMS) || ENABLED(POWER_LOSS_RECOVERY) - - // Parking Extruder - #if ENABLED(PARKING_EXTRUDER) - #ifndef PARKING_EXTRUDER_GRAB_DISTANCE - #define PARKING_EXTRUDER_GRAB_DISTANCE 0 - #endif - #ifndef PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE HIGH - #endif - #endif - - // Number of VFAT entries used. Each entry has 13 UTF-16 characters - #if ENABLED(SCROLL_LONG_FILENAMES) - #define MAX_VFAT_ENTRIES (5) - #else - #define MAX_VFAT_ENTRIES (2) - #endif - - // Set defaults for unspecified LED user colors - #if ENABLED(LED_CONTROL_MENU) - #ifndef LED_USER_PRESET_RED - #define LED_USER_PRESET_RED 255 - #endif - #ifndef LED_USER_PRESET_GREEN - #define LED_USER_PRESET_GREEN 255 - #endif - #ifndef LED_USER_PRESET_BLUE - #define LED_USER_PRESET_BLUE 255 - #endif - #ifndef LED_USER_PRESET_WHITE - #define LED_USER_PRESET_WHITE 0 - #endif - #ifndef LED_USER_PRESET_BRIGHTNESS - #ifdef NEOPIXEL_BRIGHTNESS - #define LED_USER_PRESET_BRIGHTNESS NEOPIXEL_BRIGHTNESS - #else - #define LED_USER_PRESET_BRIGHTNESS 255 - #endif - #endif - #endif - - // Nozzle park - #if ENABLED(NOZZLE_PARK_FEATURE) && ENABLED(DELTA) - #undef NOZZLE_PARK_Z_FEEDRATE - #define NOZZLE_PARK_Z_FEEDRATE NOZZLE_PARK_XY_FEEDRATE - #endif - - #if ENABLED(SDCARD_SORT_ALPHA) - #define HAS_FOLDER_SORTING (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) - #endif - -#endif // CONDITIONALS_POST_H diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7d0efcc303..3a6fe74bd1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -20,6 +20,17 @@ * */ +//#define X_2208 +//#define Y_2208 + +#define BedAC + +//#define tallVersion + +/* + * Enables a filament sensor plugged into the laser pin. Disables the laser + */ +//#define FilamentSensor /** * Configuration.h * @@ -37,7 +48,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +70,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -74,7 +85,7 @@ // User-specified version info of this build to display in [Pronterface, etc] terminal window during // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this // build by the user have been successfully uploaded into firmware. -#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define STRING_CONFIG_H_AUTHOR "TinyMachines3D" // Who made the changes. #define SHOW_BOOTSCREEN #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 #define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 @@ -91,22 +102,31 @@ */ // Enable to show the bitmap in Marlin/_Bootscreen.h on startup. -//#define SHOW_CUSTOM_BOOTSCREEN +#define SHOW_CUSTOM_BOOTSCREEN // Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. -//#define CUSTOM_STATUS_SCREEN_IMAGE +#define CUSTOM_STATUS_SCREEN_IMAGE // @section machine /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -116,7 +136,7 @@ * * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] */ -#define BAUDRATE 250000 +#define BAUDRATE 115200 // Enable the Bluetooth serial interface on AT90USB devices //#define BLUETOOTH @@ -124,12 +144,12 @@ // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_14_EFB + #define MOTHERBOARD BOARD_RUMBA #endif // Optional custom name for your RepStrap or other custom machine // Displayed in the LCD "Ready" message -//#define CUSTOM_MACHINE_NAME "3D Printer" +#define CUSTOM_MACHINE_NAME "TM3D T-REX 2+" // Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) // You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) @@ -139,10 +159,10 @@ // This defines the number of extruders // :[1, 2, 3, 4, 5] -#define EXTRUDERS 1 +#define EXTRUDERS 2 // Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. -#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 // For Cyclops or any "multi-extruder" that shares a single nozzle. //#define SINGLENOZZLE @@ -303,11 +323,15 @@ * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } */ #define TEMP_SENSOR_0 1 -#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_1 1 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 -#define TEMP_SENSOR_BED 0 +#if(ENABLED(BedAC)) + #define TEMP_SENSOR_BED 11 +#else + #define TEMP_SENSOR_BED 0 +#endif #define TEMP_SENSOR_CHAMBER 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 @@ -342,7 +366,7 @@ // When temperature exceeds max temp, your heater will be switched off. // This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! // You should use MINTEMP for thermistor short/failure protection. -#define HEATER_0_MAXTEMP 275 +#define HEATER_0_MAXTEMP 410 #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 @@ -360,7 +384,7 @@ #define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current #define PID_K1 0.95 // Smoothing factor within any PID loop #if ENABLED(PIDTEMP) - //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. //#define PID_DEBUG // Sends debug data to the serial port. //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay @@ -405,7 +429,7 @@ * heater. If your configuration is significantly different than this and you don't understand * the issues involved, don't use bed PID until someone else verifies that your hardware works. */ -//#define PIDTEMPBED +#define PIDTEMPBED //#define BED_LIMIT_SWITCHING @@ -438,15 +462,20 @@ // @section extruder -// This option prevents extrusion if the temperature is below EXTRUDE_MINTEMP. -// It also enables the M302 command to set the minimum extrusion temperature -// or to allow moving the extruder regardless of the hotend temperature. -// *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ #define PREVENT_COLD_EXTRUSION #define EXTRUDE_MINTEMP 170 -// This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH. -// Note that for Bowden Extruders a too-small value here may prevent loading. +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ #define PREVENT_LENGTHY_EXTRUDE #define EXTRUDE_MAXLENGTH 200 @@ -495,10 +524,10 @@ // Almost all printers will be using one per axis. Probes will use one or more of the // extra connectors. Leave undefined any used for non-endstop and non-probe purposes. #define USE_XMIN_PLUG -#define USE_YMIN_PLUG +//#define USE_YMIN_PLUG #define USE_ZMIN_PLUG -//#define USE_XMAX_PLUG -//#define USE_YMAX_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG //#define USE_ZMAX_PLUG // Enable pullup for all endstops to prevent a floating state @@ -514,19 +543,49 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. -#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. -#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -552,14 +611,21 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + + + #if(ENABLED(Y_2208)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 1600, 93 } +#else +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 160, 1600, 93 } +#endif + /** * Default Max Feed Rate (mm/s) * Override with M203 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } /** * Default Max Acceleration (change/s) change = mm/s @@ -567,7 +633,7 @@ * Override with M201 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +#define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } /** * Default Acceleration (change/s) change = mm/s @@ -589,21 +655,20 @@ * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#define DEFAULT_XJERK 10.0 +#define DEFAULT_XJERK 20.0 #define DEFAULT_YJERK 10.0 -#define DEFAULT_ZJERK 0.3 +#define DEFAULT_ZJERK 0.4 #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -671,7 +736,7 @@ /** * The BLTouch probe uses a Hall effect sensor and emulates a servo. */ -//#define BLTOUCH +#define BLTOUCH #if ENABLED(BLTOUCH) //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed #endif @@ -720,9 +785,9 @@ * O-- FRONT --+ * (0,0) */ -#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] -#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] -#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] +#define X_PROBE_OFFSET_FROM_EXTRUDER -7 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.5 // Z offset: -below +above [the nozzle] // Certain types of probes need to stay away from edges #define MIN_PROBE_EDGE 10 @@ -739,7 +804,7 @@ // The number of probes to perform at each point. // Set to 2 for a fast/slow probe, using the second probe result. // Set to 3 or more for slow probes, averaging the results. -//#define MULTIPLE_PROBING 2 +#define MULTIPLE_PROBING 2 /** * Z probes require clearance when deploying, stowing, and moving between @@ -755,18 +820,18 @@ * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. */ -#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow #define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points //#define Z_AFTER_PROBING 5 // Z position after probing is done -#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping +#define Z_PROBE_LOW_POINT -3 // Farthest distance below the trigger-point to go before stopping // For M851 give a range for adjusting the Z probe offset #define Z_PROBE_OFFSET_RANGE_MIN -20 #define Z_PROBE_OFFSET_RANGE_MAX 20 // Enable the M48 repeatability test to test probe accuracy -//#define Z_MIN_PROBE_REPEATABILITY_TEST +#define Z_MIN_PROBE_REPEATABILITY_TEST // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // :{ 0:'Low', 1:'High' } @@ -791,18 +856,23 @@ // @section machine // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#if(ENABLED(X_2208)) +#define INVERT_X_DIR true +#else #define INVERT_X_DIR false +#endif + #if(ENABLED(Y_2208)) #define INVERT_Y_DIR true -#define INVERT_Z_DIR false - -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA +#else +#define INVERT_Y_DIR false +#endif +#define INVERT_Z_DIR true // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. #define INVERT_E0_DIR false -#define INVERT_E1_DIR false +#define INVERT_E1_DIR true #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false @@ -813,28 +883,32 @@ //#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. -//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... // Be sure you have this distance over your Z_MAX_POS in case. // Direction of endstops when homing; 1=MAX, -1=MIN // :[-1,1] #define X_HOME_DIR -1 -#define Y_HOME_DIR -1 +#define Y_HOME_DIR 1 #define Z_HOME_DIR -1 // @section machine // The size of the print bed -#define X_BED_SIZE 200 -#define Y_BED_SIZE 200 +#define X_BED_SIZE 400 +#define Y_BED_SIZE 400 // Travel limits (mm) after homing, corresponding to endstop positions. -#define X_MIN_POS 0 +#define X_MIN_POS -42 #define Y_MIN_POS 0 #define Z_MIN_POS 0 -#define X_MAX_POS X_BED_SIZE +#define X_MAX_POS 450 #define Y_MAX_POS Y_BED_SIZE -#define Z_MAX_POS 200 +#if(ENABLED(tallVersion)) + #define Z_MAX_POS 700 +#else + #define Z_MAX_POS 500 +#endif /** * Software Endstops @@ -862,7 +936,7 @@ #endif #if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) - //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD + #define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD #endif /** @@ -873,11 +947,15 @@ * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. * By default the firmware assumes HIGH=FILAMENT PRESENT. */ -//#define FILAMENT_RUNOUT_SENSOR + #if(ENABLED(FilamentSensor)) + #define FILAMENT_RUNOUT_SENSOR +#endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_INVERTING true // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FIL_RUNOUT_PIN 4 #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -922,14 +1000,14 @@ //#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_BILINEAR -//#define AUTO_BED_LEVELING_UBL +#define AUTO_BED_LEVELING_UBL //#define MESH_BED_LEVELING /** * Normally G28 leaves leveling disabled on completion. Enable * this option to have G28 restore the prior leveling state. */ -//#define RESTORE_LEVELING_AFTER_G28 +#define RESTORE_LEVELING_AFTER_G28 /** * Enable detailed logging of G28, G29, M48, etc. @@ -953,7 +1031,7 @@ /** * Enable the G26 Mesh Validation Pattern tool. */ - //#define G26_MESH_VALIDATION + #define G26_MESH_VALIDATION #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. @@ -1002,16 +1080,16 @@ //========================= Unified Bed Leveling ============================ //=========================================================================== - //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + #define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh - #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed - #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define MESH_INSET 30 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 15 // Don't use more than 15 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 - //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + //#define UBL_Z_RAISE_WHEN_OFF_MESH 0.0 // When the nozzle is off the mesh, this value is used // as the Z-Height correction value. #elif ENABLED(MESH_BED_LEVELING) @@ -1033,12 +1111,12 @@ * Override if the automatically selected points are inadequate. */ #if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) - //#define PROBE_PT_1_X 15 - //#define PROBE_PT_1_Y 180 - //#define PROBE_PT_2_X 15 - //#define PROBE_PT_2_Y 20 - //#define PROBE_PT_3_X 170 - //#define PROBE_PT_3_Y 20 + #define PROBE_PT_1_X 30 + #define PROBE_PT_1_Y 365 + #define PROBE_PT_2_X 30 + #define PROBE_PT_2_Y 30 + #define PROBE_PT_3_X 365 + #define PROBE_PT_3_Y 30 #endif /** @@ -1064,7 +1142,7 @@ * Commands to execute at the end of G29 probing. * Useful to retract or move the Z probe out of the way. */ -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" +#define Z_PROBE_END_SCRIPT "M280 P0 S90" // @section homing @@ -1087,7 +1165,7 @@ // - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). // - Prevent Z homing when the Z probe is outside bed area. // -//#define Z_SAFE_HOMING +#define Z_SAFE_HOMING #if ENABLED(Z_SAFE_HOMING) #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). @@ -1169,7 +1247,7 @@ // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. // -//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +#define EEPROM_SETTINGS // Enable for M500 and M501 commands //#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! #define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. @@ -1220,11 +1298,11 @@ * P1 Raise the nozzle always to Z-park height. * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. */ -//#define NOZZLE_PARK_FEATURE +#define NOZZLE_PARK_FEATURE #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { 150, (Y_MIN_POS + 10), 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1320,7 +1398,7 @@ * * View the current statistics with M78. */ -//#define PRINTCOUNTER +#define PRINTCOUNTER //============================================================================= //============================= LCD and SD support ============================ @@ -1333,11 +1411,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1365,19 +1443,6 @@ */ #define DISPLAY_CHARSET_HD44780 JAPANESE -/** - * LCD TYPE - * - * Enable ULTRA_LCD for a 16x2, 16x4, 20x2, or 20x4 character-based LCD. - * Enable DOGLCD for a 128x64 (ST7565R) Full Graphical Display. - * (These options will be enabled automatically for most displays.) - * - * IMPORTANT: The U8glib library is required for Full Graphic Display! - * https://github.com/olikraus/U8glib_Arduino - */ -//#define ULTRA_LCD // Character based -//#define DOGLCD // Full graphics display - /** * SD CARD * @@ -1385,7 +1450,7 @@ * you must uncomment the following option or it won't work. * */ -//#define SDSUPPORT +#define SDSUPPORT /** * SD CARD: SPI SPEED @@ -1457,7 +1522,7 @@ // // Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. // -//#define INDIVIDUAL_AXIS_HOMING_MENU +#define INDIVIDUAL_AXIS_HOMING_MENU // // SPEAKER/BUZZER @@ -1477,12 +1542,24 @@ //#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 //#define LCD_FEEDBACK_FREQUENCY_HZ 5000 +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + // -// CONTROLLER TYPE: Standard +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller // -// Marlin supports a wide variety of controllers. -// Enable one of the following options to specify your controller. +// Note: Usually sold with a white PCB. // +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY // // ULTIMAKER Controller. @@ -1500,40 +1577,6 @@ // //#define PANEL_ONE -// -// MaKr3d Makr-Panel with graphic controller and SD support. -// http://reprap.org/wiki/MaKr3d_MaKrPanel -// -//#define MAKRPANEL - -// -// ReprapWorld Graphical LCD -// https://reprapworld.com/?products_details&products_id/1218 -// -//#define REPRAPWORLD_GRAPHICAL_LCD - -// -// Activate one of these if you have a Panucatt Devices -// Viki 2.0 or mini Viki with Graphic LCD -// http://panucatt.com -// -//#define VIKI2 -//#define miniVIKI - -// -// Adafruit ST7565 Full Graphic Controller. -// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ -// -//#define ELB_FULL_GRAPHIC_CONTROLLER - -// -// RepRapDiscount Smart Controller. -// http://reprap.org/wiki/RepRapDiscount_Smart_Controller -// -// Note: Usually sold with a white PCB. -// -//#define REPRAP_DISCOUNT_SMART_CONTROLLER - // // GADGETS3D G3D LCD/SD Controller // http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel @@ -1542,28 +1585,6 @@ // //#define G3D_PANEL -// -// RepRapDiscount FULL GRAPHIC Smart Controller -// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller -// -//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - -// -// MakerLab Mini Panel with graphic -// controller and SD support - http://reprap.org/wiki/Mini_panel -// -//#define MINIPANEL - -// -// RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 -// -// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key -// is pressed, a value of 10.0 means 10mm per click. -// -//#define REPRAPWORLD_KEYPAD -//#define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 - // // RigidBot Panel V1.0 // http://www.inventapart.com/ @@ -1571,39 +1592,28 @@ //#define RIGIDBOT_PANEL // -// BQ LCD Smart Controller shipped by -// default with the BQ Hephestos 2 and Witbox 2. +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html // -//#define BQ_LCD_SMART_CONTROLLER +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 // -// Cartesio UI -// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface -// -//#define CARTESIO_UI - -// -// ANET and Tronxy Controller supported displays. +// ANET and Tronxy 20x4 Controller // //#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. // This LCD is known to be susceptible to electrical interference // which scrambles the display. Pressing any button clears it up. // This is a LCD2004 display with 5 analog buttons. -//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 - // A clone of the RepRapDiscount full graphics display but with - // different pins/wiring (see pins_ANET_10.h). +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD -// -// LCD for Melzi Card with Graphical LCD -// -//#define LCD_FOR_MELZI - -// -// LCD for Malyan M200 printers. -// This requires SDSUPPORT to be enabled -// -//#define MALYAN_LCD +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= // // CONTROLLER TYPE: I2C @@ -1650,6 +1660,83 @@ // //#define LCD_I2C_VIKI +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + // // SSD1306 OLED full graphics generic display // @@ -1670,25 +1757,11 @@ // //#define ULTI_CONTROLLER -// -// CONTROLLER TYPE: Shift register panels -// -// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH -// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD -// -//#define SAV_3DLCD - // // TinyBoy2 128x64 OLED / Encoder Panel // //#define OLED_PANEL_TINYBOY2 -// -// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller -// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html -// -//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 - // // MKS MINI12864 with graphic controller and SD support // http://reprap.org/wiki/MKS_MINI_12864 @@ -1704,6 +1777,13 @@ // //#define CR10_STOCKDISPLAY +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + // // MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER // http://reprap.org/wiki/MKS_12864OLED @@ -1713,12 +1793,46 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate // //#define SILVER_GATE_GLCD_CONTROLLER +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + //============================================================================= //=============================== Extra Features ============================== //============================================================================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0decaf8871..0f260e7a7d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -134,7 +134,7 @@ #endif // Show extra position information in M114 -//#define M114_DETAIL +#define M114_DETAIL // Show Temperature ADC value // Enable for M105 to include ADC values read from temperature sensors. @@ -206,12 +206,22 @@ // When first starting the main fan, run it at full speed for the // given number of milliseconds. This gets the fan spinning reliably // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) -//#define FAN_KICKSTART_TIME 100 +#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM -//#define FAN_MIN_PWM 50 +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +#define FAN_MIN_PWM 64 +//#define FAN_MAX_PWM 128 // @section extruder @@ -250,13 +260,13 @@ /** * M355 Case Light on-off / brightness */ -//#define CASE_LIGHT_ENABLE +#define CASE_LIGHT_ENABLE #if ENABLED(CASE_LIGHT_ENABLE) - //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define CASE_LIGHT_PIN 8 #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on - #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) - //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + #define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } @@ -325,13 +335,15 @@ // A dual x-carriage design has the advantage that the inactive extruder can be parked which // prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage // allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. -//#define DUAL_X_CARRIAGE +#define DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE) // Configuration for second X-carriage // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; // the second x-carriage always homes to the maximum endstop. - #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage - #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 0 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 442 // set maximum to the distance between toolheads when both heads are homed #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software @@ -349,14 +361,14 @@ // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) // This is the default power-up mode which can be later using M605. - #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE // Default settings in "Auto-park Mode" #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder // Default x offset in duplication mode (typically set to half print bed width) - #define DEFAULT_DUPLICATION_X_OFFSET 100 + #define DEFAULT_DUPLICATION_X_OFFSET 200 #endif // DUAL_X_CARRIAGE @@ -371,7 +383,7 @@ #define Y_HOME_BUMP_MM 5 #define Z_HOME_BUMP_MM 2 #define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) -//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially // When G28 is called, this option will make Y home before X //#define HOME_Y_BEFORE_X @@ -436,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -502,19 +522,19 @@ // @section lcd // Include a page of printer information in the LCD Main Menu -//#define LCD_INFO_MENU +#define LCD_INFO_MENU // Scroll a longer status message into view -//#define STATUS_MESSAGE_SCROLLING +#define STATUS_MESSAGE_SCROLLING // On the Info Screen, display XY with one decimal place when possible -//#define LCD_DECIMAL_SMALL_XY +#define LCD_DECIMAL_SMALL_XY // The timeout (in ms) to return to the status screen from sub-menus -//#define LCD_TIMEOUT_TO_STATUS 15000 +#define LCD_TIMEOUT_TO_STATUS 15000 // Add an 'M73' G-code to set the current percentage -//#define LCD_SET_PROGRESS_MANUALLY +#define LCD_SET_PROGRESS_MANUALLY #if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing @@ -600,9 +620,9 @@ // SD Card Sorting options #if ENABLED(SDCARD_SORT_ALPHA) - #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define SDSORT_LIMIT 20 // Maximum number of sorted items (10-256). Costs 27 bytes each. #define FOLDER_SORTING -1 // -1=above 0=none 1=below - #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_GCODE true // Allow turning sorting on/off with LCD and M34 g-code. #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. @@ -612,10 +632,10 @@ #endif // This allows hosts to request long names for files and folders with M33 - //#define LONG_FILENAME_HOST_SUPPORT + #define LONG_FILENAME_HOST_SUPPORT // Enable this option to scroll long filenames in the SD card menu - //#define SCROLL_LONG_FILENAMES + #define SCROLL_LONG_FILENAMES /** * This option allows you to abort SD printing when any endstop is triggered. @@ -634,7 +654,7 @@ /** * Auto-report SdCard status with M27 S */ - //#define AUTO_REPORT_SD_STATUS + #define AUTO_REPORT_SD_STATUS #endif // SDSUPPORT @@ -662,7 +682,7 @@ // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. - //#define USE_BIG_EDIT_FONT + #define USE_BIG_EDIT_FONT // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. @@ -718,16 +738,16 @@ * * Warning: Does not respect endstops! */ -//#define BABYSTEPPING +#define BABYSTEPPING #if ENABLED(BABYSTEPPING) //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way - #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. - //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping - //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define BABYSTEP_MULTIPLICATOR 40 // Babysteps are very small. Increase for faster motion. + #define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. // Note: Extra time may be added to mitigate controller latency. - //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor #endif // @section extruder @@ -748,9 +768,9 @@ * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. * Mention @Sebastianv650 on GitHub to alert the author of any issues. */ -//#define LIN_ADVANCE +#define LIN_ADVANCE #if ENABLED(LIN_ADVANCE) - #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + #define LIN_ADVANCE_K 0.07 // Unit: mm compression per 1mm/s extruder speed //#define LA_DEBUG // If enabled, this will generate debug information output over USB. #endif @@ -764,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. @@ -855,7 +916,7 @@ // enter the serial receive buffer, so they cannot be blocked. // Currently handles M108, M112, M410 // Does not work on boards using AT90USB (USBCON) processors! -//#define EMERGENCY_PARSER +#define EMERGENCY_PARSER // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. @@ -864,7 +925,7 @@ //#define NO_TIMEOUTS 1000 // Milliseconds // Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. -//#define ADVANCED_OK +#define ADVANCED_OK // @section extras @@ -883,7 +944,7 @@ * Note that M207 / M208 / M209 settings are saved to EEPROM. * */ -//#define FWRETRACT // ONLY PARTIALLY TESTED +#define FWRETRACT // ONLY PARTIALLY TESTED #if ENABLED(FWRETRACT) #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion @@ -904,7 +965,7 @@ * 'M106 P T2' : Use the set secondary speed * 'M106 P T1' : Restore the previous fan speed */ -//#define EXTRA_FAN_SPEED +#define EXTRA_FAN_SPEED /** * Advanced Pause @@ -916,43 +977,42 @@ * Requires NOZZLE_PARK_FEATURE. * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. */ -//#define ADVANCED_PAUSE_FEATURE +#define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. - #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. // This short retract is done immediately, before parking the nozzle. - #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 41 // (mm/s) Unload filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 50 // (mm) The length of filament for a complete unload. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. // Set to 0 for manual unloading. #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. // 0 to disable start loading and skip to fast load only - #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 30 // (mm/s) Load filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 50 // (mm) Load length of filament, from extruder gear to nozzle. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + #define ADVANCED_PAUSE_PURGE_LENGTH 20 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. // Filament Unload does a Retract, Delay, and Purge first: - #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_RETRACT_LENGTH 4 // (mm) Unload initial retract length. #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. - #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. - + #define FILAMENT_UNLOAD_PURGE_LENGTH 0 // (mm) An unretract is done, then this length is purged. #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. - #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define FILAMENT_CHANGE_ALERT_BEEPS 1 // Number of alert beeps to play when a response is needed. #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. - //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. - //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) @@ -1381,6 +1441,15 @@ //#define SPEED_POWER_MAX 100 // 0-100% #endif +#if(!ENABLED(FilamentSensor)) + #define FAN_AS_LASER +#endif +#if ENABLED(FAN_AS_LASER) + #define FAN_NUM_AS_LASER 1 + #define LASER_PIN_DEDICATED true + #else + #define FAN_NUM_AS_LASER -1 +#endif /** * Filament Width Sensor * @@ -1479,26 +1548,26 @@ /** * User-defined menu items that execute custom GCode */ -//#define CUSTOM_USER_MENUS + #define CUSTOM_USER_MENUS #if ENABLED(CUSTOM_USER_MENUS) - #define USER_SCRIPT_DONE "M117 User Script Done" + //#define USER_SCRIPT_DONE "M117 User Script Done" #define USER_SCRIPT_AUDIBLE_FEEDBACK - //#define USER_SCRIPT_RETURN // Return to status screen after a script + #define USER_SCRIPT_RETURN // Return to status screen after a script - #define USER_DESC_1 "Home & UBL Info" - #define USER_GCODE_1 "G28\nG29 W" + #define USER_DESC_1 "UBL Commission Step 1" + #define USER_GCODE_1 "M502 \n M500 \n M501 \n T0 \n M190 S75 \n M106 S128 \n M104 S225 \n G28 \n G29 P1 \n G29 S1 \n M117 Run Step 2 \n" + + #define USER_DESC_2 "UBL Commission Step 2" + #define USER_GCODE_2 "G29 S1 \n G29 S0 \n G29 F 10.0 \n G29 A \n M500 \n G28 \n G29 L1 \n T0 \n M106 S128 \n M109 S225 \n G1 X150 Y 150 \n G1 Z0 \n M117 Set Z Offset \n" - #define USER_DESC_2 "Preheat for PLA" - #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + #define USER_DESC_3 "Prep for Z Adjust" + #define USER_GCODE_3 "M190 75 \n T0 \n M106 S128 \n M104 225 \n G28 \n G29 L1 \n G1 X150 Y 150 \n G1 Z0 \n" - #define USER_DESC_3 "Preheat for ABS" - #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + #define USER_DESC_4 "Fill Mesh Points" + #define USER_GCODE_4 "G29 P3 \n G29 P3 \n G29 P3 \n G29 T \n" - #define USER_DESC_4 "Heat Bed/Home/Level" - #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" - - #define USER_DESC_5 "Home & Info" - #define USER_GCODE_5 "G28\nM503" + #define USER_DESC_5 "Run Mesh Validation" + #define USER_GCODE_5 "G26 \n" #endif /** @@ -1513,8 +1582,8 @@ * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. * The host must be configured to handle the action command. */ -//#define ACTION_ON_PAUSE "pause" -//#define ACTION_ON_RESUME "resume" +#define ACTION_ON_PAUSE "pause" +#define ACTION_ON_RESUME "resume" //=========================================================================== //====================== I2C Position Encoder Settings ====================== diff --git a/Marlin/G26_Mesh_Validation_Tool.cpp b/Marlin/G26_Mesh_Validation_Tool.cpp deleted file mode 100644 index 365cd903aa..0000000000 --- a/Marlin/G26_Mesh_Validation_Tool.cpp +++ /dev/null @@ -1,846 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Marlin Firmware -- G26 - Mesh Validation Tool - */ - -#include "MarlinConfig.h" - -#if ENABLED(G26_MESH_VALIDATION) - - #include "Marlin.h" - #include "planner.h" - #include "stepper.h" - #include "temperature.h" - #include "ultralcd.h" - #include "parser.h" - #include "serial.h" - #include "bitmap_flags.h" - - #if ENABLED(MESH_BED_LEVELING) - #include "mesh_bed_leveling.h" - #elif ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" - #endif - - #define EXTRUSION_MULTIPLIER 1.0 - #define RETRACTION_MULTIPLIER 1.0 - #define PRIME_LENGTH 10.0 - #define OOZE_AMOUNT 0.3 - - #define INTERSECTION_CIRCLE_RADIUS 5 - #define CROSSHAIRS_SIZE 3 - - #if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS - #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." - #endif - - #define G26_OK false - #define G26_ERR true - - /** - * G26 Mesh Validation Tool - * - * G26 is a Mesh Validation Tool intended to provide support for the Marlin Unified Bed Leveling System. - * In order to fully utilize and benefit from the Marlin Unified Bed Leveling System an accurate Mesh must - * be defined. G29 is designed to allow the user to quickly validate the correctness of her Mesh. It will - * first heat the bed and nozzle. It will then print lines and circles along the Mesh Cell boundaries and - * the intersections of those lines (respectively). - * - * This action allows the user to immediately see where the Mesh is properly defined and where it needs to - * be edited. The command will generate the Mesh lines closest to the nozzle's starting position. Alternatively - * the user can specify the X and Y position of interest with command parameters. This allows the user to - * focus on a particular area of the Mesh where attention is needed. - * - * B # Bed Set the Bed Temperature. If not specified, a default of 60 C. will be assumed. - * - * C Current When searching for Mesh Intersection points to draw, use the current nozzle location - * as the base for any distance comparison. - * - * D Disable Disable the Unified Bed Leveling System. In the normal case the user is invoking this - * command to see how well a Mesh as been adjusted to match a print surface. In order to do - * this the Unified Bed Leveling System is turned on by the G26 command. The D parameter - * alters the command's normal behaviour and disables the Unified Bed Leveling System even if - * it is on. - * - * H # Hotend Set the Nozzle Temperature. If not specified, a default of 205 C. will be assumed. - * - * F # Filament Used to specify the diameter of the filament being used. If not specified - * 1.75mm filament is assumed. If you are not getting acceptable results by using the - * 'correct' numbers, you can scale this number up or down a little bit to change the amount - * of filament that is being extruded during the printing of the various lines on the bed. - * - * K Keep-On Keep the heaters turned on at the end of the command. - * - * L # Layer Layer height. (Height of nozzle above bed) If not specified .20mm will be used. - * - * O # Ooooze How much your nozzle will Ooooze filament while getting in position to print. This - * is over kill, but using this parameter will let you get the very first 'circle' perfect - * so you have a trophy to peel off of the bed and hang up to show how perfectly you have your - * Mesh calibrated. If not specified, a filament length of .3mm is assumed. - * - * P # Prime Prime the nozzle with specified length of filament. If this parameter is not - * given, no prime action will take place. If the parameter specifies an amount, that much - * will be purged before continuing. If no amount is specified the command will start - * purging filament until the user provides an LCD Click and then it will continue with - * printing the Mesh. You can carefully remove the spent filament with a needle nose - * pliers while holding the LCD Click wheel in a depressed state. If you do not have - * an LCD, you must specify a value if you use P. - * - * Q # Multiplier Retraction Multiplier. Normally not needed. Retraction defaults to 1.0mm and - * un-retraction is at 1.2mm These numbers will be scaled by the specified amount - * - * R # Repeat Prints the number of patterns given as a parameter, starting at the current location. - * If a parameter isn't given, every point will be printed unless G26 is interrupted. - * This works the same way that the UBL G29 P4 R parameter works. - * - * NOTE: If you do not have an LCD, you -must- specify R. This is to ensure that you are - * aware that there's some risk associated with printing without the ability to abort in - * cases where mesh point Z value may be inaccurate. As above, if you do not include a - * parameter, every point will be printed. - * - * S # Nozzle Used to control the size of nozzle diameter. If not specified, a .4mm nozzle is assumed. - * - * U # Random Randomize the order that the circles are drawn on the bed. The search for the closest - * undrawn cicle is still done. But the distance to the location for each circle has a - * random number of the size specified added to it. Specifying S50 will give an interesting - * deviation from the normal behaviour on a 10 x 10 Mesh. - * - * X # X Coord. Specify the starting location of the drawing activity. - * - * Y # Y Coord. Specify the starting location of the drawing activity. - */ - - // External references - - extern Planner planner; - #if ENABLED(ULTRA_LCD) - extern char lcd_status_message[]; - #endif - - // Private functions - - static uint16_t circle_flags[16], horizontal_mesh_line_flags[16], vertical_mesh_line_flags[16]; - float g26_e_axis_feedrate = 0.025, - random_deviation = 0.0; - - static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched - // retracts/recovers won't result in a bad state. - - static float g26_extrusion_multiplier, - g26_retraction_multiplier, - g26_layer_height, - g26_prime_length, - g26_x_pos, g26_y_pos; - - static int16_t g26_bed_temp, - g26_hotend_temp; - - static int8_t g26_prime_flag; - - #if ENABLED(NEWPANEL) - - /** - * If the LCD is clicked, cancel, wait for release, return true - */ - bool user_canceled() { - if (!is_lcd_clicked()) return false; // Return if the button isn't pressed - lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99); - #if ENABLED(ULTIPANEL) - lcd_quick_feedback(true); - #endif - wait_for_release(); - return true; - } - - bool exit_from_g26() { - lcd_setstatusPGM(PSTR("Leaving G26"), -1); - wait_for_release(); - return G26_ERR; - } - - #endif - - void G26_line_to_destination(const float &feed_rate) { - const float save_feedrate = feedrate_mm_s; - feedrate_mm_s = feed_rate; // use specified feed rate - prepare_move_to_destination(); // will ultimately call ubl.line_to_destination_cartesian or ubl.prepare_linear_move_to for UBL_SEGMENTED - feedrate_mm_s = save_feedrate; // restore global feed rate - } - - void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { - float feed_value; - static float last_z = -999.99; - - bool has_xy_component = (rx != current_position[X_AXIS] || ry != current_position[Y_AXIS]); // Check if X or Y is involved in the movement. - - if (z != last_z) { - last_z = z; - feed_value = planner.max_feedrate_mm_s[Z_AXIS]/(3.0); // Base the feed rate off of the configured Z_AXIS feed rate - - destination[X_AXIS] = current_position[X_AXIS]; - destination[Y_AXIS] = current_position[Y_AXIS]; - destination[Z_AXIS] = z; // We know the last_z==z or we wouldn't be in this block of code. - destination[E_AXIS] = current_position[E_AXIS]; - - G26_line_to_destination(feed_value); - set_destination_from_current(); - } - - // Check if X or Y is involved in the movement. - // Yes: a 'normal' movement. No: a retract() or recover() - feed_value = has_xy_component ? PLANNER_XY_FEEDRATE() / 10.0 : planner.max_feedrate_mm_s[E_AXIS] / 1.5; - - if (g26_debug_flag) SERIAL_ECHOLNPAIR("in move_to() feed_value for XY:", feed_value); - - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; - destination[E_AXIS] += e_delta; - - G26_line_to_destination(feed_value); - set_destination_from_current(); - } - - FORCE_INLINE void move_to(const float where[XYZE], const float &de) { move_to(where[X_AXIS], where[Y_AXIS], where[Z_AXIS], de); } - - void retract_filament(const float where[XYZE]) { - if (!g26_retracted) { // Only retract if we are not already retracted! - g26_retracted = true; - move_to(where, -1.0 * g26_retraction_multiplier); - } - } - - void recover_filament(const float where[XYZE]) { - if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2 * g26_retraction_multiplier); - g26_retracted = false; - } - } - - /** - * Prime the nozzle if needed. Return true on error. - */ - inline bool prime_nozzle() { - - #if ENABLED(NEWPANEL) - float Total_Prime = 0.0; - - if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged - - lcd_external_control = true; - lcd_setstatusPGM(PSTR("User-Controlled Prime"), 99); - lcd_chirp(); - - set_destination_from_current(); - - recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). - - while (!is_lcd_clicked()) { - lcd_chirp(); - destination[E_AXIS] += 0.25; - #ifdef PREVENT_LENGTHY_EXTRUDE - Total_Prime += 0.25; - if (Total_Prime >= EXTRUDE_MAXLENGTH) return G26_ERR; - #endif - G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); - set_destination_from_current(); - stepper.synchronize(); // Without this synchronize, the purge is more consistent, - // but because the planner has a buffer, we won't be able - // to stop as quickly. So we put up with the less smooth - // action to give the user a more responsive 'Stop'. - - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } - - wait_for_release(); - - strcpy_P(lcd_status_message, PSTR("Done Priming")); // Hack to get the message up. May be obsolete. - - lcd_setstatusPGM(PSTR("Done Priming"), 99); - lcd_quick_feedback(true); - lcd_external_control = false; - } - else - #endif - { - #if ENABLED(ULTRA_LCD) - lcd_setstatusPGM(PSTR("Fixed Length Prime."), 99); - lcd_quick_feedback(true); - #endif - set_destination_from_current(); - destination[E_AXIS] += g26_prime_length; - G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); - set_destination_from_current(); - retract_filament(destination); - } - - return G26_OK; - } - - mesh_index_pair find_closest_circle_to_print(const float &X, const float &Y) { - float closest = 99999.99; - mesh_index_pair return_val; - - return_val.x_index = return_val.y_index = -1; - - for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { - for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - if (!is_bitmap_set(circle_flags, i, j)) { - const float mx = _GET_MESH_X(i), // We found a circle that needs to be printed - my = _GET_MESH_Y(j); - - // Get the distance to this intersection - float f = HYPOT(X - mx, Y - my); - - // It is possible that we are being called with the values - // to let us find the closest circle to the start position. - // But if this is not the case, add a small weighting to the - // distance calculation to help it choose a better place to continue. - f += HYPOT(g26_x_pos - mx, g26_y_pos - my) / 15.0; - - // Add in the specified amount of Random Noise to our search - if (random_deviation > 1.0) - f += random(0.0, random_deviation); - - if (f < closest) { - closest = f; // We found a closer location that is still - return_val.x_index = i; // un-printed --- save the data for it - return_val.y_index = j; - return_val.distance = closest; - } - } - } - } - bitmap_set(circle_flags, return_val.x_index, return_val.y_index); // Mark this location as done. - return return_val; - } - - /** - * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one - * to the other. But there are really three sets of coordinates involved. The first coordinate - * is the present location of the nozzle. We don't necessarily want to print from this location. - * We first need to move the nozzle to the start of line segment where we want to print. Once - * there, we can use the two coordinates supplied to draw the line. - * - * Note: Although we assume the first set of coordinates is the start of the line and the second - * set of coordinates is the end of the line, it does not always work out that way. This function - * optimizes the movement to minimize the travel distance before it can start printing. This saves - * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does - * cause a lot of very little short retracement of th nozzle when it draws the very first line - * segment of a 'circle'. The time this requires is very short and is easily saved by the other - * cases where the optimization comes into play. - */ - void print_line_from_here_to_there(const float &sx, const float &sy, const float &sz, const float &ex, const float &ey, const float &ez) { - const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual line segment - dy_s = current_position[Y_AXIS] - sy, - dist_start = HYPOT2(dx_s, dy_s), // We don't need to do a sqrt(), we can compare the distance^2 - // to save computation time - dx_e = current_position[X_AXIS] - ex, // find our distance from the end of the actual line segment - dy_e = current_position[Y_AXIS] - ey, - dist_end = HYPOT2(dx_e, dy_e), - - line_length = HYPOT(ex - sx, ey - sy); - - // If the end point of the line is closer to the nozzle, flip the direction, - // moving from the end to the start. On very small lines the optimization isn't worth it. - if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < FABS(line_length)) - return print_line_from_here_to_there(ex, ey, ez, sx, sy, sz); - - // Decide whether to retract & bump - - if (dist_start > 2.0) { - retract_filament(destination); - //todo: parameterize the bump height with a define - move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping - move_to(sx, sy, sz + 0.500, 0.0); // Get to the starting point with no extrusion while bumped - } - - move_to(sx, sy, sz, 0.0); // Get to the starting point with no extrusion / un-Z bump - - const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; - - recover_filament(destination); - move_to(ex, ey, ez, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion - } - - inline bool look_for_lines_to_connect() { - float sx, sy, ex, ey; - - for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { - for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - - #if ENABLED(NEWPANEL) - if (user_canceled()) return true; // Check if the user wants to stop the Mesh Validation - #endif - - if (i < GRID_MAX_POINTS_X) { // We can't connect to anything to the right than GRID_MAX_POINTS_X. - // This is already a half circle because we are at the edge of the bed. - - if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i + 1, j)) { // check if we can do a line to the left - if (!is_bitmap_set(horizontal_mesh_line_flags, i, j)) { - - // - // We found two circles that need a horizontal line to connect them - // Print it! - // - sx = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge - ex = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - - sx = constrain(sx, X_MIN_POS + 1, X_MAX_POS - 1); - sy = ey = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - ex = constrain(ex, X_MIN_POS + 1, X_MAX_POS - 1); - - if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { - - if (g26_debug_flag) { - SERIAL_ECHOPAIR(" Connecting with horizontal line (sx=", sx); - SERIAL_ECHOPAIR(", sy=", sy); - SERIAL_ECHOPAIR(") -> (ex=", ex); - SERIAL_ECHOPAIR(", ey=", ey); - SERIAL_CHAR(')'); - SERIAL_EOL(); - //debug_current_and_destination(PSTR("Connecting horizontal line.")); - } - print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); - } - bitmap_set(horizontal_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if we skipped it - } - } - - if (j < GRID_MAX_POINTS_Y) { // We can't connect to anything further back than GRID_MAX_POINTS_Y. - // This is already a half circle because we are at the edge of the bed. - - if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i, j + 1)) { // check if we can do a line straight down - if (!is_bitmap_set( vertical_mesh_line_flags, i, j)) { - // - // We found two circles that need a vertical line to connect them - // Print it! - // - sy = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge - ey = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - - sx = ex = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - sy = constrain(sy, Y_MIN_POS + 1, Y_MAX_POS - 1); - ey = constrain(ey, Y_MIN_POS + 1, Y_MAX_POS - 1); - - if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { - - if (g26_debug_flag) { - SERIAL_ECHOPAIR(" Connecting with vertical line (sx=", sx); - SERIAL_ECHOPAIR(", sy=", sy); - SERIAL_ECHOPAIR(") -> (ex=", ex); - SERIAL_ECHOPAIR(", ey=", ey); - SERIAL_CHAR(')'); - SERIAL_EOL(); - - #if ENABLED(AUTO_BED_LEVELING_UBL) - debug_current_and_destination(PSTR("Connecting vertical line.")); - #endif - } - print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); - } - bitmap_set(vertical_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if skipped - } - } - } - } - } - } - return false; - } - - /** - * Turn on the bed and nozzle heat and - * wait for them to get up to temperature. - */ - inline bool turn_on_heaters() { - millis_t next = millis() + 5000UL; - #if HAS_HEATED_BED - #if ENABLED(ULTRA_LCD) - if (g26_bed_temp > 25) { - lcd_setstatusPGM(PSTR("G26 Heating Bed."), 99); - lcd_quick_feedback(true); - #if ENABLED(NEWPANEL) - lcd_external_control = true; - #endif - #endif - thermalManager.setTargetBed(g26_bed_temp); - while (abs(thermalManager.degBed() - g26_bed_temp) > 3) { - - #if ENABLED(NEWPANEL) - if (is_lcd_clicked()) return exit_from_g26(); - #endif - - if (ELAPSED(millis(), next)) { - next = millis() + 5000UL; - thermalManager.print_heaterstates(); - SERIAL_EOL(); - } - idle(); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } - #if ENABLED(ULTRA_LCD) - } - lcd_setstatusPGM(PSTR("G26 Heating Nozzle."), 99); - lcd_quick_feedback(true); - #endif - #endif - - // Start heating the nozzle and wait for it to reach temperature. - thermalManager.setTargetHotend(g26_hotend_temp, 0); - while (abs(thermalManager.degHotend(0) - g26_hotend_temp) > 3) { - - #if ENABLED(NEWPANEL) - if (is_lcd_clicked()) return exit_from_g26(); - #endif - - if (ELAPSED(millis(), next)) { - next = millis() + 5000UL; - thermalManager.print_heaterstates(); - SERIAL_EOL(); - } - idle(); - - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } - #if ENABLED(ULTRA_LCD) - lcd_reset_status(); - lcd_quick_feedback(true); - #endif - - return G26_OK; - } - - float valid_trig_angle(float d) { - while (d > 360.0) d -= 360.0; - while (d < 0.0) d += 360.0; - return d; - } - - /** - * G26: Mesh Validation Pattern generation. - * - * Used to interactively edit the mesh by placing the - * nozzle in a problem area and doing a G29 P4 R command. - * - * Parameters: - * - * B Bed Temperature - * C Continue from the Closest mesh point - * D Disable leveling before starting - * F Filament diameter - * H Hotend Temperature - * K Keep heaters on when completed - * L Layer Height - * O Ooze extrusion length - * P Prime length - * Q Retraction multiplier - * R Repetitions (number of grid points) - * S Nozzle Size (diameter) in mm - * U Random deviation (50 if no value given) - * X X position - * Y Y position - */ - void gcode_G26() { - SERIAL_ECHOLNPGM("G26 command started. Waiting for heater(s)."); - - // Don't allow Mesh Validation without homing first, - // or if the parameter parsing did not go OK, abort - if (axis_unhomed_error()) return; - - g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; - g26_retraction_multiplier = RETRACTION_MULTIPLIER; - g26_layer_height = MESH_TEST_LAYER_HEIGHT; - g26_prime_length = PRIME_LENGTH; - g26_bed_temp = MESH_TEST_BED_TEMP; - g26_hotend_temp = MESH_TEST_HOTEND_TEMP; - g26_prime_flag = 0; - - float g26_nozzle = MESH_TEST_NOZZLE_SIZE, - g26_filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, - g26_ooze_amount = parser.linearval('O', OOZE_AMOUNT); - - bool g26_continue_with_closest = parser.boolval('C'), - g26_keep_heaters_on = parser.boolval('K'); - - if (parser.seenval('B')) { - g26_bed_temp = parser.value_celsius(); - if (g26_bed_temp && !WITHIN(g26_bed_temp, 40, 140)) { - SERIAL_PROTOCOLLNPGM("?Specified bed temperature not plausible (40-140C)."); - return; - } - } - - if (parser.seenval('L')) { - g26_layer_height = parser.value_linear_units(); - if (!WITHIN(g26_layer_height, 0.0, 2.0)) { - SERIAL_PROTOCOLLNPGM("?Specified layer height not plausible."); - return; - } - } - - if (parser.seen('Q')) { - if (parser.has_value()) { - g26_retraction_multiplier = parser.value_float(); - if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { - SERIAL_PROTOCOLLNPGM("?Specified Retraction Multiplier not plausible."); - return; - } - } - else { - SERIAL_PROTOCOLLNPGM("?Retraction Multiplier must be specified."); - return; - } - } - - if (parser.seenval('S')) { - g26_nozzle = parser.value_float(); - if (!WITHIN(g26_nozzle, 0.1, 1.0)) { - SERIAL_PROTOCOLLNPGM("?Specified nozzle size not plausible."); - return; - } - } - - if (parser.seen('P')) { - if (!parser.has_value()) { - #if ENABLED(NEWPANEL) - g26_prime_flag = -1; - #else - SERIAL_PROTOCOLLNPGM("?Prime length must be specified when not using an LCD."); - return; - #endif - } - else { - g26_prime_flag++; - g26_prime_length = parser.value_linear_units(); - if (!WITHIN(g26_prime_length, 0.0, 25.0)) { - SERIAL_PROTOCOLLNPGM("?Specified prime length not plausible."); - return; - } - } - } - - if (parser.seenval('F')) { - g26_filament_diameter = parser.value_linear_units(); - if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { - SERIAL_PROTOCOLLNPGM("?Specified filament size not plausible."); - return; - } - } - g26_extrusion_multiplier *= sq(1.75) / sq(g26_filament_diameter); // If we aren't using 1.75mm filament, we need to - // scale up or down the length needed to get the - // same volume of filament - - g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size - - if (parser.seenval('H')) { - g26_hotend_temp = parser.value_celsius(); - if (!WITHIN(g26_hotend_temp, 165, 280)) { - SERIAL_PROTOCOLLNPGM("?Specified nozzle temperature not plausible."); - return; - } - } - - if (parser.seen('U')) { - randomSeed(millis()); - // This setting will persist for the next G26 - random_deviation = parser.has_value() ? parser.value_float() : 50.0; - } - - int16_t g26_repeats; - #if ENABLED(NEWPANEL) - g26_repeats = parser.intval('R', GRID_MAX_POINTS + 1); - #else - if (!parser.seen('R')) { - SERIAL_PROTOCOLLNPGM("?(R)epeat must be specified when not using an LCD."); - return; - } - else - g26_repeats = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS + 1; - #endif - if (g26_repeats < 1) { - SERIAL_PROTOCOLLNPGM("?(R)epeat value not plausible; must be at least 1."); - return; - } - - g26_x_pos = parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position[X_AXIS]; - g26_y_pos = parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position[Y_AXIS]; - if (!position_is_reachable(g26_x_pos, g26_y_pos)) { - SERIAL_PROTOCOLLNPGM("?Specified X,Y coordinate out of bounds."); - return; - } - - /** - * Wait until all parameters are verified before altering the state! - */ - set_bed_leveling_enabled(!parser.seen('D')); - - if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) { - do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); - set_current_from_destination(); - } - - if (turn_on_heaters() != G26_OK) goto LEAVE; - - current_position[E_AXIS] = 0.0; - sync_plan_position_e(); - - if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; - - /** - * Bed is preheated - * - * Nozzle is at temperature - * - * Filament is primed! - * - * It's "Show Time" !!! - */ - - ZERO(circle_flags); - ZERO(horizontal_mesh_line_flags); - ZERO(vertical_mesh_line_flags); - - // Move nozzle to the specified height for the first layer - set_destination_from_current(); - destination[Z_AXIS] = g26_layer_height; - move_to(destination, 0.0); - move_to(destination, g26_ooze_amount); - - #if ENABLED(NEWPANEL) - lcd_external_control = true; - #endif - - //debug_current_and_destination(PSTR("Starting G26 Mesh Validation Pattern.")); - - /** - * Pre-generate radius offset values at 30 degree intervals to reduce CPU load. - */ - #define A_INT 30 - #define _ANGS (360 / A_INT) - #define A_CNT (_ANGS / 2) - #define _IND(A) ((A + _ANGS * 8) % _ANGS) - #define _COS(A) (trig_table[_IND(A) % A_CNT] * (_IND(A) >= A_CNT ? -1 : 1)) - #define _SIN(A) (-_COS((A + A_CNT / 2) % _ANGS)) - #if A_CNT & 1 - #error "A_CNT must be a positive value. Please change A_INT." - #endif - float trig_table[A_CNT]; - for (uint8_t i = 0; i < A_CNT; i++) - trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); - - mesh_index_pair location; - do { - location = g26_continue_with_closest - ? find_closest_circle_to_print(current_position[X_AXIS], current_position[Y_AXIS]) - : find_closest_circle_to_print(g26_x_pos, g26_y_pos); // Find the closest Mesh Intersection to where we are now. - - if (location.x_index >= 0 && location.y_index >= 0) { - const float circle_x = _GET_MESH_X(location.x_index), - circle_y = _GET_MESH_Y(location.y_index); - - // If this mesh location is outside the printable_radius, skip it. - if (!position_is_reachable(circle_x, circle_y)) continue; - - // Determine where to start and end the circle, - // which is always drawn counter-clockwise. - const uint8_t xi = location.x_index, yi = location.y_index; - const bool f = yi == 0, r = xi >= GRID_MAX_POINTS_X - 1, b = yi >= GRID_MAX_POINTS_Y - 1; - int8_t start_ind = -2, end_ind = 9; // Assume a full circle (from 5:00 to 5:00) - if (xi == 0) { // Left edge? Just right half. - start_ind = f ? 0 : -3; // 03:00 to 12:00 for front-left - end_ind = b ? 0 : 2; // 06:00 to 03:00 for back-left - } - else if (r) { // Right edge? Just left half. - start_ind = b ? 6 : 3; // 12:00 to 09:00 for front-right - end_ind = f ? 5 : 8; // 09:00 to 06:00 for back-right - } - else if (f) { // Front edge? Just back half. - start_ind = 0; // 03:00 - end_ind = 5; // 09:00 - } - else if (b) { // Back edge? Just front half. - start_ind = 6; // 09:00 - end_ind = 11; // 03:00 - } - - for (int8_t ind = start_ind; ind <= end_ind; ind++) { - - #if ENABLED(NEWPANEL) - if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation - #endif - - float rx = circle_x + _COS(ind), // For speed, these are now a lookup table entry - ry = circle_y + _SIN(ind), - xe = circle_x + _COS(ind + 1), - ye = circle_y + _SIN(ind + 1); - - #if IS_KINEMATIC - // Check to make sure this segment is entirely on the bed, skip if not. - if (!position_is_reachable(rx, ry) || !position_is_reachable(xe, ye)) continue; - #else // not, we need to skip - rx = constrain(rx, X_MIN_POS + 1, X_MAX_POS - 1); // This keeps us from bumping the endstops - ry = constrain(ry, Y_MIN_POS + 1, Y_MAX_POS - 1); - xe = constrain(xe, X_MIN_POS + 1, X_MAX_POS - 1); - ye = constrain(ye, Y_MIN_POS + 1, Y_MAX_POS - 1); - #endif - - print_line_from_here_to_there(rx, ry, g26_layer_height, xe, ye, g26_layer_height); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } - if (look_for_lines_to_connect()) - goto LEAVE; - } - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (--g26_repeats && location.x_index >= 0 && location.y_index >= 0); - - LEAVE: - lcd_setstatusPGM(PSTR("Leaving G26"), -1); - - retract_filament(destination); - destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; - - //debug_current_and_destination(PSTR("ready to do Z-Raise.")); - move_to(destination, 0); // Raise the nozzle - //debug_current_and_destination(PSTR("done doing Z-Raise.")); - - destination[X_AXIS] = g26_x_pos; // Move back to the starting position - destination[Y_AXIS] = g26_y_pos; - //destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is - - move_to(destination, 0); // Move back to the starting position - //debug_current_and_destination(PSTR("done doing X/Y move.")); - - #if ENABLED(NEWPANEL) - lcd_external_control = false; // Give back control of the LCD Panel! - #endif - - if (!g26_keep_heaters_on) { - #if HAS_HEATED_BED - thermalManager.setTargetBed(0); - #endif - thermalManager.setTargetHotend(0, 0); - } - } - -#endif // G26_MESH_VALIDATION diff --git a/Marlin/I2CPositionEncoder.cpp b/Marlin/I2CPositionEncoder.cpp deleted file mode 100644 index 433c917b4f..0000000000 --- a/Marlin/I2CPositionEncoder.cpp +++ /dev/null @@ -1,1140 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -//todo: add support for multiple encoders on a single axis -//todo: add z axis auto-leveling -//todo: consolidate some of the related M codes? -//todo: add endstop-replacement mode? -//todo: try faster I2C speed; tweak TWI_FREQ (400000L, or faster?); or just TWBR = ((CPU_FREQ / 400000L) - 16) / 2; -//todo: consider Marlin-optimized Wire library; i.e. MarlinWire, like MarlinSerial - - -#include "MarlinConfig.h" - -#if ENABLED(I2C_POSITION_ENCODERS) - - #include "Marlin.h" - #include "temperature.h" - #include "stepper.h" - #include "I2CPositionEncoder.h" - #include "parser.h" - - #include - - - void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { - encoderAxis = axis; - i2cAddress = address; - - initialised++; - - SERIAL_ECHOPAIR("Setting up encoder on ", axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" axis, addr = ", address); - - position = get_position(); - } - - void I2CPositionEncoder::update() { - if (!initialised || !homed || !active) return; //check encoder is set up and active - - position = get_position(); - - //we don't want to stop things just because the encoder missed a message, - //so we only care about responses that indicate bad magnetic strength - - if (!passes_test(false)) { //check encoder data is good - lastErrorTime = millis(); - /* - if (trusted) { //commented out as part of the note below - trusted = false; - SERIAL_ECHOPGM("Fault detected on "); - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPGM(" axis encoder. Disengaging error correction until module is trusted again."); - } - */ - return; - } - - if (!trusted) { - /** - * This is commented out because it introduces error and can cause bad print quality. - * - * This code is intended to manage situations where the encoder has reported bad magnetic strength. - * This indicates that the magnetic strip was too far away from the sensor to reliably track position. - * When this happens, this code resets the offset based on where the printer thinks it is. This has been - * shown to introduce errors in actual position which result in drifting prints and poor print quality. - * Perhaps a better method would be to disable correction on the axis with a problem, report it to the - * user via the status leds on the encoder module and prompt the user to re-home the axis at which point - * the encoder would be re-enabled. - */ - - /* - // If the magnetic strength has been good for a certain time, start trusting the module again - - if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { - trusted = true; - - SERIAL_ECHOPGM("Untrusted encoder module on "); - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPGM(" axis has been fault-free for set duration, reinstating error correction."); - - //the encoder likely lost its place when the error occured, so we'll reset and use the printer's - //idea of where it the axis is to re-initialise - float position = stepper.get_axis_position_mm(encoderAxis); - int32_t positionInTicks = position * get_ticks_unit(); - - //shift position from previous to current position - zeroOffset -= (positionInTicks - get_position()); - - #ifdef I2CPE_DEBUG - SERIAL_ECHOPGM("Current position is "); - SERIAL_ECHOLN(position); - - SERIAL_ECHOPGM("Position in encoder ticks is "); - SERIAL_ECHOLN(positionInTicks); - - SERIAL_ECHOPGM("New zero-offset of "); - SERIAL_ECHOLN(zeroOffset); - - SERIAL_ECHOPGM("New position reads as "); - SERIAL_ECHO(get_position()); - SERIAL_CHAR('('); - SERIAL_ECHO(mm_from_count(get_position())); - SERIAL_ECHOLNPGM(")"); - #endif - } - */ - return; - } - - lastPosition = position; - const millis_t positionTime = millis(); - - //only do error correction if setup and enabled - if (ec && ecMethod != I2CPE_ECM_NONE) { - - #ifdef I2CPE_EC_THRESH_PROPORTIONAL - const millis_t deltaTime = positionTime - lastPositionTime; - const uint32_t distance = abs(position - lastPosition), - speed = distance / deltaTime; - const float threshold = constrain((speed / 50), 1, 50) * ecThreshold; - #else - const float threshold = get_error_correct_threshold(); - #endif - - //check error - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - float sum = 0, diffSum = 0; - - errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; - err[errIdx] = get_axis_error_steps(false); - - LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { - sum += err[i]; - if (i) diffSum += abs(err[i-1] - err[i]); - } - - const int32_t error = int32_t(sum / (I2CPE_ERR_ARRAY_SIZE + 1)); //calculate average for error - - #else - const int32_t error = get_axis_error_steps(false); - #endif - - //SERIAL_ECHOPGM("Axis error steps: "); - //SERIAL_ECHOLN(error); - - #ifdef I2CPE_ERR_THRESH_ABORT - if (labs(error) > I2CPE_ERR_THRESH_ABORT * planner.axis_steps_per_mm[encoderAxis]) { - //kill("Significant Error"); - SERIAL_ECHOPGM("Axis error greater than set threshold, aborting!"); - SERIAL_ECHOLN(error); - safe_delay(5000); - } - #endif - - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - if (errIdx == 0) { - // In order to correct for "error" but avoid correcting for noise and non-skips - // it must be > threshold and have a difference average of < 10 and be < 2000 steps - if (labs(error) > threshold * planner.axis_steps_per_mm[encoderAxis] && - diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) && labs(error) < 2000) { // Check for persistent error (skip) - errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy - if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { - float sumP = 0; - LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; - const int32_t errorP = int32_t(sumP * (1.0 / (I2CPE_ERR_PRST_ARRAY_SIZE))); - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOPAIR(" - err detected: ", errorP * planner.steps_to_mm[encoderAxis]); - SERIAL_ECHOLNPGM("mm; correcting!"); - thermalManager.babystepsTodo[encoderAxis] = -LROUND(errorP); - errPrstIdx = 0; - } - } - else - errPrstIdx = 0; - } - #else - if (labs(error) > threshold * planner.axis_steps_per_mm[encoderAxis]) { - //SERIAL_ECHOLN(error); - //SERIAL_ECHOLN(position); - thermalManager.babystepsTodo[encoderAxis] = -LROUND(error / 2); - } - #endif - - if (labs(error) > I2CPE_ERR_CNT_THRESH * planner.axis_steps_per_mm[encoderAxis]) { - const millis_t ms = millis(); - if (ELAPSED(ms, nextErrorCountTime)) { - SERIAL_ECHOPAIR("Large error on ", axis_codes[encoderAxis]); - SERIAL_ECHOPAIR(" axis. error: ", (int)error); - SERIAL_ECHOLNPAIR("; diffSum: ", diffSum); - errorCount++; - nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; - } - } - } - - lastPositionTime = positionTime; - } - - void I2CPositionEncoder::set_homed() { - if (active) { - reset(); // Reset module's offset to zero (so current position is homed / zero) - delay(10); - - zeroOffset = get_raw_count(); - homed++; - trusted++; - - #ifdef I2CPE_DEBUG - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOPAIR(" axis encoder homed, offset of ", zeroOffset); - SERIAL_ECHOLNPGM(" ticks."); - #endif - } - } - - bool I2CPositionEncoder::passes_test(const bool report) { - if (report) { - if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOPGM(" axis "); - serialprintPGM(H == I2CPE_MAG_SIG_BAD ? PSTR("magnetic strip ") : PSTR("encoder ")); - switch (H) { - case I2CPE_MAG_SIG_GOOD: - case I2CPE_MAG_SIG_MID: - SERIAL_ECHOLNPGM("passes test; field strength "); - serialprintPGM(H == I2CPE_MAG_SIG_GOOD ? PSTR("good.\n") : PSTR("fair.\n")); - break; - default: - SERIAL_ECHOLNPGM("not detected!"); - } - } - return (H == I2CPE_MAG_SIG_GOOD || H == I2CPE_MAG_SIG_MID); - } - - float I2CPositionEncoder::get_axis_error_mm(const bool report) { - float target, actual, error; - - target = stepper.get_axis_position_mm(encoderAxis); - actual = mm_from_count(position); - error = actual - target; - - if (labs(error) > 10000) error = 0; // ? - - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOPAIR(" axis target: ", target); - SERIAL_ECHOPAIR(", actual: ", actual); - SERIAL_ECHOLNPAIR(", error : ",error); - } - - return error; - } - - int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { - if (!active) { - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPGM(" axis encoder not active!"); - } - return 0; - } - - float stepperTicksPerUnit; - int32_t encoderTicks = position, encoderCountInStepperTicksScaled; - //int32_t stepperTicks = stepper.position(encoderAxis); - - // With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm - stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.axis_steps_per_mm[encoderAxis]; - - //convert both 'ticks' into same units / base - encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit); - - int32_t target = stepper.position(encoderAxis), - error = (encoderCountInStepperTicksScaled - target); - - //suppress discontinuities (might be caused by bad I2C readings...?) - bool suppressOutput = (labs(error - errorPrev) > 100); - - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOPAIR(" axis target: ", target); - SERIAL_ECHOPAIR(", actual: ", encoderCountInStepperTicksScaled); - SERIAL_ECHOLNPAIR(", error : ", error); - - if (suppressOutput) SERIAL_ECHOLNPGM("Discontinuity detected, suppressing error."); - } - - errorPrev = error; - - return (suppressOutput ? 0 : error); - } - - int32_t I2CPositionEncoder::get_raw_count() { - uint8_t index = 0; - i2cLong encoderCount; - - encoderCount.val = 0x00; - - if (Wire.requestFrom((int)i2cAddress, 3) != 3) { - //houston, we have a problem... - H = I2CPE_MAG_SIG_NF; - return 0; - } - - while (Wire.available()) - encoderCount.bval[index++] = (uint8_t)Wire.read(); - - //extract the magnetic strength - H = (B00000011 & (encoderCount.bval[2] >> 6)); - - //extract sign bit; sign = (encoderCount.bval[2] & B00100000); - //set all upper bits to the sign value to overwrite H - encoderCount.val = (encoderCount.bval[2] & B00100000) ? (encoderCount.val | 0xFFC00000) : (encoderCount.val & 0x003FFFFF); - - if (invert) encoderCount.val *= -1; - - return encoderCount.val; - } - - bool I2CPositionEncoder::test_axis() { - //only works on XYZ cartesian machines for the time being - if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; - - float startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; - - const float startPosition = soft_endstop_min[encoderAxis] + 10, - endPosition = soft_endstop_max[encoderAxis] - 10, - feedrate = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); - - ec = false; - - LOOP_NA(i) { - startCoord[i] = stepper.get_axis_position_mm((AxisEnum)i); - endCoord[i] = stepper.get_axis_position_mm((AxisEnum)i); - } - - startCoord[encoderAxis] = startPosition; - endCoord[encoderAxis] = endPosition; - - stepper.synchronize(); - - planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], - stepper.get_axis_position_mm(E_AXIS), feedrate, 0); - stepper.synchronize(); - - // if the module isn't currently trusted, wait until it is (or until it should be if things are working) - if (!trusted) { - int32_t startWaitingTime = millis(); - while (!trusted && millis() - startWaitingTime < I2CPE_TIME_TRUSTED) - safe_delay(500); - } - - if (trusted) { // if trusted, commence test - planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], - stepper.get_axis_position_mm(E_AXIS), feedrate, 0); - stepper.synchronize(); - } - - return trusted; - } - - void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { - if (type != I2CPE_ENC_TYPE_LINEAR) { - SERIAL_ECHOLNPGM("Steps per mm calibration is only available using linear encoders."); - return; - } - - if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) { - SERIAL_ECHOLNPGM("Automatic steps / mm calibration not supported for this axis."); - return; - } - - float old_steps_mm, new_steps_mm, - startDistance, endDistance, - travelDistance, travelledDistance, total = 0, - startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; - - float feedrate; - - int32_t startCount, stopCount; - - feedrate = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); - - bool oldec = ec; - ec = false; - - startDistance = 20; - endDistance = soft_endstop_max[encoderAxis] - 20; - travelDistance = endDistance - startDistance; - - LOOP_NA(i) { - startCoord[i] = stepper.get_axis_position_mm((AxisEnum)i); - endCoord[i] = stepper.get_axis_position_mm((AxisEnum)i); - } - - startCoord[encoderAxis] = startDistance; - endCoord[encoderAxis] = endDistance; - - stepper.synchronize(); - - LOOP_L_N(i, iter) { - planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], - stepper.get_axis_position_mm(E_AXIS), feedrate, 0); - stepper.synchronize(); - - delay(250); - startCount = get_position(); - - //do_blocking_move_to(endCoord[X_AXIS],endCoord[Y_AXIS],endCoord[Z_AXIS]); - - planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], - stepper.get_axis_position_mm(E_AXIS), feedrate, 0); - stepper.synchronize(); - - //Read encoder distance - delay(250); - stopCount = get_position(); - - travelledDistance = mm_from_count(abs(stopCount - startCount)); - - SERIAL_ECHOPAIR("Attempted to travel: ", travelDistance); - SERIAL_ECHOLNPGM("mm."); - - SERIAL_ECHOPAIR("Actually travelled: ", travelledDistance); - SERIAL_ECHOLNPGM("mm."); - - //Calculate new axis steps per unit - old_steps_mm = planner.axis_steps_per_mm[encoderAxis]; - new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance; - - SERIAL_ECHOLNPAIR("Old steps per mm: ", old_steps_mm); - SERIAL_ECHOLNPAIR("New steps per mm: ", new_steps_mm); - - //Save new value - planner.axis_steps_per_mm[encoderAxis] = new_steps_mm; - - if (iter > 1) { - total += new_steps_mm; - - // swap start and end points so next loop runs from current position - float tempCoord = startCoord[encoderAxis]; - startCoord[encoderAxis] = endCoord[encoderAxis]; - endCoord[encoderAxis] = tempCoord; - } - } - - if (iter > 1) { - total /= (float)iter; - SERIAL_ECHOLNPAIR("Average steps per mm: ", total); - } - - ec = oldec; - - SERIAL_ECHOLNPGM("Calculated steps per mm has been set. Please save to EEPROM (M500) if you wish to keep these values."); - } - - void I2CPositionEncoder::reset() { - Wire.beginTransmission(i2cAddress); - Wire.write(I2CPE_RESET_COUNT); - Wire.endTransmission(); - - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - ZERO(err); - #endif - } - - - bool I2CPositionEncodersMgr::I2CPE_anyaxis; - uint8_t I2CPositionEncodersMgr::I2CPE_addr, - I2CPositionEncodersMgr::I2CPE_idx; - I2CPositionEncoder I2CPositionEncodersMgr::encoders[I2CPE_ENCODER_CNT]; - - void I2CPositionEncodersMgr::init() { - Wire.begin(); - - #if I2CPE_ENCODER_CNT > 0 - uint8_t i = 0; - - encoders[i].init(I2CPE_ENC_1_ADDR, I2CPE_ENC_1_AXIS); - - #ifdef I2CPE_ENC_1_TYPE - encoders[i].set_type(I2CPE_ENC_1_TYPE); - #endif - #ifdef I2CPE_ENC_1_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_1_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_1_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV); - #endif - #ifdef I2CPE_ENC_1_INVERT - encoders[i].set_inverted(I2CPE_ENC_1_INVERT); - #endif - #ifdef I2CPE_ENC_1_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD); - #endif - #ifdef I2CPE_ENC_1_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_1_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_1_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 1 - i++; - - encoders[i].init(I2CPE_ENC_2_ADDR, I2CPE_ENC_2_AXIS); - - #ifdef I2CPE_ENC_2_TYPE - encoders[i].set_type(I2CPE_ENC_2_TYPE); - #endif - #ifdef I2CPE_ENC_2_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_2_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_2_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV); - #endif - #ifdef I2CPE_ENC_2_INVERT - encoders[i].set_inverted(I2CPE_ENC_2_INVERT); - #endif - #ifdef I2CPE_ENC_2_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD); - #endif - #ifdef I2CPE_ENC_2_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_2_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_2_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 2 - i++; - - encoders[i].init(I2CPE_ENC_3_ADDR, I2CPE_ENC_3_AXIS); - - #ifdef I2CPE_ENC_3_TYPE - encoders[i].set_type(I2CPE_ENC_3_TYPE); - #endif - #ifdef I2CPE_ENC_3_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_3_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_3_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV); - #endif - #ifdef I2CPE_ENC_3_INVERT - encoders[i].set_inverted(I2CPE_ENC_3_INVERT); - #endif - #ifdef I2CPE_ENC_3_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD); - #endif - #ifdef I2CPE_ENC_3_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_3_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_3_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 3 - i++; - - encoders[i].init(I2CPE_ENC_4_ADDR, I2CPE_ENC_4_AXIS); - - #ifdef I2CPE_ENC_4_TYPE - encoders[i].set_type(I2CPE_ENC_4_TYPE); - #endif - #ifdef I2CPE_ENC_4_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_4_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_4_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV); - #endif - #ifdef I2CPE_ENC_4_INVERT - encoders[i].set_inverted(I2CPE_ENC_4_INVERT); - #endif - #ifdef I2CPE_ENC_4_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD); - #endif - #ifdef I2CPE_ENC_4_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_4_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_4_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 4 - i++; - - encoders[i].init(I2CPE_ENC_5_ADDR, I2CPE_ENC_5_AXIS); - - #ifdef I2CPE_ENC_5_TYPE - encoders[i].set_type(I2CPE_ENC_5_TYPE); - #endif - #ifdef I2CPE_ENC_5_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_5_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_5_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV); - #endif - #ifdef I2CPE_ENC_5_INVERT - encoders[i].set_inverted(I2CPE_ENC_5_INVERT); - #endif - #ifdef I2CPE_ENC_5_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD); - #endif - #ifdef I2CPE_ENC_5_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_5_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_5_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - } - - void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { - CHECK_IDX(); - - if (units) - SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); - else { - if (noOffset) { - const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); - SERIAL_CHAR(' '); - - for (uint8_t j = 31; j > 0; j--) - SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); - - SERIAL_ECHO((bool)(0x00000001 & raw_count)); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(raw_count); - } - else - SERIAL_ECHOLN(encoders[idx].get_position()); - } - } - - void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { - // First check 'new' address is not in use - Wire.beginTransmission(newaddr); - if (!Wire.endTransmission()) { - SERIAL_ECHOPAIR("?There is already a device with that address on the I2C bus! (", newaddr); - SERIAL_ECHOLNPGM(")"); - return; - } - - // Now check that we can find the module on the oldaddr address - Wire.beginTransmission(oldaddr); - if (Wire.endTransmission()) { - SERIAL_ECHOPAIR("?No module detected at this address! (", oldaddr); - SERIAL_ECHOLNPGM(")"); - return; - } - - SERIAL_ECHOPAIR("Module found at ", oldaddr); - SERIAL_ECHOLNPAIR(", changing address to ", newaddr); - - // Change the modules address - Wire.beginTransmission(oldaddr); - Wire.write(I2CPE_SET_ADDR); - Wire.write(newaddr); - Wire.endTransmission(); - - SERIAL_ECHOLNPGM("Address changed, resetting and waiting for confirmation.."); - - // Wait for the module to reset (can probably be improved by polling address with a timeout). - safe_delay(I2CPE_REBOOT_TIME); - - // Look for the module at the new address. - Wire.beginTransmission(newaddr); - if (Wire.endTransmission()) { - SERIAL_ECHOLNPGM("Address change failed! Check encoder module."); - return; - } - - SERIAL_ECHOLNPGM("Address change successful!"); - - // Now, if this module is configured, find which encoder instance it's supposed to correspond to - // and enable it (it will likely have failed initialisation on power-up, before the address change). - const int8_t idx = idx_from_addr(newaddr); - if (idx >= 0 && !encoders[idx].get_active()) { - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); - SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); - encoders[idx].set_active(encoders[idx].passes_test(true)); - } - } - - void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { - // First check there is a module - Wire.beginTransmission(address); - if (Wire.endTransmission()) { - SERIAL_ECHOPAIR("?No module detected at this address! (", address); - SERIAL_ECHOLNPGM(")"); - return; - } - - SERIAL_ECHOPAIR("Requesting version info from module at address ", address); - SERIAL_ECHOLNPGM(":"); - - Wire.beginTransmission(address); - Wire.write(I2CPE_SET_REPORT_MODE); - Wire.write(I2CPE_REPORT_VERSION); - Wire.endTransmission(); - - // Read value - if (Wire.requestFrom((int)address, 32)) { - char c; - while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) - SERIAL_ECHO(c); - SERIAL_EOL(); - } - - // Set module back to normal (distance) mode - Wire.beginTransmission(address); - Wire.write(I2CPE_SET_REPORT_MODE); - Wire.write(I2CPE_REPORT_DISTANCE); - Wire.endTransmission(); - } - - int8_t I2CPositionEncodersMgr::parse() { - I2CPE_addr = 0; - - if (parser.seen('A')) { - - if (!parser.has_value()) { - SERIAL_PROTOCOLLNPGM("?A seen, but no address specified! [30-200]"); - return I2CPE_PARSE_ERR; - }; - - I2CPE_addr = parser.value_byte(); - if (!WITHIN(I2CPE_addr, 30, 200)) { // reserve the first 30 and last 55 - SERIAL_PROTOCOLLNPGM("?Address out of range. [30-200]"); - return I2CPE_PARSE_ERR; - } - - I2CPE_idx = idx_from_addr(I2CPE_addr); - if (I2CPE_idx >= I2CPE_ENCODER_CNT) { - SERIAL_PROTOCOLLNPGM("?No device with this address!"); - return I2CPE_PARSE_ERR; - } - } - else if (parser.seenval('I')) { - - if (!parser.has_value()) { - SERIAL_PROTOCOLLNPAIR("?I seen, but no index specified! [0-", I2CPE_ENCODER_CNT - 1); - SERIAL_PROTOCOLLNPGM("]"); - return I2CPE_PARSE_ERR; - }; - - I2CPE_idx = parser.value_byte(); - if (I2CPE_idx >= I2CPE_ENCODER_CNT) { - SERIAL_PROTOCOLLNPAIR("?Index out of range. [0-", I2CPE_ENCODER_CNT - 1); - SERIAL_ECHOLNPGM("]"); - return I2CPE_PARSE_ERR; - } - - I2CPE_addr = encoders[I2CPE_idx].get_address(); - } - else - I2CPE_idx = 0xFF; - - I2CPE_anyaxis = parser.seen_axis(); - - return I2CPE_PARSE_OK; - }; - - /** - * M860: Report the position(s) of position encoder module(s). - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * O Include homed zero-offset in returned position. - * U Units in mm or raw step count. - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - * - */ - void I2CPositionEncodersMgr::M860() { - if (parse()) return; - - const bool hasU = parser.seen('U'), hasO = parser.seen('O'); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_position(idx, hasU, hasO); - } - } - } - else - report_position(I2CPE_idx, hasU, hasO); - } - - /** - * M861: Report the status of position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - * - */ - void I2CPositionEncodersMgr::M861() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_status(idx); - } - } - } - else - report_status(I2CPE_idx); - } - - /** - * M862: Perform an axis continuity test for position encoder - * modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - * - */ - void I2CPositionEncodersMgr::M862() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) test_axis(idx); - } - } - } - else - test_axis(I2CPE_idx); - } - - /** - * M863: Perform steps-per-mm calibration for - * position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * P Number of rePeats/iterations. - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - * - */ - void I2CPositionEncodersMgr::M863() { - if (parse()) return; - - const uint8_t iterations = constrain(parser.byteval('P', 1), 1, 10); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) calibrate_steps_mm(idx, iterations); - } - } - } - else - calibrate_steps_mm(I2CPE_idx, iterations); - } - - /** - * M864: Change position encoder module I2C address. - * - * A Module current/old I2C address. If not present, - * assumes default address (030). [30, 200]. - * S Module new I2C address. [30, 200]. - * - * If S is not specified: - * X Use I2CPE_PRESET_ADDR_X (030). - * Y Use I2CPE_PRESET_ADDR_Y (031). - * Z Use I2CPE_PRESET_ADDR_Z (032). - * E Use I2CPE_PRESET_ADDR_E (033). - */ - void I2CPositionEncodersMgr::M864() { - uint8_t newAddress; - - if (parse()) return; - - if (!I2CPE_addr) I2CPE_addr = I2CPE_PRESET_ADDR_X; - - if (parser.seen('S')) { - if (!parser.has_value()) { - SERIAL_PROTOCOLLNPGM("?S seen, but no address specified! [30-200]"); - return; - }; - - newAddress = parser.value_byte(); - if (!WITHIN(newAddress, 30, 200)) { - SERIAL_PROTOCOLLNPGM("?New address out of range. [30-200]"); - return; - } - } - else if (!I2CPE_anyaxis) { - SERIAL_PROTOCOLLNPGM("?You must specify S or [XYZE]."); - return; - } - else { - if (parser.seen('X')) newAddress = I2CPE_PRESET_ADDR_X; - else if (parser.seen('Y')) newAddress = I2CPE_PRESET_ADDR_Y; - else if (parser.seen('Z')) newAddress = I2CPE_PRESET_ADDR_Z; - else if (parser.seen('E')) newAddress = I2CPE_PRESET_ADDR_E; - else return; - } - - SERIAL_ECHOPAIR("Changing module at address ", I2CPE_addr); - SERIAL_ECHOLNPAIR(" to address ", newAddress); - - change_module_address(I2CPE_addr, newAddress); - } - - /** - * M865: Check position encoder module firmware version. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * - * If A or I not specified: - * X Check X axis encoder, if present. - * Y Check Y axis encoder, if present. - * Z Check Z axis encoder, if present. - * E Check E axis encoder, if present. - */ - void I2CPositionEncodersMgr::M865() { - if (parse()) return; - - if (!I2CPE_addr) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_module_firmware(encoders[idx].get_address()); - } - } - } - else - report_module_firmware(I2CPE_addr); - } - - /** - * M866: Report or reset position encoder module error - * count. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * R Reset error counter. - * - * If A or I not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ - void I2CPositionEncodersMgr::M866() { - if (parse()) return; - - const bool hasR = parser.seen('R'); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - if (hasR) - reset_error_count(idx, AxisEnum(i)); - else - report_error_count(idx, AxisEnum(i)); - } - } - } - } - else if (hasR) - reset_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); - else - report_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); - } - - /** - * M867: Enable/disable or toggle error correction for position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * S<1|0> Enable/disable error correction. 1 enables, 0 disables. If not - * supplied, toggle. - * - * If A or I not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ - void I2CPositionEncodersMgr::M867() { - if (parse()) return; - - const int8_t onoff = parser.seenval('S') ? parser.value_int() : -1; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; - enable_ec(idx, ena, AxisEnum(i)); - } - } - } - } - else { - const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; - enable_ec(I2CPE_idx, ena, encoders[I2CPE_idx].get_axis()); - } - } - - /** - * M868: Report or set position encoder module error correction - * threshold. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * T New error correction threshold. - * - * If A not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ - void I2CPositionEncodersMgr::M868() { - if (parse()) return; - - const float newThreshold = parser.seenval('T') ? parser.value_float() : -9999; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - if (newThreshold != -9999) - set_ec_threshold(idx, newThreshold, encoders[idx].get_axis()); - else - get_ec_threshold(idx, encoders[idx].get_axis()); - } - } - } - } - else if (newThreshold != -9999) - set_ec_threshold(I2CPE_idx, newThreshold, encoders[I2CPE_idx].get_axis()); - else - get_ec_threshold(I2CPE_idx, encoders[I2CPE_idx].get_axis()); - } - - /** - * M869: Report position encoder module error. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * - * If A not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ - void I2CPositionEncodersMgr::M869() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_error(idx); - } - } - } - else - report_error(I2CPE_idx); - } - -#endif // I2C_POSITION_ENCODERS diff --git a/Marlin/Makefile b/Marlin/Makefile index dfa65b7601..bc0b85a766 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -4,6 +4,7 @@ # Arduino 0011 Makefile # Arduino adaptation by mellis, eighthave, oli.keller # Marlin adaption by Daid +# Marlin 2.0 support and RELOC_WORKAROUND by @marcio-ao # # This has been tested with Arduino 0022. # @@ -63,6 +64,9 @@ HARDWARE_MOTHERBOARD ?= 11 ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino ARDUINO_VERSION ?= 106 +# The installed Libraries are in the User folder +ARDUINO_USER_DIR ?= ${HOME}/Arduino + # You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin) AVR_TOOLS_PATH ?= @@ -85,9 +89,22 @@ WIRE ?= 0 # this defines if U8GLIB is needed (may require RELOC_WORKAROUND) U8GLIB ?= 1 -# this defines whether to add a workaround for the avr-gcc relocation bug -# https://www.stix.id.au/wiki/AVR_relocation_truncations_workaround -RELOC_WORKAROUND ?= 1 +# this defines whether to include the Trinamic TMC2630Stepper +TMC2630 ?= 1 + +############ +# Try to automatically determine whether RELOC_WORKAROUND is needed based +# on GCC versions: +# http://www.avrfreaks.net/comment/1789106#comment-1789106 + +CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ ) +CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ ) +CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ ) +CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) +ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) + @echo This version of GCC is likely broken. Enabling relocation workaround. + RELOC_WORKAROUND = 1 +endif ############################################################################ # Below here nothing should be changed... @@ -378,7 +395,7 @@ MCU ?= at90usb1286 else ifeq ($(HARDWARE_MOTHERBOARD),84) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 -# Teensy++2.0 (AT90USB1286) - CLI compile: HARDWARE_MOTHERBOARD=84 make +# Teensy++2.0 (AT90USB1286) else ifeq ($(HARDWARE_MOTHERBOARD),85) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 @@ -409,8 +426,23 @@ TARGET = $(notdir $(CURDIR)) # there is no need to specify explicit pathnames as long as the # directory is added here +# The Makefile for previous versions of Marlin used VPATH for all +# source files, but for Marlin 2.0, we use VPATH only for arduino +# library files. + VPATH = . VPATH += $(BUILD_DIR) +VPATH += $(HARDWARE_SRC) + +# U8glib +VPATH += $(ARDUINO_USER_DIR)/libraries/U8glib +VPATH += $(ARDUINO_USER_DIR)/libraries/U8glib/clib + +ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)) +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI +endif + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI @@ -430,7 +462,11 @@ VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel endif ifeq ($(U8GLIB), 1) VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/utility +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/clib +endif +ifeq ($(TMC2630), 1) +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMC2130Stepper/src +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMC2130Stepper/src/source endif ifeq ($(HARDWARE_VARIANT), arduino) @@ -438,51 +474,59 @@ HARDWARE_SUB_VARIANT ?= mega VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT) else ifeq ($(HARDWARE_VARIANT), Sanguino) -VPATH += $(HARDWARE_DIR)/marlin/avr/variants/sanguino +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino else HARDWARE_SUB_VARIANT ?= standard -VPATH += $(HARDWARE_DIR)/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT) +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT) endif endif -SRC = wiring.c \ +LIB_SRC = wiring.c \ wiring_analog.c wiring_digital.c \ wiring_pulse.c \ wiring_shift.c WInterrupts.c hooks.c + ifeq ($(HARDWARE_VARIANT), Teensy) -SRC = wiring.c +LIB_SRC = wiring.c VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy endif -CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp Tone.cpp -CXXSRC += $(wildcard *.cpp) + +LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp Tone.cpp + ifeq ($(NEOPIXEL), 1) -CXXSRC += Adafruit_NeoPixel.cpp +LIB_CXXSRC += Adafruit_NeoPixel.cpp endif + ifeq ($(LIQUID_TWI2), 0) -CXXSRC += LiquidCrystal.cpp +LIB_CXXSRC += LiquidCrystal.cpp else -SRC += twi.c -CXXSRC += Wire.cpp LiquidTWI2.cpp +LIB_SRC += twi.c +LIB_CXXSRC += Wire.cpp LiquidTWI2.cpp endif ifeq ($(WIRE), 1) -SRC += twi.c -CXXSRC += Wire.cpp +LIB_SRC += twi.c +LIB_CXXSRC += Wire.cpp endif ifeq ($(U8GLIB), 1) -SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_data.c +LIB_CXXSRC += U8glib.cpp +LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_data.c +endif + +ifeq ($(TMC2630), 1) +LIB_CXXSRC += TMC2130Stepper.cpp TMC2130Stepper_COOLCONF.cpp TMC2130Stepper_DRV_STATUS.cpp TMC2130Stepper_IHOLD_IRUN.cpp TMC2130Stepper_CHOPCONF.cpp TMC2130Stepper_GCONF.cpp TMC2130Stepper_PWMCONF.cpp SW_SPI.cpp endif ifeq ($(RELOC_WORKAROUND), 1) LD_PREFIX=-nodefaultlibs -LD_SUFFIX=-lm -lgcc -lc -lgcc -L$(ARDUINO_INSTALL_DIR)/hardware/tools/avr/avr/lib/avr6 -l$(MCU) +LD_SUFFIX=-lm -lgcc -lc -lgcc endif #Check for Arduino 1.0.0 or higher and use the correct source files for that version ifeq ($(shell [ $(ARDUINO_VERSION) -ge 100 ] && echo true), true) -CXXSRC += main.cpp +LIB_CXXSRC += main.cpp else -SRC += pins_arduino.c main.c +LIB_SRC += pins_arduino.c main.c endif FORMAT = ihex @@ -517,8 +561,8 @@ CXXDEFS = $(CDEFS) ifeq ($(HARDWARE_VARIANT), Teensy) CDEFS += -DUSB_SERIAL -SRC += usb.c pins_teensy.c -CXXSRC += usb_api.cpp +LIB_SRC += usb.c pins_teensy.c +LIB_CXXSRC += usb_api.cpp endif # Add all the source directories as include directories too @@ -558,13 +602,21 @@ AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ -p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ -b$(UPLOAD_RATE) +# Since Marlin 2.0, the source files may be distributed into several +# different directories, so it is necessary to find them recursively + +SRC = $(shell find src -name '*.c' -type f) +CXXSRC = $(shell find src -name '*.cpp' -type f) + # Define all object files. -OBJ = ${patsubst %.c, $(BUILD_DIR)/%.o, ${SRC}} +OBJ = ${patsubst %.c, $(BUILD_DIR)/arduino/%.o, ${LIB_SRC}} +OBJ += ${patsubst %.cpp, $(BUILD_DIR)/arduino/%.o, ${LIB_CXXSRC}} +OBJ += ${patsubst %.S, $(BUILD_DIR)/arduino/%.o, ${LIB_ASRC}} +OBJ += ${patsubst %.c, $(BUILD_DIR)/%.o, ${SRC}} OBJ += ${patsubst %.cpp, $(BUILD_DIR)/%.o, ${CXXSRC}} -OBJ += ${patsubst %.S, $(BUILD_DIR)/%.o, ${ASRC}} # Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) +LST = $(LIB_ASRC:.S=.lst) $(LIB_CXXSRC:.cpp=.lst) $(LIB_SRC:.c=.lst) # Combine all necessary flags and optional flags. # Add target processor to flags. @@ -581,14 +633,14 @@ else P= endif +# Create required build hierarchy if it does not exist + +$(shell mkdir -p $(dir $(OBJ))) + # Default target. all: sizeafter -build: $(BUILD_DIR) elf hex - -# Creates the object directory -$(BUILD_DIR): - $P mkdir -p $(BUILD_DIR) +build: elf hex elf: $(BUILD_DIR)/$(TARGET).elf hex: $(BUILD_DIR)/$(TARGET).hex @@ -654,29 +706,34 @@ extcoff: $(TARGET).elf $(NM) -n $< > $@ # Link: create ELF output file from library. + $(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h $(Pecho) " CXX $@" $P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -Wl,--gc-sections,--relax -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) +# Object files that were found in "src" will be stored in $(BUILD_DIR) +# in directories that mirror the structure of "src" + $(BUILD_DIR)/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CC $<" $P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ -$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.cpp Configuration.h Configuration_adv.h $(MAKEFILE) - $(Pecho) " CXX $<" - $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ - $(BUILD_DIR)/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CXX $<" $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ +# Object files for Arduino libs will be created in $(BUILD_DIR)/arduino + +$(BUILD_DIR)/arduino/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CC $<" + $P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ + +$(BUILD_DIR)/arduino/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CXX $<" + $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ # Target: clean project. clean: - $(Pecho) " RM $(BUILD_DIR)/*" - $P $(REMOVE) $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET).cof $(BUILD_DIR)/$(TARGET).elf \ - $(BUILD_DIR)/$(TARGET).map $(BUILD_DIR)/$(TARGET).sym $(BUILD_DIR)/$(TARGET).lss $(BUILD_DIR)/$(TARGET).cpp \ - $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) $(Pecho) " RMDIR $(BUILD_DIR)/" $P rm -rf $(BUILD_DIR) @@ -684,4 +741,4 @@ clean: .PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter # Automaticaly include the dependency files created by gcc --include ${wildcard $(BUILD_DIR)/*.d} +-include ${patsubst %.o, %.d, ${OBJ}} diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h deleted file mode 100644 index 40b101fb4f..0000000000 --- a/Marlin/Marlin.h +++ /dev/null @@ -1,559 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ -#ifndef MARLIN_H -#define MARLIN_H - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "MarlinConfig.h" - -#ifdef DEBUG_GCODE_PARSER - #include "parser.h" -#endif - -#include "enum.h" -#include "types.h" -#include "fastio.h" -#include "utility.h" -#include "serial.h" - -void idle( - #if ENABLED(ADVANCED_PAUSE_FEATURE) - bool no_stepper_sleep = false // pass true to keep steppers from disabling on timeout - #endif -); - -void manage_inactivity(const bool ignore_stepper_queue=false); - -extern const char axis_codes[XYZE]; - -#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - extern bool extruder_duplication_enabled; -#endif - -#if HAS_X2_ENABLE - #define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0) - #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) -#elif HAS_X_ENABLE - #define enable_X() X_ENABLE_WRITE( X_ENABLE_ON) - #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) -#else - #define enable_X() NOOP - #define disable_X() NOOP -#endif - -#if HAS_Y2_ENABLE - #define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0) - #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) -#elif HAS_Y_ENABLE - #define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) - #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) -#else - #define enable_Y() NOOP - #define disable_Y() NOOP -#endif - -#if HAS_Z2_ENABLE - #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) - #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) -#elif HAS_Z_ENABLE - #define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) - #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) -#else - #define enable_Z() NOOP - #define disable_Z() NOOP -#endif - -#if ENABLED(MIXING_EXTRUDER) - - /** - * Mixing steppers synchronize their enable (and direction) together - */ - #if MIXING_STEPPERS > 3 - #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); } - #elif MIXING_STEPPERS > 2 - #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); } - #else - #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); } - #endif - #define enable_E1() NOOP - #define disable_E1() NOOP - #define enable_E2() NOOP - #define disable_E2() NOOP - #define enable_E3() NOOP - #define disable_E3() NOOP - #define enable_E4() NOOP - #define disable_E4() NOOP - -#else // !MIXING_EXTRUDER - - #if HAS_E0_ENABLE - #define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON) - #define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define enable_E0() NOOP - #define disable_E0() NOOP - #endif - - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON) - #define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define enable_E1() NOOP - #define disable_E1() NOOP - #endif - - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON) - #define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define enable_E2() NOOP - #define disable_E2() NOOP - #endif - - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON) - #define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define enable_E3() NOOP - #define disable_E3() NOOP - #endif - - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON) - #define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define enable_E4() NOOP - #define disable_E4() NOOP - #endif - -#endif // !MIXING_EXTRUDER - -#if ENABLED(G38_PROBE_TARGET) - extern bool G38_move, // flag to tell the interrupt handler that a G38 command is being run - G38_endstop_hit; // flag from the interrupt handler to indicate if the endstop went active -#endif - -void enable_all_steppers(); -void disable_e_stepper(const uint8_t e); -void disable_e_steppers(); -void disable_all_steppers(); - -void sync_plan_position(); -void sync_plan_position_e(); - -#if IS_KINEMATIC - void sync_plan_position_kinematic(); - #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position_kinematic() -#else - #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position() -#endif - -void flush_and_request_resend(); -void ok_to_send(); - -void kill(const char*); - -void quickstop_stepper(); - -extern uint8_t marlin_debug_flags; -#define DEBUGGING(F) (marlin_debug_flags & (DEBUG_## F)) - -extern bool Running; -inline bool IsRunning() { return Running; } -inline bool IsStopped() { return !Running; } - -bool enqueue_and_echo_command(const char* cmd, bool say_ok=false); // Add a single command to the end of the buffer. Return false on failure. -void enqueue_and_echo_commands_P(const char * const cmd); // Set one or more commands to be prioritized over the next Serial/SD command. -void clear_command_queue(); - -#if ENABLED(M100_FREE_MEMORY_WATCHER) || ENABLED(POWER_LOSS_RECOVERY) - extern char command_queue[BUFSIZE][MAX_CMD_SIZE]; -#endif - -#define HAS_LCD_QUEUE_NOW (ENABLED(MALYAN_LCD) || (ENABLED(ULTIPANEL) && (ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(PID_AUTOTUNE_MENU) || ENABLED(ADVANCED_PAUSE_FEATURE)))) -#define HAS_QUEUE_NOW (ENABLED(SDSUPPORT) || HAS_LCD_QUEUE_NOW) -#if HAS_QUEUE_NOW - // Return only when commands are actually enqueued - void enqueue_and_echo_command_now(const char* cmd); - #if HAS_LCD_QUEUE_NOW - void enqueue_and_echo_commands_now_P(const char * const cmd); - #endif -#endif - -extern millis_t previous_move_ms; -inline void reset_stepper_timeout() { previous_move_ms = millis(); } - -/** - * Feedrate scaling and conversion - */ -extern float feedrate_mm_s; -extern int16_t feedrate_percentage; - -#define MMS_SCALED(MM_S) ((MM_S)*feedrate_percentage*0.01) - -extern bool axis_relative_modes[]; -extern bool axis_known_position[XYZ]; -extern bool axis_homed[XYZ]; -extern volatile bool wait_for_heatup; - -#if HAS_RESUME_CONTINUE - extern volatile bool wait_for_user; -#endif - -#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) - extern bool suspend_auto_report; -#endif - -extern float current_position[XYZE], destination[XYZE]; - -/** - * Workspace offsets - */ -#if HAS_WORKSPACE_OFFSET - #if HAS_HOME_OFFSET - extern float home_offset[XYZ]; - #endif - #if HAS_POSITION_SHIFT - extern float position_shift[XYZ]; - #endif - #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - extern float workspace_offset[XYZ]; - #define WORKSPACE_OFFSET(AXIS) workspace_offset[AXIS] - #elif HAS_HOME_OFFSET - #define WORKSPACE_OFFSET(AXIS) home_offset[AXIS] - #elif HAS_POSITION_SHIFT - #define WORKSPACE_OFFSET(AXIS) position_shift[AXIS] - #endif - #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + WORKSPACE_OFFSET(AXIS)) - #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - WORKSPACE_OFFSET(AXIS)) -#else - #define NATIVE_TO_LOGICAL(POS, AXIS) (POS) - #define LOGICAL_TO_NATIVE(POS, AXIS) (POS) -#endif -#define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) -#define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) -#define LOGICAL_Z_POSITION(POS) NATIVE_TO_LOGICAL(POS, Z_AXIS) -#define RAW_X_POSITION(POS) LOGICAL_TO_NATIVE(POS, X_AXIS) -#define RAW_Y_POSITION(POS) LOGICAL_TO_NATIVE(POS, Y_AXIS) -#define RAW_Z_POSITION(POS) LOGICAL_TO_NATIVE(POS, Z_AXIS) - -// Hotend Offsets -#if HOTENDS > 1 - extern float hotend_offset[XYZ][HOTENDS]; -#endif - -// Software Endstops -extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; - -#if HAS_SOFTWARE_ENDSTOPS - extern bool soft_endstops_enabled; - void clamp_to_software_endstops(float target[XYZ]); -#else - #define soft_endstops_enabled false - #define clamp_to_software_endstops(x) NOOP -#endif - -#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) - void update_software_endstops(const AxisEnum axis); -#endif - -#define MAX_COORDINATE_SYSTEMS 9 -#if ENABLED(CNC_COORDINATE_SYSTEMS) - extern float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; - bool select_coordinate_system(const int8_t _new); -#endif - -void report_current_position(); - -#if IS_KINEMATIC - extern float delta[ABC]; - void inverse_kinematics(const float raw[XYZ]); -#endif - -#if ENABLED(DELTA) - extern float delta_height, - delta_endstop_adj[ABC], - delta_radius, - delta_tower_angle_trim[ABC], - delta_tower[ABC][2], - delta_diagonal_rod, - delta_calibration_radius, - delta_diagonal_rod_2_tower[ABC], - delta_segments_per_second, - delta_clip_start_height; - - void recalc_delta_settings(); - float delta_safe_distance_from_top(); - - #if ENABLED(DELTA_FAST_SQRT) - float Q_rsqrt(const float number); - #define _SQRT(n) (1.0f / Q_rsqrt(n)) - #else - #define _SQRT(n) SQRT(n) - #endif - - // Macro to obtain the Z position of an individual tower - #define DELTA_Z(V,T) V[Z_AXIS] + _SQRT( \ - delta_diagonal_rod_2_tower[T] - HYPOT2( \ - delta_tower[T][X_AXIS] - V[X_AXIS], \ - delta_tower[T][Y_AXIS] - V[Y_AXIS] \ - ) \ - ) - - #define DELTA_IK(V) do { \ - delta[A_AXIS] = DELTA_Z(V, A_AXIS); \ - delta[B_AXIS] = DELTA_Z(V, B_AXIS); \ - delta[C_AXIS] = DELTA_Z(V, C_AXIS); \ - }while(0) - -#elif IS_SCARA - void forward_kinematics_SCARA(const float &a, const float &b); -#endif - -#if ENABLED(G26_MESH_VALIDATION) - extern bool g26_debug_flag; -#elif ENABLED(AUTO_BED_LEVELING_UBL) - constexpr bool g26_debug_flag = false; -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - #define _GET_MESH_X(I) (bilinear_start[X_AXIS] + (I) * bilinear_grid_spacing[X_AXIS]) - #define _GET_MESH_Y(J) (bilinear_start[Y_AXIS] + (J) * bilinear_grid_spacing[Y_AXIS]) -#elif ENABLED(AUTO_BED_LEVELING_UBL) - #define _GET_MESH_X(I) ubl.mesh_index_to_xpos(I) - #define _GET_MESH_Y(J) ubl.mesh_index_to_ypos(J) -#elif ENABLED(MESH_BED_LEVELING) - #define _GET_MESH_X(I) mbl.index_to_xpos[I] - #define _GET_MESH_Y(J) mbl.index_to_ypos[J] -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - extern int bilinear_grid_spacing[2], bilinear_start[2]; - extern float bilinear_grid_factor[2], - z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - float bilinear_z_offset(const float raw[XYZ]); -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) - typedef float (*element_2d_fn)(const uint8_t, const uint8_t); - void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, const element_2d_fn fn); -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - typedef struct { double A, B, D; } linear_fit; - linear_fit* lsf_linear_fit(double x[], double y[], double z[], const int); -#endif - -#if HAS_LEVELING - bool leveling_is_valid(); - void set_bed_leveling_enabled(const bool enable=true); - void reset_bed_level(); -#endif - -#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float zfh, const bool do_report=true); -#endif - -#if HAS_BED_PROBE - extern float zprobe_zoffset; - bool set_probe_deployed(const bool deploy); - #ifdef Z_AFTER_PROBING - void move_z_after_probing(); - #endif - enum ProbePtRaise : unsigned char { - PROBE_PT_NONE, // No raise or stow after run_z_probe - PROBE_PT_STOW, // Do a complete stow after run_z_probe - PROBE_PT_RAISE, // Raise to "between" clearance after run_z_probe - PROBE_PT_BIG_RAISE // Raise to big clearance after run_z_probe - }; - float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true); - #define DEPLOY_PROBE() set_probe_deployed(true) - #define STOW_PROBE() set_probe_deployed(false) -#else - #define DEPLOY_PROBE() - #define STOW_PROBE() -#endif - -#if ENABLED(HOST_KEEPALIVE_FEATURE) - extern MarlinBusyState busy_state; - #define KEEPALIVE_STATE(n) do{ busy_state = n; }while(0) -#else - #define KEEPALIVE_STATE(n) NOOP -#endif - -#if FAN_COUNT > 0 - extern int16_t fanSpeeds[FAN_COUNT]; - #if ENABLED(EXTRA_FAN_SPEED) - extern int16_t old_fanSpeeds[FAN_COUNT], - new_fanSpeeds[FAN_COUNT]; - #endif - #if ENABLED(PROBING_FANS_OFF) - extern bool fans_paused; - extern int16_t paused_fanSpeeds[FAN_COUNT]; - #endif -#endif - -#if ENABLED(USE_CONTROLLER_FAN) - extern int controllerFanSpeed; -#endif - -#if ENABLED(BARICUDA) - extern uint8_t baricuda_valve_pressure, baricuda_e_to_p_pressure; -#endif - -#if ENABLED(FILAMENT_WIDTH_SENSOR) - extern bool filament_sensor; // Flag that filament sensor readings should control extrusion - extern float filament_width_nominal, // Theoretical filament diameter i.e., 3.00 or 1.75 - filament_width_meas; // Measured filament diameter - extern uint8_t meas_delay_cm; // Delay distance - extern int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delay measurement - filwidth_delay_index[2]; // Ring buffer indexes. Used by planner, temperature, and main code -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - extern int8_t did_pause_print; - extern AdvancedPauseMenuResponse advanced_pause_menu_response; - extern float filament_change_unload_length[EXTRUDERS], - filament_change_load_length[EXTRUDERS]; -#endif - -#if ENABLED(PID_EXTRUSION_SCALING) - extern int lpq_len; -#endif - -#if HAS_POWER_SWITCH - extern bool powersupply_on; - #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PS_ON_AWAKE); powersupply_on = true; }while(0) - #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, PS_ON_ASLEEP); powersupply_on = false; }while(0) -#endif - -// Handling multiple extruders pins -extern uint8_t active_extruder; - -#if ENABLED(MIXING_EXTRUDER) - extern float mixing_factor[MIXING_STEPPERS]; -#endif - -inline void set_current_from_destination() { COPY(current_position, destination); } -inline void set_destination_from_current() { COPY(destination, current_position); } -void prepare_move_to_destination(); - -/** - * Blocking movement and shorthand functions - */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s=0.0); -void do_blocking_move_to_x(const float &rx, const float &fr_mm_s=0.0); -void do_blocking_move_to_z(const float &rz, const float &fr_mm_s=0.0); -void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s=0.0); - -#define HAS_AXIS_UNHOMED_ERR ( \ - ENABLED(Z_PROBE_ALLEN_KEY) \ - || ENABLED(Z_PROBE_SLED) \ - || HAS_PROBING_PROCEDURE \ - || HOTENDS > 1 \ - || ENABLED(NOZZLE_CLEAN_FEATURE) \ - || ENABLED(NOZZLE_PARK_FEATURE) \ - || (ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(HOME_BEFORE_FILAMENT_CHANGE)) \ - || HAS_M206_COMMAND \ - ) || ENABLED(NO_MOTION_BEFORE_HOMING) - -#if HAS_AXIS_UNHOMED_ERR - bool axis_unhomed_error(const bool x=true, const bool y=true, const bool z=true); -#endif - -/** - * position_is_reachable family of functions - */ - -#if IS_KINEMATIC // (DELTA or SCARA) - - #if IS_SCARA - extern const float L1, L2; - #endif - - // Return true if the given point is within the printable area - inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { - #if ENABLED(DELTA) - return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset); - #elif IS_SCARA - const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); - return ( - R2 <= sq(L1 + L2) - inset - #if MIDDLE_DEAD_ZONE_R > 0 - && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) - #endif - ); - #endif - } - - #if HAS_BED_PROBE - // Return true if the both nozzle and the probe can reach the given point. - // Note: This won't work on SCARA since the probe offset rotates with the arm. - inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { - return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) - && position_is_reachable(rx, ry, FABS(MIN_PROBE_EDGE)); - } - #endif - -#else // CARTESIAN - - // Return true if the given position is within the machine bounds. - inline bool position_is_reachable(const float &rx, const float &ry) { - // Add 0.001 margin to deal with float imprecision - return WITHIN(rx, X_MIN_POS - 0.001, X_MAX_POS + 0.001) - && WITHIN(ry, Y_MIN_POS - 0.001, Y_MAX_POS + 0.001); - } - - #if HAS_BED_PROBE - /** - * Return whether the given position is within the bed, and whether the nozzle - * can reach the position required to put the probe at the given position. - * - * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the - * nozzle must be be able to reach +10,-10. - */ - inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { - return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) - && WITHIN(rx, MIN_PROBE_X - 0.001, MAX_PROBE_X + 0.001) - && WITHIN(ry, MIN_PROBE_Y - 0.001, MAX_PROBE_Y + 0.001); - } - #endif - -#endif // CARTESIAN - -#if !HAS_BED_PROBE - FORCE_INLINE bool position_is_reachable_by_probe(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } -#endif - -#endif // MARLIN_H diff --git a/Marlin/Marlin.ino b/Marlin/Marlin.ino index 1491c4efd5..842b2a14b9 100644 --- a/Marlin/Marlin.ino +++ b/Marlin/Marlin.ino @@ -12,8 +12,8 @@ Greetings! Thank you for choosing Marlin 2 as your 3D printer firmware. To configure Marlin you must edit Configuration.h and Configuration_adv.h -located in the root 'Marlin' folder. Check the example_configurations folder to -see if there's a more suitable starting-point for your specific hardware. +located in the root 'Marlin' folder. Check the config/examples folder to see if +there's a more suitable starting-point for your specific hardware. Before diving in, we recommend the following essential links: diff --git a/Marlin/MarlinSerial.cpp b/Marlin/MarlinSerial.cpp deleted file mode 100644 index cd4dd03ade..0000000000 --- a/Marlin/MarlinSerial.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * MarlinSerial.cpp - Hardware serial library for Wiring - * Copyright (c) 2006 Nicholas Zambetti. All right reserved. - * - * Modified 23 November 2006 by David A. Mellis - * Modified 28 September 2010 by Mark Sproul - * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) - * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) - */ - -// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.) - -#include "MarlinConfig.h" - -#if !(defined(__AVR__) && defined(USBCON)) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) - - #include "MarlinSerial.h" - #include "Marlin.h" - - struct ring_buffer_r { - unsigned char buffer[RX_BUFFER_SIZE]; - volatile ring_buffer_pos_t head, tail; - }; - - #if TX_BUFFER_SIZE > 0 - struct ring_buffer_t { - unsigned char buffer[TX_BUFFER_SIZE]; - volatile uint8_t head, tail; - }; - #endif - - #if UART_PRESENT(SERIAL_PORT) - ring_buffer_r rx_buffer = { { 0 }, 0, 0 }; - #if TX_BUFFER_SIZE > 0 - ring_buffer_t tx_buffer = { { 0 }, 0, 0 }; - static bool _written; - #endif - #endif - - #if ENABLED(SERIAL_XON_XOFF) - constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80; // XON / XOFF Character was sent - constexpr uint8_t XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send - // XON / XOFF character definitions - constexpr uint8_t XON_CHAR = 17; - constexpr uint8_t XOFF_CHAR = 19; - uint8_t xon_xoff_state = XON_XOFF_CHAR_SENT | XON_CHAR; - #endif - - void clear_command_queue(); - - #if ENABLED(SERIAL_STATS_DROPPED_RX) - uint8_t rx_dropped_bytes = 0; - #endif - - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - ring_buffer_pos_t rx_max_enqueued = 0; - #endif - - #if ENABLED(EMERGENCY_PARSER) - #include "emergency_parser.h" - #endif - - FORCE_INLINE void store_rxd_char() { - const ring_buffer_pos_t h = rx_buffer.head, - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the buffer is - // critical, so don't write the character or advance the head. - const char c = M_UDRx; - if (i != rx_buffer.tail) { - rx_buffer.buffer[h] = c; - rx_buffer.head = i; - } - else { - #if ENABLED(SERIAL_STATS_DROPPED_RX) - if (!++rx_dropped_bytes) ++rx_dropped_bytes; - #endif - } - - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - // calculate count of bytes stored into the RX buffer - ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(rx_buffer.head - rx_buffer.tail) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); - // Keep track of the maximum count of enqueued bytes - NOLESS(rx_max_enqueued, rx_count); - #endif - - #if ENABLED(SERIAL_XON_XOFF) - - // for high speed transfers, we can use XON/XOFF protocol to do - // software handshake and avoid overruns. - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { - - // calculate count of bytes stored into the RX buffer - ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(rx_buffer.head - rx_buffer.tail) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); - - // if we are above 12.5% of RX buffer capacity, send XOFF before - // we run out of RX buffer space .. We need 325 bytes @ 250kbits/s to - // let the host react and stop sending bytes. This translates to 13mS - // propagation time. - if (rx_count >= (RX_BUFFER_SIZE) / 8) { - // If TX interrupts are disabled and data register is empty, - // just write the byte to the data register and be done. This - // shortcut helps significantly improve the effective datarate - // at high (>500kbit/s) bitrates, where interrupt overhead - // becomes a slowdown. - if (!TEST(M_UCSRxB, M_UDRIEx) && TEST(M_UCSRxA, M_UDREx)) { - // Send an XOFF character - M_UDRx = XOFF_CHAR; - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - SBI(M_UCSRxA, M_TXCx); - // And remember it was sent - xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; - } - else { - // TX interrupts disabled, but buffer still not empty ... or - // TX interrupts enabled. Reenable TX ints and schedule XOFF - // character to be sent - #if TX_BUFFER_SIZE > 0 - SBI(M_UCSRxB, M_UDRIEx); - xon_xoff_state = XOFF_CHAR; - #else - // We are not using TX interrupts, we will have to send this manually - while (!TEST(M_UCSRxA, M_UDREx)) {/* nada */} - M_UDRx = XOFF_CHAR; - // And remember we already sent it - xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; - #endif - } - } - } - #endif // SERIAL_XON_XOFF - - #if ENABLED(EMERGENCY_PARSER) - emergency_parser.update(c); - #endif - } - - #if TX_BUFFER_SIZE > 0 - - FORCE_INLINE void _tx_udr_empty_irq(void) { - // If interrupts are enabled, there must be more data in the output - // buffer. - - #if ENABLED(SERIAL_XON_XOFF) - // Do a priority insertion of an XON/XOFF char, if needed. - const uint8_t state = xon_xoff_state; - if (!(state & XON_XOFF_CHAR_SENT)) { - M_UDRx = state & XON_XOFF_CHAR_MASK; - xon_xoff_state = state | XON_XOFF_CHAR_SENT; - } - else - #endif - { // Send the next byte - const uint8_t t = tx_buffer.tail, c = tx_buffer.buffer[t]; - tx_buffer.tail = (t + 1) & (TX_BUFFER_SIZE - 1); - M_UDRx = c; - } - - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - SBI(M_UCSRxA, M_TXCx); - - // Disable interrupts if the buffer is empty - if (tx_buffer.head == tx_buffer.tail) - CBI(M_UCSRxB, M_UDRIEx); - } - - #ifdef M_USARTx_UDRE_vect - ISR(M_USARTx_UDRE_vect) { _tx_udr_empty_irq(); } - #endif - - #endif // TX_BUFFER_SIZE - - #ifdef M_USARTx_RX_vect - ISR(M_USARTx_RX_vect) { store_rxd_char(); } - #endif - - // Public Methods - - void MarlinSerial::begin(const long baud) { - uint16_t baud_setting; - bool useU2X = true; - - #if F_CPU == 16000000UL && SERIAL_PORT == 0 - // Hard-coded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards, and the firmware on the - // 8U2 on the Uno and Mega 2560. - if (baud == 57600) useU2X = false; - #endif - - if (useU2X) { - M_UCSRxA = _BV(M_U2Xx); - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } - else { - M_UCSRxA = 0; - baud_setting = (F_CPU / 8 / baud - 1) / 2; - } - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - M_UBRRxH = baud_setting >> 8; - M_UBRRxL = baud_setting; - - SBI(M_UCSRxB, M_RXENx); - SBI(M_UCSRxB, M_TXENx); - SBI(M_UCSRxB, M_RXCIEx); - #if TX_BUFFER_SIZE > 0 - CBI(M_UCSRxB, M_UDRIEx); - _written = false; - #endif - } - - void MarlinSerial::end() { - CBI(M_UCSRxB, M_RXENx); - CBI(M_UCSRxB, M_TXENx); - CBI(M_UCSRxB, M_RXCIEx); - CBI(M_UCSRxB, M_UDRIEx); - } - - void MarlinSerial::checkRx(void) { - if (TEST(M_UCSRxA, M_RXCx)) { - CRITICAL_SECTION_START; - store_rxd_char(); - CRITICAL_SECTION_END; - } - } - - int MarlinSerial::peek(void) { - CRITICAL_SECTION_START; - const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; - CRITICAL_SECTION_END; - return v; - } - - int MarlinSerial::read(void) { - int v; - CRITICAL_SECTION_START; - const ring_buffer_pos_t t = rx_buffer.tail; - if (rx_buffer.head == t) - v = -1; - else { - v = rx_buffer.buffer[t]; - rx_buffer.tail = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); - - #if ENABLED(SERIAL_XON_XOFF) - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - // Get count of bytes in the RX buffer - ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(rx_buffer.head - rx_buffer.tail) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); - // When below 10% of RX buffer capacity, send XON before - // running out of RX buffer bytes - if (rx_count < (RX_BUFFER_SIZE) / 10) { - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - CRITICAL_SECTION_END; // End critical section before returning! - writeNoHandshake(XON_CHAR); - return v; - } - } - #endif - } - CRITICAL_SECTION_END; - return v; - } - - ring_buffer_pos_t MarlinSerial::available(void) { - CRITICAL_SECTION_START; - const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail; - CRITICAL_SECTION_END; - return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); - } - - void MarlinSerial::flush(void) { - // Don't change this order of operations. If the RX interrupt occurs between - // reading rx_buffer_head and updating rx_buffer_tail, the previous rx_buffer_head - // may be written to rx_buffer_tail, making the buffer appear full rather than empty. - CRITICAL_SECTION_START; - rx_buffer.head = rx_buffer.tail = 0; - clear_command_queue(); - CRITICAL_SECTION_END; - - #if ENABLED(SERIAL_XON_XOFF) - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - writeNoHandshake(XON_CHAR); - } - #endif - } - - #if TX_BUFFER_SIZE > 0 - uint8_t MarlinSerial::availableForWrite(void) { - CRITICAL_SECTION_START; - const uint8_t h = tx_buffer.head, t = tx_buffer.tail; - CRITICAL_SECTION_END; - return (uint8_t)(TX_BUFFER_SIZE + h - t) & (TX_BUFFER_SIZE - 1); - } - - void MarlinSerial::write(const uint8_t c) { - #if ENABLED(SERIAL_XON_XOFF) - const uint8_t state = xon_xoff_state; - if (!(state & XON_XOFF_CHAR_SENT)) { - // Send 2 chars: XON/XOFF, then a user-specified char - writeNoHandshake(state & XON_XOFF_CHAR_MASK); - xon_xoff_state = state | XON_XOFF_CHAR_SENT; - } - #endif - writeNoHandshake(c); - } - - void MarlinSerial::writeNoHandshake(const uint8_t c) { - _written = true; - CRITICAL_SECTION_START; - bool emty = (tx_buffer.head == tx_buffer.tail); - CRITICAL_SECTION_END; - - // If the buffer and the data register is empty, just write the byte - // to the data register and be done. This shortcut helps - // significantly improve the effective datarate at high (> - // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown. - if (emty && TEST(M_UCSRxA, M_UDREx)) { - CRITICAL_SECTION_START; - M_UDRx = c; - SBI(M_UCSRxA, M_TXCx); - CRITICAL_SECTION_END; - return; - } - const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1); - - // If the output buffer is full, there's nothing for it other than to - // wait for the interrupt handler to empty it a bit - while (i == tx_buffer.tail) { - if (!TEST(SREG, SREG_I)) { - // Interrupts are disabled, so we'll have to poll the data - // register empty flag ourselves. If it is set, pretend an - // interrupt has happened and call the handler to free up - // space for us. - if (TEST(M_UCSRxA, M_UDREx)) - _tx_udr_empty_irq(); - } - else { - // nop, the interrupt handler will free up space for us - } - } - - tx_buffer.buffer[tx_buffer.head] = c; - { CRITICAL_SECTION_START; - tx_buffer.head = i; - SBI(M_UCSRxB, M_UDRIEx); - CRITICAL_SECTION_END; - } - return; - } - - void MarlinSerial::flushTX(void) { - // TX - // If we have never written a byte, no need to flush. This special - // case is needed since there is no way to force the TXC (transmit - // complete) bit to 1 during initialization - if (!_written) - return; - - while (TEST(M_UCSRxB, M_UDRIEx) || !TEST(M_UCSRxA, M_TXCx)) { - if (!TEST(SREG, SREG_I) && TEST(M_UCSRxB, M_UDRIEx)) - // Interrupts are globally disabled, but the DR empty - // interrupt should be enabled, so poll the DR empty flag to - // prevent deadlock - if (TEST(M_UCSRxA, M_UDREx)) - _tx_udr_empty_irq(); - } - // If we get here, nothing is queued anymore (DRIE is disabled) and - // the hardware finished tranmission (TXC is set). - } - - #else // TX_BUFFER_SIZE == 0 - - void MarlinSerial::write(const uint8_t c) { - #if ENABLED(SERIAL_XON_XOFF) - // Do a priority insertion of an XON/XOFF char, if needed. - const uint8_t state = xon_xoff_state; - if (!(state & XON_XOFF_CHAR_SENT)) { - writeNoHandshake(state & XON_XOFF_CHAR_MASK); - xon_xoff_state = state | XON_XOFF_CHAR_SENT; - } - #endif - writeNoHandshake(c); - } - - void MarlinSerial::writeNoHandshake(uint8_t c) { - while (!TEST(M_UCSRxA, M_UDREx)) {/* nada */} - M_UDRx = c; - } - - #endif // TX_BUFFER_SIZE == 0 - - /** - * Imports from print.h - */ - - void MarlinSerial::print(char c, int base) { - print((long)c, base); - } - - void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); - } - - void MarlinSerial::print(int n, int base) { - print((long)n, base); - } - - void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); - } - - void MarlinSerial::print(long n, int base) { - if (base == 0) - write(n); - else if (base == 10) { - if (n < 0) { - print('-'); - n = -n; - } - printNumber(n, 10); - } - else - printNumber(n, base); - } - - void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); - } - - void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); - } - - void MarlinSerial::println(void) { - print('\r'); - print('\n'); - } - - void MarlinSerial::println(const String& s) { - print(s); - println(); - } - - void MarlinSerial::println(const char c[]) { - print(c); - println(); - } - - void MarlinSerial::println(char c, int base) { - print(c, base); - println(); - } - - void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); - } - - void MarlinSerial::println(int n, int base) { - print(n, base); - println(); - } - - void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); - } - - void MarlinSerial::println(long n, int base) { - print(n, base); - println(); - } - - void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); - } - - void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); - } - - // Private Methods - - void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); - } - - void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - for (uint8_t i = 0; i < digits; ++i) - rounding *= 0.1; - - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } - } - - // Preinstantiate - MarlinSerial customizedSerial; - -#endif // !(__AVR__ && USBCON) && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) - -// For AT90USB targets use the UART for BT interfacing -#if defined(__AVR__) && defined(USBCON) && ENABLED(BLUETOOTH) - HardwareSerial bluetoothSerial; -#endif diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp deleted file mode 100644 index b15458d8c2..0000000000 --- a/Marlin/Marlin_main.cpp +++ /dev/null @@ -1,14494 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * About Marlin - * - * This firmware is a mashup between Sprinter and grbl. - * - https://github.com/kliment/Sprinter - * - https://github.com/grbl/grbl - */ - -/** - * ----------------- - * G-Codes in Marlin - * ----------------- - * - * Helpful G-code references: - * - http://linuxcnc.org/handbook/gcode/g-code.html - * - http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes - * - * Help to document Marlin's G-codes online: - * - http://reprap.org/wiki/G-code - * - https://github.com/MarlinFirmware/MarlinDocumentation - * - * ----------------- - * - * "G" Codes - * - * G0 -> G1 - * G1 - Coordinated Movement X Y Z E - * G2 - CW ARC - * G3 - CCW ARC - * G4 - Dwell S or P - * G5 - Cubic B-spline with XYZE destination and IJPQ offsets - * G10 - Retract filament according to settings of M207 (Requires FWRETRACT) - * G11 - Retract recover filament according to settings of M208 (Requires FWRETRACT) - * G12 - Clean tool (Requires NOZZLE_CLEAN_FEATURE) - * G17 - Select Plane XY (Requires CNC_WORKSPACE_PLANES) - * G18 - Select Plane ZX (Requires CNC_WORKSPACE_PLANES) - * G19 - Select Plane YZ (Requires CNC_WORKSPACE_PLANES) - * G20 - Set input units to inches (Requires INCH_MODE_SUPPORT) - * G21 - Set input units to millimeters (Requires INCH_MODE_SUPPORT) - * G26 - Mesh Validation Pattern (Requires G26_MESH_VALIDATION) - * G27 - Park Nozzle (Requires NOZZLE_PARK_FEATURE) - * G28 - Home one or more axes - * G29 - Start or continue the bed leveling probe procedure (Requires bed leveling) - * G30 - Single Z probe, probes bed at X Y location (defaults to current XY location) - * G31 - Dock sled (Z_PROBE_SLED only) - * G32 - Undock sled (Z_PROBE_SLED only) - * G33 - Delta Auto-Calibration (Requires DELTA_AUTO_CALIBRATION) - * G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET) - * G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL) - * G90 - Use Absolute Coordinates - * G91 - Use Relative Coordinates - * G92 - Set current position to coordinates given - * - * "M" Codes - * - * M0 - Unconditional stop - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled) - * M1 -> M0 - * M3 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to clockwise - * M4 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to counter-clockwise - * M5 - Turn laser/spindle off - * M17 - Enable/Power all stepper motors - * M18 - Disable all stepper motors; same as M84 - * M20 - List SD card. (Requires SDSUPPORT) - * M21 - Init SD card. (Requires SDSUPPORT) - * M22 - Release SD card. (Requires SDSUPPORT) - * M23 - Select SD file: "M23 /path/file.gco". (Requires SDSUPPORT) - * M24 - Start/resume SD print. (Requires SDSUPPORT) - * M25 - Pause SD print. (Requires SDSUPPORT) - * M26 - Set SD position in bytes: "M26 S12345". (Requires SDSUPPORT) - * M27 - Report SD print status. (Requires SDSUPPORT) - * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) - * OR, with 'C' get the current filename. - * M28 - Start SD write: "M28 /path/file.gco". (Requires SDSUPPORT) - * M29 - Stop SD write. (Requires SDSUPPORT) - * M30 - Delete file from SD: "M30 /path/file.gco" - * M31 - Report time since last M109 or SD card start to serial. - * M32 - Select file and start SD print: "M32 [S] !/path/file.gco#". (Requires SDSUPPORT) - * Use P to run other files as sub-programs: "M32 P !filename#" - * The '#' is necessary when calling from within sd files, as it stops buffer prereading - * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) - * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) - * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. - * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins - * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) - * M75 - Start the print job timer. - * M76 - Pause the print job timer. - * M77 - Stop the print job timer. - * M78 - Show statistical information about the print jobs. (Requires PRINTCOUNTER) - * M80 - Turn on Power Supply. (Requires POWER_SUPPLY > 0) - * M81 - Turn off Power Supply. (Requires POWER_SUPPLY > 0) - * M82 - Set E codes absolute (default). - * M83 - Set E codes relative while in Absolute (G90) mode. - * M84 - Disable steppers until next move, or use S to specify an idle - * duration after which steppers should turn off. S0 disables the timeout. - * M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default) - * M92 - Set planner.axis_steps_per_mm for one or more axes. - * M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER) - * M104 - Set extruder target temp. - * M105 - Report current temperatures. - * M106 - Set print fan speed. - * M107 - Print fan off. - * M108 - Break out of heating loops (M109, M190, M303). With no controller, breaks out of M0/M1. (Requires EMERGENCY_PARSER) - * M109 - Sxxx Wait for extruder current temp to reach target temp. Waits only when heating - * Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling - * If AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F - * M110 - Set the current line number. (Used by host printing) - * M111 - Set debug flags: "M111 S". See flag bits defined in enum.h. - * M112 - Emergency stop. - * M113 - Get or set the timeout interval for Host Keepalive "busy" messages. (Requires HOST_KEEPALIVE_FEATURE) - * M114 - Report current position. - * M115 - Report capabilities. (Extended capabilities requires EXTENDED_CAPABILITIES_REPORT) - * M117 - Display a message on the controller screen. (Requires an LCD) - * M118 - Display a message in the host console. - * M119 - Report endstops status. - * M120 - Enable endstops detection. - * M121 - Disable endstops detection. - * M122 - Debug stepper (Requires HAVE_TMC2130 or HAVE_TMC2208) - * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) - * M126 - Solenoid Air Valve Open. (Requires BARICUDA) - * M127 - Solenoid Air Valve Closed. (Requires BARICUDA) - * M128 - EtoP Open. (Requires BARICUDA) - * M129 - EtoP Closed. (Requires BARICUDA) - * M140 - Set bed target temp. S - * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) - * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) - * M150 - Set Status LED Color as R U B P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, or PCA9632). - * M155 - Auto-report temperatures with interval of S. (Requires AUTO_REPORT_TEMPERATURES) - * M163 - Set a single proportion for a mixing extruder. (Requires MIXING_EXTRUDER) - * M164 - Save the mix as a virtual extruder. (Requires MIXING_EXTRUDER and MIXING_VIRTUAL_TOOLS) - * M165 - Set the proportions for a mixing extruder. Use parameters ABCDHI to set the mixing factors. (Requires MIXING_EXTRUDER) - * M190 - Sxxx Wait for bed current temp to reach target temp. ** Waits only when heating! ** - * Rxxx Wait for bed current temp to reach target temp. ** Waits for heating or cooling. ** - * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) - * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" - * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** - * M203 - Set maximum feedrate: "M203 X Y Z E" in units/sec. - * M204 - Set default acceleration in units/sec^2: P R T - * M205 - Set advanced settings. Current units apply: - S T minimum speeds - B - X, Y, Z, E - * M206 - Set additional homing offset. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) - * M207 - Set Retract Length: S, Feedrate: F, and Z lift: Z. (Requires FWRETRACT) - * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (Requires FWRETRACT) - * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT) - Every normal extrude-only move will be classified as retract depending on the direction. - * M211 - Enable, Disable, and/or Report software endstops: S<0|1> (Requires MIN_SOFTWARE_ENDSTOPS or MAX_SOFTWARE_ENDSTOPS) - * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) - * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) - * M221 - Set Flow Percentage: "M221 S" - * M226 - Wait until a pin is in a given state: "M226 P S" - * M240 - Trigger a camera to take a photograph. (Requires CHDK or PHOTOGRAPH_PIN) - * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) - * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) - * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS) - * M280 - Set servo position absolute: "M280 P S". (Requires servos) - * M290 - Babystepping (Requires BABYSTEPPING) - * M300 - Play beep sound S P - * M301 - Set PID parameters P I and D. (Requires PIDTEMP) - * M302 - Allow cold extrudes, or set the minimum extrude S. (Requires PREVENT_COLD_EXTRUSION) - * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) - * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) - * M350 - Set microstepping mode. (Requires digital microstepping pins.) - * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) - * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) - * M380 - Activate solenoid on active extruder. (Requires EXT_SOLENOID) - * M381 - Disable all solenoids. (Requires EXT_SOLENOID) - * M400 - Finish all moves. - * M401 - Deploy and activate Z probe. (Requires a probe) - * M402 - Deactivate and stow Z probe. (Requires a probe) - * M404 - Display or set the Nominal Filament Width: "W". (Requires FILAMENT_WIDTH_SENSOR) - * M405 - Enable Filament Sensor flow control. "M405 D". (Requires FILAMENT_WIDTH_SENSOR) - * M406 - Disable Filament Sensor flow control. (Requires FILAMENT_WIDTH_SENSOR) - * M407 - Display measured filament diameter in millimeters. (Requires FILAMENT_WIDTH_SENSOR) - * M410 - Quickstop. Abort all planned moves. - * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) - * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL) - * M428 - Set the home_offset based on the current_position. Nearest edge applies. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) - * M500 - Store parameters in EEPROM. (Requires EEPROM_SETTINGS) - * M501 - Restore parameters from EEPROM. (Requires EEPROM_SETTINGS) - * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** - * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. - * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - * M600 - Pause for filament change: "M600 X Y Z E L". (Requires ADVANCED_PAUSE_FEATURE) - * M603 - Configure filament change: "M603 T U L". (Requires ADVANCED_PAUSE_FEATURE) - * M605 - Set Dual X-Carriage movement mode: "M605 S [X] [R]". (Requires DUAL_X_CARRIAGE) - * M665 - Set delta configurations: "M665 H L R S B X Y Z (Requires DELTA) - * M666 - Set/get endstop offsets for delta (Requires DELTA) or dual endstops (Requires [XYZ]_DUAL_ENDSTOPS). - * M701 - Load filament (requires FILAMENT_LOAD_UNLOAD_GCODES) - * M702 - Unload filament (requires FILAMENT_LOAD_UNLOAD_GCODES) - * M851 - Set Z probe's Z offset in current units. (Negative = below the nozzle.) - * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) - * M860 - Report the position of position encoder modules. - * M861 - Report the status of position encoder modules. - * M862 - Perform an axis continuity test for position encoder modules. - * M863 - Perform steps-per-mm calibration for position encoder modules. - * M864 - Change position encoder module I2C address. - * M865 - Check position encoder module firmware version. - * M866 - Report or reset position encoder module error count. - * M867 - Enable/disable or toggle error correction for position encoder modules. - * M868 - Report or set position encoder module error correction threshold. - * M869 - Report position encoder module error. - * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) - * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires HAVE_TMC2130 or HAVE_TMC2208) - * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) - * M908 - Control digital trimpot directly. (Requires DAC_STEPPER_CURRENT or DIGIPOTSS_PIN) - * M909 - Print digipot/DAC current value. (Requires DAC_STEPPER_CURRENT) - * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires DAC_STEPPER_CURRENT) - * M911 - Report stepper driver overtemperature pre-warn condition. (Requires HAVE_TMC2130 or HAVE_TMC2208) - * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires HAVE_TMC2130 or HAVE_TMC2208) - * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) - * M914 - Set SENSORLESS_HOMING sensitivity. (Requires SENSORLESS_HOMING) - * - * M360 - SCARA calibration: Move to cal-position ThetaA (0 deg calibration) - * M361 - SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) - * M362 - SCARA calibration: Move to cal-position PsiA (0 deg calibration) - * M363 - SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) - * M364 - SCARA calibration: Move to cal-position PSIC (90 deg to Theta calibration position) - * - * ************ Custom codes - This can change to suit future G-code regulations - * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) - * M999 - Restart after being stopped by error - * - * "T" Codes - * - * T0-T3 - Select an extruder (tool) by index: "T F" - * - */ - -#include "Marlin.h" - -#include "ultralcd.h" -#include "planner.h" -#include "stepper.h" -#include "endstops.h" -#include "temperature.h" -#include "cardreader.h" -#include "configuration_store.h" -#include "language.h" -#include "pins_arduino.h" -#include "math.h" -#include "nozzle.h" -#include "printcounter.h" -#include "duration_t.h" -#include "types.h" -#include "parser.h" - -#if ENABLED(AUTO_POWER_CONTROL) - #include "power.h" -#endif - -#if ABL_PLANAR - #include "vector_3.h" - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - #include "least_squares_fit.h" - #endif -#elif ENABLED(MESH_BED_LEVELING) - #include "mesh_bed_leveling.h" -#endif - -#if ENABLED(BEZIER_CURVE_SUPPORT) - #include "planner_bezier.h" -#endif - -#if ENABLED(FWRETRACT) - #include "fwretract.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "power_loss_recovery.h" -#endif - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - #include "runout.h" -#endif - -#if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) - #include "buzzer.h" -#endif - -#if ENABLED(USE_WATCHDOG) - #include "watchdog.h" -#endif - -#if ENABLED(MAX7219_DEBUG) - #include "Max7219_Debug_LEDs.h" -#endif - -#if HAS_COLOR_LEDS - #include "leds.h" -#endif - -#if HAS_SERVOS - #include "servo.h" -#endif - -#if HAS_DIGIPOTSS - #include -#endif - -#if HAS_TRINAMIC - #include "tmc_util.h" -#endif - -#if ENABLED(DAC_STEPPER_CURRENT) - #include "stepper_dac.h" -#endif - -#if ENABLED(EXPERIMENTAL_I2CBUS) - #include "twibus.h" -#endif - -#if ENABLED(I2C_POSITION_ENCODERS) - #include "I2CPositionEncoder.h" -#endif - -#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - #include "endstop_interrupts.h" -#endif - -#if ENABLED(M100_FREE_MEMORY_WATCHER) - void gcode_M100(); - void M100_dump_routine(const char * const title, const char *start, const char *end); -#endif - -#if ENABLED(G26_MESH_VALIDATION) - bool g26_debug_flag; // =false - void gcode_G26(); -#endif - -#if ENABLED(SDSUPPORT) - CardReader card; -#endif - -#if ENABLED(EXPERIMENTAL_I2CBUS) - TWIBus i2c; -#endif - -#if ENABLED(G38_PROBE_TARGET) - bool G38_move = false, - G38_endstop_hit = false; -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" -#endif - -#if ENABLED(CNC_COORDINATE_SYSTEMS) - int8_t active_coordinate_system = -1; // machine space - float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; -#endif - -bool Running = true; - -uint8_t marlin_debug_flags = DEBUG_NONE; - -/** - * Cartesian Current Position - * Used to track the native machine position as moves are queued. - * Used by 'buffer_line_to_current_position' to do a move after changing it. - * Used by 'SYNC_PLAN_POSITION_KINEMATIC' to update 'planner.position'. - */ -float current_position[XYZE] = { 0.0 }; - -/** - * Cartesian Destination - * The destination for a move, filled in by G-code movement commands, - * and expected by functions like 'prepare_move_to_destination'. - * Set with 'gcode_get_destination' or 'set_destination_from_current'. - */ -float destination[XYZE] = { 0.0 }; - -/** - * axis_homed - * Flags that each linear axis was homed. - * XYZ on cartesian, ABC on delta, ABZ on SCARA. - * - * axis_known_position - * Flags that the position is known in each linear axis. Set when homed. - * Cleared whenever a stepper powers off, potentially losing its position. - */ -bool axis_homed[XYZ] = { false }, axis_known_position[XYZ] = { false }; - -/** - * GCode line number handling. Hosts may opt to include line numbers when - * sending commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. - */ -static long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; - -/** - * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. - * - * Commands are copied into this buffer by the command injectors - * (immediate, serial, sd card) and they are processed sequentially by - * the main loop. The process_next_command function parses the next - * command and hands off execution to individual handler functions. - */ -uint8_t commands_in_queue = 0, // Count of commands in the queue - cmd_queue_index_r = 0, // Ring buffer read (out) position - cmd_queue_index_w = 0; // Ring buffer write (in) position - -char command_queue[BUFSIZE][MAX_CMD_SIZE]; - -/** - * Next Injected Command pointer. NULL if no commands are being injected. - * Used by Marlin internally to ensure that commands initiated from within - * are enqueued ahead of any pending serial or sd card commands. - */ -static const char *injected_commands_P = NULL; - -#if ENABLED(TEMPERATURE_UNITS_SUPPORT) - TempUnit input_temp_units = TEMPUNIT_C; -#endif - -/** - * Feed rates are often configured with mm/m - * but the planner and stepper like mm/s units. - */ -static const float homing_feedrate_mm_s[] PROGMEM = { - #if ENABLED(DELTA) - MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z), - #else - MMM_TO_MMS(HOMING_FEEDRATE_XY), MMM_TO_MMS(HOMING_FEEDRATE_XY), - #endif - MMM_TO_MMS(HOMING_FEEDRATE_Z), 0 -}; -FORCE_INLINE float homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } - -float feedrate_mm_s = MMM_TO_MMS(1500.0); -static float saved_feedrate_mm_s; -int16_t feedrate_percentage = 100, saved_feedrate_percentage; - -// Initialized by settings.load() -bool axis_relative_modes[] = AXIS_RELATIVE_MODES; - -#if HAS_WORKSPACE_OFFSET - #if HAS_POSITION_SHIFT - // The distance that XYZ has been offset by G92. Reset by G28. - float position_shift[XYZ] = { 0 }; - #endif - #if HAS_HOME_OFFSET - // This offset is added to the configured home position. - // Set by M206, M428, or menu item. Saved to EEPROM. - float home_offset[XYZ] = { 0 }; - #endif - #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - // The above two are combined to save on computes - float workspace_offset[XYZ] = { 0 }; - #endif -#endif - -// Software Endstops are based on the configured limits. -float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, - soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS }; -#if HAS_SOFTWARE_ENDSTOPS - bool soft_endstops_enabled = true; - #if IS_KINEMATIC - float soft_endstop_radius, soft_endstop_radius_2; - #endif -#endif - -#if FAN_COUNT > 0 - int16_t fanSpeeds[FAN_COUNT] = { 0 }; - #if ENABLED(EXTRA_FAN_SPEED) - int16_t old_fanSpeeds[FAN_COUNT], - new_fanSpeeds[FAN_COUNT]; - #endif - #if ENABLED(PROBING_FANS_OFF) - bool fans_paused; // = false; - int16_t paused_fanSpeeds[FAN_COUNT] = { 0 }; - #endif -#endif - -#if ENABLED(USE_CONTROLLER_FAN) - int controllerFanSpeed; // = 0; -#endif - -// The active extruder (tool). Set with T command. -uint8_t active_extruder; // = 0; - -// Relative Mode. Enable with G91, disable with G90. -static bool relative_mode; // = false; - -// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop -volatile bool wait_for_heatup = true; - -// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop -#if HAS_RESUME_CONTINUE - volatile bool wait_for_user; // = false; -#endif - -#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) - bool suspend_auto_report; // = false -#endif - -const char axis_codes[XYZE] = { 'X', 'Y', 'Z', 'E' }; - -// Number of characters read in the current line of serial input -static int serial_count; // = 0; - -// Inactivity shutdown -millis_t previous_move_ms; // = 0; -static millis_t max_inactive_time; // = 0; -static millis_t stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000UL; - -// Buzzer - I2C on the LCD or a BEEPER_PIN -#if ENABLED(LCD_USE_I2C_BUZZER) - #define BUZZ(d,f) lcd_buzz(d, f) -#elif PIN_EXISTS(BEEPER) - Buzzer buzzer; - #define BUZZ(d,f) buzzer.tone(d, f) -#else - #define BUZZ(d,f) NOOP -#endif - -#if ENABLED(SWITCHING_NOZZLE) - #define DO_SWITCH_EXTRUDER (SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR) -#endif - -uint8_t target_extruder; - -#if HAS_BED_PROBE - float zprobe_zoffset; // Initialized by settings.load() -#endif - -#if HAS_ABL - float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); - #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s -#elif defined(XY_PROBE_SPEED) - #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) -#else - #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - #if ENABLED(DELTA) - #define ADJUST_DELTA(V) \ - if (planner.leveling_active) { \ - const float zadj = bilinear_z_offset(V); \ - delta[A_AXIS] += zadj; \ - delta[B_AXIS] += zadj; \ - delta[C_AXIS] += zadj; \ - } - #else - #define ADJUST_DELTA(V) if (planner.leveling_active) { delta[Z_AXIS] += bilinear_z_offset(V); } - #endif -#elif IS_KINEMATIC - #define ADJUST_DELTA(V) NOOP -#endif - -#if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) - const static char msg_wait_for_bed_heating[] PROGMEM = "Wait for bed heating...\n"; -#endif - -// Extruder offsets -#if HOTENDS > 1 - float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load() -#endif - -#if HAS_Z_SERVO_PROBE - const int z_servo_angle[2] = Z_SERVO_ANGLES; -#endif - -#if ENABLED(BARICUDA) - uint8_t baricuda_valve_pressure = 0, - baricuda_e_to_p_pressure = 0; -#endif - -#if HAS_POWER_SWITCH - bool powersupply_on = ( - #if ENABLED(PS_DEFAULT_OFF) - false - #else - true - #endif - ); - #if ENABLED(AUTO_POWER_CONTROL) - #define PSU_ON() powerManager.power_on() - #define PSU_OFF() powerManager.power_off() - #else - #define PSU_ON() PSU_PIN_ON() - #define PSU_OFF() PSU_PIN_OFF() - #endif -#endif - -#if ENABLED(DELTA) - - float delta[ABC]; - - // Initialized by settings.load() - float delta_height, - delta_endstop_adj[ABC] = { 0 }, - delta_radius, - delta_tower_angle_trim[ABC], - delta_tower[ABC][2], - delta_diagonal_rod, - delta_calibration_radius, - delta_diagonal_rod_2_tower[ABC], - delta_segments_per_second, - delta_clip_start_height = Z_MAX_POS; - - float delta_safe_distance_from_top(); - -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - int bilinear_grid_spacing[2], bilinear_start[2]; - float bilinear_grid_factor[2], - z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt[A] - #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt[A] - #define ABL_BG_POINTS_X ABL_GRID_POINTS_VIRT_X - #define ABL_BG_POINTS_Y ABL_GRID_POINTS_VIRT_Y - #define ABL_BG_GRID(X,Y) z_values_virt[X][Y] - #else - #define ABL_BG_SPACING(A) bilinear_grid_spacing[A] - #define ABL_BG_FACTOR(A) bilinear_grid_factor[A] - #define ABL_BG_POINTS_X GRID_MAX_POINTS_X - #define ABL_BG_POINTS_Y GRID_MAX_POINTS_Y - #define ABL_BG_GRID(X,Y) z_values[X][Y] - #endif -#endif - -#if IS_SCARA - // Float constants for SCARA calculations - const float L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, - L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, - L2_2 = sq(float(L2)); - - float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND, - delta[ABC]; -#endif - -float cartes[XYZ] = { 0 }; - -#if ENABLED(FILAMENT_WIDTH_SENSOR) - bool filament_sensor; // = false; // M405 turns on filament sensor control. M406 turns it off. - float filament_width_nominal = DEFAULT_NOMINAL_FILAMENT_DIA, // Nominal filament width. Change with M404. - filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; // Measured filament diameter - uint8_t meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting - int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 - filwidth_delay_index[2] = { 0, -1 }; // Indexes into ring buffer -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - AdvancedPauseMenuResponse advanced_pause_menu_response; - float filament_change_unload_length[EXTRUDERS], - filament_change_load_length[EXTRUDERS]; -#endif - -#if ENABLED(MIXING_EXTRUDER) - float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. - #if MIXING_VIRTUAL_TOOLS > 1 - float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - #endif -#endif - -static bool send_ok[BUFSIZE]; - -#if HAS_SERVOS - Servo servo[NUM_SERVOS]; - #define MOVE_SERVO(I, P) servo[I].move(P) - #if HAS_Z_SERVO_PROBE - #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[0]) - #define STOW_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[1]) - #endif -#endif - -#ifdef CHDK - millis_t chdkHigh = 0; - bool chdkActive = false; -#endif - -#if ENABLED(PID_EXTRUSION_SCALING) - int lpq_len = 20; -#endif - -#if ENABLED(HOST_KEEPALIVE_FEATURE) - MarlinBusyState busy_state = NOT_BUSY; - static millis_t next_busy_signal_ms = 0; - uint8_t host_keepalive_interval = DEFAULT_KEEPALIVE_INTERVAL; -#else - #define host_keepalive() NOOP -#endif - -#if ENABLED(I2C_POSITION_ENCODERS) - I2CPositionEncodersMgr I2CPEM; -#endif - -#if ENABLED(CNC_WORKSPACE_PLANES) - static WorkspacePlane workspace_plane = PLANE_XY; -#endif - -FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float_near(p); } -FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte_near(p); } - -#define XYZ_CONSTS_FROM_CONFIG(type, array, CONFIG) \ - static const PROGMEM type array##_P[XYZ] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG }; \ - static inline type array(const AxisEnum axis) { return pgm_read_any(&array##_P[axis]); } \ - typedef void __void_##CONFIG##__ - -XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); -XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); -XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); -XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH); -XYZ_CONSTS_FROM_CONFIG(float, home_bump_mm, HOME_BUMP_MM); -XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); - -/** - * *************************************************************************** - * ******************************** FUNCTIONS ******************************** - * *************************************************************************** - */ - -void stop(); - -void get_available_commands(); -void process_next_command(); -void process_parsed_command(); - -void get_cartesian_from_steppers(); -void set_current_from_steppers_for_axis(const AxisEnum axis); - -#if ENABLED(ARC_SUPPORT) - void plan_arc(const float (&cart)[XYZE], const float (&offset)[2], const bool clockwise); -#endif - -#if ENABLED(BEZIER_CURVE_SUPPORT) - void plan_cubic_move(const float (&offset)[4]); -#endif - -void tool_change(const uint8_t tmp_extruder, const float fr_mm_s=0.0, bool no_move=false); -void report_current_position(); -void report_current_position_detail(); - -#if ENABLED(DEBUG_LEVELING_FEATURE) - void print_xyz(const char* prefix, const char* suffix, const float x, const float y, const float z) { - serialprintPGM(prefix); - SERIAL_CHAR('('); - SERIAL_ECHO(x); - SERIAL_ECHOPAIR(", ", y); - SERIAL_ECHOPAIR(", ", z); - SERIAL_CHAR(')'); - if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); - } - - void print_xyz(const char* prefix, const char* suffix, const float xyz[]) { - print_xyz(prefix, suffix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]); - } - - #define DEBUG_POS(SUFFIX,VAR) do { \ - print_xyz(PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n"), VAR); }while(0) -#endif - -/** - * sync_plan_position - * - * Set the planner/stepper positions directly from current_position with - * no kinematic translation. Used for homing axes and cartesian/core syncing. - */ -void sync_plan_position() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); - #endif - planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); -} -void sync_plan_position_e() { planner.set_e_position_mm(current_position[E_AXIS]); } - -#if IS_KINEMATIC - inline void sync_plan_position_kinematic() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_kinematic", current_position); - #endif - planner.set_position_mm_kinematic(current_position); - } -#endif - -#if ENABLED(SDSUPPORT) - #include "SdFatUtil.h" - int freeMemory() { return SdFatUtil::FreeRam(); } -#else -extern "C" { - extern char __bss_end; - extern char __heap_start; - extern void* __brkval; - - int freeMemory() { - int free_memory; - if ((int)__brkval == 0) - free_memory = ((int)&free_memory) - ((int)&__bss_end); - else - free_memory = ((int)&free_memory) - ((int)__brkval); - return free_memory; - } -} -#endif // !SDSUPPORT - -#if ENABLED(DIGIPOT_I2C) - extern void digipot_i2c_set_current(uint8_t channel, float current); - extern void digipot_i2c_init(); -#endif - -/** - * Inject the next "immediate" command, when possible, onto the front of the queue. - * Return true if any immediate commands remain to inject. - */ -static bool drain_injected_commands_P() { - if (injected_commands_P != NULL) { - size_t i = 0; - char c, cmd[30]; - strncpy_P(cmd, injected_commands_P, sizeof(cmd) - 1); - cmd[sizeof(cmd) - 1] = '\0'; - while ((c = cmd[i]) && c != '\n') i++; // find the end of this gcode command - cmd[i] = '\0'; - if (enqueue_and_echo_command(cmd)) // success? - injected_commands_P = c ? injected_commands_P + i + 1 : NULL; // next command or done - } - return (injected_commands_P != NULL); // return whether any more remain -} - -/** - * Record one or many commands to run from program memory. - * Aborts the current queue, if any. - * Note: drain_injected_commands_P() must be called repeatedly to drain the commands afterwards - */ -void enqueue_and_echo_commands_P(const char * const pgcode) { - injected_commands_P = pgcode; - (void)drain_injected_commands_P(); // first command executed asap (when possible) -} - -/** - * Clear the Marlin command queue - */ -void clear_command_queue() { - cmd_queue_index_r = cmd_queue_index_w = commands_in_queue = 0; -} - -/** - * Once a new command is in the ring buffer, call this to commit it - */ -inline void _commit_command(bool say_ok) { - send_ok[cmd_queue_index_w] = say_ok; - if (++cmd_queue_index_w >= BUFSIZE) cmd_queue_index_w = 0; - commands_in_queue++; -} - -/** - * Copy a command from RAM into the main command buffer. - * Return true if the command was successfully added. - * Return false for a full buffer, or if the 'command' is a comment. - */ -inline bool _enqueuecommand(const char* cmd, bool say_ok=false) { - if (*cmd == ';' || commands_in_queue >= BUFSIZE) return false; - strcpy(command_queue[cmd_queue_index_w], cmd); - _commit_command(say_ok); - return true; -} - -/** - * Enqueue with Serial Echo - */ -bool enqueue_and_echo_command(const char* cmd, bool say_ok/*=false*/) { - if (_enqueuecommand(cmd, say_ok)) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(MSG_ENQUEUEING, cmd); - SERIAL_CHAR('"'); - SERIAL_EOL(); - return true; - } - return false; -} - -#if HAS_QUEUE_NOW - void enqueue_and_echo_command_now(const char* cmd) { - while (!enqueue_and_echo_command(cmd)) idle(); - } - #if HAS_LCD_QUEUE_NOW - void enqueue_and_echo_commands_now_P(const char * const pgcode) { - enqueue_and_echo_commands_P(pgcode); - while (drain_injected_commands_P()) idle(); - } - #endif -#endif - -void setup_killpin() { - #if HAS_KILL - SET_INPUT_PULLUP(KILL_PIN); - #endif -} - -void setup_powerhold() { - #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, HIGH); - #endif - #if HAS_POWER_SWITCH - #if ENABLED(PS_DEFAULT_OFF) - PSU_OFF(); - #else - PSU_ON(); - #endif - #endif -} - -void suicide() { - #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, LOW); - #endif -} - -void servo_init() { - #if NUM_SERVOS >= 1 && HAS_SERVO_0 - servo[0].attach(SERVO0_PIN); - servo[0].detach(); // Just set up the pin. We don't have a position yet. Don't move to a random position. - #endif - #if NUM_SERVOS >= 2 && HAS_SERVO_1 - servo[1].attach(SERVO1_PIN); - servo[1].detach(); - #endif - #if NUM_SERVOS >= 3 && HAS_SERVO_2 - servo[2].attach(SERVO2_PIN); - servo[2].detach(); - #endif - #if NUM_SERVOS >= 4 && HAS_SERVO_3 - servo[3].attach(SERVO3_PIN); - servo[3].detach(); - #endif - - #if HAS_Z_SERVO_PROBE - /** - * Set position of Z Servo Endstop - * - * The servo might be deployed and positioned too low to stow - * when starting up the machine or rebooting the board. - * There's no way to know where the nozzle is positioned until - * homing has been done - no homing with z-probe without init! - * - */ - STOW_Z_SERVO(); - #endif -} - -/** - * Stepper Reset (RigidBoard, et.al.) - */ -#if HAS_STEPPER_RESET - void disableStepperDrivers() { - OUT_WRITE(STEPPER_RESET_PIN, LOW); // drive it down to hold in reset motor driver chips - } - void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // set to input, which allows it to be pulled high by pullups -#endif - -#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 - - void i2c_on_receive(int bytes) { // just echo all bytes received to serial - i2c.receive(bytes); - } - - void i2c_on_request() { // just send dummy data for now - i2c.reply("Hello World!\n"); - } - -#endif - -void gcode_line_error(const char* err, bool doFlush = true) { - SERIAL_ERROR_START(); - serialprintPGM(err); - SERIAL_ERRORLN(gcode_LastN); - //Serial.println(gcode_N); - if (doFlush) flush_and_request_resend(); - serial_count = 0; -} - -/** - * Get all commands waiting on the serial port and queue them. - * Exit when the buffer is full or when no more characters are - * left on the serial port. - */ -inline void get_serial_commands() { - static char serial_line_buffer[MAX_CMD_SIZE]; - static bool serial_comment_mode = false; - - // If the command buffer is empty for too long, - // send "wait" to indicate Marlin is still waiting. - #if NO_TIMEOUTS > 0 - static millis_t last_command_time = 0; - const millis_t ms = millis(); - if (commands_in_queue == 0 && !MYSERIAL0.available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { - SERIAL_ECHOLNPGM(MSG_WAIT); - last_command_time = ms; - } - #endif - - /** - * Loop while serial characters are incoming and the queue is not full - */ - int c; - while (commands_in_queue < BUFSIZE && (c = MYSERIAL0.read()) >= 0) { - - char serial_char = c; - - /** - * If the character ends the line - */ - if (serial_char == '\n' || serial_char == '\r') { - - serial_comment_mode = false; // end of line == end of comment - - // Skip empty lines and comments - if (!serial_count) { thermalManager.manage_heater(); continue; } - - serial_line_buffer[serial_count] = 0; // Terminate string - serial_count = 0; // Reset buffer - - char* command = serial_line_buffer; - - while (*command == ' ') command++; // Skip leading spaces - char *npos = (*command == 'N') ? command : NULL; // Require the N parameter to start the line - - if (npos) { - - bool M110 = strstr_P(command, PSTR("M110")) != NULL; - - if (M110) { - char* n2pos = strchr(command + 4, 'N'); - if (n2pos) npos = n2pos; - } - - gcode_N = strtol(npos + 1, NULL, 10); - - if (gcode_N != gcode_LastN + 1 && !M110) { - gcode_line_error(PSTR(MSG_ERR_LINE_NO)); - return; - } - - char *apos = strrchr(command, '*'); - if (apos) { - uint8_t checksum = 0, count = uint8_t(apos - command); - while (count) checksum ^= command[--count]; - if (strtol(apos + 1, NULL, 10) != checksum) { - gcode_line_error(PSTR(MSG_ERR_CHECKSUM_MISMATCH)); - return; - } - } - else { - gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM)); - return; - } - - gcode_LastN = gcode_N; - } - #if ENABLED(SDSUPPORT) - else if (card.saving) { - gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM)); - return; - } - #endif - - // Movement commands alert when stopped - if (IsStopped()) { - char* gpos = strchr(command, 'G'); - if (gpos) { - const int codenum = strtol(gpos + 1, NULL, 10); - switch (codenum) { - case 0: - case 1: - case 2: - case 3: - SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - break; - } - } - } - - #if DISABLED(EMERGENCY_PARSER) - // Process critical commands early - if (strcmp(command, "M108") == 0) { - wait_for_heatup = false; - #if ENABLED(NEWPANEL) - wait_for_user = false; - #endif - } - if (strcmp(command, "M112") == 0) kill(PSTR(MSG_KILLED)); - if (strcmp(command, "M410") == 0) quickstop_stepper(); - #endif - - #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 - last_command_time = ms; - #endif - - // Add the command to the queue - _enqueuecommand(serial_line_buffer, true); - } - else if (serial_count >= MAX_CMD_SIZE - 1) { - // Keep fetching, but ignore normal characters beyond the max length - // The command will be injected when EOL is reached - } - else if (serial_char == '\\') { // Handle escapes - if ((c = MYSERIAL0.read()) >= 0 && !serial_comment_mode) // if we have one more character, copy it over - serial_line_buffer[serial_count++] = (char)c; - // otherwise do nothing - } - else { // it's not a newline, carriage return or escape char - if (serial_char == ';') serial_comment_mode = true; - if (!serial_comment_mode) serial_line_buffer[serial_count++] = serial_char; - } - - } // queue has space, serial has data -} - -#if ENABLED(SDSUPPORT) - - #if ENABLED(PRINTER_EVENT_LEDS) && HAS_RESUME_CONTINUE - static bool lights_off_after_print; // = false - #endif - - /** - * Get commands from the SD Card until the command buffer is full - * or until the end of the file is reached. The special character '#' - * can also interrupt buffering. - */ - inline void get_sdcard_commands() { - static bool stop_buffering = false, - sd_comment_mode = false; - - if (!card.sdprinting) return; - - /** - * '#' stops reading from SD to the buffer prematurely, so procedural - * macro calls are possible. If it occurs, stop_buffering is triggered - * and the buffer is run dry; this character _can_ occur in serial com - * due to checksums, however, no checksums are used in SD printing. - */ - - if (commands_in_queue == 0) stop_buffering = false; - - uint16_t sd_count = 0; - bool card_eof = card.eof(); - while (commands_in_queue < BUFSIZE && !card_eof && !stop_buffering) { - const int16_t n = card.get(); - char sd_char = (char)n; - card_eof = card.eof(); - if (card_eof || n == -1 - || sd_char == '\n' || sd_char == '\r' - || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode) - ) { - if (card_eof) { - - card.printingHasFinished(); - - if (card.sdprinting) - sd_count = 0; // If a sub-file was printing, continue from call point - else { - SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); - #if ENABLED(PRINTER_EVENT_LEDS) - LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS); - leds.set_green(); - #if HAS_RESUME_CONTINUE - lights_off_after_print = true; - enqueue_and_echo_commands_P(PSTR("M0 S" - #if ENABLED(NEWPANEL) - "1800" - #else - "60" - #endif - )); - #else - safe_delay(2000); - leds.set_off(); - #endif - #endif // PRINTER_EVENT_LEDS - } - } - else if (n == -1) { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPGM(MSG_SD_ERR_READ); - } - if (sd_char == '#') stop_buffering = true; - - sd_comment_mode = false; // for new command - - // Skip empty lines and comments - if (!sd_count) { thermalManager.manage_heater(); continue; } - - command_queue[cmd_queue_index_w][sd_count] = '\0'; // terminate string - sd_count = 0; // clear sd line buffer - - _commit_command(false); - } - else if (sd_count >= MAX_CMD_SIZE - 1) { - /** - * Keep fetching, but ignore normal characters beyond the max length - * The command will be injected when EOL is reached - */ - } - else { - if (sd_char == ';') sd_comment_mode = true; - if (!sd_comment_mode) command_queue[cmd_queue_index_w][sd_count++] = sd_char; - } - } - } - - #if ENABLED(POWER_LOSS_RECOVERY) - - inline bool drain_job_recovery_commands() { - static uint8_t job_recovery_commands_index = 0; // Resets on reboot - if (job_recovery_commands_count) { - if (_enqueuecommand(job_recovery_commands[job_recovery_commands_index])) { - ++job_recovery_commands_index; - if (!--job_recovery_commands_count) job_recovery_phase = JOB_RECOVERY_IDLE; - } - return true; - } - return false; - } - - #endif - -#endif // SDSUPPORT - -/** - * Add to the circular command queue the next command from: - * - The command-injection queue (injected_commands_P) - * - The active serial input (usually USB) - * - Commands left in the queue after power-loss - * - The SD card file being actively printed - */ -void get_available_commands() { - - // Immediate commands block the other queues - if (drain_injected_commands_P()) return; - - get_serial_commands(); - - #if ENABLED(POWER_LOSS_RECOVERY) - // Commands for power-loss recovery take precedence - if (job_recovery_phase == JOB_RECOVERY_YES && drain_job_recovery_commands()) return; - #endif - - #if ENABLED(SDSUPPORT) - get_sdcard_commands(); - #endif -} - -/** - * Set target_extruder from the T parameter or the active_extruder - * - * Returns TRUE if the target is invalid - */ -bool get_target_extruder_from_command(const uint16_t code) { - if (parser.seenval('T')) { - const int8_t e = parser.value_byte(); - if (e >= EXTRUDERS) { - SERIAL_ECHO_START(); - SERIAL_CHAR('M'); - SERIAL_ECHO(code); - SERIAL_ECHOLNPAIR(" " MSG_INVALID_EXTRUDER " ", e); - return true; - } - target_extruder = e; - } - else - target_extruder = active_extruder; - - return false; -} - -#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - bool extruder_duplication_enabled = false; // Used in Dual X mode 2 -#endif - -#if ENABLED(DUAL_X_CARRIAGE) - - static DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - - static float x_home_pos(const int extruder) { - if (extruder == 0) - return base_home_pos(X_AXIS); - else - /** - * In dual carriage mode the extruder offset provides an override of the - * second X-carriage position when homed - otherwise X2_HOME_POS is used. - * This allows soft recalibration of the second extruder home position - * without firmware reflash (through the M218 command). - */ - return hotend_offset[X_AXIS][1] > 0 ? hotend_offset[X_AXIS][1] : X2_HOME_POS; - } - - static int x_home_dir(const int extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } - - static float inactive_extruder_x_pos = X2_MAX_POS; // used in mode 0 & 1 - static bool active_extruder_parked = false; // used in mode 1 & 2 - static float raised_parked_position[XYZE]; // used in mode 1 - static millis_t delayed_move_time = 0; // used in mode 1 - static float duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 - static int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 - -#endif // DUAL_X_CARRIAGE - -#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) - - /** - * Software endstops can be used to monitor the open end of - * an axis that has a hardware endstop on the other end. Or - * they can prevent axes from moving past endstops and grinding. - * - * To keep doing their job as the coordinate system changes, - * the software endstop positions must be refreshed to remain - * at the same positions relative to the machine. - */ - void update_software_endstops(const AxisEnum axis) { - #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - workspace_offset[axis] = home_offset[axis] + position_shift[axis]; - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - if (axis == X_AXIS) { - - // In Dual X mode hotend_offset[X] is T1's home position - float dual_max_x = max(hotend_offset[X_AXIS][1], X2_MAX_POS); - - if (active_extruder != 0) { - // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) - soft_endstop_min[X_AXIS] = X2_MIN_POS; - soft_endstop_max[X_AXIS] = dual_max_x; - } - else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { - // In Duplication Mode, T0 can move as far left as X_MIN_POS - // but not so far to the right that T1 would move past the end - soft_endstop_min[X_AXIS] = base_min_pos(X_AXIS); - soft_endstop_max[X_AXIS] = min(base_max_pos(X_AXIS), dual_max_x - duplicate_extruder_x_offset); - } - else { - // In other modes, T0 can move from X_MIN_POS to X_MAX_POS - soft_endstop_min[axis] = base_min_pos(axis); - soft_endstop_max[axis] = base_max_pos(axis); - } - } - #elif ENABLED(DELTA) - soft_endstop_min[axis] = base_min_pos(axis); - soft_endstop_max[axis] = axis == Z_AXIS ? delta_height : base_max_pos(axis); - #else - soft_endstop_min[axis] = base_min_pos(axis); - soft_endstop_max[axis] = base_max_pos(axis); - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("For ", axis_codes[axis]); - #if HAS_HOME_OFFSET - SERIAL_ECHOPAIR(" axis:\n home_offset = ", home_offset[axis]); - #endif - #if HAS_POSITION_SHIFT - SERIAL_ECHOPAIR("\n position_shift = ", position_shift[axis]); - #endif - SERIAL_ECHOPAIR("\n soft_endstop_min = ", soft_endstop_min[axis]); - SERIAL_ECHOLNPAIR("\n soft_endstop_max = ", soft_endstop_max[axis]); - } - #endif - - #if ENABLED(DELTA) - switch(axis) { - #if HAS_SOFTWARE_ENDSTOPS - case X_AXIS: - case Y_AXIS: - // Get a minimum radius for clamping - soft_endstop_radius = MIN3(FABS(max(soft_endstop_min[X_AXIS], soft_endstop_min[Y_AXIS])), soft_endstop_max[X_AXIS], soft_endstop_max[Y_AXIS]); - soft_endstop_radius_2 = sq(soft_endstop_radius); - break; - #endif - case Z_AXIS: - delta_clip_start_height = soft_endstop_max[axis] - delta_safe_distance_from_top(); - default: break; - } - #endif - } - -#endif // HAS_WORKSPACE_OFFSET || DUAL_X_CARRIAGE || DELTA - -#if HAS_M206_COMMAND - /** - * Change the home offset for an axis. - * Also refreshes the workspace offset. - */ - static void set_home_offset(const AxisEnum axis, const float v) { - home_offset[axis] = v; - update_software_endstops(axis); - } -#endif // HAS_M206_COMMAND - -/** - * Set an axis' current position to its home position (after homing). - * - * For Core and Cartesian robots this applies one-to-one when an - * individual axis has been homed. - * - * DELTA should wait until all homing is done before setting the XYZ - * current_position to home, because homing is a single operation. - * In the case where the axis positions are already known and previously - * homed, DELTA could home to X or Y individually by moving either one - * to the center. However, homing Z always homes XY and Z. - * - * SCARA should wait until all XY homing is done before setting the XY - * current_position to home, because neither X nor Y is at home until - * both are at home. Z can however be homed individually. - * - * Callers must sync the planner position after calling this! - */ -static void set_axis_is_at_home(const AxisEnum axis) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR(">>> set_axis_is_at_home(", axis_codes[axis]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - axis_known_position[axis] = axis_homed[axis] = true; - - #if HAS_POSITION_SHIFT - position_shift[axis] = 0; - update_software_endstops(axis); - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { - current_position[X_AXIS] = x_home_pos(active_extruder); - return; - } - #endif - - #if ENABLED(MORGAN_SCARA) - - /** - * Morgan SCARA homes XY at the same time - */ - if (axis == X_AXIS || axis == Y_AXIS) { - - float homeposition[XYZ] = { - base_home_pos(X_AXIS), - base_home_pos(Y_AXIS), - base_home_pos(Z_AXIS) - }; - - // SERIAL_ECHOPAIR("homeposition X:", homeposition[X_AXIS]); - // SERIAL_ECHOLNPAIR(" Y:", homeposition[Y_AXIS]); - - /** - * Get Home position SCARA arm angles using inverse kinematics, - * and calculate homing offset using forward kinematics - */ - inverse_kinematics(homeposition); - forward_kinematics_SCARA(delta[A_AXIS], delta[B_AXIS]); - - // SERIAL_ECHOPAIR("Cartesian X:", cartes[X_AXIS]); - // SERIAL_ECHOLNPAIR(" Y:", cartes[Y_AXIS]); - - current_position[axis] = cartes[axis]; - - /** - * SCARA home positions are based on configuration since the actual - * limits are determined by the inverse kinematic transform. - */ - soft_endstop_min[axis] = base_min_pos(axis); // + (cartes[axis] - base_home_pos(axis)); - soft_endstop_max[axis] = base_max_pos(axis); // + (cartes[axis] - base_home_pos(axis)); - } - else - #elif ENABLED(DELTA) - if (axis == Z_AXIS) - current_position[axis] = delta_height; - else - #endif - { - current_position[axis] = base_home_pos(axis); - } - - /** - * Z Probe Z Homing? Account for the probe's Z offset. - */ - #if HAS_BED_PROBE && Z_HOME_DIR < 0 - if (axis == Z_AXIS) { - #if HOMING_Z_WITH_PROBE - - current_position[Z_AXIS] -= zprobe_zoffset; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***"); - SERIAL_ECHOLNPAIR("> zprobe_zoffset = ", zprobe_zoffset); - } - #endif - - #elif ENABLED(DEBUG_LEVELING_FEATURE) - - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("*** Z HOMED TO ENDSTOP (Z_MIN_PROBE_ENDSTOP) ***"); - - #endif - } - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - #if HAS_HOME_OFFSET - SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]); - SERIAL_ECHOLNPAIR("] = ", home_offset[axis]); - #endif - DEBUG_POS("", current_position); - SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis_codes[axis]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - #if ENABLED(I2C_POSITION_ENCODERS) - I2CPEM.homed(axis); - #endif -} - -/** - * Homing bump feedrate (mm/s) - */ -inline float get_homing_bump_feedrate(const AxisEnum axis) { - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); - #endif - static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; - uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); - if (hbd < 1) { - hbd = 10; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM("Warning: Homing Bump Divisor < 1"); - } - return homing_feedrate(axis) / hbd; -} - -/** - * Some planner shorthand inline functions - */ - -/** - * Move the planner to the current position from wherever it last moved - * (or from wherever it has been told it is located). - */ -inline void buffer_line_to_current_position() { - planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate_mm_s, active_extruder); -} - -/** - * Move the planner to the position stored in the destination array, which is - * used by G0/G1/G2/G3/G5 and many other functions to set a destination. - */ -inline void buffer_line_to_destination(const float &fr_mm_s) { - planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], fr_mm_s, active_extruder); -} - -#if IS_KINEMATIC - /** - * Calculate delta, start a line, and set current_position to destination - */ - void prepare_uninterpolated_move_to_destination(const float fr_mm_s=0.0) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination); - #endif - - #if UBL_SEGMENTED - // ubl segmented line will do z-only moves in single segment - ubl.prepare_segmented_line_to(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s)); - #else - if ( current_position[X_AXIS] == destination[X_AXIS] - && current_position[Y_AXIS] == destination[Y_AXIS] - && current_position[Z_AXIS] == destination[Z_AXIS] - && current_position[E_AXIS] == destination[E_AXIS] - ) return; - - planner.buffer_line_kinematic(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder); - #endif - - set_current_from_destination(); - } -#endif // IS_KINEMATIC - -/** - * Plan a move to (X, Y, Z) and set the current_position. - * The final current_position may not be the one that was requested - * Caution: 'destination' is modified by this function. - */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s/*=0.0*/) { - const float old_feedrate_mm_s = feedrate_mm_s; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) print_xyz(PSTR(">>> do_blocking_move_to"), NULL, LOGICAL_X_POSITION(rx), LOGICAL_Y_POSITION(ry), LOGICAL_Z_POSITION(rz)); - #endif - - const float z_feedrate = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS); - - #if ENABLED(DELTA) - - if (!position_is_reachable(rx, ry)) return; - - feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; - - set_destination_from_current(); // sync destination at the start - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("set_destination_from_current", destination); - #endif - - // when in the danger zone - if (current_position[Z_AXIS] > delta_clip_start_height) { - if (rz > delta_clip_start_height) { // staying in the danger zone - destination[X_AXIS] = rx; // move directly (uninterpolated) - destination[Y_AXIS] = ry; - destination[Z_AXIS] = rz; - prepare_uninterpolated_move_to_destination(); // set_current_from_destination - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); - #endif - return; - } - destination[Z_AXIS] = delta_clip_start_height; - prepare_uninterpolated_move_to_destination(); // set_current_from_destination - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); - #endif - } - - if (rz > current_position[Z_AXIS]) { // raising? - destination[Z_AXIS] = rz; - prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); - #endif - } - - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; - prepare_move_to_destination(); // set_current_from_destination - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); - #endif - - if (rz < current_position[Z_AXIS]) { // lowering? - destination[Z_AXIS] = rz; - prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); - #endif - } - - #elif IS_SCARA - - if (!position_is_reachable(rx, ry)) return; - - set_destination_from_current(); - - // If Z needs to raise, do it before moving XY - if (destination[Z_AXIS] < rz) { - destination[Z_AXIS] = rz; - prepare_uninterpolated_move_to_destination(z_feedrate); - } - - destination[X_AXIS] = rx; - destination[Y_AXIS] = ry; - prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S); - - // If Z needs to lower, do it after moving XY - if (destination[Z_AXIS] > rz) { - destination[Z_AXIS] = rz; - prepare_uninterpolated_move_to_destination(z_feedrate); - } - - #else - - // If Z needs to raise, do it before moving XY - if (current_position[Z_AXIS] < rz) { - feedrate_mm_s = z_feedrate; - current_position[Z_AXIS] = rz; - buffer_line_to_current_position(); - } - - feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; - current_position[X_AXIS] = rx; - current_position[Y_AXIS] = ry; - buffer_line_to_current_position(); - - // If Z needs to lower, do it after moving XY - if (current_position[Z_AXIS] > rz) { - feedrate_mm_s = z_feedrate; - current_position[Z_AXIS] = rz; - buffer_line_to_current_position(); - } - - #endif - - stepper.synchronize(); - - feedrate_mm_s = old_feedrate_mm_s; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< do_blocking_move_to"); - #endif -} -void do_blocking_move_to_x(const float &rx, const float &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, current_position[Y_AXIS], current_position[Z_AXIS], fr_mm_s); -} -void do_blocking_move_to_z(const float &rz, const float &fr_mm_s/*=0.0*/) { - do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], rz, fr_mm_s); -} -void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, ry, current_position[Z_AXIS], fr_mm_s); -} - -// -// Prepare to do endstop or probe moves -// with custom feedrates. -// -// - Save current feedrates -// - Reset the rate multiplier -// - Reset the command timeout -// - Enable the endstops (for endstop moves) -// -void setup_for_endstop_or_probe_move() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("setup_for_endstop_or_probe_move", current_position); - #endif - saved_feedrate_mm_s = feedrate_mm_s; - saved_feedrate_percentage = feedrate_percentage; - feedrate_percentage = 100; -} - -void clean_up_after_endstop_or_probe_move() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("clean_up_after_endstop_or_probe_move", current_position); - #endif - feedrate_mm_s = saved_feedrate_mm_s; - feedrate_percentage = saved_feedrate_percentage; -} - -#if HAS_AXIS_UNHOMED_ERR - - bool axis_unhomed_error(const bool x/*=true*/, const bool y/*=true*/, const bool z/*=true*/) { - #if ENABLED(HOME_AFTER_DEACTIVATE) - const bool xx = x && !axis_known_position[X_AXIS], - yy = y && !axis_known_position[Y_AXIS], - zz = z && !axis_known_position[Z_AXIS]; - #else - const bool xx = x && !axis_homed[X_AXIS], - yy = y && !axis_homed[Y_AXIS], - zz = z && !axis_homed[Z_AXIS]; - #endif - if (xx || yy || zz) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_HOME " "); - if (xx) SERIAL_ECHOPGM(MSG_X); - if (yy) SERIAL_ECHOPGM(MSG_Y); - if (zz) SERIAL_ECHOPGM(MSG_Z); - SERIAL_ECHOLNPGM(" " MSG_FIRST); - - #if ENABLED(ULTRA_LCD) - lcd_status_printf_P(0, PSTR(MSG_HOME " %s%s%s " MSG_FIRST), xx ? MSG_X : "", yy ? MSG_Y : "", zz ? MSG_Z : ""); - #endif - return true; - } - return false; - } - -#endif // HAS_AXIS_UNHOMED_ERR - -#if ENABLED(Z_PROBE_SLED) - - #ifndef SLED_DOCKING_OFFSET - #define SLED_DOCKING_OFFSET 0 - #endif - - /** - * Method to dock/undock a sled designed by Charles Bell. - * - * stow[in] If false, move to MAX_X and engage the solenoid - * If true, move to MAX_X and release the solenoid - */ - static void dock_sled(bool stow) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("dock_sled(", stow); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - // Dock sled a bit closer to ensure proper capturing - do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET - ((stow) ? 1 : 0)); - - #if HAS_SOLENOID_1 && DISABLED(EXT_SOLENOID) - WRITE(SOL1_PIN, !stow); // switch solenoid - #endif - } - -#elif ENABLED(Z_PROBE_ALLEN_KEY) - - FORCE_INLINE void do_blocking_move_to(const float (&raw)[XYZ], const float &fr_mm_s) { - do_blocking_move_to(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], fr_mm_s); - } - - void run_deploy_moves_script() { - #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Z) - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_X - #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Y - #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Z - #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE - #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE 0.0 - #endif - const float deploy_1[] = { Z_PROBE_ALLEN_KEY_DEPLOY_1_X, Z_PROBE_ALLEN_KEY_DEPLOY_1_Y, Z_PROBE_ALLEN_KEY_DEPLOY_1_Z }; - do_blocking_move_to(deploy_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Z) - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_X - #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Y - #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Z - #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE - #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE 0.0 - #endif - const float deploy_2[] = { Z_PROBE_ALLEN_KEY_DEPLOY_2_X, Z_PROBE_ALLEN_KEY_DEPLOY_2_Y, Z_PROBE_ALLEN_KEY_DEPLOY_2_Z }; - do_blocking_move_to(deploy_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Z) - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_X - #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Y - #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Z - #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE - #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE 0.0 - #endif - const float deploy_3[] = { Z_PROBE_ALLEN_KEY_DEPLOY_3_X, Z_PROBE_ALLEN_KEY_DEPLOY_3_Y, Z_PROBE_ALLEN_KEY_DEPLOY_3_Z }; - do_blocking_move_to(deploy_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Z) - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_X - #define Z_PROBE_ALLEN_KEY_DEPLOY_4_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Y - #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Z - #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE - #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE 0.0 - #endif - const float deploy_4[] = { Z_PROBE_ALLEN_KEY_DEPLOY_4_X, Z_PROBE_ALLEN_KEY_DEPLOY_4_Y, Z_PROBE_ALLEN_KEY_DEPLOY_4_Z }; - do_blocking_move_to(deploy_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Z) - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_X - #define Z_PROBE_ALLEN_KEY_DEPLOY_5_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Y - #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Z - #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE - #define Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE 0.0 - #endif - const float deploy_5[] = { Z_PROBE_ALLEN_KEY_DEPLOY_5_X, Z_PROBE_ALLEN_KEY_DEPLOY_5_Y, Z_PROBE_ALLEN_KEY_DEPLOY_5_Z }; - do_blocking_move_to(deploy_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE)); - #endif - } - - void run_stow_moves_script() { - #if defined(Z_PROBE_ALLEN_KEY_STOW_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Z) - #ifndef Z_PROBE_ALLEN_KEY_STOW_1_X - #define Z_PROBE_ALLEN_KEY_STOW_1_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Y - #define Z_PROBE_ALLEN_KEY_STOW_1_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Z - #define Z_PROBE_ALLEN_KEY_STOW_1_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE - #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE 0.0 - #endif - const float stow_1[] = { Z_PROBE_ALLEN_KEY_STOW_1_X, Z_PROBE_ALLEN_KEY_STOW_1_Y, Z_PROBE_ALLEN_KEY_STOW_1_Z }; - do_blocking_move_to(stow_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_STOW_2_X) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Z) - #ifndef Z_PROBE_ALLEN_KEY_STOW_2_X - #define Z_PROBE_ALLEN_KEY_STOW_2_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Y - #define Z_PROBE_ALLEN_KEY_STOW_2_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Z - #define Z_PROBE_ALLEN_KEY_STOW_2_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE - #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE 0.0 - #endif - const float stow_2[] = { Z_PROBE_ALLEN_KEY_STOW_2_X, Z_PROBE_ALLEN_KEY_STOW_2_Y, Z_PROBE_ALLEN_KEY_STOW_2_Z }; - do_blocking_move_to(stow_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_STOW_3_X) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Z) - #ifndef Z_PROBE_ALLEN_KEY_STOW_3_X - #define Z_PROBE_ALLEN_KEY_STOW_3_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Y - #define Z_PROBE_ALLEN_KEY_STOW_3_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Z - #define Z_PROBE_ALLEN_KEY_STOW_3_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE - #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE 0.0 - #endif - const float stow_3[] = { Z_PROBE_ALLEN_KEY_STOW_3_X, Z_PROBE_ALLEN_KEY_STOW_3_Y, Z_PROBE_ALLEN_KEY_STOW_3_Z }; - do_blocking_move_to(stow_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_STOW_4_X) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Z) - #ifndef Z_PROBE_ALLEN_KEY_STOW_4_X - #define Z_PROBE_ALLEN_KEY_STOW_4_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Y - #define Z_PROBE_ALLEN_KEY_STOW_4_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Z - #define Z_PROBE_ALLEN_KEY_STOW_4_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE - #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE 0.0 - #endif - const float stow_4[] = { Z_PROBE_ALLEN_KEY_STOW_4_X, Z_PROBE_ALLEN_KEY_STOW_4_Y, Z_PROBE_ALLEN_KEY_STOW_4_Z }; - do_blocking_move_to(stow_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE)); - #endif - #if defined(Z_PROBE_ALLEN_KEY_STOW_5_X) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Z) - #ifndef Z_PROBE_ALLEN_KEY_STOW_5_X - #define Z_PROBE_ALLEN_KEY_STOW_5_X current_position[X_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Y - #define Z_PROBE_ALLEN_KEY_STOW_5_Y current_position[Y_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Z - #define Z_PROBE_ALLEN_KEY_STOW_5_Z current_position[Z_AXIS] - #endif - #ifndef Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE - #define Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE 0.0 - #endif - const float stow_5[] = { Z_PROBE_ALLEN_KEY_STOW_5_X, Z_PROBE_ALLEN_KEY_STOW_5_Y, Z_PROBE_ALLEN_KEY_STOW_5_Z }; - do_blocking_move_to(stow_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE)); - #endif - } - -#endif // Z_PROBE_ALLEN_KEY - -#if ENABLED(PROBING_FANS_OFF) - - void fans_pause(const bool p) { - if (p != fans_paused) { - fans_paused = p; - if (p) - for (uint8_t x = 0; x < FAN_COUNT; x++) { - paused_fanSpeeds[x] = fanSpeeds[x]; - fanSpeeds[x] = 0; - } - else - for (uint8_t x = 0; x < FAN_COUNT; x++) - fanSpeeds[x] = paused_fanSpeeds[x]; - } - } - -#endif // PROBING_FANS_OFF - -#if HAS_BED_PROBE - - // TRIGGERED_WHEN_STOWED_TEST can easily be extended to servo probes, ... if needed. - #if ENABLED(PROBE_IS_TRIGGERED_WHEN_STOWED_TEST) - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) - #endif - #endif - - #if QUIET_PROBING - void probing_pause(const bool p) { - #if ENABLED(PROBING_HEATERS_OFF) - thermalManager.pause(p); - #endif - #if ENABLED(PROBING_FANS_OFF) - fans_pause(p); - #endif - if (p) safe_delay( - #if DELAY_BEFORE_PROBING > 25 - DELAY_BEFORE_PROBING - #else - 25 - #endif - ); - } - #endif // QUIET_PROBING - - #if ENABLED(BLTOUCH) - - void bltouch_command(int angle) { - MOVE_SERVO(Z_PROBE_SERVO_NR, angle); // Give the BL-Touch the command and wait - safe_delay(BLTOUCH_DELAY); - } - - bool set_bltouch_deployed(const bool deploy) { - if (deploy && TEST_BLTOUCH()) { // If BL-Touch says it's triggered - bltouch_command(BLTOUCH_RESET); // try to reset it. - bltouch_command(BLTOUCH_DEPLOY); // Also needs to deploy and stow to - bltouch_command(BLTOUCH_STOW); // clear the triggered condition. - safe_delay(1500); // Wait for internal self-test to complete. - // (Measured completion time was 0.65 seconds - // after reset, deploy, and stow sequence) - if (TEST_BLTOUCH()) { // If it still claims to be triggered... - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_STOP_BLTOUCH); - stop(); // punt! - return true; - } - } - - bltouch_command(deploy ? BLTOUCH_DEPLOY : BLTOUCH_STOW); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("set_bltouch_deployed(", deploy); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - return false; - } - - #endif // BLTOUCH - - /** - * Raise Z to a minimum height to make room for a probe to move - */ - inline void do_probe_raise(const float z_raise) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("do_probe_raise(", z_raise); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - float z_dest = z_raise; - if (zprobe_zoffset < 0) z_dest -= zprobe_zoffset; - - NOMORE(z_dest, Z_MAX_POS); - - if (z_dest > current_position[Z_AXIS]) - do_blocking_move_to_z(z_dest); - } - - // returns false for ok and true for failure - bool set_probe_deployed(const bool deploy) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - DEBUG_POS("set_probe_deployed", current_position); - SERIAL_ECHOLNPAIR("deploy: ", deploy); - } - #endif - - if (endstops.z_probe_enabled == deploy) return false; - - // Make room for probe to deploy (or stow) - // Fix-mounted probe should only raise for deploy - #if ENABLED(FIX_MOUNTED_PROBE) - const bool deploy_stow_condition = deploy; - #else - constexpr bool deploy_stow_condition = true; - #endif - - // For beds that fall when Z is powered off only raise for trusted Z - #if ENABLED(UNKNOWN_Z_NO_RAISE) - const bool unknown_condition = axis_known_position[Z_AXIS]; - #else - constexpr float unknown_condition = true; - #endif - - if (deploy_stow_condition && unknown_condition) - do_probe_raise(max(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); - - #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) - #if ENABLED(Z_PROBE_SLED) - #define _AUE_ARGS true, false, false - #else - #define _AUE_ARGS - #endif - if (axis_unhomed_error(_AUE_ARGS)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_STOP_UNHOMED); - stop(); - return true; - } - #endif - - const float oldXpos = current_position[X_AXIS], - oldYpos = current_position[Y_AXIS]; - - #ifdef _TRIGGERED_WHEN_STOWED_TEST - - // If endstop is already false, the Z probe is deployed - if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // closed after the probe specific actions. - // Would a goto be less ugly? - //while (!_TRIGGERED_WHEN_STOWED_TEST) idle(); // would offer the opportunity - // for a triggered when stowed manual probe. - - if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early - // otherwise an Allen-Key probe can't be stowed. - #endif - - #if ENABLED(SOLENOID_PROBE) - - #if HAS_SOLENOID_1 - WRITE(SOL1_PIN, deploy); - #endif - - #elif ENABLED(Z_PROBE_SLED) - - dock_sled(!deploy); - - #elif HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH) - - MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[deploy ? 0 : 1]); - - #elif ENABLED(Z_PROBE_ALLEN_KEY) - - deploy ? run_deploy_moves_script() : run_stow_moves_script(); - - #endif - - #ifdef _TRIGGERED_WHEN_STOWED_TEST - } // _TRIGGERED_WHEN_STOWED_TEST == deploy - - if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // State hasn't changed? - - if (IsRunning()) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Z-Probe failed"); - LCD_ALERTMESSAGEPGM("Err: ZPROBE"); - } - stop(); - return true; - - } // _TRIGGERED_WHEN_STOWED_TEST == deploy - - #endif - - do_blocking_move_to(oldXpos, oldYpos, current_position[Z_AXIS]); // return to position before deploy - endstops.enable_z_probe(deploy); - return false; - } - - /** - * @brief Used by run_z_probe to do a single Z probe move. - * - * @param z Z destination - * @param fr_mm_s Feedrate in mm/s - * @return true to indicate an error - */ - static bool do_probe_move(const float z, const float fr_mm_s) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> do_probe_move", current_position); - #endif - - #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) - // Wait for bed to heat back up between probing points - if (thermalManager.isHeatingBed()) { - serialprintPGM(msg_wait_for_bed_heating); - LCD_MESSAGEPGM(MSG_BED_HEATING); - while (thermalManager.isHeatingBed()) safe_delay(200); - lcd_reset_status(); - } - #endif - - // Deploy BLTouch at the start of any probe - #if ENABLED(BLTOUCH) - if (set_bltouch_deployed(true)) return true; - #endif - - #if QUIET_PROBING - probing_pause(true); - #endif - - // Move down until probe triggered - do_blocking_move_to_z(z, fr_mm_s); - - // Check to see if the probe was triggered - const bool probe_triggered = TEST(Endstops::endstop_hit_bits, - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - Z_MIN - #else - Z_MIN_PROBE - #endif - ); - - #if QUIET_PROBING - probing_pause(false); - #endif - - // Retract BLTouch immediately after a probe if it was triggered - #if ENABLED(BLTOUCH) - if (probe_triggered && set_bltouch_deployed(false)) return true; - #endif - - // Clear endstop flags - endstops.hit_on_purpose(); - - // Get Z where the steppers were interrupted - set_current_from_steppers_for_axis(Z_AXIS); - - // Tell the planner where we actually are - SYNC_PLAN_POSITION_KINEMATIC(); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< do_probe_move", current_position); - #endif - - return !probe_triggered; - } - - /** - * @details Used by probe_pt to do a single Z probe at the current position. - * Leaves current_position[Z_AXIS] at the height where the probe triggered. - * - * @return The raw Z position where the probe was triggered - */ - static float run_z_probe() { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position); - #endif - - // Stop the probe before it goes too low to prevent damage. - // If Z isn't known then probe to -10mm. - const float z_probe_low_point = axis_known_position[Z_AXIS] ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0; - - // Double-probing does a fast probe followed by a slow probe - #if MULTIPLE_PROBING == 2 - - // Do a first probe at the fast speed - if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) return NAN; - - float first_probe_z = current_position[Z_AXIS]; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("1st Probe Z:", first_probe_z); - #endif - - // move up to make clearance for the probe - do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - - #else - - // If the nozzle is well over the travel height then - // move down quickly before doing the slow probe - float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0; - if (zprobe_zoffset < 0) z -= zprobe_zoffset; - - if (current_position[Z_AXIS] > z) { - // If we don't make it to the z position (i.e. the probe triggered), move up to make clearance for the probe - if (!do_probe_move(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) - do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - } - #endif - - #if MULTIPLE_PROBING > 2 - float probes_total = 0; - for (uint8_t p = MULTIPLE_PROBING + 1; --p;) { - #endif - - // move down slowly to find bed - if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW))) return NAN; - - #if MULTIPLE_PROBING > 2 - probes_total += current_position[Z_AXIS]; - if (p > 1) do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - } - #endif - - #if MULTIPLE_PROBING > 2 - - // Return the average value of all probes - return probes_total * (1.0 / (MULTIPLE_PROBING)); - - #elif MULTIPLE_PROBING == 2 - - const float z2 = current_position[Z_AXIS]; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("2nd Probe Z:", z2); - SERIAL_ECHOLNPAIR(" Discrepancy:", first_probe_z - z2); - } - #endif - - // Return a weighted average of the fast and slow probes - return (z2 * 3.0 + first_probe_z * 2.0) * 0.2; - - #else - - // Return the single probe result - return current_position[Z_AXIS]; - - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< run_z_probe", current_position); - #endif - } - - /** - * - Move to the given XY - * - Deploy the probe, if not already deployed - * - Probe the bed, get the Z position - * - Depending on the 'stow' flag - * - Stow the probe, or - * - Raise to the BETWEEN height - * - Return the probed Z position - */ - float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR(">>> probe_pt(", LOGICAL_X_POSITION(rx)); - SERIAL_ECHOPAIR(", ", LOGICAL_Y_POSITION(ry)); - SERIAL_ECHOPAIR(", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none"); - SERIAL_ECHOPAIR(", ", int(verbose_level)); - SERIAL_ECHOPAIR(", ", probe_relative ? "probe" : "nozzle"); - SERIAL_ECHOLNPGM("_relative)"); - DEBUG_POS("", current_position); - } - #endif - - // TODO: Adapt for SCARA, where the offset rotates - float nx = rx, ny = ry; - if (probe_relative) { - if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe - nx -= (X_PROBE_OFFSET_FROM_EXTRUDER); // Get the nozzle position - ny -= (Y_PROBE_OFFSET_FROM_EXTRUDER); - } - else if (!position_is_reachable(nx, ny)) return NAN; // The given position is in terms of the nozzle - - const float nz = - #if ENABLED(DELTA) - // Move below clip height or xy move will be aborted by do_blocking_move_to - min(current_position[Z_AXIS], delta_clip_start_height) - #else - current_position[Z_AXIS] - #endif - ; - - const float old_feedrate_mm_s = feedrate_mm_s; - feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; - - // Move the probe to the starting XYZ - do_blocking_move_to(nx, ny, nz); - - float measured_z = NAN; - if (!DEPLOY_PROBE()) { - measured_z = run_z_probe() + zprobe_zoffset; - - const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; - if (big_raise || raise_after == PROBE_PT_RAISE) - do_blocking_move_to_z(current_position[Z_AXIS] + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - else if (raise_after == PROBE_PT_STOW) - if (STOW_PROBE()) measured_z = NAN; - } - - if (verbose_level > 2) { - SERIAL_PROTOCOLPGM("Bed X: "); - SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 3); - SERIAL_PROTOCOLPGM(" Y: "); - SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 3); - SERIAL_PROTOCOLPGM(" Z: "); - SERIAL_PROTOCOL_F(measured_z, 3); - SERIAL_EOL(); - } - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< probe_pt"); - #endif - - feedrate_mm_s = old_feedrate_mm_s; - - if (isnan(measured_z)) { - LCD_MESSAGEPGM(MSG_ERR_PROBING_FAILED); - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_PROBING_FAILED); - } - - return measured_z; - } - -#endif // HAS_BED_PROBE - -#if HAS_LEVELING - - bool leveling_is_valid() { - return - #if ENABLED(MESH_BED_LEVELING) - mbl.has_mesh() - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - !!bilinear_grid_spacing[X_AXIS] - #elif ENABLED(AUTO_BED_LEVELING_UBL) - true - #else // 3POINT, LINEAR - true - #endif - ; - } - - /** - * Turn bed leveling on or off, fixing the current - * position as-needed. - * - * Disable: Current position = physical position - * Enable: Current position = "unleveled" physical position - */ - void set_bed_leveling_enabled(const bool enable/*=true*/) { - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - const bool can_change = (!enable || leveling_is_valid()); - #else - constexpr bool can_change = true; - #endif - - if (can_change && enable != planner.leveling_active) { - - #if ENABLED(MESH_BED_LEVELING) - - if (!enable) - planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); - - const bool enabling = enable && leveling_is_valid(); - planner.leveling_active = enabling; - if (enabling) planner.unapply_leveling(current_position); - - #elif ENABLED(AUTO_BED_LEVELING_UBL) - #if PLANNER_LEVELING - if (planner.leveling_active) { // leveling from on to off - // change unleveled current_position to physical current_position without moving steppers. - planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); - planner.leveling_active = false; // disable only AFTER calling apply_leveling - } - else { // leveling from off to on - planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored - // change physical current_position to unleveled current_position without moving steppers. - planner.unapply_leveling(current_position); - } - #else - // UBL equivalents for apply/unapply_leveling - #if ENABLED(SKEW_CORRECTION) - float pos[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - planner.skew(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS]); - #else - const float (&pos)[XYZE] = current_position; - #endif - if (planner.leveling_active) { - current_position[Z_AXIS] += ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); - planner.leveling_active = false; - } - else { - planner.leveling_active = true; - current_position[Z_AXIS] -= ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); - } - #endif - - #else // ABL - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - // Force bilinear_z_offset to re-calculate next time - const float reset[XYZ] = { -9999.999, -9999.999, 0 }; - (void)bilinear_z_offset(reset); - #endif - - // Enable or disable leveling compensation in the planner - planner.leveling_active = enable; - - if (!enable) - // When disabling just get the current position from the steppers. - // This will yield the smallest error when first converted back to steps. - set_current_from_steppers_for_axis( - #if ABL_PLANAR - ALL_AXES - #else - Z_AXIS - #endif - ); - else - // When enabling, remove compensation from the current position, - // so compensation will give the right stepper counts. - planner.unapply_leveling(current_position); - - SYNC_PLAN_POSITION_KINEMATIC(); - - #endif // ABL - } - } - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - - void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { - - if (planner.z_fade_height == zfh) return; - - const bool leveling_was_active = planner.leveling_active; - set_bed_leveling_enabled(false); - - planner.set_z_fade_height(zfh); - - if (leveling_was_active) { - const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - set_bed_leveling_enabled(true); - if (do_report && memcmp(oldpos, current_position, sizeof(oldpos))) - report_current_position(); - } - } - - #endif // LEVELING_FADE_HEIGHT - - /** - * Reset calibration results to zero. - */ - void reset_bed_level() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level"); - #endif - set_bed_leveling_enabled(false); - #if ENABLED(MESH_BED_LEVELING) - mbl.reset(); - #elif ENABLED(AUTO_BED_LEVELING_UBL) - ubl.reset(); - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_start[X_AXIS] = bilinear_start[Y_AXIS] = - bilinear_grid_spacing[X_AXIS] = bilinear_grid_spacing[Y_AXIS] = 0; - for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) - for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) - z_values[x][y] = NAN; - #elif ABL_PLANAR - planner.bed_level_matrix.set_to_identity(); - #endif - } - -#endif // HAS_LEVELING - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) - - /** - * Enable to produce output in JSON format suitable - * for SCAD or JavaScript mesh visualizers. - * - * Visualize meshes in OpenSCAD using the included script. - * - * buildroot/shared/scripts/MarlinMesh.scad - */ - //#define SCAD_MESH_OUTPUT - - /** - * Print calibration results for plotting or manual frame adjustment. - */ - void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, const element_2d_fn fn) { - #ifndef SCAD_MESH_OUTPUT - for (uint8_t x = 0; x < sx; x++) { - for (uint8_t i = 0; i < precision + 2 + (x < 10 ? 1 : 0); i++) - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL((int)x); - } - SERIAL_EOL(); - #endif - #ifdef SCAD_MESH_OUTPUT - SERIAL_PROTOCOLLNPGM("measured_z = ["); // open 2D array - #endif - for (uint8_t y = 0; y < sy; y++) { - #ifdef SCAD_MESH_OUTPUT - SERIAL_PROTOCOLPGM(" ["); // open sub-array - #else - if (y < 10) SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL((int)y); - #endif - for (uint8_t x = 0; x < sx; x++) { - SERIAL_PROTOCOLCHAR(' '); - const float offset = fn(x, y); - if (!isnan(offset)) { - if (offset >= 0) SERIAL_PROTOCOLCHAR('+'); - SERIAL_PROTOCOL_F(offset, precision); - } - else { - #ifdef SCAD_MESH_OUTPUT - for (uint8_t i = 3; i < precision + 3; i++) - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOLPGM("NAN"); - #else - for (uint8_t i = 0; i < precision + 3; i++) - SERIAL_PROTOCOLCHAR(i ? '=' : ' '); - #endif - } - #ifdef SCAD_MESH_OUTPUT - if (x < sx - 1) SERIAL_PROTOCOLCHAR(','); - #endif - } - #ifdef SCAD_MESH_OUTPUT - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOLCHAR(']'); // close sub-array - if (y < sy - 1) SERIAL_PROTOCOLCHAR(','); - #endif - SERIAL_EOL(); - } - #ifdef SCAD_MESH_OUTPUT - SERIAL_PROTOCOLPGM("];"); // close 2D array - #endif - SERIAL_EOL(); - } - -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - /** - * Extrapolate a single point from its neighbors - */ - static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPGM("Extrapolate ["); - if (x < 10) SERIAL_CHAR(' '); - SERIAL_ECHO((int)x); - SERIAL_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); - SERIAL_CHAR(' '); - if (y < 10) SERIAL_CHAR(' '); - SERIAL_ECHO((int)y); - SERIAL_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); - SERIAL_CHAR(']'); - } - #endif - if (!isnan(z_values[x][y])) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM(" (done)"); - #endif - return; // Don't overwrite good values. - } - SERIAL_EOL(); - - // Get X neighbors, Y neighbors, and XY neighbors - const uint8_t x1 = x + xdir, y1 = y + ydir, x2 = x1 + xdir, y2 = y1 + ydir; - float a1 = z_values[x1][y ], a2 = z_values[x2][y ], - b1 = z_values[x ][y1], b2 = z_values[x ][y2], - c1 = z_values[x1][y1], c2 = z_values[x2][y2]; - - // Treat far unprobed points as zero, near as equal to far - if (isnan(a2)) a2 = 0.0; if (isnan(a1)) a1 = a2; - if (isnan(b2)) b2 = 0.0; if (isnan(b1)) b1 = b2; - if (isnan(c2)) c2 = 0.0; if (isnan(c1)) c1 = c2; - - const float a = 2 * a1 - a2, b = 2 * b1 - b2, c = 2 * c1 - c2; - - // Take the average instead of the median - z_values[x][y] = (a + b + c) / 3.0; - - // Median is robust (ignores outliers). - // z_values[x][y] = (a < b) ? ((b < c) ? b : (c < a) ? a : c) - // : ((c < b) ? b : (a < c) ? a : c); - } - - //Enable this if your SCARA uses 180° of total area - //#define EXTRAPOLATE_FROM_EDGE - - #if ENABLED(EXTRAPOLATE_FROM_EDGE) - #if GRID_MAX_POINTS_X < GRID_MAX_POINTS_Y - #define HALF_IN_X - #elif GRID_MAX_POINTS_Y < GRID_MAX_POINTS_X - #define HALF_IN_Y - #endif - #endif - - /** - * Fill in the unprobed points (corners of circular print surface) - * using linear extrapolation, away from the center. - */ - static void extrapolate_unprobed_bed_level() { - #ifdef HALF_IN_X - constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; - #else - constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center - ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center - xlen = ctrx1; - #endif - - #ifdef HALF_IN_Y - constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; - #else - constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center - ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center - ylen = ctry1; - #endif - - for (uint8_t xo = 0; xo <= xlen; xo++) - for (uint8_t yo = 0; yo <= ylen; yo++) { - uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; - #ifndef HALF_IN_X - const uint8_t x1 = ctrx1 - xo; - #endif - #ifndef HALF_IN_Y - const uint8_t y1 = ctry1 - yo; - #ifndef HALF_IN_X - extrapolate_one_point(x1, y1, +1, +1); // left-below + + - #endif - extrapolate_one_point(x2, y1, -1, +1); // right-below - + - #endif - #ifndef HALF_IN_X - extrapolate_one_point(x1, y2, +1, -1); // left-above + - - #endif - extrapolate_one_point(x2, y2, -1, -1); // right-above - - - } - - } - - static void print_bilinear_leveling_grid() { - SERIAL_ECHOLNPGM("Bilinear Leveling Grid:"); - print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 3, - [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } - ); - } - - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - - #define ABL_GRID_POINTS_VIRT_X (GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 - #define ABL_GRID_POINTS_VIRT_Y (GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 - #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) - #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) - float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; - int bilinear_grid_spacing_virt[2] = { 0 }; - float bilinear_grid_factor_virt[2] = { 0 }; - - static void print_bilinear_leveling_grid_virt() { - SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); - print_2d_array(ABL_GRID_POINTS_VIRT_X, ABL_GRID_POINTS_VIRT_Y, 5, - [](const uint8_t ix, const uint8_t iy) { return z_values_virt[ix][iy]; } - ); - } - - #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) - float bed_level_virt_coord(const uint8_t x, const uint8_t y) { - uint8_t ep = 0, ip = 1; - if (!x || x == ABL_TEMP_POINTS_X - 1) { - if (x) { - ep = GRID_MAX_POINTS_X - 1; - ip = GRID_MAX_POINTS_X - 2; - } - if (WITHIN(y, 1, ABL_TEMP_POINTS_Y - 2)) - return LINEAR_EXTRAPOLATION( - z_values[ep][y - 1], - z_values[ip][y - 1] - ); - else - return LINEAR_EXTRAPOLATION( - bed_level_virt_coord(ep + 1, y), - bed_level_virt_coord(ip + 1, y) - ); - } - if (!y || y == ABL_TEMP_POINTS_Y - 1) { - if (y) { - ep = GRID_MAX_POINTS_Y - 1; - ip = GRID_MAX_POINTS_Y - 2; - } - if (WITHIN(x, 1, ABL_TEMP_POINTS_X - 2)) - return LINEAR_EXTRAPOLATION( - z_values[x - 1][ep], - z_values[x - 1][ip] - ); - else - return LINEAR_EXTRAPOLATION( - bed_level_virt_coord(x, ep + 1), - bed_level_virt_coord(x, ip + 1) - ); - } - return z_values[x - 1][y - 1]; - } - - static float bed_level_virt_cmr(const float p[4], const uint8_t i, const float t) { - return ( - p[i-1] * -t * sq(1 - t) - + p[i] * (2 - 5 * sq(t) + 3 * t * sq(t)) - + p[i+1] * t * (1 + 4 * t - 3 * sq(t)) - - p[i+2] * sq(t) * (1 - t) - ) * 0.5; - } - - static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { - float row[4], column[4]; - for (uint8_t i = 0; i < 4; i++) { - for (uint8_t j = 0; j < 4; j++) { - column[j] = bed_level_virt_coord(i + x - 1, j + y - 1); - } - row[i] = bed_level_virt_cmr(column, 1, ty); - } - return bed_level_virt_cmr(row, 1, tx); - } - - void bed_level_virt_interpolate() { - bilinear_grid_spacing_virt[X_AXIS] = bilinear_grid_spacing[X_AXIS] / (BILINEAR_SUBDIVISIONS); - bilinear_grid_spacing_virt[Y_AXIS] = bilinear_grid_spacing[Y_AXIS] / (BILINEAR_SUBDIVISIONS); - bilinear_grid_factor_virt[X_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[X_AXIS]); - bilinear_grid_factor_virt[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[Y_AXIS]); - for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) - for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) - for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ty++) - for (uint8_t tx = 0; tx < BILINEAR_SUBDIVISIONS; tx++) { - if ((ty && y == GRID_MAX_POINTS_Y - 1) || (tx && x == GRID_MAX_POINTS_X - 1)) - continue; - z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = - bed_level_virt_2cmr( - x + 1, - y + 1, - (float)tx / (BILINEAR_SUBDIVISIONS), - (float)ty / (BILINEAR_SUBDIVISIONS) - ); - } - } - #endif // ABL_BILINEAR_SUBDIVISION - - // Refresh after other values have been updated - void refresh_bed_level() { - bilinear_grid_factor[X_AXIS] = RECIPROCAL(bilinear_grid_spacing[X_AXIS]); - bilinear_grid_factor[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing[Y_AXIS]); - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - bed_level_virt_interpolate(); - #endif - } - -#endif // AUTO_BED_LEVELING_BILINEAR - -#if ENABLED(SENSORLESS_HOMING) - - /** - * Set sensorless homing if the axis has it, accounting for Core Kinematics. - */ - void sensorless_homing_per_axis(const AxisEnum axis, const bool enable=true) { - switch (axis) { - #if X_SENSORLESS - case X_AXIS: - tmc_sensorless_homing(stepperX, enable); - #if CORE_IS_XY && Y_SENSORLESS - tmc_sensorless_homing(stepperY, enable); - #elif CORE_IS_XZ && Z_SENSORLESS - tmc_sensorless_homing(stepperZ, enable); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - tmc_sensorless_homing(stepperY, enable); - #if CORE_IS_XY && X_SENSORLESS - tmc_sensorless_homing(stepperX, enable); - #elif CORE_IS_YZ && Z_SENSORLESS - tmc_sensorless_homing(stepperZ, enable); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - tmc_sensorless_homing(stepperZ, enable); - #if CORE_IS_XZ && X_SENSORLESS - tmc_sensorless_homing(stepperX, enable); - #elif CORE_IS_YZ && Y_SENSORLESS - tmc_sensorless_homing(stepperY, enable); - #endif - break; - #endif - default: break; - } - } - -#endif // SENSORLESS_HOMING - -/** - * Home an individual linear axis - */ -static void do_homing_move(const AxisEnum axis, const float distance, const float fr_mm_s=0.0) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR(">>> do_homing_move(", axis_codes[axis]); - SERIAL_ECHOPAIR(", ", distance); - SERIAL_ECHOPAIR(", ", fr_mm_s); - SERIAL_ECHOPAIR(" [", fr_mm_s ? fr_mm_s : homing_feedrate(axis)); - SERIAL_ECHOLNPGM("])"); - } - #endif - - #if HOMING_Z_WITH_PROBE && HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) - // Wait for bed to heat back up between probing points - if (axis == Z_AXIS && distance < 0 && thermalManager.isHeatingBed()) { - serialprintPGM(msg_wait_for_bed_heating); - LCD_MESSAGEPGM(MSG_BED_HEATING); - while (thermalManager.isHeatingBed()) safe_delay(200); - lcd_reset_status(); - } - #endif - - // Only do some things when moving towards an endstop - const int8_t axis_home_dir = - #if ENABLED(DUAL_X_CARRIAGE) - (axis == X_AXIS) ? x_home_dir(active_extruder) : - #endif - home_dir(axis); - const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); - - if (is_home_dir) { - - if (axis == Z_AXIS) { - #if HOMING_Z_WITH_PROBE - #if ENABLED(BLTOUCH) - set_bltouch_deployed(true); - #endif - #if QUIET_PROBING - probing_pause(true); - #endif - #endif - } - - // Disable stealthChop if used. Enable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) - sensorless_homing_per_axis(axis); - #endif - } - - // Tell the planner the axis is at 0 - current_position[axis] = 0; - - #if IS_SCARA - SYNC_PLAN_POSITION_KINEMATIC(); - current_position[axis] = distance; - inverse_kinematics(current_position); - planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); - #else - sync_plan_position(); - current_position[axis] = distance; // Set delta/cartesian axes directly - planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); - #endif - - stepper.synchronize(); - - if (is_home_dir) { - - if (axis == Z_AXIS) { - #if HOMING_Z_WITH_PROBE - #if QUIET_PROBING - probing_pause(false); - #endif - #if ENABLED(BLTOUCH) - set_bltouch_deployed(false); - #endif - #endif - } - - endstops.hit_on_purpose(); - - // Re-enable stealthChop if used. Disable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) - sensorless_homing_per_axis(axis, false); - #endif - } - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("<<< do_homing_move(", axis_codes[axis]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif -} - -/** - * Home an individual "raw axis" to its endstop. - * This applies to XYZ on Cartesian and Core robots, and - * to the individual ABC steppers on DELTA and SCARA. - * - * At the end of the procedure the axis is marked as - * homed and the current position of that axis is updated. - * Kinematic robots should wait till all axes are homed - * before updating the current position. - */ - -#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS) - -static void homeaxis(const AxisEnum axis) { - - #if IS_SCARA - // Only Z homing (with probe) is permitted - if (axis != Z_AXIS) { BUZZ(100, 880); return; } - #else - #define CAN_HOME(A) \ - (axis == A##_AXIS && ((A##_MIN_PIN > -1 && A##_HOME_DIR < 0) || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0))) - if (!CAN_HOME(X) && !CAN_HOME(Y) && !CAN_HOME(Z)) return; - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR(">>> homeaxis(", axis_codes[axis]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif - - const int axis_home_dir = - #if ENABLED(DUAL_X_CARRIAGE) - (axis == X_AXIS) ? x_home_dir(active_extruder) : - #endif - home_dir(axis); - - // Homing Z towards the bed? Deploy the Z probe or endstop. - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS && DEPLOY_PROBE()) return; - #endif - - // Set flags for X, Y, Z motor locking - #if ENABLED(X_DUAL_ENDSTOPS) - if (axis == X_AXIS) stepper.set_homing_flag_x(true); - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (axis == Y_AXIS) stepper.set_homing_flag_y(true); - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - if (axis == Z_AXIS) stepper.set_homing_flag_z(true); - #endif - - // Fast move towards endstop until triggered - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 1 Fast:"); - #endif - do_homing_move(axis, 1.5 * max_length(axis) * axis_home_dir); - - // When homing Z with probe respect probe clearance - const float bump = axis_home_dir * ( - #if HOMING_Z_WITH_PROBE - (axis == Z_AXIS && (Z_HOME_BUMP_MM)) ? max(Z_CLEARANCE_BETWEEN_PROBES, Z_HOME_BUMP_MM) : - #endif - home_bump_mm(axis) - ); - - // If a second homing move is configured... - if (bump) { - // Move away from the endstop by the axis HOME_BUMP_MM - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Move Away:"); - #endif - do_homing_move(axis, -bump - #if HOMING_Z_WITH_PROBE - , axis == Z_AXIS ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0.00 - #endif - ); - - // Slow move towards endstop until triggered - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 2 Slow:"); - #endif - do_homing_move(axis, 2 * bump, get_homing_bump_feedrate(axis)); - } - - /** - * Home axes that have dual endstops... differently - */ - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - const bool pos_dir = axis_home_dir > 0; - #if ENABLED(X_DUAL_ENDSTOPS) - if (axis == X_AXIS) { - const bool lock_x1 = pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0); - const float adj = FABS(endstops.x_endstop_adj); - if (lock_x1) stepper.set_x_lock(true); else stepper.set_x2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - if (lock_x1) stepper.set_x_lock(false); else stepper.set_x2_lock(false); - stepper.set_homing_flag_x(false); - } - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (axis == Y_AXIS) { - const bool lock_y1 = pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0); - const float adj = FABS(endstops.y_endstop_adj); - if (lock_y1) stepper.set_y_lock(true); else stepper.set_y2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - if (lock_y1) stepper.set_y_lock(false); else stepper.set_y2_lock(false); - stepper.set_homing_flag_y(false); - } - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - if (axis == Z_AXIS) { - const bool lock_z1 = pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0); - const float adj = FABS(endstops.z_endstop_adj); - if (lock_z1) stepper.set_z_lock(true); else stepper.set_z2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - if (lock_z1) stepper.set_z_lock(false); else stepper.set_z2_lock(false); - stepper.set_homing_flag_z(false); - } - #endif - #endif - - #if IS_SCARA - - set_axis_is_at_home(axis); - SYNC_PLAN_POSITION_KINEMATIC(); - - #elif ENABLED(DELTA) - - // Delta has already moved all three towers up in G28 - // so here it re-homes each tower in turn. - // Delta homing treats the axes as normal linear axes. - - // retrace by the amount specified in delta_endstop_adj + additional dist in order to have minimum steps - if (delta_endstop_adj[axis] * Z_HOME_DIR <= 0) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("delta_endstop_adj:"); - #endif - do_homing_move(axis, delta_endstop_adj[axis] - (MIN_STEPS_PER_SEGMENT + 1) * planner.steps_to_mm[axis] * Z_HOME_DIR); - } - - #else - - // For cartesian/core machines, - // set the axis to its home position - set_axis_is_at_home(axis); - sync_plan_position(); - - destination[axis] = current_position[axis]; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); - #endif - - #endif - - // Put away the Z probe - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS && STOW_PROBE()) return; - #endif - - // Clear retracted status if homing the Z axis - #if ENABLED(FWRETRACT) - if (axis == Z_AXIS) - fwretract.hop_amount = 0.0; - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("<<< homeaxis(", axis_codes[axis]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - } - #endif -} // homeaxis() - -#if ENABLED(MIXING_EXTRUDER) - - void normalize_mix() { - float mix_total = 0.0; - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]); - // Scale all values if they don't add up to ~1.0 - if (!NEAR(mix_total, 1.0)) { - SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; - } - } - - #if ENABLED(DIRECT_MIXING_IN_G1) - // Get mixing parameters from the GCode - // The total "must" be 1.0 (but it will be normalized) - // If no mix factors are given, the old mix is preserved - void gcode_get_mix() { - const char* mixing_codes = "ABCDHI"; - byte mix_bits = 0; - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) { - if (parser.seenval(mixing_codes[i])) { - SBI(mix_bits, i); - float v = parser.value_float(); - NOLESS(v, 0.0); - mixing_factor[i] = RECIPROCAL(v); - } - } - // If any mixing factors were included, clear the rest - // If none were included, preserve the last mix - if (mix_bits) { - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - if (!TEST(mix_bits, i)) mixing_factor[i] = 0.0; - normalize_mix(); - } - } - #endif - -#endif - -/** - * *************************************************************************** - * ***************************** G-CODE HANDLING ***************************** - * *************************************************************************** - */ - -/** - * Set XYZE destination and feedrate from the current GCode command - * - * - Set destination from included axis codes - * - Set to current for missing axis codes - * - Set the feedrate, if included - */ -void gcode_get_destination() { - LOOP_XYZE(i) { - if (parser.seen(axis_codes[i])) { - const float v = parser.value_axis_units((AxisEnum)i); - destination[i] = (axis_relative_modes[i] || relative_mode) - ? current_position[i] + v - : (i == E_AXIS) ? v : LOGICAL_TO_NATIVE(v, i); - } - else - destination[i] = current_position[i]; - } - - if (parser.linearval('F') > 0.0) - feedrate_mm_s = MMM_TO_MMS(parser.value_feedrate()); - - #if ENABLED(PRINTCOUNTER) - if (!DEBUGGING(DRYRUN)) - print_job_timer.incFilamentUsed(destination[E_AXIS] - current_position[E_AXIS]); - #endif - - // Get ABCDHI mixing factors - #if ENABLED(MIXING_EXTRUDER) && ENABLED(DIRECT_MIXING_IN_G1) - gcode_get_mix(); - #endif -} - -#if ENABLED(HOST_KEEPALIVE_FEATURE) - - /** - * Output a "busy" message at regular intervals - * while the machine is not accepting commands. - */ - void host_keepalive() { - const millis_t ms = millis(); - if (!suspend_auto_report && host_keepalive_interval && busy_state != NOT_BUSY) { - if (PENDING(ms, next_busy_signal_ms)) return; - switch (busy_state) { - case IN_HANDLER: - case IN_PROCESS: - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_BUSY_PROCESSING); - break; - case PAUSED_FOR_USER: - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_USER); - break; - case PAUSED_FOR_INPUT: - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_INPUT); - break; - default: - break; - } - } - next_busy_signal_ms = ms + host_keepalive_interval * 1000UL; - } - -#endif // HOST_KEEPALIVE_FEATURE - - -/************************************************** - ***************** GCode Handlers ***************** - **************************************************/ - -#if ENABLED(NO_MOTION_BEFORE_HOMING) - #define G0_G1_CONDITION !axis_unhomed_error(parser.seen('X'), parser.seen('Y'), parser.seen('Z')) -#else - #define G0_G1_CONDITION true -#endif - -/** - * G0, G1: Coordinated movement of X Y Z E axes - */ -inline void gcode_G0_G1( - #if IS_SCARA - bool fast_move=false - #endif -) { - if (IsRunning() && G0_G1_CONDITION) { - gcode_get_destination(); // For X Y Z E F - - #if ENABLED(FWRETRACT) - if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { - // When M209 Autoretract is enabled, convert E-only moves to firmware retract/prime moves - if (fwretract.autoretract_enabled && parser.seen('E') && !(parser.seen('X') || parser.seen('Y') || parser.seen('Z'))) { - const float echange = destination[E_AXIS] - current_position[E_AXIS]; - // Is this a retract or prime move? - if (WITHIN(FABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) { - current_position[E_AXIS] = destination[E_AXIS]; // Hide a G1-based retract/prime from calculations - sync_plan_position_e(); // AND from the planner - return fwretract.retract(echange < 0.0); // Firmware-based retract/prime (double-retract ignored) - } - } - } - #endif // FWRETRACT - - #if IS_SCARA - fast_move ? prepare_uninterpolated_move_to_destination() : prepare_move_to_destination(); - #else - prepare_move_to_destination(); - #endif - - #if ENABLED(NANODLP_Z_SYNC) - #if ENABLED(NANODLP_ALL_AXIS) - #define _MOVE_SYNC parser.seenval('X') || parser.seenval('Y') || parser.seenval('Z') // For any move wait and output sync message - #else - #define _MOVE_SYNC parser.seenval('Z') // Only for Z move - #endif - if (_MOVE_SYNC) { - stepper.synchronize(); - SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); - } - #endif - } -} - -/** - * G2: Clockwise Arc - * G3: Counterclockwise Arc - * - * This command has two forms: IJ-form and R-form. - * - * - I specifies an X offset. J specifies a Y offset. - * At least one of the IJ parameters is required. - * X and Y can be omitted to do a complete circle. - * The given XY is not error-checked. The arc ends - * based on the angle of the destination. - * Mixing I or J with R will throw an error. - * - * - R specifies the radius. X or Y is required. - * Omitting both X and Y will throw an error. - * X or Y must differ from the current XY. - * Mixing R with I or J will throw an error. - * - * - P specifies the number of full circles to do - * before the specified arc move. - * - * Examples: - * - * G2 I10 ; CW circle centered at X+10 - * G3 X20 Y12 R14 ; CCW circle with r=14 ending at X20 Y12 - */ -#if ENABLED(ARC_SUPPORT) - - inline void gcode_G2_G3(const bool clockwise) { - #if ENABLED(NO_MOTION_BEFORE_HOMING) - if (axis_unhomed_error()) return; - #endif - - if (IsRunning()) { - - #if ENABLED(SF_ARC_FIX) - const bool relative_mode_backup = relative_mode; - relative_mode = true; - #endif - - gcode_get_destination(); - - #if ENABLED(SF_ARC_FIX) - relative_mode = relative_mode_backup; - #endif - - float arc_offset[2] = { 0.0, 0.0 }; - if (parser.seenval('R')) { - const float r = parser.value_linear_units(), - p1 = current_position[X_AXIS], q1 = current_position[Y_AXIS], - p2 = destination[X_AXIS], q2 = destination[Y_AXIS]; - if (r && (p2 != p1 || q2 != q1)) { - const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 - dx = p2 - p1, dy = q2 - q1, // X and Y differences - d = HYPOT(dx, dy), // Linear distance between the points - h = SQRT(sq(r) - sq(d * 0.5)), // Distance to the arc pivot-point - mx = (p1 + p2) * 0.5, my = (q1 + q2) * 0.5, // Point between the two points - sx = -dy / d, sy = dx / d, // Slope of the perpendicular bisector - cx = mx + e * h * sx, cy = my + e * h * sy; // Pivot-point of the arc - arc_offset[0] = cx - p1; - arc_offset[1] = cy - q1; - } - } - else { - if (parser.seenval('I')) arc_offset[0] = parser.value_linear_units(); - if (parser.seenval('J')) arc_offset[1] = parser.value_linear_units(); - } - - if (arc_offset[0] || arc_offset[1]) { - - #if ENABLED(ARC_P_CIRCLES) - // P indicates number of circles to do - int8_t circles_to_do = parser.byteval('P'); - if (!WITHIN(circles_to_do, 0, 100)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); - } - while (circles_to_do--) - plan_arc(current_position, arc_offset, clockwise); - #endif - - // Send the arc to the planner - plan_arc(destination, arc_offset, clockwise); - } - else { - // Bad arguments - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); - } - } - } - -#endif // ARC_SUPPORT - -void dwell(millis_t time) { - time += millis(); - while (PENDING(millis(), time)) idle(); -} - -/** - * G4: Dwell S or P - */ -inline void gcode_G4() { - millis_t dwell_ms = 0; - - if (parser.seenval('P')) dwell_ms = parser.value_millis(); // milliseconds to wait - if (parser.seenval('S')) dwell_ms = parser.value_millis_from_seconds(); // seconds to wait - - stepper.synchronize(); - #if ENABLED(NANODLP_Z_SYNC) - SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); - #endif - - if (!lcd_hasstatus()) LCD_MESSAGEPGM(MSG_DWELL); - - dwell(dwell_ms); -} - -#if ENABLED(BEZIER_CURVE_SUPPORT) - - /** - * Parameters interpreted according to: - * http://linuxcnc.org/docs/2.6/html/gcode/gcode.html#sec:G5-Cubic-Spline - * However I, J omission is not supported at this point; all - * parameters can be omitted and default to zero. - */ - - /** - * G5: Cubic B-spline - */ - inline void gcode_G5() { - #if ENABLED(NO_MOTION_BEFORE_HOMING) - if (axis_unhomed_error()) return; - #endif - - if (IsRunning()) { - - #if ENABLED(CNC_WORKSPACE_PLANES) - if (workspace_plane != PLANE_XY) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_BAD_PLANE_MODE); - return; - } - #endif - - gcode_get_destination(); - - const float offset[] = { - parser.linearval('I'), - parser.linearval('J'), - parser.linearval('P'), - parser.linearval('Q') - }; - - plan_cubic_move(offset); - } - } - -#endif // BEZIER_CURVE_SUPPORT - -#if ENABLED(FWRETRACT) - - /** - * G10 - Retract filament according to settings of M207 - */ - inline void gcode_G10() { - #if EXTRUDERS > 1 - const bool rs = parser.boolval('S'); - #endif - fwretract.retract(true - #if EXTRUDERS > 1 - , rs - #endif - ); - } - - /** - * G11 - Recover filament according to settings of M208 - */ - inline void gcode_G11() { fwretract.retract(false); } - -#endif // FWRETRACT - -#if ENABLED(NOZZLE_CLEAN_FEATURE) - /** - * G12: Clean the nozzle - */ - inline void gcode_G12() { - // Don't allow nozzle cleaning without homing first - if (axis_unhomed_error()) return; - - const uint8_t pattern = parser.ushortval('P', 0), - strokes = parser.ushortval('S', NOZZLE_CLEAN_STROKES), - objects = parser.ushortval('T', NOZZLE_CLEAN_TRIANGLES); - const float radius = parser.floatval('R', NOZZLE_CLEAN_CIRCLE_RADIUS); - - Nozzle::clean(pattern, strokes, radius, objects); - } -#endif - -#if ENABLED(CNC_WORKSPACE_PLANES) - - inline void report_workspace_plane() { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Workspace Plane "); - serialprintPGM( - workspace_plane == PLANE_YZ ? PSTR("YZ\n") : - workspace_plane == PLANE_ZX ? PSTR("ZX\n") : - PSTR("XY\n") - ); - } - - inline void set_workspace_plane(const WorkspacePlane plane) { - workspace_plane = plane; - if (DEBUGGING(INFO)) report_workspace_plane(); - } - - /** - * G17: Select Plane XY - * G18: Select Plane ZX - * G19: Select Plane YZ - */ - inline void gcode_G17() { set_workspace_plane(PLANE_XY); } - inline void gcode_G18() { set_workspace_plane(PLANE_ZX); } - inline void gcode_G19() { set_workspace_plane(PLANE_YZ); } - -#endif // CNC_WORKSPACE_PLANES - -#if ENABLED(CNC_COORDINATE_SYSTEMS) - - /** - * Select a coordinate system and update the workspace offset. - * System index -1 is used to specify machine-native. - */ - bool select_coordinate_system(const int8_t _new) { - if (active_coordinate_system == _new) return false; - float old_offset[XYZ] = { 0 }, new_offset[XYZ] = { 0 }; - if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) - COPY(old_offset, coordinate_system[active_coordinate_system]); - if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1)) - COPY(new_offset, coordinate_system[_new]); - active_coordinate_system = _new; - LOOP_XYZ(i) { - const float diff = new_offset[i] - old_offset[i]; - if (diff) { - position_shift[i] += diff; - update_software_endstops((AxisEnum)i); - } - } - return true; - } - - /** - * G53: Apply native workspace to the current move - * - * In CNC G-code G53 is a modifier. - * It precedes a movement command (or other modifiers) on the same line. - * This is the first command to use parser.chain() to make this possible. - * - * Marlin also uses G53 on a line by itself to go back to native space. - */ - inline void gcode_G53() { - const int8_t _system = active_coordinate_system; - active_coordinate_system = -1; - if (parser.chain()) { // If this command has more following... - process_parsed_command(); - active_coordinate_system = _system; - } - } - - /** - * G54-G59.3: Select a new workspace - * - * A workspace is an XYZ offset to the machine native space. - * All workspaces default to 0,0,0 at start, or with EEPROM - * support they may be restored from a previous session. - * - * G92 is used to set the current workspace's offset. - */ - inline void gcode_G54_59(uint8_t subcode=0) { - const int8_t _space = parser.codenum - 54 + subcode; - if (select_coordinate_system(_space)) { - SERIAL_PROTOCOLLNPAIR("Select workspace ", _space); - report_current_position(); - } - } - FORCE_INLINE void gcode_G54() { gcode_G54_59(); } - FORCE_INLINE void gcode_G55() { gcode_G54_59(); } - FORCE_INLINE void gcode_G56() { gcode_G54_59(); } - FORCE_INLINE void gcode_G57() { gcode_G54_59(); } - FORCE_INLINE void gcode_G58() { gcode_G54_59(); } - FORCE_INLINE void gcode_G59() { gcode_G54_59(parser.subcode); } - -#endif - -#if ENABLED(INCH_MODE_SUPPORT) - /** - * G20: Set input mode to inches - */ - inline void gcode_G20() { parser.set_input_linear_units(LINEARUNIT_INCH); } - - /** - * G21: Set input mode to millimeters - */ - inline void gcode_G21() { parser.set_input_linear_units(LINEARUNIT_MM); } -#endif - -#if ENABLED(NOZZLE_PARK_FEATURE) - /** - * G27: Park the nozzle - */ - inline void gcode_G27() { - // Don't allow nozzle parking without homing first - if (axis_unhomed_error()) return; - Nozzle::park(parser.ushortval('P')); - } -#endif // NOZZLE_PARK_FEATURE - -#if ENABLED(QUICK_HOME) - - static void quick_home_xy() { - - // Pretend the current position is 0,0 - current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; - sync_plan_position(); - - const int x_axis_home_dir = - #if ENABLED(DUAL_X_CARRIAGE) - x_home_dir(active_extruder) - #else - home_dir(X_AXIS) - #endif - ; - - const float mlx = max_length(X_AXIS), - mly = max_length(Y_AXIS), - mlratio = mlx > mly ? mly / mlx : mlx / mly, - fr_mm_s = min(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * SQRT(sq(mlratio) + 1.0); - - #if ENABLED(SENSORLESS_HOMING) - sensorless_homing_per_axis(X_AXIS); - sensorless_homing_per_axis(Y_AXIS); - #endif - - do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); - endstops.hit_on_purpose(); // clear endstop hit flags - current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; - - #if ENABLED(SENSORLESS_HOMING) - sensorless_homing_per_axis(X_AXIS, false); - sensorless_homing_per_axis(Y_AXIS, false); - #endif - } - -#endif // QUICK_HOME - -#if ENABLED(DEBUG_LEVELING_FEATURE) - - void log_machine_info() { - SERIAL_ECHOPGM("Machine Type: "); - #if ENABLED(DELTA) - SERIAL_ECHOLNPGM("Delta"); - #elif IS_SCARA - SERIAL_ECHOLNPGM("SCARA"); - #elif IS_CORE - SERIAL_ECHOLNPGM("Core"); - #else - SERIAL_ECHOLNPGM("Cartesian"); - #endif - - SERIAL_ECHOPGM("Probe: "); - #if ENABLED(PROBE_MANUALLY) - SERIAL_ECHOLNPGM("PROBE_MANUALLY"); - #elif ENABLED(FIX_MOUNTED_PROBE) - SERIAL_ECHOLNPGM("FIX_MOUNTED_PROBE"); - #elif ENABLED(BLTOUCH) - SERIAL_ECHOLNPGM("BLTOUCH"); - #elif HAS_Z_SERVO_PROBE - SERIAL_ECHOLNPGM("SERVO PROBE"); - #elif ENABLED(Z_PROBE_SLED) - SERIAL_ECHOLNPGM("Z_PROBE_SLED"); - #elif ENABLED(Z_PROBE_ALLEN_KEY) - SERIAL_ECHOLNPGM("Z_PROBE_ALLEN_KEY"); - #else - SERIAL_ECHOLNPGM("NONE"); - #endif - - #if HAS_BED_PROBE - SERIAL_ECHOPAIR("Probe Offset X:", X_PROBE_OFFSET_FROM_EXTRUDER); - SERIAL_ECHOPAIR(" Y:", Y_PROBE_OFFSET_FROM_EXTRUDER); - SERIAL_ECHOPAIR(" Z:", zprobe_zoffset); - #if X_PROBE_OFFSET_FROM_EXTRUDER > 0 - SERIAL_ECHOPGM(" (Right"); - #elif X_PROBE_OFFSET_FROM_EXTRUDER < 0 - SERIAL_ECHOPGM(" (Left"); - #elif Y_PROBE_OFFSET_FROM_EXTRUDER != 0 - SERIAL_ECHOPGM(" (Middle"); - #else - SERIAL_ECHOPGM(" (Aligned With"); - #endif - #if Y_PROBE_OFFSET_FROM_EXTRUDER > 0 - SERIAL_ECHOPGM("-Back"); - #elif Y_PROBE_OFFSET_FROM_EXTRUDER < 0 - SERIAL_ECHOPGM("-Front"); - #elif X_PROBE_OFFSET_FROM_EXTRUDER != 0 - SERIAL_ECHOPGM("-Center"); - #endif - if (zprobe_zoffset < 0) - SERIAL_ECHOPGM(" & Below"); - else if (zprobe_zoffset > 0) - SERIAL_ECHOPGM(" & Above"); - else - SERIAL_ECHOPGM(" & Same Z as"); - SERIAL_ECHOLNPGM(" Nozzle)"); - #endif - - #if HAS_ABL - SERIAL_ECHOPGM("Auto Bed Leveling: "); - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - SERIAL_ECHOPGM("LINEAR"); - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - SERIAL_ECHOPGM("BILINEAR"); - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - SERIAL_ECHOPGM("3POINT"); - #elif ENABLED(AUTO_BED_LEVELING_UBL) - SERIAL_ECHOPGM("UBL"); - #endif - if (planner.leveling_active) { - SERIAL_ECHOLNPGM(" (enabled)"); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (planner.z_fade_height) - SERIAL_ECHOLNPAIR("Z Fade: ", planner.z_fade_height); - #endif - #if ABL_PLANAR - const float diff[XYZ] = { - stepper.get_axis_position_mm(X_AXIS) - current_position[X_AXIS], - stepper.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS], - stepper.get_axis_position_mm(Z_AXIS) - current_position[Z_AXIS] - }; - SERIAL_ECHOPGM("ABL Adjustment X"); - if (diff[X_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[X_AXIS]); - SERIAL_ECHOPGM(" Y"); - if (diff[Y_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[Y_AXIS]); - SERIAL_ECHOPGM(" Z"); - if (diff[Z_AXIS] > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(diff[Z_AXIS]); - #else - #if ENABLED(AUTO_BED_LEVELING_UBL) - SERIAL_ECHOPGM("UBL Adjustment Z"); - const float rz = ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]); - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - SERIAL_ECHOPAIR("Bilinear Grid X", bilinear_start[X_AXIS]); - SERIAL_ECHOPAIR(" Y", bilinear_start[Y_AXIS]); - SERIAL_ECHOPAIR(" W", ABL_BG_SPACING(X_AXIS)); - SERIAL_ECHOLNPAIR(" H", ABL_BG_SPACING(Y_AXIS)); - SERIAL_ECHOPGM("ABL Adjustment Z"); - const float rz = bilinear_z_offset(current_position); - #endif - SERIAL_ECHO(ftostr43sign(rz, '+')); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (planner.z_fade_height) { - SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position[Z_AXIS]), '+')); - SERIAL_CHAR(')'); - } - #endif - #endif - } - else - SERIAL_ECHOLNPGM(" (disabled)"); - - SERIAL_EOL(); - - #elif ENABLED(MESH_BED_LEVELING) - - SERIAL_ECHOPGM("Mesh Bed Leveling"); - if (planner.leveling_active) { - SERIAL_ECHOLNPGM(" (enabled)"); - SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS], 1.0), '+')); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (planner.z_fade_height) { - SERIAL_ECHOPAIR(" (", ftostr43sign( - mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS], planner.fade_scaling_factor_for_z(current_position[Z_AXIS])), '+' - )); - SERIAL_CHAR(')'); - } - #endif - } - else - SERIAL_ECHOPGM(" (disabled)"); - - SERIAL_EOL(); - - #endif // MESH_BED_LEVELING - } - -#endif // DEBUG_LEVELING_FEATURE - -#if ENABLED(DELTA) - - #if ENABLED(SENSORLESS_HOMING) - inline void delta_sensorless_homing(const bool on=true) { - sensorless_homing_per_axis(A_AXIS, on); - sensorless_homing_per_axis(B_AXIS, on); - sensorless_homing_per_axis(C_AXIS, on); - } - #endif - - /** - * A delta can only safely home all axes at the same time - * This is like quick_home_xy() but for 3 towers. - */ - inline bool home_delta() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); - #endif - // Init the current position of all carriages to 0,0,0 - ZERO(current_position); - sync_plan_position(); - - // Disable stealthChop if used. Enable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) - delta_sensorless_homing(); - #endif - - // Move all carriages together linearly until an endstop is hit. - current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (delta_height + 10); - feedrate_mm_s = homing_feedrate(X_AXIS); - buffer_line_to_current_position(); - stepper.synchronize(); - - // Re-enable stealthChop if used. Disable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) - delta_sensorless_homing(false); - #endif - - // If an endstop was not hit, then damage can occur if homing is continued. - // This can occur if the delta height not set correctly. - if (!(Endstops::endstop_hit_bits & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX)))) { - LCD_MESSAGEPGM(MSG_ERR_HOMING_FAILED); - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_HOMING_FAILED); - return false; - } - - endstops.hit_on_purpose(); // clear endstop hit flags - - // At least one carriage has reached the top. - // Now re-home each carriage separately. - HOMEAXIS(A); - HOMEAXIS(B); - HOMEAXIS(C); - - // Set all carriages to their home positions - // Do this here all at once for Delta, because - // XYZ isn't ABC. Applying this per-tower would - // give the impression that they are the same. - LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); - - SYNC_PLAN_POSITION_KINEMATIC(); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); - #endif - - return true; - } - -#endif // DELTA - -#ifdef Z_AFTER_PROBING - void move_z_after_probing() { - if (current_position[Z_AXIS] != Z_AFTER_PROBING) { - do_blocking_move_to_z(Z_AFTER_PROBING); - current_position[Z_AXIS] = Z_AFTER_PROBING; - } - } -#endif - -#if ENABLED(Z_SAFE_HOMING) - - inline void home_z_safely() { - - // Disallow Z homing if X or Y are unknown - if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) { - LCD_MESSAGEPGM(MSG_ERR_Z_HOMING); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_ERR_Z_HOMING); - return; - } - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Z_SAFE_HOMING >>>"); - #endif - - SYNC_PLAN_POSITION_KINEMATIC(); - - /** - * Move the Z probe (or just the nozzle) to the safe homing point - */ - destination[X_AXIS] = Z_SAFE_HOMING_X_POINT; - destination[Y_AXIS] = Z_SAFE_HOMING_Y_POINT; - destination[Z_AXIS] = current_position[Z_AXIS]; // Z is already at the right height - - #if HOMING_Z_WITH_PROBE - destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; - destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; - #endif - - if (position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("Z_SAFE_HOMING", destination); - #endif - - // This causes the carriage on Dual X to unpark - #if ENABLED(DUAL_X_CARRIAGE) - active_extruder_parked = false; - #endif - - #if ENABLED(SENSORLESS_HOMING) - safe_delay(500); // Short delay needed to settle - #endif - - do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]); - HOMEAXIS(Z); - } - else { - LCD_MESSAGEPGM(MSG_ZPROBE_OUT); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT); - } - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< Z_SAFE_HOMING"); - #endif - } - -#endif // Z_SAFE_HOMING - -#if ENABLED(PROBE_MANUALLY) - bool g29_in_progress = false; -#else - constexpr bool g29_in_progress = false; -#endif - -/** - * G28: Home all axes according to settings - * - * Parameters - * - * None Home to all axes with no parameters. - * With QUICK_HOME enabled XY will home together, then Z. - * - * Rn Raise by n mm/inches before homing - * - * Cartesian parameters - * - * X Home to the X endstop - * Y Home to the Y endstop - * Z Home to the Z endstop - * - */ -inline void gcode_G28(const bool always_home_all) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPGM(">>> gcode_G28"); - log_machine_info(); - } - #endif - - // Wait for planner moves to finish! - stepper.synchronize(); - - // Cancel the active G29 session - #if ENABLED(PROBE_MANUALLY) - g29_in_progress = false; - #endif - - // Disable the leveling matrix before homing - #if HAS_LEVELING - #if ENABLED(RESTORE_LEVELING_AFTER_G28) - const bool leveling_was_active = planner.leveling_active; - #endif - set_bed_leveling_enabled(false); - #endif - - #if ENABLED(CNC_WORKSPACE_PLANES) - workspace_plane = PLANE_XY; - #endif - - // Always home with tool 0 active - #if HOTENDS > 1 - #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) - const uint8_t old_tool_index = active_extruder; - #endif - tool_change(0, 0, true); - #endif - - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - extruder_duplication_enabled = false; - #endif - - setup_for_endstop_or_probe_move(); - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> endstops.enable(true)"); - #endif - endstops.enable(true); // Enable endstops for next homing move - - #if ENABLED(DELTA) - - home_delta(); - UNUSED(always_home_all); - - #else // NOT DELTA - - const bool homeX = always_home_all || parser.seen('X'), - homeY = always_home_all || parser.seen('Y'), - homeZ = always_home_all || parser.seen('Z'), - home_all = (!homeX && !homeY && !homeZ) || (homeX && homeY && homeZ); - - set_destination_from_current(); - - #if Z_HOME_DIR > 0 // If homing away from BED do Z first - - if (home_all || homeZ) HOMEAXIS(Z); - - #endif - - const float z_homing_height = ( - #if ENABLED(UNKNOWN_Z_NO_RAISE) - !axis_known_position[Z_AXIS] ? 0 : - #endif - (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) - ); - - if (z_homing_height && (home_all || homeX || homeY)) { - // Raise Z before homing any other axes and z is not already high enough (never lower z) - destination[Z_AXIS] = z_homing_height; - if (destination[Z_AXIS] > current_position[Z_AXIS]) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) - SERIAL_ECHOLNPAIR("Raise Z (before homing) to ", destination[Z_AXIS]); - #endif - - do_blocking_move_to_z(destination[Z_AXIS]); - } - } - - #if ENABLED(QUICK_HOME) - - if (home_all || (homeX && homeY)) quick_home_xy(); - - #endif - - // Home Y (before X) - #if ENABLED(HOME_Y_BEFORE_X) - - if (home_all || homeY - #if ENABLED(CODEPENDENT_XY_HOMING) - || homeX - #endif - ) HOMEAXIS(Y); - - #endif - - // Home X - if (home_all || homeX - #if ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X) - || homeY - #endif - ) { - - #if ENABLED(DUAL_X_CARRIAGE) - - // Always home the 2nd (right) extruder first - active_extruder = 1; - HOMEAXIS(X); - - // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position[X_AXIS]; - - // Home the 1st (left) extruder - active_extruder = 0; - HOMEAXIS(X); - - // Consider the active extruder to be parked - COPY(raised_parked_position, current_position); - delayed_move_time = 0; - active_extruder_parked = true; - - #else - - HOMEAXIS(X); - - #endif - } - - // Home Y (after X) - #if DISABLED(HOME_Y_BEFORE_X) - if (home_all || homeY) HOMEAXIS(Y); - #endif - - // Home Z last if homing towards the bed - #if Z_HOME_DIR < 0 - if (home_all || homeZ) { - #if ENABLED(Z_SAFE_HOMING) - home_z_safely(); - #else - HOMEAXIS(Z); - #endif - - #if HOMING_Z_WITH_PROBE && defined(Z_AFTER_PROBING) - move_z_after_probing(); - #endif - - } // home_all || homeZ - #endif // Z_HOME_DIR < 0 - - SYNC_PLAN_POSITION_KINEMATIC(); - - #endif // !DELTA (gcode_G28) - - endstops.not_homing(); - - #if ENABLED(DELTA) && ENABLED(DELTA_HOME_TO_SAFE_ZONE) - // move to a height where we can use the full xy-area - do_blocking_move_to_z(delta_clip_start_height); - #endif - - #if ENABLED(RESTORE_LEVELING_AFTER_G28) - set_bed_leveling_enabled(leveling_was_active); - #endif - - clean_up_after_endstop_or_probe_move(); - - // Restore the active tool after homing - #if HOTENDS > 1 && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) - #if ENABLED(PARKING_EXTRUDER) - #define NO_FETCH false // fetch the previous toolhead - #else - #define NO_FETCH true - #endif - tool_change(old_tool_index, 0, NO_FETCH); - #endif - - lcd_refresh(); - - report_current_position(); - - #if ENABLED(NANODLP_Z_SYNC) - #if ENABLED(NANODLP_ALL_AXIS) - #define _HOME_SYNC true // For any axis, output sync text. - #else - #define _HOME_SYNC (home_all || homeZ) // Only for Z-axis - #endif - if (_HOME_SYNC) - SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< gcode_G28"); - #endif -} // G28 - -void home_all_axes() { gcode_G28(true); } - -#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) - - inline void _manual_goto_xy(const float &rx, const float &ry) { - - #if MANUAL_PROBE_HEIGHT > 0 - const float prev_z = current_position[Z_AXIS]; - do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); - do_blocking_move_to_z(prev_z); - #else - do_blocking_move_to_xy(rx, ry); - #endif - - current_position[X_AXIS] = rx; - current_position[Y_AXIS] = ry; - - #if ENABLED(LCD_BED_LEVELING) - lcd_wait_for_move = false; - #endif - } - -#endif - -#if ENABLED(MESH_BED_LEVELING) - - // Save 130 bytes with non-duplication of PSTR - void echo_not_entered() { SERIAL_PROTOCOLLNPGM(" not entered."); } - - /** - * G29: Mesh-based Z probe, probes a grid and produces a - * mesh to compensate for variable bed height - * - * Parameters With MESH_BED_LEVELING: - * - * S0 Produce a mesh report - * S1 Start probing mesh points - * S2 Probe the next mesh point - * S3 Xn Yn Zn.nn Manually modify a single point - * S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed. - * S5 Reset and disable mesh - * - * The S0 report the points as below - * - * +----> X-axis 1-n - * | - * | - * v Y-axis 1-n - * - */ - inline void gcode_G29() { - - static int mbl_probe_index = -1; - #if HAS_SOFTWARE_ENDSTOPS - static bool enable_soft_endstops; - #endif - - MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); - if (!WITHIN(state, 0, 5)) { - SERIAL_PROTOCOLLNPGM("S out of range (0-5)."); - return; - } - - int8_t px, py; - - switch (state) { - case MeshReport: - if (leveling_is_valid()) { - SERIAL_PROTOCOLLNPAIR("State: ", planner.leveling_active ? MSG_ON : MSG_OFF); - mbl.report_mesh(); - } - else - SERIAL_PROTOCOLLNPGM("Mesh bed leveling has no data."); - break; - - case MeshStart: - mbl.reset(); - mbl_probe_index = 0; - if (!lcd_wait_for_move) { - enqueue_and_echo_commands_P(PSTR("G28\nG29 S2")); - return; - } - state = MeshNext; - - case MeshNext: - if (mbl_probe_index < 0) { - SERIAL_PROTOCOLLNPGM("Start mesh probing with \"G29 S1\" first."); - return; - } - // For each G29 S2... - if (mbl_probe_index == 0) { - #if HAS_SOFTWARE_ENDSTOPS - // For the initial G29 S2 save software endstop state - enable_soft_endstops = soft_endstops_enabled; - #endif - // Move close to the bed before the first point - do_blocking_move_to_z(0); - } - else { - // Save Z for the previous mesh position - mbl.set_zigzag_z(mbl_probe_index - 1, current_position[Z_AXIS]); - #if HAS_SOFTWARE_ENDSTOPS - soft_endstops_enabled = enable_soft_endstops; - #endif - } - // If there's another point to sample, move there with optional lift. - if (mbl_probe_index < GRID_MAX_POINTS) { - #if HAS_SOFTWARE_ENDSTOPS - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - soft_endstops_enabled = false; - #endif - - mbl.zigzag(mbl_probe_index++, px, py); - _manual_goto_xy(mbl.index_to_xpos[px], mbl.index_to_ypos[py]); - } - else { - // One last "return to the bed" (as originally coded) at completion - current_position[Z_AXIS] = MANUAL_PROBE_HEIGHT; - buffer_line_to_current_position(); - stepper.synchronize(); - - // After recording the last point, activate home and activate - mbl_probe_index = -1; - SERIAL_PROTOCOLLNPGM("Mesh probing done."); - BUZZ(100, 659); - BUZZ(100, 698); - - home_all_axes(); - set_bed_leveling_enabled(true); - - #if ENABLED(MESH_G28_REST_ORIGIN) - current_position[Z_AXIS] = 0; - set_destination_from_current(); - buffer_line_to_destination(homing_feedrate(Z_AXIS)); - stepper.synchronize(); - #endif - - #if ENABLED(LCD_BED_LEVELING) - lcd_wait_for_move = false; - #endif - } - break; - - case MeshSet: - if (parser.seenval('X')) { - px = parser.value_int() - 1; - if (!WITHIN(px, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_PROTOCOLLNPGM("X out of range (1-" STRINGIFY(GRID_MAX_POINTS_X) ")."); - return; - } - } - else { - SERIAL_CHAR('X'); echo_not_entered(); - return; - } - - if (parser.seenval('Y')) { - py = parser.value_int() - 1; - if (!WITHIN(py, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_PROTOCOLLNPGM("Y out of range (1-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); - return; - } - } - else { - SERIAL_CHAR('Y'); echo_not_entered(); - return; - } - - if (parser.seenval('Z')) - mbl.z_values[px][py] = parser.value_linear_units(); - else { - SERIAL_CHAR('Z'); echo_not_entered(); - return; - } - break; - - case MeshSetZOffset: - if (parser.seenval('Z')) - mbl.z_offset = parser.value_linear_units(); - else { - SERIAL_CHAR('Z'); echo_not_entered(); - return; - } - break; - - case MeshReset: - reset_bed_level(); - break; - - } // switch(state) - - if (state == MeshNext) { - SERIAL_PROTOCOLPAIR("MBL G29 point ", min(mbl_probe_index, GRID_MAX_POINTS)); - SERIAL_PROTOCOLLNPAIR(" of ", int(GRID_MAX_POINTS)); - } - - report_current_position(); - } - -#elif OLDSCHOOL_ABL - - #if ABL_GRID - #if ENABLED(PROBE_Y_FIRST) - #define PR_OUTER_VAR xCount - #define PR_OUTER_END abl_grid_points_x - #define PR_INNER_VAR yCount - #define PR_INNER_END abl_grid_points_y - #else - #define PR_OUTER_VAR yCount - #define PR_OUTER_END abl_grid_points_y - #define PR_INNER_VAR xCount - #define PR_INNER_END abl_grid_points_x - #endif - #endif - - /** - * G29: Detailed Z probe, probes the bed at 3 or more points. - * Will fail if the printer has not been homed with G28. - * - * Enhanced G29 Auto Bed Leveling Probe Routine - * - * D Dry-Run mode. Just evaluate the bed Topology - Don't apply - * or alter the bed level data. Useful to check the topology - * after a first run of G29. - * - * J Jettison current bed leveling data - * - * V Set the verbose level (0-4). Example: "G29 V3" - * - * Parameters With LINEAR leveling only: - * - * P Set the size of the grid that will be probed (P x P points). - * Example: "G29 P4" - * - * X Set the X size of the grid that will be probed (X x Y points). - * Example: "G29 X7 Y5" - * - * Y Set the Y size of the grid that will be probed (X x Y points). - * - * T Generate a Bed Topology Report. Example: "G29 P5 T" for a detailed report. - * This is useful for manual bed leveling and finding flaws in the bed (to - * assist with part placement). - * Not supported by non-linear delta printer bed leveling. - * - * Parameters With LINEAR and BILINEAR leveling only: - * - * S Set the XY travel speed between probe points (in units/min) - * - * F Set the Front limit of the probing grid - * B Set the Back limit of the probing grid - * L Set the Left limit of the probing grid - * R Set the Right limit of the probing grid - * - * Parameters with DEBUG_LEVELING_FEATURE only: - * - * C Make a totally fake grid with no actual probing. - * For use in testing when no probing is possible. - * - * Parameters with BILINEAR leveling only: - * - * Z Supply an additional Z probe offset - * - * Extra parameters with PROBE_MANUALLY: - * - * To do manual probing simply repeat G29 until the procedure is complete. - * The first G29 accepts parameters. 'G29 Q' for status, 'G29 A' to abort. - * - * Q Query leveling and G29 state - * - * A Abort current leveling procedure - * - * Extra parameters with BILINEAR only: - * - * W Write a mesh point. (If G29 is idle.) - * I X index for mesh point - * J Y index for mesh point - * X X for mesh point, overrides I - * Y Y for mesh point, overrides J - * Z Z for mesh point. Otherwise, raw current Z. - * - * Without PROBE_MANUALLY: - * - * E By default G29 will engage the Z probe, test the bed, then disengage. - * Include "E" to engage/disengage the Z probe for each sample. - * There's no extra effect if you have a fixed Z probe. - * - */ - inline void gcode_G29() { - - #if ENABLED(DEBUG_LEVELING_FEATURE) || ENABLED(PROBE_MANUALLY) - const bool seenQ = parser.seen('Q'); - #else - constexpr bool seenQ = false; - #endif - - // G29 Q is also available if debugging - #if ENABLED(DEBUG_LEVELING_FEATURE) - const uint8_t old_debug_flags = marlin_debug_flags; - if (seenQ) marlin_debug_flags |= DEBUG_LEVELING; - if (DEBUGGING(LEVELING)) { - DEBUG_POS(">>> G29", current_position); - log_machine_info(); - } - marlin_debug_flags = old_debug_flags; - #if DISABLED(PROBE_MANUALLY) - if (seenQ) return; - #endif - #endif - - #if ENABLED(PROBE_MANUALLY) - const bool seenA = parser.seen('A'); - #else - constexpr bool seenA = false; - #endif - - const bool no_action = seenA || seenQ, - faux = - #if ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) - parser.boolval('C') - #else - no_action - #endif - ; - - // Don't allow auto-leveling without homing first - if (axis_unhomed_error()) return; - - // Define local vars 'static' for manual probing, 'auto' otherwise - #if ENABLED(PROBE_MANUALLY) - #define ABL_VAR static - #else - #define ABL_VAR - #endif - - ABL_VAR int verbose_level; - ABL_VAR float xProbe, yProbe, measured_z; - ABL_VAR bool dryrun, abl_should_enable; - - #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int16_t abl_probe_index; - #endif - - #if HAS_SOFTWARE_ENDSTOPS && ENABLED(PROBE_MANUALLY) - ABL_VAR bool enable_soft_endstops = true; - #endif - - #if ABL_GRID - - #if ENABLED(PROBE_MANUALLY) - ABL_VAR uint8_t PR_OUTER_VAR; - ABL_VAR int8_t PR_INNER_VAR; - #endif - - ABL_VAR int left_probe_bed_position, right_probe_bed_position, front_probe_bed_position, back_probe_bed_position; - ABL_VAR float xGridSpacing = 0, yGridSpacing = 0; - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR uint8_t abl_grid_points_x = GRID_MAX_POINTS_X, - abl_grid_points_y = GRID_MAX_POINTS_Y; - ABL_VAR bool do_topography_map; - #else // Bilinear - uint8_t constexpr abl_grid_points_x = GRID_MAX_POINTS_X, - abl_grid_points_y = GRID_MAX_POINTS_Y; - #endif - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int16_t abl_points; - #elif ENABLED(PROBE_MANUALLY) // Bilinear - int16_t constexpr abl_points = GRID_MAX_POINTS; - #endif - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - ABL_VAR float zoffset; - - #elif ENABLED(AUTO_BED_LEVELING_LINEAR) - - ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - - ABL_VAR float eqnAMatrix[GRID_MAX_POINTS * 3], // "A" matrix of the linear system of equations - eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points - mean; - #endif - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - #if ENABLED(PROBE_MANUALLY) - int8_t constexpr abl_points = 3; // used to show total points - #endif - - // Probe at 3 arbitrary points - ABL_VAR vector_3 points[3] = { - vector_3(PROBE_PT_1_X, PROBE_PT_1_Y, 0), - vector_3(PROBE_PT_2_X, PROBE_PT_2_Y, 0), - vector_3(PROBE_PT_3_X, PROBE_PT_3_Y, 0) - }; - - #endif // AUTO_BED_LEVELING_3POINT - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - struct linear_fit_data lsf_results; - incremental_LSF_reset(&lsf_results); - #endif - - /** - * On the initial G29 fetch command parameters. - */ - if (!g29_in_progress) { - - #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) - abl_probe_index = -1; - #endif - - abl_should_enable = planner.leveling_active; - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - const bool seen_w = parser.seen('W'); - if (seen_w) { - if (!leveling_is_valid()) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("No bilinear grid"); - return; - } - - const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position[Z_AXIS]; - if (!WITHIN(rz, -10, 10)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Bad Z value"); - return; - } - - const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), - ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); - int8_t i = parser.byteval('I', -1), - j = parser.byteval('J', -1); - - if (!isnan(rx) && !isnan(ry)) { - // Get nearest i / j from rx / ry - i = (rx - bilinear_start[X_AXIS] + 0.5 * xGridSpacing) / xGridSpacing; - j = (ry - bilinear_start[Y_AXIS] + 0.5 * yGridSpacing) / yGridSpacing; - i = constrain(i, 0, GRID_MAX_POINTS_X - 1); - j = constrain(j, 0, GRID_MAX_POINTS_Y - 1); - } - if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { - set_bed_leveling_enabled(false); - z_values[i][j] = rz; - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - bed_level_virt_interpolate(); - #endif - set_bed_leveling_enabled(abl_should_enable); - if (abl_should_enable) report_current_position(); - } - return; - } // parser.seen('W') - - #else - - constexpr bool seen_w = false; - - #endif - - // Jettison bed leveling data - if (!seen_w && parser.seen('J')) { - reset_bed_level(); - return; - } - - verbose_level = parser.intval('V'); - if (!WITHIN(verbose_level, 0, 4)) { - SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); - return; - } - - dryrun = parser.boolval('D') - #if ENABLED(PROBE_MANUALLY) - || no_action - #endif - ; - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - - do_topography_map = verbose_level > 2 || parser.boolval('T'); - - // X and Y specify points in each direction, overriding the default - // These values may be saved with the completed mesh - abl_grid_points_x = parser.intval('X', GRID_MAX_POINTS_X); - abl_grid_points_y = parser.intval('Y', GRID_MAX_POINTS_Y); - if (parser.seenval('P')) abl_grid_points_x = abl_grid_points_y = parser.value_int(); - - if (!WITHIN(abl_grid_points_x, 2, GRID_MAX_POINTS_X)) { - SERIAL_PROTOCOLLNPGM("?Probe points (X) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); - return; - } - if (!WITHIN(abl_grid_points_y, 2, GRID_MAX_POINTS_Y)) { - SERIAL_PROTOCOLLNPGM("?Probe points (Y) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); - return; - } - - abl_points = abl_grid_points_x * abl_grid_points_y; - mean = 0; - - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - zoffset = parser.linearval('Z'); - - #endif - - #if ABL_GRID - - xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); - - left_probe_bed_position = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : LEFT_PROBE_BED_POSITION; - right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : RIGHT_PROBE_BED_POSITION; - front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : FRONT_PROBE_BED_POSITION; - back_probe_bed_position = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : BACK_PROBE_BED_POSITION; - - if ( - #if IS_SCARA || ENABLED(DELTA) - !position_is_reachable_by_probe(left_probe_bed_position, 0) - || !position_is_reachable_by_probe(right_probe_bed_position, 0) - || !position_is_reachable_by_probe(0, front_probe_bed_position) - || !position_is_reachable_by_probe(0, back_probe_bed_position) - #else - !position_is_reachable_by_probe(left_probe_bed_position, front_probe_bed_position) - || !position_is_reachable_by_probe(right_probe_bed_position, back_probe_bed_position) - #endif - ) { - SERIAL_PROTOCOLLNPGM("? (L,R,F,B) out of bounds."); - return; - } - - // probe at the points of a lattice grid - xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (abl_grid_points_x - 1); - yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (abl_grid_points_y - 1); - - #endif // ABL_GRID - - if (verbose_level > 0) { - SERIAL_PROTOCOLPGM("G29 Auto Bed Leveling"); - if (dryrun) SERIAL_PROTOCOLPGM(" (DRYRUN)"); - SERIAL_EOL(); - } - - stepper.synchronize(); - - // Disable auto bed leveling during G29. - // Be formal so G29 can be done successively without G28. - if (!no_action) set_bed_leveling_enabled(false); - - #if HAS_BED_PROBE - // Deploy the probe. Probe will raise if needed. - if (DEPLOY_PROBE()) { - set_bed_leveling_enabled(abl_should_enable); - return; - } - #endif - - if (!faux) setup_for_endstop_or_probe_move(); - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - #if ENABLED(PROBE_MANUALLY) - if (!no_action) - #endif - if ( xGridSpacing != bilinear_grid_spacing[X_AXIS] - || yGridSpacing != bilinear_grid_spacing[Y_AXIS] - || left_probe_bed_position != bilinear_start[X_AXIS] - || front_probe_bed_position != bilinear_start[Y_AXIS] - ) { - // Reset grid to 0.0 or "not probed". (Also disables ABL) - reset_bed_level(); - - // Initialize a grid with the given dimensions - bilinear_grid_spacing[X_AXIS] = xGridSpacing; - bilinear_grid_spacing[Y_AXIS] = yGridSpacing; - bilinear_start[X_AXIS] = left_probe_bed_position; - bilinear_start[Y_AXIS] = front_probe_bed_position; - - // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; - } - - #endif // AUTO_BED_LEVELING_BILINEAR - - #if ENABLED(AUTO_BED_LEVELING_3POINT) - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> 3-point Leveling"); - #endif - - // Probe at 3 arbitrary points - points[0].z = points[1].z = points[2].z = 0; - - #endif // AUTO_BED_LEVELING_3POINT - - } // !g29_in_progress - - #if ENABLED(PROBE_MANUALLY) - - // For manual probing, get the next index to probe now. - // On the first probe this will be incremented to 0. - if (!no_action) { - ++abl_probe_index; - g29_in_progress = true; - } - - // Abort current G29 procedure, go back to idle state - if (seenA && g29_in_progress) { - SERIAL_PROTOCOLLNPGM("Manual G29 aborted"); - #if HAS_SOFTWARE_ENDSTOPS - soft_endstops_enabled = enable_soft_endstops; - #endif - set_bed_leveling_enabled(abl_should_enable); - g29_in_progress = false; - #if ENABLED(LCD_BED_LEVELING) - lcd_wait_for_move = false; - #endif - } - - // Query G29 status - if (verbose_level || seenQ) { - SERIAL_PROTOCOLPGM("Manual G29 "); - if (g29_in_progress) { - SERIAL_PROTOCOLPAIR("point ", min(abl_probe_index + 1, abl_points)); - SERIAL_PROTOCOLLNPAIR(" of ", abl_points); - } - else - SERIAL_PROTOCOLLNPGM("idle"); - } - - if (no_action) return; - - if (abl_probe_index == 0) { - // For the initial G29 save software endstop state - #if HAS_SOFTWARE_ENDSTOPS - enable_soft_endstops = soft_endstops_enabled; - #endif - // Move close to the bed before the first point - do_blocking_move_to_z(0); - } - else { - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) - const uint16_t index = abl_probe_index - 1; - #endif - - // For G29 after adjusting Z. - // Save the previous Z before going to the next point - measured_z = current_position[Z_AXIS]; - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - - mean += measured_z; - eqnBVector[index] = measured_z; - eqnAMatrix[index + 0 * abl_points] = xProbe; - eqnAMatrix[index + 1 * abl_points] = yProbe; - eqnAMatrix[index + 2 * abl_points] = 1; - - incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - points[index].z = measured_z; - - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - z_values[xCount][yCount] = measured_z + zoffset; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_PROTOCOLPAIR("Save X", xCount); - SERIAL_PROTOCOLPAIR(" Y", yCount); - SERIAL_PROTOCOLLNPAIR(" Z", measured_z + zoffset); - } - #endif - - #endif - } - - // - // If there's another point to sample, move there with optional lift. - // - - #if ABL_GRID - - // Skip any unreachable points - while (abl_probe_index < abl_points) { - - // Set xCount, yCount based on abl_probe_index, with zig-zag - PR_OUTER_VAR = abl_probe_index / PR_INNER_END; - PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); - - // Probe in reverse order for every other row/column - bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); - - if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; - - const float xBase = xCount * xGridSpacing + left_probe_bed_position, - yBase = yCount * yGridSpacing + front_probe_bed_position; - - xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); - yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - indexIntoAB[xCount][yCount] = abl_probe_index; - #endif - - // Keep looping till a reachable point is found - if (position_is_reachable(xProbe, yProbe)) break; - ++abl_probe_index; - } - - // Is there a next point to move to? - if (abl_probe_index < abl_points) { - _manual_goto_xy(xProbe, yProbe); // Can be used here too! - #if HAS_SOFTWARE_ENDSTOPS - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - soft_endstops_enabled = false; - #endif - return; - } - else { - - // Leveling done! Fall through to G29 finishing code below - - SERIAL_PROTOCOLLNPGM("Grid probing done."); - - // Re-enable software endstops, if needed - #if HAS_SOFTWARE_ENDSTOPS - soft_endstops_enabled = enable_soft_endstops; - #endif - } - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - // Probe at 3 arbitrary points - if (abl_probe_index < abl_points) { - xProbe = points[abl_probe_index].x; - yProbe = points[abl_probe_index].y; - _manual_goto_xy(xProbe, yProbe); - #if HAS_SOFTWARE_ENDSTOPS - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - soft_endstops_enabled = false; - #endif - return; - } - else { - - SERIAL_PROTOCOLLNPGM("3-point probing done."); - - // Re-enable software endstops, if needed - #if HAS_SOFTWARE_ENDSTOPS - soft_endstops_enabled = enable_soft_endstops; - #endif - - if (!dryrun) { - vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); - if (planeNormal.z < 0) { - planeNormal.x *= -1; - planeNormal.y *= -1; - planeNormal.z *= -1; - } - planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); - - // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; - } - - } - - #endif // AUTO_BED_LEVELING_3POINT - - #else // !PROBE_MANUALLY - { - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - - measured_z = 0; - - #if ABL_GRID - - bool zig = PR_OUTER_END & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION - - measured_z = 0; - - // Outer loop is Y with PROBE_Y_FIRST disabled - for (uint8_t PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { - - int8_t inStart, inStop, inInc; - - if (zig) { // away from origin - inStart = 0; - inStop = PR_INNER_END; - inInc = 1; - } - else { // towards origin - inStart = PR_INNER_END - 1; - inStop = -1; - inInc = -1; - } - - zig ^= true; // zag - - // Inner loop is Y with PROBE_Y_FIRST enabled - for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) { - - float xBase = left_probe_bed_position + xGridSpacing * xCount, - yBase = front_probe_bed_position + yGridSpacing * yCount; - - xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); - yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - indexIntoAB[xCount][yCount] = ++abl_probe_index; // 0... - #endif - - #if IS_KINEMATIC - // Avoid probing outside the round or hexagonal area - if (!position_is_reachable_by_probe(xProbe, yProbe)) continue; - #endif - - measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); - - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); - break; - } - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - - mean += measured_z; - eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl_points] = xProbe; - eqnAMatrix[abl_probe_index + 1 * abl_points] = yProbe; - eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; - - incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); - - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - z_values[xCount][yCount] = measured_z + zoffset; - - #endif - - abl_should_enable = false; - idle(); - - } // inner - } // outer - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - // Probe at 3 arbitrary points - - for (uint8_t i = 0; i < 3; ++i) { - // Retain the last probe position - xProbe = points[i].x; - yProbe = points[i].y; - measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); - break; - } - points[i].z = measured_z; - } - - if (!dryrun && !isnan(measured_z)) { - vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); - if (planeNormal.z < 0) { - planeNormal.x *= -1; - planeNormal.y *= -1; - planeNormal.z *= -1; - } - planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); - - // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; - } - - #endif // AUTO_BED_LEVELING_3POINT - - // Stow the probe. No raise for FIX_MOUNTED_PROBE. - if (STOW_PROBE()) { - set_bed_leveling_enabled(abl_should_enable); - measured_z = NAN; - } - } - #endif // !PROBE_MANUALLY - - // - // G29 Finishing Code - // - // Unless this is a dry run, auto bed leveling will - // definitely be enabled after this point. - // - // If code above wants to continue leveling, it should - // return or loop before this point. - // - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); - #endif - - #if ENABLED(PROBE_MANUALLY) - g29_in_progress = false; - #if ENABLED(LCD_BED_LEVELING) - lcd_wait_for_move = false; - #endif - #endif - - // Calculate leveling, print reports, correct the position - if (!isnan(measured_z)) { - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - if (!dryrun) extrapolate_unprobed_bed_level(); - print_bilinear_leveling_grid(); - - refresh_bed_level(); - - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - print_bilinear_leveling_grid_virt(); - #endif - - #elif ENABLED(AUTO_BED_LEVELING_LINEAR) - - // For LINEAR leveling calculate matrix, print reports, correct the position - - /** - * solve the plane equation ax + by + d = z - * A is the matrix with rows [x y 1] for all the probed points - * B is the vector of the Z positions - * the normal vector to the plane is formed by the coefficients of the - * plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0 - * so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z - */ - float plane_equation_coefficients[3]; - - finish_incremental_LSF(&lsf_results); - plane_equation_coefficients[0] = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below - plane_equation_coefficients[1] = -lsf_results.B; // but that is not yet tested. - plane_equation_coefficients[2] = -lsf_results.D; - - mean /= abl_points; - - if (verbose_level) { - SERIAL_PROTOCOLPGM("Eqn coefficients: a: "); - SERIAL_PROTOCOL_F(plane_equation_coefficients[0], 8); - SERIAL_PROTOCOLPGM(" b: "); - SERIAL_PROTOCOL_F(plane_equation_coefficients[1], 8); - SERIAL_PROTOCOLPGM(" d: "); - SERIAL_PROTOCOL_F(plane_equation_coefficients[2], 8); - SERIAL_EOL(); - if (verbose_level > 2) { - SERIAL_PROTOCOLPGM("Mean of sampled points: "); - SERIAL_PROTOCOL_F(mean, 8); - SERIAL_EOL(); - } - } - - // Create the matrix but don't correct the position yet - if (!dryrun) - planner.bed_level_matrix = matrix_3x3::create_look_at( - vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1) // We can eliminate the '-' here and up above - ); - - // Show the Topography map if enabled - if (do_topography_map) { - - SERIAL_PROTOCOLLNPGM("\nBed Height Topography:\n" - " +--- BACK --+\n" - " | |\n" - " L | (+) | R\n" - " E | | I\n" - " F | (-) N (+) | G\n" - " T | | H\n" - " | (-) | T\n" - " | |\n" - " O-- FRONT --+\n" - " (0,0)"); - - float min_diff = 999; - - for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { - for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { - int ind = indexIntoAB[xx][yy]; - float diff = eqnBVector[ind] - mean, - x_tmp = eqnAMatrix[ind + 0 * abl_points], - y_tmp = eqnAMatrix[ind + 1 * abl_points], - z_tmp = 0; - - apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); - - NOMORE(min_diff, eqnBVector[ind] - z_tmp); - - if (diff >= 0.0) - SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment - else - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL_F(diff, 5); - } // xx - SERIAL_EOL(); - } // yy - SERIAL_EOL(); - - if (verbose_level > 3) { - SERIAL_PROTOCOLLNPGM("\nCorrected Bed Height vs. Bed Topology:"); - - for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { - for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { - int ind = indexIntoAB[xx][yy]; - float x_tmp = eqnAMatrix[ind + 0 * abl_points], - y_tmp = eqnAMatrix[ind + 1 * abl_points], - z_tmp = 0; - - apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); - - float diff = eqnBVector[ind] - z_tmp - min_diff; - if (diff >= 0.0) - SERIAL_PROTOCOLPGM(" +"); - // Include + for column alignment - else - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL_F(diff, 5); - } // xx - SERIAL_EOL(); - } // yy - SERIAL_EOL(); - } - } //do_topography_map - - #endif // AUTO_BED_LEVELING_LINEAR - - #if ABL_PLANAR - - // For LINEAR and 3POINT leveling correct the current position - - if (verbose_level > 0) - planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:")); - - if (!dryrun) { - // - // Correct the current XYZ position based on the tilted plane. - // - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); - #endif - - float converted[XYZ]; - COPY(converted, current_position); - - planner.leveling_active = true; - planner.unapply_leveling(converted); // use conversion machinery - planner.leveling_active = false; - - // Use the last measured distance to the bed, if possible - if ( NEAR(current_position[X_AXIS], xProbe - (X_PROBE_OFFSET_FROM_EXTRUDER)) - && NEAR(current_position[Y_AXIS], yProbe - (Y_PROBE_OFFSET_FROM_EXTRUDER)) - ) { - const float simple_z = current_position[Z_AXIS] - measured_z; - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("Z from Probe:", simple_z); - SERIAL_ECHOPAIR(" Matrix:", converted[Z_AXIS]); - SERIAL_ECHOLNPAIR(" Discrepancy:", simple_z - converted[Z_AXIS]); - } - #endif - converted[Z_AXIS] = simple_z; - } - - // The rotated XY and corrected Z are now current_position - COPY(current_position, converted); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); - #endif - } - - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - if (!dryrun) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("G29 uncorrected Z:", current_position[Z_AXIS]); - #endif - - // Unapply the offset because it is going to be immediately applied - // and cause compensation movement in Z - current_position[Z_AXIS] -= bilinear_z_offset(current_position); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR(" corrected Z:", current_position[Z_AXIS]); - #endif - } - - #endif // ABL_PLANAR - - #ifdef Z_PROBE_END_SCRIPT - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); - #endif - stepper.synchronize(); - enqueue_and_echo_commands_P(PSTR(Z_PROBE_END_SCRIPT)); - #endif - - // Auto Bed Leveling is complete! Enable if possible. - planner.leveling_active = dryrun ? abl_should_enable : true; - } // !isnan(measured_z) - - // Restore state after probing - if (!faux) clean_up_after_endstop_or_probe_move(); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G29"); - #endif - - KEEPALIVE_STATE(IN_HANDLER); - - if (planner.leveling_active) - SYNC_PLAN_POSITION_KINEMATIC(); - - #if HAS_BED_PROBE && defined(Z_AFTER_PROBING) - move_z_after_probing(); - #endif - - report_current_position(); - } - -#endif // OLDSCHOOL_ABL - -#if HAS_BED_PROBE - - /** - * G30: Do a single Z probe at the current XY - * - * Parameters: - * - * X Probe X position (default current X) - * Y Probe Y position (default current Y) - * E Engage the probe for each probe - */ - inline void gcode_G30() { - const float xpos = parser.linearval('X', current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER), - ypos = parser.linearval('Y', current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER); - - if (!position_is_reachable_by_probe(xpos, ypos)) return; - - // Disable leveling so the planner won't mess with us - #if HAS_LEVELING - set_bed_leveling_enabled(false); - #endif - - setup_for_endstop_or_probe_move(); - - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_NONE; - const float measured_z = probe_pt(xpos, ypos, raise_after, parser.intval('V', 1)); - - if (!isnan(measured_z)) { - SERIAL_PROTOCOLPAIR_F("Bed X: ", xpos); - SERIAL_PROTOCOLPAIR_F(" Y: ", ypos); - SERIAL_PROTOCOLLNPAIR_F(" Z: ", measured_z); - } - - clean_up_after_endstop_or_probe_move(); - - #ifdef Z_AFTER_PROBING - if (raise_after == PROBE_PT_STOW) move_z_after_probing(); - #endif - - report_current_position(); - } - - #if ENABLED(Z_PROBE_SLED) - - /** - * G31: Deploy the Z probe - */ - inline void gcode_G31() { DEPLOY_PROBE(); } - - /** - * G32: Stow the Z probe - */ - inline void gcode_G32() { STOW_PROBE(); } - - #endif // Z_PROBE_SLED - -#endif // HAS_BED_PROBE - -#if ENABLED(DELTA_AUTO_CALIBRATION) - - constexpr uint8_t _7P_STEP = 1, // 7-point step - to change number of calibration points - _4P_STEP = _7P_STEP * 2, // 4-point step - NPP = _7P_STEP * 6; // number of calibration points on the radius - enum CalEnum : char { // the 7 main calibration points - add definitions if needed - CEN = 0, - __A = 1, - _AB = __A + _7P_STEP, - __B = _AB + _7P_STEP, - _BC = __B + _7P_STEP, - __C = _BC + _7P_STEP, - _CA = __C + _7P_STEP, - }; - - #define LOOP_CAL_PT(VAR, S, N) for (uint8_t VAR=S; VAR<=NPP; VAR+=N) - #define F_LOOP_CAL_PT(VAR, S, N) for (float VAR=S; VARCEN+0.9999; VAR-=N) - #define LOOP_CAL_ALL(VAR) LOOP_CAL_PT(VAR, CEN, 1) - #define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) - #define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) - - #if HOTENDS > 1 - const uint8_t old_tool_index = active_extruder; - #define AC_CLEANUP() ac_cleanup(old_tool_index) - #else - #define AC_CLEANUP() ac_cleanup() - #endif - - float lcd_probe_pt(const float &rx, const float &ry); - - bool ac_home() { - endstops.enable(true); - if (!home_delta()) - return false; - endstops.not_homing(); - return true; - } - - void ac_setup(const bool reset_bed) { - #if HOTENDS > 1 - tool_change(0, 0, true); - #endif - - stepper.synchronize(); - setup_for_endstop_or_probe_move(); - - #if HAS_LEVELING - if (reset_bed) reset_bed_level(); // After full calibration bed-level data is no longer valid - #endif - } - - void ac_cleanup( - #if HOTENDS > 1 - const uint8_t old_tool_index - #endif - ) { - #if ENABLED(DELTA_HOME_TO_SAFE_ZONE) - do_blocking_move_to_z(delta_clip_start_height); - #endif - #if HAS_BED_PROBE - STOW_PROBE(); - #endif - clean_up_after_endstop_or_probe_move(); - #if HOTENDS > 1 - tool_change(old_tool_index, 0, true); - #endif - } - - void print_signed_float(const char * const prefix, const float &f) { - SERIAL_PROTOCOLPGM(" "); - serialprintPGM(prefix); - SERIAL_PROTOCOLCHAR(':'); - if (f >= 0) SERIAL_CHAR('+'); - SERIAL_PROTOCOL_F(f, 2); - } - - /** - * - Print the delta settings - */ - static void print_calibration_settings(const bool end_stops, const bool tower_angles) { - SERIAL_PROTOCOLPAIR(".Height:", delta_height); - if (end_stops) { - print_signed_float(PSTR("Ex"), delta_endstop_adj[A_AXIS]); - print_signed_float(PSTR("Ey"), delta_endstop_adj[B_AXIS]); - print_signed_float(PSTR("Ez"), delta_endstop_adj[C_AXIS]); - } - if (end_stops && tower_angles) { - SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); - SERIAL_EOL(); - SERIAL_CHAR('.'); - SERIAL_PROTOCOL_SP(13); - } - if (tower_angles) { - print_signed_float(PSTR("Tx"), delta_tower_angle_trim[A_AXIS]); - print_signed_float(PSTR("Ty"), delta_tower_angle_trim[B_AXIS]); - print_signed_float(PSTR("Tz"), delta_tower_angle_trim[C_AXIS]); - } - if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR - SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); - } - #if HAS_BED_PROBE - if (!end_stops && !tower_angles) { - SERIAL_PROTOCOL_SP(30); - print_signed_float(PSTR("Offset"), zprobe_zoffset); - } - #endif - SERIAL_EOL(); - } - - /** - * - Print the probe results - */ - static void print_calibration_results(const float z_pt[NPP + 1], const bool tower_points, const bool opposite_points) { - SERIAL_PROTOCOLPGM(". "); - print_signed_float(PSTR("c"), z_pt[CEN]); - if (tower_points) { - print_signed_float(PSTR(" x"), z_pt[__A]); - print_signed_float(PSTR(" y"), z_pt[__B]); - print_signed_float(PSTR(" z"), z_pt[__C]); - } - if (tower_points && opposite_points) { - SERIAL_EOL(); - SERIAL_CHAR('.'); - SERIAL_PROTOCOL_SP(13); - } - if (opposite_points) { - print_signed_float(PSTR("yz"), z_pt[_BC]); - print_signed_float(PSTR("zx"), z_pt[_CA]); - print_signed_float(PSTR("xy"), z_pt[_AB]); - } - SERIAL_EOL(); - } - - /** - * - Calculate the standard deviation from the zero plane - */ - static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool _1p_cal, const bool _4p_cal, const bool _4p_opp) { - if (!_0p_cal) { - float S2 = sq(z_pt[CEN]); - int16_t N = 1; - if (!_1p_cal) { // std dev from zero plane - LOOP_CAL_ACT(rad, _4p_cal, _4p_opp) { - S2 += sq(z_pt[rad]); - N++; - } - return round(SQRT(S2 / N) * 1000.0) / 1000.0 + 0.00001; - } - } - return 0.00001; - } - - /** - * - Probe a point - */ - static float calibration_probe(const float &nx, const float &ny, const bool stow, const bool set_up) { - #if HAS_BED_PROBE - return probe_pt(nx, ny, set_up ? PROBE_PT_BIG_RAISE : stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); - #else - UNUSED(stow); - UNUSED(set_up); - return lcd_probe_pt(nx, ny); - #endif - } - - #if HAS_BED_PROBE - static float probe_z_shift(const float center) { - STOW_PROBE(); - endstops.enable_z_probe(false); - float z_shift = lcd_probe_pt(0, 0) - center; - endstops.enable_z_probe(true); - return z_shift; - } - #endif - - /** - * - Probe a grid - */ - static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool set_up) { - const bool _0p_calibration = probe_points == 0, - _1p_calibration = probe_points == 1 || probe_points == -1, - _4p_calibration = probe_points == 2, - _4p_opposite_points = _4p_calibration && !towers_set, - _7p_calibration = probe_points >= 3, - _7p_no_intermediates = probe_points == 3, - _7p_1_intermediates = probe_points == 4, - _7p_2_intermediates = probe_points == 5, - _7p_4_intermediates = probe_points == 6, - _7p_6_intermediates = probe_points == 7, - _7p_8_intermediates = probe_points == 8, - _7p_11_intermediates = probe_points == 9, - _7p_14_intermediates = probe_points == 10, - _7p_intermed_points = probe_points >= 4, - _7p_6_center = probe_points >= 5 && probe_points <= 7, - _7p_9_center = probe_points >= 8; - - LOOP_CAL_ALL(rad) z_pt[rad] = 0.0; - - if (!_0p_calibration) { - - if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center - z_pt[CEN] += calibration_probe(0, 0, stow_after_each, set_up); - if (isnan(z_pt[CEN])) return false; - } - - if (_7p_calibration) { // probe extra center points - const float start = _7p_9_center ? _CA + _7P_STEP / 3.0 : _7p_6_center ? _CA : __C, - steps = _7p_9_center ? _4P_STEP / 3.0 : _7p_6_center ? _7P_STEP : _4P_STEP; - I_LOOP_CAL_PT(rad, start, steps) { - const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = delta_calibration_radius * 0.1; - z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); - if (isnan(z_pt[CEN])) return false; - } - z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); - } - - if (!_1p_calibration) { // probe the radius - const CalEnum start = _4p_opposite_points ? _AB : __A; - const float steps = _7p_14_intermediates ? _7P_STEP / 15.0 : // 15r * 6 + 10c = 100 - _7p_11_intermediates ? _7P_STEP / 12.0 : // 12r * 6 + 9c = 81 - _7p_8_intermediates ? _7P_STEP / 9.0 : // 9r * 6 + 10c = 64 - _7p_6_intermediates ? _7P_STEP / 7.0 : // 7r * 6 + 7c = 49 - _7p_4_intermediates ? _7P_STEP / 5.0 : // 5r * 6 + 6c = 36 - _7p_2_intermediates ? _7P_STEP / 3.0 : // 3r * 6 + 7c = 25 - _7p_1_intermediates ? _7P_STEP / 2.0 : // 2r * 6 + 4c = 16 - _7p_no_intermediates ? _7P_STEP : // 1r * 6 + 3c = 9 - _4P_STEP; // .5r * 6 + 1c = 4 - bool zig_zag = true; - F_LOOP_CAL_PT(rad, start, _7p_9_center ? steps * 3 : steps) { - const int8_t offset = _7p_9_center ? 2 : 0; - for (int8_t circle = 0; circle <= offset; circle++) { - const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), - interpol = fmod(rad, 1); - const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); - if (isnan(z_temp)) return false; - // split probe point to neighbouring calibration points - z_pt[uint8_t(round(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); - z_pt[uint8_t(round(rad - interpol)) % NPP + 1] += z_temp * sq(sin(RADIANS(interpol * 90))); - } - zig_zag = !zig_zag; - } - if (_7p_intermed_points) - LOOP_CAL_RAD(rad) - z_pt[rad] /= _7P_STEP / steps; - - do_blocking_move_to_xy(0.0, 0.0); - } - } - return true; - } - - /** - * kinematics routines and auto tune matrix scaling parameters: - * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for - * - formulae for approximative forward kinematics in the end-stop displacement matrix - * - definition of the matrix scaling parameters - */ - static void reverse_kinematics_probe_points(float z_pt[NPP + 1], float mm_at_pt_axis[NPP + 1][ABC]) { - float pos[XYZ] = { 0.0 }; - - LOOP_CAL_ALL(rad) { - const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = (rad == CEN ? 0.0 : delta_calibration_radius); - pos[X_AXIS] = cos(a) * r; - pos[Y_AXIS] = sin(a) * r; - pos[Z_AXIS] = z_pt[rad]; - inverse_kinematics(pos); - LOOP_XYZ(axis) mm_at_pt_axis[rad][axis] = delta[axis]; - } - } - - static void forward_kinematics_probe_points(float mm_at_pt_axis[NPP + 1][ABC], float z_pt[NPP + 1]) { - const float r_quot = delta_calibration_radius / delta_radius; - - #define ZPP(N,I,A) ((1 / 3.0 + r_quot * (N) / 3.0 ) * mm_at_pt_axis[I][A]) - #define Z00(I, A) ZPP( 0, I, A) - #define Zp1(I, A) ZPP(+1, I, A) - #define Zm1(I, A) ZPP(-1, I, A) - #define Zp2(I, A) ZPP(+2, I, A) - #define Zm2(I, A) ZPP(-2, I, A) - - z_pt[CEN] = Z00(CEN, A_AXIS) + Z00(CEN, B_AXIS) + Z00(CEN, C_AXIS); - z_pt[__A] = Zp2(__A, A_AXIS) + Zm1(__A, B_AXIS) + Zm1(__A, C_AXIS); - z_pt[__B] = Zm1(__B, A_AXIS) + Zp2(__B, B_AXIS) + Zm1(__B, C_AXIS); - z_pt[__C] = Zm1(__C, A_AXIS) + Zm1(__C, B_AXIS) + Zp2(__C, C_AXIS); - z_pt[_BC] = Zm2(_BC, A_AXIS) + Zp1(_BC, B_AXIS) + Zp1(_BC, C_AXIS); - z_pt[_CA] = Zp1(_CA, A_AXIS) + Zm2(_CA, B_AXIS) + Zp1(_CA, C_AXIS); - z_pt[_AB] = Zp1(_AB, A_AXIS) + Zp1(_AB, B_AXIS) + Zm2(_AB, C_AXIS); - } - - static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], float delta_e[ABC], float delta_r, float delta_t[ABC]) { - const float z_center = z_pt[CEN]; - float diff_mm_at_pt_axis[NPP + 1][ABC], - new_mm_at_pt_axis[NPP + 1][ABC]; - - reverse_kinematics_probe_points(z_pt, diff_mm_at_pt_axis); - - delta_radius += delta_r; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] += delta_t[axis]; - recalc_delta_settings(); - reverse_kinematics_probe_points(z_pt, new_mm_at_pt_axis); - - LOOP_XYZ(axis) LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad][axis] -= new_mm_at_pt_axis[rad][axis] + delta_e[axis]; - forward_kinematics_probe_points(diff_mm_at_pt_axis, z_pt); - - LOOP_CAL_RAD(rad) z_pt[rad] -= z_pt[CEN] - z_center; - z_pt[CEN] = z_center; - - delta_radius -= delta_r; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= delta_t[axis]; - recalc_delta_settings(); - } - - static float auto_tune_h() { - const float r_quot = delta_calibration_radius / delta_radius; - float h_fac = 0.0; - - h_fac = r_quot / (2.0 / 3.0); - h_fac = 1.0 / h_fac; // (2/3)/CR - return h_fac; - } - - static float auto_tune_r() { - const float diff = 0.01; - float r_fac = 0.0, - z_pt[NPP + 1] = { 0.0 }, - delta_e[ABC] = {0.0}, - delta_r = {0.0}, - delta_t[ABC] = {0.0}; - - delta_r = diff; - calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); - r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0; - r_fac = diff / r_fac / 3.0; // 1/(3*delta_Z) - return r_fac; - } - - static float auto_tune_a() { - const float diff = 0.01; - float a_fac = 0.0, - z_pt[NPP + 1] = { 0.0 }, - delta_e[ABC] = {0.0}, - delta_r = {0.0}, - delta_t[ABC] = {0.0}; - - LOOP_XYZ(axis) { - LOOP_XYZ(axis_2) delta_t[axis_2] = 0.0; - delta_t[axis] = diff; - calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); - a_fac += z_pt[uint8_t((axis * _4P_STEP) - _7P_STEP + NPP) % NPP + 1] / 6.0; - a_fac -= z_pt[uint8_t((axis * _4P_STEP) + 1 + _7P_STEP)] / 6.0; - } - a_fac = diff / a_fac / 3.0; // 1/(3*delta_Z) - return a_fac; - } - - /** - * G33 - Delta '1-4-7-point' Auto-Calibration - * Calibrate height, z_offset, endstops, delta radius, and tower angles. - * - * Parameters: - * - * S Setup mode; disables probe protection - * - * Pn Number of probe points: - * P-1 Checks the z_offset with a center probe and paper test. - * P0 Normalizes calibration. - * P1 Calibrates height only with center probe. - * P2 Probe center and towers. Calibrate height, endstops and delta radius. - * P3 Probe all positions: center, towers and opposite towers. Calibrate all. - * P4-P10 Probe all positions at different intermediate locations and average them. - * - * T Don't calibrate tower angle corrections - * - * Cn.nn Calibration precision; when omitted calibrates to maximum precision - * - * Fn Force to run at least n iterations and take the best result - * - * Vn Verbose level: - * V0 Dry-run mode. Report settings and probe results. No calibration. - * V1 Report start and end settings only - * V2 Report settings at each iteration - * V3 Report settings and probe results - * - * E Engage the probe for each point - */ - inline void gcode_G33() { - - const bool set_up = - #if HAS_BED_PROBE - parser.seen('S'); - #else - false; - #endif - - const int8_t probe_points = set_up ? 2 : parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); - if (!WITHIN(probe_points, -1, 10)) { - SERIAL_PROTOCOLLNPGM("?(P)oints is implausible (-1 - 10)."); - return; - } - - const bool towers_set = !parser.seen('T'); - - const float calibration_precision = set_up ? Z_CLEARANCE_BETWEEN_PROBES / 5.0 : parser.floatval('C', 0.0); - if (calibration_precision < 0) { - SERIAL_PROTOCOLLNPGM("?(C)alibration precision is implausible (>=0)."); - return; - } - - const int8_t force_iterations = parser.intval('F', 0); - if (!WITHIN(force_iterations, 0, 30)) { - SERIAL_PROTOCOLLNPGM("?(F)orce iteration is implausible (0 - 30)."); - return; - } - - const int8_t verbose_level = parser.byteval('V', 1); - if (!WITHIN(verbose_level, 0, 3)) { - SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0 - 3)."); - return; - } - - const bool stow_after_each = parser.seen('E'); - - if (set_up) { - delta_height = 999.99; - delta_radius = DELTA_PRINTABLE_RADIUS; - ZERO(delta_endstop_adj); - ZERO(delta_tower_angle_trim); - recalc_delta_settings(); - } - - const bool _0p_calibration = probe_points == 0, - _1p_calibration = probe_points == 1 || probe_points == -1, - _4p_calibration = probe_points == 2, - _4p_opposite_points = _4p_calibration && !towers_set, - _7p_9_center = probe_points >= 8, - _tower_results = (_4p_calibration && towers_set) || probe_points >= 3, - _opposite_results = (_4p_calibration && !towers_set) || probe_points >= 3, - _endstop_results = probe_points != 1 && probe_points != -1 && probe_points != 0, - _angle_results = probe_points >= 3 && towers_set; - static const char save_message[] PROGMEM = "Save with M500 and/or copy to Configuration.h"; - int8_t iterations = 0; - float test_precision, - zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end - zero_std_dev_min = zero_std_dev, - zero_std_dev_old = zero_std_dev, - h_factor, - r_factor, - a_factor, - e_old[ABC] = { - delta_endstop_adj[A_AXIS], - delta_endstop_adj[B_AXIS], - delta_endstop_adj[C_AXIS] - }, - r_old = delta_radius, - h_old = delta_height, - a_old[ABC] = { - delta_tower_angle_trim[A_AXIS], - delta_tower_angle_trim[B_AXIS], - delta_tower_angle_trim[C_AXIS] - }; - - SERIAL_PROTOCOLLNPGM("G33 Auto Calibrate"); - - if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable - LOOP_CAL_RAD(axis) { - const float a = RADIANS(210 + (360 / NPP) * (axis - 1)), - r = delta_calibration_radius; - if (!position_is_reachable(cos(a) * r, sin(a) * r)) { - SERIAL_PROTOCOLLNPGM("?(M665 B)ed radius is implausible."); - return; - } - } - } - - // Report settings - - const char *checkingac = PSTR("Checking... AC"); - serialprintPGM(checkingac); - if (verbose_level == 0) SERIAL_PROTOCOLPGM(" (DRY-RUN)"); - if (set_up) SERIAL_PROTOCOLPGM(" (SET-UP)"); - SERIAL_EOL(); - char mess[11]; - strcpy_P(mess, checkingac); - lcd_setstatus(mess); - - print_calibration_settings(_endstop_results, _angle_results); - - ac_setup(!_0p_calibration && !_1p_calibration); - - if (!_0p_calibration) - if (!ac_home()) return; - - do { // start iterations - - float z_at_pt[NPP + 1] = { 0.0 }; - - test_precision = zero_std_dev_old != 999.0 ? (zero_std_dev + zero_std_dev_old) / 2 : zero_std_dev; - iterations++; - - // Probe the points - zero_std_dev_old = zero_std_dev; - if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, set_up)) { - SERIAL_PROTOCOLLNPGM("Correct delta settings with M665 and M666"); - return AC_CLEANUP(); - } - zero_std_dev = std_dev_points(z_at_pt, _0p_calibration, _1p_calibration, _4p_calibration, _4p_opposite_points); - - // Solve matrices - - if ((zero_std_dev < test_precision || iterations <= force_iterations) && zero_std_dev > calibration_precision) { - - #if !HAS_BED_PROBE - test_precision = 0.00; // forced end - #endif - - if (zero_std_dev < zero_std_dev_min) { - // set roll-back point - COPY(e_old, delta_endstop_adj); - r_old = delta_radius; - h_old = delta_height; - COPY(a_old, delta_tower_angle_trim); - } - - float e_delta[ABC] = { 0.0 }, - r_delta = 0.0, - t_delta[ABC] = { 0.0 }; - - /** - * convergence matrices: - * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for - * - definition of the matrix scaling parameters - * - matrices for 4 and 7 point calibration - */ - #define ZP(N,I) ((N) * z_at_pt[I] / 4.0) // 4.0 = divider to normalize to integers - #define Z12(I) ZP(12, I) - #define Z4(I) ZP(4, I) - #define Z2(I) ZP(2, I) - #define Z1(I) ZP(1, I) - #define Z0(I) ZP(0, I) - - // calculate factors - const float cr_old = delta_calibration_radius; - if (_7p_9_center) delta_calibration_radius *= 0.9; - h_factor = auto_tune_h(); - r_factor = auto_tune_r(); - a_factor = auto_tune_a(); - delta_calibration_radius = cr_old; - - switch (probe_points) { - case -1: - #if HAS_BED_PROBE - zprobe_zoffset += probe_z_shift(z_at_pt[CEN]); - #endif - - case 0: - test_precision = 0.00; // forced end - break; - - case 1: - test_precision = 0.00; // forced end - LOOP_XYZ(axis) e_delta[axis] = +Z4(CEN); - break; - - case 2: - if (towers_set) { // see 4 point calibration (towers) matrix - e_delta[A_AXIS] = (+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN); - r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; - } - else { // see 4 point calibration (opposites) matrix - e_delta[A_AXIS] = (-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN); - r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; - } - break; - - default: // see 7 point calibration (towers & opposites) matrix - e_delta[A_AXIS] = (+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN); - e_delta[B_AXIS] = (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN); - e_delta[C_AXIS] = (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN); - r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; - - if (towers_set) { // see 7 point tower angle calibration (towers & opposites) matrix - t_delta[A_AXIS] = (+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor; - t_delta[B_AXIS] = (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor; - t_delta[C_AXIS] = (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor; - } - break; - } - LOOP_XYZ(axis) delta_endstop_adj[axis] += e_delta[axis]; - delta_radius += r_delta; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] += t_delta[axis]; - } - else if (zero_std_dev >= test_precision) { - // roll back - COPY(delta_endstop_adj, e_old); - delta_radius = r_old; - delta_height = h_old; - COPY(delta_tower_angle_trim, a_old); - } - - if (verbose_level != 0) { // !dry run - - // normalise angles to least squares - if (_angle_results) { - float a_sum = 0.0; - LOOP_XYZ(axis) a_sum += delta_tower_angle_trim[axis]; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0; - } - - // adjust delta_height and endstops by the max amount - const float z_temp = MAX3(delta_endstop_adj[A_AXIS], delta_endstop_adj[B_AXIS], delta_endstop_adj[C_AXIS]); - delta_height -= z_temp; - LOOP_XYZ(axis) delta_endstop_adj[axis] -= z_temp; - } - recalc_delta_settings(); - NOMORE(zero_std_dev_min, zero_std_dev); - - // print report - - if (verbose_level == 3) - print_calibration_results(z_at_pt, _tower_results, _opposite_results); - - if (verbose_level != 0) { // !dry run - if ((zero_std_dev >= test_precision && iterations > force_iterations) || zero_std_dev <= calibration_precision) { // end iterations - SERIAL_PROTOCOLPGM("Calibration OK"); - SERIAL_PROTOCOL_SP(32); - #if HAS_BED_PROBE - if (zero_std_dev >= test_precision && !_1p_calibration && !_0p_calibration) - SERIAL_PROTOCOLPGM("rolling back."); - else - #endif - { - SERIAL_PROTOCOLPGM("std dev:"); - SERIAL_PROTOCOL_F(zero_std_dev_min, 3); - } - SERIAL_EOL(); - char mess[21]; - strcpy_P(mess, PSTR("Calibration sd:")); - if (zero_std_dev_min < 1) - sprintf_P(&mess[15], PSTR("0.%03i"), (int)round(zero_std_dev_min * 1000.0)); - else - sprintf_P(&mess[15], PSTR("%03i.x"), (int)round(zero_std_dev_min)); - lcd_setstatus(mess); - print_calibration_settings(_endstop_results, _angle_results); - serialprintPGM(save_message); - SERIAL_EOL(); - } - else { // !end iterations - char mess[15]; - if (iterations < 31) - sprintf_P(mess, PSTR("Iteration : %02i"), (int)iterations); - else - strcpy_P(mess, PSTR("No convergence")); - SERIAL_PROTOCOL(mess); - SERIAL_PROTOCOL_SP(32); - SERIAL_PROTOCOLPGM("std dev:"); - SERIAL_PROTOCOL_F(zero_std_dev, 3); - SERIAL_EOL(); - lcd_setstatus(mess); - if (verbose_level > 1) - print_calibration_settings(_endstop_results, _angle_results); - } - } - else { // dry run - const char *enddryrun = PSTR("End DRY-RUN"); - serialprintPGM(enddryrun); - SERIAL_PROTOCOL_SP(35); - SERIAL_PROTOCOLPGM("std dev:"); - SERIAL_PROTOCOL_F(zero_std_dev, 3); - SERIAL_EOL(); - - char mess[21]; - strcpy_P(mess, enddryrun); - strcpy_P(&mess[11], PSTR(" sd:")); - if (zero_std_dev < 1) - sprintf_P(&mess[15], PSTR("0.%03i"), (int)round(zero_std_dev * 1000.0)); - else - sprintf_P(&mess[15], PSTR("%03i.x"), (int)round(zero_std_dev)); - lcd_setstatus(mess); - } - if (!ac_home()) return; - } - while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); - - AC_CLEANUP(); - } - -#endif // DELTA_AUTO_CALIBRATION - -#if ENABLED(G38_PROBE_TARGET) - - static bool G38_run_probe() { - - bool G38_pass_fail = false; - - #if MULTIPLE_PROBING > 1 - // Get direction of move and retract - float retract_mm[XYZ]; - LOOP_XYZ(i) { - float dist = destination[i] - current_position[i]; - retract_mm[i] = FABS(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm((AxisEnum)i) * (dist > 0 ? -1 : 1); - } - #endif - - // Move until destination reached or target hit - stepper.synchronize(); - endstops.enable(true); - G38_move = true; - G38_endstop_hit = false; - prepare_move_to_destination(); - stepper.synchronize(); - G38_move = false; - - endstops.hit_on_purpose(); - set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); - - if (G38_endstop_hit) { - - G38_pass_fail = true; - - #if MULTIPLE_PROBING > 1 - // Move away by the retract distance - set_destination_from_current(); - LOOP_XYZ(i) destination[i] += retract_mm[i]; - endstops.enable(false); - prepare_move_to_destination(); - - feedrate_mm_s /= 4; - - // Bump the target more slowly - LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; - - stepper.synchronize(); - endstops.enable(true); - G38_move = true; - prepare_move_to_destination(); - stepper.synchronize(); - G38_move = false; - - set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); - #endif - } - - endstops.hit_on_purpose(); - endstops.not_homing(); - return G38_pass_fail; - } - - /** - * G38.2 - probe toward workpiece, stop on contact, signal error if failure - * G38.3 - probe toward workpiece, stop on contact - * - * Like G28 except uses Z min probe for all axes - */ - inline void gcode_G38(bool is_38_2) { - // Get X Y Z E F - gcode_get_destination(); - - setup_for_endstop_or_probe_move(); - - // If any axis has enough movement, do the move - LOOP_XYZ(i) - if (FABS(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { - if (!parser.seenval('F')) feedrate_mm_s = homing_feedrate((AxisEnum)i); - // If G38.2 fails throw an error - if (!G38_run_probe() && is_38_2) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Failed to reach target"); - } - break; - } - - clean_up_after_endstop_or_probe_move(); - } - -#endif // G38_PROBE_TARGET - -#if HAS_MESH - - /** - * G42: Move X & Y axes to mesh coordinates (I & J) - */ - inline void gcode_G42() { - #if ENABLED(NO_MOTION_BEFORE_HOMING) - if (axis_unhomed_error()) return; - #endif - - if (IsRunning()) { - const bool hasI = parser.seenval('I'); - const int8_t ix = hasI ? parser.value_int() : 0; - const bool hasJ = parser.seenval('J'); - const int8_t iy = hasJ ? parser.value_int() : 0; - - if ((hasI && !WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) || (hasJ && !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1))) { - SERIAL_ECHOLNPGM(MSG_ERR_MESH_XY); - return; - } - - set_destination_from_current(); - if (hasI) destination[X_AXIS] = _GET_MESH_X(ix); - if (hasJ) destination[Y_AXIS] = _GET_MESH_Y(iy); - if (parser.boolval('P')) { - if (hasI) destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; - if (hasJ) destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; - } - - const float fval = parser.linearval('F'); - if (fval > 0.0) feedrate_mm_s = MMM_TO_MMS(fval); - - // SCARA kinematic has "safe" XY raw moves - #if IS_SCARA - prepare_uninterpolated_move_to_destination(); - #else - prepare_move_to_destination(); - #endif - } - } - -#endif // HAS_MESH - -/** - * G92: Set current position to given X Y Z E - */ -inline void gcode_G92() { - - #if ENABLED(CNC_COORDINATE_SYSTEMS) - switch (parser.subcode) { - case 1: - // Zero the G92 values and restore current position - #if !IS_SCARA - LOOP_XYZ(i) { - const float v = position_shift[i]; - if (v) { - position_shift[i] = 0; - update_software_endstops((AxisEnum)i); - } - } - #endif // Not SCARA - return; - } - #endif - - #if ENABLED(CNC_COORDINATE_SYSTEMS) - #define IS_G92_0 (parser.subcode == 0) - #else - #define IS_G92_0 true - #endif - - bool didE = false; - #if IS_SCARA || !HAS_POSITION_SHIFT - bool didXYZ = false; - #else - constexpr bool didXYZ = false; - #endif - - if (IS_G92_0) LOOP_XYZE(i) { - if (parser.seenval(axis_codes[i])) { - const float l = parser.value_axis_units((AxisEnum)i), - v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), - d = v - current_position[i]; - if (!NEAR_ZERO(d)) { - #if IS_SCARA || !HAS_POSITION_SHIFT - if (i == E_AXIS) didE = true; else didXYZ = true; - current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior - #elif HAS_POSITION_SHIFT - if (i == E_AXIS) { - didE = true; - current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly - } - else { - position_shift[i] += d; // Other axes simply offset the coordinate space - update_software_endstops((AxisEnum)i); - } - #endif - } - } - } - - #if ENABLED(CNC_COORDINATE_SYSTEMS) - // Apply workspace offset to the active coordinate system - if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) - COPY(coordinate_system[active_coordinate_system], position_shift); - #endif - - // Update planner/steppers only if the native coordinates changed - if (didXYZ) SYNC_PLAN_POSITION_KINEMATIC(); - else if (didE) sync_plan_position_e(); - - report_current_position(); -} - -#if HAS_RESUME_CONTINUE - - /** - * M0: Unconditional stop - Wait for user button press on LCD - * M1: Conditional stop - Wait for user button press on LCD - */ - inline void gcode_M0_M1() { - const char * const args = parser.string_arg; - - millis_t ms = 0; - bool hasP = false, hasS = false; - if (parser.seenval('P')) { - ms = parser.value_millis(); // milliseconds to wait - hasP = ms > 0; - } - if (parser.seenval('S')) { - ms = parser.value_millis_from_seconds(); // seconds to wait - hasS = ms > 0; - } - - const bool has_message = !hasP && !hasS && args && *args; - - stepper.synchronize(); - - #if ENABLED(ULTIPANEL) - - if (has_message) - lcd_setstatus(args, true); - else { - LCD_MESSAGEPGM(MSG_USERWAIT); - #if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 - dontExpireStatus(); - #endif - } - - #else - - if (has_message) { - SERIAL_ECHO_START(); - SERIAL_ECHOLN(args); - } - - #endif - - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = true; - - if (ms > 0) { - ms += millis(); // wait until this time for a click - while (PENDING(millis(), ms) && wait_for_user) idle(); - } - else - while (wait_for_user) idle(); - - - #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) - if (lights_off_after_print) { - leds.set_off(); - lights_off_after_print = false; - } - #endif - - lcd_reset_status(); - - wait_for_user = false; - KEEPALIVE_STATE(IN_HANDLER); - } - -#endif // HAS_RESUME_CONTINUE - -#if ENABLED(SPINDLE_LASER_ENABLE) - /** - * M3: Spindle Clockwise - * M4: Spindle Counter-clockwise - * - * S0 turns off spindle. - * - * If no speed PWM output is defined then M3/M4 just turns it on. - * - * At least 12.8KHz (50Hz * 256) is needed for spindle PWM. - * Hardware PWM is required. ISRs are too slow. - * - * NOTE: WGM for timers 3, 4, and 5 must be either Mode 1 or Mode 5. - * No other settings give a PWM signal that goes from 0 to 5 volts. - * - * The system automatically sets WGM to Mode 1, so no special - * initialization is needed. - * - * WGM bits for timer 2 are automatically set by the system to - * Mode 1. This produces an acceptable 0 to 5 volt signal. - * No special initialization is needed. - * - * NOTE: A minimum PWM frequency of 50 Hz is needed. All prescaler - * factors for timers 2, 3, 4, and 5 are acceptable. - * - * SPINDLE_LASER_ENABLE_PIN needs an external pullup or it may power on - * the spindle/laser during power-up or when connecting to the host - * (usually goes through a reset which sets all I/O pins to tri-state) - * - * PWM duty cycle goes from 0 (off) to 255 (always on). - */ - - // Wait for spindle to come up to speed - inline void delay_for_power_up() { dwell(SPINDLE_LASER_POWERUP_DELAY); } - - // Wait for spindle to stop turning - inline void delay_for_power_down() { dwell(SPINDLE_LASER_POWERDOWN_DELAY); } - - /** - * ocr_val_mode() is used for debugging and to get the points needed to compute the RPM vs ocr_val line - * - * it accepts inputs of 0-255 - */ - - inline void ocr_val_mode() { - uint8_t spindle_laser_power = parser.value_byte(); - WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) - if (SPINDLE_LASER_PWM_INVERT) spindle_laser_power = 255 - spindle_laser_power; - analogWrite(SPINDLE_LASER_PWM_PIN, spindle_laser_power); - } - - inline void gcode_M3_M4(bool is_M3) { - - stepper.synchronize(); // wait until previous movement commands (G0/G0/G2/G3) have completed before playing with the spindle - #if SPINDLE_DIR_CHANGE - const bool rotation_dir = (is_M3 && !SPINDLE_INVERT_DIR || !is_M3 && SPINDLE_INVERT_DIR) ? HIGH : LOW; - if (SPINDLE_STOP_ON_DIR_CHANGE \ - && READ(SPINDLE_LASER_ENABLE_PIN) == SPINDLE_LASER_ENABLE_INVERT \ - && READ(SPINDLE_DIR_PIN) != rotation_dir - ) { - WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off - delay_for_power_down(); - } - WRITE(SPINDLE_DIR_PIN, rotation_dir); - #endif - - /** - * Our final value for ocr_val is an unsigned 8 bit value between 0 and 255 which usually means uint8_t. - * Went to uint16_t because some of the uint8_t calculations would sometimes give 1000 0000 rather than 1111 1111. - * Then needed to AND the uint16_t result with 0x00FF to make sure we only wrote the byte of interest. - */ - #if ENABLED(SPINDLE_LASER_PWM) - if (parser.seen('O')) ocr_val_mode(); - else { - const float spindle_laser_power = parser.floatval('S'); - if (spindle_laser_power == 0) { - WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off (active low) - analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // only write low byte - delay_for_power_down(); - } - else { - int16_t ocr_val = (spindle_laser_power - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // convert RPM to PWM duty cycle - NOMORE(ocr_val, 255); // limit to max the Atmel PWM will support - if (spindle_laser_power <= SPEED_POWER_MIN) - ocr_val = (SPEED_POWER_MIN - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // minimum setting - if (spindle_laser_power >= SPEED_POWER_MAX) - ocr_val = (SPEED_POWER_MAX - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // limit to max RPM - if (SPINDLE_LASER_PWM_INVERT) ocr_val = 255 - ocr_val; - WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) - analogWrite(SPINDLE_LASER_PWM_PIN, ocr_val & 0xFF); // only write low byte - delay_for_power_up(); - } - } - #else - WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) if spindle speed option not enabled - delay_for_power_up(); - #endif - } - - /** - * M5 turn off spindle - */ - inline void gcode_M5() { - stepper.synchronize(); - WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); - #if ENABLED(SPINDLE_LASER_PWM) - analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); - #endif - delay_for_power_down(); - } - -#endif // SPINDLE_LASER_ENABLE - -/** - * M17: Enable power on all stepper motors - */ -inline void gcode_M17() { - LCD_MESSAGEPGM(MSG_NO_MOVE); - enable_all_steppers(); -} - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - - void do_pause_e_move(const float &length, const float &fr) { - set_destination_from_current(); - destination[E_AXIS] += length / planner.e_factor[active_extruder]; - planner.buffer_line_kinematic(destination, fr, active_extruder); - set_current_from_destination(); - stepper.synchronize(); - } - - static float resume_position[XYZE]; - int8_t did_pause_print = 0; - - #if HAS_BUZZER - static void filament_change_beep(const int8_t max_beep_count, const bool init=false) { - static millis_t next_buzz = 0; - static int8_t runout_beep = 0; - - if (init) next_buzz = runout_beep = 0; - - const millis_t ms = millis(); - if (ELAPSED(ms, next_buzz)) { - if (max_beep_count < 0 || runout_beep < max_beep_count + 5) { // Only beep as long as we're supposed to - next_buzz = ms + ((max_beep_count < 0 || runout_beep < max_beep_count) ? 1000 : 500); - BUZZ(50, 880 - (runout_beep & 1) * 220); - runout_beep++; - } - } - } - #endif - - /** - * Ensure a safe temperature for extrusion - * - * - Fail if the TARGET temperature is too low - * - Display LCD placard with temperature status - * - Return when heating is done or aborted - * - * Returns 'true' if heating was completed, 'false' for abort - */ - static bool ensure_safe_temperature(const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT) { - - #if ENABLED(PREVENT_COLD_EXTRUSION) - if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); - return false; - } - #endif - - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT, mode); - #else - UNUSED(mode); - #endif - - wait_for_heatup = true; // M108 will clear this - while (wait_for_heatup && thermalManager.wait_for_heating(active_extruder)) idle(); - const bool status = wait_for_heatup; - wait_for_heatup = false; - - return status; - } - - /** - * Load filament into the hotend - * - * - Fail if the a safe temperature was not reached - * - If pausing for confirmation, wait for a click or M108 - * - Show "wait for load" placard - * - Load and purge filament - * - Show "Purge more" / "Continue" menu - * - Return when "Continue" is selected - * - * Returns 'true' if load was completed, 'false' for abort - */ - static bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &purge_length=0, const int8_t max_beep_count=0, - const bool show_lcd=false, const bool pause_for_user=false, - const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT - ) { - #if DISABLED(ULTIPANEL) - UNUSED(show_lcd); - #endif - - if (!ensure_safe_temperature(mode)) { - #if ENABLED(ULTIPANEL) - if (show_lcd) // Show status screen - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - #endif - - return false; - } - - if (pause_for_user) { - #if ENABLED(ULTIPANEL) - if (show_lcd) // Show "insert filament" - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT, mode); - #endif - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_FILAMENT_CHANGE_INSERT); - - #if HAS_BUZZER - filament_change_beep(max_beep_count, true); - #else - UNUSED(max_beep_count); - #endif - - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = true; // LCD click or M108 will clear this - while (wait_for_user) { - #if HAS_BUZZER - filament_change_beep(max_beep_count); - #endif - idle(true); - } - KEEPALIVE_STATE(IN_HANDLER); - } - - #if ENABLED(ULTIPANEL) - if (show_lcd) // Show "wait for load" message - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, mode); - #endif - - // Slow Load filament - if (slow_load_length) do_pause_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); - - // Fast Load Filament - if (fast_load_length) { - #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - const float saved_acceleration = planner.retract_acceleration; - planner.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL; - #endif - - do_pause_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE); - - #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - planner.retract_acceleration = saved_acceleration; - #endif - } - - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - - #if ENABLED(ULTIPANEL) - if (show_lcd) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE); - #endif - - wait_for_user = true; - for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) - do_pause_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); - wait_for_user = false; - - #else - - do { - if (purge_length > 0) { - // "Wait for filament purge" - #if ENABLED(ULTIPANEL) - if (show_lcd) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_PURGE, mode); - #endif - - // Extrude filament to get into hotend - do_pause_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); - } - - // Show "Purge More" / "Resume" menu and wait for reply - #if ENABLED(ULTIPANEL) - if (show_lcd) { - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = false; - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_OPTION, mode); - while (advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_WAIT_FOR) idle(true); - KEEPALIVE_STATE(IN_HANDLER); - } - #endif - - // Keep looping if "Purge More" was selected - } while ( - #if ENABLED(ULTIPANEL) - show_lcd && advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE - #else - 0 - #endif - ); - - #endif - - return true; - } - - /** - * Unload filament from the hotend - * - * - Fail if the a safe temperature was not reached - * - Show "wait for unload" placard - * - Retract, pause, then unload filament - * - Disable E stepper (on most machines) - * - * Returns 'true' if unload was completed, 'false' for abort - */ - static bool unload_filament(const float &unload_length, const bool show_lcd=false, - const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT - ) { - if (!ensure_safe_temperature(mode)) { - #if ENABLED(ULTIPANEL) - if (show_lcd) // Show status screen - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - #endif - - return false; - } - - #if DISABLED(ULTIPANEL) - UNUSED(show_lcd); - #else - if (show_lcd) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, mode); - #endif - - // Retract filament - do_pause_e_move(-FILAMENT_UNLOAD_RETRACT_LENGTH, PAUSE_PARK_RETRACT_FEEDRATE); - - // Wait for filament to cool - safe_delay(FILAMENT_UNLOAD_DELAY); - - // Quickly purge - do_pause_e_move(FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH, planner.max_feedrate_mm_s[E_AXIS]); - - // Unload filament - #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - const float saved_acceleration = planner.retract_acceleration; - planner.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL; - #endif - - do_pause_e_move(unload_length, FILAMENT_CHANGE_UNLOAD_FEEDRATE); - - #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - planner.retract_acceleration = saved_acceleration; - #endif - - // Disable extruders steppers for manual filament changing (only on boards that have separate ENABLE_PINS) - #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN - disable_e_stepper(active_extruder); - safe_delay(100); - #endif - - return true; - } - - /** - * Pause procedure - * - * - Abort if already paused - * - Send host action for pause, if configured - * - Abort if TARGET temperature is too low - * - Display "wait for start of filament change" (if a length was specified) - * - Initial retract, if current temperature is hot enough - * - Park the nozzle at the given position - * - Call unload_filament (if a length was specified) - * - * Returns 'true' if pause was completed, 'false' for abort - */ - static bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false) { - if (did_pause_print) return false; // already paused - - #ifdef ACTION_ON_PAUSE - SERIAL_ECHOLNPGM("//action:" ACTION_ON_PAUSE); - #endif - - if (!DEBUGGING(DRYRUN) && unload_length && thermalManager.targetTooColdToExtrude(active_extruder)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); - - #if ENABLED(ULTIPANEL) - if (show_lcd) // Show status screen - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - LCD_MESSAGEPGM(MSG_M600_TOO_COLD); - #endif - - return false; // unable to reach safe temperature - } - - // Indicate that the printer is paused - ++did_pause_print; - - // Pause the print job and timer - #if ENABLED(SDSUPPORT) - if (card.sdprinting) { - card.pauseSDPrint(); - ++did_pause_print; // Indicate SD pause also - } - #endif - print_job_timer.pause(); - - // Save current position - COPY(resume_position, current_position); - - // Wait for synchronize steppers - stepper.synchronize(); - - // Initial retract before move to filament change position - if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) - do_pause_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); - - #if ENABLED(NO_MOTION_BEFORE_HOMING) - if (!axis_unhomed_error()) - #endif - // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) - Nozzle::park(2, park_point); - - // Unload the filament - if (unload_length) - unload_filament(unload_length, show_lcd); - - return true; - } - - /** - * - Show "Insert filament and press button to continue" - * - Wait for a click before returning - * - Heaters can time out, reheated before accepting a click - * - * Used by M125 and M600 - */ - static void wait_for_filament_reload(const int8_t max_beep_count=0) { - bool nozzle_timed_out = false; - - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); - #endif - SERIAL_ECHO_START(); - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); - - #if HAS_BUZZER - filament_change_beep(max_beep_count, true); - #endif - - // Start the heater idle timers - const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; - - HOTEND_LOOP() - thermalManager.start_heater_idle_timer(e, nozzle_timeout); - - // Wait for filament insert by user and press button - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = true; // LCD click or M108 will clear this - while (wait_for_user) { - #if HAS_BUZZER - filament_change_beep(max_beep_count); - #endif - - // If the nozzle has timed out, wait for the user to press the button to re-heat the nozzle, then - // re-heat the nozzle, re-show the insert screen, restart the idle timers, and start over - if (!nozzle_timed_out) - HOTEND_LOOP() - nozzle_timed_out |= thermalManager.is_heater_idle(e); - - if (nozzle_timed_out) { - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE); - #endif - SERIAL_ECHO_START(); - #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT); - #elif ENABLED(EMERGENCY_PARSER) - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_M108); - #else - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_LCD); - #endif - - // Wait for LCD click or M108 - while (wait_for_user) idle(true); - - // Re-enable the heaters if they timed out - HOTEND_LOOP() thermalManager.reset_heater_idle_timer(e); - - // Wait for the heaters to reach the target temperatures - ensure_safe_temperature(); - - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); - #endif - SERIAL_ECHO_START(); - #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); - #elif ENABLED(EMERGENCY_PARSER) - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_M108); - #else - SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_LCD); - #endif - - // Start the heater idle timers - const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; - - HOTEND_LOOP() - thermalManager.start_heater_idle_timer(e, nozzle_timeout); - - wait_for_user = true; // Wait for user to load filament - nozzle_timed_out = false; - - #if HAS_BUZZER - filament_change_beep(max_beep_count, true); - #endif - } - - idle(true); - } - KEEPALIVE_STATE(IN_HANDLER); - } - - /** - * Resume or Start print procedure - * - * - Abort if not paused - * - Reset heater idle timers - * - Load filament if specified, but only if: - * - a nozzle timed out, or - * - the nozzle is already heated. - * - Display "wait for print to resume" - * - Re-prime the nozzle... - * - FWRETRACT: Recover/prime from the prior G10. - * - !FWRETRACT: Retract by resume_position[E], if negative. - * Not sure how this logic comes into use. - * - Move the nozzle back to resume_position - * - Sync the planner E to resume_position[E] - * - Send host action for resume, if configured - * - Resume the current SD print job, if any - */ - static void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &purge_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0) { - if (!did_pause_print) return; - - // Re-enable the heaters if they timed out - bool nozzle_timed_out = false; - HOTEND_LOOP() { - nozzle_timed_out |= thermalManager.is_heater_idle(e); - thermalManager.reset_heater_idle_timer(e); - } - - if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) { - // Load the new filament - load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out); - } - - #if ENABLED(ULTIPANEL) - // "Wait for print to resume" - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_RESUME); - #endif - - // Intelligent resuming - #if ENABLED(FWRETRACT) - // If retracted before goto pause - if (fwretract.retracted[active_extruder]) - do_pause_e_move(-fwretract.retract_length, fwretract.retract_feedrate_mm_s); - #endif - - // If resume_position is negative - if (resume_position[E_AXIS] < 0) do_pause_e_move(resume_position[E_AXIS], PAUSE_PARK_RETRACT_FEEDRATE); - - // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position[X_AXIS], resume_position[Y_AXIS], NOZZLE_PARK_XY_FEEDRATE); - - // Set Z_AXIS to saved position - do_blocking_move_to_z(resume_position[Z_AXIS], NOZZLE_PARK_Z_FEEDRATE); - - // Now all extrusion positions are resumed and ready to be confirmed - // Set extruder to saved position - planner.set_e_position_mm((destination[E_AXIS] = current_position[E_AXIS] = resume_position[E_AXIS])); - - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - runout.reset(); - #endif - - #if ENABLED(ULTIPANEL) - // Show status screen - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - #endif - - #ifdef ACTION_ON_RESUME - SERIAL_ECHOLNPGM("//action:" ACTION_ON_RESUME); - #endif - - --did_pause_print; - - #if ENABLED(SDSUPPORT) - if (did_pause_print) { - card.startFileprint(); - --did_pause_print; - } - #endif - } - -#endif // ADVANCED_PAUSE_FEATURE - -#if ENABLED(SDSUPPORT) - - /** - * M20: List SD card to serial output - */ - inline void gcode_M20() { - SERIAL_PROTOCOLLNPGM(MSG_BEGIN_FILE_LIST); - card.ls(); - SERIAL_PROTOCOLLNPGM(MSG_END_FILE_LIST); - } - - /** - * M21: Init SD Card - */ - inline void gcode_M21() { card.initsd(); } - - /** - * M22: Release SD Card - */ - inline void gcode_M22() { card.release(); } - - /** - * M23: Open a file - */ - inline void gcode_M23() { - // Simplify3D includes the size, so zero out all spaces (#7227) - for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0'; - card.openFile(parser.string_arg, true); - } - - /** - * M24: Start or Resume SD Print - */ - inline void gcode_M24() { - #if ENABLED(POWER_LOSS_RECOVERY) - card.removeJobRecoveryFile(); - #endif - - #if ENABLED(PARK_HEAD_ON_PAUSE) - resume_print(); - #endif - - card.startFileprint(); - print_job_timer.start(); - } - - /** - * M25: Pause SD Print - */ - inline void gcode_M25() { - card.pauseSDPrint(); - print_job_timer.pause(); - - #if ENABLED(PARK_HEAD_ON_PAUSE) - enqueue_and_echo_commands_P(PSTR("M125")); // Must be enqueued with pauseSDPrint set to be last in the buffer - #endif - } - - /** - * M26: Set SD Card file index - */ - inline void gcode_M26() { - if (card.cardOK && parser.seenval('S')) - card.setIndex(parser.value_long()); - } - - /** - * M27: Get SD Card status - * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) - * OR, with 'C' get the current filename. - */ - inline void gcode_M27() { - if (parser.seen('C')) { - SERIAL_ECHOPGM("Current file: "); - card.printFilename(); - } - - #if ENABLED(AUTO_REPORT_SD_STATUS) - else if (parser.seenval('S')) - card.set_auto_report_interval(parser.value_byte()); - #endif - - else - card.getStatus(); - } - - /** - * M28: Start SD Write - */ - inline void gcode_M28() { card.openFile(parser.string_arg, false); } - - /** - * M29: Stop SD Write - * Processed in write to file routine above - */ - inline void gcode_M29() { - // card.saving = false; - } - - /** - * M30 : Delete SD Card file - */ - inline void gcode_M30() { - if (card.cardOK) { - card.closefile(); - card.removeFile(parser.string_arg); - } - } - -#endif // SDSUPPORT - -/** - * M31: Get the time since the start of SD Print (or last M109) - */ -inline void gcode_M31() { - char buffer[21]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toString(buffer); - lcd_setstatus(buffer); - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Print time: ", buffer); -} - -#if ENABLED(SDSUPPORT) - - /** - * M32: Select file and start SD Print - * - * Examples: - * - * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO - * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure - * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 - * - */ - inline void gcode_M32() { - if (card.sdprinting) stepper.synchronize(); - - if (card.cardOK) { - const bool call_procedure = parser.boolval('P'); - - card.openFile(parser.string_arg, true, call_procedure); - - if (parser.seenval('S')) card.setIndex(parser.value_long()); - - card.startFileprint(); - - // Procedure calls count as normal print time. - if (!call_procedure) print_job_timer.start(); - } - } - - #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - - /** - * M33: Get the long full path of a file or folder - * - * Parameters: - * Case-insensitive DOS-style path to a file or folder - * - * Example: - * M33 miscel~1/armchair/armcha~1.gco - * - * Output: - * /Miscellaneous/Armchair/Armchair.gcode - */ - inline void gcode_M33() { - card.printLongPath(parser.string_arg); - } - - #endif - - #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) - /** - * M34: Set SD Card Sorting Options - */ - inline void gcode_M34() { - if (parser.seen('S')) card.setSortOn(parser.value_bool()); - if (parser.seenval('F')) { - const int v = parser.value_long(); - card.setSortFolders(v < 0 ? -1 : v > 0 ? 1 : 0); - } - //if (parser.seen('R')) card.setSortReverse(parser.value_bool()); - } - #endif // SDCARD_SORT_ALPHA && SDSORT_GCODE - - /** - * M928: Start SD Write - */ - inline void gcode_M928() { - card.openLogFile(parser.string_arg); - } - -#endif // SDSUPPORT - -/** - * Sensitive pin test for M42, M226 - */ -static bool pin_is_protected(const pin_t pin) { - static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; - for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) - if (pin == (pin_t)pgm_read_byte(&sensitive_pins[i])) return true; - return false; -} - -/** - * M42: Change pin status via GCode - * - * P Pin number (LED if omitted) - * S Pin status from 0 - 255 - */ -inline void gcode_M42() { - if (!parser.seenval('S')) return; - const byte pin_status = parser.value_byte(); - - const pin_t pin_number = parser.byteval('P', LED_PIN); - if (pin_number < 0) return; - - if (pin_is_protected(pin_number)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_PROTECTED_PIN); - return; - } - - pinMode(pin_number, OUTPUT); - digitalWrite(pin_number, pin_status); - analogWrite(pin_number, pin_status); - - #if FAN_COUNT > 0 - switch (pin_number) { - #if HAS_FAN0 - case FAN_PIN: fanSpeeds[0] = pin_status; break; - #endif - #if HAS_FAN1 - case FAN1_PIN: fanSpeeds[1] = pin_status; break; - #endif - #if HAS_FAN2 - case FAN2_PIN: fanSpeeds[2] = pin_status; break; - #endif - } - #endif -} - -#if ENABLED(PINS_DEBUGGING) - - #include "pinsDebug.h" - - inline void toggle_pins() { - const bool I_flag = parser.boolval('I'); - const int repeat = parser.intval('R', 1), - start = parser.intval('S'), - end = parser.intval('L', NUM_DIGITAL_PINS - 1), - wait = parser.intval('W', 500); - - for (uint8_t pin = start; pin <= end; pin++) { - //report_pin_state_extended(pin, I_flag, false); - - if (!I_flag && pin_is_protected(pin)) { - report_pin_state_extended(pin, I_flag, true, "Untouched "); - SERIAL_EOL(); - } - else { - report_pin_state_extended(pin, I_flag, true, "Pulsing "); - #if AVR_AT90USB1286_FAMILY // Teensy IDEs don't know about these pins so must use FASTIO - if (pin == TEENSY_E2) { - SET_OUTPUT(TEENSY_E2); - for (int16_t j = 0; j < repeat; j++) { - WRITE(TEENSY_E2, LOW); safe_delay(wait); - WRITE(TEENSY_E2, HIGH); safe_delay(wait); - WRITE(TEENSY_E2, LOW); safe_delay(wait); - } - } - else if (pin == TEENSY_E3) { - SET_OUTPUT(TEENSY_E3); - for (int16_t j = 0; j < repeat; j++) { - WRITE(TEENSY_E3, LOW); safe_delay(wait); - WRITE(TEENSY_E3, HIGH); safe_delay(wait); - WRITE(TEENSY_E3, LOW); safe_delay(wait); - } - } - else - #endif - { - pinMode(pin, OUTPUT); - for (int16_t j = 0; j < repeat; j++) { - digitalWrite(pin, 0); safe_delay(wait); - digitalWrite(pin, 1); safe_delay(wait); - digitalWrite(pin, 0); safe_delay(wait); - } - } - - } - SERIAL_EOL(); - } - SERIAL_ECHOLNPGM("Done."); - - } // toggle_pins - - inline void servo_probe_test() { - #if !(NUM_SERVOS > 0 && HAS_SERVO_0) - - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("SERVO not setup"); - - #elif !HAS_Z_SERVO_PROBE - - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Z_PROBE_SERVO_NR not setup"); - - #else // HAS_Z_SERVO_PROBE - - const uint8_t probe_index = parser.byteval('P', Z_PROBE_SERVO_NR); - - SERIAL_PROTOCOLLNPGM("Servo probe test"); - SERIAL_PROTOCOLLNPAIR(". using index: ", probe_index); - SERIAL_PROTOCOLLNPAIR(". deploy angle: ", z_servo_angle[0]); - SERIAL_PROTOCOLLNPAIR(". stow angle: ", z_servo_angle[1]); - - bool probe_inverting; - - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - - #define PROBE_TEST_PIN Z_MIN_PIN - - SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN pin: ", PROBE_TEST_PIN); - SERIAL_PROTOCOLLNPGM(". uses Z_MIN_ENDSTOP_INVERTING (ignores Z_MIN_PROBE_ENDSTOP_INVERTING)"); - SERIAL_PROTOCOLPGM(". Z_MIN_ENDSTOP_INVERTING: "); - - #if Z_MIN_ENDSTOP_INVERTING - SERIAL_PROTOCOLLNPGM("true"); - #else - SERIAL_PROTOCOLLNPGM("false"); - #endif - - probe_inverting = Z_MIN_ENDSTOP_INVERTING; - - #elif ENABLED(Z_MIN_PROBE_ENDSTOP) - - #define PROBE_TEST_PIN Z_MIN_PROBE_PIN - SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN_PROBE_PIN: ", PROBE_TEST_PIN); - SERIAL_PROTOCOLLNPGM(". uses Z_MIN_PROBE_ENDSTOP_INVERTING (ignores Z_MIN_ENDSTOP_INVERTING)"); - SERIAL_PROTOCOLPGM(". Z_MIN_PROBE_ENDSTOP_INVERTING: "); - - #if Z_MIN_PROBE_ENDSTOP_INVERTING - SERIAL_PROTOCOLLNPGM("true"); - #else - SERIAL_PROTOCOLLNPGM("false"); - #endif - - probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; - - #endif - - SERIAL_PROTOCOLLNPGM(". deploy & stow 4 times"); - SET_INPUT_PULLUP(PROBE_TEST_PIN); - bool deploy_state, stow_state; - for (uint8_t i = 0; i < 4; i++) { - MOVE_SERVO(probe_index, z_servo_angle[0]); //deploy - safe_delay(500); - deploy_state = READ(PROBE_TEST_PIN); - MOVE_SERVO(probe_index, z_servo_angle[1]); //stow - safe_delay(500); - stow_state = READ(PROBE_TEST_PIN); - } - if (probe_inverting != deploy_state) SERIAL_PROTOCOLLNPGM("WARNING - INVERTING setting probably backwards"); - - if (deploy_state != stow_state) { - SERIAL_PROTOCOLLNPGM("BLTouch clone detected"); - if (deploy_state) { - SERIAL_PROTOCOLLNPGM(". DEPLOYED state: HIGH (logic 1)"); - SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: LOW (logic 0)"); - } - else { - SERIAL_PROTOCOLLNPGM(". DEPLOYED state: LOW (logic 0)"); - SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: HIGH (logic 1)"); - } - #if ENABLED(BLTOUCH) - SERIAL_PROTOCOLLNPGM("ERROR: BLTOUCH enabled - set this device up as a Z Servo Probe with inverting as true."); - #endif - - } - else { // measure active signal length - MOVE_SERVO(probe_index, z_servo_angle[0]); // deploy - safe_delay(500); - SERIAL_PROTOCOLLNPGM("please trigger probe"); - uint16_t probe_counter = 0; - - // Allow 30 seconds max for operator to trigger probe - for (uint16_t j = 0; j < 500 * 30 && probe_counter == 0 ; j++) { - - safe_delay(2); - - if (0 == j % (500 * 1)) reset_stepper_timeout(); // Keep steppers powered - - if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered - - for (probe_counter = 1; probe_counter < 50 && deploy_state != READ(PROBE_TEST_PIN); ++probe_counter) - safe_delay(2); - - if (probe_counter == 50) - SERIAL_PROTOCOLLNPGM("Z Servo Probe detected"); // >= 100mS active time - else if (probe_counter >= 2) - SERIAL_PROTOCOLLNPAIR("BLTouch compatible probe detected - pulse width (+/- 4mS): ", probe_counter * 2); // allow 4 - 100mS pulse - else - SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse - - MOVE_SERVO(probe_index, z_servo_angle[1]); //stow - - } // pulse detected - - } // for loop waiting for trigger - - if (probe_counter == 0) SERIAL_PROTOCOLLNPGM("trigger not detected"); - - } // measure active signal length - - #endif - - } // servo_probe_test - - /** - * M43: Pin debug - report pin state, watch pins, toggle pins and servo probe test/report - * - * M43 - report name and state of pin(s) - * P Pin to read or watch. If omitted, reads all pins. - * I Flag to ignore Marlin's pin protection. - * - * M43 W - Watch pins -reporting changes- until reset, click, or M108. - * P Pin to read or watch. If omitted, read/watch all pins. - * I Flag to ignore Marlin's pin protection. - * - * M43 E - Enable / disable background endstop monitoring - * - Machine continues to operate - * - Reports changes to endstops - * - Toggles LED_PIN when an endstop changes - * - Can not reliably catch the 5mS pulse from BLTouch type probes - * - * M43 T - Toggle pin(s) and report which pin is being toggled - * S - Start Pin number. If not given, will default to 0 - * L - End Pin number. If not given, will default to last pin defined for this board - * I - Flag to ignore Marlin's pin protection. Use with caution!!!! - * R - Repeat pulses on each pin this number of times before continueing to next pin - * W - Wait time (in miliseconds) between pulses. If not given will default to 500 - * - * M43 S - Servo probe test - * P - Probe index (optional - defaults to 0 - */ - inline void gcode_M43() { - - if (parser.seen('T')) { // must be first or else its "S" and "E" parameters will execute endstop or servo test - toggle_pins(); - return; - } - - // Enable or disable endstop monitoring - if (parser.seen('E')) { - endstop_monitor_flag = parser.value_bool(); - SERIAL_PROTOCOLPGM("endstop monitor "); - serialprintPGM(endstop_monitor_flag ? PSTR("en") : PSTR("dis")); - SERIAL_PROTOCOLLNPGM("abled"); - return; - } - - if (parser.seen('S')) { - servo_probe_test(); - return; - } - - // Get the range of pins to test or watch - const pin_t first_pin = parser.byteval('P'), - last_pin = parser.seenval('P') ? first_pin : NUM_DIGITAL_PINS - 1; - - if (first_pin > last_pin) return; - - const bool ignore_protection = parser.boolval('I'); - - // Watch until click, M108, or reset - if (parser.boolval('W')) { - SERIAL_PROTOCOLLNPGM("Watching pins"); - byte pin_state[last_pin - first_pin + 1]; - for (pin_t pin = first_pin; pin <= last_pin; pin++) { - if (pin_is_protected(pin) && !ignore_protection) continue; - pinMode(pin, INPUT_PULLUP); - delay(1); - /* - if (IS_ANALOG(pin)) - pin_state[pin - first_pin] = analogRead(pin - analogInputToDigitalPin(0)); // int16_t pin_state[...] - else - //*/ - pin_state[pin - first_pin] = digitalRead(pin); - } - - #if HAS_RESUME_CONTINUE - wait_for_user = true; - KEEPALIVE_STATE(PAUSED_FOR_USER); - #endif - - for (;;) { - for (pin_t pin = first_pin; pin <= last_pin; pin++) { - if (pin_is_protected(pin) && !ignore_protection) continue; - const byte val = - /* - IS_ANALOG(pin) - ? analogRead(pin - analogInputToDigitalPin(0)) : // int16_t val - : - //*/ - digitalRead(pin); - if (val != pin_state[pin - first_pin]) { - report_pin_state_extended(pin, ignore_protection, false); - pin_state[pin - first_pin] = val; - } - } - - #if HAS_RESUME_CONTINUE - if (!wait_for_user) { - KEEPALIVE_STATE(IN_HANDLER); - break; - } - #endif - - safe_delay(200); - } - return; - } - - // Report current state of selected pin(s) - for (pin_t pin = first_pin; pin <= last_pin; pin++) - report_pin_state_extended(pin, ignore_protection, true); - } - -#endif // PINS_DEBUGGING - -#if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - - /** - * M48: Z probe repeatability measurement function. - * - * Usage: - * M48 - * P = Number of sampled points (4-50, default 10) - * X = Sample X position - * Y = Sample Y position - * V = Verbose level (0-4, default=1) - * E = Engage Z probe for each reading - * L = Number of legs of movement before probe - * S = Schizoid (Or Star if you prefer) - * - * This function requires the machine to be homed before invocation. - */ - inline void gcode_M48() { - - if (axis_unhomed_error()) return; - - const int8_t verbose_level = parser.byteval('V', 1); - if (!WITHIN(verbose_level, 0, 4)) { - SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); - return; - } - - if (verbose_level > 0) - SERIAL_PROTOCOLLNPGM("M48 Z-Probe Repeatability Test"); - - const int8_t n_samples = parser.byteval('P', 10); - if (!WITHIN(n_samples, 4, 50)) { - SERIAL_PROTOCOLLNPGM("?Sample size not plausible (4-50)."); - return; - } - - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - - float X_current = current_position[X_AXIS], - Y_current = current_position[Y_AXIS]; - - const float X_probe_location = parser.linearval('X', X_current + X_PROBE_OFFSET_FROM_EXTRUDER), - Y_probe_location = parser.linearval('Y', Y_current + Y_PROBE_OFFSET_FROM_EXTRUDER); - - if (!position_is_reachable_by_probe(X_probe_location, Y_probe_location)) { - SERIAL_PROTOCOLLNPGM("? (X,Y) out of bounds."); - return; - } - - bool seen_L = parser.seen('L'); - uint8_t n_legs = seen_L ? parser.value_byte() : 0; - if (n_legs > 15) { - SERIAL_PROTOCOLLNPGM("?Number of legs in movement not plausible (0-15)."); - return; - } - if (n_legs == 1) n_legs = 2; - - const bool schizoid_flag = parser.boolval('S'); - if (schizoid_flag && !seen_L) n_legs = 7; - - /** - * Now get everything to the specified probe point So we can safely do a - * probe to get us close to the bed. If the Z-Axis is far from the bed, - * we don't want to use that as a starting point for each probe. - */ - if (verbose_level > 2) - SERIAL_PROTOCOLLNPGM("Positioning the probe..."); - - // Disable bed level correction in M48 because we want the raw data when we probe - - #if HAS_LEVELING - const bool was_enabled = planner.leveling_active; - set_bed_leveling_enabled(false); - #endif - - setup_for_endstop_or_probe_move(); - - double mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; - - // Move to the first point, deploy, and probe - const float t = probe_pt(X_probe_location, Y_probe_location, raise_after, verbose_level); - bool probing_good = !isnan(t); - - if (probing_good) { - randomSeed(millis()); - - for (uint8_t n = 0; n < n_samples; n++) { - if (n_legs) { - const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise - float angle = random(0.0, 360.0); - const float radius = random( - #if ENABLED(DELTA) - 0.1250000000 * (DELTA_PRINTABLE_RADIUS), - 0.3333333333 * (DELTA_PRINTABLE_RADIUS) - #else - 5.0, 0.125 * min(X_BED_SIZE, Y_BED_SIZE) - #endif - ); - - if (verbose_level > 3) { - SERIAL_ECHOPAIR("Starting radius: ", radius); - SERIAL_ECHOPAIR(" angle: ", angle); - SERIAL_ECHOPGM(" Direction: "); - if (dir > 0) SERIAL_ECHOPGM("Counter-"); - SERIAL_ECHOLNPGM("Clockwise"); - } - - for (uint8_t l = 0; l < n_legs - 1; l++) { - double delta_angle; - - if (schizoid_flag) - // The points of a 5 point star are 72 degrees apart. We need to - // skip a point and go to the next one on the star. - delta_angle = dir * 2.0 * 72.0; - - else - // If we do this line, we are just trying to move further - // around the circle. - delta_angle = dir * (float) random(25, 45); - - angle += delta_angle; - - while (angle > 360.0) // We probably do not need to keep the angle between 0 and 2*PI, but the - angle -= 360.0; // Arduino documentation says the trig functions should not be given values - while (angle < 0.0) // outside of this range. It looks like they behave correctly with - angle += 360.0; // numbers outside of the range, but just to be safe we clamp them. - - X_current = X_probe_location - (X_PROBE_OFFSET_FROM_EXTRUDER) + cos(RADIANS(angle)) * radius; - Y_current = Y_probe_location - (Y_PROBE_OFFSET_FROM_EXTRUDER) + sin(RADIANS(angle)) * radius; - - #if DISABLED(DELTA) - X_current = constrain(X_current, X_MIN_POS, X_MAX_POS); - Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS); - #else - // If we have gone out too far, we can do a simple fix and scale the numbers - // back in closer to the origin. - while (!position_is_reachable_by_probe(X_current, Y_current)) { - X_current *= 0.8; - Y_current *= 0.8; - if (verbose_level > 3) { - SERIAL_ECHOPAIR("Pulling point towards center:", X_current); - SERIAL_ECHOLNPAIR(", ", Y_current); - } - } - #endif - if (verbose_level > 3) { - SERIAL_PROTOCOLPGM("Going to:"); - SERIAL_ECHOPAIR(" X", X_current); - SERIAL_ECHOPAIR(" Y", Y_current); - SERIAL_ECHOLNPAIR(" Z", current_position[Z_AXIS]); - } - do_blocking_move_to_xy(X_current, Y_current); - } // n_legs loop - } // n_legs - - // Probe a single point - sample_set[n] = probe_pt(X_probe_location, Y_probe_location, raise_after); - - // Break the loop if the probe fails - probing_good = !isnan(sample_set[n]); - if (!probing_good) break; - - /** - * Get the current mean for the data points we have so far - */ - double sum = 0.0; - for (uint8_t j = 0; j <= n; j++) sum += sample_set[j]; - mean = sum / (n + 1); - - NOMORE(min, sample_set[n]); - NOLESS(max, sample_set[n]); - - /** - * Now, use that mean to calculate the standard deviation for the - * data points we have so far - */ - sum = 0.0; - for (uint8_t j = 0; j <= n; j++) - sum += sq(sample_set[j] - mean); - - sigma = SQRT(sum / (n + 1)); - if (verbose_level > 0) { - if (verbose_level > 1) { - SERIAL_PROTOCOL(n + 1); - SERIAL_PROTOCOLPGM(" of "); - SERIAL_PROTOCOL((int)n_samples); - SERIAL_PROTOCOLPGM(": z: "); - SERIAL_PROTOCOL_F(sample_set[n], 3); - if (verbose_level > 2) { - SERIAL_PROTOCOLPGM(" mean: "); - SERIAL_PROTOCOL_F(mean, 4); - SERIAL_PROTOCOLPGM(" sigma: "); - SERIAL_PROTOCOL_F(sigma, 6); - SERIAL_PROTOCOLPGM(" min: "); - SERIAL_PROTOCOL_F(min, 3); - SERIAL_PROTOCOLPGM(" max: "); - SERIAL_PROTOCOL_F(max, 3); - SERIAL_PROTOCOLPGM(" range: "); - SERIAL_PROTOCOL_F(max-min, 3); - } - SERIAL_EOL(); - } - } - - } // n_samples loop - } - - STOW_PROBE(); - - if (probing_good) { - SERIAL_PROTOCOLLNPGM("Finished!"); - - if (verbose_level > 0) { - SERIAL_PROTOCOLPGM("Mean: "); - SERIAL_PROTOCOL_F(mean, 6); - SERIAL_PROTOCOLPGM(" Min: "); - SERIAL_PROTOCOL_F(min, 3); - SERIAL_PROTOCOLPGM(" Max: "); - SERIAL_PROTOCOL_F(max, 3); - SERIAL_PROTOCOLPGM(" Range: "); - SERIAL_PROTOCOL_F(max-min, 3); - SERIAL_EOL(); - } - - SERIAL_PROTOCOLPGM("Standard Deviation: "); - SERIAL_PROTOCOL_F(sigma, 6); - SERIAL_EOL(); - SERIAL_EOL(); - } - - clean_up_after_endstop_or_probe_move(); - - // Re-enable bed level correction if it had been on - #if HAS_LEVELING - set_bed_leveling_enabled(was_enabled); - #endif - - #ifdef Z_AFTER_PROBING - move_z_after_probing(); - #endif - - report_current_position(); - } - -#endif // Z_MIN_PROBE_REPEATABILITY_TEST - -#if ENABLED(G26_MESH_VALIDATION) - - inline void gcode_M49() { - g26_debug_flag ^= true; - SERIAL_PROTOCOLPGM("G26 Debug "); - serialprintPGM(g26_debug_flag ? PSTR("on.\n") : PSTR("off.\n")); - } - -#endif // G26_MESH_VALIDATION - -#if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) - /** - * M73: Set percentage complete (for display on LCD) - * - * Example: - * M73 P25 ; Set progress to 25% - * - * Notes: - * This has no effect during an SD print job - */ - inline void gcode_M73() { - if (!IS_SD_PRINTING && parser.seen('P')) { - progress_bar_percent = parser.value_byte(); - NOMORE(progress_bar_percent, 100); - } - } -#endif // ULTRA_LCD && LCD_SET_PROGRESS_MANUALLY - -/** - * M75: Start print timer - */ -inline void gcode_M75() { print_job_timer.start(); } - -/** - * M76: Pause print timer - */ -inline void gcode_M76() { print_job_timer.pause(); } - -/** - * M77: Stop print timer - */ -inline void gcode_M77() { print_job_timer.stop(); } - -#if ENABLED(PRINTCOUNTER) - /** - * M78: Show print statistics - */ - inline void gcode_M78() { - // "M78 S78" will reset the statistics - if (parser.intval('S') == 78) - print_job_timer.initStats(); - else - print_job_timer.showStats(); - } -#endif - -/** - * M104: Set hot end temperature - */ -inline void gcode_M104() { - if (get_target_extruder_from_command(104)) return; - if (DEBUGGING(DRYRUN)) return; - - #if ENABLED(SINGLENOZZLE) - if (target_extruder != active_extruder) return; - #endif - - if (parser.seenval('S')) { - const int16_t temp = parser.value_celsius(); - thermalManager.setTargetHotend(temp, target_extruder); - - #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) - thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); - #endif - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Stop the timer at the end of print. Start is managed by 'heat and wait' M109. - * We use half EXTRUDE_MINTEMP here to allow nozzles to be put into hot - * standby mode, for instance in a dual extruder setup, without affecting - * the running print timer. - */ - if (parser.value_celsius() <= (EXTRUDE_MINTEMP) / 2) { - print_job_timer.stop(); - LCD_MESSAGEPGM(WELCOME_MSG); - } - #endif - - #if ENABLED(ULTRA_LCD) - if (parser.value_celsius() > thermalManager.degHotend(target_extruder)) - #if HOTENDS > 1 - lcd_status_printf_P(0, PSTR("E%i " MSG_HEATING), target_extruder + 1); - #else - LCD_MESSAGEPGM("E " MSG_HEATING); - #endif - #endif - } - - #if ENABLED(AUTOTEMP) - planner.autotemp_M104_M109(); - #endif -} - -/** - * M105: Read hot end and bed temperature - */ -inline void gcode_M105() { - if (get_target_extruder_from_command(105)) return; - - #if HAS_TEMP_SENSOR - SERIAL_PROTOCOLPGM(MSG_OK); - thermalManager.print_heaterstates(); - #else // !HAS_TEMP_SENSOR - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS); - #endif - - SERIAL_EOL(); -} - -#if ENABLED(AUTO_REPORT_TEMPERATURES) - - /** - * M155: Set temperature auto-report interval. M155 S - */ - inline void gcode_M155() { - if (parser.seenval('S')) - thermalManager.set_auto_report_interval(parser.value_byte()); - } - -#endif // AUTO_REPORT_TEMPERATURES - -#if FAN_COUNT > 0 - - /** - * M106: Set Fan Speed - * - * S Speed between 0-255 - * P Fan index, if more than one fan - * - * With EXTRA_FAN_SPEED enabled: - * - * T Restore/Use/Set Temporary Speed: - * 1 = Restore previous speed after T2 - * 2 = Use temporary speed set with T3-255 - * 3-255 = Set the speed for use with T2 - */ - inline void gcode_M106() { - const uint8_t p = parser.byteval('P'); - if (p < FAN_COUNT) { - #if ENABLED(EXTRA_FAN_SPEED) - const int16_t t = parser.intval('T'); - if (t > 0) { - switch (t) { - case 1: - fanSpeeds[p] = old_fanSpeeds[p]; - break; - case 2: - old_fanSpeeds[p] = fanSpeeds[p]; - fanSpeeds[p] = new_fanSpeeds[p]; - break; - default: - new_fanSpeeds[p] = min(t, 255); - break; - } - return; - } - #endif // EXTRA_FAN_SPEED - const uint16_t s = parser.ushortval('S', 255); - fanSpeeds[p] = min(s, 255); - } - } - - /** - * M107: Fan Off - */ - inline void gcode_M107() { - const uint16_t p = parser.ushortval('P'); - if (p < FAN_COUNT) fanSpeeds[p] = 0; - } - -#endif // FAN_COUNT > 0 - -#if DISABLED(EMERGENCY_PARSER) - - /** - * M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature. - */ - inline void gcode_M108() { wait_for_heatup = false; } - - - /** - * M112: Emergency Stop - */ - inline void gcode_M112() { kill(PSTR(MSG_KILLED)); } - - - /** - * M410: Quickstop - Abort all planned moves - * - * This will stop the carriages mid-move, so most likely they - * will be out of sync with the stepper position after this. - */ - inline void gcode_M410() { quickstop_stepper(); } - -#endif - -/** - * M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating. - * Rxxx Wait for extruder(s) to reach temperature. Waits when heating and cooling. - */ - -#ifndef MIN_COOLING_SLOPE_DEG - #define MIN_COOLING_SLOPE_DEG 1.50 -#endif -#ifndef MIN_COOLING_SLOPE_TIME - #define MIN_COOLING_SLOPE_TIME 60 -#endif - -inline void gcode_M109() { - - if (get_target_extruder_from_command(109)) return; - if (DEBUGGING(DRYRUN)) return; - - #if ENABLED(SINGLENOZZLE) - if (target_extruder != active_extruder) return; - #endif - - const bool no_wait_for_cooling = parser.seenval('S'); - if (no_wait_for_cooling || parser.seenval('R')) { - const int16_t temp = parser.value_celsius(); - thermalManager.setTargetHotend(temp, target_extruder); - - #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) - thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); - #endif - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Use half EXTRUDE_MINTEMP to allow nozzles to be put into hot - * standby mode, (e.g., in a dual extruder setup) without affecting - * the running print timer. - */ - if (parser.value_celsius() <= (EXTRUDE_MINTEMP) / 2) { - print_job_timer.stop(); - LCD_MESSAGEPGM(WELCOME_MSG); - } - else - print_job_timer.start(); - #endif - - #if ENABLED(ULTRA_LCD) - const bool heating = thermalManager.isHeatingHotend(target_extruder); - if (heating || !no_wait_for_cooling) - #if HOTENDS > 1 - lcd_status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), target_extruder + 1); - #else - lcd_setstatusPGM(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING)); - #endif - #endif - } - else return; - - #if ENABLED(AUTOTEMP) - planner.autotemp_M104_M109(); - #endif - - #if TEMP_RESIDENCY_TIME > 0 - millis_t residency_start_ms = 0; - // Loop until the temperature has stabilized - #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL)) - #else - // Loop until the temperature is very close target - #define TEMP_CONDITIONS (wants_to_cool ? thermalManager.isCoolingHotend(target_extruder) : thermalManager.isHeatingHotend(target_extruder)) - #endif - - float target_temp = -1.0, old_temp = 9999.0; - bool wants_to_cool = false; - wait_for_heatup = true; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = thermalManager.degHotend(target_extruder); - uint8_t old_blue = 0; - #endif - - do { - // Target temperature might be changed during the loop - if (target_temp != thermalManager.degTargetHotend(target_extruder)) { - wants_to_cool = thermalManager.isCoolingHotend(target_extruder); - target_temp = thermalManager.degTargetHotend(target_extruder); - - // Exit if S, continue if S, R, or R - if (no_wait_for_cooling && wants_to_cool) break; - } - - now = millis(); - if (ELAPSED(now, next_temp_ms)) { //Print temp & remaining time every 1s while waiting - next_temp_ms = now + 1000UL; - thermalManager.print_heaterstates(); - #if TEMP_RESIDENCY_TIME > 0 - SERIAL_PROTOCOLPGM(" W:"); - if (residency_start_ms) - SERIAL_PROTOCOL(long((((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); - else - SERIAL_PROTOCOLCHAR('?'); - #endif - SERIAL_EOL(); - } - - idle(); - reset_stepper_timeout(); // Keep steppers powered - - const float temp = thermalManager.degHotend(target_extruder); - - #if ENABLED(PRINTER_EVENT_LEDS) - // Gradually change LED strip from violet to red as nozzle heats up - if (!wants_to_cool) { - const uint8_t blue = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 255, 0); - if (blue != old_blue) { - old_blue = blue; - leds.set_color( - MakeLEDColor(255, 0, blue, 0, pixels.getBrightness()) - #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) - , true - #endif - ); - } - } - #endif - - #if TEMP_RESIDENCY_TIME > 0 - - const float temp_diff = FABS(target_temp - temp); - - if (!residency_start_ms) { - // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_WINDOW) residency_start_ms = now; - } - else if (temp_diff > TEMP_HYSTERESIS) { - // Restart the timer whenever the temperature falls outside the hysteresis. - residency_start_ms = now; - } - - #endif - - // Prevent a wait-forever situation if R is misused i.e. M109 R0 - if (wants_to_cool) { - // break after MIN_COOLING_SLOPE_TIME seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { - if (old_temp - temp < MIN_COOLING_SLOPE_DEG) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; - old_temp = temp; - } - } - - } while (wait_for_heatup && TEMP_CONDITIONS); - - if (wait_for_heatup) { - lcd_reset_status(); - #if ENABLED(PRINTER_EVENT_LEDS) - leds.set_white(); - #endif - } - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(IN_HANDLER); - #endif -} - -#if HAS_HEATED_BED - - /** - * M140: Set bed temperature - */ - inline void gcode_M140() { - if (DEBUGGING(DRYRUN)) return; - if (parser.seenval('S')) thermalManager.setTargetBed(parser.value_celsius()); - } - - #ifndef MIN_COOLING_SLOPE_DEG_BED - #define MIN_COOLING_SLOPE_DEG_BED 1.50 - #endif - #ifndef MIN_COOLING_SLOPE_TIME_BED - #define MIN_COOLING_SLOPE_TIME_BED 60 - #endif - - /** - * M190: Sxxx Wait for bed current temp to reach target temp. Waits only when heating - * Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling - */ - inline void gcode_M190() { - if (DEBUGGING(DRYRUN)) return; - - const bool no_wait_for_cooling = parser.seenval('S'); - if (no_wait_for_cooling || parser.seenval('R')) { - thermalManager.setTargetBed(parser.value_celsius()); - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - if (parser.value_celsius() > BED_MINTEMP) - print_job_timer.start(); - #endif - } - else return; - - lcd_setstatusPGM(thermalManager.isHeatingBed() ? PSTR(MSG_BED_HEATING) : PSTR(MSG_BED_COOLING)); - - #if TEMP_BED_RESIDENCY_TIME > 0 - millis_t residency_start_ms = 0; - // Loop until the temperature has stabilized - #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_BED_RESIDENCY_TIME) * 1000UL)) - #else - // Loop until the temperature is very close target - #define TEMP_BED_CONDITIONS (wants_to_cool ? thermalManager.isCoolingBed() : thermalManager.isHeatingBed()) - #endif - - float target_temp = -1.0, old_temp = 9999.0; - bool wants_to_cool = false; - wait_for_heatup = true; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - target_extruder = active_extruder; // for print_heaterstates - - #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = thermalManager.degBed(); - uint8_t old_red = 127; - #endif - - do { - // Target temperature might be changed during the loop - if (target_temp != thermalManager.degTargetBed()) { - wants_to_cool = thermalManager.isCoolingBed(); - target_temp = thermalManager.degTargetBed(); - - // Exit if S, continue if S, R, or R - if (no_wait_for_cooling && wants_to_cool) break; - } - - now = millis(); - if (ELAPSED(now, next_temp_ms)) { //Print Temp Reading every 1 second while heating up. - next_temp_ms = now + 1000UL; - thermalManager.print_heaterstates(); - #if TEMP_BED_RESIDENCY_TIME > 0 - SERIAL_PROTOCOLPGM(" W:"); - if (residency_start_ms) - SERIAL_PROTOCOL(long((((TEMP_BED_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); - else - SERIAL_PROTOCOLCHAR('?'); - #endif - SERIAL_EOL(); - } - - idle(); - reset_stepper_timeout(); // Keep steppers powered - - const float temp = thermalManager.degBed(); - - #if ENABLED(PRINTER_EVENT_LEDS) - // Gradually change LED strip from blue to violet as bed heats up - if (!wants_to_cool) { - const uint8_t red = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 0, 255); - if (red != old_red) { - old_red = red; - leds.set_color( - MakeLEDColor(red, 0, 255, 0, pixels.getBrightness()) - #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) - , true - #endif - ); - } - } - #endif - - #if TEMP_BED_RESIDENCY_TIME > 0 - - const float temp_diff = FABS(target_temp - temp); - - if (!residency_start_ms) { - // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_BED_WINDOW) residency_start_ms = now; - } - else if (temp_diff > TEMP_BED_HYSTERESIS) { - // Restart the timer whenever the temperature falls outside the hysteresis. - residency_start_ms = now; - } - - #endif // TEMP_BED_RESIDENCY_TIME > 0 - - // Prevent a wait-forever situation if R is misused i.e. M190 R0 - if (wants_to_cool) { - // Break after MIN_COOLING_SLOPE_TIME_BED seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { - if (old_temp - temp < MIN_COOLING_SLOPE_DEG_BED) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; - old_temp = temp; - } - } - - } while (wait_for_heatup && TEMP_BED_CONDITIONS); - - if (wait_for_heatup) lcd_reset_status(); - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(IN_HANDLER); - #endif - } - -#endif // HAS_HEATED_BED - -/** - * M110: Set Current Line Number - */ -inline void gcode_M110() { - if (parser.seenval('N')) gcode_LastN = parser.value_long(); -} - -/** - * M111: Set the debug level - */ -inline void gcode_M111() { - if (parser.seen('S')) marlin_debug_flags = parser.byteval('S'); - - static const char str_debug_1[] PROGMEM = MSG_DEBUG_ECHO, - str_debug_2[] PROGMEM = MSG_DEBUG_INFO, - str_debug_4[] PROGMEM = MSG_DEBUG_ERRORS, - str_debug_8[] PROGMEM = MSG_DEBUG_DRYRUN, - str_debug_16[] PROGMEM = MSG_DEBUG_COMMUNICATION - #if ENABLED(DEBUG_LEVELING_FEATURE) - , str_debug_32[] PROGMEM = MSG_DEBUG_LEVELING - #endif - ; - - static const char* const debug_strings[] PROGMEM = { - str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16 - #if ENABLED(DEBUG_LEVELING_FEATURE) - , str_debug_32 - #endif - }; - - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_DEBUG_PREFIX); - if (marlin_debug_flags) { - uint8_t comma = 0; - for (uint8_t i = 0; i < COUNT(debug_strings); i++) { - if (TEST(marlin_debug_flags, i)) { - if (comma++) SERIAL_CHAR(','); - serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); - } - } - } - else { - SERIAL_ECHOPGM(MSG_DEBUG_OFF); - } - SERIAL_EOL(); -} - -#if ENABLED(HOST_KEEPALIVE_FEATURE) - - /** - * M113: Get or set Host Keepalive interval (0 to disable) - * - * S Optional. Set the keepalive interval. - */ - inline void gcode_M113() { - if (parser.seenval('S')) { - host_keepalive_interval = parser.value_byte(); - NOMORE(host_keepalive_interval, 60); - } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("M113 S", (unsigned long)host_keepalive_interval); - } - } - -#endif - -#if ENABLED(BARICUDA) - - #if HAS_HEATER_1 - /** - * M126: Heater 1 valve open - */ - inline void gcode_M126() { baricuda_valve_pressure = parser.byteval('S', 255); } - /** - * M127: Heater 1 valve close - */ - inline void gcode_M127() { baricuda_valve_pressure = 0; } - #endif - - #if HAS_HEATER_2 - /** - * M128: Heater 2 valve open - */ - inline void gcode_M128() { baricuda_e_to_p_pressure = parser.byteval('S', 255); } - /** - * M129: Heater 2 valve close - */ - inline void gcode_M129() { baricuda_e_to_p_pressure = 0; } - #endif - -#endif // BARICUDA - -#if ENABLED(ULTIPANEL) - - /** - * M145: Set the heatup state for a material in the LCD menu - * - * S (0=PLA, 1=ABS) - * H - * B - * F - */ - inline void gcode_M145() { - const uint8_t material = (uint8_t)parser.intval('S'); - if (material >= COUNT(lcd_preheat_hotend_temp)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_MATERIAL_INDEX); - } - else { - int v; - if (parser.seenval('H')) { - v = parser.value_int(); - lcd_preheat_hotend_temp[material] = constrain(v, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - 15); - } - if (parser.seenval('F')) { - v = parser.value_int(); - lcd_preheat_fan_speed[material] = constrain(v, 0, 255); - } - #if TEMP_SENSOR_BED != 0 - if (parser.seenval('B')) { - v = parser.value_int(); - lcd_preheat_bed_temp[material] = constrain(v, BED_MINTEMP, BED_MAXTEMP - 15); - } - #endif - } - } - -#endif // ULTIPANEL - -#if ENABLED(TEMPERATURE_UNITS_SUPPORT) - /** - * M149: Set temperature units - */ - inline void gcode_M149() { - if (parser.seenval('C')) parser.set_input_temp_units(TEMPUNIT_C); - else if (parser.seenval('K')) parser.set_input_temp_units(TEMPUNIT_K); - else if (parser.seenval('F')) parser.set_input_temp_units(TEMPUNIT_F); - } -#endif - -#if HAS_POWER_SWITCH - - /** - * M80 : Turn on the Power Supply - * M80 S : Report the current state and exit - */ - inline void gcode_M80() { - - // S: Report the current power supply state and exit - if (parser.seen('S')) { - serialprintPGM(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); - return; - } - - PSU_ON(); - - /** - * If you have a switch on suicide pin, this is useful - * if you want to start another print with suicide feature after - * a print without suicide... - */ - #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, HIGH); - #endif - - #if DISABLED(AUTO_POWER_CONTROL) - delay(100); // Wait for power to settle - restore_stepper_drivers(); - #endif - - #if ENABLED(ULTIPANEL) - LCD_MESSAGEPGM(WELCOME_MSG); - #endif - } - -#endif // HAS_POWER_SWITCH - -/** - * M81: Turn off Power, including Power Supply, if there is one. - * - * This code should ALWAYS be available for EMERGENCY SHUTDOWN! - */ -inline void gcode_M81() { - thermalManager.disable_all_heaters(); - stepper.finish_and_disable(); - - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; - #if ENABLED(PROBING_FANS_OFF) - fans_paused = false; - ZERO(paused_fanSpeeds); - #endif - #endif - - safe_delay(1000); // Wait 1 second before switching off - - #if HAS_SUICIDE - suicide(); - #elif HAS_POWER_SWITCH - PSU_OFF(); - #endif - - #if ENABLED(ULTIPANEL) - LCD_MESSAGEPGM(MACHINE_NAME " " MSG_OFF "."); - #endif -} - -/** - * M82: Set E codes absolute (default) - */ -inline void gcode_M82() { axis_relative_modes[E_AXIS] = false; } - -/** - * M83: Set E codes relative while in Absolute Coordinates (G90) mode - */ -inline void gcode_M83() { axis_relative_modes[E_AXIS] = true; } - -/** - * M18, M84: Disable stepper motors - */ -inline void gcode_M18_M84() { - if (parser.seenval('S')) { - stepper_inactive_time = parser.value_millis_from_seconds(); - } - else { - bool all_axis = !(parser.seen('X') || parser.seen('Y') || parser.seen('Z') || parser.seen('E')); - if (all_axis) { - stepper.finish_and_disable(); - } - else { - stepper.synchronize(); - if (parser.seen('X')) disable_X(); - if (parser.seen('Y')) disable_Y(); - if (parser.seen('Z')) disable_Z(); - #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN // Only disable on boards that have separate ENABLE_PINS - if (parser.seen('E')) disable_e_steppers(); - #endif - } - - #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD - if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; - #endif - } -} - -/** - * M85: Set inactivity shutdown timer with parameter S. To disable set zero (default) - */ -inline void gcode_M85() { - if (parser.seen('S')) max_inactive_time = parser.value_millis_from_seconds(); -} - -/** - * Multi-stepper support for M92, M201, M203 - */ -#if ENABLED(DISTINCT_E_FACTORS) - #define GET_TARGET_EXTRUDER(CMD) if (get_target_extruder_from_command(CMD)) return - #define TARGET_EXTRUDER target_extruder -#else - #define GET_TARGET_EXTRUDER(CMD) NOOP - #define TARGET_EXTRUDER 0 -#endif - -/** - * M92: Set axis steps-per-unit for one or more axes, X, Y, Z, and E. - * (Follows the same syntax as G92) - * - * With multiple extruders use T to specify which one. - */ -inline void gcode_M92() { - - GET_TARGET_EXTRUDER(92); - - LOOP_XYZE(i) { - if (parser.seen(axis_codes[i])) { - if (i == E_AXIS) { - const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER)); - if (value < 20.0) { - float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab. - planner.max_jerk[E_AXIS] *= factor; - planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor; - planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor; - } - planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value; - } - else { - planner.axis_steps_per_mm[i] = parser.value_per_axis_unit((AxisEnum)i); - } - } - } - planner.refresh_positioning(); -} - -/** - * Output the current position to serial - */ -void report_current_position() { - SERIAL_PROTOCOLPGM("X:"); - SERIAL_PROTOCOL(LOGICAL_X_POSITION(current_position[X_AXIS])); - SERIAL_PROTOCOLPGM(" Y:"); - SERIAL_PROTOCOL(LOGICAL_Y_POSITION(current_position[Y_AXIS])); - SERIAL_PROTOCOLPGM(" Z:"); - SERIAL_PROTOCOL(LOGICAL_Z_POSITION(current_position[Z_AXIS])); - SERIAL_PROTOCOLPGM(" E:"); - SERIAL_PROTOCOL(current_position[E_AXIS]); - - stepper.report_positions(); - - #if IS_SCARA - SERIAL_PROTOCOLPAIR("SCARA Theta:", stepper.get_axis_position_degrees(A_AXIS)); - SERIAL_PROTOCOLLNPAIR(" Psi+Theta:", stepper.get_axis_position_degrees(B_AXIS)); - SERIAL_EOL(); - #endif -} - -#ifdef M114_DETAIL - - void report_xyze(const float pos[], const uint8_t n = 4, const uint8_t precision = 3) { - char str[12]; - for (uint8_t i = 0; i < n; i++) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[i]); - SERIAL_CHAR(':'); - SERIAL_PROTOCOL(dtostrf(pos[i], 8, precision, str)); - } - SERIAL_EOL(); - } - - inline void report_xyz(const float pos[]) { report_xyze(pos, 3); } - - void report_current_position_detail() { - - SERIAL_PROTOCOLPGM("\nLogical:"); - const float logical[XYZ] = { - LOGICAL_X_POSITION(current_position[X_AXIS]), - LOGICAL_Y_POSITION(current_position[Y_AXIS]), - LOGICAL_Z_POSITION(current_position[Z_AXIS]) - }; - report_xyz(logical); - - SERIAL_PROTOCOLPGM("Raw: "); - report_xyz(current_position); - - float leveled[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - - #if PLANNER_LEVELING - SERIAL_PROTOCOLPGM("Leveled:"); - planner.apply_leveling(leveled); - report_xyz(leveled); - - SERIAL_PROTOCOLPGM("UnLevel:"); - float unleveled[XYZ] = { leveled[X_AXIS], leveled[Y_AXIS], leveled[Z_AXIS] }; - planner.unapply_leveling(unleveled); - report_xyz(unleveled); - #endif - - #if IS_KINEMATIC - #if IS_SCARA - SERIAL_PROTOCOLPGM("ScaraK: "); - #else - SERIAL_PROTOCOLPGM("DeltaK: "); - #endif - inverse_kinematics(leveled); // writes delta[] - report_xyz(delta); - #endif - - stepper.synchronize(); - - SERIAL_PROTOCOLPGM("Stepper:"); - LOOP_XYZE(i) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[i]); - SERIAL_CHAR(':'); - SERIAL_PROTOCOL(stepper.position((AxisEnum)i)); - } - SERIAL_EOL(); - - #if IS_SCARA - const float deg[XYZ] = { - stepper.get_axis_position_degrees(A_AXIS), - stepper.get_axis_position_degrees(B_AXIS) - }; - SERIAL_PROTOCOLPGM("Degrees:"); - report_xyze(deg, 2); - #endif - - SERIAL_PROTOCOLPGM("FromStp:"); - get_cartesian_from_steppers(); // writes cartes[XYZ] (with forward kinematics) - const float from_steppers[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], stepper.get_axis_position_mm(E_AXIS) }; - report_xyze(from_steppers); - - const float diff[XYZE] = { - from_steppers[X_AXIS] - leveled[X_AXIS], - from_steppers[Y_AXIS] - leveled[Y_AXIS], - from_steppers[Z_AXIS] - leveled[Z_AXIS], - from_steppers[E_AXIS] - current_position[E_AXIS] - }; - SERIAL_PROTOCOLPGM("Differ: "); - report_xyze(diff); - } -#endif // M114_DETAIL - -/** - * M114: Report current position to host - */ -inline void gcode_M114() { - - #ifdef M114_DETAIL - if (parser.seen('D')) { - report_current_position_detail(); - return; - } - #endif - - stepper.synchronize(); - report_current_position(); -} - -/** - * M115: Capabilities string - */ - -#if ENABLED(EXTENDED_CAPABILITIES_REPORT) - static void cap_line(const char * const name, bool ena=false) { - SERIAL_PROTOCOLPGM("Cap:"); - serialprintPGM(name); - SERIAL_PROTOCOLPGM(":"); - SERIAL_PROTOCOLLN(int(ena ? 1 : 0)); - } -#endif - -inline void gcode_M115() { - SERIAL_PROTOCOLLNPGM(MSG_M115_REPORT); - - #if ENABLED(EXTENDED_CAPABILITIES_REPORT) - - // SERIAL_XON_XOFF - cap_line(PSTR("SERIAL_XON_XOFF") - #if ENABLED(SERIAL_XON_XOFF) - , true - #endif - ); - - // EEPROM (M500, M501) - cap_line(PSTR("EEPROM") - #if ENABLED(EEPROM_SETTINGS) - , true - #endif - ); - - // Volumetric Extrusion (M200) - cap_line(PSTR("VOLUMETRIC") - #if DISABLED(NO_VOLUMETRICS) - , true - #endif - ); - - // AUTOREPORT_TEMP (M155) - cap_line(PSTR("AUTOREPORT_TEMP") - #if ENABLED(AUTO_REPORT_TEMPERATURES) - , true - #endif - ); - - // PROGRESS (M530 S L, M531 , M532 X L) - cap_line(PSTR("PROGRESS")); - - // Print Job timer M75, M76, M77 - cap_line(PSTR("PRINT_JOB"), true); - - // AUTOLEVEL (G29) - cap_line(PSTR("AUTOLEVEL") - #if HAS_AUTOLEVEL - , true - #endif - ); - - // Z_PROBE (G30) - cap_line(PSTR("Z_PROBE") - #if HAS_BED_PROBE - , true - #endif - ); - - // MESH_REPORT (M420 V) - cap_line(PSTR("LEVELING_DATA") - #if HAS_LEVELING - , true - #endif - ); - - // BUILD_PERCENT (M73) - cap_line(PSTR("BUILD_PERCENT") - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - , true - #endif - ); - - // SOFTWARE_POWER (M80, M81) - cap_line(PSTR("SOFTWARE_POWER") - #if HAS_POWER_SWITCH - , true - #endif - ); - - // CASE LIGHTS (M355) - cap_line(PSTR("TOGGLE_LIGHTS") - #if HAS_CASE_LIGHT - , true - #endif - ); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS") - #if HAS_CASE_LIGHT - , USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN) - #endif - ); - - // EMERGENCY_PARSER (M108, M112, M410) - cap_line(PSTR("EMERGENCY_PARSER") - #if ENABLED(EMERGENCY_PARSER) - , true - #endif - ); - - // AUTOREPORT_SD_STATUS (M27 extension) - cap_line(PSTR("AUTOREPORT_SD_STATUS") - #if ENABLED(AUTO_REPORT_SD_STATUS) - , true - #endif - ); - - // THERMAL_PROTECTION - cap_line(PSTR("THERMAL_PROTECTION") - #if ENABLED(THERMAL_PROTECTION_HOTENDS) && ENABLED(THERMAL_PROTECTION_BED) - , true - #endif - ); - - #endif // EXTENDED_CAPABILITIES_REPORT -} - -/** - * M117: Set LCD Status Message - */ -inline void gcode_M117() { - if (parser.string_arg[0]) - lcd_setstatus(parser.string_arg); - else - lcd_reset_status(); -} - -/** - * M118: Display a message in the host console. - * - * A1 Append '// ' for an action command, as in OctoPrint - * E1 Have the host 'echo:' the text - */ -inline void gcode_M118() { - bool hasE = false, hasA = false; - char *p = parser.string_arg; - for (uint8_t i = 2; i--;) - if ((p[0] == 'A' || p[0] == 'E') && p[1] == '1') { - if (p[0] == 'A') hasA = true; - if (p[0] == 'E') hasE = true; - p += 2; - while (*p == ' ') ++p; - } - if (hasE) SERIAL_ECHO_START(); - if (hasA) SERIAL_ECHOPGM("// "); - SERIAL_ECHOLN(p); -} - -/** - * M119: Output endstop states to serial output - */ -inline void gcode_M119() { endstops.M119(); } - -/** - * M120: Enable endstops and set non-homing endstop state to "enabled" - */ -inline void gcode_M120() { endstops.enable_globally(true); } - -/** - * M121: Disable endstops and set non-homing endstop state to "disabled" - */ -inline void gcode_M121() { endstops.enable_globally(false); } - -#if ENABLED(PARK_HEAD_ON_PAUSE) - - /** - * M125: Store current position and move to filament change position. - * Called on pause (by M25) to prevent material leaking onto the - * object. On resume (M24) the head will be moved back and the - * print will resume. - * - * If Marlin is compiled without SD Card support, M125 can be - * used directly to pause the print and move to park position, - * resuming with a button click or M108. - * - * L = override retract length - * X = override X - * Y = override Y - * Z = override Z raise - */ - inline void gcode_M125() { - - // Initial retract before move to filament change position - const float retract = -FABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : 0 - #ifdef PAUSE_PARK_RETRACT_LENGTH - + (PAUSE_PARK_RETRACT_LENGTH) - #endif - ); - - point_t park_point = NOZZLE_PARK_POINT; - - // Move XY axes to filament change position or given position - if (parser.seenval('X')) park_point.x = parser.linearval('X'); - if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); - - // Lift Z axis - if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); - - #if HOTENDS > 1 && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) - park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); - park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); - #endif - - #if DISABLED(SDSUPPORT) - const bool job_running = print_job_timer.isRunning(); - #endif - - if (pause_print(retract, park_point)) { - #if DISABLED(SDSUPPORT) - // Wait for lcd click or M108 - wait_for_filament_reload(); - - // Return to print position and continue - resume_print(); - - if (job_running) print_job_timer.start(); - #endif - } - } - -#endif // PARK_HEAD_ON_PAUSE - -#if HAS_COLOR_LEDS - - /** - * M150: Set Status LED Color - Use R-U-B-W for R-G-B-W - * and Brightness - Use P (for NEOPIXEL only) - * - * Always sets all 3 or 4 components. If a component is left out, set to 0. - * If brightness is left out, no value changed - * - * Examples: - * - * M150 R255 ; Turn LED red - * M150 R255 U127 ; Turn LED orange (PWM only) - * M150 ; Turn LED off - * M150 R U B ; Turn LED white - * M150 W ; Turn LED white using a white LED - * M150 P127 ; Set LED 50% brightness - * M150 P ; Set LED full brightness - */ - inline void gcode_M150() { - leds.set_color(MakeLEDColor( - parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : pixels.getBrightness() - )); - } - -#endif // HAS_COLOR_LEDS - -#if DISABLED(NO_VOLUMETRICS) - - /** - * M200: Set filament diameter and set E axis units to cubic units - * - * T - Optional extruder number. Current extruder if omitted. - * D - Diameter of the filament. Use "D0" to switch back to linear units on the E axis. - */ - inline void gcode_M200() { - - if (get_target_extruder_from_command(200)) return; - - if (parser.seen('D')) { - // setting any extruder filament size disables volumetric on the assumption that - // slicers either generate in extruder values as cubic mm or as as filament feeds - // for all extruders - if ( (parser.volumetric_enabled = (parser.value_linear_units() != 0.0)) ) - planner.set_filament_size(target_extruder, parser.value_linear_units()); - } - planner.calculate_volumetric_multipliers(); - } - -#endif // !NO_VOLUMETRICS - -/** - * M201: Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000) - * - * With multiple extruders use T to specify which one. - */ -inline void gcode_M201() { - - GET_TARGET_EXTRUDER(201); - - LOOP_XYZE(i) { - if (parser.seen(axis_codes[i])) { - const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); - planner.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a); - } - } - // steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner) - planner.reset_acceleration_rates(); -} - -#if 0 // Not used for Sprinter/grbl gen6 - inline void gcode_M202() { - LOOP_XYZE(i) { - if (parser.seen(axis_codes[i])) axis_travel_steps_per_sqr_second[i] = parser.value_axis_units((AxisEnum)i) * planner.axis_steps_per_mm[i]; - } - } -#endif - - -/** - * M203: Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in units/sec - * - * With multiple extruders use T to specify which one. - */ -inline void gcode_M203() { - - GET_TARGET_EXTRUDER(203); - - LOOP_XYZE(i) - if (parser.seen(axis_codes[i])) { - const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); - planner.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a); - } -} - -/** - * M204: Set Accelerations in units/sec^2 (M204 P1200 R3000 T3000) - * - * P = Printing moves - * R = Retract only (no X, Y, Z) moves - * T = Travel (non printing) moves - */ -inline void gcode_M204() { - bool report = true; - if (parser.seenval('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments. - planner.travel_acceleration = planner.acceleration = parser.value_linear_units(); - report = false; - } - if (parser.seenval('P')) { - planner.acceleration = parser.value_linear_units(); - report = false; - } - if (parser.seenval('R')) { - planner.retract_acceleration = parser.value_linear_units(); - report = false; - } - if (parser.seenval('T')) { - planner.travel_acceleration = parser.value_linear_units(); - report = false; - } - if (report) { - SERIAL_ECHOPAIR("Acceleration: P", planner.acceleration); - SERIAL_ECHOPAIR(" R", planner.retract_acceleration); - SERIAL_ECHOLNPAIR(" T", planner.travel_acceleration); - } -} - -/** - * M205: Set Advanced Settings - * - * S = Min Feed Rate (units/s) - * T = Min Travel Feed Rate (units/s) - * B = Min Segment Time (µs) - * X = Max X Jerk (units/sec^2) - * Y = Max Y Jerk (units/sec^2) - * Z = Max Z Jerk (units/sec^2) - * E = Max E Jerk (units/sec^2) - */ -inline void gcode_M205() { - if (parser.seen('S')) planner.min_feedrate_mm_s = parser.value_linear_units(); - if (parser.seen('T')) planner.min_travel_feedrate_mm_s = parser.value_linear_units(); - if (parser.seen('B')) planner.min_segment_time_us = parser.value_ulong(); - if (parser.seen('X')) planner.max_jerk[X_AXIS] = parser.value_linear_units(); - if (parser.seen('Y')) planner.max_jerk[Y_AXIS] = parser.value_linear_units(); - if (parser.seen('Z')) { - planner.max_jerk[Z_AXIS] = parser.value_linear_units(); - #if HAS_MESH - if (planner.max_jerk[Z_AXIS] <= 0.1) - SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); - #endif - } - if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); -} - -#if HAS_M206_COMMAND - - /** - * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y - * - * *** @thinkyhead: I recommend deprecating M206 for SCARA in favor of M665. - * *** M206 for SCARA will remain enabled in 1.1.x for compatibility. - * *** In the next 1.2 release, it will simply be disabled by default. - */ - inline void gcode_M206() { - LOOP_XYZ(i) - if (parser.seen(axis_codes[i])) - set_home_offset((AxisEnum)i, parser.value_linear_units()); - - #if ENABLED(MORGAN_SCARA) - if (parser.seen('T')) set_home_offset(A_AXIS, parser.value_float()); // Theta - if (parser.seen('P')) set_home_offset(B_AXIS, parser.value_float()); // Psi - #endif - - report_current_position(); - } - -#endif // HAS_M206_COMMAND - -#if ENABLED(DELTA) - /** - * M665: Set delta configurations - * - * H = delta height - * L = diagonal rod - * R = delta radius - * S = segments per second - * B = delta calibration radius - * X = Alpha (Tower 1) angle trim - * Y = Beta (Tower 2) angle trim - * Z = Gamma (Tower 3) angle trim - */ - inline void gcode_M665() { - if (parser.seen('H')) delta_height = parser.value_linear_units(); - if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); - if (parser.seen('R')) delta_radius = parser.value_linear_units(); - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - if (parser.seen('B')) delta_calibration_radius = parser.value_float(); - if (parser.seen('X')) delta_tower_angle_trim[A_AXIS] = parser.value_float(); - if (parser.seen('Y')) delta_tower_angle_trim[B_AXIS] = parser.value_float(); - if (parser.seen('Z')) delta_tower_angle_trim[C_AXIS] = parser.value_float(); - recalc_delta_settings(); - } - /** - * M666: Set delta endstop adjustment - */ - inline void gcode_M666() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPGM(">>> gcode_M666"); - } - #endif - LOOP_XYZ(i) { - if (parser.seen(axis_codes[i])) { - if (parser.value_linear_units() * Z_HOME_DIR <= 0) - delta_endstop_adj[i] = parser.value_linear_units(); - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("delta_endstop_adj[", axis_codes[i]); - SERIAL_ECHOLNPAIR("] = ", delta_endstop_adj[i]); - } - #endif - } - } - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPGM("<<< gcode_M666"); - } - #endif - } - -#elif IS_SCARA - - /** - * M665: Set SCARA settings - * - * Parameters: - * - * S[segments-per-second] - Segments-per-second - * P[theta-psi-offset] - Theta-Psi offset, added to the shoulder (A/X) angle - * T[theta-offset] - Theta offset, added to the elbow (B/Y) angle - * - * A, P, and X are all aliases for the shoulder angle - * B, T, and Y are all aliases for the elbow angle - */ - inline void gcode_M665() { - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - - const bool hasA = parser.seen('A'), hasP = parser.seen('P'), hasX = parser.seen('X'); - const uint8_t sumAPX = hasA + hasP + hasX; - if (sumAPX == 1) - home_offset[A_AXIS] = parser.value_float(); - else if (sumAPX > 1) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Only one of A, P, or X is allowed."); - return; - } - - const bool hasB = parser.seen('B'), hasT = parser.seen('T'), hasY = parser.seen('Y'); - const uint8_t sumBTY = hasB + hasT + hasY; - if (sumBTY == 1) - home_offset[B_AXIS] = parser.value_float(); - else if (sumBTY > 1) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Only one of B, T, or Y is allowed."); - return; - } - } - -#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - - /** - * M666: Set Dual Endstops offsets for X, Y, and/or Z. - * With no parameters report current offsets. - */ - inline void gcode_M666() { - bool report = true; - #if ENABLED(X_DUAL_ENDSTOPS) - if (parser.seenval('X')) { - endstops.x_endstop_adj = parser.value_linear_units(); - report = false; - } - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (parser.seenval('Y')) { - endstops.y_endstop_adj = parser.value_linear_units(); - report = false; - } - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - if (parser.seenval('Z')) { - endstops.z_endstop_adj = parser.value_linear_units(); - report = false; - } - #endif - if (report) { - SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); - #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" X", endstops.x_endstop_adj); - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Y", endstops.y_endstop_adj); - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Z", endstops.z_endstop_adj); - #endif - SERIAL_EOL(); - } - } - -#endif // X_DUAL_ENDSTOPS || Y_DUAL_ENDSTOPS || Z_DUAL_ENDSTOPS - -#if ENABLED(FWRETRACT) - - /** - * M207: Set firmware retraction values - * - * S[+units] retract_length - * W[+units] swap_retract_length (multi-extruder) - * F[units/min] retract_feedrate_mm_s - * Z[units] retract_zlift - */ - inline void gcode_M207() { - if (parser.seen('S')) fwretract.retract_length = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('Z')) fwretract.retract_zlift = parser.value_linear_units(); - if (parser.seen('W')) fwretract.swap_retract_length = parser.value_axis_units(E_AXIS); - } - - /** - * M208: Set firmware un-retraction values - * - * S[+units] retract_recover_length (in addition to M207 S*) - * W[+units] swap_retract_recover_length (multi-extruder) - * F[units/min] retract_recover_feedrate_mm_s - * R[units/min] swap_retract_recover_feedrate_mm_s - */ - inline void gcode_M208() { - if (parser.seen('S')) fwretract.retract_recover_length = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('R')) fwretract.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('W')) fwretract.swap_retract_recover_length = parser.value_axis_units(E_AXIS); - } - - /** - * M209: Enable automatic retract (M209 S1) - * For slicers that don't support G10/11, reversed extrude-only - * moves will be classified as retraction. - */ - inline void gcode_M209() { - if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { - if (parser.seen('S')) { - fwretract.autoretract_enabled = parser.value_bool(); - for (uint8_t i = 0; i < EXTRUDERS; i++) fwretract.retracted[i] = false; - } - } - } - -#endif // FWRETRACT - -/** - * M211: Enable, Disable, and/or Report software endstops - * - * Usage: M211 S1 to enable, M211 S0 to disable, M211 alone for report - */ -inline void gcode_M211() { - SERIAL_ECHO_START(); - #if HAS_SOFTWARE_ENDSTOPS - if (parser.seen('S')) soft_endstops_enabled = parser.value_bool(); - SERIAL_ECHOPGM(MSG_SOFT_ENDSTOPS); - serialprintPGM(soft_endstops_enabled ? PSTR(MSG_ON) : PSTR(MSG_OFF)); - #else - SERIAL_ECHOPGM(MSG_SOFT_ENDSTOPS); - SERIAL_ECHOPGM(MSG_OFF); - #endif - SERIAL_ECHOPGM(MSG_SOFT_MIN); - SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_min[X_AXIS])); - SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_min[Y_AXIS])); - SERIAL_ECHOPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_min[Z_AXIS])); - SERIAL_ECHOPGM(MSG_SOFT_MAX); - SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_max[X_AXIS])); - SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_max[Y_AXIS])); - SERIAL_ECHOLNPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_max[Z_AXIS])); -} - -#if HOTENDS > 1 - - /** - * M218 - Set/get hotend offset (in linear units) - * - * T - * X - * Y - * Z - Available with DUAL_X_CARRIAGE and SWITCHING_NOZZLE - */ - inline void gcode_M218() { - if (get_target_extruder_from_command(218) || target_extruder == 0) return; - - bool report = true; - if (parser.seenval('X')) { - hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units(); - report = false; - } - if (parser.seenval('Y')) { - hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units(); - report = false; - } - - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER) - if (parser.seenval('Z')) { - hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units(); - report = false; - } - #endif - - if (report) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); - HOTEND_LOOP() { - SERIAL_CHAR(' '); - SERIAL_ECHO(hotend_offset[X_AXIS][e]); - SERIAL_CHAR(','); - SERIAL_ECHO(hotend_offset[Y_AXIS][e]); - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER) - SERIAL_CHAR(','); - SERIAL_ECHO(hotend_offset[Z_AXIS][e]); - #endif - } - SERIAL_EOL(); - } - - #if ENABLED(DELTA) - if (target_extruder == active_extruder) - do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.max_feedrate_mm_s[X_AXIS]); - #endif - } - -#endif // HOTENDS > 1 - -/** - * M220: Set speed percentage factor, aka "Feed Rate" (M220 S95) - */ -inline void gcode_M220() { - if (parser.seenval('S')) feedrate_percentage = parser.value_int(); -} - -/** - * M221: Set extrusion percentage (M221 T0 S95) - */ -inline void gcode_M221() { - if (get_target_extruder_from_command(221)) return; - if (parser.seenval('S')) { - planner.flow_percentage[target_extruder] = parser.value_int(); - planner.refresh_e_factor(target_extruder); - } - else { - SERIAL_ECHO_START(); - SERIAL_CHAR('E'); - SERIAL_CHAR('0' + target_extruder); - SERIAL_ECHOPAIR(" Flow: ", planner.flow_percentage[target_extruder]); - SERIAL_CHAR('%'); - SERIAL_EOL(); - } -} - -/** - * M226: Wait until the specified pin reaches the state required (M226 P S) - */ -inline void gcode_M226() { - if (parser.seen('P')) { - const int pin = parser.value_int(), - pin_state = parser.intval('S', -1); // required pin state - default is inverted - - if (WITHIN(pin_state, -1, 1) && pin > -1 && !pin_is_protected(pin)) { - - int target = LOW; - - stepper.synchronize(); - - pinMode(pin, INPUT); - switch (pin_state) { - case 1: - target = HIGH; - break; - case 0: - target = LOW; - break; - case -1: - target = !digitalRead(pin); - break; - } - - while (digitalRead(pin) != target) idle(); - - } // pin_state -1 0 1 && pin > -1 - } // parser.seen('P') -} - -#if ENABLED(EXPERIMENTAL_I2CBUS) - - /** - * M260: Send data to a I2C slave device - * - * This is a PoC, the formating and arguments for the GCODE will - * change to be more compatible, the current proposal is: - * - * M260 A ; Sets the I2C slave address the data will be sent to - * - * M260 B - * M260 B - * M260 B - * - * M260 S1 ; Send the buffered data and reset the buffer - * M260 R1 ; Reset the buffer without sending data - * - */ - inline void gcode_M260() { - // Set the target address - if (parser.seen('A')) i2c.address(parser.value_byte()); - - // Add a new byte to the buffer - if (parser.seen('B')) i2c.addbyte(parser.value_byte()); - - // Flush the buffer to the bus - if (parser.seen('S')) i2c.send(); - - // Reset and rewind the buffer - else if (parser.seen('R')) i2c.reset(); - } - - /** - * M261: Request X bytes from I2C slave device - * - * Usage: M261 A B - */ - inline void gcode_M261() { - if (parser.seen('A')) i2c.address(parser.value_byte()); - - uint8_t bytes = parser.byteval('B', 1); - - if (i2c.addr && bytes && bytes <= TWIBUS_BUFFER_SIZE) { - i2c.relay(bytes); - } - else { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("Bad i2c request"); - } - } - -#endif // EXPERIMENTAL_I2CBUS - -#if HAS_SERVOS - - /** - * M280: Get or set servo position. P [S] - */ - inline void gcode_M280() { - if (!parser.seen('P')) return; - const int servo_index = parser.value_int(); - if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { - if (parser.seen('S')) - MOVE_SERVO(servo_index, parser.value_int()); - else { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" Servo ", servo_index); - SERIAL_ECHOLNPAIR(": ", servo[servo_index].read()); - } - } - else { - SERIAL_ERROR_START(); - SERIAL_ECHOPAIR("Servo ", servo_index); - SERIAL_ECHOLNPGM(" out of range"); - } - } - -#endif // HAS_SERVOS - -#if ENABLED(BABYSTEPPING) - - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - FORCE_INLINE void mod_zprobe_zoffset(const float &offs) { - zprobe_zoffset += offs; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset); - } - #endif - - /** - * M290: Babystepping - */ - inline void gcode_M290() { - #if ENABLED(BABYSTEP_XY) - for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) - if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) { - const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); - thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]); - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_zprobe_zoffset(offs); - #endif - } - #else - if (parser.seenval('Z') || parser.seenval('S')) { - const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); - thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]); - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (!parser.seen('P') || parser.value_bool()) mod_zprobe_zoffset(offs); - #endif - } - #endif - } - -#endif // BABYSTEPPING - -#if HAS_BUZZER - - /** - * M300: Play beep sound S P - */ - inline void gcode_M300() { - uint16_t const frequency = parser.ushortval('S', 260); - uint16_t duration = parser.ushortval('P', 1000); - - // Limits the tone duration to 0-5 seconds. - NOMORE(duration, 5000); - - BUZZ(duration, frequency); - } - -#endif // HAS_BUZZER - -#if ENABLED(PIDTEMP) - - /** - * M301: Set PID parameters P I D (and optionally C, L) - * - * P[float] Kp term - * I[float] Ki term (unscaled) - * D[float] Kd term (unscaled) - * - * With PID_EXTRUSION_SCALING: - * - * C[float] Kc term - * L[float] LPQ length - */ - inline void gcode_M301() { - - // multi-extruder PID patch: M301 updates or prints a single extruder's PID values - // default behaviour (omitting E parameter) is to update for extruder 0 only - const uint8_t e = parser.byteval('E'); // extruder being updated - - if (e < HOTENDS) { // catch bad input value - if (parser.seen('P')) PID_PARAM(Kp, e) = parser.value_float(); - if (parser.seen('I')) PID_PARAM(Ki, e) = scalePID_i(parser.value_float()); - if (parser.seen('D')) PID_PARAM(Kd, e) = scalePID_d(parser.value_float()); - #if ENABLED(PID_EXTRUSION_SCALING) - if (parser.seen('C')) PID_PARAM(Kc, e) = parser.value_float(); - if (parser.seen('L')) lpq_len = parser.value_float(); - NOMORE(lpq_len, LPQ_MAX_LEN); - #endif - - thermalManager.updatePID(); - SERIAL_ECHO_START(); - #if ENABLED(PID_PARAMS_PER_HOTEND) - SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output - #endif // PID_PARAMS_PER_HOTEND - SERIAL_ECHOPAIR(" p:", PID_PARAM(Kp, e)); - SERIAL_ECHOPAIR(" i:", unscalePID_i(PID_PARAM(Ki, e))); - SERIAL_ECHOPAIR(" d:", unscalePID_d(PID_PARAM(Kd, e))); - #if ENABLED(PID_EXTRUSION_SCALING) - //Kc does not have scaling applied above, or in resetting defaults - SERIAL_ECHOPAIR(" c:", PID_PARAM(Kc, e)); - #endif - SERIAL_EOL(); - } - else { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER); - } - } - -#endif // PIDTEMP - -#if ENABLED(PIDTEMPBED) - - inline void gcode_M304() { - if (parser.seen('P')) thermalManager.bedKp = parser.value_float(); - if (parser.seen('I')) thermalManager.bedKi = scalePID_i(parser.value_float()); - if (parser.seen('D')) thermalManager.bedKd = scalePID_d(parser.value_float()); - - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" p:", thermalManager.bedKp); - SERIAL_ECHOPAIR(" i:", unscalePID_i(thermalManager.bedKi)); - SERIAL_ECHOLNPAIR(" d:", unscalePID_d(thermalManager.bedKd)); - } - -#endif // PIDTEMPBED - -#if defined(CHDK) || HAS_PHOTOGRAPH - - /** - * M240: Trigger a camera by emulating a Canon RC-1 - * See http://www.doc-diy.net/photo/rc-1_hacked/ - */ - inline void gcode_M240() { - #ifdef CHDK - - OUT_WRITE(CHDK, HIGH); - chdkHigh = millis(); - chdkActive = true; - - #elif HAS_PHOTOGRAPH - - const uint8_t NUM_PULSES = 16; - const float PULSE_LENGTH = 0.01524; - for (int i = 0; i < NUM_PULSES; i++) { - WRITE(PHOTOGRAPH_PIN, HIGH); - _delay_ms(PULSE_LENGTH); - WRITE(PHOTOGRAPH_PIN, LOW); - _delay_ms(PULSE_LENGTH); - } - delay(7.33); - for (int i = 0; i < NUM_PULSES; i++) { - WRITE(PHOTOGRAPH_PIN, HIGH); - _delay_ms(PULSE_LENGTH); - WRITE(PHOTOGRAPH_PIN, LOW); - _delay_ms(PULSE_LENGTH); - } - - #endif // !CHDK && HAS_PHOTOGRAPH - } - -#endif // CHDK || PHOTOGRAPH_PIN - -#if HAS_LCD_CONTRAST - - /** - * M250: Read and optionally set the LCD contrast - */ - inline void gcode_M250() { - if (parser.seen('C')) set_lcd_contrast(parser.value_int()); - SERIAL_PROTOCOLPGM("lcd contrast value: "); - SERIAL_PROTOCOL(lcd_contrast); - SERIAL_EOL(); - } - -#endif // HAS_LCD_CONTRAST - -#if ENABLED(PREVENT_COLD_EXTRUSION) - - /** - * M302: Allow cold extrudes, or set the minimum extrude temperature - * - * S sets the minimum extrude temperature - * P enables (1) or disables (0) cold extrusion - * - * Examples: - * - * M302 ; report current cold extrusion state - * M302 P0 ; enable cold extrusion checking - * M302 P1 ; disables cold extrusion checking - * M302 S0 ; always allow extrusion (disables checking) - * M302 S170 ; only allow extrusion above 170 - * M302 S170 P1 ; set min extrude temp to 170 but leave disabled - */ - inline void gcode_M302() { - const bool seen_S = parser.seen('S'); - if (seen_S) { - thermalManager.extrude_min_temp = parser.value_celsius(); - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); - } - - if (parser.seen('P')) - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || parser.value_bool(); - else if (!seen_S) { - // Report current state - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Cold extrudes are ", (thermalManager.allow_cold_extrude ? "en" : "dis")); - SERIAL_ECHOPAIR("abled (min temp ", thermalManager.extrude_min_temp); - SERIAL_ECHOLNPGM("C)"); - } - } - -#endif // PREVENT_COLD_EXTRUSION - -/** - * M303: PID relay autotune - * - * S sets the target temperature. (default 150C / 70C) - * E (-1 for the bed) (default 0) - * C - * U with a non-zero value will apply the result to current settings - */ -inline void gcode_M303() { - #if HAS_PID_HEATING - const int e = parser.intval('E'), c = parser.intval('C', 5); - const bool u = parser.boolval('U'); - - int16_t temp = parser.celsiusval('S', e < 0 ? 70 : 150); - - if (WITHIN(e, 0, HOTENDS - 1)) - target_extruder = e; - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - thermalManager.PID_autotune(temp, e, c, u); - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(IN_HANDLER); - #endif - #else - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M303_DISABLED); - #endif -} - -#if ENABLED(MORGAN_SCARA) - - bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { - if (IsRunning()) { - forward_kinematics_SCARA(delta_a, delta_b); - destination[X_AXIS] = cartes[X_AXIS]; - destination[Y_AXIS] = cartes[Y_AXIS]; - destination[Z_AXIS] = current_position[Z_AXIS]; - prepare_move_to_destination(); - return true; - } - return false; - } - - /** - * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration) - */ - inline bool gcode_M360() { - SERIAL_ECHOLNPGM(" Cal: Theta 0"); - return SCARA_move_to_cal(0, 120); - } - - /** - * M361: SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) - */ - inline bool gcode_M361() { - SERIAL_ECHOLNPGM(" Cal: Theta 90"); - return SCARA_move_to_cal(90, 130); - } - - /** - * M362: SCARA calibration: Move to cal-position PsiA (0 deg calibration) - */ - inline bool gcode_M362() { - SERIAL_ECHOLNPGM(" Cal: Psi 0"); - return SCARA_move_to_cal(60, 180); - } - - /** - * M363: SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) - */ - inline bool gcode_M363() { - SERIAL_ECHOLNPGM(" Cal: Psi 90"); - return SCARA_move_to_cal(50, 90); - } - - /** - * M364: SCARA calibration: Move to cal-position PsiC (90 deg to Theta calibration position) - */ - inline bool gcode_M364() { - SERIAL_ECHOLNPGM(" Cal: Theta-Psi 90"); - return SCARA_move_to_cal(45, 135); - } - -#endif // SCARA - -#if ENABLED(EXT_SOLENOID) - - void enable_solenoid(const uint8_t num) { - switch (num) { - case 0: - OUT_WRITE(SOL0_PIN, HIGH); - break; - #if HAS_SOLENOID_1 && EXTRUDERS > 1 - case 1: - OUT_WRITE(SOL1_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_2 && EXTRUDERS > 2 - case 2: - OUT_WRITE(SOL2_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_3 && EXTRUDERS > 3 - case 3: - OUT_WRITE(SOL3_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_4 && EXTRUDERS > 4 - case 4: - OUT_WRITE(SOL4_PIN, HIGH); - break; - #endif - default: - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID); - break; - } - } - - void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } - - void disable_all_solenoids() { - OUT_WRITE(SOL0_PIN, LOW); - #if HAS_SOLENOID_1 && EXTRUDERS > 1 - OUT_WRITE(SOL1_PIN, LOW); - #endif - #if HAS_SOLENOID_2 && EXTRUDERS > 2 - OUT_WRITE(SOL2_PIN, LOW); - #endif - #if HAS_SOLENOID_3 && EXTRUDERS > 3 - OUT_WRITE(SOL3_PIN, LOW); - #endif - #if HAS_SOLENOID_4 && EXTRUDERS > 4 - OUT_WRITE(SOL4_PIN, LOW); - #endif - } - - /** - * M380: Enable solenoid on the active extruder - */ - inline void gcode_M380() { enable_solenoid_on_active_extruder(); } - - /** - * M381: Disable all solenoids - */ - inline void gcode_M381() { disable_all_solenoids(); } - -#endif // EXT_SOLENOID - -/** - * M400: Finish all moves - */ -inline void gcode_M400() { stepper.synchronize(); } - -#if HAS_BED_PROBE - - /** - * M401: Deploy and activate the Z probe - */ - inline void gcode_M401() { - DEPLOY_PROBE(); - report_current_position(); - } - - /** - * M402: Deactivate and stow the Z probe - */ - inline void gcode_M402() { - STOW_PROBE(); - #ifdef Z_AFTER_PROBING - move_z_after_probing(); - #endif - report_current_position(); - } - -#endif // HAS_BED_PROBE - -#if ENABLED(FILAMENT_WIDTH_SENSOR) - - /** - * M404: Display or set (in current units) the nominal filament width (3mm, 1.75mm ) W<3.0> - */ - inline void gcode_M404() { - if (parser.seen('W')) { - filament_width_nominal = parser.value_linear_units(); - planner.volumetric_area_nominal = CIRCLE_AREA(filament_width_nominal * 0.5); - } - else { - SERIAL_PROTOCOLPGM("Filament dia (nominal mm):"); - SERIAL_PROTOCOLLN(filament_width_nominal); - } - } - - /** - * M405: Turn on filament sensor for control - */ - inline void gcode_M405() { - // This is technically a linear measurement, but since it's quantized to centimeters and is a different - // unit than everything else, it uses parser.value_byte() instead of parser.value_linear_units(). - if (parser.seen('D')) { - meas_delay_cm = parser.value_byte(); - NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); - } - - if (filwidth_delay_index[1] == -1) { // Initialize the ring buffer if not done since startup - const int8_t temp_ratio = thermalManager.widthFil_to_size_ratio(); - - for (uint8_t i = 0; i < COUNT(measurement_delay); ++i) - measurement_delay[i] = temp_ratio; - - filwidth_delay_index[0] = filwidth_delay_index[1] = 0; - } - - filament_sensor = true; - } - - /** - * M406: Turn off filament sensor for control - */ - inline void gcode_M406() { - filament_sensor = false; - planner.calculate_volumetric_multipliers(); // Restore correct 'volumetric_multiplier' value - } - - /** - * M407: Get measured filament diameter on serial output - */ - inline void gcode_M407() { - SERIAL_PROTOCOLPGM("Filament dia (measured mm):"); - SERIAL_PROTOCOLLN(filament_width_meas); - } - -#endif // FILAMENT_WIDTH_SENSOR - -void quickstop_stepper() { - stepper.quick_stop(); - stepper.synchronize(); - set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); -} - -#if HAS_LEVELING - - //#define M420_C_USE_MEAN - - /** - * M420: Enable/Disable Bed Leveling and/or set the Z fade height. - * - * S[bool] Turns leveling on or off - * Z[height] Sets the Z fade height (0 or none to disable) - * V[bool] Verbose - Print the leveling grid - * - * With AUTO_BED_LEVELING_UBL only: - * - * L[index] Load UBL mesh from index (0 is default) - * T[map] 0:Human-readable 1:CSV 2:"LCD" 4:Compact - * - * With mesh-based leveling only: - * - * C Center mesh on the mean of the lowest and highest - */ - inline void gcode_M420() { - const bool seen_S = parser.seen('S'); - bool to_enable = seen_S ? parser.value_bool() : planner.leveling_active; - - // If disabling leveling do it right away - // (Don't disable for just M420 or M420 V) - if (seen_S && !to_enable) set_bed_leveling_enabled(false); - - const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - // L to load a mesh from the EEPROM - if (parser.seen('L')) { - - set_bed_leveling_enabled(false); - - #if ENABLED(EEPROM_SETTINGS) - const int8_t storage_slot = parser.has_value() ? parser.value_int() : ubl.storage_slot; - const int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); - return; - } - - if (!WITHIN(storage_slot, 0, a - 1)) { - SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); - SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); - return; - } - - settings.load_mesh(storage_slot); - ubl.storage_slot = storage_slot; - - #else - - SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); - return; - - #endif - } - - // L or V display the map info - if (parser.seen('L') || parser.seen('V')) { - ubl.display_map(parser.byteval('T')); - SERIAL_ECHOLNPAIR("ubl.mesh_is_valid = ", ubl.mesh_is_valid()); - SERIAL_ECHOLNPAIR("ubl.storage_slot = ", ubl.storage_slot); - } - - #endif // AUTO_BED_LEVELING_UBL - - #if HAS_MESH - - #if ENABLED(MESH_BED_LEVELING) - #define Z_VALUES(X,Y) mbl.z_values[X][Y] - #else - #define Z_VALUES(X,Y) z_values[X][Y] - #endif - - // Subtract the given value or the mean from all mesh values - if (leveling_is_valid() && parser.seen('C')) { - const float cval = parser.value_float(); - #if ENABLED(AUTO_BED_LEVELING_UBL) - - set_bed_leveling_enabled(false); - ubl.adjust_mesh_to_mean(true, cval); - - #else - - #if ENABLED(M420_C_USE_MEAN) - - // Get the sum and average of all mesh values - float mesh_sum = 0; - for (uint8_t x = GRID_MAX_POINTS_X; x--;) - for (uint8_t y = GRID_MAX_POINTS_Y; y--;) - mesh_sum += Z_VALUES(x, y); - const float zmean = mesh_sum / float(GRID_MAX_POINTS); - - #else - - // Find the low and high mesh values - float lo_val = 100, hi_val = -100; - for (uint8_t x = GRID_MAX_POINTS_X; x--;) - for (uint8_t y = GRID_MAX_POINTS_Y; y--;) { - const float z = Z_VALUES(x, y); - NOMORE(lo_val, z); - NOLESS(hi_val, z); - } - // Take the mean of the lowest and highest - const float zmean = (lo_val + hi_val) / 2.0 + cval; - - #endif - - // If not very close to 0, adjust the mesh - if (!NEAR_ZERO(zmean)) { - set_bed_leveling_enabled(false); - // Subtract the mean from all values - for (uint8_t x = GRID_MAX_POINTS_X; x--;) - for (uint8_t y = GRID_MAX_POINTS_Y; y--;) - Z_VALUES(x, y) -= zmean; - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - bed_level_virt_interpolate(); - #endif - } - - #endif - } - - #endif // HAS_MESH - - // V to print the matrix or mesh - if (parser.seen('V')) { - #if ABL_PLANAR - planner.bed_level_matrix.debug(PSTR("Bed Level Correction Matrix:")); - #else - if (leveling_is_valid()) { - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - print_bilinear_leveling_grid(); - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - print_bilinear_leveling_grid_virt(); - #endif - #elif ENABLED(MESH_BED_LEVELING) - SERIAL_ECHOLNPGM("Mesh Bed Level data:"); - mbl.report_mesh(); - #endif - } - #endif - } - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (parser.seen('Z')) set_z_fade_height(parser.value_linear_units(), false); - #endif - - // Enable leveling if specified, or if previously active - set_bed_leveling_enabled(to_enable); - - // Error if leveling failed to enable or reenable - if (to_enable && !planner.leveling_active) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M420_FAILED); - } - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Bed Leveling ", planner.leveling_active ? MSG_ON : MSG_OFF); - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Fade Height "); - if (planner.z_fade_height > 0.0) - SERIAL_ECHOLN(planner.z_fade_height); - else - SERIAL_ECHOLNPGM(MSG_OFF); - #endif - - // Report change in position - if (memcmp(oldpos, current_position, sizeof(oldpos))) - report_current_position(); - } - -#endif // HAS_LEVELING - -#if ENABLED(MESH_BED_LEVELING) - - /** - * M421: Set a single Mesh Bed Leveling Z coordinate - * - * Usage: - * M421 X Y Z - * M421 X Y Q - * M421 I J Z - * M421 I J Q - */ - inline void gcode_M421() { - const bool hasX = parser.seen('X'), hasI = parser.seen('I'); - const int8_t ix = hasI ? parser.value_int() : hasX ? mbl.probe_index_x(parser.value_linear_units()) : -1; - const bool hasY = parser.seen('Y'), hasJ = parser.seen('J'); - const int8_t iy = hasJ ? parser.value_int() : hasY ? mbl.probe_index_y(parser.value_linear_units()) : -1; - const bool hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); - - if (int(hasI && hasJ) + int(hasX && hasY) != 1 || !(hasZ || hasQ)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); - } - else if (ix < 0 || iy < 0) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); - } - else - mbl.set_z(ix, iy, parser.value_linear_units() + (hasQ ? mbl.z_values[ix][iy] : 0)); - } - -#elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - /** - * M421: Set a single Mesh Bed Leveling Z coordinate - * - * Usage: - * M421 I J Z - * M421 I J Q - */ - inline void gcode_M421() { - int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); - const bool hasI = ix >= 0, - hasJ = iy >= 0, - hasZ = parser.seen('Z'), - hasQ = !hasZ && parser.seen('Q'); - - if (!hasI || !hasJ || !(hasZ || hasQ)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); - } - else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); - } - else { - z_values[ix][iy] = parser.value_linear_units() + (hasQ ? z_values[ix][iy] : 0); - #if ENABLED(ABL_BILINEAR_SUBDIVISION) - bed_level_virt_interpolate(); - #endif - } - } - -#elif ENABLED(AUTO_BED_LEVELING_UBL) - - /** - * M421: Set a single Mesh Bed Leveling Z coordinate - * - * Usage: - * M421 I J Z - * M421 I J Q - * M421 I J N - * M421 C Z - * M421 C Q - */ - inline void gcode_M421() { - int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); - const bool hasI = ix >= 0, - hasJ = iy >= 0, - hasC = parser.seen('C'), - hasN = parser.seen('N'), - hasZ = parser.seen('Z'), - hasQ = !hasZ && parser.seen('Q'); - - if (hasC) { - const mesh_index_pair location = ubl.find_closest_mesh_point_of_type(REAL, current_position[X_AXIS], current_position[Y_AXIS], USE_NOZZLE_AS_REFERENCE, NULL); - ix = location.x_index; - iy = location.y_index; - } - - if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); - } - else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); - } - else - ubl.z_values[ix][iy] = hasN ? NAN : parser.value_linear_units() + (hasQ ? ubl.z_values[ix][iy] : 0); - } - -#endif // AUTO_BED_LEVELING_UBL - -#if HAS_M206_COMMAND - - /** - * M428: Set home_offset based on the distance between the - * current_position and the nearest "reference point." - * If an axis is past center its endstop position - * is the reference-point. Otherwise it uses 0. This allows - * the Z offset to be set near the bed when using a max endstop. - * - * M428 can't be used more than 2cm away from 0 or an endstop. - * - * Use M206 to set these values directly. - */ - inline void gcode_M428() { - if (axis_unhomed_error()) return; - - float diff[XYZ]; - LOOP_XYZ(i) { - diff[i] = base_home_pos((AxisEnum)i) - current_position[i]; - if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0) - diff[i] = -current_position[i]; - if (!WITHIN(diff[i], -20, 20)) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR); - LCD_ALERTMESSAGEPGM("Err: Too far!"); - BUZZ(200, 40); - return; - } - } - - LOOP_XYZ(i) set_home_offset((AxisEnum)i, diff[i]); - report_current_position(); - LCD_MESSAGEPGM(MSG_HOME_OFFSETS_APPLIED); - BUZZ(100, 659); - BUZZ(100, 698); - } - -#endif // HAS_M206_COMMAND - -/** - * M500: Store settings in EEPROM - */ -inline void gcode_M500() { - (void)settings.save(); -} - -/** - * M501: Read settings from EEPROM - */ -inline void gcode_M501() { - (void)settings.load(); -} - -/** - * M502: Revert to default settings - */ -inline void gcode_M502() { - (void)settings.reset(); -} - -#if DISABLED(DISABLE_M503) - /** - * M503: print settings currently in memory - */ - inline void gcode_M503() { - (void)settings.report(parser.seen('S') && !parser.value_bool()); - } -#endif - -#if ENABLED(EEPROM_SETTINGS) - /** - * M504: Validate EEPROM Contents - */ - inline void gcode_M504() { - if (settings.validate()) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM("EEPROM OK"); - } - } -#endif - -#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - - /** - * M540: Set whether SD card print should abort on endstop hit (M540 S<0|1>) - */ - inline void gcode_M540() { - if (parser.seen('S')) stepper.abort_on_endstop_hit = parser.value_bool(); - } - -#endif // ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED - -#if HAS_BED_PROBE - - inline void gcode_M851() { - if (parser.seenval('Z')) { - const float value = parser.value_linear_units(); - if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - zprobe_zoffset = value; - else { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("?Z out of range (" STRINGIFY(Z_PROBE_OFFSET_RANGE_MIN) " to " STRINGIFY(Z_PROBE_OFFSET_RANGE_MAX) ")"); - } - return; - } - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_PROBE_Z_OFFSET); - SERIAL_ECHOLNPAIR(": ", zprobe_zoffset); - } - -#endif // HAS_BED_PROBE - -#if ENABLED(SKEW_CORRECTION_GCODE) - - /** - * M852: Get or set the machine skew factors. Reports current values with no arguments. - * - * S[xy_factor] - Alias for 'I' - * I[xy_factor] - New XY skew factor - * J[xz_factor] - New XZ skew factor - * K[yz_factor] - New YZ skew factor - */ - inline void gcode_M852() { - uint8_t ijk = 0, badval = 0, setval = 0; - - if (parser.seen('I') || parser.seen('S')) { - ++ijk; - const float value = parser.value_linear_units(); - if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.xy_skew_factor != value) { - planner.xy_skew_factor = value; - ++setval; - } - } - else - ++badval; - } - - #if ENABLED(SKEW_CORRECTION_FOR_Z) - - if (parser.seen('J')) { - ++ijk; - const float value = parser.value_linear_units(); - if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.xz_skew_factor != value) { - planner.xz_skew_factor = value; - ++setval; - } - } - else - ++badval; - } - - if (parser.seen('K')) { - ++ijk; - const float value = parser.value_linear_units(); - if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.yz_skew_factor != value) { - planner.yz_skew_factor = value; - ++setval; - } - } - else - ++badval; - } - - #endif - - if (badval) - SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); - - // When skew is changed the current position changes - if (setval) { - set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); - report_current_position(); - } - - if (!ijk) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_SKEW_FACTOR " XY: "); - SERIAL_ECHO_F(planner.xy_skew_factor, 6); - SERIAL_EOL(); - #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPAIR(" XZ: ", planner.xz_skew_factor); - SERIAL_ECHOLNPAIR(" YZ: ", planner.yz_skew_factor); - #else - SERIAL_EOL(); - #endif - } - } - -#endif // SKEW_CORRECTION_GCODE - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - - /** - * M600: Pause for filament change - * - * E[distance] - Retract the filament this far - * Z[distance] - Move the Z axis by this distance - * X[position] - Move to this X position, with Y - * Y[position] - Move to this Y position, with X - * U[distance] - Retract distance for removal (manual reload) - * L[distance] - Extrude distance for insertion (manual reload) - * B[count] - Number of times to beep, -1 for indefinite (if equipped with a buzzer) - * T[toolhead] - Select extruder for filament change - * - * Default values are used for omitted arguments. - */ - inline void gcode_M600() { - point_t park_point = NOZZLE_PARK_POINT; - - if (get_target_extruder_from_command(600)) return; - - // Show initial message - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, target_extruder); - #endif - - #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) - // Don't allow filament change without homing first - if (axis_unhomed_error()) home_all_axes(); - #endif - - #if EXTRUDERS > 1 - // Change toolhead if specified - uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder) - tool_change(target_extruder, 0, true); - #endif - - // Initial retract before move to filament change position - const float retract = -FABS(parser.seen('E') ? parser.value_axis_units(E_AXIS) : 0 - #ifdef PAUSE_PARK_RETRACT_LENGTH - + (PAUSE_PARK_RETRACT_LENGTH) - #endif - ); - - // Lift Z axis - if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); - - // Move XY axes to filament change position or given position - if (parser.seenval('X')) park_point.x = parser.linearval('X'); - if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); - - #if HOTENDS > 1 && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) - park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); - park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); - #endif - - // Unload filament - const float unload_length = -FABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) : - filament_change_unload_length[active_extruder]); - - // Slow load filament - constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; - - // Fast load filament - const float fast_load_length = FABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : - filament_change_load_length[active_extruder]); - - const int beep_count = parser.intval('B', - #ifdef FILAMENT_CHANGE_ALERT_BEEPS - FILAMENT_CHANGE_ALERT_BEEPS - #else - -1 - #endif - ); - - const bool job_running = print_job_timer.isRunning(); - - if (pause_print(retract, park_point, unload_length, true)) { - wait_for_filament_reload(beep_count); - resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, beep_count); - } - - #if EXTRUDERS > 1 - // Restore toolhead if it was changed - if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, 0, true); - #endif - - // Resume the print job timer if it was running - if (job_running) print_job_timer.start(); - } - - /** - * M603: Configure filament change - * - * T[toolhead] - Select extruder to configure, active extruder if not specified - * U[distance] - Retract distance for removal, for the specified extruder - * L[distance] - Extrude distance for insertion, for the specified extruder - * - */ - inline void gcode_M603() { - - if (get_target_extruder_from_command(603)) return; - - // Unload length - if (parser.seen('U')) { - filament_change_unload_length[target_extruder] = FABS(parser.value_axis_units(E_AXIS)); - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - NOMORE(filament_change_unload_length[target_extruder], EXTRUDE_MAXLENGTH); - #endif - } - - // Load length - if (parser.seen('L')) { - filament_change_load_length[target_extruder] = FABS(parser.value_axis_units(E_AXIS)); - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - NOMORE(filament_change_load_length[target_extruder], EXTRUDE_MAXLENGTH); - #endif - } - } - -#endif // ADVANCED_PAUSE_FEATURE - -#if ENABLED(MK2_MULTIPLEXER) - - inline void select_multiplexed_stepper(const uint8_t e) { - stepper.synchronize(); - disable_e_steppers(); - WRITE(E_MUX0_PIN, TEST(e, 0) ? HIGH : LOW); - WRITE(E_MUX1_PIN, TEST(e, 1) ? HIGH : LOW); - WRITE(E_MUX2_PIN, TEST(e, 2) ? HIGH : LOW); - safe_delay(100); - } - -#endif // MK2_MULTIPLEXER - -#if ENABLED(DUAL_X_CARRIAGE) - - /** - * M605: Set dual x-carriage movement mode - * - * M605 S0: Full control mode. The slicer has full control over x-carriage movement - * M605 S1: Auto-park mode. The inactive head will auto park/unpark without slicer involvement - * M605 S2 [Xnnn] [Rmmm]: Duplication mode. The second extruder will duplicate the first with nnn - * units x-offset and an optional differential hotend temperature of - * mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate - * the first with a spacing of 100mm in the x direction and 2 degrees hotter. - * - * Note: the X axis should be homed after changing dual x-carriage mode. - */ - inline void gcode_M605() { - stepper.synchronize(); - if (parser.seen('S')) dual_x_carriage_mode = (DualXMode)parser.value_byte(); - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: - case DXC_AUTO_PARK_MODE: - break; - case DXC_DUPLICATION_MODE: - if (parser.seen('X')) duplicate_extruder_x_offset = max(parser.value_linear_units(), X2_MIN_POS - x_home_pos(0)); - if (parser.seen('R')) duplicate_extruder_temp_offset = parser.value_celsius_diff(); - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); - SERIAL_CHAR(' '); - SERIAL_ECHO(hotend_offset[X_AXIS][0]); - SERIAL_CHAR(','); - SERIAL_ECHO(hotend_offset[Y_AXIS][0]); - SERIAL_CHAR(' '); - SERIAL_ECHO(duplicate_extruder_x_offset); - SERIAL_CHAR(','); - SERIAL_ECHOLN(hotend_offset[Y_AXIS][1]); - break; - default: - dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - break; - } - active_extruder_parked = false; - extruder_duplication_enabled = false; - delayed_move_time = 0; - } - -#elif ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - - inline void gcode_M605() { - stepper.synchronize(); - extruder_duplication_enabled = parser.intval('S') == (int)DXC_DUPLICATION_MODE; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_DUPLICATION_MODE, extruder_duplication_enabled ? MSG_ON : MSG_OFF); - } - -#endif // DUAL_NOZZLE_DUPLICATION_MODE - -#if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - - /** - * M701: Load filament - * - * T[extruder] - Optional extruder number. Current extruder if omitted. - * Z[distance] - Move the Z axis by this distance - * L[distance] - Extrude distance for insertion (positive value) (manual reload) - * - * Default values are used for omitted arguments. - */ - inline void gcode_M701() { - point_t park_point = NOZZLE_PARK_POINT; - - #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Only raise Z if the machine is homed - if (axis_unhomed_error()) park_point.z = 0; - #endif - - if (get_target_extruder_from_command(701)) return; - - // Z axis lift - if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); - - // Show initial "wait for load" message - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, ADVANCED_PAUSE_MODE_LOAD_FILAMENT, target_extruder); - #endif - - #if EXTRUDERS > 1 - // Change toolhead if specified - uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder) - tool_change(target_extruder, 0, true); - #endif - - // Lift Z axis - if (park_point.z > 0) - do_blocking_move_to_z(min(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); - - constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; - const float fast_load_length = FABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : filament_change_load_length[active_extruder]); - load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS, - true, thermalManager.wait_for_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT); - - // Restore Z axis - if (park_point.z > 0) - do_blocking_move_to_z(max(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); - - #if EXTRUDERS > 1 - // Restore toolhead if it was changed - if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, 0, true); - #endif - - // Show status screen - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - #endif - } - - /** - * M702: Unload filament - * - * T[extruder] - Optional extruder number. If omitted, current extruder - * (or ALL extruders with FILAMENT_UNLOAD_ALL_EXTRUDERS). - * Z[distance] - Move the Z axis by this distance - * U[distance] - Retract distance for removal (manual reload) - * - * Default values are used for omitted arguments. - */ - inline void gcode_M702() { - point_t park_point = NOZZLE_PARK_POINT; - - #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Only raise Z if the machine is homed - if (axis_unhomed_error()) park_point.z = 0; - #endif - - if (get_target_extruder_from_command(702)) return; - - // Z axis lift - if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); - - // Show initial message - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, target_extruder); - #endif - - #if EXTRUDERS > 1 - // Change toolhead if specified - uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder) - tool_change(target_extruder, 0, true); - #endif - - // Lift Z axis - if (park_point.z > 0) - do_blocking_move_to_z(min(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); - - // Unload filament - #if EXTRUDERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - if (!parser.seenval('T')) { - HOTEND_LOOP() { - if (e != active_extruder) tool_change(e, 0, true); - unload_filament(-filament_change_unload_length[e], true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); - } - } - else - #endif - { - // Unload length - const float unload_length = -FABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) : - filament_change_unload_length[target_extruder]); - - unload_filament(unload_length, true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); - } - - // Restore Z axis - if (park_point.z > 0) - do_blocking_move_to_z(max(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); - - #if EXTRUDERS > 1 - // Restore toolhead if it was changed - if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, 0, true); - #endif - - // Show status screen - #if ENABLED(ULTIPANEL) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); - #endif - } - -#endif // FILAMENT_LOAD_UNLOAD_GCODES - -#if ENABLED(LIN_ADVANCE) - /** - * M900: Get or Set Linear Advance K-factor - * - * K Set advance K factor - */ - inline void gcode_M900() { - if (parser.seenval('K')) { - const float newK = parser.floatval('K'); - if (WITHIN(newK, 0, 10)) { - stepper.synchronize(); - planner.extruder_advance_K = newK; - } - else - SERIAL_PROTOCOLLNPGM("?K value out of range (0-10)."); - } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K); - } - } -#endif // LIN_ADVANCE - -#if HAS_TRINAMIC - #if ENABLED(TMC_DEBUG) - inline void gcode_M122() { - if (parser.seen('S')) - tmc_set_report_status(parser.value_bool()); - else - tmc_report_all(); - } - #endif // TMC_DEBUG - - /** - * M906: Set motor current in milliamps using axis codes X, Y, Z, E - * Report driver currents when no axis specified - */ - inline void gcode_M906() { - #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q, TMC_##Q) - #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, TMC_##Q, value) - - bool report = true; - const uint8_t index = parser.byteval('I'); - LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { - report = false; - switch (i) { - case X_AXIS: - #if X_IS_TRINAMIC - if (index == 0) TMC_SET_CURRENT(X); - #endif - #if X2_IS_TRINAMIC - if (index == 1) TMC_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if Y_IS_TRINAMIC - if (index == 0) TMC_SET_CURRENT(Y); - #endif - #if Y2_IS_TRINAMIC - if (index == 1) TMC_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if Z_IS_TRINAMIC - if (index == 0) TMC_SET_CURRENT(Z); - #endif - #if Z2_IS_TRINAMIC - if (index == 1) TMC_SET_CURRENT(Z2); - #endif - break; - case E_AXIS: { - if (get_target_extruder_from_command(906)) return; - switch (target_extruder) { - #if E0_IS_TRINAMIC - case 0: TMC_SET_CURRENT(E0); break; - #endif - #if E1_IS_TRINAMIC - case 1: TMC_SET_CURRENT(E1); break; - #endif - #if E2_IS_TRINAMIC - case 2: TMC_SET_CURRENT(E2); break; - #endif - #if E3_IS_TRINAMIC - case 3: TMC_SET_CURRENT(E3); break; - #endif - #if E4_IS_TRINAMIC - case 4: TMC_SET_CURRENT(E4); break; - #endif - } - } break; - } - } - - if (report) LOOP_XYZE(i) switch (i) { - case X_AXIS: - #if X_IS_TRINAMIC - TMC_SAY_CURRENT(X); - #endif - #if X2_IS_TRINAMIC - TMC_SAY_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if Y_IS_TRINAMIC - TMC_SAY_CURRENT(Y); - #endif - #if Y2_IS_TRINAMIC - TMC_SAY_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if Z_IS_TRINAMIC - TMC_SAY_CURRENT(Z); - #endif - #if Z2_IS_TRINAMIC - TMC_SAY_CURRENT(Z2); - #endif - break; - case E_AXIS: - #if E0_IS_TRINAMIC - TMC_SAY_CURRENT(E0); - #endif - #if E1_IS_TRINAMIC - TMC_SAY_CURRENT(E1); - #endif - #if E2_IS_TRINAMIC - TMC_SAY_CURRENT(E2); - #endif - #if E3_IS_TRINAMIC - TMC_SAY_CURRENT(E3); - #endif - #if E4_IS_TRINAMIC - TMC_SAY_CURRENT(E4); - #endif - break; - } - } - - /** - * M911: Report TMC stepper driver overtemperature pre-warn flag - * The flag is held by the library and persist until manually cleared by M912 - */ - inline void gcode_M911() { - #if ENABLED(X_IS_TMC2130) || (ENABLED(X_IS_TMC2208) && PIN_EXISTS(X_SERIAL_RX)) || ENABLED(IS_TRAMS) - tmc_report_otpw(stepperX, TMC_X); - #endif - #if ENABLED(Y_IS_TMC2130) || (ENABLED(Y_IS_TMC2208) && PIN_EXISTS(Y_SERIAL_RX)) || ENABLED(IS_TRAMS) - tmc_report_otpw(stepperY, TMC_Y); - #endif - #if ENABLED(Z_IS_TMC2130) || (ENABLED(Z_IS_TMC2208) && PIN_EXISTS(Z_SERIAL_RX)) || ENABLED(IS_TRAMS) - tmc_report_otpw(stepperZ, TMC_Z); - #endif - #if ENABLED(E0_IS_TMC2130) || (ENABLED(E0_IS_TMC2208) && PIN_EXISTS(E0_SERIAL_RX)) || ENABLED(IS_TRAMS) - tmc_report_otpw(stepperE0, TMC_E0); - #endif - } - - /** - * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library - */ - inline void gcode_M912() { - const bool clearX = parser.seen(axis_codes[X_AXIS]), clearY = parser.seen(axis_codes[Y_AXIS]), clearZ = parser.seen(axis_codes[Z_AXIS]), clearE = parser.seen(axis_codes[E_AXIS]), - clearAll = (!clearX && !clearY && !clearZ && !clearE) || (clearX && clearY && clearZ && clearE); - #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) || (ENABLED(X_IS_TMC2208) && PIN_EXISTS(X_SERIAL_RX)) - if (clearX || clearAll) tmc_clear_otpw(stepperX, TMC_X); - #endif - #if ENABLED(X2_IS_TMC2130) || (ENABLED(X2_IS_TMC2208) && PIN_EXISTS(X_SERIAL_RX)) - if (clearX || clearAll) tmc_clear_otpw(stepperX, TMC_X); - #endif - - #if ENABLED(Y_IS_TMC2130) || (ENABLED(Y_IS_TMC2208) && PIN_EXISTS(Y_SERIAL_RX)) - if (clearY || clearAll) tmc_clear_otpw(stepperY, TMC_Y); - #endif - - #if ENABLED(Z_IS_TMC2130) || (ENABLED(Z_IS_TMC2208) && PIN_EXISTS(Z_SERIAL_RX)) - if (clearZ || clearAll) tmc_clear_otpw(stepperZ, TMC_Z); - #endif - - #if ENABLED(E0_IS_TMC2130) || (ENABLED(E0_IS_TMC2208) && PIN_EXISTS(E0_SERIAL_RX)) - if (clearE || clearAll) tmc_clear_otpw(stepperE0, TMC_E0); - #endif - } - - /** - * M913: Set HYBRID_THRESHOLD speed. - */ - #if ENABLED(HYBRID_THRESHOLD) - inline void gcode_M913() { - #define TMC_SAY_PWMTHRS(P,Q) tmc_get_pwmthrs(stepper##Q, TMC_##Q, planner.axis_steps_per_mm[P##_AXIS]) - #define TMC_SET_PWMTHRS(P,Q) tmc_set_pwmthrs(stepper##Q, TMC_##Q, value, planner.axis_steps_per_mm[P##_AXIS]) - #define TMC_SAY_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, TMC_E##E, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) - #define TMC_SET_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, TMC_E##E, value, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) - - bool report = true; - const uint8_t index = parser.byteval('I'); - LOOP_XYZE(i) if (int32_t value = parser.longval(axis_codes[i])) { - report = false; - switch (i) { - case X_AXIS: - #if X_IS_TRINAMIC - if (index == 0) TMC_SET_PWMTHRS(X,X); - #endif - #if X2_IS_TRINAMIC - if (index == 1) TMC_SET_PWMTHRS(X,X2); - #endif - break; - case Y_AXIS: - #if Y_IS_TRINAMIC - if (index == 0) TMC_SET_PWMTHRS(Y,Y); - #endif - #if Y2_IS_TRINAMIC - if (index == 1) TMC_SET_PWMTHRS(Y,Y2); - #endif - break; - case Z_AXIS: - #if Z_IS_TRINAMIC - if (index == 0) TMC_SET_PWMTHRS(Z,Z); - #endif - #if Z2_IS_TRINAMIC - if (index == 1) TMC_SET_PWMTHRS(Z,Z2); - #endif - break; - case E_AXIS: { - if (get_target_extruder_from_command(913)) return; - switch (target_extruder) { - #if E0_IS_TRINAMIC - case 0: TMC_SET_PWMTHRS_E(0); break; - #endif - #if E_STEPPERS > 1 && E1_IS_TRINAMIC - case 1: TMC_SET_PWMTHRS_E(1); break; - #endif - #if E_STEPPERS > 2 && E2_IS_TRINAMIC - case 2: TMC_SET_PWMTHRS_E(2); break; - #endif - #if E_STEPPERS > 3 && E3_IS_TRINAMIC - case 3: TMC_SET_PWMTHRS_E(3); break; - #endif - #if E_STEPPERS > 4 && E4_IS_TRINAMIC - case 4: TMC_SET_PWMTHRS_E(4); break; - #endif - } - } break; - } - } - - if (report) LOOP_XYZE(i) switch (i) { - case X_AXIS: - #if X_IS_TRINAMIC - TMC_SAY_PWMTHRS(X,X); - #endif - #if X2_IS_TRINAMIC - TMC_SAY_PWMTHRS(X,X2); - #endif - break; - case Y_AXIS: - #if Y_IS_TRINAMIC - TMC_SAY_PWMTHRS(Y,Y); - #endif - #if Y2_IS_TRINAMIC - TMC_SAY_PWMTHRS(Y,Y2); - #endif - break; - case Z_AXIS: - #if Z_IS_TRINAMIC - TMC_SAY_PWMTHRS(Z,Z); - #endif - #if Z2_IS_TRINAMIC - TMC_SAY_PWMTHRS(Z,Z2); - #endif - break; - case E_AXIS: - #if E0_IS_TRINAMIC - TMC_SAY_PWMTHRS_E(0); - #endif - #if E_STEPPERS > 1 && E1_IS_TRINAMIC - TMC_SAY_PWMTHRS_E(1); - #endif - #if E_STEPPERS > 2 && E2_IS_TRINAMIC - TMC_SAY_PWMTHRS_E(2); - #endif - #if E_STEPPERS > 3 && E3_IS_TRINAMIC - TMC_SAY_PWMTHRS_E(3); - #endif - #if E_STEPPERS > 4 && E4_IS_TRINAMIC - TMC_SAY_PWMTHRS_E(4); - #endif - break; - } - } - #endif // HYBRID_THRESHOLD - - /** - * M914: Set SENSORLESS_HOMING sensitivity. - */ - #if ENABLED(SENSORLESS_HOMING) - inline void gcode_M914() { - #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q, TMC_##Q) - #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, TMC_##Q, value) - - bool report = true; - const uint8_t index = parser.byteval('I'); - LOOP_XYZ(i) if (parser.seen(axis_codes[i])) { - const int8_t value = (int8_t)constrain(parser.value_int(), -63, 64); - report = false; - switch (i) { - case X_AXIS: - #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) - if (index == 0) TMC_SET_SGT(X); - #endif - #if ENABLED(X2_IS_TMC2130) - if (index == 1) TMC_SET_SGT(X2); - #endif - break; - case Y_AXIS: - #if ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS) - if (index == 0) TMC_SET_SGT(Y); - #endif - #if ENABLED(Y2_IS_TMC2130) - if (index == 1) TMC_SET_SGT(Y2); - #endif - break; - case Z_AXIS: - #if ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS) - if (index == 0) TMC_SET_SGT(Z); - #endif - #if ENABLED(Z2_IS_TMC2130) - if (index == 1) TMC_SET_SGT(Z2); - #endif - break; - } - } - - if (report) LOOP_XYZ(i) switch (i) { - case X_AXIS: - #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) - TMC_SAY_SGT(X); - #endif - #if ENABLED(X2_IS_TMC2130) - TMC_SAY_SGT(X2); - #endif - break; - case Y_AXIS: - #if ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS) - TMC_SAY_SGT(Y); - #endif - #if ENABLED(Y2_IS_TMC2130) - TMC_SAY_SGT(Y2); - #endif - break; - case Z_AXIS: - #if ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS) - TMC_SAY_SGT(Z); - #endif - #if ENABLED(Z2_IS_TMC2130) - TMC_SAY_SGT(Z2); - #endif - break; - } - } - #endif // SENSORLESS_HOMING - - /** - * TMC Z axis calibration routine - */ - #if ENABLED(TMC_Z_CALIBRATION) - inline void gcode_M915() { - const uint16_t _rms = parser.seenval('S') ? parser.value_int() : CALIBRATION_CURRENT, - _z = parser.seenval('Z') ? parser.value_linear_units() : CALIBRATION_EXTRA_HEIGHT; - - if (!axis_known_position[Z_AXIS]) { - SERIAL_ECHOLNPGM("\nPlease home Z axis first"); - return; - } - - #if Z_IS_TRINAMIC - const uint16_t Z_current_1 = stepperZ.getCurrent(); - stepperZ.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); - #endif - #if Z2_IS_TRINAMIC - const uint16_t Z2_current_1 = stepperZ2.getCurrent(); - stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); - #endif - - SERIAL_ECHOPAIR("\nCalibration current: Z", _rms); - - soft_endstops_enabled = false; - - do_blocking_move_to_z(Z_MAX_POS+_z); - - #if Z_IS_TRINAMIC - stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER); - #endif - #if Z2_IS_TRINAMIC - stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER); - #endif - - do_blocking_move_to_z(Z_MAX_POS); - soft_endstops_enabled = true; - - SERIAL_ECHOLNPGM("\nHoming Z due to lost steps"); - enqueue_and_echo_commands_P(PSTR("G28 Z")); - } - #endif - -#endif // HAS_TRINAMIC - -/** - * M907: Set digital trimpot motor current using axis codes X, Y, Z, E, B, S - */ -inline void gcode_M907() { - #if HAS_DIGIPOTSS - - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.digipot_current(i, parser.value_int()); - if (parser.seen('B')) stepper.digipot_current(4, parser.value_int()); - if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.digipot_current(i, parser.value_int()); - - #elif HAS_MOTOR_CURRENT_PWM - - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - if (parser.seen('X')) stepper.digipot_current(0, parser.value_int()); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seen('Z')) stepper.digipot_current(1, parser.value_int()); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - if (parser.seen('E')) stepper.digipot_current(2, parser.value_int()); - #endif - - #endif - - #if ENABLED(DIGIPOT_I2C) - // this one uses actual amps in floating point - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) digipot_i2c_set_current(i, parser.value_float()); - // for each additional extruder (named B,C,D,E..., channels 4,5,6,7...) - for (uint8_t i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (parser.seen('B' + i - (NUM_AXIS))) digipot_i2c_set_current(i, parser.value_float()); - #endif - - #if ENABLED(DAC_STEPPER_CURRENT) - if (parser.seen('S')) { - const float dac_percent = parser.value_float(); - for (uint8_t i = 0; i <= 4; i++) dac_current_percent(i, dac_percent); - } - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) dac_current_percent(i, parser.value_float()); - #endif -} - -#if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) - - /** - * M908: Control digital trimpot directly (M908 P S) - */ - inline void gcode_M908() { - #if HAS_DIGIPOTSS - stepper.digitalPotWrite( - parser.intval('P'), - parser.intval('S') - ); - #endif - #ifdef DAC_STEPPER_CURRENT - dac_current_raw( - parser.byteval('P', -1), - parser.ushortval('S', 0) - ); - #endif - } - - #if ENABLED(DAC_STEPPER_CURRENT) // As with Printrbot RevF - - inline void gcode_M909() { dac_print_values(); } - - inline void gcode_M910() { dac_commit_eeprom(); } - - #endif - -#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT - -#if HAS_MICROSTEPS - - // M350 Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers. - inline void gcode_M350() { - if (parser.seen('S')) for (int i = 0; i <= 4; i++) stepper.microstep_mode(i, parser.value_byte()); - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte()); - if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte()); - stepper.microstep_readings(); - } - - /** - * M351: Toggle MS1 MS2 pins directly with axis codes X Y Z E B - * S# determines MS1 or MS2, X# sets the pin high/low. - */ - inline void gcode_M351() { - if (parser.seenval('S')) switch (parser.value_byte()) { - case 1: - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1); - if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1); - break; - case 2: - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte()); - if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte()); - break; - } - stepper.microstep_readings(); - } - -#endif // HAS_MICROSTEPS - -#if HAS_CASE_LIGHT - - #ifndef INVERT_CASE_LIGHT - #define INVERT_CASE_LIGHT false - #endif - uint8_t case_light_brightness; // LCD routine wants INT - bool case_light_on; - - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - LEDColor case_light_color = - #ifdef CASE_LIGHT_NEOPIXEL_COLOR - CASE_LIGHT_NEOPIXEL_COLOR - #else - { 255, 255, 255, 255 } - #endif - ; - #endif - - void update_case_light() { - const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; - - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - - leds.set_color( - MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), - false - ); - - #else // !CASE_LIGHT_USE_NEOPIXEL - - SET_OUTPUT(CASE_LIGHT_PIN); - if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) - analogWrite(CASE_LIGHT_PIN, n10ct); - else { - const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; - WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); - } - - #endif // !CASE_LIGHT_USE_NEOPIXEL - } -#endif // HAS_CASE_LIGHT - -/** - * M355: Turn case light on/off and set brightness - * - * P Set case light brightness (PWM pin required - ignored otherwise) - * - * S Set case light on/off - * - * When S turns on the light on a PWM pin then the current brightness level is used/restored - * - * M355 P200 S0 turns off the light & sets the brightness level - * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) - */ -inline void gcode_M355() { - #if HAS_CASE_LIGHT - uint8_t args = 0; - if (parser.seenval('P')) ++args, case_light_brightness = parser.value_byte(); - if (parser.seenval('S')) ++args, case_light_on = parser.value_bool(); - if (args) update_case_light(); - - // always report case light status - SERIAL_ECHO_START(); - if (!case_light_on) { - SERIAL_ECHOLNPGM("Case light: off"); - } - else { - if (!USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM("Case light: on"); - else SERIAL_ECHOLNPAIR("Case light: ", (int)case_light_brightness); - } - - #else - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_M355_NONE); - #endif // HAS_CASE_LIGHT -} - -#if ENABLED(MIXING_EXTRUDER) - - /** - * M163: Set a single mix factor for a mixing extruder - * This is called "weight" by some systems. - * - * S[index] The channel index to set - * P[float] The mix value - * - */ - inline void gcode_M163() { - const int mix_index = parser.intval('S'); - if (mix_index < MIXING_STEPPERS) { - float mix_value = parser.floatval('P'); - NOLESS(mix_value, 0.0); - mixing_factor[mix_index] = RECIPROCAL(mix_value); - } - } - - #if MIXING_VIRTUAL_TOOLS > 1 - - /** - * M164: Store the current mix factors as a virtual tool. - * - * S[index] The virtual tool to store - * - */ - inline void gcode_M164() { - const int tool_index = parser.intval('S'); - if (tool_index < MIXING_VIRTUAL_TOOLS) { - normalize_mix(); - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - mixing_virtual_tool_mix[tool_index][i] = mixing_factor[i]; - } - } - - #endif - - #if ENABLED(DIRECT_MIXING_IN_G1) - /** - * M165: Set multiple mix factors for a mixing extruder. - * Factors that are left out will be set to 0. - * All factors together must add up to 1.0. - * - * A[factor] Mix factor for extruder stepper 1 - * B[factor] Mix factor for extruder stepper 2 - * C[factor] Mix factor for extruder stepper 3 - * D[factor] Mix factor for extruder stepper 4 - * H[factor] Mix factor for extruder stepper 5 - * I[factor] Mix factor for extruder stepper 6 - * - */ - inline void gcode_M165() { gcode_get_mix(); } - #endif - -#endif // MIXING_EXTRUDER - -/** - * M999: Restart after being stopped - * - * Default behaviour is to flush the serial buffer and request - * a resend to the host starting on the last N line received. - * - * Sending "M999 S1" will resume printing without flushing the - * existing command buffer. - * - */ -inline void gcode_M999() { - Running = true; - lcd_reset_alert_level(); - - if (parser.boolval('S')) return; - - // gcode_LastN = Stopped_gcode_LastN; - flush_and_request_resend(); -} - -#if ENABLED(SWITCHING_EXTRUDER) - #if EXTRUDERS > 3 - #define REQ_ANGLES 4 - #define _SERVO_NR (e < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR) - #else - #define REQ_ANGLES 2 - #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR - #endif - inline void move_extruder_servo(const uint8_t e) { - constexpr int16_t angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES; - static_assert(COUNT(angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles."); - stepper.synchronize(); - #if EXTRUDERS & 1 - if (e < EXTRUDERS - 1) - #endif - { - MOVE_SERVO(_SERVO_NR, angles[e]); - safe_delay(500); - } - } -#endif // SWITCHING_EXTRUDER - -#if ENABLED(SWITCHING_NOZZLE) - inline void move_nozzle_servo(const uint8_t e) { - const int16_t angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES; - stepper.synchronize(); - MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]); - safe_delay(500); - } -#endif - -inline void invalid_extruder_error(const uint8_t e) { - SERIAL_ECHO_START(); - SERIAL_CHAR('T'); - SERIAL_ECHO_F(e, DEC); - SERIAL_CHAR(' '); - SERIAL_ECHOLNPGM(MSG_INVALID_EXTRUDER); -} - -#if ENABLED(PARKING_EXTRUDER) - - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - #define PE_MAGNET_ON_STATE !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #else - #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #endif - - void pe_set_magnet(const uint8_t extruder_num, const uint8_t state) { - switch (extruder_num) { - case 1: OUT_WRITE(SOL1_PIN, state); break; - default: OUT_WRITE(SOL0_PIN, state); break; - } - #if PARKING_EXTRUDER_SOLENOIDS_DELAY > 0 - dwell(PARKING_EXTRUDER_SOLENOIDS_DELAY); - #endif - } - - inline void pe_activate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, PE_MAGNET_ON_STATE); } - inline void pe_deactivate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, !PE_MAGNET_ON_STATE); } - -#endif // PARKING_EXTRUDER - -#if HAS_FANMUX - - void fanmux_switch(const uint8_t e) { - WRITE(FANMUX0_PIN, TEST(e, 0) ? HIGH : LOW); - #if PIN_EXISTS(FANMUX1) - WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW); - #if PIN_EXISTS(FANMUX2) - WRITE(FANMUX2, TEST(e, 2) ? HIGH : LOW); - #endif - #endif - } - - FORCE_INLINE void fanmux_init(void) { - SET_OUTPUT(FANMUX0_PIN); - #if PIN_EXISTS(FANMUX1) - SET_OUTPUT(FANMUX1_PIN); - #if PIN_EXISTS(FANMUX2) - SET_OUTPUT(FANMUX2_PIN); - #endif - #endif - fanmux_switch(0); - } - -#endif // HAS_FANMUX - -/** - * Tool Change functions - */ - -#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - - inline void mixing_tool_change(const uint8_t tmp_extruder) { - if (tmp_extruder >= MIXING_VIRTUAL_TOOLS) - return invalid_extruder_error(tmp_extruder); - - // T0-Tnnn: Switch virtual tool by changing the mix - for (uint8_t j = 0; j < MIXING_STEPPERS; j++) - mixing_factor[j] = mixing_virtual_tool_mix[tmp_extruder][j]; - } - -#endif // MIXING_EXTRUDER && MIXING_VIRTUAL_TOOLS > 1 - -#if ENABLED(DUAL_X_CARRIAGE) - - inline void dualx_tool_change(const uint8_t tmp_extruder, bool &no_move) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPGM("Dual X Carriage Mode "); - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: SERIAL_ECHOLNPGM("DXC_FULL_CONTROL_MODE"); break; - case DXC_AUTO_PARK_MODE: SERIAL_ECHOLNPGM("DXC_AUTO_PARK_MODE"); break; - case DXC_DUPLICATION_MODE: SERIAL_ECHOLNPGM("DXC_DUPLICATION_MODE"); break; - } - } - #endif - - const float xhome = x_home_pos(active_extruder); - if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE - && IsRunning() - && (delayed_move_time || current_position[X_AXIS] != xhome) - ) { - float raised_z = current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT; - #if ENABLED(MAX_SOFTWARE_ENDSTOPS) - NOMORE(raised_z, soft_endstop_max[Z_AXIS]); - #endif - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPAIR("Raise to ", raised_z); - SERIAL_ECHOLNPAIR("MoveX to ", xhome); - SERIAL_ECHOLNPAIR("Lower to ", current_position[Z_AXIS]); - } - #endif - // Park old head: 1) raise 2) move to park position 3) lower - for (uint8_t i = 0; i < 3; i++) - planner.buffer_line( - i == 0 ? current_position[X_AXIS] : xhome, - current_position[Y_AXIS], - i == 2 ? current_position[Z_AXIS] : raised_z, - current_position[E_AXIS], - planner.max_feedrate_mm_s[i == 1 ? X_AXIS : Z_AXIS], - active_extruder - ); - stepper.synchronize(); - } - - // Apply Y & Z extruder offset (X offset is used as home pos with Dual X) - current_position[Y_AXIS] -= hotend_offset[Y_AXIS][active_extruder] - hotend_offset[Y_AXIS][tmp_extruder]; - current_position[Z_AXIS] -= hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; - - // Activate the new extruder ahead of calling set_axis_is_at_home! - active_extruder = tmp_extruder; - - // This function resets the max/min values - the current position may be overwritten below. - set_axis_is_at_home(X_AXIS); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("New Extruder", current_position); - #endif - - // Only when auto-parking are carriages safe to move - if (dual_x_carriage_mode != DXC_AUTO_PARK_MODE) no_move = true; - - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: - // New current position is the position of the activated extruder - current_position[X_AXIS] = inactive_extruder_x_pos; - // Save the inactive extruder's position (from the old current_position) - inactive_extruder_x_pos = destination[X_AXIS]; - break; - case DXC_AUTO_PARK_MODE: - // record raised toolhead position for use by unpark - COPY(raised_parked_position, current_position); - raised_parked_position[Z_AXIS] += TOOLCHANGE_UNPARK_ZLIFT; - #if ENABLED(MAX_SOFTWARE_ENDSTOPS) - NOMORE(raised_parked_position[Z_AXIS], soft_endstop_max[Z_AXIS]); - #endif - active_extruder_parked = true; - delayed_move_time = 0; - break; - case DXC_DUPLICATION_MODE: - // If the new extruder is the left one, set it "parked" - // This triggers the second extruder to move into the duplication position - active_extruder_parked = (active_extruder == 0); - current_position[X_AXIS] = active_extruder_parked ? inactive_extruder_x_pos : destination[X_AXIS] + duplicate_extruder_x_offset; - inactive_extruder_x_pos = destination[X_AXIS]; - extruder_duplication_enabled = false; - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPAIR("Set inactive_extruder_x_pos=", inactive_extruder_x_pos); - SERIAL_ECHOLNPGM("Clear extruder_duplication_enabled"); - } - #endif - break; - } - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); - DEBUG_POS("New extruder (parked)", current_position); - } - #endif - - // No extra case for HAS_ABL in DUAL_X_CARRIAGE. Does that mean they don't work together? - } - -#endif // DUAL_X_CARRIAGE - -#if ENABLED(PARKING_EXTRUDER) - - inline void parking_extruder_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { - constexpr float z_raise = PARKING_EXTRUDER_SECURITY_RAISE; - - if (!no_move) { - - const float parkingposx[] = PARKING_EXTRUDER_PARKING_X, - midpos = (parkingposx[0] + parkingposx[1]) * 0.5 + hotend_offset[X_AXIS][active_extruder], - grabpos = parkingposx[tmp_extruder] + hotend_offset[X_AXIS][active_extruder] - + (tmp_extruder == 0 ? -(PARKING_EXTRUDER_GRAB_DISTANCE) : PARKING_EXTRUDER_GRAB_DISTANCE); - /** - * Steps: - * 1. Raise Z-Axis to give enough clearance - * 2. Move to park position of old extruder - * 3. Disengage magnetic field, wait for delay - * 4. Move near new extruder - * 5. Engage magnetic field for new extruder - * 6. Move to parking incl. offset of new extruder - * 7. Lower Z-Axis - */ - - // STEP 1 - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("Starting Autopark"); - if (DEBUGGING(LEVELING)) DEBUG_POS("current position:", current_position); - #endif - current_position[Z_AXIS] += z_raise; - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("(1) Raise Z-Axis "); - if (DEBUGGING(LEVELING)) DEBUG_POS("Moving to Raised Z-Position", current_position); - #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); - stepper.synchronize(); - - // STEP 2 - current_position[X_AXIS] = parkingposx[active_extruder] + hotend_offset[X_AXIS][active_extruder]; - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPAIR("(2) Park extruder ", active_extruder); - if (DEBUGGING(LEVELING)) DEBUG_POS("Moving ParkPos", current_position); - #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); - stepper.synchronize(); - - // STEP 3 - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("(3) Disengage magnet "); - #endif - pe_deactivate_magnet(active_extruder); - - // STEP 4 - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("(4) Move to position near new extruder"); - #endif - current_position[X_AXIS] += (active_extruder == 0 ? 10 : -10); // move 10mm away from parked extruder - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("Moving away from parked extruder", current_position); - #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); - stepper.synchronize(); - - // STEP 5 - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("(5) Engage magnetic field"); - #endif - - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - pe_activate_magnet(active_extruder); //just save power for inverted magnets - #endif - pe_activate_magnet(tmp_extruder); - - // STEP 6 - current_position[X_AXIS] = grabpos + (tmp_extruder == 0 ? (+10) : (-10)); - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); - current_position[X_AXIS] = grabpos; - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPAIR("(6) Unpark extruder ", tmp_extruder); - if (DEBUGGING(LEVELING)) DEBUG_POS("Move UnparkPos", current_position); - #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder); - stepper.synchronize(); - - // Step 7 - current_position[X_AXIS] = midpos - hotend_offset[X_AXIS][tmp_extruder]; - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("(7) Move midway between hotends"); - if (DEBUGGING(LEVELING)) DEBUG_POS("Move midway to new extruder", current_position); - #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); - stepper.synchronize(); - #if ENABLED(DEBUG_LEVELING_FEATURE) - SERIAL_ECHOLNPGM("Autopark done."); - #endif - } - else { // nomove == true - // Only engage magnetic field for new extruder - pe_activate_magnet(tmp_extruder); - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - pe_activate_magnet(active_extruder); // Just save power for inverted magnets - #endif - } - current_position[Z_AXIS] += hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("Applying Z-offset", current_position); - #endif - } - -#endif // PARKING_EXTRUDER - -/** - * Perform a tool-change, which may result in moving the - * previous tool out of the way and the new tool into place. - */ -void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { - #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - - mixing_tool_change(tmp_extruder); - - #else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 - - if (tmp_extruder >= EXTRUDERS) - return invalid_extruder_error(tmp_extruder); - - #if HOTENDS > 1 - - const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s; - - feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; - - if (tmp_extruder != active_extruder) { - if (!no_move && axis_unhomed_error()) { - no_move = true; - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("No move on toolchange"); - #endif - } - - // Save current position to destination, for use later - set_destination_from_current(); - - #if HAS_LEVELING - // Set current position to the physical position - const bool leveling_was_active = planner.leveling_active; - set_bed_leveling_enabled(false); - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - - dualx_tool_change(tmp_extruder, no_move); // Can modify no_move - - #else // !DUAL_X_CARRIAGE - - #if ENABLED(PARKING_EXTRUDER) // Dual Parking extruder - parking_extruder_tool_change(tmp_extruder, no_move); - #endif - - #if ENABLED(SWITCHING_NOZZLE) - // Always raise by at least 1 to avoid workpiece - const float zdiff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; - current_position[Z_AXIS] += (zdiff > 0.0 ? zdiff : 0.0) + 1; - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); - move_nozzle_servo(tmp_extruder); - #endif - - const float xdiff = hotend_offset[X_AXIS][tmp_extruder] - hotend_offset[X_AXIS][active_extruder], - ydiff = hotend_offset[Y_AXIS][tmp_extruder] - hotend_offset[Y_AXIS][active_extruder]; - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("Offset Tool XY by { ", xdiff); - SERIAL_ECHOPAIR(", ", ydiff); - SERIAL_ECHOLNPGM(" }"); - } - #endif - - // The newly-selected extruder XY is actually at... - current_position[X_AXIS] += xdiff; - current_position[Y_AXIS] += ydiff; - - // Set the new active extruder - active_extruder = tmp_extruder; - - #endif // !DUAL_X_CARRIAGE - - #if ENABLED(SWITCHING_NOZZLE) - // The newly-selected extruder Z is actually at... - current_position[Z_AXIS] -= zdiff; - #endif - - #if HAS_LEVELING - // Restore leveling to re-establish the logical position - set_bed_leveling_enabled(leveling_was_active); - #endif - - // Tell the planner the new "current position" - SYNC_PLAN_POSITION_KINEMATIC(); - - #if ENABLED(DELTA) - //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function - const bool safe_to_move = current_position[Z_AXIS] < delta_clip_start_height - 1; - #else - constexpr bool safe_to_move = true; - #endif - - // Raise, move, and lower again - if (safe_to_move && !no_move && IsRunning()) { - #if DISABLED(SWITCHING_NOZZLE) - // Do a small lift to avoid the workpiece in the move back (below) - current_position[Z_AXIS] += 1.0; - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); - #endif - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); - #endif - // Move back to the original (or tweaked) position - do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]); - } - #if ENABLED(SWITCHING_NOZZLE) - else { - // Move back down. (Including when the new tool is higher.) - do_blocking_move_to_z(destination[Z_AXIS], planner.max_feedrate_mm_s[Z_AXIS]); - } - #endif - } // (tmp_extruder != active_extruder) - - stepper.synchronize(); - - #if ENABLED(EXT_SOLENOID) && !ENABLED(PARKING_EXTRUDER) - disable_all_solenoids(); - enable_solenoid_on_active_extruder(); - #endif - - feedrate_mm_s = old_feedrate_mm_s; - - #else // HOTENDS <= 1 - - UNUSED(fr_mm_s); - UNUSED(no_move); - - #if ENABLED(MK2_MULTIPLEXER) - if (tmp_extruder >= E_STEPPERS) - return invalid_extruder_error(tmp_extruder); - - select_multiplexed_stepper(tmp_extruder); - #endif - - // Set the new active extruder - active_extruder = tmp_extruder; - - #endif // HOTENDS <= 1 - - #if DO_SWITCH_EXTRUDER - stepper.synchronize(); - move_extruder_servo(active_extruder); - #endif - - #if HAS_FANMUX - fanmux_switch(active_extruder); - #endif - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder); - - #endif // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 -} - -/** - * T0-T3: Switch tool, usually switching extruders - * - * F[units/min] Set the movement feedrate - * S1 Don't move the tool in XY after change - */ -inline void gcode_T(const uint8_t tmp_extruder) { - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR(">>> gcode_T(", tmp_extruder); - SERIAL_CHAR(')'); - SERIAL_EOL(); - DEBUG_POS("BEFORE", current_position); - } - #endif - - #if HOTENDS == 1 || (ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1) - - tool_change(tmp_extruder); - - #elif HOTENDS > 1 - - tool_change( - tmp_extruder, - MMM_TO_MMS(parser.linearval('F')), - (tmp_extruder == active_extruder) || parser.boolval('S') - ); - - #endif - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - DEBUG_POS("AFTER", current_position); - SERIAL_ECHOLNPGM("<<< gcode_T"); - } - #endif -} - -/** - * Process the parsed command and dispatch it to its handler - */ -void process_parsed_command() { - KEEPALIVE_STATE(IN_HANDLER); - - // Handle a known G, M, or T - switch (parser.command_letter) { - case 'G': switch (parser.codenum) { - - case 0: case 1: gcode_G0_G1( // G0: Fast Move, G1: Linear Move - #if IS_SCARA - parser.codenum == 0 - #endif - ); break; - - #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) - case 2: case 3: gcode_G2_G3(parser.codenum == 2); break; // G2: CW ARC, G3: CCW ARC - #endif - - case 4: gcode_G4(); break; // G4: Dwell - - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: gcode_G5(); break; // G5: Cubic B_spline - #endif - - #if ENABLED(FWRETRACT) - case 10: gcode_G10(); break; // G10: Retract - case 11: gcode_G11(); break; // G11: Prime - #endif - - #if ENABLED(NOZZLE_CLEAN_FEATURE) - case 12: gcode_G12(); break; // G12: Clean Nozzle - #endif - - #if ENABLED(CNC_WORKSPACE_PLANES) - case 17: gcode_G17(); break; // G17: Select Plane XY - case 18: gcode_G18(); break; // G18: Select Plane ZX - case 19: gcode_G19(); break; // G19: Select Plane YZ - #endif - - #if ENABLED(INCH_MODE_SUPPORT) - case 20: gcode_G20(); break; // G20: Inch Units - case 21: gcode_G21(); break; // G21: Millimeter Units - #endif - - #if ENABLED(G26_MESH_VALIDATION) - case 26: gcode_G26(); break; // G26: Mesh Validation Pattern - #endif - - #if ENABLED(NOZZLE_PARK_FEATURE) - case 27: gcode_G27(); break; // G27: Park Nozzle - #endif - - case 28: gcode_G28(false); break; // G28: Home one or more axes - - #if HAS_LEVELING - case 29: gcode_G29(); break; // G29: Detailed Z probe - #endif - - #if HAS_BED_PROBE - case 30: gcode_G30(); break; // G30: Single Z probe - #endif - - #if ENABLED(Z_PROBE_SLED) - case 31: gcode_G31(); break; // G31: Dock sled - case 32: gcode_G32(); break; // G32: Undock sled - #endif - - #if ENABLED(DELTA_AUTO_CALIBRATION) - case 33: gcode_G33(); break; // G33: Delta Auto-Calibration - #endif - - #if ENABLED(G38_PROBE_TARGET) - case 38: - if (parser.subcode == 2 || parser.subcode == 3) - gcode_G38(parser.subcode == 2); // G38.2, G38.3: Probe towards object - break; - #endif - - #if HAS_MESH - case 42: gcode_G42(); break; // G42: Move to mesh point - #endif - - case 90: relative_mode = false; break; // G90: Absolute coordinates - case 91: relative_mode = true; break; // G91: Relative coordinates - - case 92: gcode_G92(); break; // G92: Set Position - - #if ENABLED(DEBUG_GCODE_PARSER) - case 800: parser.debug(); break; // G800: GCode Parser Test for G - #endif - - default: parser.unknown_command_error(); - } - break; - - case 'M': switch (parser.codenum) { - #if HAS_RESUME_CONTINUE - case 0: case 1: gcode_M0_M1(); break; // M0: Unconditional stop, M1: Conditional stop - #endif - - #if ENABLED(SPINDLE_LASER_ENABLE) - case 3: gcode_M3_M4(true); break; // M3: Laser/CW-Spindle Power - case 4: gcode_M3_M4(false); break; // M4: Laser/CCW-Spindle Power - case 5: gcode_M5(); break; // M5: Laser/Spindle OFF - #endif - - case 17: gcode_M17(); break; // M17: Enable all steppers - - #if ENABLED(SDSUPPORT) - case 20: gcode_M20(); break; // M20: List SD Card - case 21: gcode_M21(); break; // M21: Init SD Card - case 22: gcode_M22(); break; // M22: Release SD Card - case 23: gcode_M23(); break; // M23: Select File - case 24: gcode_M24(); break; // M24: Start SD Print - case 25: gcode_M25(); break; // M25: Pause SD Print - case 26: gcode_M26(); break; // M26: Set SD Index - case 27: gcode_M27(); break; // M27: Get SD Status - case 28: gcode_M28(); break; // M28: Start SD Write - case 29: gcode_M29(); break; // M29: Stop SD Write - case 30: gcode_M30(); break; // M30: Delete File - case 32: gcode_M32(); break; // M32: Select file, Start SD Print - #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - case 33: gcode_M33(); break; // M33: Report longname path - #endif - #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) - case 34: gcode_M34(); break; // M34: Set SD card sorting options - #endif - case 928: gcode_M928(); break; // M928: Start SD write - #endif // SDSUPPORT - - case 31: gcode_M31(); break; // M31: Report print job elapsed time - - case 42: gcode_M42(); break; // M42: Change pin state - #if ENABLED(PINS_DEBUGGING) - case 43: gcode_M43(); break; // M43: Read/monitor pin and endstop states - #endif - - #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - case 48: gcode_M48(); break; // M48: Z probe repeatability test - #endif - #if ENABLED(G26_MESH_VALIDATION) - case 49: gcode_M49(); break; // M49: Toggle the G26 Debug Flag - #endif - - #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) - case 73: gcode_M73(); break; // M73: Set Print Progress % - #endif - case 75: gcode_M75(); break; // M75: Start Print Job Timer - case 76: gcode_M76(); break; // M76: Pause Print Job Timer - case 77: gcode_M77(); break; // M77: Stop Print Job Timer - #if ENABLED(PRINTCOUNTER) - case 78: gcode_M78(); break; // M78: Report Print Statistics - #endif - - #if ENABLED(M100_FREE_MEMORY_WATCHER) - case 100: gcode_M100(); break; // M100: Free Memory Report - #endif - - case 104: gcode_M104(); break; // M104: Set Hotend Temperature - case 110: gcode_M110(); break; // M110: Set Current Line Number - case 111: gcode_M111(); break; // M111: Set Debug Flags - - #if DISABLED(EMERGENCY_PARSER) - case 108: gcode_M108(); break; // M108: Cancel Waiting - case 112: gcode_M112(); break; // M112: Emergency Stop - case 410: gcode_M410(); break; // M410: Quickstop. Abort all planned moves - #endif - - #if ENABLED(HOST_KEEPALIVE_FEATURE) - case 113: gcode_M113(); break; // M113: Set Host Keepalive Interval - #endif - - case 105: gcode_M105(); KEEPALIVE_STATE(NOT_BUSY); return; // M105: Report Temperatures (and say "ok") - - #if ENABLED(AUTO_REPORT_TEMPERATURES) - case 155: gcode_M155(); break; // M155: Set Temperature Auto-report Interval - #endif - - case 109: gcode_M109(); break; // M109: Set Hotend Temperature. Wait for target. - - #if HAS_HEATED_BED - case 140: gcode_M140(); break; // M140: Set Bed Temperature - case 190: gcode_M190(); break; // M190: Set Bed Temperature. Wait for target. - #endif - - #if FAN_COUNT > 0 - case 106: gcode_M106(); break; // M106: Set Fan Speed - case 107: gcode_M107(); break; // M107: Fan Off - #endif - - #if ENABLED(PARK_HEAD_ON_PAUSE) - case 125: gcode_M125(); break; // M125: Park (for Filament Change) - #endif - - #if ENABLED(BARICUDA) - #if HAS_HEATER_1 - case 126: gcode_M126(); break; // M126: Valve 1 Open - case 127: gcode_M127(); break; // M127: Valve 1 Closed - #endif - #if HAS_HEATER_2 - case 128: gcode_M128(); break; // M128: Valve 2 Open - case 129: gcode_M129(); break; // M129: Valve 2 Closed - #endif - #endif - - #if HAS_POWER_SWITCH - case 80: gcode_M80(); break; // M80: Turn on Power Supply - #endif - case 81: gcode_M81(); break; // M81: Turn off Power and Power Supply - - case 82: gcode_M82(); break; // M82: Disable Relative E-Axis - case 83: gcode_M83(); break; // M83: Set Relative E-Axis - case 18: case 84: gcode_M18_M84(); break; // M18/M84: Disable Steppers / Set Timeout - case 85: gcode_M85(); break; // M85: Set inactivity stepper shutdown timeout - case 92: gcode_M92(); break; // M92: Set steps-per-unit - case 114: gcode_M114(); break; // M114: Report Current Position - case 115: gcode_M115(); break; // M115: Capabilities Report - case 117: gcode_M117(); break; // M117: Set LCD message text - case 118: gcode_M118(); break; // M118: Print a message in the host console - case 119: gcode_M119(); break; // M119: Report Endstop states - case 120: gcode_M120(); break; // M120: Enable Endstops - case 121: gcode_M121(); break; // M121: Disable Endstops - - #if ENABLED(ULTIPANEL) - case 145: gcode_M145(); break; // M145: Set material heatup parameters - #endif - - #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - case 149: gcode_M149(); break; // M149: Set Temperature Units, C F K - #endif - - #if HAS_COLOR_LEDS - case 150: gcode_M150(); break; // M150: Set Status LED Color - #endif - - #if ENABLED(MIXING_EXTRUDER) - case 163: gcode_M163(); break; // M163: Set Mixing Component - #if MIXING_VIRTUAL_TOOLS > 1 - case 164: gcode_M164(); break; // M164: Save Current Mix - #endif - #if ENABLED(DIRECT_MIXING_IN_G1) - case 165: gcode_M165(); break; // M165: Set Multiple Mixing Components - #endif - #endif - - #if DISABLED(NO_VOLUMETRICS) - case 200: gcode_M200(); break; // M200: Set Filament Diameter, Volumetric Extrusion - #endif - - case 201: gcode_M201(); break; // M201: Set Max Printing Acceleration (units/sec^2) - #if 0 - case 202: gcode_M202(); break; // M202: Not used for Sprinter/grbl gen6 - #endif - case 203: gcode_M203(); break; // M203: Set Max Feedrate (units/sec) - case 204: gcode_M204(); break; // M204: Set Acceleration - case 205: gcode_M205(); break; // M205: Set Advanced settings - - #if HAS_M206_COMMAND - case 206: gcode_M206(); break; // M206: Set Home Offsets - case 428: gcode_M428(); break; // M428: Set Home Offsets based on current position - #endif - - #if ENABLED(FWRETRACT) - case 207: gcode_M207(); break; // M207: Set Retract Length, Feedrate, Z lift - case 208: gcode_M208(); break; // M208: Set Additional Prime Length and Feedrate - case 209: - if (MIN_AUTORETRACT <= MAX_AUTORETRACT) gcode_M209(); // M209: Turn Auto-Retract on/off - break; - #endif - - case 211: gcode_M211(); break; // M211: Enable/Disable/Report Software Endstops - - #if HOTENDS > 1 - case 218: gcode_M218(); break; // M218: Set Tool Offset - #endif - - case 220: gcode_M220(); break; // M220: Set Feedrate Percentage - case 221: gcode_M221(); break; // M221: Set Flow Percentage - case 226: gcode_M226(); break; // M226: Wait for Pin State - - #if defined(CHDK) || HAS_PHOTOGRAPH - case 240: gcode_M240(); break; // M240: Trigger Camera - #endif - - #if HAS_LCD_CONTRAST - case 250: gcode_M250(); break; // M250: Set LCD Contrast - #endif - - #if ENABLED(EXPERIMENTAL_I2CBUS) - case 260: gcode_M260(); break; // M260: Send Data to i2c slave - case 261: gcode_M261(); break; // M261: Request Data from i2c slave - #endif - - #if HAS_SERVOS - case 280: gcode_M280(); break; // M280: Set Servo Position - #endif - - #if ENABLED(BABYSTEPPING) - case 290: gcode_M290(); break; // M290: Babystepping - #endif - - #if HAS_BUZZER - case 300: gcode_M300(); break; // M300: Add Tone/Buzz to Queue - #endif - - #if ENABLED(PIDTEMP) - case 301: gcode_M301(); break; // M301: Set Hotend PID parameters - #endif - - #if ENABLED(PREVENT_COLD_EXTRUSION) - case 302: gcode_M302(); break; // M302: Set Minimum Extrusion Temp - #endif - - case 303: gcode_M303(); break; // M303: PID Autotune - - #if ENABLED(PIDTEMPBED) - case 304: gcode_M304(); break; // M304: Set Bed PID parameters - #endif - - #if HAS_MICROSTEPS - case 350: gcode_M350(); break; // M350: Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers. - case 351: gcode_M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. - #endif - - case 355: gcode_M355(); break; // M355: Set Case Light brightness - - #if ENABLED(MORGAN_SCARA) - case 360: if (gcode_M360()) return; break; // M360: SCARA Theta pos1 - case 361: if (gcode_M361()) return; break; // M361: SCARA Theta pos2 - case 362: if (gcode_M362()) return; break; // M362: SCARA Psi pos1 - case 363: if (gcode_M363()) return; break; // M363: SCARA Psi pos2 - case 364: if (gcode_M364()) return; break; // M364: SCARA Psi pos3 (90 deg to Theta) - #endif - - case 400: gcode_M400(); break; // M400: Synchronize. Wait for moves to finish. - - #if HAS_BED_PROBE - case 401: gcode_M401(); break; // M401: Deploy Probe - case 402: gcode_M402(); break; // M402: Stow Probe - #endif - - #if ENABLED(FILAMENT_WIDTH_SENSOR) - case 404: gcode_M404(); break; // M404: Set/Report Nominal Filament Width - case 405: gcode_M405(); break; // M405: Enable Filament Width Sensor - case 406: gcode_M406(); break; // M406: Disable Filament Width Sensor - case 407: gcode_M407(); break; // M407: Report Measured Filament Width - #endif - - #if HAS_LEVELING - case 420: gcode_M420(); break; // M420: Set Bed Leveling Enabled / Fade - #endif - - #if HAS_MESH - case 421: gcode_M421(); break; // M421: Set a Mesh Z value - #endif - - case 500: gcode_M500(); break; // M500: Store Settings in EEPROM - case 501: gcode_M501(); break; // M501: Read Settings from EEPROM - case 502: gcode_M502(); break; // M502: Revert Settings to defaults - #if DISABLED(DISABLE_M503) - case 503: gcode_M503(); break; // M503: Report Settings (in SRAM) - #endif - #if ENABLED(EEPROM_SETTINGS) - case 504: gcode_M504(); break; // M504: Validate EEPROM - #endif - - #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - case 540: gcode_M540(); break; // M540: Set Abort on Endstop Hit for SD Printing - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - case 600: gcode_M600(); break; // M600: Pause for Filament Change - case 603: gcode_M603(); break; // M603: Configure Filament Change - #endif - - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - case 605: gcode_M605(); break; // M605: Set Dual X Carriage movement mode - #endif - - #if ENABLED(DELTA) - case 665: gcode_M665(); break; // M665: Delta Configuration - #endif - #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - case 666: gcode_M666(); break; // M666: DELTA/Dual Endstop Adjustment - #endif - - #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - case 701: gcode_M701(); break; // M701: Load Filament - case 702: gcode_M702(); break; // M702: Unload Filament - #endif - - #if ENABLED(DEBUG_GCODE_PARSER) - case 800: parser.debug(); break; // M800: GCode Parser Test for M - #endif - - #if HAS_BED_PROBE - case 851: gcode_M851(); break; // M851: Set Z Probe Z Offset - #endif - - #if ENABLED(SKEW_CORRECTION_GCODE) - case 852: gcode_M852(); break; // M852: Set Skew factors - #endif - - #if ENABLED(I2C_POSITION_ENCODERS) - case 860: gcode_M860(); break; // M860: Report encoder module position - case 861: gcode_M861(); break; // M861: Report encoder module status - case 862: gcode_M862(); break; // M862: Perform axis test - case 863: gcode_M863(); break; // M863: Calibrate steps/mm - case 864: gcode_M864(); break; // M864: Change module address - case 865: gcode_M865(); break; // M865: Check module firmware version - case 866: gcode_M866(); break; // M866: Report axis error count - case 867: gcode_M867(); break; // M867: Toggle error correction - case 868: gcode_M868(); break; // M868: Set error correction threshold - case 869: gcode_M869(); break; // M869: Report axis error - #endif - - #if ENABLED(LIN_ADVANCE) - case 900: gcode_M900(); break; // M900: Set Linear Advance K factor - #endif - - case 907: gcode_M907(); break; // M907: Set Digital Trimpot Motor Current using axis codes. - - #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) - case 908: gcode_M908(); break; // M908: Direct Control Digital Trimpot - #if ENABLED(DAC_STEPPER_CURRENT) - case 909: gcode_M909(); break; // M909: Print Digipot/DAC current value (As with Printrbot RevF) - case 910: gcode_M910(); break; // M910: Commit Digipot/DAC value to External EEPROM (As with Printrbot RevF) - #endif - #endif - - #if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) - #if ENABLED(TMC_DEBUG) - case 122: gcode_M122(); break; // M122: Debug TMC steppers - #endif - case 906: gcode_M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E - case 911: gcode_M911(); break; // M911: Report TMC prewarn triggered flags - case 912: gcode_M912(); break; // M911: Clear TMC prewarn triggered flags - #if ENABLED(HYBRID_THRESHOLD) - case 913: gcode_M913(); break; // M913: Set HYBRID_THRESHOLD speed. - #endif - #if ENABLED(SENSORLESS_HOMING) - case 914: gcode_M914(); break; // M914: Set SENSORLESS_HOMING sensitivity. - #endif - #if ENABLED(TMC_Z_CALIBRATION) - case 915: gcode_M915(); break; // M915: TMC Z axis calibration routine - #endif - #endif - - case 999: gcode_M999(); break; // M999: Restart after being Stopped - - default: parser.unknown_command_error(); - } - break; - - case 'T': gcode_T(parser.codenum); break; // T: Tool Select - - default: parser.unknown_command_error(); - } - - KEEPALIVE_STATE(NOT_BUSY); - ok_to_send(); -} - -void process_next_command() { - char * const current_command = command_queue[cmd_queue_index_r]; - - if (DEBUGGING(ECHO)) { - SERIAL_ECHO_START(); - SERIAL_ECHOLN(current_command); - #if ENABLED(M100_FREE_MEMORY_WATCHER) - SERIAL_ECHOPAIR("slot:", cmd_queue_index_r); - M100_dump_routine(" Command Queue:", (const char*)command_queue, (const char*)(command_queue + sizeof(command_queue))); - #endif - } - - reset_stepper_timeout(); // Keep steppers powered - - // Parse the next command in the queue - parser.parse(current_command); - process_parsed_command(); -} - -/** - * Send a "Resend: nnn" message to the host to - * indicate that a command needs to be re-sent. - */ -void flush_and_request_resend() { - //char command_queue[cmd_queue_index_r][100]="Resend:"; - SERIAL_FLUSH(); - SERIAL_PROTOCOLPGM(MSG_RESEND); - SERIAL_PROTOCOLLN(gcode_LastN + 1); - ok_to_send(); -} - -/** - * Send an "ok" message to the host, indicating - * that a command was successfully processed. - * - * If ADVANCED_OK is enabled also include: - * N Line number of the command, if any - * P Planner space remaining - * B Block queue space remaining - */ -void ok_to_send() { - if (!send_ok[cmd_queue_index_r]) return; - SERIAL_PROTOCOLPGM(MSG_OK); - #if ENABLED(ADVANCED_OK) - char* p = command_queue[cmd_queue_index_r]; - if (*p == 'N') { - SERIAL_PROTOCOL(' '); - SERIAL_ECHO(*p++); - while (NUMERIC_SIGNED(*p)) - SERIAL_ECHO(*p++); - } - SERIAL_PROTOCOLPGM(" P"); SERIAL_PROTOCOL(int(BLOCK_BUFFER_SIZE - planner.movesplanned() - 1)); - SERIAL_PROTOCOLPGM(" B"); SERIAL_PROTOCOL(BUFSIZE - commands_in_queue); - #endif - SERIAL_EOL(); -} - -#if HAS_SOFTWARE_ENDSTOPS - - /** - * Constrain the given coordinates to the software endstops. - * - * For DELTA/SCARA the XY constraint is based on the smallest - * radius within the set software endstops. - */ - void clamp_to_software_endstops(float target[XYZ]) { - if (!soft_endstops_enabled) return; - #if IS_KINEMATIC - const float dist_2 = HYPOT2(target[X_AXIS], target[Y_AXIS]); - if (dist_2 > soft_endstop_radius_2) { - const float ratio = soft_endstop_radius / SQRT(dist_2); // 200 / 300 = 0.66 - target[X_AXIS] *= ratio; - target[Y_AXIS] *= ratio; - } - #else - #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) - NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]); - #endif - #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) - NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]); - #endif - #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) - NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]); - #endif - #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) - NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]); - #endif - #endif - #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) - NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]); - #endif - #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) - NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]); - #endif - } - -#endif - -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - // Get the Z adjustment for non-linear bed leveling - float bilinear_z_offset(const float raw[XYZ]) { - - static float z1, d2, z3, d4, L, D, ratio_x, ratio_y, - last_x = -999.999, last_y = -999.999; - - // Whole units for the grid line indices. Constrained within bounds. - static int8_t gridx, gridy, nextx, nexty, - last_gridx = -99, last_gridy = -99; - - // XY relative to the probed area - const float rx = raw[X_AXIS] - bilinear_start[X_AXIS], - ry = raw[Y_AXIS] - bilinear_start[Y_AXIS]; - - #if ENABLED(EXTRAPOLATE_BEYOND_GRID) - // Keep using the last grid box - #define FAR_EDGE_OR_BOX 2 - #else - // Just use the grid far edge - #define FAR_EDGE_OR_BOX 1 - #endif - - if (last_x != rx) { - last_x = rx; - ratio_x = rx * ABL_BG_FACTOR(X_AXIS); - const float gx = constrain(FLOOR(ratio_x), 0, ABL_BG_POINTS_X - FAR_EDGE_OR_BOX); - ratio_x -= gx; // Subtract whole to get the ratio within the grid box - - #if DISABLED(EXTRAPOLATE_BEYOND_GRID) - // Beyond the grid maintain height at grid edges - NOLESS(ratio_x, 0); // Never < 0.0. (> 1.0 is ok when nextx==gridx.) - #endif - - gridx = gx; - nextx = min(gridx + 1, ABL_BG_POINTS_X - 1); - } - - if (last_y != ry || last_gridx != gridx) { - - if (last_y != ry) { - last_y = ry; - ratio_y = ry * ABL_BG_FACTOR(Y_AXIS); - const float gy = constrain(FLOOR(ratio_y), 0, ABL_BG_POINTS_Y - FAR_EDGE_OR_BOX); - ratio_y -= gy; - - #if DISABLED(EXTRAPOLATE_BEYOND_GRID) - // Beyond the grid maintain height at grid edges - NOLESS(ratio_y, 0); // Never < 0.0. (> 1.0 is ok when nexty==gridy.) - #endif - - gridy = gy; - nexty = min(gridy + 1, ABL_BG_POINTS_Y - 1); - } - - if (last_gridx != gridx || last_gridy != gridy) { - last_gridx = gridx; - last_gridy = gridy; - // Z at the box corners - z1 = ABL_BG_GRID(gridx, gridy); // left-front - d2 = ABL_BG_GRID(gridx, nexty) - z1; // left-back (delta) - z3 = ABL_BG_GRID(nextx, gridy); // right-front - d4 = ABL_BG_GRID(nextx, nexty) - z3; // right-back (delta) - } - - // Bilinear interpolate. Needed since ry or gridx has changed. - L = z1 + d2 * ratio_y; // Linear interp. LF -> LB - const float R = z3 + d4 * ratio_y; // Linear interp. RF -> RB - - D = R - L; - } - - const float offset = L + ratio_x * D; // the offset almost always changes - - /* - static float last_offset = 0; - if (FABS(last_offset - offset) > 0.2) { - SERIAL_ECHOPGM("Sudden Shift at "); - SERIAL_ECHOPAIR("x=", rx); - SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[X_AXIS]); - SERIAL_ECHOLNPAIR(" -> gridx=", gridx); - SERIAL_ECHOPAIR(" y=", ry); - SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[Y_AXIS]); - SERIAL_ECHOLNPAIR(" -> gridy=", gridy); - SERIAL_ECHOPAIR(" ratio_x=", ratio_x); - SERIAL_ECHOLNPAIR(" ratio_y=", ratio_y); - SERIAL_ECHOPAIR(" z1=", z1); - SERIAL_ECHOPAIR(" z2=", z2); - SERIAL_ECHOPAIR(" z3=", z3); - SERIAL_ECHOLNPAIR(" z4=", z4); - SERIAL_ECHOPAIR(" L=", L); - SERIAL_ECHOPAIR(" R=", R); - SERIAL_ECHOLNPAIR(" offset=", offset); - } - last_offset = offset; - //*/ - - return offset; - } - -#endif // AUTO_BED_LEVELING_BILINEAR - -#if ENABLED(DELTA) - - /** - * Recalculate factors used for delta kinematics whenever - * settings have been changed (e.g., by M665). - */ - void recalc_delta_settings() { - const float trt[ABC] = DELTA_RADIUS_TRIM_TOWER, - drt[ABC] = DELTA_DIAGONAL_ROD_TRIM_TOWER; - delta_tower[A_AXIS][X_AXIS] = cos(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); // front left tower - delta_tower[A_AXIS][Y_AXIS] = sin(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); - delta_tower[B_AXIS][X_AXIS] = cos(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); // front right tower - delta_tower[B_AXIS][Y_AXIS] = sin(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); - delta_tower[C_AXIS][X_AXIS] = cos(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); // back middle tower - delta_tower[C_AXIS][Y_AXIS] = sin(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); - delta_diagonal_rod_2_tower[A_AXIS] = sq(delta_diagonal_rod + drt[A_AXIS]); - delta_diagonal_rod_2_tower[B_AXIS] = sq(delta_diagonal_rod + drt[B_AXIS]); - delta_diagonal_rod_2_tower[C_AXIS] = sq(delta_diagonal_rod + drt[C_AXIS]); - update_software_endstops(Z_AXIS); - axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false; - } - - #if ENABLED(DELTA_FAST_SQRT) - /** - * Fast inverse sqrt from Quake III Arena - * See: https://en.wikipedia.org/wiki/Fast_inverse_square_root - */ - float Q_rsqrt(const float number) { - long i; - float x2, y; - const float threehalfs = 1.5f; - x2 = number * 0.5f; - y = number; - i = * ( long * ) &y; // evil floating point bit level hacking - i = 0x5F3759DF - ( i >> 1 ); // what the f***? - y = * ( float * ) &i; - y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration - // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed - return y; - } - - #endif - - /** - * Delta Inverse Kinematics - * - * Calculate the tower positions for a given machine - * position, storing the result in the delta[] array. - * - * This is an expensive calculation, requiring 3 square - * roots per segmented linear move, and strains the limits - * of a Mega2560 with a Graphical Display. - * - * Suggested optimizations include: - * - * - Disable the home_offset (M206) and/or position_shift (G92) - * features to remove up to 12 float additions. - * - * - Use a fast-inverse-sqrt function and add the reciprocal. - * (see above) - */ - - #define DELTA_DEBUG(VAR) do { \ - SERIAL_ECHOPAIR("cartesian X:", VAR[X_AXIS]); \ - SERIAL_ECHOPAIR(" Y:", VAR[Y_AXIS]); \ - SERIAL_ECHOLNPAIR(" Z:", VAR[Z_AXIS]); \ - SERIAL_ECHOPAIR("delta A:", delta[A_AXIS]); \ - SERIAL_ECHOPAIR(" B:", delta[B_AXIS]); \ - SERIAL_ECHOLNPAIR(" C:", delta[C_AXIS]); \ - }while(0) - - void inverse_kinematics(const float raw[XYZ]) { - #if HOTENDS > 1 - // Delta hotend offsets must be applied in Cartesian space with no "spoofing" - const float pos[XYZ] = { - raw[X_AXIS] - hotend_offset[X_AXIS][active_extruder], - raw[Y_AXIS] - hotend_offset[Y_AXIS][active_extruder], - raw[Z_AXIS] - }; - DELTA_IK(pos); - //DELTA_DEBUG(pos); - #else - DELTA_IK(raw); - //DELTA_DEBUG(raw); - #endif - } - - /** - * Calculate the highest Z position where the - * effector has the full range of XY motion. - */ - float delta_safe_distance_from_top() { - float cartesian[XYZ] = { 0, 0, 0 }; - inverse_kinematics(cartesian); - const float centered_extent = delta[A_AXIS]; - cartesian[Y_AXIS] = DELTA_PRINTABLE_RADIUS; - inverse_kinematics(cartesian); - return FABS(centered_extent - delta[A_AXIS]); - } - - /** - * Delta Forward Kinematics - * - * See the Wikipedia article "Trilateration" - * https://en.wikipedia.org/wiki/Trilateration - * - * Establish a new coordinate system in the plane of the - * three carriage points. This system has its origin at - * tower1, with tower2 on the X axis. Tower3 is in the X-Y - * plane with a Z component of zero. - * We will define unit vectors in this coordinate system - * in our original coordinate system. Then when we calculate - * the Xnew, Ynew and Znew values, we can translate back into - * the original system by moving along those unit vectors - * by the corresponding values. - * - * Variable names matched to Marlin, c-version, and avoid the - * use of any vector library. - * - * by Andreas Hardtung 2016-06-07 - * based on a Java function from "Delta Robot Kinematics V3" - * by Steve Graves - * - * The result is stored in the cartes[] array. - */ - void forward_kinematics_DELTA(float z1, float z2, float z3) { - // Create a vector in old coordinates along x axis of new coordinate - const float p12[] = { - delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], - delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], - z2 - z1 - }, - - // Get the Magnitude of vector. - d = SQRT(sq(p12[0]) + sq(p12[1]) + sq(p12[2])), - - // Create unit vector by dividing by magnitude. - ex[3] = { p12[0] / d, p12[1] / d, p12[2] / d }, - - // Get the vector from the origin of the new system to the third point. - p13[3] = { - delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], - delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], - z3 - z1 - }, - - // Use the dot product to find the component of this vector on the X axis. - i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2], - - // Create a vector along the x axis that represents the x component of p13. - iex[] = { ex[0] * i, ex[1] * i, ex[2] * i }; - - // Subtract the X component from the original vector leaving only Y. We use the - // variable that will be the unit vector after we scale it. - float ey[3] = { p13[0] - iex[0], p13[1] - iex[1], p13[2] - iex[2] }; - - // The magnitude of Y component - const float j = SQRT(sq(ey[0]) + sq(ey[1]) + sq(ey[2])); - - // Convert to a unit vector - ey[0] /= j; ey[1] /= j; ey[2] /= j; - - // The cross product of the unit x and y is the unit z - // float[] ez = vectorCrossProd(ex, ey); - const float ez[3] = { - ex[1] * ey[2] - ex[2] * ey[1], - ex[2] * ey[0] - ex[0] * ey[2], - ex[0] * ey[1] - ex[1] * ey[0] - }, - // We now have the d, i and j values defined in Wikipedia. - // Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew - Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + sq(d)) / (d * 2), - Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + HYPOT2(i, j)) / 2 - i * Xnew) / j, - Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew)); - - // Start from the origin of the old coordinates and add vectors in the - // old coords that represent the Xnew, Ynew and Znew to find the point - // in the old system. - cartes[X_AXIS] = delta_tower[A_AXIS][X_AXIS] + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew; - cartes[Y_AXIS] = delta_tower[A_AXIS][Y_AXIS] + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew; - cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew; - } - - void forward_kinematics_DELTA(float point[ABC]) { - forward_kinematics_DELTA(point[A_AXIS], point[B_AXIS], point[C_AXIS]); - } - -#endif // DELTA - -/** - * Get the stepper positions in the cartes[] array. - * Forward kinematics are applied for DELTA and SCARA. - * - * The result is in the current coordinate space with - * leveling applied. The coordinates need to be run through - * unapply_leveling to obtain machine coordinates suitable - * for current_position, etc. - */ -void get_cartesian_from_steppers() { - #if ENABLED(DELTA) - forward_kinematics_DELTA( - stepper.get_axis_position_mm(A_AXIS), - stepper.get_axis_position_mm(B_AXIS), - stepper.get_axis_position_mm(C_AXIS) - ); - #else - #if IS_SCARA - forward_kinematics_SCARA( - stepper.get_axis_position_degrees(A_AXIS), - stepper.get_axis_position_degrees(B_AXIS) - ); - #else - cartes[X_AXIS] = stepper.get_axis_position_mm(X_AXIS); - cartes[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS); - #endif - cartes[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS); - #endif -} - -/** - * Set the current_position for an axis based on - * the stepper positions, removing any leveling that - * may have been applied. - * - * To prevent small shifts in axis position always call - * SYNC_PLAN_POSITION_KINEMATIC after updating axes with this. - * - * To keep hosts in sync, always call report_current_position - * after updating the current_position. - */ -void set_current_from_steppers_for_axis(const AxisEnum axis) { - get_cartesian_from_steppers(); - #if PLANNER_LEVELING - planner.unapply_leveling(cartes); - #endif - if (axis == ALL_AXES) - COPY(current_position, cartes); - else - current_position[axis] = cartes[axis]; -} - -#if IS_CARTESIAN -#if ENABLED(SEGMENT_LEVELED_MOVES) - - /** - * Prepare a segmented move on a CARTESIAN setup. - * - * This calls planner.buffer_line several times, adding - * small incremental moves. This allows the planner to - * apply more detailed bed leveling to the full move. - */ - inline void segmented_line_to_destination(const float &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { - - const float xdiff = destination[X_AXIS] - current_position[X_AXIS], - ydiff = destination[Y_AXIS] - current_position[Y_AXIS]; - - // If the move is only in Z/E don't split up the move - if (!xdiff && !ydiff) { - planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder); - return; - } - - // Remaining cartesian distances - const float zdiff = destination[Z_AXIS] - current_position[Z_AXIS], - ediff = destination[E_AXIS] - current_position[E_AXIS]; - - // Get the linear distance in XYZ - // If the move is very short, check the E move distance - // No E move either? Game over. - float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = FABS(ediff); - if (UNEAR_ZERO(cartesian_mm)) return; - - // The length divided by the segment size - // At least one segment is required - uint16_t segments = cartesian_mm / segment_size; - NOLESS(segments, 1); - - // The approximate length of each segment - const float inv_segments = 1.0 / float(segments), - cartesian_segment_mm = cartesian_mm * inv_segments, - segment_distance[XYZE] = { - xdiff * inv_segments, - ydiff * inv_segments, - zdiff * inv_segments, - ediff * inv_segments - }; - - // SERIAL_ECHOPAIR("mm=", cartesian_mm); - // SERIAL_ECHOLNPAIR(" segments=", segments); - // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); - - // Get the raw current position as starting point - float raw[XYZE]; - COPY(raw, current_position); - - // Calculate and execute the segments - while (--segments) { - static millis_t next_idle_ms = millis() + 200UL; - thermalManager.manage_heater(); // This returns immediately if not really needed. - if (ELAPSED(millis(), next_idle_ms)) { - next_idle_ms = millis() + 200UL; - idle(); - } - LOOP_XYZE(i) raw[i] += segment_distance[i]; - planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder, cartesian_segment_mm); - } - - // Since segment_distance is only approximate, - // the final move must be to the exact destination. - planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder, cartesian_segment_mm); - } - -#elif ENABLED(MESH_BED_LEVELING) - - /** - * Prepare a mesh-leveled linear move in a Cartesian setup, - * splitting the move where it crosses mesh borders. - */ - void mesh_line_to_destination(const float fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF) { - // Get current and destination cells for this line - int cx1 = mbl.cell_index_x(current_position[X_AXIS]), - cy1 = mbl.cell_index_y(current_position[Y_AXIS]), - cx2 = mbl.cell_index_x(destination[X_AXIS]), - cy2 = mbl.cell_index_y(destination[Y_AXIS]); - NOMORE(cx1, GRID_MAX_POINTS_X - 2); - NOMORE(cy1, GRID_MAX_POINTS_Y - 2); - NOMORE(cx2, GRID_MAX_POINTS_X - 2); - NOMORE(cy2, GRID_MAX_POINTS_Y - 2); - - // Start and end in the same cell? No split needed. - if (cx1 == cx2 && cy1 == cy2) { - buffer_line_to_destination(fr_mm_s); - set_current_from_destination(); - return; - } - - #define MBL_SEGMENT_END(A) (current_position[A ##_AXIS] + (destination[A ##_AXIS] - current_position[A ##_AXIS]) * normalized_dist) - - float normalized_dist, end[XYZE]; - const int8_t gcx = max(cx1, cx2), gcy = max(cy1, cy2); - - // Crosses on the X and not already split on this X? - // The x_splits flags are insurance against rounding errors. - if (cx2 != cx1 && TEST(x_splits, gcx)) { - // Split on the X grid line - CBI(x_splits, gcx); - COPY(end, destination); - destination[X_AXIS] = mbl.index_to_xpos[gcx]; - normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); - destination[Y_AXIS] = MBL_SEGMENT_END(Y); - } - // Crosses on the Y and not already split on this Y? - else if (cy2 != cy1 && TEST(y_splits, gcy)) { - // Split on the Y grid line - CBI(y_splits, gcy); - COPY(end, destination); - destination[Y_AXIS] = mbl.index_to_ypos[gcy]; - normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); - destination[X_AXIS] = MBL_SEGMENT_END(X); - } - else { - // Must already have been split on these border(s) - buffer_line_to_destination(fr_mm_s); - set_current_from_destination(); - return; - } - - destination[Z_AXIS] = MBL_SEGMENT_END(Z); - destination[E_AXIS] = MBL_SEGMENT_END(E); - - // Do the split and look for more borders - mesh_line_to_destination(fr_mm_s, x_splits, y_splits); - - // Restore destination from stack - COPY(destination, end); - mesh_line_to_destination(fr_mm_s, x_splits, y_splits); - } - -#elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - #define CELL_INDEX(A,V) ((V - bilinear_start[A##_AXIS]) * ABL_BG_FACTOR(A##_AXIS)) - - /** - * Prepare a bilinear-leveled linear move on Cartesian, - * splitting the move where it crosses grid borders. - */ - void bilinear_line_to_destination(const float fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF) { - // Get current and destination cells for this line - int cx1 = CELL_INDEX(X, current_position[X_AXIS]), - cy1 = CELL_INDEX(Y, current_position[Y_AXIS]), - cx2 = CELL_INDEX(X, destination[X_AXIS]), - cy2 = CELL_INDEX(Y, destination[Y_AXIS]); - cx1 = constrain(cx1, 0, ABL_BG_POINTS_X - 2); - cy1 = constrain(cy1, 0, ABL_BG_POINTS_Y - 2); - cx2 = constrain(cx2, 0, ABL_BG_POINTS_X - 2); - cy2 = constrain(cy2, 0, ABL_BG_POINTS_Y - 2); - - // Start and end in the same cell? No split needed. - if (cx1 == cx2 && cy1 == cy2) { - buffer_line_to_destination(fr_mm_s); - set_current_from_destination(); - return; - } - - #define LINE_SEGMENT_END(A) (current_position[A ##_AXIS] + (destination[A ##_AXIS] - current_position[A ##_AXIS]) * normalized_dist) - - float normalized_dist, end[XYZE]; - const int8_t gcx = max(cx1, cx2), gcy = max(cy1, cy2); - - // Crosses on the X and not already split on this X? - // The x_splits flags are insurance against rounding errors. - if (cx2 != cx1 && TEST(x_splits, gcx)) { - // Split on the X grid line - CBI(x_splits, gcx); - COPY(end, destination); - destination[X_AXIS] = bilinear_start[X_AXIS] + ABL_BG_SPACING(X_AXIS) * gcx; - normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); - destination[Y_AXIS] = LINE_SEGMENT_END(Y); - } - // Crosses on the Y and not already split on this Y? - else if (cy2 != cy1 && TEST(y_splits, gcy)) { - // Split on the Y grid line - CBI(y_splits, gcy); - COPY(end, destination); - destination[Y_AXIS] = bilinear_start[Y_AXIS] + ABL_BG_SPACING(Y_AXIS) * gcy; - normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); - destination[X_AXIS] = LINE_SEGMENT_END(X); - } - else { - // Must already have been split on these border(s) - buffer_line_to_destination(fr_mm_s); - set_current_from_destination(); - return; - } - - destination[Z_AXIS] = LINE_SEGMENT_END(Z); - destination[E_AXIS] = LINE_SEGMENT_END(E); - - // Do the split and look for more borders - bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); - - // Restore destination from stack - COPY(destination, end); - bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); - } - -#endif // AUTO_BED_LEVELING_BILINEAR -#endif // IS_CARTESIAN - -#if !UBL_SEGMENTED -#if IS_KINEMATIC - - #if IS_SCARA - /** - * Before raising this value, use M665 S[seg_per_sec] to decrease - * the number of segments-per-second. Default is 200. Some deltas - * do better with 160 or lower. It would be good to know how many - * segments-per-second are actually possible for SCARA on AVR. - * - * Longer segments result in less kinematic overhead - * but may produce jagged lines. Try 0.5mm, 1.0mm, and 2.0mm - * and compare the difference. - */ - #define SCARA_MIN_SEGMENT_LENGTH 0.5 - #endif - - /** - * Prepare a linear move in a DELTA or SCARA setup. - * - * This calls planner.buffer_line several times, adding - * small incremental moves for DELTA or SCARA. - * - * For Unified Bed Leveling (Delta or Segmented Cartesian) - * the ubl.prepare_segmented_line_to method replaces this. - */ - inline bool prepare_kinematic_move_to(const float (&rtarget)[XYZE]) { - - // Get the top feedrate of the move in the XY plane - const float _feedrate_mm_s = MMS_SCALED(feedrate_mm_s); - - const float xdiff = rtarget[X_AXIS] - current_position[X_AXIS], - ydiff = rtarget[Y_AXIS] - current_position[Y_AXIS]; - - // If the move is only in Z/E don't split up the move - if (!xdiff && !ydiff) { - planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder); - return false; // caller will update current_position - } - - // Fail if attempting move outside printable radius - if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) return true; - - // Remaining cartesian distances - const float zdiff = rtarget[Z_AXIS] - current_position[Z_AXIS], - ediff = rtarget[E_AXIS] - current_position[E_AXIS]; - - // Get the linear distance in XYZ - // If the move is very short, check the E move distance - // No E move either? Game over. - float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = FABS(ediff); - if (UNEAR_ZERO(cartesian_mm)) return true; - - // Minimum number of seconds to move the given distance - const float seconds = cartesian_mm / _feedrate_mm_s; - - // The number of segments-per-second times the duration - // gives the number of segments - uint16_t segments = delta_segments_per_second * seconds; - - // For SCARA enforce a minimum segment size - #if IS_SCARA - NOMORE(segments, cartesian_mm * (1.0 / SCARA_MIN_SEGMENT_LENGTH)); - #endif - - // At least one segment is required - NOLESS(segments, 1); - - // The approximate length of each segment - const float inv_segments = 1.0 / float(segments), - segment_distance[XYZE] = { - xdiff * inv_segments, - ydiff * inv_segments, - zdiff * inv_segments, - ediff * inv_segments - }; - - #if DISABLED(SCARA_FEEDRATE_SCALING) - const float cartesian_segment_mm = cartesian_mm * inv_segments; - #endif - - /* - SERIAL_ECHOPAIR("mm=", cartesian_mm); - SERIAL_ECHOPAIR(" seconds=", seconds); - SERIAL_ECHOPAIR(" segments=", segments); - #if DISABLED(SCARA_FEEDRATE_SCALING) - SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); - #else - SERIAL_EOL(); - #endif - //*/ - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // SCARA needs to scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - const float segment_length = cartesian_mm * inv_segments, - inv_segment_length = 1.0 / segment_length, // 1/mm/segs - inverse_secs = inv_segment_length * _feedrate_mm_s; - - float oldA = planner.position_float[A_AXIS], - oldB = planner.position_float[B_AXIS]; - - /* - SERIAL_ECHOPGM("Scaled kinematic move: "); - SERIAL_ECHOPAIR(" segment_length (inv)=", segment_length); - SERIAL_ECHOPAIR(" (", inv_segment_length); - SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s); - SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs); - SERIAL_ECHOPAIR(" oldA=", oldA); - SERIAL_ECHOLNPAIR(" oldB=", oldB); - safe_delay(5); - //*/ - #endif - - // Get the current position as starting point - float raw[XYZE]; - COPY(raw, current_position); - - // Calculate and execute the segments - while (--segments) { - - static millis_t next_idle_ms = millis() + 200UL; - thermalManager.manage_heater(); // This returns immediately if not really needed. - if (ELAPSED(millis(), next_idle_ms)) { - next_idle_ms = millis() + 200UL; - idle(); - } - - LOOP_XYZE(i) raw[i] += segment_distance[i]; - #if ENABLED(DELTA) && HOTENDS < 2 - DELTA_IK(raw); // Delta can inline its kinematics - #else - inverse_kinematics(raw); - #endif - - ADJUST_DELTA(raw); // Adjust Z if bed leveling is enabled - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // For SCARA scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder); - /* - SERIAL_ECHO(segments); - SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); - SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); - SERIAL_ECHOLNPAIR(" F", HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs * 60); - safe_delay(5); - //*/ - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; - #else - planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm); - #endif - } - - // Ensure last segment arrives at target location. - #if ENABLED(SCARA_FEEDRATE_SCALING) - inverse_kinematics(rtarget); - ADJUST_DELTA(rtarget); - const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); - if (diff2) { - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder); - /* - SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); - SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); - SERIAL_ECHOLNPAIR(" F", (SQRT(diff2) * inverse_secs) * 60); - SERIAL_EOL(); - safe_delay(5); - //*/ - } - #else - planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder, cartesian_segment_mm); - #endif - - return false; // caller will update current_position - } - -#else // !IS_KINEMATIC - - /** - * Prepare a linear move in a Cartesian setup. - * - * When a mesh-based leveling system is active, moves are segmented - * according to the configuration of the leveling system. - * - * Returns true if current_position[] was set to destination[] - */ - inline bool prepare_move_to_destination_cartesian() { - #if HAS_MESH - if (planner.leveling_active && planner.leveling_active_at_z(destination[Z_AXIS])) { - #if ENABLED(AUTO_BED_LEVELING_UBL) - ubl.line_to_destination_cartesian(MMS_SCALED(feedrate_mm_s), active_extruder); // UBL's motion routine needs to know about - return true; // all moves, including Z-only moves. - #elif ENABLED(SEGMENT_LEVELED_MOVES) - segmented_line_to_destination(MMS_SCALED(feedrate_mm_s)); - return false; // caller will update current_position - #else - /** - * For MBL and ABL-BILINEAR only segment moves when X or Y are involved. - * Otherwise fall through to do a direct single move. - */ - if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) { - #if ENABLED(MESH_BED_LEVELING) - mesh_line_to_destination(MMS_SCALED(feedrate_mm_s)); - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s)); - #endif - return true; - } - #endif - } - #endif // HAS_MESH - - buffer_line_to_destination(MMS_SCALED(feedrate_mm_s)); - return false; // caller will update current_position - } - -#endif // !IS_KINEMATIC -#endif // !UBL_SEGMENTED - -#if ENABLED(DUAL_X_CARRIAGE) - - /** - * Unpark the carriage, if needed - */ - inline bool dual_x_carriage_unpark() { - if (active_extruder_parked) - switch (dual_x_carriage_mode) { - - case DXC_FULL_CONTROL_MODE: break; - - case DXC_AUTO_PARK_MODE: - if (current_position[E_AXIS] == destination[E_AXIS]) { - // This is a travel move (with no extrusion) - // Skip it, but keep track of the current position - // (so it can be used as the start of the next non-travel move) - if (delayed_move_time != 0xFFFFFFFFUL) { - set_current_from_destination(); - NOLESS(raised_parked_position[Z_AXIS], destination[Z_AXIS]); - delayed_move_time = millis(); - return true; - } - } - // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower - for (uint8_t i = 0; i < 3; i++) - planner.buffer_line( - i == 0 ? raised_parked_position[X_AXIS] : current_position[X_AXIS], - i == 0 ? raised_parked_position[Y_AXIS] : current_position[Y_AXIS], - i == 2 ? current_position[Z_AXIS] : raised_parked_position[Z_AXIS], - current_position[E_AXIS], - i == 1 ? PLANNER_XY_FEEDRATE() : planner.max_feedrate_mm_s[Z_AXIS], - active_extruder - ); - delayed_move_time = 0; - active_extruder_parked = false; - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Clear active_extruder_parked"); - #endif - break; - - case DXC_DUPLICATION_MODE: - if (active_extruder == 0) { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOPAIR("Set planner X", inactive_extruder_x_pos); - SERIAL_ECHOLNPAIR(" ... Line to X", current_position[X_AXIS] + duplicate_extruder_x_offset); - } - #endif - // move duplicate extruder into correct duplication position. - planner.set_position_mm( - inactive_extruder_x_pos, - current_position[Y_AXIS], - current_position[Z_AXIS], - current_position[E_AXIS] - ); - planner.buffer_line( - current_position[X_AXIS] + duplicate_extruder_x_offset, - current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], - planner.max_feedrate_mm_s[X_AXIS], 1 - ); - stepper.synchronize(); - SYNC_PLAN_POSITION_KINEMATIC(); - extruder_duplication_enabled = true; - active_extruder_parked = false; - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); - #endif - } - else { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Active extruder not 0"); - #endif - } - break; - } - return false; - } - -#endif // DUAL_X_CARRIAGE - -/** - * Prepare a single move and get ready for the next one - * - * This may result in several calls to planner.buffer_line to - * do smaller moves for DELTA, SCARA, mesh moves, etc. - * - * Make sure current_position[E] and destination[E] are good - * before calling or cold/lengthy extrusion may get missed. - */ -void prepare_move_to_destination() { - clamp_to_software_endstops(destination); - - #if ENABLED(PREVENT_COLD_EXTRUSION) || ENABLED(PREVENT_LENGTHY_EXTRUDE) - - if (!DEBUGGING(DRYRUN)) { - if (destination[E_AXIS] != current_position[E_AXIS]) { - #if ENABLED(PREVENT_COLD_EXTRUSION) - if (thermalManager.tooColdToExtrude(active_extruder)) { - current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); - } - #endif // PREVENT_COLD_EXTRUSION - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - if (FABS(destination[E_AXIS] - current_position[E_AXIS]) * planner.e_factor[active_extruder] > (EXTRUDE_MAXLENGTH)) { - current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_ERR_LONG_EXTRUDE_STOP); - } - #endif // PREVENT_LENGTHY_EXTRUDE - } - } - - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_unpark()) return; - #endif - - if ( - #if UBL_SEGMENTED - ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) - #elif IS_KINEMATIC - prepare_kinematic_move_to(destination) - #else - prepare_move_to_destination_cartesian() - #endif - ) return; - - set_current_from_destination(); -} - -#if ENABLED(ARC_SUPPORT) - - #if N_ARC_CORRECTION < 1 - #undef N_ARC_CORRECTION - #define N_ARC_CORRECTION 1 - #endif - - /** - * Plan an arc in 2 dimensions - * - * The arc is approximated by generating many small linear segments. - * The length of each segment is configured in MM_PER_ARC_SEGMENT (Default 1mm) - * Arcs should only be made relatively large (over 5mm), as larger arcs with - * larger segments will tend to be more efficient. Your slicer should have - * options for G2/G3 arc generation. In future these options may be GCode tunable. - */ - void plan_arc( - const float (&cart)[XYZE], // Destination position - const float (&offset)[2], // Center of rotation relative to current_position - const bool clockwise // Clockwise? - ) { - #if ENABLED(CNC_WORKSPACE_PLANES) - AxisEnum p_axis, q_axis, l_axis; - switch (workspace_plane) { - default: - case PLANE_XY: p_axis = X_AXIS; q_axis = Y_AXIS; l_axis = Z_AXIS; break; - case PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; - case PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; - } - #else - constexpr AxisEnum p_axis = X_AXIS, q_axis = Y_AXIS, l_axis = Z_AXIS; - #endif - - // Radius vector from center to current location - float r_P = -offset[0], r_Q = -offset[1]; - - const float radius = HYPOT(r_P, r_Q), - center_P = current_position[p_axis] - r_P, - center_Q = current_position[q_axis] - r_Q, - rt_X = cart[p_axis] - center_P, - rt_Y = cart[q_axis] - center_Q, - linear_travel = cart[l_axis] - current_position[l_axis], - extruder_travel = cart[E_AXIS] - current_position[E_AXIS]; - - // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. - float angular_travel = ATAN2(r_P * rt_Y - r_Q * rt_X, r_P * rt_X + r_Q * rt_Y); - if (angular_travel < 0) angular_travel += RADIANS(360); - if (clockwise) angular_travel -= RADIANS(360); - - // Make a circle if the angular rotation is 0 and the target is current position - if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) - angular_travel = RADIANS(360); - - const float flat_mm = radius * angular_travel, - mm_of_travel = linear_travel ? HYPOT(flat_mm, linear_travel) : FABS(flat_mm); - if (mm_of_travel < 0.001) return; - - uint16_t segments = FLOOR(mm_of_travel / (MM_PER_ARC_SEGMENT)); - NOLESS(segments, 1); - - /** - * Vector rotation by transformation matrix: r is the original vector, r_T is the rotated vector, - * and phi is the angle of rotation. Based on the solution approach by Jens Geisler. - * r_T = [cos(phi) -sin(phi); - * sin(phi) cos(phi)] * r ; - * - * For arc generation, the center of the circle is the axis of rotation and the radius vector is - * defined from the circle center to the initial position. Each line segment is formed by successive - * vector rotations. This requires only two cos() and sin() computations to form the rotation - * matrix for the duration of the entire arc. Error may accumulate from numerical round-off, since - * all double numbers are single precision on the Arduino. (True double precision will not have - * round off issues for CNC applications.) Single precision error can accumulate to be greater than - * tool precision in some cases. Therefore, arc path correction is implemented. - * - * Small angle approximation may be used to reduce computation overhead further. This approximation - * holds for everything, but very small circles and large MM_PER_ARC_SEGMENT values. In other words, - * theta_per_segment would need to be greater than 0.1 rad and N_ARC_CORRECTION would need to be large - * to cause an appreciable drift error. N_ARC_CORRECTION~=25 is more than small enough to correct for - * numerical drift error. N_ARC_CORRECTION may be on the order a hundred(s) before error becomes an - * issue for CNC machines with the single precision Arduino calculations. - * - * This approximation also allows plan_arc to immediately insert a line segment into the planner - * without the initial overhead of computing cos() or sin(). By the time the arc needs to be applied - * a correction, the planner should have caught up to the lag caused by the initial plan_arc overhead. - * This is important when there are successive arc motions. - */ - // Vector rotation matrix values - float raw[XYZE]; - const float theta_per_segment = angular_travel / segments, - linear_per_segment = linear_travel / segments, - extruder_per_segment = extruder_travel / segments, - sin_T = theta_per_segment, - cos_T = 1 - 0.5 * sq(theta_per_segment); // Small angle approximation - - // Initialize the linear axis - raw[l_axis] = current_position[l_axis]; - - // Initialize the extruder axis - raw[E_AXIS] = current_position[E_AXIS]; - - const float fr_mm_s = MMS_SCALED(feedrate_mm_s); - - millis_t next_idle_ms = millis() + 200UL; - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // SCARA needs to scale the feed rate from mm/s to degrees/s - const float inv_segment_length = 1.0 / (MM_PER_ARC_SEGMENT), - inverse_secs = inv_segment_length * fr_mm_s; - float oldA = planner.position_float[A_AXIS], - oldB = planner.position_float[B_AXIS]; - #endif - - #if N_ARC_CORRECTION > 1 - int8_t arc_recalc_count = N_ARC_CORRECTION; - #endif - - for (uint16_t i = 1; i < segments; i++) { // Iterate (segments-1) times - - thermalManager.manage_heater(); - if (ELAPSED(millis(), next_idle_ms)) { - next_idle_ms = millis() + 200UL; - idle(); - } - - #if N_ARC_CORRECTION > 1 - if (--arc_recalc_count) { - // Apply vector rotation matrix to previous r_P / 1 - const float r_new_Y = r_P * sin_T + r_Q * cos_T; - r_P = r_P * cos_T - r_Q * sin_T; - r_Q = r_new_Y; - } - else - #endif - { - #if N_ARC_CORRECTION > 1 - arc_recalc_count = N_ARC_CORRECTION; - #endif - - // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments. - // Compute exact location by applying transformation matrix from initial radius vector(=-offset). - // To reduce stuttering, the sin and cos could be computed at different times. - // For now, compute both at the same time. - const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); - r_P = -offset[0] * cos_Ti + offset[1] * sin_Ti; - r_Q = -offset[0] * sin_Ti - offset[1] * cos_Ti; - } - - // Update raw location - raw[p_axis] = center_P + r_P; - raw[q_axis] = center_Q + r_Q; - raw[l_axis] += linear_per_segment; - raw[E_AXIS] += extruder_per_segment; - - clamp_to_software_endstops(raw); - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // For SCARA scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - inverse_kinematics(raw); - ADJUST_DELTA(raw); - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder); - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; - #elif HAS_UBL_AND_CURVES - float pos[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; - planner.apply_leveling(pos); - planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], raw[E_AXIS], fr_mm_s, active_extruder); - #else - planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder); - #endif - } - - // Ensure last segment arrives at target location. - #if ENABLED(SCARA_FEEDRATE_SCALING) - inverse_kinematics(cart); - ADJUST_DELTA(cart); - const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); - if (diff2) - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], cart[Z_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder); - #elif HAS_UBL_AND_CURVES - float pos[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; - planner.apply_leveling(pos); - planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], cart[E_AXIS], fr_mm_s, active_extruder); - #else - planner.buffer_line_kinematic(cart, fr_mm_s, active_extruder); - #endif - - // As far as the parser is concerned, the position is now == target. In reality the - // motion control system might still be processing the action and the real tool position - // in any intermediate location. - set_current_from_destination(); - } // plan_arc - -#endif // ARC_SUPPORT - -#if ENABLED(BEZIER_CURVE_SUPPORT) - - void plan_cubic_move(const float (&offset)[4]) { - cubic_b_spline(current_position, destination, offset, MMS_SCALED(feedrate_mm_s), active_extruder); - - // As far as the parser is concerned, the position is now == destination. In reality the - // motion control system might still be processing the action and the real tool position - // in any intermediate location. - set_current_from_destination(); - } - -#endif // BEZIER_CURVE_SUPPORT - -#if ENABLED(USE_CONTROLLER_FAN) - - void controllerFan() { - static millis_t lastMotorOn = 0, // Last time a motor was turned on - nextMotorCheck = 0; // Last time the state was checked - const millis_t ms = millis(); - if (ELAPSED(ms, nextMotorCheck)) { - nextMotorCheck = ms + 2500UL; // Not a time critical function, so only check every 2.5s - if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON - #if HAS_HEATED_BED - || thermalManager.soft_pwm_amount_bed > 0 - #endif - || E0_ENABLE_READ == E_ENABLE_ON // If any of the drivers are enabled... - #if E_STEPPERS > 1 - || E1_ENABLE_READ == E_ENABLE_ON - #if HAS_X2_ENABLE - || X2_ENABLE_READ == X_ENABLE_ON - #endif - #if E_STEPPERS > 2 - || E2_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 3 - || E3_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 4 - || E4_ENABLE_READ == E_ENABLE_ON - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - ) { - lastMotorOn = ms; //... set time to NOW so the fan will turn on - } - - // Fan off if no steppers have been enabled for CONTROLLERFAN_SECS seconds - const uint8_t speed = (lastMotorOn && PENDING(ms, lastMotorOn + (CONTROLLERFAN_SECS) * 1000UL)) ? CONTROLLERFAN_SPEED : 0; - controllerFanSpeed = speed; - - // allows digital or PWM fan output to be used (see M42 handling) - WRITE(CONTROLLER_FAN_PIN, speed); - analogWrite(CONTROLLER_FAN_PIN, speed); - } - } - -#endif // USE_CONTROLLER_FAN - -#if ENABLED(MORGAN_SCARA) - - /** - * Morgan SCARA Forward Kinematics. Results in cartes[]. - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ - void forward_kinematics_SCARA(const float &a, const float &b) { - - float a_sin = sin(RADIANS(a)) * L1, - a_cos = cos(RADIANS(a)) * L1, - b_sin = sin(RADIANS(b)) * L2, - b_cos = cos(RADIANS(b)) * L2; - - cartes[X_AXIS] = a_cos + b_cos + SCARA_OFFSET_X; //theta - cartes[Y_AXIS] = a_sin + b_sin + SCARA_OFFSET_Y; //theta+phi - - /* - SERIAL_ECHOPAIR("SCARA FK Angle a=", a); - SERIAL_ECHOPAIR(" b=", b); - SERIAL_ECHOPAIR(" a_sin=", a_sin); - SERIAL_ECHOPAIR(" a_cos=", a_cos); - SERIAL_ECHOPAIR(" b_sin=", b_sin); - SERIAL_ECHOLNPAIR(" b_cos=", b_cos); - SERIAL_ECHOPAIR(" cartes[X_AXIS]=", cartes[X_AXIS]); - SERIAL_ECHOLNPAIR(" cartes[Y_AXIS]=", cartes[Y_AXIS]); - //*/ - } - - /** - * Morgan SCARA Inverse Kinematics. Results in delta[]. - * - * See http://forums.reprap.org/read.php?185,283327 - * - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ - void inverse_kinematics(const float raw[XYZ]) { - - static float C2, S2, SK1, SK2, THETA, PSI; - - float sx = raw[X_AXIS] - SCARA_OFFSET_X, // Translate SCARA to standard X Y - sy = raw[Y_AXIS] - SCARA_OFFSET_Y; // With scaling factor. - - if (L1 == L2) - C2 = HYPOT2(sx, sy) / L1_2_2 - 1; - else - C2 = (HYPOT2(sx, sy) - (L1_2 + L2_2)) / (2.0 * L1 * L2); - - S2 = SQRT(1 - sq(C2)); - - // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End - SK1 = L1 + L2 * C2; - - // Rotated Arm2 gives the distance from Arm1 to Arm2 - SK2 = L2 * S2; - - // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(sx, sy); - - // Angle of Arm2 - PSI = ATAN2(S2, C2); - - delta[A_AXIS] = DEGREES(THETA); // theta is support arm angle - delta[B_AXIS] = DEGREES(THETA + PSI); // equal to sub arm angle (inverted motor) - delta[C_AXIS] = raw[Z_AXIS]; - - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - SERIAL_ECHOPAIR(" SCARA (x,y) ", sx); - SERIAL_ECHOPAIR(",", sy); - SERIAL_ECHOPAIR(" C2=", C2); - SERIAL_ECHOPAIR(" S2=", S2); - SERIAL_ECHOPAIR(" Theta=", THETA); - SERIAL_ECHOLNPAIR(" Phi=", PHI); - //*/ - } - -#endif // MORGAN_SCARA - -#if ENABLED(TEMP_STAT_LEDS) - - static bool red_led = false; - static millis_t next_status_led_update_ms = 0; - - void handle_status_leds(void) { - if (ELAPSED(millis(), next_status_led_update_ms)) { - next_status_led_update_ms += 500; // Update every 0.5s - float max_temp = 0.0; - #if HAS_HEATED_BED - max_temp = MAX3(max_temp, thermalManager.degTargetBed(), thermalManager.degBed()); - #endif - HOTEND_LOOP() - max_temp = MAX3(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); - const bool new_led = (max_temp > 55.0) ? true : (max_temp < 54.0) ? false : red_led; - if (new_led != red_led) { - red_led = new_led; - #if PIN_EXISTS(STAT_LED_RED) - WRITE(STAT_LED_RED_PIN, new_led ? HIGH : LOW); - #if PIN_EXISTS(STAT_LED_BLUE) - WRITE(STAT_LED_BLUE_PIN, new_led ? LOW : HIGH); - #endif - #else - WRITE(STAT_LED_BLUE_PIN, new_led ? HIGH : LOW); - #endif - } - } - } - -#endif - -void enable_all_steppers() { - #if ENABLED(AUTO_POWER_CONTROL) - powerManager.power_on(); - #endif - enable_X(); - enable_Y(); - enable_Z(); - enable_E0(); - enable_E1(); - enable_E2(); - enable_E3(); - enable_E4(); -} - -void disable_e_stepper(const uint8_t e) { - switch (e) { - case 0: disable_E0(); break; - case 1: disable_E1(); break; - case 2: disable_E2(); break; - case 3: disable_E3(); break; - case 4: disable_E4(); break; - } -} - -void disable_e_steppers() { - disable_E0(); - disable_E1(); - disable_E2(); - disable_E3(); - disable_E4(); -} - -void disable_all_steppers() { - disable_X(); - disable_Y(); - disable_Z(); - disable_e_steppers(); -} - -/** - * Manage several activities: - * - Check for Filament Runout - * - Keep the command buffer full - * - Check for maximum inactive time between commands - * - Check for maximum inactive time between stepper commands - * - Check if pin CHDK needs to go LOW - * - Check for KILL button held down - * - Check for HOME button held down - * - Check if cooling fan needs to be switched on - * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) - */ -void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { - - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - runout.run(); - #endif - - if (commands_in_queue < BUFSIZE) get_available_commands(); - - const millis_t ms = millis(); - - if (max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time)) { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR(MSG_KILL_INACTIVE_TIME, parser.command_ptr); - kill(PSTR(MSG_KILLED)); - } - - // Prevent steppers timing-out in the middle of M600 - #if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) - #define MOVE_AWAY_TEST !did_pause_print - #else - #define MOVE_AWAY_TEST true - #endif - - if (stepper_inactive_time) { - if (planner.has_blocks_queued()) - previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered - else if (MOVE_AWAY_TEST && !ignore_stepper_queue && ELAPSED(ms, previous_move_ms + stepper_inactive_time)) { - #if ENABLED(DISABLE_INACTIVE_X) - disable_X(); - #endif - #if ENABLED(DISABLE_INACTIVE_Y) - disable_Y(); - #endif - #if ENABLED(DISABLE_INACTIVE_Z) - disable_Z(); - #endif - #if ENABLED(DISABLE_INACTIVE_E) - disable_e_steppers(); - #endif - #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD - if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; - #endif - } - } - - #ifdef CHDK // Check if pin should be set to LOW after M240 set it to HIGH - if (chdkActive && ELAPSED(ms, chdkHigh + CHDK_DELAY)) { - chdkActive = false; - WRITE(CHDK, LOW); - } - #endif - - #if HAS_KILL - - // Check if the kill button was pressed and wait just in case it was an accidental - // key kill key press - // ------------------------------------------------------------------------------- - static int killCount = 0; // make the inactivity button a bit less responsive - const int KILL_DELAY = 750; - if (!READ(KILL_PIN)) - killCount++; - else if (killCount > 0) - killCount--; - - // Exceeded threshold and we can confirm that it was not accidental - // KILL the machine - // ---------------------------------------------------------------- - if (killCount >= KILL_DELAY) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_KILL_BUTTON); - kill(PSTR(MSG_KILLED)); - } - #endif - - #if HAS_HOME - // Check to see if we have to home, use poor man's debouncer - // --------------------------------------------------------- - static int homeDebounceCount = 0; // poor man's debouncing count - const int HOME_DEBOUNCE_DELAY = 2500; - if (!IS_SD_PRINTING && !READ(HOME_PIN)) { - if (!homeDebounceCount) { - enqueue_and_echo_commands_P(PSTR("G28")); - LCD_MESSAGEPGM(MSG_AUTO_HOME); - } - if (homeDebounceCount < HOME_DEBOUNCE_DELAY) - homeDebounceCount++; - else - homeDebounceCount = 0; - } - #endif - - #if ENABLED(USE_CONTROLLER_FAN) - controllerFan(); // Check if fan should be turned on to cool stepper drivers down - #endif - - #if ENABLED(AUTO_POWER_CONTROL) - powerManager.check(); - #endif - - #if ENABLED(EXTRUDER_RUNOUT_PREVENT) - if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP - && ELAPSED(ms, previous_move_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) - && !planner.has_blocks_queued() - ) { - #if ENABLED(SWITCHING_EXTRUDER) - const bool oldstatus = E0_ENABLE_READ; - enable_E0(); - #else // !SWITCHING_EXTRUDER - bool oldstatus; - switch (active_extruder) { - default: oldstatus = E0_ENABLE_READ; enable_E0(); break; - #if E_STEPPERS > 1 - case 1: oldstatus = E1_ENABLE_READ; enable_E1(); break; - #if E_STEPPERS > 2 - case 2: oldstatus = E2_ENABLE_READ; enable_E2(); break; - #if E_STEPPERS > 3 - case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break; - #if E_STEPPERS > 4 - case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break; - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #endif // !SWITCHING_EXTRUDER - - const float olde = current_position[E_AXIS]; - current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); - current_position[E_AXIS] = olde; - planner.set_e_position_mm(olde); - - stepper.synchronize(); - #if ENABLED(SWITCHING_EXTRUDER) - E0_ENABLE_WRITE(oldstatus); - #else - switch (active_extruder) { - case 0: E0_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 1 - case 1: E1_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 2 - case 2: E2_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 3 - case 3: E3_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 4 - case 4: E4_ENABLE_WRITE(oldstatus); break; - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #endif // !SWITCHING_EXTRUDER - - previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered - } - #endif // EXTRUDER_RUNOUT_PREVENT - - #if ENABLED(DUAL_X_CARRIAGE) - // handle delayed move timeout - if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { - // travel moves have been received so enact them - delayed_move_time = 0xFFFFFFFFUL; // force moves to be done - set_destination_from_current(); - prepare_move_to_destination(); - } - #endif - - #if ENABLED(TEMP_STAT_LEDS) - handle_status_leds(); - #endif - - #if ENABLED(MONITOR_DRIVER_STATUS) - monitor_tmc_driver(); - #endif - - planner.check_axes_activity(); -} - -/** - * Standard idle routine keeps the machine alive - */ -void idle( - #if ENABLED(ADVANCED_PAUSE_FEATURE) - bool no_stepper_sleep/*=false*/ - #endif -) { - #if ENABLED(MAX7219_DEBUG) - Max7219_idle_tasks(); - #endif // MAX7219_DEBUG - - lcd_update(); - - host_keepalive(); - - manage_inactivity( - #if ENABLED(ADVANCED_PAUSE_FEATURE) - no_stepper_sleep - #endif - ); - - thermalManager.manage_heater(); - - #if ENABLED(PRINTCOUNTER) - print_job_timer.tick(); - #endif - - #if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) - buzzer.tick(); - #endif - - #if ENABLED(I2C_POSITION_ENCODERS) - static millis_t i2cpem_next_update_ms; - if (planner.has_blocks_queued() && ELAPSED(millis(), i2cpem_next_update_ms)) { - I2CPEM.update(); - i2cpem_next_update_ms = millis() + I2CPE_MIN_UPD_TIME_MS; - } - #endif - - #if HAS_AUTO_REPORTING - if (!suspend_auto_report) { - #if ENABLED(AUTO_REPORT_TEMPERATURES) - thermalManager.auto_report_temperatures(); - #endif - #if ENABLED(AUTO_REPORT_SD_STATUS) - card.auto_report_sd_status(); - #endif - } - #endif -} - -/** - * Kill all activity and lock the machine. - * After this the machine will need to be reset. - */ -void kill(const char* lcd_msg) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_KILLED); - - thermalManager.disable_all_heaters(); - disable_all_steppers(); - - #if ENABLED(ULTRA_LCD) - kill_screen(lcd_msg); - #else - UNUSED(lcd_msg); - #endif - - _delay_ms(600); // Wait a short time (allows messages to get out before shutting down. - cli(); // Stop interrupts - - _delay_ms(250); //Wait to ensure all interrupts routines stopped - thermalManager.disable_all_heaters(); //turn off heaters again - - #ifdef ACTION_ON_KILL - SERIAL_ECHOLNPGM("//action:" ACTION_ON_KILL); - #endif - - #if HAS_POWER_SWITCH - PSU_OFF(); - #endif - - suicide(); - while (1) { - #if ENABLED(USE_WATCHDOG) - watchdog_reset(); - #endif - } // Wait for reset -} - -/** - * Turn off heaters and stop the print in progress - * After a stop the machine may be resumed with M999 - */ -void stop() { - thermalManager.disable_all_heaters(); // 'unpause' taken care of in here - - #if ENABLED(PROBING_FANS_OFF) - if (fans_paused) fans_pause(false); // put things back the way they were - #endif - - if (IsRunning()) { - Stopped_gcode_LastN = gcode_LastN; // Save last g_code for restart - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - safe_delay(350); // allow enough time for messages to get out before stopping - Running = false; - } -} - -/** - * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold - * - Start the serial port - * - Print startup messages and diagnostics - * - Get EEPROM or default settings - * - Initialize managers for: - * • temperature - * • planner - * • watchdog - * • stepper - * • photo pin - * • servos - * • LCD controller - * • Digipot I2C - * • Z probe sled - * • status LEDs - */ -void setup() { - - #if ENABLED(MAX7219_DEBUG) - Max7219_init(); - #endif - - #if ENABLED(DISABLE_JTAG) - // Disable JTAG on AT90USB chips to free up pins for IO - MCUCR = 0x80; - MCUCR = 0x80; - #endif - - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - runout.setup(); - #endif - - setup_killpin(); - - setup_powerhold(); - - #if HAS_STEPPER_RESET - disableStepperDrivers(); - #endif - - MYSERIAL0.begin(BAUDRATE); - SERIAL_PROTOCOLLNPGM("start"); - SERIAL_ECHO_START(); - - // Prepare communication for TMC drivers - #if ENABLED(HAVE_TMC2130) - tmc_init_cs_pins(); - #endif - #if ENABLED(HAVE_TMC2208) - tmc2208_serial_begin(); - #endif - - // Check startup - does nothing if bootloader sets MCUSR to 0 - byte mcu = MCUSR; - if (mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP); - if (mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET); - if (mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET); - if (mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET); - if (mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET); - MCUSR = 0; - - SERIAL_ECHOPGM(MSG_MARLIN); - SERIAL_CHAR(' '); - SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); - SERIAL_EOL(); - - #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_CONFIGURATION_VER); - SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE); - SERIAL_ECHOLNPGM(MSG_AUTHOR STRING_CONFIG_H_AUTHOR); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM("Compiled: " __DATE__); - #endif - - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(MSG_FREE_MEMORY, freeMemory()); - SERIAL_ECHOLNPAIR(MSG_PLANNER_BUFFER_BYTES, (int)sizeof(block_t)*BLOCK_BUFFER_SIZE); - - // Send "ok" after commands by default - for (int8_t i = 0; i < BUFSIZE; i++) send_ok[i] = true; - - // Load data from EEPROM if available (or use defaults) - // This also updates variables in the planner, elsewhere - (void)settings.load(); - - #if HAS_M206_COMMAND - // Initialize current position based on home_offset - COPY(current_position, home_offset); - #else - ZERO(current_position); - #endif - - // Vital to init stepper/planner equivalent for current_position - SYNC_PLAN_POSITION_KINEMATIC(); - - thermalManager.init(); // Initialize temperature loop - - print_job_timer.init(); // Initial setup of print job timer - - stepper.init(); // Initialize stepper, this enables interrupts! - - servo_init(); // Initialize all servos, stow servo probe - - #if HAS_PHOTOGRAPH - OUT_WRITE(PHOTOGRAPH_PIN, LOW); - #endif - - #if HAS_CASE_LIGHT - case_light_on = CASE_LIGHT_DEFAULT_ON; - case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; - update_case_light(); - #endif - - #if ENABLED(SPINDLE_LASER_ENABLE) - OUT_WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // init spindle to off - #if SPINDLE_DIR_CHANGE - OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // init rotation to clockwise (M3) - #endif - #if ENABLED(SPINDLE_LASER_PWM) - SET_OUTPUT(SPINDLE_LASER_PWM_PIN); - analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // set to lowest speed - #endif - #endif - - #if HAS_BED_PROBE - endstops.enable_z_probe(false); - #endif - - #if ENABLED(USE_CONTROLLER_FAN) - SET_OUTPUT(CONTROLLER_FAN_PIN); //Set pin used for driver cooling fan - #endif - - #if HAS_STEPPER_RESET - enableStepperDrivers(); - #endif - - #if ENABLED(DIGIPOT_I2C) - digipot_i2c_init(); - #endif - - #if ENABLED(DAC_STEPPER_CURRENT) - dac_init(); - #endif - - #if (ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) && HAS_SOLENOID_1 - OUT_WRITE(SOL1_PIN, LOW); // turn it off - #endif - - #if HAS_HOME - SET_INPUT_PULLUP(HOME_PIN); - #endif - - #if PIN_EXISTS(STAT_LED_RED) - OUT_WRITE(STAT_LED_RED_PIN, LOW); // turn it off - #endif - - #if PIN_EXISTS(STAT_LED_BLUE) - OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // turn it off - #endif - - #if HAS_COLOR_LEDS - leds.setup(); - #endif - - #if ENABLED(RGB_LED) || ENABLED(RGBW_LED) - SET_OUTPUT(RGB_LED_R_PIN); - SET_OUTPUT(RGB_LED_G_PIN); - SET_OUTPUT(RGB_LED_B_PIN); - #if ENABLED(RGBW_LED) - SET_OUTPUT(RGB_LED_W_PIN); - #endif - #endif - - #if ENABLED(MK2_MULTIPLEXER) - SET_OUTPUT(E_MUX0_PIN); - SET_OUTPUT(E_MUX1_PIN); - SET_OUTPUT(E_MUX2_PIN); - #endif - - #if HAS_FANMUX - fanmux_init(); - #endif - - lcd_init(); - LCD_MESSAGEPGM(WELCOME_MSG); - - #if ENABLED(SHOW_BOOTSCREEN) - lcd_bootscreen(); - #endif - - #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. - for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS && t < MIXING_STEPPERS; t++) - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - mixing_virtual_tool_mix[t][i] = (t == i) ? 1.0 : 0.0; - - // Remaining virtual tools are 100% filament 1 - #if MIXING_STEPPERS < MIXING_VIRTUAL_TOOLS - for (uint8_t t = MIXING_STEPPERS; t < MIXING_VIRTUAL_TOOLS; t++) - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - mixing_virtual_tool_mix[t][i] = (i == 0) ? 1.0 : 0.0; - #endif - - // Initialize mixing to tool 0 color - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - mixing_factor[i] = mixing_virtual_tool_mix[0][i]; - #endif - - #if ENABLED(BLTOUCH) - // Make sure any BLTouch error condition is cleared - bltouch_command(BLTOUCH_RESET); - set_bltouch_deployed(true); - set_bltouch_deployed(false); - #endif - - #if ENABLED(I2C_POSITION_ENCODERS) - I2CPEM.init(); - #endif - - #if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 - i2c.onReceive(i2c_on_receive); - i2c.onRequest(i2c_on_request); - #endif - - #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - setup_endstop_interrupts(); - #endif - - #if DO_SWITCH_EXTRUDER - move_extruder_servo(0); // Initialize extruder servo - #endif - - #if ENABLED(SWITCHING_NOZZLE) - move_nozzle_servo(0); // Initialize nozzle servo - #endif - - #if ENABLED(PARKING_EXTRUDER) - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - pe_activate_magnet(0); - pe_activate_magnet(1); - #else - pe_deactivate_magnet(0); - pe_deactivate_magnet(1); - #endif - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - do_print_job_recovery(); - #endif - - #if ENABLED(USE_WATCHDOG) - watchdog_init(); - #endif -} - -/** - * The main Marlin program loop - * - * - Abort SD printing if flagged - * - Save or log commands to SD - * - Process available commands (if not saving) - * - Call heater manager - * - Call inactivity manager - * - Call endstop manager - * - Call LCD update - */ -void loop() { - - #if ENABLED(SDSUPPORT) - - card.checkautostart(); - - #if ENABLED(ULTIPANEL) - if (abort_sd_printing) { - abort_sd_printing = false; - card.stopSDPrint( - #if SD_RESORT - true - #endif - ); - clear_command_queue(); - quickstop_stepper(); - print_job_timer.stop(); - thermalManager.disable_all_heaters(); - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; - #endif - wait_for_heatup = false; - } - #endif - - #endif // SDSUPPORT - - if (commands_in_queue < BUFSIZE) get_available_commands(); - - if (commands_in_queue) { - - #if ENABLED(SDSUPPORT) - - if (card.saving) { - char* command = command_queue[cmd_queue_index_r]; - if (strstr_P(command, PSTR("M29"))) { - // M29 closes the file - card.closefile(); - SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED); - - #if !(defined(__AVR__) && defined(USBCON)) - #if ENABLED(SERIAL_STATS_DROPPED_RX) - SERIAL_ECHOLNPAIR("Dropped bytes: ", customizedSerial.dropped()); - #endif - - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - SERIAL_ECHOLNPAIR("Max RX Queue Size: ", customizedSerial.rxMaxEnqueued()); - #endif - #endif // !(__AVR__ && USBCON) - - ok_to_send(); - } - else { - // Write the string from the read buffer to SD - card.write_command(command); - if (card.logging) - process_next_command(); // The card is saving because it's logging - else - ok_to_send(); - } - } - else { - process_next_command(); - #if ENABLED(POWER_LOSS_RECOVERY) - if (card.cardOK && card.sdprinting) save_job_recovery_info(); - #endif - } - - #else - - process_next_command(); - - #endif // SDSUPPORT - - // The queue may be reset by a command handler or by code invoked by idle() within a handler - if (commands_in_queue) { - --commands_in_queue; - if (++cmd_queue_index_r >= BUFSIZE) cmd_queue_index_r = 0; - } - } - endstops.report_state(); - idle(); -} diff --git a/Marlin/SdFatUtil.cpp b/Marlin/SdFatUtil.cpp deleted file mode 100644 index 2bd471bc67..0000000000 --- a/Marlin/SdFatUtil.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Arduino SdFat Library - * Copyright (C) 2008 by William Greiman - * - * This file is part of the Arduino Sd2Card Library - */ -#include "MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "SdFatUtil.h" -#include "serial.h" - -/** - * Amount of free RAM - * \return The number of free bytes. - */ -#ifdef __arm__ -extern "C" char* sbrk(int incr); -int SdFatUtil::FreeRam() { - char top; - return &top - reinterpret_cast(sbrk(0)); -} -#else // __arm__ -extern char* __brkval; -extern char __bss_end; -/** - * Amount of free RAM - * \return The number of free bytes. - */ -int SdFatUtil::FreeRam() { - char top; - return __brkval ? &top - __brkval : &top - &__bss_end; -} -#endif // __arm - -/** - * %Print a string in flash memory. - * - * \param[in] pr Print object for output. - * \param[in] str Pointer to string stored in flash memory. - */ -void SdFatUtil::print_P(PGM_P str) { - for (uint8_t c; (c = pgm_read_byte(str)); str++) SERIAL_CHAR(c); -} - -/** - * %Print a string in flash memory followed by a CR/LF. - * - * \param[in] pr Print object for output. - * \param[in] str Pointer to string stored in flash memory. - */ -void SdFatUtil::println_P(PGM_P str) { print_P(str); SERIAL_EOL(); } - -/** - * %Print a string in flash memory to Serial. - * - * \param[in] str Pointer to string stored in flash memory. - */ -void SdFatUtil::SerialPrint_P(PGM_P str) { print_P(str); } - -/** - * %Print a string in flash memory to Serial followed by a CR/LF. - * - * \param[in] str Pointer to string stored in flash memory. - */ -void SdFatUtil::SerialPrintln_P(PGM_P str) { println_P(str); } - -#endif // SDSUPPORT diff --git a/Marlin/_Bootscreen.h b/Marlin/_Bootscreen.h new file mode 100644 index 0000000000..cf8c657d66 --- /dev/null +++ b/Marlin/_Bootscreen.h @@ -0,0 +1,106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Custom Bitmap for splashscreen + * + * You may use one of the following tools to generate the C++ bitmap array from + * a black and white image: + * + * - http://www.marlinfw.org/tools/u8glib/converter.html + * - http://www.digole.com/tools/PicturetoC_Hex_converter.php + */ +#include + +#define CUSTOM_BOOTSCREEN_TIMEOUT 2500 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 +#define CUSTOM_BOOTSCREEN_BMPHEIGHT 64 + +const unsigned char custom_start_bmp[] PROGMEM = { +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFD, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFD, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFE, 0x07, 0xC0, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x0A, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFE, 0x14, 0x10, 0x05, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x28, 0x08, 0x06, 0x07, 0xC0, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5F, 0xFF, 0xFF, 0xFF, +0xFE, 0x54, 0x04, 0x04, 0x0A, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, +0xFC, 0x60, 0x04, 0x06, 0x14, 0x10, 0x05, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFE, 0x50, 0x04, 0x04, 0x28, 0x08, 0x06, 0x07, 0xC0, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5F, +0xFC, 0x60, 0x04, 0x06, 0x54, 0x04, 0x04, 0x0A, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFE, 0x54, 0x04, 0x1C, 0x60, 0x04, 0x06, 0x14, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, +0xFC, 0x28, 0x08, 0x2E, 0x50, 0x04, 0x04, 0x28, 0x08, 0x06, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x3F, +0xFE, 0x14, 0x10, 0x54, 0x60, 0x04, 0x06, 0x54, 0x04, 0x04, 0x0A, 0x20, 0x00, 0x02, 0x08, 0x1F, +0xFC, 0x0A, 0x20, 0x66, 0x54, 0x04, 0x1C, 0x60, 0x04, 0x06, 0x14, 0x10, 0x00, 0x05, 0x04, 0x3F, +0xFE, 0x07, 0xC0, 0x54, 0x28, 0x08, 0x2E, 0x50, 0x04, 0x04, 0x28, 0x08, 0x00, 0x0A, 0x02, 0x1F, +0xFC, 0x00, 0x00, 0x2E, 0x14, 0x10, 0x54, 0x60, 0x04, 0x06, 0x54, 0x04, 0x00, 0x15, 0x01, 0x3F, +0xFE, 0x00, 0x00, 0x1C, 0x0A, 0x20, 0x66, 0x54, 0x04, 0x1C, 0x60, 0x04, 0x00, 0x18, 0x01, 0x1F, +0xFC, 0x00, 0x00, 0x06, 0x07, 0xC0, 0x54, 0x28, 0x08, 0x2E, 0x50, 0x04, 0x00, 0x14, 0x01, 0x3F, +0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2E, 0x14, 0x10, 0x54, 0x60, 0x04, 0x00, 0x18, 0x01, 0x1F, +0xFC, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x1C, 0x0A, 0x20, 0x66, 0x54, 0x04, 0x1C, 0x15, 0x01, 0x3F, +0xFE, 0xD5, 0x55, 0x54, 0x00, 0x00, 0x06, 0x07, 0xC0, 0x54, 0x28, 0x08, 0x2A, 0x0A, 0x02, 0x1F, +0xFC, 0x84, 0x10, 0x46, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2E, 0x14, 0x10, 0x51, 0x05, 0x04, 0x3F, +0xFE, 0xC4, 0x10, 0x44, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x1C, 0x0A, 0x20, 0x61, 0x02, 0x88, 0x1F, +0xFC, 0x84, 0x10, 0x46, 0xD5, 0x55, 0x54, 0x00, 0x00, 0x06, 0x07, 0xC0, 0x51, 0x01, 0xF0, 0x3F, +0xFE, 0x84, 0x10, 0x44, 0x84, 0x10, 0x46, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x1F, +0xFC, 0xC4, 0x10, 0x46, 0xC4, 0x10, 0x44, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, +0xFE, 0x84, 0x10, 0x44, 0x84, 0x10, 0x46, 0xD5, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, +0xFC, 0xD5, 0x55, 0x56, 0x84, 0x10, 0x44, 0x84, 0x10, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFC, 0xFF, 0xFF, 0xFC, 0xC4, 0x10, 0x46, 0xC4, 0x10, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, +0xFE, 0x00, 0x00, 0x06, 0x84, 0x10, 0x44, 0x84, 0x10, 0x46, 0xD5, 0x55, 0x55, 0x55, 0x55, 0xBF, +0xFD, 0x55, 0x55, 0x54, 0xD5, 0x55, 0x56, 0x84, 0x10, 0x44, 0x84, 0x10, 0x41, 0x04, 0x10, 0x9F, +0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xC4, 0x10, 0x46, 0xC4, 0x10, 0x41, 0x04, 0x11, 0xBF, +0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x06, 0x84, 0x10, 0x44, 0x84, 0x10, 0x41, 0x04, 0x10, 0x9F, +0xFF, 0xFF, 0xFF, 0xFD, 0x55, 0x55, 0x54, 0xD5, 0x55, 0x56, 0x84, 0x10, 0x41, 0x04, 0x10, 0x9F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xC4, 0x10, 0x41, 0x04, 0x11, 0xBF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x06, 0x84, 0x10, 0x41, 0x04, 0x10, 0x9F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x55, 0x55, 0x54, 0xD5, 0x55, 0x55, 0x55, 0x55, 0xBF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x2E, 0xFB, 0x7D, 0xFB, 0xFB, 0xCF, 0xC1, 0xDF, 0xBB, 0x3E, 0xC0, 0xE1, 0xFE, 0x3C, 0x1F, +0xFD, 0xEE, 0x7B, 0x39, 0xF9, 0xF3, 0xCF, 0x9E, 0xDF, 0xBB, 0x3E, 0xDF, 0xDE, 0xFC, 0xDD, 0xE7, +0xFD, 0xEE, 0x3B, 0xBB, 0xF9, 0xEB, 0xD7, 0xBF, 0x5F, 0xBB, 0x5E, 0xDF, 0xDE, 0xFD, 0xED, 0xF7, +0xFD, 0xEE, 0xBB, 0xD3, 0xFA, 0xEB, 0xB7, 0x3F, 0xDF, 0xBB, 0x4E, 0xDF, 0xDF, 0xFF, 0xCD, 0xF3, +0xFD, 0xEE, 0xDB, 0xC7, 0xFA, 0xEB, 0xBB, 0x7F, 0xC0, 0x3B, 0x6E, 0xC0, 0xE3, 0xFF, 0x1D, 0xF3, +0xFD, 0xEE, 0xCB, 0xEF, 0xFA, 0xDB, 0xBB, 0x7F, 0xDF, 0xBB, 0x66, 0xDF, 0xF8, 0xFF, 0xCD, 0xF3, +0xFD, 0xEE, 0xEB, 0xEF, 0xFB, 0x5B, 0x03, 0x3F, 0x5F, 0xBB, 0x76, 0xDF, 0xFE, 0x7F, 0xED, 0xF3, +0xFD, 0xEE, 0xF3, 0xEF, 0xFB, 0x5B, 0x79, 0xBE, 0xDF, 0xBB, 0x7A, 0xDF, 0xDE, 0x7D, 0xED, 0xF7, +0xFD, 0xEE, 0xF3, 0xEF, 0xFB, 0xBA, 0xFD, 0x9E, 0xDF, 0xBB, 0x7C, 0xDF, 0xDE, 0xFD, 0xCD, 0xE7, +0xFD, 0xEE, 0xFB, 0xEF, 0xFB, 0xBA, 0xFD, 0xC1, 0xDF, 0xBB, 0x7E, 0xC0, 0xE0, 0xFE, 0x1C, 0x1F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + + + diff --git a/Marlin/_statusscreen.h b/Marlin/_statusscreen.h new file mode 100644 index 0000000000..515aa97792 --- /dev/null +++ b/Marlin/_statusscreen.h @@ -0,0 +1,472 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ +//#include "MarlinConfig.h" + +//============================================ + +#define STATUS_SCREENWIDTH 128 + +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (41 + (E) * 20) + +#define STATUS_SCREEN_BED_TEXT_X (HOTENDS > 1 ? 81 : 73) + +#define FAN_ANIM_FRAMES 3 +#define STATUS_SCREEN_FAN_TEXT_X (FAN_ANIM_FRAMES == 3 ? 103 : 105) +#define STATUS_SCREEN_FAN_TEXT_Y (FAN_ANIM_FRAMES > 2 ? 28 : 27) + +//============================================ + +#if HOTENDS < 2 + + #if FAN_ANIM_FRAMES <= 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100001,B11111111,B10001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01101100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100011,B11111111,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00111111,B11000111,B10001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B11000111,B11001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110111,B10000111,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B00000011,B11011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000010,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + + #elif FAN_ANIM_FRAMES == 3 + + +const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + + + const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111100,B00001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11011100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100111,B11101111,B11001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01110111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B01111111,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B11110011,B11101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100001,B11110001,B11101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110011,B11110000,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B11110000,B01011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + const unsigned char status_screen2_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100001,B11111111,B10001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01101100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100011,B11111111,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00111111,B11000111,B10001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B11000111,B11001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110111,B10000111,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B00000011,B11011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000010,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + + #elif FAN_ANIM_FRAMES == 4 + +const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + +const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111100,B00001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11011100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100111,B11101111,B11001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01110111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B01111111,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B11110011,B11101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100001,B11110001,B11101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110011,B11110000,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B11110000,B01011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + +const unsigned char status_screen2_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100001,B11111111,B10001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01101100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100011,B11111111,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00111111,B11000111,B10001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B11000111,B11001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110111,B10000111,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B00000011,B11011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000010,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + + +const unsigned char status_screen3_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11100001,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110011,B11101000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01111111,B11101000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01110111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101000,B11101110,B00101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11011100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B11111100,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B00001111,B00001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B00001111,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B00001111,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 +}; + + + #endif + +#else // HOTENDS >= 2 + + #if FAN_ANIM_FRAMES <= 2 + +const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + +const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B11111100,B00001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11011100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100111,B11101111,B11001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01110111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B11110011,B11101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100001,B11110001,B11101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110011,B11110000,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B11110000,B01011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + + #elif FAN_ANIM_FRAMES == 3 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + +const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B11111100,B00001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11011100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100111,B11101111,B11001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01110111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B11110011,B11101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100001,B11110001,B11101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110011,B11110000,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B11110000,B01011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + +const unsigned char status_screen2_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100001,B11111111,B10001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01101100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100011,B11111111,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00111111,B11000111,B10001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B11000111,B11001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110111,B10000111,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B00000011,B11011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000010,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + + #elif FAN_ANIM_FRAMES == 4 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B00111001,B11001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11111111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B11000111,B11101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11111111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100111,B00111001,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00111000,B01101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B01111100,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + +const unsigned char status_screen1_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B11111100,B00001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11011100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100111,B11101111,B11001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01110111,B11101000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11101000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B11110011,B11101000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100001,B11110001,B11101000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110011,B11110000,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B11110000,B01011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + +const unsigned char status_screen2_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100001,B11111111,B10001000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01101100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100011,B11111111,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00111111,B11000111,B10001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B11000111,B11001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110111,B10000111,B11011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B00000011,B11011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000010,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + +const unsigned char status_screen3_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10001110,B00000000,B11100001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B10011111,B00000000,B11110001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10010011,B10000001,B00111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11100001,B11101000, + B10011111,B10000001,B11111001,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110011,B11101000, + B10011111,B10111001,B11110001,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100000,B01111111,B11101000, + B10001111,B00101000,B11110001,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01110111,B11101000, + B10000000,B00111000,B00000001,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101000,B11101110,B00101000, + B10000000,B00000000,B00000001,B00000000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11011100,B00001000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101111,B11111100,B00001000, + B10010001,B01110100,B10011001,B00000000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00101111,B10011110,B00001000, + B10011011,B00000110,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B00001111,B00001000, + B10011011,B01010100,B10101001,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B00001111,B00011000, + B10011011,B01010110,B10101001,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B00001111,B00011000, + B10011011,B01010100,B10011001,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B10011111,B11111111,B11111001,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B11111111,B11111111,B11111111,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 +}; + + + #endif + +#endif // HOTENDS >= 2 diff --git a/Marlin/dogm_font_data_HD44780_C.h b/Marlin/dogm_font_data_HD44780_C.h deleted file mode 100644 index 21d4aaabe2..0000000000 --- a/Marlin/dogm_font_data_HD44780_C.h +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: HD44780_C v1.2 - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 8 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 8 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t HD44780_C_5x7[2522] U8G_SECTION(".progmem.HD44780_C_5x7") = { - 0, 6, 9, 0, 254, 7, 1, 145, 3, 34, 32, 255, 255, 8, 255, 7, - 255, 0, 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 48, 64, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 16, 96, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 6, 6, 6, 0, 0, 112, 136, 8, 104, 168, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, - 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 224, 144, - 136, 136, 136, 144, 224, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, - 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, 5, - 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, 6, - 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, - 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, - 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, 136, - 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, 7, - 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, 136, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, 128, - 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, 0, - 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, 32, - 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, - 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, 5, - 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, 6, - 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, 136, - 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, - 64, 128, 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, 224, - 5, 7, 7, 6, 0, 0, 32, 112, 160, 160, 168, 112, 32, 3, 7, 7, - 6, 1, 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, - 32, 80, 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, - 128, 64, 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, - 6, 0, 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, - 112, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, - 136, 120, 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, - 6, 0, 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, - 112, 136, 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, - 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, - 3, 8, 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, - 7, 6, 0, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, - 0, 192, 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, - 168, 168, 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, - 5, 6, 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, - 136, 136, 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, - 8, 5, 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, - 0, 0, 112, 128, 112, 8, 240, 5, 7, 7, 6, 0, 0, 64, 64, 224, - 64, 64, 72, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, - 5, 5, 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, - 136, 136, 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, - 5, 6, 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, - 0, 0, 248, 16, 32, 64, 248, 5, 5, 5, 6, 0, 2, 184, 168, 168, - 168, 184, 5, 5, 5, 6, 0, 2, 184, 136, 184, 160, 184, 5, 5, 5, - 6, 0, 2, 184, 160, 184, 136, 184, 5, 6, 6, 6, 0, 1, 8, 40, - 72, 248, 64, 32, 5, 5, 5, 6, 0, 0, 56, 112, 224, 136, 240, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 5, - 7, 7, 6, 0, 0, 248, 136, 128, 240, 136, 136, 240, 5, 7, 7, 6, - 0, 0, 248, 136, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 80, - 0, 248, 128, 240, 128, 248, 5, 7, 7, 6, 0, 0, 168, 168, 168, 112, - 168, 168, 168, 5, 7, 7, 6, 0, 0, 240, 8, 8, 112, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 136, 136, 152, 168, 200, 136, 136, 5, 8, 8, - 6, 0, 0, 80, 32, 136, 152, 168, 168, 200, 136, 5, 7, 7, 6, 0, - 0, 120, 40, 40, 40, 40, 168, 72, 5, 7, 7, 6, 0, 0, 248, 136, - 136, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, 136, 136, 136, 80, 32, - 64, 128, 5, 7, 7, 6, 0, 0, 32, 112, 168, 168, 168, 112, 32, 5, - 7, 7, 6, 0, 0, 136, 136, 136, 120, 8, 8, 8, 5, 7, 7, 6, - 0, 0, 168, 168, 168, 168, 168, 168, 248, 5, 7, 7, 6, 0, 0, 192, - 64, 64, 112, 72, 72, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 200, - 168, 168, 200, 5, 7, 7, 6, 0, 0, 112, 136, 8, 56, 8, 136, 112, - 5, 7, 7, 6, 0, 0, 144, 168, 168, 232, 168, 168, 144, 5, 7, 7, - 6, 0, 0, 120, 136, 136, 120, 40, 72, 136, 5, 7, 7, 6, 0, 0, - 24, 96, 128, 240, 136, 136, 112, 4, 5, 5, 6, 0, 0, 224, 144, 224, - 144, 224, 5, 5, 5, 6, 0, 0, 248, 136, 128, 128, 128, 5, 7, 7, - 6, 0, 0, 80, 0, 112, 136, 248, 128, 112, 5, 5, 5, 6, 0, 0, - 168, 168, 112, 168, 168, 5, 5, 5, 6, 0, 0, 240, 8, 48, 8, 240, - 5, 5, 5, 6, 0, 0, 136, 152, 168, 200, 136, 5, 7, 7, 6, 0, - 0, 80, 32, 136, 152, 168, 200, 136, 4, 5, 5, 6, 0, 0, 144, 160, - 192, 160, 144, 5, 5, 5, 6, 0, 0, 248, 40, 40, 168, 72, 5, 5, - 5, 6, 0, 0, 136, 216, 168, 136, 136, 5, 5, 5, 6, 0, 0, 136, - 136, 248, 136, 136, 5, 5, 5, 6, 0, 0, 248, 136, 136, 136, 136, 5, - 5, 5, 6, 0, 0, 248, 32, 32, 32, 32, 5, 5, 5, 6, 0, 0, - 136, 136, 120, 8, 8, 5, 5, 5, 6, 0, 0, 168, 168, 168, 168, 248, - 5, 5, 5, 6, 0, 0, 192, 64, 112, 72, 112, 5, 5, 5, 6, 0, - 0, 136, 136, 200, 168, 200, 4, 5, 5, 6, 0, 0, 128, 128, 224, 144, - 224, 5, 5, 5, 6, 0, 0, 112, 136, 56, 136, 112, 5, 5, 5, 6, - 0, 0, 144, 168, 232, 168, 144, 5, 5, 5, 6, 0, 0, 120, 136, 120, - 40, 72, 5, 5, 5, 6, 0, 1, 32, 72, 144, 72, 32, 5, 5, 5, - 6, 0, 1, 32, 144, 72, 144, 32, 5, 3, 3, 6, 0, 0, 72, 144, - 216, 5, 3, 3, 6, 0, 4, 216, 72, 144, 5, 7, 7, 6, 0, 0, - 144, 208, 176, 144, 56, 40, 56, 5, 7, 7, 6, 0, 0, 32, 0, 32, - 64, 128, 136, 112, 5, 7, 7, 6, 0, 0, 24, 32, 32, 112, 32, 32, - 192, 5, 7, 7, 6, 0, 0, 32, 80, 64, 240, 64, 64, 120, 1, 2, - 2, 6, 2, 0, 128, 128, 1, 4, 4, 6, 2, 0, 128, 128, 128, 128, - 3, 5, 5, 6, 1, 0, 160, 160, 160, 0, 224, 3, 5, 5, 6, 1, - 0, 160, 160, 160, 0, 160, 5, 7, 7, 6, 0, 0, 160, 0, 232, 16, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 216, 112, 32, 112, 216, 5, 7, - 7, 6, 0, 0, 160, 64, 168, 16, 32, 64, 128, 3, 6, 6, 6, 1, - 1, 224, 64, 64, 64, 64, 224, 5, 6, 6, 6, 0, 1, 248, 80, 80, - 80, 80, 248, 5, 7, 7, 6, 0, 0, 32, 112, 168, 32, 32, 32, 32, - 5, 7, 7, 6, 0, 0, 32, 32, 32, 32, 168, 112, 32, 5, 7, 7, - 6, 0, 0, 128, 144, 176, 248, 176, 144, 128, 5, 7, 7, 6, 0, 0, - 8, 72, 104, 248, 104, 72, 8, 5, 7, 7, 6, 0, 0, 128, 136, 168, - 248, 168, 136, 128, 5, 7, 7, 6, 0, 0, 128, 224, 136, 16, 32, 64, - 128, 2, 2, 2, 6, 2, 2, 192, 192, 5, 8, 8, 6, 0, 255, 120, - 40, 40, 40, 72, 136, 248, 136, 5, 8, 8, 6, 0, 255, 136, 136, 136, - 136, 136, 136, 248, 8, 5, 8, 8, 6, 0, 255, 168, 168, 168, 168, 168, - 168, 248, 8, 5, 6, 6, 6, 0, 255, 120, 40, 72, 136, 248, 136, 5, - 7, 7, 6, 0, 255, 32, 32, 112, 168, 168, 112, 32, 5, 6, 6, 6, - 0, 255, 136, 136, 136, 136, 248, 8, 5, 6, 6, 6, 0, 255, 168, 168, - 168, 168, 248, 8, 2, 2, 2, 6, 2, 6, 64, 128, 3, 1, 1, 6, - 1, 7, 160, 5, 2, 2, 6, 0, 6, 72, 176, 5, 8, 8, 6, 0, - 0, 16, 32, 0, 112, 136, 248, 128, 112, 5, 6, 6, 6, 0, 255, 112, - 128, 136, 112, 32, 96, 3, 7, 7, 6, 1, 0, 160, 0, 160, 160, 160, - 32, 192, 5, 6, 6, 6, 0, 1, 32, 112, 112, 112, 248, 32, 5, 5, - 5, 6, 0, 1, 80, 0, 136, 0, 80, 5, 5, 5, 6, 0, 1, 112, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 136, 144, 168, 88, 184, 8, - 8, 5, 7, 7, 6, 0, 0, 136, 144, 184, 72, 184, 8, 56, 5, 7, - 7, 6, 0, 0, 136, 144, 184, 72, 152, 32, 56, 5, 8, 8, 6, 0, - 0, 192, 64, 192, 72, 216, 56, 8, 8, 5, 7, 7, 6, 0, 0, 136, - 248, 136, 248, 136, 248, 136, 4, 5, 5, 6, 0, 2, 192, 0, 48, 0, - 96, 5, 8, 8, 6, 0, 0, 64, 160, 224, 168, 8, 40, 120, 32, 5, - 8, 8, 6, 0, 0, 64, 112, 64, 120, 64, 112, 64, 224, 5, 8, 8, - 6, 0, 0, 32, 112, 32, 248, 32, 112, 32, 112, 5, 7, 7, 6, 0, - 0, 104, 0, 232, 0, 104, 16, 56, 5, 8, 8, 6, 0, 0, 16, 112, - 16, 240, 16, 112, 16, 56, 5, 7, 7, 6, 0, 1, 32, 112, 32, 248, - 32, 112, 32, 5, 8, 8, 6, 0, 0, 16, 144, 80, 48, 80, 144, 16, - 56, 5, 8, 8, 6, 0, 0, 48, 72, 32, 80, 80, 32, 144, 96, 5, - 7, 7, 6, 0, 0, 120, 168, 168, 120, 40, 40, 40, 5, 8, 8, 6, - 0, 0, 248, 248, 248, 248, 248, 248, 248, 248 -}; diff --git a/Marlin/dogm_font_data_HD44780_J.h b/Marlin/dogm_font_data_HD44780_J.h deleted file mode 100644 index e4884c7cbc..0000000000 --- a/Marlin/dogm_font_data_HD44780_J.h +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: HD44780_J - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 6 h=10 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 8 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-2 -*/ -#include -const u8g_fntpgm_uint8_t HD44780_J_5x7[2492] U8G_SECTION(".progmem.HD44780_J_5x7") = { - 0, 6, 9, 0, 254, 7, 1, 145, 3, 34, 32, 255, 255, 8, 254, 7, - 255, 0, 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 48, 64, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 16, 96, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 6, 6, 6, 0, 0, 112, 136, 8, 104, 168, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, - 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 224, 144, - 136, 136, 136, 144, 224, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, - 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, 5, - 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, 6, - 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, - 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, - 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, 136, - 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, 7, - 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, 136, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, 128, - 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, 0, - 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, 32, - 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, - 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, 5, - 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, 6, - 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, 136, - 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, - 64, 128, 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, 224, - 5, 7, 7, 6, 0, 0, 136, 80, 248, 32, 248, 32, 32, 3, 7, 7, - 6, 1, 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, - 32, 80, 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, - 128, 64, 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, - 6, 0, 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, - 112, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, - 136, 120, 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, - 6, 0, 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, - 112, 136, 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, - 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, - 3, 8, 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, - 7, 6, 0, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, - 0, 192, 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, - 168, 168, 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, - 5, 6, 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, - 136, 136, 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, - 8, 5, 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, - 0, 0, 112, 128, 112, 8, 240, 5, 7, 7, 6, 0, 0, 64, 64, 224, - 64, 64, 72, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, - 5, 5, 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, - 136, 136, 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, - 5, 6, 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, - 0, 0, 248, 16, 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, - 128, 64, 64, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, - 128, 3, 7, 7, 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 5, - 5, 6, 0, 1, 32, 16, 248, 16, 32, 5, 5, 5, 6, 0, 1, 32, - 64, 248, 64, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 3, 3, 3, 6, 0, 0, - 224, 160, 224, 3, 4, 4, 6, 2, 3, 224, 128, 128, 128, 3, 4, 4, - 6, 0, 0, 32, 32, 32, 224, 3, 3, 3, 6, 0, 0, 128, 64, 32, - 2, 2, 2, 6, 1, 2, 192, 192, 5, 6, 6, 6, 0, 0, 248, 8, - 248, 8, 16, 32, 5, 5, 5, 6, 0, 0, 248, 8, 48, 32, 64, 4, - 5, 5, 6, 0, 0, 16, 32, 96, 160, 32, 5, 5, 5, 6, 0, 0, - 32, 248, 136, 8, 48, 5, 4, 4, 6, 0, 0, 248, 32, 32, 248, 5, - 5, 5, 6, 0, 0, 16, 248, 48, 80, 144, 5, 5, 5, 6, 0, 0, - 64, 248, 72, 80, 64, 5, 4, 4, 6, 0, 0, 112, 16, 16, 248, 4, - 5, 5, 6, 0, 0, 240, 16, 240, 16, 240, 5, 4, 4, 6, 0, 0, - 168, 168, 8, 48, 5, 1, 1, 6, 0, 3, 248, 5, 7, 7, 6, 0, - 0, 248, 8, 40, 48, 32, 32, 64, 5, 7, 7, 6, 0, 0, 8, 16, - 32, 96, 160, 32, 32, 5, 7, 7, 6, 0, 0, 32, 248, 136, 136, 8, - 16, 32, 5, 6, 6, 6, 0, 0, 248, 32, 32, 32, 32, 248, 5, 7, - 7, 6, 0, 0, 16, 248, 16, 48, 80, 144, 16, 5, 7, 7, 6, 0, - 0, 64, 248, 72, 72, 72, 72, 144, 5, 7, 7, 6, 0, 0, 32, 248, - 32, 248, 32, 32, 32, 5, 6, 6, 6, 0, 0, 120, 72, 136, 8, 16, - 96, 5, 7, 7, 6, 0, 0, 64, 120, 144, 16, 16, 16, 32, 5, 6, - 6, 6, 0, 0, 248, 8, 8, 8, 8, 248, 5, 7, 7, 6, 0, 0, - 80, 248, 80, 80, 16, 32, 64, 5, 6, 6, 6, 0, 0, 192, 8, 200, - 8, 16, 224, 5, 6, 6, 6, 0, 0, 248, 8, 16, 32, 80, 136, 5, - 7, 7, 6, 0, 0, 64, 248, 72, 80, 64, 64, 56, 5, 6, 6, 6, - 0, 0, 136, 136, 72, 8, 16, 96, 5, 6, 6, 6, 0, 0, 120, 72, - 168, 24, 16, 96, 5, 7, 7, 6, 0, 0, 16, 224, 32, 248, 32, 32, - 64, 5, 6, 6, 6, 0, 0, 168, 168, 168, 8, 16, 32, 5, 7, 7, - 6, 0, 0, 112, 0, 248, 32, 32, 32, 64, 3, 7, 7, 6, 1, 0, - 128, 128, 128, 192, 160, 128, 128, 5, 7, 7, 6, 0, 0, 32, 32, 248, - 32, 32, 64, 128, 5, 6, 6, 6, 0, 0, 112, 0, 0, 0, 0, 248, - 5, 6, 6, 6, 0, 0, 248, 8, 80, 32, 80, 128, 5, 7, 7, 6, - 0, 0, 32, 248, 16, 32, 112, 168, 32, 3, 7, 7, 6, 1, 0, 32, - 32, 32, 32, 32, 64, 128, 5, 6, 6, 6, 0, 0, 32, 16, 136, 136, - 136, 136, 5, 7, 7, 6, 0, 0, 128, 128, 248, 128, 128, 128, 120, 5, - 6, 6, 6, 0, 0, 248, 8, 8, 8, 16, 96, 5, 5, 5, 6, 0, - 1, 64, 160, 16, 8, 8, 5, 7, 7, 6, 0, 0, 32, 248, 32, 32, - 168, 168, 32, 5, 6, 6, 6, 0, 0, 248, 8, 8, 80, 32, 16, 4, - 6, 6, 6, 1, 0, 224, 0, 224, 0, 224, 16, 5, 6, 6, 6, 0, - 0, 32, 64, 128, 136, 248, 8, 5, 6, 6, 6, 0, 0, 8, 8, 80, - 32, 80, 128, 5, 6, 6, 6, 0, 0, 248, 64, 248, 64, 64, 56, 5, - 7, 7, 6, 0, 0, 64, 64, 248, 72, 80, 64, 64, 5, 7, 7, 6, - 0, 0, 112, 16, 16, 16, 16, 16, 248, 5, 6, 6, 6, 0, 0, 248, - 8, 248, 8, 8, 248, 5, 7, 7, 6, 0, 0, 112, 0, 248, 8, 8, - 16, 32, 4, 7, 7, 6, 0, 0, 144, 144, 144, 144, 16, 32, 64, 5, - 6, 6, 6, 0, 0, 32, 160, 160, 168, 168, 176, 5, 7, 7, 6, 0, - 0, 128, 128, 128, 136, 144, 160, 192, 5, 6, 6, 6, 0, 0, 248, 136, - 136, 136, 136, 248, 5, 6, 6, 6, 0, 0, 248, 136, 136, 8, 16, 32, - 5, 6, 6, 6, 0, 0, 192, 0, 8, 8, 16, 224, 4, 3, 3, 6, - 0, 4, 32, 144, 64, 3, 3, 3, 6, 0, 4, 224, 160, 224, 5, 5, - 5, 6, 0, 1, 72, 168, 144, 144, 104, 5, 7, 7, 6, 0, 0, 80, - 0, 112, 8, 120, 136, 120, 4, 8, 8, 6, 1, 255, 96, 144, 144, 224, - 144, 144, 224, 128, 5, 5, 5, 6, 0, 0, 112, 128, 96, 136, 112, 5, - 6, 6, 6, 0, 255, 136, 136, 152, 232, 136, 128, 5, 5, 5, 6, 0, - 0, 120, 160, 144, 136, 112, 5, 7, 7, 6, 0, 254, 48, 72, 136, 136, - 240, 128, 128, 5, 8, 8, 6, 0, 254, 120, 136, 136, 136, 120, 8, 8, - 112, 5, 5, 5, 6, 0, 1, 56, 32, 32, 160, 64, 4, 3, 3, 6, - 0, 3, 16, 208, 16, 4, 8, 8, 6, 0, 255, 16, 0, 48, 16, 16, - 16, 144, 96, 3, 3, 3, 6, 0, 4, 160, 64, 160, 5, 7, 7, 6, - 0, 0, 32, 112, 160, 160, 168, 112, 32, 5, 7, 7, 6, 0, 0, 64, - 64, 224, 64, 224, 64, 120, 5, 7, 7, 6, 0, 0, 112, 0, 176, 200, - 136, 136, 136, 5, 7, 7, 6, 0, 0, 80, 0, 112, 136, 136, 136, 112, - 5, 7, 7, 6, 0, 255, 176, 200, 136, 136, 240, 128, 128, 5, 7, 7, - 6, 0, 255, 104, 152, 136, 136, 120, 8, 8, 5, 6, 6, 6, 0, 0, - 112, 136, 248, 136, 136, 112, 5, 3, 3, 6, 0, 2, 88, 168, 208, 5, - 5, 5, 6, 0, 0, 112, 136, 136, 80, 216, 5, 7, 7, 6, 0, 0, - 80, 0, 136, 136, 136, 152, 104, 5, 7, 7, 6, 0, 0, 248, 128, 64, - 32, 64, 128, 248, 5, 5, 5, 6, 0, 0, 248, 80, 80, 80, 152, 5, - 7, 7, 6, 0, 0, 248, 0, 136, 80, 32, 80, 136, 5, 7, 7, 6, - 0, 255, 136, 136, 136, 136, 120, 8, 112, 5, 6, 6, 6, 0, 0, 8, - 240, 32, 248, 32, 32, 5, 5, 5, 6, 0, 0, 248, 64, 120, 72, 136, - 5, 5, 5, 6, 0, 0, 248, 168, 248, 136, 136, 5, 5, 5, 6, 0, - 1, 32, 0, 248, 0, 32, 0, 0, 0, 6, 0, 0, 6, 10, 10, 6, - 0, 254, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252 -}; diff --git a/Marlin/dogm_font_data_HD44780_W.h b/Marlin/dogm_font_data_HD44780_W.h deleted file mode 100644 index 86b4bf4bff..0000000000 --- a/Marlin/dogm_font_data_HD44780_W.h +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: HD44780_W - Copyright: A.Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t HD44780_W_5x7[3034] U8G_SECTION(".progmem.HD44780_W_5x7") = { - 0, 6, 9, 0, 254, 7, 2, 79, 3, 222, 16, 255, 255, 8, 255, 7, - 255, 4, 7, 7, 6, 0, 0, 16, 48, 112, 240, 112, 48, 16, 4, 7, - 7, 6, 1, 0, 128, 192, 224, 240, 224, 192, 128, 5, 3, 3, 6, 0, - 4, 216, 72, 144, 5, 3, 3, 6, 0, 4, 216, 144, 72, 5, 7, 7, - 6, 0, 0, 32, 112, 248, 0, 32, 112, 248, 5, 7, 7, 6, 0, 0, - 248, 112, 32, 0, 248, 112, 32, 5, 5, 5, 6, 0, 1, 112, 248, 248, - 248, 112, 5, 7, 7, 6, 0, 0, 8, 8, 40, 72, 248, 64, 32, 5, - 7, 7, 6, 0, 0, 32, 112, 168, 32, 32, 32, 32, 5, 7, 7, 6, - 0, 0, 32, 32, 32, 32, 168, 112, 32, 5, 5, 5, 6, 0, 1, 32, - 64, 248, 64, 32, 5, 5, 5, 6, 0, 1, 32, 16, 248, 16, 32, 5, - 7, 7, 6, 0, 0, 16, 32, 64, 32, 16, 0, 248, 5, 7, 7, 6, - 0, 0, 64, 32, 16, 32, 64, 0, 248, 5, 5, 5, 6, 0, 1, 32, - 32, 112, 112, 248, 5, 5, 5, 6, 0, 0, 248, 112, 112, 32, 32, 0, - 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, - 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, 0, 0, - 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, 120, 160, - 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, 64, 152, - 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, 2, 3, - 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, 64, 128, - 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, 32, 64, - 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, 5, 6, - 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, 64, 128, - 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, 192, 5, - 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, - 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, 192, 64, - 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, 128, 128, - 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, 5, 7, - 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, 6, 0, - 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, 48, 64, - 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, 32, - 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, 112, 5, - 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 16, 96, 2, 5, 5, 6, - 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, 192, 0, - 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, 32, 16, - 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, 0, 128, - 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, 8, 16, - 32, 0, 32, 5, 6, 6, 6, 0, 0, 112, 136, 8, 104, 168, 112, 5, - 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, 7, 7, 6, - 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, 0, 112, - 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 224, 144, 136, 136, - 136, 144, 224, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 248, - 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, 5, 7, 7, - 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, 6, 0, 0, - 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, 16, 144, - 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, 136, 5, 7, - 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, 7, 6, 0, - 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, 136, 136, - 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 136, - 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, 128, 128, 5, - 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, 7, 7, 6, - 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, 0, 0, 120, - 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, 32, 32, 32, - 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 136, 112, - 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, 5, 7, 7, - 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, 6, 0, 0, - 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, 136, 136, 136, - 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, 64, 128, - 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, 224, 5, 5, - 5, 6, 0, 1, 128, 64, 32, 16, 8, 3, 7, 7, 6, 1, 0, 224, - 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, 32, 80, 136, 5, - 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, 128, 64, 5, 5, - 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, 0, 0, 128, - 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, 112, 128, 128, 136, - 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, 136, 120, 5, 5, - 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, 6, 0, 0, 48, - 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, 112, 136, 136, 120, - 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, 136, 136, 136, 1, - 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, 8, 8, 6, - 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, 7, 6, 0, 0, - 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, 0, 192, 64, 64, - 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, 168, 168, 168, 5, - 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, 5, 6, 0, 0, - 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, 136, 136, 240, 128, - 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, 8, 5, 5, 5, - 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, 0, 0, 112, 128, - 112, 8, 240, 5, 7, 7, 6, 0, 0, 64, 64, 224, 64, 64, 72, 48, - 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, 5, 5, 6, 0, - 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, 136, 136, 168, 168, - 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 5, 6, 6, 6, - 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, 0, 0, 248, 16, - 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, 128, 64, 64, 32, - 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, 128, 3, 7, 7, - 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 6, 6, 6, 0, 1, - 8, 40, 72, 248, 64, 32, 5, 7, 7, 6, 0, 0, 32, 80, 136, 136, - 136, 136, 248, 5, 7, 7, 6, 0, 0, 248, 136, 128, 240, 136, 136, 240, - 5, 8, 8, 6, 0, 255, 120, 40, 40, 40, 72, 136, 248, 136, 5, 7, - 7, 6, 0, 0, 168, 168, 168, 112, 168, 168, 168, 5, 7, 7, 6, 0, - 0, 240, 8, 8, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 136, 136, - 152, 168, 200, 136, 136, 5, 8, 8, 6, 0, 0, 80, 32, 136, 152, 168, - 168, 200, 136, 5, 7, 7, 6, 0, 0, 120, 40, 40, 40, 40, 168, 72, - 5, 7, 7, 6, 0, 0, 248, 136, 136, 136, 136, 136, 136, 5, 7, 7, - 6, 0, 0, 136, 136, 136, 80, 32, 64, 128, 5, 8, 8, 6, 0, 255, - 136, 136, 136, 136, 136, 136, 248, 8, 5, 7, 7, 6, 0, 0, 136, 136, - 136, 120, 8, 8, 8, 5, 7, 7, 6, 0, 0, 168, 168, 168, 168, 168, - 168, 248, 5, 8, 8, 6, 0, 255, 168, 168, 168, 168, 168, 168, 248, 8, - 5, 7, 7, 6, 0, 0, 192, 64, 64, 112, 72, 72, 112, 5, 7, 7, - 6, 0, 0, 136, 136, 136, 200, 168, 168, 200, 5, 7, 7, 6, 0, 0, - 112, 136, 40, 80, 8, 136, 112, 5, 5, 5, 6, 0, 0, 64, 160, 144, - 144, 104, 5, 7, 7, 6, 0, 0, 32, 48, 40, 40, 32, 224, 224, 5, - 7, 7, 6, 0, 0, 248, 136, 128, 128, 128, 128, 128, 5, 5, 5, 6, - 0, 0, 248, 80, 80, 80, 152, 5, 7, 7, 6, 0, 0, 248, 128, 64, - 32, 64, 128, 248, 5, 5, 5, 6, 0, 0, 120, 144, 144, 144, 96, 5, - 7, 7, 6, 0, 0, 48, 40, 56, 40, 200, 216, 24, 5, 6, 6, 6, - 0, 0, 8, 112, 160, 32, 32, 16, 5, 6, 6, 6, 0, 1, 32, 112, - 112, 112, 248, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, - 112, 5, 5, 5, 6, 0, 0, 112, 136, 136, 80, 216, 5, 7, 7, 6, - 0, 0, 48, 72, 32, 80, 136, 136, 112, 5, 3, 3, 6, 0, 2, 88, - 168, 208, 5, 6, 6, 6, 0, 0, 80, 248, 248, 248, 112, 32, 5, 5, - 5, 6, 0, 0, 112, 128, 96, 136, 112, 5, 7, 7, 6, 0, 0, 112, - 136, 136, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, 216, 216, 216, 216, - 216, 216, 216, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, - 5, 7, 7, 6, 0, 0, 32, 112, 160, 160, 168, 112, 32, 5, 7, 7, - 6, 0, 0, 48, 64, 64, 224, 64, 80, 168, 5, 5, 5, 6, 0, 0, - 136, 112, 80, 112, 136, 5, 7, 7, 6, 0, 0, 136, 80, 248, 32, 248, - 32, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 0, 128, 128, 128, 5, - 8, 8, 6, 0, 0, 48, 72, 32, 80, 80, 32, 144, 96, 5, 7, 7, - 6, 0, 0, 24, 32, 32, 112, 32, 32, 192, 5, 7, 7, 6, 0, 0, - 248, 136, 184, 184, 184, 136, 248, 5, 7, 7, 6, 0, 0, 112, 8, 120, - 136, 120, 0, 248, 5, 5, 5, 6, 0, 1, 40, 80, 160, 80, 40, 5, - 7, 7, 6, 0, 0, 144, 168, 168, 232, 168, 168, 144, 5, 7, 7, 6, - 0, 0, 120, 136, 136, 120, 40, 72, 136, 5, 7, 7, 6, 0, 0, 248, - 136, 168, 136, 152, 168, 248, 2, 3, 3, 6, 2, 4, 64, 128, 192, 4, - 5, 5, 6, 0, 3, 96, 144, 144, 144, 96, 5, 7, 7, 6, 0, 0, - 32, 32, 248, 32, 32, 0, 248, 4, 5, 5, 6, 0, 3, 96, 144, 32, - 64, 240, 3, 5, 5, 6, 0, 3, 224, 32, 224, 32, 224, 5, 8, 8, - 6, 0, 0, 224, 144, 224, 128, 144, 184, 144, 24, 5, 8, 8, 6, 0, - 255, 136, 136, 136, 136, 152, 232, 128, 128, 5, 7, 7, 6, 0, 0, 120, - 152, 152, 120, 24, 24, 24, 2, 2, 2, 6, 2, 2, 192, 192, 5, 5, - 5, 6, 0, 0, 80, 136, 168, 168, 80, 3, 5, 5, 6, 0, 3, 64, - 192, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 112, 0, - 248, 5, 5, 5, 6, 0, 1, 160, 80, 40, 80, 160, 5, 7, 7, 6, - 0, 0, 136, 144, 168, 88, 184, 8, 8, 5, 7, 7, 6, 0, 0, 136, - 144, 184, 72, 152, 32, 56, 5, 8, 8, 6, 0, 0, 192, 64, 192, 72, - 216, 56, 8, 8, 5, 7, 7, 6, 0, 0, 32, 0, 32, 64, 128, 136, - 112, 5, 8, 8, 6, 0, 0, 64, 32, 32, 80, 136, 248, 136, 136, 5, - 8, 8, 6, 0, 0, 16, 32, 32, 80, 136, 248, 136, 136, 5, 8, 8, - 6, 0, 0, 32, 80, 0, 112, 136, 248, 136, 136, 5, 8, 8, 6, 0, - 0, 104, 144, 0, 112, 136, 248, 136, 136, 5, 8, 8, 6, 0, 0, 80, - 0, 32, 80, 136, 248, 136, 136, 5, 8, 8, 6, 0, 0, 32, 80, 32, - 112, 136, 248, 136, 136, 5, 7, 7, 6, 0, 0, 56, 96, 160, 184, 224, - 160, 184, 5, 8, 8, 6, 0, 255, 112, 136, 128, 128, 136, 112, 32, 96, - 5, 8, 8, 6, 0, 0, 64, 32, 0, 248, 128, 240, 128, 248, 5, 8, - 8, 6, 0, 0, 8, 16, 0, 248, 128, 240, 128, 248, 5, 8, 8, 6, - 0, 0, 32, 80, 0, 248, 128, 240, 128, 248, 5, 7, 7, 6, 0, 0, - 80, 0, 248, 128, 240, 128, 248, 3, 8, 8, 6, 1, 0, 128, 64, 0, - 224, 64, 64, 64, 224, 3, 8, 8, 6, 1, 0, 32, 64, 0, 224, 64, - 64, 64, 224, 3, 8, 8, 6, 1, 0, 64, 160, 0, 224, 64, 64, 64, - 224, 3, 7, 7, 6, 1, 0, 160, 0, 224, 64, 64, 64, 224, 5, 7, - 7, 6, 0, 0, 112, 72, 72, 232, 72, 72, 112, 5, 8, 8, 6, 0, - 0, 104, 144, 0, 136, 200, 168, 152, 136, 5, 8, 8, 6, 0, 0, 64, - 32, 112, 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 16, 32, 112, - 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 32, 80, 0, 112, 136, - 136, 136, 112, 5, 8, 8, 6, 0, 0, 104, 144, 0, 112, 136, 136, 136, - 112, 5, 8, 8, 6, 0, 0, 80, 0, 112, 136, 136, 136, 136, 112, 5, - 5, 5, 6, 0, 1, 136, 80, 32, 80, 136, 5, 7, 7, 6, 0, 0, - 112, 32, 112, 168, 112, 32, 112, 5, 8, 8, 6, 0, 0, 64, 32, 136, - 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 16, 32, 136, 136, 136, - 136, 136, 112, 5, 8, 8, 6, 0, 0, 32, 80, 0, 136, 136, 136, 136, - 112, 5, 8, 8, 6, 0, 0, 80, 0, 136, 136, 136, 136, 136, 112, 5, - 8, 8, 6, 0, 0, 16, 32, 136, 80, 32, 32, 32, 32, 5, 8, 8, - 6, 0, 0, 192, 64, 112, 72, 72, 112, 64, 224, 5, 7, 7, 6, 0, - 0, 48, 72, 72, 112, 72, 72, 176, 5, 8, 8, 6, 0, 0, 64, 32, - 0, 112, 8, 120, 136, 120, 5, 8, 8, 6, 0, 0, 16, 32, 0, 112, - 8, 120, 136, 120, 5, 8, 8, 6, 0, 0, 32, 80, 0, 112, 8, 120, - 136, 120, 5, 8, 8, 6, 0, 0, 104, 144, 0, 112, 8, 120, 136, 120, - 5, 7, 7, 6, 0, 0, 80, 0, 112, 8, 120, 136, 120, 5, 8, 8, - 6, 0, 0, 32, 80, 32, 112, 8, 120, 136, 120, 5, 6, 6, 6, 0, - 0, 208, 40, 120, 160, 168, 80, 5, 6, 6, 6, 0, 255, 112, 128, 136, - 112, 32, 96, 5, 8, 8, 6, 0, 0, 64, 32, 0, 112, 136, 248, 128, - 112, 5, 8, 8, 6, 0, 0, 16, 32, 0, 112, 136, 248, 128, 112, 5, - 8, 8, 6, 0, 0, 32, 80, 0, 112, 136, 248, 128, 112, 5, 7, 7, - 6, 0, 0, 80, 0, 112, 136, 248, 128, 112, 3, 8, 8, 6, 1, 0, - 128, 64, 0, 64, 192, 64, 64, 224, 3, 8, 8, 6, 1, 0, 32, 64, - 0, 64, 192, 64, 64, 224, 3, 8, 8, 6, 1, 0, 64, 160, 0, 64, - 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, 160, 0, 64, 192, 64, 64, - 224, 5, 7, 7, 6, 0, 0, 160, 64, 160, 16, 120, 136, 112, 5, 8, - 8, 6, 0, 0, 104, 144, 0, 176, 200, 136, 136, 136, 5, 8, 8, 6, - 0, 0, 64, 32, 0, 112, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, - 16, 32, 0, 112, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 32, 80, - 0, 112, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 104, 144, 0, 112, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 80, 0, 112, 136, 136, 136, - 112, 5, 5, 5, 6, 0, 1, 32, 0, 248, 0, 32, 5, 7, 7, 6, - 0, 0, 16, 32, 112, 168, 112, 32, 64, 5, 8, 8, 6, 0, 0, 64, - 32, 0, 136, 136, 136, 152, 104, 5, 8, 8, 6, 0, 0, 16, 32, 0, - 136, 136, 136, 152, 104, 5, 8, 8, 6, 0, 0, 32, 80, 0, 136, 136, - 136, 152, 104, 5, 7, 7, 6, 0, 0, 80, 0, 136, 136, 136, 152, 104, - 5, 9, 9, 6, 0, 255, 16, 32, 0, 136, 136, 136, 248, 8, 112, 4, - 7, 7, 6, 1, 0, 192, 64, 96, 80, 96, 64, 224, 5, 8, 8, 6, - 0, 255, 80, 0, 136, 136, 136, 248, 8, 112 -}; diff --git a/Marlin/dogm_font_data_ISO10646_1.h b/Marlin/dogm_font_data_ISO10646_1.h deleted file mode 100644 index 5e12ea86ff..0000000000 --- a/Marlin/dogm_font_data_ISO10646_1.h +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: ISO10646-1 - Copyright: A.Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include - -#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) - - // - // Reduced font (only symbols 32 - 127) - About 1400 bytes smaller - // - const u8g_fntpgm_uint8_t ISO10646_1_5x7[] U8G_SECTION(".progmem.ISO10646_1_5x7") = { - 0,6,9,0,254,7,1,146,3,33,32,127,255,7,255,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,136,136,136,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 112,128,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,8,112,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,7,7,6,0,0,112,136,8,104,168, - 168,112,5,7,7,6,0,0,112,136,136,248,136,136,136,5, - 7,7,6,0,0,240,136,136,240,136,136,240,5,7,7,6, - 0,0,112,136,128,128,128,136,112,5,7,7,6,0,0,240, - 136,136,136,136,136,240,5,7,7,6,0,0,248,128,128,240, - 128,128,248,5,7,7,6,0,0,248,128,128,240,128,128,128, - 5,7,7,6,0,0,112,136,128,184,136,136,112,5,7,7, - 6,0,0,136,136,136,248,136,136,136,1,7,7,6,2,0, - 128,128,128,128,128,128,128,5,7,7,6,0,0,56,16,16, - 16,16,144,96,5,7,7,6,0,0,136,144,160,192,160,144, - 136,5,7,7,6,0,0,128,128,128,128,128,128,248,5,7, - 7,6,0,0,136,216,168,136,136,136,136,5,7,7,6,0, - 0,136,136,200,168,152,136,136,5,7,7,6,0,0,112,136, - 136,136,136,136,112,5,7,7,6,0,0,240,136,136,240,128, - 128,128,5,7,7,6,0,0,112,136,136,136,168,144,104,5, - 7,7,6,0,0,240,136,136,240,160,144,136,5,7,7,6, - 0,0,120,128,128,112,8,8,240,5,7,7,6,0,0,248, - 32,32,32,32,32,32,5,7,7,6,0,0,136,136,136,136, - 136,136,112,5,7,7,6,0,0,136,136,136,136,136,80,32, - 5,7,7,6,0,0,136,136,136,136,136,168,80,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 136,136,136,80,32,32,32,5,7,7,6,0,0,248,8,16, - 32,64,128,248,3,7,7,6,1,0,224,128,128,128,128,128, - 224,5,5,5,6,0,1,128,64,32,16,8,3,7,7,6, - 1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,32, - 80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,128, - 64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,6, - 0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,112, - 128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,136, - 120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,6, - 0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,112, - 136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,136, - 136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,3, - 8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,7, - 6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,0, - 192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,168, - 168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,5, - 6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,136, - 136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,8, - 5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,0, - 0,112,128,112,8,240,4,7,7,6,0,0,64,64,224,64, - 64,64,48,5,5,5,6,0,0,136,136,136,152,104,5,5, - 5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,136, - 136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,5, - 6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,0, - 0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,128, - 64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,128, - 3,7,7,6,1,0,128,64,64,32,64,64,128,5,2,2, - 6,0,2,104,144,0,0,0,6,0,0}; - -#else - - // - // Extended (original) font (symbols 32 - 255) - // - const u8g_fntpgm_uint8_t ISO10646_1_5x7[] U8G_SECTION(".progmem.ISO10646_1_5x7") = { - 0, 6, 9, 0, 254, 7, 1, 146, 3, 33, 32, 255, 255, 8, 255, 7, - 255, 0, 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 136, 136, 136, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 112, 128, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 8, 112, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 7, 7, 6, 0, 0, 112, 136, 8, 104, 168, - 168, 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, - 7, 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, - 0, 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 240, - 136, 136, 136, 136, 136, 240, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, - 5, 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, - 6, 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, - 128, 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, - 16, 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, - 136, 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, - 7, 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, - 0, 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, - 136, 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, - 128, 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, - 7, 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, - 0, 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, - 32, 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, - 136, 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, - 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, - 6, 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 64, 128, 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, - 224, 5, 5, 5, 6, 0, 1, 128, 64, 32, 16, 8, 3, 7, 7, 6, - 1, 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, 32, - 80, 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, 128, - 64, 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, - 0, 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, 112, - 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, 136, - 120, 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, 6, - 0, 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, 112, - 136, 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, 136, - 136, 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, - 8, 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, 7, - 6, 0, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, 0, - 192, 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, 168, - 168, 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, 5, - 6, 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, 136, - 136, 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, 8, - 5, 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, 0, - 0, 112, 128, 112, 8, 240, 4, 7, 7, 6, 0, 0, 64, 64, 224, 64, - 64, 64, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, 5, - 5, 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, 136, - 136, 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 5, - 6, 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, 0, - 0, 248, 16, 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, 128, - 64, 64, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, 128, - 3, 7, 7, 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 2, 2, - 6, 0, 2, 104, 144, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, - 0, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 5, 7, - 7, 6, 0, 0, 32, 112, 168, 160, 168, 112, 32, 5, 7, 7, 6, 0, - 0, 48, 64, 64, 224, 64, 80, 168, 5, 5, 5, 6, 0, 0, 136, 112, - 80, 112, 136, 5, 7, 7, 6, 0, 0, 136, 80, 32, 248, 32, 248, 32, - 1, 7, 7, 6, 2, 0, 128, 128, 128, 0, 128, 128, 128, 5, 8, 8, - 6, 0, 0, 48, 72, 32, 80, 80, 32, 144, 96, 3, 1, 1, 6, 1, - 7, 160, 5, 7, 7, 6, 0, 0, 248, 136, 184, 184, 184, 136, 248, 5, - 7, 7, 6, 0, 1, 112, 8, 120, 136, 120, 0, 248, 5, 5, 5, 6, - 0, 1, 40, 80, 160, 80, 40, 5, 3, 3, 6, 0, 1, 248, 8, 8, - 2, 2, 2, 6, 2, 6, 64, 128, 5, 7, 7, 6, 0, 0, 248, 136, - 168, 136, 152, 168, 248, 5, 1, 1, 6, 0, 6, 248, 4, 4, 4, 6, - 0, 3, 96, 144, 144, 96, 5, 7, 7, 6, 0, 0, 32, 32, 248, 32, - 32, 0, 248, 4, 5, 5, 6, 0, 3, 96, 144, 32, 64, 240, 3, 5, - 5, 6, 0, 3, 224, 32, 224, 32, 224, 2, 2, 2, 6, 2, 6, 64, - 128, 5, 8, 8, 6, 0, 255, 136, 136, 136, 136, 152, 232, 128, 128, 5, - 7, 7, 6, 0, 0, 120, 152, 152, 120, 24, 24, 24, 2, 2, 2, 6, - 2, 2, 192, 192, 2, 2, 2, 6, 2, 255, 64, 128, 3, 5, 5, 6, - 0, 3, 64, 192, 64, 64, 224, 5, 7, 7, 6, 0, 1, 112, 136, 136, - 136, 112, 0, 248, 5, 5, 5, 6, 0, 1, 160, 80, 40, 80, 160, 5, - 7, 7, 6, 0, 0, 136, 144, 168, 88, 184, 8, 8, 5, 7, 7, 6, - 0, 0, 136, 144, 184, 72, 152, 32, 56, 5, 8, 8, 6, 0, 0, 192, - 64, 192, 72, 216, 56, 8, 8, 5, 7, 7, 6, 0, 0, 32, 0, 32, - 64, 128, 136, 112, 5, 8, 8, 6, 0, 0, 64, 32, 0, 112, 136, 248, - 136, 136, 5, 8, 8, 6, 0, 0, 16, 32, 0, 112, 136, 248, 136, 136, - 5, 8, 8, 6, 0, 0, 32, 80, 0, 112, 136, 248, 136, 136, 5, 8, - 8, 6, 0, 0, 104, 144, 0, 112, 136, 248, 136, 136, 5, 8, 8, 6, - 0, 0, 80, 0, 112, 136, 136, 248, 136, 136, 5, 8, 8, 6, 0, 0, - 32, 80, 32, 112, 136, 248, 136, 136, 5, 7, 7, 6, 0, 0, 56, 96, - 160, 184, 224, 160, 184, 5, 8, 8, 6, 0, 255, 112, 136, 128, 128, 136, - 112, 32, 96, 5, 8, 8, 6, 0, 0, 64, 32, 0, 248, 128, 240, 128, - 248, 5, 8, 8, 6, 0, 0, 8, 16, 0, 248, 128, 240, 128, 248, 5, - 8, 8, 6, 0, 0, 32, 80, 0, 248, 128, 240, 128, 248, 5, 7, 7, - 6, 0, 0, 80, 0, 248, 128, 240, 128, 248, 3, 8, 8, 6, 1, 0, - 128, 64, 0, 224, 64, 64, 64, 224, 3, 8, 8, 6, 1, 0, 32, 64, - 0, 224, 64, 64, 64, 224, 3, 8, 8, 6, 1, 0, 64, 160, 0, 224, - 64, 64, 64, 224, 3, 7, 7, 6, 1, 0, 160, 0, 224, 64, 64, 64, - 224, 5, 7, 7, 6, 0, 0, 112, 72, 72, 232, 72, 72, 112, 5, 8, - 8, 6, 0, 0, 104, 144, 0, 136, 200, 168, 152, 136, 5, 8, 8, 6, - 0, 0, 64, 32, 112, 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, - 16, 32, 112, 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 32, 80, - 0, 112, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 104, 144, 0, 112, - 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 80, 0, 112, 136, 136, 136, - 136, 112, 5, 5, 5, 6, 0, 1, 136, 80, 32, 80, 136, 5, 8, 8, - 6, 0, 255, 16, 112, 168, 168, 168, 168, 112, 64, 5, 8, 8, 6, 0, - 0, 64, 32, 136, 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 16, - 32, 136, 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 32, 80, 0, - 136, 136, 136, 136, 112, 5, 8, 8, 6, 0, 0, 80, 0, 136, 136, 136, - 136, 136, 112, 5, 8, 8, 6, 0, 0, 16, 32, 136, 80, 32, 32, 32, - 32, 5, 9, 9, 6, 0, 255, 192, 64, 112, 72, 72, 112, 64, 64, 224, - 4, 8, 8, 6, 1, 255, 96, 144, 144, 160, 144, 144, 224, 128, 5, 8, - 8, 6, 0, 0, 64, 32, 0, 112, 8, 120, 136, 120, 5, 8, 8, 6, - 0, 0, 16, 32, 0, 112, 8, 120, 136, 120, 5, 8, 8, 6, 0, 0, - 32, 80, 0, 112, 8, 120, 136, 120, 5, 8, 8, 6, 0, 0, 104, 144, - 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, 0, 0, 80, 0, 112, 8, - 120, 136, 120, 5, 8, 8, 6, 0, 0, 32, 80, 32, 112, 8, 120, 136, - 120, 5, 6, 6, 6, 0, 0, 208, 40, 120, 160, 168, 80, 5, 6, 6, - 6, 0, 255, 112, 128, 136, 112, 32, 96, 5, 8, 8, 6, 0, 0, 64, - 32, 0, 112, 136, 248, 128, 112, 5, 8, 8, 6, 0, 0, 16, 32, 0, - 112, 136, 248, 128, 112, 5, 8, 8, 6, 0, 0, 32, 80, 0, 112, 136, - 248, 128, 112, 5, 7, 7, 6, 0, 0, 80, 0, 112, 136, 248, 128, 112, - 3, 8, 8, 6, 1, 0, 128, 64, 0, 64, 192, 64, 64, 224, 3, 8, - 8, 6, 1, 0, 32, 64, 0, 64, 192, 64, 64, 224, 3, 8, 8, 6, - 1, 0, 64, 160, 0, 64, 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, - 160, 0, 64, 192, 64, 64, 224, 5, 7, 7, 6, 0, 0, 160, 64, 160, - 16, 120, 136, 112, 5, 8, 8, 6, 0, 0, 104, 144, 0, 176, 200, 136, - 136, 136, 5, 8, 8, 6, 0, 0, 64, 32, 0, 112, 136, 136, 136, 112, - 5, 8, 8, 6, 0, 0, 16, 32, 0, 112, 136, 136, 136, 112, 5, 8, - 8, 6, 0, 0, 32, 80, 0, 112, 136, 136, 136, 112, 5, 8, 8, 6, - 0, 0, 104, 144, 0, 112, 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, - 80, 0, 112, 136, 136, 136, 112, 5, 5, 5, 6, 0, 1, 32, 0, 248, - 0, 32, 5, 7, 7, 6, 0, 255, 16, 112, 168, 168, 168, 112, 64, 5, - 8, 8, 6, 0, 0, 64, 32, 0, 136, 136, 136, 152, 104, 5, 8, 8, - 6, 0, 0, 16, 32, 0, 136, 136, 136, 152, 104, 5, 8, 8, 6, 0, - 0, 32, 80, 0, 136, 136, 136, 152, 104, 5, 7, 7, 6, 0, 0, 80, - 0, 136, 136, 136, 152, 104, 5, 9, 9, 6, 0, 255, 16, 32, 0, 136, - 136, 136, 248, 8, 112, 4, 7, 7, 6, 1, 255, 192, 64, 96, 80, 96, - 64, 224, 5, 8, 8, 6, 0, 255, 80, 0, 136, 136, 136, 120, 8, 112 - }; - -#endif diff --git a/Marlin/dogm_font_data_ISO10646_1_PL.h b/Marlin/dogm_font_data_ISO10646_1_PL.h deleted file mode 100644 index 47b0bbb065..0000000000 --- a/Marlin/dogm_font_data_ISO10646_1_PL.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - Fontname: ISO10646-1-PL - Copyright: A.Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-2 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_1_PL_5x7[2732] U8G_FONT_SECTION(".progmem.ISO10646_1_PL_5x7") = { - 0,6,9,0,254,7,1,146,3,33,32,255,255,8,254,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,136,136,136,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 112,128,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,8,112,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,7,7,6,0,0,112,136,8,104,168, - 168,112,5,7,7,6,0,0,112,136,136,248,136,136,136,5, - 7,7,6,0,0,240,136,136,240,136,136,240,5,7,7,6, - 0,0,112,136,128,128,128,136,112,5,7,7,6,0,0,240, - 136,136,136,136,136,240,5,7,7,6,0,0,248,128,128,240, - 128,128,248,5,7,7,6,0,0,248,128,128,240,128,128,128, - 5,7,7,6,0,0,112,136,128,184,136,136,112,5,7,7, - 6,0,0,136,136,136,248,136,136,136,1,7,7,6,2,0, - 128,128,128,128,128,128,128,5,7,7,6,0,0,56,16,16, - 16,16,144,96,5,7,7,6,0,0,136,144,160,192,160,144, - 136,5,7,7,6,0,0,128,128,128,128,128,128,248,5,7, - 7,6,0,0,136,216,168,136,136,136,136,5,7,7,6,0, - 0,136,136,200,168,152,136,136,5,7,7,6,0,0,112,136, - 136,136,136,136,112,5,7,7,6,0,0,240,136,136,240,128, - 128,128,5,7,7,6,0,0,112,136,136,136,168,144,104,5, - 7,7,6,0,0,240,136,136,240,160,144,136,5,7,7,6, - 0,0,120,128,128,112,8,8,240,5,7,7,6,0,0,248, - 32,32,32,32,32,32,5,7,7,6,0,0,136,136,136,136, - 136,136,112,5,7,7,6,0,0,136,136,136,136,136,80,32, - 5,7,7,6,0,0,136,136,136,136,136,168,80,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 136,136,136,80,32,32,32,5,7,7,6,0,0,248,8,16, - 32,64,128,248,3,7,7,6,1,0,224,128,128,128,128,128, - 224,5,5,5,6,0,1,128,64,32,16,8,3,7,7,6, - 1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,32, - 80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,128, - 64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,6, - 0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,112, - 128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,136, - 120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,6, - 0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,112, - 136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,136, - 136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,3, - 8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,7, - 6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,0, - 192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,168, - 168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,5, - 6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,136, - 136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,8, - 5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,0, - 0,112,128,112,8,240,4,7,7,6,0,0,64,64,224,64, - 64,64,48,5,5,5,6,0,0,136,136,136,152,104,5,5, - 5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,136, - 136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,5, - 6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,0, - 0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,128, - 64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,128, - 3,7,7,6,1,0,128,64,64,32,64,64,128,5,2,2, - 6,0,2,104,144,0,0,0,6,0,0,5,9,9,6,0, - 254,112,136,136,248,136,136,136,16,32,5,7,7,6,0,254, - 112,8,120,136,120,16,32,5,8,8,6,0,0,16,32,112, - 136,128,128,136,112,5,7,7,6,0,0,16,32,112,128,128, - 136,112,5,9,9,6,0,254,248,128,128,240,128,128,248,8, - 16,5,7,7,6,0,254,112,136,248,128,112,16,32,5,7, - 7,6,0,0,128,144,160,192,128,128,248,5,7,7,6,0, - 0,96,40,48,96,160,32,112,5,8,8,6,0,0,16,168, - 136,200,168,152,136,136,5,8,8,6,0,0,8,16,0,176, - 200,136,136,136,5,8,8,6,0,0,16,32,112,136,136,136, - 136,112,5,8,8,6,0,0,16,32,0,112,136,136,136,112, - 5,8,8,6,0,0,16,120,128,128,112,8,8,240,5,8, - 8,6,0,0,16,32,0,112,128,112,8,240,5,8,8,6, - 0,0,32,248,8,16,32,64,128,248,5,8,8,6,0,0, - 16,32,0,248,16,32,64,248,5,7,7,6,0,0,248,8, - 16,248,64,128,248,5,8,8,6,0,0,48,48,0,248,16, - 32,64,248,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,1,7,7, - 6,2,0,128,0,128,128,128,128,128,5,7,7,6,0,0, - 32,112,168,160,168,112,32,5,7,7,6,0,0,48,64,64, - 224,64,80,168,5,5,5,6,0,0,136,112,80,112,136,5, - 7,7,6,0,0,136,80,32,248,32,248,32,1,7,7,6, - 2,0,128,128,128,0,128,128,128,5,8,8,6,0,0,48, - 72,32,80,80,32,144,96,3,1,1,6,1,7,160,5,7, - 7,6,0,0,248,136,184,184,184,136,248,5,7,7,6,0, - 1,112,8,120,136,120,0,248,5,5,5,6,0,1,40,80, - 160,80,40,5,3,3,6,0,1,248,8,8,2,2,2,6, - 2,6,64,128,5,7,7,6,0,0,248,136,168,136,152,168, - 248,5,1,1,6,0,6,248,4,4,4,6,0,3,96,144, - 144,96,5,7,7,6,0,0,32,32,248,32,32,0,248,4, - 5,5,6,0,3,96,144,32,64,240,3,5,5,6,0,3, - 224,32,224,32,224,2,2,2,6,2,6,64,128,5,8,8, - 6,0,255,136,136,136,136,152,232,128,128,5,7,7,6,0, - 0,120,152,152,120,24,24,24,2,2,2,6,2,2,192,192, - 2,2,2,6,2,255,64,128,3,5,5,6,0,3,64,192, - 64,64,224,5,7,7,6,0,1,112,136,136,136,112,0,248, - 5,5,5,6,0,1,160,80,40,80,160,5,7,7,6,0, - 0,136,144,168,88,184,8,8,5,7,7,6,0,0,136,144, - 184,72,152,32,56,5,8,8,6,0,0,192,64,192,72,216, - 56,8,8,5,7,7,6,0,0,32,0,32,64,128,136,112, - 5,8,8,6,0,0,64,32,0,112,136,248,136,136,5,8, - 8,6,0,0,16,32,0,112,136,248,136,136,5,8,8,6, - 0,0,32,80,0,112,136,248,136,136,5,8,8,6,0,0, - 104,144,0,112,136,248,136,136,5,8,8,6,0,0,80,0, - 112,136,136,248,136,136,5,8,8,6,0,0,32,80,32,112, - 136,248,136,136,5,7,7,6,0,0,56,96,160,184,224,160, - 184,5,8,8,6,0,255,112,136,128,128,136,112,32,96,5, - 8,8,6,0,0,64,32,0,248,128,240,128,248,5,8,8, - 6,0,0,8,16,0,248,128,240,128,248,5,8,8,6,0, - 0,32,80,0,248,128,240,128,248,5,7,7,6,0,0,80, - 0,248,128,240,128,248,3,8,8,6,1,0,128,64,0,224, - 64,64,64,224,3,8,8,6,1,0,32,64,0,224,64,64, - 64,224,3,8,8,6,1,0,64,160,0,224,64,64,64,224, - 3,7,7,6,1,0,160,0,224,64,64,64,224,5,7,7, - 6,0,0,112,72,72,232,72,72,112,5,8,8,6,0,0, - 104,144,0,136,200,168,152,136,5,8,8,6,0,0,64,32, - 112,136,136,136,136,112,5,8,8,6,0,0,16,32,112,136, - 136,136,136,112,5,8,8,6,0,0,32,80,0,112,136,136, - 136,112,5,8,8,6,0,0,104,144,0,112,136,136,136,112, - 5,8,8,6,0,0,80,0,112,136,136,136,136,112,5,5, - 5,6,0,1,136,80,32,80,136,5,8,8,6,0,255,16, - 112,168,168,168,168,112,64,5,8,8,6,0,0,64,32,136, - 136,136,136,136,112,5,8,8,6,0,0,16,32,136,136,136, - 136,136,112,5,8,8,6,0,0,32,80,0,136,136,136,136, - 112,5,8,8,6,0,0,80,0,136,136,136,136,136,112,5, - 8,8,6,0,0,16,32,136,80,32,32,32,32,5,9,9, - 6,0,255,192,64,112,72,72,112,64,64,224,4,8,8,6, - 1,255,96,144,144,160,144,144,224,128,5,8,8,6,0,0, - 64,32,0,112,8,120,136,120,5,8,8,6,0,0,16,32, - 0,112,8,120,136,120,5,8,8,6,0,0,32,80,0,112, - 8,120,136,120,5,8,8,6,0,0,104,144,0,112,8,120, - 136,120,5,7,7,6,0,0,80,0,112,8,120,136,120,5, - 8,8,6,0,0,32,80,32,112,8,120,136,120,5,6,6, - 6,0,0,208,40,120,160,168,80,5,6,6,6,0,255,112, - 128,136,112,32,96,5,8,8,6,0,0,64,32,0,112,136, - 248,128,112,5,8,8,6,0,0,16,32,0,112,136,248,128, - 112,5,8,8,6,0,0,32,80,0,112,136,248,128,112,5, - 7,7,6,0,0,80,0,112,136,248,128,112,3,8,8,6, - 1,0,128,64,0,64,192,64,64,224,3,8,8,6,1,0, - 32,64,0,64,192,64,64,224,3,8,8,6,1,0,64,160, - 0,64,192,64,64,224,3,7,7,6,1,0,160,0,64,192, - 64,64,224,5,7,7,6,0,0,160,64,160,16,120,136,112, - 5,8,8,6,0,0,104,144,0,176,200,136,136,136,5,8, - 8,6,0,0,64,32,0,112,136,136,136,112,5,8,8,6, - 0,0,16,32,0,112,136,136,136,112,5,8,8,6,0,0, - 32,80,0,112,136,136,136,112,5,8,8,6,0,0,104,144, - 0,112,136,136,136,112,5,7,7,6,0,0,80,0,112,136, - 136,136,112,5,5,5,6,0,1,32,0,248,0,32,5,7, - 7,6,0,255,16,112,168,168,168,112,64,5,8,8,6,0, - 0,64,32,0,136,136,136,152,104,5,8,8,6,0,0,16, - 32,0,136,136,136,152,104,5,8,8,6,0,0,32,80,0, - 136,136,136,152,104,5,7,7,6,0,0,80,0,136,136,136, - 152,104,5,9,9,6,0,255,16,32,0,136,136,136,248,8, - 112,4,7,7,6,1,255,192,64,96,80,96,64,224,5,8, - 8,6,0,255,80,0,136,136,136,120,8,112}; diff --git a/Marlin/dogm_font_data_ISO10646_1_tr.h b/Marlin/dogm_font_data_ISO10646_1_tr.h deleted file mode 100644 index e32f59f958..0000000000 --- a/Marlin/dogm_font_data_ISO10646_1_tr.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/* - Fontname: ISO10646-1-tr - Copyright: public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_TR[2591] U8G_SECTION(".progmem.ISO10646_TR") = { - 0,6,9,0,254,7,1,146,3,33,32,255,255,8,255,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,136,136,136,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 112,128,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,8,112,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,7,7,6,0,0,112,136,8,104,168, - 168,112,5,7,7,6,0,0,112,136,136,248,136,136,136,5, - 7,7,6,0,0,240,136,136,240,136,136,240,5,7,7,6, - 0,0,112,136,128,128,128,136,112,5,7,7,6,0,0,240, - 136,136,136,136,136,240,5,7,7,6,0,0,248,128,128,240, - 128,128,248,5,7,7,6,0,0,248,128,128,240,128,128,128, - 5,7,7,6,0,0,112,136,128,184,136,136,112,5,7,7, - 6,0,0,136,136,136,248,136,136,136,1,7,7,6,2,0, - 128,128,128,128,128,128,128,5,7,7,6,0,0,56,16,16, - 16,16,144,96,5,7,7,6,0,0,136,144,160,192,160,144, - 136,5,7,7,6,0,0,128,128,128,128,128,128,248,5,7, - 7,6,0,0,136,216,168,136,136,136,136,5,7,7,6,0, - 0,136,136,200,168,152,136,136,5,7,7,6,0,0,112,136, - 136,136,136,136,112,5,7,7,6,0,0,240,136,136,240,128, - 128,128,5,7,7,6,0,0,112,136,136,136,168,144,104,5, - 7,7,6,0,0,240,136,136,240,160,144,136,5,7,7,6, - 0,0,120,128,128,112,8,8,240,5,7,7,6,0,0,248, - 32,32,32,32,32,32,5,7,7,6,0,0,136,136,136,136, - 136,136,112,5,7,7,6,0,0,136,136,136,136,136,80,32, - 5,7,7,6,0,0,136,136,136,136,136,168,80,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 136,136,136,80,32,32,32,5,7,7,6,0,0,248,8,16, - 32,64,128,248,3,7,7,6,1,0,224,128,128,128,128,128, - 224,5,5,5,6,0,1,128,64,32,16,8,3,7,7,6, - 1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,32, - 80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,128, - 64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,6, - 0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,112, - 128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,136, - 120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,6, - 0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,112, - 136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,136, - 136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,3, - 8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,7, - 6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,0, - 192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,168, - 168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,5, - 6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,136, - 136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,8, - 5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,0, - 0,112,128,112,8,240,4,7,7,6,0,0,64,64,224,64, - 64,64,48,5,5,5,6,0,0,136,136,136,152,104,5,5, - 5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,136, - 136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,5, - 6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,0, - 0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,128, - 64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,128, - 3,7,7,6,1,0,128,64,64,32,64,64,128,5,2,2, - 6,0,2,104,144,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,1,7,7,6,2,0,128,0,128,128,128,128,128,5,7, - 7,6,0,0,32,112,168,160,168,112,32,5,7,7,6,0, - 0,48,64,64,224,64,80,168,5,5,5,6,0,0,136,112, - 80,112,136,5,7,7,6,0,0,136,80,32,248,32,248,32, - 1,7,7,6,2,0,128,128,128,0,128,128,128,5,8,8, - 6,0,0,48,72,32,80,80,32,144,96,3,1,1,6,1, - 7,160,5,7,7,6,0,0,248,136,184,184,184,136,248,5, - 7,7,6,0,1,112,8,120,136,120,0,248,5,5,5,6, - 0,1,40,80,160,80,40,5,3,3,6,0,1,248,8,8, - 2,2,2,6,2,6,64,128,5,7,7,6,0,0,248,136, - 168,136,152,168,248,5,1,1,6,0,6,248,4,4,4,6, - 0,3,96,144,144,96,5,7,7,6,0,0,32,32,248,32, - 32,0,248,4,5,5,6,0,3,96,144,32,64,240,3,5, - 5,6,0,3,224,32,224,32,224,2,2,2,6,2,6,64, - 128,5,8,8,6,0,255,136,136,136,136,152,232,128,128,5, - 7,7,6,0,0,120,152,152,120,24,24,24,2,2,2,6, - 2,2,192,192,2,2,2,6,2,255,64,128,3,5,5,6, - 0,3,64,192,64,64,224,5,7,7,6,0,1,112,136,136, - 136,112,0,248,5,5,5,6,0,1,160,80,40,80,160,5, - 7,7,6,0,0,136,144,168,88,184,8,8,5,7,7,6, - 0,0,136,144,184,72,152,32,56,5,8,8,6,0,0,192, - 64,192,72,216,56,8,8,5,7,7,6,0,0,32,0,32, - 64,128,136,112,5,8,8,6,0,0,64,32,0,112,136,248, - 136,136,5,8,8,6,0,0,16,32,0,112,136,248,136,136, - 5,8,8,6,0,0,32,80,0,112,136,248,136,136,5,8, - 8,6,0,0,104,144,0,112,136,248,136,136,5,8,8,6, - 0,0,80,0,112,136,136,248,136,136,5,8,8,6,0,0, - 32,80,32,112,136,248,136,136,5,7,7,6,0,0,56,96, - 160,184,224,160,184,5,8,8,6,0,255,112,136,128,128,136, - 112,32,96,5,8,8,6,0,0,64,32,0,248,128,240,128, - 248,5,8,8,6,0,0,8,16,0,248,128,240,128,248,5, - 8,8,6,0,0,32,80,0,248,128,240,128,248,5,7,7, - 6,0,0,80,0,248,128,240,128,248,3,8,8,6,1,0, - 128,64,0,224,64,64,64,224,3,8,8,6,1,0,32,64, - 0,224,64,64,64,224,3,8,8,6,1,0,64,160,0,224, - 64,64,64,224,3,7,7,6,1,0,160,0,224,64,64,64, - 224,5,9,9,6,0,255,80,32,112,136,128,184,136,136,112, - 5,8,8,6,0,0,104,144,0,136,200,168,152,136,5,8, - 8,6,0,0,64,32,112,136,136,136,136,112,5,8,8,6, - 0,0,16,32,112,136,136,136,136,112,5,8,8,6,0,0, - 32,80,0,112,136,136,136,112,5,8,8,6,0,0,104,144, - 0,112,136,136,136,112,5,8,8,6,0,0,80,0,112,136, - 136,136,136,112,5,5,5,6,0,1,136,80,32,80,136,5, - 8,8,6,0,255,16,112,168,168,168,168,112,64,5,8,8, - 6,0,0,64,32,136,136,136,136,136,112,5,8,8,6,0, - 0,16,32,136,136,136,136,136,112,5,8,8,6,0,0,32, - 80,0,136,136,136,136,112,5,8,8,6,0,0,80,0,136, - 136,136,136,136,112,1,7,7,6,2,0,128,0,128,128,128, - 128,128,5,9,9,6,0,255,120,128,128,112,8,8,240,32, - 96,4,8,8,6,1,255,96,144,144,160,144,144,224,128,5, - 8,8,6,0,0,64,32,0,112,8,120,136,120,5,8,8, - 6,0,0,16,32,0,112,8,120,136,120,5,8,8,6,0, - 0,32,80,0,112,8,120,136,120,5,8,8,6,0,0,104, - 144,0,112,8,120,136,120,5,7,7,6,0,0,80,0,112, - 8,120,136,120,5,8,8,6,0,0,32,80,32,112,8,120, - 136,120,5,6,6,6,0,0,208,40,120,160,168,80,5,7, - 7,6,0,255,112,128,128,136,112,32,96,5,8,8,6,0, - 0,64,32,0,112,136,248,128,112,5,8,8,6,0,0,16, - 32,0,112,136,248,128,112,5,8,8,6,0,0,32,80,0, - 112,136,248,128,112,5,7,7,6,0,0,80,0,112,136,248, - 128,112,3,8,8,6,1,0,128,64,0,64,192,64,64,224, - 3,8,8,6,1,0,32,64,0,64,192,64,64,224,3,8, - 8,6,1,0,64,160,0,64,192,64,64,224,3,7,7,6, - 1,0,160,0,64,192,64,64,224,5,8,8,6,0,255,80, - 32,112,136,136,120,8,112,5,8,8,6,0,0,104,144,0, - 176,200,136,136,136,5,8,8,6,0,0,64,32,0,112,136, - 136,136,112,5,8,8,6,0,0,16,32,0,112,136,136,136, - 112,5,8,8,6,0,0,32,80,0,112,136,136,136,112,5, - 8,8,6,0,0,104,144,0,112,136,136,136,112,5,7,7, - 6,0,0,80,0,112,136,136,136,112,5,5,5,6,0,1, - 32,0,248,0,32,5,7,7,6,0,255,16,112,168,168,168, - 112,64,5,8,8,6,0,0,64,32,0,136,136,136,152,104, - 5,8,8,6,0,0,16,32,0,136,136,136,152,104,5,8, - 8,6,0,0,32,80,0,136,136,136,152,104,5,7,7,6, - 0,0,80,0,136,136,136,152,104,1,5,5,6,2,0,128, - 128,128,128,128,5,7,7,6,0,255,112,128,112,8,240,32, - 96,5,8,8,6,0,255,80,0,136,136,136,120,8,112}; diff --git a/Marlin/dogm_font_data_ISO10646_5_Cyrillic.h b/Marlin/dogm_font_data_ISO10646_5_Cyrillic.h deleted file mode 100644 index 75e779fd0f..0000000000 --- a/Marlin/dogm_font_data_ISO10646_5_Cyrillic.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: ISO10646_5_Cyrillic - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_5_Cyrillic_5x7[2560] U8G_SECTION(".progmem.ISO10646_5_Cyrillic_5x7") = { - 0, 6, 9, 0, 254, 7, 1, 145, 3, 32, 32, 255, 255, 8, 255, 7, - 255, 0, 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 48, 64, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 16, 96, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 6, 6, 6, 0, 0, 112, 136, 8, 104, 168, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, - 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 224, 144, - 136, 136, 136, 144, 224, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, - 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, 5, - 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, 6, - 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, - 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, - 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, 136, - 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, 7, - 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, 136, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, 128, - 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, 0, - 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, 32, - 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, - 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, 5, - 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, 6, - 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, 136, - 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, - 64, 128, 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, 224, - 5, 5, 5, 6, 0, 1, 128, 64, 32, 16, 8, 3, 7, 7, 6, 1, - 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, 32, 80, - 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, 128, 64, - 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, 0, - 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, 112, 128, - 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, 136, 120, - 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, 6, 0, - 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, 112, 136, - 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, 136, 136, - 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, 8, - 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, 7, 6, - 0, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, 0, 192, - 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, 168, 168, - 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, 5, 6, - 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, 136, 136, - 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, 8, 5, - 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, 0, 0, - 112, 128, 112, 8, 240, 5, 7, 7, 6, 0, 0, 64, 64, 224, 64, 64, - 72, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, 5, 5, - 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, 136, 136, - 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 5, 6, - 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, 0, 0, - 248, 16, 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, 128, 64, - 64, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, 128, 3, - 7, 7, 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 2, 2, 6, - 0, 3, 104, 144, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 5, 8, 8, 6, 0, 0, - 64, 248, 128, 128, 240, 128, 128, 248, 5, 8, 8, 6, 0, 0, 80, 248, - 128, 128, 240, 128, 128, 248, 5, 7, 7, 6, 0, 0, 224, 64, 64, 112, - 72, 72, 112, 5, 8, 8, 6, 0, 0, 16, 32, 248, 136, 128, 128, 128, - 128, 5, 7, 7, 6, 0, 0, 48, 72, 128, 224, 128, 72, 48, 5, 7, - 7, 6, 0, 0, 112, 136, 128, 112, 8, 136, 112, 3, 7, 7, 6, 1, - 0, 224, 64, 64, 64, 64, 64, 224, 3, 8, 8, 6, 1, 0, 160, 0, - 224, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, - 16, 144, 96, 5, 7, 7, 6, 0, 0, 160, 160, 160, 184, 168, 168, 184, - 5, 7, 7, 6, 0, 0, 160, 160, 160, 248, 168, 168, 184, 4, 7, 7, - 6, 0, 0, 224, 64, 112, 80, 80, 80, 80, 5, 8, 8, 6, 0, 0, - 16, 32, 136, 144, 160, 224, 144, 136, 5, 8, 8, 6, 0, 0, 64, 32, - 136, 152, 168, 200, 136, 136, 5, 9, 9, 6, 0, 255, 80, 32, 136, 136, - 136, 80, 32, 32, 32, 5, 8, 8, 6, 0, 255, 136, 136, 136, 136, 136, - 136, 248, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, - 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 136, 136, 240, 5, 7, 7, - 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, 0, - 248, 136, 128, 128, 128, 128, 128, 5, 8, 8, 6, 0, 255, 120, 40, 40, - 40, 72, 136, 248, 136, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, - 128, 248, 5, 7, 7, 6, 0, 0, 168, 168, 168, 112, 168, 168, 168, 5, - 7, 7, 6, 0, 0, 240, 8, 8, 112, 8, 8, 240, 5, 7, 7, 6, - 0, 0, 136, 136, 152, 168, 200, 136, 136, 5, 8, 8, 6, 0, 0, 80, - 32, 136, 152, 168, 168, 200, 136, 5, 7, 7, 6, 0, 0, 136, 144, 160, - 192, 160, 144, 136, 5, 7, 7, 6, 0, 0, 120, 40, 40, 40, 40, 168, - 72, 5, 7, 7, 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, - 7, 6, 0, 0, 136, 136, 136, 248, 136, 136, 136, 5, 7, 7, 6, 0, - 0, 112, 136, 136, 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 136, - 136, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, - 128, 128, 5, 7, 7, 6, 0, 0, 112, 136, 128, 128, 128, 136, 112, 5, - 7, 7, 6, 0, 0, 248, 32, 32, 32, 32, 32, 32, 5, 7, 7, 6, - 0, 0, 136, 136, 136, 80, 32, 64, 128, 5, 7, 7, 6, 0, 0, 32, - 112, 168, 168, 168, 112, 32, 5, 7, 7, 6, 0, 0, 136, 136, 80, 32, - 80, 136, 136, 5, 8, 8, 6, 0, 255, 136, 136, 136, 136, 136, 136, 248, - 8, 5, 7, 7, 6, 0, 0, 136, 136, 136, 152, 104, 8, 8, 5, 7, - 7, 6, 0, 0, 168, 168, 168, 168, 168, 168, 248, 5, 8, 8, 6, 0, - 255, 168, 168, 168, 168, 168, 168, 248, 8, 5, 7, 7, 6, 0, 0, 192, - 64, 64, 112, 72, 72, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 200, - 168, 168, 200, 5, 7, 7, 6, 0, 0, 128, 128, 128, 240, 136, 136, 240, - 5, 7, 7, 6, 0, 0, 112, 136, 8, 56, 8, 136, 112, 5, 7, 7, - 6, 0, 0, 144, 168, 168, 232, 168, 168, 144, 5, 7, 7, 6, 0, 0, - 120, 136, 136, 120, 40, 72, 136, 5, 5, 5, 6, 0, 0, 112, 8, 120, - 136, 120, 5, 7, 7, 6, 0, 0, 24, 96, 128, 240, 136, 136, 112, 4, - 5, 5, 6, 0, 0, 224, 144, 224, 144, 224, 5, 5, 5, 6, 0, 0, - 248, 136, 128, 128, 128, 5, 6, 6, 6, 0, 255, 120, 40, 72, 136, 248, - 136, 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 5, 5, 6, - 0, 0, 168, 168, 112, 168, 168, 5, 5, 5, 6, 0, 0, 240, 8, 48, - 8, 240, 5, 5, 5, 6, 0, 0, 136, 152, 168, 200, 136, 5, 7, 7, - 6, 0, 0, 80, 32, 136, 152, 168, 200, 136, 4, 5, 5, 6, 0, 0, - 144, 160, 192, 160, 144, 5, 5, 5, 6, 0, 0, 248, 40, 40, 168, 72, - 5, 5, 5, 6, 0, 0, 136, 216, 168, 136, 136, 5, 5, 5, 6, 0, - 0, 136, 136, 248, 136, 136, 5, 5, 5, 6, 0, 0, 112, 136, 136, 136, - 112, 5, 5, 5, 6, 0, 0, 248, 136, 136, 136, 136, 5, 6, 6, 6, - 0, 255, 240, 136, 136, 240, 128, 128, 5, 5, 5, 6, 0, 0, 112, 128, - 128, 136, 112, 5, 5, 5, 6, 0, 0, 248, 32, 32, 32, 32, 5, 6, - 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 6, 6, 6, 0, 0, - 32, 112, 168, 168, 112, 32, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, - 136, 5, 6, 6, 6, 0, 255, 136, 136, 136, 136, 248, 8, 5, 5, 5, - 6, 0, 0, 136, 136, 248, 8, 8, 5, 5, 5, 6, 0, 0, 168, 168, - 168, 168, 248, 5, 6, 6, 6, 0, 255, 168, 168, 168, 168, 248, 8, 5, - 5, 5, 6, 0, 0, 192, 64, 112, 72, 112, 5, 5, 5, 6, 0, 0, - 136, 136, 200, 168, 200, 3, 5, 5, 6, 1, 0, 128, 128, 192, 160, 192, - 5, 5, 5, 6, 0, 0, 112, 136, 56, 136, 112, 5, 5, 5, 6, 0, - 0, 144, 168, 232, 168, 144, 5, 5, 5, 6, 0, 0, 120, 136, 120, 40, - 72, 5, 8, 8, 6, 0, 0, 64, 32, 0, 112, 136, 248, 128, 112, 5, - 7, 7, 6, 0, 0, 80, 0, 112, 136, 248, 128, 112, 5, 9, 9, 6, - 0, 255, 64, 224, 64, 64, 120, 72, 72, 72, 16, 5, 8, 8, 6, 0, - 0, 16, 32, 0, 248, 136, 128, 128, 128, 5, 5, 5, 6, 0, 0, 112, - 136, 96, 136, 112, 5, 5, 5, 6, 0, 0, 112, 128, 112, 8, 240, 1, - 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, 7, 7, 6, - 1, 0, 160, 0, 64, 64, 64, 64, 64, 3, 8, 8, 6, 1, 255, 32, - 0, 32, 32, 32, 32, 160, 64, 5, 5, 5, 6, 0, 0, 160, 160, 184, - 168, 184, 5, 5, 5, 6, 0, 0, 160, 160, 248, 168, 184, 5, 6, 6, - 6, 0, 0, 64, 224, 64, 120, 72, 72, 4, 8, 8, 6, 0, 0, 16, - 32, 0, 144, 160, 192, 160, 144, 5, 8, 8, 6, 0, 0, 64, 32, 0, - 136, 152, 168, 200, 136, 5, 9, 9, 6, 0, 255, 80, 32, 0, 136, 136, - 136, 120, 8, 112, 5, 6, 6, 6, 0, 255, 136, 136, 136, 136, 248, 32 -}; diff --git a/Marlin/dogm_font_data_ISO10646_CN.h b/Marlin/dogm_font_data_ISO10646_CN.h deleted file mode 100644 index 11fdb2240b..0000000000 --- a/Marlin/dogm_font_data_ISO10646_CN.h +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: ISO10646_CN - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w=11 h=11 x= 2 y=10 dx=12 dy= 0 ascent=10 len=22 - Font Bounding box w=12 h=11 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent =10 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_CN[4105] U8G_SECTION(".progmem.ISO10646_CN") = { - 0, 12, 11, 0, 254, 7, 1, 146, 3, 33, 32, 255, 255, 10, 255, 7, - 255, 0, 0, 0, 6, 0, 10, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 112, 128, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 8, 112, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 0, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 7, 7, 6, 0, 0, 112, 136, 8, 104, 168, - 168, 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, - 7, 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, - 0, 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 240, - 136, 136, 136, 136, 136, 240, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, - 5, 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, - 6, 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, - 128, 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, - 16, 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, - 136, 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, - 7, 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, - 0, 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, - 136, 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, - 128, 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, - 7, 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, - 0, 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, - 32, 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, - 136, 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, - 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, - 6, 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 64, 128, 248, 3, 7, 7, 6, 0, 0, 224, 128, 128, 128, 128, 128, - 224, 5, 5, 5, 6, 0, 1, 128, 64, 32, 16, 8, 3, 7, 7, 6, - 0, 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, 32, - 80, 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, 128, - 64, 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, - 0, 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, 112, - 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, 136, - 120, 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, 6, - 0, 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, 112, - 136, 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, 136, - 136, 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, - 8, 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, 7, - 6, 1, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, 0, - 192, 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, 168, - 168, 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, 5, - 6, 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, 136, - 136, 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, 8, - 5, 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, 0, - 0, 112, 128, 112, 8, 240, 4, 7, 7, 6, 0, 0, 64, 64, 224, 64, - 64, 64, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, 5, - 5, 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, 136, - 136, 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 5, - 6, 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, 0, - 0, 248, 16, 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, 128, - 64, 64, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, 128, - 3, 7, 7, 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 2, 2, - 6, 0, 3, 104, 144, 0, 0, 0, 6, 0, 10, 0, 0, 0, 12, 0, - 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, - 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, - 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, - 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, - 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, - 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, - 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, - 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, - 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, - 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, 12, 0, 10, 0, 0, 0, - 12, 0, 10, 0, 0, 0, 12, 0, 10, 11, 11, 22, 12, 0, 255, 255, - 224, 2, 0, 2, 0, 4, 0, 13, 0, 20, 128, 36, 64, 196, 32, 4, - 0, 4, 0, 4, 0, 11, 11, 22, 12, 0, 255, 249, 0, 138, 0, 171, - 224, 172, 64, 170, 64, 170, 64, 170, 64, 170, 128, 33, 0, 82, 128, 140, - 96, 11, 11, 22, 12, 0, 255, 36, 0, 36, 0, 63, 128, 68, 0, 132, - 0, 4, 0, 255, 224, 10, 0, 17, 0, 32, 128, 192, 96, 11, 11, 22, - 12, 0, 255, 36, 0, 36, 0, 63, 192, 68, 0, 4, 0, 255, 224, 9, - 0, 9, 0, 17, 32, 33, 32, 64, 224, 11, 11, 22, 12, 0, 255, 32, - 0, 61, 224, 81, 32, 145, 32, 17, 32, 255, 32, 17, 32, 41, 32, 37, - 224, 69, 32, 128, 0, 11, 11, 22, 12, 0, 255, 32, 128, 127, 192, 8, - 64, 255, 224, 17, 0, 32, 128, 95, 64, 128, 32, 63, 128, 0, 0, 127, - 192, 11, 11, 22, 12, 0, 255, 34, 64, 71, 224, 148, 128, 228, 128, 47, - 224, 68, 128, 244, 128, 7, 224, 52, 128, 196, 128, 7, 224, 11, 11, 22, - 12, 0, 255, 4, 128, 143, 224, 73, 0, 25, 0, 47, 192, 9, 0, 9, - 0, 47, 192, 73, 0, 137, 0, 15, 224, 11, 11, 22, 12, 0, 255, 16, - 0, 63, 128, 81, 0, 14, 0, 49, 128, 192, 96, 63, 128, 36, 128, 63, - 128, 36, 128, 63, 128, 11, 11, 22, 12, 0, 255, 34, 128, 250, 64, 7, - 224, 250, 128, 138, 128, 138, 128, 250, 128, 34, 128, 178, 128, 170, 160, 100, - 224, 11, 11, 22, 12, 0, 255, 34, 32, 71, 64, 146, 128, 239, 224, 34, - 0, 71, 192, 236, 64, 7, 192, 52, 64, 199, 192, 4, 64, 11, 11, 22, - 12, 0, 255, 8, 0, 15, 192, 8, 0, 8, 0, 255, 224, 8, 0, 14, - 0, 9, 128, 8, 64, 8, 0, 8, 0, 10, 11, 22, 12, 0, 255, 255, - 128, 0, 128, 0, 128, 128, 128, 128, 128, 255, 128, 128, 0, 128, 0, 128, - 64, 128, 64, 127, 192, 11, 11, 22, 12, 0, 255, 71, 192, 65, 0, 239, - 224, 65, 0, 69, 0, 105, 96, 201, 32, 77, 96, 73, 32, 79, 224, 200, - 32, 11, 11, 22, 12, 0, 255, 8, 0, 4, 0, 4, 0, 10, 0, 10, - 0, 10, 0, 17, 0, 17, 0, 32, 128, 64, 64, 128, 32, 11, 11, 22, - 12, 0, 255, 34, 64, 34, 0, 247, 224, 34, 0, 35, 224, 53, 32, 229, - 32, 37, 64, 40, 128, 41, 64, 114, 32, 11, 10, 20, 12, 0, 0, 68, - 64, 68, 64, 68, 64, 127, 192, 4, 0, 4, 0, 132, 32, 132, 32, 132, - 32, 255, 224, 11, 11, 22, 12, 0, 255, 4, 0, 0, 0, 127, 192, 4, - 0, 4, 0, 4, 0, 127, 192, 4, 0, 4, 0, 4, 0, 255, 224, 11, - 11, 22, 12, 0, 255, 255, 224, 17, 0, 1, 192, 254, 0, 72, 128, 37, - 0, 4, 0, 255, 224, 21, 0, 36, 128, 196, 96, 11, 11, 22, 12, 0, - 255, 17, 0, 127, 192, 68, 64, 127, 192, 68, 64, 127, 192, 4, 0, 255, - 224, 4, 0, 4, 0, 4, 0, 9, 11, 22, 12, 0, 255, 16, 0, 255, - 128, 128, 128, 128, 128, 255, 128, 128, 128, 128, 128, 255, 128, 128, 128, 128, - 128, 255, 128, 11, 11, 22, 12, 0, 255, 113, 0, 1, 0, 3, 224, 249, - 32, 33, 32, 65, 32, 81, 32, 137, 32, 250, 32, 2, 32, 4, 192, 11, - 11, 22, 12, 0, 255, 127, 192, 17, 0, 17, 0, 17, 0, 17, 0, 255, - 224, 17, 0, 17, 0, 33, 0, 33, 0, 65, 0, 11, 11, 22, 12, 0, - 255, 33, 0, 34, 0, 244, 64, 87, 224, 80, 32, 87, 192, 148, 64, 84, - 64, 36, 64, 87, 192, 148, 64, 11, 11, 22, 12, 0, 255, 17, 0, 10, - 0, 127, 192, 4, 0, 4, 0, 255, 224, 4, 0, 10, 0, 17, 0, 32, - 128, 192, 96, 10, 11, 22, 12, 0, 255, 95, 192, 0, 64, 132, 64, 132, - 64, 191, 64, 132, 64, 140, 64, 148, 64, 164, 64, 140, 64, 129, 192, 11, - 11, 22, 12, 0, 255, 36, 0, 39, 192, 36, 0, 36, 0, 255, 224, 0, - 0, 20, 64, 36, 128, 71, 0, 12, 0, 112, 0, 11, 11, 22, 12, 0, - 255, 36, 128, 4, 128, 15, 192, 228, 128, 36, 128, 63, 224, 36, 128, 36, - 128, 40, 128, 80, 0, 143, 224, 11, 11, 22, 12, 0, 255, 8, 0, 8, - 0, 255, 128, 136, 128, 136, 128, 255, 128, 136, 128, 136, 128, 255, 160, 136, - 32, 7, 224, 11, 11, 22, 12, 0, 255, 39, 128, 36, 128, 244, 128, 36, - 128, 116, 128, 108, 128, 164, 128, 36, 128, 36, 160, 40, 160, 48, 96, 10, - 11, 22, 12, 0, 255, 255, 192, 128, 64, 128, 64, 158, 64, 146, 64, 146, - 64, 158, 64, 128, 64, 128, 64, 255, 192, 128, 64, 11, 11, 22, 12, 0, - 255, 127, 192, 68, 0, 95, 192, 80, 64, 95, 192, 80, 64, 95, 192, 66, - 0, 74, 128, 82, 64, 166, 32, 11, 11, 22, 12, 0, 255, 4, 0, 7, - 224, 4, 0, 127, 192, 64, 64, 64, 64, 64, 64, 127, 192, 0, 0, 82, - 64, 137, 32, 11, 11, 22, 12, 0, 255, 71, 128, 36, 128, 4, 128, 4, - 128, 232, 96, 32, 0, 47, 192, 36, 64, 34, 128, 49, 0, 38, 192, 11, - 11, 22, 12, 0, 255, 127, 192, 74, 64, 127, 192, 4, 0, 255, 224, 4, - 0, 63, 128, 32, 128, 36, 128, 36, 128, 255, 224, 11, 11, 22, 12, 0, - 255, 34, 0, 79, 224, 72, 32, 79, 224, 200, 0, 79, 224, 74, 160, 90, - 160, 111, 224, 74, 160, 72, 96, 11, 11, 22, 12, 0, 255, 243, 192, 36, - 64, 42, 128, 241, 0, 34, 128, 101, 224, 114, 32, 165, 64, 32, 128, 35, - 0, 44, 0, 11, 11, 22, 12, 0, 255, 4, 0, 255, 224, 128, 32, 0, - 0, 255, 224, 4, 0, 36, 0, 39, 192, 36, 0, 84, 0, 143, 224, 11, - 11, 22, 12, 0, 255, 115, 224, 16, 128, 81, 0, 35, 224, 250, 32, 42, - 160, 34, 160, 34, 160, 32, 128, 33, 64, 98, 32, 11, 11, 22, 12, 0, - 255, 34, 0, 247, 128, 34, 128, 54, 128, 226, 160, 37, 160, 36, 96, 104, - 32, 0, 0, 82, 64, 137, 32, 11, 11, 22, 12, 0, 255, 115, 192, 66, - 0, 66, 0, 123, 224, 74, 64, 74, 64, 122, 64, 74, 64, 66, 64, 68, - 64, 136, 64, 11, 11, 22, 12, 0, 255, 8, 0, 255, 224, 8, 0, 31, - 192, 48, 64, 95, 192, 144, 64, 31, 192, 16, 64, 16, 64, 16, 192, 11, - 11, 22, 12, 0, 255, 2, 0, 127, 224, 66, 0, 66, 0, 95, 192, 66, - 0, 71, 0, 74, 128, 82, 64, 98, 32, 130, 0, 11, 11, 22, 12, 0, - 255, 243, 192, 150, 64, 145, 128, 166, 96, 161, 0, 151, 192, 145, 0, 149, - 0, 231, 224, 129, 0, 129, 0, 11, 11, 22, 12, 0, 255, 15, 128, 136, - 128, 79, 128, 8, 128, 143, 128, 64, 0, 31, 192, 53, 64, 85, 64, 149, - 64, 63, 224, 11, 11, 22, 12, 0, 255, 39, 224, 32, 128, 248, 128, 32, - 128, 32, 128, 56, 128, 224, 128, 32, 128, 32, 128, 32, 128, 97, 128, 11, - 11, 22, 12, 0, 255, 31, 224, 145, 0, 87, 192, 20, 64, 23, 192, 148, - 64, 87, 192, 17, 0, 85, 64, 153, 32, 35, 0, 11, 11, 22, 12, 0, - 255, 32, 128, 39, 224, 242, 64, 33, 128, 34, 64, 52, 32, 226, 64, 34, - 64, 34, 64, 34, 64, 100, 64, 11, 11, 22, 12, 0, 255, 65, 0, 65, - 0, 79, 224, 233, 32, 73, 32, 73, 32, 111, 224, 201, 32, 73, 32, 73, - 32, 207, 224, 11, 11, 22, 12, 0, 255, 33, 0, 241, 0, 79, 224, 169, - 32, 249, 32, 47, 224, 57, 32, 233, 32, 41, 32, 47, 224, 40, 32, 11, - 11, 22, 12, 0, 255, 143, 224, 73, 32, 9, 32, 203, 160, 73, 32, 79, - 224, 72, 32, 75, 160, 74, 160, 107, 160, 80, 224, 11, 11, 22, 12, 0, - 255, 127, 192, 4, 0, 68, 64, 36, 64, 36, 128, 4, 0, 255, 224, 4, - 0, 4, 0, 4, 0, 4, 0, 11, 11, 22, 12, 0, 255, 130, 0, 66, - 0, 31, 224, 194, 0, 95, 192, 82, 64, 95, 192, 71, 0, 74, 128, 82, - 64, 191, 224, 11, 11, 22, 12, 0, 255, 4, 0, 127, 224, 72, 128, 127, - 224, 72, 128, 79, 128, 64, 0, 95, 192, 72, 64, 71, 128, 152, 96, 11, - 11, 22, 12, 0, 255, 1, 0, 239, 224, 161, 0, 164, 64, 175, 224, 164, - 64, 175, 224, 169, 32, 233, 32, 2, 128, 12, 96, 11, 11, 22, 12, 0, - 255, 20, 192, 246, 160, 188, 96, 167, 128, 168, 128, 191, 224, 169, 32, 239, - 224, 9, 32, 15, 224, 9, 32, 11, 11, 22, 12, 0, 255, 127, 128, 64, - 128, 66, 128, 98, 128, 84, 128, 72, 128, 72, 128, 84, 160, 98, 160, 64, - 96, 128, 32, 11, 11, 22, 12, 0, 255, 4, 0, 127, 224, 64, 32, 127, - 224, 64, 0, 125, 224, 84, 32, 76, 160, 84, 96, 100, 160, 141, 96, 11, - 11, 22, 12, 0, 255, 130, 0, 95, 224, 4, 0, 8, 64, 159, 224, 64, - 32, 10, 128, 10, 128, 74, 160, 146, 160, 34, 96, 11, 11, 22, 12, 0, - 255, 65, 0, 79, 224, 232, 32, 66, 128, 68, 64, 104, 32, 199, 192, 65, - 0, 65, 0, 65, 0, 207, 224, 11, 11, 22, 12, 0, 255, 80, 32, 125, - 32, 145, 32, 255, 32, 17, 32, 125, 32, 85, 32, 85, 32, 84, 32, 92, - 32, 16, 224, 11, 11, 22, 12, 0, 255, 63, 128, 32, 128, 63, 128, 32, - 128, 255, 224, 72, 0, 123, 192, 73, 64, 121, 64, 72, 128, 251, 96, 11, - 11, 22, 12, 0, 255, 4, 0, 4, 0, 4, 0, 36, 128, 36, 64, 68, - 64, 68, 32, 132, 32, 4, 0, 4, 0, 28, 0, 11, 11, 22, 12, 0, - 255, 4, 0, 4, 0, 4, 0, 255, 224, 4, 0, 10, 0, 10, 0, 17, - 0, 17, 0, 32, 128, 192, 96, 9, 10, 20, 10, 0, 0, 136, 128, 73, - 0, 8, 0, 255, 128, 0, 128, 0, 128, 127, 128, 0, 128, 0, 128, 255, - 128, 11, 11, 22, 12, 0, 255, 33, 0, 18, 0, 255, 224, 0, 0, 120, - 128, 74, 128, 122, 128, 74, 128, 122, 128, 72, 128, 89, 128, 11, 11, 22, - 12, 0, 255, 39, 192, 0, 0, 0, 0, 239, 224, 33, 0, 34, 0, 36, - 64, 47, 224, 32, 32, 80, 0, 143, 224, 11, 11, 22, 12, 0, 255, 32, - 128, 39, 0, 249, 0, 33, 192, 119, 0, 33, 0, 249, 224, 39, 0, 113, - 32, 169, 32, 32, 224, 11, 11, 22, 12, 0, 255, 16, 64, 16, 64, 253, - 224, 16, 64, 56, 192, 53, 64, 82, 64, 148, 64, 16, 64, 16, 64, 16, - 192, 11, 11, 22, 12, 0, 255, 0, 64, 248, 64, 11, 224, 8, 64, 136, - 64, 82, 64, 81, 64, 33, 64, 80, 64, 72, 64, 137, 192, 10, 11, 22, - 12, 0, 255, 132, 0, 132, 64, 132, 128, 245, 0, 134, 0, 132, 0, 132, - 0, 148, 0, 164, 64, 196, 64, 131, 192, 11, 11, 22, 12, 0, 255, 17, - 32, 125, 0, 17, 0, 255, 224, 41, 0, 253, 64, 73, 64, 124, 128, 8, - 160, 253, 96, 10, 32, 11, 11, 22, 12, 0, 255, 23, 192, 36, 64, 36, - 64, 103, 192, 161, 0, 47, 224, 33, 0, 35, 128, 37, 64, 41, 32, 33, - 0, 11, 11, 22, 12, 0, 255, 8, 0, 255, 224, 16, 0, 39, 192, 32, - 128, 97, 0, 175, 224, 33, 0, 33, 0, 33, 0, 35, 0, 11, 11, 22, - 12, 0, 255, 36, 0, 47, 224, 180, 0, 164, 128, 164, 160, 170, 192, 42, - 128, 40, 128, 41, 64, 50, 64, 36, 32, 11, 11, 22, 12, 0, 255, 127, - 224, 128, 0, 63, 192, 32, 64, 63, 192, 16, 0, 31, 192, 16, 64, 40, - 128, 71, 0, 56, 224, 11, 11, 22, 12, 0, 255, 127, 224, 64, 0, 64, - 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 128, - 0, 11, 11, 22, 12, 0, 255, 255, 224, 4, 0, 127, 192, 68, 64, 127, - 192, 68, 64, 127, 192, 68, 0, 36, 0, 24, 0, 231, 224, 11, 11, 22, - 12, 0, 255, 17, 224, 253, 0, 69, 0, 41, 224, 253, 64, 17, 64, 125, - 64, 17, 64, 85, 64, 146, 64, 52, 64, 11, 11, 22, 12, 0, 255, 33, - 0, 95, 224, 64, 0, 207, 192, 64, 0, 79, 192, 64, 0, 79, 192, 72, - 64, 79, 192, 72, 64, 11, 11, 22, 12, 0, 255, 4, 0, 127, 192, 64, - 64, 127, 192, 64, 64, 127, 192, 64, 64, 127, 192, 4, 64, 82, 32, 191, - 160, 11, 11, 22, 12, 0, 255, 127, 192, 68, 64, 127, 192, 68, 64, 127, - 192, 4, 0, 27, 0, 224, 224, 17, 0, 17, 0, 97, 0, 11, 11, 22, - 12, 0, 255, 255, 224, 4, 0, 8, 0, 127, 224, 73, 32, 79, 32, 73, - 32, 79, 32, 73, 32, 73, 32, 127, 224, 11, 11, 22, 12, 0, 255, 253, - 224, 86, 64, 121, 64, 56, 128, 85, 64, 146, 32, 255, 224, 4, 0, 39, - 192, 36, 0, 255, 224, 11, 11, 22, 12, 0, 255, 251, 128, 82, 0, 123, - 224, 18, 64, 250, 64, 20, 64, 63, 128, 32, 128, 63, 128, 32, 128, 63, - 128, 11, 11, 22, 12, 0, 255, 31, 224, 32, 0, 39, 192, 100, 64, 167, - 192, 32, 0, 47, 224, 40, 32, 39, 192, 33, 0, 35, 0, 11, 11, 22, - 12, 0, 255, 243, 224, 130, 32, 130, 32, 250, 32, 130, 32, 130, 32, 138, - 32, 178, 32, 194, 224, 2, 0, 2, 0, 11, 11, 22, 12, 0, 255, 36, - 128, 70, 160, 149, 192, 228, 128, 39, 224, 68, 128, 245, 192, 6, 160, 52, - 128, 196, 128, 7, 224, 11, 11, 22, 12, 0, 255, 39, 192, 65, 0, 135, - 224, 224, 32, 34, 128, 69, 128, 242, 128, 15, 224, 48, 128, 193, 64, 2, - 32, 11, 11, 22, 12, 0, 255, 2, 0, 2, 0, 34, 0, 35, 192, 34, - 0, 34, 0, 34, 0, 34, 0, 34, 0, 34, 0, 255, 224, 9, 11, 22, - 12, 0, 255, 8, 0, 8, 0, 255, 128, 136, 128, 136, 128, 136, 128, 255, - 128, 136, 128, 136, 128, 136, 128, 255, 128, 11, 11, 22, 12, 0, 255, 33, - 0, 83, 160, 65, 0, 247, 224, 81, 0, 83, 192, 86, 64, 83, 192, 90, - 64, 83, 192, 66, 64, 11, 11, 22, 12, 0, 255, 127, 192, 4, 0, 4, - 0, 4, 0, 255, 224, 10, 0, 10, 0, 18, 0, 34, 32, 66, 32, 129, - 224, 11, 11, 22, 12, 0, 255, 17, 0, 33, 0, 47, 224, 97, 0, 163, - 128, 35, 128, 37, 64, 37, 64, 41, 32, 33, 0, 33, 0, 11, 11, 22, - 12, 0, 255, 247, 224, 148, 32, 244, 32, 151, 224, 148, 128, 244, 128, 151, - 224, 148, 128, 244, 160, 150, 96, 4, 32, 11, 11, 22, 12, 0, 255, 123, - 224, 148, 128, 4, 0, 127, 192, 4, 0, 255, 224, 1, 0, 255, 224, 33, - 0, 17, 0, 7, 0, 11, 11, 22, 12, 0, 255, 33, 0, 71, 192, 145, - 0, 47, 224, 96, 128, 175, 224, 32, 128, 36, 128, 34, 128, 32, 128, 35, - 128, 11, 11, 22, 12, 0, 255, 39, 192, 36, 64, 247, 192, 46, 224, 42, - 160, 62, 224, 225, 0, 47, 224, 35, 128, 37, 64, 105, 32, 11, 11, 22, - 12, 0, 255, 20, 0, 39, 224, 42, 0, 98, 0, 163, 192, 34, 0, 34, - 0, 35, 224, 34, 0, 34, 0, 34, 0 -}; diff --git a/Marlin/dogm_font_data_ISO10646_CZ.h b/Marlin/dogm_font_data_ISO10646_CZ.h deleted file mode 100644 index 671ad8ea2d..0000000000 --- a/Marlin/dogm_font_data_ISO10646_CZ.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - Fontname: ISO10646_CZ - Copyright: A. Hardtung, public domain - Modified for Czech accents by Petr Zahradnik, http://www.zahradniksebavi.cz - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 6 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_CZ[2832] U8G_SECTION(".progmem.ISO10646_CZ") = { - 0,6,9,0,254,7,1,146,3,33,32,255,255,8,255,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,136,136,136,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 112,128,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,8,112,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,7,7,6,0,0,112,136,8,104,168, - 168,112,5,7,7,6,0,0,112,136,136,248,136,136,136,5, - 7,7,6,0,0,240,136,136,240,136,136,240,5,7,7,6, - 0,0,112,136,128,128,128,136,112,5,7,7,6,0,0,240, - 136,136,136,136,136,240,5,7,7,6,0,0,248,128,128,240, - 128,128,248,5,7,7,6,0,0,248,128,128,240,128,128,128, - 5,7,7,6,0,0,112,136,128,184,136,136,112,5,7,7, - 6,0,0,136,136,136,248,136,136,136,1,7,7,6,2,0, - 128,128,128,128,128,128,128,5,7,7,6,0,0,56,16,16, - 16,16,144,96,5,7,7,6,0,0,136,144,160,192,160,144, - 136,5,7,7,6,0,0,128,128,128,128,128,128,248,5,7, - 7,6,0,0,136,216,168,136,136,136,136,5,7,7,6,0, - 0,136,136,200,168,152,136,136,5,7,7,6,0,0,112,136, - 136,136,136,136,112,5,7,7,6,0,0,240,136,136,240,128, - 128,128,5,7,7,6,0,0,112,136,136,136,168,144,104,5, - 7,7,6,0,0,240,136,136,240,160,144,136,5,7,7,6, - 0,0,120,128,128,112,8,8,240,5,7,7,6,0,0,248, - 32,32,32,32,32,32,5,7,7,6,0,0,136,136,136,136, - 136,136,112,5,7,7,6,0,0,136,136,136,136,136,80,32, - 5,7,7,6,0,0,136,136,136,136,136,168,80,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 136,136,136,80,32,32,32,5,7,7,6,0,0,248,8,16, - 32,64,128,248,3,7,7,6,1,0,224,128,128,128,128,128, - 224,5,5,5,6,0,1,128,64,32,16,8,3,7,7,6, - 1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,32, - 80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,128, - 64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,6, - 0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,112, - 128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,136, - 120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,6, - 0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,112, - 136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,136, - 136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,3, - 8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,7, - 6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,0, - 192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,168, - 168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,5, - 6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,136, - 136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,8, - 5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,0, - 0,112,128,112,8,240,4,7,7,6,0,0,64,64,224,64, - 64,64,48,5,5,5,6,0,0,136,136,136,152,104,5,5, - 5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,136, - 136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,5, - 6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,0, - 0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,128, - 64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,128, - 3,7,7,6,1,0,128,64,64,32,64,64,128,5,2,2, - 6,0,2,104,144,0,0,0,6,0,0,5,8,8,6,0, - 0,16,32,112,136,136,248,136,136,5,8,8,6,0,0,8, - 16,248,128,128,240,128,248,3,8,8,6,1,0,32,64,224, - 64,64,64,64,224,5,8,8,6,0,0,16,32,112,136,136, - 136,136,112,5,8,8,6,0,0,16,32,136,136,136,136,136, - 112,5,8,8,6,0,0,16,32,136,136,80,32,32,32,5, - 8,8,6,0,0,16,32,0,112,8,120,136,120,5,8,8, - 6,0,0,16,32,0,112,136,248,128,112,2,8,8,6,2, - 0,64,128,0,128,128,128,128,128,5,8,8,6,0,0,16, - 32,0,112,136,136,136,112,5,8,8,6,0,0,16,32,0, - 136,136,136,152,104,5,9,9,6,0,255,16,32,0,136,136, - 136,120,8,112,5,8,8,6,0,0,80,32,112,136,128,128, - 136,112,5,8,8,6,0,0,80,32,0,112,128,128,136,112, - 5,8,8,6,0,0,80,32,240,136,136,136,136,240,6,8, - 8,6,0,0,4,20,24,112,144,144,144,112,5,8,8,6, - 0,0,80,32,248,128,128,240,128,248,5,8,8,6,0,0, - 80,32,0,112,136,248,128,112,5,8,8,6,0,0,80,32, - 136,200,168,152,136,136,5,8,8,6,0,0,80,32,0,176, - 200,136,136,136,5,8,8,6,0,0,80,32,240,136,240,160, - 144,136,5,8,8,6,0,0,80,32,0,176,200,128,128,128, - 5,8,8,6,0,0,80,32,120,128,128,112,8,240,5,8, - 8,6,0,0,80,32,0,112,128,112,8,240,5,8,8,6, - 0,0,80,32,248,32,32,32,32,32,6,8,8,6,0,0, - 4,68,72,224,64,64,64,48,5,8,8,6,0,0,32,80, - 168,136,136,136,136,112,5,8,8,6,0,0,32,80,32,136, - 136,136,152,104,5,8,8,6,0,0,80,32,248,8,48,64, - 128,248,5,8,8,6,0,0,80,32,0,248,16,32,64,248, - 0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6, - 0,0,1,7,7,6,2,0,128,0,128,128,128,128,128,5, - 7,7,6,0,0,32,112,168,160,168,112,32,5,7,7,6, - 0,0,48,64,64,224,64,80,168,5,5,5,6,0,0,136, - 112,80,112,136,5,7,7,6,0,0,136,80,32,248,32,248, - 32,1,7,7,6,2,0,128,128,128,0,128,128,128,5,8, - 8,6,0,0,48,72,32,80,80,32,144,96,3,1,1,6, - 1,7,160,5,7,7,6,0,0,248,136,184,184,184,136,248, - 5,7,7,6,0,1,112,8,120,136,120,0,248,5,5,5, - 6,0,1,40,80,160,80,40,5,3,3,6,0,1,248,8, - 8,2,2,2,6,2,6,64,128,5,7,7,6,0,0,248, - 136,168,136,152,168,248,5,1,1,6,0,6,248,4,4,4, - 6,0,3,96,144,144,96,5,7,7,6,0,0,32,32,248, - 32,32,0,248,4,5,5,6,0,3,96,144,32,64,240,3, - 5,5,6,0,3,224,32,224,32,224,2,2,2,6,2,6, - 64,128,5,8,8,6,0,255,136,136,136,136,152,232,128,128, - 5,7,7,6,0,0,120,152,152,120,24,24,24,2,2,2, - 6,2,2,192,192,2,2,2,6,2,255,64,128,3,5,5, - 6,0,3,64,192,64,64,224,5,7,7,6,0,1,112,136, - 136,136,112,0,248,5,5,5,6,0,1,160,80,40,80,160, - 5,7,7,6,0,0,136,144,168,88,184,8,8,5,7,7, - 6,0,0,136,144,184,72,152,32,56,5,8,8,6,0,0, - 192,64,192,72,216,56,8,8,5,7,7,6,0,0,32,0, - 32,64,128,136,112,5,8,8,6,0,0,64,32,0,112,136, - 248,136,136,5,8,8,6,0,0,16,32,0,112,136,248,136, - 136,5,8,8,6,0,0,32,80,0,112,136,248,136,136,5, - 8,8,6,0,0,104,144,0,112,136,248,136,136,5,8,8, - 6,0,0,80,0,112,136,136,248,136,136,5,8,8,6,0, - 0,32,80,32,112,136,248,136,136,5,7,7,6,0,0,56, - 96,160,184,224,160,184,5,8,8,6,0,255,112,136,128,128, - 136,112,32,96,5,8,8,6,0,0,64,32,0,248,128,240, - 128,248,5,8,8,6,0,0,8,16,0,248,128,240,128,248, - 5,8,8,6,0,0,32,80,0,248,128,240,128,248,5,7, - 7,6,0,0,80,0,248,128,240,128,248,3,8,8,6,1, - 0,128,64,0,224,64,64,64,224,3,8,8,6,1,0,32, - 64,0,224,64,64,64,224,3,8,8,6,1,0,64,160,0, - 224,64,64,64,224,3,7,7,6,1,0,160,0,224,64,64, - 64,224,5,9,9,6,0,255,80,32,112,136,128,184,136,136, - 112,5,8,8,6,0,0,104,144,0,136,200,168,152,136,5, - 8,8,6,0,0,64,32,112,136,136,136,136,112,5,8,8, - 6,0,0,16,32,112,136,136,136,136,112,5,8,8,6,0, - 0,32,80,0,112,136,136,136,112,5,8,8,6,0,0,104, - 144,0,112,136,136,136,112,5,8,8,6,0,0,80,0,112, - 136,136,136,136,112,5,5,5,6,0,1,136,80,32,80,136, - 5,8,8,6,0,255,16,112,168,168,168,168,112,64,5,8, - 8,6,0,0,64,32,136,136,136,136,136,112,5,8,8,6, - 0,0,16,32,136,136,136,136,136,112,5,8,8,6,0,0, - 32,80,0,136,136,136,136,112,5,8,8,6,0,0,80,0, - 136,136,136,136,136,112,1,7,7,6,2,0,128,0,128,128, - 128,128,128,5,9,9,6,0,255,120,128,128,112,8,8,240, - 32,96,4,8,8,6,1,255,96,144,144,160,144,144,224,128, - 5,8,8,6,0,0,64,32,0,112,8,120,136,120,5,8, - 8,6,0,0,16,32,0,112,8,120,136,120,5,8,8,6, - 0,0,32,80,0,112,8,120,136,120,5,8,8,6,0,0, - 104,144,0,112,8,120,136,120,5,7,7,6,0,0,80,0, - 112,8,120,136,120,5,8,8,6,0,0,32,80,32,112,8, - 120,136,120,5,6,6,6,0,0,208,40,120,160,168,80,5, - 7,7,6,0,255,112,128,128,136,112,32,96,5,8,8,6, - 0,0,64,32,0,112,136,248,128,112,5,8,8,6,0,0, - 16,32,0,112,136,248,128,112,5,8,8,6,0,0,32,80, - 0,112,136,248,128,112,5,7,7,6,0,0,80,0,112,136, - 248,128,112,3,8,8,6,1,0,128,64,0,64,192,64,64, - 224,3,8,8,6,1,0,32,64,0,64,192,64,64,224,3, - 8,8,6,1,0,64,160,0,64,192,64,64,224,3,7,7, - 6,1,0,160,0,64,192,64,64,224,5,8,8,6,0,255, - 80,32,112,136,136,120,8,112,5,8,8,6,0,0,104,144, - 0,176,200,136,136,136,5,8,8,6,0,0,64,32,0,112, - 136,136,136,112,5,8,8,6,0,0,16,32,0,112,136,136, - 136,112,5,8,8,6,0,0,32,80,0,112,136,136,136,112, - 5,8,8,6,0,0,104,144,0,112,136,136,136,112,5,7, - 7,6,0,0,80,0,112,136,136,136,112,5,5,5,6,0, - 1,32,0,248,0,32,5,7,7,6,0,255,16,112,168,168, - 168,112,64,5,8,8,6,0,0,64,32,0,136,136,136,152, - 104,5,8,8,6,0,0,16,32,0,136,136,136,152,104,5, - 8,8,6,0,0,32,80,0,136,136,136,152,104,5,7,7, - 6,0,0,80,0,136,136,136,152,104,1,5,5,6,2,0, - 128,128,128,128,128,5,7,7,6,0,255,112,128,112,8,240, - 32,96,5,8,8,6,0,255,80,0,136,136,136,120,8,112 - }; diff --git a/Marlin/dogm_font_data_ISO10646_Greek.h b/Marlin/dogm_font_data_ISO10646_Greek.h deleted file mode 100644 index efe44f3cc1..0000000000 --- a/Marlin/dogm_font_data_ISO10646_Greek.h +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/* - Fontname: ISO10646_4_Greek - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 9 x= 2 y= 6 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_Greek_5x7[2715] U8G_SECTION(".progmem.ISO10646_Greek_5x7") = { - 0,6,9,0,254,7,1,145,3,32,32,255,255,8,255,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,152,168,200,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 48,64,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,16,96,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,6,6,6,0,0,112,136,8,104,168, - 112,5,7,7,6,0,0,112,136,136,248,136,136,136,5,7, - 7,6,0,0,240,136,136,240,136,136,240,5,7,7,6,0, - 0,112,136,128,128,128,136,112,5,7,7,6,0,0,224,144, - 136,136,136,144,224,5,7,7,6,0,0,248,128,128,240,128, - 128,248,5,7,7,6,0,0,248,128,128,240,128,128,128,5, - 7,7,6,0,0,112,136,128,184,136,136,112,5,7,7,6, - 0,0,136,136,136,248,136,136,136,1,7,7,6,2,0,128, - 128,128,128,128,128,128,5,7,7,6,0,0,56,16,16,16, - 16,144,96,5,7,7,6,0,0,136,144,160,192,160,144,136, - 5,7,7,6,0,0,128,128,128,128,128,128,248,5,7,7, - 6,0,0,136,216,168,136,136,136,136,5,7,7,6,0,0, - 136,136,200,168,152,136,136,5,7,7,6,0,0,112,136,136, - 136,136,136,112,5,7,7,6,0,0,240,136,136,240,128,128, - 128,5,7,7,6,0,0,112,136,136,136,168,144,104,5,7, - 7,6,0,0,240,136,136,240,160,144,136,5,7,7,6,0, - 0,120,128,128,112,8,8,240,5,7,7,6,0,0,248,32, - 32,32,32,32,32,5,7,7,6,0,0,136,136,136,136,136, - 136,112,5,7,7,6,0,0,136,136,136,136,136,80,32,5, - 7,7,6,0,0,136,136,136,136,136,168,80,5,7,7,6, - 0,0,136,136,80,32,80,136,136,5,7,7,6,0,0,136, - 136,136,80,32,32,32,5,7,7,6,0,0,248,8,16,32, - 64,128,248,3,7,7,6,1,0,224,128,128,128,128,128,224, - 5,5,5,6,0,1,128,64,32,16,8,3,7,7,6,1, - 0,224,32,32,32,32,32,224,5,3,3,6,0,4,32,80, - 136,5,1,1,6,0,0,248,2,2,2,6,2,5,128,64, - 5,5,5,6,0,0,112,8,120,136,120,5,7,7,6,0, - 0,128,128,176,200,136,136,240,5,5,5,6,0,0,112,128, - 128,136,112,5,7,7,6,0,0,8,8,104,152,136,136,120, - 5,5,5,6,0,0,112,136,248,128,112,5,7,7,6,0, - 0,48,72,224,64,64,64,64,5,6,6,6,0,255,112,136, - 136,120,8,112,5,7,7,6,0,0,128,128,176,200,136,136, - 136,1,7,7,6,2,0,128,0,128,128,128,128,128,3,8, - 8,6,1,255,32,0,32,32,32,32,160,64,4,7,7,6, - 0,0,128,128,144,160,192,160,144,3,7,7,6,1,0,192, - 64,64,64,64,64,224,5,5,5,6,0,0,208,168,168,168, - 168,5,5,5,6,0,0,176,200,136,136,136,5,5,5,6, - 0,0,112,136,136,136,112,5,6,6,6,0,255,240,136,136, - 240,128,128,5,6,6,6,0,255,120,136,136,120,8,8,5, - 5,5,6,0,0,176,200,128,128,128,5,5,5,6,0,0, - 112,128,112,8,240,5,7,7,6,0,0,64,64,224,64,64, - 72,48,5,5,5,6,0,0,136,136,136,152,104,5,5,5, - 6,0,0,136,136,136,80,32,5,5,5,6,0,0,136,136, - 168,168,80,5,5,5,6,0,0,136,80,32,80,136,5,6, - 6,6,0,255,136,136,136,120,8,112,5,5,5,6,0,0, - 248,16,32,64,248,3,7,7,6,1,0,32,64,64,128,64, - 64,32,1,7,7,6,2,0,128,128,128,128,128,128,128,3, - 7,7,6,1,0,128,64,64,32,64,64,128,5,2,2,6, - 0,3,104,144,0,0,0,6,0,0,0,0,0,6,0,0, - 0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6, - 0,0,2,2,2,6,1,6,64,128,3,3,3,6,1,5, - 32,64,160,5,8,8,6,0,0,64,160,80,80,136,248,136, - 136,2,2,2,6,1,2,192,192,5,8,8,6,0,0,64, - 128,248,128,240,128,128,248,5,8,8,6,0,0,64,128,136, - 136,248,136,136,136,4,8,8,6,0,0,64,128,112,32,32, - 32,32,112,0,0,0,6,0,0,5,8,8,6,0,0,64, - 128,112,136,136,136,136,112,0,0,0,6,0,0,5,8,8, - 6,0,0,64,128,8,136,112,32,32,32,5,8,8,6,0, - 0,64,128,112,136,136,136,80,216,3,8,8,6,1,0,32, - 64,160,0,64,64,64,32,5,7,7,6,0,0,32,80,136, - 136,248,136,136,5,7,7,6,0,0,240,72,72,112,72,72, - 240,5,7,7,6,0,0,248,128,128,128,128,128,128,5,6, - 6,6,0,0,32,80,80,136,136,248,5,7,7,6,0,0, - 248,128,128,240,128,128,248,5,7,7,6,0,0,248,8,16, - 32,64,128,248,5,7,7,6,0,0,136,136,136,248,136,136, - 136,5,7,7,6,0,0,112,136,136,168,136,136,112,3,7, - 7,6,1,0,224,64,64,64,64,64,224,5,7,7,6,0, - 0,136,144,160,192,160,144,136,5,7,7,6,0,0,32,80, - 136,136,136,136,136,5,7,7,6,0,0,136,216,168,168,136, - 136,136,5,7,7,6,0,0,136,200,200,168,152,152,136,5, - 7,7,6,0,0,248,0,0,112,0,0,248,5,7,7,6, - 0,0,112,136,136,136,136,136,112,5,7,7,6,0,0,248, - 80,80,80,80,80,80,5,7,7,6,0,0,240,136,136,240, - 128,128,128,0,0,0,6,0,0,5,7,7,6,0,0,248, - 128,64,32,64,128,248,5,7,7,6,0,0,248,32,32,32, - 32,32,32,5,7,7,6,0,0,136,136,80,32,32,32,32, - 5,7,7,6,0,0,112,32,112,168,112,32,112,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 168,168,168,168,112,32,32,5,6,6,6,0,0,112,136,136, - 80,80,216,3,8,8,6,1,0,160,0,224,64,64,64,64, - 224,5,8,8,6,0,0,80,0,136,136,136,80,32,32,5, - 8,8,6,0,0,32,64,8,104,152,144,144,104,5,8,8, - 6,0,0,32,64,0,112,136,224,136,112,5,9,9,6,0, - 255,32,64,0,112,136,136,136,136,8,2,8,8,6,1,0, - 64,128,0,128,128,128,128,64,5,8,8,6,0,0,16,32, - 80,0,136,136,136,112,5,6,6,6,0,0,8,104,152,144, - 144,104,4,6,6,6,0,255,96,144,240,144,224,128,5,6, - 6,6,0,255,136,72,80,32,32,64,5,6,6,6,0,0, - 48,64,112,136,136,112,5,5,5,6,0,0,112,136,224,136, - 112,5,8,8,6,0,255,128,112,64,128,128,112,8,112,5, - 6,6,6,0,255,184,200,136,136,136,8,5,5,5,6,0, - 0,112,136,248,136,112,3,5,5,6,1,0,128,128,128,128, - 96,4,5,5,6,0,0,144,160,192,160,144,5,6,6,6, - 0,0,64,32,32,80,80,136,5,6,6,6,0,255,136,136, - 136,216,168,128,5,5,5,6,0,0,136,136,80,96,32,5, - 9,9,6,0,255,128,224,128,112,32,64,240,8,112,5,5, - 5,6,0,0,112,136,136,136,112,5,5,5,6,0,0,248, - 80,80,80,80,5,6,6,6,0,255,112,136,136,200,176,128, - 5,7,7,6,0,255,48,64,128,64,48,8,112,5,5,5, - 6,0,0,104,144,144,144,96,4,5,5,6,0,0,240,64, - 64,64,48,5,5,5,6,0,0,136,136,144,144,224,5,7, - 7,6,0,255,32,168,168,168,112,32,32,5,6,6,6,0, - 255,136,80,32,32,80,136,5,6,6,6,0,255,168,168,168, - 168,112,32,5,5,5,6,0,0,80,136,136,168,112,4,7, - 7,6,0,0,160,0,64,64,64,64,48,5,7,7,6,0, - 0,80,0,136,136,144,144,224,4,8,8,6,0,0,32,64, - 0,96,144,144,144,96,5,8,8,6,0,0,32,64,0,136, - 136,144,144,96,5,8,8,6,0,0,32,64,0,80,136,136, - 168,112,5,7,7,6,0,255,144,160,192,160,144,136,16,5, - 8,8,6,0,0,96,144,160,128,240,136,136,112,5,7,7, - 6,0,0,112,80,56,144,144,144,96,5,6,6,6,0,0, - 152,80,32,32,32,32,5,8,8,6,0,0,64,128,152,80, - 32,32,32,32,5,8,8,6,0,0,80,0,152,80,32,32, - 32,32,5,7,7,6,0,255,48,168,168,168,168,112,32,5, - 5,5,6,0,0,248,80,80,80,88,5,6,6,6,0,255, - 136,80,112,80,136,16,5,7,7,6,0,255,112,136,136,136, - 112,32,112,5,6,6,6,0,255,112,136,136,112,32,112,5, - 6,6,6,0,0,112,136,128,112,32,112,5,7,7,6,0, - 255,8,8,112,128,112,16,96,5,6,6,6,0,0,248,128, - 128,240,128,128,4,5,5,6,0,0,240,128,224,128,128,5, - 6,6,6,0,0,248,0,0,112,0,248,4,5,5,6,0, - 0,64,128,240,16,32,5,7,7,6,0,0,224,80,40,40, - 8,8,16,5,7,7,6,0,0,192,32,80,40,8,8,8, - 5,7,7,6,0,255,168,168,168,168,88,8,112,5,6,6, - 6,0,255,168,168,168,88,8,112,5,6,6,6,0,0,104, - 136,136,120,8,8,5,6,6,6,0,255,104,136,136,120,8, - 8,4,8,8,6,0,255,128,224,144,144,144,144,32,192,5, - 5,5,6,0,0,104,144,112,16,224,5,6,6,6,0,0, - 96,144,16,96,136,112,4,6,6,6,0,0,96,144,16,96, - 128,112,5,6,6,6,0,0,136,80,32,80,136,248,5,5, - 5,6,0,0,136,80,32,80,112,5,6,6,6,0,0,120, - 128,240,136,136,112,4,5,5,6,0,0,240,128,224,144,96, - 3,6,6,6,1,0,64,224,64,64,64,64,3,6,6,6, - 1,255,64,224,64,64,64,128,5,5,5,6,0,0,136,80, - 112,80,136,5,6,6,6,0,255,112,136,136,240,128,112,4, - 5,5,6,0,0,112,128,128,128,112,2,8,8,6,1,255, - 64,0,192,64,64,64,64,128,5,7,7,6,0,0,112,136, - 136,248,136,136,112,4,5,5,6,0,0,112,128,224,128,112, - 4,5,5,6,0,0,224,16,112,16,224,5,7,7,6,0, - 0,128,240,136,136,136,240,128,4,7,7,6,0,255,128,224, - 144,144,144,224,128,5,6,6,6,0,0,112,136,128,128,136, - 112,5,6,6,6,0,0,136,216,168,136,136,136,5,6,6, - 6,0,255,136,216,168,136,136,128,5,8,8,6,0,255,112, - 136,136,136,112,64,224,64,5,6,6,6,0,0,112,136,8, - 8,136,112,5,6,6,6,0,0,112,136,160,128,136,112,5, - 6,6,6,0,0,112,136,40,8,136,112}; diff --git a/Marlin/dogm_font_data_ISO10646_Kana.h b/Marlin/dogm_font_data_ISO10646_Kana.h deleted file mode 100644 index 69683740c3..0000000000 --- a/Marlin/dogm_font_data_ISO10646_Kana.h +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: ISO10646_Kana - Copyright: A. Hardtung, public domain - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h= 8 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 8 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_Kana_5x7[2482] U8G_SECTION(".progmem.ISO10646_Kana_5x7") = { - 0, 6, 9, 0, 254, 7, 1, 145, 3, 32, 32, 255, 255, 8, 255, 7, - 255, 0, 0, 0, 6, 0, 0, 1, 7, 7, 6, 2, 0, 128, 128, 128, - 128, 128, 0, 128, 3, 2, 2, 6, 1, 5, 160, 160, 5, 7, 7, 6, - 0, 0, 80, 80, 248, 80, 248, 80, 80, 5, 7, 7, 6, 0, 0, 32, - 120, 160, 112, 40, 240, 32, 5, 7, 7, 6, 0, 0, 192, 200, 16, 32, - 64, 152, 24, 5, 7, 7, 6, 0, 0, 96, 144, 160, 64, 168, 144, 104, - 2, 3, 3, 6, 1, 4, 192, 64, 128, 3, 7, 7, 6, 1, 0, 32, - 64, 128, 128, 128, 64, 32, 3, 7, 7, 6, 1, 0, 128, 64, 32, 32, - 32, 64, 128, 5, 5, 5, 6, 0, 1, 32, 168, 112, 168, 32, 5, 5, - 5, 6, 0, 1, 32, 32, 248, 32, 32, 2, 3, 3, 6, 2, 255, 192, - 64, 128, 5, 1, 1, 6, 0, 3, 248, 2, 2, 2, 6, 2, 0, 192, - 192, 5, 5, 5, 6, 0, 1, 8, 16, 32, 64, 128, 5, 7, 7, 6, - 0, 0, 112, 136, 152, 168, 200, 136, 112, 3, 7, 7, 6, 1, 0, 64, - 192, 64, 64, 64, 64, 224, 5, 7, 7, 6, 0, 0, 112, 136, 8, 112, - 128, 128, 248, 5, 7, 7, 6, 0, 0, 248, 16, 32, 16, 8, 8, 240, - 5, 7, 7, 6, 0, 0, 16, 48, 80, 144, 248, 16, 16, 5, 7, 7, - 6, 0, 0, 248, 128, 240, 8, 8, 136, 112, 5, 7, 7, 6, 0, 0, - 48, 64, 128, 240, 136, 136, 112, 5, 7, 7, 6, 0, 0, 248, 8, 16, - 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 112, 136, 136, 112, 136, 136, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 120, 8, 16, 96, 2, 5, - 5, 6, 2, 0, 192, 192, 0, 192, 192, 2, 6, 6, 6, 2, 255, 192, - 192, 0, 192, 64, 128, 4, 7, 7, 6, 0, 0, 16, 32, 64, 128, 64, - 32, 16, 5, 3, 3, 6, 0, 2, 248, 0, 248, 4, 7, 7, 6, 1, - 0, 128, 64, 32, 16, 32, 64, 128, 5, 7, 7, 6, 0, 0, 112, 136, - 8, 16, 32, 0, 32, 5, 6, 6, 6, 0, 0, 112, 136, 8, 104, 168, - 112, 5, 7, 7, 6, 0, 0, 112, 136, 136, 248, 136, 136, 136, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 136, 136, 240, 5, 7, 7, 6, 0, - 0, 112, 136, 128, 128, 128, 136, 112, 5, 7, 7, 6, 0, 0, 224, 144, - 136, 136, 136, 144, 224, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, - 128, 248, 5, 7, 7, 6, 0, 0, 248, 128, 128, 240, 128, 128, 128, 5, - 7, 7, 6, 0, 0, 112, 136, 128, 184, 136, 136, 112, 5, 7, 7, 6, - 0, 0, 136, 136, 136, 248, 136, 136, 136, 1, 7, 7, 6, 2, 0, 128, - 128, 128, 128, 128, 128, 128, 5, 7, 7, 6, 0, 0, 56, 16, 16, 16, - 16, 144, 96, 5, 7, 7, 6, 0, 0, 136, 144, 160, 192, 160, 144, 136, - 5, 7, 7, 6, 0, 0, 128, 128, 128, 128, 128, 128, 248, 5, 7, 7, - 6, 0, 0, 136, 216, 168, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, - 136, 136, 200, 168, 152, 136, 136, 5, 7, 7, 6, 0, 0, 112, 136, 136, - 136, 136, 136, 112, 5, 7, 7, 6, 0, 0, 240, 136, 136, 240, 128, 128, - 128, 5, 7, 7, 6, 0, 0, 112, 136, 136, 136, 168, 144, 104, 5, 7, - 7, 6, 0, 0, 240, 136, 136, 240, 160, 144, 136, 5, 7, 7, 6, 0, - 0, 120, 128, 128, 112, 8, 8, 240, 5, 7, 7, 6, 0, 0, 248, 32, - 32, 32, 32, 32, 32, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, - 136, 112, 5, 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 80, 32, 5, - 7, 7, 6, 0, 0, 136, 136, 136, 136, 136, 168, 80, 5, 7, 7, 6, - 0, 0, 136, 136, 80, 32, 80, 136, 136, 5, 7, 7, 6, 0, 0, 136, - 136, 136, 80, 32, 32, 32, 5, 7, 7, 6, 0, 0, 248, 8, 16, 32, - 64, 128, 248, 3, 7, 7, 6, 1, 0, 224, 128, 128, 128, 128, 128, 224, - 5, 5, 5, 6, 0, 1, 128, 64, 32, 16, 8, 3, 7, 7, 6, 1, - 0, 224, 32, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 4, 32, 80, - 136, 5, 1, 1, 6, 0, 0, 248, 2, 2, 2, 6, 2, 5, 128, 64, - 5, 5, 5, 6, 0, 0, 112, 8, 120, 136, 120, 5, 7, 7, 6, 0, - 0, 128, 128, 176, 200, 136, 136, 240, 5, 5, 5, 6, 0, 0, 112, 128, - 128, 136, 112, 5, 7, 7, 6, 0, 0, 8, 8, 104, 152, 136, 136, 120, - 5, 5, 5, 6, 0, 0, 112, 136, 248, 128, 112, 5, 7, 7, 6, 0, - 0, 48, 72, 224, 64, 64, 64, 64, 5, 6, 6, 6, 0, 255, 112, 136, - 136, 120, 8, 112, 5, 7, 7, 6, 0, 0, 128, 128, 176, 200, 136, 136, - 136, 1, 7, 7, 6, 2, 0, 128, 0, 128, 128, 128, 128, 128, 3, 8, - 8, 6, 1, 255, 32, 0, 32, 32, 32, 32, 160, 64, 4, 7, 7, 6, - 0, 0, 128, 128, 144, 160, 192, 160, 144, 3, 7, 7, 6, 1, 0, 192, - 64, 64, 64, 64, 64, 224, 5, 5, 5, 6, 0, 0, 208, 168, 168, 168, - 168, 5, 5, 5, 6, 0, 0, 176, 200, 136, 136, 136, 5, 5, 5, 6, - 0, 0, 112, 136, 136, 136, 112, 5, 6, 6, 6, 0, 255, 240, 136, 136, - 240, 128, 128, 5, 6, 6, 6, 0, 255, 120, 136, 136, 120, 8, 8, 5, - 5, 5, 6, 0, 0, 176, 200, 128, 128, 128, 5, 5, 5, 6, 0, 0, - 112, 128, 112, 8, 240, 5, 7, 7, 6, 0, 0, 64, 64, 224, 64, 64, - 72, 48, 5, 5, 5, 6, 0, 0, 136, 136, 136, 152, 104, 5, 5, 5, - 6, 0, 0, 136, 136, 136, 80, 32, 5, 5, 5, 6, 0, 0, 136, 136, - 168, 168, 80, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 5, 6, - 6, 6, 0, 255, 136, 136, 136, 120, 8, 112, 5, 5, 5, 6, 0, 0, - 248, 16, 32, 64, 248, 3, 7, 7, 6, 1, 0, 32, 64, 64, 128, 64, - 64, 32, 1, 7, 7, 6, 2, 0, 128, 128, 128, 128, 128, 128, 128, 3, - 7, 7, 6, 1, 0, 128, 64, 64, 32, 64, 64, 128, 5, 2, 2, 6, - 0, 3, 104, 144, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 5, 3, 3, 6, 0, 1, - 248, 0, 248, 4, 4, 4, 6, 0, 0, 240, 16, 96, 64, 5, 6, 6, - 6, 0, 0, 248, 8, 40, 48, 32, 64, 3, 4, 4, 6, 1, 0, 32, - 64, 192, 64, 4, 6, 6, 6, 0, 0, 16, 32, 96, 160, 32, 32, 4, - 4, 4, 6, 0, 0, 32, 240, 144, 32, 5, 6, 6, 6, 0, 0, 32, - 248, 136, 8, 16, 32, 3, 4, 4, 6, 1, 0, 224, 64, 64, 224, 5, - 5, 5, 6, 0, 0, 248, 32, 32, 32, 248, 4, 4, 4, 6, 0, 0, - 32, 240, 96, 160, 5, 6, 6, 6, 0, 0, 16, 248, 48, 80, 144, 16, - 5, 6, 6, 6, 0, 0, 64, 248, 72, 72, 72, 144, 5, 8, 8, 6, - 0, 0, 40, 0, 64, 248, 72, 72, 72, 144, 5, 6, 6, 6, 0, 0, - 32, 248, 32, 248, 32, 32, 5, 8, 8, 6, 0, 0, 40, 0, 32, 248, - 32, 248, 32, 32, 4, 5, 5, 6, 0, 0, 112, 144, 16, 32, 192, 5, - 7, 7, 6, 0, 0, 40, 0, 112, 144, 16, 32, 192, 5, 6, 6, 6, - 0, 0, 64, 120, 144, 16, 16, 32, 5, 8, 8, 6, 0, 0, 40, 0, - 64, 120, 144, 16, 16, 32, 5, 5, 5, 6, 0, 0, 248, 8, 8, 8, - 248, 5, 7, 7, 6, 0, 0, 40, 0, 248, 8, 8, 8, 248, 5, 6, - 6, 6, 0, 0, 80, 248, 80, 16, 32, 64, 5, 8, 8, 6, 0, 0, - 40, 0, 80, 248, 80, 16, 32, 64, 5, 5, 5, 6, 0, 0, 192, 8, - 200, 16, 224, 5, 7, 7, 6, 0, 0, 40, 0, 192, 8, 200, 16, 224, - 5, 5, 5, 6, 0, 0, 248, 16, 32, 80, 136, 5, 7, 7, 6, 0, - 0, 40, 0, 248, 16, 32, 80, 136, 5, 6, 6, 6, 0, 0, 64, 248, - 72, 80, 64, 56, 5, 8, 8, 6, 0, 0, 40, 0, 64, 248, 72, 80, - 64, 56, 5, 5, 5, 6, 0, 0, 136, 136, 72, 16, 96, 5, 7, 7, - 6, 0, 0, 40, 0, 136, 136, 72, 16, 96, 5, 5, 5, 6, 0, 0, - 120, 72, 168, 16, 96, 5, 7, 7, 6, 0, 0, 40, 0, 120, 72, 168, - 16, 96, 5, 6, 6, 6, 0, 0, 16, 224, 32, 248, 32, 64, 5, 8, - 8, 6, 0, 0, 40, 0, 16, 224, 32, 248, 32, 64, 5, 4, 4, 6, - 0, 0, 168, 168, 8, 48, 5, 5, 5, 6, 0, 0, 168, 168, 8, 16, - 32, 5, 7, 7, 6, 0, 0, 40, 0, 168, 168, 8, 16, 32, 5, 6, - 6, 6, 0, 0, 112, 0, 248, 32, 32, 64, 5, 8, 8, 6, 0, 0, - 40, 0, 112, 0, 248, 32, 32, 64, 3, 6, 6, 6, 1, 0, 128, 128, - 192, 160, 128, 128, 4, 8, 8, 6, 1, 0, 80, 0, 128, 128, 192, 160, - 128, 128, 5, 6, 6, 6, 0, 0, 32, 248, 32, 32, 64, 128, 5, 5, - 5, 6, 0, 0, 112, 0, 0, 0, 248, 5, 5, 5, 6, 0, 0, 248, - 8, 80, 32, 208, 5, 6, 6, 6, 0, 0, 32, 248, 16, 32, 112, 168, - 3, 6, 6, 6, 1, 0, 32, 32, 32, 32, 64, 128, 5, 5, 5, 6, - 0, 0, 16, 136, 136, 136, 136, 5, 7, 7, 6, 0, 0, 40, 0, 16, - 136, 136, 136, 136, 5, 8, 8, 6, 0, 0, 24, 24, 0, 16, 136, 136, - 136, 136, 5, 6, 6, 6, 0, 0, 128, 128, 248, 128, 128, 120, 5, 7, - 7, 6, 0, 0, 40, 128, 128, 248, 128, 128, 120, 5, 7, 7, 6, 0, - 0, 24, 152, 128, 248, 128, 128, 120, 5, 5, 5, 6, 0, 0, 248, 8, - 8, 16, 96, 5, 7, 7, 6, 0, 0, 40, 0, 248, 8, 8, 16, 96, - 5, 8, 8, 6, 0, 0, 24, 24, 0, 248, 8, 8, 16, 96, 5, 4, - 4, 6, 0, 1, 64, 160, 16, 8, 5, 6, 6, 6, 0, 1, 40, 0, - 64, 160, 16, 8, 5, 6, 6, 6, 0, 1, 24, 24, 64, 160, 16, 8, - 5, 6, 6, 6, 0, 0, 32, 248, 32, 168, 168, 32, 5, 8, 8, 6, - 0, 0, 40, 0, 32, 248, 32, 168, 168, 32, 5, 8, 8, 6, 0, 0, - 24, 24, 32, 248, 32, 168, 168, 32, 5, 5, 5, 6, 0, 0, 248, 8, - 80, 32, 16, 4, 5, 5, 6, 1, 0, 224, 0, 224, 0, 240, 5, 5, - 5, 6, 0, 0, 32, 64, 136, 248, 8, 5, 5, 5, 6, 0, 0, 8, - 40, 16, 40, 192, 5, 5, 5, 6, 0, 0, 248, 64, 248, 64, 56, 5, - 4, 4, 6, 0, 0, 64, 248, 80, 64, 5, 6, 6, 6, 0, 0, 64, - 248, 72, 80, 64, 64, 4, 4, 4, 6, 0, 0, 96, 32, 32, 240, 5, - 5, 5, 6, 0, 0, 112, 16, 16, 16, 248, 4, 5, 5, 6, 0, 0, - 240, 16, 240, 16, 240, 5, 5, 5, 6, 0, 0, 248, 8, 248, 8, 248, - 5, 6, 6, 6, 0, 0, 112, 0, 248, 8, 16, 32, 4, 6, 6, 6, - 0, 0, 144, 144, 144, 144, 16, 32, 5, 5, 5, 6, 0, 0, 32, 160, - 168, 168, 176, 4, 5, 5, 6, 0, 0, 128, 128, 144, 160, 192, 5, 5, - 5, 6, 0, 0, 248, 136, 136, 136, 248, 4, 4, 4, 6, 0, 0, 240, - 144, 16, 32, 5, 5, 5, 6, 0, 0, 248, 136, 8, 16, 32, 5, 6, - 6, 6, 0, 0, 16, 248, 80, 80, 248, 16, 5, 5, 5, 6, 0, 0, - 248, 8, 48, 32, 248, 5, 5, 5, 6, 0, 0, 248, 8, 248, 8, 48, - 5, 5, 5, 6, 0, 0, 192, 8, 8, 16, 224, 5, 8, 8, 6, 0, - 0, 40, 0, 32, 248, 136, 8, 16, 32, 4, 4, 4, 6, 0, 0, 64, - 240, 80, 160, 4, 4, 4, 6, 0, 0, 64, 240, 32, 64, 5, 7, 7, - 6, 0, 0, 40, 0, 248, 136, 8, 16, 96, 5, 8, 8, 6, 0, 0, - 40, 0, 16, 248, 80, 80, 248, 16, 5, 7, 7, 6, 0, 0, 40, 0, - 248, 8, 48, 32, 248, 5, 7, 7, 6, 0, 0, 40, 0, 248, 8, 248, - 8, 48, 2, 2, 2, 6, 2, 2, 192, 192, 5, 1, 1, 6, 0, 2, - 248, 5, 4, 4, 6, 0, 1, 128, 96, 16, 8, 5, 5, 5, 6, 0, - 1, 40, 128, 96, 16, 8, 5, 6, 6, 6, 0, 0, 248, 8, 8, 8, - 8, 8 -}; diff --git a/Marlin/dogm_font_data_ISO10646_SK.h b/Marlin/dogm_font_data_ISO10646_SK.h deleted file mode 100644 index 7a460858d8..0000000000 --- a/Marlin/dogm_font_data_ISO10646_SK.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - Fontname: ISO10646_SK - Copyright: A. Hardtung, modified by Roman Moravcik - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 6 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-1 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-1 - X Font ascent = 7 descent=-1 - Max Font ascent = 8 descent=-1 -*/ -#include -const u8g_fntpgm_uint8_t ISO10646_SK[2203] U8G_SECTION(".progmem.ISO10646_SK") = { - 0,6,9,0,254,7,1,146,3,33,32,255,255,8,255,7, - 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, - 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, - 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, - 120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32, - 64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104, - 2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32, - 64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32, - 32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5, - 5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192, - 64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192, - 192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6, - 0,0,112,136,136,136,136,136,112,3,7,7,6,1,0,64, - 192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112, - 128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240, - 5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7, - 6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0, - 112,128,128,240,136,136,112,5,7,7,6,0,0,248,8,16, - 32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136, - 112,5,7,7,6,0,0,112,136,136,120,8,8,112,2,5, - 5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192, - 192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64, - 32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1, - 0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136, - 8,16,32,0,32,5,7,7,6,0,0,112,136,8,104,168, - 168,112,5,7,7,6,0,0,112,136,136,248,136,136,136,5, - 7,7,6,0,0,240,136,136,240,136,136,240,5,7,7,6, - 0,0,112,136,128,128,128,136,112,5,7,7,6,0,0,240, - 136,136,136,136,136,240,5,7,7,6,0,0,248,128,128,240, - 128,128,248,5,7,7,6,0,0,248,128,128,240,128,128,128, - 5,7,7,6,0,0,112,136,128,184,136,136,112,5,7,7, - 6,0,0,136,136,136,248,136,136,136,1,7,7,6,2,0, - 128,128,128,128,128,128,128,5,7,7,6,0,0,56,16,16, - 16,16,144,96,5,7,7,6,0,0,136,144,160,192,160,144, - 136,5,7,7,6,0,0,128,128,128,128,128,128,248,5,7, - 7,6,0,0,136,216,168,136,136,136,136,5,7,7,6,0, - 0,136,136,200,168,152,136,136,5,7,7,6,0,0,112,136, - 136,136,136,136,112,5,7,7,6,0,0,240,136,136,240,128, - 128,128,5,7,7,6,0,0,112,136,136,136,168,144,104,5, - 7,7,6,0,0,240,136,136,240,160,144,136,5,7,7,6, - 0,0,120,128,128,112,8,8,240,5,7,7,6,0,0,248, - 32,32,32,32,32,32,5,7,7,6,0,0,136,136,136,136, - 136,136,112,5,7,7,6,0,0,136,136,136,136,136,80,32, - 5,7,7,6,0,0,136,136,136,136,136,168,80,5,7,7, - 6,0,0,136,136,80,32,80,136,136,5,7,7,6,0,0, - 136,136,136,80,32,32,32,5,7,7,6,0,0,248,8,16, - 32,64,128,248,3,7,7,6,1,0,224,128,128,128,128,128, - 224,5,5,5,6,0,1,128,64,32,16,8,3,7,7,6, - 1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,32, - 80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,128, - 64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,6, - 0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,112, - 128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,136, - 120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,6, - 0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,112, - 136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,136, - 136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,3, - 8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,7, - 6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,0, - 192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,168, - 168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,5, - 6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,136, - 136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,8, - 5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,0, - 0,112,128,112,8,240,4,7,7,6,0,0,64,64,224,64, - 64,64,48,5,5,5,6,0,0,136,136,136,152,104,5,5, - 5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,136, - 136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,5, - 6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,0, - 0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,128, - 64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,128, - 3,7,7,6,1,0,128,64,64,32,64,64,128,5,2,2, - 6,0,2,104,144,0,0,0,6,0,0,5,8,8,6,0, - 0,16,32,112,136,136,248,136,136,5,8,8,6,0,0,80, - 0,112,136,136,248,136,136,5,8,8,6,0,0,8,16,248, - 128,128,240,128,248,3,8,8,6,1,0,32,64,224,64,64, - 64,64,224,5,8,8,6,0,0,16,32,112,136,136,136,136, - 112,5,8,8,6,0,0,32,80,112,136,136,136,136,112,5, - 8,8,6,0,0,16,32,136,136,136,136,136,112,5,8,8, - 6,0,0,16,32,136,136,80,32,32,32,5,8,8,6,0, - 0,16,32,0,112,8,120,136,120,5,7,7,6,0,0,80, - 0,112,8,120,136,120,5,8,8,6,0,0,16,32,0,112, - 136,248,128,112,2,8,8,6,2,0,64,128,0,128,128,128, - 128,128,5,8,8,6,0,0,16,32,0,112,136,136,136,112, - 5,8,8,6,0,0,32,80,0,112,136,136,136,112,5,8, - 8,6,0,0,16,32,0,136,136,136,152,104,5,9,9,6, - 0,255,16,32,0,136,136,136,120,8,112,5,8,8,6,0, - 0,80,32,112,136,128,128,136,112,5,8,8,6,0,0,80, - 32,0,112,128,128,136,112,5,8,8,6,0,0,80,32,240, - 136,136,136,136,240,6,8,8,6,0,0,4,20,24,112,144, - 144,144,112,5,8,8,6,0,0,16,32,128,128,128,128,128, - 248,3,8,8,6,1,0,32,64,0,192,64,64,64,224,5, - 8,8,6,0,0,16,144,160,128,128,128,128,248,5,8,8, - 6,1,0,8,200,80,64,64,64,64,224,5,8,8,6,0, - 0,80,32,136,200,168,152,136,136,5,8,8,6,0,0,80, - 32,0,176,200,136,136,136,5,8,8,6,0,0,16,32,240, - 136,240,160,144,136,5,8,8,6,0,0,16,32,0,176,200, - 128,128,128,5,8,8,6,0,0,80,32,120,128,128,112,8, - 240,5,8,8,6,0,0,80,32,0,112,128,112,8,240,5, - 8,8,6,0,0,80,32,248,32,32,32,32,32,6,8,8, - 6,0,0,4,68,72,224,64,64,64,48,5,8,8,6,0, - 0,80,32,248,8,48,64,128,248,5,8,8,6,0,0,80, - 32,0,248,16,32,64,248,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0, - 0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0, - 6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, - 0,0,6,0,0,0,0,0,6,0,0}; diff --git a/Marlin/dogm_font_data_Marlin_symbols.h b/Marlin/dogm_font_data_Marlin_symbols.h deleted file mode 100644 index ad9b983b20..0000000000 --- a/Marlin/dogm_font_data_Marlin_symbols.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - Fontname: Marlin_symbols - Copyright: Created with Fony 1.4.7 - Capital A Height: 0, '1' Height: 0 - Calculated Max Values w= 5 h=10 x= 0 y= 3 dx= 6 dy= 0 ascent= 8 len=10 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 0 descent= 0 - X Font ascent = 0 descent= 0 - Max Font ascent = 8 descent=-2 -*/ -#include -const u8g_fntpgm_uint8_t Marlin_symbols[140] U8G_SECTION(".progmem.Marlin_symbols") = { - 0, 6, 9, 0, 254, 0, 0, 0, 0, 0, 1, 9, 0, 8, 254, 0, - 0, 5, 8, 8, 6, 0, 0, 64, 240, 200, 136, 136, 152, 120, 16, 5, - 8, 8, 6, 0, 0, 192, 248, 136, 136, 136, 136, 136, 248, 5, 5, 5, - 6, 0, 1, 32, 48, 248, 48, 32, 5, 8, 8, 6, 0, 0, 32, 112, - 248, 32, 32, 32, 32, 224, 5, 9, 9, 6, 0, 255, 32, 112, 168, 168, - 184, 136, 136, 112, 32, 5, 9, 9, 6, 0, 255, 224, 128, 192, 176, 168, - 40, 48, 40, 40, 5, 9, 9, 6, 0, 255, 248, 168, 136, 136, 136, 136, - 136, 168, 248, 5, 10, 10, 6, 0, 254, 32, 80, 80, 80, 80, 136, 168, - 168, 136, 112, 3, 3, 3, 6, 0, 3, 64, 160, 64 -}; diff --git a/Marlin/endstops.cpp b/Marlin/endstops.cpp deleted file mode 100644 index f51a11b8af..0000000000 --- a/Marlin/endstops.cpp +++ /dev/null @@ -1,544 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * endstops.cpp - A singleton object to manage endstops - */ - -#include "Marlin.h" -#include "cardreader.h" -#include "endstops.h" -#include "temperature.h" -#include "stepper.h" -#include "ultralcd.h" - -// TEST_ENDSTOP: test the old and the current status of an endstop -#define TEST_ENDSTOP(ENDSTOP) (TEST(current_endstop_bits & old_endstop_bits, ENDSTOP)) - -Endstops endstops; - -// public: - -bool Endstops::enabled, Endstops::enabled_globally; // Initialized by settings.load() -volatile char Endstops::endstop_hit_bits; // use X_MIN, Y_MIN, Z_MIN and Z_MIN_PROBE as BIT value - -Endstops::esbits_t Endstops::current_endstop_bits = 0, - Endstops::old_endstop_bits = 0; - -#if HAS_BED_PROBE - volatile bool Endstops::z_probe_enabled = false; -#endif - -// Initialized by settings.load() -#if ENABLED(X_DUAL_ENDSTOPS) - float Endstops::x_endstop_adj; -#endif -#if ENABLED(Y_DUAL_ENDSTOPS) - float Endstops::y_endstop_adj; -#endif -#if ENABLED(Z_DUAL_ENDSTOPS) - float Endstops::z_endstop_adj; -#endif - -/** - * Class and Instance Methods - */ - -void Endstops::init() { - - #if HAS_X_MIN - #if ENABLED(ENDSTOPPULLUP_XMIN) - SET_INPUT_PULLUP(X_MIN_PIN); - #else - SET_INPUT(X_MIN_PIN); - #endif - #endif - - #if HAS_X2_MIN - #if ENABLED(ENDSTOPPULLUP_XMIN) - SET_INPUT_PULLUP(X2_MIN_PIN); - #else - SET_INPUT(X2_MIN_PIN); - #endif - #endif - - #if HAS_Y_MIN - #if ENABLED(ENDSTOPPULLUP_YMIN) - SET_INPUT_PULLUP(Y_MIN_PIN); - #else - SET_INPUT(Y_MIN_PIN); - #endif - #endif - - #if HAS_Y2_MIN - #if ENABLED(ENDSTOPPULLUP_YMIN) - SET_INPUT_PULLUP(Y2_MIN_PIN); - #else - SET_INPUT(Y2_MIN_PIN); - #endif - #endif - - #if HAS_Z_MIN - #if ENABLED(ENDSTOPPULLUP_ZMIN) - SET_INPUT_PULLUP(Z_MIN_PIN); - #else - SET_INPUT(Z_MIN_PIN); - #endif - #endif - - #if HAS_Z2_MIN - #if ENABLED(ENDSTOPPULLUP_ZMIN) - SET_INPUT_PULLUP(Z2_MIN_PIN); - #else - SET_INPUT(Z2_MIN_PIN); - #endif - #endif - - #if HAS_X_MAX - #if ENABLED(ENDSTOPPULLUP_XMAX) - SET_INPUT_PULLUP(X_MAX_PIN); - #else - SET_INPUT(X_MAX_PIN); - #endif - #endif - - #if HAS_X2_MAX - #if ENABLED(ENDSTOPPULLUP_XMAX) - SET_INPUT_PULLUP(X2_MAX_PIN); - #else - SET_INPUT(X2_MAX_PIN); - #endif - #endif - - #if HAS_Y_MAX - #if ENABLED(ENDSTOPPULLUP_YMAX) - SET_INPUT_PULLUP(Y_MAX_PIN); - #else - SET_INPUT(Y_MAX_PIN); - #endif - #endif - - #if HAS_Y2_MAX - #if ENABLED(ENDSTOPPULLUP_YMAX) - SET_INPUT_PULLUP(Y2_MAX_PIN); - #else - SET_INPUT(Y2_MAX_PIN); - #endif - #endif - - #if HAS_Z_MAX - #if ENABLED(ENDSTOPPULLUP_ZMAX) - SET_INPUT_PULLUP(Z_MAX_PIN); - #else - SET_INPUT(Z_MAX_PIN); - #endif - #endif - - #if HAS_Z2_MAX - #if ENABLED(ENDSTOPPULLUP_ZMAX) - SET_INPUT_PULLUP(Z2_MAX_PIN); - #else - SET_INPUT(Z2_MAX_PIN); - #endif - #endif - - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) - SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); - #else - SET_INPUT(Z_MIN_PROBE_PIN); - #endif - #endif - -} // Endstops::init - -void Endstops::report_state() { - if (endstop_hit_bits) { - #if ENABLED(ULTRA_LCD) - char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; - #define _SET_STOP_CHAR(A,C) (chr## A = C) - #else - #define _SET_STOP_CHAR(A,C) ; - #endif - - #define _ENDSTOP_HIT_ECHO(A,C) do{ \ - SERIAL_ECHOPAIR(" " STRINGIFY(A) ":", stepper.triggered_position_mm(A ##_AXIS)); \ - _SET_STOP_CHAR(A,C); }while(0) - - #define _ENDSTOP_HIT_TEST(A,C) \ - if (TEST(endstop_hit_bits, A ##_MIN) || TEST(endstop_hit_bits, A ##_MAX)) \ - _ENDSTOP_HIT_ECHO(A,C) - - #define ENDSTOP_HIT_TEST_X() _ENDSTOP_HIT_TEST(X,'X') - #define ENDSTOP_HIT_TEST_Y() _ENDSTOP_HIT_TEST(Y,'Y') - #define ENDSTOP_HIT_TEST_Z() _ENDSTOP_HIT_TEST(Z,'Z') - - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT); - ENDSTOP_HIT_TEST_X(); - ENDSTOP_HIT_TEST_Y(); - ENDSTOP_HIT_TEST_Z(); - - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - #define P_AXIS Z_AXIS - if (TEST(endstop_hit_bits, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); - #endif - SERIAL_EOL(); - - #if ENABLED(ULTRA_LCD) - lcd_status_printf_P(0, PSTR(MSG_LCD_ENDSTOPS " %c %c %c %c"), chrX, chrY, chrZ, chrP); - #endif - - hit_on_purpose(); - - #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && ENABLED(SDSUPPORT) - if (stepper.abort_on_endstop_hit) { - card.sdprinting = false; - card.closefile(); - quickstop_stepper(); - thermalManager.disable_all_heaters(); // switch off all heaters. - } - #endif - } -} // Endstops::report_state - -void Endstops::M119() { - SERIAL_PROTOCOLLNPGM(MSG_M119_REPORT); - #define ES_REPORT(AXIS) do{ \ - SERIAL_PROTOCOLPGM(MSG_##AXIS); \ - SERIAL_PROTOCOLLN(((READ(AXIS##_PIN)^AXIS##_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); \ - }while(0) - #if HAS_X_MIN - ES_REPORT(X_MIN); - #endif - #if HAS_X2_MIN - ES_REPORT(X2_MIN); - #endif - #if HAS_X_MAX - ES_REPORT(X_MAX); - #endif - #if HAS_X2_MAX - ES_REPORT(X2_MAX); - #endif - #if HAS_Y_MIN - ES_REPORT(Y_MIN); - #endif - #if HAS_Y2_MIN - ES_REPORT(Y2_MIN); - #endif - #if HAS_Y_MAX - ES_REPORT(Y_MAX); - #endif - #if HAS_Y2_MAX - ES_REPORT(Y2_MAX); - #endif - #if HAS_Z_MIN - ES_REPORT(Z_MIN); - #endif - #if HAS_Z2_MIN - ES_REPORT(Z2_MIN); - #endif - #if HAS_Z_MAX - ES_REPORT(Z_MAX); - #endif - #if HAS_Z2_MAX - ES_REPORT(Z2_MAX); - #endif - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - SERIAL_PROTOCOLPGM(MSG_Z_PROBE); - SERIAL_PROTOCOLLN(((READ(Z_MIN_PROBE_PIN)^Z_MIN_PROBE_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); - #endif - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - SERIAL_PROTOCOLPGM(MSG_FILAMENT_RUNOUT_SENSOR); - SERIAL_PROTOCOLLN(((READ(FIL_RUNOUT_PIN)^FIL_RUNOUT_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); - #endif -} // Endstops::M119 - -#if ENABLED(X_DUAL_ENDSTOPS) - void Endstops::test_dual_x_endstops(const EndstopEnum es1, const EndstopEnum es2) { - const byte x_test = TEST_ENDSTOP(es1) | (TEST_ENDSTOP(es2) << 1); // bit 0 for X, bit 1 for X2 - if (x_test && stepper.current_block->steps[X_AXIS] > 0) { - SBI(endstop_hit_bits, X_MIN); - if (!stepper.performing_homing || (x_test == 0x3)) //if not performing home or if both endstops were trigged during homing... - stepper.kill_current_block(); - } - } -#endif -#if ENABLED(Y_DUAL_ENDSTOPS) - void Endstops::test_dual_y_endstops(const EndstopEnum es1, const EndstopEnum es2) { - const byte y_test = TEST_ENDSTOP(es1) | (TEST_ENDSTOP(es2) << 1); // bit 0 for Y, bit 1 for Y2 - if (y_test && stepper.current_block->steps[Y_AXIS] > 0) { - SBI(endstop_hit_bits, Y_MIN); - if (!stepper.performing_homing || (y_test == 0x3)) //if not performing home or if both endstops were trigged during homing... - stepper.kill_current_block(); - } - } -#endif -#if ENABLED(Z_DUAL_ENDSTOPS) - void Endstops::test_dual_z_endstops(const EndstopEnum es1, const EndstopEnum es2) { - const byte z_test = TEST_ENDSTOP(es1) | (TEST_ENDSTOP(es2) << 1); // bit 0 for Z, bit 1 for Z2 - if (z_test && stepper.current_block->steps[Z_AXIS] > 0) { - SBI(endstop_hit_bits, Z_MIN); - if (!stepper.performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... - stepper.kill_current_block(); - } - } -#endif - -// Check endstops - Called from ISR! -void Endstops::update() { - - #define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX - #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN - #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING - #define _ENDSTOP_HIT(AXIS, MINMAX) SBI(endstop_hit_bits, _ENDSTOP(AXIS, MINMAX)) - - #define SET_BIT(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) - // UPDATE_ENDSTOP_BIT: set the current endstop bits for an endstop to its status - #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT(current_endstop_bits, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) - // COPY_BIT: copy the value of SRC_BIT to DST_BIT in DST - #define COPY_BIT(DST, SRC_BIT, DST_BIT) SET_BIT(DST, DST_BIT, TEST(DST, SRC_BIT)) - - #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ - UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \ - if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX))) { \ - _ENDSTOP_HIT(AXIS, MINMAX); \ - stepper.endstop_triggered(_AXIS(AXIS)); \ - } \ - }while(0) - - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) - // If G38 command is active check Z_MIN_PROBE for ALL movement - if (G38_move) { - UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); - if (TEST_ENDSTOP(_ENDSTOP(Z, MIN_PROBE))) { - if (stepper.current_block->steps[_AXIS(X)] > 0) { _ENDSTOP_HIT(X, MIN); stepper.endstop_triggered(_AXIS(X)); } - else if (stepper.current_block->steps[_AXIS(Y)] > 0) { _ENDSTOP_HIT(Y, MIN); stepper.endstop_triggered(_AXIS(Y)); } - else if (stepper.current_block->steps[_AXIS(Z)] > 0) { _ENDSTOP_HIT(Z, MIN); stepper.endstop_triggered(_AXIS(Z)); } - G38_endstop_hit = true; - } - } - #endif - - /** - * Define conditions for checking endstops - */ - - #if IS_CORE - #define S_(N) stepper.current_block->steps[CORE_AXIS_##N] - #define D_(N) stepper.motor_direction(CORE_AXIS_##N) - #endif - - #if CORE_IS_XY || CORE_IS_XZ - /** - * Head direction in -X axis for CoreXY and CoreXZ bots. - * - * If steps differ, both axes are moving. - * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z, handled below) - * If DeltaA == DeltaB, the movement is only in the 1st axis (X) - */ - #if ENABLED(COREXY) || ENABLED(COREXZ) - #define X_CMP == - #else - #define X_CMP != - #endif - #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) X_CMP D_(2)) ) - #define X_AXIS_HEAD X_HEAD - #else - #define X_MOVE_TEST stepper.current_block->steps[X_AXIS] > 0 - #define X_AXIS_HEAD X_AXIS - #endif - - #if CORE_IS_XY || CORE_IS_YZ - /** - * Head direction in -Y axis for CoreXY / CoreYZ bots. - * - * If steps differ, both axes are moving - * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y) - * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z) - */ - #if ENABLED(COREYX) || ENABLED(COREYZ) - #define Y_CMP == - #else - #define Y_CMP != - #endif - #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Y_CMP D_(2)) ) - #define Y_AXIS_HEAD Y_HEAD - #else - #define Y_MOVE_TEST stepper.current_block->steps[Y_AXIS] > 0 - #define Y_AXIS_HEAD Y_AXIS - #endif - - #if CORE_IS_XZ || CORE_IS_YZ - /** - * Head direction in -Z axis for CoreXZ or CoreYZ bots. - * - * If steps differ, both axes are moving - * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y, already handled above) - * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Z) - */ - #if ENABLED(COREZX) || ENABLED(COREZY) - #define Z_CMP == - #else - #define Z_CMP != - #endif - #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Z_CMP D_(2)) ) - #define Z_AXIS_HEAD Z_HEAD - #else - #define Z_MOVE_TEST stepper.current_block->steps[Z_AXIS] > 0 - #define Z_AXIS_HEAD Z_AXIS - #endif - - // With Dual X, endstops are only checked in the homing direction for the active extruder - #if ENABLED(DUAL_X_CARRIAGE) - #define E0_ACTIVE stepper.current_block->active_extruder == 0 - #define X_MIN_TEST ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) - #define X_MAX_TEST ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) - #else - #define X_MIN_TEST true - #define X_MAX_TEST true - #endif - - /** - * Check and update endstops according to conditions - */ - if (stepper.current_block) { - - if (X_MOVE_TEST) { - if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction - #if HAS_X_MIN - #if ENABLED(X_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(X, MIN); - #if HAS_X2_MIN - UPDATE_ENDSTOP_BIT(X2, MIN); - #else - COPY_BIT(current_endstop_bits, X_MIN, X2_MIN); - #endif - test_dual_x_endstops(X_MIN, X2_MIN); - #else - if (X_MIN_TEST) UPDATE_ENDSTOP(X, MIN); - #endif - #endif - } - else { // +direction - #if HAS_X_MAX - #if ENABLED(X_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(X, MAX); - #if HAS_X2_MAX - UPDATE_ENDSTOP_BIT(X2, MAX); - #else - COPY_BIT(current_endstop_bits, X_MAX, X2_MAX); - #endif - test_dual_x_endstops(X_MAX, X2_MAX); - #else - if (X_MAX_TEST) UPDATE_ENDSTOP(X, MAX); - #endif - #endif - } - } - - if (Y_MOVE_TEST) { - if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction - #if HAS_Y_MIN - #if ENABLED(Y_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Y, MIN); - #if HAS_Y2_MIN - UPDATE_ENDSTOP_BIT(Y2, MIN); - #else - COPY_BIT(current_endstop_bits, Y_MIN, Y2_MIN); - #endif - test_dual_y_endstops(Y_MIN, Y2_MIN); - #else - UPDATE_ENDSTOP(Y, MIN); - #endif - #endif - } - else { // +direction - #if HAS_Y_MAX - #if ENABLED(Y_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Y, MAX); - #if HAS_Y2_MAX - UPDATE_ENDSTOP_BIT(Y2, MAX); - #else - COPY_BIT(current_endstop_bits, Y_MAX, Y2_MAX); - #endif - test_dual_y_endstops(Y_MAX, Y2_MAX); - #else - UPDATE_ENDSTOP(Y, MAX); - #endif - #endif - } - } - - if (Z_MOVE_TEST) { - if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. - #if HAS_Z_MIN - #if ENABLED(Z_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Z, MIN); - #if HAS_Z2_MIN - UPDATE_ENDSTOP_BIT(Z2, MIN); - #else - COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN); - #endif - test_dual_z_endstops(Z_MIN, Z2_MIN); - #else - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - if (z_probe_enabled) UPDATE_ENDSTOP(Z, MIN); - #else - UPDATE_ENDSTOP(Z, MIN); - #endif - #endif - #endif - - // When closing the gap check the enabled probe - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - if (z_probe_enabled) { - UPDATE_ENDSTOP(Z, MIN_PROBE); - if (TEST_ENDSTOP(Z_MIN_PROBE)) SBI(endstop_hit_bits, Z_MIN_PROBE); - } - #endif - } - else { // Z +direction. Gantry up, bed down. - #if HAS_Z_MAX - // Check both Z dual endstops - #if ENABLED(Z_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Z, MAX); - #if HAS_Z2_MAX - UPDATE_ENDSTOP_BIT(Z2, MAX); - #else - COPY_BIT(current_endstop_bits, Z_MAX, Z2_MAX); - #endif - test_dual_z_endstops(Z_MAX, Z2_MAX); - // If this pin is not hijacked for the bed probe - // then it belongs to the Z endstop - #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN - UPDATE_ENDSTOP(Z, MAX); - #endif - #endif - } - } - - } // stepper.current_block - - old_endstop_bits = current_endstop_bits; - -} // Endstops::update() diff --git a/Marlin/enum.h b/Marlin/enum.h deleted file mode 100644 index 378e47f320..0000000000 --- a/Marlin/enum.h +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#ifndef __ENUM_H__ -#define __ENUM_H__ - -#include "MarlinConfig.h" - -/** - * Axis indices as enumerated constants - * - * Special axis: - * - A_AXIS and B_AXIS are used by COREXY printers - * - X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship - * between X_AXIS and X Head movement, like CoreXY bots - */ -enum AxisEnum : unsigned char { - X_AXIS = 0, - A_AXIS = 0, - Y_AXIS = 1, - B_AXIS = 1, - Z_AXIS = 2, - C_AXIS = 2, - E_AXIS = 3, - X_HEAD = 4, - Y_HEAD = 5, - Z_HEAD = 6, - ALL_AXES = 0xFE, - NO_AXIS = 0xFF -}; - -#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=S; VAR<=N; VAR++) -#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=S; VAR. - * - */ - -#include "MarlinConfig.h" -#include "parser.h" - -#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(M100_FREE_MEMORY_WATCHER) || ENABLED(DEBUG_GCODE_PARSER) - -#include "Marlin.h" -#include "hex_print_routines.h" - -static char _hex[7] = "0x0000"; - -char* hex_byte(const uint8_t b) { - _hex[4] = hex_nybble(b >> 4); - _hex[5] = hex_nybble(b); - return &_hex[4]; -} - -char* hex_word(const uint16_t w) { - _hex[2] = hex_nybble(w >> 12); - _hex[3] = hex_nybble(w >> 8); - _hex[4] = hex_nybble(w >> 4); - _hex[5] = hex_nybble(w); - return &_hex[2]; -} - -char* hex_address(const void * const w) { - (void)hex_word((uint16_t)w); - return _hex; -} - -void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } -void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } -void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } -void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } - -#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER || DEBUG_GCODE_PARSER diff --git a/Marlin/language_cn.h b/Marlin/language_cn.h deleted file mode 100644 index 96c6f666d5..0000000000 --- a/Marlin/language_cn.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Chinese - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_CN_H -#define LANGUAGE_CN_H - -#define DISPLAY_CHARSET_ISO10646_CN -#define CHARSIZE 2 - -#define WELCOME_MSG "\xa4\xa5\xa6\xa7" -#define MSG_SD_INSERTED "\xa8\xa9\xaa\xab" -#define MSG_SD_REMOVED "\xa8\xa9\xac\xad" -#define MSG_MAIN "\xae\xaf\xb0" -#define MSG_AUTOSTART "\xb1\xb2\xb3\xb4" -#define MSG_DISABLE_STEPPERS "\xb5\xb6\xb7\xb8\xb9\xba" -#define MSG_AUTO_HOME "\xbb\xbc\xbd" -#define MSG_LEVEL_BED_HOMING "Homing XYZ" -#define MSG_LEVEL_BED_WAITING "Click to Begin" -#define MSG_LEVEL_BED_DONE "Leveling Done!" -#define MSG_SET_HOME_OFFSETS "\xbe\xbf\xbb\xbc\xbd\xc0\xc1" -#define MSG_HOME_OFFSETS_APPLIED "Offsets applied" -#define MSG_SET_ORIGIN "\xbe\xbf\xbc\xbd" -#define MSG_PREHEAT_1 "\xc3\xc4 PLA" -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 " " -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 " \xc5\xc6" -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 " \xc4\xc7" -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 " \xbe\xbf" -#define MSG_PREHEAT_2 "\xc3\xc4 ABS" -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 " " -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 " \xc5\xc6" -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 " \xbe\xc6" -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 " \xbe\xbf" -#define MSG_COOLDOWN "\xc8\xc9" -#define MSG_SWITCH_PS_ON "\xb9\xcb\xca\xb3" -#define MSG_SWITCH_PS_OFF "\xb9\xcb\xb5\xb6" -#define MSG_EXTRUDE "\xcc\xad" -#define MSG_RETRACT "\xbb\xcd" -#define MSG_MOVE_AXIS "\xc1\xb2\xce" -#define MSG_BED_LEVELING "\xcf\xe0\xc4\xc7" -#define MSG_LEVEL_BED "\xcf\xe0\xc4\xc7" -#define MSG_MOVE_X "\xc1\xb2 X" -#define MSG_MOVE_Y "\xc1\xb2 Y" -#define MSG_MOVE_Z "\xc1\xb2 Z" -#define MSG_MOVE_E "\xcc\xad\xba" -#define MSG_MOVE_01MM "\xc1\xb2 0.1mm" -#define MSG_MOVE_1MM "\xc1\xb2 1mm" -#define MSG_MOVE_10MM "\xc1\xb2 10mm" -#define MSG_SPEED "\xd1\xd2" -#define MSG_NOZZLE "\xd3\xd4" -#define MSG_BED "\xc4\xc7" -#define MSG_FAN_SPEED "\xd5\xd6\xd1\xd2" -#define MSG_FLOW "\xcc\xad\xd1\xd2" -#define MSG_CONTROL "\xd8\xd9" -#define MSG_MIN LCD_STR_THERMOMETER " \xda\xdb" -#define MSG_MAX LCD_STR_THERMOMETER " \xda\xdc" -#define MSG_FACTOR LCD_STR_THERMOMETER " \xdd\xde" -#define MSG_AUTOTEMP "\xb1\xb2\xd8\xc9" -#define MSG_ON "\xb3 " // intentional space to shift wide symbol to the left -#define MSG_OFF "\xb5 " // intentional space to shift wide symbol to the left -#define MSG_PID_P "PID-P" -#define MSG_PID_I "PID-I" -#define MSG_PID_D "PID-D" -#define MSG_PID_C "PID-C" -#define MSG_ACC "Accel" -#define MSG_JERK "Jerk" -#if IS_KINEMATIC - #define MSG_VA_JERK "Va-jerk" - #define MSG_VB_JERK "Vb-jerk" - #define MSG_VC_JERK "Vc-jerk" -#else - #define MSG_VA_JERK "Vx-jerk" - #define MSG_VB_JERK "Vy-jerk" - #define MSG_VC_JERK "Vz-jerk" -#endif -#define MSG_VE_JERK "Ve-jerk" -#define MSG_VMAX "Vmax " -#define MSG_VMIN "Vmin" -#define MSG_VTRAV_MIN "VTrav min" -#define MSG_AMAX "Amax " -#define MSG_A_RETRACT "A-retract" -#define MSG_A_TRAVEL "A-travel" -#define MSG_STEPS_PER_MM "Steps/mm" -#define MSG_ESTEPS "Esteps/mm" -#define MSG_E1STEPS "E1steps/mm" -#define MSG_E2STEPS "E2steps/mm" -#define MSG_E3STEPS "E3steps/mm" -#define MSG_E4STEPS "E4steps/mm" -#define MSG_E5STEPS "E5steps/mm" -#define MSG_TEMPERATURE "\xc9\xd2" -#define MSG_MOTION "\xdf\xb2" -#define MSG_FILAMENT "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_FILAMENT_DIAM "Fil. Dia." -#define MSG_CONTRAST "LCD contrast" -#define MSG_STORE_EEPROM "Store memory" -#define MSG_LOAD_EEPROM "Load memory" -#define MSG_RESTORE_FAILSAFE "Restore failsafe" -#define MSG_REFRESH "Refresh" -#define MSG_WATCH "\xec\xed\xee\xef" -#define MSG_PREPARE "\xa4\xa5" -#define MSG_TUNE "\xcf\xf0" -#define MSG_PAUSE_PRINT "\xf1\xf2\xca\xf3" -#define MSG_RESUME_PRINT "\xf4\xf5\xca\xf3" -#define MSG_STOP_PRINT "\xf2\xf6\xca\xf3" -#define MSG_CARD_MENU "\xaf\xb0" -#define MSG_NO_CARD "\xf9\xa8" -#define MSG_DWELL "Sleep..." -#define MSG_USERWAIT "Wait for user..." -#define MSG_PRINT_ABORTED "Print aborted" -#define MSG_NO_MOVE "No move." -#define MSG_KILLED "KILLED. " -#define MSG_STOPPED "STOPPED. " -#define MSG_CONTROL_RETRACT "Retract mm" -#define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm" -#define MSG_CONTROL_RETRACTF "Retract V" -#define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" -#define MSG_CONTROL_RETRACT_RECOVER "UnRet mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet mm" -#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" -#define MSG_AUTORETRACT "AutoRetr." -#define MSG_FILAMENTCHANGE "Change filament" -#define MSG_INIT_SDCARD "Init. SD card" -#define MSG_CNG_SDCARD "Change SD card" -#define MSG_ZPROBE_OUT "Z probe out. bed" -#define MSG_HOME "Home" // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST "first" -#define MSG_ZPROBE_ZOFFSET "Z Offset" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort" -#define MSG_HEATING_FAILED_LCD "Heating failed" -#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP" -#define MSG_THERMAL_RUNAWAY "THERMAL RUNAWAY" -#define MSG_ERR_MAXTEMP "Err: MAXTEMP" -#define MSG_ERR_MINTEMP "Err: MINTEMP" -#define MSG_ERR_MAXTEMP_BED "Err: MAXTEMP BED" -#define MSG_DELTA_CALIBRATE "Delta Calibration" -#define MSG_DELTA_CALIBRATE_X "Calibrate X" -#define MSG_DELTA_CALIBRATE_Y "Calibrate Y" -#define MSG_DELTA_CALIBRATE_Z "Calibrate Z" -#define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" - -#endif // LANGUAGE_CN_H diff --git a/Marlin/language_cz.h b/Marlin/language_cz.h deleted file mode 100644 index 95f3cdfba0..0000000000 --- a/Marlin/language_cz.h +++ /dev/null @@ -1,399 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Czech - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - * Translated by Petr Zahradnik, Computer Laboratory - * Blog and video blog Zahradnik se bavi - * http://www.zahradniksebavi.cz - * - */ -#ifndef LANGUAGE_CZ_H -#define LANGUAGE_CZ_H - -#define DISPLAY_CHARSET_ISO10646_1 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" pripraven.") -#define MSG_BACK _UxGT("Zpet") -#define MSG_SD_INSERTED _UxGT("Karta vlozena") -#define MSG_SD_REMOVED _UxGT("Karta vyjmuta") -#define MSG_LCD_ENDSTOPS _UxGT("Endstopy") // max 8 znaku -#define MSG_MAIN _UxGT("Hlavni nabidka") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Uvolnit motory") -#define MSG_DEBUG_MENU _UxGT("Nabidka ladeni") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test uk.prubehu") -#define MSG_AUTO_HOME _UxGT("Domovska pozice") -#define MSG_AUTO_HOME_X _UxGT("Domu osa X") -#define MSG_AUTO_HOME_Y _UxGT("Domu osa Y") -#define MSG_AUTO_HOME_Z _UxGT("Domu osa Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Mereni podlozky") -#define MSG_LEVEL_BED_WAITING _UxGT("Kliknutim spustte") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Dalsi bod") -#define MSG_LEVEL_BED_DONE _UxGT("Mereni hotovo!") -#define MSG_Z_FADE_HEIGHT _UxGT("Vyska srovnavani") -#define MSG_SET_HOME_OFFSETS _UxGT("Nastavit ofsety") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Ofsety nastaveny") -#define MSG_SET_ORIGIN _UxGT("Nastavit pocatek") -#define MSG_PREHEAT_1 _UxGT("Zahrat PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" vse") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podloz") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast") -#define MSG_PREHEAT_2 _UxGT("Zahrat ABS") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" vse") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podloz") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast") -#define MSG_COOLDOWN _UxGT("Zchladit") -#define MSG_SWITCH_PS_ON _UxGT("Zapnout napajeni") -#define MSG_SWITCH_PS_OFF _UxGT("Vypnout napajeni") -#define MSG_EXTRUDE _UxGT("Vytlacit (extr.)") -#define MSG_RETRACT _UxGT("Zatlacit (retr.)") -#define MSG_MOVE_AXIS _UxGT("Posunout osy") -#define MSG_BED_LEVELING _UxGT("Vyrovnat podlozku") -#define MSG_LEVEL_BED _UxGT("Vyrovnat podlozku") -#define MSG_LEVEL_CORNERS _UxGT("Vyrovnat rohy") -#define MSG_NEXT_CORNER _UxGT("Dalsi roh") -#define MSG_EDITING_STOPPED _UxGT("Konec uprav site") - -#define MSG_UBL_DOING_G29 _UxGT("Provadim G29") -#define MSG_UBL_UNHOMED _UxGT("Prejedte domu") -#define MSG_UBL_TOOLS _UxGT("UBL nastroje") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Manualni sit bodu") -#define MSG_UBL_BC_INSERT _UxGT("Vlozte kartu, zmerte") -#define MSG_UBL_BC_INSERT2 _UxGT("Zmerte") -#define MSG_UBL_BC_REMOVE _UxGT("Odstrante a zmerte") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Presoun na dalsi") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Aktivovat UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deaktivovat UBL") -#define MSG_UBL_SET_BED_TEMP _UxGT("Teplota podlozky") -#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP -#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Teplota hotendu") -#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP -#define MSG_UBL_MESH_EDIT _UxGT("Uprava site bodu") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Upravit vlastni sit") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Doladit sit bodu") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Konec uprav site") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Vlastni sit") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Vytvorit sit") -#define MSG_UBL_BUILD_PLA_MESH _UxGT("Sit bodu PLA") -#define MSG_UBL_BUILD_ABS_MESH _UxGT("Sit bodu ABS") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Studena sit bodu") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Upravit vysku site") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Vyska") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Zkontrolovat sit") -#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Kontrola site PLA") -#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Kontrola site ABS") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Kontrola vlast. site") -#define MSG_UBL_CONTINUE_MESH _UxGT("Pokracovat v siti") -#define MSG_UBL_MESH_LEVELING _UxGT("Sitove rovnani") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-bodove rovnani") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Mrizkove rovnani") -#define MSG_UBL_MESH_LEVEL _UxGT("Srovnat podlozku") -#define MSG_UBL_SIDE_POINTS _UxGT("Postranni body") -#define MSG_UBL_MAP_TYPE _UxGT("Typ site bodu") -#define MSG_UBL_OUTPUT_MAP _UxGT("Exportovat sit") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovat do PC") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovat do CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Zaloha do PC") -#define MSG_UBL_INFO_UBL _UxGT("Info o UBL do PC") -#define MSG_UBL_EDIT_MESH_MENU _UxGT("Upravit sit dobu") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mrizky") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Rucni hustota") -#define MSG_UBL_SMART_FILLIN _UxGT("Chytra hustota") -#define MSG_UBL_FILLIN_MESH _UxGT("Zaplnit mrizku") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Zrusit vsechno") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrusit posledni") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Upravit vsechny") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Upravit posledni") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Uloziste siti") -#define MSG_UBL_STORAGE_SLOT _UxGT("Pametovy slot") -#define MSG_UBL_LOAD_MESH _UxGT("Nacist sit bodu") -#define MSG_UBL_SAVE_MESH _UxGT("Ulozit sit bodu") -#define MSG_MESH_LOADED _UxGT("Sit %i nactena") -#define MSG_NO_STORAGE _UxGT("Nedostatek mista") -#define MSG_MESH_SAVED _UxGT("Sit %i ulozena") -#define MSG_UBL_SAVE_ERROR _UxGT("Err: Ulozit UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Obnovit UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Konec Z-Offsetu") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Postupne") - -#define MSG_LED_CONTROL _UxGT("LED Nastaveni") -#define MSG_LEDS_ON _UxGT("Svetla Zap") -#define MSG_LEDS_OFF _UxGT("Svetla Vyp") -#define MSG_LED_PRESETS _UxGT("Svetla Predvolby") -#define MSG_SET_LEDS_RED _UxGT("Cervena") -#define MSG_SET_LEDS_ORANGE _UxGT("Oranzova") -#define MSG_SET_LEDS_YELLOW _UxGT("Zluta") -#define MSG_SET_LEDS_GREEN _UxGT("Zelena") -#define MSG_SET_LEDS_BLUE _UxGT("Modra") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Fialova") -#define MSG_SET_LEDS_WHITE _UxGT("Bila") -#define MSG_SET_LEDS_DEFAULT _UxGT("Vychozi") -#define MSG_CUSTOM_LEDS _UxGT("Vlastni svetla") -#define MSG_INTENSITY_R _UxGT("Cervena intenzita") -#define MSG_INTENSITY_G _UxGT("Zelena intezita") -#define MSG_INTENSITY_B _UxGT("Modra intenzita") -#define MSG_INTENSITY_W _UxGT("Bila intenzita") -#define MSG_LED_BRIGHTNESS _UxGT("Jas") - -#define MSG_USER_MENU _UxGT("Vlastni prikazy") -#define MSG_MOVING _UxGT("Posouvani...") -#define MSG_FREE_XY _UxGT("Uvolnit XY") -#define MSG_MOVE_X _UxGT("Posunout X") -#define MSG_MOVE_Y _UxGT("Posunout Y") -#define MSG_MOVE_Z _UxGT("Posunout Z") -#define MSG_MOVE_E _UxGT("Extruder") -#define MSG_MOVE_01MM _UxGT("Posunout o 0,1mm") -#define MSG_MOVE_1MM _UxGT("Posunout o 1mm") -#define MSG_MOVE_10MM _UxGT("Posunout o 10mm") -#define MSG_SPEED _UxGT("Rychlost") -#define MSG_BED_Z _UxGT("Vyska podl.") -#define MSG_NOZZLE _UxGT("Tryska") -#define MSG_BED _UxGT("Podlozka") -#define MSG_FAN_SPEED _UxGT("Rychlost vent.") -#define MSG_EXTRA_FAN_SPEED _UxGT("Rychlost ex. vent.") -#define MSG_FLOW _UxGT("Prutok") -#define MSG_CONTROL _UxGT("Ovladani") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") -#define MSG_AUTOTEMP _UxGT("Autoteplota") -#define MSG_ON _UxGT("Zap") -#define MSG_OFF _UxGT("Vyp") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Vybrat") -#define MSG_ACC _UxGT("Zrychl") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VELOCITY _UxGT("Rychlost") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VTrav min") -#define MSG_ACCELERATION _UxGT("Akcelerace") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A-retrakt") -#define MSG_A_TRAVEL _UxGT("A-prejezd") -#define MSG_STEPS_PER_MM _UxGT("Kroku/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("Akroku/mm") - #define MSG_BSTEPS _UxGT("Bkroku/mm") - #define MSG_CSTEPS _UxGT("Ckroku/mm") -#else - #define MSG_ASTEPS _UxGT("Xkroku/mm") - #define MSG_BSTEPS _UxGT("Ykroku/mm") - #define MSG_CSTEPS _UxGT("Zkroku/mm") -#endif -#define MSG_ESTEPS _UxGT("Ekroku/mm") -#define MSG_E1STEPS _UxGT("E1kroku/mm") -#define MSG_E2STEPS _UxGT("E2kroku/mm") -#define MSG_E3STEPS _UxGT("E3kroku/mm") -#define MSG_E4STEPS _UxGT("E4kroku/mm") -#define MSG_E5STEPS _UxGT("E5kroku/mm") -#define MSG_TEMPERATURE _UxGT("Teplota") -#define MSG_MOTION _UxGT("Pohyb") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E na mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Prum.") -#define MSG_FILAMENT_UNLOAD _UxGT("Vysunout mm") -#define MSG_FILAMENT_LOAD _UxGT("Zavest mm") -#define MSG_ADVANCE_K _UxGT("K pro posun") -#define MSG_CONTRAST _UxGT("Kontrast LCD") -#define MSG_STORE_EEPROM _UxGT("Ulozit nastaveni") -#define MSG_LOAD_EEPROM _UxGT("Nacist nastaveni") -#define MSG_RESTORE_FAILSAFE _UxGT("Obnovit vychozi") -#define MSG_INIT_EEPROM _UxGT("Inic. EEPROM") -#define MSG_REFRESH _UxGT("Obnovit") -#define MSG_WATCH _UxGT("Info obrazovka") -#define MSG_PREPARE _UxGT("Priprava tisku") -#define MSG_TUNE _UxGT("Doladeni tisku") -#define MSG_PAUSE_PRINT _UxGT("Pozastavit tisk") -#define MSG_RESUME_PRINT _UxGT("Obnovit tisk") -#define MSG_STOP_PRINT _UxGT("Zastavit tisk") -#define MSG_CARD_MENU _UxGT("Tisknout z SD") -#define MSG_NO_CARD _UxGT("Zadna SD karta") -#define MSG_DWELL _UxGT("Uspano...") -#define MSG_USERWAIT _UxGT("Cekani na uziv...") -#define MSG_PRINT_PAUSED _UxGT("Tisk pozastaven") -#define MSG_PRINT_ABORTED _UxGT("Tisk zrusen") -#define MSG_NO_MOVE _UxGT("Zadny pohyb.") -#define MSG_KILLED _UxGT("PRERUSENO. ") -#define MSG_STOPPED _UxGT("ZASTAVENO. ") -#define MSG_CONTROL_RETRACT _UxGT("Retrakt mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Vymena Re.mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraktovat V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Zvednuti Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") -#define MSG_AUTORETRACT _UxGT("AutoRetr.") -#define MSG_FILAMENTCHANGE _UxGT("Vymenit filament") -#define MSG_FILAMENTLOAD _UxGT("Zavest filament") -#define MSG_FILAMENTUNLOAD _UxGT("Vysunout filament") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Vysunout vse") - -#define MSG_INIT_SDCARD _UxGT("Nacist SD kartu") -#define MSG_CNG_SDCARD _UxGT("Vymenit SD kartu") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z mimo podl") -#define MSG_SKEW_FACTOR _UxGT("Faktor zkoseni") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("BLTouch Reset") -#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch Vysunout") -#define MSG_BLTOUCH_STOW _UxGT("BLTouch Zasunout") -#define MSG_HOME _UxGT("Domu") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("prvni") -#define MSG_ZPROBE_ZOFFSET _UxGT("Z ofset") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") -#define MSG_HEATING_FAILED_LCD _UxGT("Chyba zahrivani") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEPLOTA") -#define MSG_THERMAL_RUNAWAY _UxGT("TEPLOTNI SKOK") -#define MSG_ERR_MAXTEMP _UxGT("VYSOKA TEPLOTA") -#define MSG_ERR_MINTEMP _UxGT("NIZKA TEPLOTA") -#define MSG_ERR_MAXTEMP_BED _UxGT("VYS. TEPL. PODL.") -#define MSG_ERR_MINTEMP_BED _UxGT("NIZ. TEPL. PODL.") -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST -#define MSG_HALTED _UxGT("TISK. ZASTAVENA") -#define MSG_PLEASE_RESET _UxGT("Provedte reset") -#define MSG_SHORT_DAY _UxGT("d") -#define MSG_SHORT_HOUR _UxGT("h") -#define MSG_SHORT_MINUTE _UxGT("m") -#define MSG_HEATING _UxGT("Zahrivani...") -#define MSG_BED_HEATING _UxGT("Zahrivani podl...") -#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrace") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrovat X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrovat Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrovat Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrovat Stred") -#define MSG_DELTA_SETTINGS _UxGT("Delta nastaveni") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autokalibrace") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Nast.vysku delty") -#define MSG_DELTA_DIAG_ROD _UxGT("Diag rameno") -#define MSG_DELTA_HEIGHT _UxGT("Vyska") -#define MSG_DELTA_RADIUS _UxGT("Polomer") -#define MSG_INFO_MENU _UxGT("O tiskarne") -#define MSG_INFO_PRINTER_MENU _UxGT("Info o tiskarne") -#define MSG_3POINT_LEVELING _UxGT("3-bodove rovnani") -#define MSG_LINEAR_LEVELING _UxGT("Linearni rovnani") -#define MSG_BILINEAR_LEVELING _UxGT("Bilinearni rovnani") -#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") -#define MSG_MESH_LEVELING _UxGT("Mrizkove rovnani") -#define MSG_INFO_STATS_MENU _UxGT("Statistika") -#define MSG_INFO_BOARD_MENU _UxGT("Info o desce") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistory") -#define MSG_INFO_EXTRUDERS _UxGT("Extrudery") -#define MSG_INFO_BAUDRATE _UxGT("Rychlost") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Osvetleni") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Jas svetla") - -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Pocet tisku") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Dokonceno") - #define MSG_INFO_PRINT_TIME _UxGT("Celkovy cas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelsi tisk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Celkem vytlaceno") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Tisky") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Hotovo") - #define MSG_INFO_PRINT_TIME _UxGT("Cas") - #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelsi") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Vytlaceno") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Teplota min") -#define MSG_INFO_MAX_TEMP _UxGT("Teplota max") -#define MSG_INFO_PSU _UxGT("Nap. zdroj") -#define MSG_DRIVE_STRENGTH _UxGT("Buzeni motoru") -#define MSG_DAC_PERCENT _UxGT("Motor %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Ulozit do EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("TISK POZASTAVEN") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ZAVEDENI FILAMENTU") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("VYSUNUTI FILAMENTU") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("MOZNOSTI OBNOVENI:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Vytlacit vic") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Obnovit tisk") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Tryska: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Parkovani selhalo") -#define MSG_ERR_PROBING_FAILED _UxGT("Kalibrace selhala") -#define MSG_M600_TOO_COLD _UxGT("M600: Moc studeny") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Cekejte prosim") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("na zahajeni") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("vymeny filamentu") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Cekejte prosim") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("na vysunuti") - #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vlozte filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("a stisknete") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tlacitko...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Kliknete pro") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("nahrati trysky") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Cekejte prosim") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("na nahrati tr.") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Cekejte prosim") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("na zavedeni") - #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamentu") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vyckejte na") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("vytlaceni") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Cekejte prosim") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("na pokracovani") - #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("tisku") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Cekejte...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysouvani...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vlozte, kliknete") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nahrivani...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavadeni...") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlacovani...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Pokracovani...") -#endif // LCD_HEIGHT < 4 - -#endif // LANGUAGE_CZ_H diff --git a/Marlin/language_es_utf8.h b/Marlin/language_es_utf8.h deleted file mode 100644 index 57ac43b82f..0000000000 --- a/Marlin/language_es_utf8.h +++ /dev/null @@ -1,274 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Spanish - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_ES_UTF_H -#define LANGUAGE_ES_UTF_H - -#define MAPPER_C2C3 -#define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") -#define MSG_BACK _UxGT("Atrás") -#define MSG_SD_INSERTED _UxGT("Tarjeta colocada") -#define MSG_SD_REMOVED _UxGT("Tarjeta retirada") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menú principal") -#define MSG_AUTOSTART _UxGT("Inicio automático") -#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") -#define MSG_DEBUG_MENU _UxGT("Menú depurar") -#define MSG_PROGRESS_BAR_TEST _UxGT("Prueba barra avance") -#define MSG_AUTO_HOME _UxGT("Llevar al origen") -#define MSG_AUTO_HOME_X _UxGT("Origen X") -#define MSG_AUTO_HOME_Y _UxGT("Origen Y") -#define MSG_AUTO_HOME_Z _UxGT("Origen Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Iniciar (Presione)") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Siguiente punto") -#define MSG_LEVEL_BED_DONE _UxGT("Nivelación lista!") -#define MSG_SET_HOME_OFFSETS _UxGT("Ajustar desfases") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicado") -#define MSG_SET_ORIGIN _UxGT("Establecer origen") -#define MSG_PREHEAT_1 _UxGT("Precalentar PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Todo") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Cama") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Config") -#define MSG_PREHEAT_2 _UxGT("Precalentar ABS") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Todo") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Cama") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Config") -#define MSG_COOLDOWN _UxGT("Enfriar") -#define MSG_SWITCH_PS_ON _UxGT("Encender") -#define MSG_SWITCH_PS_OFF _UxGT("Apagar") -#define MSG_EXTRUDE _UxGT("Extruir") -#define MSG_RETRACT _UxGT("Retraer") -#define MSG_MOVE_AXIS _UxGT("Mover ejes") -#define MSG_BED_LEVELING _UxGT("Nivelar cama") -#define MSG_LEVEL_BED _UxGT("Nivelar cama") -#define MSG_MOVING _UxGT("Moviendo...") -#define MSG_FREE_XY _UxGT("Libre XY") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidad") -#define MSG_BED_Z _UxGT("Cama Z") -#define MSG_NOZZLE _UxGT("Boquilla") -#define MSG_BED _UxGT("Cama") -#define MSG_FAN_SPEED _UxGT("Ventilador") -#define MSG_FLOW _UxGT("Flujo") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") -#define MSG_ON _UxGT("Encender") -#define MSG_OFF _UxGT("Apagar") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Seleccionar") -#define MSG_ACC _UxGT("Aceleración") -#define MSG_JERK _UxGT("Jerk") -#define MSG_VX_JERK _UxGT("Vx-jerk") -#define MSG_VY_JERK _UxGT("Vy-jerk") -#define MSG_VZ_JERK _UxGT("Vz-jerk") -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vel. viaje min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Acel. max") -#define MSG_A_RETRACT _UxGT("Acel. retrac.") -#define MSG_A_TRAVEL _UxGT("Acel. Viaje") -#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") -#if IS_SCARA - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#elif IS_DELTA - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#else - #define MSG_ASTEPS _UxGT("X pasos/mm") - #define MSG_BSTEPS _UxGT("Y pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#endif -#define MSG_ESTEPS _UxGT("E pasos/mm") -#define MSG_E1STEPS _UxGT("E1 pasos/mm") -#define MSG_E2STEPS _UxGT("E2 pasos/mm") -#define MSG_E3STEPS _UxGT("E3 pasos/mm") -#define MSG_E4STEPS _UxGT("E4 pasos/mm") -#define MSG_E5STEPS _UxGT("E5 pasos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimiento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_ADVANCE_K _UxGT("Avance K") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Guardar memoria") -#define MSG_LOAD_EEPROM _UxGT("Cargar memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") -#define MSG_REFRESH _UxGT("Volver a cargar") -#define MSG_WATCH _UxGT("Información") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impresión") -#define MSG_RESUME_PRINT _UxGT("Reanudar impresión") -#define MSG_STOP_PRINT _UxGT("Detener impresión") -#define MSG_CARD_MENU _UxGT("Menú de SD") -#define MSG_NO_CARD _UxGT("No hay tarjeta SD") -#define MSG_DWELL _UxGT("Reposo...") -#define MSG_USERWAIT _UxGT("Esperando órdenes") -#define MSG_PRINT_ABORTED _UxGT("Impresión cancelada") -#define MSG_NO_MOVE _UxGT("Sin movimiento") -#define MSG_KILLED _UxGT("Parada de emergencia") -#define MSG_STOPPED _UxGT("Detenida") -#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Interc. Retraer mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraer V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Levantar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Interc. DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") -#define MSG_AUTORETRACT _UxGT("Retracción Auto.") -#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamento") -#define MSG_INIT_SDCARD _UxGT("Iniciando tarjeta") -#define MSG_CNG_SDCARD _UxGT("Cambiar tarjeta") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Prueba") -#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") -#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("primero") -#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") -#define MSG_BABYSTEP_X _UxGT("Micropaso X") -#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") -#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") -#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Error: al calentar") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") -#define MSG_THERMAL_RUNAWAY _UxGT("Error: temperatura") -#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Máxima") -#define MSG_ERR_MINTEMP _UxGT("Error: Temp Mínima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max Cama") -#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min Cama") -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST -#define MSG_HALTED _UxGT("IMPRESORA PARADA") -#define MSG_PLEASE_RESET _UxGT("Por favor, reinicie") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Calentando...") -#define MSG_BED_HEATING _UxGT("Calentando Cama...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibración Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibración") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Est. Altura Delta") -#define MSG_INFO_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_STATS_MENU _UxGT("Estadísticas Imp.") -#define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") -#define MSG_INFO_BAUDRATE _UxGT("Baudios") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz cabina") - -#if LCD_WIDTH > 19 - #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresión") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total de imp.") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impresión más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusión") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impresiones") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusión") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Temperatura mínima") -#define MSG_INFO_MAX_TEMP _UxGT("Temperatura máxima") -#define MSG_INFO_PSU _UxGT("Fuente de poder") -#define MSG_DRIVE_STRENGTH _UxGT("Potencia driver") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escribe DAC EEPROM") - -#define MSG_FILAMENT_CHANGE_HEADER _UxGT("IMPR. PAUSADA") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPC. REINICIO:") -#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extruir más") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") - -#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp Mínima es ") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") - -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando iniciar") - -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el botón") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambiar") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del fil. cambiar") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") -#endif // LCD_HEIGHT < 4 - -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamento expulsado") -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Cargar filamento") -#define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("Extruir filamento") -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.") -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir") -#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima botón para") -#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Calentar la boquilla") -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando boquilla") -#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espere por favor") - -#endif // LANGUAGE_ES_UTF_H diff --git a/Marlin/language_fr.h b/Marlin/language_fr.h deleted file mode 100644 index 5da9084169..0000000000 --- a/Marlin/language_fr.h +++ /dev/null @@ -1,394 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * French - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_FR_H -#define LANGUAGE_FR_H - -#define MAPPER_NON -#define NOT_EXTENDED_ISO10646_1_5X7 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" prete.") -#define MSG_BACK _UxGT("Retour") -#define MSG_SD_INSERTED _UxGT("Carte inseree") -#define MSG_SD_REMOVED _UxGT("Carte retiree") -#define MSG_LCD_ENDSTOPS _UxGT("Butees") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_AUTOSTART _UxGT("Demarrage auto") -#define MSG_DISABLE_STEPPERS _UxGT("Arreter moteurs") -#define MSG_DEBUG_MENU _UxGT("Menu debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test barre progress.") -#define MSG_AUTO_HOME _UxGT("Origine auto.") -#define MSG_AUTO_HOME_X _UxGT("Origine X Auto.") -#define MSG_AUTO_HOME_Y _UxGT("Origine Y Auto.") -#define MSG_AUTO_HOME_Z _UxGT("Origine Z Auto.") -#define MSG_LEVEL_BED_HOMING _UxGT("Origine XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Clic pour commencer") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Point suivant") -#define MSG_LEVEL_BED_DONE _UxGT("Mise a niveau OK!") -#define MSG_Z_FADE_HEIGHT _UxGT("Hauteur lissee") -#define MSG_SET_HOME_OFFSETS _UxGT("Regl. decal. origine") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Decalages appliques") -#define MSG_SET_ORIGIN _UxGT("Regler origine") -#define MSG_PREHEAT_1 _UxGT("Prechauffage PLA") -#define MSG_PREHEAT_1_N _UxGT("Prechauff. PLA ") -#define MSG_PREHEAT_1_ALL _UxGT("Prech. PLA Tout") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" fini") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Prech. PLA lit") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Regl. prech. PLA") -#define MSG_PREHEAT_2 _UxGT("Prechauffage ABS") -#define MSG_PREHEAT_2_N _UxGT("Prechauff. ABS ") -#define MSG_PREHEAT_2_ALL _UxGT("Prech. ABS Tout") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" fini") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Prech. ABS lit") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Regl. prech. ABS") -#define MSG_COOLDOWN _UxGT("Refroidir") -#define MSG_SWITCH_PS_ON _UxGT("Allumer alim.") -#define MSG_SWITCH_PS_OFF _UxGT("Eteindre alim.") -#define MSG_EXTRUDE _UxGT("Extrusion") -#define MSG_RETRACT _UxGT("Retrait") -#define MSG_MOVE_AXIS _UxGT("Deplacer un axe") -#define MSG_BED_LEVELING _UxGT("Regl. Niv. lit") -#define MSG_LEVEL_BED _UxGT("Regl. Niv. lit") -#define MSG_LEVEL_CORNERS _UxGT("Niveau coins") -#define MSG_NEXT_CORNER _UxGT("Coin suivant") -#define MSG_EDITING_STOPPED _UxGT("Arret edit. maillage") -#define MSG_USER_MENU _UxGT("Commandes perso") - -#define MSG_UBL_DOING_G29 _UxGT("G29 en cours") -#define MSG_UBL_UNHOMED _UxGT("Origine XYZ d'abord") -#define MSG_UBL_TOOLS _UxGT("Outils UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Niveau lit unifie") -#define MSG_UBL_MANUAL_MESH _UxGT("Maillage manuel") -#define MSG_UBL_BC_INSERT _UxGT("Poser cale & mesurer") -#define MSG_UBL_BC_INSERT2 _UxGT("Mesure") -#define MSG_UBL_BC_REMOVE _UxGT("Oter et mesurer lit") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Aller au suivant") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Activer l'UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Desactiver l'UBL") -#define MSG_UBL_SET_BED_TEMP _UxGT("Temperature lit") -#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP -#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Temperature buse") -#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP -#define MSG_UBL_MESH_EDIT _UxGT("Editer maille") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editer maille perso") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Reglage fin maille") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Terminer maille") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Creer maille perso") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Creer maille") -#define MSG_UBL_BUILD_PLA_MESH _UxGT("Creer maille PLA") -#define MSG_UBL_BUILD_ABS_MESH _UxGT("Creer maille ABS") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Creer maille froide") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajuster haut. maille") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Hauteur") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valider maille") -#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Valider maille PLA") -#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Valider maille ABS") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valider maille perso") -#define MSG_UBL_CONTINUE_MESH _UxGT("Continuer maille") -#define MSG_UBL_MESH_LEVELING _UxGT("Niveau par maille") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Niveau a 3 points") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Niveau grille") -#define MSG_UBL_MESH_LEVEL _UxGT("Maille de niveau") -#define MSG_UBL_SIDE_POINTS _UxGT("Point lateral") -#define MSG_UBL_MAP_TYPE _UxGT("Type de carte") -#define MSG_UBL_OUTPUT_MAP _UxGT("Voir maille") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Voir pour hote") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Voir pour CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Voir pour sauveg.") -#define MSG_UBL_INFO_UBL _UxGT("Voir info UBL") -#define MSG_UBL_EDIT_MESH_MENU _UxGT("Modifier maille") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Taux de remplissage") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Remplissage manuel") -#define MSG_UBL_SMART_FILLIN _UxGT("Remplissage auto") -#define MSG_UBL_FILLIN_MESH _UxGT("Maille remplissage") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Tout annuler") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Annuler le plus pres") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Reglage fin (tous)") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Reglage fin (proche)") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Stockage maille") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot memoire") -#define MSG_UBL_LOAD_MESH _UxGT("Charger maille") -#define MSG_UBL_SAVE_MESH _UxGT("Sauver maille") -#define MSG_MESH_LOADED _UxGT("Maille %i charg.") -#define MSG_MESH_SAVED _UxGT("Maille %i enreg.") -#define MSG_NO_STORAGE _UxGT("Pas de memoire") -#define MSG_UBL_SAVE_ERROR _UxGT("Err: Enreg. UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Ouvrir UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Decal. Z arrete") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Pas a pas") - -#define MSG_LED_CONTROL _UxGT("Controle LED") -#define MSG_LEDS_ON _UxGT("Lumiere ON") -#define MSG_LEDS_OFF _UxGT("Lumiere OFF") -#define MSG_LED_PRESETS _UxGT("Preregl. LED.") -#define MSG_SET_LEDS_RED _UxGT("Rouge") -#define MSG_SET_LEDS_ORANGE _UxGT("Orange") -#define MSG_SET_LEDS_YELLOW _UxGT("Jaune") -#define MSG_SET_LEDS_GREEN _UxGT("Vert") -#define MSG_SET_LEDS_BLUE _UxGT("Bleu") -#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Violet") -#define MSG_SET_LEDS_WHITE _UxGT("Blanc") -#define MSG_SET_LEDS_DEFAULT _UxGT("Defaut") -#define MSG_CUSTOM_LEDS _UxGT("Lum. perso.") -#define MSG_INTENSITY_R _UxGT("Intensite rouge") -#define MSG_INTENSITY_G _UxGT("Intensite vert") -#define MSG_INTENSITY_B _UxGT("Intensite bleu") -#define MSG_INTENSITY_W _UxGT("Intensite blanc") -#define MSG_LED_BRIGHTNESS _UxGT("Luminosite") - -#define MSG_MOVING _UxGT("Deplacement...") -#define MSG_FREE_XY _UxGT("Debloquer XY") -#define MSG_MOVE_X _UxGT("Depl. X") -#define MSG_MOVE_Y _UxGT("Depl. Y") -#define MSG_MOVE_Z _UxGT("Depl. Z") -#define MSG_MOVE_E _UxGT("Extrudeur") -#define MSG_MOVE_01MM _UxGT("Depl. 0.1mm") -#define MSG_MOVE_1MM _UxGT("Depl. 1mm") -#define MSG_MOVE_10MM _UxGT("Depl. 10mm") -#define MSG_SPEED _UxGT("Vitesse") -#define MSG_BED_Z _UxGT("Lit Z") -#define MSG_NOZZLE _UxGT("Buse") -#define MSG_BED _UxGT("Lit") -#define MSG_FAN_SPEED _UxGT("Vitesse ventil.") -#define MSG_EXTRA_FAN_SPEED _UxGT("Extra V ventil.") - -#define MSG_FLOW _UxGT("Flux") -#define MSG_CONTROL _UxGT("Controler") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Facteur") -#define MSG_AUTOTEMP _UxGT("Temp. Auto.") -#define MSG_ON _UxGT("Marche") -#define MSG_OFF _UxGT("Arret") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Selectionner") -#define MSG_ACC _UxGT("Acceleration") -#define MSG_JERK _UxGT("Jerk") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Va jerk") - #define MSG_VB_JERK _UxGT("Vb jerk") - #define MSG_VC_JERK _UxGT("Vc jerk") -#else - #define MSG_VA_JERK _UxGT("Vx jerk") - #define MSG_VB_JERK _UxGT("Vy jerk") - #define MSG_VC_JERK _UxGT("Vz jerk") -#endif -#define MSG_VE_JERK _UxGT("Ve jerk") -#define MSG_VELOCITY _UxGT("Velocite") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin ") -#define MSG_VTRAV_MIN _UxGT("V depl. min") -#define MSG_ACCELERATION _UxGT("Acceleration") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("A retrait") -#define MSG_A_TRAVEL _UxGT("A Depl.") -#define MSG_STEPS_PER_MM _UxGT("Pas/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("A pas/mm") - #define MSG_BSTEPS _UxGT("B pas/mm") - #define MSG_CSTEPS _UxGT("C pas/mm") -#else - #define MSG_ASTEPS _UxGT("X pas/mm") - #define MSG_BSTEPS _UxGT("Y pas/mm") - #define MSG_CSTEPS _UxGT("Z pas/mm") -#endif -#define MSG_ESTEPS _UxGT("E pas/mm") -#define MSG_E1STEPS _UxGT("E1 pas/mm") -#define MSG_E2STEPS _UxGT("E2 pas/mm") -#define MSG_E3STEPS _UxGT("E3 pas/mm") -#define MSG_E4STEPS _UxGT("E4 pas/mm") -#define MSG_E5STEPS _UxGT("E5 pas/mm") -#define MSG_TEMPERATURE _UxGT("Temperature") -#define MSG_MOTION _UxGT("Mouvement") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diam. Fil.") -#define MSG_FILAMENT_UNLOAD _UxGT("Decharger mm") -#define MSG_FILAMENT_LOAD _UxGT("Charger mm") -#define MSG_ADVANCE_K _UxGT("Avance K") -#define MSG_CONTRAST _UxGT("Contraste LCD") -#define MSG_STORE_EEPROM _UxGT("Sauver config") -#define MSG_LOAD_EEPROM _UxGT("Lire config") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaurer defauts") -#define MSG_INIT_EEPROM _UxGT("Initialiser EEPROM") -#define MSG_REFRESH _UxGT("Actualiser") -#define MSG_WATCH _UxGT("Surveiller") -#define MSG_PREPARE _UxGT("Preparer") -#define MSG_TUNE _UxGT("Regler") -#define MSG_PAUSE_PRINT _UxGT("Interrompre impr.") -#define MSG_RESUME_PRINT _UxGT("Reprendre impr.") -#define MSG_STOP_PRINT _UxGT("Arreter impr.") -#define MSG_CARD_MENU _UxGT("Impr. depuis SD") -#define MSG_NO_CARD _UxGT("Pas de carte") -#define MSG_DWELL _UxGT("Repos...") -#define MSG_USERWAIT _UxGT("Atten. de l'util.") -#define MSG_PRINT_PAUSED _UxGT("Impr. en pause") -#define MSG_PRINT_ABORTED _UxGT("Impr. Annulee") -#define MSG_NO_MOVE _UxGT("Moteurs bloques.") -#define MSG_KILLED _UxGT("MORT.") -#define MSG_STOPPED _UxGT("STOPPE.") -#define MSG_CONTROL_RETRACT _UxGT("Retrait mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Ech. Retr. mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retrait V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Saut Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Rappel mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ech. Rapp. mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Rappel V") -#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Ech. Rappel V") -#define MSG_AUTORETRACT _UxGT("Retrait. Auto.") -#define MSG_FILAMENTCHANGE _UxGT("Changer filament") -#define MSG_FILAMENTLOAD _UxGT("Charger fil.") -#define MSG_FILAMENTUNLOAD _UxGT("Decharger fil.") -#define MSG_FILAMENTUNLOAD_ALL _UxGT("Decharger tout") -#define MSG_INIT_SDCARD _UxGT("Init. la carte SD") -#define MSG_CNG_SDCARD _UxGT("Changer de carte") -#define MSG_ZPROBE_OUT _UxGT("Z sonde hors lit") -#define MSG_SKEW_FACTOR _UxGT("Facteur ecart") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("RaZ BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("Deployer BLTouch") -#define MSG_BLTOUCH_STOW _UxGT("Ranger BLTouch") -#define MSG_HOME _UxGT("Origine") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("Premier") -#define MSG_ZPROBE_ZOFFSET _UxGT("Decalage Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Butee abandon") -#define MSG_HEATING_FAILED_LCD _UxGT("Erreur de chauffe") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP. REDONDANTE") -#define MSG_THERMAL_RUNAWAY _UxGT("EMBALLEMENT THERM.") -#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP. MAX") -#define MSG_ERR_MINTEMP _UxGT("Err: TEMP. MIN") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP. MAX LIT") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP. MIN LIT") -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST -#define MSG_HALTED _UxGT("IMPR. STOPPEE") -#define MSG_PLEASE_RESET _UxGT("RaZ. SVP") -#define MSG_SHORT_DAY _UxGT("j") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only - -#define MSG_HEATING _UxGT("En chauffe...") -#define MSG_BED_HEATING _UxGT("Lit en chauffe...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibration Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrer X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrer Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrer Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrer centre") -#define MSG_DELTA_SETTINGS _UxGT("Reglages Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Calibration Auto") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Hauteur Delta") -#define MSG_DELTA_DIAG_ROD _UxGT("Diagonale") -#define MSG_DELTA_HEIGHT _UxGT("Hauteur") -#define MSG_DELTA_RADIUS _UxGT("Rayon") - -#define MSG_INFO_MENU _UxGT("Infos imprimante") -#define MSG_INFO_PRINTER_MENU _UxGT("Infos imprimante") -#define MSG_3POINT_LEVELING _UxGT("Niveau a 3 points") -#define MSG_LINEAR_LEVELING _UxGT("Niveau lineaire") -#define MSG_BILINEAR_LEVELING _UxGT("Niveau bilineaire") -#define MSG_UBL_LEVELING _UxGT("Niveau lit unifie") -#define MSG_MESH_LEVELING _UxGT("Niveau maillage") -#define MSG_INFO_STATS_MENU _UxGT("Stats. imprimante") -#define MSG_INFO_BOARD_MENU _UxGT("Infos carte") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extrudeurs") -#define MSG_INFO_BAUDRATE _UxGT("Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protocole") -#define MSG_CASE_LIGHT _UxGT("Lumiere caisson") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosite") - -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Nbre impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminees") - #define MSG_INFO_PRINT_TIME _UxGT("Tps impr. total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impr. la + longue") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total filament") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impressions") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminees") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("+ long") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Filament") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Temp Min") -#define MSG_INFO_MAX_TEMP _UxGT("Temp Max") -#define MSG_INFO_PSU _UxGT("Alimentation") -#define MSG_DRIVE_STRENGTH _UxGT("Puiss. moteur ") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM sauv.") - -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPR. PAUSE") -#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CHARGER FIL") -#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("DECHARGER FIL") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPTIONS REPRISE:") -#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purger encore") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Reprendre impr.") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Buse: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Echec origine") -#define MSG_ERR_PROBING_FAILED _UxGT("Echec sonde") -#define MSG_M600_TOO_COLD _UxGT("M600: Trop froid") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attente Demarrage") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("du filament") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("changer") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attente de") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("decharger filament") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserer filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("et app. bouton") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pour continuer...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Presser le bouton...") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Pr chauffer la buse") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Buse en chauffe") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Patientez SVP...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attente de") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("chargement filament") - #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attente") - #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Purger filament") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attente impression") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("pour reprendre") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Patientez...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejection...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserer et clic") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Chargement...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprise...") -#endif // LCD_HEIGHT < 4 - -#endif // LANGUAGE_FR_H diff --git a/Marlin/language_kana.h b/Marlin/language_kana.h deleted file mode 100644 index 4989ebf1bc..0000000000 --- a/Marlin/language_kana.h +++ /dev/null @@ -1,339 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Japanese (Kana) - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ - -#ifndef LANGUAGE_KANA_H -#define LANGUAGE_KANA_H - -// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h -#define SIMULATE_ROMFONT -#define DISPLAY_CHARSET_ISO10646_KANA -#define CHARSIZE 2 - -// 片仮å表示定義 -#define WELCOME_MSG MACHINE_NAME " ready." -#define MSG_SD_INSERTED "\xb6\xb0\xc4\xde\xb6\xde\xbf\xb3\xc6\xad\xb3\xbb\xda\xcf\xbc\xc0" // "カードガソウニュウサレï¾ï½¼ï¾€" ("Card inserted") -#define MSG_SD_REMOVED "\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "カードガアリï¾ï½¾ï¾" ("Card removed") -#define MSG_LCD_ENDSTOPS "Endstops" // Max length 8 characters -#define MSG_MAIN "\xd2\xb2\xdd" // "ï¾’ï½²ï¾" ("Main") -#define MSG_AUTOSTART "\xbc\xde\xc4\xde\xb3\xb6\xb2\xbc" // "ジドウカイシ" ("Autostart") -#define MSG_DISABLE_STEPPERS "\xd3\xb0\xc0\xb0\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "モーターデï¾ï½¹ï¾žï¾ オフ" ("Disable steppers") -#define MSG_DEBUG_MENU "\xc3\xde\xca\xde\xaf\xb8\xde\xd2\xc6\xad\xb0" // "デバッグメニュー" ("Debug Menu") -#define MSG_PROGRESS_BAR_TEST "\xcc\xdf\xdb\xb8\xde\xda\xbd\xca\xde\xb0\x20\xc3\xbd\xc4" // "プログレスバー テスト" ("Progress Bar Test") -#define MSG_AUTO_HOME "\xb9\xde\xdd\xc3\xdd\xcc\xaf\xb7" // "ゲï¾ï¾ƒï¾ï¾Œï½¯ï½·" ("Auto home") -#define MSG_AUTO_HOME_X "X\xbc\xde\xb8\x20\xb9\xde\xdd\xc3\xdd\xcc\xaf\xb7" // "Xジク ゲï¾ï¾ƒï¾ï¾Œï½¯ï½·" ("Home X") -#define MSG_AUTO_HOME_Y "Y\xbc\xde\xb8\x20\xb9\xde\xdd\xc3\xdd\xcc\xaf\xb7" // "Yジク ゲï¾ï¾ƒï¾ï¾Œï½¯ï½·" ("Home Y") -#define MSG_AUTO_HOME_Z "Z\xbc\xde\xb8\x20\xb9\xde\xdd\xc3\xdd\xcc\xaf\xb7" // "Zジク ゲï¾ï¾ƒï¾ï¾Œï½¯ï½·" ("Home Z") -#define MSG_LEVEL_BED_HOMING "\xb9\xde\xdd\xc3\xdd\xcc\xaf\xb7\xc1\xad\xb3" // "ゲï¾ï¾ƒï¾ï¾Œï½¯ï½·ï¾ï½­ï½³" ("Homing XYZ") -#define MSG_LEVEL_BED_WAITING "\xda\xcd\xde\xd8\xdd\xb8\xde\xb6\xb2\xbc" // "レï¾ï¾žï¾˜ï¾ï½¸ï¾žï½¶ï½²ï½¼" ("Click to Begin") -#define MSG_LEVEL_BED_NEXT_POINT "\xc2\xb7\xde\xc9\xbf\xb8\xc3\xb2\xc3\xdd\xcd" // "ツギノソクテイテï¾ï¾" ("Next Point") -#define MSG_LEVEL_BED_DONE "\xda\xcd\xde\xd8\xdd\xb8\xde\xb6\xdd\xd8\xae\xb3" // "レï¾ï¾žï¾˜ï¾ï½¸ï¾žï½¶ï¾ï¾˜ï½®ï½³" ("Leveling Done!") -#define MSG_SET_HOME_OFFSETS "\xb7\xbc\xde\xad\xdd\xb5\xcc\xbe\xaf\xc4\xbe\xaf\xc3\xb2" // "キジュï¾ï½µï¾Œï½¾ï½¯ï¾„セッテイ" ("Set home offsets") -#define MSG_HOME_OFFSETS_APPLIED "\xb5\xcc\xbe\xaf\xc4\xb6\xde\xc3\xb7\xd6\xb3\xbb\xda\xcf\xbc\xc0" // "オフセットガテキヨウサレï¾ï½¼ï¾€" ("Offsets applied") -#define MSG_SET_ORIGIN "\xb7\xbc\xde\xad\xdd\xbe\xaf\xc4" // "キジュï¾ï½¾ï½¯ï¾„" ("Set origin") -#define MSG_PREHEAT_1 "PLA \xd6\xc8\xc2" // "PLA ヨネツ" ("Preheat PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 " " -#define MSG_PREHEAT_1_ALL "PLA \xbd\xcd\xde\xc3\xd6\xc8\xc2" // "PLA ï½½ï¾ï¾žï¾ƒï¾–ネツ" (" All") -#define MSG_PREHEAT_1_BEDONLY "PLA \xcd\xde\xaf\xc4\xde\xd6\xc8\xc2" // "PLA ï¾ï¾žï½¯ï¾„゙ヨネツ" (" Bed") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 "\xbe\xaf\xc3\xb2" // "セッテイ" (" conf") -#define MSG_PREHEAT_2 "ABS \xd6\xc8\xc2" // "ABS ヨネツ" ("Preheat ABS") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 " " -#define MSG_PREHEAT_2_ALL "ABS \xbd\xcd\xde\xc3\xd6\xc8\xc2" // "ABS ï½½ï¾ï¾žï¾ƒï¾–ネツ" (" All") -#define MSG_PREHEAT_2_BEDONLY "ABS \xcd\xde\xaf\xc4\xde\xd6\xc8\xc2" // "ABS ï¾ï¾žï½¯ï¾„゙ヨネツ" (" Bed") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 "\xbe\xaf\xc3\xb2" // "セッテイ" (" conf") -#define MSG_COOLDOWN "\xb6\xc8\xc2\xc3\xb2\xbc" // "カネツテイシ" ("Cooldown") -#define MSG_SWITCH_PS_ON "\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xdd" // "デï¾ï½¹ï¾žï¾ ï½µï¾" ("Switch power on") -#define MSG_SWITCH_PS_OFF "\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "デï¾ï½¹ï¾žï¾ オフ" ("Switch power off") -#define MSG_EXTRUDE "\xb5\xbc\xc0\xde\xbc" // "オシダシ" ("Extrude") -#define MSG_RETRACT "\xcb\xb7\xba\xd0\xbe\xaf\xc3\xb2" // "ヒキコï¾ï½¾ï½¯ï¾ƒï½²" ("Retract") -#define MSG_MOVE_AXIS "\xbc\xde\xb8\xb2\xc4\xde\xb3" // "ジクイドウ" ("Move axis") -#define MSG_BED_LEVELING "\xcd\xde\xaf\xc4\xde\xda\xcd\xde\xd8\xdd\xb8\xde" // "ï¾ï¾žï½¯ï¾„゙レï¾ï¾žï¾˜ï¾ï½¸ï¾ž" ("Bed Leveling") -#define MSG_LEVEL_BED "\xcd\xde\xaf\xc4\xde\xda\xcd\xde\xd8\xdd\xb8\xde" // "ï¾ï¾žï½¯ï¾„゙レï¾ï¾žï¾˜ï¾ï½¸ï¾ž" ("Level bed") -#define MSG_MOVING "\xb2\xc4\xde\xb3\xc1\xad\xb3" // "イドウï¾ï½­ï½³" ("Moving...") -#define MSG_FREE_XY "XY\xbc\xde\xb8\x20\xb6\xb2\xce\xb3" // "XYジク カイホウ" ("Free XY") -#define MSG_MOVE_X "X\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Xジク イドウ" ("Move X") -#define MSG_MOVE_Y "Y\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Yジク イドウ" ("Move Y") -#define MSG_MOVE_Z "Z\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Zジク イドウ" ("Move Z") -#define MSG_MOVE_E "\xb4\xb8\xbd\xc4\xd9\xb0\xc0\xde\xb0" // "エクストルーダー" ("Extruder") -#define MSG_MOVE_01MM "0.1mm \xb2\xc4\xde\xb3" // "0.1mm イドウ" ("Move 0.1mm") -#define MSG_MOVE_1MM " 1mm \xb2\xc4\xde\xb3" // " 1mm イドウ" ("Move 1mm") -#define MSG_MOVE_10MM " 10mm \xb2\xc4\xde\xb3" // " 10mm イドウ" ("Move 10mm") -#define MSG_SPEED "\xbf\xb8\xc4\xde" // "ソクド" ("Speed") -#define MSG_BED_Z "Z\xb5\xcc\xbe\xaf\xc4" // "Zオフセット" ("Bed Z") -#define MSG_NOZZLE "\xc9\xbd\xde\xd9" // "ノズル" ("Nozzle") -#define MSG_BED "\xcd\xde\xaf\xc4\xde" // "ï¾ï¾žï½¯ï¾„゙" ("Bed") -#define MSG_FAN_SPEED "\xcc\xa7\xdd\xbf\xb8\xc4\xde" // "ファï¾ï½¿ï½¸ï¾„゙" ("Fan speed") -#define MSG_FLOW "\xc4\xbc\xad\xc2\xd8\xae\xb3" // "トシュツリョウ" ("Flow") -#define MSG_CONTROL "\xbe\xb2\xb7\xde\xae" // "セイギョ" ("Control") -#define MSG_MIN LCD_STR_THERMOMETER " \xbb\xb2\xc3\xb2" // " サイテイ" (" Min") -#define MSG_MAX LCD_STR_THERMOMETER " \xbb\xb2\xba\xb3" // " サイコウ" (" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER " \xcc\xa7\xb8\xc0\xb0" // " ファクター" (" Fact") -#if LCD_WIDTH >= 20 - #define MSG_AUTOTEMP "\xbc\xde\xc4\xde\xb3\xb5\xdd\xc4\xde\xbe\xb2\xb7\xde\xae" // "ジドウオï¾ï¾„゙セイギョ" ("Autotemp") -#else - #define MSG_AUTOTEMP "\xbc\xde\xc4\xde\xb3\xb5\xdd\xc4\xde" // "ジドウオï¾ï¾„゙" ("Autotemp") -#endif -#define MSG_ON "\xb5\xdd " // "ï½µï¾ " ("On ") -#define MSG_OFF "\xb5\xcc " // "オフ " ("Off") -#define MSG_PID_P "PID-P" -#define MSG_PID_I "PID-I" -#define MSG_PID_D "PID-D" -#define MSG_PID_C "PID-C" -#define MSG_SELECT "\xbe\xdd\xc0\xb8" // "ï½¾ï¾ï¾€ï½¸" ("Select") -#define MSG_JERK "\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // ヤクド mm/s ("Jerk") -#if LCD_WIDTH >= 20 - #define MSG_ACC "\xb6\xbf\xb8\xc4\xde mm/s2" // "カソクド mm/s2" ("Accel") - #if IS_KINEMATIC - #define MSG_VA_JERK "A\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Aジク ヤクド mm/s" ("Va-jerk") - #define MSG_VB_JERK "B\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Bジク ヤクド mm/s" ("Vb-jerk") - #define MSG_VC_JERK "C\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Cジク ヤクド mm/s" ("Vc-jerk") - #else - #define MSG_VA_JERK "X\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Xジク ヤクド mm/s" ("Vx-jerk") - #define MSG_VB_JERK "Y\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Yジク ヤクド mm/s" ("Vy-jerk") - #define MSG_VC_JERK "Z\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Zジク ヤクド mm/s" ("Vz-jerk") - #endif - #define MSG_VE_JERK "\xb4\xb8\xbd\xc4\xd9\xb0\xc0\xde\xb0\x20\xd4\xb8\xc4\xde" // "エクストルーダー ヤクド" ("Ve-jerk") - #define MSG_VMAX "\xbb\xb2\xc0\xde\xb2\xb5\xb8\xd8\xbf\xb8\xc4\xde " // "サイダイオクリソクド " ("Vmax ") - #define MSG_VMIN "\xbb\xb2\xbc\xae\xb3\xb5\xb8\xd8\xbf\xb8\xc4\xde" // "サイショウオクリソクド" ("Vmin") - #define MSG_VTRAV_MIN "\xbb\xb2\xbc\xae\xb3\xb2\xc4\xde\xb3\xbf\xb8\xc4\xde" // "サイショウイドウソクド" ("VTrav min") - #define MSG_AMAX "\xbb\xb2\xc0\xde\xb2\xb6\xbf\xb8\xc4\xde " // "サイダイカソクド " ("Amax ") -#else - #define MSG_ACC "\xb6\xbf\xb8\xc4\xde" // "カソクド" ("Accel") - #if IS_KINEMATIC - #define MSG_VA_JERK "A\x20\xd4\xb8\xc4\xde" // "Aジク ヤクド" ("Va-jerk") - #define MSG_VB_JERK "B\x20\xd4\xb8\xc4\xde" // "Bジク ヤクド" ("Vb-jerk") - #define MSG_VC_JERK "C\x20\xd4\xb8\xc4\xde" // "Cジク ヤクド" ("Vc-jerk") - #else - #define MSG_VA_JERK "X\x20\xd4\xb8\xc4\xde" // "Xジク ヤクド" ("Vx-jerk") - #define MSG_VB_JERK "Y\x20\xd4\xb8\xc4\xde" // "Yジク ヤクド" ("Vy-jerk") - #define MSG_VC_JERK "Z\x20\xd4\xb8\xc4\xde" // "Zジク ヤクド" ("Vz-jerk") - #endif - #define MSG_VE_JERK "E\x20\xd4\xb8\xc4\xde" // "E ヤクド" ("Ve-jerk") - #define MSG_VMAX "max\xb5\xb8\xd8\xbf\xb8\xc4\xde " // "maxオクリソクド" ("Vmax ") - #define MSG_VMIN "min\xb5\xb8\xd8\xbf\xb8\xc4\xde" // "minオクリソクド" ("Vmin") - #define MSG_VTRAV_MIN "min\xb2\xc4\xde\xb3\xbf\xb8\xc4\xde" // "minイドウソクド" ("VTrav min") - #define MSG_AMAX "max\xb6\xbf\xb8 " // "maxカソク " ("Amax ") -#endif -#define MSG_A_RETRACT "\xcb\xb7\xba\xd0\xb6\xbf\xb8\xc4\xde" // "ヒキコï¾ï½¶ï½¿ï½¸ï¾„゙" ("A-retract") -#define MSG_A_TRAVEL "\xb2\xc4\xde\xb3\xb6\xbf\xb8\xc4\xde" // "イドウカソクド" ("A-travel") -#if LCD_WIDTH >= 20 - #define MSG_STEPS_PER_MM "Steps/mm" - #if IS_KINEMATIC - #define MSG_ASTEPS "Asteps/mm" - #define MSG_BSTEPS "Bsteps/mm" - #define MSG_CSTEPS "Csteps/mm" - #else - #define MSG_ASTEPS "Xsteps/mm" - #define MSG_BSTEPS "Ysteps/mm" - #define MSG_CSTEPS "Zsteps/mm" - #endif - #define MSG_ESTEPS "Esteps/mm" - #define MSG_E1STEPS "E1steps/mm" - #define MSG_E2STEPS "E2steps/mm" - #define MSG_E3STEPS "E3steps/mm" - #define MSG_E4STEPS "E4steps/mm" - #define MSG_E5STEPS "E5steps/mm" -#else - #define MSG_STEPS_PER_MM "Steps" - #if IS_KINEMATIC - #define MSG_ASTEPS "Asteps" - #define MSG_BSTEPS "Bsteps" - #define MSG_CSTEPS "Csteps" - #else - #define MSG_ASTEPS "Xsteps" - #define MSG_BSTEPS "Ysteps" - #define MSG_CSTEPS "Zsteps" - #endif - #define MSG_ESTEPS "Esteps" - #define MSG_E1STEPS "E1steps" - #define MSG_E2STEPS "E2steps" - #define MSG_E3STEPS "E3steps" - #define MSG_E4STEPS "E4steps" - #define MSG_E5STEPS "E5steps" -#endif -#define MSG_TEMPERATURE "\xb5\xdd\xc4\xde" // "ï½µï¾ï¾„゙" ("Temperature") -#define MSG_MOTION "\xb3\xba\xde\xb7\xbe\xaf\xc3\xb2" // "ウゴキセッテイ" ("Motion") -#define MSG_FILAMENT "\xcc\xa8\xd7\xd2\xdd\xc4" // "フィラメï¾ï¾„" ("Filament") -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#if LCD_WIDTH >= 20 - #define MSG_FILAMENT_DIAM "\xcc\xa8\xd7\xd2\xdd\xc4\xc1\xae\xaf\xb9\xb2" // "フィラメï¾ï¾„ï¾ï½®ï½¯ï½¹ï½²" ("Fil. Dia.") -#else - #define MSG_FILAMENT_DIAM "\xcc\xa8\xd7\xd2\xdd\xc4\xb9\xb2" // "フィラメï¾ï¾„ケイ" ("Fil. Dia.") -#endif -#define MSG_CONTRAST "LCD\xba\xdd\xc4\xd7\xbd\xc4" // "LCDコï¾ï¾„ラスト" ("LCD contrast") -#define MSG_STORE_EEPROM "\xd2\xd3\xd8\xcd\xb6\xb8\xc9\xb3" // "メモリï¾ï½¶ï½¸ï¾‰ï½³" ("Store memory") -#define MSG_LOAD_EEPROM "\xd2\xd3\xd8\xb6\xd7\xd6\xd0\xba\xd0" // "メモリカラヨï¾ï½ºï¾" ("Load memory") -#define MSG_RESTORE_FAILSAFE "\xbe\xaf\xc3\xb2\xd8\xbe\xaf\xc4" // "セッテイリセット" ("Restore failsafe") -#define MSG_REFRESH "\xd8\xcc\xda\xaf\xbc\xad" // "リフレッシュ" ("Refresh") -#define MSG_WATCH "\xbc\xde\xae\xb3\xce\xb3\xb6\xde\xd2\xdd" // "ジョウホウガメï¾" ("Info screen") -#define MSG_PREPARE "\xbc\xde\xad\xdd\xcb\xde\xbe\xaf\xc3\xb2" // "ジュï¾ï¾‹ï¾žï½¾ï½¯ï¾ƒï½²" ("Prepare") -#define MSG_TUNE "\xc1\xae\xb3\xbe\xb2" // "ï¾ï½®ï½³ï½¾ï½²" ("Tune") -#define MSG_PAUSE_PRINT "\xb2\xc1\xbc\xde\xc3\xb2\xbc" // "ï½²ï¾ï½¼ï¾žï¾ƒï½²ï½¼" ("Pause print") -#define MSG_RESUME_PRINT "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "プリï¾ï¾„サイカイ" ("Resume print") -#define MSG_STOP_PRINT "\xcc\xdf\xd8\xdd\xc4\xc3\xb2\xbc" // "プリï¾ï¾„テイシ" ("Stop print") -#define MSG_CARD_MENU "SD\xb6\xb0\xc4\xde\xb6\xd7\xcc\xdf\xd8\xdd\xc4" // "SDカードカラプリï¾ï¾„" ("Print from SD") -#define MSG_NO_CARD "SD\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "SDカードガアリï¾ï½¾ï¾" ("No SD card") -#define MSG_DWELL "\xb7\xad\xb3\xbc" // "キュウシ" ("Sleep...") -#define MSG_USERWAIT "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "シバラクオï¾ï¾ï½¸ï¾€ï¾žï½»ï½²" ("Wait for user...") -#define MSG_PRINT_ABORTED "\xcc\xdf\xd8\xdd\xc4\xb6\xde\xc1\xad\xb3\xbc\xbb\xda\xcf\xbc\xc0" // "プリï¾ï¾„ガï¾ï½­ï½³ï½¼ï½»ï¾šï¾ï½¼ï¾€" ("Print aborted") -#define MSG_NO_MOVE "\xb3\xba\xde\xb7\xcf\xbe\xdd" // "ウゴキï¾ï½¾ï¾" ("No move.") -#define MSG_KILLED "\xcb\xbc\xde\xae\xb3\xc3\xb2\xbc" // "ヒジョウテイシ" ("KILLED. ") -#define MSG_STOPPED "\xc3\xb2\xbc\xbc\xcf\xbc\xc0" // "テイシシï¾ï½¼ï¾€" ("STOPPED. ") -#if LCD_WIDTH >= 20 - #define MSG_CONTROL_RETRACT "\xcb\xb7\xba\xd0\xd8\xae\xb3 mm" // "ヒキコï¾ï¾˜ï½®ï½³ mm" ("Retract mm") - #define MSG_CONTROL_RETRACT_SWAP "\xcb\xb7\xba\xd0\xd8\xae\xb3S mm" // "ヒキコï¾ï¾˜ï½®ï½³S mm" ("Swap Re.mm") - #define MSG_CONTROL_RETRACTF "\xcb\xb7\xba\xd0\xbf\xb8\xc4\xde mm/s" // "ヒキコï¾ï½¿ï½¸ï¾„゙ mm/s" ("Retract V") - #define MSG_CONTROL_RETRACT_ZLIFT "\xc9\xbd\xde\xd9\xc0\xb2\xcb mm" // "ノズルタイヒ mm" ("Hop mm") - #define MSG_CONTROL_RETRACT_RECOVER "\xce\xbc\xae\xb3\xd8\xae\xb3 mm" // "ホショウリョウ mm" ("UnRet mm") - #define MSG_CONTROL_RETRACT_RECOVER_SWAP "\xce\xbc\xae\xb3\xd8\xae\xb3S mm" // "ホショウリョウS mm" ("S UnRet mm") - #define MSG_CONTROL_RETRACT_RECOVERF "\xce\xbc\xae\xb3\xbf\xb8\xc4\xde mm/s" // "ホショウソクド mm/s" ("UnRet V") -#else - #define MSG_CONTROL_RETRACT "\xcb\xb7\xba\xd0\xd8\xae\xb3" // "ヒキコï¾ï¾˜ï½®ï½³" ("Retract mm") - #define MSG_CONTROL_RETRACT_SWAP "\xcb\xb7\xba\xd0\xd8\xae\xb3S" // "ヒキコï¾ï¾˜ï½®ï½³S" ("Swap Re.mm") - #define MSG_CONTROL_RETRACTF "\xcb\xb7\xba\xd0\xbf\xb8\xc4\xde" // "ヒキコï¾ï½¿ï½¸ï¾„゙" ("Retract V") - #define MSG_CONTROL_RETRACT_ZLIFT "\xc9\xbd\xde\xd9\xc0\xb2\xcb" // "ノズルタイヒ" ("Hop mm") - #define MSG_CONTROL_RETRACT_RECOVER "\xce\xbc\xae\xb3\xd8\xae\xb3" // "ホショウリョウ" ("UnRet mm") - #define MSG_CONTROL_RETRACT_RECOVER_SWAP "\xce\xbc\xae\xb3\xd8\xae\xb3S" // "ホショウリョウS" ("S UnRet mm") - #define MSG_CONTROL_RETRACT_RECOVERF "\xce\xbc\xae\xb3\xbf\xb8\xc4\xde" // "ホショウソクド" ("UnRet V") -#endif -#define MSG_AUTORETRACT "\xbc\xde\xc4\xde\xb3\xcb\xb7\xba\xd0" // "ジドウヒキコï¾" ("AutoRetr.") -#define MSG_FILAMENTCHANGE "\xcc\xa8\xd7\xd2\xdd\xc4\xba\xb3\xb6\xdd" // "フィラメï¾ï¾„コウカï¾" ("Change filament") -#define MSG_INIT_SDCARD "SD\xb6\xb0\xc4\xde\xbb\xb2\xd6\xd0\xba\xd0" // "SDカードサイヨï¾ï½ºï¾" ("Init. SD card") -#define MSG_CNG_SDCARD "SD\xb6\xb0\xc4\xde\xba\xb3\xb6\xdd" // "SDカードコウカï¾" ("Change SD card") -#define MSG_ZPROBE_OUT "Z\xcc\xdf\xdb\xb0\xcc\xde\x20\xcd\xde\xaf\xc4\xde\xb6\xde\xb2" // "Zプローブ ï¾ï¾žï½¯ï¾„゙ガイ" ("Z probe out. bed") -#if LCD_WIDTH >= 20 - #define MSG_BLTOUCH_SELFTEST "BLTouch \xbc\xde\xba\xbc\xdd\xc0\xde\xdd" // "BLTouch ジコシï¾ï¾€ï¾žï¾" ("BLTouch Self-Test") -#else - #define MSG_BLTOUCH_SELFTEST "BLTouch \xbe\xd9\xcc\xc3\xbd\xc4" // "BLTouch セルフテスト" ("BLTouch Self-Test") -#endif -#define MSG_BLTOUCH_RESET "BLTouch \xd8\xbe\xaf\xc4" // "BLTouch リセット" ("Reset BLTouch") -#define MSG_HOME "\xbb\xb7\xc6" // "サキニ" ("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#if LCD_WIDTH >= 20 - #define MSG_FIRST "\xa6\xcc\xaf\xb7\xbb\xbe\xc3\xb8\xc0\xde\xbb\xb2" // "ヲフッキサセテクダサイ" ("first") -#else - #define MSG_FIRST "\xa6\xcc\xaf\xb7\xbb\xbe\xd6" // "ヲフッキサセヨ" ("first") -#endif -#define MSG_ZPROBE_ZOFFSET "Z\xb5\xcc\xbe\xaf\xc4" // "Zオフセット" ("Z Offset") -#define MSG_BABYSTEP_X "X\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Xジク ビドウ" ("Babystep X") -#define MSG_BABYSTEP_Y "Y\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Yジク ビドウ" ("Babystep Y") -#define MSG_BABYSTEP_Z "Z\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Zジク ビドウ" ("Babystep Z") -#if LCD_WIDTH >= 20 - #define MSG_ENDSTOP_ABORT "\xb2\xc4\xde\xb3\xb9\xde\xdd\xb6\xb2\xb9\xdd\xc1\xb7\xc9\xb3" // "イドウゲï¾ï½¶ï½²ï½¹ï¾ï¾ï½·ï¾‰ï½³" ("Endstop abort") -#else - #define MSG_ENDSTOP_ABORT "\xb2\xc4\xde\xb3\xb9\xde\xdd\xb6\xb2\xb9\xdd\xc1" // "イドウゲï¾ï½¶ï½²ï½¹ï¾ï¾" ("Endstop abort") -#endif -#define MSG_HEATING_FAILED_LCD "\xb6\xc8\xc2\xbc\xaf\xca\xdf\xb2" // "カネツシッパイ" ("Heating failed") -#if LCD_WIDTH >= 20 - #define MSG_ERR_REDUNDANT_TEMP "\xb4\xd7\xb0:\xbc\xde\xae\xb3\xc1\xae\xb3\xbb\xb0\xd0\xbd\xc0\xb0\xb7\xc9\xb3" // "ï½´ï¾—ï½°:ジョウï¾ï½®ï½³ï½»ï½°ï¾ï½½ï¾€ï½°ï½·ï¾‰ï½³" ("Err: REDUNDANT TEMP") -#else - #define MSG_ERR_REDUNDANT_TEMP "\xb4\xd7\xb0:\xbc\xde\xae\xb3\xc1\xae\xb3\xbb\xb0\xd0\xbd\xc0" // "ï½´ï¾—ï½°:ジョウï¾ï½®ï½³ï½»ï½°ï¾ï½½ï¾€" ("Err: REDUNDANT TEMP") -#endif -#define MSG_THERMAL_RUNAWAY "\xc8\xc2\xce\xde\xb3\xbf\xb3" // "ネツボウソウ" ("THERMAL RUNAWAY") -#define MSG_ERR_MAXTEMP "\xb4\xd7\xb0:\xbb\xb2\xba\xb3\xb5\xdd\xc1\xae\xb3\xb6" // "ï½´ï¾—ï½°:サイコウオï¾ï¾ï½®ï½³ï½¶" ("Err: MAXTEMP") -#define MSG_ERR_MINTEMP "\xb4\xd7\xb0:\xbb\xb2\xc3\xb2\xb5\xdd\xd0\xcf\xdd" // "ï½´ï¾—ï½°:サイテイオï¾ï¾ï¾ï¾" ("Err: MINTEMP") -#if LCD_WIDTH >= 20 - #define MSG_ERR_MAXTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xba\xb3\xb5\xdd\xc1\xae\xb3\xb6" // "ï½´ï¾—ï½°:ï¾ï¾žï½¯ï¾„゙ サイコウオï¾ï¾ï½®ï½³ï½¶" ("Err: MAXTEMP BED") - #define MSG_ERR_MINTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xc3\xb2\xb5\xdd\xd0\xcf\xdd" // "ï½´ï¾—ï½°:ï¾ï¾žï½¯ï¾„゙ サイテイオï¾ï¾ï¾ï¾" ("Err: MINTEMP BED") -#else - #define MSG_ERR_MAXTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xba\xb3\xb5\xdd" // "ï½´ï¾—ï½°:ï¾ï¾žï½¯ï¾„゙ サイコウオï¾" ("Err: MAXTEMP BED") - #define MSG_ERR_MINTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xc3\xb2\xb5\xdd" // "ï½´ï¾—ï½°:ï¾ï¾žï½¯ï¾„゙ サイテイオï¾" ("Err: MINTEMP BED") -#endif -#define MSG_ERR_Z_HOMING MSG_HOME " " MSG_X MSG_Y " " MSG_FIRST // "サキニ XY ヲフッキサセテクダサイ" or "サキニ XY ヲフッキサセヨ" ("G28 Z Forbidden") -#define MSG_HALTED "\xcc\xdf\xd8\xdd\xc0\xb0\xca\xc3\xb2\xbc\xbc\xcf\xbc\xc0" // "プリï¾ï¾€ï½°ï¾Šï¾ƒï½²ï½¼ï½¼ï¾ï½¼ï¾€" ("PRINTER HALTED") -#define MSG_PLEASE_RESET "\xd8\xbe\xaf\xc4\xbc\xc3\xb8\xc0\xde\xbb\xb2" // "リセットシテクダサイ" ("Please reset") -#define MSG_SHORT_DAY "d" // One character only -#define MSG_SHORT_HOUR "h" // One character only -#define MSG_SHORT_MINUTE "m" // One character only -#define MSG_HEATING "\xb6\xc8\xc2\xc1\xad\xb3" // "カネツï¾ï½­ï½³" ("Heating...") -#define MSG_BED_HEATING "\xcd\xde\xaf\xc4\xde\x20\xb6\xc8\xc2\xc1\xad\xb3" // "ï¾ï¾žï½¯ï¾„゙ カネツï¾ï½­ï½³" ("Bed Heating...") -#define MSG_DELTA_CALIBRATE "\xc3\xde\xd9\xc0\x20\xba\xb3\xbe\xb2" // "デルタ コウセイ" ("Delta Calibration") -#define MSG_DELTA_CALIBRATE_X "X\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Xジク コウセイ" ("Calibrate X") -#define MSG_DELTA_CALIBRATE_Y "Y\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Yジク コウセイ" ("Calibrate Y") -#define MSG_DELTA_CALIBRATE_Z "Z\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Zジク コウセイ" ("Calibrate Z") -#define MSG_DELTA_CALIBRATE_CENTER "\xc1\xad\xb3\xbc\xdd\x20\xba\xb3\xbe\xb2" // "ï¾ï½­ï½³ï½¼ï¾ コウセイ" ("Calibrate Center") -#define MSG_INFO_MENU "\xba\xc9\xcc\xdf\xd8\xdd\xc0\xb0\xc6\xc2\xb2\xc3" // "コノプリï¾ï¾€ï½°ï¾†ï¾‚イテ" ("About Printer") -#define MSG_INFO_PRINTER_MENU "\xcc\xdf\xd8\xdd\xc0\xb0\xbc\xde\xae\xb3\xce\xb3" // "プリï¾ï¾€ï½°ï½¼ï¾žï½®ï½³ï¾Žï½³" ("Printer Info") -#define MSG_INFO_STATS_MENU "\xcc\xdf\xd8\xdd\xc4\xbc\xde\xae\xb3\xb7\xae\xb3" // "プリï¾ï¾„ジョウキョウ" ("Printer Stats") -#define MSG_INFO_BOARD_MENU "\xbe\xb2\xb7\xde\xae\xb9\xb2\xbc\xde\xae\xb3\xce\xb3" // "セイギョケイジョウホウ" ("Board Info") -#define MSG_INFO_THERMISTOR_MENU "\xbb\xb0\xd0\xbd\xc0\xb0" // "サーï¾ï½½ï¾€ï½°" ("Thermistors") -#define MSG_INFO_EXTRUDERS "\xb4\xb8\xbd\xc4\xd9\xb0\xc0\xde\xb0\xbd\xb3" // "エクストルーダースウ" ("Extruders") -#define MSG_INFO_BAUDRATE "\xce\xde\xb0\xda\xb0\xc4" // "ボーレート" ("Baud") -#define MSG_INFO_PROTOCOL "\xcc\xdf\xdb\xc4\xba\xd9" // "プロトコル" ("Protocol") -#define MSG_CASE_LIGHT "\xb7\xae\xb3\xc0\xb2\xc5\xb2\xbc\xae\xb3\xd2\xb2" // "キョウタイナイショウメイ" ("Case light") -#define MSG_INFO_PRINT_COUNT "\xcc\xdf\xd8\xdd\xc4\xbd\xb3" // "プリï¾ï¾„スウ" ("Print Count") -#define MSG_INFO_COMPLETED_PRINTS "\xb6\xdd\xd8\xae\xb3\xbd\xb3" // "ï½¶ï¾ï¾˜ï½®ï½³ï½½ï½³" ("Completed") -#define MSG_INFO_PRINT_TIME "\xcc\xdf\xd8\xdd\xc4\xbc\xde\xb6\xdd\xd9\xb2\xb9\xb2" // "プリï¾ï¾„ジカï¾ï¾™ï½²ï½¹ï½²" ("Total print time") -#define MSG_INFO_PRINT_LONGEST "\xbb\xb2\xc1\xae\xb3\xcc\xdf\xd8\xdd\xc4\xbc\xde\xb6\xdd" // "サイï¾ï½®ï½³ï¾Œï¾Ÿï¾˜ï¾ï¾„ジカï¾" ("Longest job time") -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_FILAMENT "\xcc\xa8\xd7\xd2\xdd\xc4\xbc\xd6\xb3\xd8\xae\xb3\xd9\xb2\xb9\xb2" // "フィラメï¾ï¾„シヨウリョウルイケイ" ("Extruded total") -#else - #define MSG_INFO_PRINT_FILAMENT "\xcc\xa8\xd7\xd2\xdd\xc4\xbf\xb3\xbc\xd6\xb3\xd8\xae\xb3" // "フィラメï¾ï¾„ソウシヨウリョウ" ("Extruded") -#endif -#define MSG_INFO_MIN_TEMP "\xbe\xaf\xc3\xb2\xbb\xb2\xc3\xb2\xb5\xdd" // "セッテイサイテイオï¾" ("Min Temp") -#define MSG_INFO_MAX_TEMP "\xbe\xaf\xc3\xb2\xbb\xb2\xba\xb3\xb5\xdd" // "セッテイサイコウオï¾" ("Max Temp") -#if LCD_WIDTH >= 20 - #define MSG_INFO_PSU "\xc3\xde\xdd\xb9\xde\xdd\xbc\xad\xcd\xde\xc2" // "デï¾ï½¹ï¾žï¾ï½¼ï½­ï¾ï¾žï¾‚" ("Power Supply") -#else - #define MSG_INFO_PSU "\xc3\xde\xdd\xb9\xde\xdd" // "デï¾ï½¹ï¾žï¾" ("Power Supply") -#endif -#define MSG_DRIVE_STRENGTH "\xd3\xb0\xc0\xb0\xb8\xc4\xde\xb3\xd8\xae\xb8" // "モータークドウリョク" ("Drive Strength") -#if LCD_WIDTH >= 20 - #define MSG_DAC_PERCENT "DAC\xbc\xad\xc2\xd8\xae\xb8 %" // "DACシュツリョク %" ("Driver %") -#else - #define MSG_DAC_PERCENT "DAC\xbc\xad\xc2\xd8\xae\xb8" // "DACシュツリョク" ("Driver %") -#endif -#define MSG_DAC_EEPROM_WRITE MSG_STORE_EEPROM // "メモリï¾ï½¶ï½¸ï¾‰ï½³" ("DAC EEPROM Write") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "プリï¾ï¾„サイカイ" ("Resume print") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 "\xba\xb3\xb6\xdd\xa6\xb6\xb2\xbc\xbc\xcf\xbd" // "コウカï¾ï½¦ï½¶ï½²ï½¼ï½¼ï¾ï½½" ("Wait for start") - #define MSG_FILAMENT_CHANGE_INIT_2 "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "シバラクオï¾ï¾ï½¸ï¾€ï¾žï½»ï½²" ("of the filament") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 "\xcc\xa8\xd7\xd2\xdd\xc4\xc7\xb7\xc0\xde\xbc\xc1\xad\xb3" // "フィラメï¾ï¾„ヌキダシï¾ï½­ï½³" ("Wait for") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "シバラクオï¾ï¾ï½¸ï¾€ï¾žï½»ï½²" ("filament unload") - #define MSG_FILAMENT_CHANGE_INSERT_1 "\xcc\xa8\xd7\xd2\xdd\xc4\xa6\xbf\xb3\xc6\xad\xb3\xbc," // "フィラメï¾ï¾„ヲソウニュウシ," ("Insert filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 "\xb8\xd8\xaf\xb8\xbd\xd9\xc4\xbf\xde\xaf\xba\xb3\xbc\xcf\xbd" // "クリックスルトゾッコウシï¾ï½½" ("and press button") - #define MSG_FILAMENT_CHANGE_LOAD_1 "\xcc\xa8\xd7\xd2\xdd\xc4\xbf\xb3\xc3\xdd\xc1\xad\xb3" // "フィラメï¾ï¾„ソウテï¾ï¾ï½­ï½³" ("Wait for") - #define MSG_FILAMENT_CHANGE_LOAD_2 "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "シバラクオï¾ï¾ï½¸ï¾€ï¾žï½»ï½²" ("filament load") - #define MSG_FILAMENT_CHANGE_RESUME_1 "\xcc\xdf\xd8\xdd\xc4\xa6\xbb\xb2\xb6\xb2\xbc\xcf\xbd" // "プリï¾ï¾„ヲサイカイシï¾ï½½" ("Wait for print") - #define MSG_FILAMENT_CHANGE_RESUME_2 "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "シバラクオï¾ï¾ï½¸ï¾€ï¾žï½»ï½²" ("to resume") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 "\xba\xb3\xb6\xdd\xa6\xb6\xb2\xbc\xbc\xcf\xbd" // "コウカï¾ï½¦ï½¶ï½²ï½¼ï½¼ï¾ï½½" ("Please wait...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 "\xcc\xa8\xd7\xd2\xdd\xc4\xc7\xb7\xc0\xde\xbc\xc1\xad\xb3" // "フィラメï¾ï¾„ヌキダシï¾ï½­ï½³" ("Ejecting...") - #if LCD_WIDTH >= 20 - #define MSG_FILAMENT_CHANGE_INSERT_1 "\xbf\xb3\xc6\xad\xb3\xbc\x2c\xb8\xd8\xaf\xb8\xbc\xc3\xb8\xc0\xde\xbb\xb2" // "ソウニュウシ,クリックシテクダサイ" ("Insert and Click") - #else - #define MSG_FILAMENT_CHANGE_INSERT_1 "\xbf\xb3\xc6\xad\xb3\xbc\x2c\xb8\xd8\xaf\xb8\xbe\xd6" // "ソウニュウシ,クリックセヨ" ("Insert and Click") - #endif - #define MSG_FILAMENT_CHANGE_LOAD_1 "\xcc\xa8\xd7\xd2\xdd\xc4\xbf\xb3\xc3\xdd\xc1\xad\xb3" // "フィラメï¾ï¾„ソウテï¾ï¾ï½­ï½³" ("Loading...") - #define MSG_FILAMENT_CHANGE_RESUME_1 "\xcc\xdf\xd8\xdd\xc4\xa6\xbb\xb2\xb6\xb2\xbc\xcf\xbd" // "プリï¾ï¾„ヲサイカイシï¾ï½½" ("Resuming...") -#endif // LCD_HEIGHT < 4 - -#endif // LANGUAGE_KANA_H diff --git a/Marlin/language_pl-HD44780.h b/Marlin/language_pl-HD44780.h deleted file mode 100644 index 6968fc8a37..0000000000 --- a/Marlin/language_pl-HD44780.h +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Polish for HD44780 display - no accented characters - */ - -#ifndef LANGUAGE_PL_HD44780_H -#define LANGUAGE_PL_HD44780_H - -#define NOT_EXTENDED_ISO10646_1_5X7 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" gotowy.") -#define MSG_SD_INSERTED _UxGT("Karta wlozona") -#define MSG_SD_REMOVED _UxGT("Karta usunieta") -#define MSG_LCD_ENDSTOPS _UxGT("Krancow.") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu glowne") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Wylacz silniki") -#define MSG_AUTO_HOME _UxGT("Pozycja zerowa") -#define MSG_AUTO_HOME_X _UxGT("Zeruj X") -#define MSG_AUTO_HOME_Y _UxGT("Zeruj Y") -#define MSG_AUTO_HOME_Z _UxGT("Zeruj Z") -#define MSG_LEVEL_BED _UxGT("Poziom. stolu") -#define MSG_LEVEL_BED_HOMING _UxGT("Pozycja zerowa") -#define MSG_LEVEL_BED_WAITING _UxGT("Kliknij by rozp.") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Nastepny punkt") -#define MSG_LEVEL_BED_DONE _UxGT("Wypoziomowano!") -#define MSG_USER_MENU _UxGT("Wlasne Polecenia") -#define MSG_SET_HOME_OFFSETS _UxGT("Ust. poz. zer.") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Poz. zerowa ust.") -#define MSG_SET_ORIGIN _UxGT("Ustaw punkt zero") -#define MSG_PREHEAT_1 _UxGT("Rozgrzej PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" wsz.") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Rozgrzej stol PLA") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Ustaw. rozg. PLA") -#define MSG_PREHEAT_2 _UxGT("Rozgrzej ABS") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" wsz.") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Rozgrzej stol ABS") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Ustaw. rozg. ABS") -#define MSG_COOLDOWN _UxGT("Chlodzenie") -#define MSG_SWITCH_PS_ON _UxGT("Wlacz zasilacz") -#define MSG_SWITCH_PS_OFF _UxGT("Wylacz zasilacz") -#define MSG_EXTRUDE _UxGT("Ekstruzja") -#define MSG_RETRACT _UxGT("Wycofanie") -#define MSG_MOVE_AXIS _UxGT("Ruch osi") -#define MSG_BED_LEVELING _UxGT("Poziom. stolu") -#define MSG_MOVE_X _UxGT("Przesun w X") -#define MSG_MOVE_Y _UxGT("Przesun w Y") -#define MSG_MOVE_Z _UxGT("Przesun w Z") -#define MSG_MOVE_E _UxGT("Ekstruzja (os E)") -#define MSG_MOVE_01MM _UxGT("Przesun co .1mm") -#define MSG_MOVE_1MM _UxGT("Przesun co 1mm") -#define MSG_MOVE_10MM _UxGT("Przesun co 10mm") -#define MSG_SPEED _UxGT("Predkosc") -#define MSG_BED_Z _UxGT("Stol Z") -#define MSG_NOZZLE _UxGT("Dysza") -#define MSG_BED _UxGT("Stol") -#define MSG_FAN_SPEED _UxGT("Obroty wiatraka") -#define MSG_FLOW _UxGT("Przeplyw") -#define MSG_CONTROL _UxGT("Ustawienia") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Mnoznik") -#define MSG_AUTOTEMP _UxGT("Auto. temperatura") -#define MSG_ON _UxGT("Wl. ") -#define MSG_OFF _UxGT("Wyl.") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Select") -#define MSG_ACC _UxGT("Przyspieszenie") -#define MSG_JERK _UxGT("Zryw") -#if IS_KINEMATIC - #define MSG_VA_JERK _UxGT("Zryw Va") - #define MSG_VB_JERK _UxGT("Zryw Vb") - #define MSG_VC_JERK _UxGT("Zryw Vc") -#else - #define MSG_VA_JERK _UxGT("Zryw Vx") - #define MSG_VB_JERK _UxGT("Zryw Vy") - #define MSG_VC_JERK _UxGT("Zryw Vz") -#endif -#define MSG_VE_JERK _UxGT("Zryw Ve") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vskok min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Amax") -#define MSG_A_RETRACT _UxGT("A-wycofanie") -#define MSG_A_TRAVEL _UxGT("A-przesun.") -#define MSG_STEPS_PER_MM _UxGT("kroki/mm") -#if IS_KINEMATIC - #define MSG_ASTEPS _UxGT("krokiA/mm") - #define MSG_BSTEPS _UxGT("krokiB/mm") - #define MSG_CSTEPS _UxGT("krokiC/mm") -#else - #define MSG_ASTEPS _UxGT("krokiX/mm") - #define MSG_BSTEPS _UxGT("krokiY/mm") - #define MSG_CSTEPS _UxGT("krokiZ/mm") -#endif -#define MSG_ESTEPS _UxGT("krokiE/mm") -#define MSG_E1STEPS _UxGT("krokiE1/mm") -#define MSG_E2STEPS _UxGT("krokiE2/mm") -#define MSG_E3STEPS _UxGT("krokiE3/mm") -#define MSG_E4STEPS _UxGT("krokiE4/mm") -#define MSG_E5STEPS _UxGT("krokiE5/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Ruch") -#define MSG_FILAMENT _UxGT("Filament") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E w mm3") -#define MSG_FILAMENT_DIAM _UxGT("Sr. fil.") -#define MSG_CONTRAST _UxGT("Kontrast LCD") -#define MSG_STORE_EEPROM _UxGT("Zapisz w pamieci") -#define MSG_LOAD_EEPROM _UxGT("Wczytaj z pamieci") -#define MSG_RESTORE_FAILSAFE _UxGT("Ustaw. fabryczne") -#define MSG_REFRESH _UxGT("Odswiez") -#define MSG_WATCH _UxGT("Ekran glowny") -#define MSG_PREPARE _UxGT("Przygotuj") -#define MSG_TUNE _UxGT("Strojenie") -#define MSG_PAUSE_PRINT _UxGT("Pauza") -#define MSG_RESUME_PRINT _UxGT("Wznowienie") -#define MSG_STOP_PRINT _UxGT("Stop") -#define MSG_CARD_MENU _UxGT("Karta SD") -#define MSG_NO_CARD _UxGT("Brak karty") -#define MSG_DWELL _UxGT("Uspij...") -#define MSG_USERWAIT _UxGT("Oczekiwanie...") -#define MSG_PRINT_ABORTED _UxGT("Druk przerwany") -#define MSG_NO_MOVE _UxGT("Brak ruchu") -#define MSG_KILLED _UxGT("Ubity. ") -#define MSG_STOPPED _UxGT("Zatrzymany. ") -#define MSG_CONTROL_RETRACT _UxGT("Wycofaj mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Z Wycof. mm") -#define MSG_CONTROL_RETRACTF _UxGT("Wycofaj V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Skok Z mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Cof. wycof. mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Z Cof. wyc. mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Cof. wycof. V") -#define MSG_AUTORETRACT _UxGT("Auto. wycofanie") -#define MSG_FILAMENTCHANGE _UxGT("Zmien filament") -#define MSG_INIT_SDCARD _UxGT("Inicjal. karty SD") -#define MSG_CNG_SDCARD _UxGT("Zmiana karty SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z za stolem") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") -#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") -#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("first") -#define MSG_ZPROBE_ZOFFSET _UxGT("Offset Z") -#define MSG_BABYSTEP_X _UxGT("Babystep X") -#define MSG_BABYSTEP_Y _UxGT("Babystep Y") -#define MSG_BABYSTEP_Z _UxGT("Babystep Z") -#define MSG_ENDSTOP_ABORT _UxGT("Blad krancowki") -#define MSG_HEATING_FAILED_LCD _UxGT("Rozgrz. nieudane") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Blad temperatury") -#define MSG_THERMAL_RUNAWAY _UxGT("Zanik temp.") -#define MSG_ERR_MAXTEMP _UxGT("Err max temp") -#define MSG_ERR_MINTEMP _UxGT("Err min temp") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err max temp stolu") -#define MSG_ERR_MINTEMP_BED _UxGT("Err min temp stolu") -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST -#define MSG_HALTED _UxGT("Drukarka zatrzym.") -#define MSG_PLEASE_RESET _UxGT("Prosze zresetowac") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("g") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Rozgrzewanie...") -#define MSG_BED_HEATING _UxGT("Rozgrzewanie stolu...") -#define MSG_DELTA_CALIBRATE _UxGT("Kalibrowanie Delty") -#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibruj X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibruj Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibruj Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibruj srodek") - -#define MSG_INFO_MENU _UxGT("O drukarce") -#define MSG_INFO_PRINTER_MENU _UxGT("Info drukarki") -#define MSG_INFO_STATS_MENU _UxGT("Statystyki") -#define MSG_INFO_BOARD_MENU _UxGT("Board Info") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistory") -#define MSG_INFO_EXTRUDERS _UxGT("Ekstrudery") -#define MSG_INFO_BAUDRATE _UxGT("Predkosc USB") -#define MSG_INFO_PROTOCOL _UxGT("Protokol") -#define MSG_CASE_LIGHT _UxGT("Oswietlenie") - -#if LCD_WIDTH >= 20 - #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukonczono") - #define MSG_INFO_PRINT_TIME _UxGT("Czas druku") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdl. druk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Uzyty fil.") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukonczono") - #define MSG_INFO_PRINT_TIME _UxGT("Razem") - #define MSG_INFO_PRINT_LONGEST _UxGT("Najdl. druk") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Uzyty fil.") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") -#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") -#define MSG_INFO_PSU _UxGT("Zasilacz") - -#define MSG_DRIVE_STRENGTH _UxGT("Sila silnika") -#define MSG_DAC_PERCENT _UxGT("Sila %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Zapisz DAC EEPROM") - -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("ZMIEN FILAMENT") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ZMIEN OPCJE:") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Wznow drukowanie") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Czekam na ") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("zmiane filamentu") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("wyjecie filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Wloz filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i nacisnij przycisk") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("aby kontynuowac...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("wlozenie filamentu") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("wznowienie druku") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Prosze czekac...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wysuwanie...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Wloz i nacisnij prz.") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ladowanie...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wznowienie...") -#endif // LCD_HEIGHT < 4 - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Czekam na ") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("zmiane filamentu") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("wyjecie filamentu") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Wloz filament") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i nacisnij przycisk") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("aby kontynuowac...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("wlozenie filamentu") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Czekam na") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("wznowienie druku") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Prosze czekac...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wysuwanie...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Wloz i nacisnij prz.") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ladowanie...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wznowienie...") -#endif // LCD_HEIGHT < 4 - -#endif // LANGUAGE_PL_HD44780_H diff --git a/Marlin/language_pt-br_utf8.h b/Marlin/language_pt-br_utf8.h deleted file mode 100644 index 2e481e4810..0000000000 --- a/Marlin/language_pt-br_utf8.h +++ /dev/null @@ -1,384 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Portuguese (Brazil) - * UTF-8 for Graphical Display - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_PT_BR_UTF_H -#define LANGUAGE_PT_BR_UTF_H - -#define MAPPER_C2C3 -#define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") - -#define MSG_BACK _UxGT("Voltar") -#define MSG_SD_INSERTED _UxGT("Cartão inserido") -#define MSG_SD_REMOVED _UxGT("Cartão removido") -#define MSG_LCD_ENDSTOPS _UxGT("Finais") -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_AUTOSTART _UxGT("Autostart") -#define MSG_DISABLE_STEPPERS _UxGT("Desabi. motores") -#define MSG_DEBUG_MENU _UxGT("Menu Debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Testar Barra de Prog")//resso -#define MSG_AUTO_HOME_X _UxGT("Ir na origem X") -#define MSG_AUTO_HOME_Y _UxGT("Ir na origem Y") -#define MSG_AUTO_HOME_Z _UxGT("Ir na origem Z") -#define MSG_AUTO_HOME _UxGT("Ir na origem XYZ") -#define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") -#define MSG_LEVEL_BED_WAITING _UxGT("Clique para Iniciar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo Ponto") -#define MSG_LEVEL_BED_DONE _UxGT("Fim nivelação!") -#define MSG_Z_FADE_HEIGHT _UxGT("Suavizar altura") -#define MSG_SET_HOME_OFFSETS _UxGT("Compensar origem") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Alteração feita") -#define MSG_SET_ORIGIN _UxGT("Ajustar Origem") -#define MSG_PREHEAT_1 _UxGT("Pre-aquecer PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL _UxGT("Pre-aq.Todo PLA") -#define MSG_PREHEAT_1_END _UxGT("Pre-aq.Extrusora") -#define MSG_PREHEAT_1_BEDONLY _UxGT("Pre-aq.Mesa PLA") -#define MSG_PREHEAT_1_SETTINGS _UxGT("Ajustar PLA") -#define MSG_PREHEAT_2 _UxGT("Pre-aquecer ABS") -#define MSG_PREHEAT_2_N _UxGT("Pre-aquecer ABS") -#define MSG_PREHEAT_2_ALL _UxGT("Pre-aq.Todo ABS") -#define MSG_PREHEAT_2_BEDONLY _UxGT("Pre-aq.Mesa ABS") -#define MSG_PREHEAT_2_END _UxGT("Pre-aq.Extrusora") -#define MSG_PREHEAT_2_SETTINGS _UxGT("Ajustar ABS") -#define MSG_COOLDOWN _UxGT("Esfriar") -#define MSG_SWITCH_PS_ON _UxGT("Ligar") -#define MSG_SWITCH_PS_OFF _UxGT("Desligar") -#define MSG_EXTRUDE _UxGT("Extrusar") -#define MSG_RETRACT _UxGT("Retrair") -#define MSG_MOVE_AXIS _UxGT("Mover eixo") -#define MSG_BED_LEVELING _UxGT("Nivelação Mesa") -#define MSG_LEVEL_BED _UxGT("Nivelar Mesa") -#define MSG_LEVEL_CORNERS _UxGT("Nivelar Cantos") -#define MSG_NEXT_CORNER _UxGT("Próximo Canto") -#define MSG_EDITING_STOPPED _UxGT("Fim da Edição") - -#define MSG_USER_MENU _UxGT("Comando customizado") -#define MSG_UBL_DOING_G29 _UxGT("Executando G29") -#define MSG_UBL_UNHOMED _UxGT("Fora da Origam") -#define MSG_UBL_TOOLS _UxGT("Ferramentas UBL") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") -#define MSG_UBL_MANUAL_MESH _UxGT("Fazer malha manual") -#define MSG_UBL_BC_INSERT _UxGT("Calçar e calibrar") -#define MSG_UBL_BC_INSERT2 _UxGT("Medir") -#define MSG_UBL_BC_REMOVE _UxGT("Remover e calibrar") - -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Indo para o Próximo") -#define MSG_UBL_ACTIVATE_MESH _UxGT("Ativar UBL") -#define MSG_UBL_DEACTIVATE_MESH _UxGT("Desativar UBL") -#define MSG_UBL_SET_BED_TEMP _UxGT("Temp. Mesa") -#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP -#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Temp. Extrusora") -#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP -#define MSG_UBL_MESH_EDIT _UxGT("Editar Malha") -#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editar Malha Custom") -#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ajuste Fino da Malha") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Fim da Edição") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Montar Customi") -#define MSG_UBL_BUILD_MESH_MENU _UxGT("Montar ") -#define MSG_UBL_BUILD_PLA_MESH _UxGT("Montar PLA") -#define MSG_UBL_BUILD_ABS_MESH _UxGT("Montar ABS") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Montar fria") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajustar Altura") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Tamanho da Elevação") -#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validar Malha") -#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Checar PLA") -#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Checar ABS") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validar Malha Custom") -#define MSG_UBL_CONTINUE_MESH _UxGT("Continuar Malha") -#define MSG_UBL_MESH_LEVELING _UxGT("Nivelação da Malha") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelação 3 pontos") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivelação Grid") -#define MSG_UBL_MESH_LEVEL _UxGT("Nivelar Malha") -#define MSG_UBL_SIDE_POINTS _UxGT("Cantos") -#define MSG_UBL_MAP_TYPE _UxGT("Tipo de Mapa") -#define MSG_UBL_OUTPUT_MAP _UxGT("Salvar Mapa da Malha") -#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Enviar Para Host") -#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Salvar Malha CSV") -#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Salvar Backup") -#define MSG_UBL_INFO_UBL _UxGT("Informação do UBL") -#define MSG_UBL_EDIT_MESH_MENU _UxGT("Editar Malha") -#define MSG_UBL_FILLIN_AMOUNT _UxGT("Qtd de Enchimento") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Enchimento Manual") -#define MSG_UBL_SMART_FILLIN _UxGT("Enchimento Smart") -#define MSG_UBL_FILLIN_MESH _UxGT("Preencher malha") -#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidar tudo") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar próximo") -#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ajuste Fino de Todos") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajuar Mais Próximo") -#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Armazenamento Malha") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot de Memória") -#define MSG_UBL_LOAD_MESH _UxGT("Ler Malha") -#define MSG_UBL_SAVE_MESH _UxGT("Salvar Malha") -#define MSG_MESH_LOADED _UxGT("Malha %i carregada") -#define MSG_MESH_SAVED _UxGT("Malha %i salva") -#define MSG_NO_STORAGE _UxGT("Sem armazenamento") -#define MSG_UBL_SAVE_ERROR _UxGT("Erro ao salvar UBL") -#define MSG_UBL_RESTORE_ERROR _UxGT("Erro no restauro UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Compensação Z parou") -#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo a passo") -#define MSG_LED_CONTROL _UxGT("Controle do LED") -#define MSG_LEDS_ON _UxGT("Luz Acesa") -#define MSG_LEDS_OFF _UxGT("Luz Apagada") -#define MSG_LED_PRESETS _UxGT("Configuração da Luz") -#define MSG_SET_LEDS_RED _UxGT("Luz Vermelha") -#define MSG_SET_LEDS_ORANGE _UxGT("Luz Laranja") -#define MSG_SET_LEDS_YELLOW _UxGT("Luz Amarela") -#define MSG_SET_LEDS_GREEN _UxGT("Luz Verde") -#define MSG_SET_LEDS_BLUE _UxGT("Luz Azul") -#define MSG_SET_LEDS_INDIGO _UxGT("Luz Indigo") -#define MSG_SET_LEDS_VIOLET _UxGT("Luz Violeta") -#define MSG_SET_LEDS_WHITE _UxGT("Luz Branca") -#define MSG_SET_LEDS_DEFAULT _UxGT("Luz Padrão") -#define MSG_CUSTOM_LEDS _UxGT("Luz Customizada") -#define MSG_INTENSITY_R _UxGT("Intensidade Vermelho") -#define MSG_INTENSITY_G _UxGT("Intensidade Verde") -#define MSG_INTENSITY_B _UxGT("Intensidade Azul") -#define MSG_INTENSITY_W _UxGT("Intensidade Branco") -#define MSG_LED_BRIGHTNESS _UxGT("Brilho") - -#define MSG_MOVING _UxGT("Movendo...") -#define MSG_FREE_XY _UxGT("Liberar XY") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Mover Extrusor") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidade") -#define MSG_BED_Z _UxGT("Base Z") -#define MSG_NOZZLE _UxGT("Bocal") -#define MSG_BED _UxGT("Mesa") -#define MSG_FAN_SPEED _UxGT("Vel. Ventoinha") -#define MSG_FLOW _UxGT("Vazão") -#define MSG_CONTROL _UxGT("Controle") -#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fator") -#define MSG_AUTOTEMP _UxGT("Temp. Automática") -#define MSG_ON _UxGT("Ligado ") -#define MSG_OFF _UxGT("Desligado") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Selecionar") -#define MSG_ACC _UxGT("Acel.") -#define MSG_JERK _UxGT("Jogo") -#if IS_SCARA - #define MSG_VA_JERK _UxGT("jogo VA") - #define MSG_VB_JERK _UxGT("jogo VB") - #define MSG_VC_JERK _UxGT("jogo VZ") -#elif IS_DELTA - #define MSG_VA_JERK _UxGT("jogo VA") - #define MSG_VB_JERK _UxGT("jogo VB") - #define MSG_VC_JERK _UxGT("jogo VC") -#else - #define MSG_VA_JERK _UxGT("jogo VX") - #define MSG_VB_JERK _UxGT("jogo VY") - #define MSG_VC_JERK _UxGT("jogo VZ") -#endif -#define MSG_VE_JERK _UxGT("jogo VE") -#define MSG_VELOCITY _UxGT("Velocidade") -#define MSG_VMAX _UxGT("Vmax ") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("VDeslocamento min") -#define MSG_AMAX _UxGT("Amax ") -#define MSG_A_RETRACT _UxGT("Retrair A") -#define MSG_A_TRAVEL _UxGT("Movimento A") -#define MSG_STEPS_PER_MM _UxGT("Passo/mm") -#if IS_SCARA - #define MSG_ASTEPS _UxGT("Passo A/deg") - #define MSG_BSTEPS _UxGT("Passo B/deg") - #define MSG_CSTEPS _UxGT("Passo Z/mm") -#elif IS_DELTA - #define MSG_ASTEPS _UxGT("Passo A/mm") - #define MSG_BSTEPS _UxGT("Passo B/mm") - #define MSG_CSTEPS _UxGT("Passo C/mm") -#else - #define MSG_ASTEPS _UxGT("Passo X/mm") - #define MSG_BSTEPS _UxGT("Passo Y/mm") - #define MSG_CSTEPS _UxGT("Passo Z/mm") -#endif -#define MSG_ESTEPS _UxGT("E/mm") -#define MSG_E1STEPS _UxGT("E1/mm") -#define MSG_E2STEPS _UxGT("E2/mm") -#define MSG_E3STEPS _UxGT("E3/mm") -#define MSG_E4STEPS _UxGT("E4/mm") -#define MSG_E5STEPS _UxGT("E5/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Extrusão em mm3") -#define MSG_FILAMENT_DIAM _UxGT("Diâmetro Fil.") -#define MSG_ADVANCE_K _UxGT("Avançar K") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Salvar Configuração") -#define MSG_LOAD_EEPROM _UxGT("Ler Configuração") -#define MSG_RESTORE_FAILSAFE _UxGT("Restauro seguro") -#define MSG_INIT_EEPROM _UxGT("Iniciar EEPROM") -#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Atualização") -#define MSG_WATCH _UxGT("Informações") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") -#define MSG_RESUME_PRINT _UxGT("Resumir impressão") -#define MSG_STOP_PRINT _UxGT("Parar impressão") -#define MSG_CARD_MENU _UxGT("Imprimir do SD") -#define MSG_NO_CARD _UxGT("Sem cartão SD") -#define MSG_DWELL _UxGT("ZzZzZz...") -#define MSG_USERWAIT _UxGT("Clique para retomar") -#define MSG_PRINT_ABORTED _UxGT("Impressão Abortada") -#define MSG_NO_MOVE _UxGT("Sem movimento") -#define MSG_KILLED _UxGT("PARADA DE EMERGÊNCIA") -#define MSG_STOPPED _UxGT("PAROU. ") -#define MSG_CONTROL_RETRACT _UxGT("Retrair mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Retrair Troca mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retrair V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Saltar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Des-Retrair mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Des-RetTroca mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Des-Retrair V") -#define MSG_AUTORETRACT _UxGT("Retração Automática") -#define MSG_FILAMENTCHANGE _UxGT("Trocar Filamento") -#define MSG_INIT_SDCARD _UxGT("Iniciar SD") -#define MSG_CNG_SDCARD _UxGT("Trocar SD") -#define MSG_ZPROBE_OUT _UxGT("Sonda fora da mesa") -#define MSG_SKEW_FACTOR _UxGT("Fator de Cisalho") -#define MSG_BLTOUCH _UxGT("BLTouch") -#define MSG_BLTOUCH_SELFTEST _UxGT("Testar BLTouch") -#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") -#define MSG_BLTOUCH_DEPLOY _UxGT("Implantar BLTouch") -#define MSG_BLTOUCH_STOW _UxGT("Condicionar BLTouch") - -#define MSG_HOME _UxGT("Home") -#define MSG_FIRST _UxGT("Primeiro") -#define MSG_ZPROBE_ZOFFSET _UxGT("Compensar Sonda em Z") -#define MSG_BABYSTEP_X _UxGT("Passinho X") -#define MSG_BABYSTEP_Y _UxGT("Passinho Y") -#define MSG_BABYSTEP_Z _UxGT("Passinho Z") -#define MSG_ENDSTOP_ABORT _UxGT("Fim de Curso") -#define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro:Temp Redundante") -#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TÉRMICO") -#define MSG_ERR_MAXTEMP _UxGT("Erro:Temp Máxima") -#define MSG_ERR_MINTEMP _UxGT("Erro:Temp Mínima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Erro:Temp Mesa Máx") -#define MSG_ERR_MINTEMP_BED _UxGT("Erro:Temp Mesa Mín") -#define MSG_HEATING _UxGT("Aquecendo...") -#define MSG_BED_HEATING _UxGT("Aquecendo base...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibrar Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") - -#define MSG_DELTA_SETTINGS _UxGT("Configuração Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-Calibração") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Calibrar Altura") -#define MSG_DELTA_DIAG_ROD _UxGT("Haste Diagonal") -#define MSG_DELTA_HEIGHT _UxGT("Altura") -#define MSG_DELTA_RADIUS _UxGT("Raio") -#define MSG_INFO_MENU _UxGT("Sobre") -#define MSG_INFO_PRINTER_MENU _UxGT("Impressora") -#define MSG_3POINT_LEVELING _UxGT("Nivelamento 3 pontos") -#define MSG_LINEAR_LEVELING _UxGT("Nivelamento Linear") -#define MSG_BILINEAR_LEVELING _UxGT("Nivelamento Bilinear") -#define MSG_UBL_LEVELING _UxGT("Nivelamento UBL") -#define MSG_MESH_LEVELING _UxGT("Nivelamento da Malha") -#define MSG_INFO_STATS_MENU _UxGT("Estatísticas") -#define MSG_INFO_BOARD_MENU _UxGT("Info. da Placa") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusoras") -#define MSG_INFO_BAUDRATE _UxGT("Frequência Baud") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz da Estrutura") -#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Intensidade Brilho") -#define MSG_INFO_PRINT_COUNT _UxGT("Qtd Impressões") -#define MSG_INFO_COMPLETED_PRINTS _UxGT("Completas") -#define MSG_INFO_PRINT_TIME _UxGT("Tempo de Imprimindo") -#define MSG_INFO_PRINT_LONGEST _UxGT("Impressão Mais Longa") -#define MSG_INFO_PRINT_FILAMENT _UxGT("Depositado") -#define MSG_INFO_MIN_TEMP _UxGT("Temp Min") -#define MSG_INFO_MAX_TEMP _UxGT("Temp Max") -#define MSG_INFO_PSU _UxGT("PSU") -#define MSG_DRIVE_STRENGTH _UxGT("Força do Motor") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escrever Eeprom DAC") - -#define MSG_FILAMENT_CHANGE_HEADER _UxGT("Troca de Filamento") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Config. de Retomada") -#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extrusar Mais") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar Impressão") -#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp. Mínima é ") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Bocal: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Falha ao ir à origem") -#define MSG_ERR_PROBING_FAILED _UxGT("Falha ao sondar") - -#if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando o") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("inicio da") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("troca de Filamento") - - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("remoção de filamento") - - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Coloque Filamento") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("pressione o botão") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") - - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pressione o botão") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("p/ Aquecer o Bocal") - - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo o Bocal") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Aguarde...") - - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamento") - - #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperando extrusão") - #define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("de filamento") - - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressão") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") -#else LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregando...") - #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Extrusando...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Continuando...") -#endif - -#endif // LANGUAGE_PT_BR_UTF_H diff --git a/Marlin/language_pt.h b/Marlin/language_pt.h deleted file mode 100644 index c314cc80da..0000000000 --- a/Marlin/language_pt.h +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * Portuguese - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_PT_H -#define LANGUAGE_PT_H - -#define DISPLAY_CHARSET_ISO10646_1 -#define NOT_EXTENDED_ISO10646_1_5X7 - -#define WELCOME_MSG MACHINE_NAME " pronta." -#define MSG_SD_INSERTED "Cartao inserido" -#define MSG_SD_REMOVED "Cartao removido" -#define MSG_MAIN "Menu principal" -#define MSG_AUTOSTART "Autostart" -#define MSG_DISABLE_STEPPERS "Desactivar motores" -#define MSG_AUTO_HOME "Ir para origem" -#define MSG_AUTO_HOME_X "Ir para origem X" -#define MSG_AUTO_HOME_Y "Ir para origem Y" -#define MSG_AUTO_HOME_Z "Ir para origem Z" -#define MSG_LEVEL_BED_HOMING "Indo para origem" -#define MSG_LEVEL_BED_WAITING "Click para iniciar" -#define MSG_LEVEL_BED_NEXT_POINT "Proximo ponto" -#define MSG_LEVEL_BED_DONE "Pronto !" -#define MSG_SET_HOME_OFFSETS "Definir desvio" -#define MSG_HOME_OFFSETS_APPLIED "Offsets applied" -#define MSG_SET_ORIGIN "Definir origem" -#define MSG_PREHEAT_1 "Pre-aquecer PLA" -#define MSG_PREHEAT_1_N "Pre-aquecer PLA" -#define MSG_PREHEAT_1_ALL "Pre-aq. PLA Tudo" -#define MSG_PREHEAT_1_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base" -#define MSG_PREHEAT_1_SETTINGS "Definicoes PLA" -#define MSG_PREHEAT_2 "Pre-aquecer ABS" -#define MSG_PREHEAT_2_N "Pre-aquecer ABS " -#define MSG_PREHEAT_2_ALL "Pre-aq. ABS Tudo" -#define MSG_PREHEAT_2_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base" -#define MSG_PREHEAT_2_SETTINGS "Definicoes ABS" -#define MSG_COOLDOWN "Arrefecer" -#define MSG_SWITCH_PS_ON "Ligar" -#define MSG_SWITCH_PS_OFF "Desligar" -#define MSG_EXTRUDE "Extrudir" -#define MSG_RETRACT "Retrair" -#define MSG_MOVE_AXIS "Mover eixo" -#define MSG_MOVE_X "Mover X" -#define MSG_MOVE_Y "Mover Y" -#define MSG_MOVE_Z "Mover Z" -#define MSG_MOVE_E "Mover Extrusor" -#define MSG_MOVE_01MM "Mover 0.1mm" -#define MSG_MOVE_1MM "Mover 1mm" -#define MSG_MOVE_10MM "Mover 10mm" -#define MSG_SPEED "Velocidade" -#define MSG_BED_Z "Base Z" -#define MSG_NOZZLE LCD_STR_THERMOMETER " Bico" -#define MSG_BED LCD_STR_THERMOMETER " Base" -#define MSG_FAN_SPEED "Vel. ventoinha" -#define MSG_FLOW "Fluxo" -#define MSG_CONTROL "Controlo" -#define MSG_MIN LCD_STR_THERMOMETER " Min" -#define MSG_MAX LCD_STR_THERMOMETER " Max" -#define MSG_FACTOR LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP "Temp. Automatica" -#define MSG_ON "On " -#define MSG_OFF "Off" -#define MSG_PID_P "PID-P" -#define MSG_PID_I "PID-I" -#define MSG_PID_D "PID-D" -#define MSG_PID_C "PID-C" -#define MSG_ACC "Acc" -#define MSG_JERK "Jerk" -#if IS_KINEMATIC - #define MSG_VA_JERK "Va-jerk" - #define MSG_VB_JERK "Vb-jerk" - #define MSG_VC_JERK "Vc-jerk" -#else - #define MSG_VA_JERK "Vx-jerk" - #define MSG_VB_JERK "Vy-jerk" - #define MSG_VC_JERK "Vz-jerk" -#endif -#define MSG_VE_JERK "Ve-jerk" -#define MSG_VMAX " Vmax " -#define MSG_VMIN "Vmin" -#define MSG_VTRAV_MIN "VTrav min" -#define MSG_AMAX "Amax " -#define MSG_A_RETRACT "A-retraccao" -#define MSG_A_TRAVEL "A-movimento" -#define MSG_STEPS_PER_MM "Passo/mm" -#if IS_KINEMATIC - #define MSG_ASTEPS "A passo/mm" - #define MSG_BSTEPS "B passo/mm" - #define MSG_CSTEPS "C passo/mm" -#else - #define MSG_ASTEPS "X passo/mm" - #define MSG_BSTEPS "Y passo/mm" - #define MSG_CSTEPS "Z passo/mm" -#endif -#define MSG_ESTEPS "E passo/mm" -#define MSG_E1STEPS "E1 passo/mm" -#define MSG_E2STEPS "E2 passo/mm" -#define MSG_E3STEPS "E3 passo/mm" -#define MSG_E4STEPS "E4 passo/mm" -#define MSG_E5STEPS "E5 passo/mm" -#define MSG_TEMPERATURE "Temperatura" -#define MSG_MOTION "Movimento" -#define MSG_FILAMENT "Filamento" -#define MSG_VOLUMETRIC_ENABLED "E em mm3" -#define MSG_FILAMENT_DIAM "Fil. Diam." -#define MSG_CONTRAST "Contraste" -#define MSG_STORE_EEPROM "Guardar na memoria" -#define MSG_LOAD_EEPROM "Carregar da memoria" -#define MSG_RESTORE_FAILSAFE "Rest. de emergen." -#define MSG_REFRESH LCD_STR_REFRESH " Recarregar" -#define MSG_WATCH "Monitorizar" -#define MSG_PREPARE "Preparar" -#define MSG_TUNE "Afinar" -#define MSG_PAUSE_PRINT "Pausar impressao" -#define MSG_RESUME_PRINT "Retomar impressao" -#define MSG_STOP_PRINT "Parar impressao" -#define MSG_CARD_MENU "Imprimir do SD" -#define MSG_NO_CARD "Sem cartao SD" -#define MSG_DWELL "Em espera..." -#define MSG_USERWAIT "A espera de ordem" -#define MSG_PRINT_ABORTED "Impressao cancelada" -#define MSG_NO_MOVE "Sem movimento" -#define MSG_KILLED "EMERGENCIA. " -#define MSG_STOPPED "PARADO. " -#define MSG_CONTROL_RETRACT " Retrair mm" -#define MSG_CONTROL_RETRACT_SWAP "Troca Retrair mm" -#define MSG_CONTROL_RETRACTF " Retrair V" -#define MSG_CONTROL_RETRACT_ZLIFT " Levantar mm" -#define MSG_CONTROL_RETRACT_RECOVER " DesRet mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Troca DesRet mm" -#define MSG_CONTROL_RETRACT_RECOVERF " DesRet V" -#define MSG_AUTORETRACT " AutoRetr." -#define MSG_FILAMENTCHANGE "Trocar filamento" -#define MSG_INIT_SDCARD "Inici. cartao SD" -#define MSG_CNG_SDCARD "Trocar cartao SD" -#define MSG_ZPROBE_OUT "Sensor fora/base" -#define MSG_HOME "Home" // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST "first" -#define MSG_ZPROBE_ZOFFSET "Desvio Z" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Babystep Z" -#define MSG_ENDSTOP_ABORT "Fim de curso" -#define MSG_HEATING_FAILED_LCD "Aquecimento falhou" -#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP" -#define MSG_THERMAL_RUNAWAY "THERMAL RUNAWAY" -#define MSG_ERR_MAXTEMP "Err: T Maxima" -#define MSG_ERR_MINTEMP "Err: T Minima" -#define MSG_ERR_MAXTEMP_BED "Err: T Base Maxima" -#define MSG_ERR_MINTEMP_BED "Err: T Base Minima" -#define MSG_HEATING "Aquecendo..." -#define MSG_BED_HEATING "Aquecendo base.." -#define MSG_DELTA_CALIBRATE "Calibracao Delta" -#define MSG_DELTA_CALIBRATE_X "Calibrar X" -#define MSG_DELTA_CALIBRATE_Y "Calibrar Y" -#define MSG_DELTA_CALIBRATE_Z "Calibrar Z" -#define MSG_DELTA_CALIBRATE_CENTER "Calibrar Centro" - -#define MSG_LCD_ENDSTOPS "Fim de curso" - -#endif // LANGUAGE_PT_H diff --git a/Marlin/mesh_bed_leveling.cpp b/Marlin/mesh_bed_leveling.cpp deleted file mode 100644 index cc2ee6ac45..0000000000 --- a/Marlin/mesh_bed_leveling.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#include "MarlinConfig.h" - -#if ENABLED(MESH_BED_LEVELING) - - #include "mesh_bed_leveling.h" - #include "Marlin.h" - #include "serial.h" - - mesh_bed_leveling mbl; - - float mesh_bed_leveling::z_offset, - mesh_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y], - mesh_bed_leveling::index_to_xpos[GRID_MAX_POINTS_X], - mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; - - mesh_bed_leveling::mesh_bed_leveling() { - for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) - index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); - for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) - index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); - reset(); - } - - void mesh_bed_leveling::reset() { - z_offset = 0; - ZERO(z_values); - } - - void mesh_bed_leveling::report_mesh() { - SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(GRID_MAX_POINTS_X) "," STRINGIFY(GRID_MAX_POINTS_Y)); - SERIAL_PROTOCOLPGM("Z offset: "); SERIAL_PROTOCOL_F(z_offset, 5); - SERIAL_PROTOCOLLNPGM("\nMeasured points:"); - print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 5, - [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } - ); - } - -#endif // MESH_BED_LEVELING diff --git a/Marlin/pins_RUMBA.h b/Marlin/pins_RUMBA.h deleted file mode 100644 index e604301545..0000000000 --- a/Marlin/pins_RUMBA.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * RUMBA pin assignments - */ - -#ifndef __AVR_ATmega2560__ - #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." -#endif - -#if HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." -#endif - -#define DEFAULT_MACHINE_NAME "Rumba" -#define BOARD_NAME "Rumba" - -// -// Servos -// -#define SERVO0_PIN 5 - -// -// Limit Switches -// -#define X_MIN_PIN 37 -#define X_MAX_PIN 36 -#define Y_MIN_PIN 35 -#define Y_MAX_PIN 34 -#define Z_MIN_PIN 33 -#define Z_MAX_PIN 32 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 17 -#define X_DIR_PIN 16 -#define X_ENABLE_PIN 48 - -#define Y_STEP_PIN 54 -#define Y_DIR_PIN 47 -#define Y_ENABLE_PIN 55 - -#define Z_STEP_PIN 57 -#define Z_DIR_PIN 56 -#define Z_ENABLE_PIN 62 - -#define E0_STEP_PIN 23 -#define E0_DIR_PIN 22 -#define E0_ENABLE_PIN 24 - -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 25 -#define E1_ENABLE_PIN 27 - -#define E2_STEP_PIN 29 -#define E2_DIR_PIN 28 -#define E2_ENABLE_PIN 39 - -// -// Temperature Sensors -// -#if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 6 // Analog Input (connector *K1* on RUMBA thermocouple ADD ON is used) -#else - #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) -#endif - -#if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 5 // Analog Input (connector *K2* on RUMBA thermocouple ADD ON is used) -#else - #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) -#endif - -#if TEMP_SENSOR_2 == -1 - #define TEMP_2_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_BED is defined as thermocouple) -#else - #define TEMP_2_PIN 13 // Analog Input (default connector for thermistor *T2* on rumba board is used) -#endif - -// optional for extruder 4 or chamber: -//#define TEMP_X_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) -//#define TEMP_CHAMBER_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) - -#if TEMP_SENSOR_BED == -1 - #define TEMP_BED_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_2 is defined as thermocouple) -#else - #define TEMP_BED_PIN 11 // Analog Input (default connector for thermistor *THB* on rumba board is used) -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_2_PIN 6 -#define HEATER_3_PIN 8 -#define HEATER_BED_PIN 9 - -#define FAN_PIN 7 -#define FAN1_PIN 8 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 45 -#define KILL_PIN 46 -#define CASE_LIGHT_PIN 45 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#ifndef SPINDLE_LASER_PWM_PIN - #define SPINDLE_LASER_PWM_PIN 4 // MUST BE HARDWARE PWM. Pin 4 interrupts OC0* and OC1* always in use? -#endif -#ifndef SPINDLE_LASER_ENABLE_PIN - #define SPINDLE_LASER_ENABLE_PIN 14 // Pin should have a pullup! -#endif -#ifndef SPINDLE_DIR_PIN - #define SPINDLE_DIR_PIN 15 -#endif - -// -// LCD / Controller -// -#define SD_DETECT_PIN 49 -#define BEEPER_PIN 44 -#define LCD_PINS_D7 40 -#define BTN_EN1 11 -#define BTN_EN2 12 -#define BTN_ENC 43 - -#if ENABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 38 // Set as output on init - #define LCD_PINS_RS 41 // Pull low for 1s to init - // DOGM SPI LCD Support - #define DOGLCD_CS 19 - #define DOGLCD_MOSI 42 - #define DOGLCD_SCK 18 - #define DOGLCD_A0 LCD_PINS_DC -#else - #define LCD_PINS_RS 19 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 18 - #define LCD_PINS_D5 38 - #define LCD_PINS_D6 41 -#endif diff --git a/Marlin/serial.cpp b/Marlin/serial.cpp deleted file mode 100644 index 8b6a1c2b49..0000000000 --- a/Marlin/serial.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#include "serial.h" - -const char errormagic[] PROGMEM = "Error:"; -const char echomagic[] PROGMEM = "echo:"; - -void serial_echopair_PGM(const char* s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(const char* s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } -void serial_echopair_PGM(const char* s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(const char* s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(const char* s_P, float v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(const char* s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(const char* s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } - -void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } diff --git a/Marlin/serial.h b/Marlin/serial.h deleted file mode 100644 index dc1da87353..0000000000 --- a/Marlin/serial.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#ifndef __SERIAL_H__ -#define __SERIAL_H__ - -#include "MarlinConfig.h" - -#if defined(__AVR__) && defined(USBCON) - #include - #if ENABLED(BLUETOOTH) - extern HardwareSerial bluetoothSerial; - #define MYSERIAL0 bluetoothSerial - #else - #define MYSERIAL0 Serial - #endif // BLUETOOTH -#else - #include "MarlinSerial.h" - #define MYSERIAL0 customizedSerial -#endif - -extern const char echomagic[] PROGMEM; -extern const char errormagic[] PROGMEM; - -#define SERIAL_CHAR(x) ((void)MYSERIAL0.write(x)) -#define SERIAL_EOL() SERIAL_CHAR('\n') - -#define SERIAL_PRINT(x,b) MYSERIAL0.print(x,b) -#define SERIAL_PRINTLN(x,b) MYSERIAL0.println(x,b) -#define SERIAL_PRINTF(args...) MYSERIAL0.printf(args) - -#define SERIAL_FLUSH() MYSERIAL0.flush() -#if TX_BUFFER_SIZE > 0 - #define SERIAL_FLUSHTX() MYSERIAL0.flushTX() -#endif - -#define SERIAL_PROTOCOLCHAR(x) SERIAL_CHAR(x) -#define SERIAL_PROTOCOL(x) MYSERIAL0.print(x) -#define SERIAL_PROTOCOL_F(x,y) MYSERIAL0.print(x,y) -#define SERIAL_PROTOCOLPGM(x) serialprintPGM(PSTR(x)) -#define SERIAL_PROTOCOLLN(x) do{ MYSERIAL0.print(x); SERIAL_EOL(); }while(0) -#define SERIAL_PROTOCOLLNPGM(x) serialprintPGM(PSTR(x "\n")) -#define SERIAL_PROTOCOLPAIR(name, value) serial_echopair_PGM(PSTR(name),(value)) -#define SERIAL_PROTOCOLLNPAIR(name, value) do{ SERIAL_PROTOCOLPAIR(name, value); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHO_START() serialprintPGM(echomagic) -#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x) -#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x) -#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x) -#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x) -#define SERIAL_ECHOPAIR(pre,value) SERIAL_PROTOCOLPAIR(pre, value) -#define SERIAL_ECHOLNPAIR(pre,value) SERIAL_PROTOCOLLNPAIR(pre, value) -#define SERIAL_ECHO_F(x,y) SERIAL_PROTOCOL_F(x,y) - -#define SERIAL_ERROR_START() serialprintPGM(errormagic) -#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x) -#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x) -#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x) -#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x) - -// These macros compensate for float imprecision -#define SERIAL_PROTOCOLPAIR_F(pre, value) SERIAL_PROTOCOLPAIR(pre, FIXFLOAT(value)) -#define SERIAL_PROTOCOLLNPAIR_F(pre, value) SERIAL_PROTOCOLLNPAIR(pre, FIXFLOAT(value)) -#define SERIAL_ECHOPAIR_F(pre,value) SERIAL_ECHOPAIR(pre, FIXFLOAT(value)) -#define SERIAL_ECHOLNPAIR_F(pre, value) SERIAL_ECHOLNPAIR(pre, FIXFLOAT(value)) - -// -// Functions for serial printing from PROGMEM. (Saves loads of SRAM.) -// -FORCE_INLINE void serialprintPGM(const char* str) { - while (char ch = pgm_read_byte(str++)) SERIAL_CHAR(ch); -} - -void serial_echopair_PGM(const char* s_P, const char *v); -void serial_echopair_PGM(const char* s_P, char v); -void serial_echopair_PGM(const char* s_P, int v); -void serial_echopair_PGM(const char* s_P, long v); -void serial_echopair_PGM(const char* s_P, float v); -void serial_echopair_PGM(const char* s_P, double v); -void serial_echopair_PGM(const char* s_P, unsigned int v); -void serial_echopair_PGM(const char* s_P, unsigned long v); -FORCE_INLINE void serial_echopair_PGM(const char* s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } -FORCE_INLINE void serial_echopair_PGM(const char* s_P, uint16_t v) { serial_echopair_PGM(s_P, (int)v); } -FORCE_INLINE void serial_echopair_PGM(const char* s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } -FORCE_INLINE void serial_echopair_PGM(const char* s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } - -void serial_spaces(uint8_t count); -#define SERIAL_ECHO_SP(C) serial_spaces(C) -#define SERIAL_ERROR_SP(C) serial_spaces(C) -#define SERIAL_PROTOCOL_SP(C) serial_spaces(C) - -#endif // __SERIAL_H__ diff --git a/Marlin/servo.h b/Marlin/servo.h deleted file mode 100644 index 16496461e4..0000000000 --- a/Marlin/servo.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - * Copyright (c) 2009 Michael Margolis. All right reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * - * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - * The servos are pulsed in the background using the value most recently written using the write() method - * - * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - * The sequence used to seize timers is defined in timers.h - * - * The methods are: - * - * Servo - Class for manipulating servo motors connected to Arduino pins. - * - * attach(pin ) - Attaches a servo motor to an i/o pin. - * attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds - * default min is 544, max is 2400 - * - * write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - * writeMicroseconds() - Sets the servo pulse width in microseconds - * read() - Gets the last written servo pulse width as an angle between 0 and 180. - * readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - * attached() - Returns true if there is a servo attached. - * detach() - Stops an attached servos from pulsing its i/o pin. - * move(angle) - Sequence of attach(0), write(angle), - * With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. - */ - -#ifndef SERVO_H -#define SERVO_H - -#include - -/** - * Defines for 16 bit timers used with Servo library - * - * If _useTimerX is defined then TimerX is a 16 bit timer on the current board - * timer16_Sequence_t enumerates the sequence that the timers should be allocated - * _Nbr_16timers indicates how many 16 bit timers are available. - * - */ - -// Say which 16 bit timers can be used and in what order -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - //#define _useTimer1 // Timer 1 is used by the stepper ISR - #define _useTimer3 - #define _useTimer4 - #if !HAS_MOTOR_CURRENT_PWM - #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. - #endif -#elif defined(__AVR_ATmega32U4__) - #define _useTimer3 -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) - #define _useTimer3 -#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__) - #define _useTimer3 -#else - // everything else -#endif - -typedef enum { - #if ENABLED(_useTimer1) - _timer1, - #endif - #if ENABLED(_useTimer3) - _timer3, - #endif - #if ENABLED(_useTimer4) - _timer4, - #endif - #if ENABLED(_useTimer5) - _timer5, - #endif - _Nbr_16timers -} timer16_Sequence_t; - -#define Servo_VERSION 2 // software version of this library - -#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo -#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo -#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached -#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds - -#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer -#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) - -#define INVALID_SERVO 255 // flag indicating an invalid servo index - -typedef struct { - uint8_t nbr : 6 ; // a pin number from 0 to 63 - uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false -} ServoPin_t; - -typedef struct { - ServoPin_t Pin; - unsigned int ticks; -} ServoInfo_t; - -class Servo { - public: - Servo(); - int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) - int8_t attach(const int pin, const int min, const int max); // as above but also sets min and max values for writes. - void detach(); - void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // write pulse width in microseconds - void move(const int value); // attach the servo, then move to value - // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach - int read(); // returns current pulse width as an angle between 0 and 180 degrees - int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false - - private: - uint8_t servoIndex; // index into the channel data for this servo - int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH - int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH -}; - -#endif // SERVO_H diff --git a/Marlin/src/HAL/Delay.h b/Marlin/src/HAL/Delay.h new file mode 100644 index 0000000000..e1e8fab7c8 --- /dev/null +++ b/Marlin/src/HAL/Delay.h @@ -0,0 +1,135 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + + Busy wait delay Cycles routines: + + DELAY_CYCLES(count): Delay execution in cycles + DELAY_NS(count): Delay execution in nanoseconds + DELAY_US(count): Delay execution in microseconds + + */ + +#ifndef MARLIN_DELAY_H +#define MARLIN_DELAY_H + +#include "../core/macros.h" + +#if defined(__arm__) || defined(__thumb__) + + /* https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles */ + + #define nop() __asm__ __volatile__("nop;\n\t":::) + + FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle + #if ARCH_PIPELINE_RELOAD_CYCLES < 2 + #define EXTRA_NOP_CYCLES A("nop") + #else + #define EXTRA_NOP_CYCLES "" + #endif + + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + L("1") + A("subs %[cnt],#1") + EXTRA_NOP_CYCLES + A("bne 1b") + : [cnt]"+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } + + /* ---------------- Delay in cycles */ + FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { + + if (__builtin_constant_p(x)) { + #define MAXNOPS 4 + + if (x <= (MAXNOPS)) { + switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } + } + else { // because of +1 cycle inside delay_4cycles + const uint32_t rem = (x - 1) % (MAXNOPS); + switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } + if ((x = (x - 1) / (MAXNOPS))) + __delay_4cycles(x); // if need more then 4 nop loop is more optimal + } + #undef MAXNOPS + } + else + __delay_4cycles(x / 4); + } + #undef nop + +#elif defined(__AVR__) + + #define nop() __asm__ __volatile__("nop;\n\t":::) + + FORCE_INLINE static void __delay_4cycles(uint8_t cy) { + __asm__ __volatile__( + L("1") + A("dec %[cnt]") + A("nop") + A("brne 1b") + : [cnt] "+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } + + /* ---------------- Delay in cycles */ + FORCE_INLINE static void DELAY_CYCLES(uint16_t x) { + + if (__builtin_constant_p(x)) { + #define MAXNOPS 4 + + if (x <= (MAXNOPS)) { + switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } + } + else { + const uint32_t rem = (x) % (MAXNOPS); + switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } + if ((x = (x) / (MAXNOPS))) + __delay_4cycles(x); // if need more then 4 nop loop is more optimal + } + + #undef MAXNOPS + } + else + __delay_4cycles(x / 4); + } + #undef nop + +#else + #error "Unsupported MCU architecture" +#endif + +/* ---------------- Delay in nanoseconds */ +#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) / 1000L ) + +/* ---------------- Delay in microseconds */ +#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) ) + +#endif // MARLIN_DELAY_H + diff --git a/Marlin/src/HAL/HAL_AVR/HAL.cpp b/Marlin/src/HAL/HAL_AVR/HAL.cpp new file mode 100644 index 0000000000..e694559761 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL.cpp @@ -0,0 +1,94 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . + +****************************************************************************/ + +#ifdef __AVR__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//uint8_t MCUSR; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SDSUPPORT) + + #include "../../sd/SdFatUtil.h" + int freeMemory() { return SdFatUtil::FreeRam(); } + +#else // !SDSUPPORT + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +#endif // !SDSUPPORT + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h new file mode 100644 index 0000000000..b887e6df27 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL.h @@ -0,0 +1,358 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + +#ifndef _HAL_AVR_H_ +#define _HAL_AVR_H_ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include + +#include +#include +#include +#include +#include + +#include "../HAL_SPI.h" +#include "fastio_AVR.h" +#include "watchdog_AVR.h" +#include "math_AVR.h" + +#ifdef USBCON + #include "HardwareSerial.h" +#else + #include "MarlinSerial.h" +#endif + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//#define analogInputToDigitalPin(IO) IO + +#ifndef CRITICAL_SECTION_START + #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); + #define CRITICAL_SECTION_END SREG = _sreg; +#endif +#define ISRS_ENABLED() TEST(SREG, SREG_I) +#define ENABLE_ISRS() sei() +#define DISABLE_ISRS() cli() + +// On AVR this is in math.h? +//#define square(x) ((x)*(x)) + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB Servo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//extern uint8_t MCUSR; + +#define NUM_SERIAL 1 + +#ifdef USBCON + #if ENABLED(BLUETOOTH) + #define MYSERIAL0 bluetoothSerial + #else + #define MYSERIAL0 Serial + #endif +#else + #define MYSERIAL0 customizedSerial +#endif + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +//void cli(void); + +//void _delay_ms(const int delay); + +inline void HAL_clear_reset_source(void) { MCUSR = 0; } +inline uint8_t HAL_get_reset_source(void) { return MCUSR; } + +extern "C" { + int freeMemory(void); +} + +// timers +#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz + +#define STEP_TIMER_NUM 1 +#define TEMP_TIMER_NUM 0 +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_PRESCALE 8 +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) +#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) + +#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) +#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) +#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) + +FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + UNUSED(frequency); + switch (timer_num) { + case STEP_TIMER_NUM: + // waveform generation = 0100 = CTC + SET_WGM(1, CTC_OCRnA); + + // output mode = 00 (disconnected) + SET_COMA(1, NORMAL); + + // Set the timer pre-scaler + // Generally we use a divider of 8, resulting in a 2MHz timer + // frequency on a 16MHz MCU. If you are going to change this, be + // sure to regenerate speed_lookuptable.h with + // create_speed_lookuptable.py + SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler + + // Init Stepper ISR to 122 Hz for quick starting + // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency + OCR1A = 0x4000; + TCNT1 = 0; + break; + + case TEMP_TIMER_NUM: + // Use timer0 for temperature measurement + // Interleave temperature interrupt with millies interrupt + OCR0B = 128; + break; + } +} + +#define TIMER_OCR_1 OCR1A +#define TIMER_COUNTER_1 TCNT1 + +#define TIMER_OCR_0 OCR0A +#define TIMER_COUNTER_0 TCNT0 + +#define _CAT(a, ...) a ## __VA_ARGS__ +#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) +#define HAL_timer_restrain(timer, interval_ticks) NOLESS(_CAT(TIMER_OCR_, timer), _CAT(TIMER_COUNTER_, timer) + interval_ticks) + +#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer) +#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer) + +/** + * On AVR there is no hardware prioritization and preemption of + * interrupts, so this emulates it. The UART has first priority + * (otherwise, characters will be lost due to UART overflow). + * Then: Stepper, Endstops, Temperature, and -finally- all others. + */ +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) + +/* 18 cycles maximum latency */ +#define HAL_STEP_TIMER_ISR \ +extern "C" void TIMER1_COMPA_vect (void) __attribute__ ((signal, naked, used, externally_visible)); \ +extern "C" void TIMER1_COMPA_vect_bottom (void) asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ +void TIMER1_COMPA_vect (void) { \ + __asm__ __volatile__ ( \ + A("push r16") /* 2 Save R16 */ \ + A("in r16, __SREG__") /* 1 Get SREG */ \ + A("push r16") /* 2 Save SREG into stack */ \ + A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \ + A("push r16") /* 2 Save TIMSK0 into the stack */ \ + A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \ + A("sts %[timsk0], r16") /* 2 And set the new value */ \ + A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \ + A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \ + A("sts %[timsk1], r16") /* 2 And set the new value */ \ + A("push r16") /* 2 Save TIMSK1 into stack */ \ + A("in r16, 0x3B") /* 1 Get RAMPZ register */ \ + A("push r16") /* 2 Save RAMPZ into stack */ \ + A("in r16, 0x3C") /* 1 Get EIND register */ \ + A("push r0") /* C runtime can modify all the following registers without restoring them */ \ + A("push r1") \ + A("push r18") \ + A("push r19") \ + A("push r20") \ + A("push r21") \ + A("push r22") \ + A("push r23") \ + A("push r24") \ + A("push r25") \ + A("push r26") \ + A("push r27") \ + A("push r30") \ + A("push r31") \ + A("clr r1") /* C runtime expects this register to be 0 */ \ + A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ + A("pop r31") \ + A("pop r30") \ + A("pop r27") \ + A("pop r26") \ + A("pop r25") \ + A("pop r24") \ + A("pop r23") \ + A("pop r22") \ + A("pop r21") \ + A("pop r20") \ + A("pop r19") \ + A("pop r18") \ + A("pop r1") \ + A("pop r0") \ + A("out 0x3C, r16") /* 1 Restore EIND register */ \ + A("pop r16") /* 2 Get the original RAMPZ register value */ \ + A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \ + A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \ + A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \ + A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \ + A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \ + A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \ + A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \ + A("pop r16") /* 2 Get the old SREG value */ \ + A("out __SREG__, r16") /* 1 And restore the SREG value */ \ + A("pop r16") /* 2 Restore R16 value */ \ + A("reti") /* 4 Return from interrupt */ \ + : \ + : [timsk0] "i" ((uint16_t)&TIMSK0), \ + [timsk1] "i" ((uint16_t)&TIMSK1), \ + [msk0] "M" ((uint8_t)(1< 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) +#else + #define HAL_START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) +#endif + +#define HAL_READ_ADC ADC + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#define HAL_SENSITIVE_PINS 0, 1 + +#endif // _HAL_AVR_H_ diff --git a/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp b/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp new file mode 100644 index 0000000000..4e4b248182 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp @@ -0,0 +1,278 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Description: HAL for AVR - SPI functions + * + * For __AVR__ + */ + +#ifdef __AVR__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void spiBegin (void) { + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + #if DISABLED(SOFTWARE_SPI) + // SS must be in output mode even it is not chip select + SET_OUTPUT(SS_PIN); + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif // SET_SPI_SS_HIGH + // set a default rate + spiInit(1); + #endif // SOFTWARE_SPI +} + + +//------------------------------------------------------------------------------ +#if DISABLED(SOFTWARE_SPI) + // functions for hardware SPI + //------------------------------------------------------------------------------ + // make sure SPCR rate is in expected bits + #if (SPR0 != 0 || SPR1 != 1) + #error "unexpected SPCR bits" + #endif + + /** + * Initialize hardware SPI + * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] + */ + void spiInit(uint8_t spiRate) { + // See avr processor documentation + CBI( + #ifdef PRR + PRR + #elif defined(PRR0) + PRR0 + #endif + , PRSPI); + + SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); + SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); + } + + //------------------------------------------------------------------------------ + /** SPI receive a byte */ + uint8_t spiRec(void) { + SPDR = 0xFF; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + return SPDR; + } + //------------------------------------------------------------------------------ + /** SPI read data */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + SPDR = 0xFF; + for (uint16_t i = 0; i < nbyte; i++) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[i] = SPDR; + SPDR = 0xFF; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[nbyte] = SPDR; + } + //------------------------------------------------------------------------------ + /** SPI send a byte */ + void spiSend(uint8_t b) { + SPDR = b; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + //------------------------------------------------------------------------------ + /** SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + + + /** begin spi transaction */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // Based on Arduino SPI library + // Clock settings are defined as follows. Note that this shows SPI2X + // inverted, so the bits form increasing numbers. Also note that + // fosc/64 appears twice + // SPR1 SPR0 ~SPI2X Freq + // 0 0 0 fosc/2 + // 0 0 1 fosc/4 + // 0 1 0 fosc/8 + // 0 1 1 fosc/16 + // 1 0 0 fosc/32 + // 1 0 1 fosc/64 + // 1 1 0 fosc/64 + // 1 1 1 fosc/128 + + // We find the fastest clock that is less than or equal to the + // given clock rate. The clock divider that results in clock_setting + // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the + // slowest (128 == 2 ^^ 7, so clock_div = 6). + uint8_t clockDiv; + + // When the clock is known at compiletime, use this if-then-else + // cascade, which the compiler knows how to completely optimize + // away. When clock is not known, use a loop instead, which generates + // shorter code. + if (__builtin_constant_p(spiClock)) { + if (spiClock >= F_CPU / 2) clockDiv = 0; + else if (spiClock >= F_CPU / 4) clockDiv = 1; + else if (spiClock >= F_CPU / 8) clockDiv = 2; + else if (spiClock >= F_CPU / 16) clockDiv = 3; + else if (spiClock >= F_CPU / 32) clockDiv = 4; + else if (spiClock >= F_CPU / 64) clockDiv = 5; + else clockDiv = 6; + } + else { + uint32_t clockSetting = F_CPU / 2; + clockDiv = 0; + while (clockDiv < 6 && spiClock < clockSetting) { + clockSetting /= 2; + clockDiv++; + } + } + + // Compensate for the duplicate fosc/64 + if (clockDiv == 6) clockDiv = 7; + + // Invert the SPI2X bit + clockDiv ^= 0x1; + + SPCR = _BV(SPE) | _BV(MSTR) | ((bitOrder == SPI_LSBFIRST) ? _BV(DORD) : 0) | + (dataMode << CPHA) | ((clockDiv >> 1) << SPR0); + SPSR = clockDiv | 0x01; + } + + + //------------------------------------------------------------------------------ +#else // SOFTWARE_SPI + //------------------------------------------------------------------------------ + /** nop to tune soft SPI timing */ + #define nop asm volatile ("\tnop\n") + + /** Set SPI rate */ + void spiInit(uint8_t spiRate) { + // nothing to do + UNUSED(spiRate); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // nothing to do + UNUSED(spiBeginTransaction); + } + + //------------------------------------------------------------------------------ + /** Soft SPI receive byte */ + uint8_t spiRec() { + uint8_t data = 0; + // no interrupts during byte receive - about 8µs + cli(); + // output pin high - like sending 0xFF + WRITE(MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + WRITE(SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (READ(MISO_PIN)) data |= 1; + + WRITE(SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; + } + //------------------------------------------------------------------------------ + /** Soft SPI read data */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + buf[i] = spiRec(); + } + //------------------------------------------------------------------------------ + /** Soft SPI send byte */ + void spiSend(uint8_t data) { + // no interrupts during byte send - about 8µs + cli(); + for (uint8_t i = 0; i < 8; i++) { + WRITE(SCK_PIN, LOW); + + WRITE(MOSI_PIN, data & 0x80); + + data <<= 1; + + WRITE(SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + WRITE(SCK_PIN, LOW); + // enable interrupts + sei(); + } + //------------------------------------------------------------------------------ + /** Soft SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiSend(token); + for (uint16_t i = 0; i < 512; i++) + spiSend(buf[i]); + } +#endif // SOFTWARE_SPI + + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp new file mode 100644 index 0000000000..ece2497766 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp @@ -0,0 +1,749 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MarlinSerial.cpp - Hardware serial library for Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * Modified 23 November 2006 by David A. Mellis + * Modified 28 September 2010 by Mark Sproul + * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) + * Modified 10 June 2018 by Eduardo José Tagle (See #10991) + */ + +#ifdef __AVR__ + +// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.) + +#include "../../inc/MarlinConfig.h" + +#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) + + #include "MarlinSerial.h" + #include "../../Marlin.h" + + struct ring_buffer_r { + unsigned char buffer[RX_BUFFER_SIZE]; + volatile ring_buffer_pos_t head, tail; + }; + + #if TX_BUFFER_SIZE > 0 + struct ring_buffer_t { + unsigned char buffer[TX_BUFFER_SIZE]; + volatile uint8_t head, tail; + }; + #endif + + #if UART_PRESENT(SERIAL_PORT) + ring_buffer_r rx_buffer = { { 0 }, 0, 0 }; + #if TX_BUFFER_SIZE > 0 + ring_buffer_t tx_buffer = { { 0 }, 0, 0 }; + #endif + static bool _written; + #endif + + #if ENABLED(SERIAL_XON_XOFF) + constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + // XON / XOFF character definitions + constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + uint8_t xon_xoff_state = XON_XOFF_CHAR_SENT | XON_CHAR; + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + uint8_t rx_dropped_bytes = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + uint8_t rx_buffer_overruns = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + uint8_t rx_framing_errors = 0; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + ring_buffer_pos_t rx_max_enqueued = 0; + #endif + + // A SW memory barrier, to ensure GCC does not overoptimize loops + #define sw_barrier() asm volatile("": : :"memory"); + + #if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" + #endif + + // "Atomically" read the RX head index value without disabling interrupts: + // This MUST be called with RX interrupts enabled, and CAN'T be called + // from the RX ISR itself! + FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head() { + #if RX_BUFFER_SIZE > 256 + // Keep reading until 2 consecutive reads return the same value, + // meaning there was no update in-between caused by an interrupt. + // This works because serial RX interrupts happen at a slower rate + // than successive reads of a variable, so 2 consecutive reads with + // the same value means no interrupt updated it. + ring_buffer_pos_t vold, vnew = rx_buffer.head; + sw_barrier(); + do { + vold = vnew; + vnew = rx_buffer.head; + sw_barrier(); + } while (vold != vnew); + return vnew; + #else + // With an 8bit index, reads are always atomic. No need for special handling + return rx_buffer.head; + #endif + } + + #if RX_BUFFER_SIZE > 256 + static volatile bool rx_tail_value_not_stable = false; + static volatile uint16_t rx_tail_value_backup = 0; + #endif + + // Set RX tail index, taking into account the RX ISR could interrupt + // the write to this variable in the middle - So a backup strategy + // is used to ensure reads of the correct values. + // -Must NOT be called from the RX ISR - + FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value) { + #if RX_BUFFER_SIZE > 256 + // Store the new value in the backup + rx_tail_value_backup = value; + sw_barrier(); + // Flag we are about to change the true value + rx_tail_value_not_stable = true; + sw_barrier(); + // Store the new value + rx_buffer.tail = value; + sw_barrier(); + // Signal the new value is completely stored into the value + rx_tail_value_not_stable = false; + sw_barrier(); + #else + rx_buffer.tail = value; + #endif + } + + // Get the RX tail index, taking into account the read could be + // interrupting in the middle of the update of that index value + // -Called from the RX ISR - + FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail() { + #if RX_BUFFER_SIZE > 256 + // If the true index is being modified, return the backup value + if (rx_tail_value_not_stable) return rx_tail_value_backup; + #endif + // The true index is stable, return it + return rx_buffer.tail; + } + + // (called with RX interrupts disabled) + FORCE_INLINE void store_rxd_char() { + + #if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET + #endif + + // Get the tail - Nothing can alter its value while this ISR is executing, but there's + // a chance that this ISR interrupted the main process while it was updating the index. + // The backup mechanism ensures the correct value is always returned. + const ring_buffer_pos_t t = atomic_read_rx_tail(); + + // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // This must read the M_UCSRxA register before reading the received byte to detect error causes + #if ENABLED(SERIAL_STATS_DROPPED_RX) + if (TEST(M_UCSRxA, M_DORx) && !++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + if (TEST(M_UCSRxA, M_DORx) && !++rx_buffer_overruns) --rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + if (TEST(M_UCSRxA, M_FEx) && !++rx_framing_errors) --rx_framing_errors; + #endif + + // Read the character from the USART + uint8_t c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + // Calculate count of bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); + #endif + + #if ENABLED(SERIAL_XON_XOFF) + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (RX_BUFFER_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + while (!TEST(M_UCSRxA, M_UDREx)) { + + if (TEST(M_UCSRxA,M_RXCx)) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + M_UDRx = XOFF_CHAR; + + // Clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!TEST(M_UCSRxA, M_UDREx)) { + + if (TEST(M_UCSRxA,M_RXCx)) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + #endif // SERIAL_XON_XOFF + + // Store the new head value - The main loop will retry until the value is stable + rx_buffer.head = h; + } + + #if TX_BUFFER_SIZE > 0 + + // (called with TX irqs disabled) + FORCE_INLINE void _tx_udr_empty_irq(void) { + + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + M_UDRx = XON_CHAR; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + + return; + } + #endif + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (TX_BUFFER_SIZE - 1); + M_UDRx = c; + tx_buffer.tail = t; + + // Clear the TXC bit (by writing a one to its bit location). + // Ensures flush() won't return until the bytes are actually written/ + SBI(M_UCSRxA, M_TXCx); + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + } + + #ifdef M_USARTx_UDRE_vect + ISR(M_USARTx_UDRE_vect) { _tx_udr_empty_irq(); } + #endif + + #endif // TX_BUFFER_SIZE + + #ifdef M_USARTx_RX_vect + ISR(M_USARTx_RX_vect) { store_rxd_char(); } + #endif + + // Public Methods + + void MarlinSerial::begin(const long baud) { + uint16_t baud_setting; + bool useU2X = true; + + #if F_CPU == 16000000UL && SERIAL_PORT == 0 + // Hard-coded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards, and the firmware on the + // 8U2 on the Uno and Mega 2560. + if (baud == 57600) useU2X = false; + #endif + + if (useU2X) { + M_UCSRxA = _BV(M_U2Xx); + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } + else { + M_UCSRxA = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + M_UBRRxH = baud_setting >> 8; + M_UBRRxL = baud_setting; + + SBI(M_UCSRxB, M_RXENx); + SBI(M_UCSRxB, M_TXENx); + SBI(M_UCSRxB, M_RXCIEx); + #if TX_BUFFER_SIZE > 0 + CBI(M_UCSRxB, M_UDRIEx); + #endif + _written = false; + } + + void MarlinSerial::end() { + CBI(M_UCSRxB, M_RXENx); + CBI(M_UCSRxB, M_TXENx); + CBI(M_UCSRxB, M_RXCIEx); + CBI(M_UCSRxB, M_UDRIEx); + } + + int MarlinSerial::peek(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return h == t ? -1 : rx_buffer.buffer[t]; + } + + int MarlinSerial::read(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(); + + // Read the tail. Main thread owns it, so it is safe to directly read it + ring_buffer_pos_t t = rx_buffer.tail; + + // If nothing to read, return now + if (h == t) return -1; + + // Get the next char + const int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); + + // Advance tail - Making sure the RX ISR will always get an stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(t); + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + if (rx_count < (RX_BUFFER_SIZE) / 10) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable them + SBI(M_UCSRxB, M_UDRIEx); + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = XON_CHAR; + #endif + } + } + #endif + + return v; + } + + ring_buffer_pos_t MarlinSerial::available(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); + } + + void MarlinSerial::flush(void) { + + // Set the tail to the head: + // - Read the RX head index in a safe way. (See atomic_read_rx_head.) + // - Set the tail, making sure the RX ISR will always get a stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(atomic_read_rx_head()); + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable it. + SBI(M_UCSRxB, M_UDRIEx); + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = XON_CHAR; + #endif + } + #endif + } + + #if TX_BUFFER_SIZE > 0 + void MarlinSerial::write(const uint8_t c) { + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX ISR, but it is properly handled there + if (!TEST(M_UCSRxB, M_UDRIEx) && TEST(M_UCSRxA, M_UDREx)) { + M_UDRx = c; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + + // If we can transmit another byte, do it. + if (TEST(M_UCSRxA, M_UDREx)) _tx_udr_empty_irq(); + + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) { sw_barrier(); } + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX ISR - Non atomic, but it will eventually enable TX ISR + SBI(M_UCSRxB, M_UDRIEx); + } + + void MarlinSerial::flushTX(void) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !TEST(M_UCSRxA, M_TXCx)) { + + // If there is more space, send an extra character + if (TEST(M_UCSRxA, M_UDREx)) + _tx_udr_empty_irq(); + + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !TEST(M_UCSRxA, M_TXCx)) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + + #else // TX_BUFFER_SIZE == 0 + + void MarlinSerial::write(const uint8_t c) { + _written = true; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = c; + } + + void MarlinSerial::flushTX(void) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!TEST(M_UCSRxA, M_TXCx)) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + #endif // TX_BUFFER_SIZE == 0 + + /** + * Imports from print.h + */ + + void MarlinSerial::print(char c, int base) { + print((long)c, base); + } + + void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); + } + + void MarlinSerial::print(int n, int base) { + print((long)n, base); + } + + void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); + } + + void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); + } + + void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); + } + + void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); + } + + void MarlinSerial::println(void) { + print('\r'); + print('\n'); + } + + void MarlinSerial::println(const String& s) { + print(s); + println(); + } + + void MarlinSerial::println(const char c[]) { + print(c); + println(); + } + + void MarlinSerial::println(char c, int base) { + print(c, base); + println(); + } + + void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); + } + + void MarlinSerial::println(int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); + } + + // Private Methods + + void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); + } + + void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) + rounding *= 0.1; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } + } + + // Preinstantiate + MarlinSerial customizedSerial; + +#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) + +// For AT90USB targets use the UART for BT interfacing +#if defined(USBCON) && ENABLED(BLUETOOTH) + HardwareSerial bluetoothSerial; +#endif + +#endif // __AVR__ diff --git a/Marlin/MarlinSerial.h b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h similarity index 81% rename from Marlin/MarlinSerial.h rename to Marlin/src/HAL/HAL_AVR/MarlinSerial.h index 9060f668ad..8c2b3f3186 100644 --- a/Marlin/MarlinSerial.h +++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h @@ -26,12 +26,15 @@ * * Modified 28 September 2010 by Mark Sproul * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) */ -#ifndef MARLINSERIAL_H -#define MARLINSERIAL_H +#ifndef _MARLINSERIAL_H_ +#define _MARLINSERIAL_H_ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfigPre.h" + +#include #ifndef SERIAL_PORT #define SERIAL_PORT 0 @@ -59,6 +62,9 @@ #define M_TXCx SERIAL_REGNAME(TXC,SERIAL_PORT,) #define M_RXCIEx SERIAL_REGNAME(RXCIE,SERIAL_PORT,) #define M_UDREx SERIAL_REGNAME(UDRE,SERIAL_PORT,) +#define M_FEx SERIAL_REGNAME(FE,SERIAL_PORT,) +#define M_DORx SERIAL_REGNAME(DOR,SERIAL_PORT,) +#define M_UPEx SERIAL_REGNAME(UPE,SERIAL_PORT,) #define M_UDRIEx SERIAL_REGNAME(UDRIE,SERIAL_PORT,) #define M_UDRx SERIAL_REGNAME(UDR,SERIAL_PORT,) #define M_UBRRxH SERIAL_REGNAME(UBRR,SERIAL_PORT,H) @@ -74,19 +80,10 @@ #define BIN 2 #define BYTE 0 -// Define constants and variables for buffering serial data. -// Use only 0 or powers of 2 greater than 1 -// : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] -#ifndef RX_BUFFER_SIZE - #define RX_BUFFER_SIZE 128 -#endif -// 256 is the max TX buffer limit due to uint8_t head and tail. -#ifndef TX_BUFFER_SIZE - #define TX_BUFFER_SIZE 32 -#endif - -#if !(defined(__AVR__) && defined(USBCON)) - +#ifndef USBCON + // We're using a ring buffer (I think), in which rx_buffer_head is the index of the + // location to which to write the next incoming character and rx_buffer_tail is the + // index of the location from which to read. #if RX_BUFFER_SIZE > 256 typedef uint16_t ring_buffer_pos_t; #else @@ -97,11 +94,19 @@ extern uint8_t rx_dropped_bytes; #endif + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + extern uint8_t rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + extern uint8_t rx_framing_errors; + #endif + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) extern ring_buffer_pos_t rx_max_enqueued; #endif - class MarlinSerial { //: public Stream + class MarlinSerial { public: MarlinSerial() {}; @@ -111,27 +116,25 @@ static int read(void); static void flush(void); static ring_buffer_pos_t available(void); - static void checkRx(void); static void write(const uint8_t c); - #if TX_BUFFER_SIZE > 0 - static uint8_t availableForWrite(void); - static void flushTX(void); - #endif - static void writeNoHandshake(const uint8_t c); + static void flushTX(void); #if ENABLED(SERIAL_STATS_DROPPED_RX) FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } #endif + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } + #endif + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } #endif - private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); - - public: FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } @@ -155,15 +158,20 @@ static void println(unsigned long, int = DEC); static void println(double, int = 2); static void println(void); + operator bool() { return true; } + + private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); }; extern MarlinSerial customizedSerial; -#endif // !(__AVR__ && USBCON) +#endif // !USBCON // Use the UART for Bluetooth in AT90USB configurations -#if defined(__AVR__) && defined(USBCON) && ENABLED(BLUETOOTH) +#if defined(USBCON) && ENABLED(BLUETOOTH) extern HardwareSerial bluetoothSerial; #endif -#endif // MARLINSERIAL_H +#endif // _MARLINSERIAL_H_ diff --git a/Marlin/src/HAL/HAL_AVR/SanityCheck.h b/Marlin/src/HAL/HAL_AVR/SanityCheck.h new file mode 100644 index 0000000000..f2907205d7 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/SanityCheck.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _SANITYCHECK_AVR_8_BIT_H_ +#define _SANITYCHECK_AVR_8_BIT_H_ + +/** + * Test AVR specific configuration values for errors at compile-time. + */ + +/** + * Digipot requirement + */ + #if ENABLED(DIGIPOT_MCP4018) + #if !defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) \ + || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1) + #error "DIGIPOT_MCP4018 requires DIGIPOTS_I2C_SDA_* pins to be defined." + #endif +#endif + +/** + * Sanity checks for Spindle / Laser + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !(WITHIN(SPINDLE_LASER_PWM_PIN, 2, 13) || WITHIN(SPINDLE_LASER_PWM_PIN, 44, 46)) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) + #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." + #elif PIN_EXISTS(X_MAX) && X_MAX_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin is in use by X_MAX endstop." + #elif PIN_EXISTS(X_MIN) && X_MIN_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin is in use by X_MIN endstop." + #elif PIN_EXISTS(Z_STEP) && Z_STEP_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin in use by Z_STEP." + #elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) + #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_XY) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_XY_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_XY." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_Z_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_Z." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_E) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_E_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_E." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +/** + * TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) + */ +#if ENABLED(HAVE_TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ + defined(X_HARDWARE_SERIAL ) \ + || defined(X2_HARDWARE_SERIAL) \ + || defined(Y_HARDWARE_SERIAL ) \ + || defined(Y2_HARDWARE_SERIAL) \ + || defined(Z_HARDWARE_SERIAL ) \ + || defined(Z2_HARDWARE_SERIAL) \ + || defined(E0_HARDWARE_SERIAL) \ + || defined(E1_HARDWARE_SERIAL) \ + || defined(E2_HARDWARE_SERIAL) \ + || defined(E3_HARDWARE_SERIAL) \ + || defined(E4_HARDWARE_SERIAL) ) + #error "Select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." +#endif + +#endif // _SANITYCHECK_AVR_8_BIT_H_ diff --git a/Marlin/src/HAL/HAL_AVR/ServoTimers.h b/Marlin/src/HAL/HAL_AVR/ServoTimers.h new file mode 100644 index 0000000000..4af997f1ef --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/ServoTimers.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * ServoTimers.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _SERVOTIMERS_H_ +#define _SERVOTIMERS_H_ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +/** + * AVR Only definitions + * -------------------- + */ + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define PRESCALER 8 // timer prescaler + +// Say which 16 bit timers can be used and in what order +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + //#define _useTimer1 + #define _useTimer3 + #define _useTimer4 + #if !HAS_MOTOR_CURRENT_PWM + #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #endif +#elif defined(__AVR_ATmega32U4__) + #define _useTimer3 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) + #define _useTimer3 +#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__) + #define _useTimer3 +#else + // everything else +#endif + +typedef enum { + #if ENABLED(_useTimer1) + _timer1, + #endif + #if ENABLED(_useTimer3) + _timer3, + #endif + #if ENABLED(_useTimer4) + _timer4, + #endif + #if ENABLED(_useTimer5) + _timer5, + #endif + _Nbr_16timers +} timer16_Sequence_t; + +#endif // _SERVOTIMERS_H_ diff --git a/Marlin/endstop_interrupts.h b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h similarity index 87% rename from Marlin/endstop_interrupts.h rename to Marlin/src/HAL/HAL_AVR/endstop_interrupts.h index 6ad4fa55a4..609fed98b8 100644 --- a/Marlin/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h @@ -24,7 +24,7 @@ * Endstop Interrupts * * Without endstop interrupts the endstop pins must be polled continually in - * the stepper-ISR via endstops.update(), most of the time finding no change. + * the temperature-ISR via endstops.update(), most of the time finding no change. * With this feature endstops.update() is called only when we know that at * least one endstop has changed state, saving valuable CPU cycles. * @@ -38,7 +38,12 @@ #ifndef _ENDSTOP_INTERRUPTS_H_ #define _ENDSTOP_INTERRUPTS_H_ -#include "macros.h" +#include "../../core/macros.h" +#include +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } /** * Patch for pins_arduino.h (...\Arduino\hardware\arduino\avr\variants\mega\pins_arduino.h) @@ -72,46 +77,36 @@ 0 ) #endif -volatile uint8_t e_hit = 0; // Different from 0 when the endstops should be tested in detail. - // Must be reset to 0 by the test function when finished. // Install Pin change interrupt for a pin. Can be called multiple times. -void pciSetup(byte pin) { +void pciSetup(const int8_t pin) { SBI(*digitalPinToPCMSK(pin), digitalPinToPCMSKbit(pin)); // enable pin SBI(PCIFR, digitalPinToPCICRbit(pin)); // clear any outstanding interrupt SBI(PCICR, digitalPinToPCICRbit(pin)); // enable interrupt for the group } -// This is what is really done inside the interrupts. -FORCE_INLINE void endstop_ISR_worker( void ) { - e_hit = 2; // Because the detection of a e-stop hit has a 1 step debouncer it has to be called at least twice. -} - -// Use one Routine to handle each group -// One ISR for all EXT-Interrupts -void endstop_ISR(void) { endstop_ISR_worker(); } // Handlers for pin change interrupts #ifdef PCINT0_vect - ISR(PCINT0_vect) { endstop_ISR_worker(); } + ISR(PCINT0_vect) { endstop_ISR(); } #endif #ifdef PCINT1_vect - ISR(PCINT1_vect) { endstop_ISR_worker(); } + ISR(PCINT1_vect) { endstop_ISR(); } #endif #ifdef PCINT2_vect - ISR(PCINT2_vect) { endstop_ISR_worker(); } + ISR(PCINT2_vect) { endstop_ISR(); } #endif #ifdef PCINT3_vect - ISR(PCINT3_vect) { endstop_ISR_worker(); } + ISR(PCINT3_vect) { endstop_ISR(); } #endif void setup_endstop_interrupts( void ) { #if HAS_X_MAX - #if digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT // if pin has an external interrupt + #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) // if pin has an external interrupt attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -121,7 +116,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_X_MIN - #if digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -131,7 +126,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Y_MAX - #if digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -141,7 +136,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Y_MIN - #if digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -151,7 +146,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Z_MAX - #if digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -161,7 +156,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Z_MIN - #if digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -211,7 +206,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Z2_MAX - #if digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -221,7 +216,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Z2_MIN - #if digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! @@ -231,7 +226,7 @@ void setup_endstop_interrupts( void ) { #endif #if HAS_Z_MIN_PROBE_PIN - #if digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT + #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); #else // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! diff --git a/Marlin/fastio_1280.h b/Marlin/src/HAL/HAL_AVR/fastio_1280.h similarity index 99% rename from Marlin/fastio_1280.h rename to Marlin/src/HAL/HAL_AVR/fastio_1280.h index b95ddffbad..31c5b5edc6 100644 --- a/Marlin/fastio_1280.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_1280.h @@ -27,10 +27,10 @@ * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5 H0 H1 H2 H3 H4 H5 H6 H7 J0 J1 J2 J3 J4 J5 J6 J7 K0 K1 K2 K3 K4 K5 K6 K7 L0 L1 L2 L3 L4 L5 L6 L7 */ -#ifndef _FASTIO_1280 -#define _FASTIO_1280 +#ifndef _FASTIO_1280_H_ +#define _FASTIO_1280_H_ -#include "fastio.h" +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO21 @@ -1111,4 +1111,4 @@ #define PL7_DDR DDRL #define PL7_PWM NULL -#endif // _FASTIO_1280 +#endif // _FASTIO_1280_H_ diff --git a/Marlin/fastio_1281.h b/Marlin/src/HAL/HAL_AVR/fastio_1281.h similarity index 99% rename from Marlin/fastio_1281.h rename to Marlin/src/HAL/HAL_AVR/fastio_1281.h index ab90a5ff9b..94ab6b7553 100644 --- a/Marlin/fastio_1281.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_1281.h @@ -27,10 +27,10 @@ * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5 */ -#ifndef _FASTIO_1281 -#define _FASTIO_1281 +#ifndef _FASTIO_1281_H_ +#define _FASTIO_1281_H_ -#include "fastio.h" +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO46 @@ -716,4 +716,4 @@ #define PG5_DDR DDRG #define PG5_PWM &OCR0B -#endif // _FASTIO_1281 +#endif // _FASTIO_1281_H_ diff --git a/Marlin/fastio_168.h b/Marlin/src/HAL/HAL_AVR/fastio_168.h similarity index 98% rename from Marlin/fastio_168.h rename to Marlin/src/HAL/HAL_AVR/fastio_168.h index e624654287..33492d15dc 100644 --- a/Marlin/fastio_168.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_168.h @@ -27,10 +27,10 @@ * Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 */ -#ifndef _FASTIO_168 -#define _FASTIO_168 +#ifndef _FASTIO_168_H_ +#define _FASTIO_168_H_ -#include "fastio.h" +#include "fastio_AVR.h" #define DEBUG_LED AIO5 @@ -358,4 +358,4 @@ #define PD7_DDR DDRD #define PD7_PWM NULL -#endif // _FASTIO_168 +#endif // _FASTIO_168_H_ diff --git a/Marlin/fastio_644.h b/Marlin/src/HAL/HAL_AVR/fastio_644.h similarity index 98% rename from Marlin/fastio_644.h rename to Marlin/src/HAL/HAL_AVR/fastio_644.h index 6a6e977f9e..171172023b 100644 --- a/Marlin/fastio_644.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_644.h @@ -27,7 +27,7 @@ * Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0 */ -/** ATMega644 +/** ATMega644 * * +---\/---+ * (D 0) PB0 1| |40 PA0 (AI 0 / D31) @@ -53,10 +53,10 @@ * +--------+ */ -#ifndef _FASTIO_644 -#define _FASTIO_644 +#ifndef _FASTIO_644_H_ +#define _FASTIO_644_H_ -#include "fastio.h" +#include "fastio_AVR.h" #define DEBUG_LED DIO0 @@ -553,4 +553,4 @@ #define PD7_DDR DDRD #define PD7_PWM OCR2A -#endif // _FASTIO_644 +#endif // _FASTIO_644_H_ diff --git a/Marlin/fastio_AT90USB.h b/Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h similarity index 99% rename from Marlin/fastio_AT90USB.h rename to Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h index aee9ddcddb..6043292960 100644 --- a/Marlin/fastio_AT90USB.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h @@ -28,10 +28,10 @@ * The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3 */ -#ifndef _FASTIO_AT90USB -#define _FASTIO_AT90USB +#ifndef _FASTIO_AT90USB_H_ +#define _FASTIO_AT90USB_H_ -#include "fastio.h" +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO31 /* led D5 red */ @@ -698,4 +698,4 @@ #define TIMER3B 4 #define TIMER3C 3 -#endif // _FASTIO_AT90USB +#endif // _FASTIO_AT90USB_H_ diff --git a/Marlin/fastio.h b/Marlin/src/HAL/HAL_AVR/fastio_AVR.h similarity index 99% rename from Marlin/fastio.h rename to Marlin/src/HAL/HAL_AVR/fastio_AVR.h index 03a3a90366..a4e3c5d74d 100644 --- a/Marlin/fastio.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_AVR.h @@ -26,13 +26,11 @@ * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. */ -#include - -typedef int8_t pin_t; #ifndef _FASTIO_ARDUINO_H_ #define _FASTIO_ARDUINO_H_ #include +#include "../../core/macros.h" #define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)) #define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)) @@ -57,8 +55,6 @@ typedef int8_t pin_t; #error "No FastIO definition for the selected AVR Board." #endif -#include "macros.h" - /** * Magic I/O routines * diff --git a/Marlin/src/HAL/HAL_AVR/math_AVR.h b/Marlin/src/HAL/HAL_AVR/math_AVR.h new file mode 100644 index 0000000000..6348ed8bbf --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/math_AVR.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _MATH_AVR_H_ +#define _MATH_AVR_H_ + +/** + * Optimized math functions for AVR + */ + +// intRes = longIn1 * longIn2 >> 24 +// uses: +// A[tmp] to store 0 +// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. +// note that the lower two bytes and the upper byte of the 48bit result are not calculated. +// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. +// B A are bits 24-39 and are the returned value +// C B A is longIn1 +// D C B A is longIn2 +// +static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) { + register uint8_t tmp1; + register uint8_t tmp2; + register uint16_t intRes; + __asm__ __volatile__( + A("clr %[tmp1]") + A("mul %A[longIn1], %B[longIn2]") + A("mov %[tmp2], r1") + A("mul %B[longIn1], %C[longIn2]") + A("movw %A[intRes], r0") + A("mul %C[longIn1], %C[longIn2]") + A("add %B[intRes], r0") + A("mul %C[longIn1], %B[longIn2]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %A[longIn1], %C[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %B[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %C[longIn1], %A[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %A[longIn2]") + A("add %[tmp2], r1") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("lsr %[tmp2]") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("mul %D[longIn2], %A[longIn1]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %D[longIn2], %B[longIn1]") + A("add %B[intRes], r0") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp1] "=&r" (tmp1), + [tmp2] "=&r" (tmp2) + : [longIn1] "d" (longIn1), + [longIn2] "d" (longIn2) + : "cc" + ); + return intRes; +} + +// intRes = intIn1 * intIn2 >> 16 +// uses: +// r26 to store 0 +// r27 to store the byte 1 of the 24 bit result +static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) { + register uint8_t tmp; + register uint16_t intRes; + __asm__ __volatile__ ( + A("clr %[tmp]") + A("mul %[charIn1], %B[intIn2]") + A("movw %A[intRes], r0") + A("mul %[charIn1], %A[intIn2]") + A("add %A[intRes], r1") + A("adc %B[intRes], %[tmp]") + A("lsr r0") + A("adc %A[intRes], %[tmp]") + A("adc %B[intRes], %[tmp]") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp] "=&r" (tmp) + : [charIn1] "d" (charIn1), + [intIn2] "d" (intIn2) + : "cc" + ); + return intRes; +} + +#endif // _MATH_AVR_H_ diff --git a/Marlin/src/HAL/HAL_AVR/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_AVR/persistent_store_impl.cpp new file mode 100644 index 0000000000..9d5ddd1bd7 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/persistent_store_impl.cpp @@ -0,0 +1,56 @@ +#ifdef __AVR__ + +#include "../persistent_store_api.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +namespace HAL { +namespace PersistentStore { + +bool access_start() { + return true; +} + +bool access_finish(){ + return true; +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; // always assume success for AVR's +} + +} +} + +#endif // EEPROM_SETTINGS +#endif // __AVR__ diff --git a/Marlin/pinsDebug.h b/Marlin/src/HAL/HAL_AVR/pinsDebug.h similarity index 55% rename from Marlin/pinsDebug.h rename to Marlin/src/HAL/HAL_AVR/pinsDebug.h index 24d058b4f2..ea35f881e5 100644 --- a/Marlin/pinsDebug.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug.h @@ -20,95 +20,16 @@ * */ -bool endstop_monitor_flag = false; - -#define NAME_FORMAT "%-35s" // one place to specify the format of all the sources of names - // "-" left justify, "28" minimum width of name, pad with blanks - -#if AVR_ATmega1284_FAMILY - #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) - #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) -#else - #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) - #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) -#endif - /** - * This routine minimizes RAM usage by creating a FLASH resident array to - * store the pin names, pin numbers and analog/digital flag. - * - * Creating the array in FLASH is a two pass process. The first pass puts the - * name strings into FLASH. The second pass actually creates the array. - * - * Both passes use the same pin list. The list contains two macro names. The - * actual macro definitions are changed depending on which pass is being done. - * + * PWM print routines for Atmel 8 bit AVR CPUs */ -// first pass - put the name strings into FLASH +#ifndef _PINSDEBUG_AVR_8_BIT_ +#define _PINSDEBUG_AVR_8_BIT_ -#define _ADD_PIN_2(PIN_NAME, ENTRY_NAME) static const char ENTRY_NAME[] PROGMEM = { PIN_NAME }; -#define _ADD_PIN(PIN_NAME, COUNTER) _ADD_PIN_2(PIN_NAME, entry_NAME_##COUNTER) -#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) -#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) +#include "../../inc/MarlinConfig.h" -#include "pinsDebug_list.h" -#line 51 - -// manually add pins that have names that are macros which don't play well with these macros -#if SERIAL_PORT == 0 && (AVR_ATmega2560_FAMILY || AVR_ATmega1284_FAMILY) - static const char RXD_NAME[] PROGMEM = { "RXD" }; - static const char TXD_NAME[] PROGMEM = { "TXD" }; -#endif - -///////////////////////////////////////////////////////////////////////////// - -// second pass - create the array - -#undef _ADD_PIN_2 -#undef _ADD_PIN -#undef REPORT_NAME_DIGITAL -#undef REPORT_NAME_ANALOG - -#define _ADD_PIN_2(ENTRY_NAME, NAME, IS_DIGITAL) { ENTRY_NAME, NAME, IS_DIGITAL }, -#define _ADD_PIN(NAME, COUNTER, IS_DIGITAL) _ADD_PIN_2(entry_NAME_##COUNTER, NAME, IS_DIGITAL) -#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(NAME, COUNTER, true) -#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(analogInputToDigitalPin(NAME), COUNTER, false) - -typedef struct { - const char * const name; - pin_t pin; - bool is_digital; -} PinInfo; - -const PinInfo pin_array[] PROGMEM = { - - /** - * [pin name] [pin number] [is digital or analog] 1 = digital, 0 = analog - * Each entry takes up 6 bytes in FLASH: - * 2 byte pointer to location of the name string - * 2 bytes containing the pin number - * analog pin numbers were convereted to digital when the array was created - * 2 bytes containing the digital/analog bool flag - */ - - // manually add pins ... - #if SERIAL_PORT == 0 - #if AVR_ATmega2560_FAMILY - { RXD_NAME, 0, true }, - { TXD_NAME, 1, true }, - #elif AVR_ATmega1284_FAMILY - { RXD_NAME, 8, true }, - { TXD_NAME, 9, true }, - #endif - #endif - - #include "pinsDebug_list.h" - #line 102 - -}; - -#define AVR_ATmega2560_FAMILY_PLUS_70 (MB(BQ_ZUM_MEGA_3D) || MB(MIGHTYBOARD_REVE) || MB(MINIRAMBO) || MB(SCOOVO_X9H)) +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS #if AVR_AT90USB1286_FAMILY // Working with Teensyduino extension so need to re-define some things @@ -118,20 +39,49 @@ const PinInfo pin_array[] PROGMEM = { #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) #define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p) - #define get_pinMode(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin)) + #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin)) #elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70 #include "pinsDebug_plus_70.h" #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p) #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p) #define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p) - bool get_pinMode(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + #else #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) #define digitalPinToPort_DEBUG(p) digitalPinToPort(p) - bool get_pinMode(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) #endif +#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) +#if AVR_ATmega1284_FAMILY + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) +#else + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) +#endif +#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) +#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin + +void PRINT_ARRAY_NAME(uint8_t x) { + char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); + for (uint8_t y = 0; y < MAX_NAME_LENGTH; y++) { + char temp_char = pgm_read_byte(name_mem_pointer + y); + if (temp_char != 0) + SERIAL_CHAR(temp_char); + else { + for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; i++) SERIAL_CHAR(' '); + break; + } + } +} + +#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital) + + #if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog @@ -145,6 +95,8 @@ const PinInfo pin_array[] PROGMEM = { return true; \ } else return false + + /** * Print a pin's PWM status. * Return true if it's currently a PWM pin. @@ -275,10 +227,7 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { static void err_is_counter() { SERIAL_PROTOCOLPGM(" non-standard PWM mode"); } static void err_is_interrupt() { SERIAL_PROTOCOLPGM(" compare interrupt enabled"); } static void err_prob_interrupt() { SERIAL_PROTOCOLPGM(" overflow interrupt enabled"); } - -#if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY - static void print_is_also_tied() { SERIAL_PROTOCOLPGM(" is also tied to this pin"); SERIAL_PROTOCOL_SP(14); } -#endif +static void print_is_also_tied() { SERIAL_PROTOCOLPGM(" is also tied to this pin"); SERIAL_PROTOCOL_SP(14); } void com_print(uint8_t N, uint8_t Z) { const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); @@ -412,6 +361,7 @@ static void pwm_details(uint8_t pin) { #endif } // pwm_details + #ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed const uint8_t port = digitalPinToPort_DEBUG(pin); @@ -419,168 +369,42 @@ static void pwm_details(uint8_t pin) { } #endif -void print_port(int8_t pin) { // print port number - #ifdef digitalPinToPort_DEBUG - uint8_t x; - SERIAL_PROTOCOLPGM(" Port: "); - #if AVR_AT90USB1286_FAMILY - x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; - #else - x = digitalPinToPort_DEBUG(pin) + 64; - #endif - SERIAL_CHAR(x); +#ifndef PRINT_PORT - #if AVR_AT90USB1286_FAMILY - if (pin == 46) - x = '2'; - else if (pin == 47) - x = '3'; - else { + void print_port(int8_t pin) { // print port number + #ifdef digitalPinToPort_DEBUG + uint8_t x; + SERIAL_PROTOCOLPGM(" Port: "); + #if AVR_AT90USB1286_FAMILY + x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; + #else + x = digitalPinToPort_DEBUG(pin) + 64; + #endif + SERIAL_CHAR(x); + + #if AVR_AT90USB1286_FAMILY + if (pin == 46) + x = '2'; + else if (pin == 47) + x = '3'; + else { + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; + } + #else uint8_t temp = digitalPinToBitMask_DEBUG(pin); for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - } - #else - uint8_t temp = digitalPinToBitMask_DEBUG(pin); - for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - #endif - SERIAL_CHAR(x); - #else - SERIAL_PROTOCOL_SP(10); - #endif -} - -static void print_input_or_output(const bool isout) { - serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); -} - -// pretty report with PWM info -inline void report_pin_state_extended(int8_t pin, bool ignore, bool extended = false, const char *start_string = "") { - uint8_t temp_char; - char *name_mem_pointer, buffer[30]; // for the sprintf statements - bool found = false, multi_name_pin = false; - for (uint8_t x = 0; x < COUNT(pin_array); x++) { // scan entire array and report all instances of this pin - if (pgm_read_byte(&pin_array[x].pin) == pin) { - if (found) multi_name_pin = true; - found = true; - if (!multi_name_pin) { // report digitial and analog pin number only on the first time through - sprintf_P(buffer, PSTR("%sPIN: %3d "), start_string, pin); // digital pin number - SERIAL_ECHO(buffer); - print_port(pin); - if (IS_ANALOG(pin)) { - sprintf_P(buffer, PSTR(" (A%2d) "), int(pin - analogInputToDigitalPin(0))); // analog pin number - SERIAL_ECHO(buffer); - } - else SERIAL_ECHO_SP(8); // add padding if not an analog pin - } - else { - SERIAL_CHAR('.'); - SERIAL_ECHO_SP(26 + strlen(start_string)); // add padding if not the first instance found - } - name_mem_pointer = (char*)pgm_read_word(&pin_array[x].name); - for (uint8_t y = 0; y < 28; y++) { // always print pin name - temp_char = pgm_read_byte(name_mem_pointer + y); - if (temp_char != 0) - SERIAL_CHAR(temp_char); - else { - for (uint8_t i = 0; i < 28 - y; i++) SERIAL_CHAR(' '); - break; - } - } - if (extended) { - if (pin_is_protected(pin) && !ignore) - SERIAL_ECHOPGM("protected "); - else { - #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO - if (pin == 46 || pin == 47) { - if (pin == 46) { - print_input_or_output(GET_OUTPUT(46)); - SERIAL_PROTOCOL(READ(46)); - } - else if (pin == 47) { - print_input_or_output(GET_OUTPUT(47)); - SERIAL_PROTOCOL(READ(47)); - } - } - else - #endif - { - if (!(pgm_read_byte(&pin_array[x].is_digital))) { - sprintf_P(buffer, PSTR("Analog in = %5d"), analogRead(pin - analogInputToDigitalPin(0))); - SERIAL_ECHO(buffer); - } - else { - - if (!get_pinMode(pin)) { - //pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this - // because this could interfere with inductive/capacitive - // sensors (high impedance voltage divider) and with PT100 amplifier - print_input_or_output(false); - SERIAL_PROTOCOL(digitalRead_mod(pin)); - } - else if (pwm_status(pin)) { - // do nothing - } - else { - print_input_or_output(true); - SERIAL_PROTOCOL(digitalRead_mod(pin)); - } - } - if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report - } - } - } - SERIAL_EOL(); - } // end of IF - } // end of for loop - - if (!found) { - sprintf_P(buffer, PSTR("%sPIN: %3d "), start_string, pin); - SERIAL_ECHO(buffer); - print_port(pin); - if (IS_ANALOG(pin)) { - sprintf_P(buffer, PSTR(" (A%2d) "), int(pin - analogInputToDigitalPin(0))); // analog pin number - SERIAL_ECHO(buffer); - } - else - SERIAL_ECHO_SP(8); // add padding if not an analog pin - SERIAL_ECHOPGM(""); - if (extended) { - #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO - if (pin == 46 || pin == 47) { - SERIAL_PROTOCOL_SP(12); - if (pin == 46) { - print_input_or_output(GET_OUTPUT(46)); - SERIAL_PROTOCOL(READ(46)); - } - else { - print_input_or_output(GET_OUTPUT(47)); - SERIAL_PROTOCOL(READ(47)); - } - } - else #endif - { - if (get_pinMode(pin)) { - SERIAL_PROTOCOL_SP(12); - print_input_or_output(true); - SERIAL_PROTOCOL(digitalRead_mod(pin)); - } - else { - if (IS_ANALOG(pin)) { - sprintf_P(buffer, PSTR(" Analog in = %5d"), analogRead(pin - analogInputToDigitalPin(0))); - SERIAL_ECHO(buffer); - SERIAL_ECHOPGM(" "); - } - else - SERIAL_ECHO_SP(12); // add padding if not an analog pin - - print_input_or_output(false); - SERIAL_PROTOCOL(digitalRead_mod(pin)); - } - //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin - if (extended) pwm_details(pin); // report PWM capabilities only if doing an extended report - } - } - SERIAL_EOL(); + SERIAL_CHAR(x); + #else + SERIAL_PROTOCOL_SP(10); + #endif } -} + + #define PRINT_PORT(p) print_port(p) + +#endif + +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer);} while (0) + +#endif // _PINSDEBUG_AVR_8_BIT_ diff --git a/Marlin/pinsDebug_Teensyduino.h b/Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h similarity index 79% rename from Marlin/pinsDebug_Teensyduino.h rename to Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h index 3e08bbbc66..840e2a22e9 100644 --- a/Marlin/pinsDebug_Teensyduino.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h @@ -20,21 +20,29 @@ * */ +#ifndef _PINSDEBUG_TEENSYSUINO_H_ +#define _PINSDEBUG_TEENSYSUINO_H_ + // // some of the pin mapping functions of the Teensduino extension to the Arduino IDE // do not function the same as the other Arduino extensions // -#ifndef __PINSDEBUG_TEENSYDUINO_H__ -#define __PINSDEBUG_TEENSYDUINO_H__ -#undef NUM_DIGITAL_PINS -#define NUM_DIGITAL_PINS 48 // Teensy says 46 but FASTIO is 48 +#define TEENSYDUINO_IDE -// "digitalPinToPort" function just returns the pin number so need to create our own. -// Can't use the name "digitalPinToPort" for our own because it interferes with the -// FAST_PWM_FAN function if we do +//digitalPinToTimer(pin) function works like Arduino but Timers are not defined +#define TIMER0B 1 +#define TIMER1A 7 +#define TIMER1B 8 +#define TIMER1C 9 +#define TIMER2A 6 +#define TIMER2B 2 +#define TIMER3A 5 +#define TIMER3B 4 +#define TIMER3C 3 +// digitalPinToPort function just returns the pin number so need to create our own #define PA 1 #define PB 2 #define PC 3 @@ -42,7 +50,9 @@ #define PE 5 #define PF 6 -const uint8_t PROGMEM digital_pin_to_port_PGM_Teensy[] = { +#undef digitalPinToPort + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, // 0 - PD0 - INT0 - PWM PD, // 1 - PD1 - INT1 - PWM PD, // 2 - PD2 - INT2 - RX @@ -93,7 +103,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_Teensy[] = { PE, // 47 - PE3 (not defined in teensyduino) }; -#define digitalPinToPort_Teensy(P) ( pgm_read_byte( digital_pin_to_port_PGM_Teensy + (P) ) ) +#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) // digitalPinToBitMask(pin) is OK @@ -102,4 +112,4 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_Teensy[] = { // portModeRegister(pin) is OK -#endif // __PINSDEBUG_TEENSYDUINO_H__ +#endif // _PINSDEBUG_TEENSYSUINO_H_ diff --git a/Marlin/pinsDebug_plus_70.h b/Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h similarity index 98% rename from Marlin/pinsDebug_plus_70.h rename to Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h index c18c595ec9..5a0f840140 100644 --- a/Marlin/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h @@ -22,11 +22,11 @@ */ /** - * structurs for 2560 family boards that use morre than 70 pins + * Structures for 2560 family boards that use more than 70 pins */ -#ifndef __PINSDEBUG_PLUS_70_H__ -#define __PINSDEBUG_PLUS_70_H__ +#ifndef _PINSDEBUG_PLUS_70_H_ +#define _PINSDEBUG_PLUS_70_H_ #undef NUM_DIGITAL_PINS #if MB(BQ_ZUM_MEGA_3D) @@ -338,4 +338,4 @@ const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { */ -#endif // __PINSDEBUG_PLUS_70_H__ +#endif // _PINSDEBUG_PLUS_70_H_ diff --git a/Marlin/servo.cpp b/Marlin/src/HAL/HAL_AVR/servo_AVR.cpp similarity index 59% rename from Marlin/servo.cpp rename to Marlin/src/HAL/HAL_AVR/servo_AVR.cpp index 7a1c2b8c60..c02dd4c203 100644 --- a/Marlin/servo.cpp +++ b/Marlin/src/HAL/HAL_AVR/servo_AVR.cpp @@ -42,45 +42,29 @@ * * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) * writeMicroseconds() - Set the servo pulse width in microseconds. - * move(pin, angle) - Sequence of attach(pin), write(angle), delay(SERVO_DELAY). - * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after SERVO_DELAY. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. * read() - Get the last-written servo pulse width as an angle between 0 and 180. * readMicroseconds() - Get the last-written servo pulse width in microseconds. * attached() - Return true if a servo is attached. * detach() - Stop an attached servo from pulsing its i/o pin. * */ -#include "MarlinConfig.h" + +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" #if HAS_SERVOS #include #include -#include "servo.h" -#include "utility.h" +#include "../servo.h" +#include "../servo_private.h" -#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / 8) // converts microseconds to tick (assumes prescale of 8) // 12 Aug 2009 -#define ticksToUs(_ticks) (( (unsigned)_ticks * 8)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) -#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays // 12 August 2009 - -//#define NBR_TIMERS ((MAX_SERVOS) / (SERVOS_PER_TIMER)) - -static ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures -static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) - -uint8_t ServoCount = 0; // the total number of attached servos - - -// convenience macros -#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / (SERVOS_PER_TIMER))) // returns the timer controlling this servo -#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % (SERVOS_PER_TIMER)) // returns the index of the servo on this timer -#define SERVO_INDEX(_timer,_channel) ((_timer*(SERVOS_PER_TIMER)) + _channel) // macro to access servo index by timer and channel -#define SERVO(_timer,_channel) (servo_info[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel - -#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo -#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo /************ static functions common to all instances ***********************/ @@ -112,19 +96,19 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t // Interrupt handlers for Arduino #if ENABLED(_useTimer1) - SIGNAL (TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } + SIGNAL(TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } #endif #if ENABLED(_useTimer3) - SIGNAL (TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } + SIGNAL(TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } #endif #if ENABLED(_useTimer4) - SIGNAL (TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } + SIGNAL(TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } #endif #if ENABLED(_useTimer5) - SIGNAL (TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } + SIGNAL(TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } #endif #else // WIRING @@ -139,8 +123,9 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t #endif // WIRING +/****************** end of static functions ******************************/ -static void initISR(timer16_Sequence_t timer) { +void initISR(timer16_Sequence_t timer) { #if ENABLED(_useTimer1) if (timer == _timer1) { TCCR1A = 0; // normal counting mode @@ -199,7 +184,7 @@ static void initISR(timer16_Sequence_t timer) { #endif } -static void finISR(timer16_Sequence_t timer) { +void finISR(timer16_Sequence_t timer) { // Disable use of the given timer #ifdef WIRING if (timer == _timer1) { @@ -228,95 +213,6 @@ static void finISR(timer16_Sequence_t timer) { #endif } -static bool isTimerActive(timer16_Sequence_t timer) { - // returns true if any servo is active on this timer - for (uint8_t channel = 0; channel < SERVOS_PER_TIMER; channel++) { - if (SERVO(timer, channel).Pin.isActive) - return true; - } - return false; -} - -/****************** end of static functions ******************************/ - -Servo::Servo() { - if (ServoCount < MAX_SERVOS) { - this->servoIndex = ServoCount++; // assign a servo index to this instance - servo_info[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 - } - else - this->servoIndex = INVALID_SERVO; // too many servos -} - -int8_t Servo::attach(const int pin) { - return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); -} - -int8_t Servo::attach(const int pin, const int min, const int max) { - - if (this->servoIndex >= MAX_SERVOS) return -1; - - if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin; - pinMode(servo_info[this->servoIndex].Pin.nbr, OUTPUT); // set servo pin to output - - // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 - this->min = (MIN_PULSE_WIDTH - min) / 4; //resolution of min/max is 4 uS - this->max = (MAX_PULSE_WIDTH - max) / 4; - - // initialize the timer if it has not already been initialized - timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); - if (!isTimerActive(timer)) initISR(timer); - servo_info[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive - - return this->servoIndex; -} - -void Servo::detach() { - servo_info[this->servoIndex].Pin.isActive = false; - timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); - if (!isTimerActive(timer)) finISR(timer); -} - -void Servo::write(int value) { - if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) - value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); - } - this->writeMicroseconds(value); -} - -void Servo::writeMicroseconds(int value) { - // calculate and store the values for the given channel - byte channel = this->servoIndex; - if (channel < MAX_SERVOS) { // ensure channel is valid - // ensure pulse width is valid - value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); - value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 - - CRITICAL_SECTION_START; - servo_info[channel].ticks = value; - CRITICAL_SECTION_END; - } -} - -// return the value as degrees -int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); } - -int Servo::readMicroseconds() { - return (this->servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[this->servoIndex].ticks) + TRIM_DURATION; -} - -bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } - -void Servo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (this->attach(0) >= 0) { - this->write(value); - safe_delay(servo_delay[this->servoIndex]); - #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) - this->detach(); - #endif - } -} - #endif // HAS_SERVOS + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/spi_pins.h b/Marlin/src/HAL/HAL_AVR/spi_pins.h new file mode 100644 index 0000000000..d4838956e7 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/spi_pins.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _SPI_PINS_H_ +#define _SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + */ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) + #define AVR_SCK_PIN 13 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 10 +#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) + #define AVR_SCK_PIN 7 + #define AVR_MISO_PIN 6 + #define AVR_MOSI_PIN 5 + #define AVR_SS_PIN 4 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define AVR_SCK_PIN 52 + #define AVR_MISO_PIN 50 + #define AVR_MOSI_PIN 51 + #define AVR_SS_PIN 53 +#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) + #define AVR_SCK_PIN 21 + #define AVR_MISO_PIN 23 + #define AVR_MOSI_PIN 22 + #define AVR_SS_PIN 20 +#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + #define AVR_SCK_PIN 10 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 16 +#endif + +#ifndef SCK_PIN + #define SCK_PIN AVR_SCK_PIN +#endif +#ifndef MISO_PIN + #define MISO_PIN AVR_MISO_PIN +#endif +#ifndef MOSI_PIN + #define MOSI_PIN AVR_MOSI_PIN +#endif +#ifndef SS_PIN + #define SS_PIN AVR_SS_PIN +#endif + + +#endif // _SPI_PINS_H_ diff --git a/Marlin/watchdog.cpp b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp similarity index 95% rename from Marlin/watchdog.cpp rename to Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp index 135a050fff..6af106439a 100644 --- a/Marlin/watchdog.cpp +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp @@ -20,11 +20,15 @@ * */ -#include "Marlin.h" +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" #if ENABLED(USE_WATCHDOG) -#include "watchdog.h" +#include "watchdog_AVR.h" + +#include "../../Marlin.h" // Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. void watchdog_init() { @@ -66,3 +70,4 @@ void watchdog_init() { #endif // WATCHDOG_RESET_MANUAL #endif // USE_WATCHDOG +#endif // __AVR__ diff --git a/Marlin/watchdog.h b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h similarity index 93% rename from Marlin/watchdog.h rename to Marlin/src/HAL/HAL_AVR/watchdog_AVR.h index 2c04b58972..90c6185cb6 100644 --- a/Marlin/watchdog.h +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h @@ -20,10 +20,9 @@ * */ -#ifndef WATCHDOG_H -#define WATCHDOG_H +#ifndef _WATCHDOG_AVR_H_ +#define _WATCHDOG_AVR_H_ -#include "Marlin.h" #include // Initialize watchdog with a 4 second interrupt time @@ -33,4 +32,4 @@ void watchdog_init(); // first watchdog_init or AVR will go into emergency procedures. inline void watchdog_reset() { wdt_reset(); } -#endif +#endif // _WATCHDOG_AVR_H_ diff --git a/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp b/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp new file mode 100644 index 0000000000..51064f9ba2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp @@ -0,0 +1,342 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../core/macros.h" +#include "../../core/serial.h" +#include + +#include "../backtrace/unwinder.h" +#include "../backtrace/unwmemaccess.h" + +// Debug monitor that dumps to the Programming port all status when +// an exception or WDT timeout happens - And then resets the board + +// All the Monitor routines must run with interrupts disabled and +// under an ISR execution context. That is why we cannot reuse the +// Serial interrupt routines or any C runtime, as we don't know the +// state we are when running them + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); + +// (re)initialize UART0 as a monitor output to 250000,n,8,1 +static void TXBegin(void) { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( UART_IRQn ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( ID_UART ); + + // Configure PMC + pmc_enable_periph_clk( ID_UART ); + + // Disable PDC channel + UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds + UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); + + // Enable receiver and transmitter + UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; +} + +// Send character through UART with no interrupts +static void TX(char c) { + while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; + UART->UART_THR = c; +} + +// Send String through UART +static void TX(const char* s) { + while (*s) TX(*s++); +} + +static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); +} + +// Send Hex number thru UART +static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); +} + +// Send Decimal number thru UART +static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); +} + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int* p = (int*)ctx; + + (*p)++; + TX('#'); TXDec(*p); TX(" : "); + TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); + TX('+'); TXDec(bte->address - bte->function); + TX(" PC:");TXHex(bte->address); TX('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #if defined(UNW_DEBUG) + ,UnwPrintf + #endif +}; + +/** + * HardFaultHandler_C: + * This is called from the HardFault_HandlerAsm with a pointer the Fault stack + * as the parameter. We can then read the values from the stack and place them + * into local variables for ease of reading. + * We then read the various Fault Status and Address Registers to help decode + * cause of the fault. + * The function ends with a BKPT instruction to force control back into the debugger + */ +extern "C" +void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { + + static const char* causestr[] = { + "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" + }; + + UnwindFrame btf; + + // Dump report to the Programming port (interrupts are DISABLED) + TXBegin(); + TX("\n\n## Software Fault detected ##\n"); + TX("Cause: "); TX(causestr[cause]); TX('\n'); + + TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); + TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); + TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); + TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); + TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); + TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); + TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); + TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); + + // Hard Fault Status Register + TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); + + // Debug Fault Status Register + TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); + + // Auxiliary Fault Status Register + TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); + + // Bus Fault Address Register + TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); + + TX("ExcLR: "); TXHex(lr); TX('\n'); + TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); + + btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer + btf.fp = btf.sp; + btf.lr = ((unsigned long)sp[5]); + btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + TX("\nBacktrace:\n\n"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); + + // Disable all NVIC interrupts + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0xFFFFFFFF; + + // Relocate VTOR table to default position + SCB->VTOR = 0; + + // Disable USB + otg_disable(); + + // Restart watchdog + WDT_Restart(WDT); + + // Reset controller + NVIC_SystemReset(); + while(1) { WDT_Restart(WDT); } +} + +__attribute__((naked)) void NMI_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#0") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void HardFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#1") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void MemManage_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#2") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void BusFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#3") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void UsageFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#4") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void DebugMon_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#5") + A("b HardFault_HandlerC") + ); +} + +/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ +__attribute__((naked)) void WDT_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#6") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void RSTC_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#7") + A("b HardFault_HandlerC") + ); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp b/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp new file mode 100644 index 0000000000..4665565544 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp @@ -0,0 +1,1034 @@ + +/* EEPROM emulation over flash with reduced wear + * + * We will use 2 contiguous groups of pages as main and alternate. + * We want an structure that allows to read as fast as possible, + * without the need of scanning the whole FLASH memory. + * + * FLASH bits default erased state is 1, and can be set to 0 + * on a per bit basis. To reset them to 1, a full page erase + * is needed. + * + * Values are stored as differences that should be applied to a + * completely erased EEPROM (filled with 0xFFs). We just encode + * the starting address of the values to change, the length of + * the block of new values, and the values themselves. All diffs + * are accumulated into a RAM buffer, compacted into the least + * amount of non overlapping diffs possible and sorted by starting + * address before being saved into the next available page of FLASH + * of the current group. + * Once the current group is completely full, we compact it and save + * it into the other group, then erase the current group and switch + * to that new group and set it as current. + * + * The FLASH endurance is about 1/10 ... 1/100 of an EEPROM + * endurance, but EEPROM endurance is specified per byte, not + * per page. We can't emulate EE endurance with FLASH for all + * bytes, but we can emulate endurance for a given percent of + * bytes. + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../persistent_store_api.h" +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + +#include + +#define EEPROMSize 4096 +#define PagesPerGroup 128 +#define GroupCount 2 +#define PageSize 256 + + /* Flash storage */ +typedef struct FLASH_SECTOR { + uint8_t page[PageSize]; +} FLASH_SECTOR_T; + +#define PAGE_FILL \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + +#define FLASH_INIT_FILL \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL + +/* This is the FLASH area used to emulate a 2Kbyte EEPROM -- We need this buffer aligned + to a 256 byte boundary. */ +static const uint8_t flashStorage[PagesPerGroup * GroupCount * PageSize] __attribute__ ((aligned (PageSize))) = { FLASH_INIT_FILL }; + +/* Get the address of an specific page */ +static const FLASH_SECTOR_T* getFlashStorage(int page) { + return (const FLASH_SECTOR_T*)&flashStorage[page*PageSize]; +} + +static uint8_t buffer[256] = {0}; // The RAM buffer to accumulate writes +static uint8_t curPage = 0; // Current FLASH page inside the group +static uint8_t curGroup = 0xFF; // Current FLASH group + +//#define EE_EMU_DEBUG +#ifdef EE_EMU_DEBUG + static void ee_Dump(int page,const void* data) { + + const uint8_t* c = (const uint8_t*) data; + char buffer[80]; + + sprintf(buffer, "Page: %d (0x%04x)\n", page, page); + SERIAL_PROTOCOL(buffer); + + char* p = &buffer[0]; + for (int i = 0; i< PageSize; ++i) { + if ((i & 15) == 0) { + p += sprintf(p,"%04x] ",i); + } + + p += sprintf(p," %02x",c[i]); + if ((i & 15) == 15) { + *p++ = '\n'; + *p = 0; + SERIAL_PROTOCOL(buffer); + p = &buffer[0]; + } + } + } +#endif + +/* Flash Writing Protection Key */ +#define FWP_KEY 0x5Au + +#if SAM4S_SERIES + #define EEFC_FCR_FCMD(value) \ + ((EEFC_FCR_FCMD_Msk & ((value) << EEFC_FCR_FCMD_Pos))) + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE | EEFC_FSR_FLERR) +#else + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE) +#endif + + +/** + * Writes the contents of the specified page (no previous erase) + * @param page (page #) + * @param data (pointer to the data buffer) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageWrite(uint16_t page,const void* data) { + + int i; + uint32_t addrflash = ((uint32_t)getFlashStorage(page)); + + // Read the flash contents + uint32_t pageContents[PageSize>>2]; + memcpy(pageContents, (void*)addrflash, PageSize); + + // We ONLY want to toggle bits that have changed, and that have changed to 0. + // SAM3X8E tends to destroy contiguous bits if reprogrammed without erasing, so + // we try by all means to avoid this. That is why it says: "The Partial + // Programming mode works only with 128-bit (or higher) boundaries. It cannot + // be used with boundaries lower than 128 bits (8, 16 or 32-bit for example)." + // All bits that did not change, set them to 1. + for (i = 0; i > 2; i++) { + pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); + } + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM PageWrite ",page); + SERIAL_ECHOLNPAIR(" in FLASH address ",(uint32_t)addrflash); + SERIAL_ECHOLNPAIR(" base address ",(uint32_t)getFlashStorage(0)); + SERIAL_FLUSH(); + #endif + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ",page); + #endif + return false; + } + + // Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + const uint32_t * aligned_src = (const uint32_t *) &pageContents[0]; /*data;*/ + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = *aligned_src++; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_WPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Write failure for page ",page); + #endif + return false; + } + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Compare contents + if (memcmp(getFlashStorage(page),data,PageSize)) { + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Verify Write failure for page ",page); + + ee_Dump( page,(uint32_t *) addrflash); + ee_Dump(-page,data); + + // Calculate count of changed bits + uint32_t* p1 = (uint32_t*)addrflash; + uint32_t* p2 = (uint32_t*)data; + int count = 0; + for (i =0; i> 2; i++) { + if (p1[i] != p2[i]) { + uint32_t delta = p1[i] ^ p2[i]; + while (delta) { + if ((delta&1) != 0) + count++; + delta >>= 1; + } + } + } + SERIAL_ECHOLNPAIR("--> Differing bits: ",count); + #endif + + return false; + } + + return true; +} + +/** + * Erases the contents of the specified page + * @param page (page #) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageErase(uint16_t page) { + + int i; + uint32_t addrflash = ((uint32_t)getFlashStorage(page)); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM PageErase ",page); + SERIAL_ECHOLNPAIR(" in FLASH address ",(uint32_t)addrflash); + SERIAL_ECHOLNPAIR(" base address ",(uint32_t)getFlashStorage(0)); + SERIAL_FLUSH(); + #endif + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ",page); + #endif + return false; + } + + // Erase Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = 0xFFFFFFFF; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_EWPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Erase failure for page ",page); + #endif + return false; + } + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Check erase + uint32_t * aligned_src = (uint32_t *) addrflash; + for (i = 0; i < PageSize >> 2; i++) { + if (*aligned_src++ != 0xFFFFFFFF) { + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page); + + ee_Dump( page,(uint32_t *) addrflash); + #endif + return false; + } + } + + return true; +} +static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer = false) { + + uint32_t baddr; + uint32_t blen; + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) + return false; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return buffer[i + 3 + address - baddr]; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return pflash[i + 3 + address - baddr]; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, value is not stored, so return its default value + return 0xFF; +} + +static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer = false) { + uint32_t baddr; + uint32_t blen; + uint32_t nextAddr = 0xFFFF; + uint32_t nextRange = 0; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if address and address + 1 is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return address | ((blen - address + baddr) << 16); + } + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return address | ((blen - address + baddr) << 16); + } + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, we will return the next valid address + return nextAddr | (nextRange << 16); +} + +static bool ee_IsPageClean(int page) { + + uint32_t* pflash = (uint32_t*) getFlashStorage(page); + for (int i = 0; i < (PageSize >> 2); ++i) { + if (*pflash++ != 0xFFFFFFFF) + return false; + } + return true; +} + +static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData = 0xFF) { + + // Check if RAM buffer has something to be written + bool isEmpty = true; + uint32_t* p = (uint32_t*) &buffer[0]; + for (int j = 0; j < (PageSize >> 2); j++) { + if (*p++ != 0xFFFFFFFF) { + isEmpty = false; + break; + } + } + + // If something has to be written, do so! + if (!isEmpty) { + + // Write the current ram buffer into FLASH + ee_PageWrite(curPage + curGroup * PagesPerGroup, buffer); + + // Clear the RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Increment the page to use the next time + ++curPage; + } + + // Did we reach the maximum count of available pages per group for storage ? + if (curPage < PagesPerGroup) { + + // Do we have an override address ? + if (overrideAddress < EEPROMSize) { + + // Yes, just store the value into the RAM buffer + buffer[0] = overrideAddress & 0xFF; + buffer[0 + 1] = (overrideAddress >> 8) & 0xFF; + buffer[0 + 2] = 1; + buffer[0 + 3] = overrideData; + } + + // Done! + return true; + } + + // We have no space left on the current group - We must compact the values + int i = 0; + + // Compute the next group to use + int curwPage = 0; + int curwGroup = curGroup + 1; + if (curwGroup >= GroupCount) + curwGroup = 0; + + uint32_t rdAddr = 0; + do { + + // Get the next valid range + uint32_t addrRange = ee_GetAddrRange(rdAddr, true); + + // Make sure not to skip the override address, if specified + int rdRange; + if (overrideAddress < EEPROMSize && + rdAddr <= overrideAddress && + (addrRange & 0xFFFF) > overrideAddress) { + + rdAddr = overrideAddress; + rdRange = 1; + } + else { + rdAddr = addrRange & 0xFFFF; + rdRange = addrRange >> 16; + } + + // If no range, break loop + if (rdRange == 0) + break; + + do { + + // Get the value + uint8_t rdValue = overrideAddress == rdAddr ? overrideData : ee_Read(rdAddr, true); + + // Do not bother storing default values + if (rdValue != 0xFF) { + + // If we have room, add it to the buffer + if (buffer[i + 2] == 0xFF) { + + // Uninitialized buffer, just add it! + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + + } + else { + // Buffer already has contents. Check if we can extend it + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // Can we expand it ? + if (rdAddr == (baddr + blen) && + i < (PageSize - 4) && /* This block has a chance to contain data AND */ + buffer[i + 2] < (PageSize - i - 3)) {/* There is room for this block to be expanded */ + + // Yes, do it + ++buffer[i + 2]; + + // And store the value + buffer[i + 3 + rdAddr - baddr] = rdValue; + + } + else { + + // No, we can't expand it - Skip the existing block + i += 3 + blen; + + // Can we create a new slot ? + if (i > (PageSize - 4)) { + + // Not enough space - Write the current buffer to FLASH + ee_PageWrite(curwPage + curwGroup * PagesPerGroup, buffer); + + // Advance write page (as we are compacting, should never overflow!) + ++curwPage; + + // Clear RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Start fresh */ + i = 0; + } + + // Enough space, add the new block + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + } + } + } + + // Go to the next address + ++rdAddr; + + // Repeat for bytes of this range + } while (--rdRange); + + // Repeat until we run out of ranges + } while (rdAddr < EEPROMSize); + + // We must erase the previous group, in preparation for the next swap + for (int page = 0; page < curPage; page++) { + ee_PageErase(page + curGroup * PagesPerGroup); + } + + // Finally, Now the active group is the created new group + curGroup = curwGroup; + curPage = curwPage; + + // Done! + return true; +} + +static bool ee_Write(uint32_t address, uint8_t data) { + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) + return false; + + // Lets check if we have a block with that data previously defined. Block + // start addresses are always sorted in ascending order + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Just modify it + buffer[i + 3 + address - baddr] = data; + + // Done! + return true; + } + + // Maybe we could add it to the front or to the back + // of this block ? + if ((address + 1) == baddr || + address == (baddr + blen)) { + + // Potentially, it could be done. But we must ensure there is room + // so we can expand the block. Lets find how much free space remains + uint32_t iend = i; + do { + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } while (iend <= (PageSize - 4)); /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Here, inxt points to the first free address in the buffer. Do we have room ? + if (iend < PageSize) { + // Yes, at least a byte is free - We can expand the block + + // Do we have to insert at the beginning ? + if ((address + 1) == baddr) { + + // Insert at the beginning + + // Make room at the beginning for our byte + memmove(&buffer[i + 3 + 1], &buffer[i + 3], iend - i - 3); + + // Adjust the header and store the data + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2]++; + buffer[i + 3] = data; + + } + else { + + // Insert at the end - There is a very interesting thing that could happen here: + // Maybe we could coalesce the next block with this block. Let's try to do it! + int inext = i + 3 + blen; + if (inext <= (PageSize - 4) && + (buffer[inext] | (buffer[inext + 1] << 8)) == (baddr + blen + 1)) { + // YES! ... we can coalesce blocks! . Do it! + + // Adjust this block header to include the next one + buffer[i + 2] += buffer[inext + 2] + 1; + + // Store data at the right place + buffer[i + 3 + blen] = data; + + // Remove the next block header and append its data + memmove(&buffer[inext + 1], &buffer[inext + 3], iend - inext - 3); + + // Finally, as we have saved 2 bytes at the end, make sure to clean them + buffer[iend - 2] = 0xFF; + buffer[iend - 1] = 0xFF; + + } + else { + // NO ... No coalescing possible yet + + // Make room at the end for our byte + memmove(&buffer[i + 3 + blen + 1], &buffer[i + 3 + blen], iend - i - 3 - blen); + + // And add the data to the block + buffer[i + 2]++; + buffer[i + 3 + blen] = data; + } + } + + // Done! + return true; + } + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + + // Value is not stored AND we can't expand previous block to contain it. We must create a new block + + // First, lets find how much free space remains + uint32_t iend = i; + while (iend <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } + + // If there is room for a new block, insert it at the proper place + if (iend <= (PageSize - 4)) { + + // We have room to create a new block. Do so --- But add + // the block at the proper position, sorted by starting + // address, so it will be possible to compact it with other blocks. + + // Make space + memmove(&buffer[i + 4], &buffer[i], iend - i); + + // And add the block + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = data; + + // Done! + return true; + } + + // Not enough room to store this information on this FLASH page - Perform a + // flush and override the address with the specified contents + return ee_Flush(address, data); +} + +static void ee_Init() { + + // Just init once! + if (curGroup != 0xFF) + return; + + // Clean up the SRAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Now, we must find out the group where settings are stored + for (curGroup = 0; curGroup < GroupCount; curGroup++) { + if (!ee_IsPageClean(curGroup * PagesPerGroup)) + break; + } + + // If all groups seem to be used, default to first group + if (curGroup >= GroupCount) + curGroup = 0; + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Current Group: ",curGroup); + SERIAL_FLUSH(); + #endif + + // Now, validate that all the other group pages are empty + for (int grp = 0; grp < GroupCount; grp++) { + if (grp == curGroup) + continue; + + for (int page = 0; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(grp * PagesPerGroup + page)) { + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("EEPROM Page ",page); + SERIAL_ECHOLNPAIR(" not clean on group ",grp); + SERIAL_FLUSH(); + #endif + ee_PageErase(grp * PagesPerGroup + page); + } + } + } + + // Finally, for the active group, determine the first unused page + // and also validate that all the other ones are clean + for (curPage = 0; curPage < PagesPerGroup; curPage++) { + if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) { + #ifdef EE_EMU_DEBUG + ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage)); + #endif + break; + } + } + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Active page: ",curPage); + SERIAL_FLUSH(); + #endif + + // Make sure the pages following the first clean one are also clean + for (int page = curPage + 1; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("EEPROM Page ",page); + SERIAL_ECHOLNPAIR(" not clean on active group ",curGroup); + SERIAL_FLUSH(); + ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); + #endif + ee_PageErase(curGroup * PagesPerGroup + page); + } + } +} + +uint8_t eeprom_read_byte(uint8_t* addr) { + ee_Init(); + return ee_Read((uint32_t)addr); +} + +void eeprom_write_byte(uint8_t* addr, uint8_t value) { + ee_Init(); + ee_Write((uint32_t)addr, value); +} + +void eeprom_update_block(const void* __src, void* __dst, size_t __n) { + uint8_t* dst = (uint8_t*)__dst; + const uint8_t* src = (const uint8_t*)__src; + while (__n--) { + eeprom_write_byte(dst, *src); + ++dst; + ++src; + } +} + +void eeprom_read_block(void* __dst, const void* __src, size_t __n) { + uint8_t* dst = (uint8_t*)__dst; + uint8_t* src = (uint8_t*)__src; + while (__n--) { + *dst = eeprom_read_byte(src); + ++dst; + ++src; + } +} + +void eeprom_flush(void) { + ee_Flush(); +} + +#endif // ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) +#endif // ARDUINO_ARCH_AVR \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_DUE/HAL.cpp b/Marlin/src/HAL/HAL_DUE/HAL.cpp new file mode 100644 index 0000000000..9d932d94db --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL.cpp @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include +#include "usb/usb_task.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// HAL initialization task +void HAL_init(void) { + // Initialize the USB stack + #if ENABLED(SDSUPPORT) + OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up + #endif + usb_task_init(); +} + +// HAL idle task +void HAL_idletask(void) { + // Perform USB stack housekeeping + usb_task_idle(); +} + +// Disable interrupts +void cli(void) { noInterrupts(); } + +// Enable interrupts +void sei(void) { interrupts(); } + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source(void) { + switch ((RSTC->RSTC_SR >> 8) & 0x07) { + case 0: return RST_POWER_ON; + case 1: return RST_BACKUP; + case 2: return RST_WATCHDOG; + case 3: return RST_SOFTWARE; + case 4: return RST_EXTERNAL; + default: return 0; + } +} + +void _delay_ms(const int delay_ms) { + // Todo: port for Due? + delay(delay_ms); +} + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// Return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { + int free_memory, heap_end = (int)_sbrk(0); + return (int)&free_memory - (heap_end ? heap_end : (int)&_ebss); +} + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + // nop + return HAL_adc_result; +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL.h b/Marlin/src/HAL/HAL_DUE/HAL.h new file mode 100644 index 0000000000..805acd28d6 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL.h @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_DUE_H +#define _HAL_DUE_H + +#define CPU_32_BIT + +#include + +#include + +#include "../math_32bit.h" +#include "../HAL_SPI.h" +#include "fastio_Due.h" +#include "watchdog_Due.h" +#include "HAL_timers_Due.h" + +// +// Defines +// +#define NUM_SERIAL 1 +#define MYSERIAL0 customizedSerial + +// We need the previous define before the include, or compilation bombs... +#include "MarlinSerial_Due.h" +#include "MarlinSerialUSB_Due.h" + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB Servo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern uint16_t HAL_adc_result; // result of last ADC conversion + +void cli(void); // Disable interrupts +void sei(void); // Enable interrupts + +void HAL_clear_reset_source(void); // clear reset reason +uint8_t HAL_get_reset_source(void); // get reset reason + +void _delay_ms(const int delay); + +int freeMemory(void); + +/** + * SPI: Extended functions taking a channel number (hardware SPI only) + */ + +// Write single byte to specified SPI channel +void spiSend(uint32_t chan, byte b); + +// Write buffer to specified SPI channel +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); + +// Read single byte from specified SPI channel +uint8_t spiRec(uint32_t chan); + +/** + * EEPROM + */ + +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +/** + * ADC + */ + +#define HAL_ANALOG_SELECT(pin) + +inline void HAL_adc_init(void) {}//todo + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_result + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(void); +uint16_t HAL_getAdcReading(uint8_t chan); +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +/** + * Pin Map + */ +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +/** + * Tone + */ +void toneInit(); +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); +void noTone(const pin_t _pin); + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +#define HAL_INIT 1 +void HAL_idletask(void); +void HAL_init(void); + +#ifdef __cplusplus + extern "C" { +#endif +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s); +#ifdef __cplusplus + } +#endif + +#endif // _HAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp new file mode 100644 index 0000000000..84c0f8f4bf --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp @@ -0,0 +1,865 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * Completely rewritten and tuned by Eduardo José Tagle in 2017/2018 + * in ARM thumb2 inline assembler and tuned for maximum speed and performance + * allowing SPI clocks of up to 12 Mhz to increase SD card read/write performance + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include "../Delay.h" + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(DUE_SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // software SPI + // -------------------------------------------------------------------------- + + // Make sure GCC optimizes this file. + // Note that this line triggers a bug in GCC which is fixed by casting. + // See the note below. + #pragma GCC optimize (3) + + typedef uint8_t (*pfnSpiTransfer)(uint8_t b); + typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); + typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); + + /* ---------------- Macros to be able to access definitions from asm */ + #define _PORT(IO) DIO ## IO ## _WPORT + #define _PIN_MASK(IO) MASK(DIO ## IO ## _PIN) + #define _PIN_SHIFT(IO) DIO ## IO ## _PIN + #define PORT(IO) _PORT(IO) + #define PIN_MASK(IO) _PIN_MASK(IO) + #define PIN_SHIFT(IO) _PIN_SHIFT(IO) + + // run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0 + register uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + register uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + register uint32_t idx = 0; + + /* Negate bout, as the assembler requires a negated value */ + bout = ~bout; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* Bit 7 */ + A("ubfx %[idx],%[txval],#7,#1") /* Place bit 7 in bit 0 of idx*/ + + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#6,#1") /* Place bit 6 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#5,#1") /* Place bit 5 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#4,#1") /* Place bit 4 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#3,#1") /* Place bit 3 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#2,#1") /* Place bit 2 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#1,#1") /* Place bit 1 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#0,#1") /* Place bit 0 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("nop") /* Result will be 0 */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + : [idx]"+r"( idx ) + : [txval]"r"( bout ) , + [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return 0; + } + + // Calculates the bit band alias address and returns a pointer address to word. + // addr: The byte address of bitbanding bit. + // bit: The bit position of bitbanding bit. + #define BITBAND_ADDRESS(addr, bit) \ + (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4) + + // run at ~8 .. ~10Mhz - Rx version (Tx line not altered) + static uint8_t spiTransferRx0(uint8_t bout) { // using Mode 0 + register uint32_t bin = 0; + register uint32_t work = 0; + register uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + UNUSED(bout); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + : [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return bin; + } + + // run at ~4Mhz + static uint8_t spiTransfer1(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + DELAY_NS(125); // 10 cycles @ 84mhz + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + DELAY_NS(125); // 10 cycles @ 84mhz + } while (--bits); + return b; + } + + // all the others + static uint32_t spiDelayCyclesX4 = (F_CPU/1000000); // 4uS => 125khz + + static uint8_t spiTransferX(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + __delay_4cycles(spiDelayCyclesX4); + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + __delay_4cycles(spiDelayCyclesX4); + } while (--bits); + return b; + } + + // Pointers to generic functions for byte transfers + + /** + * Note: The cast is unnecessary, but without it, this file triggers a GCC 4.8.3-2014 bug. + * Later GCC versions do not have this problem, but at this time (May 2018) Arduino still + * uses that buggy and obsolete GCC version!! + */ + static pfnSpiTransfer spiTransferRx = (pfnSpiTransfer)spiTransferX; + static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; + + // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { + register uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + register uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + register uint32_t work = 0; + register uint32_t txval = 0; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + A("ldrb.w %[txval], [%[ptr]], #1") /* Load value to send, increment buffer */ + A("mvn %[txval],%[txval]") /* Negate value */ + + /* Bit 7 */ + A("ubfx %[work],%[txval],#7,#1") /* Place bit 7 in bit 0 of work*/ + + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#6,#1") /* Place bit 6 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#5,#1") /* Place bit 5 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#4,#1") /* Place bit 4 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#3,#1") /* Place bit 3 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#2,#1") /* Place bit 2 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#1,#1") /* Place bit 1 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#0,#1") /* Place bit 0 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r" ( ptr ) , + [todo]"+r" ( todo ) , + [work]"+r"( work ) , + [txval]"+r"( txval ) + : [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { + register uint32_t bin = 0; + register uint32_t work = 0; + register uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r"(ptr), + [todo]"+r"(todo), + [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { + do { + (void) spiTransferTx(*buf++); + } while (--todo); + } + + static void spiRxBlockX(uint8_t* buf, uint32_t todo) { + do { + *buf++ = spiTransferRx(0xFF); + } while (--todo); + } + + // Pointers to generic functions for block tranfers + static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + + #if MB(ALLIGATOR) // control SDSS pin + void spiBegin() { + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + } + + uint8_t spiRec() { + WRITE(SS_PIN, LOW); + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + uint8_t b = spiTransferRx(0xFF); + WRITE(SS_PIN, HIGH); + return b; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + uint32_t todo = nbyte; + if (todo == 0) return; + + WRITE(SS_PIN, LOW); + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + spiRxBlock(buf,nbyte); + WRITE(SS_PIN, HIGH); + } + + void spiSend(uint8_t b) { + WRITE(SS_PIN, LOW); + (void) spiTransferTx(b); + WRITE(SS_PIN, HIGH); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + WRITE(SS_PIN, LOW); + (void) spiTransferTx(token); + spiTxBlock(buf,512); + WRITE(SS_PIN, HIGH); + + #else // let calling routine control SDSS + void spiBegin() { + SET_OUTPUT(SS_PIN); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + } + + uint8_t spiRec() { + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + uint8_t b = spiTransferRx(0xFF); + return b; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + uint32_t todo = nbyte; + if (todo == 0) return; + + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + spiRxBlock(buf,nbyte); + } + + void spiSend(uint8_t b) { + (void) spiTransferTx(b); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + (void) spiTransferTx(token); + spiTxBlock(buf,512); + + #endif + + } + + /** + * spiRate should be + * 0 : 8 - 10 MHz + * 1 : 4 - 5 MHz + * 2 : 2 - 2.5 MHz + * 3 : 1 - 1.25 MHz + * 4 : 500 - 625 kHz + * 5 : 250 - 312 kHz + * 6 : 125 - 156 kHz + */ + void spiInit(uint8_t spiRate) { + switch (spiRate) { + case 0: + spiTransferTx = (pfnSpiTransfer)spiTransferTx0; + spiTransferRx = (pfnSpiTransfer)spiTransferRx0; + spiTxBlock = (pfnSpiTxBlock)spiTxBlock0; + spiRxBlock = (pfnSpiRxBlock)spiRxBlock0; + break; + case 1: + spiTransferTx = (pfnSpiTransfer)spiTransfer1; + spiTransferRx = (pfnSpiTransfer)spiTransfer1; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + default: + spiDelayCyclesX4 = (F_CPU/1000000) >> (6 - spiRate); + spiTransferTx = (pfnSpiTransfer)spiTransferX; + spiTransferRx = (pfnSpiTransfer)spiTransferX; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + } + + #if MB(ALLIGATOR) + WRITE(SS_PIN, HIGH); + #endif + WRITE(MOSI_PIN, HIGH); + WRITE(SCK_PIN, LOW); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #pragma GCC reset_options + +#else // !SOFTWARE_SPI + + #if MB(ALLIGATOR) + + // slave selects controlled by SPI controller + // doesn't support changing SPI speeds for SD card + + // -------------------------------------------------------------------------- + // hardware SPI + // -------------------------------------------------------------------------- + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + int spiDueDividors[] = { 10, 21, 42, 84, 168, 255, 255 }; + bool spiInitMaded = false; + + void spiBegin() { + if (spiInitMaded == false) { + // Configure SPI pins + PIO_Configure( + g_APinDescription[SCK_PIN].pPort, + g_APinDescription[SCK_PIN].ulPinType, + g_APinDescription[SCK_PIN].ulPin, + g_APinDescription[SCK_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MOSI_PIN].pPort, + g_APinDescription[MOSI_PIN].ulPinType, + g_APinDescription[MOSI_PIN].ulPin, + g_APinDescription[MOSI_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MISO_PIN].pPort, + g_APinDescription[MISO_PIN].ulPinType, + g_APinDescription[MISO_PIN].ulPin, + g_APinDescription[MISO_PIN].ulPinConfiguration); + + // set master mode, peripheral select, fault detection + SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); + SPI_Enable(SPI0); + + #if MB(ALLIGATOR) + SET_OUTPUT(DAC0_SYNC); + #if EXTRUDERS > 1 + SET_OUTPUT(DAC1_SYNC); + WRITE(DAC1_SYNC, HIGH); + #endif + SET_OUTPUT(SPI_EEPROM1_CS); + SET_OUTPUT(SPI_EEPROM2_CS); + SET_OUTPUT(SPI_FLASH_CS); + WRITE(DAC0_SYNC, HIGH); + WRITE(SPI_EEPROM1_CS, HIGH ); + WRITE(SPI_EEPROM2_CS, HIGH ); + WRITE(SPI_FLASH_CS, HIGH ); + WRITE(SS_PIN, HIGH ); + #endif // MB(ALLIGATOR) + + OUT_WRITE(SDSS,0); + + PIO_Configure( + g_APinDescription[SPI_PIN].pPort, + g_APinDescription[SPI_PIN].ulPinType, + g_APinDescription[SPI_PIN].ulPin, + g_APinDescription[SPI_PIN].ulPinConfiguration); + + spiInit(1); + spiInitMaded = true; + } + } + + void spiInit(uint8_t spiRate) { + if (spiInitMaded == false) { + if (spiRate > 6) spiRate = 1; + + #if MB(ALLIGATOR) + // Set SPI mode 1, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC, + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + #endif//MB(ALLIGATOR) + + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + SPI_Enable(SPI0); + spiInitMaded = true; + } + } + + // Write single byte to SPI + void spiSend(byte b) { + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // clear status + SPI0->SPI_RDR; + //DELAY_US(1U); + } + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (size_t i = 0; i < n - 1; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[n - 1]); + } + + void spiSend(uint32_t chan, byte b) { + uint8_t dummy_read = 0; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(chan) | SPI_TDR_LASTXFER; + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // clear status + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + dummy_read = SPI0->SPI_RDR; + UNUSED(dummy_read); + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { + uint8_t dummy_read = 0; + if (n == 0) return; + for (int i = 0; i < (int)n - 1; i++) { + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + dummy_read = SPI0->SPI_RDR; + UNUSED(dummy_read); + } + spiSend(chan, buf[n - 1]); + } + + // Read single byte from SPI + uint8_t spiRec() { + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + //DELAY_US(1U); + return SPI0->SPI_RDR; + } + + uint8_t spiRec(uint32_t chan) { + uint8_t spirec_tmp; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + spirec_tmp = SPI0->SPI_RDR; + UNUSED(spirec_tmp); + + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(chan) | SPI_TDR_LASTXFER; + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + return SPI0->SPI_RDR; + } + + // Read from SPI into buffer + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + + for (int i = 0; i < nbyte; i++) { + //while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + buf[i] = SPI0->SPI_RDR; + //DELAY_US(1U); + } + buf[nbyte] = spiRec(); + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + //while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + //SPI0->SPI_RDR; + for (int i = 0; i < 511; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[511]); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #else // U8G compatible hardware SPI + + #define SPI_MODE_0_DUE_HW 2 // DUE CPHA control bit is inverted + #define SPI_MODE_1_DUE_HW 3 + #define SPI_MODE_2_DUE_HW 0 + #define SPI_MODE_3_DUE_HW 1 + + void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + int spiDueDividors[] = { 10, 21, 42, 84, 168, 255, 255 }; + if (spiRate > 6) spiRate = 1; + + // Enable PIOA and SPI0 + REG_PMC_PCER0 = (1UL << ID_PIOA) | (1UL << ID_SPI0); + + // Disable PIO on A26 and A27 + REG_PIOA_PDR = 0x0C000000; + OUT_WRITE(SDSS, 1); + + // Reset SPI0 (from sam lib) + SPI0->SPI_CR = SPI_CR_SPIDIS; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SPIEN; + + // TMC2103 compatible setup + // Master mode, no fault detection, PCS bits in data written to TDR select CSR register + SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS; + // SPI mode 0, 8 Bit data transfer, baud rate + SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDueDividors[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_0_DUE_HW; // use same CSR as TMC2130 + } + + static uint8_t spiTransfer(uint8_t data) { + + // Wait until tx register is empty + while( (SPI0->SPI_SR & SPI_SR_TDRE) == 0 ); + // Send data + SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte + + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + return SPI0->SPI_RDR; + } + + void spiBegin() { + spiInit(); + } + + uint8_t spiRec() { + uint8_t data = spiTransfer(0xFF); + return data; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) + buf[i] = spiTransfer(0xFF); + } + + void spiSend(uint8_t data) { + spiTransfer(data); + } + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) + spiTransfer(buf[i]); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiTransfer(token); + for (uint16_t i = 0; i < 512; i++) + spiTransfer(buf[i]); + } + + #endif // !ALLIGATOR +#endif // !SOFTWARE_SPI + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp new file mode 100644 index 0000000000..eb23692b44 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_Due.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 9 + +#define PRESCALER 2 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] + { TC0, 1, TC1_IRQn, 0}, // 1 + { TC0, 2, TC2_IRQn, 0}, // 2 + { TC1, 0, TC3_IRQn, 2}, // 3 - stepper + { TC1, 1, TC4_IRQn, 15}, // 4 - temperature + { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3] + { TC2, 0, TC6_IRQn, 14}, // 6 - tone + { TC2, 1, TC7_IRQn, 0}, // 7 + { TC2, 2, TC8_IRQn, 0}, // 8 +}; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* + Timer_clock1: Prescaler 2 -> 42MHz + Timer_clock2: Prescaler 8 -> 10.5MHz + Timer_clock3: Prescaler 32 -> 2.625MHz + Timer_clock4: Prescaler 128 -> 656.25kHz +*/ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + Tc *tc = TimerConfig[timer_num].pTimerRegs; + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + uint32_t channel = TimerConfig[timer_num].channel; + + // Disable interrupt, just in case it was already enabled + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable timer interrupt + tc->TC_CHANNEL[channel].TC_IDR = TC_IDR_CPCS; + + // Stop timer, just in case, to be able to reconfigure it + TC_Stop(tc, channel); + + pmc_set_writeprotect(false); + pmc_enable_periph_clk((uint32_t)irq); + NVIC_SetPriority(irq, TimerConfig [timer_num].priority); + + // wave mode, reset counter on match with RC, + TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); + + // Set compare value + TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency); + + // And start timer + TC_Start(tc, channel); + + // enable interrupt on RC compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS; + + // Finally, enable IRQ + NVIC_EnableIRQ(irq); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_EnableIRQ(irq); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// missing from CMSIS: Check if interrupt is enabled or not +static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + return NVIC_GetEnabledIRQ(irq); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h new file mode 100644 index 0000000000..871ef995e6 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_TIMERS_DUE_H +#define _HAL_TIMERS_DUE_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals + +#define STEP_TIMER_NUM 3 // index of timer to use for stepper +#define TEMP_TIMER_NUM 4 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR void TC3_Handler() +#define HAL_TEMP_TIMER_ISR void TC4_Handler() +#define HAL_TONE_TIMER_ISR void TC6_Handler() + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + Tc *pTimerRegs; + uint16_t channel; + IRQn_Type IRQ_Id; + uint8_t priority; +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern const tTimerConfig TimerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; +} + +// if counter too high then bump up compare +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + // Reading the status register clears the interrupt flag + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp new file mode 100644 index 0000000000..9b226a60da --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM, + * allowing to register new interrupt handlers at runtime. Specially valuable and needed + * because Arduino runtime allocates some interrupt handlers that we NEED to override to + * properly support extended functionality, as for example, USB host or USB device (MSD, MTP) + * and custom serial port handlers, and we don't actually want to modify and/or recompile the + * Arduino runtime. We just want to run as much as possible on Stock Arduino + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ +#ifdef ARDUINO_ARCH_SAM + +#include "HAL.h" +#include "InterruptVectors_Due.h" + +/* The relocated Exception/Interrupt Table - According to the ARM + reference manual, alignment to 128 bytes should suffice, but in + practice, we need alignment to 256 bytes to make this work in all + cases */ +__attribute__ ((aligned(256))) +static DeviceVectors ram_tab = { NULL }; + +/** + * This function checks if the exception/interrupt table is already in SRAM or not. + * If it is not, then it copies the ROM table to the SRAM and relocates the table + * by reprogramming the NVIC registers + */ +static pfnISR_Handler* get_relocated_table_addr(void) { + // Get the address of the interrupt/exception table + uint32_t isrtab = SCB->VTOR; + + // If already relocated, we are done! + if (isrtab >= IRAM0_ADDR) + return (pfnISR_Handler*)isrtab; + + // Get the address of the table stored in FLASH + const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab; + + // Copy it to SRAM + memcpy(&ram_tab, romtab, sizeof(ram_tab)); + + // Disable global interrupts + CRITICAL_SECTION_START; + + // Set the vector table base address to the SRAM copy + SCB->VTOR = (uint32_t)(&ram_tab); + + // Reenable interrupts + CRITICAL_SECTION_END; + + // Return the address of the table + return (pfnISR_Handler*)(&ram_tab); +} + +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) { + // Get the address of the relocated table + pfnISR_Handler *isrtab = get_relocated_table_addr(); + + // Disable global interrupts + CRITICAL_SECTION_START; + + // Get the original handler + pfnISR_Handler oldHandler = isrtab[irq + 16]; + + // Install the new one + isrtab[irq + 16] = newHandler; + + // Reenable interrupts + CRITICAL_SECTION_END; + + // Return the original one + return oldHandler; +} + +#endif diff --git a/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h new file mode 100644 index 0000000000..efc63de25d --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * InterruptVectors_Due.h + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * + * This module relocates the Interrupt vector table to SRAM, allowing new + * interrupt handlers to be added at runtime. This is required because the + * Arduino runtime steals interrupt handlers that Marlin MUST use to support + * extended functionality such as USB hosts and USB devices (MSD, MTP) and + * custom serial port handlers. Rather than modifying and/or recompiling the + * Arduino runtime, We just want to run as much as possible on Stock Arduino. + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#ifndef INTERRUPTVECTORS_DUE_H +#define INTERRUPTVECTORS_DUE_H + +#include "../../inc/MarlinConfig.h" + +#ifdef ARDUINO_ARCH_SAM + +// ISR handler type +typedef void (*pfnISR_Handler)(void); + +// Install a new interrupt vector handler for the given irq, returning the old one +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler); + +#endif // ARDUINO_ARCH_SAM +#endif // INTERRUPTVECTORS_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp new file mode 100644 index 0000000000..eed4c73999 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp @@ -0,0 +1,292 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT == -1 + +#include "MarlinSerialUSB_Due.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" +#endif + +// Imports from Atmel USB Stack/CDC implementation +extern "C" { + bool usb_task_cdc_isenabled(void); + bool usb_task_cdc_dtr_active(void); + bool udi_cdc_is_rx_ready(void); + int udi_cdc_getc(void); + bool udi_cdc_is_tx_ready(void); + int udi_cdc_putc(int value); +}; + +// Pending character +static int pending_char = -1; + +#if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET +#endif + +// Public Methods +void MarlinSerialUSB::begin(const long baud_setting) { +} + +void MarlinSerialUSB::end() { +} + +int MarlinSerialUSB::peek(void) { + if (pending_char >= 0) + return pending_char; + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + pending_char = udi_cdc_getc(); + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, (char)pending_char); + #endif + + return pending_char; +} + +int MarlinSerialUSB::read(void) { + if (pending_char >= 0) { + int ret = pending_char; + pending_char = -1; + return ret; + } + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + int c = udi_cdc_getc(); + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, (char)c); + #endif + + return c; +} + +bool MarlinSerialUSB::available(void) { + /* If Pending chars */ + return pending_char >= 0 || + /* or USB CDC enumerated and configured on the PC side and some + bytes where sent to us */ + (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); +} + +void MarlinSerialUSB::flush(void) { +} + +void MarlinSerialUSB::write(const uint8_t c) { + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + /* Wait until the PC has read the pending to be sent data */ + while (usb_task_cdc_isenabled() && + usb_task_cdc_dtr_active() && + !udi_cdc_is_tx_ready()) { + }; + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages at this point */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + // Fifo full + // udi_cdc_signal_overrun(); + udi_cdc_putc(c); +} + +/** +* Imports from print.h +*/ + +void MarlinSerialUSB::print(char c, int base) { + print((long)c, base); +} + +void MarlinSerialUSB::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +void MarlinSerialUSB::print(int n, int base) { + print((long)n, base); +} + +void MarlinSerialUSB::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +void MarlinSerialUSB::print(long n, int base) { + if (base == 0) + write(n); + else if (base == 10) { + if (n < 0) { + print('-'); + n = -n; + } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +void MarlinSerialUSB::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +void MarlinSerialUSB::print(double n, int digits) { + printFloat(n, digits); +} + +void MarlinSerialUSB::println(void) { + print('\r'); + print('\n'); +} + +void MarlinSerialUSB::println(const String& s) { + print(s); + println(); +} + +void MarlinSerialUSB::println(const char c[]) { + print(c); + println(); +} + +void MarlinSerialUSB::println(char c, int base) { + print(c, base); + println(); +} + +void MarlinSerialUSB::println(unsigned char b, int base) { + print(b, base); + println(); +} + +void MarlinSerialUSB::println(int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods + +void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +void MarlinSerialUSB::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) + rounding *= 0.1; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } +} + +// Preinstantiate +MarlinSerialUSB customizedSerial; + +#endif // SERIAL_PORT == -1 + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h new file mode 100644 index 0000000000..bfa2ccedc0 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MarlinSerialUSB_Due.h - Hardware Serial over USB (CDC) library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#ifndef MARLINSERIALUSB_DUE_H +#define MARLINSERIALUSB_DUE_H + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT == -1 + +#include + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +class MarlinSerialUSB { + +public: + MarlinSerialUSB() {}; + static void begin(const long); + static void end(); + static int peek(void); + static int read(void); + static void flush(void); + static bool available(void); + static void write(const uint8_t c); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return 0; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static int rxMaxEnqueued() { return 0; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(void); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +extern MarlinSerialUSB customizedSerial; + +#endif // SERIAL_PORT == -1 +#endif // MARLINSERIAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp new file mode 100644 index 0000000000..0ff98e62ff --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp @@ -0,0 +1,703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#include "MarlinSerial_Due.h" +#include "InterruptVectors_Due.h" +#include "../../Marlin.h" + +// If not using the USB port as serial port +#if SERIAL_PORT >= 0 + + // Based on selected port, use the proper configuration + #if SERIAL_PORT == 0 + #define HWUART UART + #define HWUART_IRQ UART_IRQn + #define HWUART_IRQ_ID ID_UART + #elif SERIAL_PORT == 1 + #define HWUART ((Uart*)USART0) + #define HWUART_IRQ USART0_IRQn + #define HWUART_IRQ_ID ID_USART0 + #elif SERIAL_PORT == 2 + #define HWUART ((Uart*)USART1) + #define HWUART_IRQ USART1_IRQn + #define HWUART_IRQ_ID ID_USART1 + #elif SERIAL_PORT == 3 + #define HWUART ((Uart*)USART2) + #define HWUART_IRQ USART2_IRQn + #define HWUART_IRQ_ID ID_USART2 + #elif SERIAL_PORT == 4 + #define HWUART ((Uart*)USART3) + #define HWUART_IRQ USART3_IRQn + #define HWUART_IRQ_ID ID_USART3 + #endif + + struct ring_buffer_r { + unsigned char buffer[RX_BUFFER_SIZE]; + volatile ring_buffer_pos_t head, tail; + }; + + #if TX_BUFFER_SIZE > 0 + struct ring_buffer_t { + unsigned char buffer[TX_BUFFER_SIZE]; + volatile uint8_t head, tail; + }; + #endif + + ring_buffer_r rx_buffer = { { 0 }, 0, 0 }; + #if TX_BUFFER_SIZE > 0 + ring_buffer_t tx_buffer = { { 0 }, 0, 0 }; + #endif + static bool _written; + + #if ENABLED(SERIAL_XON_XOFF) + constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + // XON / XOFF character definitions + constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + uint8_t xon_xoff_state = XON_XOFF_CHAR_SENT | XON_CHAR; + + // Validate that RX buffer size is at least 4096 bytes- According to several experiments, on + // the original Arduino Due that uses a ATmega16U2 as USB to serial bridge, due to the introduced + // latencies, at least 2959 bytes of RX buffering (when transmitting at 250kbits/s) are required + // to avoid overflows. + + #if RX_BUFFER_SIZE < 4096 + #error Arduino DUE requires at least 4096 bytes of RX buffer to avoid buffer overflows when using XON/XOFF handshake + #endif + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + uint8_t rx_dropped_bytes = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + uint8_t rx_buffer_overruns = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + uint8_t rx_framing_errors = 0; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + ring_buffer_pos_t rx_max_enqueued = 0; + #endif + + // A SW memory barrier, to ensure GCC does not overoptimize loops + #define sw_barrier() asm volatile("": : :"memory"); + + #if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" + #endif + + // (called with RX interrupts disabled) + FORCE_INLINE void store_rxd_char() { + + #if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET + #endif + + // Get the tail - Nothing can alter its value while we are at this ISR + const ring_buffer_pos_t t = rx_buffer.tail; + + // Get the head pointer + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + uint8_t c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + // Calculate count of bytes stored into the RX buffer + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); + #endif + + #if ENABLED(SERIAL_XON_XOFF) + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (RX_BUFFER_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX isr can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + uint32_t status; + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // We received a char while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + HWUART->UART_THR = XOFF_CHAR; + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + #endif // SERIAL_XON_XOFF + + // Store the new head value + rx_buffer.head = h; + } + + #if TX_BUFFER_SIZE > 0 + + FORCE_INLINE void _tx_thr_empty_irq(void) { + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + HWUART->UART_THR = XON_CHAR; + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + + return; + } + #endif + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + HWUART->UART_IDR = UART_IDR_TXRDY; + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (TX_BUFFER_SIZE - 1); + HWUART->UART_THR = c; + tx_buffer.tail = t; + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + } + + #endif // TX_BUFFER_SIZE > 0 + + static void UART_ISR(void) { + const uint32_t status = HWUART->UART_SR; + + // Data received? + if (status & UART_SR_RXRDY) store_rxd_char(); + + #if TX_BUFFER_SIZE > 0 + // Something to send, and TX interrupts are enabled (meaning something to send)? + if ((status & UART_SR_TXRDY) && (HWUART->UART_IMR & UART_IMR_TXRDY)) _tx_thr_empty_irq(); + #endif + + // Acknowledge errors + if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) { + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + if (status & UART_SR_OVRE && !++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + if (status & UART_SR_OVRE && !++rx_buffer_overruns) --rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + if (status & UART_SR_FRAME && !++rx_framing_errors) --rx_framing_errors; + #endif + + // TODO: error reporting outside ISR + HWUART->UART_CR = UART_CR_RSTSTA; + } + } + + // Public Methods + + void MarlinSerial::begin(const long baud_setting) { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( HWUART_IRQ_ID ); + + // Configure PMC + pmc_enable_periph_clk( HWUART_IRQ_ID ); + + // Disable PDC channel + HWUART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + HWUART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + HWUART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) + HWUART->UART_BRGR = (SystemCoreClock / (baud_setting << 4)); + + // Configure interrupts + HWUART->UART_IDR = 0xFFFFFFFF; + HWUART->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME; + + // Install interrupt handler + install_isr(HWUART_IRQ, UART_ISR); + + // Configure priority. We need a very high priority to avoid losing characters + // and we need to be able to preempt the Stepper ISR and everything else! + // (this could probably be fixed by using DMA with the Serial port) + NVIC_SetPriority(HWUART_IRQ, 1); + + // Enable UART interrupt in NVIC + NVIC_EnableIRQ(HWUART_IRQ); + + // Enable receiver and transmitter + HWUART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; + + #if TX_BUFFER_SIZE > 0 + _written = false; + #endif + } + + void MarlinSerial::end() { + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + pmc_disable_periph_clk( HWUART_IRQ_ID ); + } + + int MarlinSerial::peek(void) { + const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; + return v; + } + + int MarlinSerial::read(void) { + + const ring_buffer_pos_t h = rx_buffer.head; + ring_buffer_pos_t t = rx_buffer.tail; + + if (h == t) return -1; + + int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); + + // Advance tail + rx_buffer.tail = t; + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + // When below 10% of RX buffer capacity, send XON before running out of RX buffer bytes + if (rx_count < (RX_BUFFER_SIZE) / 10) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + #endif + } + } + #endif + + return v; + } + + ring_buffer_pos_t MarlinSerial::available(void) { + const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail; + return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); + } + + void MarlinSerial::flush(void) { + rx_buffer.tail = rx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + #endif + } + #endif + } + + #if TX_BUFFER_SIZE > 0 + void MarlinSerial::write(const uint8_t c) { + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX isr, but it is properly handled there + if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) { + HWUART->UART_THR = c; + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + // If we can transmit another byte, do it. + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) sw_barrier(); + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX isr - Non atomic, but it will eventually enable TX isr + HWUART->UART_IER = UART_IER_TXRDY; + } + + void MarlinSerial::flushTX(void) { + // TX + + // If we have never written a byte, no need to flush. This special + // case is needed since there is no way to force the TXC (transmit + // complete) bit to 1 during initialization + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) { + // If there is more space, send an extra character + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + + #else // TX_BUFFER_SIZE == 0 + + void MarlinSerial::write(const uint8_t c) { + _written = true; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = c; + } + + void MarlinSerial::flushTX(void) { + // TX + + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + #endif // TX_BUFFER_SIZE == 0 + + /** + * Imports from print.h + */ + + void MarlinSerial::print(char c, int base) { + print((long)c, base); + } + + void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); + } + + void MarlinSerial::print(int n, int base) { + print((long)n, base); + } + + void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); + } + + void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); + } + + void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); + } + + void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); + } + + void MarlinSerial::println(void) { + print('\r'); + print('\n'); + } + + void MarlinSerial::println(const String& s) { + print(s); + println(); + } + + void MarlinSerial::println(const char c[]) { + print(c); + println(); + } + + void MarlinSerial::println(char c, int base) { + print(c, base); + println(); + } + + void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); + } + + void MarlinSerial::println(int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); + } + + // Private Methods + + void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); + } + + void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } + } + + // Preinstantiate + MarlinSerial customizedSerial; +#endif + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h new file mode 100644 index 0000000000..2f5a07f515 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MarlinSerial_Due.h - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ + +#ifndef MARLINSERIAL_DUE_H +#define MARLINSERIAL_DUE_H + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT >= 0 + +#include + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which rx_buffer_head is the index of the +// location to which to write the next incoming character and rx_buffer_tail +// is the index of the location from which to read. +// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256) +#ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 +#endif +#ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 +#endif + +//#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 +// #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." +//#elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) +// #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." +//#elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) +// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." +//#endif + +#if RX_BUFFER_SIZE > 256 + typedef uint16_t ring_buffer_pos_t; +#else + typedef uint8_t ring_buffer_pos_t; +#endif + +#if ENABLED(SERIAL_STATS_DROPPED_RX) + extern uint8_t rx_dropped_bytes; +#endif + +#if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + extern uint8_t rx_buffer_overruns; +#endif + +#if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + extern uint8_t rx_framing_errors; +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + extern ring_buffer_pos_t rx_max_enqueued; +#endif + +class MarlinSerial { + +public: + MarlinSerial() {}; + static void begin(const long); + static void end(); + static int peek(void); + static int read(void); + static void flush(void); + static ring_buffer_pos_t available(void); + static void write(const uint8_t c); + static void flushTX(void); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(void); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +extern MarlinSerial customizedSerial; + +#endif // SERIAL_PORT >= 0 + +#endif // MARLINSERIAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/SanityCheck.h b/Marlin/src/HAL/HAL_DUE/SanityCheck.h new file mode 100644 index 0000000000..16e07bd3b4 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/SanityCheck.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Test Arduino Due specific configuration values for errors at compile-time. + */ + +/** + * HARDWARE VS. SOFTWARE SPI COMPATIBILITY + * + * DUE selects hardware vs. software SPI depending on whether one of the hardware-controllable SDSS pins is in use. + * + * The hardware SPI controller doesn't allow software SPIs to control any shared pins. + * + * When DUE software SPI is used then Trinamic drivers must use the TMC softSPI. + * + * When DUE hardware SPI is used then a Trinamic driver can use either its hardware SPI or, if there are no shared + * pins, its software SPI. + * + * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time + * as the TMC2130 soft SPI the most common setup. + */ +#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN)) + +#if ENABLED(SDSUPPORT) && ENABLED(HAVE_TMC2130) + #if ENABLED(TMC_USE_SW_SPI) + #if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK)) + #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs." + #endif + #elif ENABLED(DUE_SOFTWARE_SPI) + #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix." + #endif +#endif diff --git a/Marlin/src/HAL/HAL_DUE/ServoTimers.h b/Marlin/src/HAL/HAL_DUE/ServoTimers.h new file mode 100644 index 0000000000..8d5d0fa583 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/ServoTimers.h @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2013 Arduino LLC. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 32 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many timers are available. + */ + +/** + * SAM Only definitions + * -------------------- + */ + +// For SAM3X: +//!#define _useTimer1 +//!#define _useTimer2 +#define _useTimer3 +//!#define _useTimer4 +#define _useTimer5 + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define PRESCALER 32 // timer prescaler + +/* + TC0, chan 0 => TC0_Handler + TC0, chan 1 => TC1_Handler + TC0, chan 2 => TC2_Handler + TC1, chan 0 => TC3_Handler + TC1, chan 1 => TC4_Handler + TC1, chan 2 => TC5_Handler + TC2, chan 0 => TC6_Handler + TC2, chan 1 => TC7_Handler + TC2, chan 2 => TC8_Handler + */ + +#ifdef _useTimer1 + #define TC_FOR_TIMER1 TC1 + #define CHANNEL_FOR_TIMER1 0 + #define ID_TC_FOR_TIMER1 ID_TC3 + #define IRQn_FOR_TIMER1 TC3_IRQn + #define HANDLER_FOR_TIMER1 TC3_Handler +#endif +#ifdef _useTimer2 + #define TC_FOR_TIMER2 TC1 + #define CHANNEL_FOR_TIMER2 1 + #define ID_TC_FOR_TIMER2 ID_TC4 + #define IRQn_FOR_TIMER2 TC4_IRQn + #define HANDLER_FOR_TIMER2 TC4_Handler +#endif +#ifdef _useTimer3 + #define TC_FOR_TIMER3 TC1 + #define CHANNEL_FOR_TIMER3 2 + #define ID_TC_FOR_TIMER3 ID_TC5 + #define IRQn_FOR_TIMER3 TC5_IRQn + #define HANDLER_FOR_TIMER3 TC5_Handler +#endif +#ifdef _useTimer4 + #define TC_FOR_TIMER4 TC0 + #define CHANNEL_FOR_TIMER4 2 + #define ID_TC_FOR_TIMER4 ID_TC2 + #define IRQn_FOR_TIMER4 TC2_IRQn + #define HANDLER_FOR_TIMER4 TC2_Handler +#endif +#ifdef _useTimer5 + #define TC_FOR_TIMER5 TC0 + #define CHANNEL_FOR_TIMER5 0 + #define ID_TC_FOR_TIMER5 ID_TC0 + #define IRQn_FOR_TIMER5 TC0_IRQn + #define HANDLER_FOR_TIMER5 TC0_Handler +#endif + +//typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t; +typedef enum { _timer3, _timer5, _Nbr_16timers } timer16_Sequence_t; diff --git a/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp b/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp new file mode 100644 index 0000000000..84c4899923 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/* + Copyright (c) 2013 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include +#include "../servo.h" +#include "../servo_private.h" + +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +//------------------------------------------------------------------------------ +/// Interrupt handler for the TC0 channel 1. +//------------------------------------------------------------------------------ +void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); + +#ifdef _useTimer1 + void HANDLER_FOR_TIMER1(void) { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); } +#endif +#ifdef _useTimer2 + void HANDLER_FOR_TIMER2(void) { Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); } +#endif +#ifdef _useTimer3 + void HANDLER_FOR_TIMER3(void) { Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); } +#endif +#ifdef _useTimer4 + void HANDLER_FOR_TIMER4(void) { Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); } +#endif +#ifdef _useTimer5 + void HANDLER_FOR_TIMER5(void) { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); } +#endif + +void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) { + // clear interrupt + tc->TC_CHANNEL[channel].TC_SR; + if (Channel[timer] < 0) + tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer + else if (SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive) + digitalWrite(SERVO(timer,Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + + Channel[timer]++; // increment to the next channel + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; + if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + tc->TC_CHANNEL[channel].TC_RA = + tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4 + ? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed + : tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) { + pmc_enable_periph_clk(id); + TC_Configure(tc, channel, + TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 + TC_CMR_WAVE | // Waveform mode + TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC + + /* 84MHz, MCK/32, for 1.5ms: 3937 */ + TC_SetRA(tc, channel, 2625); // 1ms + + /* Configure and enable interrupt */ + NVIC_EnableIRQ(irqn); + // TC_IER_CPAS: RA Compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; + + // Enables the timer clock and performs a software reset to start the counting + TC_Start(tc, channel); +} + +void initISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + if (timer == _timer1) + _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); + #endif + #ifdef _useTimer2 + if (timer == _timer2) + _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); + #endif + #ifdef _useTimer3 + if (timer == _timer3) + _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); + #endif + #ifdef _useTimer4 + if (timer == _timer4) + _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); + #endif + #ifdef _useTimer5 + if (timer == _timer5) + _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); + #endif +} + +void finISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); + #endif + #ifdef _useTimer2 + TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); + #endif + #ifdef _useTimer3 + TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); + #endif + #ifdef _useTimer4 + TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); + #endif + #ifdef _useTimer5 + TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); + #endif +} + +#endif // HAS_SERVOS + +#endif // ARDUINO_ARCH_SAM + diff --git a/Marlin/src/HAL/HAL_DUE/Tone.cpp b/Marlin/src/HAL/HAL_DUE/Tone.cpp new file mode 100644 index 0000000000..55c03f5e58 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/Tone.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Description: Tone function for Arduino Due and compatible (SAM3X8E) + * Derived from http://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "HAL.h" +#include "HAL_timers_Due.h" + +static pin_t tone_pin; +volatile static int32_t toggles; + +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { + tone_pin = _pin; + toggles = 2 * frequency * duration / 1000; + HAL_timer_start(TONE_TIMER_NUM, 2 * frequency); +} + +void noTone(const pin_t _pin) { + HAL_timer_disable_interrupt(TONE_TIMER_NUM); + digitalWrite(_pin, LOW); +} + +HAL_TONE_TIMER_ISR { + static uint8_t pin_state = 0; + HAL_timer_isr_prologue(TONE_TIMER_NUM); + + if (toggles) { + toggles--; + digitalWrite(tone_pin, (pin_state ^= 1)); + } + else noTone(tone_pin); // turn off interrupt +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h new file mode 100644 index 0000000000..b662804cd1 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_DUE/fastio_Due.h b/Marlin/src/HAL/HAL_DUE/fastio_Due.h new file mode 100644 index 0000000000..fe0923ead5 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/fastio_Due.h @@ -0,0 +1,505 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O Routines for SAM3X8E + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + * Note the code here was specifically crafted by disassembling what GCC produces + * out of it, so GCC is able to optimize it out as much as possible to the least + * amount of instructions. Be very carefull if you modify them, as "clean code" + * leads to less efficient compiled code!! + */ + +#ifndef _FASTIO_DUE_H +#define _FASTIO_DUE_H + +/** + * Utility functions + */ + +// Due has 12 PWMs assigned to logical pins 2-13. +// 6, 7, 8 & 9 come from the PWM controller. The others come from the timers. +#define USEABLE_HARDWARE_PWM(p) ((2 <= p) && (p <= 13)) + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +// Read a pin +#define _READ(IO) bool(DIO ## IO ## _WPORT -> PIO_PDSR & MASK(DIO ## IO ## _PIN)) + +// Write to a pin +#define _WRITE_VAR(IO,V) do { \ + volatile Pio* port = g_APinDescription[IO].pPort; \ + uint32_t mask = g_APinDescription[IO].ulPin; \ + if (V) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ +} while(0) + +// Write to a pin +#define _WRITE(IO,V) do { \ + volatile Pio* port = (DIO ## IO ## _WPORT); \ + uint32_t mask = MASK(DIO ## IO ## _PIN); \ + if (V) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ +} while(0) + +// toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +// set pin as input +#define _SET_INPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(g_APinDescription[IO].pPort, PIO_INPUT, g_APinDescription[IO].ulPin, 0); \ +}while(0) + +// set pin as output +#define _SET_OUTPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(g_APinDescription[IO].pPort, _READ(IO) ? PIO_OUTPUT_1 : PIO_OUTPUT_0, g_APinDescription[IO].ulPin, g_APinDescription[IO].ulPinConfiguration); \ + g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT;\ +}while(0) + +// set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +// check if pin is an input +#define _GET_INPUT(IO) +// check if pin is an output +#define _GET_OUTPUT(IO) + +// check if pin is a timer +#define _GET_TIMER(IO) + +// Read a pin wrapper +#define READ(IO) _READ(IO) + +// Write to a pin wrapper +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) + +// toggle a pin wrapper +#define TOGGLE(IO) _TOGGLE(IO) + +// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) +// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +// set pin as output wrapper - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) +// check if pin is an input wrapper +#define GET_INPUT(IO) _GET_INPUT(IO) +// check if pin is an output wrapper +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +// check if pin is a timer (wrapper) +#define GET_TIMER(IO) _GET_TIMER(IO) + +// Shorthand +#define OUT_WRITE(IO,V) { SET_OUTPUT(IO); WRITE(IO,V); } + +/** + * Ports and functions + * Added as necessary or if I feel like it- not a comprehensive list! + */ + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// TWI (I2C) +#define SCL DIO21 +#define SDA DIO20 + +/** + * pins + */ + +#define DIO0_PIN 8 +#define DIO0_WPORT PIOA + +#define DIO1_PIN 9 +#define DIO1_WPORT PIOA + +#define DIO2_PIN 25 +#define DIO2_WPORT PIOB + +#define DIO3_PIN 28 +#define DIO3_WPORT PIOC + +#define DIO4_PIN 26 +#define DIO4_WPORT PIOC + +#define DIO5_PIN 25 +#define DIO5_WPORT PIOC + +#define DIO6_PIN 24 +#define DIO6_WPORT PIOC + +#define DIO7_PIN 23 +#define DIO7_WPORT PIOC + +#define DIO8_PIN 22 +#define DIO8_WPORT PIOC + +#define DIO9_PIN 21 +#define DIO9_WPORT PIOC + +#define DIO10_PIN 29 +#define DIO10_WPORT PIOC + +#define DIO11_PIN 7 +#define DIO11_WPORT PIOD + +#define DIO12_PIN 8 +#define DIO12_WPORT PIOD + +#define DIO13_PIN 27 +#define DIO13_WPORT PIOB + +#define DIO14_PIN 4 +#define DIO14_WPORT PIOD + +#define DIO15_PIN 5 +#define DIO15_WPORT PIOD + +#define DIO16_PIN 13 +#define DIO16_WPORT PIOA + +#define DIO17_PIN 12 +#define DIO17_WPORT PIOA + +#define DIO18_PIN 11 +#define DIO18_WPORT PIOA + +#define DIO19_PIN 10 +#define DIO19_WPORT PIOA + +#define DIO20_PIN 12 +#define DIO20_WPORT PIOB + +#define DIO21_PIN 13 +#define DIO21_WPORT PIOB + +#define DIO22_PIN 26 +#define DIO22_WPORT PIOB + +#define DIO23_PIN 14 +#define DIO23_WPORT PIOA + +#define DIO24_PIN 15 +#define DIO24_WPORT PIOA + +#define DIO25_PIN 0 +#define DIO25_WPORT PIOD + +#define DIO26_PIN 1 +#define DIO26_WPORT PIOD + +#define DIO27_PIN 2 +#define DIO27_WPORT PIOD + +#define DIO28_PIN 3 +#define DIO28_WPORT PIOD + +#define DIO29_PIN 6 +#define DIO29_WPORT PIOD + +#define DIO30_PIN 9 +#define DIO30_WPORT PIOD + +#define DIO31_PIN 7 +#define DIO31_WPORT PIOA + +#define DIO32_PIN 10 +#define DIO32_WPORT PIOD + +#define DIO33_PIN 1 +#define DIO33_WPORT PIOC + +#define DIO34_PIN 2 +#define DIO34_WPORT PIOC + +#define DIO35_PIN 3 +#define DIO35_WPORT PIOC + +#define DIO36_PIN 4 +#define DIO36_WPORT PIOC + +#define DIO37_PIN 5 +#define DIO37_WPORT PIOC + +#define DIO38_PIN 6 +#define DIO38_WPORT PIOC + +#define DIO39_PIN 7 +#define DIO39_WPORT PIOC + +#define DIO40_PIN 8 +#define DIO40_WPORT PIOC + +#define DIO41_PIN 9 +#define DIO41_WPORT PIOC + +#define DIO42_PIN 19 +#define DIO42_WPORT PIOA + +#define DIO43_PIN 20 +#define DIO43_WPORT PIOA + +#define DIO44_PIN 19 +#define DIO44_WPORT PIOC + +#define DIO45_PIN 18 +#define DIO45_WPORT PIOC + +#define DIO46_PIN 17 +#define DIO46_WPORT PIOC + +#define DIO47_PIN 16 +#define DIO47_WPORT PIOC + +#define DIO48_PIN 15 +#define DIO48_WPORT PIOC + +#define DIO49_PIN 14 +#define DIO49_WPORT PIOC + +#define DIO50_PIN 13 +#define DIO50_WPORT PIOC + +#define DIO51_PIN 12 +#define DIO51_WPORT PIOC + +#define DIO52_PIN 21 +#define DIO52_WPORT PIOB + +#define DIO53_PIN 14 +#define DIO53_WPORT PIOB + +#define DIO54_PIN 16 +#define DIO54_WPORT PIOA + +#define DIO55_PIN 24 +#define DIO55_WPORT PIOA + +#define DIO56_PIN 23 +#define DIO56_WPORT PIOA + +#define DIO57_PIN 22 +#define DIO57_WPORT PIOA + +#define DIO58_PIN 6 +#define DIO58_WPORT PIOA + +#define DIO59_PIN 4 +#define DIO59_WPORT PIOA + +#define DIO60_PIN 3 +#define DIO60_WPORT PIOA + +#define DIO61_PIN 2 +#define DIO61_WPORT PIOA + +#define DIO62_PIN 17 +#define DIO62_WPORT PIOB + +#define DIO63_PIN 18 +#define DIO63_WPORT PIOB + +#define DIO64_PIN 19 +#define DIO64_WPORT PIOB + +#define DIO65_PIN 20 +#define DIO65_WPORT PIOB + +#define DIO66_PIN 15 +#define DIO66_WPORT PIOB + +#define DIO67_PIN 16 +#define DIO67_WPORT PIOB + +#define DIO68_PIN 1 +#define DIO68_WPORT PIOA + +#define DIO69_PIN 0 +#define DIO69_WPORT PIOA + +#define DIO70_PIN 17 +#define DIO70_WPORT PIOA + +#define DIO71_PIN 18 +#define DIO71_WPORT PIOA + +#define DIO72_PIN 30 +#define DIO72_WPORT PIOC + +#define DIO73_PIN 21 +#define DIO73_WPORT PIOA + +#define DIO74_PIN 25 +#define DIO74_WPORT PIOA + +#define DIO75_PIN 26 +#define DIO75_WPORT PIOA + +#define DIO76_PIN 27 +#define DIO76_WPORT PIOA + +#define DIO77_PIN 28 +#define DIO77_WPORT PIOA + +#define DIO78_PIN 23 +#define DIO78_WPORT PIOB + +#define DIO79_PIN 17 +#define DIO79_WPORT PIOA + +#define DIO80_PIN 12 +#define DIO80_WPORT PIOB + +#define DIO81_PIN 8 +#define DIO81_WPORT PIOA + +#define DIO82_PIN 11 +#define DIO82_WPORT PIOA + +#define DIO83_PIN 13 +#define DIO83_WPORT PIOA + +#define DIO84_PIN 4 +#define DIO84_WPORT PIOD + +#define DIO85_PIN 11 +#define DIO85_WPORT PIOB + +#define DIO86_PIN 21 +#define DIO86_WPORT PIOB + +#define DIO87_PIN 29 +#define DIO87_WPORT PIOA + +#define DIO88_PIN 15 +#define DIO88_WPORT PIOB + +#define DIO89_PIN 14 +#define DIO89_WPORT PIOB + +#define DIO90_PIN 1 +#define DIO90_WPORT PIOA + +#define DIO91_PIN 15 +#define DIO91_WPORT PIOB + +#if ARDUINO_SAM_ARCHIM + #define DIO92_PIN 11 + #define DIO92_WPORT PIOC + + #define DIO93_PIN 2 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 1 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 0 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 10 + #define DIO96_WPORT PIOC + + #define DIO97_PIN 24 + #define DIO97_WPORT PIOB + + #define DIO98_PIN 7 + #define DIO98_WPORT PIOB + + #define DIO99_PIN 6 + #define DIO99_WPORT PIOB + + #define DIO100_PIN 8 + #define DIO100_WPORT PIOB + + #define DIO101_PIN 5 + #define DIO101_WPORT PIOB + + #define DIO102_PIN 4 + #define DIO102_WPORT PIOB + + #define DIO103_PIN 3 + #define DIO103_WPORT PIOB + + #define DIO104_PIN 20 + #define DIO104_WPORT PIOC + + #define DIO105_PIN 22 + #define DIO105_WPORT PIOB + + #define DIO106_PIN 27 + #define DIO106_WPORT PIOC + + #define DIO107_PIN 10 + #define DIO107_WPORT PIOB +#else + #define DIO92_PIN 5 + #define DIO92_WPORT PIOA + + #define DIO93_PIN 12 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 22 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 23 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 24 + #define DIO96_WPORT PIOB + + #define DIO97_PIN 20 + #define DIO97_WPORT PIOC + + #define DIO98_PIN 27 + #define DIO98_WPORT PIOC + + #define DIO99_PIN 10 + #define DIO99_WPORT PIOC + + #define DIO100_PIN 11 + #define DIO100_WPORT PIOC +#endif + +#endif // _FASTIO_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_DUE/persistent_store_impl.cpp new file mode 100644 index 0000000000..f5276e045c --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/persistent_store_impl.cpp @@ -0,0 +1,61 @@ +#ifdef ARDUINO_ARCH_SAM + +#include "../persistent_store_api.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +extern void eeprom_flush(void); + +namespace HAL { +namespace PersistentStore { + +bool access_start() { + return true; +} + +bool access_finish(){ +#if DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + eeprom_flush(); +#endif + return true; +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} +} + +#endif // EEPROM_SETTINGS +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_DUE/pinsDebug.h b/Marlin/src/HAL/HAL_DUE/pinsDebug.h new file mode 100644 index 0000000000..691830b873 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/pinsDebug.h @@ -0,0 +1,190 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Support routines for Due + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#include + +/** + * Due/Marlin quirks + * + * a) determining the state of a pin + * The Due/Arduino status definitions for the g_pinStatus[pin] array are: + * #define PIN_STATUS_DIGITAL_INPUT_PULLUP (0x01) + * #define PIN_STATUS_DIGITAL_INPUT (0x02) + * #define PIN_STATUS_DIGITAL_OUTPUT (0x03) + * #define PIN_STATUS_ANALOG (0x04) + * #define PIN_STATUS_PWM (0x05) + * #define PIN_STATUS_TIMER (0x06) + * + * These are only valid if the following Due/Arduino provided functions are used: + * analogRead + * analogWrite + * digitalWrite + * pinMode + * + * The FASTIO routines do not touch the g_pinStatus[pin] array. + * + * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register + * needs to be looked at when determining if a pin is an input or an output. + * + * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz + * + * c) NUM_DIGITAL_PINS does not include the analog pins + * + * d) Pins 0-78 are defined for Due but 78 has a comment of "unconnected!". 78 is + * included just in case. + */ + +#define NUMBER_PINS_TOTAL PINS_COUNT + +#define digitalRead_mod(p) digitalRead(p) // AVR digitalRead disabled PWM before it read the pin +#define PRINT_PORT(p) +#define NAME_FORMAT(p) PSTR("%-##p##s") +#define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer);} while (0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) +#define IS_ANALOG(P) (((P) >= analogInputToDigitalPin(0)) && ((P) <= analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) +#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ + ((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM)) +#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin + +bool GET_PINMODE(int8_t pin) { // 1: output, 0: input + volatile Pio* port = g_APinDescription[pin].pPort; + uint32_t mask = g_APinDescription[pin].ulPin; + uint8_t pin_status = g_pinStatus[pin] & 0xF; + return ( (pin_status == 0 && (port->PIO_OSR & mask)) + || pin_status == PIN_STATUS_DIGITAL_OUTPUT + || pwm_status(pin)); +} + +bool GET_ARRAY_IS_DIGITAL(int8_t pin) { + uint8_t pin_status = g_pinStatus[pin] & 0xF; + return !(pin_status == PIN_STATUS_ANALOG); +} + +void pwm_details(int32_t pin) { + if (pwm_status(pin)) { + uint32_t chan = g_APinDescription[pin].ulPWMChannel; + SERIAL_PROTOCOLPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY); + } +} + +/** + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + * + */ \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_DUE/spi_pins.h b/Marlin/src/HAL/HAL_DUE/spi_pins.h new file mode 100644 index 0000000000..d0eb711df2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/spi_pins.h @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + * Available chip select pins for HW SPI are 4 10 52 77 + */ +#if (SDSS == 4) || (SDSS == 10) || (SDSS == 52) || (SDSS == 77) + #if (SDSS == 4) + #define SPI_PIN 87 + #define SPI_CHAN 1 + #elif (SDSS == 10) + #define SPI_PIN 77 + #define SPI_CHAN 0 + #elif (SDSS == 52) + #define SPI_PIN 86 + #define SPI_CHAN 2 + #else + #define SPI_PIN 77 + #define SPI_CHAN 0 + #endif + #define SCK_PIN 76 + #define MISO_PIN 74 + #define MOSI_PIN 75 +#else + // defaults + #define DUE_SOFTWARE_SPI + #define SCK_PIN 52 + #define MISO_PIN 50 + #define MOSI_PIN 51 +#endif + +/* A.28, A.29, B.21, C.26, C.29 */ +#define SS_PIN SDSS + +#endif /* SPI_PINS_H_ */ diff --git a/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp new file mode 100644 index 0000000000..0dab3bb412 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017, 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + + +/* + + based on u8g_com_msp430_hw_spi.c + + Universal 8bit Graphics Library + + Copyright (c) 2012, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifdef __SAM3X8E__ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +#include "../../Marlin.h" + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +#include +#include "fastio_Due.h" + +void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; + else port->PIO_CODR = mask; +} + +uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1); + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1); + + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS); + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0); + + u8g_Delay(5); + + spiBegin(); + + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card + #endif + spiInit(2); + + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); + break; + + case U8G_COM_MSG_RESET: + break; + + case U8G_COM_MSG_WRITE_BYTE: + + spiSend((uint8_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif //__SAM3X8E__ diff --git a/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp new file mode 100644 index 0000000000..df33f9db62 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include +#include "../Delay.h" + +void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; + else port->PIO_CODR = mask; +} + +Pio *SCK_pPio, *MOSI_pPio; +uint32_t SCK_dwMask, MOSI_dwMask; + +static void spiSend_sw_DUE(uint8_t val) { // 800KHz + for (uint8_t i = 0; i < 8; i++) { + if (val & 0x80) + MOSI_pPio->PIO_SODR = MOSI_dwMask; + else + MOSI_pPio->PIO_CODR = MOSI_dwMask; + DELAY_NS(48); + SCK_pPio->PIO_SODR = SCK_dwMask; + DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz + val <<= 1; + SCK_pPio->PIO_CODR = SCK_dwMask; + } +} + +static uint8_t rs_last_state = 255; + +static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { + uint8_t i; + + if ( rs != rs_last_state) { // time to send a command/data byte + rs_last_state = rs; + + if ( rs == 0 ) + /* command */ + spiSend_sw_DUE(0x0F8); + else + /* data */ + spiSend_sw_DUE(0x0FA); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe + } + + spiSend_sw_DUE(val & 0x0F0); + spiSend_sw_DUE(val << 4); +} + + +uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; + SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; + MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; + MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; + + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); + u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); + + SCK_pPio->PIO_CODR = SCK_dwMask; //SCK low - needed at power up but not after reset + MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset + + u8g_Delay(5); + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h b/Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h new file mode 100644 index 0000000000..c1434228cd --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h @@ -0,0 +1,103 @@ +/** + * \file + * + * \brief Arduino Due/X Board Definition. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef ARDUINO_DUE_X_H_INCLUDED +#define ARDUINO_DUE_X_H_INCLUDED + +/* ------------------------------------------------------------------------ */ + +/** + * \page arduino_due_x_opfreq "Arduino Due/X - Operating frequencies" + * This page lists several definition related to the board operating frequency + * + * \section Definitions + * - \ref BOARD_FREQ_* + * - \ref BOARD_MCK + */ + +/*! Board oscillator settings */ +#define BOARD_FREQ_SLCK_XTAL (32768U) +#define BOARD_FREQ_SLCK_BYPASS (32768U) +#define BOARD_FREQ_MAINCK_XTAL (12000000U) +#define BOARD_FREQ_MAINCK_BYPASS (12000000U) + +/*! Master clock frequency */ +#define BOARD_MCK CHIP_FREQ_CPU_MAX +#define BOARD_NO_32K_XTAL + +/** board main clock xtal startup time */ +#define BOARD_OSC_STARTUP_US 15625 + +/* ------------------------------------------------------------------------ */ + +/** + * \page arduino_due_x_board_info "Arduino Due/X - Board informations" + * This page lists several definition related to the board description. + * + */ + +/* ------------------------------------------------------------------------ */ +/* USB */ +/* ------------------------------------------------------------------------ */ +/*! USB OTG VBus On/Off: Bus Power Control Port. */ +#define PIN_UOTGHS_VBOF { PIO_PB10, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP } +/*! USB OTG Identification: Mini Connector Identification Port. */ +#define PIN_UOTGHS_ID { PIO_PB11, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP } + +/*! Multiplexed pin used for USB_ID: */ +#define USB_ID PIO_PB11_IDX +#define USB_ID_GPIO (PIO_PB11_IDX) +#define USB_ID_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) +/*! Multiplexed pin used for USB_VBOF: */ +#define USB_VBOF PIO_PB10_IDX +#define USB_VBOF_GPIO (PIO_PB10_IDX) +#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) +/*! Active level of the USB_VBOF output pin. */ +#define USB_VBOF_ACTIVE_LEVEL LOW +/* ------------------------------------------------------------------------ */ + + +#endif /* ARDUINO_DUE_X_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/compiler.h b/Marlin/src/HAL/HAL_DUE/usb/compiler.h new file mode 100644 index 0000000000..43895381a2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/compiler.h @@ -0,0 +1,1151 @@ +/** + * \file + * + * \brief Commonly used includes, types and macros. + * + * Copyright (c) 2010-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +#include +#include +#include "arduino_due_x.h" +#include "conf_clock.h" +#ifdef SAM3XA_SERIES +#define SAM3XA 1 +#endif +#define UDD_NO_SLEEP_MGR 1 +#define pmc_is_wakeup_clocks_restored() true + +#undef udd_get_endpoint_size_max +#define UDD_USB_INT_FUN USBD_ISR + +/** + * \defgroup group_sam_utils Compiler abstraction layer and code utilities + * + * Compiler abstraction layer and code utilities for AT91SAM. + * This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * \{ + */ +#include + +#if (defined __ICCARM__) +# include +#endif + +#include +#include "preprocessor.h" + +//_____ D E C L A R A T I O N S ____________________________________________ + +#ifndef __ASSEMBLY__ // Not defined for assembling. + +#include +#include +#include +#include + +#ifdef __ICCARM__ +/*! \name Compiler Keywords + * + * Port of some keywords from GCC to IAR Embedded Workbench. + */ +//! @{ +#define __asm__ asm +#define __inline__ inline +#define __volatile__ +//! @} + +#endif + +#define FUNC_PTR void * +/** + * \def UNUSED + * \brief Marking \a v as a unused parameter or value. + */ +#ifndef UNUSED +#define UNUSED(x) (void) (x) +#endif + +/** + * \def unused + * \brief Marking \a v as a unused parameter or value. + */ +#define unused(v) do { (void)(v); } while(0) + +/** + * \def barrier + * \brief Memory barrier + */ +#define barrier() __DMB() + +/** + * \brief Emit the compiler pragma \a arg. + * + * \param arg The pragma directive as it would appear after \e \#pragma + * (i.e. not stringified). + */ +#define COMPILER_PRAGMA(arg) _Pragma(#arg) + +/** + * \def COMPILER_PACK_SET(alignment) + * \brief Set maximum alignment for subsequent struct and union + * definitions to \a alignment. + */ +#define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment)) + +/** + * \def COMPILER_PACK_RESET() + * \brief Set default alignment for subsequent struct and union + * definitions. + */ +#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack()) + + +/** + * \brief Set aligned boundary. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define COMPILER_ALIGNED(a) __attribute__((__aligned__(a))) +#elif (defined __ICCARM__) +# define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a) +#endif + +/** + * \brief Set word-aligned boundary. + */ +#if (defined __GNUC__) || defined(__CC_ARM) +#define COMPILER_WORD_ALIGNED __attribute__((__aligned__(4))) +#elif (defined __ICCARM__) +#define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 4) +#endif + +/** + * \def __always_inline + * \brief The function should always be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and inline the function no matter how big it thinks it + * becomes. + */ +#if defined(__CC_ARM) +# define __always_inline __forceinline +#elif (defined __GNUC__) +#ifdef __always_inline +# undef __always_inline +#endif +# define __always_inline inline __attribute__((__always_inline__)) +#elif (defined __ICCARM__) +# define __always_inline _Pragma("inline=forced") +#endif + +/** + * \def __no_inline + * \brief The function should not be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and not inline the function. + */ +#if defined(__CC_ARM) +# define __no_inline __attribute__((noinline)) +#elif (defined __GNUC__) +# define __no_inline __attribute__((__noinline__)) +#elif (defined __ICCARM__) +# define __no_inline _Pragma("inline=never") +#endif + +/*! \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is false. If it is, a fatal error is + * detected and the application hangs up. If TEST_SUITE_DEFINE_ASSERT_MACRO + * is defined, a unit test version of the macro is used, to allow execution + * of further tests after a false expression. + * + * \param expr Expression to evaluate and supposed to be nonzero. + */ +#if defined(_ASSERT_ENABLE_) +# if defined(TEST_SUITE_DEFINE_ASSERT_MACRO) + // Assert() is defined in unit_test/suite.h +# include "unit_test/suite.h" +# else +#undef TEST_SUITE_DEFINE_ASSERT_MACRO +# define Assert(expr) \ + {\ + if (!(expr)) while (true);\ + } +# endif +#else +# define Assert(expr) ((void) 0) +#endif + +/* Define WEAK attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define WEAK __attribute__ ((weak)) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define WEAK __weak +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define WEAK __attribute__ ((weak)) +#endif + +/* Define NO_INIT attribute */ +#if 0 //ndef NO_INIT +#if defined ( __CC_ARM ) +# define NO_INIT __attribute__((zero_init)) +#elif defined ( __ICCARM__ ) +# define NO_INIT __no_init +#elif defined ( __GNUC__ ) +# define NO_INIT __attribute__((section(".no_init"))) +#endif +#endif + +/* Define RAMFUNC attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define RAMFUNC __ramfunc +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#endif + +/* Define OPTIMIZE_HIGH attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define OPTIMIZE_HIGH _Pragma("O3") +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define OPTIMIZE_HIGH _Pragma("optimize=high") +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define OPTIMIZE_HIGH __attribute__((optimize("s"))) +#endif + +/*! \name Usual Types + */ +//! @{ +typedef unsigned char Bool; //!< Boolean. +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +typedef unsigned char bool; //!< Boolean. +#endif +#endif +typedef int8_t S8 ; //!< 8-bit signed integer. +typedef uint8_t U8 ; //!< 8-bit unsigned integer. +typedef int16_t S16; //!< 16-bit signed integer. +typedef uint16_t U16; //!< 16-bit unsigned integer. +typedef uint16_t le16_t; +typedef uint16_t be16_t; +typedef int32_t S32; //!< 32-bit signed integer. +typedef uint32_t U32; //!< 32-bit unsigned integer. +typedef uint32_t le32_t; +typedef uint32_t be32_t; +typedef int64_t S64; //!< 64-bit signed integer. +typedef uint64_t U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. +typedef uint32_t iram_size_t; +//! @} + + +/*! \name Status Types + */ +//! @{ +typedef bool Status_bool_t; //!< Boolean status. +typedef U8 Status_t; //!< 8-bit-coded status. +//! @} + + +/*! \name Aliasing Aggregate Types + */ +//! @{ + +//! 16-bit union. +typedef union +{ + S16 s16 ; + U16 u16 ; + S8 s8 [2]; + U8 u8 [2]; +} Union16; + +//! 32-bit union. +typedef union +{ + S32 s32 ; + U32 u32 ; + S16 s16[2]; + U16 u16[2]; + S8 s8 [4]; + U8 u8 [4]; +} Union32; + +//! 64-bit union. +typedef union +{ + S64 s64 ; + U64 u64 ; + S32 s32[2]; + U32 u32[2]; + S16 s16[4]; + U16 u16[4]; + S8 s8 [8]; + U8 u8 [8]; +} Union64; + +//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} UnionPtr; + +//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} UnionVPtr; + +//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} UnionCPtr; + +//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} UnionCVPtr; + +//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} StructPtr; + +//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} StructVPtr; + +//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} StructCPtr; + +//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} StructCVPtr; + +//! @} + +#endif // #ifndef __ASSEMBLY__ + +/*! \name Usual Constants + */ +//! @{ +#define DISABLE 0 +#define ENABLE 1 +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +#define false 0 +#define true 1 +#endif +#endif +#ifndef PASS +#define PASS 0 +#endif +#ifndef FAIL +#define FAIL 1 +#endif +#ifndef LOW +#define LOW 0x0 +#endif +#ifndef HIGH +#define HIGH 0x1 +#endif +//! @} + + +#ifndef __ASSEMBLY__ // not for assembling. + +//! \name Optimization Control +//@{ + +/** + * \def likely(exp) + * \brief The expression \a exp is likely to be true + */ +#ifndef likely +# define likely(exp) (exp) +#endif + +/** + * \def unlikely(exp) + * \brief The expression \a exp is unlikely to be true + */ +#ifndef unlikely +# define unlikely(exp) (exp) +#endif + +/** + * \def is_constant(exp) + * \brief Determine if an expression evaluates to a constant value. + * + * \param exp Any expression + * + * \return true if \a exp is constant, false otherwise. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define is_constant(exp) __builtin_constant_p(exp) +#else +# define is_constant(exp) (0) +#endif + +//! @} + +/*! \name Bit-Field Handling + */ +//! @{ + +/*! \brief Reads the bits of a value specified by a given bit-mask. + * + * \param value Value to read bits from. + * \param mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value) & (mask)) + +/*! \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write bits to. + * \param mask Bit-mask indicating bits to write. + * \param bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/*! \brief Tests the bits of a value specified by a given bit-mask. + * + * \param value Value of which to test bits. + * \param mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/*! \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to clear bits. + * \param mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/*! \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to set bits. + * \param mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to toggle bits. + * \param mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/*! \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param value Value to read a bit-field from. + * \param mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) + +/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write a bit-field to. + * \param mask Bit-mask indicating the bit-field to write. + * \param bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) + +//! @} + + +/*! \name Zero-Bit Counting + * + * Under GCC, __builtin_clz and __builtin_ctz behave like macros when + * applied to constant expressions (values known at compile time), so they are + * more optimized than the use of the corresponding assembly instructions and + * they can be used as constant expressions e.g. to initialize objects having + * static storage duration, and like the corresponding assembly instructions + * when applied to non-constant expressions (values unknown at compile time), so + * they are more optimized than an assembly periphrasis. Hence, clz and ctz + * ensure a possible and optimized behavior for both constant and non-constant + * expressions. + */ +//! @{ + +/*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the leading zero bits. + * + * \return The count of leading zero bits in \a u. + */ +#ifndef clz +#if (defined __GNUC__) || (defined __CC_ARM) +# define clz(u) ((u) ? __builtin_clz(u) : 32) +#elif (defined __ICCARM__) +# define clz(u) ((u) ? __CLZ(u) : 32) +#else +# define clz(u) (((u) == 0) ? 32 : \ + ((u) & (1ul << 31)) ? 0 : \ + ((u) & (1ul << 30)) ? 1 : \ + ((u) & (1ul << 29)) ? 2 : \ + ((u) & (1ul << 28)) ? 3 : \ + ((u) & (1ul << 27)) ? 4 : \ + ((u) & (1ul << 26)) ? 5 : \ + ((u) & (1ul << 25)) ? 6 : \ + ((u) & (1ul << 24)) ? 7 : \ + ((u) & (1ul << 23)) ? 8 : \ + ((u) & (1ul << 22)) ? 9 : \ + ((u) & (1ul << 21)) ? 10 : \ + ((u) & (1ul << 20)) ? 11 : \ + ((u) & (1ul << 19)) ? 12 : \ + ((u) & (1ul << 18)) ? 13 : \ + ((u) & (1ul << 17)) ? 14 : \ + ((u) & (1ul << 16)) ? 15 : \ + ((u) & (1ul << 15)) ? 16 : \ + ((u) & (1ul << 14)) ? 17 : \ + ((u) & (1ul << 13)) ? 18 : \ + ((u) & (1ul << 12)) ? 19 : \ + ((u) & (1ul << 11)) ? 20 : \ + ((u) & (1ul << 10)) ? 21 : \ + ((u) & (1ul << 9)) ? 22 : \ + ((u) & (1ul << 8)) ? 23 : \ + ((u) & (1ul << 7)) ? 24 : \ + ((u) & (1ul << 6)) ? 25 : \ + ((u) & (1ul << 5)) ? 26 : \ + ((u) & (1ul << 4)) ? 27 : \ + ((u) & (1ul << 3)) ? 28 : \ + ((u) & (1ul << 2)) ? 29 : \ + ((u) & (1ul << 1)) ? 30 : \ + 31) +#endif +#endif + +/*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the trailing zero bits. + * + * \return The count of trailing zero bits in \a u. + */ +#ifndef ctz +#if (defined __GNUC__) || (defined __CC_ARM) +# define ctz(u) ((u) ? __builtin_ctz(u) : 32) +#else +# define ctz(u) ((u) & (1ul << 0) ? 0 : \ + (u) & (1ul << 1) ? 1 : \ + (u) & (1ul << 2) ? 2 : \ + (u) & (1ul << 3) ? 3 : \ + (u) & (1ul << 4) ? 4 : \ + (u) & (1ul << 5) ? 5 : \ + (u) & (1ul << 6) ? 6 : \ + (u) & (1ul << 7) ? 7 : \ + (u) & (1ul << 8) ? 8 : \ + (u) & (1ul << 9) ? 9 : \ + (u) & (1ul << 10) ? 10 : \ + (u) & (1ul << 11) ? 11 : \ + (u) & (1ul << 12) ? 12 : \ + (u) & (1ul << 13) ? 13 : \ + (u) & (1ul << 14) ? 14 : \ + (u) & (1ul << 15) ? 15 : \ + (u) & (1ul << 16) ? 16 : \ + (u) & (1ul << 17) ? 17 : \ + (u) & (1ul << 18) ? 18 : \ + (u) & (1ul << 19) ? 19 : \ + (u) & (1ul << 20) ? 20 : \ + (u) & (1ul << 21) ? 21 : \ + (u) & (1ul << 22) ? 22 : \ + (u) & (1ul << 23) ? 23 : \ + (u) & (1ul << 24) ? 24 : \ + (u) & (1ul << 25) ? 25 : \ + (u) & (1ul << 26) ? 26 : \ + (u) & (1ul << 27) ? 27 : \ + (u) & (1ul << 28) ? 28 : \ + (u) & (1ul << 29) ? 29 : \ + (u) & (1ul << 30) ? 30 : \ + (u) & (1ul << 31) ? 31 : \ + 32) +#endif +#endif + +//! @} + + +/*! \name Bit Reversing + */ +//! @{ + +/*! \brief Reverses the bits of \a u8. + * + * \param u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/*! \brief Reverses the bits of \a u16. + * + * \param u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) + +/*! \brief Reverses the bits of \a u32. + * + * \param u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#define bit_reverse32(u32) __RBIT(u32) + +/*! \brief Reverses the bits of \a u64. + * + * \param u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ + ((U64)bit_reverse32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Alignment + */ +//! @{ + +/*! \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) + +/*! \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) + +/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param lval Input/output lvalue. + * \param n Boundary. + * \param alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/*! \brief Aligns the number \a val with the upper \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) + +/*! \brief Aligns the number \a val with the lower \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n ) ( (val) & ~((n) - 1)) + +//! @} + +/*! \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + + +/*! \name MCU Endianism Handling + * ARM is MCU little endianism. + */ +//! @{ +#define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. +#define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. + +#define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. +#define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. +#define MSB0W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32. +#define MSB1W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32. +#define MSB2W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32. +#define MSB3W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32. +#define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. +#define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + +#define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. +#define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. +#define MSH0(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 1st rank of \a u64. +#define MSH1(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 2nd rank of \a u64. +#define MSH2(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 3rd rank of \a u64. +#define MSH3(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 4th rank of \a u64. +#define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. +#define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. +#define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. +#define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. +#define MSB0D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 1st rank of \a u64. +#define MSB1D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 2nd rank of \a u64. +#define MSB2D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 3rd rank of \a u64. +#define MSB3D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 4th rank of \a u64. +#define MSB4D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 5th rank of \a u64. +#define MSB5D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 6th rank of \a u64. +#define MSB6D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 7th rank of \a u64. +#define MSB7D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 8th rank of \a u64. +#define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. +#define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. +#define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. +#define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. +#define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. +#define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. +#define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. +#define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. + +#define BE16(x) swap16(x) +#define LE16(x) (x) + +#define le16_to_cpu(x) (x) +#define cpu_to_le16(x) (x) +#define LE16_TO_CPU(x) (x) +#define CPU_TO_LE16(x) (x) + +#define be16_to_cpu(x) swap16(x) +#define cpu_to_be16(x) swap16(x) +#define BE16_TO_CPU(x) swap16(x) +#define CPU_TO_BE16(x) swap16(x) + +#define le32_to_cpu(x) (x) +#define cpu_to_le32(x) (x) +#define LE32_TO_CPU(x) (x) +#define CPU_TO_LE32(x) (x) + +#define be32_to_cpu(x) swap32(x) +#define cpu_to_be32(x) swap32(x) +#define BE32_TO_CPU(x) swap32(x) +#define CPU_TO_BE32(x) swap32(x) +//! @} + + +/*! \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but GCC's + * __builtin_bswap_32 and __builtin_bswap_64 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + */ +//! @{ + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ + ((U16)(u16) << 8))) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ + ((U32)Swap16((U32)(u32)) << 16))) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ + ((U64)Swap32((U64)(u64)) << 32))) + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap16(u16) Swap16(u16) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap32(u32) ((U32)__builtin_bswap32((U32)(u32))) +#else +# define swap32(u32) Swap32(u32) +#endif + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap64(u64) ((U64)__builtin_bswap64((U64)(u64))) +#else +# define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ + ((U64)swap32((U64)(u64)) << 32))) +#endif + +//! @} + + +/*! \name Target Abstraction + */ +//! @{ + +#define _GLOBEXT_ extern //!< extern storage-class specifier. +#define _CONST_TYPE_ const //!< const type qualifier. +#define _MEM_TYPE_SLOW_ //!< Slow memory type. +#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. +#define _MEM_TYPE_FAST_ //!< Fast memory type. + +typedef U8 Byte; //!< 8-bit unsigned integer. + +#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. +#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. +#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. +#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. + +#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. +#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. +#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. +#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. +#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. +#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. + +//! @} + +/** + * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using + * integer arithmetic. + * + * \param a An integer + * \param b Another integer + * + * \return (\a a / \a b) rounded up to the nearest integer. + */ +#define div_ceil(a, b) (((a) + (b) - 1) / (b)) + +#endif // #ifndef __ASSEMBLY__ + + +#if defined(__ICCARM__) +#define SHORTENUM __packed +#elif defined(__GNUC__) +#define SHORTENUM __attribute__((packed)) +#endif + +/* No operation */ +#if defined(__ICCARM__) +#define nop() __no_operation() +#elif defined(__GNUC__) +#define nop() (__NOP()) +#endif + +#define FLASH_DECLARE(x) const x +#define FLASH_EXTERN(x) extern const x +#define PGM_READ_BYTE(x) *(x) +#define PGM_READ_WORD(x) *(x) +#define PGM_READ_DWORD(x) *(x) +#define MEMCPY_ENDIAN memcpy +#define PGM_READ_BLOCK(dst, src, len) memcpy((dst), (src), (len)) + +/*Defines the Flash Storage for the request and response of MAC*/ +#define CMD_ID_OCTET (0) + +/* Converting of values from CPU endian to little endian. */ +#define CPU_ENDIAN_TO_LE16(x) (x) +#define CPU_ENDIAN_TO_LE32(x) (x) +#define CPU_ENDIAN_TO_LE64(x) (x) + +/* Converting of values from little endian to CPU endian. */ +#define LE16_TO_CPU_ENDIAN(x) (x) +#define LE32_TO_CPU_ENDIAN(x) (x) +#define LE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from little endian to CPU endian. */ +#define CLE16_TO_CPU_ENDIAN(x) (x) +#define CLE32_TO_CPU_ENDIAN(x) (x) +#define CLE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from CPU endian to little endian. */ +#define CCPU_ENDIAN_TO_LE16(x) (x) +#define CCPU_ENDIAN_TO_LE32(x) (x) +#define CCPU_ENDIAN_TO_LE64(x) (x) + +#define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src)) +#define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src)) + +/** + * @brief Converts a 64-Bit value into a 8 Byte array + * + * @param[in] value 64-Bit value + * @param[out] data Pointer to the 8 Byte array to be updated with 64-Bit value + * @ingroup apiPalApi + */ +static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data) +{ + uint8_t val_index = 0; + + while (val_index < 8) + { + data[val_index++] = value & 0xFF; + value = value >> 8; + } +} + +/** + * @brief Converts a 16-Bit value into a 2 Byte array + * + * @param[in] value 16-Bit value + * @param[out] data Pointer to the 2 Byte array to be updated with 16-Bit value + * @ingroup apiPalApi + */ +static inline void convert_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_spec_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_16_bit_to_byte_address(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* + * @brief Converts a 2 Byte array into a 16-Bit value + * + * @param data Specifies the pointer to the 2 Byte array + * + * @return 16-Bit value + * @ingroup apiPalApi + */ +static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data) +{ + return (data[0] | ((uint16_t)data[1] << 8)); +} + +/* Converts a 8 Byte array into a 32-Bit value */ +static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) +{ + union + { + uint32_t u32; + uint8_t u8[8]; + }long_addr; + uint8_t index; + for (index = 0; index < 4; index++) + { + long_addr.u8[index] = *data++; + } + return long_addr.u32; +} + +/** + * @brief Converts a 8 Byte array into a 64-Bit value + * + * @param data Specifies the pointer to the 8 Byte array + * + * @return 64-Bit value + * @ingroup apiPalApi + */ +static inline uint64_t convert_byte_array_to_64_bit(uint8_t *data) +{ + union + { + uint64_t u64; + uint8_t u8[8]; + } long_addr; + + uint8_t val_index; + + for (val_index = 0; val_index < 8; val_index++) + { + long_addr.u8[val_index] = *data++; + } + + return long_addr.u64; +} +/** + * \} + */ + +#endif /* UTILS_COMPILER_H */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/conf_access.h b/Marlin/src/HAL/HAL_DUE/usb/conf_access.h new file mode 100644 index 0000000000..fdac1ab7e8 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_access.h @@ -0,0 +1,116 @@ +/** + * \file + * + * \brief Memory access control configuration file. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_ACCESS_H_ +#define _CONF_ACCESS_H_ + +#include "compiler.h" +#include "../../../inc/MarlinConfigPre.h" + +/*! \name Activation of Logical Unit Numbers + */ +//! @{ + +#define LUN_0 ENABLE //!< SD/MMC Card over MCI Slot 0. +#define LUN_1 DISABLE +#define LUN_2 DISABLE +#define LUN_3 DISABLE +#define LUN_4 DISABLE +#define LUN_5 DISABLE +#define LUN_6 DISABLE +#define LUN_7 DISABLE +#define LUN_USB DISABLE +//! @} + +/*! \name LUN 0 Definitions + */ +//! @{ +#define SD_MMC_SPI_MEM LUN_0 +#define LUN_ID_SD_MMC_SPI_MEM LUN_ID_0 +#define LUN_0_INCLUDE "sd_mmc_spi_mem.h" +#define Lun_0_test_unit_ready sd_mmc_spi_test_unit_ready +#define Lun_0_read_capacity sd_mmc_spi_read_capacity +#define Lun_0_unload sd_mmc_spi_unload +#define Lun_0_wr_protect sd_mmc_spi_wr_protect +#define Lun_0_removal sd_mmc_spi_removal +#define Lun_0_usb_read_10 sd_mmc_spi_usb_read_10 +#define Lun_0_usb_write_10 sd_mmc_spi_usb_write_10 +#define LUN_0_NAME "\"SD/MMC Card\"" +//! @} + + +/*! \name Actions Associated with Memory Accesses + * + * Write here the action to associate with each memory access. + * + * \warning Be careful not to waste time in order not to disturb the functions. + */ +//! @{ +#define memory_start_read_action(nb_sectors) +#define memory_stop_read_action() +#define memory_start_write_action(nb_sectors) +#define memory_stop_write_action() +//! @} + +/*! \name Activation of Interface Features + */ +//! @{ +#define ACCESS_USB true //!< MEM <-> USB interface. +#define ACCESS_MEM_TO_RAM false //!< MEM <-> RAM interface. +#define ACCESS_STREAM false //!< Streaming MEM <-> MEM interface. +#define ACCESS_STREAM_RECORD false //!< Streaming MEM <-> MEM interface in record mode. +#define ACCESS_MEM_TO_MEM false //!< MEM <-> MEM interface. +#define ACCESS_CODEC false //!< Codec interface. +//! @} + +/*! \name Specific Options for Access Control + */ +//! @{ +#define GLOBAL_WR_PROTECT false //!< Management of a global write protection. +//! @} + + +#endif // _CONF_ACCESS_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/conf_clock.h b/Marlin/src/HAL/HAL_DUE/usb/conf_clock.h new file mode 100644 index 0000000000..d0f68500ad --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_clock.h @@ -0,0 +1,100 @@ +/** + * \file + * + * \brief SAM3X clock configuration. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CONF_CLOCK_H_INCLUDED +#define CONF_CLOCK_H_INCLUDED + +// ===== System Clock (MCK) Source Options +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_XTAL +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_BYPASS +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_8M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_12M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_XTAL +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_BYPASS +#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_UPLLCK + +// ===== System Clock (MCK) Prescaler Options (Fmck = Fsys / (SYSCLK_PRES)) +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +#define CONFIG_SYSCLK_PRES SYSCLK_PRES_2 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_4 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_8 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_16 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_32 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_64 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_3 + +// ===== PLL0 (A) Options (Fpll = (Fclk * PLL_mul) / PLL_div) +// Use mul and div effective values here. +#define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL +#define CONFIG_PLL0_MUL 14 +#define CONFIG_PLL0_DIV 1 + +// ===== UPLL (UTMI) Hardware fixed at 480MHz. + +// ===== USB Clock Source Options (Fusb = FpllX / USB_div) +// Use div effective value here. +//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0 +#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL +#define CONFIG_USBCLK_DIV 1 + +// ===== Target frequency (System clock) +// - XTAL frequency: 12MHz +// - System clock source: PLLA +// - System clock prescaler: 2 (divided by 2) +// - PLLA source: XTAL +// - PLLA output: XTAL * 14 / 1 +// - System clock is: 12 * 14 / 1 /2 = 84MHz +// ===== Target frequency (USB Clock) +// - USB clock source: UPLL +// - USB clock divider: 1 (not divided) +// - UPLL frequency: 480MHz +// - USB clock: 480 / 1 = 480MHz + + +#endif /* CONF_CLOCK_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h new file mode 100644 index 0000000000..604fd2019b --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h @@ -0,0 +1,309 @@ +/** + * \file + * + * \brief USB configuration file + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_USB_H_ +#define _CONF_USB_H_ + +#undef UNUSED /* To avoid a macro clash as macros.h already defines it */ +#include "../../../core/macros.h" /* For ENABLED()/DISABLED() */ +#include "../../../../Configuration.h" /* For CUSTOM_MACHINE_NAME definition - We just need the name, no C++ allowed! */ +#include "compiler.h" + + +/** + * USB Device Configuration + * @{ + */ + +//! Device definition (mandatory) +#define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ +#define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ +#define USB_DEVICE_MAJOR_VERSION 1 +#define USB_DEVICE_MINOR_VERSION 0 +#define USB_DEVICE_POWER 100 // Consumption on Vbus line (mA) +#define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_BUS_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) + +//! USB Device string definitions (Optional) +#define USB_DEVICE_MANUFACTURE_NAME "marlinfw.org" +#ifdef CUSTOM_MACHINE_NAME + #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME +#else + #define USB_DEVICE_PRODUCT_NAME "3D Printer" +#endif +#define USB_DEVICE_SERIAL_NAME "123985739853" + +/** + * Device speeds support + * Low speed not supported by CDC and MSC + * @{ + */ + +//! To define a Low speed device +//#define USB_DEVICE_LOW_SPEED + +//! To define a Full speed device +//#define USB_DEVICE_FULL_SPEED + +//! To authorize the High speed +#ifndef USB_DEVICE_FULL_SPEED + #if (UC3A3||UC3A4) + #define USB_DEVICE_HS_SUPPORT + #elif (SAM3XA||SAM3U) + #define USB_DEVICE_HS_SUPPORT + #endif +#endif +//@} + + +/** + * USB Device Callbacks definitions (Optional) + * @{ + */ +#define UDC_VBUS_EVENT(b_vbus_high) +#define UDC_SOF_EVENT() +#define UDC_SUSPEND_EVENT() +#define UDC_RESUME_EVENT() +#define UDC_GET_EXTRA_STRING() usb_task_extra_string() +#define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests() +//@} + +#if ENABLED(SDSUPPORT) + /** + * USB Device low level configuration + * When only one interface is used, these configurations are defined by the class module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Control endpoint size + #define USB_DEVICE_EP_CTRL_SIZE 64 + + //! Two interfaces for this device (CDC COM + CDC DATA + MSC) + #define USB_DEVICE_NB_INTERFACE 3 + + //! 5 endpoints used by CDC and MSC interfaces + #if SAM3U + // (3 | USB_EP_DIR_IN) // CDC Notify endpoint + // (6 | USB_EP_DIR_IN) // CDC TX + // (5 | USB_EP_DIR_OUT) // CDC RX + // (1 | USB_EP_DIR_IN) // MSC IN + // (2 | USB_EP_DIR_OUT) // MSC OUT + # define USB_DEVICE_MAX_EP 6 + # if defined(USB_DEVICE_HS_SUPPORT) + // In HS mode, size of bulk endpoints are 512 + // If CDC and MSC endpoints all uses 2 banks, DPRAM is not enough: 4 bulk + // endpoints requires 4K bytes. So reduce the number of banks of CDC bulk + // endpoints to use less DPRAM. Keep MSC setting to keep MSC performance. + # define UDD_BULK_NB_BANK(ep) ((ep == 5 || ep== 6) ? 1 : 2) + #endif + #else + // (3 | USB_EP_DIR_IN) // CDC Notify endpoint + // (4 | USB_EP_DIR_IN) // CDC TX + // (5 | USB_EP_DIR_OUT) // CDC RX + // (1 | USB_EP_DIR_IN) // MSC IN + // (2 | USB_EP_DIR_OUT) // MSC OUT + # define USB_DEVICE_MAX_EP 5 + # if SAM3XA && defined(USB_DEVICE_HS_SUPPORT) + // In HS mode, size of bulk endpoints are 512 + // If CDC and MSC endpoints all uses 2 banks, DPRAM is not enough: 4 bulk + // endpoints requires 4K bytes. So reduce the number of banks of CDC bulk + // endpoints to use less DPRAM. Keep MSC setting to keep MSC performance. + # define UDD_BULK_NB_BANK(ep) ((ep == 4 || ep== 5) ? 1 : 2) + # endif + #endif +#endif + +//@} + +//@} + + +/** + * USB Interface Configuration + * @{ + */ +/** + * Configuration of CDC interface + * @{ + */ + +//! Define one USB communication ports +#define UDI_CDC_PORT_NB 1 + +//! Interface callback definition +#define UDI_CDC_ENABLE_EXT(port) usb_task_cdc_enable(port) +#define UDI_CDC_DISABLE_EXT(port) usb_task_cdc_disable(port) +#define UDI_CDC_RX_NOTIFY(port) usb_task_cdc_rx_notify(port) +#define UDI_CDC_TX_EMPTY_NOTIFY(port) +#define UDI_CDC_SET_CODING_EXT(port,cfg) usb_task_cdc_config(port,cfg) +#define UDI_CDC_SET_DTR_EXT(port,set) usb_task_cdc_set_dtr(port,set) +#define UDI_CDC_SET_RTS_EXT(port,set) + +//! Define it when the transfer CDC Device to Host is a low rate (<512000 bauds) +//! to reduce CDC buffers size +//#define UDI_CDC_LOW_RATE + +//! Default configuration of communication port +#define UDI_CDC_DEFAULT_RATE 115200 +#define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 +#define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE +#define UDI_CDC_DEFAULT_DATABITS 8 + +//! Enable id string of interface to add an extra USB string +#define UDI_CDC_IAD_STRING_ID 4 + +#if ENABLED(SDSUPPORT) + /** + * USB CDC low level configuration + * In standalone these configurations are defined by the CDC module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Endpoint numbers definition + #if SAM3U + # define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + # define UDI_CDC_DATA_EP_IN_0 (6 | USB_EP_DIR_IN) // TX + # define UDI_CDC_DATA_EP_OUT_0 (5 | USB_EP_DIR_OUT)// RX + #else + # define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + # define UDI_CDC_DATA_EP_IN_0 (4 | USB_EP_DIR_IN) // TX + # define UDI_CDC_DATA_EP_OUT_0 (5 | USB_EP_DIR_OUT)// RX + #endif + + //! Interface numbers + #define UDI_CDC_COMM_IFACE_NUMBER_0 0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 1 + + //@} + //@} + + + /** + * Configuration of MSC interface + * @{ + */ + //! Vendor name and Product version of MSC interface + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'M', 'A', 'R', 'L', 'I', 'N', '3', 'D' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' + + //! Interface callback definition + #define UDI_MSC_ENABLE_EXT() usb_task_msc_enable() + #define UDI_MSC_DISABLE_EXT() usb_task_msc_disable() + + //! Enable id string of interface to add an extra USB string + #define UDI_MSC_STRING_ID 5 + + /** + * USB MSC low level configuration + * In standalone these configurations are defined by the MSC module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Endpoint numbers definition + #define UDI_MSC_EP_IN (1 | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (2 | USB_EP_DIR_OUT) + + //! Interface number + #define UDI_MSC_IFACE_NUMBER 2 + //@} + //@} + + //@} + + + /** + * Description of Composite Device + * @{ + */ + //! USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + udi_msc_desc_t udi_msc + + //! USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + .udi_msc = UDI_MSC_DESC_FS + + //! USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + .udi_msc = UDI_MSC_DESC_HS + + //! USB Interface APIs + #define UDI_COMPOSITE_API \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + &udi_api_msc + //@} + + /** + * USB Device Driver Configuration + * @{ + */ + //@} + + //! The includes of classes and other headers must be done at the end of this file to avoid compile error + #include "udi_cdc.h" + #include "udi_msc.h" +#else + #include "udi_cdc_conf.h" +#endif + +#include "usb_task.h" + +#endif // _CONF_USB_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c new file mode 100644 index 0000000000..0ec14e0b8f --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c @@ -0,0 +1,647 @@ +/***************************************************************************** + * + * \file + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +//_____ I N C L U D E S ____________________________________________________ + +#include "compiler.h" +#include "preprocessor.h" +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "semphr.h" +#endif +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#ifdef FREERTOS_USED + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +#define Ctrl_access_lock() ctrl_access_lock() + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) + +//! @} + +//! Handle to the semaphore protecting accesses to LUNs. +static xSemaphoreHandle ctrl_access_semphr = NULL; + +#else + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +#define Ctrl_access_lock() true + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() + +//! @} + +#endif // FREERTOS_USED + + +#if MAX_LUN + +/*! \brief Initializes an entry of the LUN descriptor table. + * + * \param lun Logical Unit Number. + * + * \return LUN descriptor table entry initializer. + */ +#if ACCESS_USB == true && ACCESS_MEM_TO_RAM == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_USB == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_MEM_TO_RAM == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#else +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#endif + +//! LUN descriptor table. +static const struct +{ + Ctrl_status (*test_unit_ready)(void); + Ctrl_status (*read_capacity)(U32 *); + bool (*unload)(bool); + bool (*wr_protect)(void); + bool (*removal)(void); +#if ACCESS_USB == true + Ctrl_status (*usb_read_10)(U32, U16); + Ctrl_status (*usb_write_10)(U32, U16); +#endif +#if ACCESS_MEM_TO_RAM == true + Ctrl_status (*mem_2_ram)(U32, void *); + Ctrl_status (*ram_2_mem)(U32, const void *); +#endif + const char *name; +} lun_desc[MAX_LUN] = +{ +#if LUN_0 == ENABLE +# ifndef Lun_0_unload +# define Lun_0_unload NULL +# endif + Lun_desc_entry(0), +#endif +#if LUN_1 == ENABLE +# ifndef Lun_1_unload +# define Lun_1_unload NULL +# endif + Lun_desc_entry(1), +#endif +#if LUN_2 == ENABLE +# ifndef Lun_2_unload +# define Lun_2_unload NULL +# endif + Lun_desc_entry(2), +#endif +#if LUN_3 == ENABLE +# ifndef Lun_3_unload +# define Lun_3_unload NULL +# endif + Lun_desc_entry(3), +#endif +#if LUN_4 == ENABLE +# ifndef Lun_4_unload +# define Lun_4_unload NULL +# endif + Lun_desc_entry(4), +#endif +#if LUN_5 == ENABLE +# ifndef Lun_5_unload +# define Lun_5_unload NULL +# endif + Lun_desc_entry(5), +#endif +#if LUN_6 == ENABLE +# ifndef Lun_6_unload +# define Lun_6_unload NULL +# endif + Lun_desc_entry(6), +#endif +#if LUN_7 == ENABLE +# ifndef Lun_7_unload +# define Lun_7_unload NULL +# endif + Lun_desc_entry(7) +#endif +}; + +#endif + + +#if GLOBAL_WR_PROTECT == true +bool g_wr_protect; +#endif + + +/*! \name Control Interface + */ +//! @{ + + +#ifdef FREERTOS_USED + +bool ctrl_access_init(void) +{ + // If the handle to the protecting semaphore is not valid, + if (!ctrl_access_semphr) + { + // try to create the semaphore. + vSemaphoreCreateBinary(ctrl_access_semphr); + + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return false; + } + + return true; +} + + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +static bool ctrl_access_lock(void) +{ + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return false; + + // Wait for the semaphore. + while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); + + return true; +} + +#endif // FREERTOS_USED + + +U8 get_nb_lun(void) +{ +#if MEM_USB == ENABLE +# ifndef Lun_usb_get_lun +# define Lun_usb_get_lun() host_get_lun() +# endif + U8 nb_lun; + + if (!Ctrl_access_lock()) return MAX_LUN; + + nb_lun = MAX_LUN + Lun_usb_get_lun(); + + Ctrl_access_unlock(); + + return nb_lun; +#else + return MAX_LUN; +#endif +} + + +U8 get_cur_lun(void) +{ + return LUN_ID_0; +} + + +Ctrl_status mem_test_unit_ready(U8 lun) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : +#endif +#if LUN_USB == ENABLE + Lun_usb_test_unit_ready(lun - LUN_ID_USB); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +U8 mem_sector_size(U8 lun) +{ + U8 sector_size; + + if (!Ctrl_access_lock()) return 0; + + sector_size = +#if MAX_LUN + (lun < MAX_LUN) ? 1 : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_sector_size(lun - LUN_ID_USB); +#else + 0; +#endif + + Ctrl_access_unlock(); + + return sector_size; +} + + +bool mem_unload(U8 lun, bool unload) +{ + bool unloaded; +#if !MAX_LUN || !defined(Lun_usb_unload) + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return false; + + unloaded = +#if MAX_LUN + (lun < MAX_LUN) ? + (lun_desc[lun].unload ? + lun_desc[lun].unload(unload) : !unload) : +#endif +#if LUN_USB == ENABLE +# if defined(Lun_usb_unload) + Lun_usb_unload(lun - LUN_ID_USB, unload); +# else + !unload; /* Can not unload: load success, unload fail */ +# endif +#else + false; /* No mem, unload/load fail */ +#endif + + Ctrl_access_unlock(); + + return unloaded; +} + +bool mem_wr_protect(U8 lun) +{ + bool wr_protect; + + if (!Ctrl_access_lock()) return true; + + wr_protect = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : +#endif +#if LUN_USB == ENABLE + Lun_usb_wr_protect(lun - LUN_ID_USB); +#else + true; +#endif + + Ctrl_access_unlock(); + + return wr_protect; +} + + +bool mem_removal(U8 lun) +{ + bool removal; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return true; + + removal = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].removal() : +#endif +#if LUN_USB == ENABLE + Lun_usb_removal(); +#else + true; +#endif + + Ctrl_access_unlock(); + + return removal; +} + + +const char *mem_name(U8 lun) +{ +#if MAX_LUN==0 + UNUSED(lun); +#endif + return +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].name : +#endif +#if LUN_USB == ENABLE + LUN_USB_NAME; +#else + NULL; +#endif +} + + +//! @} + + +#if ACCESS_USB == true + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_USB == true + + +#if ACCESS_MEM_TO_RAM == true + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) +{ + Ctrl_status status; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_mem_2_ram(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) +{ + Ctrl_status status; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_ram_2_mem(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == true + + +#if ACCESS_STREAM == true + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + + + #if ACCESS_MEM_TO_MEM == true + +#include "fat.h" + +Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) +{ + COMPILER_ALIGNED(4) + static U8 sector_buf[FS_512B]; + Ctrl_status status = CTRL_GOOD; + + while (nb_sector--) + { + if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; + if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; + } + + return status; +} + + #endif // ACCESS_MEM_TO_MEM == true + + +Ctrl_status stream_state(U8 id) +{ + UNUSED(id); + return CTRL_GOOD; +} + + +U16 stream_stop(U8 id) +{ + UNUSED(id); + return 0; +} + + +//! @} + +#endif // ACCESS_STREAM + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h new file mode 100644 index 0000000000..af6c8ceb96 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h @@ -0,0 +1,402 @@ +/***************************************************************************** + * + * \file + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _CTRL_ACCESS_H_ +#define _CTRL_ACCESS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup group_common_services_storage_ctrl_access Memory Control Access + * + * Common abstraction layer for memory interfaces. It provides interfaces between: + * Memory and USB, Memory and RAM, Memory and Memory. Common API for XMEGA and UC3. + * + * \{ + */ + +#include "compiler.h" +#include "conf_access.h" + +#ifndef SECTOR_SIZE +#define SECTOR_SIZE 512 +#endif + +//! Status returned by CTRL_ACCESS interfaces. +typedef enum +{ + CTRL_GOOD = PASS, //!< Success, memory ready. + CTRL_FAIL = FAIL, //!< An error occurred. + CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. + CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. +} Ctrl_status; + + +// FYI: Each Logical Unit Number (LUN) corresponds to a memory. + +// Check LUN defines. +#ifndef LUN_0 + #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_1 + #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_2 + #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_3 + #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_4 + #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_5 + #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_6 + #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_7 + #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_USB + #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h +#endif + +/*! \name LUN IDs + */ +//! @{ +#define LUN_ID_0 (0) //!< First static LUN. +#define LUN_ID_1 (LUN_ID_0 + LUN_0) +#define LUN_ID_2 (LUN_ID_1 + LUN_1) +#define LUN_ID_3 (LUN_ID_2 + LUN_2) +#define LUN_ID_4 (LUN_ID_3 + LUN_3) +#define LUN_ID_5 (LUN_ID_4 + LUN_4) +#define LUN_ID_6 (LUN_ID_5 + LUN_5) +#define LUN_ID_7 (LUN_ID_6 + LUN_6) +#define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. +#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). +//! @} + + +// Include LUN header files. +#if LUN_0 == ENABLE + #include LUN_0_INCLUDE +#endif +#if LUN_1 == ENABLE + #include LUN_1_INCLUDE +#endif +#if LUN_2 == ENABLE + #include LUN_2_INCLUDE +#endif +#if LUN_3 == ENABLE + #include LUN_3_INCLUDE +#endif +#if LUN_4 == ENABLE + #include LUN_4_INCLUDE +#endif +#if LUN_5 == ENABLE + #include LUN_5_INCLUDE +#endif +#if LUN_6 == ENABLE + #include LUN_6_INCLUDE +#endif +#if LUN_7 == ENABLE + #include LUN_7_INCLUDE +#endif +#if LUN_USB == ENABLE + #include LUN_USB_INCLUDE +#endif + + +// Check the configuration of write protection in conf_access.h. +#ifndef GLOBAL_WR_PROTECT + #error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h +#endif + + +#if GLOBAL_WR_PROTECT == true + +//! Write protect. +extern bool g_wr_protect; + +#endif + + +/*! \name Control Interface + */ +//! @{ + +#ifdef FREERTOS_USED + +/*! \brief Initializes the LUN access locker. + * + * \return \c true if the locker was successfully initialized, else \c false. + */ +extern bool ctrl_access_init(void); + +#endif // FREERTOS_USED + +/*! \brief Returns the number of LUNs. + * + * \return Number of LUNs in the system. + */ +extern U8 get_nb_lun(void); + +/*! \brief Returns the current LUN. + * + * \return Current LUN. + * + * \todo Implement. + */ +extern U8 get_cur_lun(void); + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \param lun Logical Unit Number. + * + * \return Status. + */ +extern Ctrl_status mem_test_unit_ready(U8 lun); + +/*! \brief Returns the address of the last valid sector (512 bytes) in the + * memory. + * + * \param lun Logical Unit Number. + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); + +/*! \brief Returns the size of the physical sector. + * + * \param lun Logical Unit Number. + * + * \return Sector size (unit: 512 bytes). + */ +extern U8 mem_sector_size(U8 lun); + +/*! \brief Unload/load the medium. + * + * \param lun Logical Unit Number. + * \param unload \c true to unload the medium, \c false to load the medium. + * + * \return \c true if unload/load success, else \c false. + */ +extern bool mem_unload(U8 lun, bool unload); + +/*! \brief Returns the write-protection state of the memory. + * + * \param lun Logical Unit Number. + * + * \return \c true if the memory is write-protected, else \c false. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern bool mem_wr_protect(U8 lun); + +/*! \brief Tells whether the memory is removable. + * + * \param lun Logical Unit Number. + * + * \return \c true if the memory is removable, else \c false. + */ +extern bool mem_removal(U8 lun); + +/*! \brief Returns a pointer to the LUN name. + * + * \param lun Logical Unit Number. + * + * \return Pointer to the LUN name string. + */ +extern const char *mem_name(U8 lun); + +//! @} + + +#if ACCESS_USB == true + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Transfers data from the memory to USB. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); + +/*! \brief Transfers data from USB to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); + +//! @} + +#endif // ACCESS_USB == true + + +#if ACCESS_MEM_TO_RAM == true + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); + +//! @} + +#endif // ACCESS_MEM_TO_RAM == true + + +#if ACCESS_STREAM == true + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + +//! Erroneous streaming data transfer ID. +#define ID_STREAM_ERR 0xFF + + #if ACCESS_MEM_TO_MEM == true + +/*! \brief Copies data from one memory to another. + * + * \param src_lun Source Logical Unit Number. + * \param src_addr Source address of first memory sector to read. + * \param dest_lun Destination Logical Unit Number. + * \param dest_addr Destination address of first memory sector to write. + * \param nb_sector Number of sectors to copy. + * + * \return Status. + */ +extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); + + #endif // ACCESS_MEM_TO_MEM == true + +/*! \brief Returns the state of a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Status. + * + * \todo Implement. + */ +extern Ctrl_status stream_state(U8 id); + +/*! \brief Stops a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Number of remaining sectors. + * + * \todo Implement. + */ +extern U16 stream_stop(U8 id); + +//! @} + +#endif // ACCESS_STREAM == true + +/** + * \} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _CTRL_ACCESS_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/genclk.h b/Marlin/src/HAL/HAL_DUE/usb/genclk.h new file mode 100644 index 0000000000..895aba0352 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/genclk.h @@ -0,0 +1,278 @@ +/** + * \file + * + * \brief Chip-specific generic clock management. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_GENCLK_H_INCLUDED +#define CHIP_GENCLK_H_INCLUDED + +#include +#include + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup genclk_group + * @{ + */ + +//! \name Programmable Clock Identifiers (PCK) +//@{ +#define GENCLK_PCK_0 0 //!< PCK0 ID +#define GENCLK_PCK_1 1 //!< PCK1 ID +#define GENCLK_PCK_2 2 //!< PCK2 ID +//@} + +//! \name Programmable Clock Sources (PCK) +//@{ + +enum genclk_source { + GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock + GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock + GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock + GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock +}; + +//@} + +//! \name Programmable Clock Prescalers (PCK) +//@{ + +enum genclk_divider { + GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1 + GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2 + GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4 + GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8 + GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16 + GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32 + GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64 +}; + +//@} + +struct genclk_config { + uint32_t ctrl; +}; + +static inline void genclk_config_defaults(struct genclk_config *p_cfg, + uint32_t ul_id) +{ + ul_id = ul_id; + p_cfg->ctrl = 0; +} + +static inline void genclk_config_read(struct genclk_config *p_cfg, + uint32_t ul_id) +{ + p_cfg->ctrl = PMC->PMC_PCK[ul_id]; +} + +static inline void genclk_config_write(const struct genclk_config *p_cfg, + uint32_t ul_id) +{ + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; +} + +//! \name Programmable Clock Source and Prescaler configuration +//@{ + +static inline void genclk_config_set_source(struct genclk_config *p_cfg, + enum genclk_source e_src) +{ + p_cfg->ctrl &= (~PMC_PCK_CSS_Msk); + + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + case GENCLK_PCK_SRC_SLCK_XTAL: + case GENCLK_PCK_SRC_SLCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK); + break; + + case GENCLK_PCK_SRC_MAINCK_4M_RC: + case GENCLK_PCK_SRC_MAINCK_8M_RC: + case GENCLK_PCK_SRC_MAINCK_12M_RC: + case GENCLK_PCK_SRC_MAINCK_XTAL: + case GENCLK_PCK_SRC_MAINCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK); + break; + + case GENCLK_PCK_SRC_PLLACK: + p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK); + break; + + case GENCLK_PCK_SRC_PLLBCK: + p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK); + break; + + case GENCLK_PCK_SRC_MCK: + p_cfg->ctrl |= (PMC_PCK_CSS_MCK); + break; + } +} + +static inline void genclk_config_set_divider(struct genclk_config *p_cfg, + uint32_t e_divider) +{ + p_cfg->ctrl &= ~PMC_PCK_PRES_Msk; + p_cfg->ctrl |= e_divider; +} + +//@} + +static inline void genclk_enable(const struct genclk_config *p_cfg, + uint32_t ul_id) +{ + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; + pmc_enable_pck(ul_id); +} + +static inline void genclk_disable(uint32_t ul_id) +{ + pmc_disable_pck(ul_id); +} + +static inline void genclk_enable_source(enum genclk_source e_src) +{ + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + if (!osc_is_ready(OSC_SLCK_32K_RC)) { + osc_enable(OSC_SLCK_32K_RC); + osc_wait_ready(OSC_SLCK_32K_RC); + } + break; + + case GENCLK_PCK_SRC_SLCK_XTAL: + if (!osc_is_ready(OSC_SLCK_32K_XTAL)) { + osc_enable(OSC_SLCK_32K_XTAL); + osc_wait_ready(OSC_SLCK_32K_XTAL); + } + break; + + case GENCLK_PCK_SRC_SLCK_BYPASS: + if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) { + osc_enable(OSC_SLCK_32K_BYPASS); + osc_wait_ready(OSC_SLCK_32K_BYPASS); + } + break; + + case GENCLK_PCK_SRC_MAINCK_4M_RC: + if (!osc_is_ready(OSC_MAINCK_4M_RC)) { + osc_enable(OSC_MAINCK_4M_RC); + osc_wait_ready(OSC_MAINCK_4M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_8M_RC: + if (!osc_is_ready(OSC_MAINCK_8M_RC)) { + osc_enable(OSC_MAINCK_8M_RC); + osc_wait_ready(OSC_MAINCK_8M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_12M_RC: + if (!osc_is_ready(OSC_MAINCK_12M_RC)) { + osc_enable(OSC_MAINCK_12M_RC); + osc_wait_ready(OSC_MAINCK_12M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_XTAL: + if (!osc_is_ready(OSC_MAINCK_XTAL)) { + osc_enable(OSC_MAINCK_XTAL); + osc_wait_ready(OSC_MAINCK_XTAL); + } + break; + + case GENCLK_PCK_SRC_MAINCK_BYPASS: + if (!osc_is_ready(OSC_MAINCK_BYPASS)) { + osc_enable(OSC_MAINCK_BYPASS); + osc_wait_ready(OSC_MAINCK_BYPASS); + } + break; + +#ifdef CONFIG_PLL0_SOURCE + case GENCLK_PCK_SRC_PLLACK: + pll_enable_config_defaults(0); + break; +#endif + +#ifdef CONFIG_PLL1_SOURCE + case GENCLK_PCK_SRC_PLLBCK: + pll_enable_config_defaults(1); + break; +#endif + + case GENCLK_PCK_SRC_MCK: + break; + + default: + Assert(false); + break; + } +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_GENCLK_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/mrepeat.h b/Marlin/src/HAL/HAL_DUE/usb/mrepeat.h new file mode 100644 index 0000000000..5a2017be99 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/mrepeat.h @@ -0,0 +1,339 @@ +/** + * \file + * + * \brief Preprocessor macro repeating utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _MREPEAT_H_ +#define _MREPEAT_H_ + +/** + * \defgroup group_sam_utils_mrepeat Preprocessor - Macro Repeat + * + * \ingroup group_sam_utils + * + * \{ + */ + +#include "preprocessor.h" + + +//! Maximal number of repetitions supported by MREPEAT. +#define MREPEAT_LIMIT 256 + +/*! \brief Macro repeat. + * + * This macro represents a horizontal repetition construct. + * + * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. + * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with + * the current repetition number and the auxiliary data argument. + * \param data Auxiliary data passed to macro. + * + * \return macro(0, data) macro(1, data) ... macro(count - 1, data) + */ +#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) + +#define MREPEAT0( macro, data) +#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) +#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) +#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) +#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) +#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) +#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) +#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) +#define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) +#define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) +#define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) +#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) +#define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) +#define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) +#define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) +#define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) +#define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) +#define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) +#define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) +#define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) +#define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) +#define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) +#define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) +#define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) +#define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) +#define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) +#define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) +#define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) +#define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) +#define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) +#define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) +#define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) +#define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) +#define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) +#define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) +#define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) +#define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) +#define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) +#define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) +#define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) +#define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) +#define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) +#define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) +#define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) +#define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) +#define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) +#define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) +#define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) +#define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) +#define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) +#define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) +#define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) +#define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) +#define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) +#define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) +#define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) +#define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) +#define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) +#define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) +#define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) +#define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) +#define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) +#define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) +#define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) +#define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) +#define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) +#define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) +#define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) +#define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) +#define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) +#define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) +#define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) +#define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) +#define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) +#define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) +#define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) +#define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) +#define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) +#define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) +#define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) +#define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) +#define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) +#define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) +#define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) +#define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) +#define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) +#define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) +#define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) +#define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) +#define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) +#define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) +#define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) +#define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) +#define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) +#define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) +#define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) +#define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) +#define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) +#define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) +#define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) +#define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) +#define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) +#define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) +#define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) +#define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) +#define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) +#define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) +#define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) +#define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) +#define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) +#define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) +#define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) +#define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) +#define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) +#define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) +#define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) +#define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) +#define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) +#define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) +#define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) +#define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) +#define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) +#define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) +#define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) +#define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) +#define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) +#define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) +#define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) +#define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) +#define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) +#define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) +#define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) +#define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) +#define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) +#define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) +#define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) +#define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) +#define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) +#define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) +#define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) +#define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) +#define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) +#define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) +#define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) +#define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) +#define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) +#define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) +#define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) +#define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) +#define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) +#define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) +#define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) +#define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) +#define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) +#define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) +#define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) +#define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) +#define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) +#define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) +#define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) +#define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) +#define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) +#define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) +#define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) +#define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) +#define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) +#define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) +#define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) +#define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) +#define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) +#define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) +#define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) +#define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) +#define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) +#define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) +#define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) +#define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) +#define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) +#define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) +#define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) +#define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) +#define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) +#define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) +#define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) +#define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) +#define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) +#define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) +#define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) +#define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) +#define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) +#define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) +#define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) +#define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) +#define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) +#define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) +#define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) +#define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) +#define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) +#define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) +#define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) +#define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) +#define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) +#define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) +#define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) +#define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) +#define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) +#define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) +#define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) +#define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) +#define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) +#define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) +#define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) +#define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) +#define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) +#define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) +#define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) +#define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) +#define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) +#define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) +#define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) +#define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) +#define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) +#define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) +#define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) +#define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) +#define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) +#define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) +#define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) +#define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) +#define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) +#define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) +#define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) +#define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) +#define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) +#define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) +#define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) +#define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) +#define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) +#define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) +#define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) +#define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) +#define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) +#define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) +#define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) +#define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) +#define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) +#define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) +#define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) +#define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) +#define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) +#define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) +#define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) +#define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) +#define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) +#define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) +#define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) +#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) + +/** + * \} + */ + +#endif // _MREPEAT_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/osc.h b/Marlin/src/HAL/HAL_DUE/usb/osc.h new file mode 100644 index 0000000000..fe09d6fd3e --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/osc.h @@ -0,0 +1,261 @@ +/** + * \file + * + * \brief Chip-specific oscillator management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_OSC_H_INCLUDED +#define CHIP_OSC_H_INCLUDED + +#include "compiler.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/* + * Below BOARD_XXX macros are related to the specific board, and + * should be defined by the board code, otherwise default value are used. + */ +#if !defined(BOARD_FREQ_SLCK_XTAL) +# warning The board slow clock xtal frequency has not been defined. +# define BOARD_FREQ_SLCK_XTAL (32768UL) +#endif + +#if !defined(BOARD_FREQ_SLCK_BYPASS) +# warning The board slow clock bypass frequency has not been defined. +# define BOARD_FREQ_SLCK_BYPASS (32768UL) +#endif + +#if !defined(BOARD_FREQ_MAINCK_XTAL) +# warning The board main clock xtal frequency has not been defined. +# define BOARD_FREQ_MAINCK_XTAL (12000000UL) +#endif + +#if !defined(BOARD_FREQ_MAINCK_BYPASS) +# warning The board main clock bypass frequency has not been defined. +# define BOARD_FREQ_MAINCK_BYPASS (12000000UL) +#endif + +#if !defined(BOARD_OSC_STARTUP_US) +# warning The board main clock xtal startup time has not been defined. +# define BOARD_OSC_STARTUP_US (15625UL) +#endif + +/** + * \weakgroup osc_group + * @{ + */ + +//! \name Oscillator identifiers +//@{ +#define OSC_SLCK_32K_RC 0 //!< Internal 32kHz RC oscillator. +#define OSC_SLCK_32K_XTAL 1 //!< External 32kHz crystal oscillator. +#define OSC_SLCK_32K_BYPASS 2 //!< External 32kHz bypass oscillator. +#define OSC_MAINCK_4M_RC 3 //!< Internal 4MHz RC oscillator. +#define OSC_MAINCK_8M_RC 4 //!< Internal 8MHz RC oscillator. +#define OSC_MAINCK_12M_RC 5 //!< Internal 12MHz RC oscillator. +#define OSC_MAINCK_XTAL 6 //!< External crystal oscillator. +#define OSC_MAINCK_BYPASS 7 //!< External bypass oscillator. +//@} + +//! \name Oscillator clock speed in hertz +//@{ +#define OSC_SLCK_32K_RC_HZ CHIP_FREQ_SLCK_RC //!< Internal 32kHz RC oscillator. +#define OSC_SLCK_32K_XTAL_HZ BOARD_FREQ_SLCK_XTAL //!< External 32kHz crystal oscillator. +#define OSC_SLCK_32K_BYPASS_HZ BOARD_FREQ_SLCK_BYPASS //!< External 32kHz bypass oscillator. +#define OSC_MAINCK_4M_RC_HZ CHIP_FREQ_MAINCK_RC_4MHZ //!< Internal 4MHz RC oscillator. +#define OSC_MAINCK_8M_RC_HZ CHIP_FREQ_MAINCK_RC_8MHZ //!< Internal 8MHz RC oscillator. +#define OSC_MAINCK_12M_RC_HZ CHIP_FREQ_MAINCK_RC_12MHZ //!< Internal 12MHz RC oscillator. +#define OSC_MAINCK_XTAL_HZ BOARD_FREQ_MAINCK_XTAL //!< External crystal oscillator. +#define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator. +//@} + +static inline void osc_enable(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + break; + + case OSC_SLCK_32K_XTAL: + pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); + break; + + case OSC_SLCK_32K_BYPASS: + pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS); + break; + + + case OSC_MAINCK_4M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); + break; + + case OSC_MAINCK_8M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); + break; + + case OSC_MAINCK_12M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); + break; + + + case OSC_MAINCK_XTAL: + pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; + + case OSC_MAINCK_BYPASS: + pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; + } +} + +static inline void osc_disable(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + break; + + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + pmc_osc_disable_fastrc(); + break; + + case OSC_MAINCK_XTAL: + pmc_osc_disable_xtal(PMC_OSC_XTAL); + break; + + case OSC_MAINCK_BYPASS: + pmc_osc_disable_xtal(PMC_OSC_BYPASS); + break; + } +} + +static inline bool osc_is_ready(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + return 1; + + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + return pmc_osc_is_ready_32kxtal(); + + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + case OSC_MAINCK_XTAL: + case OSC_MAINCK_BYPASS: + return pmc_osc_is_ready_mainck(); + } + + return 0; +} + +static inline uint32_t osc_get_rate(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + return OSC_SLCK_32K_RC_HZ; + + case OSC_SLCK_32K_XTAL: + return BOARD_FREQ_SLCK_XTAL; + + case OSC_SLCK_32K_BYPASS: + return BOARD_FREQ_SLCK_BYPASS; + + case OSC_MAINCK_4M_RC: + return OSC_MAINCK_4M_RC_HZ; + + case OSC_MAINCK_8M_RC: + return OSC_MAINCK_8M_RC_HZ; + + case OSC_MAINCK_12M_RC: + return OSC_MAINCK_12M_RC_HZ; + + case OSC_MAINCK_XTAL: + return BOARD_FREQ_MAINCK_XTAL; + + case OSC_MAINCK_BYPASS: + return BOARD_FREQ_MAINCK_BYPASS; + } + + return 0; +} + +/** + * \brief Wait until the oscillator identified by \a id is ready + * + * This function will busy-wait for the oscillator identified by \a id + * to become stable and ready to use as a clock source. + * + * \param id A number identifying the oscillator to wait for. + */ +static inline void osc_wait_ready(uint8_t id) +{ + while (!osc_is_ready(id)) { + /* Do nothing */ + } +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_OSC_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/pll.h b/Marlin/src/HAL/HAL_DUE/usb/pll.h new file mode 100644 index 0000000000..d3d2174870 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/pll.h @@ -0,0 +1,288 @@ +/** + * \file + * + * \brief Chip-specific PLL definitions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_PLL_H_INCLUDED +#define CHIP_PLL_H_INCLUDED + +#include "osc.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup pll_group + * @{ + */ + +#define PLL_OUTPUT_MIN_HZ 84000000 +#define PLL_OUTPUT_MAX_HZ 192000000 + +#define PLL_INPUT_MIN_HZ 8000000 +#define PLL_INPUT_MAX_HZ 16000000 + +#define NR_PLLS 2 +#define PLLA_ID 0 +#define UPLL_ID 1 //!< USB UTMI PLL. + +#define PLL_UPLL_HZ 480000000 + +#define PLL_COUNT 0x3FU + +enum pll_source { + PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator. + PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator. + PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator. + PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator. + PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator. + PLL_NR_SOURCES, //!< Number of PLL sources. +}; + +struct pll_config { + uint32_t ctrl; +}; + +#define pll_get_default_rate(pll_id) \ + ((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \ + * CONFIG_PLL##pll_id##_MUL) \ + / CONFIG_PLL##pll_id##_DIV) + +/* Force UTMI PLL parameters (Hardware defined) */ +#ifdef CONFIG_PLL1_SOURCE +# undef CONFIG_PLL1_SOURCE +#endif +#ifdef CONFIG_PLL1_MUL +# undef CONFIG_PLL1_MUL +#endif +#ifdef CONFIG_PLL1_DIV +# undef CONFIG_PLL1_DIV +#endif +#define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL +#define CONFIG_PLL1_MUL 0 +#define CONFIG_PLL1_DIV 0 + +/** + * \note The SAM3X PLL hardware interprets mul as mul+1. For readability the hardware mul+1 + * is hidden in this implementation. Use mul as mul effective value. + */ +static inline void pll_config_init(struct pll_config *p_cfg, + enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) +{ + uint32_t vco_hz; + + Assert(e_src < PLL_NR_SOURCES); + + if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */ + p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT); + } else { /* PLLA */ + /* Calculate internal VCO frequency */ + vco_hz = osc_get_rate(e_src) / ul_div; + Assert(vco_hz >= PLL_INPUT_MIN_HZ); + Assert(vco_hz <= PLL_INPUT_MAX_HZ); + + vco_hz *= ul_mul; + Assert(vco_hz >= PLL_OUTPUT_MIN_HZ); + Assert(vco_hz <= PLL_OUTPUT_MAX_HZ); + + /* PMC hardware will automatically make it mul+1 */ + p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT); + } +} + +#define pll_config_defaults(cfg, pll_id) \ + pll_config_init(cfg, \ + CONFIG_PLL##pll_id##_SOURCE, \ + CONFIG_PLL##pll_id##_DIV, \ + CONFIG_PLL##pll_id##_MUL) + +static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + p_cfg->ctrl = PMC->CKGR_PLLAR; + } else { + p_cfg->ctrl = PMC->CKGR_UCKR; + } +} + +static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } else { + PMC->CKGR_UCKR = p_cfg->ctrl; + } +} + +static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } else { + PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN; + } +} + +/** + * \note This will only disable the selected PLL, not the underlying oscillator (mainck). + */ +static inline void pll_disable(uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); + } else { + PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN; + } +} + +static inline uint32_t pll_is_locked(uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + return pmc_is_locked_pllack(); + } else { + return pmc_is_locked_upll(); + } +} + +static inline void pll_enable_source(enum pll_source e_src) +{ + switch (e_src) { + case PLL_SRC_MAINCK_4M_RC: + case PLL_SRC_MAINCK_8M_RC: + case PLL_SRC_MAINCK_12M_RC: + case PLL_SRC_MAINCK_XTAL: + case PLL_SRC_MAINCK_BYPASS: + osc_enable(e_src); + osc_wait_ready(e_src); + break; + + default: + Assert(false); + break; + } +} + +static inline void pll_enable_config_defaults(unsigned int ul_pll_id) +{ + struct pll_config pllcfg; + + if (pll_is_locked(ul_pll_id)) { + return; // Pll already running + } + switch (ul_pll_id) { +#ifdef CONFIG_PLL0_SOURCE + case 0: + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL0_SOURCE, + CONFIG_PLL0_DIV, + CONFIG_PLL0_MUL); + break; +#endif +#ifdef CONFIG_PLL1_SOURCE + case 1: + pll_enable_source(CONFIG_PLL1_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL1_SOURCE, + CONFIG_PLL1_DIV, + CONFIG_PLL1_MUL); + break; +#endif + default: + Assert(false); + break; + } + pll_enable(&pllcfg, ul_pll_id); + while (!pll_is_locked(ul_pll_id)); +} + +/** + * \brief Wait for PLL \a pll_id to become locked + * + * \todo Use a timeout to avoid waiting forever and hanging the system + * + * \param pll_id The ID of the PLL to wait for. + * + * \retval STATUS_OK The PLL is now locked. + * \retval ERR_TIMEOUT Timed out waiting for PLL to become locked. + */ +static inline int pll_wait_for_lock(unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + while (!pll_is_locked(pll_id)) { + /* Do nothing */ + } + + return 0; +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_PLL_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/preprocessor.h b/Marlin/src/HAL/HAL_DUE/usb/preprocessor.h new file mode 100644 index 0000000000..184c03ae71 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/preprocessor.h @@ -0,0 +1,55 @@ +/** + * \file + * + * \brief Preprocessor utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _PREPROCESSOR_H_ +#define _PREPROCESSOR_H_ + +#include "tpaste.h" +#include "stringz.h" +#include "mrepeat.h" + + +#endif // _PREPROCESSOR_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h new file mode 100644 index 0000000000..082b735fa6 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h @@ -0,0 +1,173 @@ +/** + * \file + * + * \brief SCSI Block Commands + * + * This file contains definitions of some of the commands found in the + * SCSI SBC-2 standard. + * + * Note that the SBC specification depends on several commands defined + * by the SCSI Primary Commands (SPC) standard. Each version of the SBC + * standard is meant to be used in conjunction with a specific version + * of the SPC standard, as follows: + * - SBC depends on SPC + * - SBC-2 depends on SPC-3 + * - SBC-3 depends on SPC-4 + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _SBC_PROTOCOL_H_ +#define _SBC_PROTOCOL_H_ + + +/** + * \ingroup usb_msc_protocol + * \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions + * + * @{ + */ + +//! \name SCSI commands defined by SBC-2 +//@{ +#define SBC_FORMAT_UNIT 0x04 +#define SBC_READ6 0x08 +#define SBC_WRITE6 0x0A +#define SBC_START_STOP_UNIT 0x1B +#define SBC_READ_CAPACITY10 0x25 +#define SBC_READ10 0x28 +#define SBC_WRITE10 0x2A +#define SBC_VERIFY10 0x2F +//@} + +//! \name SBC-2 Mode page definitions +//@{ + +enum scsi_sbc_mode { + SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page + SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page + SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page + SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page +}; + + +//! \name SBC-2 Device-Specific Parameter +//@{ +#define SCSI_MS_SBC_WP 0x80 //!< Write Protected +#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported +//@} + +/** + * \brief SBC-2 Short LBA mode parameter block descriptor + */ +struct sbc_slba_block_desc { + be32_t nr_blocks; //!< Number of Blocks + be32_t block_len; //!< Block Length +#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits +}; + +/** + * \brief SBC-2 Caching mode page + */ +struct sbc_caching_mode_page { + uint8_t page_code; + uint8_t page_length; + uint8_t flags2; +#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control +#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch +#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted +#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity +#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable +#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable +#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor +#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable + uint8_t retention; + be16_t dis_pf_transfer_len; + be16_t min_prefetch; + be16_t max_prefetch; + be16_t max_prefetch_ceil; + uint8_t flags12; +#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write +#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz +#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead +#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable + uint8_t nr_cache_segments; + be16_t cache_segment_size; + uint8_t reserved[4]; +}; + +/** + * \brief SBC-2 Read-Write Error Recovery mode page + */ +struct sbc_rdwr_error_recovery_mode_page { + uint8_t page_code; + uint8_t page_length; +#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A + uint8_t flags1; +#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7) +#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6) +#define SBC_MP_RW_ERR_RECOV_TB (1 << 5) +#define SBC_MP_RW_ERR_RECOV_RC (1 << 4) +#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3) +#define SBC_MP_RW_ERR_RECOV_PER (1 << 2) +#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1) +#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0) + uint8_t read_retry_count; + uint8_t correction_span; + uint8_t head_offset_count; + uint8_t data_strobe_offset_count; + uint8_t flags2; + uint8_t write_retry_count; + uint8_t flags3; + be16_t recovery_time_limit; +}; +//@} + +/** + * \brief SBC-2 READ CAPACITY (10) parameter data + */ +struct sbc_read_capacity10_data { + be32_t max_lba; //!< LBA of last logical block + be32_t block_len; //!< Number of bytes in the last logical block +}; + +//@} + +#endif // _SBC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp new file mode 100644 index 0000000000..4de46104e2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp @@ -0,0 +1,131 @@ +/** + * Interface from Atmel USB MSD to Marlin SD card + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../../../sd/cardreader.h" +extern "C" { +#include "sd_mmc_spi_mem.h" +} + +#define SD_MMC_BLOCK_SIZE 512 + +void sd_mmc_spi_mem_init(void) { +} + +Ctrl_status sd_mmc_spi_test_unit_ready(void) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + return CTRL_GOOD; +} + +Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + *nb_sector = card.getSd2Card().cardSize(); + return CTRL_GOOD; +} + +bool sd_mmc_spi_unload(bool unload) { + return true; +} + +bool sd_mmc_spi_wr_protect(void) { + return false; +} + +bool sd_mmc_spi_removal(void) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return true; + return false; +} + +#if ACCESS_USB == true +/** + * \name MEM <-> USB Interface + * @{ + */ + +#include "udi_msc.h" + +COMPILER_WORD_ALIGNED +uint8_t sector_buf[SD_MMC_BLOCK_SIZE]; + +// #define DEBUG_MMC + +Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + char buffer[80]; + sprintf(buffer, "SDRD: %d @ 0x%08x\n", nb_sector, addr); + SERIAL_PROTOCOL_P(0, buffer); + #endif + + // Start reading + if (!card.getSd2Card().readStart(addr)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // Read a sector + card.getSd2Card().readData(sector_buf); + + // RAM -> USB + if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().readStop(); + return CTRL_FAIL; + } + } + + // Stop reading + card.getSd2Card().readStop(); + + // Done + return CTRL_GOOD; +} + +Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + char buffer[80]; + sprintf(buffer, "SDWR: %d @ 0x%08x\n", nb_sector, addr); + SERIAL_PROTOCOL_P(0, buffer); + #endif + + if (!card.getSd2Card().writeStart(addr, nb_sector)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // USB -> RAM + if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().writeStop(); + return CTRL_FAIL; + } + + // Write a sector + card.getSd2Card().writeData(sector_buf); + } + + // Stop writing + card.getSd2Card().writeStop(); + + // Done + return CTRL_GOOD; +} + +#endif // ACCESS_USB == true + +#endif // SDSUPPORT +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h new file mode 100644 index 0000000000..6df82c146b --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h @@ -0,0 +1,177 @@ +/***************************************************************************** + * + * \file + * + * \brief CTRL_ACCESS interface for SD/MMC card. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _SD_MMC_SPI_MEM_H_ +#define _SD_MMC_SPI_MEM_H_ + +/** + * \defgroup group_avr32_components_memory_sd_mmc_sd_mmc_spi_mem SD/MMC SPI Memory + * + * \ingroup group_avr32_components_memory_sd_mmc_sd_mmc_spi + * + * \{ + */ + +#include "conf_access.h" + +#if SD_MMC_SPI_MEM == DISABLE + #error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled +#endif + + +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#define SD_MMC_REMOVED 0 +#define SD_MMC_INSERTED 1 +#define SD_MMC_REMOVING 2 + + +//---- CONTROL FONCTIONS ---- +//! +//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI. +//!/ +extern void sd_mmc_spi_mem_init(void); + +//! +//! @brief This function tests the state of the SD_MMC memory and sends it to the Host. +//! For a PC, this device is seen as a removable media +//! Before indicating any modification of the status of the media (GOOD->NO_PRESENT or vice-versa), +//! the function must return the BUSY data to make the PC accepting the change +//! +//! @return Ctrl_status +//! Media is ready -> CTRL_GOOD +//! Media not present -> CTRL_NO_PRESENT +//! Media has changed -> CTRL_BUSY +//!/ +extern Ctrl_status sd_mmc_spi_test_unit_ready(void); + +//! +//! @brief This function gives the address of the last valid sector. +//! +//! @param *nb_sector number of sector (sector = 512B). OUT +//! +//! @return Ctrl_status +//! Media ready -> CTRL_GOOD +//! Media not present -> CTRL_NO_PRESENT +//!/ +extern Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector); + +/*! \brief Unload/Load the SD/MMC card selected + * + * The START STOP UNIT SCSI optional command allows an application client to + * eject the removable medium on a LUN. + * + * \param unload \c true to unload the medium, \c false to load the medium. + * + * \return \c true if unload/load done success. + */ +extern bool sd_mmc_spi_unload(bool unload); + +//! +//! @brief This function returns the write protected status of the memory. +//! +//! Only used by memory removal with a HARDWARE SPECIFIC write protected detection +//! ! The user must unplug the memory to change this write protected status, +//! which cannot be for a SD_MMC. +//! +//! @return false -> the memory is not write-protected (always) +//!/ +extern bool sd_mmc_spi_wr_protect(void); + +//! +//! @brief This function tells if the memory has been removed or not. +//! +//! @return false -> The memory isn't removed +//! +extern bool sd_mmc_spi_removal(void); + + +//---- ACCESS DATA FONCTIONS ---- + +#if ACCESS_USB == true +// Standard functions for open in read/write mode the device + +//! +//! @brief This function performs a read operation of n sectors from a given address on. +//! (sector = 512B) +//! +//! DATA FLOW is: SD_MMC => USB +//! +//! @param addr Sector address to start the read from +//! @param nb_sector Number of sectors to transfer +//! +//! @return Ctrl_status +//! It is ready -> CTRL_GOOD +//! A error occur -> CTRL_FAIL +//! +extern Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector); + +//! This function initializes the SD/MMC memory for a write operation +//! +//! DATA FLOW is: USB => SD_MMC +//! +//! (sector = 512B) +//! @param addr Sector address to start write +//! @param nb_sector Number of sectors to transfer +//! +//! @return Ctrl_status +//! It is ready -> CTRL_GOOD +//! An error occurs -> CTRL_FAIL +//! +extern Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector); + +#endif // #if ACCESS_USB == true + +/** + * \} + */ + +#endif // _SD_MMC_SPI_MEM_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h new file mode 100644 index 0000000000..e5e7603c9a --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h @@ -0,0 +1,337 @@ +/** + * \file + * + * \brief SCSI Primary Commands + * + * This file contains definitions of some of the commands found in the + * SPC-2 standard. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _SPC_PROTOCOL_H_ +#define _SPC_PROTOCOL_H_ + + +/** + * \ingroup usb_msc_protocol + * \defgroup usb_spc_protocol SCSI Primary Commands protocol definitions + * + * @{ + */ + +//! \name SCSI commands defined by SPC-2 +//@{ +#define SPC_TEST_UNIT_READY 0x00 +#define SPC_REQUEST_SENSE 0x03 +#define SPC_INQUIRY 0x12 +#define SPC_MODE_SELECT6 0x15 +#define SPC_MODE_SENSE6 0x1A +#define SPC_SEND_DIAGNOSTIC 0x1D +#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E +#define SPC_MODE_SENSE10 0x5A +#define SPC_REPORT_LUNS 0xA0 +//@} + +//! \brief May be set in byte 0 of the INQUIRY CDB +//@{ +//! Enable Vital Product Data +#define SCSI_INQ_REQ_EVPD 0x01 +//! Command Support Data specified by the PAGE OR OPERATION CODE field +#define SCSI_INQ_REQ_CMDT 0x02 +//@} + +COMPILER_PACK_SET(1) + +/** + * \brief SCSI Standard Inquiry data structure + */ +struct scsi_inquiry_data { + uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type +#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected +#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected +#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported +#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC) +#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access +#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer +#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device +#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device +#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device +#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory +#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer +#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller +#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services +#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access +#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer +#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands +#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage +#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral + uint8_t flags1; //!< Flags (byte 1) +#define SCSI_INQ_RMB 0x80 //!< Removable Medium + uint8_t version; //!< Version +#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance +#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC) +#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2) +#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2) +#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3) + uint8_t flags3; //!< Flags (byte 3) +#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported +#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing +#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format + uint8_t addl_len; //!< Additional Length (n-4) +#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot + uint8_t flags5; //!< Flags (byte 5) +#define SCSI_INQ_SCCS 0x80 + uint8_t flags6; //!< Flags (byte 6) +#define SCSI_INQ_BQUE 0x80 +#define SCSI_INQ_ENCSERV 0x40 +#define SCSI_INQ_MULTIP 0x10 +#define SCSI_INQ_MCHGR 0x08 +#define SCSI_INQ_ADDR16 0x01 + uint8_t flags7; //!< Flags (byte 7) +#define SCSI_INQ_WBUS16 0x20 +#define SCSI_INQ_SYNC 0x10 +#define SCSI_INQ_LINKED 0x08 +#define SCSI_INQ_CMDQUE 0x02 + uint8_t vendor_id[8]; //!< T10 Vendor Identification + uint8_t product_id[16]; //!< Product Identification + uint8_t product_rev[4]; //!< Product Revision Level +}; + +/** + * \brief SCSI Standard Request sense data structure + */ +struct scsi_request_sense_data { + /* 1st byte: REQUEST SENSE response flags*/ + uint8_t valid_reponse_code; +#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information +#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F +#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors) +#define SCSI_SENSE_DEFERRED 0x71 + + /* 2nd byte */ + uint8_t obsolete; + + /* 3rd byte */ + uint8_t sense_flag_key; +#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark. +#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists. +#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium. +#define SCSI_SENSE_RESERVED 0x10 //!< Reserved +#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key + + /* 4th to 7th bytes - INFORMATION field */ + uint8_t information[4]; + + /* 8th byte - ADDITIONAL SENSE LENGTH field */ + uint8_t AddSenseLen; +#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8) + + /* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */ + uint8_t CmdSpecINFO[4]; + + /* 13th byte - ADDITIONAL SENSE CODE field */ + uint8_t AddSenseCode; + + /* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */ + uint8_t AddSnsCodeQlfr; + + /* 15th byte - FIELD REPLACEABLE UNIT CODE field */ + uint8_t FldReplUnitCode; + + /* 16th byte */ + uint8_t SenseKeySpec[3]; +#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information +}; + +COMPILER_PACK_RESET() + +/* Vital Product Data page codes */ +enum scsi_vpd_page_code { + SCSI_VPD_SUPPORTED_PAGES = 0x00, + SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80, + SCSI_VPD_DEVICE_IDENTIFICATION = 0x83, +}; +#define SCSI_VPD_HEADER_SIZE 4 + +/* Constants associated with the Device Identification VPD page */ +#define SCSI_VPD_ID_HEADER_SIZE 4 + +#define SCSI_VPD_CODE_SET_BINARY 1 +#define SCSI_VPD_CODE_SET_ASCII 2 +#define SCSI_VPD_CODE_SET_UTF8 3 + +#define SCSI_VPD_ID_TYPE_T10 1 + + +/* Sense keys */ +enum scsi_sense_key { + SCSI_SK_NO_SENSE = 0x0, + SCSI_SK_RECOVERED_ERROR = 0x1, + SCSI_SK_NOT_READY = 0x2, + SCSI_SK_MEDIUM_ERROR = 0x3, + SCSI_SK_HARDWARE_ERROR = 0x4, + SCSI_SK_ILLEGAL_REQUEST = 0x5, + SCSI_SK_UNIT_ATTENTION = 0x6, + SCSI_SK_DATA_PROTECT = 0x7, + SCSI_SK_BLANK_CHECK = 0x8, + SCSI_SK_VENDOR_SPECIFIC = 0x9, + SCSI_SK_COPY_ABORTED = 0xA, + SCSI_SK_ABORTED_COMMAND = 0xB, + SCSI_SK_VOLUME_OVERFLOW = 0xD, + SCSI_SK_MISCOMPARE = 0xE, +}; + +/* Additional Sense Code / Additional Sense Code Qualifier pairs */ +enum scsi_asc_ascq { + SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000, + SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405, + SCSI_ASC_WRITE_ERROR = 0x0C00, + SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100, + SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000, + SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400, + SCSI_ASC_WRITE_PROTECTED = 0x2700, + SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800, + SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00, + SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400, +}; + +/** + * \brief SPC-2 Mode parameter + * This subclause describes the block descriptors and the pages + * used with MODE SELECT and MODE SENSE commands + * that are applicable to all SCSI devices. + */ +enum scsi_spc_mode { + SCSI_MS_MODE_VENDOR_SPEC = 0x00, + SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page + SCSI_MS_MODE_ALL = 0x3F, +}; + +/** + * \brief SPC-2 Informational exceptions control page + * See chapter 8.3.8 + */ +struct spc_control_page_info_execpt { + uint8_t page_code; + uint8_t page_length; +#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A + uint8_t flags1; +#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control +#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted +#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity +#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable +#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable +#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit + uint8_t mrie; +#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00 +#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01 +#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02 +#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03 +#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04 +#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05 +#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06 + be32_t interval_timer; + be32_t report_count; +}; + + +enum scsi_spc_mode_sense_pc { + SCSI_MS_SENSE_PC_CURRENT = 0, + SCSI_MS_SENSE_PC_CHANGEABLE = 1, + SCSI_MS_SENSE_PC_DEFAULT = 2, + SCSI_MS_SENSE_PC_SAVED = 3, +}; + + + +static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) +{ + return (cdb[1] >> 3) & 1; +} + +static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) +{ + return cdb[2] & 0x3F; +} + +static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) +{ + return cdb[2] >> 6; +} + +/** + * \brief SCSI Mode Parameter Header used by MODE SELECT(6) and MODE + * SENSE(6) + */ +struct scsi_mode_param_header6 { + uint8_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t block_descriptor_length; //!< Length of block descriptors +}; + +/** + * \brief SCSI Mode Parameter Header used by MODE SELECT(10) and MODE + * SENSE(10) + */ +struct scsi_mode_param_header10 { + be16_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t flags4; //!< LONGLBA in bit 0 + uint8_t reserved; + be16_t block_descriptor_length; //!< Length of block descriptors +}; + +/** + * \brief SCSI Page_0 Mode Page header (SPF not set) + */ +struct scsi_mode_page_0_header { + uint8_t page_code; +#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable +#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format + uint8_t page_length; //!< Number of bytes after this +#define SCSI_MS_PAGE_LEN(total) ((total) - 2) +}; + +//@} + +#endif // SPC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/stringz.h b/Marlin/src/HAL/HAL_DUE/usb/stringz.h new file mode 100644 index 0000000000..b914b73489 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/stringz.h @@ -0,0 +1,85 @@ +/** + * \file + * + * \brief Preprocessor stringizing utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _STRINGZ_H_ +#define _STRINGZ_H_ + +/** + * \defgroup group_sam_utils_stringz Preprocessor - Stringize + * + * \ingroup group_sam_utils + * + * \{ + */ + +/*! \brief Stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * May be used only within macros with the token passed as an argument if the token is \#defined. + * + * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) + * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to + * writing "A0". + */ +#define STRINGZ(x) #x + +/*! \brief Absolute stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * No restriction of use if the token is \#defined. + * + * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is + * equivalent to writing "A0". + */ +#define ASTRINGZ(x) STRINGZ(x) + +/** + * \} + */ + +#endif // _STRINGZ_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/sysclk.c b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c new file mode 100644 index 0000000000..899244dd88 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c @@ -0,0 +1,122 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "sysclk.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup sysclk_group + * @{ + */ + +#if defined(CONFIG_USBCLK_SOURCE) || defined(__DOXYGEN__) +/** + * \brief Enable full speed USB clock. + * + * \note The SAM3X PMC hardware interprets div as div+1. For readability the hardware div+1 + * is hidden in this implementation. Use div as div effective value. + * + * \param pll_id Source of the USB clock. + * \param div Actual clock divisor. Must be superior to 0. + */ +void sysclk_enable_usb(void) +{ + Assert(CONFIG_USBCLK_DIV > 0); + +#ifdef CONFIG_PLL0_SOURCE + if (CONFIG_USBCLK_SOURCE == USBCLK_SRC_PLL0) { + struct pll_config pllcfg; + + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_defaults(&pllcfg, 0); + pll_enable(&pllcfg, 0); + pll_wait_for_lock(0); + pmc_switch_udpck_to_pllack(CONFIG_USBCLK_DIV - 1); + pmc_enable_udpck(); + return; + } +#endif + + if (CONFIG_USBCLK_SOURCE == USBCLK_SRC_UPLL) { + + pmc_enable_upll_clock(); + pmc_switch_udpck_to_upllck(CONFIG_USBCLK_DIV - 1); + pmc_enable_udpck(); + return; + } +} + +/** + * \brief Disable full speed USB clock. + * + * \note This implementation does not switch off the PLL, it just turns off the USB clock. + */ +void sysclk_disable_usb(void) +{ + pmc_disable_udpck(); +} +#endif // CONFIG_USBCLK_SOURCE + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/sysclk.h b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h new file mode 100644 index 0000000000..48c99de298 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h @@ -0,0 +1,229 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_SYSCLK_H_INCLUDED +#define CHIP_SYSCLK_H_INCLUDED + +#include "osc.h" +#include "pll.h" + +/** + * \page sysclk_quickstart Quick Start Guide for the System Clock Management service (SAM3A) + * + * This is the quick start guide for the \ref sysclk_group "System Clock Management" + * service, with step-by-step instructions on how to configure and use the service for + * specific use cases. + * + * \section sysclk_quickstart_usecases System Clock Management use cases + * - \ref sysclk_quickstart_basic + * + * \section sysclk_quickstart_basic Basic usage of the System Clock Management service + * This section will present a basic use case for the System Clock Management service. + * This use case will configure the main system clock to 84MHz, using an internal PLL + * module to multiply the frequency of a crystal attached to the microcontroller. + * + * \subsection sysclk_quickstart_use_case_1_prereq Prerequisites + * - None + * + * \subsection sysclk_quickstart_use_case_1_setup_steps Initialization code + * Add to the application initialization code: + * \code + sysclk_init(); +\endcode + * + * \subsection sysclk_quickstart_use_case_1_setup_steps_workflow Workflow + * -# Configure the system clocks according to the settings in conf_clock.h: + * \code sysclk_init(); \endcode + * + * \subsection sysclk_quickstart_use_case_1_example_code Example code + * Add or uncomment the following in your conf_clock.h header file, commenting out all other + * definitions of the same symbol(s): + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK + + // Fpll0 = (Fclk * PLL_mul) / PLL_div + #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 + + // Fbus = Fsys / BUS_div + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +\endcode + * + * \subsection sysclk_quickstart_use_case_1_example_workflow Workflow + * -# Configure the main system clock to use the output of the PLL module as its source: + * \code #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK \endcode + * -# Configure the PLL module to use the fast external fast crystal oscillator as its source: + * \code #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL \endcode + * -# Configure the PLL module to multiply the external fast crystal oscillator frequency up to 84MHz: + * \code + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 +\endcode + * \note For user boards, \c BOARD_FREQ_MAINCK_XTAL should be defined in the board \c conf_board.h configuration + * file as the frequency of the fast crystal attached to the microcontroller. + * -# Configure the main clock to run at the full 84MHz, disable scaling of the main system clock speed: + * \code + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +\endcode + * \note Some dividers are powers of two, while others are integer division factors. Refer to the + * formulas in the conf_clock.h template commented above each division define. + */ + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup sysclk_group + * @{ + */ + +//! \name Configuration Symbols +//@{ +/** + * \def CONFIG_SYSCLK_SOURCE + * \brief Initial/static main system clock source + * + * The main system clock will be configured to use this clock during + * initialization. + */ +#ifndef CONFIG_SYSCLK_SOURCE +# define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC +#endif +/** + * \def CONFIG_SYSCLK_PRES + * \brief Initial CPU clock divider (mck) + * + * The MCK will run at + * \f[ + * f_{MCK} = \frac{f_{sys}}{\mathrm{CONFIG\_SYSCLK\_PRES}}\,\mbox{Hz} + * \f] + * after initialization. + */ +#ifndef CONFIG_SYSCLK_PRES +# define CONFIG_SYSCLK_PRES 0 +#endif + +//@} + +//! \name Master Clock Sources (MCK) +//@{ +#define SYSCLK_SRC_SLCK_RC 0 //!< Internal 32kHz RC oscillator as master source clock +#define SYSCLK_SRC_SLCK_XTAL 1 //!< External 32kHz crystal oscillator as master source clock +#define SYSCLK_SRC_SLCK_BYPASS 2 //!< External 32kHz bypass oscillator as master source clock +#define SYSCLK_SRC_MAINCK_4M_RC 3 //!< Internal 4MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_8M_RC 4 //!< Internal 8MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_12M_RC 5 //!< Internal 12MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_XTAL 6 //!< External crystal oscillator as master source clock +#define SYSCLK_SRC_MAINCK_BYPASS 7 //!< External bypass oscillator as master source clock +#define SYSCLK_SRC_PLLACK 8 //!< Use PLLACK as master source clock +#define SYSCLK_SRC_UPLLCK 9 //!< Use UPLLCK as master source clock +//@} + +//! \name Master Clock Prescalers (MCK) +//@{ +#define SYSCLK_PRES_1 PMC_MCKR_PRES_CLK_1 //!< Set master clock prescaler to 1 +#define SYSCLK_PRES_2 PMC_MCKR_PRES_CLK_2 //!< Set master clock prescaler to 2 +#define SYSCLK_PRES_4 PMC_MCKR_PRES_CLK_4 //!< Set master clock prescaler to 4 +#define SYSCLK_PRES_8 PMC_MCKR_PRES_CLK_8 //!< Set master clock prescaler to 8 +#define SYSCLK_PRES_16 PMC_MCKR_PRES_CLK_16 //!< Set master clock prescaler to 16 +#define SYSCLK_PRES_32 PMC_MCKR_PRES_CLK_32 //!< Set master clock prescaler to 32 +#define SYSCLK_PRES_64 PMC_MCKR_PRES_CLK_64 //!< Set master clock prescaler to 64 +#define SYSCLK_PRES_3 PMC_MCKR_PRES_CLK_3 //!< Set master clock prescaler to 3 +//@} + +//! \name USB Clock Sources +//@{ +#define USBCLK_SRC_PLL0 0 //!< Use PLLA +#define USBCLK_SRC_UPLL 1 //!< Use UPLL +//@} + +/** + * \def CONFIG_USBCLK_SOURCE + * \brief Configuration symbol for the USB generic clock source + * + * Sets the clock source to use for the USB. The source must also be properly + * configured. + * + * Define this to one of the \c USBCLK_SRC_xxx settings. Leave it undefined if + * USB is not required. + */ +#ifdef __DOXYGEN__ +# define CONFIG_USBCLK_SOURCE +#endif + +/** + * \def CONFIG_USBCLK_DIV + * \brief Configuration symbol for the USB generic clock divider setting + * + * Sets the clock division for the USB generic clock. If a USB clock source is + * selected with CONFIG_USBCLK_SOURCE, this configuration symbol must also be + * defined. + */ +#ifdef __DOXYGEN__ +# define CONFIG_USBCLK_DIV +#endif + + +extern void sysclk_enable_usb(void); +extern void sysclk_disable_usb(void); + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_SYSCLK_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/tpaste.h b/Marlin/src/HAL/HAL_DUE/usb/tpaste.h new file mode 100644 index 0000000000..f8ec44a41d --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/tpaste.h @@ -0,0 +1,105 @@ +/** + * \file + * + * \brief Preprocessor token pasting utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _TPASTE_H_ +#define _TPASTE_H_ + +/** + * \defgroup group_sam_utils_tpaste Preprocessor - Token Paste + * + * \ingroup group_sam_utils + * + * \{ + */ + +/*! \name Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. + * + * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by + * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is + * equivalent to writing U32. + */ +//! @{ +#define TPASTE2( a, b) a##b +#define TPASTE3( a, b, c) a##b##c +#define TPASTE4( a, b, c, d) a##b##c##d +#define TPASTE5( a, b, c, d, e) a##b##c##d##e +#define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f +#define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g +#define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h +#define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i +#define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j +//! @} + +/*! \name Absolute Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * No restriction of use if the tokens are \#defined. + * + * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined + * as 32 is equivalent to writing U32. + */ +//! @{ +#define ATPASTE2( a, b) TPASTE2( a, b) +#define ATPASTE3( a, b, c) TPASTE3( a, b, c) +#define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) +#define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) +#define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) +#define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) +#define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) +#define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) +#define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) +//! @} + +/** + * \} + */ + +#endif // _TPASTE_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udc.c b/Marlin/src/HAL/HAL_DUE/usb/udc.c new file mode 100644 index 0000000000..048a902d3b --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udc.c @@ -0,0 +1,1149 @@ +/** + * \file + * + * \brief USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" +#include "udc.h" + +/** + * \ingroup udc_group + * \defgroup udc_group_interne Implementation of UDC + * + * Internal implementation + * @{ + */ + +//! \name Internal variables to manage the USB device +//! @{ + +//! Device status state (see enum usb_device_status in usb_protocol.h) +static le16_t udc_device_status; + +COMPILER_WORD_ALIGNED +//! Device interface setting value +static uint8_t udc_iface_setting = 0; + +//! Device Configuration number selected by the USB host +COMPILER_WORD_ALIGNED +static uint8_t udc_num_configuration = 0; + +//! Pointer on the selected speed device configuration +static udc_config_speed_t UDC_DESC_STORAGE *udc_ptr_conf; + +//! Pointer on interface descriptor used by SETUP request. +static usb_iface_desc_t UDC_DESC_STORAGE *udc_ptr_iface; + +//! @} + + +//! \name Internal structure to store the USB device main strings +//! @{ + +/** + * \brief Language ID of USB device (US ID by default) + */ +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE usb_str_lgid_desc_t udc_string_desc_languageid = { + .desc.bLength = sizeof(usb_str_lgid_desc_t), + .desc.bDescriptorType = USB_DT_STRING, + .string = {LE16(USB_LANGID_EN_US)} +}; + +/** + * \brief USB device manufacture name storage + * String is allocated only if USB_DEVICE_MANUFACTURE_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_MANUFACTURE_NAME +static uint8_t udc_string_manufacturer_name[] = USB_DEVICE_MANUFACTURE_NAME; +# define USB_DEVICE_MANUFACTURE_NAME_SIZE \ + (sizeof(udc_string_manufacturer_name)-1) +#else +# define USB_DEVICE_MANUFACTURE_NAME_SIZE 0 +#endif + +/** + * \brief USB device product name storage + * String is allocated only if USB_DEVICE_PRODUCT_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_PRODUCT_NAME +static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME; +# define USB_DEVICE_PRODUCT_NAME_SIZE (sizeof(udc_string_product_name)-1) +#else +# define USB_DEVICE_PRODUCT_NAME_SIZE 0 +#endif + +/** + * \brief Get USB device serial number + * + * Use the define USB_DEVICE_SERIAL_NAME to set static serial number. + * + * For dynamic serial number set the define USB_DEVICE_GET_SERIAL_NAME_POINTER + * to a suitable pointer. This will also require the serial number length + * define USB_DEVICE_GET_SERIAL_NAME_LENGTH. + */ +#if defined USB_DEVICE_GET_SERIAL_NAME_POINTER + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_GET_SERIAL_NAME_POINTER; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + USB_DEVICE_GET_SERIAL_NAME_LENGTH +#elif defined USB_DEVICE_SERIAL_NAME + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_SERIAL_NAME; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + (sizeof(USB_DEVICE_SERIAL_NAME)-1) +#else +# define USB_DEVICE_SERIAL_NAME_SIZE 0 +#endif + +/** + * \brief USB device string descriptor + * Structure used to transfer ASCII strings to USB String descriptor structure. + */ +struct udc_string_desc_t { + usb_str_desc_t header; + le16_t string[Max(Max(USB_DEVICE_MANUFACTURE_NAME_SIZE, \ + USB_DEVICE_PRODUCT_NAME_SIZE), USB_DEVICE_SERIAL_NAME_SIZE)]; +}; +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE struct udc_string_desc_t udc_string_desc = { + .header.bDescriptorType = USB_DT_STRING +}; +//! @} + +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void) +{ + return udc_ptr_iface; +} + +/** + * \brief Returns a value to check the end of USB Configuration descriptor + * + * \return address after the last byte of USB Configuration descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf(void) +{ + return (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) + udc_ptr_conf->desc + + le16_to_cpu(udc_ptr_conf->desc->wTotalLength)); +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Search specific descriptor in global interface descriptor + * + * \param desc Address of interface descriptor + * or previous specific descriptor found + * \param desc_id Descriptor ID to search + * + * \return address of specific descriptor found + * \return NULL if it is the end of global interface descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_next_desc_in_iface(usb_conf_desc_t + UDC_DESC_STORAGE * desc, uint8_t desc_id) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_eof_desc; + + ptr_eof_desc = udc_get_eof_conf(); + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + // Check the end of configuration descriptor + while (ptr_eof_desc > desc) { + // If new interface descriptor is found, + // then it is the end of the current global interface descriptor + if (USB_DT_INTERFACE == desc->bDescriptorType) { + break; // End of global interface descriptor + } + if (desc_id == desc->bDescriptorType) { + return desc; // Specific descriptor found + } + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + } + return NULL; // No specific descriptor found +} +#endif + +/** + * \brief Search an interface descriptor + * This routine updates the internal pointer udc_ptr_iface. + * + * \param iface_num Interface number to find in Configuration Descriptor + * \param setting_num Setting number of interface to find + * + * \return 1 if found or 0 if not found + */ +static bool udc_update_iface_desc(uint8_t iface_num, uint8_t setting_num) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_end_desc; + + if (0 == udc_num_configuration) { + return false; + } + + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Start at the beginning of configuration descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) + udc_ptr_conf->desc; + + // Check the end of configuration descriptor + ptr_end_desc = udc_get_eof_conf(); + while (ptr_end_desc > + (UDC_DESC_STORAGE usb_conf_desc_t *) udc_ptr_iface) { + if (USB_DT_INTERFACE == udc_ptr_iface->bDescriptorType) { + // A interface descriptor is found + // Check interface and alternate setting number + if ((iface_num == udc_ptr_iface->bInterfaceNumber) && + (setting_num == + udc_ptr_iface->bAlternateSetting)) { + return true; // Interface found + } + } + // Go to next descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) ( + (uint8_t *) udc_ptr_iface + + udc_ptr_iface->bLength); + } + return false; // Interface not found +} + +/** + * \brief Disables an usb device interface (UDI) + * This routine call the UDI corresponding to interface number + * + * \param iface_num Interface number to disable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_disable(uint8_t iface_num) +{ + udi_api_t UDC_DESC_STORAGE *udi_api; + + // Select first alternate setting of the interface + // to update udc_ptr_iface before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + +#if (0!=USB_DEVICE_MAX_EP) + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Start at the beginning of interface descriptor + { + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) + ep_desc, USB_DT_ENDPOINT); + if (NULL == ep_desc) { + break; + } + // Free the endpoint used by the interface + udd_ep_free(ep_desc->bEndpointAddress); + } + } +#endif + + // Disable interface + udi_api->disable(); + return true; +} + +/** + * \brief Enables an usb device interface (UDI) + * This routine calls the UDI corresponding + * to the interface and setting number. + * + * \param iface_num Interface number to enable + * \param setting_num Setting number to enable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_enable(uint8_t iface_num, uint8_t setting_num) +{ + // Select the interface descriptor + if (!udc_update_iface_desc(iface_num, setting_num)) { + return false; + } + +#if (0!=USB_DEVICE_MAX_EP) + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + + // Start at the beginning of the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) ep_desc, + USB_DT_ENDPOINT); + if (NULL == ep_desc) + break; + // Alloc the endpoint used by the interface + if (!udd_ep_alloc(ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + le16_to_cpu + (ep_desc->wMaxPacketSize))) { + return false; + } + } +#endif + // Enable the interface + return udc_ptr_conf->udi_apis[iface_num]->enable(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void) +{ + udd_enable(); +} + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void) +{ + udd_disable(); + udc_reset(); +} + +/** + * \brief Reset the current configuration of the USB device, + * This routines can be called by UDD when a RESET on the USB line occurs. + */ +void udc_reset(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + udc_iface_disable(iface_num); + } + } + udc_num_configuration = 0; +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + if (CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP) & udc_device_status) { + // Remote wakeup is enabled then disable it + UDC_REMOTEWAKEUP_DISABLE(); + } +#endif + udc_device_status = +#if (USB_DEVICE_ATTR & USB_CONFIG_ATTR_SELF_POWERED) + CPU_TO_LE16(USB_DEV_STATUS_SELF_POWERED); +#else + CPU_TO_LE16(USB_DEV_STATUS_BUS_POWERED); +#endif +} + +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + } + } + } +} + +/** + * \brief Standard device request to get device status + * + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + return false; + } + + udd_set_setup_payload( (uint8_t *) & udc_device_status, + sizeof(udc_device_status)); + return true; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to get endpoint status + * + * \return true if success + */ +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + return false; + } + + udc_ep_status = udd_ep_is_halted(udd_g_ctrlreq.req. + wIndex & 0xFF) ? CPU_TO_LE16(USB_EP_STATUS_HALTED) : 0; + + udd_set_setup_payload( (uint8_t *) & udc_ep_status, + sizeof(udc_ep_status)); + return true; +} +#endif + +/** + * \brief Standard device request to change device status + * + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_DEV_FEATURE_REMOTE_WAKEUP) { + udc_device_status &= CPU_TO_LE16(~(uint32_t)USB_DEV_STATUS_REMOTEWAKEUP); +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + } + return false; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to clear endpoint feature + * + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Standard device request to set a feature + * + * \return true if success + */ +static bool udc_req_std_dev_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + switch (udd_g_ctrlreq.req.wValue) { + + case USB_DEV_FEATURE_REMOTE_WAKEUP: +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + udc_device_status |= CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP); + UDC_REMOTEWAKEUP_ENABLE(); + return true; +#else + return false; +#endif + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DEV_FEATURE_TEST_MODE: + if (!udd_is_high_speed()) { + break; + } + if (udd_g_ctrlreq.req.wIndex & 0xFF) { + break; + } + // Unconfigure the device, terminating all ongoing requests + udc_reset(); + switch ((udd_g_ctrlreq.req.wIndex >> 8) & 0xFF) { + case USB_DEV_TEST_MODE_J: + udd_g_ctrlreq.callback = udd_test_mode_j; + return true; + + case USB_DEV_TEST_MODE_K: + udd_g_ctrlreq.callback = udd_test_mode_k; + return true; + + case USB_DEV_TEST_MODE_SE0_NAK: + udd_g_ctrlreq.callback = udd_test_mode_se0_nak; + return true; + + case USB_DEV_TEST_MODE_PACKET: + udd_g_ctrlreq.callback = udd_test_mode_packet; + return true; + + case USB_DEV_TEST_MODE_FORCE_ENABLE: // Only for downstream facing hub ports + default: + break; + } + break; +#endif + default: + break; + } + return false; +} + +/** + * \brief Standard endpoint request to halt an endpoint + * + * \return true if success + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Change the address of device + * Callback called at the end of request set address + */ +static void udc_valid_address(void) +{ + udd_set_address(udd_g_ctrlreq.req.wValue & 0x7F); +} + +/** + * \brief Standard device request to set device address + * + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + // The address must be changed at the end of setup request after the handshake + // then we use a callback to change address + udd_g_ctrlreq.callback = udc_valid_address; + return true; +} + +/** + * \brief Standard device request to get device string descriptor + * + * \return true if success + */ +static bool udc_req_std_dev_get_str_desc(void) +{ + uint8_t i; + const uint8_t *str; + uint8_t str_length = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xFF) { + case 0: + udd_set_setup_payload((uint8_t *) &udc_string_desc_languageid, + sizeof(udc_string_desc_languageid)); + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + str = udc_string_manufacturer_name; + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + str = udc_string_product_name; + break; +#endif +#if defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER + case 3: + str_length = USB_DEVICE_SERIAL_NAME_SIZE; + str = udc_get_string_serial_name(); + break; +#endif + default: +#ifdef UDC_GET_EXTRA_STRING + if (UDC_GET_EXTRA_STRING()) { + break; + } +#endif + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + } + + udc_string_desc.header.bLength = 2 + (str_length) * 2; + udd_set_setup_payload( + (uint8_t *) &udc_string_desc, + udc_string_desc.header.bLength); + } + + return true; +} + +/** + * \brief Standard device request to get descriptors about USB device + * + * \return true if success + */ +static bool udc_req_std_dev_get_descriptor(void) +{ + uint8_t conf_num; + + conf_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Check descriptor ID + switch ((uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + case USB_DT_DEVICE: + // Device descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (!udd_is_high_speed()) { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_hs, + udc_config.confdev_hs->bLength); + } else +#endif + { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_lsfs, + udc_config.confdev_lsfs->bLength); + } + break; + + case USB_DT_CONFIGURATION: + // Configuration descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_CONFIGURATION; + break; + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DT_DEVICE_QUALIFIER: + // Device qualifier descriptor requested + udd_set_setup_payload( (uint8_t *) udc_config.qualifier, + udc_config.qualifier->bLength); + break; + + case USB_DT_OTHER_SPEED_CONFIGURATION: + // Other configuration descriptor requested + if (!udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_OTHER_SPEED_CONFIGURATION; + break; +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + return false; + } + udd_set_setup_payload( (uint8_t *) udc_config.conf_bos, + udc_config.conf_bos->wTotalLength); + break; + + case USB_DT_STRING: + // String descriptor requested + if (!udc_req_std_dev_get_str_desc()) { + return false; + } + break; + + default: + // Unknown descriptor requested + return false; + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + return true; +} + +/** + * \brief Standard device request to get configuration number + * + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + return false; + } + + udd_set_setup_payload(&udc_num_configuration,1); + return true; +} + +/** + * \brief Standard device request to enable a configuration + * + * \return true if success + */ +static bool udc_req_std_dev_set_configuration(void) +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + return false; + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + return false; + } + // Check the configuration number requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_hs->bNumConfigurations) { + return false; + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + } + + // Reset current configuration + udc_reset(); + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + if (udc_num_configuration == 0) { + return true; // Default empty configuration requested + } + // Update pointer of the configuration descriptor +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + udc_ptr_conf = &udc_config.conf_hs[udc_num_configuration - 1]; + } else +#endif + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + return false; + } + } + return true; +} + +/** + * \brief Standard interface request + * to get the alternate setting number of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_get_setting(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Select first alternate setting of the interface to update udc_ptr_iface + // before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Get alternate setting from UDI + udi_api = udc_ptr_conf->udi_apis[iface_num]; + udc_iface_setting = udi_api->getsetting(); + + // Link value to payload pointer of request + udd_set_setup_payload(&udc_iface_setting,1); + return true; +} + +/** + * \brief Standard interface request + * to set an alternate setting of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + setting_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Disable current setting + if (!udc_iface_disable(iface_num)) { + return false; + } + + // Enable new setting + return udc_iface_enable(iface_num, setting_num); +} + +/** + * \brief Main routine to manage the standard USB SETUP request + * + * \return true if the request is supported + */ +static bool udc_reqstd(void) +{ + if (Udd_setup_is_in()) { + // GET Standard Requests + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error for USB host + } + + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Get Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_dev_get_status(); + case USB_REQ_GET_DESCRIPTOR: + return udc_req_std_dev_get_descriptor(); + case USB_REQ_GET_CONFIGURATION: + return udc_req_std_dev_get_configuration(); + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Get Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_INTERFACE: + return udc_req_std_iface_get_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Get Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_ep_get_status(); + default: + break; + } + } +#endif + } else { + // SET Standard Requests + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Set Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_ADDRESS: + return udc_req_std_dev_set_address(); + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_dev_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_dev_set_feature(); + case USB_REQ_SET_CONFIGURATION: + return udc_req_std_dev_set_configuration(); + case USB_REQ_SET_DESCRIPTOR: + /* Not supported (defined as optional by the USB 2.0 spec) */ + break; + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Set Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_INTERFACE: + return udc_req_std_iface_set_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Set Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_ep_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_ep_set_feature(); + default: + break; + } + } +#endif + } + return false; +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_iface(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Check interface number + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + //* To update udc_ptr_iface with the selected interface in request + // Select first alternate setting of interface to update udc_ptr_iface + // before calling udi_api->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI corresponding to the interface number + return udi_api->setup(); +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_ep(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI + if (udi_api->setup()) { + return true; + } + } + return false; +} + +/** + * \brief Main routine to manage the USB SETUP request. + * + * This function parses a USB SETUP request and submits an appropriate + * response back to the host or, in the case of SETUP OUT requests + * with data, sets up a buffer for receiving the data payload. + * + * The main standard requests defined by the USB 2.0 standard are handled + * internally. The interface requests are sent to UDI, and the specific request + * sent to a specific application callback. + * + * \return true if the request is supported, else the request is stalled by UDD + */ +bool udc_process_setup(void) +{ + // By default no data (receive/send) and no callbacks registered + udd_g_ctrlreq.payload_size = 0; + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + + if (Udd_setup_is_in()) { + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error from USB host + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + if (udc_reqstd()) { + return true; + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + if (udc_req_iface()) { + return true; + } + } + + // If endpoint request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_ENDPOINT) { + if (udc_req_ep()) { + return true; + } + } + + // Here SETUP request unknown by UDC and UDIs +#ifdef USB_DEVICE_SPECIFIC_REQUEST + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; +#endif +} + +//! @} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/udc.h b/Marlin/src/HAL/HAL_DUE/usb/udc.h new file mode 100644 index 0000000000..885bdf04d6 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udc.h @@ -0,0 +1,697 @@ +/** + * \file + * + * \brief Interface of the USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_H_ +#define _UDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udc_desc.h" +#include "udd.h" + +#if USB_DEVICE_VENDOR_ID == 0 +# error USB_DEVICE_VENDOR_ID cannot be equal to 0 +#endif + +#if USB_DEVICE_PRODUCT_ID == 0 +# error USB_DEVICE_PRODUCT_ID cannot be equal to 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udc_group USB Device Controller (UDC) + * + * The UDC provides a high-level abstraction of the usb device. + * You can use these functions to control the main device state + * (start/attach/wakeup). + * + * \section USB_DEVICE_CONF USB Device Custom configuration + * The following USB Device configuration must be included in the conf_usb.h + * file of the application. + * + * USB_DEVICE_VENDOR_ID (Word)
+ * Vendor ID provided by USB org (ATMEL 0x03EB). + * + * USB_DEVICE_PRODUCT_ID (Word)
+ * Product ID (Referenced in usb_atmel.h). + * + * USB_DEVICE_MAJOR_VERSION (Byte)
+ * Major version of the device + * + * USB_DEVICE_MINOR_VERSION (Byte)
+ * Minor version of the device + * + * USB_DEVICE_MANUFACTURE_NAME (string)
+ * ASCII name for the manufacture + * + * USB_DEVICE_PRODUCT_NAME (string)
+ * ASCII name for the product + * + * USB_DEVICE_SERIAL_NAME (string)
+ * ASCII name to enable and set a serial number + * + * USB_DEVICE_POWER (Numeric)
+ * (unit mA) Maximum device power + * + * USB_DEVICE_ATTR (Byte)
+ * USB attributes available: + * - USB_CONFIG_ATTR_SELF_POWERED + * - USB_CONFIG_ATTR_REMOTE_WAKEUP + * Note: if remote wake enabled then defines remotewakeup callbacks, + * see Table 5-2. External API from UDC - Callback + * + * USB_DEVICE_LOW_SPEED (Only defined)
+ * Force the USB Device to run in low speed + * + * USB_DEVICE_HS_SUPPORT (Only defined)
+ * Authorize the USB Device to run in high speed + * + * USB_DEVICE_MAX_EP (Byte)
+ * Define the maximum endpoint number used by the USB Device.
+ * This one is already defined in UDI default configuration. + * Ex: + * - When endpoint control 0x00, endpoint 0x01 and + * endpoint 0x82 is used then USB_DEVICE_MAX_EP=2 + * - When only endpoint control 0x00 is used then USB_DEVICE_MAX_EP=0 + * - When endpoint 0x01 and endpoint 0x81 is used then USB_DEVICE_MAX_EP=1
+ * (configuration not possible on USBB interface) + * @{ + */ + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + * + * \section udc_vbus_monitoring VBus monitoring used cases + * + * The VBus monitoring is used only for USB SELF Power application. + * + * - By default the USB device is automatically attached when Vbus is high + * or when USB is start for devices without internal Vbus monitoring. + * conf_usb.h file does not contains define USB_DEVICE_ATTACH_AUTO_DISABLE. + * \code //#define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * + * - Add custom VBUS monitoring. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + // Authorize VBUS monitoring + if (!udc_include_vbus_monitoring()) { + // Implement custom VBUS monitoring via GPIO or other + } + Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other + { + // Attach USB Device + udc_attach(); + } +\endcode + * + * - Case of battery charging. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + Event VBUS present() // VBUS interrupt or GPIO interrupt or .. + { + // Authorize battery charging, but wait key press to start USB. + } + Event Key press() + { + // Stop batteries charging + // Start USB + udc_attach(); + } +\endcode + */ +static inline bool udc_include_vbus_monitoring(void) +{ + return udd_include_vbus_monitoring(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void); + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +static inline void udc_attach(void) +{ + udd_attach(); +} + + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +static inline void udc_detach(void) +{ + udd_detach(); +} + + +/*! \brief The USB driver sends a resume signal called \e "Upstream Resume" + * This is authorized only when the remote wakeup feature is enabled by host. + */ +static inline void udc_remotewakeup(void) +{ + udd_send_remotewakeup(); +} + + +/** + * \brief Returns a pointer on the current interface descriptor + * + * \return pointer on the current interface descriptor. + */ +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); + +//@} + +/** + * \ingroup usb_group + * \defgroup usb_device_group USB Stack Device + * + * This module includes USB Stack Device implementation. + * The stack is divided in three parts: + * - USB Device Controller (UDC) provides USB chapter 9 compliance + * - USB Device Interface (UDI) provides USB Class compliance + * - USB Device Driver (UDD) provides USB Driver for each Atmel MCU + + * Many USB Device applications can be implemented on Atmel MCU. + * Atmel provides many application notes for different applications: + * - AVR4900, provides general information about Device Stack + * - AVR4901, explains how to create a new class + * - AVR4902, explains how to create a composite device + * - AVR49xx, all device classes provided in ASF have an application note + * + * A basic USB knowledge is required to understand the USB Device + * Class application notes (HID,MS,CDC,PHDC,...). + * Then, to create an USB device with + * only one class provided by ASF, refer directly to the application note + * corresponding to this USB class. The USB Device application note for + * New Class and Composite is dedicated to advanced USB users. + * + * @{ + */ + +//! @} + +#ifdef __cplusplus +} +#endif + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_prereq USB Device Controller (UDC) - Prerequisites + * Common prerequisites for all USB devices. + * + * This module is based on USB device stack full interrupt driven, and supporting + * \ref sleepmgr_group sleepmgr. For AVR and SAM3/4 devices the \ref clk_group clock services + * is supported. For SAMD devices the \ref asfdoc_sam0_system_clock_group clock driver is supported. + * + * The following procedure must be executed to setup the project correctly: + * - Specify the clock configuration: + * - XMEGA USB devices need 48MHz clock input.\n + * XMEGA USB devices need CPU frequency higher than 12MHz.\n + * You can use either an internal RC48MHz auto calibrated by Start of Frames + * or an external OSC. + * - UC3 and SAM3/4 devices without USB high speed support need 48MHz clock input.\n + * You must use a PLL and an external OSC. + * - UC3 and SAM3/4 devices with USB high speed support need 12MHz clock input.\n + * You must use an external OSC. + * - UC3 devices with USBC hardware need CPU frequency higher than 25MHz. + * - SAMD devices without USB high speed support need 48MHz clock input.\n + * You should use DFLL with USBCRM. + * - In conf_board.h, the define CONF_BOARD_USB_PORT must be added to enable USB lines. + * (Not mandatory for all boards) + * - Enable interrupts + * - Initialize the clock service + * + * The usage of \ref sleepmgr_group sleepmgr service is optional, but recommended to reduce power + * consumption: + * - Initialize the sleep manager service + * - Activate sleep mode when the application is in IDLE state + * + * \subpage udc_conf_clock. + * + * for AVR and SAM3/4 devices, add to the initialization code: + * \code + sysclk_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + board_init(); + sleepmgr_init(); // Optional +\endcode + * + * For SAMD devices, add to the initialization code: + * \code + system_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + sleepmgr_init(); // Optional +\endcode + * Add to the main IDLE loop: + * \code + sleepmgr_enter_sleep(); // Optional +\endcode + * + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_code USB Device Controller (UDC) - Example code + * Common example code for all USB devices. + * + * Content of conf_usb.h: + * \code + #define USB_DEVICE_VENDOR_ID 0x03EB + #define USB_DEVICE_PRODUCT_ID 0xXXXX + #define USB_DEVICE_MAJOR_VERSION 1 + #define USB_DEVICE_MINOR_VERSION 0 + #define USB_DEVICE_POWER 100 + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED +\endcode + * + * Add to application C-file: + * \code + void usb_init(void) + { + udc_start(); + } +\endcode + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_flow USB Device Controller (UDC) - Workflow + * Common workflow for all USB devices. + * + * -# Ensure that conf_usb.h is available and contains the following configuration + * which is the main USB device configuration: + * - \code // Vendor ID provided by USB org (ATMEL 0x03EB) + #define USB_DEVICE_VENDOR_ID 0x03EB // Type Word + // Product ID (Atmel PID referenced in usb_atmel.h) + #define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word + // Major version of the device + #define USB_DEVICE_MAJOR_VERSION 1 // Type Byte + // Minor version of the device + #define USB_DEVICE_MINOR_VERSION 0 // Type Byte + // Maximum device power (mA) + #define USB_DEVICE_POWER 100 // Type 9-bits + // USB attributes to enable features + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode + * -# Call the USB device stack start function to enable stack and start USB: + * - \code udc_start(); \endcode + * \note In case of USB dual roles (Device and Host) managed through USB OTG connector + * (USB ID pin), the call of udc_start() must be removed and replaced by uhc_start(). + * SeRefer to "AVR4950 section 6.1 Dual roles" for further information about dual roles. + */ + +/** + * \page udc_conf_clock conf_clock.h examples with USB support + * + * Content of XMEGA conf_clock.h: + * \code + // Configuration based on internal RC: + // USB clock need of 48Mhz + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF + // CPU clock need of clock > 12MHz to run with USB (Here 24MHz) + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 +\endcode + * + * Content of conf_clock.h for AT32UC3A0, AT32UC3A1, AT32UC3B devices (USBB): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3A3, AT32UC3A4 devices (USBB with high speed support): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U devices (USBC): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // CPU clock need of clock > 25MHz to run with USBC + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1 +\endcode + * + * Content of conf_clock.h for SAM3S, SAM3SD, SAM4S devices (UPD: USB Peripheral Device): + * \code + // PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div) + #define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL1_MUL 16 + #define CONFIG_PLL1_DIV 2 + // USB Clock Source Options (Fusb = FpllX / USB_div) + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 2 +\endcode + * + * Content of conf_clock.h for SAM3U device (UPDHS: USB Peripheral Device High Speed): + * \code + // USB Clock Source fixed at UPLL. +\endcode + * + * Content of conf_clock.h for SAM3X, SAM3A devices (UOTGHS: USB OTG High Speed): + * \code + // USB Clock Source fixed at UPLL. + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL + #define CONFIG_USBCLK_DIV 1 +\endcode + * + * Content of conf_clocks.h for SAMD devices (USB): + * \code + // System clock bus configuration + # define CONF_CLOCK_FLASH_WAIT_STATES 2 + + // USB Clock Source fixed at DFLL. + // SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop + # define CONF_CLOCK_DFLL_ENABLE true + # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY + # define CONF_CLOCK_DFLL_ON_DEMAND true + + // Set this to true to configure the GCLK when running clocks_init. + // If set to false, none of the GCLK generators will be configured in clocks_init(). + # define CONF_CLOCK_CONFIGURE_GCLK true + + // Configure GCLK generator 0 (Main Clock) + # define CONF_CLOCK_GCLK_0_ENABLE true + # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true + # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL + # define CONF_CLOCK_GCLK_0_PRESCALER 1 + # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false +\endcode + */ + +/** + * \page udc_use_case_1 Change USB speed + * + * In this use case, the USB device is used with different USB speeds. + * + * \section udc_use_case_1_setup Setup steps + * + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_1_usage Usage steps + * + * \subsection udc_use_case_1_usage_code Example code + * Content of conf_usb.h: + * \code + #if // Low speed + #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // Full speed + // #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // High speed + // #define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT + + #endif +\endcode + * + * \subsection udc_use_case_1_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB device low speed (1.5Mbit/s): + * - \code #define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device full speed (12Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device high speed (480Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT \endcode + */ + +/** + * \page udc_use_case_2 Use USB strings + * + * In this use case, the usual USB strings is added in the USB device. + * + * \section udc_use_case_2_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_2_usage Usage steps + * + * \subsection udc_use_case_2_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" + #define USB_DEVICE_PRODUCT_NAME "Product name" + #define USB_DEVICE_SERIAL_NAME "12...EF" +\endcode + * + * \subsection udc_use_case_2_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable different USB strings: + * - \code // Static ASCII name for the manufacture + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode + * - \code // Static ASCII name for the product + #define USB_DEVICE_PRODUCT_NAME "Product name" \endcode + * - \code // Static ASCII name to enable and set a serial number + #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode + */ + +/** + * \page udc_use_case_3 Use USB remote wakeup feature + * + * In this use case, the USB remote wakeup feature is enabled. + * + * \section udc_use_case_3_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_3_usage Usage steps + * + * \subsection udc_use_case_3_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); +\endcode + * + * Add to application C-file: + * \code + void my_callback_remotewakeup_enable(void) + { + // Enable application wakeup events (e.g. enable GPIO interrupt) + } + void my_callback_remotewakeup_disable(void) + { + // Disable application wakeup events (e.g. disable GPIO interrupt) + } + + void my_interrupt_event(void) + { + udc_remotewakeup(); + } +\endcode + * + * \subsection udc_use_case_3_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable remote wakeup feature: + * - \code // Authorizes the remote wakeup feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode + * - \code // Define callback called when the host enables the remotewakeup feature + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); \endcode + * - \code // Define callback called when the host disables the remotewakeup feature + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); \endcode + * -# Send a remote wakeup (USB upstream): + * - \code udc_remotewakeup(); \endcode + */ + +/** + * \page udc_use_case_5 Bus power application recommendations + * + * In this use case, the USB device BUS power feature is enabled. + * This feature requires a correct power consumption management. + * + * \section udc_use_case_5_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_5_usage Usage steps + * + * \subsection udc_use_case_5_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void) + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void) +\endcode + * + * Add to application C-file: + * \code + void user_callback_suspend_action(void) + { + // Disable hardware component to reduce power consumption + } + void user_callback_resume_action(void) + { + // Re-enable hardware component + } +\endcode + * + * \subsection udc_use_case_5_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters: + * - \code // Authorizes the BUS power feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode + * - \code // Define callback called when the host suspend the USB line + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void); \endcode + * - \code // Define callback called when the host or device resume the USB line + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void); \endcode + * -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus): + * - \code void user_callback_suspend_action(void) + { + turn_off_components(); + } \endcode + */ + +/** + * \page udc_use_case_6 USB dynamic serial number + * + * In this use case, the USB serial strings is dynamic. + * For a static serial string refer to \ref udc_use_case_2. + * + * \section udc_use_case_6_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_6_usage Usage steps + * + * \subsection udc_use_case_6_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_SERIAL_NAME + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 + extern uint8_t serial_number[]; +\endcode + * + * Add to application C-file: + * \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + * + * \subsection udc_use_case_6_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable a USB serial number strings dynamically: + * - \code #define USB_DEVICE_SERIAL_NAME // Define this empty + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array + extern uint8_t serial_number[]; // Declare external serial array \endcode + * -# Before start USB stack, initialize the serial array + * - \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + */ + + + +#endif // _UDC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udc_desc.h b/Marlin/src/HAL/HAL_DUE/usb/udc_desc.h new file mode 100644 index 0000000000..88ed08a961 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udc_desc.h @@ -0,0 +1,135 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_DESC_H_ +#define _UDC_DESC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup udc_group + * \defgroup udc_desc_group USB Device Descriptor + * + * @{ + */ + +/** + * \brief Defines the memory's location of USB descriptors + * + * By default the Descriptor is stored in RAM + * (UDC_DESC_STORAGE is defined empty). + * + * If you have need to free RAM space, + * it is possible to put descriptor in flash in following case: + * - USB driver authorize flash transfer (USBB on UC3 and USB on Mega) + * - USB Device is not high speed (UDC no need to change USB descriptors) + * + * For UC3 application used "const". + * + * For Mega application used "code". + */ +#define UDC_DESC_STORAGE + // Descriptor storage in internal RAM +#if (defined UDC_DATA_USE_HRAM_SUPPORT) +# if defined(__GNUC__) +# define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) +# define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) +# elif defined(__ICCAVR32__) +# define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 +# define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 +# endif +#else +# define UDC_DATA(x) COMPILER_ALIGNED(x) +# define UDC_BSS(x) COMPILER_ALIGNED(x) +#endif + + + +/** + * \brief Configuration descriptor and UDI link for one USB speed + */ +typedef struct { + //! USB configuration descriptor + usb_conf_desc_t UDC_DESC_STORAGE *desc; + //! Array of UDI API pointer + udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; +} udc_config_speed_t; + + +/** + * \brief All information about the USB Device + */ +typedef struct { + //! USB device descriptor for low or full speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; + //! USB configuration descriptor and UDI API pointers for low or full speed + udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; +#ifdef USB_DEVICE_HS_SUPPORT + //! USB device descriptor for high speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; + //! USB device qualifier, only use in high speed mode + usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; + //! USB configuration descriptor and UDI API pointers for high speed + udc_config_speed_t UDC_DESC_STORAGE *conf_hs; +#endif + usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; +} udc_config_t; + +//! Global variables of USB Device Descriptor and UDI links +extern UDC_DESC_STORAGE udc_config_t udc_config; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDC_DESC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udd.h b/Marlin/src/HAL/HAL_DUE/usb/udd.h new file mode 100644 index 0000000000..10807f43d7 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udd.h @@ -0,0 +1,396 @@ +/** + * \file + * + * \brief Common API for USB Device Drivers (UDD) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDD_H_ +#define _UDD_H_ + +#include "usb_protocol.h" +#include "udc_desc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udd_group USB Device Driver (UDD) + * + * The UDD driver provides a low-level abstraction of the device + * controller hardware. Most events coming from the hardware such as + * interrupts, which may cause the UDD to call into the UDC and UDI. + * + * @{ + */ + +//! \brief Endpoint identifier +typedef uint8_t udd_ep_id_t; + +//! \brief Endpoint transfer status +//! Returned in parameters of callback register via udd_ep_run routine. +typedef enum { + UDD_EP_TRANSFER_OK = 0, + UDD_EP_TRANSFER_ABORT = 1, +} udd_ep_status_t; + +/** + * \brief Global variable to give and record information of the setup request management + * + * This global variable allows to decode and response a setup request. + * It can be updated by udc_process_setup() from UDC or *setup() from UDIs. + */ +typedef struct { + //! Data received in USB SETUP packet + //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. + usb_setup_req_t req; + + //! Point to buffer to send or fill with data following SETUP packet + //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) + uint8_t *payload; + + //! Size of buffer to send or fill, and content the number of byte transfered + uint16_t payload_size; + + //! Callback called after reception of ZLP from setup request + void (*callback) (void); + + //! Callback called when the buffer given (.payload) is full or empty. + //! This one return false to abort data transfer, or true with a new buffer in .payload. + bool(*over_under_run) (void); +} udd_ctrl_request_t; +extern udd_ctrl_request_t udd_g_ctrlreq; + +//! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer +#define Udd_setup_is_in() \ + (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer +#define Udd_setup_is_out() \ + (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. +#define Udd_setup_type() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) + +//! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient +#define Udd_setup_recipient() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) + +/** + * \brief End of halt callback function type. + * Registered by routine udd_ep_wait_stall_clear() + * Callback called when endpoint stall is cleared. + */ +typedef void (*udd_callback_halt_cleared_t) (void); + +/** + * \brief End of transfer callback function type. + * Registered by routine udd_ep_run() + * Callback called by USB interrupt after data transfer or abort (reset,...). + * + * \param status UDD_EP_TRANSFER_OK, if transfer is complete + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param n number of data transfered + */ +typedef void (*udd_callback_trans_t) (udd_ep_status_t status, + iram_size_t nb_transfered, udd_ep_id_t ep); + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + */ +bool udd_include_vbus_monitoring(void); + +/** + * \brief Enables the USB Device mode + */ +void udd_enable(void); + +/** + * \brief Disables the USB Device mode + */ +void udd_disable(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +void udd_attach(void); + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +void udd_detach(void); + +/** + * \brief Test whether the USB Device Controller is running at high + * speed or not. + * + * \return \c true if the Device is running at high speed mode, otherwise \c false. + */ +bool udd_is_high_speed(void); + +/** + * \brief Changes the USB address of device + * + * \param address New USB address + */ +void udd_set_address(uint8_t address); + +/** + * \brief Returns the USB address of device + * + * \return USB address + */ +uint8_t udd_getaddress(void); + +/** + * \brief Returns the current start of frame number + * + * \return current start of frame number. + */ +uint16_t udd_get_frame_number(void); + +/** + * \brief Returns the current micro start of frame number + * + * \return current micro start of frame number required in high speed mode. + */ +uint16_t udd_get_micro_frame_number(void); + +/*! \brief The USB driver sends a resume signal called Upstream Resume + */ +void udd_send_remotewakeup(void); + +/** + * \brief Load setup payload + * + * \param payload Pointer on payload + * \param payload_size Size of payload + */ +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); + + +/** + * \name Endpoint Management + * + * The following functions allow drivers to create and remove + * endpoints, as well as set, clear and query their "halted" and + * "wedged" states. + */ +//@{ + +#if (USB_DEVICE_MAX_EP != 0) + +/** + * \brief Configures and enables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * \param bmAttributes Attributes of endpoint declared in the descriptor. + * \param MaxEndpointSize Endpoint maximum size + * + * \return \c 1 if the endpoint is enabled, otherwise \c 0. + */ +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize); + +/** + * \brief Disables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + */ +void udd_ep_free(udd_ep_id_t ep); + +/** + * \brief Check if the endpoint \a ep is halted. + * + * \param ep The ID of the endpoint to check. + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_is_halted(udd_ep_id_t ep); + +/** + * \brief Set the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will result + * in a STALL handshake being sent. Any pending transactions will be + * performed first, however. + * + * \param ep The ID of the endpoint to be halted + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_set_halt(udd_ep_id_t ep); + +/** + * \brief Clear the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will + * be handled normally, i.e. a STALL handshake will not be sent, and + * the data toggle sequence will start at DATA0. + * + * \param ep The ID of the endpoint to be un-halted + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_clear_halt(udd_ep_id_t ep); + +/** + * \brief Registers a callback to call when endpoint halt is cleared + * + * \param ep The ID of the endpoint to use + * \param callback NULL or function to call when endpoint halt is cleared + * + * \warning if the endpoint is not halted then the \a callback is called immediately. + * + * \return \c 1 if the register is accepted, otherwise \c 0. + */ +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback); + +/** + * \brief Allows to receive or send data on an endpoint + * + * The driver uses a specific DMA USB to transfer data + * from internal RAM to endpoint, if this one is available. + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * Note: The control endpoint is not authorized. + * + * \param ep The ID of the endpoint to use + * \param b_shortpacket Enabled automatic short packet + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \warning About \a b_shortpacket, for IN endpoint it means that a short packet + * (or a Zero Length Packet) will be sent to the USB line to properly close the usb + * transfer at the end of the data transfer. + * For Bulk and Interrupt OUT endpoint, it will automatically stop the transfer + * at the end of the data transfer (received short packet). + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +/** + * \brief Aborts transfer on going on endpoint + * + * If a transfer is on going, then it is stopped and + * the callback registered is called to signal the end of transfer. + * Note: The control endpoint is not authorized. + * + * \param ep Endpoint to abort + */ +void udd_ep_abort(udd_ep_id_t ep); + +#endif + +//@} + + +/** + * \name High speed test mode management + * + * The following functions allow the device to jump to a specific test mode required in high speed mode. + */ +//@{ +void udd_test_mode_j(void); +void udd_test_mode_k(void); +void udd_test_mode_se0_nak(void); +void udd_test_mode_packet(void); +//@} + + +/** + * \name UDC callbacks to provide for UDD + * + * The following callbacks are used by UDD. + */ +//@{ + +/** + * \brief Decodes and manages a setup request + * + * The driver call it when a SETUP packet is received. + * The \c udd_g_ctrlreq contains the data of SETUP packet. + * If this callback accepts the setup request then it must + * return \c 1 and eventually update \c udd_g_ctrlreq to send or receive data. + * + * \return \c 1 if the request is accepted, otherwise \c 0. + */ +extern bool udc_process_setup(void); + +/** + * \brief Reset the UDC + * + * The UDC must reset all configuration. + */ +extern void udc_reset(void); + +/** + * \brief To signal that a SOF is occurred + * + * The UDC must send the signal to all UDIs enabled + */ +extern void udc_sof_notify(void); + +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDD_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi.h b/Marlin/src/HAL/HAL_DUE/usb/udi.h new file mode 100644 index 0000000000..1fc7ae5d01 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi.h @@ -0,0 +1,133 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_H_ +#define _UDI_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udi_group USB Device Interface (UDI) + * The UDI provides a common API for all classes, + * and this is used by UDC for the main control of USB Device interface. + * @{ + */ + +/** + * \brief UDI API. + * + * The callbacks within this structure are called only by + * USB Device Controller (UDC) + * + * The udc_get_interface_desc() can be use by UDI to know the interface descriptor + * selected by UDC. + */ +typedef struct { + /** + * \brief Enable the interface. + * + * This function is called when the host selects a configuration + * to which this interface belongs through a Set Configuration + * request, and when the host selects an alternate setting of + * this interface through a Set Interface request. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ + bool(*enable) (void); + + /** + * \brief Disable the interface. + * + * This function is called when this interface is currently + * active, and + * - the host selects any configuration through a Set + * Configuration request, or + * - the host issues a USB reset, or + * - the device is detached from the host (i.e. Vbus is no + * longer present) + */ + void (*disable) (void); + + /** + * \brief Handle a control request directed at an interface. + * + * This function is called when this interface is currently + * active and the host sends a SETUP request + * with this interface as the recipient. + * + * Use udd_g_ctrlreq to decode and response to SETUP request. + * + * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. + */ + bool(*setup) (void); + + /** + * \brief Returns the current setting of the selected interface. + * + * This function is called when UDC when know alternate setting of selected interface. + * + * \return alternate setting of selected interface + */ + uint8_t(*getsetting) (void); + + /** + * \brief To signal that a SOF is occurred + */ + void(*sof_notify) (void); +} udi_api_t; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c new file mode 100644 index 0000000000..e54ee570fa --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c @@ -0,0 +1,1155 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc.h" +#include "udi_cdc.h" +#include + +#ifdef UDI_CDC_LOW_RATE +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#else +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#endif + +#ifndef UDI_CDC_TX_EMPTY_NOTIFY +# define UDI_CDC_TX_EMPTY_NOTIFY(port) +#endif + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_cdc_comm_enable(void); +void udi_cdc_comm_disable(void); +bool udi_cdc_comm_setup(void); +bool udi_cdc_data_enable(void); +void udi_cdc_data_disable(void); +bool udi_cdc_data_setup(void); +uint8_t udi_cdc_getsetting(void); +void udi_cdc_data_sof_notify(void); +UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm = { + .enable = udi_cdc_comm_enable, + .disable = udi_cdc_comm_disable, + .setup = udi_cdc_comm_setup, + .getsetting = udi_cdc_getsetting, +}; +UDC_DESC_STORAGE udi_api_t udi_api_cdc_data = { + .enable = udi_cdc_data_enable, + .disable = udi_cdc_data_disable, + .setup = udi_cdc_data_setup, + .getsetting = udi_cdc_getsetting, + .sof_notify = udi_cdc_data_sof_notify, +}; +//@} + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_internal Implementation of UDI CDC + * + * Class internal implementation + * @{ + */ + +/** + * \name Internal routines + */ +//@{ + +/** + * \name Routines to control serial line + */ +//@{ + +/** + * \brief Returns the port number corresponding at current setup request + * + * \return port number + */ +static uint8_t udi_cdc_setup_to_port(void); + +/** + * \brief Sends line coding to application + * + * Called after SETUP request when line coding data is received. + */ +static void udi_cdc_line_coding_received(void); + +/** + * \brief Records new state + * + * \param port Communication port number to manage + * \param b_set State is enabled if true, else disabled + * \param bit_mask Field to process (see CDC_SERIAL_STATE_ defines) + */ +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask); + +/** + * \brief Check and eventually notify the USB host of new state + * + * \param port Communication port number to manage + * \param ep Port communication endpoint + */ +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep); + +/** + * \brief Ack sent of serial state message + * Callback called after serial state message sent + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +//@} + +/** + * \name Routines to process data transfer + */ +//@{ + +/** + * \brief Enable the reception of data from the USB host + * + * The value udi_cdc_rx_trans_sel indicate the RX buffer to fill. + * + * \param port Communication port number to manage + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +static bool udi_cdc_rx_start(uint8_t port); + +/** + * \brief Update rx buffer management with a new data + * Callback called after data reception on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finish + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data received + */ +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Ack sent of tx buffer + * Callback called after data transfer on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Send buffer on line or wait a SOF event + * + * \param port Communication port number to manage + */ +static void udi_cdc_tx_send(uint8_t port); + +//@} + +//@} + +/** + * \name Information about configuration of communication line + */ +//@{ +COMPILER_WORD_ALIGNED + static usb_cdc_line_coding_t udi_cdc_line_coding[UDI_CDC_PORT_NB]; +static bool udi_cdc_serial_state_msg_ongoing[UDI_CDC_PORT_NB]; +static volatile le16_t udi_cdc_state[UDI_CDC_PORT_NB]; +COMPILER_WORD_ALIGNED static usb_cdc_notify_serial_state_t uid_cdc_state_msg[UDI_CDC_PORT_NB]; + +//! Status of CDC COMM interfaces +static volatile uint8_t udi_cdc_nb_comm_enabled = 0; +//@} + +/** + * \name Variables to manage RX/TX transfer requests + * Two buffers for each sense are used to optimize the speed. + */ +//@{ + +//! Status of CDC DATA interfaces +static volatile uint8_t udi_cdc_nb_data_enabled = 0; +static volatile bool udi_cdc_data_running = false; +//! Buffer to receive data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_rx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_RX_BUFFERS]; +//! Data available in RX buffers +static volatile uint16_t udi_cdc_rx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give the current RX buffer used (rx0 if 0, rx1 if 1) +static volatile uint8_t udi_cdc_rx_buf_sel[UDI_CDC_PORT_NB]; +//! Read position in current RX buffer +static volatile uint16_t udi_cdc_rx_pos[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_rx_trans_ongoing[UDI_CDC_PORT_NB]; + +//! Define a transfer halted +#define UDI_CDC_TRANS_HALTED 2 + +//! Buffer to send data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_tx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_TX_BUFFERS]; +//! Data available in TX buffers +static uint16_t udi_cdc_tx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give current TX buffer used (tx0 if 0, tx1 if 1) +static volatile uint8_t udi_cdc_tx_buf_sel[UDI_CDC_PORT_NB]; +//! Value of SOF during last TX transfer +static uint16_t udi_cdc_tx_sof_num[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_tx_trans_ongoing[UDI_CDC_PORT_NB]; +//! Signal that both buffer content data to send +static volatile bool udi_cdc_tx_both_buf_to_send[UDI_CDC_PORT_NB]; + +//@} + +bool udi_cdc_comm_enable(void) +{ + uint8_t port; + uint8_t iface_comm_num; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_comm_enabled = 0; +#else + if (udi_cdc_nb_comm_enabled > UDI_CDC_PORT_NB) { + udi_cdc_nb_comm_enabled = 0; + } + port = udi_cdc_nb_comm_enabled; +#endif + + // Initialize control signal management + udi_cdc_state[port] = CPU_TO_LE16(0); + + uid_cdc_state_msg[port].header.bmRequestType = + USB_REQ_DIR_IN | USB_REQ_TYPE_CLASS | + USB_REQ_RECIP_INTERFACE; + uid_cdc_state_msg[port].header.bNotification = USB_REQ_CDC_NOTIFY_SERIAL_STATE; + uid_cdc_state_msg[port].header.wValue = LE16(0); + + switch (port) { +#define UDI_CDC_PORT_TO_IFACE_COMM(index, unused) \ + case index: \ + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_IFACE_COMM, ~) +#undef UDI_CDC_PORT_TO_IFACE_COMM + default: + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_0; + break; + } + + uid_cdc_state_msg[port].header.wIndex = LE16(iface_comm_num); + uid_cdc_state_msg[port].header.wLength = LE16(2); + uid_cdc_state_msg[port].value = CPU_TO_LE16(0); + + udi_cdc_line_coding[port].dwDTERate = CPU_TO_LE32(UDI_CDC_DEFAULT_RATE); + udi_cdc_line_coding[port].bCharFormat = UDI_CDC_DEFAULT_STOPBITS; + udi_cdc_line_coding[port].bParityType = UDI_CDC_DEFAULT_PARITY; + udi_cdc_line_coding[port].bDataBits = UDI_CDC_DEFAULT_DATABITS; + // Call application callback + // to initialize memories or indicate that interface is enabled + UDI_CDC_SET_CODING_EXT(port,(&udi_cdc_line_coding[port])); + if (!UDI_CDC_ENABLE_EXT(port)) { + return false; + } + udi_cdc_nb_comm_enabled++; + return true; +} + +bool udi_cdc_data_enable(void) +{ + uint8_t port; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_data_enabled = 0; +#else + if (udi_cdc_nb_data_enabled > UDI_CDC_PORT_NB) { + udi_cdc_nb_data_enabled = 0; + } + port = udi_cdc_nb_data_enabled; +#endif + + // Initialize TX management + udi_cdc_tx_trans_ongoing[port] = false; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_buf_sel[port] = 0; + udi_cdc_tx_buf_nb[port][0] = 0; + udi_cdc_tx_buf_nb[port][1] = 0; + udi_cdc_tx_sof_num[port] = 0; + udi_cdc_tx_send(port); + + // Initialize RX management + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_buf_sel[port] = 0; + udi_cdc_rx_buf_nb[port][0] = 0; + udi_cdc_rx_buf_nb[port][1] = 0; + udi_cdc_rx_pos[port] = 0; + if (!udi_cdc_rx_start(port)) { + return false; + } + udi_cdc_nb_data_enabled++; + if (udi_cdc_nb_data_enabled == UDI_CDC_PORT_NB) { + udi_cdc_data_running = true; + } + return true; +} + +void udi_cdc_comm_disable(void) +{ + Assert(udi_cdc_nb_comm_enabled != 0); + udi_cdc_nb_comm_enabled--; +} + +void udi_cdc_data_disable(void) +{ + uint8_t port; + + Assert(udi_cdc_nb_data_enabled != 0); + udi_cdc_nb_data_enabled--; + port = udi_cdc_nb_data_enabled; + UDI_CDC_DISABLE_EXT(port); + udi_cdc_data_running = false; +} + +bool udi_cdc_comm_setup(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + + if (Udd_setup_is_in()) { + // GET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_GET_LINE_CODING: + // Get configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + } + } + } + if (Udd_setup_is_out()) { + // SET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_SET_LINE_CODING: + // Change configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.callback = + udi_cdc_line_coding_received; + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + case USB_REQ_CDC_SET_CONTROL_LINE_STATE: + // According cdc spec 1.1 chapter 6.2.14 + UDI_CDC_SET_DTR_EXT(port, (0 != + (udd_g_ctrlreq.req.wValue + & CDC_CTRL_SIGNAL_DTE_PRESENT))); + UDI_CDC_SET_RTS_EXT(port, (0 != + (udd_g_ctrlreq.req.wValue + & CDC_CTRL_SIGNAL_ACTIVATE_CARRIER))); + return true; + } + } + } + return false; // request Not supported +} + +bool udi_cdc_data_setup(void) +{ + return false; // request Not supported +} + +uint8_t udi_cdc_getsetting(void) +{ + return 0; // CDC don't have multiple alternate setting +} + +void udi_cdc_data_sof_notify(void) +{ + static uint8_t port_notify = 0; + + // A call of udi_cdc_data_sof_notify() is done for each port + udi_cdc_tx_send(port_notify); +#if UDI_CDC_PORT_NB != 1 // To optimize code + port_notify++; + if (port_notify >= UDI_CDC_PORT_NB) { + port_notify = 0; + } +#endif +} + + +//------------------------------------------------- +//------- Internal routines to control serial line + +static uint8_t udi_cdc_setup_to_port(void) +{ + uint8_t port; + + switch (udd_g_ctrlreq.req.wIndex & 0xFF) { +#define UDI_CDC_IFACE_COMM_TO_PORT(iface, unused) \ + case UDI_CDC_COMM_IFACE_NUMBER_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_IFACE_COMM_TO_PORT, ~) +#undef UDI_CDC_IFACE_COMM_TO_PORT + default: + port = 0; + break; + } + return port; +} + +static void udi_cdc_line_coding_received(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + UNUSED(port); + + UDI_CDC_SET_CODING_EXT(port, (&udi_cdc_line_coding[port])); +} + +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask) +{ + irqflags_t flags; + udd_ep_id_t ep_comm; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + // Update state + flags = cpu_irq_save(); // Protect udi_cdc_state + if (b_set) { + udi_cdc_state[port] |= bit_mask; + } else { + udi_cdc_state[port] &= ~(unsigned)bit_mask; + } + cpu_irq_restore(flags); + + // Send it if possible and state changed + switch (port) { +#define UDI_CDC_PORT_TO_COMM_EP(index, unused) \ + case index: \ + ep_comm = UDI_CDC_COMM_EP_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_COMM_EP, ~) +#undef UDI_CDC_PORT_TO_COMM_EP + default: + ep_comm = UDI_CDC_COMM_EP_0; + break; + } + udi_cdc_ctrl_state_notify(port, ep_comm); +} + + +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep) +{ +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + // Send it if possible and state changed + if ((!udi_cdc_serial_state_msg_ongoing[port]) + && (udi_cdc_state[port] != uid_cdc_state_msg[port].value)) { + // Fill notification message + uid_cdc_state_msg[port].value = udi_cdc_state[port]; + // Send notification message + udi_cdc_serial_state_msg_ongoing[port] = + udd_ep_run(ep, + false, + (uint8_t *) & uid_cdc_state_msg[port], + sizeof(uid_cdc_state_msg[0]), + udi_cdc_serial_state_msg_sent); + } +} + + +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + UNUSED(status); + + switch (ep) { +#define UDI_CDC_GET_PORT_FROM_COMM_EP(iface, unused) \ + case UDI_CDC_COMM_EP_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_GET_PORT_FROM_COMM_EP, ~) +#undef UDI_CDC_GET_PORT_FROM_COMM_EP + default: + port = 0; + break; + } + + udi_cdc_serial_state_msg_ongoing[port] = false; + + // For the irregular signals like break, the incoming ring signal, + // or the overrun error state, this will reset their values to zero + // and again will not send another notification until their state changes. + udi_cdc_state[port] &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + uid_cdc_state_msg[port].value &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + // Send it if possible and state changed + udi_cdc_ctrl_state_notify(port, ep); +} + + +//------------------------------------------------- +//------- Internal routines to process data transfer + + +static bool udi_cdc_rx_start(uint8_t port) +{ + irqflags_t flags; + uint8_t buf_sel_trans; + udd_ep_id_t ep; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + flags = cpu_irq_save(); + buf_sel_trans = udi_cdc_rx_buf_sel[port]; + if (udi_cdc_rx_trans_ongoing[port] || + (udi_cdc_rx_pos[port] < udi_cdc_rx_buf_nb[port][buf_sel_trans])) { + // Transfer already on-going or current buffer no empty + cpu_irq_restore(flags); + return false; + } + + // Change current buffer + udi_cdc_rx_pos[port] = 0; + udi_cdc_rx_buf_sel[port] = (buf_sel_trans==0)?1:0; + + // Start transfer on RX + udi_cdc_rx_trans_ongoing[port] = true; + cpu_irq_restore(flags); + + if (udi_cdc_multi_is_rx_ready(port)) { + UDI_CDC_RX_NOTIFY(port); + } + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_OUT(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_OUT_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_OUT, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_OUT + default: + ep = UDI_CDC_DATA_EP_OUT_0; + break; + } + return udd_ep_run(ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); +} + + +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t buf_sel_trans; + uint8_t port; + + switch (ep) { +#define UDI_CDC_DATA_EP_OUT_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_OUT_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_OUT_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_OUT_TO_PORT + default: + port = 0; + break; + } + + if (UDD_EP_TRANSFER_OK != status) { + // Abort reception + return; + } + buf_sel_trans = (udi_cdc_rx_buf_sel[port]==0)?1:0; + if (!n) { + udd_ep_run( ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); + return; + } + udi_cdc_rx_buf_nb[port][buf_sel_trans] = n; + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_start(port); +} + + +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + + switch (ep) { +#define UDI_CDC_DATA_EP_IN_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_IN_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_IN_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_IN_TO_PORT + default: + port = 0; + break; + } + + if (UDD_EP_TRANSFER_OK != status) { + // Abort transfer + return; + } + udi_cdc_tx_buf_nb[port][(udi_cdc_tx_buf_sel[port]==0)?1:0] = 0; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_trans_ongoing[port] = false; + + if (n != 0) { + UDI_CDC_TX_EMPTY_NOTIFY(port); + } + udi_cdc_tx_send(port); +} + + +static void udi_cdc_tx_send(uint8_t port) +{ + irqflags_t flags; + uint8_t buf_sel_trans; + bool b_short_packet; + udd_ep_id_t ep; + static uint16_t sof_zlp_counter = 0; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + if (udi_cdc_tx_trans_ongoing[port]) { + return; // Already on going or wait next SOF to send next data + } + if (udd_is_high_speed()) { + if (udi_cdc_tx_sof_num[port] == udd_get_micro_frame_number()) { + return; // Wait next SOF to send next data + } + }else{ + if (udi_cdc_tx_sof_num[port] == udd_get_frame_number()) { + return; // Wait next SOF to send next data + } + } + + flags = cpu_irq_save(); // to protect udi_cdc_tx_buf_sel + buf_sel_trans = udi_cdc_tx_buf_sel[port]; + if (udi_cdc_tx_buf_nb[port][buf_sel_trans] == 0) { + sof_zlp_counter++; + if (((!udd_is_high_speed()) && (sof_zlp_counter < 100)) + || (udd_is_high_speed() && (sof_zlp_counter < 800))) { + cpu_irq_restore(flags); + return; + } + } + sof_zlp_counter = 0; + + if (!udi_cdc_tx_both_buf_to_send[port]) { + // Send current Buffer + // and switch the current buffer + udi_cdc_tx_buf_sel[port] = (buf_sel_trans==0)?1:0; + }else{ + // Send the other Buffer + // and no switch the current buffer + buf_sel_trans = (buf_sel_trans==0)?1:0; + } + udi_cdc_tx_trans_ongoing[port] = true; + cpu_irq_restore(flags); + + b_short_packet = (udi_cdc_tx_buf_nb[port][buf_sel_trans] != UDI_CDC_TX_BUFFERS); + if (b_short_packet) { + if (udd_is_high_speed()) { + udi_cdc_tx_sof_num[port] = udd_get_micro_frame_number(); + }else{ + udi_cdc_tx_sof_num[port] = udd_get_frame_number(); + } + }else{ + udi_cdc_tx_sof_num[port] = 0; // Force next transfer without wait SOF + } + + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_IN(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_IN_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_IN, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_IN + default: + ep = UDI_CDC_DATA_EP_IN_0; + break; + } + udd_ep_run( ep, + b_short_packet, + udi_cdc_tx_buf[port][buf_sel_trans], + udi_cdc_tx_buf_nb[port][buf_sel_trans], + udi_cdc_data_sent); +} + + +//--------------------------------------------- +//------- Application interface + + +//------- Application interface + +void udi_cdc_ctrl_signal_dcd(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_ctrl_signal_dsr(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_signal_framing_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_signal_parity_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_signal_overrun(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_OVERRUN); +} + +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_multi_signal_framing_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_multi_signal_parity_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_multi_signal_overrun(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_OVERRUN); +} + +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port) +{ + irqflags_t flags; + uint16_t pos; + iram_size_t nb_received; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + nb_received = udi_cdc_rx_buf_nb[port][udi_cdc_rx_buf_sel[port]] - pos; + cpu_irq_restore(flags); + return nb_received; +} + +iram_size_t udi_cdc_get_nb_received_data(void) +{ + return udi_cdc_multi_get_nb_received_data(0); +} + +bool udi_cdc_multi_is_rx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_nb_received_data(port) > 0); +} + +bool udi_cdc_is_rx_ready(void) +{ + return udi_cdc_multi_is_rx_ready(0); +} + +int udi_cdc_multi_getc(uint8_t port) +{ + irqflags_t flags; + int rx_data = 0; + bool b_databit_9; + uint16_t pos; + uint8_t buf_sel; + bool again; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_getc_process_one_byte: + // Check available data + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + cpu_irq_restore(flags); + while (again) { + if (!udi_cdc_data_running) { + return 0; + } + goto udi_cdc_getc_process_one_byte; + } + + // Read data + rx_data |= udi_cdc_rx_buf[port][buf_sel][pos]; + udi_cdc_rx_pos[port] = pos+1; + + udi_cdc_rx_start(port); + + if (b_databit_9) { + // Receive MSB + b_databit_9 = false; + rx_data = rx_data << 8; + goto udi_cdc_getc_process_one_byte; + } + return rx_data; +} + +int udi_cdc_getc(void) +{ + return udi_cdc_multi_getc(0); +} + +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size) +{ + irqflags_t flags; + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t copy_nb; + uint16_t pos; + uint8_t buf_sel; + bool again; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + +udi_cdc_read_buf_loop_wait: + // Check available data + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + cpu_irq_restore(flags); + while (again) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_read_buf_loop_wait; + } + + // Read data + copy_nb = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + if (copy_nb>size) { + copy_nb = size; + } + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], copy_nb); + udi_cdc_rx_pos[port] += copy_nb; + ptr_buf += copy_nb; + size -= copy_nb; + udi_cdc_rx_start(port); + + if (size) { + goto udi_cdc_read_buf_loop_wait; + } + return 0; +} + +static iram_size_t udi_cdc_multi_read_no_polling(uint8_t port, void* buf, iram_size_t size) +{ + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t nb_avail_data; + uint16_t pos; + uint8_t buf_sel; + irqflags_t flags; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + //Data interface not started... exit + if (!udi_cdc_data_running) { + return 0; + } + + //Get number of available data + // Check available data + flags = cpu_irq_save(); // to protect udi_cdc_rx_pos & udi_cdc_rx_buf_sel + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + nb_avail_data = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + cpu_irq_restore(flags); + //If the buffer contains less than the requested number of data, + //adjust read size + if(nb_avail_data0) { + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], size); + flags = cpu_irq_save(); // to protect udi_cdc_rx_pos + udi_cdc_rx_pos[port] += size; + cpu_irq_restore(flags); + + ptr_buf += size; + udi_cdc_rx_start(port); + } + return(nb_avail_data); +} + +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_no_polling(0, buf, size); +} + +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_buf(0, buf, size); +} + +iram_size_t __attribute__((optimize("O0"))) udi_cdc_multi_get_free_tx_buffer(uint8_t port) +{ + irqflags_t flags; + iram_size_t buf_sel_nb, retval; + uint8_t buf_sel; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_sel_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + if (buf_sel_nb == UDI_CDC_TX_BUFFERS) { + if ((!udi_cdc_tx_trans_ongoing[port]) + && (!udi_cdc_tx_both_buf_to_send[port])) { + /* One buffer is full, but the other buffer is not used. + * (not used = transfer on-going) + * then move to the other buffer to store data */ + udi_cdc_tx_both_buf_to_send[port] = true; + udi_cdc_tx_buf_sel[port] = (buf_sel == 0)? 1 : 0; + buf_sel_nb = 0; + } + } + retval = UDI_CDC_TX_BUFFERS - buf_sel_nb; + cpu_irq_restore(flags); + return retval; +} + +iram_size_t udi_cdc_get_free_tx_buffer(void) +{ + return udi_cdc_multi_get_free_tx_buffer(0); +} + +bool udi_cdc_multi_is_tx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_free_tx_buffer(port) != 0); +} + +bool udi_cdc_is_tx_ready(void) +{ + return udi_cdc_multi_is_tx_ready(0); +} + +int udi_cdc_multi_putc(uint8_t port, int value) +{ + irqflags_t flags; + bool b_databit_9; + uint8_t buf_sel; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_putc_process_one_byte: + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return false; + } + goto udi_cdc_putc_process_one_byte; + } + + // Write value + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + udi_cdc_tx_buf[port][buf_sel][udi_cdc_tx_buf_nb[port][buf_sel]++] = value; + cpu_irq_restore(flags); + + if (b_databit_9) { + // Send MSB + b_databit_9 = false; + value = value >> 8; + goto udi_cdc_putc_process_one_byte; + } + return true; +} + +int udi_cdc_putc(int value) +{ + return udi_cdc_multi_putc(0, value); +} + +iram_size_t __attribute__((optimize("O0"))) udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size) +{ + irqflags_t flags; + uint8_t buf_sel; + uint16_t buf_nb; + iram_size_t copy_nb; + uint8_t *ptr_buf = (uint8_t *)buf; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + if (9 == udi_cdc_line_coding[port].bDataBits) { + size *=2; + } + +udi_cdc_write_buf_loop_wait: + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_write_buf_loop_wait; + } + + // Write values + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + copy_nb = UDI_CDC_TX_BUFFERS - buf_nb; + if (copy_nb > size) { + copy_nb = size; + } + memcpy(&udi_cdc_tx_buf[port][buf_sel][buf_nb], ptr_buf, copy_nb); + udi_cdc_tx_buf_nb[port][buf_sel] = buf_nb + copy_nb; + cpu_irq_restore(flags); + + // Update buffer pointer + ptr_buf = ptr_buf + copy_nb; + size -= copy_nb; + + if (size) { + goto udi_cdc_write_buf_loop_wait; + } + + return 0; +} + +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size) +{ + return udi_cdc_multi_write_buf(0, buf, size); +} + +//@} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h new file mode 100644 index 0000000000..45c5cef5ae --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h @@ -0,0 +1,810 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface definitions. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_H_ +#define _UDI_CDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +// Check the number of port +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 +#endif +#if (UDI_CDC_PORT_NB < 1) || (UDI_CDC_PORT_NB > 7) +# error UDI_CDC_PORT_NB must be between 1 and 7 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_cdc_group_udc + * @{ + */ + +//! Global structure which contains standard UDI API for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm; +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; +//@} + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_desc USB interface descriptors + * + * The following structures provide predefined USB interface descriptors. + * It must be used to define the final USB descriptors. + */ +//@{ + +/** + * \brief Communication Class interface descriptor + * + * Interface descriptor with associated functional and endpoint + * descriptors for the CDC Communication Class interface. + */ +typedef struct { + //! Standard interface descriptor + usb_iface_desc_t iface; + //! CDC Header functional descriptor + usb_cdc_hdr_desc_t header; + //! CDC Abstract Control Model functional descriptor + usb_cdc_acm_desc_t acm; + //! CDC Union functional descriptor + usb_cdc_union_desc_t union_desc; + //! CDC Call Management functional descriptor + usb_cdc_call_mgmt_desc_t call_mgmt; + //! Notification endpoint descriptor + usb_ep_desc_t ep_notify; +} udi_cdc_comm_desc_t; + + +/** + * \brief Data Class interface descriptor + * + * Interface descriptor with associated endpoint descriptors for the + * CDC Data Class interface. + */ +typedef struct { + //! Standard interface descriptor + usb_iface_desc_t iface; + //! Data IN/OUT endpoint descriptors + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; +} udi_cdc_data_desc_t; + + +//! CDC communication endpoints size for all speeds +#define UDI_CDC_COMM_EP_SIZE 64 +//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) +#define UDI_CDC_DATA_EPS_FS_SIZE 64 +//! CDC data endpoints size for HS speed (512B only) +#define UDI_CDC_DATA_EPS_HS_SIZE 512 + +/** + * \name Content of interface descriptors + * Up to 7 CDC interfaces can be implemented on a USB device. + */ +//@{ +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_0 +#define UDI_CDC_IAD_STRING_ID_0 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_0 +#define UDI_CDC_COMM_STRING_ID_0 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_0 +#define UDI_CDC_DATA_STRING_ID_0 0 +#endif +#define UDI_CDC_IAD_DESC_0 UDI_CDC_IAD_DESC(0) +#define UDI_CDC_COMM_DESC_0 UDI_CDC_COMM_DESC(0) +#define UDI_CDC_DATA_DESC_0_FS UDI_CDC_DATA_DESC_FS(0) +#define UDI_CDC_DATA_DESC_0_HS UDI_CDC_DATA_DESC_HS(0) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_1 +#define UDI_CDC_IAD_STRING_ID_1 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_1 +#define UDI_CDC_COMM_STRING_ID_1 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_1 +#define UDI_CDC_DATA_STRING_ID_1 0 +#endif +#define UDI_CDC_IAD_DESC_1 UDI_CDC_IAD_DESC(1) +#define UDI_CDC_COMM_DESC_1 UDI_CDC_COMM_DESC(1) +#define UDI_CDC_DATA_DESC_1_FS UDI_CDC_DATA_DESC_FS(1) +#define UDI_CDC_DATA_DESC_1_HS UDI_CDC_DATA_DESC_HS(1) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_2 +#define UDI_CDC_IAD_STRING_ID_2 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_2 +#define UDI_CDC_COMM_STRING_ID_2 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_2 +#define UDI_CDC_DATA_STRING_ID_2 0 +#endif +#define UDI_CDC_IAD_DESC_2 UDI_CDC_IAD_DESC(2) +#define UDI_CDC_COMM_DESC_2 UDI_CDC_COMM_DESC(2) +#define UDI_CDC_DATA_DESC_2_FS UDI_CDC_DATA_DESC_FS(2) +#define UDI_CDC_DATA_DESC_2_HS UDI_CDC_DATA_DESC_HS(2) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_3 +#define UDI_CDC_IAD_STRING_ID_3 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_3 +#define UDI_CDC_COMM_STRING_ID_3 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_3 +#define UDI_CDC_DATA_STRING_ID_3 0 +#endif +#define UDI_CDC_IAD_DESC_3 UDI_CDC_IAD_DESC(3) +#define UDI_CDC_COMM_DESC_3 UDI_CDC_COMM_DESC(3) +#define UDI_CDC_DATA_DESC_3_FS UDI_CDC_DATA_DESC_FS(3) +#define UDI_CDC_DATA_DESC_3_HS UDI_CDC_DATA_DESC_HS(3) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_4 +#define UDI_CDC_IAD_STRING_ID_4 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_4 +#define UDI_CDC_COMM_STRING_ID_4 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_4 +#define UDI_CDC_DATA_STRING_ID_4 0 +#endif +#define UDI_CDC_IAD_DESC_4 UDI_CDC_IAD_DESC(4) +#define UDI_CDC_COMM_DESC_4 UDI_CDC_COMM_DESC(4) +#define UDI_CDC_DATA_DESC_4_FS UDI_CDC_DATA_DESC_FS(4) +#define UDI_CDC_DATA_DESC_4_HS UDI_CDC_DATA_DESC_HS(4) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_5 +#define UDI_CDC_IAD_STRING_ID_5 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_5 +#define UDI_CDC_COMM_STRING_ID_5 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_5 +#define UDI_CDC_DATA_STRING_ID_5 0 +#endif +#define UDI_CDC_IAD_DESC_5 UDI_CDC_IAD_DESC(5) +#define UDI_CDC_COMM_DESC_5 UDI_CDC_COMM_DESC(5) +#define UDI_CDC_DATA_DESC_5_FS UDI_CDC_DATA_DESC_FS(5) +#define UDI_CDC_DATA_DESC_5_HS UDI_CDC_DATA_DESC_HS(5) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_6 +#define UDI_CDC_IAD_STRING_ID_6 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_6 +#define UDI_CDC_COMM_STRING_ID_6 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_6 +#define UDI_CDC_DATA_STRING_ID_6 0 +#endif +#define UDI_CDC_IAD_DESC_6 UDI_CDC_IAD_DESC(6) +#define UDI_CDC_COMM_DESC_6 UDI_CDC_COMM_DESC(6) +#define UDI_CDC_DATA_DESC_6_FS UDI_CDC_DATA_DESC_FS(6) +#define UDI_CDC_DATA_DESC_6_HS UDI_CDC_DATA_DESC_HS(6) +//@} + + +//! Content of CDC IAD interface descriptor for all speeds +#define UDI_CDC_IAD_DESC(port) { \ + .bLength = sizeof(usb_iad_desc_t),\ + .bDescriptorType = USB_DT_IAD,\ + .bInterfaceCount = 2,\ + .bFunctionClass = CDC_CLASS_COMM,\ + .bFunctionSubClass = CDC_SUBCLASS_ACM,\ + .bFunctionProtocol = CDC_PROTOCOL_V25TER,\ + .bFirstInterface = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .iFunction = UDI_CDC_IAD_STRING_ID_##port,\ + } + +//! Content of CDC COMM interface descriptor for all speeds +#define UDI_CDC_COMM_DESC(port) { \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = CDC_CLASS_COMM,\ + .iface.bInterfaceSubClass = CDC_SUBCLASS_ACM,\ + .iface.bInterfaceProtocol = CDC_PROTOCOL_V25TER,\ + .header.bFunctionLength = sizeof(usb_cdc_hdr_desc_t),\ + .header.bDescriptorType = CDC_CS_INTERFACE,\ + .header.bDescriptorSubtype = CDC_SCS_HEADER,\ + .header.bcdCDC = LE16(0x0110),\ + .call_mgmt.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t),\ + .call_mgmt.bDescriptorType = CDC_CS_INTERFACE,\ + .call_mgmt.bDescriptorSubtype = CDC_SCS_CALL_MGMT,\ + .call_mgmt.bmCapabilities = \ + CDC_CALL_MGMT_SUPPORTED | CDC_CALL_MGMT_OVER_DCI,\ + .acm.bFunctionLength = sizeof(usb_cdc_acm_desc_t),\ + .acm.bDescriptorType = CDC_CS_INTERFACE,\ + .acm.bDescriptorSubtype = CDC_SCS_ACM,\ + .acm.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS,\ + .union_desc.bFunctionLength = sizeof(usb_cdc_union_desc_t),\ + .union_desc.bDescriptorType = CDC_CS_INTERFACE,\ + .union_desc.bDescriptorSubtype= CDC_SCS_UNION,\ + .ep_notify.bLength = sizeof(usb_ep_desc_t),\ + .ep_notify.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_notify.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_notify.wMaxPacketSize = LE16(UDI_CDC_COMM_EP_SIZE),\ + .ep_notify.bInterval = 0x10,\ + .ep_notify.bEndpointAddress = UDI_CDC_COMM_EP_##port,\ + .iface.bInterfaceNumber = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .call_mgmt.bDataInterface = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .union_desc.bMasterInterface = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .union_desc.bSlaveInterface0 = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_COMM_STRING_ID_##port,\ + } + +//! Content of CDC DATA interface descriptors +#define UDI_CDC_DATA_DESC_COMMON \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = CDC_CLASS_DATA,\ + .iface.bInterfaceSubClass = 0,\ + .iface.bInterfaceProtocol = 0,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_in.bInterval = 0,\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_out.bInterval = 0, + +#define UDI_CDC_DATA_DESC_FS(port) { \ + UDI_CDC_DATA_DESC_COMMON \ + .ep_in.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_FS_SIZE),\ + .ep_out.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_FS_SIZE),\ + .ep_in.bEndpointAddress = UDI_CDC_DATA_EP_IN_##port,\ + .ep_out.bEndpointAddress = UDI_CDC_DATA_EP_OUT_##port,\ + .iface.bInterfaceNumber = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_DATA_STRING_ID_##port,\ + } + +#define UDI_CDC_DATA_DESC_HS(port) { \ + UDI_CDC_DATA_DESC_COMMON \ + .ep_in.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_HS_SIZE),\ + .ep_out.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_HS_SIZE),\ + .ep_in.bEndpointAddress = UDI_CDC_DATA_EP_IN_##port,\ + .ep_out.bEndpointAddress = UDI_CDC_DATA_EP_OUT_##port,\ + .iface.bInterfaceNumber = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_DATA_STRING_ID_##port,\ + } + +//@} + +/** + * \ingroup udi_group + * \defgroup udi_cdc_group USB Device Interface (UDI) for Communication Class Device (CDC) + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used to transfer and control data + * to/from USB CDC endpoint. + * + * See \ref udi_cdc_quickstart. + * @{ + */ + +/** + * \name Interface for application with single CDC interface support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dcd(bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dsr(bool b_set); + +/** + * \brief Notify a framing error + */ +void udi_cdc_signal_framing_error(void); + +/** + * \brief Notify a parity error + */ +void udi_cdc_signal_parity_error(void); + +/** + * \brief Notify a overrun + */ +void udi_cdc_signal_overrun(void); + +/** + * \brief Gets the number of byte received + * + * \return the number of data available + */ +iram_size_t udi_cdc_get_nb_received_data(void); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_is_rx_ready(void); + +/** + * \brief Waits and gets a value on CDC line + * + * \return value read on CDC line + */ +int udi_cdc_getc(void); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param buf Values read + * \param size Number of value read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size); + +/** + * \brief Non polling reads of a up to 'size' data from CDC line + * + * \param port Communication port number to manage + * \param buf Buffer where to store read data + * \param size Maximum number of data to read (size of buffer) + * + * \return the number of data effectively read + */ +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_get_free_tx_buffer(void); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_is_tx_ready(void); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_putc(int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size); +//@} + +/** + * \name Interface for application with multi CDC interfaces support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param port Communication port number to manage + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param port Communication port number to manage + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set); + +/** + * \brief Notify a framing error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_framing_error(uint8_t port); + +/** + * \brief Notify a parity error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_parity_error(uint8_t port); + +/** + * \brief Notify a overrun + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_overrun(uint8_t port); + +/** + * \brief Gets the number of byte received + * + * \param port Communication port number to manage + * + * \return the number of data available + */ +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \param port Communication port number to manage + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_multi_is_rx_ready(uint8_t port); + +/** + * \brief Waits and gets a value on CDC line + * + * \param port Communication port number to manage + * + * \return value read on CDC line + */ +int udi_cdc_multi_getc(uint8_t port); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values read + * \param size Number of values read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \param port Communication port number to manage + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_multi_get_free_tx_buffer(uint8_t port); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \param port Communication port number to manage + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_multi_is_tx_ready(uint8_t port); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param port Communication port number to manage + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_multi_putc(uint8_t port, int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size); +//@} + +//@} + +/** + * \page udi_cdc_quickstart Quick start guide for USB device Communication Class Device module (UDI CDC) + * + * This is the quick start guide for the \ref udi_cdc_group + * "USB device interface CDC module (UDI CDC)" with step-by-step instructions on + * how to configure and use the modules in a selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section udi_cdc_basic_use_case Basic use case + * In this basic use case, the "USB CDC (Single Interface Device)" module is used + * with only one communication port. + * The "USB CDC (Composite Device)" module usage is described in \ref udi_cdc_use_cases + * "Advanced use cases". + * + * \section udi_cdc_basic_use_case_setup Setup steps + * \subsection udi_cdc_basic_use_case_setup_prereq Prerequisites + * \copydetails udc_basic_use_case_setup_prereq + * \subsection udi_cdc_basic_use_case_setup_code Example code + * \copydetails udc_basic_use_case_setup_code + * \subsection udi_cdc_basic_use_case_setup_flow Workflow + * \copydetails udc_basic_use_case_setup_flow + * + * \section udi_cdc_basic_use_case_usage Usage steps + * + * \subsection udi_cdc_basic_use_case_usage_code Example code + * Content of conf_usb.h: + * \code + #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() + extern bool my_callback_cdc_enable(void); + #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() + extern void my_callback_cdc_disable(void); + #define UDI_CDC_LOW_RATE + + #define UDI_CDC_DEFAULT_RATE 115200 + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 + + #include "udi_cdc_conf.h" // At the end of conf_usb.h file +\endcode + * + * Add to application C-file: + * \code + static bool my_flag_autorize_cdc_transfert = false; + bool my_callback_cdc_enable(void) + { + my_flag_autorize_cdc_transfert = true; + return true; + } + void my_callback_cdc_disable(void) + { + my_flag_autorize_cdc_transfert = false; + } + + void task(void) + { + if (my_flag_autorize_cdc_transfert) { + udi_cdc_putc('A'); + udi_cdc_getc(); + } + } +\endcode + * + * \subsection udi_cdc_basic_use_case_setup_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following configuration, + * which is the USB device CDC configuration: + * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for CDC \endcode + * \note The USB serial number is mandatory when a CDC interface is used. + * - \code #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() + extern bool my_callback_cdc_enable(void); \endcode + * \note After the device enumeration (detecting and identifying USB devices), + * the USB host starts the device configuration. When the USB CDC interface + * from the device is accepted by the host, the USB host enables this interface and the + * UDI_CDC_ENABLE_EXT() callback function is called and return true. + * Thus, when this event is received, the data transfer on CDC interface are authorized. + * - \code #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() + extern void my_callback_cdc_disable(void); \endcode + * \note When the USB device is unplugged or is reset by the USB host, the USB + * interface is disabled and the UDI_CDC_DISABLE_EXT() callback function + * is called. Thus, the data transfer must be stopped on CDC interface. + * - \code #define UDI_CDC_LOW_RATE \endcode + * \note Define it when the transfer CDC Device to Host is a low rate + * (<512000 bauds) to reduce CDC buffers size. + * - \code #define UDI_CDC_DEFAULT_RATE 115200 + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 \endcode + * \note Default configuration of communication port at startup. + * -# Send or wait data on CDC line: + * - \code // Waits and gets a value on CDC line + int udi_cdc_getc(void); + // Reads a RAM buffer on CDC line + iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size); + // Puts a byte on CDC line + int udi_cdc_putc(int value); + // Writes a RAM buffer on CDC line + iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode + * + * \section udi_cdc_use_cases Advanced use cases + * For more advanced use of the UDI CDC module, see the following use cases: + * - \subpage udi_cdc_use_case_composite + * - \subpage udc_use_case_1 + * - \subpage udc_use_case_2 + * - \subpage udc_use_case_3 + * - \subpage udc_use_case_4 + * - \subpage udc_use_case_5 + * - \subpage udc_use_case_6 + */ + +/** + * \page udi_cdc_use_case_composite CDC in a composite device + * + * A USB Composite Device is a USB Device which uses more than one USB class. + * In this use case, the "USB CDC (Composite Device)" module is used to + * create a USB composite device. Thus, this USB module can be associated with + * another "Composite Device" module, like "USB HID Mouse (Composite Device)". + * + * Also, you can refer to application note + * + * AVR4902 ASF - USB Composite Device. + * + * \section udi_cdc_use_case_composite_setup Setup steps + * For the setup code of this use case to work, the + * \ref udi_cdc_basic_use_case "basic use case" must be followed. + * + * \section udi_cdc_use_case_composite_usage Usage steps + * + * \subsection udi_cdc_use_case_composite_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+2) + #define USB_DEVICE_MAX_EP (X+3) + + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 + + #define UDI_COMPOSITE_DESC_T \ + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... +\endcode + * + * \subsection udi_cdc_use_case_composite_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB composite device configuration: + * - \code // Endpoint control size, This must be: + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 2 for CDC. + #define USB_DEVICE_NB_INTERFACE (X+2) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 3 for CDC. + #define USB_DEVICE_MAX_EP (X+3) \endcode + * -# Ensure that conf_usb.h contains the description of + * composite device: + * - \code // The endpoint numbers chosen by you for the CDC. + // The endpoint numbers starting from 1. + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + // The interface index of an interface starting from 0 + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB composite device configuration: + * - \code // USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + ... + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... \endcode + * - \note The descriptors order given in the four lists above must be the + * same as the order defined by all interface indexes. The interface index + * orders are defined through UDI_X_IFACE_NUMBER defines.\n + * Also, the CDC requires a USB Interface Association Descriptor (IAD) for + * composite device. + */ + +#ifdef __cplusplus +} +#endif +#endif // _UDI_CDC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h new file mode 100644 index 0000000000..b99d611171 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h @@ -0,0 +1,156 @@ +/** + * \file + * + * \brief Default CDC configuration for a USB Device with a single interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_CONF_H_ +#define _UDI_CDC_CONF_H_ + +#include "usb_protocol_cdc.h" +#include "conf_usb.h" + +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_cdc_group_single_desc + * @{ + */ + +//! Control endpoint size (Endpoint 0) +#define USB_DEVICE_EP_CTRL_SIZE 64 + +#if XMEGA +/** + * \name Endpoint configuration on XMEGA + * The XMEGA supports a IN and OUT endpoint with the same number endpoint, + * thus XMEGA can support up to 7 CDC interfaces. + */ +//@{ +#define UDI_CDC_DATA_EP_IN_0 ( 1 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_0 ( 2 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_0 ( 2 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_1 ( 3 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_1 ( 4 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_1 ( 4 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_2 ( 5 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_2 ( 6 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_2 ( 6 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_3 ( 7 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_3 ( 8 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_3 ( 8 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_4 ( 9 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_4 (10 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_4 (10 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_5 (11 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_5 (12 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_5 (12 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_6 (13 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_6 (14 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_6 (14 | USB_EP_DIR_IN) // Notify endpoint +//! 2 endpoints numbers used per CDC interface +#define USB_DEVICE_MAX_EP (2*UDI_CDC_PORT_NB) +//@} + +#else + +/** + * \name Default endpoint configuration + * The USBB, UDP, UDPHS and UOTGHS interfaces can support up to 2 CDC interfaces. + */ +//@{ +# if UDI_CDC_PORT_NB > 2 +# error USBB, UDP, UDPHS and UOTGHS interfaces have not enought endpoints. +# endif +#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint +# if SAM3U + /* For 3U max endpoint size of 4 is 64, use 5 and 6 as bulk tx and rx */ +# define UDI_CDC_DATA_EP_IN_1 (6 | USB_EP_DIR_IN) // TX +# define UDI_CDC_DATA_EP_OUT_1 (5 | USB_EP_DIR_OUT) // RX +# define UDI_CDC_COMM_EP_1 (4 | USB_EP_DIR_IN) // Notify +# else +# define UDI_CDC_DATA_EP_IN_1 (4 | USB_EP_DIR_IN) // TX +# define UDI_CDC_DATA_EP_OUT_1 (5 | USB_EP_DIR_OUT) // RX +# define UDI_CDC_COMM_EP_1 (6 | USB_EP_DIR_IN) // Notify +# endif +//! 3 endpoints used per CDC interface +#undef USB_DEVICE_MAX_EP // undefine this definition in header file +#define USB_DEVICE_MAX_EP (3*UDI_CDC_PORT_NB) +//@} + +#endif + +/** + * \name Default Interface numbers + */ +//@{ +#define UDI_CDC_COMM_IFACE_NUMBER_0 0 +#define UDI_CDC_DATA_IFACE_NUMBER_0 1 +#define UDI_CDC_COMM_IFACE_NUMBER_1 2 +#define UDI_CDC_DATA_IFACE_NUMBER_1 3 +#define UDI_CDC_COMM_IFACE_NUMBER_2 4 +#define UDI_CDC_DATA_IFACE_NUMBER_2 5 +#define UDI_CDC_COMM_IFACE_NUMBER_3 6 +#define UDI_CDC_DATA_IFACE_NUMBER_3 7 +#define UDI_CDC_COMM_IFACE_NUMBER_4 8 +#define UDI_CDC_DATA_IFACE_NUMBER_4 9 +#define UDI_CDC_COMM_IFACE_NUMBER_5 10 +#define UDI_CDC_DATA_IFACE_NUMBER_5 11 +#define UDI_CDC_COMM_IFACE_NUMBER_6 12 +#define UDI_CDC_DATA_IFACE_NUMBER_6 13 +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_CDC_CONF_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c new file mode 100644 index 0000000000..8f730ba823 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c @@ -0,0 +1,261 @@ +/** + * \file + * + * \brief Default descriptors for a USB Device with a single interface CDC + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi_cdc.h" + +#if DISABLED(SDSUPPORT) + +/** + * \defgroup udi_cdc_group_single_desc USB device descriptors for a single interface + * + * The following structures provide the USB device descriptors required for + * USB Device with a single interface CDC. + * + * It is ready to use and do not require more definition. + * + * @{ + */ + +//! Two interfaces for a CDC device +#define USB_DEVICE_NB_INTERFACE (2*UDI_CDC_PORT_NB) + +#ifdef USB_DEVICE_LPM_SUPPORT +# define USB_VERSION USB_V2_1 +#else +# define USB_VERSION USB_V2_0 +#endif + +//! USB Device Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_VERSION), +#if UDI_CDC_PORT_NB > 1 + .bDeviceClass = 0, +#else + .bDeviceClass = CDC_CLASS_DEVICE, +#endif + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16((USB_DEVICE_MAJOR_VERSION << 8) + | USB_DEVICE_MINOR_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_VERSION), +#if UDI_CDC_PORT_NB > 1 + .bDeviceClass = 0, +#else + .bDeviceClass = CDC_CLASS_DEVICE, +#endif + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif + +#ifdef USB_DEVICE_LPM_SUPPORT +//! USB Device Qualifier Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_lpm_desc_t udc_device_lpm = { + .bos.bLength = sizeof(usb_dev_bos_desc_t), + .bos.bDescriptorType = USB_DT_BOS, + .bos.wTotalLength = LE16(sizeof(usb_dev_bos_desc_t) + sizeof(usb_dev_capa_ext_desc_t)), + .bos.bNumDeviceCaps = 1, + .capa_ext.bLength = sizeof(usb_dev_capa_ext_desc_t), + .capa_ext.bDescriptorType = USB_DT_DEVICE_CAPABILITY, + .capa_ext.bDevCapabilityType = USB_DC_USB20_EXTENSION, + .capa_ext.bmAttributes = USB_DC_EXT_LPM, +}; +#endif + +//! Structure for USB Device Configuration Descriptor +COMPILER_PACK_SET(1) +typedef struct { + usb_conf_desc_t conf; +#if UDI_CDC_PORT_NB == 1 + udi_cdc_comm_desc_t udi_cdc_comm_0; + udi_cdc_data_desc_t udi_cdc_data_0; +#else +# define UDI_CDC_DESC_STRUCTURE(index, unused) \ + usb_iad_desc_t udi_cdc_iad_##index; \ + udi_cdc_comm_desc_t udi_cdc_comm_##index; \ + udi_cdc_data_desc_t udi_cdc_data_##index; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_STRUCTURE, ~) +# undef UDI_CDC_DESC_STRUCTURE +#endif +} udc_desc_t; +COMPILER_PACK_RESET() + +//! USB Device Configuration Descriptor filled for full and high speed +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_fs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), +#if UDI_CDC_PORT_NB == 1 + .udi_cdc_comm_0 = UDI_CDC_COMM_DESC_0, + .udi_cdc_data_0 = UDI_CDC_DATA_DESC_0_FS, +#else +# define UDI_CDC_DESC_FS(index, unused) \ + .udi_cdc_iad_##index = UDI_CDC_IAD_DESC_##index,\ + .udi_cdc_comm_##index = UDI_CDC_COMM_DESC_##index,\ + .udi_cdc_data_##index = UDI_CDC_DATA_DESC_##index##_FS, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_FS, ~) +# undef UDI_CDC_DESC_FS +#endif +}; + +#ifdef USB_DEVICE_HS_SUPPORT +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_hs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), +#if UDI_CDC_PORT_NB == 1 + .udi_cdc_comm_0 = UDI_CDC_COMM_DESC_0, + .udi_cdc_data_0 = UDI_CDC_DATA_DESC_0_HS, +#else +# define UDI_CDC_DESC_HS(index, unused) \ + .udi_cdc_iad_##index = UDI_CDC_IAD_DESC_##index, \ + .udi_cdc_comm_##index = UDI_CDC_COMM_DESC_##index, \ + .udi_cdc_data_##index = UDI_CDC_DATA_DESC_##index##_HS, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_HS, ~) +# undef UDI_CDC_DESC_HS +#endif +}; +#endif + +/** + * \name UDC structures which content all USB Device definitions + */ +//@{ + +//! Associate an UDI for each USB interface +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { +# define UDI_CDC_API(index, unused) \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_API, ~) +# undef UDI_CDC_API +}; + +//! Add UDI with USB Descriptors FS & HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_fs[1] = { { + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_fs, + .udi_apis = udi_apis, +}}; +#ifdef USB_DEVICE_HS_SUPPORT +UDC_DESC_STORAGE udc_config_speed_t udc_config_hs[1] = { { + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_hs, + .udi_apis = udi_apis, +}}; +#endif + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_fs, +#ifdef USB_DEVICE_HS_SUPPORT + .confdev_hs = &udc_device_desc, + .qualifier = &udc_device_qual, + .conf_hs = udc_config_hs, +#endif +#ifdef USB_DEVICE_LPM_SUPPORT + .conf_bos = &udc_device_lpm.bos, +#else + .conf_bos = NULL, +#endif +}; + +//@} +//@} + +#endif // SDSUPPORT + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c new file mode 100644 index 0000000000..3c5f001a26 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c @@ -0,0 +1,192 @@ +/** + * \file + * + * \brief Descriptors for an USB Composite Device + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "udd.h" +#include "udc_desc.h" + +#if ENABLED(SDSUPPORT) + +/** + * \defgroup udi_group_desc Descriptors for a USB Device + * composite + * + * @{ + */ + +/**INDENT-OFF**/ + +//! USB Device Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16((USB_DEVICE_MAJOR_VERSION << 8) + | USB_DEVICE_MINOR_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif + +//! Structure for USB Device Configuration Descriptor +COMPILER_PACK_SET(1) +typedef struct { + usb_conf_desc_t conf; + UDI_COMPOSITE_DESC_T; +} udc_desc_t; +COMPILER_PACK_RESET() + +//! USB Device Configuration Descriptor filled for FS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_fs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + UDI_COMPOSITE_DESC_FS +}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Configuration Descriptor filled for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_hs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + UDI_COMPOSITE_DESC_HS +}; +#endif + + +/** + * \name UDC structures which contains all USB Device definitions + */ +//@{ + +//! Associate an UDI for each USB interface +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { + UDI_COMPOSITE_API +}; + +//! Add UDI with USB Descriptors FS +UDC_DESC_STORAGE udc_config_speed_t udc_config_lsfs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_fs, + .udi_apis = udi_apis, +}}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! Add UDI with USB Descriptors HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_hs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_hs, + .udi_apis = udi_apis, +}}; +#endif + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_lsfs, +#ifdef USB_DEVICE_HS_SUPPORT + .confdev_hs = &udc_device_desc, + .qualifier = &udc_device_qual, + .conf_hs = udc_config_hs, +#endif +}; + +//@} +/**INDENT-ON**/ +//@} + +#endif // ARDUINO_ARCH_SAM + +#endif // SDSUPPORT diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c new file mode 100644 index 0000000000..97d3f2990b --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c @@ -0,0 +1,1132 @@ +/** + * \file + * + * \brief USB Device Mass Storage Class (MSC) interface. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_msc.h" +#include "spc_protocol.h" +#include "sbc_protocol.h" +#include "udd.h" +#include "udc.h" +#include "udi_msc.h" +#include "ctrl_access.h" +#include + +#if ENABLED(SDSUPPORT) + +#ifndef UDI_MSC_NOTIFY_TRANS_EXT +# define UDI_MSC_NOTIFY_TRANS_EXT() +#endif + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_msc_enable(void); +void udi_msc_disable(void); +bool udi_msc_setup(void); +uint8_t udi_msc_getsetting(void); + +//! Global structure which contains standard UDI API for UDC +UDC_DESC_STORAGE udi_api_t udi_api_msc = { + .enable = udi_msc_enable, + .disable = udi_msc_disable, + .setup = udi_msc_setup, + .getsetting = udi_msc_getsetting, + .sof_notify = NULL, +}; +//@} + + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group_internal Implementation of UDI MSC + * + * Class internal implementation + * @{ + */ + +//! Static block size for all memories +#define UDI_MSC_BLOCK_SIZE 512L + +/** + * \name Variables to manage SCSI requests + */ +//@{ + +//! Structure to receive a CBW packet +UDC_BSS(4) static struct usb_msc_cbw udi_msc_cbw; +//! Structure to send a CSW packet +UDC_DATA(4) static struct usb_msc_csw udi_msc_csw = + {.dCSWSignature = CPU_TO_BE32(USB_CSW_SIGNATURE) }; +//! Number of lun +UDC_DATA(4) static uint8_t udi_msc_nb_lun = 0; +//! Structure with current SCSI sense data +UDC_BSS(4) static struct scsi_request_sense_data udi_msc_sense; + +/** + * \name Variables to manage the background read/write SCSI commands + */ +//@{ +//! True if an invalid CBW command has been detected +static bool udi_msc_b_cbw_invalid = false; +//! True if a transfer command must be processed +static bool udi_msc_b_trans_req = false; +//! True if it is a read command, else write command +static bool udi_msc_b_read; +//! Memory address to execute the command +static uint32_t udi_msc_addr; +//! Number of block to transfer +static uint16_t udi_msc_nb_block; +//! Signal end of transfer, if true +volatile bool udi_msc_b_ack_trans = true; +//! Status of transfer, aborted if true +volatile bool udi_msc_b_abort_trans; +//! Signal (re)init of transfer, if true (by reset/reconnect) +volatile bool udi_msc_b_reset_trans = true; +//@} + +//@} + + +/** + * \name Internal routines + */ +//@{ + +/** + * \name Routines to process CBW packet + */ +//@{ + +/** + * \brief Stall CBW request + */ +static void udi_msc_cbw_invalid(void); + +/** + * \brief Stall CSW request + */ +static void udi_msc_csw_invalid(void); + +/** + * \brief Links a callback and buffer on endpoint OUT reception + * + * Called by: + * - enable interface + * - at the end of previous command after sending the CSW + */ +static void udi_msc_cbw_wait(void); + +/** + * \brief Callback called after CBW reception + * Called by UDD when a transfer is finished or aborted + * + * \param status UDD_EP_TRANSFER_OK, if transfer is finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param nb_received number of data transfered + */ +static void udi_msc_cbw_received(udd_ep_status_t status, + iram_size_t nb_received, udd_ep_id_t ep); + +/** + * \brief Function to check the CBW length and direction + * Call it after SCSI command decode to check integrity of command + * + * \param alloc_len number of bytes that device want transfer + * \param dir_flag Direction of transfer (USB_CBW_DIRECTION_IN/OUT) + * + * \retval true if the command can be processed + */ +static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag); +//@} + + +/** + * \name Routines to process small data packet + */ +//@{ + +/** + * \brief Sends data on MSC IN endpoint + * Called by SCSI command which must send a data to host followed by a CSW + * + * \param buffer Internal RAM buffer to send + * \param buf_size Size of buffer to send + */ +static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size); + +/** + * \brief Callback called after data sent + * It start CSW packet process + * + * \param status UDD_EP_TRANSFER_OK, if transfer finish + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param nb_sent number of data transfered + */ +static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep); +//@} + + +/** + * \name Routines to process CSW packet + */ +//@{ + +/** + * \brief Build CSW packet and send it + * + * Called at the end of SCSI command + */ +static void udi_msc_csw_process(void); + +/** + * \brief Sends CSW + * + * Called by #udi_msc_csw_process() + * or UDD callback when endpoint halt is cleared + */ +void udi_msc_csw_send(void); + +/** + * \brief Callback called after CSW sent + * It restart CBW reception. + * + * \param status UDD_EP_TRANSFER_OK, if transfer is finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param nb_sent number of data transfered + */ +static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep); +//@} + + +/** + * \name Routines manage sense data + */ +//@{ + +/** + * \brief Reinitialize sense data. + */ +static void udi_msc_clear_sense(void); + +/** + * \brief Update sense data with new value to signal a fail + * + * \param sense_key Sense key + * \param add_sense Additional Sense Code + * \param lba LBA corresponding at error + */ +static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, + uint32_t lba); + +/** + * \brief Update sense data with new value to signal success + */ +static void udi_msc_sense_pass(void); + +/** + * \brief Update sense data to signal that memory is not present + */ +static void udi_msc_sense_fail_not_present(void); + +/** + * \brief Update sense data to signal that memory is busy + */ +static void udi_msc_sense_fail_busy_or_change(void); + +/** + * \brief Update sense data to signal a hardware error on memory + */ +static void udi_msc_sense_fail_hardware(void); + +/** + * \brief Update sense data to signal that memory is protected + */ +static void udi_msc_sense_fail_protected(void); + +/** + * \brief Update sense data to signal that CDB fields are not valid + */ +static void udi_msc_sense_fail_cdb_invalid(void); + +/** + * \brief Update sense data to signal that command is not supported + */ +static void udi_msc_sense_command_invalid(void); +//@} + + +/** + * \name Routines manage SCSI Commands + */ +//@{ + +/** + * \brief Process SPC Request Sense command + * Returns error information about last command + */ +static void udi_msc_spc_requestsense(void); + +/** + * \brief Process SPC Inquiry command + * Returns information (name,version) about disk + */ +static void udi_msc_spc_inquiry(void); + +/** + * \brief Checks state of disk + * + * \retval true if disk is ready, otherwise false and updates sense data + */ +static bool udi_msc_spc_testunitready_global(void); + +/** + * \brief Process test unit ready command + * Returns state of logical unit + */ +static void udi_msc_spc_testunitready(void); + +/** + * \brief Process prevent allow medium removal command + */ +static void udi_msc_spc_prevent_allow_medium_removal(void); + +/** + * \brief Process mode sense command + * + * \param b_sense10 Sense10 SCSI command, if true + * \param b_sense10 Sense6 SCSI command, if false + */ +static void udi_msc_spc_mode_sense(bool b_sense10); + +/** + * \brief Process start stop command + */ +static void udi_msc_sbc_start_stop(void); + +/** + * \brief Process read capacity command + */ +static void udi_msc_sbc_read_capacity(void); + +/** + * \brief Process read10 or write10 command + * + * \param b_read Read transfer, if true, + * \param b_read Write transfer, if false + */ +static void udi_msc_sbc_trans(bool b_read); +//@} + +//@} + + +bool udi_msc_enable(void) +{ + uint8_t lun; + udi_msc_b_trans_req = false; + udi_msc_b_cbw_invalid = false; + udi_msc_b_ack_trans = true; + udi_msc_b_reset_trans = true; + udi_msc_nb_lun = get_nb_lun(); + if (0 == udi_msc_nb_lun) + return false; // No lun available, then not authorize to enable interface + udi_msc_nb_lun--; + // Call application callback + // to initialize memories or signal that interface is enabled + if (!UDI_MSC_ENABLE_EXT()) + return false; + // Load the medium on each LUN + for (lun = 0; lun <= udi_msc_nb_lun; lun ++) { + mem_unload(lun, false); + } + // Start MSC process by CBW reception + udi_msc_cbw_wait(); + return true; +} + + +void udi_msc_disable(void) +{ + udi_msc_b_trans_req = false; + udi_msc_b_ack_trans = true; + udi_msc_b_reset_trans = true; + UDI_MSC_DISABLE_EXT(); +} + + +bool udi_msc_setup(void) +{ + if (Udd_setup_is_in()) { + // Requests Interface GET + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_MSC_GET_MAX_LUN: + // Give the number of memories available + if (1 != udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + if (0 != udd_g_ctrlreq.req.wValue) + return false; + udd_g_ctrlreq.payload = &udi_msc_nb_lun; + udd_g_ctrlreq.payload_size = 1; + return true; + } + } + } + if (Udd_setup_is_out()) { + // Requests Interface SET + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_MSC_BULK_RESET: + // Reset MSC interface + if (0 != udd_g_ctrlreq.req.wLength) + return false; + if (0 != udd_g_ctrlreq.req.wValue) + return false; + udi_msc_b_cbw_invalid = false; + udi_msc_b_trans_req = false; + // Abort all tasks (transfer or clear stall wait) on endpoints + udd_ep_abort(UDI_MSC_EP_OUT); + udd_ep_abort(UDI_MSC_EP_IN); + // Restart by CBW wait + udi_msc_cbw_wait(); + return true; + } + } + } + return false; // Not supported request +} + +uint8_t udi_msc_getsetting(void) +{ + return 0; // MSC don't have multiple alternate setting +} + + +//--------------------------------------------- +//------- Routines to process CBW packet + +static void udi_msc_cbw_invalid(void) +{ + if (!udi_msc_b_cbw_invalid) + return; // Don't re-stall endpoint if error reseted by setup + udd_ep_set_halt(UDI_MSC_EP_OUT); + // If stall cleared then re-stall it. Only Setup MSC Reset can clear it + udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid); +} + +static void udi_msc_csw_invalid(void) +{ + if (!udi_msc_b_cbw_invalid) + return; // Don't re-stall endpoint if error reseted by setup + udd_ep_set_halt(UDI_MSC_EP_IN); + // If stall cleared then re-stall it. Only Setup MSC Reset can clear it + udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid); +} + +static void udi_msc_cbw_wait(void) +{ + // Register buffer and callback on OUT endpoint + if (!udd_ep_run(UDI_MSC_EP_OUT, true, + (uint8_t *) & udi_msc_cbw, + sizeof(udi_msc_cbw), + udi_msc_cbw_received)) { + // OUT endpoint not available (halted), then wait a clear of halt. + udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_wait); + } +} + + +static void udi_msc_cbw_received(udd_ep_status_t status, + iram_size_t nb_received, udd_ep_id_t ep) +{ + UNUSED(ep); + // Check status of transfer + if (UDD_EP_TRANSFER_OK != status) { + // Transfer aborted + // Now wait MSC setup reset to relaunch CBW reception + return; + } + // Check CBW integrity: + // transfer status/CBW length/CBW signature + if ((sizeof(udi_msc_cbw) != nb_received) + || (udi_msc_cbw.dCBWSignature != + CPU_TO_BE32(USB_CBW_SIGNATURE))) { + // (5.2.1) Devices receiving a CBW with an invalid signature should stall + // further traffic on the Bulk In pipe, and either stall further traffic + // or accept and discard further traffic on the Bulk Out pipe, until + // reset recovery. + udi_msc_b_cbw_invalid = true; + udi_msc_cbw_invalid(); + udi_msc_csw_invalid(); + return; + } + // Check LUN asked + udi_msc_cbw.bCBWLUN &= USB_CBW_LUN_MASK; + if (udi_msc_cbw.bCBWLUN > udi_msc_nb_lun) { + // Bad LUN, then stop command process + udi_msc_sense_fail_cdb_invalid(); + udi_msc_csw_process(); + return; + } + // Prepare CSW residue field with the size requested + udi_msc_csw.dCSWDataResidue = + le32_to_cpu(udi_msc_cbw.dCBWDataTransferLength); + + // Decode opcode + switch (udi_msc_cbw.CDB[0]) { + case SPC_REQUEST_SENSE: + udi_msc_spc_requestsense(); + break; + + case SPC_INQUIRY: + udi_msc_spc_inquiry(); + break; + + case SPC_MODE_SENSE6: + udi_msc_spc_mode_sense(false); + break; + case SPC_MODE_SENSE10: + udi_msc_spc_mode_sense(true); + break; + + case SPC_TEST_UNIT_READY: + udi_msc_spc_testunitready(); + break; + + case SBC_READ_CAPACITY10: + udi_msc_sbc_read_capacity(); + break; + + case SBC_START_STOP_UNIT: + udi_msc_sbc_start_stop(); + break; + + // Accepts request to support plug/plug in case of card reader + case SPC_PREVENT_ALLOW_MEDIUM_REMOVAL: + udi_msc_spc_prevent_allow_medium_removal(); + break; + + // Accepts request to support full format from Windows + case SBC_VERIFY10: + udi_msc_sense_pass(); + udi_msc_csw_process(); + break; + + case SBC_READ10: + udi_msc_sbc_trans(true); + break; + + case SBC_WRITE10: + udi_msc_sbc_trans(false); + break; + + default: + udi_msc_sense_command_invalid(); + udi_msc_csw_process(); + break; + } +} + + +static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) +{ + /* + * The following cases should result in a phase error: + * - Case 2: Hn < Di + * - Case 3: Hn < Do + * - Case 7: Hi < Di + * - Case 8: Hi <> Do + * - Case 10: Ho <> Di + * - Case 13: Ho < Do + */ + if (((udi_msc_cbw.bmCBWFlags ^ dir_flag) & USB_CBW_DIRECTION_IN) + || (udi_msc_csw.dCSWDataResidue < alloc_len)) { + udi_msc_sense_fail_cdb_invalid(); + udi_msc_csw_process(); + return false; + } + + /* + * The following cases should result in a stall and nonzero + * residue: + * - Case 4: Hi > Dn + * - Case 5: Hi > Di + * - Case 9: Ho > Dn + * - Case 11: Ho > Do + */ + return true; +} + + +//--------------------------------------------- +//------- Routines to process small data packet + +static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) +{ + // Sends data on IN endpoint + if (!udd_ep_run(UDI_MSC_EP_IN, true, + buffer, buf_size, udi_msc_data_sent)) { + // If endpoint not available, then exit process command + udi_msc_sense_fail_hardware(); + udi_msc_csw_process(); + } +} + + +static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep) +{ + UNUSED(ep); + if (UDD_EP_TRANSFER_OK != status) { + // Error protocol + // Now wait MSC setup reset to relaunch CBW reception + return; + } + // Update sense data + udi_msc_sense_pass(); + // Update CSW + udi_msc_csw.dCSWDataResidue -= nb_sent; + udi_msc_csw_process(); +} + + +//--------------------------------------------- +//------- Routines to process CSW packet + +static void udi_msc_csw_process(void) +{ + if (0 != udi_msc_csw.dCSWDataResidue) { + // Residue not NULL + // then STALL next request from USB host on corresponding endpoint + if (udi_msc_cbw.bmCBWFlags & USB_CBW_DIRECTION_IN) + udd_ep_set_halt(UDI_MSC_EP_IN); + else + udd_ep_set_halt(UDI_MSC_EP_OUT); + } + // Prepare and send CSW + udi_msc_csw.dCSWTag = udi_msc_cbw.dCBWTag; + udi_msc_csw.dCSWDataResidue = cpu_to_le32(udi_msc_csw.dCSWDataResidue); + udi_msc_csw_send(); +} + + +void udi_msc_csw_send(void) +{ + // Sends CSW on IN endpoint + if (!udd_ep_run(UDI_MSC_EP_IN, false, + (uint8_t *) & udi_msc_csw, + sizeof(udi_msc_csw), + udi_msc_csw_sent)) { + // Endpoint not available + // then restart CSW sent when endpoint IN STALL will be cleared + udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_send); + } +} + + +static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep) +{ + UNUSED(ep); + UNUSED(status); + UNUSED(nb_sent); + // CSW is sent or not + // In all case, restart process and wait CBW + udi_msc_cbw_wait(); +} + + +//--------------------------------------------- +//------- Routines manage sense data + +static void udi_msc_clear_sense(void) +{ + memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data)); + udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT; + udi_msc_sense.AddSenseLen = SCSI_SENSE_ADDL_LEN(sizeof(udi_msc_sense)); +} + +static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, + uint32_t lba) +{ + udi_msc_clear_sense(); + udi_msc_csw.bCSWStatus = USB_CSW_STATUS_FAIL; + udi_msc_sense.sense_flag_key = sense_key; + udi_msc_sense.information[0] = lba >> 24; + udi_msc_sense.information[1] = lba >> 16; + udi_msc_sense.information[2] = lba >> 8; + udi_msc_sense.information[3] = lba; + udi_msc_sense.AddSenseCode = add_sense >> 8; + udi_msc_sense.AddSnsCodeQlfr = add_sense; +} + +static void udi_msc_sense_pass(void) +{ + udi_msc_clear_sense(); + udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS; +} + + +static void udi_msc_sense_fail_not_present(void) +{ + udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0); +} + +static void udi_msc_sense_fail_busy_or_change(void) +{ + udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION, + SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0); +} + +static void udi_msc_sense_fail_hardware(void) +{ + udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR, + SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0); +} + +static void udi_msc_sense_fail_protected(void) +{ + udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0); +} + +static void udi_msc_sense_fail_cdb_invalid(void) +{ + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_FIELD_IN_CDB, 0); +} + +static void udi_msc_sense_command_invalid(void) +{ + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0); +} + + +//--------------------------------------------- +//------- Routines manage SCSI Commands + +static void udi_msc_spc_requestsense(void) +{ + uint8_t length = udi_msc_cbw.CDB[4]; + + // Can't send more than sense data length + if (length > sizeof(udi_msc_sense)) + length = sizeof(udi_msc_sense); + + if (!udi_msc_cbw_validate(length, USB_CBW_DIRECTION_IN)) + return; + // Send sense data + udi_msc_data_send((uint8_t*)&udi_msc_sense, length); +} + + +static void udi_msc_spc_inquiry(void) +{ + uint8_t length, i; + UDC_DATA(4) + // Constant inquiry data for all LUNs + static struct scsi_inquiry_data udi_msc_inquiry_data = { + .pq_pdt = SCSI_INQ_PQ_CONNECTED | SCSI_INQ_DT_DIR_ACCESS, + .version = SCSI_INQ_VER_SPC, + .flags3 = SCSI_INQ_RSP_SPC2, + .addl_len = SCSI_INQ_ADDL_LEN(sizeof(struct scsi_inquiry_data)), + .vendor_id = {UDI_MSC_GLOBAL_VENDOR_ID}, + .product_rev = {UDI_MSC_GLOBAL_PRODUCT_VERSION}, + }; + + length = udi_msc_cbw.CDB[4]; + + // Can't send more than inquiry data length + if (length > sizeof(udi_msc_inquiry_data)) + length = sizeof(udi_msc_inquiry_data); + + if (!udi_msc_cbw_validate(length, USB_CBW_DIRECTION_IN)) + return; + if ((0 != (udi_msc_cbw.CDB[1] & (SCSI_INQ_REQ_EVPD | SCSI_INQ_REQ_CMDT))) + || (0 != udi_msc_cbw.CDB[2])) { + // CMDT and EPVD bits are not at 0 + // PAGE or OPERATION CODE fields are not empty + // = No standard inquiry asked + udi_msc_sense_fail_cdb_invalid(); // Command is unsupported + udi_msc_csw_process(); + return; + } + + udi_msc_inquiry_data.flags1 = mem_removal(udi_msc_cbw.bCBWLUN) ? + SCSI_INQ_RMB : 0; + + //* Fill product ID field + // Copy name in product id field + memcpy(udi_msc_inquiry_data.product_id, + mem_name(udi_msc_cbw.bCBWLUN)+1, // To remove first '"' + sizeof(udi_msc_inquiry_data.product_id)); + + // Search end of name '/0' or '"' + i = 0; + while (sizeof(udi_msc_inquiry_data.product_id) != i) { + if ((0 == udi_msc_inquiry_data.product_id[i]) + || ('"' == udi_msc_inquiry_data.product_id[i])) { + break; + } + i++; + } + // Padding with space char + while (sizeof(udi_msc_inquiry_data.product_id) != i) { + udi_msc_inquiry_data.product_id[i] = ' '; + i++; + } + + // Send inquiry data + udi_msc_data_send((uint8_t *) & udi_msc_inquiry_data, length); +} + + +static bool udi_msc_spc_testunitready_global(void) +{ + switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) { + case CTRL_GOOD: + return true; // Don't change sense data + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + break; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + break; + case CTRL_FAIL: + default: + udi_msc_sense_fail_hardware(); + break; + } + return false; +} + + +static void udi_msc_spc_testunitready(void) +{ + if (udi_msc_spc_testunitready_global()) { + // LUN ready, then update sense data with status pass + udi_msc_sense_pass(); + } + // Send status in CSW packet + udi_msc_csw_process(); +} + + +static void udi_msc_spc_mode_sense(bool b_sense10) +{ + // Union of all mode sense structures + union sense_6_10 { + struct { + struct scsi_mode_param_header6 header; + struct spc_control_page_info_execpt sense_data; + } s6; + struct { + struct scsi_mode_param_header10 header; + struct spc_control_page_info_execpt sense_data; + } s10; + }; + + uint8_t data_sense_lgt; + uint8_t mode; + uint8_t request_lgt; + uint8_t wp; + struct spc_control_page_info_execpt *ptr_mode; + UDC_BSS(4) static union sense_6_10 sense; + + // Clear all fields + memset(&sense, 0, sizeof(sense)); + + // Initialize process + if (b_sense10) { + request_lgt = udi_msc_cbw.CDB[8]; + ptr_mode = &sense.s10.sense_data; + data_sense_lgt = sizeof(struct scsi_mode_param_header10); + } else { + request_lgt = udi_msc_cbw.CDB[4]; + ptr_mode = &sense.s6.sense_data; + data_sense_lgt = sizeof(struct scsi_mode_param_header6); + } + + // No Block descriptor + + // Fill page(s) + mode = udi_msc_cbw.CDB[2] & SCSI_MS_MODE_ALL; + if ((SCSI_MS_MODE_INFEXP == mode) + || (SCSI_MS_MODE_ALL == mode)) { + // Informational exceptions control page (from SPC) + ptr_mode->page_code = + SCSI_MS_MODE_INFEXP; + ptr_mode->page_length = + SPC_MP_INFEXP_PAGE_LENGTH; + ptr_mode->mrie = + SPC_MP_INFEXP_MRIE_NO_SENSE; + data_sense_lgt += sizeof(struct spc_control_page_info_execpt); + } + // Can't send more than mode sense data length + if (request_lgt > data_sense_lgt) + request_lgt = data_sense_lgt; + if (!udi_msc_cbw_validate(request_lgt, USB_CBW_DIRECTION_IN)) + return; + + // Fill mode parameter header length + wp = (mem_wr_protect(udi_msc_cbw.bCBWLUN)) ? SCSI_MS_SBC_WP : 0; + + if (b_sense10) { + sense.s10.header.mode_data_length = + cpu_to_be16((data_sense_lgt - 2)); + //sense.s10.header.medium_type = 0; + sense.s10.header.device_specific_parameter = wp; + //sense.s10.header.block_descriptor_length = 0; + } else { + sense.s6.header.mode_data_length = data_sense_lgt - 1; + //sense.s6.header.medium_type = 0; + sense.s6.header.device_specific_parameter = wp; + //sense.s6.header.block_descriptor_length = 0; + } + + // Send mode sense data + udi_msc_data_send((uint8_t *) & sense, request_lgt); +} + + +static void udi_msc_spc_prevent_allow_medium_removal(void) +{ + uint8_t prevent = udi_msc_cbw.CDB[4]; + if (0 == prevent) { + udi_msc_sense_pass(); + } else { + udi_msc_sense_fail_cdb_invalid(); // Command is unsupported + } + udi_msc_csw_process(); +} + + +static void udi_msc_sbc_start_stop(void) +{ + bool start = 0x1 & udi_msc_cbw.CDB[4]; + bool loej = 0x2 & udi_msc_cbw.CDB[4]; + if (loej) { + mem_unload(udi_msc_cbw.bCBWLUN, !start); + } + udi_msc_sense_pass(); + udi_msc_csw_process(); +} + + +static void udi_msc_sbc_read_capacity(void) +{ + UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity; + + if (!udi_msc_cbw_validate(sizeof(udi_msc_capacity), + USB_CBW_DIRECTION_IN)) + return; + + // Get capacity of LUN + switch (mem_read_capacity(udi_msc_cbw.bCBWLUN, + &udi_msc_capacity.max_lba)) { + case CTRL_GOOD: + break; + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + udi_msc_csw_process(); + return; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + udi_msc_csw_process(); + return; + default: + udi_msc_sense_fail_hardware(); + udi_msc_csw_process(); + return; + } + + // Format capacity data + udi_msc_capacity.block_len = CPU_TO_BE32(UDI_MSC_BLOCK_SIZE); + udi_msc_capacity.max_lba = cpu_to_be32(udi_msc_capacity.max_lba); + // Send the corresponding sense data + udi_msc_data_send((uint8_t *) & udi_msc_capacity, + sizeof(udi_msc_capacity)); +} + + +static void udi_msc_sbc_trans(bool b_read) +{ + uint32_t trans_size; + + if (!b_read) { + // Write operation then check Write Protect + if (mem_wr_protect(udi_msc_cbw.bCBWLUN)) { + // Write not authorized + udi_msc_sense_fail_protected(); + udi_msc_csw_process(); + return; + } + } + // Read/Write command fields (address and number of block) + MSB0(udi_msc_addr) = udi_msc_cbw.CDB[2]; + MSB1(udi_msc_addr) = udi_msc_cbw.CDB[3]; + MSB2(udi_msc_addr) = udi_msc_cbw.CDB[4]; + MSB3(udi_msc_addr) = udi_msc_cbw.CDB[5]; + MSB(udi_msc_nb_block) = udi_msc_cbw.CDB[7]; + LSB(udi_msc_nb_block) = udi_msc_cbw.CDB[8]; + + // Compute number of byte to transfer and valid it + trans_size = (uint32_t) udi_msc_nb_block *UDI_MSC_BLOCK_SIZE; + if (!udi_msc_cbw_validate(trans_size, + (b_read) ? USB_CBW_DIRECTION_IN : + USB_CBW_DIRECTION_OUT)) + return; + + // Record transfer request to do it in a task and not under interrupt + udi_msc_b_read = b_read; + udi_msc_b_trans_req = true; + UDI_MSC_NOTIFY_TRANS_EXT(); +} + + +bool udi_msc_process_trans(void) +{ + Ctrl_status status; + + if (!udi_msc_b_trans_req) + return false; // No Transfer request to do + udi_msc_b_trans_req = false; + udi_msc_b_reset_trans = false; + + // Start transfer + if (udi_msc_b_read) { + status = memory_2_usb(udi_msc_cbw.bCBWLUN, udi_msc_addr, + udi_msc_nb_block); + } else { + status = usb_2_memory(udi_msc_cbw.bCBWLUN, udi_msc_addr, + udi_msc_nb_block); + } + + // Check if transfer is aborted by reset + if (udi_msc_b_reset_trans) { + udi_msc_b_reset_trans = false; + return true; + } + + // Check status of transfer + switch (status) { + case CTRL_GOOD: + udi_msc_sense_pass(); + break; + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + break; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + break; + default: + case CTRL_FAIL: + udi_msc_sense_fail_hardware(); + break; + } + // Send status of transfer in CSW packet + udi_msc_csw_process(); + return true; +} + + +static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n, + udd_ep_id_t ep) +{ + UNUSED(ep); + UNUSED(n); + // Update variable to signal the end of transfer + udi_msc_b_abort_trans = (UDD_EP_TRANSFER_OK != status) ? true : false; + udi_msc_b_ack_trans = true; +} + + +bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)) +{ + if (!udi_msc_b_ack_trans) + return false; // No possible, transfer on going + + // Start transfer Internal RAM<->USB line + udi_msc_b_ack_trans = false; + if (!udd_ep_run((b_read) ? UDI_MSC_EP_IN : UDI_MSC_EP_OUT, + false, + block, + block_size, + (NULL == callback) ? udi_msc_trans_ack : + callback)) { + udi_msc_b_ack_trans = true; + return false; + } + if (NULL == callback) { + while (!udi_msc_b_ack_trans); + if (udi_msc_b_abort_trans) { + return false; + } + udi_msc_csw.dCSWDataResidue -= block_size; + return (!udi_msc_b_abort_trans); + } + udi_msc_csw.dCSWDataResidue -= block_size; + return true; +} + +//@} + +#endif // SDSUPPORT + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h new file mode 100644 index 0000000000..c632ee4aac --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h @@ -0,0 +1,376 @@ +/** + * \file + * + * \brief USB Device Mass Storage Class (MSC) interface definitions. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_MSC_H_ +#define _UDI_MSC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_msc.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_msc_group_udc + * @{ + */ +//! Global structure which contains standard UDI interface for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_msc; +//@} + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group USB interface descriptors + * + * The following structures provide predefined USB interface descriptors. + * It must be used to define the final USB descriptors. + */ +//@{ + +//! Interface descriptor structure for MSC +typedef struct { + usb_iface_desc_t iface; + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; +} udi_msc_desc_t; + +//! By default no string associated to this interface +#ifndef UDI_MSC_STRING_ID +#define UDI_MSC_STRING_ID 0 +#endif + +//! MSC endpoints size for full speed +#define UDI_MSC_EPS_SIZE_FS 64 +//! MSC endpoints size for high speed +#define UDI_MSC_EPS_SIZE_HS 512 + +//! Content of MSC interface descriptor for all speeds +#define UDI_MSC_DESC \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_MSC_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = MSC_CLASS,\ + .iface.bInterfaceSubClass = MSC_SUBCLASS_TRANSPARENT,\ + .iface.bInterfaceProtocol = MSC_PROTOCOL_BULK,\ + .iface.iInterface = UDI_MSC_STRING_ID,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_MSC_EP_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_in.bInterval = 0,\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_MSC_EP_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_out.bInterval = 0, + +//! Content of MSC interface descriptor for full speed only +#define UDI_MSC_DESC_FS {\ + UDI_MSC_DESC \ + .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + } + +//! Content of MSC interface descriptor for high speed only +#define UDI_MSC_DESC_HS {\ + UDI_MSC_DESC \ + .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_HS),\ + .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_HS),\ + } +//@} + + +/** + * \ingroup udi_group + * \defgroup udi_msc_group USB Device Interface (UDI) for Mass Storage Class (MSC) + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used by memory to transfer its data + * to/from USB MSC endpoints. + * + * See \ref udi_msc_quickstart. + * @{ + */ + +/** + * \brief Process the background read/write commands + * + * Routine called by the main loop + */ +bool udi_msc_process_trans(void); + +/** + * \brief Transfers data to/from USB MSC endpoints + * + * + * \param b_read Memory to USB, if true + * \param block Buffer on Internal RAM to send or fill + * \param block_size Buffer size to send or fill + * \param callback Function to call at the end of transfer. + * If NULL then the routine exit when transfer is finish. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)); +//@} + +#ifdef __cplusplus +} +#endif + + +/** + * \page udi_msc_quickstart Quick start guide for USB device Mass Storage module (UDI MSC) + * + * This is the quick start guide for the \ref udi_msc_group + * "USB device interface MSC module (UDI MSC)" with step-by-step instructions on + * how to configure and use the modules in a selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section udi_msc_basic_use_case Basic use case + * In this basic use case, the "USB MSC (Single Interface Device)" module is used. + * The "USB MSC (Composite Device)" module usage is described in \ref udi_msc_use_cases + * "Advanced use cases". + * + * \section udi_msc_basic_use_case_setup Setup steps + * \subsection udi_msc_basic_use_case_setup_prereq Prerequisites + * \copydetails udc_basic_use_case_setup_prereq + * \subsection udi_msc_basic_use_case_setup_code Example code + * \copydetails udc_basic_use_case_setup_code + * \subsection udi_msc_basic_use_case_setup_flow Workflow + * \copydetails udc_basic_use_case_setup_flow + * + * \section udi_msc_basic_use_case_usage Usage steps + * + * \subsection udi_msc_basic_use_case_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' + #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() + extern bool my_callback_msc_enable(void); + #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() + extern void my_callback_msc_disable(void); + #include "udi_msc_conf.h" // At the end of conf_usb.h file +\endcode + * + * Add to application C-file: + * \code + static bool my_flag_autorize_msc_transfert = false; + bool my_callback_msc_enable(void) + { + my_flag_autorize_msc_transfert = true; + return true; + } + void my_callback_msc_disable(void) + { + my_flag_autorize_msc_transfert = false; + } + + void task(void) + { + udi_msc_process_trans(); + } +\endcode + * + * \subsection udi_msc_basic_use_case_setup_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following configuration, + * which is the USB device MSC configuration: + * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC \endcode + * \note The USB serial number is mandatory when a MSC interface is used. + * - \code //! Vendor name and Product version of MSC interface + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' \endcode + * \note The USB MSC interface requires a vendor ID (8 ASCII characters) + * and a product version (4 ASCII characters). + * - \code #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() + extern bool my_callback_msc_enable(void); \endcode + * \note After the device enumeration (detecting and identifying USB devices), + * the USB host starts the device configuration. When the USB MSC interface + * from the device is accepted by the host, the USB host enables this interface and the + * UDI_MSC_ENABLE_EXT() callback function is called and return true. + * Thus, when this event is received, the tasks which call + * udi_msc_process_trans() must be enabled. + * - \code #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() + extern void my_callback_msc_disable(void); \endcode + * \note When the USB device is unplugged or is reset by the USB host, the USB + * interface is disabled and the UDI_MSC_DISABLE_EXT() callback function + * is called. Thus, it is recommended to disable the task which is called udi_msc_process_trans(). + * -# The MSC is automatically linked with memory control access component + * which provides the memories interfaces. However, the memory data transfers + * must be done outside USB interrupt routine. This is done in the MSC process + * ("udi_msc_process_trans()") called by main loop: + * - \code * void task(void) { + udi_msc_process_trans(); + } \endcode + * -# The MSC speed depends on task periodicity. To get the best speed + * the notification callback "UDI_MSC_NOTIFY_TRANS_EXT" can be used to wakeup + * this task (Example, through a mutex): + * - \code #define UDI_MSC_NOTIFY_TRANS_EXT() msc_notify_trans() + void msc_notify_trans(void) { + wakeup_my_task(); + } \endcode + * + * \section udi_msc_use_cases Advanced use cases + * For more advanced use of the UDI MSC module, see the following use cases: + * - \subpage udi_msc_use_case_composite + * - \subpage udc_use_case_1 + * - \subpage udc_use_case_2 + * - \subpage udc_use_case_3 + * - \subpage udc_use_case_5 + * - \subpage udc_use_case_6 + */ + +/** + * \page udi_msc_use_case_composite MSC in a composite device + * + * A USB Composite Device is a USB Device which uses more than one USB class. + * In this use case, the "USB MSC (Composite Device)" module is used to + * create a USB composite device. Thus, this USB module can be associated with + * another "Composite Device" module, like "USB HID Mouse (Composite Device)". + * + * Also, you can refer to application note + * + * AVR4902 ASF - USB Composite Device. + * + * \section udi_msc_use_case_composite_setup Setup steps + * For the setup code of this use case to work, the + * \ref udi_msc_basic_use_case "basic use case" must be followed. + * + * \section udi_msc_use_case_composite_usage Usage steps + * + * \subsection udi_msc_use_case_composite_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+1) + #define USB_DEVICE_MAX_EP (X+2) + + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + #define UDI_MSC_IFACE_NUMBER X + + #define UDI_COMPOSITE_DESC_T \ + udi_msc_desc_t udi_msc; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_msc, \ + ... +\endcode + * + * \subsection udi_msc_use_case_composite_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB composite device configuration: + * - \code // Endpoint control size, This must be: + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 1 for MSC. + #define USB_DEVICE_NB_INTERFACE (X+1) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 2 for MSC. + #define USB_DEVICE_MAX_EP (X+2) \endcode + * -# Ensure that conf_usb.h contains the description of + * composite device: + * - \code // The endpoint numbers chosen by you for the MSC. + // The endpoint numbers starting from 1. + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + // The interface index of an interface starting from 0 + #define UDI_MSC_IFACE_NUMBER X \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB composite device configuration: + * - \code // USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + ... + udi_msc_desc_t udi_msc; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_msc = UDI_MSC_DESC_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_msc = UDI_MSC_DESC_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_msc, \ + ... \endcode + * - \note The descriptors order given in the four lists above must be the + * same as the order defined by all interface indexes. The interface index + * orders are defined through UDI_X_IFACE_NUMBER defines. + */ + +#endif // _UDI_MSC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c new file mode 100644 index 0000000000..0dfcd5ac1f --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c @@ -0,0 +1,2073 @@ +/** + * \file + * + * \brief USB Device Driver for UOTGHS. Compliant with common UDD driver. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "compiler.h" +#include "uotghs_device_due.h" + +#include "conf_usb.h" +#include "sysclk.h" +#include "udd.h" +#include "uotghs_otg.h" +#include + +#ifndef UDD_NO_SLEEP_MGR +# include "sleep.h" +# include "sleepmgr.h" +#endif + +#if !(SAM3XA) +# error The current UOTGHS Device Driver supports only SAM3X and SAM3A. +#endif +#ifndef UDD_USB_INT_FUN +# define UDD_USB_INT_FUN UOTGHS_Handler +#endif + +#ifndef UDD_USB_INT_LEVEL +# define UDD_USB_INT_LEVEL 5 // By default USB interrupt have low priority +#endif + +#define UDD_EP_USED(ep) (USB_DEVICE_MAX_EP >= ep) + +#if ( (UDD_EP_USED( 1) && Is_udd_endpoint_dma_supported( 1)) \ + ||(UDD_EP_USED( 2) && Is_udd_endpoint_dma_supported( 2)) \ + ||(UDD_EP_USED( 3) && Is_udd_endpoint_dma_supported( 3)) \ + ||(UDD_EP_USED( 4) && Is_udd_endpoint_dma_supported( 4)) \ + ||(UDD_EP_USED( 5) && Is_udd_endpoint_dma_supported( 5)) \ + ||(UDD_EP_USED( 6) && Is_udd_endpoint_dma_supported( 6)) \ + ||(UDD_EP_USED( 7) && Is_udd_endpoint_dma_supported( 7)) \ + ||(UDD_EP_USED( 8) && Is_udd_endpoint_dma_supported( 8)) \ + ||(UDD_EP_USED( 9) && Is_udd_endpoint_dma_supported( 9)) \ + ||(UDD_EP_USED(10) && Is_udd_endpoint_dma_supported(10)) \ + ||(UDD_EP_USED(11) && Is_udd_endpoint_dma_supported(11)) \ + ||(UDD_EP_USED(12) && Is_udd_endpoint_dma_supported(12)) \ + ||(UDD_EP_USED(13) && Is_udd_endpoint_dma_supported(13)) \ + ||(UDD_EP_USED(14) && Is_udd_endpoint_dma_supported(14)) \ + ||(UDD_EP_USED(15) && Is_udd_endpoint_dma_supported(15)) \ + ) +# define UDD_EP_DMA_SUPPORTED +#endif + +#if ( (UDD_EP_USED( 1) && !Is_udd_endpoint_dma_supported( 1)) \ + ||(UDD_EP_USED( 2) && !Is_udd_endpoint_dma_supported( 2)) \ + ||(UDD_EP_USED( 3) && !Is_udd_endpoint_dma_supported( 3)) \ + ||(UDD_EP_USED( 4) && !Is_udd_endpoint_dma_supported( 4)) \ + ||(UDD_EP_USED( 5) && !Is_udd_endpoint_dma_supported( 5)) \ + ||(UDD_EP_USED( 6) && !Is_udd_endpoint_dma_supported( 6)) \ + ||(UDD_EP_USED( 7) && !Is_udd_endpoint_dma_supported( 7)) \ + ||(UDD_EP_USED( 8) && !Is_udd_endpoint_dma_supported( 8)) \ + ||(UDD_EP_USED( 9) && !Is_udd_endpoint_dma_supported( 9)) \ + ||(UDD_EP_USED(10) && !Is_udd_endpoint_dma_supported(10)) \ + ||(UDD_EP_USED(11) && !Is_udd_endpoint_dma_supported(11)) \ + ||(UDD_EP_USED(12) && !Is_udd_endpoint_dma_supported(12)) \ + ||(UDD_EP_USED(13) && !Is_udd_endpoint_dma_supported(13)) \ + ||(UDD_EP_USED(14) && !Is_udd_endpoint_dma_supported(14)) \ + ||(UDD_EP_USED(15) && !Is_udd_endpoint_dma_supported(15)) \ + ) +# define UDD_EP_FIFO_SUPPORTED +#endif + +// for debug text +//#define dbg_print printf +#define dbg_print(...) + +/** + * \ingroup udd_group + * \defgroup udd_udphs_group USB On-The-Go High-Speed Port for device mode (UOTGHS) + * + * \section UOTGHS_CONF UOTGHS Custom configuration + * The following UOTGHS driver configuration must be included in the conf_usb.h + * file of the application. + * + * UDD_USB_INT_LEVEL
+ * Option to change the interrupt priority (0 to 15) by default 5 (recommended). + * + * UDD_USB_INT_FUN
+ * Option to fit interrupt function to what defined in exception table. + * + * UDD_ISOCHRONOUS_NB_BANK(ep)
+ * Feature to reduce or increase isochronous endpoints buffering (1 to 3). + * Default value 2. + * + * UDD_BULK_NB_BANK(ep)
+ * Feature to reduce or increase bulk endpoints buffering (1 to 2). + * Default value 2. + * + * UDD_INTERRUPT_NB_BANK(ep)
+ * Feature to reduce or increase interrupt endpoints buffering (1 to 2). + * Default value 1. + * + * \section Callbacks management + * The USB driver is fully managed by interrupt and does not request periodique + * task. Thereby, the USB events use callbacks to transfer the information. + * The callbacks are declared in static during compilation or in variable during + * code execution. + * + * Static declarations defined in conf_usb.h: + * - UDC_VBUS_EVENT(bool b_present)
+ * To signal Vbus level change + * - UDC_SUSPEND_EVENT()
+ * Called when USB bus enter in suspend mode + * - UDC_RESUME_EVENT()
+ * Called when USB bus is wakeup + * - UDC_SOF_EVENT()
+ * Called for each received SOF, Note: Each 1ms in HS/FS mode only. + * + * Dynamic callbacks, called "endpoint job" , are registered + * in udd_ep_job_t structure via the following functions: + * - udd_ep_run()
+ * To call it when a transfer is finish + * - udd_ep_wait_stall_clear()
+ * To call it when a endpoint halt is disabled + * + * \section Power mode management + * The Sleep modes authorized : + * - in USB IDLE state, the UOTGHS needs of USB clock and authorizes up to sleep mode WFI. + * - in USB SUSPEND state, the UOTGHS no needs USB clock and authorizes up to sleep mode WAIT. + * @{ + */ + +// Check USB Device configuration +#ifndef USB_DEVICE_EP_CTRL_SIZE +# error USB_DEVICE_EP_CTRL_SIZE not defined +#endif +#ifndef USB_DEVICE_MAX_EP +# error USB_DEVICE_MAX_EP not defined +#endif + +// Note: USB_DEVICE_MAX_EP does not include control endpoint +#if USB_DEVICE_MAX_EP > (UDD_MAX_PEP_NB-1) +# error USB_DEVICE_MAX_EP is too high and not supported by this part +#endif + +#define UDD_EP_ISO_NBANK_ERROR(ep) \ + ( (UDD_ISOCHRONOUS_NB_BANK(ep) < 1) \ + || (UDD_ISOCHRONOUS_NB_BANK(ep) > 3) ) +#define UDD_EP_BULK_NBANK_ERROR(ep) \ + ( (UDD_BULK_NB_BANK(ep) < 1) || (UDD_BULK_NB_BANK(ep) > 2) ) +#define UDD_EP_INT_NBANK_ERROR(ep) \ + ( (UDD_INTERRUPT_NB_BANK(ep) < 1) || (UDD_INTERRUPT_NB_BANK(ep) > 2) ) + +#define UDD_EP_ISO_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) +#define UDD_EP_BULK_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) +#define UDD_EP_INT_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) + +#define UDD_EP_NB_BANK_ERROR(ep, type) \ + (ATPASTE3(UDD_EP_, type, _NB_BANK_ERROR(ep))) + +#define UDD_ISO_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, ISO) \ + || UDD_EP_NB_BANK_ERROR( 2, ISO) \ + || UDD_EP_NB_BANK_ERROR( 3, ISO) \ + || UDD_EP_NB_BANK_ERROR( 4, ISO) \ + || UDD_EP_NB_BANK_ERROR( 5, ISO) \ + || UDD_EP_NB_BANK_ERROR( 6, ISO) \ + || UDD_EP_NB_BANK_ERROR( 7, ISO) \ + || UDD_EP_NB_BANK_ERROR( 8, ISO) \ + || UDD_EP_NB_BANK_ERROR( 9, ISO) \ + || UDD_EP_NB_BANK_ERROR(10, ISO) \ + || UDD_EP_NB_BANK_ERROR(11, ISO) \ + || UDD_EP_NB_BANK_ERROR(12, ISO) \ + || UDD_EP_NB_BANK_ERROR(13, ISO) \ + || UDD_EP_NB_BANK_ERROR(14, ISO) \ + || UDD_EP_NB_BANK_ERROR(15, ISO) ) +#define UDD_BULK_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, BULK) \ + || UDD_EP_NB_BANK_ERROR( 2, BULK) \ + || UDD_EP_NB_BANK_ERROR( 3, BULK) \ + || UDD_EP_NB_BANK_ERROR( 4, BULK) \ + || UDD_EP_NB_BANK_ERROR( 5, BULK) \ + || UDD_EP_NB_BANK_ERROR( 6, BULK) \ + || UDD_EP_NB_BANK_ERROR( 7, BULK) \ + || UDD_EP_NB_BANK_ERROR( 8, BULK) \ + || UDD_EP_NB_BANK_ERROR( 9, BULK) \ + || UDD_EP_NB_BANK_ERROR(10, BULK) \ + || UDD_EP_NB_BANK_ERROR(11, BULK) \ + || UDD_EP_NB_BANK_ERROR(12, BULK) \ + || UDD_EP_NB_BANK_ERROR(13, BULK) \ + || UDD_EP_NB_BANK_ERROR(14, BULK) \ + || UDD_EP_NB_BANK_ERROR(15, BULK) ) +#define UDD_INTERRUPT_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, INT) \ + || UDD_EP_NB_BANK_ERROR( 2, INT) \ + || UDD_EP_NB_BANK_ERROR( 3, INT) \ + || UDD_EP_NB_BANK_ERROR( 4, INT) \ + || UDD_EP_NB_BANK_ERROR( 5, INT) \ + || UDD_EP_NB_BANK_ERROR( 6, INT) \ + || UDD_EP_NB_BANK_ERROR( 7, INT) \ + || UDD_EP_NB_BANK_ERROR( 8, INT) \ + || UDD_EP_NB_BANK_ERROR( 9, INT) \ + || UDD_EP_NB_BANK_ERROR(10, INT) \ + || UDD_EP_NB_BANK_ERROR(11, INT) \ + || UDD_EP_NB_BANK_ERROR(12, INT) \ + || UDD_EP_NB_BANK_ERROR(13, INT) \ + || UDD_EP_NB_BANK_ERROR(14, INT) \ + || UDD_EP_NB_BANK_ERROR(15, INT) ) + +#ifndef UDD_ISOCHRONOUS_NB_BANK +# define UDD_ISOCHRONOUS_NB_BANK(ep) 2 +#else +# if UDD_ISO_NB_BANK_ERROR +# error UDD_ISOCHRONOUS_NB_BANK(ep) must be define within 1 to 3. +# endif +#endif + +#ifndef UDD_BULK_NB_BANK +# define UDD_BULK_NB_BANK(ep) 2 +#else +# if UDD_BULK_NB_BANK_ERROR +# error UDD_BULK_NB_BANK must be define with 1 or 2. +# endif +#endif + +#ifndef UDD_INTERRUPT_NB_BANK +# define UDD_INTERRUPT_NB_BANK(ep) 1 +#else +# if UDD_INTERRUPT_NB_BANK_ERROR +# error UDD_INTERRUPT_NB_BANK must be define with 1 or 2. +# endif +#endif + + +/** + * \name Power management routine. + */ +//@{ + +#ifndef UDD_NO_SLEEP_MGR + +//! Definition of sleep levels +#define UOTGHS_SLEEP_MODE_USB_SUSPEND SLEEPMGR_WAIT_FAST +#define UOTGHS_SLEEP_MODE_USB_IDLE SLEEPMGR_SLEEP_WFI + +//! State of USB line +static bool udd_b_idle; +//! State of sleep manager +static bool udd_b_sleep_initialized = false; + + +/*! \brief Authorize or not the CPU powerdown mode + * + * \param b_enable true to authorize idle mode + */ +static void udd_sleep_mode(bool b_idle) +{ + if (!b_idle && udd_b_idle) { + dbg_print("_S "); + sleepmgr_unlock_mode(UOTGHS_SLEEP_MODE_USB_IDLE); + } + if (b_idle && !udd_b_idle) { + dbg_print("_W "); + sleepmgr_lock_mode(UOTGHS_SLEEP_MODE_USB_IDLE); + } + udd_b_idle = b_idle; +} +#else + +static void udd_sleep_mode(bool b_idle) +{ + b_idle = b_idle; +} + +#endif // UDD_NO_SLEEP_MGR + +//@} + + +/** + * \name Control endpoint low level management routine. + * + * This function performs control endpoint mangement. + * It handle the SETUP/DATA/HANDSHAKE phases of a control transaction. + */ +//@{ + +//! Global variable to give and record information about setup request management +COMPILER_WORD_ALIGNED udd_ctrl_request_t udd_g_ctrlreq; + +//! Bit definitions about endpoint control state machine for udd_ep_control_state +typedef enum { + UDD_EPCTRL_SETUP = 0, //!< Wait a SETUP packet + UDD_EPCTRL_DATA_OUT = 1, //!< Wait a OUT data packet + UDD_EPCTRL_DATA_IN = 2, //!< Wait a IN data packet + UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP = 3, //!< Wait a IN ZLP packet + UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP = 4, //!< Wait a OUT ZLP packet + UDD_EPCTRL_STALL_REQ = 5, //!< STALL enabled on IN & OUT packet +} udd_ctrl_ep_state_t; + +//! State of the endpoint control management +static udd_ctrl_ep_state_t udd_ep_control_state; + +//! Total number of data received/sent during data packet phase with previous payload buffers +static uint16_t udd_ctrl_prev_payload_buf_cnt; + +//! Number of data received/sent to/from udd_g_ctrlreq.payload buffer +static uint16_t udd_ctrl_payload_buf_cnt; + +/** + * \brief Reset control endpoint + * + * Called after a USB line reset or when UDD is enabled + */ +static void udd_reset_ep_ctrl(void); + +/** + * \brief Reset control endpoint management + * + * Called after a USB line reset or at the end of SETUP request (after ZLP) + */ +static void udd_ctrl_init(void); + +//! \brief Managed reception of SETUP packet on control endpoint +static void udd_ctrl_setup_received(void); + +//! \brief Managed reception of IN packet on control endpoint +static void udd_ctrl_in_sent(void); + +//! \brief Managed reception of OUT packet on control endpoint +static void udd_ctrl_out_received(void); + +//! \brief Managed underflow event of IN packet on control endpoint +static void udd_ctrl_underflow(void); + +//! \brief Managed overflow event of OUT packet on control endpoint +static void udd_ctrl_overflow(void); + +//! \brief Managed stall event of IN/OUT packet on control endpoint +static void udd_ctrl_stall_data(void); + +//! \brief Send a ZLP IN on control endpoint +static void udd_ctrl_send_zlp_in(void); + +//! \brief Send a ZLP OUT on control endpoint +static void udd_ctrl_send_zlp_out(void); + +//! \brief Call callback associated to setup request +static void udd_ctrl_endofrequest(void); + + +/** + * \brief Main interrupt routine for control endpoint + * + * This switchs control endpoint events to correct sub function. + * + * \return \c 1 if an event about control endpoint is occured, otherwise \c 0. + */ +static bool udd_ctrl_interrupt(void); + +//@} + + +/** + * \name Management of bulk/interrupt/isochronous endpoints + * + * The UDD manages the data transfer on endpoints: + * - Start data tranfer on endpoint with USB Device DMA + * - Send a ZLP packet if requested + * - Call callback registered to signal end of transfer + * The transfer abort and stall feature are supported. + */ +//@{ +#if (0!=USB_DEVICE_MAX_EP) + +//! Structure definition about job registered on an endpoint +typedef struct { + union { + //! Callback to call at the end of transfer + udd_callback_trans_t call_trans; + + //! Callback to call when the endpoint halt is cleared + udd_callback_halt_cleared_t call_nohalt; + }; + //! Buffer located in internal RAM to send or fill during job + uint8_t *buf; + //! Size of buffer to send or fill + iram_size_t buf_size; + //!< Size of data transfered + iram_size_t buf_cnt; + //!< Size of data loaded (or prepared for DMA) last time + iram_size_t buf_load; + //! A job is registered on this endpoint + uint8_t busy:1; + //! A short packet is requested for this job on endpoint IN + uint8_t b_shortpacket:1; + //! A stall has been requested but not executed + uint8_t stall_requested:1; +} udd_ep_job_t; + + +//! Array to register a job on bulk/interrupt/isochronous endpoint +static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP]; + +//! \brief Reset all job table +static void udd_ep_job_table_reset(void); + +//! \brief Abort all endpoint jobs on going +static void udd_ep_job_table_kill(void); + +#ifdef UDD_EP_FIFO_SUPPORTED + /** + * \brief Fill banks and send them + * + * \param ep endpoint number of job to abort + */ + static void udd_ep_in_sent(udd_ep_id_t ep); + + /** + * \brief Store received banks + * + * \param ep endpoint number of job to abort + */ + static void udd_ep_out_received(udd_ep_id_t ep); +#endif + +/** + * \brief Abort endpoint job on going + * + * \param ep endpoint number of job to abort + */ +static void udd_ep_abort_job(udd_ep_id_t ep); + +/** + * \brief Call the callback associated to the job which is finished + * + * \param ptr_job job to complete + * \param b_abort if true then the job has been aborted + */ +static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num); + +#ifdef UDD_EP_DMA_SUPPORTED + /** + * \brief Start the next transfer if necessary or complet the job associated. + * + * \param ep endpoint number without direction flag + */ + static void udd_ep_trans_done(udd_ep_id_t ep); +#endif + +/** + * \brief Main interrupt routine for bulk/interrupt/isochronous endpoints + * + * This switchs endpoint events to correct sub function. + * + * \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0. + */ +static bool udd_ep_interrupt(void); + +#endif // (0!=USB_DEVICE_MAX_EP) +//@} + + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS + +/** + * \internal + * \brief Function called by UOTGHS interrupt to manage USB Device interrupts + * + * USB Device interrupt events are splited in three parts: + * - USB line events (SOF, reset, suspend, resume, wakeup) + * - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall) + * - bulk/interrupt/isochronous endpoints events (end of data transfer) + * + * Note: + * Here, the global interrupt mask is not clear when an USB interrupt is enabled + * because this one can not be occured during the USB ISR (=during INTX is masked). + * See Technical reference $3.8.3 Masking interrupt requests in peripheral modules. + */ +#ifdef UHD_ENABLE +void udd_interrupt(void); +void udd_interrupt(void) +#else +ISR(UDD_USB_INT_FUN) +#endif +{ + /* For fast wakeup clocks restore + * In WAIT mode, clocks are switched to FASTRC. + * After wakeup clocks should be restored, before that ISR should not + * be served. + */ + if (!pmc_is_wakeup_clocks_restored() && !Is_udd_suspend()) { + cpu_irq_disable(); + return; + } + + if (Is_udd_sof()) { + udd_ack_sof(); + if (Is_udd_full_speed_mode()) { + udc_sof_notify(); + } +#ifdef UDC_SOF_EVENT + UDC_SOF_EVENT(); +#endif + goto udd_interrupt_sof_end; + } + + if (Is_udd_msof()) { + udd_ack_msof(); + udc_sof_notify(); + goto udd_interrupt_sof_end; + } + + dbg_print("%c ", udd_is_high_speed() ? 'H' : 'F'); + + if (udd_ctrl_interrupt()) { + goto udd_interrupt_end; // Interrupt acked by control endpoint managed + } + +#if (0 != USB_DEVICE_MAX_EP) + if (udd_ep_interrupt()) { + goto udd_interrupt_end; // Interrupt acked by bulk/interrupt/isochronous endpoint managed + } +#endif + + // USB bus reset detection + if (Is_udd_reset()) { + udd_ack_reset(); + dbg_print("RST "); + // Abort all jobs on-going +#if (USB_DEVICE_MAX_EP != 0) + udd_ep_job_table_kill(); +#endif + // Reset USB Device Stack Core + udc_reset(); + // Reset endpoint control + udd_reset_ep_ctrl(); + // Reset endpoint control management + udd_ctrl_init(); + goto udd_interrupt_end; + } + + if (Is_udd_suspend_interrupt_enabled() && Is_udd_suspend()) { + otg_unfreeze_clock(); + // The suspend interrupt is automatic acked when a wakeup occur + udd_disable_suspend_interrupt(); + udd_enable_wake_up_interrupt(); + otg_freeze_clock(); // Mandatory to exit of sleep mode after a wakeup event + udd_sleep_mode(false); // Enter in SUSPEND mode +#ifdef UDC_SUSPEND_EVENT + UDC_SUSPEND_EVENT(); +#endif + goto udd_interrupt_end; + } + + if (Is_udd_wake_up_interrupt_enabled() && Is_udd_wake_up()) { + // Ack wakeup interrupt and enable suspend interrupt + otg_unfreeze_clock(); + // Check USB clock ready after suspend and eventually sleep USB clock + while (!Is_otg_clock_usable()) { + if (Is_udd_suspend()) { + break; // In case of USB state change in HS + } + }; + // The wakeup interrupt is automatic acked when a suspend occur + udd_disable_wake_up_interrupt(); + udd_enable_suspend_interrupt(); + udd_sleep_mode(true); // Enter in IDLE mode +#ifdef UDC_RESUME_EVENT + UDC_RESUME_EVENT(); +#endif + goto udd_interrupt_end; + } + + if (Is_otg_vbus_transition()) { + dbg_print("VBus "); + // Ack Vbus transition and send status to high level + otg_unfreeze_clock(); + otg_ack_vbus_transition(); + otg_freeze_clock(); +#ifndef USB_DEVICE_ATTACH_AUTO_DISABLE + if (Is_otg_vbus_high()) { + udd_attach(); + } else { + udd_detach(); + } +#endif +#ifdef UDC_VBUS_EVENT + UDC_VBUS_EVENT(Is_otg_vbus_high()); +#endif + goto udd_interrupt_end; + } +udd_interrupt_end: + dbg_print("\n\r"); +udd_interrupt_sof_end: + return; +} + + +bool udd_include_vbus_monitoring(void) +{ + return true; +} + + +void udd_enable(void) +{ + irqflags_t flags; + + flags = cpu_irq_save(); + +#ifdef UHD_ENABLE + // DUAL ROLE INITIALIZATION + if (otg_dual_enable()) { + // The current mode has been started by otg_dual_enable() + cpu_irq_restore(flags); + return; + } +#else + // SINGLE DEVICE MODE INITIALIZATION + pmc_enable_periph_clk(ID_UOTGHS); + sysclk_enable_usb(); + + // Here, only the device mode is possible, then link UOTGHS interrupt to UDD interrupt + NVIC_SetPriority((IRQn_Type) ID_UOTGHS, UDD_USB_INT_LEVEL); + NVIC_EnableIRQ((IRQn_Type) ID_UOTGHS); + + // Always authorize asynchrone USB interrupts to exit of sleep mode + // For SAM USB wake up device except BACKUP mode + pmc_set_fast_startup_input(PMC_FSMR_USBAL); +#endif + +#if (defined USB_ID_GPIO) && (defined UHD_ENABLE) + // Check that the device mode is selected by ID pin + if (!Is_otg_id_device()) { + cpu_irq_restore(flags); + return; // Device is not the current mode + } +#else + // ID pin not used then force device mode + otg_disable_id_pin(); + otg_force_device_mode(); +#endif + // Enable USB hardware + otg_enable_pad(); + otg_enable(); + + // Set the USB speed requested by configuration file +#ifdef USB_DEVICE_LOW_SPEED + udd_low_speed_enable(); +#else + udd_low_speed_disable(); +# ifdef USB_DEVICE_HS_SUPPORT + udd_high_speed_enable(); +# else + udd_high_speed_disable(); +# endif +#endif // USB_DEVICE_LOW_SPEED + + // Check USB clock + otg_unfreeze_clock(); + while (!Is_otg_clock_usable()); + + // Reset internal variables +#if (0!=USB_DEVICE_MAX_EP) + udd_ep_job_table_reset(); +#endif + + otg_ack_vbus_transition(); + // Force Vbus interrupt in case of Vbus always with a high level + // This is possible with a short timing between a Host mode stop/start. + if (Is_otg_vbus_high()) { + otg_raise_vbus_transition(); + } + otg_enable_vbus_interrupt(); + otg_freeze_clock(); + +#ifndef UDD_NO_SLEEP_MGR + if (!udd_b_sleep_initialized) { + udd_b_sleep_initialized = true; + // Initialize the sleep mode authorized for the USB suspend mode + udd_b_idle = false; + sleepmgr_lock_mode(UOTGHS_SLEEP_MODE_USB_SUSPEND); + } else { + udd_sleep_mode(false); // Enter idle mode + } +#endif + + cpu_irq_restore(flags); +} + + +void udd_disable(void) +{ + irqflags_t flags; + +#ifdef UHD_ENABLE +# ifdef USB_ID_GPIO + if (Is_otg_id_host()) { + // Freeze clock to switch mode + otg_freeze_clock(); + udd_detach(); + otg_disable(); + return; // Host mode running, ignore UDD disable + } +# else + if (Is_otg_host_mode_forced()) { + return; // Host mode running, ignore UDD disable + } +# endif +#endif + + flags = cpu_irq_save(); + otg_unfreeze_clock(); + udd_detach(); +#ifndef UDD_NO_SLEEP_MGR + if (udd_b_sleep_initialized) { + udd_b_sleep_initialized = false; + sleepmgr_unlock_mode(UOTGHS_SLEEP_MODE_USB_SUSPEND); + } +#endif + +#ifndef UHD_ENABLE + otg_disable(); + otg_disable_pad(); + sysclk_disable_usb(); + pmc_disable_periph_clk(ID_UOTGHS); + // Else the USB clock disable is done by UHC which manage USB dual role +#endif + cpu_irq_restore(flags); +} + + +void udd_attach(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + + // At startup the USB bus state is unknown, + // therefore the state is considered IDLE to not miss any USB event + udd_sleep_mode(true); + otg_unfreeze_clock(); + + // This section of clock check can be improved with a chek of + // USB clock source via sysclk() + // Check USB clock because the source can be a PLL + while (!Is_otg_clock_usable()); + + // Authorize attach if Vbus is present + udd_attach_device(); + + // Enable USB line events + udd_enable_reset_interrupt(); + udd_enable_suspend_interrupt(); + udd_enable_wake_up_interrupt(); + udd_enable_sof_interrupt(); +#ifdef USB_DEVICE_HS_SUPPORT + udd_enable_msof_interrupt(); +#endif + // Reset following interupts flag + udd_ack_reset(); + udd_ack_sof(); + udd_ack_msof(); + + // The first suspend interrupt must be forced + // The first suspend interrupt is not detected else raise it + udd_raise_suspend(); + + udd_ack_wake_up(); + otg_freeze_clock(); + cpu_irq_restore(flags); +} + + +void udd_detach(void) +{ + otg_unfreeze_clock(); + + // Detach device from the bus + udd_detach_device(); + otg_freeze_clock(); + udd_sleep_mode(false); +} + + +bool udd_is_high_speed(void) +{ +#ifdef USB_DEVICE_HS_SUPPORT + return !Is_udd_full_speed_mode(); +#else + return false; +#endif +} + + +void udd_set_address(uint8_t address) +{ + udd_disable_address(); + udd_configure_address(address); + udd_enable_address(); +} + + +uint8_t udd_getaddress(void) +{ + return udd_get_configured_address(); +} + + +uint16_t udd_get_frame_number(void) +{ + return udd_frame_number(); +} + +uint16_t udd_get_micro_frame_number(void) +{ + return udd_micro_frame_number(); +} + +void udd_send_remotewakeup(void) +{ +#ifndef UDD_NO_SLEEP_MGR + if (!udd_b_idle) +#endif + { + udd_sleep_mode(true); // Enter in IDLE mode + otg_unfreeze_clock(); + udd_initiate_remote_wake_up(); + } +} + + +void udd_set_setup_payload(uint8_t *payload, uint16_t payload_size) +{ + udd_g_ctrlreq.payload = payload; + udd_g_ctrlreq.payload_size = payload_size; +} + + +#if (0 != USB_DEVICE_MAX_EP) +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize) +{ + bool b_dir_in; + uint16_t ep_allocated; + uint8_t nb_bank, bank, i; + + b_dir_in = ep & USB_EP_DIR_IN; + ep = ep & USB_EP_ADDR_MASK; + + if (ep > USB_DEVICE_MAX_EP) { + return false; + } + if (Is_udd_endpoint_enabled(ep)) { + return false; + } + dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize); + + // Bank choise + switch (bmAttributes & USB_EP_TYPE_MASK) { + case USB_EP_TYPE_ISOCHRONOUS: + nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep); + break; + case USB_EP_TYPE_INTERRUPT: + nb_bank = UDD_INTERRUPT_NB_BANK(ep); + break; + case USB_EP_TYPE_BULK: + nb_bank = UDD_BULK_NB_BANK(ep); + break; + default: + Assert(false); + return false; + } + switch (nb_bank) { + case 1: + bank = UOTGHS_DEVEPTCFG_EPBK_1_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + case 2: + bank = UOTGHS_DEVEPTCFG_EPBK_2_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + case 3: + bank = UOTGHS_DEVEPTCFG_EPBK_3_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + default: + Assert(false); + return false; + } + + // Check if endpoint size is 8,16,32,64,128,256,512 or 1023 + Assert(MaxEndpointSize < 1024); + Assert((MaxEndpointSize == 1023) + || !(MaxEndpointSize & (MaxEndpointSize - 1))); + Assert(MaxEndpointSize >= 8); + + // Set configuration of new endpoint + udd_configure_endpoint(ep, bmAttributes, (b_dir_in ? 1 : 0), + MaxEndpointSize, bank); + ep_allocated = 1 << ep; + + // Unalloc endpoints superior + for (i = USB_DEVICE_MAX_EP; i > ep; i--) { + if (Is_udd_endpoint_enabled(i)) { + ep_allocated |= 1 << i; + udd_disable_endpoint(i); + udd_unallocate_memory(i); + } + } + + // Realloc/Enable endpoints + for (i = ep; i <= USB_DEVICE_MAX_EP; i++) { + if (ep_allocated & (1 << i)) { + udd_ep_job_t *ptr_job = &udd_ep_job[i - 1]; + bool b_restart = ptr_job->busy; + // Restart running job because + // memory window slides up and its data is lost + ptr_job->busy = false; + // Re-allocate memory + udd_allocate_memory(i); + udd_enable_endpoint(i); + if (!Is_udd_endpoint_configured(i)) { + dbg_print("ErrRealloc%d ", i); + if (NULL == ptr_job->call_trans) { + return false; + } + if (Is_udd_endpoint_in(i)) { + i |= USB_EP_DIR_IN; + } + ptr_job->call_trans(UDD_EP_TRANSFER_ABORT, + ptr_job->buf_cnt, i); + return false; + } + udd_enable_endpoint_bank_autoswitch(i); + if (b_restart) { + // Re-run the job remaining part +# ifdef UDD_EP_FIFO_SUPPORTED + if (!Is_udd_endpoint_dma_supported(i) + && !Is_udd_endpoint_in(i)) { + ptr_job->buf_cnt -= ptr_job->buf_load; + } +# else + ptr_job->buf_cnt -= ptr_job->buf_load; +# endif + b_restart = udd_ep_run(Is_udd_endpoint_in(i) ? + (i | USB_EP_DIR_IN) : i, + ptr_job->b_shortpacket, + &ptr_job->buf[ptr_job->buf_cnt], + ptr_job->buf_size + - ptr_job->buf_cnt, + ptr_job->call_trans); + if (!b_restart) { + dbg_print("ErrReRun%d ", i); + return false; + } + } + } + } + return true; +} + + +void udd_ep_free(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep_index) { + return; + } + udd_disable_endpoint(ep_index); + udd_unallocate_memory(ep_index); + udd_ep_abort_job(ep); + udd_ep_job[ep_index - 1].stall_requested = false; +} + + +bool udd_ep_is_halted(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + return Is_udd_endpoint_stall_requested(ep_index); +} + + +bool udd_ep_set_halt(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + udd_ep_job_t *ptr_job = &udd_ep_job[ep_index - 1]; + irqflags_t flags; + + if (USB_DEVICE_MAX_EP < ep_index) { + return false; + } + + if (Is_udd_endpoint_stall_requested(ep_index) // Endpoint stalled + || ptr_job->stall_requested) { // Endpoint stall is requested + return true; // Already STALL + } + + if (ptr_job->busy == true) { + return false; // Job on going, stall impossible + } + + flags = cpu_irq_save(); + if ((ep & USB_EP_DIR_IN) && (0 != udd_nb_busy_bank(ep_index))) { + // Delay the stall after the end of IN transfer on USB line + ptr_job->stall_requested = true; +#ifdef UDD_EP_FIFO_SUPPORTED + udd_disable_in_send_interrupt(ep_index); + udd_enable_endpoint_bank_autoswitch(ep_index); +#endif + udd_enable_bank_interrupt(ep_index); + udd_enable_endpoint_interrupt(ep_index); + cpu_irq_restore(flags); + return true; + } + // Stall endpoint immediately + udd_disable_endpoint_bank_autoswitch(ep_index); + udd_ack_stall(ep_index); + udd_enable_stall_handshake(ep_index); + cpu_irq_restore(flags); + return true; +} + + +bool udd_ep_clear_halt(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + udd_ep_job_t *ptr_job = &udd_ep_job[ep_index - 1]; + bool b_stall_cleared = false; + + if (USB_DEVICE_MAX_EP < ep_index) + return false; + + if (ptr_job->stall_requested) { + // Endpoint stall has been requested but not done + // Remove stall request + ptr_job->stall_requested = false; + udd_disable_bank_interrupt(ep_index); + udd_disable_endpoint_interrupt(ep_index); + b_stall_cleared = true; + } + if (Is_udd_endpoint_stall_requested(ep_index)) { + if (Is_udd_stall(ep_index)) { + udd_ack_stall(ep_index); + // A packet has been stalled + // then reset datatoggle + udd_reset_data_toggle(ep_index); + } + // Disable stall + udd_disable_stall_handshake(ep_index); + udd_enable_endpoint_bank_autoswitch(ep_index); + b_stall_cleared = true; + } + if (b_stall_cleared) { + // If a job is register on clear halt action + // then execute callback + if (ptr_job->busy == true) { + ptr_job->busy = false; + ptr_job->call_nohalt(); + } + } + return true; +} + + +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ +#ifdef UDD_EP_FIFO_SUPPORTED + bool b_dir_in = Is_udd_endpoint_in(ep & USB_EP_ADDR_MASK); +#endif + udd_ep_job_t *ptr_job; + irqflags_t flags; + + ep &= USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep) { + return false; + } + + // Get job about endpoint + ptr_job = &udd_ep_job[ep - 1]; + + if ((!Is_udd_endpoint_enabled(ep)) + || Is_udd_endpoint_stall_requested(ep) + || ptr_job->stall_requested) { + return false; // Endpoint is halted + } + + flags = cpu_irq_save(); + if (ptr_job->busy == true) { + cpu_irq_restore(flags); + return false; // Job already on going + } + ptr_job->busy = true; + cpu_irq_restore(flags); + + // No job running. Let's setup a new one. + ptr_job->buf = buf; + ptr_job->buf_size = buf_size; + ptr_job->buf_cnt = 0; + ptr_job->buf_load = 0; + ptr_job->call_trans = callback; + ptr_job->b_shortpacket = b_shortpacket || (buf_size == 0); + +#ifdef UDD_EP_FIFO_SUPPORTED + // No DMA support + if (!Is_udd_endpoint_dma_supported(ep)) { + dbg_print("ex%x.%c%d\n\r", ep, b_dir_in ? 'i':'o', buf_size); + flags = cpu_irq_save(); + udd_enable_endpoint_interrupt(ep); + if (b_dir_in) { + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_in_send_interrupt(ep); + } else { + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_out_received_interrupt(ep); + } + cpu_irq_restore(flags); + return true; + } +#endif // UDD_EP_FIFO_SUPPORTED + +#ifdef UDD_EP_DMA_SUPPORTED + // Request first DMA transfer + dbg_print("(exDMA%x) ", ep); + udd_ep_trans_done(ep); + return true; +#endif +} + + +void udd_ep_abort(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + +#ifdef UDD_EP_FIFO_SUPPORTED + if (!Is_udd_endpoint_dma_supported(ep_index)) { + // Disable interrupts + udd_disable_endpoint_interrupt(ep_index); + udd_disable_out_received_interrupt(ep_index); + udd_disable_in_send_interrupt(ep_index); + } else +#endif + { + // Stop DMA transfer + udd_disable_endpoint_dma_interrupt(ep_index); + udd_endpoint_dma_set_control(ep_index, 0); + } + udd_disable_endpoint_interrupt(ep_index); + // Kill IN banks + if (ep & USB_EP_DIR_IN) { + while(udd_nb_busy_bank(ep_index)) { + udd_kill_last_in_bank(ep_index); + while(Is_udd_kill_last(ep_index)); + } + } + udd_ep_abort_job(ep); +} + + +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback) +{ + udd_ep_job_t *ptr_job; + + ep &= USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep) { + return false; + } + + ptr_job = &udd_ep_job[ep - 1]; + + if (!Is_udd_endpoint_enabled(ep)) { + return false; // Endpoint not enabled + } + + // Wait clear halt endpoint + if (ptr_job->busy == true) { + return false; // Job already on going + } + + if (Is_udd_endpoint_stall_requested(ep) + || ptr_job->stall_requested) { + // Endpoint halted then registes the callback + ptr_job->busy = true; + ptr_job->call_nohalt = callback; + } else { + // endpoint not halted then call directly callback + callback(); + } + return true; +} +#endif // (0 != USB_DEVICE_MAX_EP) + + +#ifdef USB_DEVICE_HS_SUPPORT + +void udd_test_mode_j(void) +{ + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_j(); +} + + +void udd_test_mode_k(void) +{ + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_k(); +} + + +void udd_test_mode_se0_nak(void) +{ + udd_enable_hs_test_mode(); +} + + +void udd_test_mode_packet(void) +{ + uint8_t i; + uint8_t *ptr_dest; + const uint8_t *ptr_src; + + const uint8_t test_packet[] = { + // 00000000 * 9 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 01010101 * 8 + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + // 01110111 * 8 + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + // 0, {111111S * 15}, 111111 + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, + // S, 111111S, {0111111S * 7} + 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, + // 00111111, {S0111111 * 9}, S0 + 0xFC, 0x7E, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0x7E + }; + + // Reconfigure control endpoint to bulk IN endpoint + udd_disable_endpoint(0); + udd_configure_endpoint(0, USB_EP_TYPE_BULK, 1, + 64, UOTGHS_DEVEPTCFG_EPBK_1_BANK); + udd_allocate_memory(0); + udd_enable_endpoint(0); + + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_packet(); + + // Send packet on endpoint 0 + ptr_dest = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + ptr_src = test_packet; + + for (i = 0; i < sizeof(test_packet); i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ack_fifocon(0); +} +#endif // USB_DEVICE_HS_SUPPORT + + + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT + +static void udd_reset_ep_ctrl(void) +{ + irqflags_t flags; + + // Reset USB address to 0 + udd_configure_address(0); + udd_enable_address(); + + // Alloc and configure control endpoint + udd_configure_endpoint(0, + USB_EP_TYPE_CONTROL, + 0, + USB_DEVICE_EP_CTRL_SIZE, + UOTGHS_DEVEPTCFG_EPBK_1_BANK); + + udd_allocate_memory(0); + udd_enable_endpoint(0); + flags = cpu_irq_save(); + udd_enable_setup_received_interrupt(0); + udd_enable_out_received_interrupt(0); + udd_enable_endpoint_interrupt(0); + cpu_irq_restore(flags); +} + +static void udd_ctrl_init(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + + // In case of abort of IN Data Phase: + // No need to abort IN transfer (rise TXINI), + // because it is automatically done by hardware when a Setup packet is received. + // But the interrupt must be disabled to don't generate interrupt TXINI + // after SETUP reception. + udd_disable_in_send_interrupt(0); + cpu_irq_restore(flags); + + // In case of OUT ZLP event is no processed before Setup event occurs + udd_ack_out_received(0); + + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + udd_g_ctrlreq.payload_size = 0; + udd_ep_control_state = UDD_EPCTRL_SETUP; +} + + +static void udd_ctrl_setup_received(void) +{ + irqflags_t flags; + uint8_t i; + + if (UDD_EPCTRL_SETUP != udd_ep_control_state) { + // May be a hidden DATA or ZLP phase or protocol abort + udd_ctrl_endofrequest(); + + // Reinitializes control endpoint management + udd_ctrl_init(); + } + // Fill setup request structure + if (8 != udd_byte_count(0)) { + udd_ctrl_stall_data(); + udd_ack_setup_received(0); + return; // Error data number doesn't correspond to SETUP packet + } + uint8_t *ptr = (uint8_t *) & udd_get_endpoint_fifo_access(0,8); + for (i = 0; i < 8; i++) { + ((uint8_t*) &udd_g_ctrlreq.req)[i] = *ptr++; + } + // Manage LSB/MSB to fit with CPU usage + udd_g_ctrlreq.req.wValue = le16_to_cpu(udd_g_ctrlreq.req.wValue); + udd_g_ctrlreq.req.wIndex = le16_to_cpu(udd_g_ctrlreq.req.wIndex); + udd_g_ctrlreq.req.wLength = le16_to_cpu(udd_g_ctrlreq.req.wLength); + + // Decode setup request + if (udc_process_setup() == false) { + // Setup request unknow then stall it + udd_ctrl_stall_data(); + udd_ack_setup_received(0); + return; + } + udd_ack_setup_received(0); + + if (Udd_setup_is_in()) { + // IN data phase requested + udd_ctrl_prev_payload_buf_cnt = 0; + udd_ctrl_payload_buf_cnt = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_IN; + udd_ctrl_in_sent(); // Send first data transfer + } else { + if (0 == udd_g_ctrlreq.req.wLength) { + // No data phase requested + // Send IN ZLP to ACK setup request + udd_ctrl_send_zlp_in(); + return; + } + // OUT data phase requested + udd_ctrl_prev_payload_buf_cnt = 0; + udd_ctrl_payload_buf_cnt = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_OUT; + // To detect a protocol error, enable nak interrupt on data IN phase + udd_ack_nak_in(0); + flags = cpu_irq_save(); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); + } +} + + +static void udd_ctrl_in_sent(void) +{ + static bool b_shortpacket = false; + uint16_t nb_remain; + uint8_t i; + uint8_t *ptr_dest, *ptr_src; + irqflags_t flags; + + flags = cpu_irq_save(); + udd_disable_in_send_interrupt(0); + cpu_irq_restore(flags); + + if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // ZLP on IN is sent, then valid end of setup request + udd_ctrl_endofrequest(); + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + Assert(udd_ep_control_state == UDD_EPCTRL_DATA_IN); + + nb_remain = udd_g_ctrlreq.payload_size - udd_ctrl_payload_buf_cnt; + if (0 == nb_remain) { + // All content of current buffer payload are sent + // Update number of total data sending by previous playlaod buffer + udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt; + if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt) + || b_shortpacket) { + // All data requested are transfered or a short packet has been sent + // then it is the end of data phase. + // Generate an OUT ZLP for handshake phase. + udd_ctrl_send_zlp_out(); + return; + } + // Need of new buffer because the data phase is not complete + if ((!udd_g_ctrlreq.over_under_run) + || (!udd_g_ctrlreq.over_under_run())) { + // Underrun then send zlp on IN + // Here nb_remain=0 and allows to send a IN ZLP + } else { + // A new payload buffer is given + udd_ctrl_payload_buf_cnt = 0; + nb_remain = udd_g_ctrlreq.payload_size; + } + } + // Continue transfer and send next data + if (nb_remain >= USB_DEVICE_EP_CTRL_SIZE) { + nb_remain = USB_DEVICE_EP_CTRL_SIZE; + b_shortpacket = false; + } else { + b_shortpacket = true; + } + // Fill buffer of endpoint control + ptr_dest = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + ptr_src = udd_g_ctrlreq.payload + udd_ctrl_payload_buf_cnt; + // Critical section + // Only in case of DATA IN phase abort without USB Reset signal after. + // The IN data don't must be written in endpoint 0 DPRAM during + // a next setup reception in same endpoint 0 DPRAM. + // Thereby, an OUT ZLP reception must check before IN data write + // and if no OUT ZLP is recevied the data must be written quickly (800us) + // before an eventually ZLP OUT and SETUP reception + flags = cpu_irq_save(); + if (Is_udd_out_received(0)) { + // IN DATA phase aborted by OUT ZLP + cpu_irq_restore(flags); + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + return; // Exit of IN DATA phase + } + // Write quickly the IN data + for (i = 0; i < nb_remain; i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ctrl_payload_buf_cnt += nb_remain; + + // Validate and send the data available in the control endpoint buffer + udd_ack_in_send(0); + udd_enable_in_send_interrupt(0); + // In case of abort of DATA IN phase, no need to enable nak OUT interrupt + // because OUT endpoint is already free and ZLP OUT accepted. + cpu_irq_restore(flags); +} + + +static void udd_ctrl_out_received(void) +{ + irqflags_t flags; + uint8_t i; + uint16_t nb_data; + + if (UDD_EPCTRL_DATA_OUT != udd_ep_control_state) { + if ((UDD_EPCTRL_DATA_IN == udd_ep_control_state) + || (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == + udd_ep_control_state)) { + // End of SETUP request: + // - Data IN Phase aborted, + // - or last Data IN Phase hidden by ZLP OUT sending quiclky, + // - or ZLP OUT received normaly. + udd_ctrl_endofrequest(); + } else { + // Protocol error during SETUP request + udd_ctrl_stall_data(); + } + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + // Read data received during OUT phase + nb_data = udd_byte_count(0); + if (udd_g_ctrlreq.payload_size < (udd_ctrl_payload_buf_cnt + nb_data)) { + // Payload buffer too small + nb_data = udd_g_ctrlreq.payload_size - udd_ctrl_payload_buf_cnt; + } + uint8_t *ptr_src = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + uint8_t *ptr_dest = udd_g_ctrlreq.payload + udd_ctrl_payload_buf_cnt; + for (i = 0; i < nb_data; i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ctrl_payload_buf_cnt += nb_data; + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) + || (udd_g_ctrlreq.req.wLength <= + (udd_ctrl_prev_payload_buf_cnt + + udd_ctrl_payload_buf_cnt))) { + // End of reception because it is a short packet + // Before send ZLP, call intermediat calback + // in case of data receiv generate a stall + udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt; + if (NULL != udd_g_ctrlreq.over_under_run) { + if (!udd_g_ctrlreq.over_under_run()) { + // Stall ZLP + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + } + // Send IN ZLP to ACK setup request + udd_ack_out_received(0); + udd_ctrl_send_zlp_in(); + return; + } + + if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) { + // Overrun then request a new payload buffer + if (!udd_g_ctrlreq.over_under_run) { + // No callback availabled to request a new payload buffer + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + if (!udd_g_ctrlreq.over_under_run()) { + // No new payload buffer delivered + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + // New payload buffer available + // Update number of total data received + udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt; + // Reinit reception on payload buffer + udd_ctrl_payload_buf_cnt = 0; + } + // Free buffer of control endpoint to authorize next reception + udd_ack_out_received(0); + // To detect a protocol error, enable nak interrupt on data IN phase + udd_ack_nak_in(0); + flags = cpu_irq_save(); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_underflow(void) +{ + if (Is_udd_out_received(0)) + return; // Underflow ignored if OUT data is received + + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { + // Host want to stop OUT transaction + // then stop to wait OUT data phase and wait IN ZLP handshake + udd_ctrl_send_zlp_in(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + // A OUT handshake is waiting by device, + // but host want extra IN data then stall extra IN data + udd_enable_stall_handshake(0); + } +} + + +static void udd_ctrl_overflow(void) +{ + if (Is_udd_in_send(0)) + return; // Overflow ignored if IN data is received + + // The case of UDD_EPCTRL_DATA_IN is not managed + // because the OUT endpoint is already free and OUT ZLP accepted + + if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // A IN handshake is waiting by device, + // but host want extra OUT data then stall extra OUT data + udd_enable_stall_handshake(0); + } +} + + +static void udd_ctrl_stall_data(void) +{ + // Stall all packets on IN & OUT control endpoint + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + udd_enable_stall_handshake(0); +} + + +static void udd_ctrl_send_zlp_in(void) +{ + irqflags_t flags; + + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP; + + // Validate and send empty IN packet on control endpoint + flags = cpu_irq_save(); + // Send ZLP on IN endpoint + udd_ack_in_send(0); + udd_enable_in_send_interrupt(0); + // To detect a protocol error, enable nak interrupt on data OUT phase + udd_ack_nak_out(0); + udd_enable_nak_out_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_send_zlp_out(void) +{ + irqflags_t flags; + + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + // No action is necessary to accept OUT ZLP + // because the buffer of control endpoint is already free + + // To detect a protocol error, enable nak interrupt on data IN phase + flags = cpu_irq_save(); + udd_ack_nak_in(0); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_endofrequest(void) +{ + // If a callback is registered then call it + if (udd_g_ctrlreq.callback) { + udd_g_ctrlreq.callback(); + } +} + + +static bool udd_ctrl_interrupt(void) +{ + + if (!Is_udd_endpoint_interrupt(0)) { + return false; // No interrupt events on control endpoint + } + + dbg_print("0: "); + + // By default disable overflow and underflow interrupt + udd_disable_nak_in_interrupt(0); + udd_disable_nak_out_interrupt(0); + + // Search event on control endpoint + if (Is_udd_setup_received(0)) { + dbg_print("stup "); + // SETUP packet received + udd_ctrl_setup_received(); + return true; + } + if (Is_udd_in_send(0) && Is_udd_in_send_interrupt_enabled(0)) { + dbg_print("in "); + // IN packet sent + udd_ctrl_in_sent(); + return true; + } + if (Is_udd_out_received(0)) { + dbg_print("out "); + // OUT packet received + udd_ctrl_out_received(); + return true; + } + if (Is_udd_nak_out(0)) { + dbg_print("nako "); + // Overflow on OUT packet + udd_ack_nak_out(0); + udd_ctrl_overflow(); + return true; + } + if (Is_udd_nak_in(0)) { + dbg_print("naki "); + // Underflow on IN packet + udd_ack_nak_in(0); + udd_ctrl_underflow(); + return true; + } + dbg_print("n%x ", UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], 0)); + return false; +} + + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS + +#if (0 != USB_DEVICE_MAX_EP) + +static void udd_ep_job_table_reset(void) +{ + uint8_t i; + for (i = 0; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_job[i].busy = false; + udd_ep_job[i].stall_requested = false; + } +} + + +static void udd_ep_job_table_kill(void) +{ + uint8_t i; + + // For each endpoint, kill job + for (i = 0; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_finish_job(&udd_ep_job[i], true, i + 1); + } +} + + +static void udd_ep_abort_job(udd_ep_id_t ep) +{ + ep &= USB_EP_ADDR_MASK; + + // Abort job on endpoint + udd_ep_finish_job(&udd_ep_job[ep - 1], true, ep); +} + + +static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num) +{ + if (ptr_job->busy == false) { + return; // No on-going job + } + dbg_print("(JobE%x:%d) ", (ptr_job-udd_ep_job)+1, b_abort); + ptr_job->busy = false; + if (NULL == ptr_job->call_trans) { + return; // No callback linked to job + } + if (Is_udd_endpoint_in(ep_num)) { + ep_num |= USB_EP_DIR_IN; + } + ptr_job->call_trans((b_abort) ? UDD_EP_TRANSFER_ABORT : + UDD_EP_TRANSFER_OK, ptr_job->buf_size, ep_num); +} + +#ifdef UDD_EP_DMA_SUPPORTED +static void udd_ep_trans_done(udd_ep_id_t ep) +{ + uint32_t udd_dma_ctrl = 0; + udd_ep_job_t *ptr_job; + iram_size_t next_trans; + irqflags_t flags; + + // Get job corresponding at endpoint + ptr_job = &udd_ep_job[ep - 1]; + + if (!ptr_job->busy) { + return; // No job is running, then ignore it (system error) + } + + if (ptr_job->buf_cnt != ptr_job->buf_size) { + // Need to send or receiv other data + next_trans = ptr_job->buf_size - ptr_job->buf_cnt; + + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + // The USB hardware support a maximum + // transfer size of UDD_ENDPOINT_MAX_TRANS Bytes + next_trans = UDD_ENDPOINT_MAX_TRANS; + + // Set 0 to tranfer the maximum + udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0); + } else { + udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans); + } + if (Is_udd_endpoint_in(ep)) { + if (0 != (next_trans % udd_get_endpoint_size(ep))) { + // Enable short packet option + // else the DMA transfer is accepted + // and interrupt DMA valid but nothing is sent. + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_B_EN; + // No need to request another ZLP + ptr_job->b_shortpacket = false; + } + } else { + if ((USB_EP_TYPE_ISOCHRONOUS != udd_get_endpoint_type(ep)) + || (next_trans <= (iram_size_t) udd_get_endpoint_size(ep))) { + + // Enable short packet reception + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_TR_IT + | UOTGHS_DEVDMACONTROL_END_TR_EN; + } + } + + // Start USB DMA to fill or read fifo of the selected endpoint + udd_endpoint_dma_set_addr(ep, (uint32_t) & ptr_job->buf[ptr_job->buf_cnt]); + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_BUFFIT | + UOTGHS_DEVDMACONTROL_CHANN_ENB; + + + // Disable IRQs to have a short sequence + // between read of EOT_STA and DMA enable + flags = cpu_irq_save(); + if (!(udd_endpoint_dma_get_status(ep) + & UOTGHS_DEVDMASTATUS_END_TR_ST)) { + dbg_print("dmaS%x ", ep); + udd_endpoint_dma_set_control(ep, udd_dma_ctrl); + ptr_job->buf_cnt += next_trans; + ptr_job->buf_load = next_trans; + udd_enable_endpoint_dma_interrupt(ep); + cpu_irq_restore(flags); + return; + } + cpu_irq_restore(flags); + + // Here a ZLP has been recieved + // and the DMA transfer must be not started. + // It is the end of transfer + ptr_job->buf_size = ptr_job->buf_cnt; + } + if (Is_udd_endpoint_in(ep)) { + if (ptr_job->b_shortpacket) { + dbg_print("zlpS%x ", ep); + // Need to send a ZLP (No possible with USB DMA) + // enable interrupt to wait a free bank to sent ZLP + udd_ack_in_send(ep); + if (Is_udd_write_enabled(ep)) { + // Force interrupt in case of ep already free + udd_raise_in_send(ep); + } + udd_enable_in_send_interrupt(ep); + udd_enable_endpoint_interrupt(ep); + return; + } + } + dbg_print("dmaE "); + // Call callback to signal end of transfer + udd_ep_finish_job(ptr_job, false, ep); +} +#endif + +#ifdef UDD_EP_FIFO_SUPPORTED +static void udd_ep_in_sent(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job = &udd_ep_job[ep - 1]; + uint8_t *ptr_src = &ptr_job->buf[ptr_job->buf_cnt]; + uint8_t *ptr_dst = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + uint32_t pkt_size = udd_get_endpoint_size(ep); + uint32_t nb_data = 0, i; + uint32_t nb_remain; + irqflags_t flags; + + // All transfer done, including ZLP, Finish Job + if (ptr_job->buf_cnt >= ptr_job->buf_size && !ptr_job->b_shortpacket) { + flags = cpu_irq_save(); + udd_disable_in_send_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + cpu_irq_restore(flags); + + ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count + udd_ep_finish_job(ptr_job, false, ep); + return; + } else { + // ACK TXINI + udd_ack_in_send(ep); + // Fill FIFO + ptr_dst = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + ptr_src = &ptr_job->buf[ptr_job->buf_cnt]; + nb_remain = ptr_job->buf_size - ptr_job->buf_cnt; + // Fill a bank even if no data (ZLP) + nb_data = MIN(nb_remain, pkt_size); + // Modify job information + ptr_job->buf_cnt += nb_data; + ptr_job->buf_load = nb_data; + + // Copy buffer to FIFO + for (i = 0; i < nb_data; i++) { + *ptr_dst++ = *ptr_src++; + } + // Switch to next bank + udd_ack_fifocon(ep); + // ZLP? + if (nb_data < pkt_size) { + ptr_job->b_shortpacket = false; + } + } +} + +static void udd_ep_out_received(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job = &udd_ep_job[ep - 1]; + uint32_t nb_data = 0, i; + uint32_t nb_remain = ptr_job->buf_size - ptr_job->buf_cnt; + uint32_t pkt_size = udd_get_endpoint_size(ep); + uint8_t *ptr_src = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + uint8_t *ptr_dst = &ptr_job->buf[ptr_job->buf_cnt]; + bool b_full = false, b_short = false; + + // Clear RX OUT + udd_ack_out_received(ep); + + // Read byte count + nb_data = udd_byte_count(ep); + if (nb_data < pkt_size) { + b_short = true; + } + //dbg_print("o%d ", ep); + //dbg_print("%d ", nb_data); + // Copy data if there is + if (nb_data > 0) { + if (nb_data >= nb_remain) { + nb_data = nb_remain; + b_full = true; + } + // Modify job information + ptr_job->buf_cnt += nb_data; + ptr_job->buf_load = nb_data; + // Copy FIFO to buffer + for (i = 0; i < nb_data; i++) { + *ptr_dst++ = *ptr_src++; + } + } + // Clear FIFO Status + udd_ack_fifocon(ep); + // Finish job on error or short packet + if (b_full || b_short) { + //dbg_print("EoO%d\n\r", ep); + udd_disable_out_received_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count + udd_ep_finish_job(ptr_job, false, ep); + } +} +#endif // #ifdef UDD_EP_FIFO_SUPPORTED + +static bool udd_ep_interrupt(void) +{ + udd_ep_id_t ep; + udd_ep_job_t *ptr_job; + + // For each endpoint different of control endpoint (0) + for (ep = 1; ep <= USB_DEVICE_MAX_EP; ep++) { + // Get job corresponding at endpoint + ptr_job = &udd_ep_job[ep - 1]; + +#ifdef UDD_EP_DMA_SUPPORTED + // Check DMA event + if (Is_udd_endpoint_dma_interrupt_enabled(ep) + && Is_udd_endpoint_dma_interrupt(ep)) { + uint32_t nb_remaining; + if (udd_endpoint_dma_get_status(ep) + & UOTGHS_DEVDMASTATUS_CHANN_ENB) { + return true; // Ignore EOT_STA interrupt + } + dbg_print("dma%x: ", ep); + udd_disable_endpoint_dma_interrupt(ep); + // Save number of data no transfered + nb_remaining = (udd_endpoint_dma_get_status(ep) & + UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk) + >> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos; + if (nb_remaining) { + // Transfer no complete (short packet or ZLP) then: + // Update number of data transfered + ptr_job->buf_cnt -= nb_remaining; + // Set transfer complete to stop the transfer + ptr_job->buf_size = ptr_job->buf_cnt; + } + udd_ep_trans_done(ep); + return true; + } +#endif +#ifdef UDD_EP_FIFO_SUPPORTED + // Check RXRDY and TXEMPTY event for none DMA endpoints + if (!Is_udd_endpoint_dma_supported(ep) + && Is_udd_endpoint_interrupt_enabled(ep)) { + dbg_print("ep%x: ", ep); + // RXOUT: Full packet received + if (Is_udd_out_received(ep) + && Is_udd_out_received_interrupt_enabled(ep)) { + dbg_print("Out "); + udd_ep_out_received(ep); + return true; + } + // TXIN: packet sent + if (Is_udd_in_send(ep) + && Is_udd_in_send_interrupt_enabled(ep)) { + dbg_print("In "); + udd_ep_in_sent(ep); + return true; + } + // Errors: Abort? + if (Is_udd_overflow(ep) + || Is_udd_underflow(ep) + || Is_udd_crc_error(ep)) { + dbg_print("Err "); + udd_ep_abort(ep); + return true; + } + } +#endif // UDD_EP_FIFO_SUPPORTED + // Check empty bank interrupt event + if (Is_udd_endpoint_interrupt_enabled(ep)) { + dbg_print("bg%x: ", ep); + if (Is_udd_in_send_interrupt_enabled(ep) + && Is_udd_in_send(ep)) { + dbg_print("I "); + udd_disable_in_send_interrupt(ep); + // One bank is free then send a ZLP + udd_ack_in_send(ep); + udd_ack_fifocon(ep); + udd_ep_finish_job(ptr_job, false, ep); + return true; + } + if (Is_udd_bank_interrupt_enabled(ep) + && (0 == udd_nb_busy_bank(ep))) { + dbg_print("EoT "); + // End of background transfer on IN endpoint + udd_disable_bank_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + + Assert(ptr_job->stall_requested); + // A stall has been requested during backgound transfer + ptr_job->stall_requested = false; + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_stall_handshake(ep); + udd_reset_data_toggle(ep); + return true; + } + } + } + return false; +} +#endif // (0 != USB_DEVICE_MAX_EP) + +//@} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h new file mode 100644 index 0000000000..1cd6914f85 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h @@ -0,0 +1,664 @@ +/** + * \file + * + * \brief USB Device Driver for UOTGHS. Compliant with common UDD driver. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UOTGHS_DEVICE_DUE_H_INCLUDED +#define UOTGHS_DEVICE_DUE_H_INCLUDED + +//#include "compiler.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +//! \ingroup udd_group +//! \defgroup udd_udphs_group USB On-The-Go High-Speed Port for device mode (UOTGHS) +//! UOTGHS low-level driver for USB device mode +//! +//! @{ + +#ifndef UOTGHS_DEVEPTCFG_EPDIR_Pos +// Bit pos is not defined in SAM header file but we need it. +# define UOTGHS_DEVEPTCFG_EPDIR_Pos 8 +#endif + +//! @name UOTGHS Device IP properties +//! These macros give access to IP properties +//! @{ + //! Get maximal number of endpoints +#define udd_get_endpoint_max_nbr() (9) +#define UDD_MAX_PEP_NB (udd_get_endpoint_max_nbr() + 1) + //! Get maximal number of banks of endpoints +#define udd_get_endpoint_bank_max_nbr(ep) ((ep == 0) ? 1 : (( ep <= 2) ? 3 : 2)) + //! Get maximal size of endpoint (3X, 1024/64) +#define udd_get_endpoint_size_max(ep) (((ep) == 0) ? 64 : 1024) + //! Get DMA support of endpoints +#define Is_udd_endpoint_dma_supported(ep) ((((ep) >= 1) && ((ep) <= 6)) ? true : false) + //! Get High Band Width support of endpoints +#define Is_udd_endpoint_high_bw_supported(ep) (((ep) >= 2) ? true : false) +//! @} + +//! @name UOTGHS Device speeds management +//! @{ + //! Enable/disable device low-speed mode +#define udd_low_speed_enable() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) +#define udd_low_speed_disable() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) + //! Test if device low-speed mode is forced +#define Is_udd_low_speed_enable() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) + +#ifdef UOTGHS_DEVCTRL_SPDCONF_HIGH_SPEED + //! Enable high speed mode +# define udd_high_speed_enable() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 0)) + //! Disable high speed mode +# define udd_high_speed_disable() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 3)) + //! Test if controller is in full speed mode +# define Is_udd_full_speed_mode() (Rd_bitfield(UOTGHS->UOTGHS_SR, UOTGHS_SR_SPEED_Msk) == UOTGHS_SR_SPEED_FULL_SPEED) +#else +# define udd_high_speed_enable() do { } while (0) +# define udd_high_speed_disable() do { } while (0) +# define Is_udd_full_speed_mode() true +#endif +//! @} + +//! @name UOTGHS Device HS test mode management +//! @{ +#ifdef UOTGHS_DEVCTRL_SPDCONF_HIGH_SPEED + //! Enable high speed test mode +# define udd_enable_hs_test_mode() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 2)) +# define udd_enable_hs_test_mode_j() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTJ)) +# define udd_enable_hs_test_mode_k() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTK)) +# define udd_enable_hs_test_mode_packet() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTPCKT)) +#endif +//! @} + +//! @name UOTGHS Device vbus management +//! @{ +#define udd_enable_vbus_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define udd_disable_vbus_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_udd_vbus_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_udd_vbus_high() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUS)) +#define Is_udd_vbus_low() (!Is_udd_vbus_high()) +#define udd_ack_vbus_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_VBUSTIC) +#define udd_raise_vbus_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_VBUSTIS) +#define Is_udd_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI)) +//! @} + + +//! @name UOTGHS device attach control +//! These macros manage the UOTGHS Device attach. +//! @{ + //! Detaches from USB bus +#define udd_detach_device() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) + //! Attaches to USB bus +#define udd_attach_device() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) + //! Test if the device is detached +#define Is_udd_detached() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) +//! @} + + +//! @name UOTGHS device bus events control +//! These macros manage the UOTGHS Device bus events. +//! @{ + +//! Initiates a remote wake-up event +//! @{ +#define udd_initiate_remote_wake_up() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_RMWKUP)) +#define Is_udd_pending_remote_wake_up() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_RMWKUP)) +//! @} + +//! Manage upstream resume event (=remote wakeup) +//! The USB driver sends a resume signal called "Upstream Resume" +//! @{ +#define udd_enable_remote_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_UPRSMES) +#define udd_disable_remote_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_UPRSMEC) +#define Is_udd_remote_wake_up_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_UPRSME)) +#define udd_ack_remote_wake_up_start() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_UPRSMC) +#define udd_raise_remote_wake_up_start() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_UPRSMS) +#define Is_udd_remote_wake_up_start() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_UPRSM)) +//! @} + +//! Manage downstream resume event (=remote wakeup from host) +//! The USB controller detects a valid "End of Resume" signal initiated by the host +//! @{ +#define udd_enable_resume_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_EORSMES) +#define udd_disable_resume_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_EORSMEC) +#define Is_udd_resume_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_EORSME)) +#define udd_ack_resume() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_EORSMC) +#define udd_raise_resume() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_EORSMS) +#define Is_udd_resume() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_EORSM)) +//! @} + +//! Manage wake-up event (=usb line activity) +//! The USB controller is reactivated by a filtered non-idle signal from the lines +//! @{ +#define udd_enable_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_WAKEUPES) +#define udd_disable_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_WAKEUPEC) +#define Is_udd_wake_up_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_WAKEUPE)) +#define udd_ack_wake_up() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_WAKEUPC) +#define udd_raise_wake_up() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_WAKEUPS) +#define Is_udd_wake_up() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_WAKEUP)) +//! @} + +//! Manage reset event +//! Set when a USB "End of Reset" has been detected +//! @{ +#define udd_enable_reset_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_EORSTES) +#define udd_disable_reset_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_EORSTEC) +#define Is_udd_reset_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_EORSTE)) +#define udd_ack_reset() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_EORSTC) +#define udd_raise_reset() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_EORSTS) +#define Is_udd_reset() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_EORST)) +//! @} + +//! Manage start of frame event +//! @{ +#define udd_enable_sof_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_SOFES) +#define udd_disable_sof_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_SOFEC) +#define Is_udd_sof_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_SOFE)) +#define udd_ack_sof() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_SOFC) +#define udd_raise_sof() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_SOFS) +#define Is_udd_sof() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_SOF)) +#define udd_frame_number() (Rd_bitfield(UOTGHS->UOTGHS_DEVFNUM, UOTGHS_DEVFNUM_FNUM_Msk)) +#define Is_udd_frame_number_crc_error() (Tst_bits(UOTGHS->UOTGHS_DEVFNUM, UOTGHS_DEVFNUM_FNCERR)) +//! @} + +//! Manage Micro start of frame event (High Speed Only) +//! @{ +#define udd_enable_msof_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_MSOFES) +#define udd_disable_msof_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_MSOFEC) +#define Is_udd_msof_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_MSOFE)) +#define udd_ack_msof() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVIMR_MSOFE) +#define udd_raise_msof() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_MSOFS) +#define Is_udd_msof() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_MSOF)) +#define udd_micro_frame_number() \ + (Rd_bitfield(UOTGHS->UOTGHS_DEVFNUM, (UOTGHS_DEVFNUM_FNUM_Msk|UOTGHS_DEVFNUM_MFNUM_Msk))) +//! @} + +//! Manage suspend event +//! @{ +#define udd_enable_suspend_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_SUSPES) +#define udd_disable_suspend_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_SUSPEC) +#define Is_udd_suspend_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_SUSPE)) +#define udd_ack_suspend() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_SUSPC) +#define udd_raise_suspend() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_SUSPS) +#define Is_udd_suspend() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_SUSP)) +//! @} + +//! @} + +//! @name UOTGHS device address control +//! These macros manage the UOTGHS Device address. +//! @{ + //! enables USB device address +#define udd_enable_address() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) + //! disables USB device address +#define udd_disable_address() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) +#define Is_udd_address_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) + //! configures the USB device address +#define udd_configure_address(addr) (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk, addr)) + //! gets the currently configured USB device address +#define udd_get_configured_address() (Rd_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk)) +//! @} + + +//! @name UOTGHS Device endpoint drivers +//! These macros manage the common features of the endpoints. +//! @{ + +//! Generic macro for UOTGHS registers that can be arrayed +//! @{ +#define UOTGHS_ARRAY(reg,index) ((&(UOTGHS->reg))[(index)]) +//! @} + +//! @name UOTGHS Device endpoint configuration +//! @{ + //! enables the selected endpoint +#define udd_enable_endpoint(ep) (Set_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! disables the selected endpoint +#define udd_disable_endpoint(ep) (Clr_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! tests if the selected endpoint is enabled +#define Is_udd_endpoint_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! resets the selected endpoint +#define udd_reset_endpoint(ep) \ + do { \ + Set_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep)); \ + Clr_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep)); \ + } while (0) + //! Tests if the selected endpoint is being reset +#define Is_udd_resetting_endpoint(ep) (Tst_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep))) + + //! Configures the selected endpoint type +#define udd_configure_endpoint_type(ep, type) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk, type)) + //! Gets the configured selected endpoint type +#define udd_get_endpoint_type(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk)) + //! Enables the bank autoswitch for the selected endpoint +#define udd_enable_endpoint_bank_autoswitch(ep) (Set_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) + //! Disables the bank autoswitch for the selected endpoint +#define udd_disable_endpoint_bank_autoswitch(ep) (Clr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) +#define Is_udd_endpoint_bank_autoswitch_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) + //! Configures the selected endpoint direction +#define udd_configure_endpoint_direction(ep, dir) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR, dir)) + //! Gets the configured selected endpoint direction +#define udd_get_endpoint_direction(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR)) +#define Is_udd_endpoint_in(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR)) + //! Bounds given integer size to allowed range and rounds it up to the nearest + //! available greater size, then applies register format of UOTGHS controller + //! for endpoint size bit-field. +#undef udd_format_endpoint_size +#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)MIN(MAX(size, 8), 1024) << 1) - 1) - 1 - 3) + //! Configures the selected endpoint size +#define udd_configure_endpoint_size(ep, size) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk, udd_format_endpoint_size(size))) + //! Gets the configured selected endpoint size +#define udd_get_endpoint_size(ep) (8 << Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk)) + //! Configures the selected endpoint number of banks +#define udd_configure_endpoint_bank(ep, bank) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPBK_Msk, bank)) + //! Gets the configured selected endpoint number of banks +#define udd_get_endpoint_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPBK_Msk)+1) + //! Allocates the configuration selected endpoint in DPRAM memory +#define udd_allocate_memory(ep) (Set_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) + //! un-allocates the configuration selected endpoint in DPRAM memory +#define udd_unallocate_memory(ep) (Clr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) +#define Is_udd_memory_allocated(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) + + //! Configures selected endpoint in one step +#define udd_configure_endpoint(ep, type, dir, size, bank) (\ + Wr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk |\ + UOTGHS_DEVEPTCFG_EPDIR |\ + UOTGHS_DEVEPTCFG_EPSIZE_Msk |\ + UOTGHS_DEVEPTCFG_EPBK_Msk , \ + (((uint32_t)(type) << UOTGHS_DEVEPTCFG_EPTYPE_Pos) & UOTGHS_DEVEPTCFG_EPTYPE_Msk) |\ + (((uint32_t)(dir ) << UOTGHS_DEVEPTCFG_EPDIR_Pos ) & UOTGHS_DEVEPTCFG_EPDIR) |\ + ( (uint32_t)udd_format_endpoint_size(size) << UOTGHS_DEVEPTCFG_EPSIZE_Pos) |\ + (((uint32_t)(bank) << UOTGHS_DEVEPTCFG_EPBK_Pos) & UOTGHS_DEVEPTCFG_EPBK_Msk))\ +) + //! Tests if current endpoint is configured +#define Is_udd_endpoint_configured(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CFGOK)) + //! Returns the control direction +#define udd_control_direction() (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], EP_CONTROL), UOTGHS_DEVEPTISR_CTRLDIR)) + + //! Resets the data toggle sequence +#define udd_reset_data_toggle(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RSTDTS) + //! Tests if the data toggle sequence is being reset +#define Is_udd_data_toggle_reset(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RSTDT)) + //! Returns data toggle +#define udd_data_toggle(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_DTSEQ_Msk)) +//! @} + + +//! @name UOTGHS Device control endpoint +//! These macros control the endpoints. +//! @{ + +//! @name UOTGHS Device control endpoint interrupts +//! These macros control the endpoints interrupts. +//! @{ + //! Enables the selected endpoint interrupt +#define udd_enable_endpoint_interrupt(ep) (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_PEP_0 << (ep)) + //! Disables the selected endpoint interrupt +#define udd_disable_endpoint_interrupt(ep) (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_PEP_0 << (ep)) + //! Tests if the selected endpoint interrupt is enabled +#define Is_udd_endpoint_interrupt_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_PEP_0 << (ep))) + //! Tests if an interrupt is triggered by the selected endpoint +#define Is_udd_endpoint_interrupt(ep) (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_PEP_0 << (ep))) + //! Returns the lowest endpoint number generating an endpoint interrupt or MAX_PEP_NB if none +#define udd_get_interrupt_endpoint_number() (ctz(((UOTGHS->UOTGHS_DEVISR >> UOTGHS_DEVISR_PEP_Pos) & \ + (UOTGHS->UOTGHS_DEVIMR >> UOTGHS_DEVIMR_PEP_Pos)) | \ + (1 << MAX_PEP_NB))) +#define UOTGHS_DEVISR_PEP_Pos 12 +#define UOTGHS_DEVIMR_PEP_Pos 12 +//! @} + +//! @name UOTGHS Device control endpoint errors +//! These macros control the endpoint errors. +//! @{ + //! Enables the STALL handshake +#define udd_enable_stall_handshake(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_STALLRQS) + //! Disables the STALL handshake +#define udd_disable_stall_handshake(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_STALLRQC) + //! Tests if STALL handshake request is running +#define Is_udd_endpoint_stall_requested(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_STALLRQ)) + //! Tests if STALL sent +#define Is_udd_stall(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_STALLEDI)) + //! ACKs STALL sent +#define udd_ack_stall(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_STALLEDIC) + //! Raises STALL sent +#define udd_raise_stall(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_STALLEDIS) + //! Enables STALL sent interrupt +#define udd_enable_stall_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_STALLEDES) + //! Disables STALL sent interrupt +#define udd_disable_stall_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_STALLEDEC) + //! Tests if STALL sent interrupt is enabled +#define Is_udd_stall_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_STALLEDE)) + + //! Tests if NAK OUT received +#define Is_udd_nak_out(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NAKOUTI)) + //! ACKs NAK OUT received +#define udd_ack_nak_out(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_NAKOUTIC) + //! Raises NAK OUT received +#define udd_raise_nak_out(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NAKOUTIS) + //! Enables NAK OUT interrupt +#define udd_enable_nak_out_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NAKOUTES) + //! Disables NAK OUT interrupt +#define udd_disable_nak_out_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NAKOUTEC) + //! Tests if NAK OUT interrupt is enabled +#define Is_udd_nak_out_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NAKOUTE)) + + //! Tests if NAK IN received +#define Is_udd_nak_in(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NAKINI)) + //! ACKs NAK IN received +#define udd_ack_nak_in(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_NAKINIC) + //! Raises NAK IN received +#define udd_raise_nak_in(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NAKINIS) + //! Enables NAK IN interrupt +#define udd_enable_nak_in_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NAKINES) + //! Disables NAK IN interrupt +#define udd_disable_nak_in_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NAKINEC) + //! Tests if NAK IN interrupt is enabled +#define Is_udd_nak_in_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NAKINE)) + + //! ACKs endpoint isochronous overflow interrupt +#define udd_ack_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_OVERFIC) + //! Raises endpoint isochronous overflow interrupt +#define udd_raise_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_OVERFIS) + //! Tests if an overflow occurs +#define Is_udd_overflow(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_OVERFI)) + //! Enables overflow interrupt +#define udd_enable_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_OVERFES) + //! Disables overflow interrupt +#define udd_disable_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_OVERFEC) + //! Tests if overflow interrupt is enabled +#define Is_udd_overflow_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_OVERFE)) + + //! ACKs endpoint isochronous underflow interrupt +#define udd_ack_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_UNDERFIC) + //! Raises endpoint isochronous underflow interrupt +#define udd_raise_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_UNDERFIS) + //! Tests if an underflow occurs +#define Is_udd_underflow(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_UNDERFI)) + //! Enables underflow interrupt +#define udd_enable_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_UNDERFES) + //! Disables underflow interrupt +#define udd_disable_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_UNDERFEC) + //! Tests if underflow interrupt is enabled +#define Is_udd_underflow_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_UNDERFE)) + + //! Tests if CRC ERROR ISO OUT detected +#define Is_udd_crc_error(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CRCERRI)) + //! ACKs CRC ERROR ISO OUT detected +#define udd_ack_crc_error(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_CRCERRIC) + //! Raises CRC ERROR ISO OUT detected +#define udd_raise_crc_error(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_CRCERRIS) + //! Enables CRC ERROR ISO OUT detected interrupt +#define udd_enable_crc_error_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_CRCERRES) + //! Disables CRC ERROR ISO OUT detected interrupt +#define udd_disable_crc_error_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_CRCERREC) + //! Tests if CRC ERROR ISO OUT detected interrupt is enabled +#define Is_udd_crc_error_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_CRCERRE)) +//! @} + +//! @name UOTGHS Device control endpoint transfer +//! These macros control the endpoint transfer. +//! @{ + + //! Tests if endpoint read allowed +#define Is_udd_read_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RWALL)) + //! Tests if endpoint write allowed +#define Is_udd_write_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RWALL)) + + //! Returns the byte count +#define udd_byte_count(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_BYCT_Msk)) + //! Clears FIFOCON bit +#define udd_ack_fifocon(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_FIFOCONC) + //! Tests if FIFOCON bit set +#define Is_udd_fifocon(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_FIFOCON)) + + //! Returns the number of busy banks +#define udd_nb_busy_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NBUSYBK_Msk)) + //! Returns the number of the current bank +#define udd_current_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CURRBK_Msk)) + //! Kills last bank +#define udd_kill_last_in_bank(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_KILLBKS) +#define Is_udd_kill_last(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_KILLBK)) + //! Tests if last bank killed +#define Is_udd_last_in_bank_killed(ep) (!Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_KILLBK)) + //! Forces all banks full (OUT) or free (IN) interrupt +#define udd_force_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NBUSYBKS) + //! Unforces all banks full (OUT) or free (IN) interrupt +#define udd_unforce_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NBUSYBKS) + //! Enables all banks full (OUT) or free (IN) interrupt +#define udd_enable_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NBUSYBKES) + //! Disables all banks full (OUT) or free (IN) interrupt +#define udd_disable_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NBUSYBKEC) + //! Tests if all banks full (OUT) or free (IN) interrupt enabled +#define Is_udd_bank_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NBUSYBKE)) + + //! Tests if SHORT PACKET received +#define Is_udd_short_packet(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_SHORTPACKET)) + //! ACKs SHORT PACKET received +#define udd_ack_short_packet(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_SHORTPACKETC) + //! Raises SHORT PACKET received +#define udd_raise_short_packet(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_SHORTPACKETS) + //! Enables SHORT PACKET received interrupt +#define udd_enable_short_packet_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_SHORTPACKETES) + //! Disables SHORT PACKET received interrupt +#define udd_disable_short_packet_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_SHORTPACKETEC) + //! Tests if SHORT PACKET received interrupt is enabled +#define Is_udd_short_packet_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_SHORTPACKETE)) + + //! Tests if SETUP received +#define Is_udd_setup_received(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RXSTPI)) + //! ACKs SETUP received +#define udd_ack_setup_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_RXSTPIC) + //! Raises SETUP received +#define udd_raise_setup_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_RXSTPIS) + //! Enables SETUP received interrupt +#define udd_enable_setup_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RXSTPES) + //! Disables SETUP received interrupt +#define udd_disable_setup_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_RXSTPEC) + //! Tests if SETUP received interrupt is enabled +#define Is_udd_setup_received_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RXSTPE)) + + //! Tests if OUT received +#define Is_udd_out_received(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RXOUTI)) + //! ACKs OUT received +#define udd_ack_out_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_RXOUTIC) + //! Raises OUT received +#define udd_raise_out_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_RXOUTIS) + //! Enables OUT received interrupt +#define udd_enable_out_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RXOUTES) + //! Disables OUT received interrupt +#define udd_disable_out_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_RXOUTEC) + //! Tests if OUT received interrupt is enabled +#define Is_udd_out_received_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RXOUTE)) + + //! Tests if IN sending +#define Is_udd_in_send(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_TXINI)) + //! ACKs IN sending +#define udd_ack_in_send(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_TXINIC) + //! Raises IN sending +#define udd_raise_in_send(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_TXINIS) + //! Enables IN sending interrupt +#define udd_enable_in_send_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_TXINES) + //! Disables IN sending interrupt +#define udd_disable_in_send_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_TXINEC) + //! Tests if IN sending interrupt is enabled +#define Is_udd_in_send_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_TXINE)) + + + //! Get 64-, 32-, 16- or 8-bit access to FIFO data register of selected endpoint. + //! @param ep Endpoint of which to access FIFO data register + //! @param scale Data scale in bits: 64, 32, 16 or 8 + //! @return Volatile 64-, 32-, 16- or 8-bit data pointer to FIFO data register + //! @warning It is up to the user of this macro to make sure that all accesses + //! are aligned with their natural boundaries except 64-bit accesses which + //! require only 32-bit alignment. + //! @warning It is up to the user of this macro to make sure that used HSB + //! addresses are identical to the DPRAM internal pointer modulo 32 bits. +#define udd_get_endpoint_fifo_access(ep, scale) \ + (((volatile TPASTE2(U, scale) (*)[0x8000 / ((scale) / 8)])UOTGHS_RAM_ADDR)[(ep)]) + +//! @name UOTGHS endpoint DMA drivers +//! These macros manage the common features of the endpoint DMA channels. +//! @{ + + //! Maximum transfer size on USB DMA +#define UDD_ENDPOINT_MAX_TRANS 0x10000 + //! Enables the disabling of HDMA requests by endpoint interrupts +#define udd_enable_endpoint_int_dis_hdma_req(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0](ep) = UOTGHS_DEVEPTIER_EPDISHDMAS) + //! Disables the disabling of HDMA requests by endpoint interrupts +#define udd_disable_endpoint_int_dis_hdma_req(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0](ep) = UOTGHS_DEVEPTIDR_EPDISHDMAC) + //! Tests if the disabling of HDMA requests by endpoint interrupts is enabled +#define Is_udd_endpoint_int_dis_hdma_req_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0](ep), UOTGHS_DEVEPTIMR_EPDISHDMA)) + + //! Raises the selected endpoint DMA channel interrupt +#define udd_raise_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_DMA_1 << ((ep) - 1)) + //! Raises the selected endpoint DMA channel interrupt +#define udd_clear_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVISR_DMA_1 << ((ep) - 1)) + //! Tests if an interrupt is triggered by the selected endpoint DMA channel +#define Is_udd_endpoint_dma_interrupt(ep) (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_DMA_1 << ((ep) - 1))) + //! Enables the selected endpoint DMA channel interrupt +#define udd_enable_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_DMA_1 << ((ep) - 1)) + //! Disables the selected endpoint DMA channel interrupt +#define udd_disable_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_DMA_1 << ((ep) - 1)) + //! Tests if the selected endpoint DMA channel interrupt is enabled +#define Is_udd_endpoint_dma_interrupt_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_DMA_1 << ((ep) - 1))) + + //! Access points to the UOTGHS device DMA memory map with arrayed registers + //! @{ + //! Structure for DMA next descriptor register +typedef struct { + uint32_t *NXT_DSC_ADD; +} uotghs_dma_nextdesc_t; + //! Structure for DMA control register +typedef struct { + uint32_t CHANN_ENB:1, + LDNXT_DSC:1, + END_TR_EN:1, + END_B_EN:1, + END_TR_IT:1, + END_BUFFIT:1, + DESC_LD_IT:1, + BUST_LCK:1, + reserved:8, + BUFF_LENGTH:16; +} uotghs_dma_control_t; + //! Structure for DMA status register +typedef struct { + uint32_t CHANN_ENB:1, + CHANN_ACT:1, + reserved0:2, + END_TR_ST:1, + END_BF_ST:1, + DESC_LDST:1, + reserved1:9, + BUFF_COUNT:16; +} uotghs_dma_status_t; + //! Structure for DMA descriptor +typedef struct { + union { + uint32_t nextdesc; + uotghs_dma_nextdesc_t NEXTDESC; + }; + uint32_t addr; + union { + uint32_t control; + uotghs_dma_control_t CONTROL; + }; + uint32_t reserved; +} sam_uotghs_dmadesc_t, uotghs_dmadesc_t; + //! Structure for DMA registers in a channel +typedef struct { + union { + uint32_t nextdesc; + uotghs_dma_nextdesc_t NEXTDESC; + }; + uint32_t addr; + union { + uint32_t control; + uotghs_dma_control_t CONTROL; + }; + union { + unsigned long status; + uotghs_dma_status_t STATUS; + }; +} sam_uotghs_dmach_t, uotghs_dmach_t; + //! DMA channel control command +#define UDD_ENDPOINT_DMA_STOP_NOW (0) +#define UDD_ENDPOINT_DMA_RUN_AND_STOP (UOTGHS_DEVDMACONTROL_CHANN_ENB) +#define UDD_ENDPOINT_DMA_LOAD_NEXT_DESC (UOTGHS_DEVDMACONTROL_LDNXT_DSC) +#define UDD_ENDPOINT_DMA_RUN_AND_LINK (UOTGHS_DEVDMACONTROL_CHANN_ENB|UOTGHS_DEVDMACONTROL_LDNXT_DSC) + //! Structure for DMA registers +#define UOTGHS_UDDMA_ARRAY(ep) (((volatile uotghs_dmach_t *)UOTGHS->UOTGHS_DEVDMA)[(ep) - 1]) + + //! Set control desc to selected endpoint DMA channel +#define udd_endpoint_dma_set_control(ep,desc) (UOTGHS_UDDMA_ARRAY(ep).control = desc) + //! Get control desc to selected endpoint DMA channel +#define udd_endpoint_dma_get_control(ep) (UOTGHS_UDDMA_ARRAY(ep).control) + //! Set RAM address to selected endpoint DMA channel +#define udd_endpoint_dma_set_addr(ep,add) (UOTGHS_UDDMA_ARRAY(ep).addr = add) + //! Get status to selected endpoint DMA channel +#define udd_endpoint_dma_get_status(ep) (UOTGHS_UDDMA_ARRAY(ep).status) + //! @} +//! @} + +//! @} +//! @} +//! @} +//! @} + + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* UOTGHS_DEVICE_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h new file mode 100644 index 0000000000..86c903b2c1 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h @@ -0,0 +1,241 @@ +/** + * \file + * + * \brief USB OTG Driver for UOTGHS. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UOTGHS_OTG_H_INCLUDED +#define UOTGHS_OTG_H_INCLUDED + +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +//! \ingroup usb_group +//! \defgroup otg_group UOTGHS OTG Driver +//! UOTGHS low-level driver for OTG features +//! +//! @{ + +/** + * \brief Initialize the dual role + * This function is implemented in uotghs_host.c file. + * + * \return \c true if the ID pin management has been started, otherwise \c false. + */ +bool otg_dual_enable(void); + +/** + * \brief Uninitialize the dual role + * This function is implemented in uotghs_host.c file. + */ +void otg_dual_disable(void); + + +//! @name UOTGHS OTG ID pin management +//! The ID pin come from the USB OTG connector (A and B receptable) and +//! allows to select the USB mode host or device. +//! The UOTGHS hardware can manage it automatically. This feature is optional. +//! When USB_ID_GPIO is defined (in board.h), this feature is enabled. +//! +//! @{ + //! Enable external OTG_ID pin (listened to by USB) +#define otg_enable_id_pin() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Disable external OTG_ID pin (ignored by USB) +#define otg_disable_id_pin() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Test if external OTG_ID pin enabled (listened to by USB) +#define Is_otg_id_pin_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Disable external OTG_ID pin and force device mode +#define otg_force_device_mode() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD), otg_disable_id_pin()) + //! Test if device mode is forced +#define Is_otg_device_mode_forced() (!Is_otg_id_pin_enabled() && Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD)) + //! Disable external OTG_ID pin and force host mode +#define otg_force_host_mode() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD), otg_disable_id_pin()) + //! Test if host mode is forced +#define Is_otg_host_mode_forced() (!Is_otg_id_pin_enabled() && !Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD)) + +//! @name UOTGHS OTG ID pin interrupt management +//! These macros manage the ID pin interrupt +//! @{ +#define otg_enable_id_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define otg_disable_id_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define Is_otg_id_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define Is_otg_id_device() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_ID)) +#define Is_otg_id_host() (!Is_otg_id_device()) +#define otg_ack_id_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_IDTIC) +#define otg_raise_id_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_IDTIS) +#define Is_otg_id_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_IDTI)) +//! @} +//! @} + +//! @name OTG Vbus management +//! @{ +#define otg_enable_vbus_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define otg_disable_vbus_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_otg_vbus_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_otg_vbus_high() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUS)) +#define Is_otg_vbus_low() (!Is_otg_vbus_high()) +#define otg_ack_vbus_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_VBUSTIC) +#define otg_raise_vbus_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_VBUSTIS) +#define Is_otg_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI)) +//! @} + +//! @name UOTGHS OTG main management +//! These macros allows to enable/disable pad and UOTGHS hardware +//! @{ + //! Reset USB macro +#define otg_reset() \ + do { \ + UOTGHS->UOTGHS_CTRL = 0; \ + while( UOTGHS->UOTGHS_SR & 0x3FFF) {\ + UOTGHS->UOTGHS_SCR = 0xFFFFFFFF;\ + } \ + } while (0) + //! Enable USB macro +#define otg_enable() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) + //! Disable USB macro +#define otg_disable() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) +#define Is_otg_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) + + //! Enable OTG pad +#define otg_enable_pad() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) + //! Disable OTG pad +#define otg_disable_pad() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) +#define Is_otg_pad_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) + + //! Check Clock Usable + //! For parts with HS feature, this one corresponding at UTMI clock +#define Is_otg_clock_usable() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_CLKUSABLE)) + + //! Stop (freeze) internal USB clock +#define otg_freeze_clock() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) +#define otg_unfreeze_clock() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) +#define Is_otg_clock_frozen() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) + + //! Configure time-out of specified OTG timer +#define otg_configure_timeout(timer, timeout) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk, timeout),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK)) + //! Get configured time-out of specified OTG timer +#define otg_get_timeout(timer) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk)) + + + //! Get the dual-role device state of the internal USB finite state machine of the UOTGHS controller +#define otg_get_fsm_drd_state() (Rd_bitfield(UOTGHS->UOTGHS_FSM, UOTGHS_FSM_DRDSTATE_Msk)) +#define Is_otg_a_suspend() (4==otg_get_fsm_drd_state()) +#define Is_otg_a_wait_vrise() (1==otg_get_fsm_drd_state()) +//! @} + +//! @name UOTGHS OTG hardware protocol +//! These macros manages the hardware OTG protocol +//! @{ + //! Initiates a Host negotiation Protocol +#define otg_device_initiate_hnp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Accepts a Host negotiation Protocol +#define otg_host_accept_hnp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Rejects a Host negotiation Protocol +#define otg_host_reject_hnp() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! initiates a Session Request Protocol +#define otg_device_initiate_srp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPREQ)) + //! Selects VBus as SRP method +#define otg_select_vbus_srp_method() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) +#define Is_otg_vbus_srp_method_selected() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) + //! Selects data line as SRP method +#define otg_select_data_srp_method() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) +#define Is_otg_data_srp_method_selected() (!Is_otg_vbus_srp_method_selected()) + //! Tests if a HNP occurs +#define Is_otg_hnp() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Tests if a SRP from device occurs +#define Is_otg_device_srp() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPREQ)) + + //! Enables HNP error interrupt +#define otg_enable_hnp_error_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) + //! Disables HNP error interrupt +#define otg_disable_hnp_error_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) +#define Is_otg_hnp_error_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) + //! ACKs HNP error interrupt +#define otg_ack_hnp_error_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_HNPERRIC) + //! Raises HNP error interrupt +#define otg_raise_hnp_error_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_HNPERRIS) + //! Tests if a HNP error occurs +#define Is_otg_hnp_error_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_HNPERRI)) + + //! Enables role exchange interrupt +#define otg_enable_role_exchange_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) + //! Disables role exchange interrupt +#define otg_disable_role_exchange_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) +#define Is_otg_role_exchange_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) + //! ACKs role exchange interrupt +#define otg_ack_role_exchange_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_ROLEEXIC) + //! Raises role exchange interrupt +#define otg_raise_role_exchange_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_ROLEEXIS) + //! Tests if a role exchange occurs +#define Is_otg_role_exchange_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_ROLEEXI)) + + //! Enables SRP interrupt +#define otg_enable_srp_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) + //! Disables SRP interrupt +#define otg_disable_srp_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) +#define Is_otg_srp_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) + //! ACKs SRP interrupt +#define otg_ack_srp_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_SRPIC) + //! Raises SRP interrupt +#define otg_raise_srp_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_SRPIS) + //! Tests if a SRP occurs +#define Is_otg_srp_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_SRPI)) +//! @} + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif /* UOTGHS_OTG_H_INCLUDED */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h new file mode 100644 index 0000000000..31c783f974 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h @@ -0,0 +1,496 @@ +/** + * \file + * + * \brief USB protocol definitions. + * + * This file contains the USB definitions and data structures provided by the + * USB 2.0 specification. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_H_ +#define _USB_PROTOCOL_H_ + +/** + * \ingroup usb_group + * \defgroup usb_protocol_group USB Protocol Definitions + * + * This module defines constants and data structures provided by the USB + * 2.0 specification. + * + * @{ + */ + +//! Value for field bcdUSB +#define USB_V2_0 0x0200 //!< USB Specification version 2.00 +#define USB_V2_1 0x0201 //!< USB Specification version 2.01 + +/*! \name Generic definitions (Class, subclass and protocol) + */ +//! @{ +#define NO_CLASS 0x00 +#define CLASS_VENDOR_SPECIFIC 0xFF +#define NO_SUBCLASS 0x00 +#define NO_PROTOCOL 0x00 +//! @} + +//! \name IAD (Interface Association Descriptor) constants +//! @{ +#define CLASS_IAD 0xEF +#define SUB_CLASS_IAD 0x02 +#define PROTOCOL_IAD 0x01 +//! @} + +/** + * \brief USB request data transfer direction (bmRequestType) + */ +#define USB_REQ_DIR_OUT (0<<7) //!< Host to device +#define USB_REQ_DIR_IN (1<<7) //!< Device to host +#define USB_REQ_DIR_MASK (1<<7) //!< Mask + +/** + * \brief USB request types (bmRequestType) + */ +#define USB_REQ_TYPE_STANDARD (0<<5) //!< Standard request +#define USB_REQ_TYPE_CLASS (1<<5) //!< Class-specific request +#define USB_REQ_TYPE_VENDOR (2<<5) //!< Vendor-specific request +#define USB_REQ_TYPE_MASK (3<<5) //!< Mask + +/** + * \brief USB recipient codes (bmRequestType) + */ +#define USB_REQ_RECIP_DEVICE (0<<0) //!< Recipient device +#define USB_REQ_RECIP_INTERFACE (1<<0) //!< Recipient interface +#define USB_REQ_RECIP_ENDPOINT (2<<0) //!< Recipient endpoint +#define USB_REQ_RECIP_OTHER (3<<0) //!< Recipient other +#define USB_REQ_RECIP_MASK (0x1F) //!< Mask + +/** + * \brief Standard USB requests (bRequest) + */ +enum usb_reqid { + USB_REQ_GET_STATUS = 0, + USB_REQ_CLEAR_FEATURE = 1, + USB_REQ_SET_FEATURE = 3, + USB_REQ_SET_ADDRESS = 5, + USB_REQ_GET_DESCRIPTOR = 6, + USB_REQ_SET_DESCRIPTOR = 7, + USB_REQ_GET_CONFIGURATION = 8, + USB_REQ_SET_CONFIGURATION = 9, + USB_REQ_GET_INTERFACE = 10, + USB_REQ_SET_INTERFACE = 11, + USB_REQ_SYNCH_FRAME = 12, +}; + +/** + * \brief Standard USB device status flags + * + */ +enum usb_device_status { + USB_DEV_STATUS_BUS_POWERED = 0, + USB_DEV_STATUS_SELF_POWERED = 1, + USB_DEV_STATUS_REMOTEWAKEUP = 2 +}; + +/** + * \brief Standard USB Interface status flags + * + */ +enum usb_interface_status { + USB_IFACE_STATUS_RESERVED = 0 +}; + +/** + * \brief Standard USB endpoint status flags + * + */ +enum usb_endpoint_status { + USB_EP_STATUS_HALTED = 1, +}; + +/** + * \brief Standard USB device feature flags + * + * \note valid for SetFeature request. + */ +enum usb_device_feature { + USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled + USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode + USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, + USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, + USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 +}; + +/** + * \brief Test Mode possible on HS USB device + * + * \note valid for USB_DEV_FEATURE_TEST_MODE request. + */ +enum usb_device_hs_test_mode { + USB_DEV_TEST_MODE_J = 1, + USB_DEV_TEST_MODE_K = 2, + USB_DEV_TEST_MODE_SE0_NAK = 3, + USB_DEV_TEST_MODE_PACKET = 4, + USB_DEV_TEST_MODE_FORCE_ENABLE = 5, +}; + +/** + * \brief Standard USB endpoint feature/status flags + */ +enum usb_endpoint_feature { + USB_EP_FEATURE_HALT = 0, +}; + +/** + * \brief Standard USB Test Mode Selectors + */ +enum usb_test_mode_selector { + USB_TEST_J = 0x01, + USB_TEST_K = 0x02, + USB_TEST_SE0_NAK = 0x03, + USB_TEST_PACKET = 0x04, + USB_TEST_FORCE_ENABLE = 0x05, +}; + +/** + * \brief Standard USB descriptor types + */ +enum usb_descriptor_type { + USB_DT_DEVICE = 1, + USB_DT_CONFIGURATION = 2, + USB_DT_STRING = 3, + USB_DT_INTERFACE = 4, + USB_DT_ENDPOINT = 5, + USB_DT_DEVICE_QUALIFIER = 6, + USB_DT_OTHER_SPEED_CONFIGURATION = 7, + USB_DT_INTERFACE_POWER = 8, + USB_DT_OTG = 9, + USB_DT_IAD = 0x0B, + USB_DT_BOS = 0x0F, + USB_DT_DEVICE_CAPABILITY = 0x10, +}; + +/** + * \brief USB Device Capability types + */ +enum usb_capability_type { + USB_DC_USB20_EXTENSION = 0x02, +}; + +/** + * \brief USB Device Capability - USB 2.0 Extension + * To fill bmAttributes field of usb_capa_ext_desc_t structure. + */ +enum usb_capability_extension_attr { + USB_DC_EXT_LPM = 0x00000002, +}; + +#define HIRD_50_US 0 +#define HIRD_125_US 1 +#define HIRD_200_US 2 +#define HIRD_275_US 3 +#define HIRD_350_US 4 +#define HIRD_425_US 5 +#define HIRD_500_US 6 +#define HIRD_575_US 7 +#define HIRD_650_US 8 +#define HIRD_725_US 9 +#define HIRD_800_US 10 +#define HIRD_875_US 11 +#define HIRD_950_US 12 +#define HIRD_1025_US 13 +#define HIRD_1100_US 14 +#define HIRD_1175_US 15 + +/** Fields definition from a LPM TOKEN */ +#define USB_LPM_ATTRIBUT_BLINKSTATE_MASK (0xF << 0) +#define USB_LPM_ATTRIBUT_FIRD_MASK (0xF << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE_MASK (1 << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE(value) ((value & 0xF) << 0) +#define USB_LPM_ATTRIBUT_FIRD(value) ((value & 0xF) << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE(value) ((value & 1) << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE_L1 USB_LPM_ATTRIBUT_BLINKSTATE(1) + +/** + * \brief Standard USB endpoint transfer types + */ +enum usb_ep_type { + USB_EP_TYPE_CONTROL = 0x00, + USB_EP_TYPE_ISOCHRONOUS = 0x01, + USB_EP_TYPE_BULK = 0x02, + USB_EP_TYPE_INTERRUPT = 0x03, + USB_EP_TYPE_MASK = 0x03, +}; + +/** + * \brief Standard USB language IDs for string descriptors + */ +enum usb_langid { + USB_LANGID_EN_US = 0x0409, //!< English (United States) +}; + +/** + * \brief Mask selecting the index part of an endpoint address + */ +#define USB_EP_ADDR_MASK 0x0F + +//! \brief USB address identifier +typedef uint8_t usb_add_t; + +/** + * \brief Endpoint transfer direction is IN + */ +#define USB_EP_DIR_IN 0x80 + +/** + * \brief Endpoint transfer direction is OUT + */ +#define USB_EP_DIR_OUT 0x00 + +//! \brief Endpoint identifier +typedef uint8_t usb_ep_t; + +/** + * \brief Maximum length in bytes of a USB descriptor + * + * The maximum length of a USB descriptor is limited by the 8-bit + * bLength field. + */ +#define USB_MAX_DESC_LEN 255 + +/* + * 2-byte alignment requested for all USB structures. + */ +COMPILER_PACK_SET(1) + +/** + * \brief A USB Device SETUP request + * + * The data payload of SETUP packets always follows this structure. + */ +typedef struct { + uint8_t bmRequestType; + uint8_t bRequest; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_setup_req_t; + +/** + * \brief Standard USB device descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + le16_t idVendor; + le16_t idProduct; + le16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} usb_dev_desc_t; + +/** + * \brief Standard USB device qualifier descriptor structure + * + * This descriptor contains information about the device when running at + * the "other" speed (i.e. if the device is currently operating at high + * speed, this descriptor can be used to determine what would change if + * the device was operating at full speed.) + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} usb_dev_qual_desc_t; + +/** + * \brief USB Device BOS descriptor structure + * + * The BOS descriptor (Binary device Object Store) defines a root + * descriptor that is similar to the configuration descriptor, and is + * the base descriptor for accessing a family of related descriptors. + * A host can read a BOS descriptor and learn from the wTotalLength field + * the entire size of the device-level descriptor set, or it can read in + * the entire BOS descriptor set of device capabilities. + * The host accesses this descriptor using the GetDescriptor() request. + * The descriptor type in the GetDescriptor() request is set to BOS. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumDeviceCaps; +} usb_dev_bos_desc_t; + + +/** + * \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure + * + * Defines the set of USB 1.1-specific device level capabilities. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + le32_t bmAttributes; +} usb_dev_capa_ext_desc_t; + +/** + * \brief USB Device LPM Descriptor structure + * + * The BOS descriptor and capabilities descriptors for LPM. + */ +typedef struct { + usb_dev_bos_desc_t bos; + usb_dev_capa_ext_desc_t capa_ext; +} usb_dev_lpm_desc_t; + +/** + * \brief Standard USB Interface Association Descriptor structure + */ +typedef struct { + uint8_t bLength; //!< size of this descriptor in bytes + uint8_t bDescriptorType; //!< INTERFACE descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_association_desc_t; + + +/** + * \brief Standard USB configuration descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} usb_conf_desc_t; + + +#define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set +#define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered +#define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered +#define USB_CONFIG_ATTR_REMOTE_WAKEUP (1 << 5) //!< remote wakeup supported + +#define USB_CONFIG_MAX_POWER(ma) (((ma) + 1) / 2) //!< Max power in mA + +/** + * \brief Standard USB association descriptor structure + */ +typedef struct { + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< Interface descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_iad_desc_t; + +/** + * \brief Standard USB interface descriptor structure + */ +typedef struct { + 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; +} usb_iface_desc_t; + +/** + * \brief Standard USB endpoint descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + le16_t wMaxPacketSize; + uint8_t bInterval; +} usb_ep_desc_t; + + +/** + * \brief A standard USB string descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; +} usb_str_desc_t; + +typedef struct { + usb_str_desc_t desc; + le16_t string[1]; +} usb_str_lgid_desc_t; + +COMPILER_PACK_RESET() + +//! @} + +#endif /* _USB_PROTOCOL_H_ */ diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h new file mode 100644 index 0000000000..875e7e4dda --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h @@ -0,0 +1,318 @@ +/** + * \file + * + * \brief USB Communication Device Class (CDC) protocol definitions + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _USB_PROTOCOL_CDC_H_ +#define _USB_PROTOCOL_CDC_H_ + +#include "compiler.h" + +/** + * \ingroup usb_protocol_group + * \defgroup cdc_protocol_group Communication Device Class Definitions + * @{ + */ + +/** + * \name Possible values of class + */ +//@{ +#define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class +#define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface +#define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface +//@} + +//! \name USB CDC Subclass IDs +//@{ +#define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model +#define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model +#define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model +#define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model +#define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model +#define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model +#define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model +//@} + +//! \name USB CDC Communication Interface Protocol IDs +//@{ +#define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands +//@} + +//! \name USB CDC Data Interface Protocol IDs +//@{ +#define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI +#define CDC_PROTOCOL_HDLC 0x31 //!< HDLC +#define CDC_PROTOCOL_TRANS 0x32 //!< Transparent +#define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol +#define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol +#define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor +#define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures +#define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control +#define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN +#define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands +#define CDC_PROTOCOL_HOST 0xFD //!< Host based driver +/** + * \brief Describes the Protocol Unit Functional Descriptors [sic] + * on Communication Class Interface + */ +#define CDC_PROTOCOL_PUFD 0xFE +//@} + +//! \name USB CDC Functional Descriptor Types +//@{ +#define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor +#define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor +//@} + +//! \name USB CDC Functional Descriptor Subtypes +//@{ +#define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor +#define CDC_SCS_CALL_MGMT 0x01 //!< Call Management +#define CDC_SCS_ACM 0x02 //!< Abstract Control Management +#define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor +//@} + +//! \name USB CDC Request IDs +//@{ +#define USB_REQ_CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define USB_REQ_CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define USB_REQ_CDC_SET_COMM_FEATURE 0x02 +#define USB_REQ_CDC_GET_COMM_FEATURE 0x03 +#define USB_REQ_CDC_CLEAR_COMM_FEATURE 0x04 +#define USB_REQ_CDC_SET_AUX_LINE_STATE 0x10 +#define USB_REQ_CDC_SET_HOOK_STATE 0x11 +#define USB_REQ_CDC_PULSE_SETUP 0x12 +#define USB_REQ_CDC_SEND_PULSE 0x13 +#define USB_REQ_CDC_SET_PULSE_TIME 0x14 +#define USB_REQ_CDC_RING_AUX_JACK 0x15 +#define USB_REQ_CDC_SET_LINE_CODING 0x20 +#define USB_REQ_CDC_GET_LINE_CODING 0x21 +#define USB_REQ_CDC_SET_CONTROL_LINE_STATE 0x22 +#define USB_REQ_CDC_SEND_BREAK 0x23 +#define USB_REQ_CDC_SET_RINGER_PARMS 0x30 +#define USB_REQ_CDC_GET_RINGER_PARMS 0x31 +#define USB_REQ_CDC_SET_OPERATION_PARMS 0x32 +#define USB_REQ_CDC_GET_OPERATION_PARMS 0x33 +#define USB_REQ_CDC_SET_LINE_PARMS 0x34 +#define USB_REQ_CDC_GET_LINE_PARMS 0x35 +#define USB_REQ_CDC_DIAL_DIGITS 0x36 +#define USB_REQ_CDC_SET_UNIT_PARAMETER 0x37 +#define USB_REQ_CDC_GET_UNIT_PARAMETER 0x38 +#define USB_REQ_CDC_CLEAR_UNIT_PARAMETER 0x39 +#define USB_REQ_CDC_GET_PROFILE 0x3A +#define USB_REQ_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define USB_REQ_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x41 +#define USB_REQ_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x42 +#define USB_REQ_CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define USB_REQ_CDC_GET_ETHERNET_STATISTIC 0x44 +#define USB_REQ_CDC_SET_ATM_DATA_FORMAT 0x50 +#define USB_REQ_CDC_GET_ATM_DEVICE_STATISTICS 0x51 +#define USB_REQ_CDC_SET_ATM_DEFAULT_VC 0x52 +#define USB_REQ_CDC_GET_ATM_VC_STATISTICS 0x53 +// Added bNotification codes according cdc spec 1.1 chapter 6.3 +#define USB_REQ_CDC_NOTIFY_RING_DETECT 0x09 +#define USB_REQ_CDC_NOTIFY_SERIAL_STATE 0x20 +#define USB_REQ_CDC_NOTIFY_CALL_STATE_CHANGE 0x28 +#define USB_REQ_CDC_NOTIFY_LINE_STATE_CHANGE 0x29 +//@} + +/* + * Need to pack structures tightly, or the compiler might insert padding + * and violate the spec-mandated layout. + */ +COMPILER_PACK_SET(1) + +//! \name USB CDC Descriptors +//@{ + + +//! CDC Header Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + le16_t bcdCDC; +} usb_cdc_hdr_desc_t; + +//! CDC Call Management Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} usb_cdc_call_mgmt_desc_t; + +//! CDC ACM Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; +} usb_cdc_acm_desc_t; + +//! CDC Union Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; +} usb_cdc_union_desc_t; + + +//! \name USB CDC Call Management Capabilities +//@{ +//! Device handles call management itself +#define CDC_CALL_MGMT_SUPPORTED (1 << 0) +//! Device can send/receive call management info over a Data Class interface +#define CDC_CALL_MGMT_OVER_DCI (1 << 1) +//@} + +//! \name USB CDC ACM Capabilities +//@{ +//! Device supports the request combination of +//! Set_Comm_Feature, Clear_Comm_Feature, and Get_Comm_Feature. +#define CDC_ACM_SUPPORT_FEATURE_REQUESTS (1 << 0) +//! Device supports the request combination of +//! Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, +//! and the notification Serial_State. +#define CDC_ACM_SUPPORT_LINE_REQUESTS (1 << 1) +//! Device supports the request Send_Break +#define CDC_ACM_SUPPORT_SENDBREAK_REQUESTS (1 << 2) +//! Device supports the notification Network_Connection. +#define CDC_ACM_SUPPORT_NOTIFY_REQUESTS (1 << 3) +//@} +//@} + +//! \name USB CDC line control +//@{ + +//! \name USB CDC line coding +//@{ +//! Line Coding structure +typedef struct { + le32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; +} usb_cdc_line_coding_t; +//! Possible values of bCharFormat +enum cdc_char_format { + CDC_STOP_BITS_1 = 0, //!< 1 stop bit + CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits + CDC_STOP_BITS_2 = 2, //!< 2 stop bits +}; +//! Possible values of bParityType +enum cdc_parity { + CDC_PAR_NONE = 0, //!< No parity + CDC_PAR_ODD = 1, //!< Odd parity + CDC_PAR_EVEN = 2, //!< Even parity + CDC_PAR_MARK = 3, //!< Parity forced to 0 (space) + CDC_PAR_SPACE = 4, //!< Parity forced to 1 (mark) +}; +//@} + +//! \name USB CDC control signals +//! spec 1.1 chapter 6.2.14 +//@{ + +//! Control signal structure +typedef struct { + uint16_t value; +} usb_cdc_control_signal_t; + +//! \name Possible values in usb_cdc_control_signal_t +//@{ +//! Carrier control for half duplex modems. +//! This signal corresponds to V.24 signal 105 and RS-232 signal RTS. +//! The device ignores the value of this bit +//! when operating in full duplex mode. +#define CDC_CTRL_SIGNAL_ACTIVATE_CARRIER (1 << 1) +//! Indicates to DCE if DTE is present or not. +//! This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR. +#define CDC_CTRL_SIGNAL_DTE_PRESENT (1 << 0) +//@} +//@} + + +//! \name USB CDC notification message +//@{ + +typedef struct { + uint8_t bmRequestType; + uint8_t bNotification; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_cdc_notify_msg_t; + +//! \name USB CDC serial state +//@{* + +//! Hardware handshake support (cdc spec 1.1 chapter 6.3.5) +typedef struct { + usb_cdc_notify_msg_t header; + le16_t value; +} usb_cdc_notify_serial_state_t; + +//! \name Possible values in usb_cdc_notify_serial_state_t +//@{ +#define CDC_SERIAL_STATE_DCD CPU_TO_LE16((1<<0)) +#define CDC_SERIAL_STATE_DSR CPU_TO_LE16((1<<1)) +#define CDC_SERIAL_STATE_BREAK CPU_TO_LE16((1<<2)) +#define CDC_SERIAL_STATE_RING CPU_TO_LE16((1<<3)) +#define CDC_SERIAL_STATE_FRAMING CPU_TO_LE16((1<<4)) +#define CDC_SERIAL_STATE_PARITY CPU_TO_LE16((1<<5)) +#define CDC_SERIAL_STATE_OVERRUN CPU_TO_LE16((1<<6)) +//@} +//! @} + +//! @} + +COMPILER_PACK_RESET() + +//! @} + +#endif // _USB_PROTOCOL_CDC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h new file mode 100644 index 0000000000..db8f9cafd0 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h @@ -0,0 +1,147 @@ +/** + * \file + * + * \brief USB Mass Storage Class (MSC) protocol definitions. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_MSC_H_ +#define _USB_PROTOCOL_MSC_H_ + + +/** + * \ingroup usb_protocol_group + * \defgroup usb_msc_protocol USB Mass Storage Class (MSC) protocol definitions + * + * @{ + */ + +/** + * \name Possible Class value + */ +//@{ +#define MSC_CLASS 0x08 +//@} + +/** + * \name Possible SubClass value + * \note In practise, most devices should use + * #MSC_SUBCLASS_TRANSPARENT and specify the actual command set in + * the standard INQUIRY data block, even if the MSC spec indicates + * otherwise. In particular, RBC is not supported by certain major + * operating systems like Windows XP. + */ +//@{ +#define MSC_SUBCLASS_RBC 0x01 //!< Reduced Block Commands +#define MSC_SUBCLASS_ATAPI 0x02 //!< CD/DVD devices +#define MSC_SUBCLASS_QIC_157 0x03 //!< Tape devices +#define MSC_SUBCLASS_UFI 0x04 //!< Floppy disk drives +#define MSC_SUBCLASS_SFF_8070I 0x05 //!< Floppy disk drives +#define MSC_SUBCLASS_TRANSPARENT 0x06 //!< Determined by INQUIRY +//@} + +/** + * \name Possible protocol value + * \note Only the BULK protocol should be used in new designs. + */ +//@{ +#define MSC_PROTOCOL_CBI 0x00 //!< Command/Bulk/Interrupt +#define MSC_PROTOCOL_CBI_ALT 0x01 //!< W/o command completion +#define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only +//@} + + +/** + * \brief MSC USB requests (bRequest) + */ +enum usb_reqid_msc { + USB_REQ_MSC_BULK_RESET = 0xFF, //!< Mass Storage Reset + USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN +}; + + +COMPILER_PACK_SET(1) + +/** + * \name A Command Block Wrapper (CBW). + */ +//@{ +struct usb_msc_cbw { + le32_t dCBWSignature; //!< Must contain 'USBC' + le32_t dCBWTag; //!< Unique command ID + le32_t dCBWDataTransferLength; //!< Number of bytes to transfer + uint8_t bmCBWFlags; //!< Direction in bit 7 + uint8_t bCBWLUN; //!< Logical Unit Number + uint8_t bCBWCBLength; //!< Number of valid CDB bytes + uint8_t CDB[16]; //!< SCSI Command Descriptor Block +}; + +#define USB_CBW_SIGNATURE 0x55534243 //!< dCBWSignature value +#define USB_CBW_DIRECTION_IN (1<<7) //!< Data from device to host +#define USB_CBW_DIRECTION_OUT (0<<7) //!< Data from host to device +#define USB_CBW_LUN_MASK 0x0F //!< Valid bits in bCBWLUN +#define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength +//@} + + +/** + * \name A Command Status Wrapper (CSW). + */ +//@{ +struct usb_msc_csw { + le32_t dCSWSignature; //!< Must contain 'USBS' + le32_t dCSWTag; //!< Same as dCBWTag + le32_t dCSWDataResidue; //!< Number of bytes not transfered + uint8_t bCSWStatus; //!< Status code +}; + +#define USB_CSW_SIGNATURE 0x55534253 //!< dCSWSignature value +#define USB_CSW_STATUS_PASS 0x00 //!< Command Passed +#define USB_CSW_STATUS_FAIL 0x01 //!< Command Failed +#define USB_CSW_STATUS_PE 0x02 //!< Phase Error +//@} + +COMPILER_PACK_RESET() + +//@} + +#endif // _USB_PROTOCOL_MSC_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_task.c b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c new file mode 100644 index 0000000000..c9de09c113 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c @@ -0,0 +1,340 @@ +/** + * \file + * + * \brief Main functions for USB composite example + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +// Support and FAQ: visit Atmel Support + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "udc.h" +#include +#include + +#if ENABLED(SDSUPPORT) + static volatile bool main_b_msc_enable = false; +#endif +static volatile bool main_b_cdc_enable = false; +static volatile bool main_b_dtr_active = false; + +void usb_task_idle(void) { + #if ENABLED(SDSUPPORT) + // Attend SD card access from the USB MSD -- Prioritize access to improve speed + int delay = 2; + while (main_b_msc_enable && --delay > 0) { + if (udi_msc_process_trans()) delay = 10000; + + // Reset the watchdog, just to be sure + REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5); + } + #endif +} + +#if ENABLED(SDSUPPORT) + bool usb_task_msc_enable(void) { return ((main_b_msc_enable = true)); } + void usb_task_msc_disable(void) { main_b_msc_enable = false; } + bool usb_task_msc_isenabled(void) { return main_b_msc_enable; } +#endif + +bool usb_task_cdc_enable(const uint8_t port) { return ((main_b_cdc_enable = true)); } +void usb_task_cdc_disable(const uint8_t port) { main_b_cdc_enable = false; main_b_dtr_active = false; } +bool usb_task_cdc_isenabled(void) { return main_b_cdc_enable; } + +/*! \brief Called by CDC interface + * Callback running when CDC device have received data + */ +void usb_task_cdc_rx_notify(const uint8_t port) { } + +/*! \brief Configures communication line + * + * \param cfg line configuration + */ +static uint16_t dwDTERate = 0; +void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg) { + // Store last DTE rate + dwDTERate = cfg->dwDTERate; +} + + +void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable) { + + // Keep DTR status + main_b_dtr_active = b_enable; + + // Implement Arduino-Compatible kludge to enter programming mode from + // the native port: + // "Auto-reset into the bootloader is triggered when the port, already + // open at 1200 bps, is closed." + + if (1200 == dwDTERate) { + // We check DTR state to determine if host port is open (bit 0 of lineState). + if (!b_enable) { + + // Set RST pin to go low for 65535 clock cycles on reset + // This helps restarting when firmware flash ends + RSTC->RSTC_MR = 0xA5000F01; + + // Schedule delayed reset + initiateReset(250); + } + else + cancelReset(); + } +} + +bool usb_task_cdc_dtr_active(void) { return main_b_dtr_active; } + +/// Microsoft WCID descriptor +typedef struct USB_MicrosoftCompatibleDescriptor_Interface { + uint8_t bFirstInterfaceNumber; + uint8_t reserved1; + uint8_t compatibleID[8]; + uint8_t subCompatibleID[8]; + uint8_t reserved2[6]; +} __attribute__((packed)) USB_MicrosoftCompatibleDescriptor_Interface; + +typedef struct USB_MicrosoftCompatibleDescriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint8_t bCount; + uint8_t reserved[7]; + USB_MicrosoftCompatibleDescriptor_Interface interfaces[]; +} __attribute__((packed)) USB_MicrosoftCompatibleDescriptor; + +// 3D Printer compatible descriptor +static USB_MicrosoftCompatibleDescriptor microsoft_compatible_id_descriptor = { + .dwLength = sizeof(USB_MicrosoftCompatibleDescriptor) + + 1*sizeof(USB_MicrosoftCompatibleDescriptor_Interface), + .bcdVersion = 0x0100, + .wIndex = 0x0004, + .bCount = 1, + .reserved = {0, 0, 0, 0, 0, 0, 0}, + .interfaces = { + { + .bFirstInterfaceNumber = 0, + .reserved1 = 1, + .compatibleID = "3DPRINT", + .subCompatibleID = {0, 0, 0, 0, 0, 0, 0, 0}, + .reserved2 = {0, 0, 0, 0, 0, 0}, + } + } +}; + +#define xstr(s) str(s) +#define str(s) #s + +#define MS3DPRINT_CONFIG u"MS3DPrintConfig" +#define MS3DPRINT_CONFIG_DATA \ + u"Base=SD\0"\ + u"Job3DOutputAreaWidth=" xstr(X_BED_SIZE) "000\0"\ + u"Job3DOutputAreaDepth=" xstr(Y_BED_SIZE) "000\0"\ + u"Job3DOutputAreaHeight=" xstr(Z_MAX_POS) "000\0"\ + u"filamentdiameter=1750\0" + +typedef struct USB_MicrosoftExtendedPropertiesDescriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint16_t bCount; + uint32_t dwPropertySize; + uint32_t dwPropertyDataType; + uint16_t wPropertyNameLength; + uint16_t PropertyName[sizeof(MS3DPRINT_CONFIG)/sizeof(uint16_t)]; + uint32_t dwPropertyDataLength; + uint16_t PropertyData[sizeof(MS3DPRINT_CONFIG_DATA)/sizeof(uint16_t)]; +} __attribute__((packed)) USB_MicrosoftExtendedPropertiesDescriptor; + +static USB_MicrosoftExtendedPropertiesDescriptor microsoft_extended_properties_descriptor = { + .dwLength = sizeof(USB_MicrosoftExtendedPropertiesDescriptor), + .bcdVersion = 0x0100, + .wIndex = 0x0005, + .bCount = 1, + + .dwPropertySize = 4 + 4 + 2 + 4 + sizeof(MS3DPRINT_CONFIG) + sizeof(MS3DPRINT_CONFIG_DATA), + .dwPropertyDataType = 7, // (1=REG_SZ, 4=REG_DWORD, 7=REG_MULTI_SZ) + .wPropertyNameLength = sizeof(MS3DPRINT_CONFIG), + .PropertyName = MS3DPRINT_CONFIG, + .dwPropertyDataLength = sizeof(MS3DPRINT_CONFIG_DATA), + .PropertyData = MS3DPRINT_CONFIG_DATA +}; + +/************************************************************************************************** +** WCID configuration information +** Hooked into UDC via UDC_GET_EXTRA_STRING #define. +*/ +bool usb_task_extra_string(void) { + static uint8_t udi_msft_magic[] = "MSFT100\xEE"; + static uint8_t udi_cdc_name[] = "CDC interface"; + #if ENABLED(SDSUPPORT) + static uint8_t udi_msc_name[] = "MSC interface"; + #endif + + struct extra_strings_desc_t { + usb_str_desc_t header; + #if ENABLED(SDSUPPORT) + le16_t string[Max(Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msc_name) - 1), sizeof(udi_msft_magic) - 1)]; + #else + le16_t string[Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msft_magic) - 1)]; + #endif + }; + static UDC_DESC_STORAGE struct extra_strings_desc_t extra_strings_desc = { + .header.bDescriptorType = USB_DT_STRING + }; + + uint8_t *str; + uint8_t str_lgt = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xFF) { + case UDI_CDC_IAD_STRING_ID: + str_lgt = sizeof(udi_cdc_name) - 1; + str = udi_cdc_name; + break; + #if ENABLED(SDSUPPORT) + case UDI_MSC_STRING_ID: + str_lgt = sizeof(udi_msc_name) - 1; + str = udi_msc_name; + break; + #endif + case 0xEE: + str_lgt = sizeof(udi_msft_magic) - 1; + str = udi_msft_magic; + break; + default: + return false; + } + + for (uint8_t i = 0; i < str_lgt; i++) + extra_strings_desc.string[i] = cpu_to_le16((le16_t)str[i]); + + extra_strings_desc.header.bLength = 2 + str_lgt * 2; + udd_g_ctrlreq.payload_size = extra_strings_desc.header.bLength; + udd_g_ctrlreq.payload = (uint8_t*)&extra_strings_desc; + + // if the string is larger than request length, then cut it + if (udd_g_ctrlreq.payload_size > udd_g_ctrlreq.req.wLength) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + + return true; +} + +/************************************************************************************************** +** Handle device requests that the ASF stack doesn't +*/ +bool usb_task_other_requests(void) { + uint8_t* ptr = 0; + uint16_t size = 0; + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { + //if (udd_g_ctrlreq.req.bRequest == 0x30) + if (1) { + if (udd_g_ctrlreq.req.wIndex == 0x04) { + ptr = (uint8_t*)µsoft_compatible_id_descriptor; + size = (udd_g_ctrlreq.req.wLength); + if (size > microsoft_compatible_id_descriptor.dwLength) + size = microsoft_compatible_id_descriptor.dwLength; + } + else if (udd_g_ctrlreq.req.wIndex == 0x05) { + ptr = (uint8_t*)µsoft_extended_properties_descriptor; + size = (udd_g_ctrlreq.req.wLength); + if (size > microsoft_extended_properties_descriptor.dwLength) + size = microsoft_extended_properties_descriptor.dwLength; + } + else + return false; + } + } + + udd_g_ctrlreq.payload_size = size; + if (size == 0) { + udd_g_ctrlreq.callback = 0; + udd_g_ctrlreq.over_under_run = 0; + } + else + udd_g_ctrlreq.payload = ptr; + + return true; +} + +void usb_task_init(void) { + + uint16_t *ptr; + + // Disable USB peripheral so we start clean and avoid lockups + otg_disable(); + udd_disable(); + + // Set the USB interrupt to our stack + UDD_SetStack(&USBD_ISR); + + // Start USB stack to authorize VBus monitoring + udc_start(); + + // Patch in filament diameter - Be careful: String is in UNICODE (2bytes per char) + ptr = µsoft_extended_properties_descriptor.PropertyData[0]; + while (ptr[0] || ptr[1]) { // Double 0 flags end of resource + + // Found the filamentdiameter= unicode string + if (ptr[0] == 'r' && ptr[1] == '=') { + char diam[16]; + char *sptr; + + // Patch in the filament diameter + sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0)); + + // And copy it to the proper place, expanding it to unicode + sptr = &diam[0]; + ptr += 2; + while (*sptr) *ptr++ = *sptr++; + + // Done! + break; + } + + // Go to the next character + ptr++; + } +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_task.h b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h new file mode 100644 index 0000000000..fad62fda50 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h @@ -0,0 +1,134 @@ +/** + * \file + * + * \brief Declaration of main function used by Composite example 4 + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_TASK_H_ +#define _USB_TASK_H_ + +#include "usb_protocol_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \brief Called by MSC interface + * Callback running when USB Host enable MSC interface + * + * \retval true if MSC startup is ok + */ +bool usb_task_msc_enable(void); + +/*! \brief Called by MSC interface + * Callback running when USB Host disable MSC interface + */ +void usb_task_msc_disable(void); + +/*! \brief Opens the communication port + * This is called by CDC interface when USB Host enable it. + * + * \retval true if cdc startup is successfully done + */ +bool usb_task_cdc_enable(const uint8_t port); + +/*! \brief Closes the communication port + * This is called by CDC interface when USB Host disable it. + */ +void usb_task_cdc_disable(const uint8_t port); + +/*! \brief Save new DTR state to change led behavior. + * The DTR notify that the terminal have open or close the communication port. + */ +void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable); + +/*! \brief Check if MSC is enumerated and configured on the PC side + */ +bool usb_task_msc_isenabled(void); + +/*! \brief Check if CDC is enumerated and configured on the PC side + */ +bool usb_task_cdc_isenabled(void); + +/*! \brief Check if CDC is actually OPEN by an application on the PC side + * assuming DTR signal means a program is listening to messages + */ +bool usb_task_cdc_dtr_active(void); + +/*! \brief Called by UDC when USB Host request a extra string different + * of this specified in USB device descriptor + */ +bool usb_task_extra_string(void); + +/*! \brief Called by UDC when USB Host performs unknown requests + */ +bool usb_task_other_requests(void); + +/*! \brief Called by CDC interface + * Callback running when CDC device have received data + */ +void usb_task_cdc_rx_notify(const uint8_t port); + +/*! \brief Configures communication line + * + * \param cfg line configuration + */ +void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg); + +/*! \brief The USB device interrupt + */ +void USBD_ISR(void); + +/*! \brief USB task init + */ +void usb_task_init(void); + +/*! \brief USB task idle + */ +void usb_task_idle(void); + +#ifdef __cplusplus +} +#endif + +#endif // _USB_TASK_H_ diff --git a/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp b/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp new file mode 100644 index 0000000000..3467fdd942 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp @@ -0,0 +1,115 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "../../Marlin.h" +#include "watchdog_Due.h" + +// Override Arduino runtime to either config or disable the watchdog +// +// We need to configure the watchdog as soon as possible in the boot +// process, because watchdog initialization at hardware reset on SAM3X8E +// is unreliable, and there is risk of unintended resets if we delay +// that initialization to a later time. +void watchdogSetup(void) { + + #if ENABLED(USE_WATCHDOG) + + // 4 seconds timeout + uint32_t timeout = 4000; + + // Calculate timeout value in WDT counter ticks: This assumes + // the slow clock is running at 32.768 kHz watchdog + // frequency is therefore 32768 / 128 = 256 Hz + timeout = (timeout << 8) / 1000; + if (timeout == 0) + timeout = 1; + else if (timeout > 0xFFF) + timeout = 0xFFF; + + // We want to enable the watchdog with the specified timeout + uint32_t value = + WDT_MR_WDV(timeout) | // With the specified timeout + WDT_MR_WDD(timeout) | // and no invalid write window + #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) + WDT_MR_WDRPROC | // WDT fault resets processor only - We want + // to keep PIO controller state + #endif + WDT_MR_WDDBGHLT | // WDT stops in debug state. + WDT_MR_WDIDLEHLT; // WDT stops in idle state. + + #if ENABLED(WATCHDOG_RESET_MANUAL) + // We enable the watchdog timer, but only for the interrupt. + + // Configure WDT to only trigger an interrupt + value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt. + + // Disable WDT interrupt (just in case, to avoid triggering it!) + NVIC_DisableIRQ(WDT_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + // Configure and enable WDT interrupt. + NVIC_ClearPendingIRQ(WDT_IRQn); + NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups + NVIC_EnableIRQ(WDT_IRQn); + + #else + + // a WDT fault triggers a reset + value |= WDT_MR_WDRSTEN; + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + #endif + + // Reset the watchdog + WDT_Restart(WDT); + + #else + + // Make sure to completely disable the Watchdog + WDT_Disable(WDT); + + #endif +} + +#if ENABLED(USE_WATCHDOG) + // Initialize watchdog - On SAM3X, Watchdog was already configured + // and enabled or disabled at startup, so no need to reconfigure it + // here. + void watchdog_init(void) { + // Reset watchdog to start clean + WDT_Restart(WDT); + } +#endif // USE_WATCHDOG + +#endif diff --git a/Marlin/src/HAL/HAL_DUE/watchdog_Due.h b/Marlin/src/HAL/HAL_DUE/watchdog_Due.h new file mode 100644 index 0000000000..57120309a3 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/watchdog_Due.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef WATCHDOG_DUE_H +#define WATCHDOG_DUE_H + +// Arduino Due core now has watchdog support + +#include "HAL.h" + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or AVR will go into emergency procedures. +inline void watchdog_reset() { watchdogReset(); } + +#endif // WATCHDOG_DUE_H diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp new file mode 100644 index 0000000000..b579aa620a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp @@ -0,0 +1,281 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include "../Delay.h" + +HalSerial usb_serial; + +// U8glib required functions +extern "C" void u8g_xMicroDelay(uint16_t val) { + DELAY_US(val); +} +extern "C" void u8g_MicroDelay(void) { + u8g_xMicroDelay(1); +} +extern "C" void u8g_10MicroDelay(void) { + u8g_xMicroDelay(10); +} +extern "C" void u8g_Delay(uint16_t val) { + delay(val); +} +//************************// + +// return free heap space +int freeMemory() { + char stack_end; + void *heap_start = malloc(sizeof(uint32_t)); + if (heap_start == 0) return 0; + + uint32_t result = (uint32_t)&stack_end - (uint32_t)heap_start; + free(heap_start); + return result; +} + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +#define ADC_DONE 0x80000000 +#define ADC_OVERRUN 0x40000000 + +void HAL_adc_init(void) { + LPC_SC->PCONP |= (1 << 12); // Enable CLOCK for internal ADC controller + LPC_SC->PCLKSEL0 &= ~(0x3 << 24); + LPC_SC->PCLKSEL0 |= (0x1 << 24); // 0: 25MHz, 1: 100MHz, 2: 50MHz, 3: 12.5MHZ to ADC clock divider + LPC_ADC->ADCR = (0 << 0) // SEL: 0 = no channels selected + | (0xFF << 8) // select slowest clock for A/D conversion 150 - 190 uS for a complete conversion + | (0 << 16) // BURST: 0 = software control + | (0 << 17) // CLKS: not applicable + | (1 << 21) // PDN: 1 = operational + | (0 << 24) // START: 0 = no start + | (0 << 27); // EDGE: not applicable +} + +// externals need to make the call to KILL compile +#include "../../core/language.h" + +extern void kill(const char*); +extern const char errormagic[]; + +void HAL_adc_enable_channel(int ch) { + pin_t pin = analogInputToDigitalPin(ch); + + if (pin == -1) { + SERIAL_PRINTF("%sINVALID ANALOG PORT:%d\n", errormagic, ch); + kill(MSG_KILLED); + } + + int8_t pin_port = LPC1768_PIN_PORT(pin), + pin_port_pin = LPC1768_PIN_PIN(pin), + pinsel_start_bit = pin_port_pin > 15 ? 2 * (pin_port_pin - 16) : 2 * pin_port_pin; + uint8_t pin_sel_register = (pin_port == 0 && pin_port_pin <= 15) ? 0 : + pin_port == 0 ? 1 : + pin_port == 1 ? 3 : 10; + + switch (pin_sel_register) { + case 1: + LPC_PINCON->PINSEL1 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL1 |= (0x1 << pinsel_start_bit); + break; + case 3: + LPC_PINCON->PINSEL3 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL3 |= (0x3 << pinsel_start_bit); + break; + case 0: + LPC_PINCON->PINSEL0 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL0 |= (0x2 << pinsel_start_bit); + break; + }; +} + +void HAL_adc_start_conversion(const uint8_t ch) { + if (analogInputToDigitalPin(ch) == -1) { + SERIAL_PRINTF("HAL: HAL_adc_start_conversion: invalid channel %d\n", ch); + return; + } + + LPC_ADC->ADCR &= ~0xFF; // Reset + SBI(LPC_ADC->ADCR, ch); // Select Channel + SBI(LPC_ADC->ADCR, 24); // Start conversion +} + +bool HAL_adc_finished(void) { + return LPC_ADC->ADGDR & ADC_DONE; +} + +// possible config options if something similar is extended to more platforms. +#define ADC_USE_MEDIAN_FILTER // Filter out erroneous readings +#define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift), + // (ADC_MEDIAN_FILTER_SIZE + 1) / 2 sample step delay (12 samples @ 500Hz: 24ms phase shift) + // Memory usage per ADC channel (bytes): (6 * ADC_MEDIAN_FILTER_SIZE) + 16 + // 8 * ((6 * 23) + 16 ) = 1232 Bytes for 8 channels + +#define ADC_USE_LOWPASS_FILTER // Filter out high frequency noise +#define ADC_LOWPASS_K_VALUE (6) // Higher values increase rise time + // Rise time sample delays for 100% signal convergence on full range step + // (1 : 13, 2 : 32, 3 : 67, 4 : 139, 5 : 281, 6 : 565, 7 : 1135, 8 : 2273) + // K = 6, 565 samples, 500Hz sample rate, 1.13s convergence on full range step + // Memory usage per ADC channel (bytes): 4 (32 Bytes for 8 channels) + + +// Sourced from https://embeddedgurus.com/stack-overflow/tag/median-filter/ +struct MedianFilter { + #define STOPPER 0 // Smaller than any datum + struct Pair { + Pair *point; // Pointers forming list linked in sorted order + uint16_t value; // Values to sort + }; + + Pair buffer[ADC_MEDIAN_FILTER_SIZE] = {}; // Buffer of nwidth pairs + Pair *datpoint = buffer; // Pointer into circular buffer of data + Pair small = {NULL, STOPPER}; // Chain stopper + Pair big = {&small, 0}; // Pointer to head (largest) of linked list. + + uint16_t update(uint16_t datum) { + Pair *successor; // Pointer to successor of replaced data item + Pair *scan; // Pointer used to scan down the sorted list + Pair *scanold; // Previous value of scan + Pair *median; // Pointer to median + uint16_t i; + + if (datum == STOPPER) { + datum = STOPPER + 1; // No stoppers allowed. + } + + if ( (++datpoint - buffer) >= ADC_MEDIAN_FILTER_SIZE) { + datpoint = buffer; // Increment and wrap data in pointer. + } + + datpoint->value = datum; // Copy in new datum + successor = datpoint->point; // Save pointer to old value's successor + median = &big; // Median initially to first in chain + scanold = NULL; // Scanold initially null. + scan = &big; // Points to pointer to first (largest) datum in chain + + // Handle chain-out of first item in chain as special case + if (scan->point == datpoint) { + scan->point = successor; + } + scanold = scan; // Save this pointer and + scan = scan->point ; // step down chain + + // Loop through the chain, normal loop exit via break. + for (i = 0 ; i < ADC_MEDIAN_FILTER_SIZE; ++i) { + // Handle odd-numbered item in chain + if (scan->point == datpoint) { + scan->point = successor; // Chain out the old datum + } + + if (scan->value < datum) { // If datum is larger than scanned value + datpoint->point = scanold->point; // Chain it in here + scanold->point = datpoint; // Mark it chained in + datum = STOPPER; + } + + // Step median pointer down chain after doing odd-numbered element + median = median->point; // Step median pointer + if (scan == &small) { + break; // Break at end of chain + } + scanold = scan; // Save this pointer and + scan = scan->point; // step down chain + + // Handle even-numbered item in chain. + if (scan->point == datpoint) { + scan->point = successor; + } + + if (scan->value < datum) { + datpoint->point = scanold->point; + scanold->point = datpoint; + datum = STOPPER; + } + + if (scan == &small) { + break; + } + + scanold = scan; + scan = scan->point; + } + return median->value; + } +}; + +struct LowpassFilter { + uint32_t data_delay = 0; + uint16_t update(uint16_t value) { + data_delay = data_delay - (data_delay >> ADC_LOWPASS_K_VALUE) + value; + return (uint16_t)(data_delay >> ADC_LOWPASS_K_VALUE); + } +}; + +uint16_t HAL_adc_get_result(void) { + uint32_t adgdr = LPC_ADC->ADGDR; + CBI(LPC_ADC->ADCR, 24); // Stop conversion + + if (adgdr & ADC_OVERRUN) return 0; + uint16_t data = (adgdr >> 4) & 0xFFF; // copy the 12bit data value + uint8_t adc_channel = (adgdr >> 24) & 0x7; // copy the 3bit used channel + + #ifdef ADC_USE_MEDIAN_FILTER + static MedianFilter median_filter[NUM_ANALOG_INPUTS]; + data = median_filter[adc_channel].update(data); + #endif + + #ifdef ADC_USE_LOWPASS_FILTER + static LowpassFilter lowpass_filter[NUM_ANALOG_INPUTS]; + data = lowpass_filter[adc_channel].update(data); + #endif + + return ((data >> 2) & 0x3FF); // return 10bit value as Marlin expects +} + +#define SBIT_CNTEN 0 +#define SBIT_PWMEN 2 +#define SBIT_PWMMR0R 1 + +#define PWM_1 0 //P2_00 (0-1 Bits of PINSEL4) +#define PWM_2 2 //P2_01 (2-3 Bits of PINSEL4) +#define PWM_3 4 //P2_02 (4-5 Bits of PINSEL4) +#define PWM_4 6 //P2_03 (6-7 Bits of PINSEL4) +#define PWM_5 8 //P2_04 (8-9 Bits of PINSEL4) +#define PWM_6 10 //P2_05 (10-11 Bits of PINSEL4) + +void HAL_pwm_init(void) { + LPC_PINCON->PINSEL4 = _BV(PWM_5) | _BV(PWM_6); + + LPC_PWM1->TCR = _BV(SBIT_CNTEN) | _BV(SBIT_PWMEN); + LPC_PWM1->PR = 0x0; // No prescalar + LPC_PWM1->MCR = _BV(SBIT_PWMMR0R); // Reset on PWMMR0, reset TC if it matches MR0 + LPC_PWM1->MR0 = 255; // set PWM cycle(Ton+Toff)=255) + LPC_PWM1->MR5 = 0; // Set 50% Duty Cycle for the channels + LPC_PWM1->MR6 = 0; + + // Trigger the latch Enable Bits to load the new Match Values MR0, MR5, MR6 + LPC_PWM1->LER = _BV(0) | _BV(5) | _BV(6); + // Enable the PWM output pins for PWM_5-PWM_6(P2_04 - P2_05) + LPC_PWM1->PCR = _BV(13) | _BV(14); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.h b/Marlin/src/HAL/HAL_LPC1768/HAL.h new file mode 100644 index 0000000000..d11c552e2b --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * HAL_LPC1768/HAL.h + * Hardware Abstraction Layer for NXP LPC1768 + */ + +#ifndef _HAL_LPC1768_H_ +#define _HAL_LPC1768_H_ + +#define CPU_32_BIT + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include + +#undef min +#undef max + +#include + +void _printf (const char *format, ...); +void _putc(uint8_t c); +uint8_t _getc(); + +extern "C" volatile uint32_t _millis; + +//arduino: Print.h +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +//arduino: binary.h (weird defines) +#define B01 1 +#define B10 2 + +#include +#include + +#include "../math_32bit.h" +#include "../HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "serial.h" +#include "HAL_timers.h" +#include "HardwareSerial.h" + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +extern HalSerial usb_serial; + +#if !WITHIN(SERIAL_PORT, -1, 3) + #error "SERIAL_PORT must be from -1 to 3" +#endif + +#if SERIAL_PORT == -1 + #define MYSERIAL0 usb_serial +#elif SERIAL_PORT == 0 + extern HardwareSerial Serial; + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + extern HardwareSerial Serial1; + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + extern HardwareSerial Serial2; + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 + extern HardwareSerial Serial3; +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 3) + #error "SERIAL_PORT_2 must be from -1 to 3" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 usb_serial + #elif SERIAL_PORT_2 == 0 + extern HardwareSerial Serial; + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + extern HardwareSerial Serial1; + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + extern HardwareSerial Serial2; + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + extern HardwareSerial Serial3; + #define MYSERIAL1 Serial3 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +//Utility functions +int freeMemory(void); + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + +// ADC +#define HAL_ANALOG_SELECT(pin) HAL_adc_enable_channel(pin) +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_get_result() + +void HAL_adc_init(void); +void HAL_adc_enable_channel(int pin); +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(void); + +#endif // _HAL_LPC1768_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp new file mode 100644 index 0000000000..74543ee7d2 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp @@ -0,0 +1,258 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * For TARGET_LPC1768 + */ + +/** + * Hardware SPI and a software SPI implementations are included in this file. + * The hardware SPI runs faster and has higher throughput but is not compatible + * with some LCD interfaces/adapters. + * + * Control of the slave select pin(s) is handled by the calling routines. + * + * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card + * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with + * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is + * active. If any of these pins are shared then the software SPI must be used. + * + * A more sophisticated hardware SPI can be found at the following link. This + * implementation has not been fully debugged. + * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(LPC_SOFTWARE_SPI) + + #include "SoftwareSPI.h" + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + + static uint8_t SPI_speed = 0; + + static uint8_t spiTransfer(uint8_t b) { + return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiBegin() { + swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiInit(uint8_t spiRate) { + SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN); + } + + uint8_t spiRec() { + uint8_t b = spiTransfer(0xFF); + return b; + } + + void spiRead(uint8_t*buf, uint16_t nbyte) { + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) { + buf[i] = spiTransfer(0xFF); + } + } + + void spiSend(uint8_t b) { + uint8_t response = spiTransfer(b); + UNUSED(response); + } + + void spiSend(const uint8_t* buf, size_t n) { + uint8_t response; + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) { + response = spiTransfer(buf[i]); + } + UNUSED(response); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + uint8_t response; + response = spiTransfer(token); + + for (uint16_t i = 0; i < 512; i++) { + response = spiTransfer(buf[i]); + } + UNUSED(response); + WRITE(SS_PIN, HIGH); + } + +#else + + // hardware SPI + + #include + #include + #include + + void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 + + PINSEL_CFG_Type PinCfg; // data structure to hold init values + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC1768_PIN_PIN(SCK_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(SCK_PIN); + + PinCfg.Pinnum = LPC1768_PIN_PIN(MISO_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(MISO_PIN); + + PinCfg.Pinnum = LPC1768_PIN_PIN(MOSI_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(MOSI_PIN); + } + + void spiInit(uint8_t spiRate) { + + // table to convert Marlin spiRates (0-5 plus default) into bit rates + uint32_t Marlin_speed[7]; // CPSR is always 2 + Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED + Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED + Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED + Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED + Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 + Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 + Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + + // divide PCLK by 2 for SSP0 + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_SSP0, CLKPWR_PCLKSEL_CCLK_DIV_2); + + // setup for SPI mode + SSP_CFG_Type HW_SPI_init; // data structure to hold init values + SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode + HW_SPI_init.ClockRate = Marlin_speed[MIN(spiRate, 6)]; // put in the specified bit rate + SSP_Init(LPC_SSP0, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers + + SSP_Cmd(LPC_SSP0, ENABLE); // start SSP0 running + } + + void spiSend(uint8_t b) { + while (!SSP_GetStatus(LPC_SSP0, SSP_STAT_TXFIFO_NOTFULL)); // wait for room in the buffer + SSP_SendData(LPC_SSP0, b & 0x00FF); + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + } + + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) { + while (!SSP_GetStatus(LPC_SSP0, SSP_STAT_TXFIFO_NOTFULL)); // wait for room in the buffer + SSP_SendData(LPC_SSP0, buf[i] & 0x00FF); + } + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + } + + void spiSend(uint32_t chan, byte b) { + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { + } + + static uint8_t get_one_byte() { + // send a dummy byte so can clock in receive data + SSP_SendData(LPC_SSP0,0x00FF); + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + return SSP_ReceiveData(LPC_SSP0) & 0x00FF; + } + + // Read single byte from SPI + uint8_t spiRec() { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + return get_one_byte(); + } + + uint8_t spiRec(uint32_t chan) { + return 0; + } + + // Read from SPI into buffer + void spiRead(uint8_t*buf, uint16_t nbyte) { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) { + buf[i] = get_one_byte(); + } + } + + static uint8_t spiTransfer(uint8_t b) { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + SSP_SendData(LPC_SSP0, b); // send the byte + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + return SSP_ReceiveData(LPC_SSP0) & 0x00FF; + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + + } + +#endif // ENABLED(LPC_SOFTWARE_SPI) + +void SPIClass::begin() { spiBegin(); } + +uint8_t SPIClass::transfer(uint8_t B) { + return spiTransfer(B); +} +uint16_t SPIClass::transfer16(uint16_t data) { + uint16_t buffer; + buffer = transfer((data>>8) & 0xFF) << 8; + buffer |= transfer(data & 0xFF) && 0xFF; + return buffer; +} + +SPIClass SPI; + +#endif // TARGET_LPC1768 + diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h b/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h new file mode 100644 index 0000000000..20d2cf8d05 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h @@ -0,0 +1 @@ +// blank file needed until I get platformio to update it's copy of U8Glib-HAL \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp new file mode 100644 index 0000000000..3714fe1a39 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * Description: + * + * Timers for LPC1768 + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include "HAL_timers.h" + +void HAL_timer_init(void) { + SBI(LPC_SC->PCONP, SBIT_TIMER0); // Power ON Timer 0 + LPC_TIM0->PR = (HAL_TIMER_RATE) / (STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed + + SBI(LPC_SC->PCONP, SBIT_TIMER1); // Power ON Timer 1 + LPC_TIM1->PR = (HAL_TIMER_RATE) / 1000000 - 1; +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency + LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER0_IRQn, NVIC_EncodePriority(0, 1, 0)); + NVIC_EnableIRQ(TIMER0_IRQn); + break; + + case 1: + LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency; + LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER1_IRQn, NVIC_EncodePriority(0, 2, 0)); + NVIC_EnableIRQ(TIMER1_IRQn); + break; + + default: break; + } +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h new file mode 100644 index 0000000000..2113335385 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_TIMERS_H +#define _HAL_TIMERS_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "../../core/macros.h" + +#define SBIT_TIMER0 1 +#define SBIT_TIMER1 2 + +#define SBIT_CNTEN 0 + +#define SBIT_MR0I 0 // Timer 0 Interrupt when TC matches MR0 +#define SBIT_MR0R 1 // Timer 0 Reset TC on Match +#define SBIT_MR0S 2 // Timer 0 Stop TC and PC on Match +#define SBIT_MR1I 3 +#define SBIT_MR1R 4 +#define SBIT_MR1S 5 +#define SBIT_MR2I 6 +#define SBIT_MR2R 7 +#define SBIT_MR2S 8 +#define SBIT_MR3I 9 +#define SBIT_MR3R 10 +#define SBIT_MR3S 11 + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define _HAL_TIMER(T) _CAT(LPC_TIM, T) +#define _HAL_TIMER_IRQ(T) TIMER##T##_IRQn +#define __HAL_TIMER_ISR(T) extern "C" void TIMER##T##_IRQHandler(void) +#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals + +#define STEP_TIMER_NUM 0 // Timer Index for Stepper +#define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PWM_TIMER_NUM 3 // Timer Index for PWM + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR _HAL_TIMER_ISR(STEP_TIMER_NUM) +#define HAL_TEMP_TIMER_ISR _HAL_TIMER_ISR(TEMP_TIMER_NUM) + +// Timer references by index +#define STEP_TIMER _HAL_TIMER(STEP_TIMER_NUM) +#define TEMP_TIMER _HAL_TIMER(TEMP_TIMER_NUM) + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- +void HAL_timer_init(void); +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: STEP_TIMER->MR0 = compare; break; // Stepper Timer Match Register 0 + case 1: TEMP_TIMER->MR0 = compare; break; // Temp Timer Match Register 0 + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER->MR0; // Stepper Timer Match Register 0 + case 1: return TEMP_TIMER->MR0; // Temp Timer Match Register 0 + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER->TC; // Stepper Timer Count + case 1: return TEMP_TIMER->TC; // Temp Timer Count + } + return 0; +} + +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_EnableIRQ(TIMER0_IRQn); // Enable interrupt handler + case 1: NVIC_EnableIRQ(TIMER1_IRQn); // Enable interrupt handler + } +} + +FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DisableIRQ(TIMER0_IRQn); // Disable interrupt handler + case 1: NVIC_DisableIRQ(TIMER1_IRQn); // Disable interrupt handler + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// This function is missing from CMSIS +FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0; +} + +FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not + case 1: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not + } + return false; +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: SBI(STEP_TIMER->IR, SBIT_CNTEN); break; + case 1: SBI(TEMP_TIMER->IR, SBIT_CNTEN); break; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_H diff --git a/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.cpp b/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.cpp new file mode 100644 index 0000000000..98ea4f8fc6 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.cpp @@ -0,0 +1,321 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "HardwareSerial.h" + +#if SERIAL_PORT == 0 || SERIAL_PORT_2 == 0 + HardwareSerial Serial = HardwareSerial(LPC_UART0); +#elif SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + HardwareSerial Serial1 = HardwareSerial((LPC_UART_TypeDef *) LPC_UART1); +#elif SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + HardwareSerial Serial2 = HardwareSerial(LPC_UART2); +#elif SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + HardwareSerial Serial3 = HardwareSerial(LPC_UART3); +#endif + +void HardwareSerial::begin(uint32_t baudrate) { + + UART_CFG_Type UARTConfigStruct; + PINSEL_CFG_Type PinCfg; + UART_FIFO_CFG_Type FIFOConfig; + + if (Baudrate == baudrate) return; // No need to re-initialize + + if (UARTx == LPC_UART0) { + // Initialize UART0 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 2; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 3; + PINSEL_ConfigPin(&PinCfg); + } else if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) { + // Initialize UART1 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 15; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 16; + PINSEL_ConfigPin(&PinCfg); + } else if (UARTx == LPC_UART2) { + // Initialize UART2 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); + } else if (UARTx == LPC_UART3) { + // Initialize UART2 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); + } + + /* Initialize UART Configuration parameter structure to default state: + * Baudrate = 9600bps + * 8 data bit + * 1 Stop bit + * None parity + */ + UART_ConfigStructInit(&UARTConfigStruct); + + // Re-configure baudrate + UARTConfigStruct.Baud_rate = baudrate; + + // Initialize eripheral with given to corresponding parameter + UART_Init(UARTx, &UARTConfigStruct); + + // Enable and reset the TX and RX FIFOs + UART_FIFOConfigStructInit(&FIFOConfig); + UART_FIFOConfig(UARTx, &FIFOConfig); + + // Enable UART Transmit + UART_TxCmd(UARTx, ENABLE); + + // Configure Interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + UART_IntConfig(UARTx, UART_INTCFG_RLS, ENABLE); + + if (UARTx == LPC_UART0) NVIC_EnableIRQ(UART0_IRQn); + else if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) NVIC_EnableIRQ(UART1_IRQn); + else if (UARTx == LPC_UART2) NVIC_EnableIRQ(UART2_IRQn); + else if (UARTx == LPC_UART3) NVIC_EnableIRQ(UART3_IRQn); + + RxQueueWritePos = RxQueueReadPos = 0; + #if TX_BUFFER_SIZE > 0 + TxQueueWritePos = TxQueueReadPos = 0; + #endif + + // Save the configured baudrate + Baudrate = baudrate; +} + +int HardwareSerial::peek() { + int byte = -1; + + // Temporarily lock out UART receive interrupts during this read so the UART receive + // interrupt won't cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_RBR, DISABLE); + + if (RxQueueReadPos != RxQueueWritePos) + byte = RxBuffer[RxQueueReadPos]; + + // Re-enable UART interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + + return byte; +} + +int HardwareSerial::read() { + int byte = -1; + + // Temporarily lock out UART receive interrupts during this read so the UART receive + // interrupt won't cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_RBR, DISABLE); + + if (RxQueueReadPos != RxQueueWritePos) { + byte = RxBuffer[RxQueueReadPos]; + RxQueueReadPos = (RxQueueReadPos + 1) % RX_BUFFER_SIZE; + } + + // Re-enable UART interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + + return byte; +} + +size_t HardwareSerial::write(uint8_t send) { +#if TX_BUFFER_SIZE > 0 + size_t bytes = 0; + uint32_t fifolvl = 0; + + // If the Tx Buffer is full, wait for space to clear + if ((TxQueueWritePos+1) % TX_BUFFER_SIZE == TxQueueReadPos) flushTX(); + + // Temporarily lock out UART transmit interrupts during this read so the UART transmit interrupt won't + // cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + + // LPC17xx.h incorrectly defines FIFOLVL as a uint8_t, when it's actually a 32-bit register + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) { + fifolvl = *(reinterpret_cast(&((LPC_UART1_TypeDef *) UARTx)->FIFOLVL)); + } else fifolvl = *(reinterpret_cast(&UARTx->FIFOLVL)); + + // If the queue is empty and there's space in the FIFO, immediately send the byte + if (TxQueueWritePos == TxQueueReadPos && fifolvl < UART_TX_FIFO_SIZE) { + bytes = UART_Send(UARTx, &send, 1, BLOCKING); + } + // Otherwiise, write the byte to the transmit buffer + else if ((TxQueueWritePos+1) % TX_BUFFER_SIZE != TxQueueReadPos) { + TxBuffer[TxQueueWritePos] = send; + TxQueueWritePos = (TxQueueWritePos+1) % TX_BUFFER_SIZE; + bytes++; + } + + // Re-enable the TX Interrupt + UART_IntConfig(UARTx, UART_INTCFG_THRE, ENABLE); + + return bytes; +#else + return UART_Send(UARTx, &send, 1, BLOCKING); +#endif +} + +#if TX_BUFFER_SIZE > 0 + void HardwareSerial::flushTX() { + // Wait for the tx buffer and FIFO to drain + while (TxQueueWritePos != TxQueueReadPos && UART_CheckBusy(UARTx) == SET); + } +#endif + +int HardwareSerial::available() { + return (RxQueueWritePos + RX_BUFFER_SIZE - RxQueueReadPos) % RX_BUFFER_SIZE; +} + +void HardwareSerial::flush() { + RxQueueWritePos = 0; + RxQueueReadPos = 0; +} + +void HardwareSerial::printf(const char *format, ...) { + char RxBuffer[256]; + va_list vArgs; + va_start(vArgs, format); + int length = vsnprintf(RxBuffer, 256, format, vArgs); + va_end(vArgs); + if (length > 0 && length < 256) { + for (int i = 0; i < length; ++i) + write(RxBuffer[i]); + } +} + +void HardwareSerial::IRQHandler() { + uint32_t IIRValue; + uint8_t LSRValue, byte; + + IIRValue = UART_GetIntId(UARTx); + IIRValue &= UART_IIR_INTID_MASK; // check bit 1~3, interrupt identification + + // Receive Line Status + if (IIRValue == UART_IIR_INTID_RLS) { + LSRValue = UART_GetLineStatus(UARTx); + + // Receive Line Status + if (LSRValue & (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE | UART_LSR_RXFE | UART_LSR_BI)) { + // There are errors or break interrupt + // Read LSR will clear the interrupt + Status = LSRValue; + byte = UART_ReceiveByte(UARTx); // Dummy read on RX to clear interrupt, then bail out + return; + } + } + + // Receive Data Available + if (IIRValue == UART_IIR_INTID_RDA) { + // Clear the FIFO + while (UART_Receive(UARTx, &byte, 1, NONE_BLOCKING)) { + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, byte); + #endif + if ((RxQueueWritePos + 1) % RX_BUFFER_SIZE != RxQueueReadPos) { + RxBuffer[RxQueueWritePos] = byte; + RxQueueWritePos = (RxQueueWritePos + 1) % RX_BUFFER_SIZE; + } else + break; + } + // Character timeout indicator + } else if (IIRValue == UART_IIR_INTID_CTI) { + // Character Time-out indicator + Status |= 0x100; // Bit 9 as the CTI error + } + + #if TX_BUFFER_SIZE > 0 + if (IIRValue == UART_IIR_INTID_THRE) { + // Disable THRE interrupt + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + + // Wait for FIFO buffer empty + while (UART_CheckBusy(UARTx) == SET); + + // Transfer up to UART_TX_FIFO_SIZE bytes of data + for (int i = 0; i < UART_TX_FIFO_SIZE && TxQueueWritePos != TxQueueReadPos; i++) { + // Move a piece of data into the transmit FIFO + if (UART_Send(UARTx, &TxBuffer[TxQueueReadPos], 1, NONE_BLOCKING)) { + TxQueueReadPos = (TxQueueReadPos+1) % TX_BUFFER_SIZE; + } else break; + } + + // If there is no more data to send, disable the transmit interrupt - else enable it or keep it enabled + if (TxQueueWritePos == TxQueueReadPos) { + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + } else UART_IntConfig(UARTx, UART_INTCFG_THRE, ENABLE); + } + #endif +} + +#ifdef __cplusplus +extern "C" { +#endif + +void UART0_IRQHandler(void) { + #if SERIAL_PORT == 0 || SERIAL_PORT_2 == 0 + Serial.IRQHandler(); + #endif +} + +void UART1_IRQHandler(void) { + #if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + Serial1.IRQHandler(); + #endif +} + +void UART2_IRQHandler(void) { + #if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + Serial2.IRQHandler(); + #endif +} + +void UART3_IRQHandler(void) { + #if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + Serial3.IRQHandler(); + #endif +} + +#ifdef __cplusplus +} +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.h b/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.h new file mode 100644 index 0000000000..0f96652410 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HardwareSerial.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef HARDWARE_SERIAL_H_ +#define HARDWARE_SERIAL_H_ + +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" +#endif + +#include +#include +#include + +extern "C" { + #include + #include "lpc17xx_pinsel.h" +} + +class HardwareSerial : public Stream { +private: + LPC_UART_TypeDef *UARTx; + + uint32_t Baudrate; + uint32_t Status; + uint8_t RxBuffer[RX_BUFFER_SIZE]; + uint32_t RxQueueWritePos; + uint32_t RxQueueReadPos; + #if TX_BUFFER_SIZE > 0 + uint8_t TxBuffer[TX_BUFFER_SIZE]; + uint32_t TxQueueWritePos; + uint32_t TxQueueReadPos; + #endif + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif + +public: + HardwareSerial(LPC_UART_TypeDef *UARTx) + : UARTx(UARTx) + , Baudrate(0) + , RxQueueWritePos(0) + , RxQueueReadPos(0) + #if TX_BUFFER_SIZE > 0 + , TxQueueWritePos(0) + , TxQueueReadPos(0) + #endif + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { + } + + void begin(uint32_t baudrate); + int peek(); + int read(); + size_t write(uint8_t send); + #if TX_BUFFER_SIZE > 0 + void flushTX(); + #endif + int available(); + void flush(); + void printf(const char *format, ...); + + operator bool() { return true; } + + void IRQHandler(); + + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 + + void print_bin(uint32_t value, uint8_t num_digits) { + uint32_t mask = 1 << (num_digits -1); + for (uint8_t i = 0; i < num_digits; i++) { + if (!(i % 4) && i) printf(" "); + if (!(i % 16) && i) printf(" "); + if (value & mask) printf("1"); + else printf("0"); + value <<= 1; + } + } + + void print(const char value[]) { + printf("%s" , value); + } + void print(char value, int nbase = 0) { + if (nbase == BIN) print_bin(value,8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else if (nbase == DEC ) printf("%d", value); + else printf("%c" , value); + } + void print(unsigned char value, int nbase = 0) { + if (nbase == BIN) print_bin(value,8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else printf("%u" , value); + } + void print(int value, int nbase = 0) { + if (nbase == BIN) print_bin(value,16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%d", value); + } + void print(unsigned int value, int nbase = 0) { + if (nbase == BIN) print_bin(value,16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%u" , value); + } + void print(long value, int nbase = 0) { + if (nbase == BIN) print_bin(value,32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%ld" , value); + } + void print(unsigned long value, int nbase = 0) { + if (nbase == BIN) print_bin(value,32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%lu" , value); + } + void print(float value, int round = 6) { + printf("%f" , value); + } + void print(double value, int round = 6) { + printf("%f" , value ); + } + + void println(const char value[]) { + printf("%s\n" , value); + } + void println(char value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(unsigned char value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(int value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(unsigned int value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(long value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(unsigned long value, int nbase = 0) { + print(value, nbase); + println(); + } + void println(float value, int round = 6) { + printf("%f\n" , value ); + } + void println(double value, int round = 6) { + printf("%f\n" , value ); + } + void println(void) { + print('\n'); + } + +}; + +#endif // MARLIN_SRC_HAL_HAL_SERIAL_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp new file mode 100644 index 0000000000..b27d8e1f31 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp @@ -0,0 +1,576 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + */ + +/** + * This is a hybrid system. + * + * The PWM1 module is used to directly control the Servo 0, 1 & 3 pins and D9 & D10 pins. This keeps + * the pulse width jitter to under a microsecond. + * + * For all other pins a timer is used to generate interrupts. The ISR + * routine does the actual setting/clearing of pins. The upside is that any pin can + * have a PWM channel assigned to it. The downside is that there is more pulse width + * jitter. The jitter depends on what else is happening in the system and what ISRs + * pre-empt the PWM ISR. + */ + +/** + * The data structures are set up to minimize the computation done by the ISR which + * minimizes ISR execution time. Execution times are 5-14µs depending on how full the + * ISR table is. 14uS is for a 20 element ISR table. + * + * Two tables are used. One table contains the data used by the ISR to update/control + * the PWM pins. The other is used as an aid when updating the ISR table. + * + * See the end of this file for details on the hardware/firmware interaction + */ + +/** + * Directly controlled PWM pins ( + * NA means not being used as a directly controlled PWM pin + * + * Re-ARM MKS Sbase + * PWM1.1 P1_18 SERVO3_PIN NA(no connection) + * PWM1.1 P2_00 NA(E0_STEP_PIN) NA(X stepper) + * PWM1.2 P1_20 SERVO0_PIN NA(no connection) + * PWM1.2 P2_01 NA(X_STEP_PIN) NA(Y stepper) + * PWM1.3 P1_21 SERVO1_PIN NA(no connection) + * PWM1.3 P2_02 NA(Y_STEP_PIN) NA(Z stepper) + * PWM1.4 P1_23 NA(SDSS(SSEL0)) SERVO0_PIN + * PWM1.4 P2_03 NA(Z_STEP_PIN) NA(E0 stepper) + * PWM1.5 P1_24 NA(X_MIN_PIN) NA(X_MIN_pin) + * PWM1.5 P2_04 RAMPS_D9_PIN FAN_PIN + * PWM1.6 P1_26 NA(Y_MIN_PIN) NA(Y_MIN_pin) + * PWM1.6 P2_05 RAMPS_D10_PIN HEATER_BED_PIN + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include +#include "LPC1768_PWM.h" +#include + +#define NUM_ISR_PWMS 20 + +#define HAL_PWM_TIMER LPC_TIM3 +#define HAL_PWM_TIMER_ISR extern "C" void TIMER3_IRQHandler(void) +#define HAL_PWM_TIMER_IRQn TIMER3_IRQn + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +typedef struct { // holds all data needed to control/init one of the PWM channels + bool active_flag; // THIS TABLE ENTRY IS ACTIVELY TOGGLING A PIN + pin_t pin; + volatile uint32_t* set_register; + volatile uint32_t* clr_register; + uint32_t write_mask; // USED BY SET/CLEAR COMMANDS + uint32_t microseconds; // value written to MR register + uint32_t min; // lower value limit checked by WRITE routine before writing to the MR register + uint32_t max; // upper value limit checked by WRITE routine before writing to the MR register + uint8_t servo_index; // 0 - MAX_SERVO -1 : servo index, 0xFF : PWM channel +} PWM_map; + +PWM_map PWM1_map_A[NUM_ISR_PWMS]; // compiler will initialize to all zeros +PWM_map PWM1_map_B[NUM_ISR_PWMS]; // compiler will initialize to all zeros + +PWM_map *active_table = PWM1_map_A; +PWM_map *work_table = PWM1_map_B; +PWM_map *temp_table; + +#define P1_18_PWM_channel 1 // servo 3 +#define P1_20_PWM_channel 2 // servo 0 +#define P1_21_PWM_channel 3 // servo 1 +#define P1_23_PWM_channel 4 // servo 0 for MKS Sbase +#define P2_04_PWM_channel 5 // D9 +#define P2_05_PWM_channel 6 // D10 + +typedef struct { + uint32_t min; + uint32_t max; + bool assigned; +} table_direct; + +table_direct direct_table[6]; // compiler will initialize to all zeros + +/** + * Prescale register and MR0 register values + * + * 100MHz PCLK 50MHz PCLK 25MHz PCLK 12.5MHz PCLK + * ----------------- ----------------- ----------------- ----------------- + * desired prescale MR0 prescale MR0 prescale MR0 prescale MR0 resolution + * prescale register register register register register register register register in degrees + * freq value value value value value value value value + * + * 8 11.5 159,999 5.25 159,999 2.13 159,999 0.5625 159,999 0.023 + * 4 24 79,999 11.5 79,999 5.25 79,999 2.125 79,999 0.045 + * 2 49 39,999 24 39,999 11.5 39,999 5.25 39,999 0.090 + * 1 99 19,999 49 19,999 24 19,999 11.5 19,999 0.180 + * 0.5 199 9,999 99 9,999 49 9,999 24 9,999 0.360 + * 0.25 399 4,999 199 4,999 99 4,999 49 4,999 0.720 + * 0.125 799 2,499 399 2,499 199 2,499 99 2,499 1.440 + * + * The desired prescale frequency column comes from an input in the range of 544 - 2400 microseconds + * and the desire to just shift the input left or right as needed. + * + * A resolution of 0.2 degrees seems reasonable so a prescale frequency output of 1MHz is being used. + * It also means we don't need to scale the input. + * + * The PCLK is set to 25MHz because that's the slowest one that gives whole numbers for prescale and + * MR0 registers. + * + * Final settings: + * PCLKSEL0: 0x0 + * PWM1PR: 0x018 (24) + * PWM1MR0: 0x04E1F (19,999) + * + */ + +void LPC1768_PWM_init(void) { + + ///// directly controlled PWM pins (interrupts not used for these) + + #define SBIT_CNTEN 0 // PWM1 counter & pre-scaler enable/disable + #define SBIT_CNTRST 1 // reset counters to known state + #define SBIT_PWMEN 3 // 1 - PWM, 0 - timer + #define SBIT_PWMMR0R 1 + #define PCPWM1 6 + #define PCLK_PWM1 12 + + SBI(LPC_SC->PCONP, PCPWM1); // Enable PWM1 controller (enabled on power up) + LPC_SC->PCLKSEL0 &= ~(0x3 << PCLK_PWM1); + LPC_SC->PCLKSEL0 |= (LPC_PWM1_PCLKSEL0 << PCLK_PWM1); + + uint32_t PR = (CLKPWR_GetPCLK(CLKPWR_PCLKSEL_PWM1) / 1000000) - 1; // Prescalar to create 1 MHz output + + LPC_PWM1->MR0 = LPC_PWM1_MR0; // TC resets every 19,999 + 1 cycles - sets PWM cycle(Ton+Toff) to 20 mS + // MR0 must be set before TCR enables the PWM + LPC_PWM1->TCR = _BV(SBIT_CNTEN) | _BV(SBIT_CNTRST) | _BV(SBIT_PWMEN); // Enable counters, reset counters, set mode to PWM + CBI(LPC_PWM1->TCR, SBIT_CNTRST); // Take counters out of reset + LPC_PWM1->PR = PR; + LPC_PWM1->MCR = _BV(SBIT_PWMMR0R) | _BV(0); // Reset TC if it matches MR0, disable all interrupts except for MR0 + LPC_PWM1->CTCR = 0; // Disable counter mode (enable PWM mode) + LPC_PWM1->LER = 0x07F; // Set the latch Enable Bits to load the new Match Values for MR0 - MR6 + LPC_PWM1->PCR = 0; // Single edge mode for all channels, PWM1 control of outputs off + + //// interrupt controlled PWM setup + + LPC_SC->PCONP |= 1 << 23; // power on timer3 + HAL_PWM_TIMER->PR = PR; + HAL_PWM_TIMER->MCR = 0x0B; // Interrupt on MR0 & MR1, reset on MR0 + HAL_PWM_TIMER->MR0 = LPC_PWM1_MR0; + HAL_PWM_TIMER->MR1 = 0; + HAL_PWM_TIMER->TCR = _BV(0); // enable + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); + NVIC_SetPriority(HAL_PWM_TIMER_IRQn, NVIC_EncodePriority(0, 4, 0)); +} + + +bool ISR_table_update = false; // flag to tell the ISR that the tables need to be updated & swapped +uint8_t ISR_index = 0; // index used by ISR to skip already actioned entries +#define COPY_ACTIVE_TABLE for (uint8_t i = 0; i < NUM_ISR_PWMS ; i++) work_table[i] = active_table[i] +uint32_t first_MR1_value = LPC_PWM1_MR0 + 1; + +void LPC1768_PWM_sort(void) { + + for (uint8_t i = NUM_ISR_PWMS; --i;) { // (bubble) sort table by microseconds + bool didSwap = false; + PWM_map temp; + for (uint16_t j = 0; j < i; ++j) { + if (work_table[j].microseconds > work_table[j + 1].microseconds) { + temp = work_table[j + 1]; + work_table[j + 1] = work_table[j]; + work_table[j] = temp; + didSwap = true; + } + } + if (!didSwap) break; + } +} + +bool LPC1768_PWM_attach_pin(pin_t pin, uint32_t min /* = 1 */, uint32_t max /* = (LPC_PWM1_MR0 - 1) */, uint8_t servo_index /* = 0xFF */) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); // Sometimes the upper byte is garbled + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + direct_table[P1_23_PWM_channel - 1].min = min; + direct_table[P1_23_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_23_PWM_channel - 1].assigned = true; + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + direct_table[P1_20_PWM_channel - 1].min = min; + direct_table[P1_20_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_20_PWM_channel - 1].assigned = true; + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + direct_table[P1_21_PWM_channel - 1].min = min; + direct_table[P1_21_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_21_PWM_channel - 1].assigned = true; + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + direct_table[P1_18_PWM_channel - 1].min = min; + direct_table[P1_18_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_18_PWM_channel - 1].assigned = true; + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + direct_table[P2_04_PWM_channel - 1].min = min; + direct_table[P2_04_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P2_04_PWM_channel - 1].assigned = true; + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + direct_table[P2_05_PWM_channel - 1].min = min; + direct_table[P2_05_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P2_05_PWM_channel - 1].assigned = true; + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); // make it safe to update the active table + // OK to update the active table because the + // ISR doesn't use any of the changed items + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (ISR_table_update) //use work table if that's the newest + temp_table = work_table; + else + temp_table = active_table; + + uint8_t slot = 0; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if already in table + if (temp_table[i].pin == pin) { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 1; + } + + for (uint8_t i = 1; (i < NUM_ISR_PWMS + 1) && !slot; i++) // find empty slot + if ( !(temp_table[i - 1].set_register)) { slot = i; break; } // any item that can't be zero when active or just attached is OK + + if (!slot) { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 0; + } + + slot--; // turn it into array index + + temp_table[slot].pin = pin; // init slot + temp_table[slot].set_register = &LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET; + temp_table[slot].clr_register = &LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR; + temp_table[slot].write_mask = LPC_PIN(LPC1768_PIN_PIN(pin)); + temp_table[slot].min = min; + temp_table[slot].max = max; // different max for ISR PWMs than for direct PWMs + temp_table[slot].servo_index = servo_index; + temp_table[slot].active_flag = false; + + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + + return 1; +} + + +bool LPC1768_PWM_detach_pin(pin_t pin) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + if (!direct_table[P1_23_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_23_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 14); // return pin to general purpose I/O + direct_table[P1_23_PWM_channel - 1].assigned = false; + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + if (!direct_table[P1_20_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_20_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 8); // return pin to general purpose I/O + direct_table[P1_20_PWM_channel - 1].assigned = false; + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + if (!direct_table[P1_21_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_21_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 10); // return pin to general purpose I/O + direct_table[P1_21_PWM_channel - 1].assigned = false; + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + if (!direct_table[P1_18_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_18_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 4); // return pin to general purpose I/O + direct_table[P1_18_PWM_channel - 1].assigned = false; + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + if (!direct_table[P2_04_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P2_04_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL4 &= ~(0x3 << 10); // return pin to general purpose I/O + direct_table[P2_04_PWM_channel - 1].assigned = false; + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + if (!direct_table[P2_05_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P2_05_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL4 &= ~(0x3 << 4); // return pin to general purpose I/O + direct_table[P2_05_PWM_channel - 1].assigned = false; + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (ISR_table_update) { + ISR_table_update = false; // don't update yet - have another update to do + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + } + else { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + COPY_ACTIVE_TABLE; // copy active table into work table + } + + uint8_t slot = 0xFF; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) { // find slot + if (work_table[i].pin == pin) { + slot = i; + break; + } + } + if (slot == 0xFF) // return error if pin not found + return false; + + work_table[slot] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + + LPC1768_PWM_sort(); // sort table by microseconds + ISR_table_update = true; + return true; +} + +// value is 0-20,000 microseconds (0% to 100% duty cycle) +// servo routine provides values in the 544 - 2400 range +bool LPC1768_PWM_write(pin_t pin, uint32_t value) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + if (!direct_table[P1_23_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_23_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 = 0x2 << 14; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR4 = MAX(MIN(value, direct_table[P1_23_PWM_channel - 1].max), direct_table[P1_23_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_23_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + if (!direct_table[P1_20_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_20_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 8; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR2 = MAX(MIN(value, direct_table[P1_20_PWM_channel - 1].max), direct_table[P1_20_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_20_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + if (!direct_table[P1_21_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_21_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 10; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR3 = MAX(MIN(value, direct_table[P1_21_PWM_channel - 1].max), direct_table[P1_21_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_21_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + if (!direct_table[P1_18_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_18_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 4; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR1 = MAX(MIN(value, direct_table[P1_18_PWM_channel - 1].max), direct_table[P1_18_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_18_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + if (!direct_table[P2_04_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P2_04_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL4 |= 0x1 << 8; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR5 = MAX(MIN(value, direct_table[P2_04_PWM_channel - 1].max), direct_table[P2_04_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P2_04_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + if (!direct_table[P2_05_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P2_05_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL4 |= 0x1 << 10; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR6 = MAX(MIN(value, direct_table[P2_05_PWM_channel - 1].max), direct_table[P2_05_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P2_05_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (!ISR_table_update) // use the most up to date table + COPY_ACTIVE_TABLE; // copy active table into work table + + uint8_t slot = 0xFF; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // find slot + if (work_table[i].pin == pin) { slot = i; break; } + if (slot == 0xFF) { // return error if pin not found + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); + return false; + } + + work_table[slot].microseconds = MAX(MIN(value, work_table[slot].max), work_table[slot].min);; + work_table[slot].active_flag = true; + + LPC1768_PWM_sort(); // sort table by microseconds + ISR_table_update = true; + + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 1; +} + + +bool useable_hardware_PWM(pin_t pin) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + bool return_flag = false; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if it's already setup + if (active_table[i].pin == pin) return_flag = true; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if there is an empty slot + if (!active_table[i].set_register) return_flag = true; + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return return_flag; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +#define PWM_LPC1768_ISR_SAFETY_FACTOR 5 // amount of time needed to guarantee MR1 count will be above TC +volatile bool in_PWM_isr = false; + +HAL_PWM_TIMER_ISR { + bool first_active_entry = true; + uint32_t next_MR1_val; + + if (in_PWM_isr) goto exit_PWM_ISR; // prevent re-entering this ISR + in_PWM_isr = true; + + if (HAL_PWM_TIMER->IR & 0x01) { // MR0 interrupt + next_MR1_val = first_MR1_value; // only used if have a blank ISR table + if (ISR_table_update) { // new values have been loaded so swap tables + temp_table = active_table; + active_table = work_table; + work_table = temp_table; + ISR_table_update = false; + } + } + HAL_PWM_TIMER->IR = 0x3F; // clear all interrupts + + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) { + if (active_table[i].active_flag) { + if (first_active_entry) { + first_active_entry = false; + next_MR1_val = active_table[i].microseconds; + } + if (HAL_PWM_TIMER->TC < active_table[i].microseconds) { + *active_table[i].set_register = active_table[i].write_mask; // set pin high + } + else { + *active_table[i].clr_register = active_table[i].write_mask; // set pin low + next_MR1_val = (i == NUM_ISR_PWMS -1) + ? LPC_PWM1_MR0 + 1 // done with table, wait for MR0 + : active_table[i + 1].microseconds; // set next MR1 interrupt? + } + } + } + if (first_active_entry) next_MR1_val = LPC_PWM1_MR0 + 1; // empty table so disable MR1 interrupt + HAL_PWM_TIMER->MR1 = MAX(next_MR1_val, HAL_PWM_TIMER->TC + PWM_LPC1768_ISR_SAFETY_FACTOR); // set next + in_PWM_isr = false; + + exit_PWM_ISR: + return; +} +#endif + + +///////////////////////////////////////////////////////////////// +///////////////// HARDWARE FIRMWARE INTERACTION //////////////// +///////////////////////////////////////////////////////////////// + +/** + * There are two distinct systems used for PWMs: + * directly controlled pins + * ISR controlled pins. + * + * The two systems are independent of each other. The use the same counter frequency so there's no + * translation needed when setting the time values. The init, attach, detach and write routines all + * start with the direct pin code which is followed by the ISR pin code. + * + * The PMW1 module handles the directly controlled pins. Each directly controlled pin is associated + * with a match register (MR1 - MR6). When the associated MR equals the module's TIMER/COUNTER (TC) + * then the pins is set to low. The MR0 register controls the repetition rate. When the TC equals + * MR0 then the TC is reset and ALL directly controlled pins are set high. The resulting pulse widths + * are almost immune to system loading and ISRs. No PWM1 interrupts are used. + * + * The ISR controlled pins use the TIMER/COUNTER, MR0 and MR1 registers from one timer. MR0 controls + * period of the controls the repetition rate. When the TC equals MR0 then the TC is reset and an + * interrupt is generated. When the TC equals MR1 then an interrupt is generated. + * + * Each interrupt does the following: + * 1) Swaps the tables if it's a MR0 interrupt and the swap flag is set. It then clears the swap flag. + * 2) Scans the entire ISR table (it's been sorted low to high time) + * a. If its the first active entry then it grabs the time as a tentative time for MR1 + * b. If active and TC is less than the time then it sets the pin high + * c. If active and TC is more than the time it sets the pin high + * d. On every entry that sets a pin low it grabs the NEXT entry's time for use as the next MR1. + * This results in MR1 being set to the time in the first active entry that does NOT set a + * pin low. + * e. If it's setting the last entry's pin low then it sets MR1 to a value bigger than MR0 + * f. If no value has been grabbed for the next MR1 then it's an empty table and MR1 is set to a + * value greater than MR0 + */ diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h new file mode 100644 index 0000000000..6c1a2480b8 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + */ + +/** + * This is a hybrid system. + * + * The PWM1 module is used to directly control the Servo 0, 1 & 3 pins. This keeps + * the pulse width jitter to under a microsecond. + * + * For all other pins the PWM1 module is used to generate interrupts. The ISR + * routine does the actual setting/clearing of pins. The upside is that any pin can + * have a PWM channel assigned to it. The downside is that there is more pulse width + * jitter. The jitter depends on what else is happening in the system and what ISRs + * prempt the PWM ISR. Writing to the SD card can add 20 microseconds to the pulse + * width. + */ + +/** + * The data structures are setup to minimize the computation done by the ISR which + * minimizes ISR execution time. Execution times are 2.2 - 3.7 microseconds. + * + * Two tables are used. active_table is used by the ISR. Changes to the table are + * are done by copying the active_table into the work_table, updating the work_table + * and then swapping the two tables. Swapping is done by manipulating pointers. + * + * Immediately after the swap the ISR uses the work_table until the start of the + * next 20mS cycle. During this transition the "work_table" is actually the table + * that was being used before the swap. The "active_table" contains the data that + * will start being used at the start of the next 20mS period. This keeps the pins + * well behaved during the transition. + * + * The ISR's priority is set to the maximum otherwise other ISRs can cause considerable + * jitter in the PWM high time. + * + * See the end of this file for details on the hardware/firmware interaction + */ + +#ifndef _LPC1768_PWM_H_ +#define _LPC1768_PWM_H_ + +#include +#include + +#define LPC_PWM1_MR0 19999 // base repetition rate minus one count - 20mS +#define LPC_PWM1_PCLKSEL0 CLKPWR_PCLKSEL_CCLK_DIV_4 // select clock divider for prescaler - defaults to 4 on power up +#define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up + +void LPC1768_PWM_init(void); +bool LPC1768_PWM_attach_pin(pin_t pin, uint32_t min=1, uint32_t max=(LPC_PWM1_MR0 - (MR0_MARGIN)), uint8_t servo_index=0xFF); +bool LPC1768_PWM_write(pin_t pin, uint32_t value); +bool LPC1768_PWM_detach_pin(pin_t pin); +bool useable_hardware_PWM(pin_t pin); + +#endif // _LPC1768_PWM_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp new file mode 100644 index 0000000000..283cd52547 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on servo.cpp - Interrupt driven Servo library for Arduino using 16 bit + * timers- Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + * + */ + +/** + * The only time that this library wants physical movement is when a WRITE + * command is issued. Before that all the attach & detach activity is solely + * within the data base. + * + * The PWM output is inactive until the first WRITE. After that it stays active + * unless DEACTIVATE_SERVOS_AFTER_MOVE is enabled and a MOVE command was issued. + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS && defined(TARGET_LPC1768) + + #include "LPC1768_PWM.h" + #include "LPC1768_Servo.h" + #include "servo_private.h" + + ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures + uint8_t ServoCount = 0; // the total number of attached servos + + #define US_TO_PULSE_WIDTH(p) p + #define PULSE_WIDTH_TO_US(p) p + #define TRIM_DURATION 0 + #define SERVO_MIN() MIN_PULSE_WIDTH // minimum value in uS for this servo + #define SERVO_MAX() MAX_PULSE_WIDTH // maximum value in uS for this servo + + Servo::Servo() { + if (ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + servo_info[this->servoIndex].pulse_width = US_TO_PULSE_WIDTH(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + } + else + this->servoIndex = INVALID_SERVO; // too many servos + } + + int8_t Servo::attach(const int pin) { + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + } + + int8_t Servo::attach(const int pin, const int min, const int max) { + + if (this->servoIndex >= MAX_SERVOS) return -1; + + if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin; // only assign a pin value if the pin info is + // greater than zero. This way the init routine can + // assign the pin and the MOVE command only needs the value. + + this->min = MIN_PULSE_WIDTH; //resolution of min/max is 1 uS + this->max = MAX_PULSE_WIDTH; + + servo_info[this->servoIndex].Pin.isActive = true; + + return this->servoIndex; + } + + void Servo::detach() { + servo_info[this->servoIndex].Pin.isActive = false; + } + + void Servo::write(int value) { + if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); + // odd - this sets zero degrees to 544 and 180 degrees to 2400 microseconds but the literature says + // zero degrees should be 500 microseconds and 180 should be 2500 + } + this->writeMicroseconds(value); + } + + void Servo::writeMicroseconds(int value) { + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if (channel < MAX_SERVOS) { // ensure channel is valid + // ensure pulse width is valid + value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); + value = US_TO_PULSE_WIDTH(value); // convert to pulse_width after compensating for interrupt overhead - 12 Aug 2009 + + servo_info[channel].pulse_width = value; + LPC1768_PWM_attach_pin(servo_info[this->servoIndex].Pin.nbr, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, this->servoIndex); + LPC1768_PWM_write(servo_info[this->servoIndex].Pin.nbr, value); + + } + } + + // return the value as degrees + int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); } + + int Servo::readMicroseconds() { + return (this->servoIndex == INVALID_SERVO) ? 0 : PULSE_WIDTH_TO_US(servo_info[this->servoIndex].pulse_width) + TRIM_DURATION; + } + + bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } + + void Servo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { // notice the pin number is zero here + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + LPC1768_PWM_detach_pin(servo_info[this->servoIndex].Pin.nbr); // shut down the PWM signal + LPC1768_PWM_attach_pin(servo_info[this->servoIndex].Pin.nbr, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, this->servoIndex); // make sure no one else steals the slot + #endif + } + } + +#endif // HAS_SERVOS && TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h new file mode 100644 index 0000000000..f0d6f048a5 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * The PWM1 module is only used to generate interrups at specified times. It + * is NOT used to directly toggle pins. The ISR writes to the pin assigned to + * that interrupt + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + * + */ + +#ifndef LPC1768_SERVO_H +#define LPC1768_SERVO_H + +#include + + class Servo { + public: + Servo(); + int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(const int pin, const int min, const int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(const int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false + + private: + uint8_t servoIndex; // index into the channel data for this servo + int min; + int max; + }; + + #define HAL_SERVO_LIB Servo + +#endif // LPC1768_SERVO_H diff --git a/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h b/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h new file mode 100644 index 0000000000..a408a6c587 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ + +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && ENABLED(HAVE_TMC2130) && DISABLED(TMC_USE_SW_SPI) \ + && (MB(RAMPS_14_RE_ARM_EFB) \ + || MB(RAMPS_14_RE_ARM_EEB) \ + || MB(RAMPS_14_RE_ARM_EFF) \ + || MB(RAMPS_14_RE_ARM_EEF) \ + || MB(RAMPS_14_RE_ARM_SF)) + #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI" +#endif diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp new file mode 100644 index 0000000000..87f7bf383e --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * For TARGET_LPC1768 + */ + +#include "../../inc/MarlinConfig.h" + +#ifdef TARGET_LPC1768 + +// -------------------------------------------------------------------------- +// Software SPI +// -------------------------------------------------------------------------- + +/** + * This software SPI runs at multiple rates. The SD software provides an index + * (spiRate) of 0-6. The mapping is: + * 0 - about 5 MHz peak (6 MHz on LPC1769) + * 1-2 - about 2 MHz peak + * 3 - about 1 MHz peak + * 4 - about 500 kHz peak + * 5 - about 250 kHz peak + * 6 - about 125 kHz peak + */ + +uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) { + for (uint8_t i = 0; i < 8; i++) { + if (spi_speed == 0) { + WRITE(mosi_pin, !!(b & 0x80)); + WRITE(sck_pin, HIGH); + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + WRITE(sck_pin, LOW); + } + else { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + for (uint8_t j = 0; j < spi_speed; j++) + WRITE(mosi_pin, state); + + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) + WRITE(sck_pin, HIGH); + + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + + for (uint8_t j = 0; j < spi_speed; j++) + WRITE(sck_pin, LOW); + } + } + return b; +} + +void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) { + SET_OUTPUT(sck_pin); + if (VALID_PIN(miso_pin)) SET_INPUT(miso_pin); + SET_OUTPUT(mosi_pin); +} + +uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) { + WRITE(mosi_pin, HIGH); + WRITE(sck_pin, LOW); + return (SystemCoreClock == 120000000 ? 44 : 38) / POW(2, 6 - MIN(spiRate, 6)); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h new file mode 100644 index 0000000000..49136e2aa3 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _SOFTWARE_SPI_H_ +#define _SOFTWARE_SPI_H_ + +#include + +// -------------------------------------------------------------------------- +// Software SPI +// -------------------------------------------------------------------------- + +/** + * This software SPI runs at multiple rates. The SD software provides an index + * (spiRate) of 0-6. The mapping is: + * 0 - about 5 MHz peak (6 MHz on LPC1769) + * 1-2 - about 2 MHz peak + * 3 - about 1 MHz peak + * 4 - about 500 kHz peak + * 5 - about 250 kHz peak + * 6 - about 125 kHz peak + */ + +void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin); + +// Returns the spi_speed value to be passed to swSpiTransfer +uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin); + +uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin); + +#endif // _SOFTWARE_SPI_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.cpp b/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.cpp new file mode 100644 index 0000000000..9604d045ba --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.cpp @@ -0,0 +1,329 @@ +/* + * SoftwareSerial.cpp (formerly NewSoftSerial.cpp) + * + * Multi-instance software serial library for Arduino/Wiring + * -- Interrupt-driven receive and other improvements by ladyada + * (http://ladyada.net) + * -- Tuning, circular buffer, derivation from class Print/Stream, + * multi-instance support, porting to 8MHz processors, + * various optimizations, PROGMEM delay tables, inverse logic and + * direct port writing by Mikal Hart (http://www.arduiniana.org) + * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) + * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * The latest version of this library can always be found at + * http://arduiniana.org. + */ + +#ifdef TARGET_LPC1768 + +// +// Includes +// +//#include +#include "../../inc/MarlinConfig.h" +#include "../Delay.h" +#include +#include +#include +#include +#include "fastio.h" +#include "SoftwareSerial.h" + +void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); +void GpioDisableInt(uint32_t port, uint32_t pin); +// +// Statics +// +SoftwareSerial *SoftwareSerial::active_object = 0; +unsigned char SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF]; +volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0; +volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; + +typedef struct _DELAY_TABLE { + long baud; + uint16_t rx_delay_centering; + uint16_t rx_delay_intrabit; + uint16_t rx_delay_stopbit; + uint16_t tx_delay; +} DELAY_TABLE; + +// rough delay estimation +static const DELAY_TABLE table[] = { + //baud |rxcenter|rxintra |rxstop |tx { 250000, 2, 4, 4, 4, }, //Done but not good due to instruction cycle error { 115200, 4, 8, 8, 8, }, //Done but not good due to instruction cycle error + //{ 74880, 69, 139, 62, 162, }, // estimation + //{ 57600, 100, 185, 1, 208, }, // Done but not good due to instruction cycle error + //{ 38400, 13, 26, 26, 26, }, // Done + //{ 19200, 26, 52, 52, 52, }, // Done { 9600, 52, 104, 104, 104, }, // Done + //{ 4800, 104, 208, 208, 208, }, + //{ 2400, 208, 417, 417, 417, }, + //{ 1200, 416, 833, 833, 833,}, +}; + +// +// Private methods +// + +inline void SoftwareSerial::tunedDelay(const uint32_t count) { + DELAY_US(count); +} + +// This function sets the current object as the "listening" +// one and returns true if it replaces another +bool SoftwareSerial::listen() { + if (!_rx_delay_stopbit) + return false; + + if (active_object != this) { + if (active_object) + active_object->stopListening(); + + _buffer_overflow = false; + _receive_buffer_head = _receive_buffer_tail = 0; + active_object = this; + + setRxIntMsk(true); + return true; + } + + return false; +} + +// Stop listening. Returns true if we were actually listening. +bool SoftwareSerial::stopListening() { + if (active_object == this) { + setRxIntMsk(false); + active_object = NULL; + return true; + } + return false; +} + +// +// The receive routine called by the interrupt handler +// +void SoftwareSerial::recv() { + uint8_t d = 0; + + // If RX line is high, then we don't see any start bit + // so interrupt is probably not for us + if (_inverse_logic ? rx_pin_read() : !rx_pin_read()) { + // Disable further interrupts during reception, this prevents + // triggering another interrupt directly after we return, which can + // cause problems at higher baudrates. + setRxIntMsk(false);//__disable_irq();// + + // Wait approximately 1/2 of a bit width to "center" the sample + tunedDelay(_rx_delay_centering); + // Read each of the 8 bits + for (uint8_t i=8; i > 0; --i) { + tunedDelay(_rx_delay_intrabit); + d >>= 1; + if (rx_pin_read()) d |= 0x80; + } + + if (_inverse_logic) d = ~d; + + // if buffer full, set the overflow flag and return + uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; + if (next != _receive_buffer_head) { + // save new data in buffer: tail points to where byte goes + _receive_buffer[_receive_buffer_tail] = d; // save new byte + _receive_buffer_tail = next; + } + else { + _buffer_overflow = true; + } + tunedDelay(_rx_delay_stopbit); + // Re-enable interrupts when we're sure to be inside the stop bit + setRxIntMsk(true); //__enable_irq();// + } +} + +uint32_t SoftwareSerial::rx_pin_read() { + return digitalRead(_receivePin); +} + +// +// Interrupt handling +// + +/* static */ +inline void SoftwareSerial::handle_interrupt() { + if (active_object) + active_object->recv(); +} +extern "C" void intWrapper() { + SoftwareSerial::handle_interrupt(); +} +// +// Constructor +// +SoftwareSerial::SoftwareSerial(pin_t receivePin, pin_t transmitPin, bool inverse_logic /* = false */) : + _rx_delay_centering(0), + _rx_delay_intrabit(0), + _rx_delay_stopbit(0), + _tx_delay(0), + _buffer_overflow(false), + _inverse_logic(inverse_logic) { + setTX(transmitPin); + setRX(receivePin); +} + +// +// Destructor +// +SoftwareSerial::~SoftwareSerial() { + end(); +} + +void SoftwareSerial::setTX(pin_t tx) { + // First write, then set output. If we do this the other way around, + // the pin would be output low for a short while before switching to + // output hihg. Now, it is input with pullup for a short while, which + // is fine. With inverse logic, either order is fine. + + digitalWrite(tx, _inverse_logic ? LOW : HIGH); + pinMode(tx,OUTPUT); + _transmitPin = tx; +} + +void SoftwareSerial::setRX(pin_t rx) { + pinMode(rx, INPUT_PULLUP); // pullup for normal logic! + //if (!_inverse_logic) + // digitalWrite(rx, HIGH); + _receivePin = rx; + _receivePort = LPC1768_PIN_PORT(rx); + _receivePortPin = LPC1768_PIN_PIN(rx); + /* GPIO_T * rxPort = digitalPinToPort(rx); + _receivePortRegister = portInputRegister(rxPort); + _receiveBitMask = digitalPinToBitMask(rx);*/ +} + +// +// Public methods +// + +void SoftwareSerial::begin(long speed) { + _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; + + for(uint8_t i = 0; i < sizeof(table)/sizeof(table[0]); ++i) { + long baud = table[i].baud; + if (baud == speed) { + _rx_delay_centering = table[i].rx_delay_centering; + _rx_delay_intrabit = table[i].rx_delay_intrabit; + _rx_delay_stopbit = table[i].rx_delay_stopbit; + _tx_delay = table[i].tx_delay; + break; + } + } + + attachInterrupt(_receivePin, intWrapper, CHANGE); //this->handle_interrupt, CHANGE); + + listen(); + tunedDelay(_tx_delay); + +} + +void SoftwareSerial::setRxIntMsk(bool enable) { + if (enable) + GpioEnableInt(_receivePort,_receivePin,CHANGE); + else + GpioDisableInt(_receivePort,_receivePin); +} + +void SoftwareSerial::end() { + stopListening(); +} + + +// Read data from buffer +int SoftwareSerial::read() { + if (!isListening()) return -1; + + // Empty buffer? + if (_receive_buffer_head == _receive_buffer_tail) return -1; + + // Read from "head" + uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte + _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF; + return d; +} + +int SoftwareSerial::available() { + if (!isListening()) return 0; + + return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF; +} + +size_t SoftwareSerial::write(uint8_t b) { + // By declaring these as local variables, the compiler will put them + // in registers _before_ disabling interrupts and entering the + // critical timing sections below, which makes it a lot easier to + // verify the cycle timings + + bool inv = _inverse_logic; + uint16_t delay = _tx_delay; + + if (inv) b = ~b; + + cli(); // turn off interrupts for a clean txmit + + // Write the start bit + digitalWrite(_transmitPin, !!inv); + + tunedDelay(delay); + + // Write each of the 8 bits + for (uint8_t i = 8; i > 0; --i) { + digitalWrite(_transmitPin, b & 1); // send 1 //(GPIO_Desc[_transmitPin].P)->DOUT |= GPIO_Desc[_transmitPin].bit; + // send 0 //(GPIO_Desc[_transmitPin].P)->DOUT &= ~GPIO_Desc[_transmitPin].bit; + tunedDelay(delay); + b >>= 1; + } + + // restore pin to natural state + digitalWrite(_transmitPin, !inv); + + sei(); // turn interrupts back on + tunedDelay(delay); + + return 1; +} + +void SoftwareSerial::flush() { + if (!isListening()) return; + + cli(); + _receive_buffer_head = _receive_buffer_tail = 0; + sei(); +} + +int SoftwareSerial::peek() { + if (!isListening()) + return -1; + + // Empty buffer? + if (_receive_buffer_head == _receive_buffer_tail) + return -1; + + // Read from "head" + return _receive_buffer[_receive_buffer_head]; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.h b/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.h new file mode 100644 index 0000000000..93df76b53a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSerial.h @@ -0,0 +1,120 @@ +/* + * SoftwareSerial.h (formerly NewSoftSerial.h) + * + * Multi-instance software serial library for Arduino/Wiring + * -- Interrupt-driven receive and other improvements by ladyada + * (http://ladyada.net) + * -- Tuning, circular buffer, derivation from class Print/Stream, + * multi-instance support, porting to 8MHz processors, + * various optimizations, PROGMEM delay tables, inverse logic and + * direct port writing by Mikal Hart (http://www.arduiniana.org) + * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) + * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * The latest version of this library can always be found at + * http://arduiniana.org. + */ + +#ifndef SOFTWARESERIAL_H +#define SOFTWARESERIAL_H + +#include +#include +//#include "serial.h" +#include +#include + +/****************************************************************************** +* Definitions +******************************************************************************/ + +#define _SS_MAX_RX_BUFF 64 // RX buffer size + +class SoftwareSerial : public Stream +{ +private: + // per object data + pin_t _receivePin; + pin_t _transmitPin; +// uint32_t _receiveBitMask; // for rx interrupts + uint32_t _receivePort; + uint32_t _receivePortPin; + + + // Expressed as 4-cycle delays (must never be 0!) + uint16_t _rx_delay_centering; + uint16_t _rx_delay_intrabit; + uint16_t _rx_delay_stopbit; + uint16_t _tx_delay; + + uint16_t _buffer_overflow:1; + uint16_t _inverse_logic:1; + + // static data + static unsigned char _receive_buffer[_SS_MAX_RX_BUFF]; + static volatile uint8_t _receive_buffer_tail; + static volatile uint8_t _receive_buffer_head; + static SoftwareSerial *active_object; + + // private methods + void recv(); + uint32_t rx_pin_read(); + void tx_pin_write(uint8_t pin_state); + void setTX(pin_t transmitPin); + void setRX(pin_t receivePin); + void setRxIntMsk(bool enable); + + // private static method for timing + static inline void tunedDelay(uint32_t delay); + +public: + // public methods + + SoftwareSerial(pin_t receivePin, pin_t transmitPin, bool inverse_logic = false); + ~SoftwareSerial(); + void begin(long speed); + bool listen(); + void end(); + bool isListening() { return this == active_object; } + bool stopListening(); + bool overflow() { bool ret = _buffer_overflow; if (ret) _buffer_overflow = false; return ret; } + int peek(); + + virtual size_t write(uint8_t byte); + virtual int read(); + virtual int available(); + virtual void flush(); + operator bool() { return true; } + + using Print::write; + //using HalSerial::write; + + // public only for easy access by interrupt handlers + static inline void handle_interrupt() __attribute__((__always_inline__)); +}; + +// Arduino 0012 workaround +#undef int +#undef char +#undef long +#undef byte +#undef float +#undef abs +#undef round + +#endif // SOFTWARESERIAL_H diff --git a/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp b/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp new file mode 100644 index 0000000000..3bedb71e91 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2011-2012 Arduino. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include +#include +//#include "HAL_timers.h" +#include "fastio.h" + +#define GNUM 31 + +typedef void (*interruptCB)(void); + +static interruptCB callbacksP0[GNUM]; +static interruptCB callbacksP2[GNUM]; + +extern "C" void GpioEnableInt(const uint32_t port, const uint32_t pin, const uint32_t mode); +extern "C" void GpioDisableInt(const uint32_t port, const uint32_t pin); + +//void deadloop(void) {} + +/* Configure PIO interrupt sources */ +static void __initialize() { + for (uint8_t i = 0; i < GNUM; i++) { + callbacksP0[i] = 0; + callbacksP2[i] = 0; + } + NVIC_EnableIRQ(EINT3_IRQn); +} + +void attachInterrupt(const pin_t pin, void (*callback)(void), uint32_t mode) { + static int enabled = 0; + + if (!INTERRUPT_PIN(pin)) return; + + if (!enabled) { + __initialize(); + ++enabled; + } + uint8_t myport = LPC1768_PIN_PORT(pin), + mypin = LPC1768_PIN_PIN(pin); + + if (myport == 0) + callbacksP0[mypin] = callback; + else + callbacksP2[mypin] = callback; + + // Enable interrupt + GpioEnableInt(myport,mypin,mode); +} + +void detachInterrupt(const pin_t pin) { + if (!INTERRUPT_PIN(pin)) return; + + const uint8_t myport = LPC1768_PIN_PORT(pin), + mypin = LPC1768_PIN_PIN(pin); + + // Disable interrupt + GpioDisableInt(myport, mypin); + + // unset callback + if (myport == 0) + callbacksP0[mypin] = 0; + else //if (myport == 2 ) + callbacksP2[mypin] = 0; +} + + +extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode) { + //pin here is the processor pin, not logical pin + if (port == 0) { + LPC_GPIOINT->IO0IntClr = _BV(pin); + if (mode == RISING) { + SBI(LPC_GPIOINT->IO0IntEnR, pin); + CBI(LPC_GPIOINT->IO0IntEnF, pin); + } + else if (mode == FALLING) { + SBI(LPC_GPIOINT->IO0IntEnF, pin); + CBI(LPC_GPIOINT->IO0IntEnR, pin); + } + else if (mode == CHANGE) { + SBI(LPC_GPIOINT->IO0IntEnR, pin); + SBI(LPC_GPIOINT->IO0IntEnF, pin); + } + } + else { + LPC_GPIOINT->IO2IntClr = _BV(pin); + if (mode == RISING) { + SBI(LPC_GPIOINT->IO2IntEnR, pin); + CBI(LPC_GPIOINT->IO2IntEnF, pin); + } + else if (mode == FALLING) { + SBI(LPC_GPIOINT->IO2IntEnF, pin); + CBI(LPC_GPIOINT->IO2IntEnR, pin); + } + else if (mode == CHANGE) { + SBI(LPC_GPIOINT->IO2IntEnR, pin); + SBI(LPC_GPIOINT->IO2IntEnF, pin); + } + } +} + +extern "C" void GpioDisableInt(const uint32_t port, const uint32_t pin) { + if (port == 0) { + CBI(LPC_GPIOINT->IO0IntEnR, pin); + CBI(LPC_GPIOINT->IO0IntEnF, pin); + LPC_GPIOINT->IO0IntClr = _BV(pin); + } + else { + CBI(LPC_GPIOINT->IO2IntEnR, pin); + CBI(LPC_GPIOINT->IO2IntEnF, pin); + LPC_GPIOINT->IO2IntClr = _BV(pin); + } +} + +constexpr bool isPowerOf2(const uint16_t n) { + return IS_POWER_OF_2(n); +} + +#if 0 + extern "C" void EINT3_IRQHandler () { + LPC_GPIOINT->IO0IntClr = LPC_GPIOINT->IO2IntClr = 0xFFFFFFFF; + TOGGLE(13); + //NVIC_ClearPendingIRQ(EINT3_IRQn); + } +#else + + extern "C" void EINT3_IRQHandler(void) { + // Read in all current interrupt registers. We do this once as the + // GPIO interrupt registers are on the APB bus, and this is slow. + uint32_t rise0 = LPC_GPIOINT->IO0IntStatR, + fall0 = LPC_GPIOINT->IO0IntStatF, + rise2 = LPC_GPIOINT->IO2IntStatR, + fall2 = LPC_GPIOINT->IO2IntStatF; + // Clear the interrupts ASAP + LPC_GPIOINT->IO0IntClr = LPC_GPIOINT->IO2IntClr = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(EINT3_IRQn); + + /* multiple pins changes happened.*/ + if (rise0) while (rise0 > 0) { // Continue as long as there are interrupts pending + const uint8_t bitloc = 31 - __CLZ(rise0); //CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt + if (callbacksP0[bitloc] != NULL) callbacksP0[bitloc](); + rise0 -= _BV(bitloc); + } + + if (fall0) while (fall0 > 0) { + const uint8_t bitloc = 31 - __CLZ(fall0); + if (callbacksP0[bitloc] != NULL) callbacksP0[bitloc](); + fall0 -= _BV(bitloc); + } + + if (rise2) while(rise2 > 0) { + const uint8_t bitloc = 31 - __CLZ(rise2); + if (callbacksP2[bitloc] != NULL) callbacksP2[bitloc](); + //LPC_GPIOINT->IO2IntClr = 1 << bitloc; + rise2 -= _BV(bitloc); + } + + if (fall2) while (fall2 > 0) { + const uint8_t bitloc = 31 - __CLZ(fall2); + if (callbacksP2[bitloc] != NULL) callbacksP2[bitloc](); + //LPC_GPIOINT->IO2IntClr = 1 << bitloc; + fall2 -= _BV(bitloc); + } + //NVIC_ClearPendingIRQ(EINT3_IRQn); + //LPC_GPIOINT->IO0IntClr = LPC_GPIOINT->IO2IntClr = 0xFFFFFFFF; + //NVIC_ClearPendingIRQ(EINT3_IRQn); + } + +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/arduino.cpp b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp new file mode 100644 index 0000000000..abdc6b3539 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "LPC1768_PWM.h" +#include + +#include "../../inc/MarlinConfig.h" +#include "../Delay.h" + +// Interrupts +void cli(void) { __disable_irq(); } // Disable +void sei(void) { __enable_irq(); } // Enable + +// Time functions +void _delay_ms(const int delay_ms) { + delay(delay_ms); +} + +uint32_t millis() { + return _millis; +} + +// This is required for some Arduino libraries we are using +void delayMicroseconds(uint32_t us) { + DELAY_US(us); +} + +extern "C" void delay(const int msec) { + volatile millis_t end = _millis + msec; + SysTick->VAL = SysTick->LOAD; // reset systick counter so next systick is in exactly 1ms + // this could extend the time between systicks by upto 1ms + while PENDING(_millis, end) __WFE(); +} + +// IO functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode(const pin_t pin, const uint8_t mode) { + if (!VALID_PIN(pin)) return; + + PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), + LPC1768_PIN_PIN(pin), + PINSEL_FUNC_0, + PINSEL_PINMODE_TRISTATE, + PINSEL_PINMODE_NORMAL }; + switch (mode) { + case INPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + break; + case OUTPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); + break; + case INPUT_PULLUP: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLUP; + break; + case INPUT_PULLDOWN: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLDOWN; + break; + default: return; + } + PINSEL_ConfigPin(&config); +} + +void digitalWrite(pin_t pin, uint8_t pin_status) { + if (!VALID_PIN(pin)) return; + + if (pin_status) + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); + else + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); + + pinMode(pin, OUTPUT); // Set pin mode on every write (Arduino version does this) + + /** + * Must be done AFTER the output state is set. Doing this before will cause a + * 2uS glitch if writing a "1". + * + * When the Port Direction bit is written to a "1" the output is immediately set + * to the value of the FIOPIN bit which is "0" because of power up defaults. + */ +} + +bool digitalRead(pin_t pin) { + if (!VALID_PIN(pin)) return false; + + return LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; +} + +void analogWrite(pin_t pin, int pwm_value) { // 1 - 254: pwm_value, 0: LOW, 255: HIGH + if (!VALID_PIN(pin)) return; + + #define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up + + static bool out_of_PWM_slots = false; + + uint value = MAX(MIN(pwm_value, 255), 0); + if (value == 0 || value == 255) { // treat as digital pin + LPC1768_PWM_detach_pin(pin); // turn off PWM + digitalWrite(pin, value); + } + else { + if (LPC1768_PWM_attach_pin(pin, 1, LPC_PWM1->MR0, 0xFF)) + LPC1768_PWM_write(pin, map(value, 0, 255, 1, LPC_PWM1->MR0)); // map 1-254 onto PWM range + else { // out of PWM channels + if (!out_of_PWM_slots) SERIAL_ECHOPGM(".\nWARNING - OUT OF PWM CHANNELS\n.\n"); //only warn once + out_of_PWM_slots = true; + digitalWrite(pin, value); // treat as a digital pin if out of channels + } + } +} + +extern bool HAL_adc_finished(); + +uint16_t analogRead(pin_t adc_pin) { + HAL_adc_start_conversion(adc_pin); + while (!HAL_adc_finished()); // Wait for conversion to finish + return HAL_adc_get_result(); +} + +// ************************** +// Persistent Config Storage +// ************************** + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + +} + +unsigned char eeprom_read_byte(uint8_t * pos) { return '\0'; } + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { } + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { } + +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s) { + char format_string[20]; + snprintf(format_string, 20, "%%%d.%df", __width, __prec); + sprintf(__s, format_string, __val); + return __s; +} + +int32_t random(int32_t max) { + return rand() % max; +} + +int32_t random(int32_t min, int32_t max) { + return min + rand() % (max - min); +} + +void randomSeed(uint32_t value) { + srand(value); +} + +int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py new file mode 100644 index 0000000000..ae53adea0a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py @@ -0,0 +1,21 @@ +Import("env") + +env.AddPostAction( + "$BUILD_DIR/firmware.hex", + env.VerboseAction(" ".join([ + "sed", "-i.bak", + "s/:10040000FFFFFFFFFFFFFFFFFFFFFFFFDEF9FFFF23/:10040000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFD/", + "$BUILD_DIR/firmware.hex" + ]), "Fixing $BUILD_DIR/firmware.hex secure flash flags")) +env.AddPreAction( + "upload", + env.VerboseAction(" ".join([ + "echo", + "'h\\nloadfile $BUILD_DIR/firmware.hex\\nr\\nq\\n'", + ">$BUILD_DIR/aux.jlink" + ]), "Creating auxiliary files")) + +env.Replace( + UPLOADHEXCMD= + 'JLinkExe -device MK20DX256xxx7 -speed 4000 -if swd -autoconnect 1 -CommanderScript $BUILD_DIR/aux.jlink -SkipProgOnCRCMatch = 1 -VerifyDownload = 1' +) diff --git a/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h new file mode 100644 index 0000000000..25da1f95fa --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h @@ -0,0 +1,78 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +//Currently this is untested and broken +#error "Please disable Endstop Interrupts LPC176x is currently an unsupported platform" + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/fastio.h b/Marlin/src/HAL/HAL_LPC1768/fastio.h new file mode 100644 index 0000000000..891cbde6fb --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/fastio.h @@ -0,0 +1,141 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O Routines for LPC1768/9 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions LPC1768 + * + * For TARGET LPC1768 + */ + +#ifndef _FASTIO_LPC1768_H +#define _FASTIO_LPC1768_H + +#include +#include +#include + +bool useable_hardware_PWM(pin_t pin); +#define USEABLE_HARDWARE_PWM(pin) useable_hardware_PWM(pin) + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +#define SET_DIR_INPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(IO))) +#define SET_DIR_OUTPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(IO))) + +#define SET_MODE(IO, mode) (pin_mode((LPC1768_PIN_PORT(IO), LPC1768_PIN_PIN(IO)), mode)) + +#define WRITE_PIN_SET(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(IO))) +#define WRITE_PIN_CLR(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(IO))) + +#define READ_PIN(IO) ((LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(IO))) ? 1 : 0) +#define WRITE_PIN(IO,V) ((V) ? WRITE_PIN_SET(IO) : WRITE_PIN_CLR(IO)) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +/// Read a pin +#define _READ(IO) READ_PIN(IO) + +/// Write to a pin +#define _WRITE_VAR(IO,V) digitalWrite(IO,V) + +#define _WRITE(IO,V) WRITE_PIN(IO,V) + +/// toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +/// set pin as input +#define _SET_INPUT(IO) SET_DIR_INPUT(IO) + +/// set pin as output +#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) + +/// set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +/// set pin as input with pulldown mode +#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) + +// hg42: all pins can be input or output (I hope) +// hg42: undefined pins create compile error (IO, is no pin) +// hg42: currently not used, but was used by pinsDebug + +/// check if pin is an input +#define _GET_INPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) + +/// check if pin is an output +#define _GET_OUTPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) + +// hg42: GET_TIMER is used only to check if it's a PWM pin +// hg42: we cannot use USEABLE_HARDWARE_PWM because it uses a function that cannot be used statically +// hg42: instead use PWM bit from the #define + +/// check if pin is a timer +#define _GET_TIMER(IO) TRUE // could be LPC1768_PIN_PWM(IO), but there +// hg42: could be this: +// #define _GET_TIMER(IO) LPC1768_PIN_PWM(IO) +// but this is an incomplete check (12 pins are PWMable, but only 6 can be used at the same time) + +/// Read a pin wrapper +#define READ(IO) _READ(IO) + +/// Write to a pin wrapper +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) + +/// toggle a pin wrapper +#define TOGGLE(IO) _TOGGLE(IO) + +/// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) +/// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +/// set pin as input with pulldown wrapper +#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) +/// set pin as output wrapper - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) + +/// check if pin is an input wrapper +#define GET_INPUT(IO) _GET_INPUT(IO) +/// check if pin is an output wrapper +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +/// check if pin is a timer (wrapper) +#define GET_TIMER(IO) _GET_TIMER(IO) + +// Shorthand +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#endif // _FASTIO_LPC1768_H diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h new file mode 100644 index 0000000000..5f0d5f57cd --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h @@ -0,0 +1,127 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __ARDUINO_H__ +#define __ARDUINO_H__ +#include +#include +#include + +#include + +#define HIGH 0x01 +#define LOW 0x00 + +#define INPUT 0x00 +#define OUTPUT 0x01 +#define INPUT_PULLUP 0x02 +#define INPUT_PULLDOWN 0x03 + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#define CHANGE 0x02 +#define FALLING 0x03 +#define RISING 0x04 + +#define E2END 0xFFF // EEPROM end address + +typedef uint8_t byte; +#define PROGMEM +#define PSTR(v) (v) +#define PGM_P const char * + +// Used for libraries, preprocessor, and constants +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) +#define abs(x) ((x)>0?(x):-(x)) + +#ifndef isnan + #define isnan std::isnan +#endif +#ifndef isinf + #define isinf std::isinf +#endif + +#define sq(v) ((v) * (v)) +#define square(v) sq(v) +#define constrain(value, arg_min, arg_max) ((value) < (arg_min) ? (arg_min) :((value) > (arg_max) ? (arg_max) : (value))) + +//Interrupts +void cli(void); // Disable +void sei(void); // Enable +void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode); +void detachInterrupt(uint32_t pin); +extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); +extern "C" void GpioDisableInt(uint32_t port, uint32_t pin); + +// Program Memory +#define pgm_read_ptr(addr) (*((void**)(addr))) +#define pgm_read_byte_near(addr) (*((uint8_t*)(addr))) +#define pgm_read_float_near(addr) (*((float*)(addr))) +#define pgm_read_word_near(addr) (*((uint16_t*)(addr))) +#define pgm_read_dword_near(addr) (*((uint32_t*)(addr))) +#define pgm_read_byte(addr) pgm_read_byte_near(addr) +#define pgm_read_float(addr) pgm_read_float_near(addr) +#define pgm_read_word(addr) pgm_read_word_near(addr) +#define pgm_read_dword(addr) pgm_read_dword_near(addr) + +#define memcpy_P memcpy +#define sprintf_P sprintf +#define strstr_P strstr +#define strncpy_P strncpy +#define vsnprintf_P vsnprintf +#define strcpy_P strcpy +#define snprintf_P snprintf +#define strlen_P strlen +#define strchr_P strchr + +// Time functions +extern "C" { + void delay(const int milis); +} +void _delay_ms(const int delay); +void delayMicroseconds(unsigned long); +uint32_t millis(); + +//IO functions +void pinMode(const pin_t, const uint8_t); +void digitalWrite(pin_t, uint8_t); +bool digitalRead(pin_t); +void analogWrite(pin_t, int); +uint16_t analogRead(pin_t); + +// EEPROM +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +int32_t random(int32_t); +int32_t random(int32_t, int32_t); +void randomSeed(uint32_t); + +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s); + +int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max); + +#endif // __ARDUINO_DEF_H__ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/SPI.h b/Marlin/src/HAL/HAL_LPC1768/include/SPI.h new file mode 100644 index 0000000000..7de136633c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/SPI.h @@ -0,0 +1,46 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#pragma once + +#include "../../HAL_SPI.h" + +#include + +#define MSBFIRST 1 +#define SPI_MODE3 0 + +class SPISettings { + public: + SPISettings(int a, int b, int c) {}; +}; + +class SPIClass { + public: + void begin(); + void beginTransaction(SPISettings foo) {}; + void endTransaction() {}; + uint8_t transfer(uint8_t data); + uint16_t transfer16(uint16_t data); +}; + +extern SPIClass SPI; diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp b/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp new file mode 100644 index 0000000000..28e1fa9b56 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp @@ -0,0 +1,219 @@ +/* + TwoWire.cpp - TWI/I2C library for Wiring & Arduino + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef TARGET_LPC1768 + +extern "C" { + #include + #include + #include + #include + #include + #include +} + +#include + +#define USEDI2CDEV_M 1 + +#if (USEDI2CDEV_M == 0) + #define I2CDEV_M LPC_I2C0 +#elif (USEDI2CDEV_M == 1) + #define I2CDEV_M LPC_I2C1 +#elif (USEDI2CDEV_M == 2) + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +// Initialize Class Variables ////////////////////////////////////////////////// + +uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::rxBufferIndex = 0; +uint8_t TwoWire::rxBufferLength = 0; + +uint8_t TwoWire::txAddress = 0; +uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::txBufferIndex = 0; +uint8_t TwoWire::txBufferLength = 0; + +uint8_t TwoWire::transmitting = 0; + +// Constructors //////////////////////////////////////////////////////////////// + +TwoWire::TwoWire() { +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void TwoWire::begin(void) { + rxBufferIndex = 0; + rxBufferLength = 0; + + txBufferIndex = 0; + txBufferLength = 0; + + /* + * Init I2C pin connect + */ + PINSEL_CFG_Type PinCfg; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + + #if USEDI2CDEV_M == 0 + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #endif + + #if USEDI2CDEV_M == 1 + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #endif + + #if USEDI2CDEV_M == 2 + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, 100000); + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { + // clamp to buffer length + if (quantity > BUFFER_LENGTH) + quantity = BUFFER_LENGTH; + + // perform blocking read into buffer + I2C_M_SETUP_Type transferMCfg; + transferMCfg.sl_addr7bit = address >> 1; // not sure about the right shift + transferMCfg.tx_data = NULL; + transferMCfg.tx_length = 0; + transferMCfg.rx_data = rxBuffer; + transferMCfg.rx_length = quantity; + transferMCfg.retransmissions_max = 3; + I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_POLLING); + + // set rx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = transferMCfg.rx_count; + + return transferMCfg.rx_count; +} + +uint8_t TwoWire::requestFrom(int address, int quantity) { + return requestFrom((uint8_t)address, (uint8_t)quantity); +} + +void TwoWire::beginTransmission(uint8_t address) { + // indicate that we are transmitting + transmitting = 1; + // set address of targeted slave + txAddress = address; + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; +} + +void TwoWire::beginTransmission(int address) { + beginTransmission((uint8_t)address); +} + +uint8_t TwoWire::endTransmission(void) { + // transmit buffer (blocking) + I2C_M_SETUP_Type transferMCfg; + transferMCfg.sl_addr7bit = txAddress >> 1; // not sure about the right shift + transferMCfg.tx_data = txBuffer; + transferMCfg.tx_length = txBufferLength; + transferMCfg.rx_data = NULL; + transferMCfg.rx_length = 0; + transferMCfg.retransmissions_max = 3; + Status status = I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_POLLING); + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + // indicate that we are done transmitting + transmitting = 0; + + return status == SUCCESS ? 0 : 4; +} + +// must be called after beginTransmission(address) +size_t TwoWire::write(uint8_t data) { + if (transmitting) { + // don't bother if buffer is full + if (txBufferLength >= BUFFER_LENGTH) return 0; + + // put byte in tx buffer + txBuffer[txBufferIndex++] = data; + + // update amount in buffer + txBufferLength = txBufferIndex; + } + + return 1; +} + +// must be called after beginTransmission(address) +size_t TwoWire::write(const uint8_t *data, size_t quantity) { + size_t sent = 0; + if (transmitting) + for (sent = 0; sent < quantity; ++sent) + if (!write(data[sent])) break; + + return sent; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::read(void) { + return rxBufferIndex < rxBufferLength ? rxBuffer[rxBufferIndex++] : -1; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::peek(void) { + return rxBufferIndex < rxBufferLength ? rxBuffer[rxBufferIndex] : -1; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +TwoWire Wire = TwoWire(); + +#endif // TARGET_LPC1768 \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Wire.h b/Marlin/src/HAL/HAL_LPC1768/include/Wire.h new file mode 100644 index 0000000000..b833d699e4 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/Wire.h @@ -0,0 +1,67 @@ +/** + * TwoWire.h - TWI/I2C library for Arduino & Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts + */ + +#ifndef _TWOWIRE_H_ +#define _TWOWIRE_H_ + +#include + +#define BUFFER_LENGTH 32 + +class TwoWire { + private: + static uint8_t rxBuffer[]; + static uint8_t rxBufferIndex; + static uint8_t rxBufferLength; + + static uint8_t txAddress; + static uint8_t txBuffer[]; + static uint8_t txBufferIndex; + static uint8_t txBufferLength; + + static uint8_t transmitting; + + public: + TwoWire(); + void begin(); + void beginTransmission(uint8_t); + void beginTransmission(int); + uint8_t endTransmission(void); + uint8_t endTransmission(uint8_t); + + uint8_t requestFrom(uint8_t, uint8_t); + uint8_t requestFrom(int, int); + + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *, size_t); + virtual int available(void); + virtual int read(void); + virtual int peek(void); + + inline size_t write(unsigned long n) { return write((uint8_t)n); } + inline size_t write(long n) { return write((uint8_t)n); } + inline size_t write(unsigned int n) { return write((uint8_t)n); } + inline size_t write(int n) { return write((uint8_t)n); } +}; + +extern TwoWire Wire; + +#endif // _TWOWIRE_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c new file mode 100644 index 0000000000..3c2bb87c4c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#include "../../../inc/MarlinConfigPre.h" + +#if MB(MKS_SBASE) + +#include "digipot_mcp4451_I2C_routines.h" + +#ifdef __cplusplus + extern "C" { +#endif + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop(LPC_I2C_TypeDef *I2Cx) { + // Make sure start bit is not active + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +PINSEL_CFG_Type PinCfg; +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +uint8_t digipot_mcp4451_start(uint8_t sla) { // send slave address and write bit + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do { + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = (sla << 1) & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)) { /* wait for slaw to finish */ } + } while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +void digipot_mcp4451_init(void) { + /** + * Init I2C pin connect + */ + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + #if USEDI2CDEV_M == 0 + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #elif USEDI2CDEV_M == 1 + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #elif USEDI2CDEV_M == 2 + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, 400000); // hardwired to 400KHz bit rate, 100KHz is the other option + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); +} + +uint8_t digipot_mcp4451_send_byte(uint8_t data) { + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while (I2C_status != I2C_I2STAT_M_TX_DAT_ACK && I2C_status != I2C_I2STAT_M_TX_DAT_NACK); // wait for xmit to finish + return 1; +} + +#ifdef __cplusplus + } +#endif + +#endif // MB(MKS_SBASE) diff --git a/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h new file mode 100644 index 0000000000..e44e155a40 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifndef _DIGIPOT_MCP4451_I2C_ROUTINES_H_ +#define _DIGIPOT_MCP4451_I2C_ROUTINES_H_ + +#define USEDI2CDEV_M 1 // use I2C1 controller + +#if USEDI2CDEV_M == 0 + #define I2CDEV_M LPC_I2C0 +#elif USEDI2CDEV_M == 1 + #define I2CDEV_M LPC_I2C1 +#elif USEDI2CDEV_M == 2 + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include + +uint8_t digipot_mcp4451_start(uint8_t sla); +void digipot_mcp4451_init(void); +uint8_t digipot_mcp4451_send_byte(uint8_t data); + +#ifdef __cplusplus + } +#endif + +#endif // _DIGIPOT_MCP4451_I2C_ROUTINES_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp new file mode 100644 index 0000000000..f05fa00ace --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include + +#include "../../../gcode/parser.h" + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p) { + return (WITHIN(p, 0, NUM_ANALOG_INPUTS) ? adc_pin_table[p] : P_NC); +} + +// Return the index of a pin number +// The pin number given here is in the form ppp:nnnnn +int16_t GET_PIN_MAP_INDEX(const pin_t pin) { + const uint16_t index = (LPC1768_PIN_PORT(pin) << 5) | LPC1768_PIN_PIN(pin); + return (index < NUM_DIGITAL_PINS && pin_map[index] != P_NC) ? index : -1; +} + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p) { + const int16_t ind = GET_PIN_MAP_INDEX(p); + return ind >= 0 && pin_map[ind] >= 0; +} + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p) { + return (VALID_PIN(p) ? LPC1768_PIN_ADC(p) : -1); +} + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p) { + return VALID_PIN(p) && LPC1768_PIN_PWM(p); +} + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p) { + return VALID_PIN(p) && LPC1768_PIN_INTERRUPT(p); +} + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind) { + return WITHIN(ind, 0, NUM_DIGITAL_PINS - 1) ? pin_map[ind] : P_NC; +} + +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { + const uint16_t val = (uint16_t)parser.intval(code), port = val / 100, pin = val % 100; + const int16_t ind = (port < (NUM_DIGITAL_PINS >> 5) && (pin < 32)) + ? GET_PIN_MAP_INDEX(port << 5 | pin) : -2; + return ind > -2 ? ind : dval; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h new file mode 100644 index 0000000000..11fdf5cc3a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h @@ -0,0 +1,293 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _PINMAPPING_H_ +#define _PINMAPPING_H_ + +#include "../../../inc/MarlinConfigPre.h" + +#include + +typedef int16_t pin_t; + +#define PORT_0 000 +#define PORT_1 001 +#define PORT_2 010 +#define PORT_3 011 +#define PORT_4 100 + +#define PORT_(p) PORT_##p +#define PORT(p) PORT_(p) + +#define PIN_0 00000 +#define PIN_1 00001 +#define PIN_2 00010 +#define PIN_3 00011 +#define PIN_4 00100 +#define PIN_5 00101 +#define PIN_6 00110 +#define PIN_7 00111 +#define PIN_8 01000 +#define PIN_9 01001 +#define PIN_10 01010 +#define PIN_11 01011 +#define PIN_12 01100 +#define PIN_13 01101 +#define PIN_14 01110 +#define PIN_15 01111 +#define PIN_16 10000 +#define PIN_17 10001 +#define PIN_18 10010 +#define PIN_19 10011 +#define PIN_20 10100 +#define PIN_21 10101 +#define PIN_22 10110 +#define PIN_23 10111 +#define PIN_24 11000 +#define PIN_25 11001 +#define PIN_26 11010 +#define PIN_27 11011 +#define PIN_28 11100 +#define PIN_29 11101 +#define PIN_30 11110 +#define PIN_31 11111 + +#define PIN_(p) PIN_##p +#define PIN(p) PIN_(p) + +#define ADC_NONE 0000 +#define ADC_CHAN_0 0001 +#define ADC_CHAN_1 0010 +#define ADC_CHAN_2 0011 +#define ADC_CHAN_3 0100 +#define ADC_CHAN_4 0101 +#define ADC_CHAN_5 0110 +#define ADC_CHAN_6 0111 +#define ADC_CHAN_7 1000 + +#define ADC_CHAN_(c) ADC_CHAN_##c +#define ADC_CHAN(p) ADC_CHAN_(p) + +#define BOOL_0 0 +#define BOOL_1 1 +#define BOOL_(b) BOOL_##b + +#define INTERRUPT(b) BOOL_(b) +#define PWM(b) BOOL_(b) + +// Combine elements into pin bits: 0b00AAAAWIPPPNNNNN +#define LPC1768_PIN_(port, pin, int, pwm, adc) 0b00##adc##pwm##int##port##pin +#define LPC1768_PIN(port, pin, int, pwm, adc) LPC1768_PIN_(port, pin, int, pwm, adc) + +constexpr uint8_t LPC1768_PIN_PORT(const pin_t pin) { return ((uint8_t)((pin >> 5) & 0b111)); } +constexpr uint8_t LPC1768_PIN_PIN(const pin_t pin) { return ((uint8_t)(pin & 0b11111)); } +constexpr bool LPC1768_PIN_INTERRUPT(const pin_t pin) { return (((pin >> 8) & 0b1) != 0); } +constexpr bool LPC1768_PIN_PWM(const pin_t pin) { return (((pin >> 9) & 0b1) != 0); } +constexpr int8_t LPC1768_PIN_ADC(const pin_t pin) { return (int8_t)((pin >> 10) & 0b1111) - 1; } + +// ****************** +// Runtime pinmapping +// ****************** +#define P_NC -1 + +#if SERIAL_PORT != 3 && SERIAL_PORT_2 != 3 + #define P0_00 LPC1768_PIN(PORT(0), PIN( 0), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_01 LPC1768_PIN(PORT(0), PIN( 1), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define P0_02 LPC1768_PIN(PORT(0), PIN( 2), INTERRUPT(1), PWM(0), ADC_CHAN(7)) + #define P0_03 LPC1768_PIN(PORT(0), PIN( 3), INTERRUPT(1), PWM(0), ADC_CHAN(6)) +#endif +#define P0_04 LPC1768_PIN(PORT(0), PIN( 4), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_05 LPC1768_PIN(PORT(0), PIN( 5), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_06 LPC1768_PIN(PORT(0), PIN( 6), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_07 LPC1768_PIN(PORT(0), PIN( 7), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_08 LPC1768_PIN(PORT(0), PIN( 8), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_09 LPC1768_PIN(PORT(0), PIN( 9), INTERRUPT(1), PWM(0), ADC_NONE) +#if SERIAL_PORT != 2 && SERIAL_PORT_2 != 2 + #define P0_10 LPC1768_PIN(PORT(0), PIN(10), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_11 LPC1768_PIN(PORT(0), PIN(11), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#if SERIAL_PORT != 1 && SERIAL_PORT_2 != 1 + #define P0_15 LPC1768_PIN(PORT(0), PIN(15), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_16 LPC1768_PIN(PORT(0), PIN(16), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#define P0_17 LPC1768_PIN(PORT(0), PIN(17), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_18 LPC1768_PIN(PORT(0), PIN(18), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_19 LPC1768_PIN(PORT(0), PIN(19), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_20 LPC1768_PIN(PORT(0), PIN(20), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_21 LPC1768_PIN(PORT(0), PIN(21), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_22 LPC1768_PIN(PORT(0), PIN(22), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_23 LPC1768_PIN(PORT(0), PIN(23), INTERRUPT(1), PWM(0), ADC_CHAN(0)) +#define P0_24 LPC1768_PIN(PORT(0), PIN(24), INTERRUPT(1), PWM(0), ADC_CHAN(1)) +#define P0_25 LPC1768_PIN(PORT(0), PIN(25), INTERRUPT(1), PWM(0), ADC_CHAN(2)) +#define P0_26 LPC1768_PIN(PORT(0), PIN(26), INTERRUPT(1), PWM(0), ADC_CHAN(3)) +#define P0_27 LPC1768_PIN(PORT(0), PIN(27), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_28 LPC1768_PIN(PORT(0), PIN(28), INTERRUPT(1), PWM(0), ADC_NONE) +#if SERIAL_PORT != -1 && SERIAL_PORT_2 != -1 + #define P0_29 LPC1768_PIN(PORT(0), PIN(29), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_30 LPC1768_PIN(PORT(0), PIN(30), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#define P1_00 LPC1768_PIN(PORT(1), PIN( 0), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_01 LPC1768_PIN(PORT(1), PIN( 1), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_04 LPC1768_PIN(PORT(1), PIN( 4), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_08 LPC1768_PIN(PORT(1), PIN( 8), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_09 LPC1768_PIN(PORT(1), PIN( 9), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_10 LPC1768_PIN(PORT(1), PIN(10), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_14 LPC1768_PIN(PORT(1), PIN(14), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_15 LPC1768_PIN(PORT(1), PIN(15), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_16 LPC1768_PIN(PORT(1), PIN(16), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_17 LPC1768_PIN(PORT(1), PIN(17), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_18 LPC1768_PIN(PORT(1), PIN(18), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_19 LPC1768_PIN(PORT(1), PIN(19), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_20 LPC1768_PIN(PORT(1), PIN(20), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_21 LPC1768_PIN(PORT(1), PIN(21), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_22 LPC1768_PIN(PORT(1), PIN(22), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_23 LPC1768_PIN(PORT(1), PIN(23), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_24 LPC1768_PIN(PORT(1), PIN(24), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_25 LPC1768_PIN(PORT(1), PIN(25), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_26 LPC1768_PIN(PORT(1), PIN(26), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_27 LPC1768_PIN(PORT(1), PIN(27), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_28 LPC1768_PIN(PORT(1), PIN(28), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_29 LPC1768_PIN(PORT(1), PIN(29), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_30 LPC1768_PIN(PORT(1), PIN(30), INTERRUPT(0), PWM(0), ADC_CHAN(4)) +#define P1_31 LPC1768_PIN(PORT(1), PIN(31), INTERRUPT(0), PWM(0), ADC_CHAN(5)) +#define P2_00 LPC1768_PIN(PORT(2), PIN( 0), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_01 LPC1768_PIN(PORT(2), PIN( 1), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_02 LPC1768_PIN(PORT(2), PIN( 2), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_03 LPC1768_PIN(PORT(2), PIN( 3), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_04 LPC1768_PIN(PORT(2), PIN( 4), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_05 LPC1768_PIN(PORT(2), PIN( 5), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_06 LPC1768_PIN(PORT(2), PIN( 6), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_07 LPC1768_PIN(PORT(2), PIN( 7), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_08 LPC1768_PIN(PORT(2), PIN( 8), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_09 LPC1768_PIN(PORT(2), PIN( 9), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_10 LPC1768_PIN(PORT(2), PIN(10), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_11 LPC1768_PIN(PORT(2), PIN(11), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_12 LPC1768_PIN(PORT(2), PIN(12), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_13 LPC1768_PIN(PORT(2), PIN(13), INTERRUPT(1), PWM(0), ADC_NONE) +#define P3_25 LPC1768_PIN(PORT(3), PIN(25), INTERRUPT(0), PWM(1), ADC_NONE) +#define P3_26 LPC1768_PIN(PORT(3), PIN(26), INTERRUPT(0), PWM(1), ADC_NONE) +#define P4_28 LPC1768_PIN(PORT(4), PIN(28), INTERRUPT(0), PWM(0), ADC_NONE) +#define P4_29 LPC1768_PIN(PORT(4), PIN(29), INTERRUPT(0), PWM(0), ADC_NONE) + +// Pin index for M43 and M226 +constexpr pin_t pin_map[] = { + #if SERIAL_PORT != 3 && SERIAL_PORT_2 != 3 + P0_00, P0_01, + #else + P_NC, P_NC, + #endif + #if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + P0_02, P0_03, + #else + P_NC, P_NC, + #endif + P0_04, P0_05, P0_06, P0_07, + P0_08, P0_09, + #if SERIAL_PORT != 2 && SERIAL_PORT_2 != 2 + P0_10, P0_11, + #else + P_NC, P_NC, + #endif + P_NC, P_NC, P_NC, + #if SERIAL_PORT != 1 && SERIAL_PORT_2 != 1 + P0_15, + P0_16, + #else + P_NC, + P_NC, + #endif + P0_17, P0_18, P0_19, P0_20, P0_21, P0_22, P0_23, + P0_24, P0_25, P0_26, P0_27, P0_28, + #if SERIAL_PORT != -1 && SERIAL_PORT_2 != -1 + P0_29, P0_30, + #else + P_NC, P_NC, + #endif + P_NC, + + P1_00, P1_01, P_NC, P_NC, P1_04, P_NC, P_NC, P_NC, + P1_08, P1_09, P1_10, P_NC, P_NC, P_NC, P1_14, P1_15, + P1_16, P1_17, P1_18, P1_19, P1_20, P1_21, P1_22, P1_23, + P1_24, P1_25, P1_26, P1_27, P1_28, P1_29, P1_30, P1_31, + + P2_00, P2_01, P2_02, P2_03, P2_04, P2_05, P2_06, P2_07, + P2_08, P2_09, P2_10, P2_11, P2_12, P2_13, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P3_25, P3_26, P_NC, P_NC, P_NC, P_NC, P_NC, + + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P4_28, P4_29, P_NC, P_NC +}; + +constexpr uint8_t NUM_DIGITAL_PINS = COUNT(pin_map); + +constexpr pin_t adc_pin_table[] = { + P0_23, P0_24, P0_25, P0_26, P1_30, P1_31, + #if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + P0_03, P0_02 + #endif +}; + +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define NUM_ANALOG_INPUTS 8 +#else + #define NUM_ANALOG_INPUTS 6 +#endif + +// P0.6 thru P0.9 are for the onboard SD card +#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09 + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p); + +// Return the index of a pin number +// The pin number given here is in the form ppp:nnnnn +int16_t GET_PIN_MAP_INDEX(const pin_t pin); + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p); + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p); + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p); + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p); + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind); + +// Parse a G-code word into a pin index +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); + +#endif // _PINMAPPING_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/serial.h b/Marlin/src/HAL/HAL_LPC1768/include/serial.h new file mode 100644 index 0000000000..fd5c58254c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/serial.h @@ -0,0 +1,207 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _HAL_SERIAL_H_ +#define _HAL_SERIAL_H_ + +#include "../../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../../feature/emergency_parser.h" +#endif + +#include +#include + +/** + * Generic RingBuffer + * T type of the buffer array + * S size of the buffer (must be power of 2) + * + * todo: optimise + */ +template class RingBuffer { +public: + RingBuffer() { index_read = index_write = 0; } + uint32_t available() volatile { return buffer_mask & (index_write - index_read); } + uint32_t free() volatile { return buffer_size - available(); } + bool empty() volatile { return (buffer_mask & index_read) == (buffer_mask & index_write); } + bool full() volatile { return index_read == buffer_mask & (index_write + 1); } + void clear() volatile { index_read = index_write = 0; } + bool peek(T *value) volatile { + if (value == 0 || available() == 0) + return false; + *value = buffer[buffer_mask & index_read]; + return true; + } + int read() volatile { + if ((buffer_mask & index_read) == (buffer_mask & index_write)) return -1; + T val = buffer[buffer_mask & index_read]; + ++index_read; + return val; + } + bool write(T value) volatile { + uint32_t next_head = buffer_mask & (index_write + 1); + if (next_head != index_read) { + buffer[buffer_mask & index_write] = value; + index_write = next_head; + return true; + } + return false; + } + +private: + static const uint32_t buffer_size = S; + static const uint32_t buffer_mask = buffer_size - 1; + volatile T buffer[buffer_size]; + volatile uint32_t index_write; + volatile uint32_t index_read; +}; + +class HalSerial { +public: + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif + + HalSerial() { host_connected = false; } + + void begin(int32_t baud) { + } + + int peek() { + uint8_t value; + return receive_buffer.peek(&value) ? value : -1; + } + + int read() { return receive_buffer.read(); } + + size_t write(char c) { return host_connected ? transmit_buffer.write((uint8_t)c) : 0; } + + operator bool() { return host_connected; } + + uint16_t available() { + return (uint16_t)receive_buffer.available(); + } + + void flush() { receive_buffer.clear(); } + + uint8_t availableForWrite(void){ + return transmit_buffer.free() > 255 ? 255 : (uint8_t)transmit_buffer.free(); + } + + void flushTX(void){ + if (host_connected) + while (transmit_buffer.available()) { /* nada */ } + } + + void printf(const char *format, ...) { + static char buffer[256]; + va_list vArgs; + va_start(vArgs, format); + int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs); + va_end(vArgs); + if (length > 0 && length < 256) { + if (host_connected) { + for (int i = 0; i < length;) { + if (transmit_buffer.write(buffer[i])) { + ++i; + } + } + } + } + } + + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 + + void print_bin(uint32_t value, uint8_t num_digits) { + uint32_t mask = 1 << (num_digits -1); + for (uint8_t i = 0; i < num_digits; i++) { + if (!(i % 4) && i) write(' '); + if (!(i % 16) && i) write(' '); + if (value & mask) write('1'); + else write('0'); + value <<= 1; + } + } + + void print(const char value[]) { printf("%s" , value); } + void print(char value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else if (nbase == DEC ) printf("%d", value); + else printf("%c" , value); + } + void print(unsigned char value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else printf("%u" , value); + } + void print(int value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%d", value); + } + void print(unsigned int value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%u" , value); + } + void print(long value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%ld" , value); + } + void print(unsigned long value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%lu" , value); + } + void print(float value, int round = 6) { printf("%f" , value); } + void print(double value, int round = 6) { printf("%f" , value); } + + void println(const char value[]) { printf("%s\n" , value); } + void println(char value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); } + void println(int value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); } + void println(long value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); } + void println(float value, int round = 6) { printf("%f\n" , value); } + void println(double value, int round = 6) { printf("%f\n" , value); } + void println(void) { print('\n'); } + + volatile RingBuffer receive_buffer; + volatile RingBuffer transmit_buffer; + volatile bool host_connected; +}; + +#endif // _HAL_SERIAL_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py b/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py new file mode 100644 index 0000000000..e66ab4c28f --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py @@ -0,0 +1,58 @@ +from __future__ import print_function +import sys + +#dynamic build flags for generic compile options +if __name__ == "__main__": + args = " ".join([ "-std=gnu11", + "-std=gnu++11", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + + "-fsigned-char", + "-fno-move-loop-invariants", + "-fno-strict-aliasing", + "-fsingle-precision-constant", + + "--specs=nano.specs", + "--specs=nosys.specs", + + # For external libraries + "-IMarlin/src/HAL/HAL_LPC1768/include", + + # For MarlinFirmware/U8glib-HAL + "-IMarlin/src/HAL/HAL_LPC1768/u8g", + + "-MMD", + "-MP", + "-DTARGET_LPC1768" + ]) + + for i in range(1, len(sys.argv)): + args += " " + sys.argv[i] + + print(args) + +# extra script for linker options +else: + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( + ARFLAGS=["rcs"], + + ASFLAGS=["-x", "assembler-with-cpp"], + + CXXFLAGS=[ + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" + ], + LINKFLAGS=[ + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float", + ], + ) diff --git a/Marlin/src/HAL/HAL_LPC1768/main.cpp b/Marlin/src/HAL/HAL_LPC1768/main.cpp new file mode 100644 index 0000000000..1d4dde091e --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/main.cpp @@ -0,0 +1,122 @@ +#ifdef TARGET_LPC1768 + +// --------------------- +// Userspace entry point +// --------------------- +extern void setup(); +extern void loop(); + +extern "C" { +#include +} + +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include +#include +#include +} + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" +#include "fastio.h" +#include "HAL_timers.h" +#include +#include +#include +#include "serial.h" +#include "LPC1768_PWM.h" + +static __INLINE uint32_t SysTick_Config(uint32_t ticks) { + if (ticks > SysTick_LOAD_RELOAD_Msk) + return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(0, 0, 0)); /* set Priority for Cortex-M3 System Interrupts */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +extern "C" { +extern void disk_timerproc(void); +volatile uint32_t _millis; +void SysTick_Handler(void) { + ++_millis; + disk_timerproc(); /* Disk timer process */ +} +} + +// runs after clock init and before global static constructors +extern "C" void SystemPostInit() { + _millis = 0; // initialise the millisecond counter value; + SysTick_Config(SystemCoreClock / 1000); // start millisecond global counter + GPIO_SetDir(4, 1UL << 28, 1); + + for (int i = 0; i < 4; ++i) { + GPIO_SetValue(4, 1UL << 28); + delay(100); + GPIO_ClearValue(4, 1UL << 28); + delay(100); + } +} + +// detect 17x[4-8] (100MHz) or 17x9 (120MHz) +static bool isLPC1769() { + #define IAP_LOCATION 0x1FFF1FF1 + uint32_t command[1]; + uint32_t result[5]; + typedef void (*IAP)(uint32_t*, uint32_t*); + IAP iap = (IAP) IAP_LOCATION; + + command[0] = 54; + iap(command, result); + + return ((result[1] & 0x00100000) != 0); +} + +extern uint32_t MSC_SD_Init(uint8_t pdrv); + +int main(void) { + + (void)MSC_SD_Init(0); + + USB_Init(); // USB Initialization + USB_Connect(TRUE); // USB Connect + + const uint32_t usb_timeout = millis() + 2000; + while (!USB_Configuration && PENDING(millis(), usb_timeout)) { + delay(50); + + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Flash fast while USB initialisation completes + #endif + } + + #if NUM_SERIAL > 0 + MYSERIAL0.begin(BAUDRATE); + #if NUM_SERIAL > 1 + MYSERIAL1.begin(BAUDRATE); + #endif + SERIAL_PRINTF("\n\n%s (%dMhz) UART0 Initialised\n", isLPC1769() ? "LPC1769" : "LPC1768", SystemCoreClock / 1000000); + SERIAL_FLUSHTX(); + #endif + + HAL_timer_init(); + + LPC1768_PWM_init(); + + setup(); + for (;;) loop(); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_LPC1768/persistent_store_impl.cpp new file mode 100644 index 0000000000..c03dceeec6 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/persistent_store_impl.cpp @@ -0,0 +1,170 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../persistent_store_api.h" + +#include "chanfs/diskio.h" +#include "chanfs/ff.h" + +extern uint32_t MSC_Aquire_Lock(); +extern uint32_t MSC_Release_Lock(); + +namespace HAL { +namespace PersistentStore { + +FATFS fat_fs; +FIL eeprom_file; + +bool access_start() { + const char eeprom_erase_value = 0xFF; + MSC_Aquire_Lock(); + if (f_mount(&fat_fs, "", 1)) { + MSC_Release_Lock(); + return false; + } + FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ); + if (res) MSC_Release_Lock(); + + if (res == FR_OK) { + UINT bytes_written; + FSIZE_t file_size = f_size(&eeprom_file); + f_lseek(&eeprom_file, file_size); + while (file_size <= E2END && res == FR_OK) { + res = f_write(&eeprom_file, &eeprom_erase_value, 1, &bytes_written); + file_size++; + } + } + if (res == FR_OK) { + f_lseek(&eeprom_file, 0); + f_sync(&eeprom_file); + } + return res == FR_OK; +} + +bool access_finish() { + f_close(&eeprom_file); + f_unmount(""); + MSC_Release_Lock(); + return true; +} + +// File function return codes for type FRESULT This goes away soon. But it is helpful right now to see +// the different errors the read_data() and write_data() functions are seeing. +// +// typedef enum { +// FR_OK = 0, /* (0) Succeeded */ +// FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ +// FR_INT_ERR, /* (2) Assertion failed */ +// FR_NOT_READY, /* (3) The physical drive cannot work */ +// FR_NO_FILE, /* (4) Could not find the file */ +// FR_NO_PATH, /* (5) Could not find the path */ +// FR_INVALID_NAME, /* (6) The path name format is invalid */ +// FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ +// FR_EXIST, /* (8) Access denied due to prohibited access */ +// FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ +// FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ +// FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ +// FR_NOT_ENABLED, /* (12) The volume has no work area */ +// FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ +// FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ +// FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ +// FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ +// FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ +// FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ +// FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +// } FRESULT; + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + FRESULT s; + UINT bytes_written = 0; + + s = f_lseek(&eeprom_file, pos); + if (s) { + SERIAL_PROTOCOLPAIR(" write_data(", pos); // This extra chit-chat goes away soon. But it is helpful + SERIAL_PROTOCOLPAIR(",", (int)value); // right now to see errors that are happening in the + SERIAL_PROTOCOLPAIR(",", (int)size); // read_data() and write_data() functions + SERIAL_PROTOCOLLNPGM("...)"); + SERIAL_PROTOCOLLNPAIR(" f_lseek()=", (int)s); + return s; + } + + s = f_write(&eeprom_file, (void *)value, size, &bytes_written); + if (s) { + SERIAL_PROTOCOLPAIR(" write_data(", pos); // This extra chit-chat goes away soon. But it is helpful + SERIAL_PROTOCOLPAIR(",", (int)value); // right now to see errors that are happening in the + SERIAL_PROTOCOLPAIR(",", size); // read_data() and write_data() functions + SERIAL_PROTOCOLLNPGM("...)"); + SERIAL_PROTOCOLLNPAIR(" f_write()=", (int)s); + SERIAL_PROTOCOLPAIR(" size=", size); + SERIAL_PROTOCOLLNPAIR("\n bytes_written=", bytes_written); + return s; + } + crc16(crc, value, size); + pos = pos + size; + return (bytes_written != size); // return true for any error +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + UINT bytes_read = 0; + FRESULT s; + s = f_lseek(&eeprom_file, pos); + if (s) { + SERIAL_PROTOCOLPAIR(" read_data(", pos); // This extra chit-chat goes away soon. But it is helpful + SERIAL_PROTOCOLPAIR(",", (int)value); // right now to see errors that are happening in the + SERIAL_PROTOCOLPAIR(",", size); // read_data() and write_data() functions + SERIAL_PROTOCOLLNPGM("...)"); + SERIAL_PROTOCOLLNPAIR(" f_lseek()=", (int)s); + return true; + } + if (writing) { + s = f_read(&eeprom_file, (void *)value, size, &bytes_read); + crc16(crc, value, size); + } + else { + uint8_t temp[size]; + s = f_read(&eeprom_file, (void *)temp, size, &bytes_read); + crc16(crc, temp, size); + } + if (s) { + SERIAL_PROTOCOLPAIR(" read_data(", pos); // This extra chit-chat goes away soon. But it is helpful + SERIAL_PROTOCOLPAIR(",", (int)value); // right now to see errors that are happening in the + SERIAL_PROTOCOLPAIR(",", size); // read_data() and write_data() functions + SERIAL_PROTOCOLLNPGM("...)"); + SERIAL_PROTOCOLLNPAIR(" f_write()=", (int)s); + SERIAL_PROTOCOLPAIR(" size=", size); + SERIAL_PROTOCOLLNPAIR("\n bytes_read=", bytes_read); + return true; + } + pos = pos + size; + return bytes_read != size; // return true for any error +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h b/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h new file mode 100644 index 0000000000..1ee7f44d69 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Support routines for LPC1768 + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define pwm_details(pin) pin = pin // do nothing // print PWM details +#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define digitalRead_mod(p) digitalRead(p) +#define PRINT_PORT(p) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define NAME_FORMAT(p) PSTR("%-##p##s") +#define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%d.%02d"), LPC1768_PIN_PORT(p), LPC1768_PIN_PIN(p)); SERIAL_ECHO(buffer);} while (0) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +// active ADC function/mode/code values for PINSEL registers +constexpr int8_t ADC_pin_mode(pin_t pin) { + return (LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 2 ? 2 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 3 ? 2 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 23 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 24 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 25 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 26 ? 1 : + LPC1768_PIN_PORT(pin) == 1 && LPC1768_PIN_PIN(pin) == 30 ? 3 : + LPC1768_PIN_PORT(pin) == 1 && LPC1768_PIN_PIN(pin) == 31 ? 3 : -1); +} + +int8_t get_pin_mode(pin_t pin) { + if (!VALID_PIN(pin)) return -1; + uint8_t pin_port = LPC1768_PIN_PORT(pin); + uint8_t pin_port_pin = LPC1768_PIN_PIN(pin); + //get appropriate PINSEL register + volatile uint32_t * pinsel_reg = (pin_port == 0 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL0 : + (pin_port == 0) ? &LPC_PINCON->PINSEL1 : + (pin_port == 1 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL2 : + pin_port == 1 ? &LPC_PINCON->PINSEL3 : + pin_port == 2 ? &LPC_PINCON->PINSEL4 : + pin_port == 3 ? &LPC_PINCON->PINSEL7 : &LPC_PINCON->PINSEL9; + uint8_t pinsel_start_bit = pin_port_pin > 15 ? 2 * (pin_port_pin - 16) : 2 * pin_port_pin; + int8_t pin_mode = (int8_t) ((*pinsel_reg >> pinsel_start_bit) & 0x3); + return pin_mode; +} + +bool GET_PINMODE(pin_t pin) { + int8_t pin_mode = get_pin_mode(pin); + if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin + return false; + + uint32_t * FIO_reg[5] PROGMEM = {(uint32_t*) 0x2009C000,(uint32_t*) 0x2009C020,(uint32_t*) 0x2009C040,(uint32_t*) 0x2009C060,(uint32_t*) 0x2009C080}; + return ((*FIO_reg[LPC1768_PIN_PORT(pin)] >> LPC1768_PIN_PIN(pin) & 1) != 0); //input/output state +} + +bool GET_ARRAY_IS_DIGITAL(pin_t pin) { + return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); +} diff --git a/Marlin/src/HAL/HAL_LPC1768/servo_private.h b/Marlin/src/HAL/HAL_LPC1768/servo_private.h new file mode 100644 index 0000000000..451c487d73 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/servo_private.h @@ -0,0 +1,84 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * Based on "servo.h - Interrupt driven Servo library for Arduino using 16 bit timers - + * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + * + * The only modification was to update/delete macros to match the LPC176x. + * + */ + +#ifndef SERVO_PRIVATE_H +#define SERVO_PRIVATE_H + +#include + +// Macros +//values in microseconds +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds + +#define MAX_SERVOS 4 + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + + +// Types + +typedef struct { + uint8_t nbr : 8 ; // a pin number from 0 to 254 (255 signals invalid pin) + uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t; + +typedef struct { + ServoPin_t Pin; + unsigned int pulse_width; // pulse width in microseconds +} ServoInfo_t; + +// Global variables + +extern uint8_t ServoCount; +extern ServoInfo_t servo_info[MAX_SERVOS]; + +#endif // SERVO_PRIVATE_H diff --git a/Marlin/src/HAL/HAL_LPC1768/spi_pins.h b/Marlin/src/HAL/HAL_LPC1768/spi_pins.h new file mode 100644 index 0000000000..841a3f845f --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/spi_pins.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef SPI_PINS_LPC1768_H +#define SPI_PINS_LPC1768_H + +#include "src/core/macros.h" + +#if ENABLED(SDSUPPORT) && ENABLED(DOGLCD) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) + #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently + // needed due to the speed and mode requred for communicating with each device being different. + // This requirement can be removed if the SPI access to these devices is updated to use + // spiBeginTransaction. +#endif + +/** onboard SD card */ +//#define SCK_PIN P0_07 +//#define MISO_PIN P0_08 +//#define MOSI_PIN P0_09 +//#define SS_PIN P0_06 +/** external */ +#ifndef SCK_PIN + #define SCK_PIN P0_15 +#endif +#ifndef MISO_PIN + #define MISO_PIN P0_17 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN P0_18 +#endif +#ifndef SS_PIN + #define SS_PIN P1_23 +#endif +#ifndef SDSS + #define SDSS SS_PIN +#endif + +#endif // SPI_PINS_LPC1768_H diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c new file mode 100644 index 0000000000..80bf5fc633 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c @@ -0,0 +1,172 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifdef TARGET_LPC1768 + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////////////// + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start (LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop (LPC_I2C_TypeDef *I2Cx) { + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +////////////////////////////////////////////////////////////////////////////////////// + +#define U8G_I2C_OPT_FAST 16 // from u8g.h + +#define USEDI2CDEV_M 1 + +#define I2CDEV_S_ADDR 0x78 // from SSD1306 //actual address is 0x3C - shift left 1 with LSB set to 0 to indicate write + +#define BUFFER_SIZE 0x1 // only do single byte transfers with LCDs + +#if (USEDI2CDEV_M == 0) + #define I2CDEV_M LPC_I2C0 +#elif (USEDI2CDEV_M == 1) + #define I2CDEV_M LPC_I2C1 +#elif (USEDI2CDEV_M == 2) + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +PINSEL_CFG_Type PinCfg; +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +uint8_t u8g_i2c_start(uint8_t sla) { // send slave address and write bit + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do{ + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = I2CDEV_S_ADDR & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for slaw to finish + }while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +void u8g_i2c_init(uint8_t clock_option) { + + /** + * Init I2C pin connect + */ + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + #if ((USEDI2CDEV_M == 0)) + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #endif + #if ((USEDI2CDEV_M == 1)) + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #endif + #if ((USEDI2CDEV_M == 2)) + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, (clock_option & U8G_I2C_OPT_FAST) ? 400000: 100000); // LCD data rates + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); + + u8g_i2c_start(0); // send slave address and write bit +} + +volatile extern uint32_t _millis; +uint8_t u8g_i2c_send_byte(uint8_t data) { + #define I2C_TIMEOUT 3 + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + uint32_t timeout = _millis + I2C_TIMEOUT; + while ((I2C_status != I2C_I2STAT_M_TX_DAT_ACK) && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK) && (timeout > _millis)); // wait for xmit to finish + // had hangs with SH1106 so added time out - have seen temporary screen corruption when this happens + return 1; +} + +void u8g_i2c_stop(void) { +} + + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h new file mode 100644 index 0000000000..5f7337316a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h @@ -0,0 +1,27 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +void u8g_i2c_init(uint8_t options); +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos); +uint8_t u8g_i2c_start(uint8_t sla); +uint8_t u8g_i2c_send_byte(uint8_t data); +void u8g_i2c_stop(void); diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h new file mode 100644 index 0000000000..fc7d3a1e49 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * LPC1768 LCD-specific defines + */ + +// The following are optional depending on the platform. + +// definitions of HAL specific com and device drivers. +uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + + +// connect U8g com generic com names to the desired driver +#define U8G_COM_HW_SPI u8g_com_HAL_LPC1768_hw_spi_fn // use LPC1768 specific hardware SPI routine +#define U8G_COM_SW_SPI u8g_com_HAL_LPC1768_sw_spi_fn // use LPC1768 specific software SPI routine +#define U8G_COM_ST7920_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn +#define U8G_COM_ST7920_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn +#define U8G_COM_SSD_I2C u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +// let these default for now +#define U8G_COM_PARALLEL u8g_com_null_fn +#define U8G_COM_T6963 u8g_com_null_fn +#define U8G_COM_FAST_PARALLEL u8g_com_null_fn +#define U8G_COM_UC_I2C u8g_com_null_fn diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h new file mode 100644 index 0000000000..28c950ae49 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h @@ -0,0 +1,42 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * LCD delay routines - used by all the drivers. + * + * These are based on the LPC1768 routines. + * + * Couldn't just call exact copies because the overhead resulted in the + * one microsecond delay being about 4uS. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +void U8g_delay(int msec); +void u8g_MicroDelay(void); +void u8g_10MicroDelay(void); + +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c new file mode 100644 index 0000000000..57073d9a04 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. + */ + +#ifdef TARGET_LPC1768 + +#include +#include +#include "../../../core/macros.h" +//#include + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +#define INPUT 0 +#define OUTPUT 1 +#define INPUT_PULLUP 2 + + +uint8_t LPC1768_PIN_PORT(const uint8_t pin); +uint8_t LPC1768_PIN_PIN(const uint8_t pin); + +#ifdef __cplusplus + extern "C" { +#endif + +// I/O functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode_LCD(uint8_t pin, uint8_t mode) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), + LPC1768_PIN_PIN(pin), + PINSEL_FUNC_0, + PINSEL_PINMODE_TRISTATE, + PINSEL_PINMODE_NORMAL }; + switch(mode) { + case INPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case OUTPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case INPUT_PULLUP: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLUP; + PINSEL_ConfigPin(&config); + break; + default: + break; + } +} + +void u8g_SetPinOutput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 1); // OUTPUT +} + +void u8g_SetPinInput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 0); // INPUT +} + +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + if (pin_status) + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); + else + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); +} + +uint8_t u8g_GetPinLevel(uint8_t pin) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + return (uint32_t)LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; +} + + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/bitmap_flags.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h similarity index 55% rename from Marlin/bitmap_flags.h rename to Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h index 7f7d04f5dd..5a900ac45c 100644 --- a/Marlin/bitmap_flags.h +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h @@ -20,19 +20,17 @@ * */ -#ifndef _BITMAP_FLAGS_H_ -#define _BITMAP_FLAGS_H_ - -#include "macros.h" - /** - * These support functions allow the use of large bit arrays of flags that take very - * little RAM. Currently they are limited to being 16x16 in size. Changing the declaration - * to unsigned long will allow us to go to 32x32 if higher resolution meshes are needed - * in the future. + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. */ -FORCE_INLINE void bitmap_clear(uint16_t bits[16], const uint8_t x, const uint8_t y) { CBI(bits[y], x); } -FORCE_INLINE void bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { SBI(bits[y], x); } -FORCE_INLINE bool is_bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } -#endif // _BITMAP_FLAGS_H_ +void u8g_SetPinOutput(uint8_t internal_pin_number); +void u8g_SetPinInput(uint8_t internal_pin_number); +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status); +uint8_t u8g_GetPinLevel(uint8_t pin); diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp new file mode 100644 index 0000000000..9cd913f743 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_msp430_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +//#include +#include + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + u8g_SetPILevel(u8g, U8G_PI_CS, 1); + u8g_SetPILevel(u8g, U8G_PI_A0, 1); + u8g_SetPILevel(u8g, U8G_PI_RESET, 1); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + u8g_SetPIOutput(u8g, U8G_PI_RESET); + u8g_Delay(5); + spiBegin(); + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card + #endif + spiInit(SPI_SPEED); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + spiSend((uint8_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp new file mode 100644 index 0000000000..06399d3947 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp @@ -0,0 +1,203 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_arduino_ssd_i2c.c + * + * COM interface for Arduino (AND ATmega) and the SSDxxxx chip (SOLOMON) variant + * I2C protocol + * + * ToDo: Rename this to u8g_com_avr_ssd_i2c.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Special pin usage: + * U8G_PI_I2C_OPTION additional options + * U8G_PI_A0_STATE used to store the last value of the command/data register selection + * U8G_PI_SET_A0 1: Signal request to update I2C device with new A0_STATE, 0: Do nothing, A0_STATE matches I2C device + * U8G_PI_SCL clock line (NOT USED) + * U8G_PI_SDA data line (NOT USED) + * + * U8G_PI_RESET reset line (currently disabled, see below) + * + * Protocol: + * SLA, Cmd/Data Selection, Arguments + * The command/data register is selected by a special instruction byte, which is sent after SLA + * + * The continue bit is always 0 so that a (re)start is equired for the change from cmd to/data mode + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +#define I2C_SLA (0x3C*2) +//#define I2C_CMD_MODE 0x080 +#define I2C_CMD_MODE 0x000 +#define I2C_DATA_MODE 0x040 + +//#define U8G_I2C_OPT_FAST 16 + +uint8_t u8g_com_ssd_I2C_start_sequence(u8g_t *u8g) { + /* are we requested to set the a0 state? */ + if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1; + + /* setup bus, might be a repeated start */ + if (u8g_i2c_start(I2C_SLA) == 0) + return 0; + if (u8g->pin_list[U8G_PI_A0_STATE] == 0 ) { + if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0; + } + else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0) + return 0; + + u8g->pin_list[U8G_PI_SET_A0] = 0; + return 1; +} + +uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch(msg) { + case U8G_COM_MSG_INIT: + //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH); + //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH); + //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */ + + u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]); + u8g_com_ssd_I2C_start_sequence(u8g); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + /* Currently disabled, but it could be enable. Previous restrictions have been removed */ + /* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */ + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g->pin_list[U8G_PI_A0_STATE] = 0; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */ + if (arg_val == 0 ) { + /* disable chip, send stop condition */ + u8g_i2c_stop(); + } + else { + /* enable, do nothing: any byte writing will trigger the i2c start */ + } + break; + + case U8G_COM_MSG_WRITE_BYTE: + //u8g->pin_list[U8G_PI_SET_A0] = 1; + //if (u8g_com_arduino_ssd_start_sequence(u8g) == 0) + // return u8g_i2c_stop(), 0; + if (u8g_i2c_send_byte(arg_val) == 0) { + u8g_i2c_stop(); + return 0; + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { + u8g_i2c_stop(); + return 0; + } + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte(*ptr++) == 0) { + u8g_i2c_stop(); + return 0; + } + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { + u8g_i2c_stop(); + return 0; + } + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0) + return 0; + ptr++; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ + + u8g_i2c_start(0); // send slave address and write bit + u8g_i2c_send_byte(arg_val ? 0x40 : 0x80); // Write to ? Graphics DRAM mode : Command mode + break; + + } // switch + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction new file mode 100644 index 0000000000..80c8da7239 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction @@ -0,0 +1,254 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on U8G2 code - u8x8_byte.c + * + * Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/) + * + * Copyright (c) 2016, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Software i2c, + * ignores ACK response (which is anyway not provided by some displays) + * also does not allow reading from the device + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +//void pinMode(int16_t pin, uint8_t mode); +//void digitalWrite(int16_t pin, uint8_t pin_status); + + +#define I2C_SLA (0x3C*2) +//#define I2C_CMD_MODE 0x080 +#define I2C_CMD_MODE 0x000 +#define I2C_DATA_MODE 0x040 + +//static uint8_t I2C_speed; // 3 - 400KHz, 13 - 100KHz +//#define SPEED_400KHz 3 +//#define SPEED_100KHz 13 + +// #define U8G_I2C_OPT_FAST 16 + +uint8_t SCL_pin_HAL_LPC1768_sw_I2C, SCL_port_HAL_LPC1768_sw_I2C, SDA_pin_HAL_LPC1768_sw_I2C, SDA_port_HAL_LPC1768_sw_I2C; + +#define SPI_SPEED 2 //20: 200KHz 5:750KHz 2:3-4MHz + +uint8_t u8g_i2c_send_byte_sw(uint8_t data) { + for (uint8_t i = 0; i < 9; i++) { // 1 extra bit for the ack/nak + + if (val & 0x80) + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + } + else + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + } + + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + } + + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + } + val <<= 1; + } + return 1; +} + + +uint8_t u8g_i2c_start_sw(uint8_t sla) { // assert start condition and then send slave address with write bit + /* send the start condition, both lines go from 1 to 0 */ + + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + + u8g_i2c_send_byte_sw(I2C_SLA); // send slave address with write bit +} + + +void u8g_i2c_stop_sw(void) { } + +void u8g_i2c_init_sw(uint8_t clock_option) { u8g_i2c_start(0); } // send slave address and write bit + +uint8_t u8g_com_ssd_I2C_start_sequence_sw(u8g_t *u8g) { + /* are we requested to set the a0 state? */ + if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1; + + /* setup bus, might be a repeated start */ + if (u8g_i2c_start(I2C_SLA) == 0) return 0; + if (u8g->pin_list[U8G_PI_A0_STATE] == 0) { + if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0; + } + else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0) return 0; + + u8g->pin_list[U8G_PI_SET_A0] = 0; + + return 1; +} + +uint8_t u8g_com_HAL_LPC1768_ssd_sw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + SCL_pin_HAL_LPC1768_sw_I2C = LPC1768_PIN_PIN(u8g->pin_list[U8G_PI_SCL]); + SCL_port_HAL_LPC1768_sw_I2C = LPC1768_PIN_PORT(u8g->pin_list[U8G_PI_SCL]); + SDA_pin_HAL_LPC1768_sw_I2C = LPC1768_PIN_PIN(u8g->pin_list[U8G_PI_SDA]); + SDA_port_HAL_LPC1768_sw_I2C = LPC1768_PIN_PORT(u8g->pin_list[U8G_PI_SDA]); + // As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) + #define OUTPUT 0x1 + u8g_SetPIOutput(u8g, U8G_PI_SCL); + u8g_SetPIOutput(u8g, U8G_PI_SDA); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) u8g_SetPIOutput(u8g, U8G_PI_CS); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_A0]) u8g_SetPIOutput(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); + + //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH); + //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH); + //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */ + + u8g_i2c_init_sw(u8g->pin_list[U8G_PI_I2C_OPTION]); + u8g_com_ssd_I2C_start_sequence_sw(u8g); + break; + + case U8G_COM_MSG_STOP: break; + + case U8G_COM_MSG_RESET: break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g->pin_list[U8G_PI_A0_STATE] = 0; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */ + if (arg_val == 0) { + /* disable chip, send stop condition */ + u8g_i2c_stop_sw(); + } + else { + /* enable, do nothing: any byte writing will trigger the i2c start */ + } + break; + + case U8G_COM_MSG_WRITE_BYTE: + //u8g->pin_list[U8G_PI_SET_A0] = 1; + //if (u8g_com_arduino_ssd_start_sequence(u8g) == 0) + // return u8g_i2c_stop(), 0; + if (u8g_i2c_send_byte_sw(arg_val) == 0) + return u8g_i2c_stop_sw(), 0; + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence_sw(u8g) == 0) + return u8g_i2c_stop_sw(), 0; + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte_sw(*ptr++) == 0) + return u8g_i2c_stop_sw(), 0; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence_sw(u8g) == 0) + return u8g_i2c_stop_sw(), 0; + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte_sw(u8g_pgm_read(ptr)) == 0) return 0; + ptr++; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ + u8g_i2c_start_sw(0); // send slave address and write bit + u8g_i2c_send_byte_sw(arg_val ? 0x40 : 0x80); // Write to ? Graphics DRAM mode : Command mode + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp new file mode 100644 index 0000000000..c61fa4a8ce --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_LPC1768_st7920_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +//#include +#include +#include "../Delay.h" + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +static uint8_t rs_last_state = 255; + +static void u8g_com_LPC1768_st7920_write_byte_hw_spi(uint8_t rs, uint8_t val) { + + if ( rs != rs_last_state) { // time to send a command/data byte + rs_last_state = rs; + + if ( rs == 0 ) + /* command */ + spiSend(0x0F8); + else + /* data */ + spiSend(0x0FA); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe + } + + spiSend(val & 0x0F0); + spiSend(val << 4); +} + +uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch(msg) { + case U8G_COM_MSG_INIT: + u8g_SetPILevel(u8g, U8G_PI_CS, 0); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_Delay(5); + spiBegin(); + spiInit(SPI_EIGHTH_SPEED); // ST7920 max speed is about 1.1 MHz + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp new file mode 100644 index 0000000000..700ed59463 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include "SoftwareSPI.h" +#include "../Delay.h" + +#define SPI_SPEED 3 // About 1 MHz + +static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL; +static uint8_t SPI_speed = 0; +static uint8_t rs_last_state = 255; + +static void u8g_com_LPC1768_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { + + if (rs != rs_last_state) { // time to send a command/data byte + rs_last_state = rs; + + if (rs == 0) + /* command */ + swSpiTransfer(0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + else + /* data */ + swSpiTransfer(0x0FA, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe + } + + swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); +} + +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_INIT: + SCK_pin_ST7920_HAL = u8g->pin_list[U8G_PI_SCK]; + MOSI_pin_ST7920_HAL_HAL = u8g->pin_list[U8G_PI_MOSI]; + + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_SCK); + u8g_SetPIOutput(u8g, U8G_PI_MOSI); + u8g_Delay(5); + + SPI_speed = swSpiInit(SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL); + + u8g_SetPILevel(u8g, U8G_PI_CS, 0); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp new file mode 100644 index 0000000000..533ebda37c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_com_std_sw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include "SoftwareSPI.h" + +#define SPI_SPEED 2 // About 2 MHz + +static uint8_t SPI_speed = 0; + +static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { + swSpiTransfer(val, SPI_speed, clockPin, -1, dataPin); +} + +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch(msg) { + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_SCK); + u8g_SetPIOutput(u8g, U8G_PI_MOSI); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); + SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, !arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py new file mode 100644 index 0000000000..aa24cacc45 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py @@ -0,0 +1,148 @@ +# +# sets output_port +# if target_filename is found then that drive is used +# else if target_drive is found then that drive is used +# + +target_filename = "FIRMWARE.CUR" +target_drive = "REARM" + +import os +import platform +current_OS = platform.system() + +#env_vars = subprocess.check_output('platformio run -t envdump') +#env_vars = env_vars.split('\n') +#for env in env_vars: +# print env +#exit(0) + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') +if build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set' : + + if current_OS == 'Windows': + + # + # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' + # Windows - doesn't care about the disk's name, only cares about the drive letter + # + + # + # get all drives on this computer + # + + import subprocess + + driveStr = subprocess.check_output("fsutil fsinfo drives") # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + driveStr = driveStr.strip().lstrip('Drives: ') # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + drives = driveStr.split() # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] + + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + for drive in drives: + final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' + try: + volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT) + except Exception as e: + continue + else: + if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = final_drive_name + if target_filename in volume_info: + if target_file_found == False: + upload_disk = final_drive_name + target_file_found = True + + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_PORT = upload_disk + ) + print 'upload disk: ' , upload_disk + else: + print '\nUnable to find destination disk. File must be copied manually. \n' + + + if current_OS == 'Linux': + + # + # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' + # + + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + medias = os.listdir('/media') # + for media in medias: + drives = os.listdir('/media/' + media) # + if target_drive in drives and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/media/' + media + '/' + target_drive + '/' + for drive in drives: + try: + files = os.listdir('/media/' + media + '/' + drive ) + except: + continue + else: + if target_filename in files: + if target_file_found == False: + upload_disk = '/media/' + media + '/' + drive + '/' + target_file_found = True + + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_FLAGS = "-P$UPLOAD_PORT", + UPLOAD_PORT = upload_disk + ) + print 'upload disk: ' , upload_disk + else: + print '\nUnable to find destination disk. File must be copied manually. \n' + + + if current_OS == 'Darwin': # MAC + + # + # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' + # + + import os + upload_disk = 'Disk not found' + drives = os.listdir('/Volumes') # human readable names + target_file_found = False + target_drive_found = False + if target_drive in drives and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/Volumes/' + target_drive + '/' + for drive in drives: + try: + filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected + except: + continue + else: + if target_filename in filenames: + if target_file_found == False: + upload_disk = '/Volumes/' + drive + '/' + target_file_found = True + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_PORT = upload_disk + ) + print '\nupload disk: ' , upload_disk, '\n' + else: + print '\nUnable to find destination disk. File must be copied manually. \n' diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp new file mode 100644 index 0000000000..589e05ebd6 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "lpc17xx_wdt.h" +#include "watchdog.h" + +void watchdog_init(void) { + WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); + WDT_Start(WDT_TIMEOUT); +} + +void HAL_clear_reset_source(void) { + WDT_ClrTimeOutFlag(); +} + +uint8_t HAL_get_reset_source(void) { + if (TEST(WDT_ReadTimeOutFlag(), 0)) return RST_WATCHDOG; + return RST_POWER_ON; +} + +void watchdog_reset() { + WDT_Feed(); + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif +} + +#else + void HAL_clear_reset_source(void) {} + uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } +#endif // USE_WATCHDOG + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.h b/Marlin/src/HAL/HAL_LPC1768/watchdog.h new file mode 100644 index 0000000000..90147bd702 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef WATCHDOG_LPC1768_H +#define WATCHDOG_LPC1768_H + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 + +#define WDT_TIMEOUT 4000000 // 4 second timeout + +void watchdog_init(void); +void watchdog_reset(void); +void HAL_clear_reset_source(void); +uint8_t HAL_get_reset_source(void); + +#endif /* WATCHDOG_H */ diff --git a/Marlin/src/HAL/HAL_SPI.h b/Marlin/src/HAL/HAL_SPI.h new file mode 100644 index 0000000000..c011436b77 --- /dev/null +++ b/Marlin/src/HAL/HAL_SPI.h @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * HAL/HAL_SPI.h + * Core Marlin definitions for SPI, implemented in the HALs + */ + +#ifndef _HAL_SPI_H_ +#define _HAL_SPI_H_ + +#include + +/** + * SPI speed where 0 <= index <= 6 + * + * Approximate rates : + * + * 0 : 8 - 10 MHz + * 1 : 4 - 5 MHz + * 2 : 2 - 2.5 MHz + * 3 : 1 - 1.25 MHz + * 4 : 500 - 625 kHz + * 5 : 250 - 312 kHz + * 6 : 125 - 156 kHz + * + * On AVR, actual speed is F_CPU/2^(1 + index). + * On other platforms, speed should be in range given above where possible. + */ + +#define SPI_FULL_SPEED 0 // Set SCK to max rate +#define SPI_HALF_SPEED 1 // Set SCK rate to half of max rate +#define SPI_QUARTER_SPEED 2 // Set SCK rate to quarter of max rate +#define SPI_EIGHTH_SPEED 3 // Set SCK rate to 1/8 of max rate +#define SPI_SIXTEENTH_SPEED 4 // Set SCK rate to 1/16 of max rate +#define SPI_SPEED_5 5 // Set SCK rate to 1/32 of max rate +#define SPI_SPEED_6 6 // Set SCK rate to 1/64 of max rate + +#define SPI_LSBFIRST 0 +#define SPI_MSBFIRST 1 + +#define SPI_DATAMODE_0 0x00 +#define SPI_DATAMODE_1 0x04 +#define SPI_DATAMODE_2 0x08 +#define SPI_DATAMODE_3 0x0C + +// Standard SPI functions +/** Initialise SPI bus */ +void spiBegin(void); +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate); +/** Write single byte to SPI */ +void spiSend(uint8_t b); +/** Read single byte from SPI */ +uint8_t spiRec(void); +/** Read from SPI into buffer */ +void spiRead(uint8_t* buf, uint16_t nbyte); +/** Write token and then write from 512 byte buffer to SPI (for SD card) */ +void spiSendBlock(uint8_t token, const uint8_t* buf); +/** Begin SPI transaction, set clock, bit order, data mode */ +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); + +#endif // _HAL_SPI_H_ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp new file mode 100644 index 0000000000..95dbb0a502 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp @@ -0,0 +1,279 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +#define __I +#define __IO + typedef struct + { + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + } SCB_Type; + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- +USBSerial SerialUSB; + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +STM32ADC adc(ADC1); + +uint8 adc_pins[] = { + #if HAS_TEMP_ADC_0 + TEMP_0_PIN, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1_PIN + #endif + #if HAS_TEMP_ADC_2 + TEMP_2_PIN, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3_PIN, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4_PIN, + #endif + #if HAS_HEATED_BED + TEMP_BED_PIN, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH_PIN, + #endif +}; + +enum TEMP_PINS : char { + #if HAS_TEMP_ADC_0 + TEMP_0, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1, + #endif + #if HAS_TEMP_ADC_2 + TEMP_2, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4, + #endif + #if HAS_HEATED_BED + TEMP_BED, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH, + #endif + ADC_PIN_COUNT +}; + +uint16_t HAL_adc_results[ADC_PIN_COUNT]; + + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- +static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_init(void) { + NVIC_SetPriorityGrouping(0x3); +} + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { } + +/** + * TODO: Check this and change or remove. + * currently returns 1 that's equal to poweron reset. + */ +uint8_t HAL_get_reset_source(void) { return 1; } + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +/** + * TODO: Change this to correct it for libmaple + */ + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- +// Init the AD in continuous capture mode +void HAL_adc_init(void) { + // configure the ADC + adc.calibrate(); + adc.setSampleRate(ADC_SMPR_41_5); // ? + adc.setPins(adc_pins, ADC_PIN_COUNT); + adc.setDMA(HAL_adc_results, (uint16_t)ADC_PIN_COUNT, (uint32_t)(DMA_MINC_MODE | DMA_CIRC_MODE), (void (*)())NULL); + adc.setScanMode(); + adc.setContinuous(); + adc.startConversion(); +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + TEMP_PINS pin_index; + switch (adc_pin) { + #if HAS_TEMP_ADC_0 + case TEMP_0_PIN: pin_index = TEMP_0; break; + #endif + #if HAS_TEMP_ADC_1 + case TEMP_1_PIN: pin_index = TEMP_1; break; + #endif + #if HAS_TEMP_ADC_2 + case TEMP_2_PIN: pin_index = TEMP_2; break; + #endif + #if HAS_TEMP_ADC_3 + case TEMP_3_PIN: pin_index = TEMP_3; break; + #endif + #if HAS_TEMP_ADC_4 + case TEMP_4_PIN: pin_index = TEMP_4; break; + #endif + #if HAS_HEATED_BED + case TEMP_BED_PIN: pin_index = TEMP_BED; break; + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case FILWIDTH_PIN: pin_index = FILWIDTH; break; + #endif + } + HAL_adc_result = (HAL_adc_results[(int)pin_index] >> 2) & 0x3FF; // shift to get 10 bits only. +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.h b/Marlin/src/HAL/HAL_STM32F1/HAL.h new file mode 100644 index 0000000000..f538e27609 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL.h @@ -0,0 +1,251 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef _HAL_STM32F1_H +#define _HAL_STM32F1_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include +#include + +// -------------------------------------------------------------------------- +// Undefine DEBUG_ settings +// -------------------------------------------------------------------------- + + +#undef DEBUG_NONE +#undef DEBUG_FAULT +#undef DEBUG_ALL + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../math_32bit.h" +#include "../HAL_SPI.h" + +#include "fastio_Stm32f1.h" +#include "watchdog_Stm32f1.h" + +#include "HAL_timers_Stm32f1.h" + + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#if !WITHIN(SERIAL_PORT, -1, 3) + #error "SERIAL_PORT must be from -1 to 3" +#endif +#if SERIAL_PORT == -1 +extern USBSerial SerialUSB; + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 3) + #error "SERIAL_PORT_2 must be from -1 to 3" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + extern USBSerial SerialUSB; + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 0 + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 Serial3 + #endif +#else + #define NUM_SERIAL 1 +#endif + +// Use HAL_init() to set interrupt grouping. +#define HAL_INIT +void HAL_init(); + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_primask(); (void)__iCliRetVal() +#define CRITICAL_SECTION_END if (!primask) (void)__iSeiRetVal() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() ((void)__iSeiRetVal()) +#define DISABLE_ISRS() ((void)__iCliRetVal()) + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// Disable interrupts +#define cli() noInterrupts() + +// Enable interrupts +#define sei() interrupts() + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT_ANALOG); + +void HAL_adc_init(void); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_result + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp new file mode 100644 index 0000000000..fe293d50d4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_Stm32f1.h" + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + return Servo::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return Servo::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h new file mode 100644 index 0000000000..c27f7bd076 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h @@ -0,0 +1,42 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef HAL_SERVO_STM32F1_H +#define HAL_SERVO_STM32F1_H + +// Path needed, otherwise HAL version is used +#include <../../libraries/Servo/src/Servo.h> + +// Inherit and expand on the official library +class libServo : public Servo { +public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); +private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // HAL_SERVO_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp new file mode 100644 index 0000000000..59835829a7 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F1 HAL + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F1. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SS_PIN); +} + +/** + * @brief Initializes SPI port to required speed rate and transfer mode (MSB, SPI MODE 0) + * + * @param spiRate Rate as declared in HAL.h (speed do not match AVR) + * @return Nothing + * + * @details + */ +void spiInit(uint8_t spiRate) { + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV2 ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.dmaTransfer(0, const_cast(buf), nbyte); + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.send(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.send(token); + SPI.dmaSend(const_cast(buf), 512); + SPI.endTransaction(); +} + +/** Begin SPI transaction, set clock, bit order, data mode */ +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, (BitOrder)bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // SOFTWARE_SPI + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp new file mode 100644 index 0000000000..5c9f5e893e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp @@ -0,0 +1,219 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_Stm32f1.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 4 + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +/* VGPV +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TC0, 0, TC0_IRQn, 0}, // 0 - [servo timer5] + { TC0, 1, TC1_IRQn, 0}, // 1 + { TC0, 2, TC2_IRQn, 0}, // 2 + { TC1, 0, TC3_IRQn, 2}, // 3 - stepper + { TC1, 1, TC4_IRQn, 15}, // 4 - temperature + { TC1, 2, TC5_IRQn, 0}, // 5 - [servo timer3] + { TC2, 0, TC6_IRQn, 0}, // 6 + { TC2, 1, TC7_IRQn, 0}, // 7 + { TC2, 2, TC8_IRQn, 0}, // 8 +}; +*/ +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/** + * Timer_clock1: Prescaler 2 -> 36 MHz + * Timer_clock2: Prescaler 8 -> 9 MHz + * Timer_clock3: Prescaler 32 -> 2.25 MHz + * Timer_clock4: Prescaler 128 -> 562.5 kHz + */ + +/** + * TODO: Calculate Timer prescale value, so we get the 32bit to adjust + */ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + nvic_irq_num irq_num; + switch (timer_num) { + case 1: irq_num = NVIC_TIMER1_CC; break; + case 2: irq_num = NVIC_TIMER2; break; + case 3: irq_num = NVIC_TIMER3; break; + case 4: irq_num = NVIC_TIMER4; break; + case 5: irq_num = NVIC_TIMER5; break; + default: + /** + * We should not get here, add Sanitycheck for timer number. Should be a general timer + * since basic timers do not have CC channels. + * Advanced timers should be skipped if possible too, and are not listed above. + */ + break; + } + + /** + * Give the Stepper ISR a higher priority (lower number) + * so it automatically preempts the Temperature ISR. + */ + + switch (timer_num) { + case STEP_TIMER_NUM: + timer_pause(STEP_TIMER_DEV); + timer_set_count(STEP_TIMER_DEV, 0); + timer_set_prescaler(STEP_TIMER_DEV, (uint16)(STEPPER_TIMER_PRESCALE - 1)); + timer_set_reload(STEP_TIMER_DEV, 0xFFFF); + timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, MIN(HAL_TIMER_TYPE_MAX, (STEPPER_TIMER_RATE / frequency))); + timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler); + nvic_irq_set_priority(irq_num, 1); + timer_generate_update(STEP_TIMER_DEV); + timer_resume(STEP_TIMER_DEV); + break; + case TEMP_TIMER_NUM: + timer_pause(TEMP_TIMER_DEV); + timer_set_count(TEMP_TIMER_DEV, 0); + timer_set_prescaler(TEMP_TIMER_DEV, (uint16)(TEMP_TIMER_PRESCALE - 1)); + timer_set_reload(TEMP_TIMER_DEV, 0xFFFF); + timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, MIN(HAL_TIMER_TYPE_MAX, ((F_CPU / TEMP_TIMER_PRESCALE) / frequency))); + timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler); + nvic_irq_set_priority(irq_num, 2); + timer_generate_update(TEMP_TIMER_DEV); + timer_resume(TEMP_TIMER_DEV); + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: ENABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: ENABLE_TEMPERATURE_INTERRUPT(); break; + default: break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: DISABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: DISABLE_TEMPERATURE_INTERRUPT(); break; + default: break; + } +} + +static inline bool timer_irq_enabled(const timer_dev * const dev, const uint8 interrupt) { + return bool(*bb_perip(&(dev->regs).adv->DIER, interrupt)); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return timer_irq_enabled(STEP_TIMER_DEV, STEP_TIMER_CHAN); + case TEMP_TIMER_NUM: return timer_irq_enabled(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); + } + return false; +} + +timer_dev* get_timer_dev(int number) { + switch (number) { + #if STM32_HAVE_TIMER(1) + case 1: return &timer1; + #endif + #if STM32_HAVE_TIMER(2) + case 2: return &timer2; + #endif + #if STM32_HAVE_TIMER(3) + case 3: return &timer3; + #endif + #if STM32_HAVE_TIMER(4) + case 4: return &timer4; + #endif + #if STM32_HAVE_TIMER(5) + case 5: return &timer5; + #endif + #if STM32_HAVE_TIMER(6) + case 6: return &timer6; + #endif + #if STM32_HAVE_TIMER(7) + case 7: return &timer7; + #endif + #if STM32_HAVE_TIMER(8) + case 8: return &timer8; + #endif + #if STM32_HAVE_TIMER(9) + case 9: return &timer9; + #endif + #if STM32_HAVE_TIMER(10) + case 10: return &timer10; + #endif + #if STM32_HAVE_TIMER(11) + case 11: return &timer11; + #endif + #if STM32_HAVE_TIMER(12) + case 12: return &timer12; + #endif + #if STM32_HAVE_TIMER(13) + case 13: return &timer14; + #endif + #if STM32_HAVE_TIMER(14) + case 14: return &timer14; + #endif + } +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h new file mode 100644 index 0000000000..132cf4d22f --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef _HAL_TIMERS_STM32F1_H +#define _HAL_TIMERS_STM32F1_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +/** + * TODO: Check and confirm what timer we will use for each Temps and stepper driving. + * We should probable drive temps with PWM. + */ +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (F_CPU) // frequency of timers peripherals + +#define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts +#define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts + +#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) + #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4 +#else + #define STEP_TIMER_NUM 5 // for other boards, five is fine. +#endif +#define TEMP_TIMER_NUM 2 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +timer_dev* get_timer_dev(int number); +#define TIMER_DEV(num) get_timer_dev(num) +#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM) +#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM) + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() timer_enable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) +#define DISABLE_TEMPERATURE_INTERRUPT() timer_disable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) + +#define HAL_timer_get_count(timer_num) timer_get_count(TIMER_DEV(timer_num)) + +// TODO change this + + +#define HAL_TEMP_TIMER_ISR extern "C" void tempTC_Handler(void) +#define HAL_STEP_TIMER_ISR extern "C" void stepTC_Handler(void) + +extern "C" void tempTC_Handler(void); +extern "C" void stepTC_Handler(void); + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- +/* +static HardwareTimer StepperTimer(STEP_TIMER_NUM); +static HardwareTimer TempTimer(TEMP_TIMER_NUM); +*/ +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +/** + * NOTE: By default libmaple sets ARPE = 1, which means the Auto reload register is preloaded (will only update with an update event) + * Thus we have to pause the timer, update the value, refresh, resume the timer. + * That seems like a big waste of time and may be better to change the timer config to ARPE = 0, so ARR can be updated any time. + * We are using a Channel in each timer in Capture/Compare mode. We could also instead use the Time Update Event Interrupt, but need to disable ARPE + * so we can change the ARR value on the fly (without calling refresh), and not get an interrupt right there because we caused an UEV. + * This mode pretty much makes 2 timers unusable for PWM since they have their counts updated all the time on ISRs. + * The way Marlin manages timer interrupts doesn't make for an efficient usage in STM32F1 + * Todo: Look at that possibility later. + */ + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + //compare = MIN(compare, HAL_TIMER_TYPE_MAX); + switch (timer_num) { + case STEP_TIMER_NUM: + timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, compare); + return; + case TEMP_TIMER_NUM: + timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, compare); + return; + default: + return; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: + return timer_get_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN); + case TEMP_TIMER_NUM: + return timer_get_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); + default: + return 0; + } +} + +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: + timer_set_count(STEP_TIMER_DEV, 0); + timer_generate_update(STEP_TIMER_DEV); + return; + case TEMP_TIMER_NUM: + timer_set_count(TEMP_TIMER_DEV, 0); + timer_generate_update(TEMP_TIMER_DEV); + return; + default: + return; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/README.md b/Marlin/src/HAL/HAL_STM32F1/README.md new file mode 100644 index 0000000000..a28000f030 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/README.md @@ -0,0 +1,34 @@ +# This HAL is for STM32F103 boards used with libmaple/stm32duino Arduino core. + +# This HAL is in development. Currently has been tested in Malyan M200 (103CBT6), Chitu 3d (103ZET6), and custom boards(103VET6). + +### The stm32 core needs a modification in the file util.h to avoid conflict with Marlin macros for Debug. +Since only 1 file needs change in the stm32duino core, it's preferable over making changes to Marlin. + + +After these lines: +<> +#else +#define ASSERT_FAULT(exp) (void)((0)) +#endif +<> + +Add the following 3 lines: +<> +#undef DEBUG_NONE +#undef DEBUG_FAULT +#undef DEBUG_ALL +<> + +### Main developers: +Victorpv +xC000005 + + +### Most up to date repository for this HAL: +https://github.com/victorpv/Marlin/tree/bugfix-2.0.x + +PRs should only be sent to Marlin bugfix-2.0.x branch once tested in printing so not to introduce new bugs. +For testing/dev, you can submit to the above branch + + diff --git a/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h new file mode 100644 index 0000000000..40917f03fe --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif SPINDLE_LASER_POWERUP_DELAY < 0 + #error "SPINDLE_LASER_POWERUP_DELAY must be positive" + #elif SPINDLE_LASER_POWERDOWN_DELAY < 0 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be positive" + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h new file mode 100644 index 0000000000..c2a07a7cf1 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h @@ -0,0 +1,87 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Endstop interrupts for Libmaple STM32F1 based targets. + * + * On STM32F, all pins support external interrupt capability. + * Any pin can be used for external interrupts, but there are some restrictions. + * At most 16 different external interrupts can be used at one time. + * Further, you can’t just pick any 16 pins to use. This is because every pin on the STM32 + * connects to what is called an EXTI line, and only one pin per EXTI line can be used for external interrupts at a time + * Check the Reference Manual of the MCU to confirm which line is used by each pin + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); // assign it + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h new file mode 100644 index 0000000000..d6683e36ee --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O interfaces for STM32F1 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F1_H +#define _FASTIO_STM32F1_H + +#include + +#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW) +#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << (16 * !(bool)V)) +#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit)) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit) +#define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M) +#define _SET_OUTPUT(IO) _SET_MODE(IO, GPIO_OUTPUT_PP) + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, GPIO_INPUT_FLOATING) +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, GPIO_INPUT_PU) +#define SET_OUTPUT(IO) OUT_WRITE(IO,LOW) + +#define GET_INPUT(IO) (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD) +#define GET_OUTPUT(IO) (_GET_MODE(IO) == GPIO_OUTPUT_PP) +#define GET_TIMER(IO) (PIN_MAP[IO].timer_device != NULL) + +/** + * TODO: Write a macro to test if PIN is PWM or not. + */ +#define PWM_PIN(p) true + +#endif // _FASTIO_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp b/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp new file mode 100644 index 0000000000..dff5122964 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * persistent_store_flash.cpp + * HAL for stm32duino and compatible (STM32F1) + * Implementation of EEPROM settings in SDCard + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +// This is for EEPROM emulation in flash +#if ENABLED(EEPROM_SETTINGS) && ENABLED(FLASH_EEPROM_EMULATION) + +#include "../persistent_store_api.h" + +#include +#include + +namespace HAL { +namespace PersistentStore { + +// Store settings in the last two pages +// Flash pages must be erased before writing, so keep track. +bool firstWrite = false; +uint32_t pageBase = EEPROM_START_ADDRESS; + +bool access_start() { + firstWrite = true; + return true; +} + +bool access_finish(){ + FLASH_Lock(); + firstWrite = false; + return true; +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + FLASH_Status status; + + if (firstWrite) { + FLASH_Unlock(); + status = FLASH_ErasePage(EEPROM_PAGE0_BASE); + if (status != FLASH_COMPLETE) return false; + status = FLASH_ErasePage(EEPROM_PAGE1_BASE); + if (status != FLASH_COMPLETE) return false; + firstWrite = false; + } + + // First write full words + int i = 0; + int wordsToWrite = size / sizeof(uint16_t); + uint16_t* wordBuffer = (uint16_t *)value; + while (wordsToWrite) { + status = FLASH_ProgramHalfWord(pageBase + pos + (i * 2), wordBuffer[i]); + if (status != FLASH_COMPLETE) return false; + wordsToWrite--; + i++; + } + + // Now, write any remaining single byte + if (size & 1) { + uint16_t temp = value[size - 1]; + status = FLASH_ProgramHalfWord(pageBase + pos + i, temp); + if (status != FLASH_COMPLETE) return false; + } + + crc16(crc, value, size); + pos += ((size + 1) & ~1); + return true; +} + +void read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + for (uint16_t i = 0; i < size; i++) { + byte* accessPoint = (byte*)(pageBase + pos + i); + uint8_t c = *accessPoint; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += ((size + 1) & ~1); +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS && EEPROM FLASH +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_STM32F1/persistent_store_impl.cpp new file mode 100644 index 0000000000..bff4610085 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/persistent_store_impl.cpp @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION) + +#include "../persistent_store_api.h" + +//#include "../../core/types.h" +//#include "../../core/language.h" +//#include "../../core/serial.h" +//#include "../../core/utility.h" + +#include "../../sd/cardreader.h" + + +namespace HAL { +namespace PersistentStore { + +#define CONFIG_FILE_NAME "eeprom.dat" +#define HAL_STM32F1_EEPROM_SIZE 4096 +char HAL_STM32F1_eeprom_content[HAL_STM32F1_EEPROM_SIZE]; + +bool access_start() { + if (!card.cardOK) return false; + int16_t bytes_read = 0; + const char eeprom_zero = 0xFF; + card.openFile((char *)CONFIG_FILE_NAME,true); + bytes_read = card.read (HAL_STM32F1_eeprom_content, HAL_STM32F1_EEPROM_SIZE); + if (bytes_read == -1) return false; + for (; bytes_read < HAL_STM32F1_EEPROM_SIZE; bytes_read++) { + HAL_STM32F1_eeprom_content[bytes_read] = eeprom_zero; + } + card.closefile(); + return true; +} + +bool access_finish(){ + if (!card.cardOK) return false; + int16_t bytes_written = 0; + card.openFile((char *)CONFIG_FILE_NAME,true); + bytes_written = card.write (HAL_STM32F1_eeprom_content, HAL_STM32F1_EEPROM_SIZE); + card.closefile(); + return (bytes_written == HAL_STM32F1_EEPROM_SIZE); +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + for (int i = 0; i < size; i++) { + HAL_STM32F1_eeprom_content [pos + i] = value[i]; + } + crc16(crc, value, size); + pos += size; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + for (int i = 0; i < size; i++) { + uint8_t c = HAL_STM32F1_eeprom_content[pos + i]; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += size; + return false; +} + +} // PersistentStore:: +} // HAL:: + +#endif // EEPROM_SETTINGS + +#endif // __STM32F1__ + diff --git a/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F1/spi_pins.h b/Marlin/src/HAL/HAL_STM32F1/spi_pins.h new file mode 100644 index 0000000000..f834cea3c2 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/spi_pins.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + * Any PIN can be used for Chip Select (SS) + */ +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA4 + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py b/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py new file mode 100644 index 0000000000..0610ce132a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py @@ -0,0 +1,55 @@ +from __future__ import print_function +import sys + +#dynamic build flags for generic compile options +if __name__ == "__main__": + args = " ".join([ "-std=gnu11", + "-std=gnu++11", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + + "-ffreestanding", + "-fsigned-char", + "-fno-move-loop-invariants", + "-fno-strict-aliasing", + + "--specs=nano.specs", + "--specs=nosys.specs", + + "-IMarlin/src/HAL", + + "-MMD", + "-MP", + "-DTARGET_STM32F1" + ]) + + for i in range(1, len(sys.argv)): + args += " " + sys.argv[i] + + print(args) + +# extra script for linker options +else: + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( + ARFLAGS=["rcs"], + + ASFLAGS=["-x", "assembler-with-cpp"], + + CXXFLAGS=[ + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" + ], + LINKFLAGS=[ + "-Os", + "-mcpu=cortex-m3", + "-ffreestanding", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float", + ], + ) diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp new file mode 100644 index 0000000000..101ad5ca5e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include +#include "watchdog_Stm32f1.h" + +void watchdogSetup(void) { + // do whatever. don't remove this function. +} + +/** + * @brief Initialized the independent hardware watchdog. + * + * @return No return + * + * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) + */ +void watchdog_init(void) { + //iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); +} + +#endif // USE_WATCHDOG + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h new file mode 100644 index 0000000000..f307950c76 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef WATCHDOG_STM32F1_H +#define WATCHDOG_STM32F1_H + +#include + +#include "../../inc/MarlinConfig.h" + +/** + * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and + * 625 reload value (counts down to 0) + * use 1250 for 8 seconds + */ +#define STM32F1_WD_RELOAD 625 + +// Arduino STM32F1 core now has watchdog support + +// Initialize watchdog with a 4 second countdown time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or STM32F1 will reset. +inline void watchdog_reset() { + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif + iwdg_feed(); +} + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp new file mode 100644 index 0000000000..26ab2fc92c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/src/eeprom.c + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file provides all the EEPROM emulation firmware functions. + ****************************************************************************** + * @attention + * + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup EEPROM_Emulation + * @{ + */ +#if defined(STM32F4) || defined(STM32F4xx) + +/* Includes ------------------------------------------------------------------*/ +#include "eeprom_emul.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Global variable used to store variable value in read sequence */ +uint16_t DataVar = 0; + +/* Virtual address defined by the user: 0xFFFF value is prohibited */ +uint16_t VirtAddVarTab[NB_OF_VAR]; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +static HAL_StatusTypeDef EE_Format(void); +static uint16_t EE_FindValidPage(uint8_t Operation); +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_VerifyPageFullyErased(uint32_t Address); + +/** + * @brief Restore the pages to a known good state in case of page's status + * corruption after a power loss. + * @param None. + * @retval - Flash error code: on write Flash error + * - FLASH_COMPLETE: on success + */ +uint16_t EE_Initialise(void) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + uint16_t VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + int16_t x = -1; + HAL_StatusTypeDef FlashStatus; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + + /* Get Page0 status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + /* Get Page1 status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Check for invalid header states and repair if necessary */ + switch (PageStatus0) { + case ERASED: + if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ + /* Erase Page0 */ + if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) { + return FlashStatus; + } + } + } + else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case RECEIVE_DATA: + if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ + /* Transfer data from Page1 to Page0 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page0 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case VALID_PAGE: + if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else { /* Page0 valid, Page1 receive */ + /* Transfer data from Page0 to Page1 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page1 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + break; + + default: /* Any other state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + break; + } + + return HAL_OK; +} + +/** + * @brief Verify if specified page is fully erased. + * @param Address: page address + * This parameter can be one of the following values: + * @arg PAGE0_BASE_ADDRESS: Page0 base address + * @arg PAGE1_BASE_ADDRESS: Page1 base address + * @retval page fully erased status: + * - 0: if Page not erased + * - 1: if Page erased + */ +uint16_t EE_VerifyPageFullyErased(uint32_t Address) { + uint32_t ReadStatus = 1; + uint16_t AddressValue = 0x5555; + /* Check each active page address starting from end */ + while (Address <= PAGE0_END_ADDRESS) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + /* Compare the read address with the virtual address */ + if (AddressValue != ERASED) { + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + /* Next address location */ + Address += 4; + } + /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ + return ReadStatus; +} + +/** + * @brief Returns the last stored variable data, if found, which correspond to + * the passed virtual address + * @param VirtAddress: Variable virtual address + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - 0: if variable was found + * - 1: if the variable was not found + * - NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { + uint16_t ValidPage = PAGE0; + uint16_t AddressValue = 0x5555, ReadStatus = 1; + uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE)); + + /* Check each active page address starting from end */ + while (Address > (PageStartAddress + 2)) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + + /* Compare the read address with the virtual address */ + if (AddressValue == VirtAddress) { + /* Get content of Address-2 which is variable value */ + *Data = (*(__IO uint16_t*)(Address - 2)); + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + else /* Next address location */ + Address -= 4; + } + /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ + return ReadStatus; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Write the variable virtual address and value in the EEPROM */ + uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + + /* In case the EEPROM active page is full */ + if (Status == PAGE_FULL) /* Perform Page transfer */ + Status = EE_PageTransfer(VirtAddress, Data); + + /* Return last operation status */ + return Status; +} + +/** + * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE + * @param None + * @retval Status of the last operation (Flash write or erase) done during + * EEPROM formating + */ +static HAL_StatusTypeDef EE_Format(void) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + pEraseInit.Sector = PAGE1_ID; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + + return HAL_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Operation: operation to achieve on the valid page. + * This parameter can be one of the following values: + * @arg READ_FROM_VALID_PAGE: read operation from valid page + * @arg WRITE_IN_VALID_PAGE: write operation from valid page + * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case + * of no valid page was found + */ +static uint16_t EE_FindValidPage(uint8_t Operation) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + + /* Get Page0 actual status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + + /* Get Page1 actual status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + /* Write or read operation */ + switch (Operation) { + case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ + if (PageStatus1 == VALID_PAGE) { + /* Page0 receiving data */ + if (PageStatus0 == RECEIVE_DATA) return PAGE0; /* Page0 valid */ + else return PAGE1; /* Page1 valid */ + } + else if (PageStatus0 == VALID_PAGE) { + /* Page1 receiving data */ + if (PageStatus1 == RECEIVE_DATA) return PAGE1; /* Page1 valid */ + else return PAGE0; /* Page0 valid */ + } + else + return NO_VALID_PAGE; /* No valid Page */ + + case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ + if (PageStatus0 == VALID_PAGE) + return PAGE0; /* Page0 valid */ + else if (PageStatus1 == VALID_PAGE) + return PAGE1; /* Page1 valid */ + else + return NO_VALID_PAGE; /* No valid Page */ + + default: + return PAGE0; /* Page0 valid */ + } +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint16_t ValidPage = PAGE0; + uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE; + + /* Get valid Page for write operation */ + ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE)); + + /* Check each active page address starting from begining */ + while (Address < PageEndAddress) { + /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ + if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { + /* Set variable data */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + /* Set variable virtual address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); + /* Return program operation status */ + return FlashStatus; + } + else /* Next address location */ + Address += 4; + } + + /* Return PAGE_FULL in case the valid page is full */ + return PAGE_FULL; +} + +/** + * @brief Transfers last updated variables data from the full Page to + * an empty one. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t NewPageAddress = EEPROM_START_ADDRESS; + uint16_t OldPageId=0; + uint16_t ValidPage = PAGE0, VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + if (ValidPage == PAGE1) { /* Page1 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE0_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE1_ID; + } + else if (ValidPage == PAGE0) { /* Page0 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE1_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE0_ID; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + /* Set the new Page status to RECEIVE_DATA status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Write the variable passed as parameter in the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + + /* Transfer process: transfer variables from old to the new active page */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ + /* Read the other last variable updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = OldPageId; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Erase the old Page: Set old Page status to ERASED status */ + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Set new Page status to VALID_PAGE status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Return last operation flash status */ + return FlashStatus; +} + +#endif // STM32F4 || STM32F4xx + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h new file mode 100644 index 0000000000..476baee92f --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h @@ -0,0 +1,117 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/inc/eeprom.h + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file contains all the functions prototypes for the EEPROM + * emulation firmware library. + ****************************************************************************** + * @attention + * + *

© Copyright � 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __EEEPROM_EMUL_H +#define __EEEPROM_EMUL_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- +#include "../../../inc/MarlinConfig.h" +#include "../HAL.h" + +/* Exported constants --------------------------------------------------------*/ +/* EEPROM emulation firmware error codes */ +#define EE_OK (uint32_t)HAL_OK +#define EE_ERROR (uint32_t)HAL_ERROR +#define EE_BUSY (uint32_t)HAL_BUSY +#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT + +/* Define the size of the sectors to be used */ +#define PAGE_SIZE (uint32_t)0x4000 /* Page size = 16KByte */ + +/* Device voltage range supposed to be [2.7V to 3.6V], the operation will + be done by word */ +#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3 + +/* EEPROM start address in Flash */ +#define EEPROM_START_ADDRESS ((uint32_t)0x08078000) /* EEPROM emulation start address: + after 480KByte of used Flash memory */ + +/* Pages 0 and 1 base and end addresses */ +#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) +#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) +#define PAGE0_ID FLASH_SECTOR_1 + +#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x4000)) +#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1))) +#define PAGE1_ID FLASH_SECTOR_2 + +/* Used Flash pages for EEPROM emulation */ +#define PAGE0 ((uint16_t)0x0000) +#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ + +/* No valid page define */ +#define NO_VALID_PAGE ((uint16_t)0x00AB) + +/* Page status definitions */ +#define ERASED ((uint16_t)0xFFFF) /* Page is empty */ +#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */ +#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */ + +/* Valid pages in read and write defines */ +#define READ_FROM_VALID_PAGE ((uint8_t)0x00) +#define WRITE_IN_VALID_PAGE ((uint8_t)0x01) + +/* Page full define */ +#define PAGE_FULL ((uint8_t)0x80) + +/* Variables' number */ +#define NB_OF_VAR ((uint16_t)4096) + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint16_t EE_Initialise(void); +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); + +#endif /* __EEEPROM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp new file mode 100644 index 0000000000..b76de3dbe8 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "EEPROM_Emul/eeprom_emul.h" + + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +static bool eeprom_initialised = false; +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to +// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F4 +// #define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR + +// -------------------------------------------------------------------------- +// EEPROM +// -------------------------------------------------------------------------- + + +void eeprom_init() { + if (!eeprom_initialised) { + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + /* EEPROM Init */ + if (EE_Initialise() != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); + eeprom_initialised = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + uint16_t eeprom_address = (unsigned) pos; + + eeprom_init(); + + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + if (EE_WriteVariable(eeprom_address, (uint16_t) value) != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); +} + +unsigned char eeprom_read_byte(unsigned char *pos) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned)pos; + + eeprom_init(); + + if (EE_ReadVariable(eeprom_address, &data) != EE_OK) { + return (unsigned char)data; + } + return (unsigned char)data; +} + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned) __src; + + eeprom_init(); + + for (uint8_t c = 0; c < __n; c++) { + EE_ReadVariable(eeprom_address+c, &data); + *((uint8_t*)__dst + c) = data; + } +} + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { + +} + +#endif // ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) +#endif // STM32F4 || STM32F4xx + diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL.cpp new file mode 100644 index 0000000000..c79af5859a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL.cpp @@ -0,0 +1,133 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +//#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source (void) { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) return RST_WATCHDOG; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) return RST_SOFTWARE; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) return RST_EXTERNAL; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) return RST_POWER_ON; + return 0; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.h b/Marlin/src/HAL/HAL_STM32F4/HAL.h new file mode 100644 index 0000000000..4eca97601e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL.h @@ -0,0 +1,255 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef _HAL_STM32F4_H +#define _HAL_STM32F4_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "Arduino.h" + +#ifdef USBCON + #include +#endif + +#include "../math_32bit.h" +#include "../HAL_SPI.h" +#include "fastio_STM32F4.h" +#include "watchdog_STM32F4.h" + +#include "HAL_timers_STM32F4.h" + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//Serial override +//extern HalSerial usb_serial; + +#if SERIAL_PORT == 0 + #error "Serial port 0 does not exist" +#endif + +#if !WITHIN(SERIAL_PORT, -1, 6) + #error "SERIAL_PORT must be from -1 to 6" +#endif +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 1 + #define MYSERIAL0 SerialUART1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 SerialUART2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 SerialUART3 +#elif SERIAL_PORT == 4 + #define MYSERIAL0 SerialUART4 +#elif SERIAL_PORT == 5 + #define MYSERIAL0 SerialUART5 +#elif SERIAL_PORT == 6 + #define MYSERIAL0 SerialUART6 +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == 0 + #error "Serial port 0 does not exist" + #endif + + #if !WITHIN(SERIAL_PORT_2, -1, 6) + #error "SERIAL_PORT_2 must be from -1 to 6" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 SerialUART1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 SerialUART2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 SerialUART3 + #elif SERIAL_PORT_2 == 4 + #define MYSERIAL1 SerialUART4 + #elif SERIAL_PORT_2 == 5 + #define MYSERIAL1 SerialUART5 + #elif SERIAL_PORT_2 == 6 + #define MYSERIAL1 SerialUART6 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define _BV(b) (1 << (b)) + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB libServo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// Disable interrupts +#define cli() do { DISABLE_TEMPERATURE_INTERRUPT(); DISABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) + +// Enable interrupts +#define sei() do { ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); + +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ + +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init(void) {} + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_result + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp new file mode 100644 index 0000000000..2877e88d54 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_STM32F4.h" + +int8_t libServo::attach(const int pin) { + return Servo::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return Servo::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h new file mode 100644 index 0000000000..b68910387c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef HAL_SERVO_STM32F4_H +#define HAL_SERVO_STM32F4_H + +#include + +// Inherit and expand on the official library +class libServo : public Servo { +public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); +private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // HAL_SERVO_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp new file mode 100644 index 0000000000..606d43f7f9 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F4 HAL + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F4. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + + OUT_WRITE(SS_PIN, HIGH); +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + + #ifdef STM32GENERIC + SPI.dmaTransfer(0, const_cast(buf), nbyte); + #else + SPI.transfer((uint8_t*)buf, nbyte); + #endif + + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + + #ifdef STM32GENERIC + SPI.dmaSend(const_cast(buf), 512); + #else + SPI.transfer((uint8_t*)buf, (uint8_t*)0, 512); + #endif + + SPI.endTransaction(); +} + +#endif // SOFTWARE_SPI + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp new file mode 100644 index 0000000000..d03bf4c09b --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_STM32F4.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 2 +#define STEP_TIMER_IRQ_ID TIM5_IRQn +#define TEMP_TIMER_IRQ_ID TIM7_IRQn + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +stm32f4_timer_t TimerHandle[NUM_HARDWARE_TIMERS]; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +bool timers_initialised[NUM_HARDWARE_TIMERS] = {false}; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialised[timer_num]) { + constexpr uint32_t step_prescaler = STEPPER_TIMER_PRESCALE - 1, + temp_prescaler = TEMP_TIMER_PRESCALE - 1; + switch (timer_num) { + case STEP_TIMER_NUM: + // STEPPER TIMER TIM5 - use a 32bit timer + #ifdef STM32GENERIC + __HAL_RCC_TIM5_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM5; + TimerHandle[timer_num].handle.Init.Prescaler = step_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC5_Handler; + #else + TimerHandle[timer_num].timer = TIM5; + TimerHandle[timer_num].irqHandle = TC5_Handler; + TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler); + #endif + HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 6, 0); + break; + + case TEMP_TIMER_NUM: + // TEMP TIMER TIM7 - any available 16bit Timer (1 already used for PWM) + #ifdef STM32GENERIC + __HAL_RCC_TIM7_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM7; + TimerHandle[timer_num].handle.Init.Prescaler = temp_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC7_Handler; + #else + TimerHandle[timer_num].timer = TIM7; + TimerHandle[timer_num].irqHandle = TC7_Handler; + TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / temp_prescaler) / frequency) - 1, temp_prescaler); + #endif + HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_ID, 2, 0); + break; + } + timers_initialised[timer_num] = true; + } + + #ifdef STM32GENERIC + TimerHandle[timer_num].handle.Init.Period = (((HAL_TIMER_RATE) / TimerHandle[timer_num].handle.Init.Prescaler) / frequency) - 1; + if (HAL_TIM_Base_Init(&TimerHandle[timer_num].handle) == HAL_OK) + HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); + #endif +} + +#ifdef STM32GENERIC + extern "C" void TIM5_IRQHandler() { + ((void(*)(void))TimerHandle[0].callback)(); + } + extern "C" void TIM7_IRQHandler() { + ((void(*)(void))TimerHandle[1].callback)(); + } +#endif + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_EnableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_EnableIRQ(TEMP_TIMER_IRQ_ID); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_DisableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_DisableIRQ(TEMP_TIMER_IRQ_ID); break; + } + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)STEP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)STEP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + case TEMP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + } + return false; +} + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h new file mode 100644 index 0000000000..943550d13f --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef _HAL_TIMERS_STM32F4_H +#define _HAL_TIMERS_STM32F4_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#define STEP_TIMER_NUM 0 // index of timer to use for stepper +#define TEMP_TIMER_NUM 1 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +// TODO change this + +#ifdef STM32GENERIC + extern void TC5_Handler(); + extern void TC7_Handler(); + #define HAL_STEP_TIMER_ISR void TC5_Handler() + #define HAL_TEMP_TIMER_ISR void TC7_Handler() +#else + extern void TC5_Handler(stimer_t *htim); + extern void TC7_Handler(stimer_t *htim); + #define HAL_STEP_TIMER_ISR void TC5_Handler(stimer_t *htim) + #define HAL_TEMP_TIMER_ISR void TC7_Handler(stimer_t *htim) +#endif + + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +#ifdef STM32GENERIC + typedef struct { + TIM_HandleTypeDef handle; + uint32_t callback; + } tTimerConfig; + typedef tTimerConfig stm32f4_timer_t; +#else + typedef stimer_t stm32f4_timer_t; +#endif + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern stm32f4_timer_t TimerHandle[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +FORCE_INLINE static uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GET_COUNTER(&TimerHandle[timer_num].handle); +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SET_AUTORELOAD(&TimerHandle[timer_num].handle, compare); + if (HAL_timer_get_count(timer_num) >= compare) + TimerHandle[timer_num].handle.Instance->EGR |= TIM_EGR_UG; // Generate an immediate update interrupt +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); +} + +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) + HAL_timer_set_compare(timer_num, mincmp); +} + +#ifdef STM32GENERIC + FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE) == SET) + __HAL_TIM_CLEAR_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE); + } +#else + #define HAL_timer_isr_prologue(TIMER_NUM) +#endif + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/README.md b/Marlin/src/HAL/HAL_STM32F4/README.md new file mode 100644 index 0000000000..10396e875b --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/README.md @@ -0,0 +1,12 @@ +# This HAL is for the STM32F407 MCU used with STM32Generic Arduino core by danieleff. + +# Arduino core is located at: + +https://github.com/danieleff/STM32GENERIC + +Unzip it into [Arduino]/hardware folder + +# This HAL is in development. + +This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL. + diff --git a/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h new file mode 100644 index 0000000000..605eb9cb15 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F4. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h new file mode 100644 index 0000000000..1b1cffc49f --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h new file mode 100644 index 0000000000..e185344dc2 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O interfaces for STM32F4 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F4_H +#define _FASTIO_STM32F4_H + +#define _BV(b) (1 << (b)) + +#define USEABLE_HARDWARE_PWM(p) true + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define GET_INPUT(IO) +#define GET_OUTPUT(IO) +#define GET_TIMER(IO) + +#define PORTA 0 +#define PORTB 1 +#define PORTC 2 +#define PORTD 3 +#define PORTE 4 + +#define _STM32_PIN(_PORT,_PIN) ((PORT##_PORT * 16) + _PIN) + +#define PA0 _STM32_PIN(A, 0) +#define PA1 _STM32_PIN(A, 1) +#define PA2 _STM32_PIN(A, 2) +#define PA3 _STM32_PIN(A, 3) +#define PA4 _STM32_PIN(A, 4) +#define PA5 _STM32_PIN(A, 5) +#define PA6 _STM32_PIN(A, 6) +#define PA7 _STM32_PIN(A, 7) +#define PA8 _STM32_PIN(A, 8) +#define PA9 _STM32_PIN(A, 9) +#define PA10 _STM32_PIN(A, 10) +#define PA11 _STM32_PIN(A, 11) +#define PA12 _STM32_PIN(A, 12) +#define PA13 _STM32_PIN(A, 13) +#define PA14 _STM32_PIN(A, 14) +#define PA15 _STM32_PIN(A, 15) + +#define PB0 _STM32_PIN(B, 0) +#define PB1 _STM32_PIN(B, 1) +#define PB2 _STM32_PIN(B, 2) +#define PB3 _STM32_PIN(B, 3) +#define PB4 _STM32_PIN(B, 4) +#define PB5 _STM32_PIN(B, 5) +#define PB6 _STM32_PIN(B, 6) +#define PB7 _STM32_PIN(B, 7) +#define PB8 _STM32_PIN(B, 8) +#define PB9 _STM32_PIN(B, 9) +#define PB10 _STM32_PIN(B, 10) +#define PB11 _STM32_PIN(B, 11) +#define PB12 _STM32_PIN(B, 12) +#define PB13 _STM32_PIN(B, 13) +#define PB14 _STM32_PIN(B, 14) +#define PB15 _STM32_PIN(B, 15) + +#define PC0 _STM32_PIN(C, 0) +#define PC1 _STM32_PIN(C, 1) +#define PC2 _STM32_PIN(C, 2) +#define PC3 _STM32_PIN(C, 3) +#define PC4 _STM32_PIN(C, 4) +#define PC5 _STM32_PIN(C, 5) +#define PC6 _STM32_PIN(C, 6) +#define PC7 _STM32_PIN(C, 7) +#define PC8 _STM32_PIN(C, 8) +#define PC9 _STM32_PIN(C, 9) +#define PC10 _STM32_PIN(C, 10) +#define PC11 _STM32_PIN(C, 11) +#define PC12 _STM32_PIN(C, 12) +#define PC13 _STM32_PIN(C, 13) +#define PC14 _STM32_PIN(C, 14) +#define PC15 _STM32_PIN(C, 15) + +#define PD0 _STM32_PIN(D, 0) +#define PD1 _STM32_PIN(D, 1) +#define PD2 _STM32_PIN(D, 2) +#define PD3 _STM32_PIN(D, 3) +#define PD4 _STM32_PIN(D, 4) +#define PD5 _STM32_PIN(D, 5) +#define PD6 _STM32_PIN(D, 6) +#define PD7 _STM32_PIN(D, 7) +#define PD8 _STM32_PIN(D, 8) +#define PD9 _STM32_PIN(D, 9) +#define PD10 _STM32_PIN(D, 10) +#define PD11 _STM32_PIN(D, 11) +#define PD12 _STM32_PIN(D, 12) +#define PD13 _STM32_PIN(D, 13) +#define PD14 _STM32_PIN(D, 14) +#define PD15 _STM32_PIN(D, 15) + +#define PE0 _STM32_PIN(E, 0) +#define PE1 _STM32_PIN(E, 1) +#define PE2 _STM32_PIN(E, 2) +#define PE3 _STM32_PIN(E, 3) +#define PE4 _STM32_PIN(E, 4) +#define PE5 _STM32_PIN(E, 5) +#define PE6 _STM32_PIN(E, 6) +#define PE7 _STM32_PIN(E, 7) +#define PE8 _STM32_PIN(E, 8) +#define PE9 _STM32_PIN(E, 9) +#define PE10 _STM32_PIN(E, 10) +#define PE11 _STM32_PIN(E, 11) +#define PE12 _STM32_PIN(E, 12) +#define PE13 _STM32_PIN(E, 13) +#define PE14 _STM32_PIN(E, 14) +#define PE15 _STM32_PIN(E, 15) + +#endif // _FASTIO_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_STM32F4/persistent_store_impl.cpp new file mode 100644 index 0000000000..db292bbb55 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/persistent_store_impl.cpp @@ -0,0 +1,75 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../persistent_store_api.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +namespace HAL { +namespace PersistentStore { + +bool access_start() { return true; } + +bool access_finish() { return true; } + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F4/spi_pins.h b/Marlin/src/HAL/HAL_STM32F4/spi_pins.h new file mode 100644 index 0000000000..f178ac8107 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/spi_pins.h @@ -0,0 +1,41 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* 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 3 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, see . +* +*/ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + */ +#ifndef SCK_PIN + #define SCK_PIN PA5 +#endif +#ifndef MISO_PIN + #define MISO_PIN PA6 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN PA7 +#endif +#ifndef SS_PIN + #define SS_PIN PA8 +#endif + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp new file mode 100644 index 0000000000..f5dd6bdfae --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog_STM32F4.h" + + IWDG_HandleTypeDef hiwdg; + + void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); + } + } + + void watchdog_reset() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } + else { + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif + } + } + +#endif // USE_WATCHDOG + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h new file mode 100644 index 0000000000..aace2329ef --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h @@ -0,0 +1,33 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* Based on Sprinter and grbl. +* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm +* +* 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 3 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, see . +* +*/ + +#ifndef WATCHDOG_STM32F4_H +#define WATCHDOG_STM32F4_H + +#include "../../inc/MarlinConfig.h" + +extern IWDG_HandleTypeDef hiwdg; + +void watchdog_init(); +void watchdog_reset(); + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp new file mode 100644 index 0000000000..029378561b --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/src/eeprom.c + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file provides all the EEPROM emulation firmware functions. + ****************************************************************************** + * @attention + * + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup EEPROM_Emulation + * @{ + */ +#ifdef STM32F7 + +/* Includes ------------------------------------------------------------------*/ +#include "eeprom_emul.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Global variable used to store variable value in read sequence */ +uint16_t DataVar = 0; + +/* Virtual address defined by the user: 0xFFFF value is prohibited */ +uint16_t VirtAddVarTab[NB_OF_VAR]; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +static HAL_StatusTypeDef EE_Format(void); +static uint16_t EE_FindValidPage(uint8_t Operation); +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_VerifyPageFullyErased(uint32_t Address); + +/** + * @brief Restore the pages to a known good state in case of page's status + * corruption after a power loss. + * @param None. + * @retval - Flash error code: on write Flash error + * - FLASH_COMPLETE: on success + */ +uint16_t EE_Initialise(void) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + uint16_t VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + int16_t x = -1; + HAL_StatusTypeDef FlashStatus; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + + /* Get Page0 status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + /* Get Page1 status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Check for invalid header states and repair if necessary */ + switch (PageStatus0) { + case ERASED: + if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ + /* Erase Page0 */ + if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) { + return FlashStatus; + } + } + } + else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case RECEIVE_DATA: + if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ + /* Transfer data from Page1 to Page0 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page0 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case VALID_PAGE: + if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else { /* Page0 valid, Page1 receive */ + /* Transfer data from Page0 to Page1 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page1 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + break; + + default: /* Any other state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + break; + } + + return HAL_OK; +} + +/** + * @brief Verify if specified page is fully erased. + * @param Address: page address + * This parameter can be one of the following values: + * @arg PAGE0_BASE_ADDRESS: Page0 base address + * @arg PAGE1_BASE_ADDRESS: Page1 base address + * @retval page fully erased status: + * - 0: if Page not erased + * - 1: if Page erased + */ +uint16_t EE_VerifyPageFullyErased(uint32_t Address) { + uint32_t ReadStatus = 1; + uint16_t AddressValue = 0x5555; + /* Check each active page address starting from end */ + while (Address <= PAGE0_END_ADDRESS) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + /* Compare the read address with the virtual address */ + if (AddressValue != ERASED) { + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + /* Next address location */ + Address += 4; + } + /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ + return ReadStatus; +} + +/** + * @brief Returns the last stored variable data, if found, which correspond to + * the passed virtual address + * @param VirtAddress: Variable virtual address + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - 0: if variable was found + * - 1: if the variable was not found + * - NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { + uint16_t ValidPage = PAGE0; + uint16_t AddressValue = 0x5555, ReadStatus = 1; + uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE)); + + /* Check each active page address starting from end */ + while (Address > (PageStartAddress + 2)) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + + /* Compare the read address with the virtual address */ + if (AddressValue == VirtAddress) { + /* Get content of Address-2 which is variable value */ + *Data = (*(__IO uint16_t*)(Address - 2)); + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + else /* Next address location */ + Address -= 4; + } + /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ + return ReadStatus; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Write the variable virtual address and value in the EEPROM */ + uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + + /* In case the EEPROM active page is full */ + if (Status == PAGE_FULL) /* Perform Page transfer */ + Status = EE_PageTransfer(VirtAddress, Data); + + /* Return last operation status */ + return Status; +} + +/** + * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE + * @param None + * @retval Status of the last operation (Flash write or erase) done during + * EEPROM formating + */ +static HAL_StatusTypeDef EE_Format(void) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + pEraseInit.Sector = PAGE1_ID; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + + return HAL_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Operation: operation to achieve on the valid page. + * This parameter can be one of the following values: + * @arg READ_FROM_VALID_PAGE: read operation from valid page + * @arg WRITE_IN_VALID_PAGE: write operation from valid page + * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case + * of no valid page was found + */ +static uint16_t EE_FindValidPage(uint8_t Operation) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + + /* Get Page0 actual status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + + /* Get Page1 actual status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + /* Write or read operation */ + switch (Operation) { + case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ + if (PageStatus1 == VALID_PAGE) { + /* Page0 receiving data */ + if (PageStatus0 == RECEIVE_DATA) return PAGE0; /* Page0 valid */ + else return PAGE1; /* Page1 valid */ + } + else if (PageStatus0 == VALID_PAGE) { + /* Page1 receiving data */ + if (PageStatus1 == RECEIVE_DATA) return PAGE1; /* Page1 valid */ + else return PAGE0; /* Page0 valid */ + } + else + return NO_VALID_PAGE; /* No valid Page */ + + case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ + if (PageStatus0 == VALID_PAGE) + return PAGE0; /* Page0 valid */ + else if (PageStatus1 == VALID_PAGE) + return PAGE1; /* Page1 valid */ + else + return NO_VALID_PAGE; /* No valid Page */ + + default: + return PAGE0; /* Page0 valid */ + } +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint16_t ValidPage = PAGE0; + uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE; + + /* Get valid Page for write operation */ + ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE)); + + /* Check each active page address starting from begining */ + while (Address < PageEndAddress) { + /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ + if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { + /* Set variable data */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + /* Set variable virtual address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); + /* Return program operation status */ + return FlashStatus; + } + else /* Next address location */ + Address += 4; + } + + /* Return PAGE_FULL in case the valid page is full */ + return PAGE_FULL; +} + +/** + * @brief Transfers last updated variables data from the full Page to + * an empty one. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t NewPageAddress = EEPROM_START_ADDRESS; + uint16_t OldPageId=0; + uint16_t ValidPage = PAGE0, VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + if (ValidPage == PAGE1) { /* Page1 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE0_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE1_ID; + } + else if (ValidPage == PAGE0) { /* Page0 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE1_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE0_ID; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + /* Set the new Page status to RECEIVE_DATA status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Write the variable passed as parameter in the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + + /* Transfer process: transfer variables from old to the new active page */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ + /* Read the other last variable updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = OldPageId; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Erase the old Page: Set old Page status to ERASED status */ + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Set new Page status to VALID_PAGE status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Return last operation flash status */ + return FlashStatus; +} + +#endif // STM32F7 + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h new file mode 100644 index 0000000000..d5c54985f5 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h @@ -0,0 +1,118 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/inc/eeprom.h + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file contains all the functions prototypes for the EEPROM + * emulation firmware library. + ****************************************************************************** + * @attention + * + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __EEEPROM_EMUL_H +#define __EEEPROM_EMUL_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- +#include "../../../inc/MarlinConfig.h" +#include "../HAL.h" + +/* Exported constants --------------------------------------------------------*/ +/* EEPROM emulation firmware error codes */ +#define EE_OK (uint32_t)HAL_OK +#define EE_ERROR (uint32_t)HAL_ERROR +#define EE_BUSY (uint32_t)HAL_BUSY +#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT + +/* Define the size of the sectors to be used */ +#define PAGE_SIZE (uint32_t)0x4000 /* Page size = 16KByte */ + +/* Device voltage range supposed to be [2.7V to 3.6V], the operation will + be done by word */ +#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3 + +/* EEPROM start address in Flash */ +#define EEPROM_START_ADDRESS ((uint32_t)0x08100000) /* EEPROM emulation start address: + from sector2 : after 16KByte of used + Flash memory */ + +/* Pages 0 and 1 base and end addresses */ +#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) +#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) +#define PAGE0_ID FLASH_SECTOR_1 + +#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x4000)) +#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1))) +#define PAGE1_ID FLASH_SECTOR_2 + +/* Used Flash pages for EEPROM emulation */ +#define PAGE0 ((uint16_t)0x0000) +#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ + +/* No valid page define */ +#define NO_VALID_PAGE ((uint16_t)0x00AB) + +/* Page status definitions */ +#define ERASED ((uint16_t)0xFFFF) /* Page is empty */ +#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */ +#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */ + +/* Valid pages in read and write defines */ +#define READ_FROM_VALID_PAGE ((uint8_t)0x00) +#define WRITE_IN_VALID_PAGE ((uint8_t)0x01) + +/* Page full define */ +#define PAGE_FULL ((uint8_t)0x80) + +/* Variables' number */ +#define NB_OF_VAR ((uint16_t)4096) + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint16_t EE_Initialise(void); +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); + +#endif /* __EEEPROM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp new file mode 100644 index 0000000000..390ff35de5 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 3 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, see . + * + */ + +#ifdef STM32F7 + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "EEPROM_Emul/eeprom_emul.h" + + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +static bool eeprom_initialised = false; +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to +// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F7 +#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR + +// -------------------------------------------------------------------------- +// EEPROM +// -------------------------------------------------------------------------- + + +void eeprom_init() { + if (!eeprom_initialised) { + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + /* EEPROM Init */ + if (EE_Initialise() != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); + eeprom_initialised = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + uint16_t eeprom_address = (unsigned) pos; + + eeprom_init(); + + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + if (EE_WriteVariable(eeprom_address, (uint16_t) value) != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); +} + +unsigned char eeprom_read_byte(unsigned char *pos) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned)pos; + + eeprom_init(); + + if (EE_ReadVariable(eeprom_address, &data) != EE_OK) { + return (unsigned char)data; + } + return (unsigned char)data; +} + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned) __src; + + eeprom_init(); + + for (uint8_t c = 0; c < __n; c++) { + EE_ReadVariable(eeprom_address+c, &data); + *((uint8_t*)__dst + c) = data; + } +} + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { + +} + +#endif // STM32F7 + diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL.cpp new file mode 100644 index 0000000000..a5c4f39429 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL.cpp @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +//#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source (void) { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) + return RST_WATCHDOG; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) + return RST_SOFTWARE; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) + return RST_EXTERNAL; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) + return RST_POWER_ON; + return 0; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.h b/Marlin/src/HAL/HAL_STM32F7/HAL.h new file mode 100644 index 0000000000..c15d371979 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL.h @@ -0,0 +1,243 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + + + +#ifndef _HAL_STM32F7_H +#define _HAL_STM32F7_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "Arduino.h" + +#include "../math_32bit.h" +#include "../HAL_SPI.h" + +#include "fastio_STM32F7.h" +#include "watchdog_STM32F7.h" + +#include "HAL_timers_STM32F7.h" + + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//Serial override +//extern HalSerial usb_serial; + +#if !WITHIN(SERIAL_PORT, -1, 6) + #error "SERIAL_PORT must be from -1 to 6" +#endif +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 1 + #define MYSERIAL0 SerialUART1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 SerialUART2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 SerialUART3 +#elif SERIAL_PORT == 4 + #define MYSERIAL0 SerialUART4 +#elif SERIAL_PORT == 5 + #define MYSERIAL0 SerialUART5 +#elif SERIAL_PORT == 6 + #define MYSERIAL0 SerialUART6 +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 6) + #error "SERIAL_PORT_2 must be from -1 to 6" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 SerialUART1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 SerialUART2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 SerialUART3 + #elif SERIAL_PORT_2 == 4 + #define MYSERIAL1 SerialUART4 + #elif SERIAL_PORT_2 == 5 + #define MYSERIAL1 SerialUART5 + #elif SERIAL_PORT_2 == 6 + #define MYSERIAL1 SerialUART6 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define _BV(b) (1 << (b)) + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// Disable interrupts +#define cli() do { DISABLE_TEMPERATURE_INTERRUPT(); DISABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) + +// Enable interrupts +#define sei() do { ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init(void) {} + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_result + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp new file mode 100644 index 0000000000..43d95e9059 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifdef STM32F7 + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_STM32F7.h" + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + return Servo::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return Servo::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h new file mode 100644 index 0000000000..14ba0528b0 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef HAL_SERVO_STM32F7_H +#define HAL_SERVO_STM32F7_H + +#include <../../libraries/Servo/src/Servo.h> + +// Inherit and expand on the official library +class libServo : public Servo { +public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); +private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // HAL_SERVO_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp new file mode 100644 index 0000000000..db595eeeb2 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp @@ -0,0 +1,165 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F7 HAL + */ + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F7. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.dmaTransfer(0, const_cast(buf), nbyte); + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + SPI.dmaSend(const_cast(buf), 512); + SPI.endTransaction(); +} + +#endif // SOFTWARE_SPI + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp new file mode 100644 index 0000000000..9454b71c81 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp @@ -0,0 +1,156 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_STM32F7.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 2 + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +tTimerConfig timerConfig[NUM_HARDWARE_TIMERS]; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + + +bool timers_initialised[NUM_HARDWARE_TIMERS] = {false}; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialised[timer_num]) { + switch (timer_num) { + case STEP_TIMER_NUM: + //STEPPER TIMER TIM5 //use a 32bit timer + __HAL_RCC_TIM5_CLK_ENABLE(); + timerConfig[0].timerdef.Instance = TIM5; + timerConfig[0].timerdef.Init.Prescaler = (STEPPER_TIMER_PRESCALE); + timerConfig[0].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[0].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[0].IRQ_Id = TIM5_IRQn; + timerConfig[0].callback = (uint32_t)TC5_Handler; + HAL_NVIC_SetPriority(timerConfig[0].IRQ_Id, 1, 0); + pinMode(STEPPER_ENABLE_PIN,OUTPUT); + digitalWrite(STEPPER_ENABLE_PIN,LOW); + break; + case TEMP_TIMER_NUM: + //TEMP TIMER TIM7 // any available 16bit Timer (1 already used for PWM) + __HAL_RCC_TIM7_CLK_ENABLE(); + timerConfig[1].timerdef.Instance = TIM7; + timerConfig[1].timerdef.Init.Prescaler = (TEMP_TIMER_PRESCALE); + timerConfig[1].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[1].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[1].IRQ_Id = TIM7_IRQn; + timerConfig[1].callback = (uint32_t)TC7_Handler; + HAL_NVIC_SetPriority(timerConfig[1].IRQ_Id, 2, 0); + break; + } + timers_initialised[timer_num] = true; + } + + timerConfig[timer_num].timerdef.Init.Period = (((HAL_TIMER_RATE) / timerConfig[timer_num].timerdef.Init.Prescaler) / frequency) - 1; + + if (HAL_TIM_Base_Init(&timerConfig[timer_num].timerdef) == HAL_OK) + HAL_TIM_Base_Start_IT(&timerConfig[timer_num].timerdef); +} + +//forward the interrupt +extern "C" void TIM5_IRQHandler() { + ((void(*)(void))timerConfig[0].callback)(); +} +extern "C" void TIM7_IRQHandler() { + ((void(*)(void))timerConfig[1].callback)(); +} + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SetAutoreload(&timerConfig[timer_num].timerdef, compare); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + HAL_NVIC_EnableIRQ(timerConfig[timer_num].IRQ_Id); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + HAL_NVIC_DisableIRQ(timerConfig[timer_num].IRQ_Id); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GetAutoreload(&timerConfig[timer_num].timerdef); +} + +uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GetCounter(&timerConfig[timer_num].timerdef); +} + +void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE) == SET) { + __HAL_TIM_CLEAR_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE); + } +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h new file mode 100644 index 0000000000..a97bad75fb --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h @@ -0,0 +1,104 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +#ifndef _HAL_TIMERS_STM32F7_H +#define _HAL_TIMERS_STM32F7_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#define STEP_TIMER_NUM 0 // index of timer to use for stepper +#define TEMP_TIMER_NUM 1 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +// TODO change this + + +extern void TC5_Handler(); +extern void TC7_Handler(); +#define HAL_STEP_TIMER_ISR void TC5_Handler() +#define HAL_TEMP_TIMER_ISR void TC7_Handler() + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + TIM_HandleTypeDef timerdef; + IRQn_Type IRQ_Id; + uint32_t callback; +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//extern const tTimerConfig timerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +uint32_t HAL_timer_get_count(const uint8_t timer_num); +void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/README.md b/Marlin/src/HAL/HAL_STM32F7/README.md new file mode 100644 index 0000000000..2fb39bf25a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/README.md @@ -0,0 +1,28 @@ +# This HAL is for the STM32F765 board "The Borg" used with STM32Generic Arduino core by danieleff. + +# Original core is located at: + +https://github.com/danieleff/STM32GENERIC + +but i have not committed the changes needed for the Borg there yet, so please use: + +https://github.com/Spawn32/STM32GENERIC + +Unzip it into [Arduino]/hardware folder + + +Download the latest GNU ARM Embedded Toolchain: + +https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads + +(The one in Arduino dosen't support STM32F7). + +Change compiler.path in platform.txt to point to that you downloaded. + +# This HAL is in development. +# Currently only tested on "The Borg". + +You will also need the latest Arduino 1.9.0-beta or newer. + +This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL, so shouldn't be to hard to get it to work on a F4. + diff --git a/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h new file mode 100644 index 0000000000..5bd0793a4d --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F7. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp new file mode 100644 index 0000000000..f2d14658eb --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp @@ -0,0 +1,931 @@ +/** + * TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +//#include "Arduino.h" + +#ifdef STM32F7 + +#include +#include +#include "TMC2660.h" + +#include "../../HAL/HAL_STM32F7/HAL_STM32F7.h" +#include "../../core/serial.h" +#include "../../inc/MarlinConfig.h" +#include "../../Marlin.h" +#include "../../module/stepper_indirection.h" +#include "../../module/printcounter.h" +#include "../../libs/duration_t.h" +#include "../../libs/hex_print_routines.h" + + +//some default values used in initialization +#define DEFAULT_MICROSTEPPING_VALUE 32 + +//TMC26X register definitions +#define DRIVER_CONTROL_REGISTER 0x0ul +#define CHOPPER_CONFIG_REGISTER 0x80000ul +#define COOL_STEP_REGISTER 0xA0000ul +#define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul +#define DRIVER_CONFIG_REGISTER 0xE0000ul + +#define REGISTER_BIT_PATTERN 0xFFFFFul + +//definitions for the driver control register +#define MICROSTEPPING_PATTERN 0xFul +#define STEP_INTERPOLATION 0x200ul +#define DOUBLE_EDGE_STEP 0x100ul +#define VSENSE 0x40ul +#define READ_MICROSTEP_POSTION 0x0ul +#define READ_STALL_GUARD_READING 0x10ul +#define READ_STALL_GUARD_AND_COOL_STEP 0x20ul +#define READ_SELECTION_PATTERN 0x30ul + +//definitions for the chopper config register +#define CHOPPER_MODE_STANDARD 0x0ul +#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000ul +#define T_OFF_PATTERN 0xFul +#define RANDOM_TOFF_TIME 0x2000ul +#define BLANK_TIMING_PATTERN 0x18000ul +#define BLANK_TIMING_SHIFT 15 +#define HYSTERESIS_DECREMENT_PATTERN 0x1800ul +#define HYSTERESIS_DECREMENT_SHIFT 11 +#define HYSTERESIS_LOW_VALUE_PATTERN 0x780ul +#define HYSTERESIS_LOW_SHIFT 7 +#define HYSTERESIS_START_VALUE_PATTERN 0x78ul +#define HYSTERESIS_START_VALUE_SHIFT 4 +#define T_OFF_TIMING_PATERN 0xFul + +//definitions for cool step register +#define MINIMUM_CURRENT_FOURTH 0x8000ul +#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000ul +#define SE_MAX_PATTERN 0xF00ul +#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60ul +#define SE_MIN_PATTERN 0xFul + +//definitions for stall guard2 current register +#define STALL_GUARD_FILTER_ENABLED 0x10000ul +#define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul +#define CURRENT_SCALING_PATTERN 0x1Ful +#define STALL_GUARD_CONFIG_PATTERN 0x17F00ul +#define STALL_GUARD_VALUE_PATTERN 0x7F00ul + +//definitions for the input from the TCM260 +#define STATUS_STALL_GUARD_STATUS 0x1ul +#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2ul +#define STATUS_OVER_TEMPERATURE_WARNING 0x4ul +#define STATUS_SHORT_TO_GROUND_A 0x8ul +#define STATUS_SHORT_TO_GROUND_B 0x10ul +#define STATUS_OPEN_LOAD_A 0x20ul +#define STATUS_OPEN_LOAD_B 0x40ul +#define STATUS_STAND_STILL 0x80ul +#define READOUT_VALUE_PATTERN 0xFFC00ul + +#define CPU_32_BIT + +//default values +#define INITIAL_MICROSTEPPING 0x3ul //32th microstepping + +SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); + +#define STEPPER_SPI SPI_6 + +//debuging output + +//#define TMC_DEBUG1 + +unsigned char current_scaling = 0; + +/** + * Constructor + * number_of_steps - the steps per rotation + * cs_pin - the SPI client select pin + * dir_pin - the pin where the direction pin is connected + * step_pin - the pin where the step pin is connected + */ +TMC26XStepper::TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int current, unsigned int resistor) { + // We are not started yet + started = false; + + // By default cool step is not enabled + cool_step_enabled = false; + + // Save the pins for later use + this->cs_pin = cs_pin; + this->dir_pin = dir_pin; + this->step_pin = step_pin; + + // Store the current sense resistor value for later use + this->resistor = resistor; + + // Initizalize our status values + this->steps_left = 0; + this->direction = 0; + + // Initialize register values + driver_control_register_value = DRIVER_CONTROL_REGISTER | INITIAL_MICROSTEPPING; + chopper_config_register = CHOPPER_CONFIG_REGISTER; + + // Setting the default register values + driver_control_register_value = DRIVER_CONTROL_REGISTER|INITIAL_MICROSTEPPING; + microsteps = _BV(INITIAL_MICROSTEPPING); + chopper_config_register = CHOPPER_CONFIG_REGISTER; + cool_step_register_value = COOL_STEP_REGISTER; + stall_guard2_current_register_value = STALL_GUARD2_LOAD_MEASURE_REGISTER; + driver_configuration_register_value = DRIVER_CONFIG_REGISTER | READ_STALL_GUARD_READING; + + // Set the current + setCurrent(current); + // Set to a conservative start value + setConstantOffTimeChopper(7, 54, 13,12,1); + // Set a nice microstepping value + setMicrosteps(DEFAULT_MICROSTEPPING_VALUE); + // Save the number of steps + this->number_of_steps = number_of_steps; +} + + +/** + * start & configure the stepper driver + * just must be called. + */ +void TMC26XStepper::start() { + + #ifdef TMC_DEBUG1 + SERIAL_ECHOPGM("\n TMC26X stepper library \n"); + SERIAL_ECHOPAIR("\n CS pin: ", cs_pin); + SERIAL_ECHOPAIR("\n DIR pin: ", dir_pin); + SERIAL_ECHOPAIR("\n STEP pin: ", step_pin); + SERIAL_PRINTF("\n current scaling: %d", current_scaling); + SERIAL_PRINTF("\n Resistor: %d", resistor); + //SERIAL_PRINTF("\n current: %d", current); + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + + //set the pins as output & its initial value + pinMode(step_pin, OUTPUT); + pinMode(dir_pin, OUTPUT); + pinMode(cs_pin, OUTPUT); + //pinMode(STEPPER_ENABLE_PIN, OUTPUT); + digitalWrite(step_pin, LOW); + digitalWrite(dir_pin, LOW); + digitalWrite(cs_pin, HIGH); + + STEPPER_SPI.begin(); + STEPPER_SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); + + //set the initial values + send262(driver_control_register_value); + send262(chopper_config_register); + send262(cool_step_register_value); + send262(stall_guard2_current_register_value); + send262(driver_configuration_register_value); + + //save that we are in running mode + started = true; +} + +/** + * Mark the driver as unstarted to be able to start it again + */ +void TMC26XStepper::un_start() { started = false; } + + +/** + * Sets the speed in revs per minute + */ +void TMC26XStepper::setSpeed(unsigned int whatSpeed) { + this->speed = whatSpeed; + this->step_delay = 60UL * sq(1000UL) / ((unsigned long)this->number_of_steps * (unsigned long)whatSpeed * (unsigned long)this->microsteps); + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("Step delay in micros: "); + SERIAL_ECHOPAIR("\nStep delay in micros: ", this->step_delay); + #endif + // Update the next step time + this->next_step_time = this->last_step_time + this->step_delay; +} + +unsigned int TMC26XStepper::getSpeed(void) { return this->speed; } + +/** + * Moves the motor steps_to_move steps. + * Negative indicates the reverse direction. + */ +char TMC26XStepper::step(int steps_to_move) { + if (this->steps_left == 0) { + this->steps_left = ABS(steps_to_move); // how many steps to take + + // determine direction based on whether steps_to_move is + or -: + if (steps_to_move > 0) + this->direction = 1; + else if (steps_to_move < 0) + this->direction = 0; + return 0; + } + return -1; +} + +char TMC26XStepper::move(void) { + // decrement the number of steps, moving one step each time: + if (this->steps_left > 0) { + unsigned long time = micros(); + // move only if the appropriate delay has passed: + + // rem if (time >= this->next_step_time) { + + if (ABS(time - this->last_step_time) > this->step_delay) { + // increment or decrement the step number, + // depending on direction: + if (this->direction == 1) + digitalWrite(step_pin, HIGH); + else { + digitalWrite(dir_pin, HIGH); + digitalWrite(step_pin, HIGH); + } + // get the timeStamp of when you stepped: + this->last_step_time = time; + this->next_step_time = time + this->step_delay; + // decrement the steps left: + steps_left--; + //disable the step & dir pins + digitalWrite(step_pin, LOW); + digitalWrite(dir_pin, LOW); + } + return -1; + } + return 0; +} + +char TMC26XStepper::isMoving(void) { return this->steps_left > 0; } + +unsigned int TMC26XStepper::getStepsLeft(void) { return this->steps_left; } + +char TMC26XStepper::stop(void) { + //note to self if the motor is currently moving + char state = isMoving(); + //stop the motor + this->steps_left = 0; + this->direction = 0; + //return if it was moving + return state; +} + +void TMC26XStepper::setCurrent(unsigned int current) { + unsigned char current_scaling = 0; + //calculate the current scaling from the max current setting (in mA) + double mASetting = (double)current, + resistor_value = (double)this->resistor; + // remove vsense flag + this->driver_configuration_register_value &= ~(VSENSE); + // Derived from I = (cs + 1) / 32 * (Vsense / Rsense) + // leading to cs = 32 * R * I / V (with V = 0,31V oder 0,165V and I = 1000 * current) + // with Rsense = 0,15 + // for vsense = 0,310V (VSENSE not set) + // or vsense = 0,165V (VSENSE set) + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.31 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + + // Check if the current scalingis too low + if (current_scaling < 16) { + // Set the csense bit to get a use half the sense voltage (to support lower motor currents) + this->driver_configuration_register_value |= VSENSE; + // and recalculate the current setting + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.165 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("CS (Vsense=1): "); + SERIAL_ECHOPAIR("\nCS (Vsense=1): ",current_scaling); + } else { + //SERIAL_PRINTF("CS: "); + SERIAL_ECHOPAIR("\nCS: ", current_scaling); + #endif + } + + // do some sanity checks + NOMORE(current_scaling, 31); + + // delete the old value + stall_guard2_current_register_value &= ~(CURRENT_SCALING_PATTERN); + // set the new current scaling + stall_guard2_current_register_value |= current_scaling; + // if started we directly send it to the motor + if (started) { + send262(driver_configuration_register_value); + send262(stall_guard2_current_register_value); + } +} + +unsigned int TMC26XStepper::getCurrent(void) { + // Calculate the current according to the datasheet to be on the safe side. + // This is not the fastest but the most accurate and illustrative way. + double result = (double)(stall_guard2_current_register_value & CURRENT_SCALING_PATTERN), + resistor_value = (double)this->resistor, + voltage = (driver_configuration_register_value & VSENSE) ? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (unsigned int)result; +} + +void TMC26XStepper::setStallGuardThreshold(char stall_guard_threshold, char stall_guard_filter_enabled) { + // We just have 5 bits + LIMIT(stall_guard_threshold, -64, 63); + + // Add trim down to 7 bits + stall_guard_threshold &= 0x7F; + // Delete old stall guard settings + stall_guard2_current_register_value &= ~(STALL_GUARD_CONFIG_PATTERN); + if (stall_guard_filter_enabled) + stall_guard2_current_register_value |= STALL_GUARD_FILTER_ENABLED; + + // Set the new stall guard threshold + stall_guard2_current_register_value |= (((unsigned long)stall_guard_threshold << 8) & STALL_GUARD_CONFIG_PATTERN); + // If started we directly send it to the motor + if (started) send262(stall_guard2_current_register_value); +} + +char TMC26XStepper::getStallGuardThreshold(void) { + unsigned long stall_guard_threshold = stall_guard2_current_register_value & STALL_GUARD_VALUE_PATTERN; + //shift it down to bit 0 + stall_guard_threshold >>= 8; + //convert the value to an int to correctly handle the negative numbers + char result = stall_guard_threshold; + //check if it is negative and fill it up with leading 1 for proper negative number representation + //rem if (result & _BV(6)) { + + if (TEST(result, 6)) result |= 0xC0; + return result; +} + +char TMC26XStepper::getStallGuardFilter(void) { + if (stall_guard2_current_register_value & STALL_GUARD_FILTER_ENABLED) + return -1; + return 0; +} + +/** + * Set the number of microsteps per step. + * 0,2,4,8,16,32,64,128,256 is supported + * any value in between will be mapped to the next smaller value + * 0 and 1 set the motor in full step mode + */ +void TMC26XStepper::setMicrosteps(int number_of_steps) { + long setting_pattern; + //poor mans log + if (number_of_steps >= 256) { + setting_pattern = 0; + microsteps = 256; + } + else if (number_of_steps >= 128) { + setting_pattern = 1; + microsteps = 128; + } + else if (number_of_steps >= 64) { + setting_pattern = 2; + microsteps = 64; + } + else if (number_of_steps >= 32) { + setting_pattern = 3; + microsteps = 32; + } + else if (number_of_steps >= 16) { + setting_pattern = 4; + microsteps = 16; + } + else if (number_of_steps >= 8) { + setting_pattern = 5; + microsteps = 8; + } + else if (number_of_steps >= 4) { + setting_pattern = 6; + microsteps = 4; + } + else if (number_of_steps >= 2) { + setting_pattern = 7; + microsteps = 2; + //1 and 0 lead to full step + } + else if (number_of_steps <= 1) { + setting_pattern = 8; + microsteps = 1; + } + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("Microstepping: "); + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + // Delete the old value + this->driver_control_register_value &= 0xFFFF0UL; + // Set the new value + this->driver_control_register_value |= setting_pattern; + + // If started we directly send it to the motor + if (started) send262(driver_control_register_value); + + // Recalculate the stepping delay by simply setting the speed again + this->setSpeed(this->speed); +} + +/** + * returns the effective number of microsteps at the moment + */ +int TMC26XStepper::getMicrosteps(void) { return microsteps } + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * fast_decay_time_setting: Fast decay time setting. With CHM=1, these bits control the portion of fast decay for each chopper cycle. + * 0: slow decay only + * 1...15: duration of fast decay phase + * + * sine_wave_offset: Sine wave offset. With CHM=1, these bits control the sine wave offset. + * A positive offset corrects for zero crossing error. + * -3..-1: negative offset 0: no offset 1...12: positive offset + * + * use_current_comparator: Selects usage of the current comparator for termination of the fast decay cycle. + * If current comparator is enabled, it terminates the fast decay cycle in case the current + * reaches a higher negative value than the actual positive value. + * 1: enable comparator termination of fast decay cycle + * 0: end by time only + */ +void TMC26XStepper::setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, unsigned char use_current_comparator) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(fast_decay_time_setting, 0, 15); + LIMIT(sine_wave_offset, -3, 12); + + // Shift the sine_wave_offset + sine_wave_offset += 3; + + // Calculate the register setting + // First of all delete all the values for this + chopper_config_register &= ~(_BV(12) | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + // Set the constant off pattern + chopper_config_register |= CHOPPER_MODE_T_OFF_FAST_DECAY; + // Set the blank timing value + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + // Setting the constant off time + chopper_config_register |= constant_off_time; + // Set the fast decay time + // Set msb + chopper_config_register |= (((unsigned long)(fast_decay_time_setting & 0x8)) << HYSTERESIS_DECREMENT_SHIFT); + // Other bits + chopper_config_register |= (((unsigned long)(fast_decay_time_setting & 0x7)) << HYSTERESIS_START_VALUE_SHIFT); + // Set the sine wave offset + chopper_config_register |= (unsigned long)sine_wave_offset << HYSTERESIS_LOW_SHIFT; + // Using the current comparator? + if (!use_current_comparator) + chopper_config_register |= _BV(12); + + // If started we directly send it to the motor + if (started) { + // rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * hysteresis_start: Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value HEND. + * 1...8 + * + * hysteresis_end: Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by HDEC. + * The sum HSTRT+HEND must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * -3..-1: negative HEND 0: zero HEND 1...12: positive HEND + * + * hysteresis_decrement: Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. + * 0: fast decrement 3: very slow decrement + */ + +void TMC26XStepper::setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(hysteresis_start, 1, 8); + hysteresis_start--; + + LIMIT(hysteresis_start, -3, 12); + + // Shift the hysteresis_end + hysteresis_end += 3; + + LIMIT(hysteresis_decrement, 0, 3); + + //first of all delete all the values for this + chopper_config_register &= ~(CHOPPER_MODE_T_OFF_FAST_DECAY | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + + //set the blank timing value + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + //setting the constant off time + chopper_config_register |= constant_off_time; + //set the hysteresis_start + chopper_config_register |= ((unsigned long)hysteresis_start) << HYSTERESIS_START_VALUE_SHIFT; + //set the hysteresis end + chopper_config_register |= ((unsigned long)hysteresis_end) << HYSTERESIS_LOW_SHIFT; + //set the hystereis decrement + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, thus it depends on the microstep position. + * With some motors a slightly audible beat can occur between the chopper frequencies, especially when they are near to each other. This typically occurs at a + * few microstep positions within each quarter wave. This effect normally is not audible when compared to mechanical noise generated by ball bearings, etc. + * Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * Hint: A common factor, which can cause motor noise, is a bad PCB layout causing coupling of both sense resistor voltages + * (please refer to sense resistor layout hint in chapter 8.1). + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on by the RNDTF bit. The RNDTF feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ +void TMC26XStepper::setRandomOffTime(char value) { + if (value) + chopper_config_register |= RANDOM_TOFF_TIME; + else + chopper_config_register &= ~(RANDOM_TOFF_TIME); + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +void TMC26XStepper::setCoolStepConfiguration( + unsigned int lower_SG_threshold, + unsigned int SG_hysteresis, + unsigned char current_decrement_step_size, + unsigned char current_increment_step_size, + unsigned char lower_current_limit) +{ + // Sanitize the input values + NOMORE(lower_SG_threshold, 480); + // Divide by 32 + lower_SG_threshold >>= 5; + NOMORE(SG_hysteresis, 480); + // Divide by 32 + SG_hysteresis >>= 5; + NOMORE(current_decrement_step_size, 3); + NOMORE(current_increment_step_size, 3); + NOMORE(lower_current_limit, 1); + + // Store the lower level in order to enable/disable the cool step + this->cool_step_lower_threshold=lower_SG_threshold; + // If cool step is not enabled we delete the lower value to keep it disabled + if (!this->cool_step_enabled) lower_SG_threshold = 0; + // The good news is that we can start with a complete new cool step register value + // And simply set the values in the register + cool_step_register_value = ((unsigned long)lower_SG_threshold) + | (((unsigned long)SG_hysteresis) << 8) + | (((unsigned long)current_decrement_step_size) << 5) + | (((unsigned long)current_increment_step_size) << 13) + | (((unsigned long)lower_current_limit) << 15) + | COOL_STEP_REGISTER; // Register signature + + //SERIAL_PRINTFln(cool_step_register_value,HEX); + if (started) send262(cool_step_register_value); +} + +void TMC26XStepper::setCoolStepEnabled(boolean enabled) { + // Simply delete the lower limit to disable the cool step + cool_step_register_value &= ~SE_MIN_PATTERN; + // And set it to the proper value if cool step is to be enabled + if (enabled) + cool_step_register_value |= this->cool_step_lower_threshold; + // And save the enabled status + this->cool_step_enabled = enabled; + // Save the register value + if (started) send262(cool_step_register_value); +} + +boolean TMC26XStepper::isCoolStepEnabled(void) { return this->cool_step_enabled; } + +unsigned int TMC26XStepper::getCoolStepLowerSgThreshold() { + // We return our internally stored value - in order to provide the correct setting even if cool step is not enabled + return this->cool_step_lower_threshold<<5; +} + +unsigned int TMC26XStepper::getCoolStepUpperSgThreshold() { + return (unsigned char)((cool_step_register_value & SE_MAX_PATTERN) >> 8) << 5; +} + +unsigned char TMC26XStepper::getCoolStepCurrentIncrementSize() { + return (unsigned char)((cool_step_register_value & CURRENT_DOWN_STEP_SPEED_PATTERN) >> 13); +} + +unsigned char TMC26XStepper::getCoolStepNumberOfSGReadings() { + return (unsigned char)((cool_step_register_value & SE_CURRENT_STEP_WIDTH_PATTERN) >> 5); +} + +unsigned char TMC26XStepper::getCoolStepLowerCurrentLimit() { + return (unsigned char)((cool_step_register_value & MINIMUM_CURRENT_FOURTH) >> 15); +} + +void TMC26XStepper::setEnabled(boolean enabled) { + //delete the t_off in the chopper config to get sure + chopper_config_register &= ~(T_OFF_PATTERN); + if (enabled) { + //and set the t_off time + chopper_config_register |= this->constant_off_time; + } + //if not enabled we don't have to do anything since we already delete t_off from the register + if (started) send262(chopper_config_register); +} + +boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_PATTERN); } + +/** + * reads a value from the TMC26X status register. The value is not obtained directly but can then + * be read by the various status routines. + * + */ +void TMC26XStepper::readStatus(char read_value) { + unsigned long old_driver_configuration_register_value = driver_configuration_register_value; + //reset the readout configuration + driver_configuration_register_value &= ~(READ_SELECTION_PATTERN); + //this now equals TMC26X_READOUT_POSITION - so we just have to check the other two options + if (read_value == TMC26X_READOUT_STALLGUARD) + driver_configuration_register_value |= READ_STALL_GUARD_READING; + else if (read_value == TMC26X_READOUT_CURRENT) + driver_configuration_register_value |= READ_STALL_GUARD_AND_COOL_STEP; + + //all other cases are ignored to prevent funny values + //check if the readout is configured for the value we are interested in + if (driver_configuration_register_value != old_driver_configuration_register_value) { + //because then we need to write the value twice - one time for configuring, second time to get the value, see below + send262(driver_configuration_register_value); + } + //write the configuration to get the last status + send262(driver_configuration_register_value); +} + +int TMC26XStepper::getMotorPosition(void) { + //we read it out even if we are not started yet - perhaps it is useful information for somebody + readStatus(TMC26X_READOUT_POSITION); + return getReadoutValue(); +} + +//reads the stall guard setting from last status +//returns -1 if stallguard information is not present +int TMC26XStepper::getCurrentStallGuardReading(void) { + //if we don't yet started there cannot be a stall guard value + if (!started) return -1; + //not time optimal, but solution optiomal: + //first read out the stall guard value + readStatus(TMC26X_READOUT_STALLGUARD); + return getReadoutValue(); +} + +unsigned char TMC26XStepper::getCurrentCSReading(void) { + //if we don't yet started there cannot be a stall guard value + if (!started) return 0; + //not time optimal, but solution optiomal: + //first read out the stall guard value + readStatus(TMC26X_READOUT_CURRENT); + return (getReadoutValue() & 0x1F); +} + +unsigned int TMC26XStepper::getCurrentCurrent(void) { + double result = (double)getCurrentCSReading(), + resistor_value = (double)this->resistor, + voltage = (driver_configuration_register_value & VSENSE)? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (unsigned int)result; +} + +/** + * Return true if the stallguard threshold has been reached + */ +boolean TMC26XStepper::isStallGuardOverThreshold(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +/** + * returns if there is any over temperature condition: + * OVER_TEMPERATURE_PREWARING if pre warning level has been reached + * OVER_TEMPERATURE_SHUTDOWN if the temperature is so hot that the driver is shut down + * Any of those levels are not too good. + */ +char TMC26XStepper::getOverTemperature(void) { + if (!this->started) return 0; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_SHUTDOWN) + return TMC26X_OVERTEMPERATURE_SHUTDOWN; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_WARNING) + return TMC26X_OVERTEMPERATURE_PREWARING; + + return 0; +} + +// Is motor channel A shorted to ground +boolean TMC26XStepper::isShortToGroundA(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_A); +} + +// Is motor channel B shorted to ground +boolean TMC26XStepper::isShortToGroundB(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_B); +} + +// Is motor channel A connected +boolean TMC26XStepper::isOpenLoadA(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_A); +} + +// Is motor channel B connected +boolean TMC26XStepper::isOpenLoadB(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_B); +} + +// Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStandStill(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STAND_STILL); +} + +//is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStallGuardReached(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +//reads the stall guard setting from last status +//returns -1 if stallguard inforamtion is not present +int TMC26XStepper::getReadoutValue(void) { + return (int)(driver_status_result >> 10); +} + +int TMC26XStepper::getResistor() { return this->resistor; } + +boolean TMC26XStepper::isCurrentScalingHalfed() { + return !!(this->driver_configuration_register_value & VSENSE); +} +/** + * version() returns the version of the library: + */ +int TMC26XStepper::version(void) { return 1; } + +void TMC26XStepper::debugLastStatus() { + #ifdef TMC_DEBUG1 + if (this->started) { + if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_PREWARING) + SERIAL_ECHOLNPGM("\n WARNING: Overtemperature Prewarning!"); + else if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_SHUTDOWN) + SERIAL_ECHOLNPGM("\n ERROR: Overtemperature Shutdown!"); + + if (this->isShortToGroundA()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel A!"); + + if (this->isShortToGroundB()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel B!"); + + if (this->isOpenLoadA()) + SERIAL_ECHOLNPGM("\n ERROR: Channel A seems to be unconnected!"); + + if (this->isOpenLoadB()) + SERIAL_ECHOLNPGM("\n ERROR: Channel B seems to be unconnected!"); + + if (this->isStallGuardReached()) + SERIAL_ECHOLNPGM("\n INFO: Stall Guard level reached!"); + + if (this->isStandStill()) + SERIAL_ECHOLNPGM("\n INFO: Motor is standing still."); + + unsigned long readout_config = driver_configuration_register_value & READ_SELECTION_PATTERN; + const int value = getReadoutValue(); + if (readout_config == READ_MICROSTEP_POSTION) { + //SERIAL_PRINTF("Microstep postion phase A: "); + SERIAL_ECHOPAIR("\n Microstep postion phase A: ", value); + } + else if (readout_config == READ_STALL_GUARD_READING) { + //SERIAL_PRINTF("Stall Guard value:"); + SERIAL_ECHOPAIR("\n Stall Guard value:", value); + } + else if (readout_config == READ_STALL_GUARD_AND_COOL_STEP) { + int stallGuard = value & 0xF, current = value & 0x1F0; + //SERIAL_PRINTF("Approx Stall Guard: "); + SERIAL_ECHOPAIR("\n Approx Stall Guard: ", stallGuard); + //SERIAL_PRINTF("Current level"); + SERIAL_ECHOPAIR("\n Current level", current); + } + } + #endif +} + +/** + * send register settings to the stepper driver via SPI + * returns the current status + */ +inline void TMC26XStepper::send262(unsigned long datagram) { + unsigned long i_datagram; + + //preserver the previous spi mode + //unsigned char oldMode = SPCR & SPI_MODE_MASK; + + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(SPI_MODE3); + //} + + //select the TMC driver + digitalWrite(cs_pin,LOW); + + //ensure that only valid bist are set (0-19) + //datagram &=REGISTER_BIT_PATTERN; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Sending "); + //SERIAL_PRINTF("Sending ", datagram,HEX); + //SERIAL_ECHOPAIR("\n\nSending \n", print_hex_long(datagram)); + SERIAL_PRINTF("\n\nSending %x", datagram); + #endif + + //write/read the values + i_datagram = STEPPER_SPI.transfer((datagram >> 16) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram >> 8) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram) & 0xFF); + i_datagram >>= 4; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Received "); + //SERIAL_PRINTF("Received ", i_datagram,HEX); + //SERIAL_ECHOPAIR("\n\nReceived \n", i_datagram); + SERIAL_PRINTF("\n\nReceived %x", i_datagram); + debugLastStatus(); + #endif + + //deselect the TMC chip + digitalWrite(cs_pin,HIGH); + + //restore the previous SPI mode if neccessary + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(oldMode); + //} + + //store the datagram as status result + driver_status_result = i_datagram; +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/TMC2660.h b/Marlin/src/HAL/HAL_STM32F7/TMC2660.h new file mode 100644 index 0000000000..4c8f2bf731 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/TMC2660.h @@ -0,0 +1,607 @@ +/** + * TMC26XStepper.h - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "../../inc/MarlinConfig.h" + +// ensure this library description is only included once +#ifndef _TMC26XSTEPPER_H_ +#define _TMC26XSTEPPER_H_ + +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature situation in the TMC chip +/*! + * This warning indicates that the TCM chip is too warm. + * It is still working but some parameters may be inferior. + * You should do something against it. + */ +#define TMC26X_OVERTEMPERATURE_PREWARING 1 +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature shutdown in the TMC chip +/*! + * This warning indicates that the TCM chip is too warm to operate and has shut down to prevent damage. + * It will stop working until it cools down again. + * If you encouter this situation you must do something against it. Like reducing the current or improving the PCB layout + * and/or heat management. + */ +#define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 + +//which values can be read out +/*! + * Selects to readout the microstep position from the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_POSITION 0 +/*! + * Selects to read out the StallGuard value of the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_STALLGUARD 1 +/*! + * Selects to read out the current current setting (acc. to CoolStep) and the upper bits of the StallGuard value from the motor. + *\sa readStatus(), setCurrent() + */ +#define TMC26X_READOUT_CURRENT 3 + +/*! + * Define to set the minimum current for CoolStep operation to 1/2 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_HALF_CS_LIMIT 0 +/*! + * Define to set the minimum current for CoolStep operation to 1/4 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_QUARTDER_CS_LIMIT 1 + +/*! + * \class TMC26XStepper + * \brief Class representing a TMC26X stepper driver + * + * In order to use one fo those drivers in your Arduino code you have to create an object of that class: + * \code + * TMC26XStepper stepper = TMC26XStepper(200,1,2,3,500); + * \endcode + * see TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int rms_current) + * + * Keep in mind that you need to start the driver with start() in order to get the TMC26X configured. + * + * The most important function is the move(). It checks if the motor has to do a step or not. + * It is important that you call move() as often as possible in your Arduino loop() routine. I suggest + * to use a very fast loop routine and always call it at the beginning or the end. + * + * In order to move you have to provide a movement speed with setSpeed(). The speed is a positive value setting + * the rotations per minute. + * + * To really move the motor you have to call step() to tell the driver to move the motor the given number + * of steps in the given direction. Positive values move the motor in one direction, negative values in the other direction. + * + * You can check with isMoving() if the mototr is still moving or stop it apruptely with stop(). + */ +class TMC26XStepper { + public: + /*! + * \brief creates a new represenatation of a stepper motor connected to a TMC26X stepper driver + * + * This is the main constructor. If in doubt use this. You must provide all parameters as described below. + * + * \param number_of_steps the number of steps the motor has per rotation. + * \param cs_pin The Arduino pin you have connected the Cient Select Pin (!CS) of the TMC26X for SPI + * \param dir_pin the number of the Arduino pin the Direction input of the TMC26X is connected + * \param step_pin the number of the Arduino pin the step pin of the TMC26X driver is connected. + * \param rms_current the maximum current to privide to the motor in mA (!). A value of 200 would send up to 200mA to the motor + * \param resistor the current sense resistor in milli Ohm, defaults to ,15 Ohm ( or 150 milli Ohm) as in the TMC260 Arduino Shield + * + * Keep in mind that you must also call TMC26XStepper.start() in order to configure the stepper driver for use. + * + * By default the Constant Off Time chopper is used, see TCM262Stepper.setConstantOffTimeChopper() for details. + * This should work on most motors (YMMV). You may want to configure and use the Spread Cycle Chopper, see setSpreadCycleChopper(). + * + * By default a microstepping of 1/32th is used to provide a smooth motor run, while still giving a good progression per step. + * You can select a different stepping with setMicrosteps() to aa different value. + * \sa start(), setMicrosteps() + */ + TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int current, unsigned int resistor=100); //resistor=150 + + /*! + * \brief configures and starts the TMC26X stepper driver. Before you called this function the stepper driver is in nonfunctional mode. + * + * This routine configures the TMC26X stepper driver for the given values via SPI. + * Most member functions are non functional if the driver has not been started. + * Therefore it is best to call this in your Arduino setup() function. + */ + void start(); + + /*! + * \brief resets the stepper in unconfigured mode. + * + * This routine enables you to call start again. It does not change anything + * in the internal stepper configuration or the desired configuration. + * It just marks the stepper as not yet startet. You do not have to reconfigure + * the stepper to start it again, but it is not reset to any factory settings + * this has to be configured back by yourself. + * (Hint: Normally you do not need this function) + */ + void un_start(); + + + /*! + * \brief Sets the rotation speed in revolutions per minute. + * \param whatSpeed the desired speed in rotations per minute. + */ + void setSpeed(unsigned int whatSpeed); + + /*! + * \brief reads out the currently selected speed in revolutions per minute. + * \sa setSpeed() + */ + unsigned int getSpeed(void); + + /*! + * \brief Set the number of microsteps in 2^i values (rounded) up to 256 + * + * This method set's the number of microsteps per step in 2^i interval. + * This means you can select 1, 2, 4, 16, 32, 64, 128 or 256 as valid microsteps. + * If you give any other value it will be rounded to the next smaller number (3 would give a microstepping of 2). + * You can always check the current microstepping with getMicrosteps(). + */ + void setMicrosteps(int number_of_steps); + + /*! + * \brief returns the effective current number of microsteps selected. + * + * This function always returns the effective number of microsteps. + * This can be a bit different than the micro steps set in setMicrosteps() since it is rounded to 2^i. + * + * \sa setMicrosteps() + */ + int getMicrosteps(void); + + /*! + * \brief Initiate a movement for the given number of steps. Positive numbers move in one, negative numbers in the other direction. + * + * \param number_of_steps The number of steps to move the motor. + * \return 0 if the motor was not moving and moves now. -1 if the motor is moving and the new steps could not be set. + * + * If the previous movement is not finished yet the function will return -1 and not change the steps to move the motor. + * If the motor does not move it return 0 + * + * The direction of the movement is indicated by the sign of the steps parameter. It is not determinable if positive values are right + * or left This depends on the internal construction of the motor and how you connected it to the stepper driver. + * + * You can always verify with isMoving() or even use stop() to stop the motor before giving it new step directions. + * \sa isMoving(), getStepsLeft(), stop() + */ + char step(int number_of_steps); + + /*! + * \brief Central movement method, must be called as often as possible in the lopp function and is very fast. + * + * This routine checks if the motor still has to move, if the waiting delay has passed to send a new step command to the motor + * and manages the number of steps yet to move to fulfill the current move command. + * + * This function is implemented to be as fast as possible to call it as often as possible in your loop routine. + * The more regurlarly you call this function the better. In both senses of 'regularly': Calling it as often as + * possible is not a bad idea and if you even manage that the intervals you call this function are not too irregular helps too. + * + * You can call this routine even if you know that the motor is not moving. It introduces just a very small penalty in your code. + * You must not call isMoving() to determine if you need to call this function, since taht is done internally already and only + * slows down you code. + * + * How often you call this function directly influences your top moving speed for the motor. It may be a good idea to call this + * from a timer overflow interrupt to ensure proper calling. + * \sa step() + */ + char move(void); + + /*! + * \brief checks if the motor still has to move to fulfill the last movement command. + * \return 0 if the motor stops, -1 if the motor is moving. + * + * This method can be used to determine if the motor is ready for new movements. + *\sa step(), move() + */ + char isMoving(void); + + /*! + * \brief Get the number of steps left in the current movement. + * \return The number of steps left in the movement. This number is always positive. + */ + unsigned int getStepsLeft(void); + + /*! + * \brief Stops the motor regardless if it moves or not. + * \return -1 if the motor was moving and is really stoped or 0 if it was not moving at all. + * + * This method directly and apruptely stops the motor and may be used as an emergency stop. + */ + char stop(void); + + /*! + * \brief Sets and configure the classical Constant Off Timer Chopper + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param fast_decay_time_setting Fast decay time setting. Controls the portion of fast decay for each chopper cycle. 0: slow decay only, 1…15: duration of fast decay phase + * \param sine_wave_offset Sine wave offset. Controls the sine wave offset. A positive offset corrects for zero crossing error. -3…-1: negative offset, 0: no offset,1…12: positive offset + * \param use_curreent_comparator Selects usage of the current comparator for termination of the fast decay cycle. If current comparator is enabled, it terminates the fast decay cycle in case the current reaches a higher negative value than the actual positive value. (0 disable, -1 enable). + * + * The classic constant off time chopper uses a fixed portion of fast decay following each on phase. + * While the duration of the on time is determined by the chopper comparator, the fast decay time needs + * to be set by the user in a way, that the current decay is enough for the driver to be able to follow + * the falling slope of the sine wave, and on the other hand it should not be too long, in order to minimize + * motor current ripple and power dissipation. This best can be tuned using an oscilloscope or + * trying out motor smoothness at different velocities. A good starting value is a fast decay time setting + * similar to the slow decay time setting. + * After tuning of the fast decay time, the offset should be determined, in order to have a smooth zero transition. + * This is necessary, because the fast decay phase leads to the absolute value of the motor current being lower + * than the target current (see figure 17). If the zero offset is too low, the motor stands still for a short + * moment during current zero crossing, if it is set too high, it makes a larger microstep. + * Typically, a positive offset setting is required for optimum operation. + * + * \sa setSpreadCycleChoper() for other alternatives. + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, unsigned char use_current_comparator); + + /*! + * \brief Sets and configures with spread cycle chopper. + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param hysteresis_start Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value. 1 … 8 + * \param hysteresis_end Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by hysteresis_decrement. The sum hysteresis_start + hysteresis_end must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * \param hysteresis_decrement Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. 0 (fast decrement) … 3 (slow decrement). + * + * The spreadCycle chopper scheme (pat.fil.) is a precise and simple to use chopper principle, which automatically determines + * the optimum fast decay portion for the motor. Anyhow, a number of settings can be made in order to optimally fit the driver + * to the motor. + * Each chopper cycle is comprised of an on-phase, a slow decay phase, a fast decay phase and a second slow decay phase. + * The slow decay phases limit the maximum chopper frequency and are important for low motor and driver power dissipation. + * The hysteresis start setting limits the chopper frequency by forcing the driver to introduce a minimum amount of + * current ripple into the motor coils. The motor inductivity determines the ability to follow a changing motor current. + * The duration of the on- and fast decay phase needs to cover at least the blank time, because the current comparator is + * disabled during this time. + * + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); + + /*! + * \brief Use random off time for noise reduction (0 for off, -1 for on). + * \param value 0 for off, -1 for on + * + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, + * thus it depends on the microstep position. With some motors a slightly audible beat can occur between the chopper + * frequencies, especially when they are near to each other. This typically occurs at a few microstep positions within + * each quarter wave. + * This effect normally is not audible when compared to mechanical noise generated by ball bearings, + * etc. Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on. The random off time feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ + void setRandomOffTime(char value); + + /*! + * \brief set the maximum motor current in mA (1000 is 1 Amp) + * Keep in mind this is the maximum peak Current. The RMS current will be 1/sqrt(2) smaller. The actual current can also be smaller + * by employing CoolStep. + * \param current the maximum motor current in mA + * \sa getCurrent(), getCurrentCurrent() + */ + void setCurrent(unsigned int current); + + /*! + * \brief readout the motor maximum current in mA (1000 is an Amp) + * This is the maximum current. to get the current current - which may be affected by CoolStep us getCurrentCurrent() + * \return the maximum motor current in milli amps + * \sa getCurrentCurrent() + */ + unsigned int getCurrent(void); + + /*! + * \brief set the StallGuard threshold in order to get sensible StallGuard readings. + * \param stall_guard_threshold -64 … 63 the StallGuard threshold + * \param stall_guard_filter_enabled 0 if the filter is disabled, -1 if it is enabled + * + * The StallGuard threshold is used to optimize the StallGuard reading to sensible values. It should be at 0 at + * the maximum allowable load on the otor (but not before). = is a good starting point (and the default) + * If you get Stall Gaurd readings of 0 without any load or with too little laod increase the value. + * If you get readings of 1023 even with load decrease the setting. + * + * If you switch on the filter the StallGuard reading is only updated each 4th full step to reduce the noise in the + * reading. + * + * \sa getCurrentStallGuardReading() to read out the current value. + */ + void setStallGuardThreshold(char stall_guard_threshold, char stall_guard_filter_enabled); + + /*! + * \brief reads out the StallGuard threshold + * \return a number between -64 and 63. + */ + char getStallGuardThreshold(void); + + /*! + * \brief returns the current setting of the StallGuard filter + * \return 0 if not set, -1 if set + */ + char getStallGuardFilter(void); + + /*! + * \brief This method configures the CoolStep smart energy operation. You must have a proper StallGuard configuration for the motor situation (current, voltage, speed) in rder to use this feature. + * \param lower_SG_threshold Sets the lower threshold for stallGuard2TM reading. Below this value, the motor current becomes increased. Allowed values are 0...480 + * \param SG_hysteresis Sets the distance between the lower and the upper threshold for stallGuard2TM reading. Above the upper threshold (which is lower_SG_threshold+SG_hysteresis+1) the motor current becomes decreased. Allowed values are 0...480 + * \param current_decrement_step_size Sets the current decrement steps. If the StallGuard value is above the threshold the current gets decremented by this step size. 0...32 + * \param current_increment_step_size Sets the current increment step. The current becomes incremented for each measured stallGuard2TM value below the lower threshold. 0...8 + * \param lower_current_limit Sets the lower motor current limit for coolStepTM operation by scaling the CS value. Values can be COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + * The CoolStep smart energy operation automatically adjust the current sent into the motor according to the current load, + * read out by the StallGuard in order to provide the optimum torque with the minimal current consumption. + * You configure the CoolStep current regulator by defining upper and lower bounds of StallGuard readouts. If the readout is above the + * limit the current gets increased, below the limit the current gets decreased. + * You can specify the upper an lower threshold of the StallGuard readout in order to adjust the current. You can also set the number of + * StallGuard readings neccessary above or below the limit to get a more stable current adjustement. + * The current adjustement itself is configured by the number of steps the current gests in- or decreased and the absolut minimum current + * (1/2 or 1/4th otf the configured current). + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + void setCoolStepConfiguration(unsigned int lower_SG_threshold, unsigned int SG_hysteresis, unsigned char current_decrement_step_size, + unsigned char current_increment_step_size, unsigned char lower_current_limit); + + /*! + * \brief enables or disables the CoolStep smart energy operation feature. It must be configured before enabling it. + * \param enabled true if CoolStep should be enabled, false if not. + * \sa setCoolStepConfiguration() + */ + void setCoolStepEnabled(boolean enabled); + + + /*! + * \brief check if the CoolStep feature is enabled + * \sa setCoolStepEnabled() + */ + boolean isCoolStepEnabled(); + + /*! + * \brief returns the lower StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned int getCoolStepLowerSgThreshold(); + + /*! + * \brief returns the upper StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned int getCoolStepUpperSgThreshold(); + + /*! + * \brief returns the number of StallGuard readings befor CoolStep adjusts the motor current. + * \sa setCoolStepConfiguration() + */ + unsigned char getCoolStepNumberOfSGReadings(); + + /*! + * \brief returns the increment steps for the current for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned char getCoolStepCurrentIncrementSize(); + + /*! + * \brief returns the absolut minium current for the CoolStep operation + * \sa setCoolStepConfiguration() + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + unsigned char getCoolStepLowerCurrentLimit(); + + /*! + * \brief Get the current microstep position for phase A + * \return The current microstep position for phase A 0…255 + * + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + */ + int getMotorPosition(void); + + /*! + * \brief Reads the current StallGuard value. + * \return The current StallGuard value, lesser values indicate higher load, 0 means stall detected. + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + int getCurrentStallGuardReading(void); + + /*! + * \brief Reads the current current setting value as fraction of the maximum current + * Returns values between 0 and 31, representing 1/32 to 32/32 (=1) + * \sa setCoolStepConfiguration() + */ + unsigned char getCurrentCSReading(void); + + + /*! + *\brief a convenience method to determine if the current scaling uses 0.31V or 0.165V as reference. + *\return false if 0.13V is the reference voltage, true if 0.165V is used. + */ + boolean isCurrentScalingHalfed(); + + /*! + * \brief Reads the current current setting value and recalculates the absolute current in mA (1A would be 1000). + * This method calculates the currently used current setting (either by setting or by CoolStep) and reconstructs + * the current in mA by usinge the VSENSE and resistor value. This method uses floating point math - so it + * may not be the fastest. + * \sa getCurrentCSReading(), getResistor(), isCurrentScalingHalfed(), getCurrent() + */ + unsigned int getCurrentCurrent(void); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardOverThreshold(void); + + /*! + * \brief Return over temperature status of the last status readout + * return 0 is everything is OK, TMC26X_OVERTEMPERATURE_PREWARING if status is reached, TMC26X_OVERTEMPERATURE_SHUTDOWN is the chip is shutdown, -1 if the status is unknown. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + char getOverTemperature(void); + + /*! + * \brief Is motor channel A shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + + boolean isShortToGroundA(void); + + /*! + * \brief Is motor channel B shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isShortToGroundB(void); + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadA(void); + + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadB(void); + + /*! + * \brief Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isStandStill(void); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa isStallGuardOverThreshold() + * TODO why? + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardReached(void); + + /*! + *\brief enables or disables the motor driver bridges. If disabled the motor can run freely. If enabled not. + *\param enabled a boolean value true if the motor should be enabled, false otherwise. + */ + void setEnabled(boolean enabled); + + /*! + *\brief checks if the output bridges are enabled. If the bridges are not enabled the motor can run freely + *\return true if the bridges and by that the motor driver are enabled, false if not. + *\sa setEnabled() + */ + boolean isEnabled(); + + /*! + * \brief Manually read out the status register + * This function sends a byte to the motor driver in order to get the current readout. The parameter read_value + * seletcs which value will get returned. If the read_vlaue changes in respect to the previous readout this method + * automatically send two bytes to the motor: one to set the redout and one to get the actual readout. So this method + * may take time to send and read one or two bits - depending on the previous readout. + * \param read_value selects which value to read out (0..3). You can use the defines TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, or TMC_262_READOUT_CURRENT + * \sa TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, TMC_262_READOUT_CURRENT + */ + void readStatus(char read_value); + + /*! + * \brief Returns the current sense resistor value in milliohm. + * The default value of ,15 Ohm will return 150. + */ + int getResistor(); + + /*! + * \brief Prints out all the information that can be found in the last status read out - it does not force a status readout. + * The result is printed via Serial + */ + void debugLastStatus(void); + /*! + * \brief library version + * \return the version number as int. + */ + int version(void); + + private: + unsigned int steps_left; // The steps the motor has to do to complete the movement + int direction; // Direction of rotation + unsigned long step_delay; // Delay between steps, in ms, based on speed + int number_of_steps; // Total number of steps this motor can take + unsigned int speed; // Store the current speed in order to change the speed after changing microstepping + unsigned int resistor; // Current sense resitor value in milliohm + + unsigned long last_step_time; // Time stamp in ms of when the last step was taken + unsigned long next_step_time; // Time stamp in ms of when the last step was taken + + // Driver control register copies to easily set & modify the registers + unsigned long driver_control_register_value; + unsigned long chopper_config_register; + unsigned long cool_step_register_value; + unsigned long stall_guard2_current_register_value; + unsigned long driver_configuration_register_value; + // The driver status result + unsigned long driver_status_result; + + // Helper routione to get the top 10 bit of the readout + inline int getReadoutValue(); + + // The pins for the stepper driver + unsigned char cs_pin; + unsigned char step_pin; + unsigned char dir_pin; + + // Status values + boolean started; // If the stepper has been started yet + int microsteps; // The current number of micro steps + char constant_off_time; // We need to remember this value in order to enable and disable the motor + unsigned char cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature + boolean cool_step_enabled; // We need to remember this to configure the coolstep if it si enabled + + // SPI sender + inline void send262(unsigned long datagram); +}; + +#endif // _TMC26XSTEPPER_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h new file mode 100644 index 0000000000..5ae338d76a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + + + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h new file mode 100644 index 0000000000..2d82530b89 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O interfaces for STM32F7 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F7_H +#define _FASTIO_STM32F7_H + +#define _BV(b) (1 << (b)) + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define GET_INPUT(IO) +#define GET_OUTPUT(IO) +#define GET_TIMER(IO) + +#define PORTA 0 +#define PORTB 1 +#define PORTC 2 +#define PORTD 3 +#define PORTE 4 +#define PORTF 5 +#define PORTG 6 + +#define _STM32_PIN(_PORT,_PIN) ((PORT##_PORT * 16) + _PIN) + +#define PA0 _STM32_PIN(A, 0) +#define PA1 _STM32_PIN(A, 1) +#define PA2 _STM32_PIN(A, 2) +#define PA3 _STM32_PIN(A, 3) +#define PA4 _STM32_PIN(A, 4) +#define PA5 _STM32_PIN(A, 5) +#define PA6 _STM32_PIN(A, 6) +#define PA7 _STM32_PIN(A, 7) +#define PA8 _STM32_PIN(A, 8) +#define PA9 _STM32_PIN(A, 9) +#define PA10 _STM32_PIN(A, 10) +#define PA11 _STM32_PIN(A, 11) +#define PA12 _STM32_PIN(A, 12) +#define PA13 _STM32_PIN(A, 13) +#define PA14 _STM32_PIN(A, 14) +#define PA15 _STM32_PIN(A, 15) + +#define PB0 _STM32_PIN(B, 0) +#define PB1 _STM32_PIN(B, 1) +#define PB2 _STM32_PIN(B, 2) +#define PB3 _STM32_PIN(B, 3) +#define PB4 _STM32_PIN(B, 4) +#define PB5 _STM32_PIN(B, 5) +#define PB6 _STM32_PIN(B, 6) +#define PB7 _STM32_PIN(B, 7) +#define PB8 _STM32_PIN(B, 8) +#define PB9 _STM32_PIN(B, 9) +#define PB10 _STM32_PIN(B, 10) +#define PB11 _STM32_PIN(B, 11) +#define PB12 _STM32_PIN(B, 12) +#define PB13 _STM32_PIN(B, 13) +#define PB14 _STM32_PIN(B, 14) +#define PB15 _STM32_PIN(B, 15) + +#define PC0 _STM32_PIN(C, 0) +#define PC1 _STM32_PIN(C, 1) +#define PC2 _STM32_PIN(C, 2) +#define PC3 _STM32_PIN(C, 3) +#define PC4 _STM32_PIN(C, 4) +#define PC5 _STM32_PIN(C, 5) +#define PC6 _STM32_PIN(C, 6) +#define PC7 _STM32_PIN(C, 7) +#define PC8 _STM32_PIN(C, 8) +#define PC9 _STM32_PIN(C, 9) +#define PC10 _STM32_PIN(C, 10) +#define PC11 _STM32_PIN(C, 11) +#define PC12 _STM32_PIN(C, 12) +#define PC13 _STM32_PIN(C, 13) +#define PC14 _STM32_PIN(C, 14) +#define PC15 _STM32_PIN(C, 15) + +#define PD0 _STM32_PIN(D, 0) +#define PD1 _STM32_PIN(D, 1) +#define PD2 _STM32_PIN(D, 2) +#define PD3 _STM32_PIN(D, 3) +#define PD4 _STM32_PIN(D, 4) +#define PD5 _STM32_PIN(D, 5) +#define PD6 _STM32_PIN(D, 6) +#define PD7 _STM32_PIN(D, 7) +#define PD8 _STM32_PIN(D, 8) +#define PD9 _STM32_PIN(D, 9) +#define PD10 _STM32_PIN(D, 10) +#define PD11 _STM32_PIN(D, 11) +#define PD12 _STM32_PIN(D, 12) +#define PD13 _STM32_PIN(D, 13) +#define PD14 _STM32_PIN(D, 14) +#define PD15 _STM32_PIN(D, 15) + +#define PE0 _STM32_PIN(E, 0) +#define PE1 _STM32_PIN(E, 1) +#define PE2 _STM32_PIN(E, 2) +#define PE3 _STM32_PIN(E, 3) +#define PE4 _STM32_PIN(E, 4) +#define PE5 _STM32_PIN(E, 5) +#define PE6 _STM32_PIN(E, 6) +#define PE7 _STM32_PIN(E, 7) +#define PE8 _STM32_PIN(E, 8) +#define PE9 _STM32_PIN(E, 9) +#define PE10 _STM32_PIN(E, 10) +#define PE11 _STM32_PIN(E, 11) +#define PE12 _STM32_PIN(E, 12) +#define PE13 _STM32_PIN(E, 13) +#define PE14 _STM32_PIN(E, 14) +#define PE15 _STM32_PIN(E, 15) + +#define PF0 _STM32_PIN(F, 0) +#define PF1 _STM32_PIN(F, 1) +#define PF2 _STM32_PIN(F, 2) +#define PF3 _STM32_PIN(F, 3) +#define PF4 _STM32_PIN(F, 4) +#define PF5 _STM32_PIN(F, 5) +#define PF6 _STM32_PIN(F, 6) +#define PF7 _STM32_PIN(F, 7) +#define PF8 _STM32_PIN(F, 8) +#define PF9 _STM32_PIN(F, 9) +#define PF10 _STM32_PIN(F, 10) +#define PF11 _STM32_PIN(F, 11) +#define PF12 _STM32_PIN(F, 12) +#define PF13 _STM32_PIN(F, 13) +#define PF14 _STM32_PIN(F, 14) +#define PF15 _STM32_PIN(F, 15) + +#define PG0 _STM32_PIN(G, 0) +#define PG1 _STM32_PIN(G, 1) +#define PG2 _STM32_PIN(G, 2) +#define PG3 _STM32_PIN(G, 3) +#define PG4 _STM32_PIN(G, 4) +#define PG5 _STM32_PIN(G, 5) +#define PG6 _STM32_PIN(G, 6) +#define PG7 _STM32_PIN(G, 7) +#define PG8 _STM32_PIN(G, 8) +#define PG9 _STM32_PIN(G, 9) +#define PG10 _STM32_PIN(G, 10) +#define PG11 _STM32_PIN(G, 11) +#define PG12 _STM32_PIN(G, 12) +#define PG13 _STM32_PIN(G, 13) +#define PG14 _STM32_PIN(G, 14) +#define PG15 _STM32_PIN(G, 15) + +#endif // _FASTIO_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_STM32F7/persistent_store_impl.cpp new file mode 100644 index 0000000000..ac4c3e7947 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/persistent_store_impl.cpp @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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, see . + * + */ + + +#ifdef STM32F7 + +#include "../persistent_store_api.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +namespace HAL { +namespace PersistentStore { + +bool access_start() { + return true; +} + +bool access_finish(){ + return true; +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} +} + +#endif // EEPROM_SETTINGS +#endif // STM32F7 + + diff --git a/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F7/spi_pins.h b/Marlin/src/HAL/HAL_STM32F7/spi_pins.h new file mode 100644 index 0000000000..2d1e96ec59 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/spi_pins.h @@ -0,0 +1,32 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* 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 3 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, see . +* +*/ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + */ +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA8 + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp new file mode 100644 index 0000000000..0b0031a236 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifdef STM32F7 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog_STM32F7.h" + + IWDG_HandleTypeDef hiwdg; + + void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); + } + } + + void watchdog_reset() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } + } + +#endif // USE_WATCHDOG + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h new file mode 100644 index 0000000000..ffdb1e092e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h @@ -0,0 +1,33 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* Based on Sprinter and grbl. +* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm +* +* 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 3 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, see . +* +*/ + +#ifndef WATCHDOG_STM32F7_H +#define WATCHDOG_STM32F7_H + +#include "../../inc/MarlinConfig.h" + +extern IWDG_HandleTypeDef hiwdg; + +void watchdog_init(); +void watchdog_reset(); + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp new file mode 100644 index 0000000000..5bd3369e43 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp @@ -0,0 +1,98 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + + +/** + * Description: HAL for Teensy35 (MK64FX512) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include "../Delay.h" + +#include + +uint16_t HAL_adc_result; + +static const uint8_t pin2sc1a[] = { + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 3, 19+128, 14+128, 15+128, // 0-13 -> A0-A13 + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 are A0-A9 + 255, 255, 255, 255, 255, 255, 255, // 24-30 are digital only + 14+128, 15+128, 17, 18, 4+128, 5+128, 6+128, 7+128, 17+128, // 31-39 are A12-A20 + 255, 255, 255, 255, 255, 255, 255, 255, 255, // 40-48 are digital only + 10+128, 11+128, // 49-50 are A23-A24 + 255, 255, 255, 255, 255, 255, 255, // 51-57 are digital only + 255, 255, 255, 255, 255, 255, // 58-63 (sd card pins) are digital only + 3, 19+128, // 64-65 are A10-A11 + 23, 23+128,// 66-67 are A21-A22 (DAC pins) + 1, 1+128, // 68-69 are A25-A26 (unused USB host port on Teensy 3.5) + 26, // 70 is Temperature Sensor + 18+128 // 71 is Vref +}; + +/* + // disable interrupts + void cli(void) { noInterrupts(); } + + // enable interrupts + void sei(void) { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + NVIC_ENABLE_IRQ(IRQ_FTM1); +} + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source(void) { + switch (RCM_SRS0) { + case 128: return RST_POWER_ON; break; + case 64: return RST_EXTERNAL; break; + case 32: return RST_WATCHDOG; break; + // case 8: return RST_LOSS_OF_LOCK; break; + // case 4: return RST_LOSS_OF_CLOCK; break; + // case 2: return RST_LOW_VOLTAGE; break; + } + return 0; +} + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { ADC0_SC1A = pin2sc1a[adc_pin]; } + +uint16_t HAL_adc_get_result(void) { return ADC0_RA; } + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h new file mode 100644 index 0000000000..d5ab7699bc --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h @@ -0,0 +1,173 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + +/** + * Description: HAL for Teensy 3.5 and Teensy 3.6 + */ + +#ifndef _HAL_TEENSY_H +#define _HAL_TEENSY_H + +#define CPU_32_BIT + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +// _BV is re-defined in Arduino.h +#undef _BV + +#include + +// Redefine sq macro defined by teensy3/wiring.h +#undef sq +#define sq(x) ((x)*(x)) + +#include "../math_32bit.h" +#include "../HAL_SPI.h" + +#include "fastio_Teensy.h" +#include "watchdog_Teensy.h" + +#include "HAL_timers_Teensy.h" + +#include + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#undef MOTHERBOARD +#define MOTHERBOARD BOARD_TEENSY35_36 + +#define IS_32BIT_TEENSY (defined(__MK64FX512__) || defined(__MK66FX1M0__)) +#define IS_TEENSY35 defined(__MK64FX512__) +#define IS_TEENSY36 defined(__MK66FX1M0__) + +#define NUM_SERIAL 1 + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +/** clear reset reason */ +void HAL_clear_reset_source(void); + +/** reset reason */ +uint8_t HAL_get_reset_source(void); + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + int freeMemory(void); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + +// ADC + +void HAL_adc_init(); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC HAL_adc_get_result() + +#define HAL_ANALOG_SELECT(pin) NOOP; + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* + uint16_t HAL_getAdcReading(uint8_t chan); + + void HAL_startAdcConversion(uint8_t chan); + uint8_t HAL_pinToAdcChannel(int pin); + + uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); + //uint16_t HAL_getAdcSuperSample(uint8_t chan); + + void HAL_enable_AdcFreerun(void); + //void HAL_disable_AdcFreerun(uint8_t chan); +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +#endif // _HAL_TEENSY_H diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp new file mode 100644 index 0000000000..ff56036ccd --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp @@ -0,0 +1,36 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_Teensy.h" + +uint8_t servoPin[MAX_SERVOS] = { 0 }; + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex]); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex], min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} + +#endif // HAS_SERVOS + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h new file mode 100644 index 0000000000..78b2092051 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h @@ -0,0 +1,18 @@ +#ifndef _HAL_SERVO_TEENSY_H_ +#define _HAL_SERVO_TEENSY_H_ + +#include + +// Inherit and expand on the official library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // _HAL_SERVO_TEENSY_H_ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp new file mode 100644 index 0000000000..3be0fdd3af --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp @@ -0,0 +1,111 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +// Standard SPI functions +/** Initialise SPI bus */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + //#if DISABLED(SOFTWARE_SPI) + #if 0 + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif // SET_SPI_SS_HIGH + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif // SOFTWARE_SPI +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +// SPDR = 0xFF; +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +// return SPDR; +} +//------------------------------------------------------------------------------ +/** SPI read data */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); +//if (nbyte-- == 0) return; +// SPDR = 0xFF; +//for (uint16_t i = 0; i < nbyte; i++) { +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +// buf[i] = SPDR; +// SPDR = 0xFF; +//} +//while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +//buf[nbyte] = SPDR; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +// SPDR = b; +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +} +//------------------------------------------------------------------------------ +/** SPI send block */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + + +/** Begin SPI transaction, set clock, bit order, data mode */ +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + + SPI.beginTransaction(spiConfig); +} + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp new file mode 100644 index 0000000000..d31d9ddf67 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp @@ -0,0 +1,114 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + + +/** + * Teensy3.5 __MK64FX512__ + * Teensy3.6 __MK66FX1M0__ + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include "HAL_timers_Teensy.h" + +/** \brief Instruction Synchronization Barrier + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. +*/ +FORCE_INLINE static void __ISB(void) { + __asm__ __volatile__("isb 0xF":::"memory"); +} + +/** \brief Data Synchronization Barrier + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. +*/ +FORCE_INLINE static void __DSB(void) { + __asm__ __volatile__("dsb 0xF":::"memory"); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; + FTM0_SC = 0x00; // Set this to zero before changing the modulus + FTM0_CNT = 0x0000; // Reset the count to zero + FTM0_MOD = 0xFFFF; // max modulus = 65535 + FTM0_C0V = FTM0_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value + FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 + FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + case 1: + FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 + FTM1_SC = 0x00; // Set this to zero before changing the modulus + FTM1_CNT = 0x0000; // Reset the count to zero + FTM1_MOD = 0xFFFF; // max modulus = 65535 + FTM1_C0V = FTM1_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value 65535 + FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 + FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch(timer_num) { + case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_IS_ENABLED(IRQ_FTM0); + case 1: return NVIC_IS_ENABLED(IRQ_FTM1); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch(timer_num) { + case 0: + FTM0_CNT = 0x0000; + FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + case 1: + FTM1_CNT = 0x0000; + FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + } +} + +#endif // Teensy3.5 or Teensy3.6 diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h new file mode 100644 index 0000000000..5fed19e313 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -0,0 +1,117 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . +****************************************************************************/ + +/** + * Description: HAL for + * Teensy3.5 (__MK64FX512__) + * Teensy3.6 (__MK66FX1M0__) + */ + +#ifndef _HAL_TIMERS_TEENSY_H +#define _HAL_TIMERS_TEENSY_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define FTM0_TIMER_PRESCALE 8 +#define FTM1_TIMER_PRESCALE 4 +#define FTM0_TIMER_PRESCALE_BITS 0b011 +#define FTM1_TIMER_PRESCALE_BITS 0b010 + +#define FTM0_TIMER_RATE (F_BUS / FTM0_TIMER_PRESCALE) // 60MHz / 8 = 7500kHz +#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz + +#define HAL_TIMER_RATE (FTM0_TIMER_RATE) + +#define STEP_TIMER_NUM 0 +#define TEMP_TIMER_NUM 1 +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR extern "C" void ftm0_isr(void) //void TC3_Handler() +#define HAL_TEMP_TIMER_ISR extern "C" void ftm1_isr(void) //void TC4_Handler() + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: FTM0_C0V = compare; break; + case 1: FTM1_C0V = compare; break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_C0V; + case 1: return FTM1_C0V; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_CNT; + case 1: return FTM1_CNT; + } + return 0; +} + +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_TEENSY_H diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h b/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h new file mode 100644 index 0000000000..c8a9ee9bdf --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Test TEENSY35_36 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h new file mode 100644 index 0000000000..3ba40bdc87 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.check_possible_change(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts( void ) { + + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h new file mode 100644 index 0000000000..4d31310d8d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#ifndef _FASTIO_TEENSY_H +#define _FASTIO_TEENSY_H + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) +#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +#define _READ(p) bool(CORE_PIN ## p ## _PINREG & CORE_PIN ## p ## _BITMASK) + +#define _WRITE(P,V) do{ \ + if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ + else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ +}while(0) + +#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) + +#define _SET_INPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _SET_OUTPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ +}while(0) + +#define _SET_INPUT_PULLUP(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _GET_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) +#define _GET_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) + +#define READ(IO) _READ(IO) + +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) + +#define GET_INPUT(IO) _GET_INPUT(IO) +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +/** + * Ports, functions, and pins + */ + +#define DIO0_PIN 8 + +#endif /* _FASTIO_TEENSY_H */ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp new file mode 100644 index 0000000000..be0604dae2 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp @@ -0,0 +1,56 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../persistent_store_api.h" + +namespace HAL { +namespace PersistentStore { + +bool access_start() { + return true; +} + +bool access_finish() { + return true; +} + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h new file mode 100644 index 0000000000..f94f55c1d2 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef HAL_PINSDEBUG_TEENSY_H + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +#define FTM0_CH0_PIN 22 +#define FTM0_CH1_PIN 23 +#define FTM0_CH2_PIN 9 +#define FTM0_CH3_PIN 10 +#define FTM0_CH4_PIN 6 +#define FTM0_CH5_PIN 20 +#define FTM0_CH6_PIN 21 +#define FTM0_CH7_PIN 5 +#define FTM1_CH0_PIN 3 +#define FTM1_CH1_PIN 4 +#define FTM2_CH0_PIN 29 +#define FTM2_CH1_PIN 30 +#define FTM3_CH0_PIN 2 +#define FTM3_CH1_PIN 14 +#define FTM3_CH2_PIN 7 +#define FTM3_CH3_PIN 8 +#define FTM3_CH4_PIN 35 +#define FTM3_CH5_PIN 36 +#define FTM3_CH6_PIN 37 +#define FTM3_CH7_PIN 38 +#if defined(__MK66FX1M0__) // Teensy3.6 + #define TPM1_CH0_PIN 16 + #define TPM1_CH1_PIN 17 +#endif + +#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(9)) || ((P) >= analogInputToDigitalPin(12) && (P) <= analogInputToDigitalPin(20)) + +void HAL_print_analog_pin(char buffer[], int8_t pin) { + if (pin <= 23) sprintf(buffer, "(A%2d) ", int(pin - 14)); + else if (pin <= 39) sprintf(buffer, "(A%2d) ", int(pin - 19)); +} + +void HAL_analog_pin_state(char buffer[], int8_t pin) { + if (pin <= 23) sprintf(buffer, "Analog in =% 5d", analogRead(pin - 14)); + else if (pin <= 39) sprintf(buffer, "Analog in =% 5d", analogRead(pin - 19)); +} + +#define PWM_PRINT(V) do{ sprintf(buffer, "PWM: %4d", 22); SERIAL_ECHO(buffer); }while(0) +#define FTM_CASE(N,Z) \ + case FTM##N##_CH##Z##_PIN: \ + if (FTM##N##_C##Z##V) { \ + PWM_PRINT(FTM##N##_C##Z##V); \ + return true; \ + } else return false + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +bool HAL_pwm_status(int8_t pin) { + char buffer[20]; // for the sprintf statements + switch(pin) { + FTM_CASE(0,0); + FTM_CASE(0,1); + FTM_CASE(0,2); + FTM_CASE(0,3); + FTM_CASE(0,4); + FTM_CASE(0,5); + FTM_CASE(0,6); + FTM_CASE(0,7); + FTM_CASE(1,0); + FTM_CASE(1,1); + FTM_CASE(2,0); + FTM_CASE(2,1); + FTM_CASE(3,0); + FTM_CASE(3,1); + FTM_CASE(3,2); + FTM_CASE(3,3); + FTM_CASE(3,4); + FTM_CASE(3,5); + FTM_CASE(3,6); + FTM_CASE(3,7); + + case NOT_ON_TIMER: + default: + return false; + } + SERIAL_PROTOCOLPGM(" "); +} + +static void HAL_pwm_details(uint8_t pin) { /* TODO */ } + +#endif diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h b/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h new file mode 100644 index 0000000000..ecbc690e4d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h @@ -0,0 +1,31 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 + +#endif /* SPI_PINS_H_ */ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp new file mode 100644 index 0000000000..0c15824742 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog_Teensy.h" + +void watchdog_init() { + WDOG_TOVALH = 0; + WDOG_TOVALL = 4000; + WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; +} + +#endif // USE_WATCHDOG + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h new file mode 100644 index 0000000000..ca05dd225a --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef WATCHDOG_TEENSY_H +#define WATCHDOG_TEENSY_H + +#include "HAL.h" + +// Arduino Due core now has watchdog support + +void watchdog_init(); + +inline void watchdog_reset() { + // Watchdog refresh sequence + WDOG_REFRESH = 0xA602; + WDOG_REFRESH = 0xB480; +} + +#endif // WATCHDOG_TEENSY_H diff --git a/Marlin/src/HAL/I2cEeprom.cpp b/Marlin/src/HAL/I2cEeprom.cpp new file mode 100644 index 0000000000..874b99c80a --- /dev/null +++ b/Marlin/src/HAL/I2cEeprom.cpp @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(I2C_EEPROM) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include HAL_PATH(., HAL.h) +#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +static uint8_t eeprom_device_address = 0x50; + +static void eeprom_init(void) { + static bool eeprom_initialised = false; + if (!eeprom_initialised) { + Wire.begin(); + eeprom_initialised = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + unsigned eeprom_address = (unsigned) pos; + + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)(eeprom_address >> 8)); // MSB + Wire.write((int)(eeprom_address & 0xFF)); // LSB + Wire.write(value); + Wire.endTransmission(); + + // wait for write cycle to complete + // this could be done more efficiently with "acknowledge polling" + delay(5); +} + +// WARNING: address is a page address, 6-bit end will wrap around +// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes +void eeprom_update_block(const void *pos, void* eeprom_address, size_t n) { + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + + uint8_t *ptr = (uint8_t*)pos; + uint8_t flag = 0; + Wire.requestFrom(eeprom_device_address, (byte)n); + for (byte c = 0; c < n && Wire.available(); c++) + flag |= Wire.read() ^ ptr[c]; + + if (flag) { + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.write((uint8_t*)pos, n); + Wire.endTransmission(); + + // wait for write cycle to complete + // this could be done more efficiently with "acknowledge polling" + delay(5); + } +} + + +unsigned char eeprom_read_byte(unsigned char *pos) { + byte data = 0xFF; + unsigned eeprom_address = (unsigned)pos; + + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)(eeprom_address >> 8)); // MSB + Wire.write((int)(eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + Wire.requestFrom(eeprom_device_address, (byte)1); + return Wire.available() ? Wire.read() : 0xFF; +} + +// maybe let's not read more than 30 or 32 bytes at a time! +void eeprom_read_block(void* pos, const void* eeprom_address, size_t n) { + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + Wire.requestFrom(eeprom_device_address, (byte)n); + for (byte c = 0; c < n; c++ ) + if (Wire.available()) *((uint8_t*)pos + c) = Wire.read(); +} + + +#endif // ENABLED(I2C_EEPROM) + diff --git a/Marlin/src/HAL/SpiEeprom.cpp b/Marlin/src/HAL/SpiEeprom.cpp new file mode 100644 index 0000000000..6d36d1ca7e --- /dev/null +++ b/Marlin/src/HAL/SpiEeprom.cpp @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Description: functions for SPI connected external EEPROM. + * Not platform dependent. + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SPI_EEPROM) + +#include HAL_PATH(., HAL.h) + +#define CMD_WREN 6 // WREN +#define CMD_READ 2 // WRITE +#define CMD_WRITE 2 // WRITE + +uint8_t eeprom_read_byte(uint8_t* pos) { + uint8_t v; + uint8_t eeprom_temp[3]; + + // set read location + // begin transmission from device + eeprom_temp[0] = CMD_READ; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High + eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + v = spiRec(SPI_CHAN_EEPROM1); + WRITE(SPI_EEPROM1_CS, HIGH); + return v; +} + +void eeprom_read_block(void* dest, const void* eeprom_address, size_t n) { + uint8_t eeprom_temp[3]; + + // set read location + // begin transmission from device + eeprom_temp[0] = CMD_READ; + eeprom_temp[1] = ((unsigned)eeprom_address>>8) & 0xFF; // addr High + eeprom_temp[2] = (unsigned)eeprom_address& 0xFF; // addr Low + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + uint8_t *p_dest = (uint8_t *)dest; + while (n--) + *p_dest++ = spiRec(SPI_CHAN_EEPROM1); + WRITE(SPI_EEPROM1_CS, HIGH); +} + +void eeprom_write_byte(uint8_t* pos, uint8_t value) { + uint8_t eeprom_temp[3]; + + /*write enable*/ + eeprom_temp[0] = CMD_WREN; + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(1); + + /*write addr*/ + eeprom_temp[0] = CMD_WRITE; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High + eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + spiSend(SPI_CHAN_EEPROM1, value); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(7); // wait for page write to complete +} + +void eeprom_update_block(const void* src, void* eeprom_address, size_t n) { + uint8_t eeprom_temp[3]; + + /*write enable*/ + eeprom_temp[0] = CMD_WREN; + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(1); + + /*write addr*/ + eeprom_temp[0] = CMD_WRITE; + eeprom_temp[1] = ((unsigned)eeprom_address>>8) & 0xFF; //addr High + eeprom_temp[2] = (unsigned)eeprom_address & 0xFF; //addr Low + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + spiSend(SPI_CHAN_EEPROM1, (const uint8_t*)src, n); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(7); // wait for page write to complete +} + + +#endif // ENABLED(SPI_EEPROM) diff --git a/Marlin/src/HAL/backtrace/backtrace.cpp b/Marlin/src/HAL/backtrace/backtrace.cpp new file mode 100644 index 0000000000..4a688b369c --- /dev/null +++ b/Marlin/src/HAL/backtrace/backtrace.cpp @@ -0,0 +1,101 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "backtrace.h" + +#if defined(__arm__) || defined(__thumb__) + +#include "unwinder.h" +#include "unwmemaccess.h" + +#include "../../core/serial.h" +#include + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int *p = (int*)ctx; + + (*p)++; + + SERIAL_CHAR('#'); SERIAL_PRINT(*p,DEC); SERIAL_ECHOPGM(" : "); + SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); + SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC); + SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #ifdef UNW_DEBUG + , UnwPrintf + #endif +}; + +void backtrace(void) { + + UnwindFrame btf; + uint32_t sp = 0, lr = 0, pc = 0; + + // Capture the values of the registers to perform the traceback + __asm__ __volatile__ ( + " mov %[lrv],lr\n" + " mov %[spv],sp\n" + " mov %[pcv],pc\n" + : [spv]"+r"( sp ), + [lrv]"+r"( lr ), + [pcv]"+r"( pc ) + :: + ); + + // Fill the traceback structure + btf.sp = sp; + btf.fp = btf.sp; + btf.lr = lr; + btf.pc = pc | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Backtrace:"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); +} + +#else // !__arm__ && !__thumb__ + +void backtrace(void) {} + +#endif diff --git a/Marlin/src/HAL/backtrace/backtrace.h b/Marlin/src/HAL/backtrace/backtrace.h new file mode 100644 index 0000000000..c2761b9f5a --- /dev/null +++ b/Marlin/src/HAL/backtrace/backtrace.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _BACKTRACE_H_ +#define _BACKTRACE_H_ + +// Perform a backtrace to the serial port +void backtrace(void); + +#endif \ No newline at end of file diff --git a/Marlin/src/HAL/backtrace/unwarm.cpp b/Marlin/src/HAL/backtrace/unwarm.cpp new file mode 100644 index 0000000000..f6d85b708b --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarm.cpp @@ -0,0 +1,175 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions and glue for ARM unwinding sub-modules. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM" + +#include +#include +#include +#include +#include "unwarm.h" +#include "unwarmmem.h" + +#if defined(UNW_DEBUG) + +/** + * Printf wrapper. + * This is used such that alternative outputs for any output can be selected + * by modification of this wrapper function. + */ +void UnwPrintf(const char *format, ...) { + va_list args; + + va_start( args, format ); + vprintf(format, args ); +} +#endif + +/** + * Invalidate all general purpose registers. + */ +void UnwInvalidateRegisterFile(RegData *regFile) { + uint8_t t = 0; + do { + regFile[t].o = REG_VAL_INVALID; + t++; + } while (t < 13); +} + + +/** + * Initialise the data used for unwinding. + */ +void UnwInitState(UnwState * const state, /**< Pointer to structure to fill. */ + const UnwindCallbacks *cb, /**< Callbacks. */ + void *rptData, /**< Data to pass to report function. */ + uint32_t pcValue, /**< PC at which to start unwinding. */ + uint32_t spValue) { /**< SP at which to start unwinding. */ + + UnwInvalidateRegisterFile(state->regData); + + /* Store the pointer to the callbacks */ + state->cb = cb; + state->reportData = rptData; + + /* Setup the SP and PC */ + state->regData[13].v = spValue; + state->regData[13].o = REG_VAL_FROM_CONST; + state->regData[15].v = pcValue; + state->regData[15].o = REG_VAL_FROM_CONST; + + UnwPrintd3("\nInitial: PC=0x%08x SP=0x%08x\n", pcValue, spValue); + + /* Invalidate all memory addresses */ + memset(state->memData.used, 0, sizeof(state->memData.used)); +} + +// Detect if function names are available +static int __attribute__ ((noinline)) has_function_names(void) { + uint32_t flag_word = ((uint32_t*)(((uint32_t)(&has_function_names)) & (-4))) [-1]; + return ((flag_word & 0xFF000000) == 0xFF000000) ? 1 : 0; +} + +/** + * Call the report function to indicate some return address. + * This returns the value of the report function, which if true + * indicates that unwinding may continue. + */ +bool UnwReportRetAddr(UnwState * const state, uint32_t addr) { + + UnwReport entry; + + // We found two acceptable values. + entry.name = NULL; + entry.address = addr & 0xFFFFFFFE; // Remove Thumb bit + entry.function = 0; + + // If there are function names, try to solve name + if (has_function_names()) { + + // Lets find the function name, if possible + + // Align address to 4 bytes + uint32_t pf = addr & (-4); + + // Scan backwards until we find the function name + uint32_t v; + while (state->cb->readW(pf-4,&v)) { + + // Check if name descriptor is valid + if ((v & 0xFFFFFF00) == 0xFF000000 && (v & 0xFF) > 1) { + // Assume the name was found! + entry.name = ((const char*)pf) - 4 - (v & 0xFF); + entry.function = pf; + break; + } + + // Go backwards to the previous word + pf -= 4; + } + } + + /* Cast away const from reportData. + * The const is only to prevent the unw module modifying the data. + */ + return state->cb->report((void *)state->reportData, &entry); +} + + +/** + * Write some register to memory. + * This will store some register and meta data onto the virtual stack. + * The address for the write + * \param state [in/out] The unwinding state. + * \param wAddr [in] The address at which to write the data. + * \param reg [in] The register to store. + * \return true if the write was successful, false otherwise. + */ +bool UnwMemWriteRegister(UnwState * const state, const uint32_t addr, const RegData * const reg) { + return UnwMemHashWrite(&state->memData, addr, reg->v, M_IsOriginValid(reg->o)); +} + +/** + * Read a register from memory. + * This will read a register from memory, and setup the meta data. + * If the register has been previously written to memory using + * UnwMemWriteRegister, the local hash will be used to return the + * value while respecting whether the data was valid or not. If the + * register was previously written and was invalid at that point, + * REG_VAL_INVALID will be returned in *reg. + * \param state [in] The unwinding state. + * \param addr [in] The address to read. + * \param reg [out] The result, containing the data value and the origin + * which will be REG_VAL_FROM_MEMORY, or REG_VAL_INVALID. + * \return true if the address could be read and *reg has been filled in. + * false is the data could not be read. + */ +bool UnwMemReadRegister(UnwState * const state, const uint32_t addr, RegData * const reg) { + bool tracked; + + // Check if the value can be found in the hash + if (UnwMemHashRead(&state->memData, addr, ®->v, &tracked)) { + reg->o = tracked ? REG_VAL_FROM_MEMORY : REG_VAL_INVALID; + return true; + } + else if (state->cb->readW(addr, ®->v)) { // Not in the hash, so read from real memory + reg->o = REG_VAL_FROM_MEMORY; + return true; + } + else return false; // Not in the hash, and failed to read from memory +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/backtrace/unwarm.h b/Marlin/src/HAL/backtrace/unwarm.h new file mode 100644 index 0000000000..8ecdeba8a5 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarm.h @@ -0,0 +1,143 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Internal interface between the ARM unwinding sub-modules. + **************************************************************************/ + +#ifndef UNWARM_H +#define UNWARM_H + +#include "unwinder.h" + +/** The maximum number of instructions to interpet in a function. + * Unwinding will be unconditionally stopped and UNWIND_EXHAUSTED returned + * if more than this number of instructions are interpreted in a single + * function without unwinding a stack frame. This prevents infinite loops + * or corrupted program memory from preventing unwinding from progressing. + */ +#define UNW_MAX_INSTR_COUNT 500 + +/** The size of the hash used to track reads and writes to memory. + * This should be a prime value for efficiency. + */ +#define MEM_HASH_SIZE 31 + +/*************************************************************************** + * Type Definitions + **************************************************************************/ + +typedef enum { + /** Invalid value. */ + REG_VAL_INVALID = 0x00, + REG_VAL_FROM_STACK = 0x01, + REG_VAL_FROM_MEMORY = 0x02, + REG_VAL_FROM_CONST = 0x04, + REG_VAL_ARITHMETIC = 0x80 +} RegValOrigin; + + +/** Type for tracking information about a register. + * This stores the register value, as well as other data that helps unwinding. + */ +typedef struct { + + /** The value held in the register. */ + uint32_t v; + + /** The origin of the register value. + * This is used to track how the value in the register was loaded. + */ + int o; /* (RegValOrigin) */ +} RegData; + + +/** Structure used to track reads and writes to memory. + * This structure is used as a hash to store a small number of writes + * to memory. + */ +typedef struct { + /** Memory contents. */ + uint32_t v[MEM_HASH_SIZE]; + + /** Address at which v[n] represents. */ + uint32_t a[MEM_HASH_SIZE]; + + /** Indicates whether the data in v[n] and a[n] is occupied. + * Each bit represents one hash value. + */ + uint8_t used[(MEM_HASH_SIZE + 7) / 8]; + + /** Indicates whether the data in v[n] is valid. + * This allows a[n] to be set, but for v[n] to be marked as invalid. + * Specifically this is needed for when an untracked register value + * is written to memory. + */ + uint8_t tracked[(MEM_HASH_SIZE + 7) / 8]; +} MemData; + + +/** Structure that is used to keep track of unwinding meta-data. + * This data is passed between all the unwinding functions. + */ +typedef struct { + /** The register values and meta-data. */ + RegData regData[16]; + + /** Memory tracking data. */ + MemData memData; + + /** Pointer to the callback functions */ + const UnwindCallbacks *cb; + + /** Pointer to pass to the report function. */ + const void *reportData; +} UnwState; + +/*************************************************************************** + * Macros + **************************************************************************/ + +#define M_IsOriginValid(v) (((v) & 0x7F) ? true : false) +#define M_Origin2Str(v) ((v) ? "VALID" : "INVALID") + +#if defined(UNW_DEBUG) +#define UnwPrintd1(a) state->cb->printf(a) +#define UnwPrintd2(a,b) state->cb->printf(a,b) +#define UnwPrintd3(a,b,c) state->cb->printf(a,b,c) +#define UnwPrintd4(a,b,c,d) state->cb->printf(a,b,c,d) +#define UnwPrintd5(a,b,c,d,e) state->cb->printf(a,b,c,d,e) +#define UnwPrintd6(a,b,c,d,e,f) state->cb->printf(a,b,c,d,e,f) +#define UnwPrintd7(a,b,c,d,e,f,g) state->cb->printf(a,b,c,d,e,f,g) +#define UnwPrintd8(a,b,c,d,e,f,g,h) state->cb->printf(a,b,c,d,e,f,g,h) +#else +#define UnwPrintd1(a) +#define UnwPrintd2(a,b) +#define UnwPrintd3(a,b,c) +#define UnwPrintd4(a,b,c,d) +#define UnwPrintd5(a,b,c,d,e) +#define UnwPrintd6(a,b,c,d,e,f) +#define UnwPrintd7(a,b,c,d,e,f,g) +#define UnwPrintd8(a,b,c,d,e,f,g,h) +#endif + +/*************************************************************************** + * Function Prototypes + **************************************************************************/ + +UnwResult UnwStartArm(UnwState * const state); +UnwResult UnwStartThumb(UnwState * const state); +void UnwInvalidateRegisterFile(RegData *regFile); +void UnwInitState(UnwState * const state, const UnwindCallbacks *cb, void *rptData, uint32_t pcValue, uint32_t spValue); +bool UnwReportRetAddr(UnwState * const state, uint32_t addr); +bool UnwMemWriteRegister(UnwState * const state, const uint32_t addr, const RegData * const reg); +bool UnwMemReadRegister(UnwState * const state, const uint32_t addr, RegData * const reg); +void UnwMemHashGC(UnwState * const state); + +#endif // UNWARM_H diff --git a/Marlin/src/HAL/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/backtrace/unwarm_arm.cpp new file mode 100644 index 0000000000..09528885f7 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarm_arm.cpp @@ -0,0 +1,597 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Abstract interpreter for ARM mode. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM_ARM" + +#include +#include "unwarm.h" + +/** Check if some instruction is a data-processing instruction. + * Decodes the passed instruction, checks if it is a data-processing and + * verifies that the parameters and operation really indicate a data- + * processing instruction. This is needed because some parts of the + * instruction space under this instruction can be extended or represent + * other operations such as MRS, MSR. + * + * \param[in] inst The instruction word. + * \retval true Further decoding of the instruction indicates that this is + * a valid data-processing instruction. + * \retval false This is not a data-processing instruction, + */ +static bool isDataProc(uint32_t instr) { + + uint8_t opcode = (instr & 0x01E00000) >> 21; + bool S = (instr & 0x00100000) ? true : false; + + if ((instr & 0xFC000000) != 0xE0000000) { + return false; + } + else if (!S && opcode >= 8 && opcode <= 11) { + /* TST, TEQ, CMP and CMN all require S to be set */ + return false; + } + else + return true; +} + +UnwResult UnwStartArm(UnwState * const state) { + + bool found = false; + uint16_t t = UNW_MAX_INSTR_COUNT; + + do { + uint32_t instr; + + /* Attempt to read the instruction */ + if (!state->cb->readW(state->regData[15].v, &instr)) { + return UNWIND_IREAD_W_FAIL; + } + + UnwPrintd4("A %x %x %08x:", state->regData[13].v, state->regData[15].v, instr); + + /* Check that the PC is still on Arm alignment */ + if (state->regData[15].v & 0x3) { + UnwPrintd1("\nError: PC misalignment\n"); + return UNWIND_INCONSISTENT; + } + + /* Check that the SP and PC have not been invalidated */ + if (!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { + UnwPrintd1("\nError: PC or SP invalidated\n"); + return UNWIND_INCONSISTENT; + } + + /* Branch and Exchange (BX) + * This is tested prior to data processing to prevent + * mis-interpretation as an invalid TEQ instruction. + */ + if ((instr & 0xFFFFFFF0) == 0xE12FFF10) { + uint8_t rn = instr & 0xF; + + UnwPrintd4("BX r%d\t ; r%d %s\n", rn, rn, M_Origin2Str(state->regData[rn].o)); + + if (!M_IsOriginValid(state->regData[rn].o)) { + UnwPrintd1("\nUnwind failure: BX to untracked register\n"); + return UNWIND_FAILURE; + } + + /* Set the new PC value */ + state->regData[15].v = state->regData[rn].v; + + /* Check if the return value is from the stack */ + if (state->regData[rn].o == REG_VAL_FROM_STACK) { + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v & (~0x1)); + + /* Report the return address */ + if (!UnwReportRetAddr(state, state->regData[rn].v)) + return UNWIND_TRUNCATED; + } + + /* Determine the return mode */ + if (state->regData[rn].v & 0x1) { + + /* Branching to THUMB */ + return UnwStartThumb(state); + } + else { + + /* Branch to ARM */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 4; + } + } + /* Branch */ + else if ((instr & 0xFF000000) == 0xEA000000) { + + int32_t offset = (instr & 0x00FFFFFF); + + /* Shift value */ + offset = offset << 2; + + /* Sign extend if needed */ + if (offset & 0x02000000) { + offset |= 0xFC000000; + } + + UnwPrintd2("B %d\n", offset); + + /* Adjust PC */ + state->regData[15].v += offset; + + /* Account for pre-fetch, where normally the PC is 8 bytes + * ahead of the instruction just executed. + */ + state->regData[15].v += 4; + } + + /* MRS */ + else if ((instr & 0xFFBF0FFF) == 0xE10F0000) { +#if defined(UNW_DEBUG) + bool R = (instr & 0x00400000) ? true : false; +#endif + uint8_t rd = (instr & 0x0000F000) >> 12; + + UnwPrintd4("MRS r%d,%s\t; r%d invalidated", rd, R ? "SPSR" : "CPSR", rd); + + /* Status registers untracked */ + state->regData[rd].o = REG_VAL_INVALID; + } + /* MSR */ + else if ((instr & 0xFFB0F000) == 0xE120F000) { +#if defined(UNW_DEBUG) + bool R = (instr & 0x00400000) ? true : false; + + UnwPrintd2("MSR %s_?, ???", R ? "SPSR" : "CPSR"); +#endif + /* Status registers untracked. + * Potentially this could change processor mode and switch + * banked registers r8-r14. Most likely is that r13 (sp) will + * be banked. However, invalidating r13 will stop unwinding + * when potentially this write is being used to disable/enable + * interrupts (a common case). Therefore no invalidation is + * performed. + */ + } + /* Data processing */ + else if (isDataProc(instr)) { + bool I = (instr & 0x02000000) ? true : false; + uint8_t opcode = (instr & 0x01E00000) >> 21; +#if defined(UNW_DEBUG) + bool S = (instr & 0x00100000) ? true : false; +#endif + uint8_t rn = (instr & 0x000F0000) >> 16; + uint8_t rd = (instr & 0x0000F000) >> 12; + uint16_t operand2 = (instr & 0x00000FFF); + uint32_t op2val; + int op2origin; + + switch(opcode) { + case 0: UnwPrintd4("AND%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 1: UnwPrintd4("EOR%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 2: UnwPrintd4("SUB%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 3: UnwPrintd4("RSB%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 4: UnwPrintd4("ADD%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 5: UnwPrintd4("ADC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 6: UnwPrintd4("SBC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 7: UnwPrintd4("RSC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 8: UnwPrintd3("TST%s r%d,", S ? "S" : "", rn); break; + case 9: UnwPrintd3("TEQ%s r%d,", S ? "S" : "", rn); break; + case 10: UnwPrintd3("CMP%s r%d,", S ? "S" : "", rn); break; + case 11: UnwPrintd3("CMN%s r%d,", S ? "S" : "", rn); break; + case 12: UnwPrintd3("ORR%s r%d,", S ? "S" : "", rn); break; + case 13: UnwPrintd3("MOV%s r%d,", S ? "S" : "", rd); break; + case 14: UnwPrintd4("BIC%s r%d,r%d", S ? "S" : "", rd, rn); break; + case 15: UnwPrintd3("MVN%s r%d,", S ? "S" : "", rd); break; + } + + /* Decode operand 2 */ + if (I) { + uint8_t shiftDist = (operand2 & 0x0F00) >> 8; + uint8_t shiftConst = (operand2 & 0x00FF); + + /* rotate const right by 2 * shiftDist */ + shiftDist *= 2; + op2val = (shiftConst >> shiftDist) | + (shiftConst << (32 - shiftDist)); + op2origin = REG_VAL_FROM_CONST; + + UnwPrintd2("#0x%x", op2val); + } + else { + + /* Register and shift */ + uint8_t rm = (operand2 & 0x000F); + uint8_t regShift = (operand2 & 0x0010) ? true : false; + uint8_t shiftType = (operand2 & 0x0060) >> 5; + uint32_t shiftDist; +#if defined(UNW_DEBUG) + const char * const shiftMnu[4] = { "LSL", "LSR", "ASR", "ROR" }; +#endif + UnwPrintd2("r%d ", rm); + + /* Get the shift distance */ + if (regShift) { + + uint8_t rs = (operand2 & 0x0F00) >> 8; + + if (operand2 & 0x00800) { + + UnwPrintd1("\nError: Bit should be zero\n"); + return UNWIND_ILLEGAL_INSTR; + } + else if (rs == 15) { + + UnwPrintd1("\nError: Cannot use R15 with register shift\n"); + return UNWIND_ILLEGAL_INSTR; + } + + /* Get shift distance */ + shiftDist = state->regData[rs].v; + op2origin = state->regData[rs].o; + + UnwPrintd7("%s r%d\t; r%d %s r%d %s", shiftMnu[shiftType], rs, rm, M_Origin2Str(state->regData[rm].o), rs, M_Origin2Str(state->regData[rs].o)); + } + else { + shiftDist = (operand2 & 0x0F80) >> 7; + op2origin = REG_VAL_FROM_CONST; + + if (shiftDist) { + UnwPrintd3("%s #%d", shiftMnu[shiftType], shiftDist); + } + UnwPrintd3("\t; r%d %s", rm, M_Origin2Str(state->regData[rm].o)); + } + + /* Apply the shift type to the source register */ + switch(shiftType) { + case 0: /* logical left */ + op2val = state->regData[rm].v << shiftDist; + break; + + case 1: /* logical right */ + if (!regShift && shiftDist == 0) { + shiftDist = 32; + } + + op2val = state->regData[rm].v >> shiftDist; + break; + + case 2: /* arithmetic right */ + if (!regShift && shiftDist == 0) { + shiftDist = 32; + } + + if (state->regData[rm].v & 0x80000000) { + + /* Register shifts maybe greater than 32 */ + if (shiftDist >= 32) { + op2val = 0xFFFFFFFF; + } + else { + op2val = state->regData[rm].v >> shiftDist; + op2val |= 0xFFFFFFFF << (32 - shiftDist); + } + } + else { + op2val = state->regData[rm].v >> shiftDist; + } + break; + + case 3: /* rotate right */ + + if (!regShift && shiftDist == 0) { + /* Rotate right with extend. + * This uses the carry bit and so always has an + * untracked result. + */ + op2origin = REG_VAL_INVALID; + op2val = 0; + } + else { + /* Limit shift distance to 0-31 incase of register shift */ + shiftDist &= 0x1F; + + op2val = (state->regData[rm].v >> shiftDist) | + (state->regData[rm].v << (32 - shiftDist)); + } + break; + + default: + UnwPrintd2("\nError: Invalid shift type: %d\n", shiftType); + return UNWIND_FAILURE; + } + + /* Decide the data origin */ + if (M_IsOriginValid(op2origin) && + M_IsOriginValid(state->regData[rm].o)) { + + op2origin = state->regData[rm].o; + op2origin |= REG_VAL_ARITHMETIC; + } + else { + op2origin = REG_VAL_INVALID; + } + } + + /* Propagate register validity */ + switch(opcode) { + case 0: /* AND: Rd := Op1 AND Op2 */ + case 1: /* EOR: Rd := Op1 EOR Op2 */ + case 2: /* SUB: Rd:= Op1 - Op2 */ + case 3: /* RSB: Rd:= Op2 - Op1 */ + case 4: /* ADD: Rd:= Op1 + Op2 */ + case 12: /* ORR: Rd:= Op1 OR Op2 */ + case 14: /* BIC: Rd:= Op1 AND NOT Op2 */ + if (!M_IsOriginValid(state->regData[rn].o) || + !M_IsOriginValid(op2origin)) { + state->regData[rd].o = REG_VAL_INVALID; + } + else { + state->regData[rd].o = state->regData[rn].o; + state->regData[rd].o = (RegValOrigin)(state->regData[rd].o | op2origin); + } + break; + + case 5: /* ADC: Rd:= Op1 + Op2 + C */ + case 6: /* SBC: Rd:= Op1 - Op2 + C */ + case 7: /* RSC: Rd:= Op2 - Op1 + C */ + /* CPSR is not tracked */ + state->regData[rd].o = REG_VAL_INVALID; + break; + + case 8: /* TST: set condition codes on Op1 AND Op2 */ + case 9: /* TEQ: set condition codes on Op1 EOR Op2 */ + case 10: /* CMP: set condition codes on Op1 - Op2 */ + case 11: /* CMN: set condition codes on Op1 + Op2 */ + break; + + case 13: /* MOV: Rd:= Op2 */ + case 15: /* MVN: Rd:= NOT Op2 */ + state->regData[rd].o = (RegValOrigin) op2origin; + break; + } + + /* Account for pre-fetch by temporarily adjusting PC */ + if (rn == 15) { + + /* If the shift amount is specified in the instruction, + * the PC will be 8 bytes ahead. If a register is used + * to specify the shift amount the PC will be 12 bytes + * ahead. + */ + if (!I && (operand2 & 0x0010)) + state->regData[rn].v += 12; + else + state->regData[rn].v += 8; + } + + /* Compute values */ + switch(opcode) { + case 0: /* AND: Rd := Op1 AND Op2 */ + state->regData[rd].v = state->regData[rn].v & op2val; + break; + + case 1: /* EOR: Rd := Op1 EOR Op2 */ + state->regData[rd].v = state->regData[rn].v ^ op2val; + break; + + case 2: /* SUB: Rd:= Op1 - Op2 */ + state->regData[rd].v = state->regData[rn].v - op2val; + break; + case 3: /* RSB: Rd:= Op2 - Op1 */ + state->regData[rd].v = op2val - state->regData[rn].v; + break; + + case 4: /* ADD: Rd:= Op1 + Op2 */ + state->regData[rd].v = state->regData[rn].v + op2val; + break; + + case 5: /* ADC: Rd:= Op1 + Op2 + C */ + case 6: /* SBC: Rd:= Op1 - Op2 + C */ + case 7: /* RSC: Rd:= Op2 - Op1 + C */ + case 8: /* TST: set condition codes on Op1 AND Op2 */ + case 9: /* TEQ: set condition codes on Op1 EOR Op2 */ + case 10: /* CMP: set condition codes on Op1 - Op2 */ + case 11: /* CMN: set condition codes on Op1 + Op2 */ + UnwPrintd1("\t; ????"); + break; + + case 12: /* ORR: Rd:= Op1 OR Op2 */ + state->regData[rd].v = state->regData[rn].v | op2val; + break; + + case 13: /* MOV: Rd:= Op2 */ + state->regData[rd].v = op2val; + break; + + case 14: /* BIC: Rd:= Op1 AND NOT Op2 */ + state->regData[rd].v = state->regData[rn].v & (~op2val); + break; + + case 15: /* MVN: Rd:= NOT Op2 */ + state->regData[rd].v = ~op2val; + break; + } + + /* Remove the prefetch offset from the PC */ + if (rd != 15 && rn == 15) { + if (!I && (operand2 & 0x0010)) + state->regData[rn].v -= 12; + else + state->regData[rn].v -= 8; + } + } + + /* Block Data Transfer + * LDM, STM + */ + else if ((instr & 0xFE000000) == 0xE8000000) { + + bool P = (instr & 0x01000000) ? true : false; + bool U = (instr & 0x00800000) ? true : false; + bool S = (instr & 0x00400000) ? true : false; + bool W = (instr & 0x00200000) ? true : false; + bool L = (instr & 0x00100000) ? true : false; + uint16_t baseReg = (instr & 0x000F0000) >> 16; + uint16_t regList = (instr & 0x0000FFFF); + uint32_t addr = state->regData[baseReg].v; + bool addrValid = M_IsOriginValid(state->regData[baseReg].o); + int8_t r; + +#if defined(UNW_DEBUG) + /* Display the instruction */ + if (L) { + UnwPrintd6("LDM%c%c r%d%s, {reglist}%s\n", P ? 'E' : 'F', U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + } + else { + UnwPrintd6("STM%c%c r%d%s, {reglist}%s\n", !P ? 'E' : 'F', !U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + } +#endif + /* S indicates that banked registers (untracked) are used, unless + * this is a load including the PC when the S-bit indicates that + * that CPSR is loaded from SPSR (also untracked, but ignored). + */ + if (S && (!L || (regList & (0x01 << 15)) == 0)) { + UnwPrintd1("\nError:S-bit set requiring banked registers\n"); + return UNWIND_FAILURE; + } + else if (baseReg == 15) { + UnwPrintd1("\nError: r15 used as base register\n"); + return UNWIND_FAILURE; + } + else if (regList == 0) { + UnwPrintd1("\nError: Register list empty\n"); + return UNWIND_FAILURE; + } + + /* Check if ascending or descending. + * Registers are loaded/stored in order of address. + * i.e. r0 is at the lowest address, r15 at the highest. + */ + r = U ? 0 : 15; + do { + + /* Check if the register is to be transferred */ + if (regList & (0x01 << r)) { + + if (P) + addr += U ? 4 : -4; + + if (L) { + + if (addrValid) { + + if (!UnwMemReadRegister(state, addr, &state->regData[r])) { + return UNWIND_DREAD_W_FAIL; + } + + /* Update the origin if read via the stack pointer */ + if (M_IsOriginValid(state->regData[r].o) && baseReg == 13) { + state->regData[r].o = REG_VAL_FROM_STACK; + } + + UnwPrintd5(" R%d = 0x%08x\t; r%d %s\n",r,state->regData[r].v,r, M_Origin2Str(state->regData[r].o)); + } + else { + + /* Invalidate the register as the base reg was invalid */ + state->regData[r].o = REG_VAL_INVALID; + + UnwPrintd2(" R%d = ???\n", r); + } + } + else { + if (addrValid) { + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DWRITE_W_FAIL; + } + } + + UnwPrintd2(" R%d = 0x%08x\n", r); + } + + if (!P) + addr += U ? 4 : -4; + } + + /* Check the next register */ + r += U ? 1 : -1; + + } while (r >= 0 && r <= 15); + + /* Check the writeback bit */ + if (W) + state->regData[baseReg].v = addr; + + /* Check if the PC was loaded */ + if (L && (regList & (0x01 << 15))) { + if (!M_IsOriginValid(state->regData[15].o)) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + else { + /* Store the return address */ + if (!UnwReportRetAddr(state, state->regData[15].v)) { + return UNWIND_TRUNCATED; + } + + UnwPrintd2(" Return PC=0x%x", state->regData[15].v); + + /* Determine the return mode */ + if (state->regData[15].v & 0x1) { + /* Branching to THUMB */ + return UnwStartThumb(state); + } + else { + /* Branch to ARM */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 4; + } + } + } + } + else { + UnwPrintd1("????"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + + UnwPrintd1("\n"); + + /* Should never hit the reset vector */ + if (state->regData[15].v == 0) return UNWIND_RESET; + + /* Check next address */ + state->regData[15].v += 4; + + /* Garbage collect the memory hash (used only for the stack) */ + UnwMemHashGC(state); + + t--; + if (t == 0) + return UNWIND_EXHAUSTED; + + } while (!found); + + return UNWIND_UNSUPPORTED; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/backtrace/unwarm_thumb.cpp new file mode 100644 index 0000000000..a4afbeaf8d --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarm_thumb.cpp @@ -0,0 +1,1127 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Abstract interpretation for Thumb mode. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM_THUMB" + +#include +#include "unwarm.h" + +/** Sign extend an 11 bit value. + * This function simply inspects bit 11 of the input \a value, and if + * set, the top 5 bits are set to give a 2's compliment signed value. + * \param value The value to sign extend. + * \return The signed-11 bit value stored in a 16bit data type. + */ +static int32_t signExtend11(uint16_t value) { + + if(value & 0x400) { + value |= 0xFFFFF800; + } + + return value; +} + +UnwResult UnwStartThumb(UnwState * const state) { + + bool found = false; + uint16_t t = UNW_MAX_INSTR_COUNT; + uint32_t lastJumpAddr = 0; // Last JUMP address, to try to detect infinite loops + bool loopDetected = false; // If a loop was detected + + do { + uint16_t instr; + + /* Attempt to read the instruction */ + if(!state->cb->readH(state->regData[15].v & (~0x1), &instr)) { + return UNWIND_IREAD_H_FAIL; + } + + UnwPrintd4("T %x %x %04x:", state->regData[13].v, state->regData[15].v, instr); + + /* Check that the PC is still on Thumb alignment */ + if(!(state->regData[15].v & 0x1)) { + UnwPrintd1("\nError: PC misalignment\n"); + return UNWIND_INCONSISTENT; + } + + /* Check that the SP and PC have not been invalidated */ + if(!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { + UnwPrintd1("\nError: PC or SP invalidated\n"); + return UNWIND_INCONSISTENT; + } + + /* + * Detect 32bit thumb instructions + */ + if ((instr & 0xE000) == 0xE000 && (instr & 0x1800) != 0) { + uint16_t instr2; + + /* Check next address */ + state->regData[15].v += 2; + + /* Attempt to read the 2nd part of the instruction */ + if(!state->cb->readH(state->regData[15].v & (~0x1), &instr2)) { + return UNWIND_IREAD_H_FAIL; + } + + UnwPrintd3(" %x %04x:", state->regData[15].v, instr2); + + /* + * Load/Store multiple: Only interpret + * PUSH and POP + */ + if ((instr & 0xFE6F) == 0xE82D) { + bool L = (instr & 0x10) ? true : false; + uint16_t rList = instr2; + + if(L) { + uint8_t r; + + /* Load from memory: POP */ + UnwPrintd1("POP {Rlist}\n"); + + /* Load registers from stack */ + for(r = 0; r < 16; r++) { + if(rList & (0x1 << r)) { + + /* Read the word */ + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DREAD_W_FAIL; + } + + /* Alter the origin to be from the stack if it was valid */ + if(M_IsOriginValid(state->regData[r].o)) { + + state->regData[r].o = REG_VAL_FROM_STACK; + + /* If restoring the PC */ + if (r == 15) { + + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if(!UnwReportRetAddr(state, state->regData[15].v)) { + return UNWIND_TRUNCATED; + } + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + + } + + } else { + + if (r == 15) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + } + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + } + } + else { + int8_t r; + + /* Store to memory: PUSH */ + UnwPrintd1("PUSH {Rlist}"); + + for(r = 15; r >= 0; r--) { + if(rList & (0x1 << r)) { + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DWRITE_W_FAIL; + } + } + } + } + } + /* + * PUSH register + */ + else if (instr == 0xF84D && (instr2 & 0x0FFF) == 0x0D04) { + uint8_t r = instr2 >> 12; + + /* Store to memory: PUSH */ + UnwPrintd2("PUSH {R%d}\n", r); + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DWRITE_W_FAIL; + } + } + /* + * POP register + */ + else if (instr == 0xF85D && (instr2 & 0x0FFF) == 0x0B04) { + uint8_t r = instr2 >> 12; + + /* Load from memory: POP */ + UnwPrintd2("POP {R%d}\n", r); + + /* Read the word */ + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DREAD_W_FAIL; + } + + /* Alter the origin to be from the stack if it was valid */ + if(M_IsOriginValid(state->regData[r].o)) { + + state->regData[r].o = REG_VAL_FROM_STACK; + + /* If restoring the PC */ + if (r == 15) { + + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if(!UnwReportRetAddr(state, state->regData[15].v)) { + return UNWIND_TRUNCATED; + } + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + + } + + } else { + + if (r == 15) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + } + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + /* + * TBB / TBH + */ + else if ((instr & 0xFFF0) == 0xE8D0 && (instr2 & 0xFFE0) == 0xF000) { + /* We are only interested in + * the forms + * TBB [PC, ...] + * TBH [PC, ..., LSL #1] + * as those are used by the C compiler to implement + * the switch clauses + */ + uint8_t rn = instr & 0xF; + bool H = (instr2 & 0x10) ? true : false; + + UnwPrintd5("TB%c [r%d,r%d%s]\n", H ? 'H' : 'B', rn, (instr2 & 0xF), H ? ",LSL #1" : ""); + + // We are only interested if the RN is the PC. Let's choose the 1st destination + if (rn == 15) { + if (H) { + uint16_t rv; + if(!state->cb->readH((state->regData[15].v & (~1)) + 2, &rv)) { + return UNWIND_DREAD_H_FAIL; + } + state->regData[15].v += rv * 2; + } else { + uint8_t rv; + if(!state->cb->readB((state->regData[15].v & (~1)) + 2, &rv)) { + return UNWIND_DREAD_B_FAIL; + } + state->regData[15].v += rv * 2; + } + } + } + /* + * Unconditional branch + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0x9000) { + uint32_t v; + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm10 = (instr & 0x3FF); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 24) | (I1 << 23) | (I2 << 22) |(imm10 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFE000000; + + UnwPrintd2("B %d \n", imm32); + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Compute the jump address */ + v = state->regData[15].v + 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", v); + + /* Did we detect an infinite loop ? */ + loopDetected = lastJumpAddr == v; + + /* Remember the last address we jumped to */ + lastJumpAddr = v; + } + + /* + * Branch with link + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0xD000) { + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm10 = (instr & 0x3FF); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 24) | (I1 << 23) | (I2 << 22) |(imm10 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFE000000; + + UnwPrintd2("BL %d \n", imm32); + + /* Never taken, as we are unwinding the stack */ + if (0) { + + /* Store return address in LR register */ + state->regData[14].v = state->regData[15].v + 2; + state->regData[14].o = REG_VAL_FROM_CONST; + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" Return PC=%x", state->regData[15].v); + + /* Report the return address, including mode bit */ + if(!UnwReportRetAddr(state, state->regData[15].v)) { + return UNWIND_TRUNCATED; + } + + /* Determine the new mode */ + if(state->regData[15].v & 0x1) { + /* Branching to THUMB */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 2; + } + else { + /* Branch to ARM */ + return UnwStartArm(state); + } + } + } + + /* + * Conditional branches. Usually not taken, unless infinite loop is detected + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0x8000) { + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm6 = (instr & 0x3F); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 20) | (I1 << 19) | (I2 << 18) |(imm6 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFFE00000; + + UnwPrintd2("Bcond %d\n", imm32); + + /* Take the jump only if a loop is detected */ + if (loopDetected) { + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", state->regData[15].v + 2); + } + } + /* + * PC-relative load + * LDR Rd,[PC, #+/-imm] + */ + else if((instr & 0xFF7F) == 0xF85F) { + uint8_t rt = (instr2 & 0xF000) >> 12; + uint8_t imm12 = (instr2 & 0x0FFF); + bool A = (instr & 0x80) ? true : false; + uint32_t address; + + /* Compute load address, adding a word to account for prefetch */ + address = (state->regData[15].v & (~0x3)) + 4; + if (A) address += imm12; + else address -= imm12; + + UnwPrintd4("LDR r%d,[PC #%c0x%08x]", rt, A?'+':'-', address); + + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { + return UNWIND_DREAD_W_FAIL; + } + } + /* + * LDR immediate. + * We are only interested when destination is PC. + * LDR Rt,[Rn , #n] + */ + else if ((instr & 0xFFF0) == 0xF8D0) { + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint16_t imm12 = (instr2 & 0xFFF); + + /* If destination is PC and we don't know the source value, then fail */ + if (!M_IsOriginValid(state->regData[rn].o)) { + state->regData[rt].o = state->regData[rn].o; + } else { + uint32_t address = state->regData[rn].v + imm12; + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { + return UNWIND_DREAD_W_FAIL; + } + } + } + /* + * LDR immediate + * We are only interested when destination is PC. + * LDR Rt,[Rn , #-n] + * LDR Rt,[Rn], #+/-n] + * LDR Rt,[Rn, #+/-n]! + */ + else if ((instr & 0xFFF0) == 0xF850 && (instr2 & 0x0800) == 0x0800) { + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint16_t imm8 = (instr2 & 0xFF); + bool P = (instr2 & 0x400) ? true : false; + bool U = (instr2 & 0x200) ? true : false; + bool W = (instr2 & 0x100) ? true : false; + + if (!M_IsOriginValid(state->regData[rn].o)) { + state->regData[rt].o = state->regData[rn].o; + } else { + uint32_t offaddress = state->regData[rn].v + imm8; + if (U) offaddress += imm8; + else offaddress -= imm8; + + uint32_t address; + if (P) { + address = offaddress; + } else { + address = state->regData[rn].v; + } + + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { + return UNWIND_DREAD_W_FAIL; + } + + if (W) { + state->regData[rn].v = offaddress; + } + } + } + /* + * LDR (register). + * We are interested in the form + * ldr Rt, [Rn, Rm, lsl #x] + * Where Rt is PC, Rn value is known, Rm is not known or unknown + */ + else if ((instr & 0xFFF0) == 0xF850 && (instr2 & 0x0FC0) == 0x0000) { + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint8_t rm = (instr2 & 0xF); + uint8_t imm2 = (instr2 & 0x30) >> 4; + + if (!M_IsOriginValid(state->regData[rn].o) || + !M_IsOriginValid(state->regData[rm].o)) { + + /* If Rt is PC, and Rn is known, then do an exception and assume + Rm equals 0 => This takes the first case in a switch() */ + if (rt == 15 && M_IsOriginValid(state->regData[rn].o)) { + uint32_t address = state->regData[rn].v; + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { + return UNWIND_DREAD_W_FAIL; + } + } else { + /* Propagate unknown value */ + state->regData[rt].o = state->regData[rn].o; + } + } else { + uint32_t address = state->regData[rn].v + (state->regData[rm].v << imm2); + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { + return UNWIND_DREAD_W_FAIL; + } + } + } + else { + UnwPrintd1("???? (32)"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + /* End of thumb 32bit code */ + + } + /* Format 1: Move shifted register + * LSL Rd, Rs, #Offset5 + * LSR Rd, Rs, #Offset5 + * ASR Rd, Rs, #Offset5 + */ + else if((instr & 0xE000) == 0x0000 && (instr & 0x1800) != 0x1800) { + bool signExtend; + uint8_t op = (instr & 0x1800) >> 11; + uint8_t offset5 = (instr & 0x07C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); + + switch(op) { + case 0: /* LSL */ + UnwPrintd6("LSL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + state->regData[rd].v = state->regData[rs].v << offset5; + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 1: /* LSR */ + UnwPrintd6("LSR r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + state->regData[rd].v = state->regData[rs].v >> offset5; + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 2: /* ASR */ + UnwPrintd6("ASL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + + signExtend = (state->regData[rs].v & 0x8000) ? true : false; + state->regData[rd].v = state->regData[rs].v >> offset5; + if(signExtend) { + state->regData[rd].v |= 0xFFFFFFFF << (32 - offset5); + } + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 2: add/subtract + * ADD Rd, Rs, Rn + * ADD Rd, Rs, #Offset3 + * SUB Rd, Rs, Rn + * SUB Rd, Rs, #Offset3 + */ + else if((instr & 0xF800) == 0x1800) { + bool I = (instr & 0x0400) ? true : false; + bool op = (instr & 0x0200) ? true : false; + uint8_t rn = (instr & 0x01C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); + + /* Print decoding */ + UnwPrintd6("%s r%d, r%d, %c%d\t;",op ? "SUB" : "ADD",rd, rs,I ? '#' : 'r',rn); + UnwPrintd5("r%d %s, r%d %s",rd, M_Origin2Str(state->regData[rd].o),rs, M_Origin2Str(state->regData[rs].o)); + if(!I) { + + UnwPrintd3(", r%d %s", rn, M_Origin2Str(state->regData[rn].o)); + + /* Perform calculation */ + if(op) { + state->regData[rd].v = state->regData[rs].v - state->regData[rn].v; + } + else { + state->regData[rd].v = state->regData[rs].v + state->regData[rn].v; + } + + /* Propagate the origin */ + if(M_IsOriginValid(state->regData[rs].o) && + M_IsOriginValid(state->regData[rn].o)) { + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + else { + state->regData[rd].o = REG_VAL_INVALID; + } + } + else { + /* Perform calculation */ + if(op) { + state->regData[rd].v = state->regData[rs].v - rn; + } + else { + state->regData[rd].v = state->regData[rs].v + rn; + } + + /* Propagate the origin */ + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + } + /* Format 3: move/compare/add/subtract immediate + * MOV Rd, #Offset8 + * CMP Rd, #Offset8 + * ADD Rd, #Offset8 + * SUB Rd, #Offset8 + */ + else if((instr & 0xE000) == 0x2000) { + + uint8_t op = (instr & 0x1800) >> 11; + uint8_t rd = (instr & 0x0700) >> 8; + uint8_t offset8 = (instr & 0x00FF); + + switch(op) { + case 0: /* MOV */ + UnwPrintd3("MOV r%d, #0x%x", rd, offset8); + state->regData[rd].v = offset8; + state->regData[rd].o = REG_VAL_FROM_CONST; + break; + + case 1: /* CMP */ + /* Irrelevant to unwinding */ + UnwPrintd1("CMP ???"); + break; + + case 2: /* ADD */ + UnwPrintd5("ADD r%d, #0x%x\t; r%d %s", rd, offset8, rd, M_Origin2Str(state->regData[rd].o)); + state->regData[rd].v += offset8; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 3: /* SUB */ + UnwPrintd5("SUB r%d, #0x%d\t; r%d %s", rd, offset8, rd, M_Origin2Str(state->regData[rd].o)); + state->regData[rd].v -= offset8; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 4: ALU operations + * AND Rd, Rs + * EOR Rd, Rs + * LSL Rd, Rs + * LSR Rd, Rs + * ASR Rd, Rs + * ADC Rd, Rs + * SBC Rd, Rs + * ROR Rd, Rs + * TST Rd, Rs + * NEG Rd, Rs + * CMP Rd, Rs + * CMN Rd, Rs + * ORR Rd, Rs + * MUL Rd, Rs + * BIC Rd, Rs + * MVN Rd, Rs + */ + else if((instr & 0xFC00) == 0x4000) { + uint8_t op = (instr & 0x03C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); + +#if defined(UNW_DEBUG) + static const char * const mnu[16] = { + "AND", "EOR", "LSL", "LSR", + "ASR", "ADC", "SBC", "ROR", + "TST", "NEG", "CMP", "CMN", + "ORR", "MUL", "BIC", "MVN" }; +#endif + /* Print the mnemonic and registers */ + switch(op) { + case 0: /* AND */ + case 1: /* EOR */ + case 2: /* LSL */ + case 3: /* LSR */ + case 4: /* ASR */ + case 7: /* ROR */ + case 9: /* NEG */ + case 12: /* ORR */ + case 13: /* MUL */ + case 15: /* MVN */ + UnwPrintd8("%s r%d ,r%d\t; r%d %s, r%d %s",mnu[op],rd, rs, rd, M_Origin2Str(state->regData[rd].o), rs, M_Origin2Str(state->regData[rs].o)); + break; + + case 5: /* ADC */ + case 6: /* SBC */ + UnwPrintd4("%s r%d, r%d", mnu[op], rd, rs); + break; + + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + /* Irrelevant to unwinding */ + UnwPrintd2("%s ???", mnu[op]); + break; + + case 14: /* BIC */ + UnwPrintd5("r%d ,r%d\t; r%d %s", rd, rs, rs, M_Origin2Str(state->regData[rs].o)); + break; + } + + /* Perform operation */ + switch(op) { + case 0: /* AND */ + state->regData[rd].v &= state->regData[rs].v; + break; + + case 1: /* EOR */ + state->regData[rd].v ^= state->regData[rs].v; + break; + + case 2: /* LSL */ + state->regData[rd].v <<= state->regData[rs].v; + break; + + case 3: /* LSR */ + state->regData[rd].v >>= state->regData[rs].v; + break; + + case 4: /* ASR */ + if(state->regData[rd].v & 0x80000000) { + state->regData[rd].v >>= state->regData[rs].v; + state->regData[rd].v |= 0xFFFFFFFF << (32 - state->regData[rs].v); + } + else { + state->regData[rd].v >>= state->regData[rs].v; + } + + break; + + case 5: /* ADC */ + case 6: /* SBC */ + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + break; + + case 7: /* ROR */ + state->regData[rd].v = (state->regData[rd].v >> state->regData[rs].v) | + (state->regData[rd].v << (32 - state->regData[rs].v)); + break; + + case 9: /* NEG */ + state->regData[rd].v = -state->regData[rs].v; + break; + + case 12: /* ORR */ + state->regData[rd].v |= state->regData[rs].v; + break; + + case 13: /* MUL */ + state->regData[rd].v *= state->regData[rs].v; + break; + + case 14: /* BIC */ + state->regData[rd].v &= ~state->regData[rs].v; + break; + + case 15: /* MVN */ + state->regData[rd].v = ~state->regData[rs].v; + break; + } + + /* Propagate data origins */ + switch(op) { + case 0: /* AND */ + case 1: /* EOR */ + case 2: /* LSL */ + case 3: /* LSR */ + case 4: /* ASR */ + case 7: /* ROR */ + case 12: /* ORR */ + case 13: /* MUL */ + case 14: /* BIC */ + if(M_IsOriginValid(state->regData[rd].o) && M_IsOriginValid(state->regData[rs].o)) { + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + else { + state->regData[rd].o = REG_VAL_INVALID; + } + break; + + case 5: /* ADC */ + case 6: /* SBC */ + /* C-bit not tracked */ + state->regData[rd].o = REG_VAL_INVALID; + break; + + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + /* Nothing propagated */ + break; + + case 9: /* NEG */ + case 15: /* MVN */ + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 5: Hi register operations/branch exchange + * ADD Rd, Hs + * CMP Hd, Rs + * MOV Hd, Hs + */ + else if((instr & 0xFC00) == 0x4400) { + uint8_t op = (instr & 0x0300) >> 8; + bool h1 = (instr & 0x0080) ? true: false; + bool h2 = (instr & 0x0040) ? true: false; + uint8_t rhs = (instr & 0x0038) >> 3; + uint8_t rhd = (instr & 0x0007); + + /* Adjust the register numbers */ + if(h2) + rhs += 8; + if(h1) + rhd += 8; + + switch(op) { + case 0: /* ADD */ + UnwPrintd5("ADD r%d, r%d\t; r%d %s", rhd, rhs, rhs, M_Origin2Str(state->regData[rhs].o)); + state->regData[rhd].v += state->regData[rhs].v; + state->regData[rhd].o = state->regData[rhs].o; + state->regData[rhd].o |= REG_VAL_ARITHMETIC; + break; + + case 1: /* CMP */ + /* Irrelevant to unwinding */ + UnwPrintd1("CMP ???"); + break; + + case 2: /* MOV */ + UnwPrintd5("MOV r%d, r%d\t; r%d %s", rhd, rhs, rhd, M_Origin2Str(state->regData[rhs].o)); + state->regData[rhd].v = state->regData[rhs].v; + state->regData[rhd].o = state->regData[rhd].o; + break; + + case 3: /* BX */ + UnwPrintd4("BX r%d\t; r%d %s\n", rhs, rhs, M_Origin2Str(state->regData[rhs].o)); + + /* Only follow BX if the data was from the stack or BX LR */ + if(rhs == 14 || state->regData[rhs].o == REG_VAL_FROM_STACK) { + UnwPrintd2(" Return PC=0x%x\n", state->regData[rhs].v & (~0x1)); + + /* Report the return address, including mode bit */ + if(!UnwReportRetAddr(state, state->regData[rhs].v)) { + return UNWIND_TRUNCATED; + } + + /* Update the PC */ + state->regData[15].v = state->regData[rhs].v; + + /* Determine the new mode */ + if(state->regData[rhs].v & 0x1) { + /* Branching to THUMB */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 2; + } + else { + /* Branch to ARM */ + return UnwStartArm(state); + } + } + else { + UnwPrintd4("\nError: BX to invalid register: r%d = 0x%x (%s)\n", rhs, state->regData[rhs].o, M_Origin2Str(state->regData[rhs].o)); + return UNWIND_FAILURE; + } + } + } + /* Format 9: PC-relative load + * LDR Rd,[PC, #imm] + */ + else if((instr & 0xF800) == 0x4800) { + uint8_t rd = (instr & 0x0700) >> 8; + uint8_t word8 = (instr & 0x00FF); + uint32_t address; + + /* Compute load address, adding a word to account for prefetch */ + address = (state->regData[15].v & (~0x3)) + 4 + (word8 << 2); + + UnwPrintd3("LDR r%d, 0x%08x", rd, address); + + if(!UnwMemReadRegister(state, address, &state->regData[rd])) { + return UNWIND_DREAD_W_FAIL; + } + } + /* Format 13: add offset to Stack Pointer + * ADD sp,#+imm + * ADD sp,#-imm + */ + else if((instr & 0xFF00) == 0xB000) { + uint8_t value = (instr & 0x7F) * 4; + + /* Check the negative bit */ + if((instr & 0x80) != 0) { + UnwPrintd2("SUB sp,#0x%x", value); + state->regData[13].v -= value; + } + else { + UnwPrintd2("ADD sp,#0x%x", value); + state->regData[13].v += value; + } + } + /* Format 14: push/pop registers + * PUSH {Rlist} + * PUSH {Rlist, LR} + * POP {Rlist} + * POP {Rlist, PC} + */ + else if((instr & 0xF600) == 0xB400) { + bool L = (instr & 0x0800) ? true : false; + bool R = (instr & 0x0100) ? true : false; + uint8_t rList = (instr & 0x00FF); + + if(L) { + uint8_t r; + + /* Load from memory: POP */ + UnwPrintd2("POP {Rlist%s}\n", R ? ", PC" : ""); + + for(r = 0; r < 8; r++) { + if(rList & (0x1 << r)) { + + /* Read the word */ + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DREAD_W_FAIL; + } + + /* Alter the origin to be from the stack if it was valid */ + if(M_IsOriginValid(state->regData[r].o)) { + state->regData[r].o = REG_VAL_FROM_STACK; + } + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + } + + /* Check if the PC is to be popped */ + if(R) { + /* Get the return address */ + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[15])) { + return UNWIND_DREAD_W_FAIL; + } + + /* Alter the origin to be from the stack if it was valid */ + if(!M_IsOriginValid(state->regData[15].o)) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + else { + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if(!UnwReportRetAddr(state, state->regData[15].v)) { + return UNWIND_TRUNCATED; + } + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Update the pc */ + state->regData[13].v += 4; + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + } + } + } + else { + int8_t r; + + /* Store to memory: PUSH */ + UnwPrintd2("PUSH {Rlist%s}", R ? ", LR" : ""); + + /* Check if the LR is to be pushed */ + if(R) { + UnwPrintd3("\n lr = 0x%08x\t; %s", state->regData[14].v, M_Origin2Str(state->regData[14].o)); + + state->regData[13].v -= 4; + + /* Write the register value to memory */ + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[14])) { + return UNWIND_DWRITE_W_FAIL; + } + } + + for(r = 7; r >= 0; r--) { + if(rList & (0x1 << r)) { + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DWRITE_W_FAIL; + } + } + } + } + } + + /* + * Conditional branches + * Bcond + */ + else if((instr & 0xF000) == 0xD000) { + int32_t branchValue = (instr & 0xFF); + if (branchValue & 0x80) branchValue |= 0xFFFFFF00; + + /* Branch distance is twice that specified in the instruction. */ + branchValue *= 2; + + UnwPrintd2("Bcond %d \n", branchValue); + + /* Only take the branch if a loop was detected */ + if (loopDetected) { + + /* Update PC */ + state->regData[15].v += branchValue; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", state->regData[15].v + 2); + } + } + + /* Format 18: unconditional branch + * B label + */ + else if((instr & 0xF800) == 0xE000) { + uint32_t v; + int32_t branchValue = signExtend11(instr & 0x07FF); + + /* Branch distance is twice that specified in the instruction. */ + branchValue *= 2; + + UnwPrintd2("B %d \n", branchValue); + + /* Update PC */ + state->regData[15].v += branchValue; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Compute the jump address */ + v = state->regData[15].v + 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", v); + + /* Did we detect an infinite loop ? */ + loopDetected = lastJumpAddr == v; + + /* Remember the last address we jumped to */ + lastJumpAddr = v; + } + else { + UnwPrintd1("????"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + + UnwPrintd1("\n"); + + /* Should never hit the reset vector */ + if(state->regData[15].v == 0) + return UNWIND_RESET; + + /* Check next address */ + state->regData[15].v += 2; + + /* Garbage collect the memory hash (used only for the stack) */ + UnwMemHashGC(state); + + t--; + if(t == 0) + return UNWIND_EXHAUSTED; + + } while(!found); + + return UNWIND_SUCCESS; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/backtrace/unwarmbytab.cpp new file mode 100644 index 0000000000..db49dcad7f --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarmbytab.cpp @@ -0,0 +1,441 @@ +/* + * Libbacktrace + * Copyright 2015 Stephen Street + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This library was modified, some bugs fixed, stack address validated + * and adapted to be used in Marlin 3D printer firmware as backtracer + * for exceptions for debugging purposes in 2018 by Eduardo José Tagle. + */ + +#if defined(__arm__) || defined(__thumb__) + +#include "unwarmbytab.h" + +#include +#include + +/* These symbols point to the unwind index and should be provide by the linker script */ +extern "C" const UnwTabEntry __exidx_start[]; +extern "C" const UnwTabEntry __exidx_end[]; + +/* This prevents the linking of libgcc unwinder code */ +void __aeabi_unwind_cpp_pr0(void) {}; +void __aeabi_unwind_cpp_pr1(void) {}; +void __aeabi_unwind_cpp_pr2(void) {}; + +static inline __attribute__((always_inline)) uint32_t prel31_to_addr(const uint32_t *prel31) { + uint32_t offset = (((uint32_t)(*prel31)) << 1) >> 1; + return ((uint32_t)prel31 + offset) & 0x7FFFFFFF; +} + +static const UnwTabEntry *UnwTabSearchIndex(const UnwTabEntry *start, const UnwTabEntry *end, uint32_t ip) { + const UnwTabEntry *middle; + + /* Perform a binary search of the unwind index */ + while (start < end - 1) { + middle = start + ((end - start + 1) >> 1); + if (ip < prel31_to_addr(&middle->addr_offset)) + end = middle; + else + start = middle; + } + return start; +} + +/* + * Get the function name or NULL if not found + */ +static const char *UnwTabGetFunctionName(const UnwindCallbacks *cb, uint32_t address) { + uint32_t flag_word = 0; + if (!cb->readW(address-4,&flag_word)) + return NULL; + + if ((flag_word & 0xFF000000) == 0xFF000000) { + return (const char *)(address - 4 - (flag_word & 0x00FFFFFF)); + } + return NULL; +} + +/** + * Get the next frame unwinding instruction + * + * Return either the instruction or -1 to signal no more instructions + * are available + */ +static int UnwTabGetNextInstruction(const UnwindCallbacks *cb, UnwTabState *ucb) { + int instruction; + + /* Are there more instructions */ + if (ucb->remaining == 0) + return -1; + + /* Extract the current instruction */ + uint32_t v = 0; + if (!cb->readW(ucb->current, &v)) + return -1; + instruction = (v >> (ucb->byte << 3)) & 0xFF; + + /* Move the next byte */ + --ucb->byte; + if (ucb->byte < 0) { + ucb->current += 4; + ucb->byte = 3; + } + --ucb->remaining; + + return instruction; +} + +/** + * Initialize the frame unwinding state + */ +static UnwResult UnwTabStateInit(const UnwindCallbacks *cb, UnwTabState *ucb, uint32_t instructions, const UnwindFrame *frame) { + + /* Initialize control block */ + memset(ucb, 0, sizeof(UnwTabState)); + ucb->current = instructions; + + /* Is a short unwind description */ + uint32_t v = 0; + if (!cb->readW(instructions, &v)) + return UNWIND_DREAD_W_FAIL; + + if ((v & 0xFF000000) == 0x80000000) { + ucb->remaining = 3; + ucb->byte = 2; + /* Is a long unwind description */ + } else if ((v & 0xFF000000) == 0x81000000) { + ucb->remaining = ((v & 0x00FF0000) >> 14) + 2; + ucb->byte = 1; + } else + return UNWIND_UNSUPPORTED_DWARF_PERSONALITY; + + /* Initialize the virtual register set */ + ucb->vrs[7] = frame->fp; + ucb->vrs[13] = frame->sp; + ucb->vrs[14] = frame->lr; + ucb->vrs[15] = 0; + + /* All good */ + return UNWIND_SUCCESS; +} + +/* + * Execute unwinding instructions + */ +static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabState *ucb) { + + int instruction; + uint32_t mask; + uint32_t reg; + uint32_t vsp; + + /* Consume all instruction byte */ + while ((instruction = UnwTabGetNextInstruction(cb, ucb)) != -1) { + + if ((instruction & 0xC0) == 0x00) { // ARM_EXIDX_CMD_DATA_POP + /* vsp = vsp + (xxxxxx << 2) + 4 */ + ucb->vrs[13] += ((instruction & 0x3F) << 2) + 4; + } else + if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH + /* vsp = vsp - (xxxxxx << 2) - 4 */ + ucb->vrs[13] -= ((instruction & 0x3F) << 2) - 4; + } else + if ((instruction & 0xF0) == 0x80) { + /* pop under mask {r15-r12},{r11-r4} or refuse to unwind */ + instruction = instruction << 8 | UnwTabGetNextInstruction(cb, ucb); + + /* Check for refuse to unwind */ + if (instruction == 0x8000) // ARM_EXIDX_CMD_REFUSED + return UNWIND_REFUSED; + + /* Pop registers using mask */ // ARM_EXIDX_CMD_REG_POP + vsp = ucb->vrs[13]; + mask = instruction & 0xFFF; + + reg = 4; + while (mask) { + if ((mask & 1) != 0) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + ucb->vrs[reg] = v; + v += 4; + } + mask >>= 1; + ++reg; + } + + /* Patch up the vrs sp if it was in the mask */ + if ((instruction & (1 << (13 - 4))) != 0) + ucb->vrs[13] = vsp; + + } else + if ((instruction & 0xF0) == 0x90 && // ARM_EXIDX_CMD_REG_TO_SP + instruction != 0x9D && + instruction != 0x9F) { + /* vsp = r[nnnn] */ + ucb->vrs[13] = ucb->vrs[instruction & 0x0F]; + } else + if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP + /* pop r4-r[4+nnn] or pop r4-r[4+nnn], r14*/ + vsp = ucb->vrs[13]; + + for (reg = 4; reg <= uint32_t((instruction & 0x07) + 4); ++reg) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[reg] = v; + vsp += 4; + } + + if (instruction & 0x08) { // ARM_EXIDX_CMD_REG_POP + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + ucb->vrs[14] = v; + vsp += 4; + } + + ucb->vrs[13] = vsp; + + } else + if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH + /* finished */ + if (ucb->vrs[15] == 0) + ucb->vrs[15] = ucb->vrs[14]; + + /* All done unwinding */ + return UNWIND_SUCCESS; + + } else + if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP + /* pop register under mask {r3,r2,r1,r0} */ + vsp = ucb->vrs[13]; + mask = UnwTabGetNextInstruction(cb, ucb); + + reg = 0; + while (mask) { + if ((mask & 1) != 0) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[reg] = v; + vsp += 4; + } + mask >>= 1; + ++reg; + } + ucb->vrs[13] = (uint32_t)vsp; + + } else + if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP + /* vps = vsp + 0x204 + (uleb128 << 2) */ + ucb->vrs[13] += 0x204 + (UnwTabGetNextInstruction(cb, ucb) << 2); + + } else + if (instruction == 0xB3 || // ARM_EXIDX_CMD_VFP_POP + instruction == 0xC8 || + instruction == 0xC9) { + + /* pop VFP double-precision registers */ + vsp = ucb->vrs[13]; + + /* D[ssss]-D[ssss+cccc] */ + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[14] = v; + vsp += 4; + + if (instruction == 0xC8) { + /* D[16+sssss]-D[16+ssss+cccc] */ + ucb->vrs[14] |= 1 << 16; + } + + if (instruction != 0xB3) { + /* D[sssss]-D[ssss+cccc] */ + ucb->vrs[14] |= 1 << 17; + } + + ucb->vrs[13] = vsp; + + } else + if ((instruction & 0xF8) == 0xB8 || + (instruction & 0xF8) == 0xD0) { + + /* Pop VFP double precision registers D[8]-D[8+nnn] */ + ucb->vrs[14] = 0x80 | (instruction & 0x07); + + if ((instruction & 0xF8) == 0xD0) { + ucb->vrs[14] = 1 << 17; + } + + } else + return UNWIND_UNSUPPORTED_DWARF_INSTR; + } + + return UNWIND_SUCCESS; +} + +static inline __attribute__((always_inline)) uint32_t read_psp(void) { + + /* Read the current PSP and return its value as a pointer */ + uint32_t psp; + + __asm__ volatile ( + " mrs %0, psp \n" + : "=r" (psp) : : + ); + + return psp; +} + +/* + * Unwind the specified frame and goto the previous one + */ +static UnwResult UnwTabUnwindFrame(const UnwindCallbacks *cb, UnwindFrame *frame) { + + UnwResult err; + UnwTabState ucb; + const UnwTabEntry *index; + uint32_t instructions; + + /* Search the unwind index for the matching unwind table */ + index = UnwTabSearchIndex(__exidx_start, __exidx_end, frame->pc); + + /* Make sure we can unwind this frame */ + if (index->insn == 0x00000001) + return UNWIND_SUCCESS; + + /* Get the pointer to the first unwind instruction */ + if (index->insn & 0x80000000) + instructions = (uint32_t)&index->insn; + else + instructions = prel31_to_addr(&index->insn); + + /* Initialize the unwind control block */ + if ((err = UnwTabStateInit(cb, &ucb, instructions, frame)) < 0) + return err; + + /* Execute the unwind instructions */ + err = UnwTabExecuteInstructions(cb, &ucb); + if (err < 0) + return err; + + /* Set the virtual pc to the virtual lr if this is the first unwind */ + if (ucb.vrs[15] == 0) + ucb.vrs[15] = ucb.vrs[14]; + + /* Check for exception return */ + /* TODO Test with other ARM processors to verify this method. */ + if ((ucb.vrs[15] & 0xF0000000) == 0xF0000000) { + /* According to the Cortex Programming Manual (p.44), the stack address is always 8-byte aligned (Cortex-M7). + Depending on where the exception came from (MSP or PSP), we need the right SP value to work with. + + ucb.vrs[7] contains the right value, so take it and align it by 8 bytes, store it as the current + SP to work with (ucb.vrs[13]) which is then saved as the current (virtual) frame's SP. + */ + uint32_t stack; + ucb.vrs[13] = (ucb.vrs[7] & ~7); + + /* If we need to start from the MSP, we need to go down X words to find the PC, where: + X=2 if it was a non-floating-point exception + X=20 if it was a floating-point (VFP) exception + + If we need to start from the PSP, we need to go up exactly 6 words to find the PC. + See the ARMv7-M Architecture Reference Manual p.594 and Cortex-M7 Processor Programming Manual p.44/p.45 for details. + */ + if ((ucb.vrs[15] & 0xC) == 0) { + /* Return to Handler Mode: MSP (0xFFFFFF-1) */ + stack = ucb.vrs[13]; + + /* The PC is always 2 words down from the MSP, if it was a non-floating-point exception */ + stack -= 2*4; + + /* If there was a VFP exception (0xFFFFFFE1), the PC is located another 18 words down */ + if ((ucb.vrs[15] & 0xF0) == 0xE0) { + stack -= 18*4; + } + } + else { + /* Return to Thread Mode: PSP (0xFFFFFF-d) */ + stack = read_psp(); + + /* The PC is always 6 words up from the PSP */ + stack += 6*4; + } + + /* Store the PC */ + uint32_t v; + if (!cb->readW(stack,&v)) + return UNWIND_DREAD_W_FAIL; + ucb.vrs[15] = v; + stack -= 4; + + /* Store the LR */ + if (!cb->readW(stack,&v)) + return UNWIND_DREAD_W_FAIL; + ucb.vrs[14] = v; + stack -= 4; + } + + /* We are done if current frame pc is equal to the virtual pc, prevent infinite loop */ + if (frame->pc == ucb.vrs[15]) + return UNWIND_SUCCESS; + + /* Update the frame */ + frame->fp = ucb.vrs[7]; + frame->sp = ucb.vrs[13]; + frame->lr = ucb.vrs[14]; + frame->pc = ucb.vrs[15]; + + /* All good - Continue unwinding */ + return UNWIND_MORE_AVAILABLE; +} + +UnwResult UnwindByTableStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) { + + UnwResult err = UNWIND_SUCCESS; + UnwReport entry; + + /* Use DWARF unwind information to unwind frames */ + do { + if (frame->pc == 0) { + /* Reached __exidx_end. */ + break; + } + + if (frame->pc == 0x00000001) { + /* Reached .cantunwind instruction. */ + break; + } + + /* Find the unwind index of the current frame pc */ + const UnwTabEntry *index = UnwTabSearchIndex(__exidx_start, __exidx_end, frame->pc); + + /* Clear last bit (Thumb indicator) */ + frame->pc &= 0xFFFFFFFEU; + + /* Generate the backtrace information */ + entry.address = frame->pc; + entry.function = prel31_to_addr(&index->addr_offset); + entry.name = UnwTabGetFunctionName(cb, entry.function); + if (!cb->report(data,&entry)) + break; + + /* Unwind frame and repeat */ + } while ((err = UnwTabUnwindFrame(cb, frame)) == UNWIND_MORE_AVAILABLE); + + /* All done */ + return err; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/backtrace/unwarmbytab.h b/Marlin/src/HAL/backtrace/unwarmbytab.h new file mode 100644 index 0000000000..527d3a6c72 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarmbytab.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Interface to the memory tracking sub-system. + **************************************************************************/ + +#ifndef UNWARMBYTAB_H +#define UNWARMBYTAB_H + +#include "unwarm.h" + +typedef struct { + uint32_t vrs[16]; + uint32_t current; /* Address of current byte */ + int remaining; + int byte; +} UnwTabState; + +typedef struct { + uint32_t addr_offset; + uint32_t insn; +} UnwTabEntry; + +UnwResult UnwindByTableStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); + +#endif // UNWARMBYTAB_H diff --git a/Marlin/src/HAL/backtrace/unwarmmem.cpp b/Marlin/src/HAL/backtrace/unwarmmem.cpp new file mode 100644 index 0000000000..7453fdb8db --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarmmem.cpp @@ -0,0 +1,118 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Implementation of the memory tracking sub-system. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) +#define MODULE_NAME "UNWARMMEM" + +#include +#include "unwarmmem.h" +#include "unwarm.h" + +#define M_IsIdxUsed(a, v) (((a)[v >> 3] & (1 << (v & 0x7))) ? true : false) +#define M_SetIdxUsed(a, v) ((a)[v >> 3] |= (1 << (v & 0x7))) +#define M_ClrIdxUsed(a, v) ((a)[v >> 3] &= ~(1 << (v & 0x7))) + +/** Search the memory hash to see if an entry is stored in the hash already. + * This will search the hash and either return the index where the item is + * stored, or -1 if the item was not found. + */ +static int16_t memHashIndex(MemData * const memData, const uint32_t addr) { + + const uint16_t v = addr % MEM_HASH_SIZE; + uint16_t s = v; + + do { + /* Check if the element is occupied */ + if(M_IsIdxUsed(memData->used, s)) { + /* Check if it is occupied with the sought data */ + if(memData->a[s] == addr) { + return s; + } + } + else { + /* Item is free, this is where the item should be stored */ + return s; + } + + /* Search the next entry */ + s++; + if(s > MEM_HASH_SIZE) { + s = 0; + } + } while(s != v); + + /* Search failed, hash is full and the address not stored */ + return -1; +} + +bool UnwMemHashRead(MemData * const memData, uint32_t addr,uint32_t * const data, bool * const tracked) { + + int16_t i = memHashIndex(memData, addr); + + if(i >= 0 && M_IsIdxUsed(memData->used, i) && memData->a[i] == addr) { + *data = memData->v[i]; + *tracked = M_IsIdxUsed(memData->tracked, i); + return true; + } + else { + /* Address not found in the hash */ + return false; + } +} + +bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid) { + + int16_t i = memHashIndex(memData, addr); + + if(i < 0){ + /* Hash full */ + return false; + } + else { + /* Store the item */ + memData->a[i] = addr; + M_SetIdxUsed(memData->used, i); + + if(valValid) + { + memData->v[i] = val; + M_SetIdxUsed(memData->tracked, i); + } + else { + #if defined(UNW_DEBUG) + memData->v[i] = 0xDEADBEEF; + #endif + M_ClrIdxUsed(memData->tracked, i); + } + + return true; + } +} + +void UnwMemHashGC(UnwState * const state) { + + const uint32_t minValidAddr = state->regData[13].v; + MemData * const memData = &state->memData; + uint16_t t; + + for(t = 0; t < MEM_HASH_SIZE; t++) { + if(M_IsIdxUsed(memData->used, t) && (memData->a[t] < minValidAddr)) { + UnwPrintd3("MemHashGC: Free elem %d, addr 0x%08x\n", t, memData->a[t]); + + M_ClrIdxUsed(memData->used, t); + } + } +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/backtrace/unwarmmem.h b/Marlin/src/HAL/backtrace/unwarmmem.h new file mode 100644 index 0000000000..f30846b34c --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwarmmem.h @@ -0,0 +1,25 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Interface to the memory tracking sub-system. + **************************************************************************/ + +#ifndef UNWARMMEM_H +#define UNWARMMEM_H + +#include "unwarm.h" + +bool UnwMemHashRead(MemData * const memData, uint32_t addr, uint32_t * const data, bool * const tracked); +bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid); +void UnwMemHashGC(UnwState * const state); + +#endif + diff --git a/Marlin/src/HAL/backtrace/unwinder.cpp b/Marlin/src/HAL/backtrace/unwinder.cpp new file mode 100644 index 0000000000..66281670c6 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwinder.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Implementation of the interface into the ARM unwinder. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWINDER" + +#include +#include +#include "unwinder.h" +#include "unwarm.h" +#include "unwarmbytab.h" + +/* These symbols point to the unwind index and should be provide by the linker script */ +extern "C" const UnwTabEntry __exidx_start[]; +extern "C" const UnwTabEntry __exidx_end[]; + +// Detect if unwind information is present or not +static int HasUnwindTableInfo(void) { + // > 16 because there are default entries we can't supress + return ((char*)(&__exidx_end) - (char*)(&__exidx_start)) > 16 ? 1 : 0; +} + +UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) { + + if (HasUnwindTableInfo()) { + + /* We have unwind information tables */ + return UnwindByTableStart(frame, cb, data); + + } else { + + /* We don't have unwind information tables */ + UnwState state; + + /* Initialise the unwinding state */ + UnwInitState(&state, cb, data, frame->pc, frame->sp); + + /* Check the Thumb bit */ + if(frame->pc & 0x1) { + return UnwStartThumb(&state); + } + else { + return UnwStartArm(&state); + } + } +} +#endif + + diff --git a/Marlin/src/HAL/backtrace/unwinder.h b/Marlin/src/HAL/backtrace/unwinder.h new file mode 100644 index 0000000000..29132d0b5b --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwinder.h @@ -0,0 +1,175 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + **************************************************************************/ +/** \file + * Interface to the ARM stack unwinding module. + **************************************************************************/ + +#ifndef UNWINDER_H +#define UNWINDER_H + +#include + +/** \def UNW_DEBUG + * If this define is set, additional information will be produced while + * unwinding the stack to allow debug of the unwind module itself. + */ +/* #define UNW_DEBUG 1 */ + +/*************************************************************************** + * Type Definitions + **************************************************************************/ + +/** Possible results for UnwindStart to return. + */ +typedef enum { + /** Unwinding was successful and complete. */ + UNWIND_SUCCESS = 0, + + /** Not an error: More frames are available. */ + UNWIND_MORE_AVAILABLE = 1, + + /** Unsupported DWARF unwind personality. */ + UNWIND_UNSUPPORTED_DWARF_PERSONALITY = -1, + + /** Refused to perform unwind. */ + UNWIND_REFUSED = -2, + + /** Reached an invalid SP. */ + UNWIND_INVALID_SP = -3, + + /** Reached an invalid PC */ + UNWIND_INVALID_PC = -4, + + /** Unsupported DWARF instruction */ + UNWIND_UNSUPPORTED_DWARF_INSTR = -5, + + /** More than UNW_MAX_INSTR_COUNT instructions were interpreted. */ + UNWIND_EXHAUSTED = -6, + + /** Unwinding stopped because the reporting func returned false. */ + UNWIND_TRUNCATED = -7, + + /** Read data was found to be inconsistent. */ + UNWIND_INCONSISTENT = -8, + + /** Unsupported instruction or data found. */ + UNWIND_UNSUPPORTED = -9, + + /** General failure. */ + UNWIND_FAILURE = -10, + + /** Illegal instruction. */ + UNWIND_ILLEGAL_INSTR = -11, + + /** Unwinding hit the reset vector. */ + UNWIND_RESET = -12, + + /** Failed read for an instruction word. */ + UNWIND_IREAD_W_FAIL = -13, + + /** Failed read for an instruction half-word. */ + UNWIND_IREAD_H_FAIL = -14, + + /** Failed read for an instruction byte. */ + UNWIND_IREAD_B_FAIL = -15, + + /** Failed read for a data word. */ + UNWIND_DREAD_W_FAIL = -16, + + /** Failed read for a data half-word. */ + UNWIND_DREAD_H_FAIL = -17, + + /** Failed read for a data byte. */ + UNWIND_DREAD_B_FAIL = -18, + + /** Failed write for a data word. */ + UNWIND_DWRITE_W_FAIL = -19 + +} UnwResult; + +/** A backtrace report */ +typedef struct { + uint32_t function; /** Starts address of function */ + const char *name; /** Function name, or null if not available */ + uint32_t address; /** PC on that function */ +} UnwReport; + +/** Type for function pointer for result callback. + * The function is passed two parameters, the first is a void * pointer, + * and the second is the return address of the function. The bottom bit + * of the passed address indicates the execution mode; if it is set, + * the execution mode at the return address is Thumb, otherwise it is + * ARM. + * + * The return value of this function determines whether unwinding should + * continue or not. If true is returned, unwinding will continue and the + * report function maybe called again in future. If false is returned, + * unwinding will stop with UnwindStart() returning UNWIND_TRUNCATED. + */ +typedef bool (*UnwindReportFunc)(void* data, const UnwReport* bte); + +/** Structure that holds memory callback function pointers. + */ +typedef struct { + + /** Report an unwind result. */ + UnwindReportFunc report; + + /** Read a 32 bit word from memory. + * The memory address to be read is passed as \a address, and + * \a *val is expected to be populated with the read value. + * If the address cannot or should not be read, false can be + * returned to indicate that unwinding should stop. If true + * is returned, \a *val is assumed to be valid and unwinding + * will continue. + */ + bool (*readW)(const uint32_t address, uint32_t *val); + + /** Read a 16 bit half-word from memory. + * This function has the same usage as for readW, but is expected + * to read only a 16 bit value. + */ + bool (*readH)(const uint32_t address, uint16_t *val); + + /** Read a byte from memory. + * This function has the same usage as for readW, but is expected + * to read only an 8 bit value. + */ + bool (*readB)(const uint32_t address, uint8_t *val); + + #ifdef UNW_DEBUG + /** Print a formatted line for debug. */ + void (*printf)(const char *format, ...); + #endif +} UnwindCallbacks; + +/* A frame */ +typedef struct { + uint32_t fp; + uint32_t sp; + uint32_t lr; + uint32_t pc; +} UnwindFrame; + +/** Start unwinding the current stack. + * This will unwind the stack starting at the PC value supplied to in the + * link register (i.e. not a normal register) and the stack pointer value + * supplied. + * + * -If the program was compiled with -funwind-tables , it will use them to + * perform the traceback. Otherwise, brute force will be employed + * -If the program was compiled with -mpoke-function-name, then you will + * get function names in the traceback. Otherwise, you will not. + */ +UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); + +#endif /* UNWINDER_H */ diff --git a/Marlin/src/HAL/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/backtrace/unwmemaccess.cpp new file mode 100644 index 0000000000..b939be8803 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwmemaccess.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions to access memory + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#include "unwmemaccess.h" + +/* Validate address */ + +#ifdef ARDUINO_ARCH_SAM +// For DUE, valid address ranges are +// SRAM (0x20070000 - 0x20088000) (96kb) +// FLASH (0x00080000 - 0x00100000) (512kb) +// +#define START_SRAM_ADDR 0x20070000 +#define END_SRAM_ADDR 0x20088000 +#define START_FLASH_ADDR 0x00080000 +#define END_FLASH_ADDR 0x00100000 +#endif + +#ifdef TARGET_LPC1768 +// For LPC1769: +// SRAM (0x10000000 - 0x10008000) (32kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x10000000 +#define END_SRAM_ADDR 0x10008000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif + +#if 0 +// For STM32F103CBT6 +// SRAM (0x20000000 - 0x20005000) (20kb) +// FLASH (0x00000000 - 0x00020000) (128kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20005000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00020000 +#endif + +#ifdef __STM32F1__ +// For STM32F103ZET6/STM32F103VET6 +// SRAM (0x20000000 - 0x20010000) (64kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20010000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif + +#if defined(STM32F4) || defined(STM32F4xx) +// For STM32F407VET +// SRAM (0x20000000 - 0x20030000) (192kb) +// FLASH (0x08000000 - 0x08080000) (512kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20030000 +#define START_FLASH_ADDR 0x08000000 +#define END_FLASH_ADDR 0x08080000 +#endif + +#ifdef STM32F7 +// For STM32F765 in BORG +// SRAM (0x20000000 - 0x20080000) (512kb) +// FLASH (0x08000000 - 0x08100000) (1024kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20080000 +#define START_FLASH_ADDR 0x08000000 +#define END_FLASH_ADDR 0x08100000 +#endif + +#ifdef __MK64FX512__ +// For MK64FX512 in TEENSY 3.5 +// SRAM (0x1FFF0000 - 0x20020000) (192kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x1FFF0000 +#define END_SRAM_ADDR 0x20020000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif + +#ifdef __MK66FX1M0__ +// For MK66FX1M0 in TEENSY 3.6 +// SRAM (0x1FFF0000 - 0x20030000) (256kb) +// FLASH (0x00000000 - 0x00140000) (1.25Mb) +// +#define START_SRAM_ADDR 0x1FFF0000 +#define END_SRAM_ADDR 0x20030000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00140000 +#endif + +static bool validate_addr(uint32_t addr) { + + // Address must be in SRAM range + if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) + return true; + + // Or in FLASH range + if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) + return true; + + return false; +} + +bool UnwReadW(const uint32_t a, uint32_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint32_t *)a; + return true; +} + +bool UnwReadH(const uint32_t a, uint16_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint16_t *)a; + return true; +} + +bool UnwReadB(const uint32_t a, uint8_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint8_t *)a; + return true; +} + +#endif + diff --git a/Marlin/src/HAL/backtrace/unwmemaccess.h b/Marlin/src/HAL/backtrace/unwmemaccess.h new file mode 100644 index 0000000000..5405f3a673 --- /dev/null +++ b/Marlin/src/HAL/backtrace/unwmemaccess.h @@ -0,0 +1,26 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions to access memory + **************************************************************************/ + +#ifndef UNWMEMACCESS_H +#define UNWMEMACCESS_H + +#include "unwarm.h" +#include + +bool UnwReadW(const uint32_t a, uint32_t *v); +bool UnwReadH(const uint32_t a, uint16_t *v); +bool UnwReadB(const uint32_t a, uint8_t *v); + +#endif + diff --git a/Marlin/src/HAL/math_32bit.h b/Marlin/src/HAL/math_32bit.h new file mode 100644 index 0000000000..a59d221369 --- /dev/null +++ b/Marlin/src/HAL/math_32bit.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef MATH_32BIT_H +#define MATH_32BIT_H + +#include "../core/macros.h" + +/** + * Math helper functions for 32 bit CPUs + */ +static FORCE_INLINE uint32_t MultiU32X24toH32(uint32_t longIn1, uint32_t longIn2) { + return ((uint64_t)longIn1 * longIn2 + 0x00800000) >> 24; +} + +#endif // MATH_32BIT_H diff --git a/Marlin/src/HAL/persistent_store_api.h b/Marlin/src/HAL/persistent_store_api.h new file mode 100644 index 0000000000..642e5712f3 --- /dev/null +++ b/Marlin/src/HAL/persistent_store_api.h @@ -0,0 +1,18 @@ +#ifndef _PERSISTENT_STORE_H_ +#define _PERSISTENT_STORE_H_ + +#include +#include + +namespace HAL { +namespace PersistentStore { + +bool access_start(); +bool access_finish(); +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc); +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing=true); + +} // PersistentStore +} // HAL + +#endif // _PERSISTENT_STORE_H_ diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h new file mode 100644 index 0000000000..6ef7835fec --- /dev/null +++ b/Marlin/src/HAL/platforms.h @@ -0,0 +1,30 @@ +#ifndef _HAL_PLATFORMS_H_ +#define _HAL_PLATFORMS_H_ + +#ifndef HAL_PLATFORM + +#ifdef __AVR__ + #define HAL_PLATFORM HAL_AVR +#elif defined(ARDUINO_ARCH_SAM) + #define HAL_PLATFORM HAL_DUE +#elif defined(__MK64FX512__) || defined(__MK66FX1M0__) + #define HAL_PLATFORM HAL_TEENSY35_36 +#elif defined(TARGET_LPC1768) + #define HAL_PLATFORM HAL_LPC1768 +#elif defined(__STM32F1__) || defined(TARGET_STM32F1) + #define HAL_PLATFORM HAL_STM32F1 +#elif defined(STM32F4) || defined(STM32F4xx) + #define HAL_PLATFORM HAL_STM32F4 +#elif defined(STM32F7) + #define HAL_PLATFORM HAL_STM32F7 +#else + #error "Unsupported Platform!" +#endif + +#endif // HAL_PLATFORM + +#define XSTR_(M) #M +#define XSTR(M) XSTR_(M) +#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL_PLATFORM/NAME) + +#endif // _HAL_PLATFORMS_H_ diff --git a/Marlin/src/HAL/servo.cpp b/Marlin/src/HAL/servo.cpp new file mode 100644 index 0000000000..a49aac0f99 --- /dev/null +++ b/Marlin/src/HAL/servo.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + * + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_SERVOS && !(IS_32BIT_TEENSY || defined(TARGET_LPC1768) || defined(STM32F4) || defined(STM32F4xx)) + +//#include +#include "servo.h" +#include "servo_private.h" + +ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures +uint8_t ServoCount = 0; // the total number of attached servos + +#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo +#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo + +/************ static functions common to all instances ***********************/ + +static boolean isTimerActive(timer16_Sequence_t timer) { + // returns true if any servo is active on this timer + for (uint8_t channel = 0; channel < SERVOS_PER_TIMER; channel++) { + if (SERVO(timer, channel).Pin.isActive) + return true; + } + return false; +} + +/****************** end of static functions ******************************/ + +Servo::Servo() { + if (ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + servo_info[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + } + else + this->servoIndex = INVALID_SERVO; // too many servos +} + +int8_t Servo::attach(const int pin) { + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +int8_t Servo::attach(const int pin, const int min, const int max) { + + if (this->servoIndex >= MAX_SERVOS) return -1; + + if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin; + pinMode(servo_info[this->servoIndex].Pin.nbr, OUTPUT); // set servo pin to output + + // todo min/max check: ABS(min - MIN_PULSE_WIDTH) /4 < 128 + this->min = (MIN_PULSE_WIDTH - min) / 4; //resolution of min/max is 4 uS + this->max = (MAX_PULSE_WIDTH - max) / 4; + + // initialize the timer if it has not already been initialized + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (!isTimerActive(timer)) initISR(timer); + servo_info[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + + return this->servoIndex; +} + +void Servo::detach() { + servo_info[this->servoIndex].Pin.isActive = false; + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (!isTimerActive(timer)) finISR(timer); +} + +void Servo::write(int value) { + if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); + } + this->writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) { + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if (channel < MAX_SERVOS) { // ensure channel is valid + // ensure pulse width is valid + value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); + value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 + + CRITICAL_SECTION_START; + servo_info[channel].ticks = value; + CRITICAL_SECTION_END; + } +} + +// return the value as degrees +int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); } + +int Servo::readMicroseconds() { + return (this->servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[this->servoIndex].ticks) + TRIM_DURATION; +} + +bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } + +void Servo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} + +#endif // HAS_SERVOS diff --git a/Marlin/src/HAL/servo.h b/Marlin/src/HAL/servo.h new file mode 100644 index 0000000000..5df396efd6 --- /dev/null +++ b/Marlin/src/HAL/servo.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * The sequence used to seize timers is defined in timers.h + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin ) - Attaches a servo motor to an i/o pin. + * attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + * default min is 544, max is 2400 + * + * write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + * writeMicroseconds() - Sets the servo pulse width in microseconds + * read() - Gets the last written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + * attached() - Returns true if there is a servo attached. + * detach() - Stops an attached servos from pulsing its i/o pin. + * move(angle) - Sequence of attach(0), write(angle), + * With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. + */ + +#ifndef SERVO_H +#define SERVO_H + +#if IS_32BIT_TEENSY + #include "HAL_TEENSY35_36/HAL_Servo_Teensy.h" // Teensy HAL uses an inherited library + +#elif defined(TARGET_LPC1768) + #include "HAL_LPC1768/LPC1768_Servo.h" +#elif defined(STM32F4) || defined(STM32F4xx) + #include "HAL_STM32F4/HAL_Servo_STM32F4.h" +#else + #include + + #if defined(__AVR__) || defined(ARDUINO_ARCH_SAM) + // we're good to go + #else + #error "This library only supports boards with an AVR or SAM3X processor." + #endif + + #define Servo_VERSION 2 // software version of this library + + class Servo { + public: + Servo(); + int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(const int pin, const int min, const int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(const int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false + + private: + uint8_t servoIndex; // index into the channel data for this servo + int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH + int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH + }; + +#endif + +#endif // SERVO_H diff --git a/Marlin/src/HAL/servo_private.h b/Marlin/src/HAL/servo_private.h new file mode 100644 index 0000000000..3b1bcda584 --- /dev/null +++ b/Marlin/src/HAL/servo_private.h @@ -0,0 +1,102 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * servo_private.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SERVO_PRIVATE_H +#define SERVO_PRIVATE_H + +#include + +// Architecture specific include +#ifdef __AVR__ + #include "HAL_AVR/ServoTimers.h" +#elif defined(ARDUINO_ARCH_SAM) + #include "HAL_DUE/ServoTimers.h" +#else + #error "This library only supports boards with an AVR or SAM3X processor." +#endif + +// Macros + +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds + +#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer +#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + +// +#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / PRESCALER) // converts microseconds to tick (PRESCALER depends on architecture) +#define ticksToUs(_ticks) (( (unsigned)_ticks * PRESCALER)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds + +//#define NBR_TIMERS ((MAX_SERVOS) / (SERVOS_PER_TIMER)) + +// convenience macros +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / (SERVOS_PER_TIMER))) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % (SERVOS_PER_TIMER)) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*(SERVOS_PER_TIMER)) + _channel) // macro to access servo index by timer and channel +#define SERVO(_timer,_channel) (servo_info[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel + +// Types + +typedef struct { + uint8_t nbr : 6 ; // a pin number from 0 to 63 + uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t; + +typedef struct { + ServoPin_t Pin; + unsigned int ticks; +} ServoInfo_t; + +// Global variables + +extern uint8_t ServoCount; +extern ServoInfo_t servo_info[MAX_SERVOS]; + +// Public functions + +extern void initISR(timer16_Sequence_t timer); +extern void finISR(timer16_Sequence_t timer); + +#endif // SERVO_PRIVATE_H diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp new file mode 100644 index 0000000000..c182efc418 --- /dev/null +++ b/Marlin/src/Marlin.cpp @@ -0,0 +1,944 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * About Marlin + * + * This firmware is a mashup between Sprinter and grbl. + * - https://github.com/kliment/Sprinter + * - https://github.com/grbl/grbl + */ + +#include "Marlin.h" + +#include "lcd/ultralcd.h" +#include "module/motion.h" +#include "module/planner.h" +#include "module/stepper.h" +#include "module/endstops.h" +#include "module/probe.h" +#include "module/temperature.h" +#include "sd/cardreader.h" +#include "module/configuration_store.h" +#include "module/printcounter.h" // PrintCounter or Stopwatch +#ifdef ARDUINO + #include +#endif +#include +#include "libs/nozzle.h" + +#include "gcode/gcode.h" +#include "gcode/parser.h" +#include "gcode/queue.h" + +#if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) + #include "libs/buzzer.h" +#endif + +#if ENABLED(DIGIPOT_I2C) + #include "feature/digipot/digipot.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "feature/mixing.h" +#endif + +#if ENABLED(BEZIER_CURVE_SUPPORT) + #include "module/planner_bezier.h" +#endif + +#if ENABLED(MAX7219_DEBUG) + #include "feature/Max7219_Debug_LEDs.h" +#endif + +#if HAS_COLOR_LEDS + #include "feature/leds/leds.h" +#endif + +#if HAS_SERVOS + #include "module/servo.h" +#endif + +#if HAS_DIGIPOTSS + #include +#endif + +#if ENABLED(DAC_STEPPER_CURRENT) + #include "feature/dac/stepper_dac.h" +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + TWIBus i2c; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "feature/I2CPositionEncoder.h" +#endif + +#if HAS_TRINAMIC + #include "feature/tmc_util.h" +#endif + +#if ENABLED(SDSUPPORT) + CardReader card; +#endif + +#if ENABLED(G38_PROBE_TARGET) + bool G38_move = false, + G38_endstop_hit = false; +#endif + +#if ENABLED(DELTA) + #include "module/delta.h" +#elif IS_SCARA + #include "module/scara.h" +#endif + +#if HAS_LEVELING + #include "feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) + #include "feature/pause.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "feature/power_loss_recovery.h" +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #include "feature/runout.h" +#endif + +#if ENABLED(TEMP_STAT_LEDS) + #include "feature/leds/tempstat.h" +#endif + +#if HAS_CASE_LIGHT + #include "feature/caselight.h" +#endif + +#if HAS_FANMUX + #include "feature/fanmux.h" +#endif + +#if DO_SWITCH_EXTRUDER || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER) + #include "module/tool_change.h" +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + #include "feature/controllerfan.h" +#endif + +bool Running = true; + +/** + * axis_homed + * Flags that each linear axis was homed. + * XYZ on cartesian, ABC on delta, ABZ on SCARA. + * + * axis_known_position + * Flags that the position is known in each linear axis. Set when homed. + * Cleared whenever a stepper powers off, potentially losing its position. + */ +uint8_t axis_homed, axis_known_position; // = 0 + +#if ENABLED(TEMPERATURE_UNITS_SUPPORT) + TempUnit input_temp_units = TEMPUNIT_C; +#endif + +#if FAN_COUNT > 0 + int16_t fanSpeeds[FAN_COUNT] = { 0 }; + #if ENABLED(EXTRA_FAN_SPEED) + int16_t old_fanSpeeds[FAN_COUNT], + new_fanSpeeds[FAN_COUNT]; + #endif + #if ENABLED(PROBING_FANS_OFF) + bool fans_paused; // = false; + int16_t paused_fanSpeeds[FAN_COUNT] = { 0 }; + #endif +#endif + +// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop +volatile bool wait_for_heatup = true; + +// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop +#if HAS_RESUME_CONTINUE + volatile bool wait_for_user; // = false; +#endif + +#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + bool suspend_auto_report; // = false +#endif + +// Inactivity shutdown +millis_t max_inactive_time, // = 0 + stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000UL; + +#ifdef CHDK + millis_t chdkHigh; // = 0; + bool chdkActive; // = false; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + I2CPositionEncodersMgr I2CPEM; +#endif + +/** + * *************************************************************************** + * ******************************** FUNCTIONS ******************************** + * *************************************************************************** + */ + +void setup_killpin() { + #if HAS_KILL + SET_INPUT_PULLUP(KILL_PIN); + #endif +} + +void setup_powerhold() { + #if HAS_SUICIDE + OUT_WRITE(SUICIDE_PIN, HIGH); + #endif + #if HAS_POWER_SWITCH + #if ENABLED(PS_DEFAULT_OFF) + PSU_OFF(); + #else + PSU_ON(); + #endif + #endif +} + +/** + * Stepper Reset (RigidBoard, et.al.) + */ +#if HAS_STEPPER_RESET + void disableStepperDrivers() { + OUT_WRITE(STEPPER_RESET_PIN, LOW); // drive it down to hold in reset motor driver chips + } + void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // set to input, which allows it to be pulled high by pullups +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + + void i2c_on_receive(int bytes) { // just echo all bytes received to serial + i2c.receive(bytes); + } + + void i2c_on_request() { // just send dummy data for now + i2c.reply("Hello World!\n"); + } + +#endif + +/** + * Sensitive pin test for M42, M226 + */ +bool pin_is_protected(const pin_t pin) { + static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; + for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) { + pin_t sensitive_pin; + memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); + if (pin == sensitive_pin) return true; + } + return false; +} + +void protected_pin_err() { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_PROTECTED_PIN); +} + +void quickstop_stepper() { + planner.quick_stop(); + planner.synchronize(); + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); +} + +void enable_all_steppers() { + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.power_on(); + #endif + enable_X(); + enable_Y(); + enable_Z(); + enable_E0(); + enable_E1(); + enable_E2(); + enable_E3(); + enable_E4(); +} + +void disable_e_steppers() { + disable_E0(); + disable_E1(); + disable_E2(); + disable_E3(); + disable_E4(); +} + +void disable_e_stepper(const uint8_t e) { + switch (e) { + case 0: disable_E0(); break; + case 1: disable_E1(); break; + case 2: disable_E2(); break; + case 3: disable_E3(); break; + case 4: disable_E4(); break; + } +} + +void disable_all_steppers() { + disable_X(); + disable_Y(); + disable_Z(); + disable_e_steppers(); +} + +/** + * Manage several activities: + * - Check for Filament Runout + * - Keep the command buffer full + * - Check for maximum inactive time between commands + * - Check for maximum inactive time between stepper commands + * - Check if pin CHDK needs to go LOW + * - Check for KILL button held down + * - Check for HOME button held down + * - Check if cooling fan needs to be switched on + * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) + */ +void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { + + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.run(); + #endif + + if (commands_in_queue < BUFSIZE) get_available_commands(); + + const millis_t ms = millis(); + + if (max_inactive_time && ELAPSED(ms, gcode.previous_move_ms + max_inactive_time)) { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPAIR(MSG_KILL_INACTIVE_TIME, parser.command_ptr); + kill(PSTR(MSG_KILLED)); + } + + // Prevent steppers timing-out in the middle of M600 + #if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) + #define MOVE_AWAY_TEST !did_pause_print + #else + #define MOVE_AWAY_TEST true + #endif + + if (stepper_inactive_time) { + if (planner.has_blocks_queued()) + gcode.previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered + else if (MOVE_AWAY_TEST && !ignore_stepper_queue && ELAPSED(ms, gcode.previous_move_ms + stepper_inactive_time)) { + #if ENABLED(DISABLE_INACTIVE_X) + disable_X(); + #endif + #if ENABLED(DISABLE_INACTIVE_Y) + disable_Y(); + #endif + #if ENABLED(DISABLE_INACTIVE_Z) + disable_Z(); + #endif + #if ENABLED(DISABLE_INACTIVE_E) + disable_e_steppers(); + #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD + if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; + #endif + } + } + + #ifdef CHDK // Check if pin should be set to LOW after M240 set it to HIGH + if (chdkActive && ELAPSED(ms, chdkHigh + CHDK_DELAY)) { + chdkActive = false; + WRITE(CHDK, LOW); + } + #endif + + #if HAS_KILL + + // Check if the kill button was pressed and wait just in case it was an accidental + // key kill key press + // ------------------------------------------------------------------------------- + static int killCount = 0; // make the inactivity button a bit less responsive + const int KILL_DELAY = 750; + if (!READ(KILL_PIN)) + killCount++; + else if (killCount > 0) + killCount--; + + // Exceeded threshold and we can confirm that it was not accidental + // KILL the machine + // ---------------------------------------------------------------- + if (killCount >= KILL_DELAY) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_KILL_BUTTON); + kill(PSTR(MSG_KILLED)); + } + #endif + + #if HAS_HOME + // Check to see if we have to home, use poor man's debouncer + // --------------------------------------------------------- + static int homeDebounceCount = 0; // poor man's debouncing count + const int HOME_DEBOUNCE_DELAY = 2500; + if (!IS_SD_PRINTING && !READ(HOME_PIN)) { + if (!homeDebounceCount) { + enqueue_and_echo_commands_P(PSTR("G28")); + LCD_MESSAGEPGM(MSG_AUTO_HOME); + } + if (homeDebounceCount < HOME_DEBOUNCE_DELAY) + homeDebounceCount++; + else + homeDebounceCount = 0; + } + #endif + + #if ENABLED(USE_CONTROLLER_FAN) + controllerfan_update(); // Check if fan should be turned on to cool stepper drivers down + #endif + + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.check(); + #endif + + #if ENABLED(EXTRUDER_RUNOUT_PREVENT) + if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP + && ELAPSED(ms, gcode.previous_move_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) + && !planner.has_blocks_queued() + ) { + #if ENABLED(SWITCHING_EXTRUDER) + bool oldstatus; + switch (active_extruder) { + default: oldstatus = E0_ENABLE_READ; enable_E0(); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_READ; enable_E1(); break; + #if E_STEPPERS > 2 + case 4: oldstatus = E2_ENABLE_READ; enable_E2(); break; + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + bool oldstatus; + switch (active_extruder) { + default: oldstatus = E0_ENABLE_READ; enable_E0(); break; + #if E_STEPPERS > 1 + case 1: oldstatus = E1_ENABLE_READ; enable_E1(); break; + #if E_STEPPERS > 2 + case 2: oldstatus = E2_ENABLE_READ; enable_E2(); break; + #if E_STEPPERS > 3 + case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break; + #if E_STEPPERS > 4 + case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break; + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #endif // !SWITCHING_EXTRUDER + + const float olde = current_position[E_AXIS]; + current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); + current_position[E_AXIS] = olde; + planner.set_e_position_mm(olde); + planner.synchronize(); + + #if ENABLED(SWITCHING_EXTRUDER) + switch (active_extruder) { + default: oldstatus = E0_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 2 + case 4: oldstatus = E2_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + switch (active_extruder) { + case 0: E0_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 1 + case 1: E1_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 2 + case 2: E2_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 3 + case 3: E3_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 4 + case 4: E4_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #endif // !SWITCHING_EXTRUDER + + gcode.previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered + } + #endif // EXTRUDER_RUNOUT_PREVENT + + #if ENABLED(DUAL_X_CARRIAGE) + // handle delayed move timeout + if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { + // travel moves have been received so enact them + delayed_move_time = 0xFFFFFFFFUL; // force moves to be done + set_destination_from_current(); + prepare_move_to_destination(); + } + #endif + + #if ENABLED(TEMP_STAT_LEDS) + handle_status_leds(); + #endif + + #if ENABLED(MONITOR_DRIVER_STATUS) + monitor_tmc_driver(); + #endif + + // Limit check_axes_activity frequency to 10Hz + static millis_t next_check_axes_ms = 0; + if (ELAPSED(ms, next_check_axes_ms)) { + planner.check_axes_activity(); + next_check_axes_ms = ms + 100UL; + } +} + +/** + * Standard idle routine keeps the machine alive + */ +void idle( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + bool no_stepper_sleep/*=false*/ + #endif +) { + #if ENABLED(MAX7219_DEBUG) + Max7219_idle_tasks(); + #endif // MAX7219_DEBUG + + lcd_update(); + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + gcode.host_keepalive(); + #endif + + manage_inactivity( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + no_stepper_sleep + #endif + ); + + thermalManager.manage_heater(); + + #if ENABLED(PRINTCOUNTER) + print_job_timer.tick(); + #endif + + #if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) + buzzer.tick(); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + static millis_t i2cpem_next_update_ms; + if (planner.has_blocks_queued() && ELAPSED(millis(), i2cpem_next_update_ms)) { + I2CPEM.update(); + i2cpem_next_update_ms = millis() + I2CPE_MIN_UPD_TIME_MS; + } + #endif + + #ifdef HAL_IDLETASK + HAL_idletask(); + #endif + + #if HAS_AUTO_REPORTING + if (!suspend_auto_report) { + #if ENABLED(AUTO_REPORT_TEMPERATURES) + thermalManager.auto_report_temperatures(); + #endif + #if ENABLED(AUTO_REPORT_SD_STATUS) + card.auto_report_sd_status(); + #endif + } + #endif +} + +/** + * Kill all activity and lock the machine. + * After this the machine will need to be reset. + */ +void kill(const char* lcd_msg) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_KILLED); + + thermalManager.disable_all_heaters(); + disable_all_steppers(); + + #if ENABLED(ULTRA_LCD) + kill_screen(lcd_msg); + #else + UNUSED(lcd_msg); + #endif + + _delay_ms(600); // Wait a short time (allows messages to get out before shutting down. + cli(); // Stop interrupts + + _delay_ms(250); //Wait to ensure all interrupts routines stopped + thermalManager.disable_all_heaters(); //turn off heaters again + + #ifdef ACTION_ON_KILL + SERIAL_ECHOLNPGM("//action:" ACTION_ON_KILL); + #endif + + #if HAS_POWER_SWITCH + PSU_OFF(); + #endif + + #if HAS_SUICIDE + suicide(); + #endif + + while (1) { + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + } // Wait for reset +} + +/** + * Turn off heaters and stop the print in progress + * After a stop the machine may be resumed with M999 + */ +void stop() { + thermalManager.disable_all_heaters(); // 'unpause' taken care of in here + + #if ENABLED(PROBING_FANS_OFF) + if (fans_paused) fans_pause(false); // put things back the way they were + #endif + + if (IsRunning()) { + Stopped_gcode_LastN = gcode_LastN; // Save last g_code for restart + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + safe_delay(350); // allow enough time for messages to get out before stopping + Running = false; + } +} + +/** + * Marlin entry-point: Set up before the program loop + * - Set up the kill pin, filament runout, power hold + * - Start the serial port + * - Print startup messages and diagnostics + * - Get EEPROM or default settings + * - Initialize managers for: + * • temperature + * • planner + * • watchdog + * • stepper + * • photo pin + * • servos + * • LCD controller + * • Digipot I2C + * • Z probe sled + * • status LEDs + */ +void setup() { + + #ifdef HAL_INIT + HAL_init(); + #endif + + #if ENABLED(MAX7219_DEBUG) + Max7219_init(); + #endif + + #if ENABLED(DISABLE_JTAG) + // Disable JTAG on AT90USB chips to free up pins for IO + MCUCR = 0x80; + MCUCR = 0x80; + #endif + + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.setup(); + #endif + + setup_killpin(); + + setup_powerhold(); + + #if HAS_STEPPER_RESET + disableStepperDrivers(); + #endif + + #if NUM_SERIAL > 0 + MYSERIAL0.begin(BAUDRATE); + #if NUM_SERIAL > 1 + MYSERIAL1.begin(BAUDRATE); + #endif + #endif + + #if NUM_SERIAL > 0 + uint32_t serial_connect_timeout = millis() + 1000UL; + while(!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #if NUM_SERIAL > 1 + serial_connect_timeout = millis() + 1000UL; + while(!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + #endif + + SERIAL_PROTOCOLLNPGM("start"); + SERIAL_ECHO_START(); + + #if ENABLED(HAVE_TMC2130) + tmc_init_cs_pins(); + #endif + #if ENABLED(HAVE_TMC2208) + tmc2208_serial_begin(); + #endif + + // Check startup - does nothing if bootloader sets MCUSR to 0 + byte mcu = HAL_get_reset_source(); + if (mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP); + if (mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET); + if (mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET); + if (mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET); + if (mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET); + HAL_clear_reset_source(); + + SERIAL_ECHOPGM(MSG_MARLIN); + SERIAL_CHAR(' '); + SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); + SERIAL_EOL(); + + #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_CONFIGURATION_VER); + SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE); + SERIAL_ECHOLNPGM(MSG_AUTHOR STRING_CONFIG_H_AUTHOR); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Compiled: " __DATE__); + #endif + + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(MSG_FREE_MEMORY, freeMemory()); + SERIAL_ECHOLNPAIR(MSG_PLANNER_BUFFER_BYTES, (int)sizeof(block_t)*BLOCK_BUFFER_SIZE); + + queue_setup(); + + // Load data from EEPROM if available (or use defaults) + // This also updates variables in the planner, elsewhere + (void)settings.load(); + + #if HAS_M206_COMMAND + // Initialize current position based on home_offset + COPY(current_position, home_offset); + #else + ZERO(current_position); + #endif + + // Vital to init stepper/planner equivalent for current_position + SYNC_PLAN_POSITION_KINEMATIC(); + + thermalManager.init(); // Initialize temperature loop + + print_job_timer.init(); // Initial setup of print job timer + + endstops.init(); // Init endstops and pullups + + stepper.init(); // Init stepper. This enables interrupts! + + #if HAS_SERVOS + servo_init(); + #endif + + #if HAS_Z_SERVO_PROBE + servo_probe_init(); + #endif + + #if HAS_PHOTOGRAPH + OUT_WRITE(PHOTOGRAPH_PIN, LOW); + #endif + + #if HAS_CASE_LIGHT + update_case_light(); + #endif + + #if ENABLED(SPINDLE_LASER_ENABLE) + OUT_WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // init spindle to off + #if SPINDLE_DIR_CHANGE + OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // init rotation to clockwise (M3) + #endif + #if ENABLED(SPINDLE_LASER_PWM) && defined(SPINDLE_LASER_PWM_PIN) && SPINDLE_LASER_PWM_PIN >= 0 + SET_OUTPUT(SPINDLE_LASER_PWM_PIN); + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // set to lowest speed + #endif + #endif + + #if HAS_BED_PROBE + endstops.enable_z_probe(false); + #endif + + #if ENABLED(USE_CONTROLLER_FAN) + SET_OUTPUT(CONTROLLER_FAN_PIN); //Set pin used for driver cooling fan + #endif + + #if HAS_STEPPER_RESET + enableStepperDrivers(); + #endif + + #if ENABLED(DIGIPOT_I2C) + digipot_i2c_init(); + #endif + + #if ENABLED(DAC_STEPPER_CURRENT) + dac_init(); + #endif + + #if (ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) && HAS_SOLENOID_1 + OUT_WRITE(SOL1_PIN, LOW); // turn it off + #endif + + #if HAS_HOME + SET_INPUT_PULLUP(HOME_PIN); + #endif + + #if PIN_EXISTS(STAT_LED_RED) + OUT_WRITE(STAT_LED_RED_PIN, LOW); // turn it off + #endif + + #if PIN_EXISTS(STAT_LED_BLUE) + OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // turn it off + #endif + + #if HAS_COLOR_LEDS + leds.setup(); + #endif + + #if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + SET_OUTPUT(RGB_LED_R_PIN); + SET_OUTPUT(RGB_LED_G_PIN); + SET_OUTPUT(RGB_LED_B_PIN); + #if ENABLED(RGBW_LED) + SET_OUTPUT(RGB_LED_W_PIN); + #endif + #endif + + #if ENABLED(MK2_MULTIPLEXER) + SET_OUTPUT(E_MUX0_PIN); + SET_OUTPUT(E_MUX1_PIN); + SET_OUTPUT(E_MUX2_PIN); + #endif + + #if HAS_FANMUX + fanmux_init(); + #endif + + lcd_init(); + lcd_reset_status(); + + #if ENABLED(SHOW_BOOTSCREEN) + lcd_bootscreen(); + #endif + + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + mixing_tools_init(); + #endif + + #if ENABLED(BLTOUCH) + bltouch_init(); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + I2CPEM.init(); + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + i2c.onReceive(i2c_on_receive); + i2c.onRequest(i2c_on_request); + #endif + + #if DO_SWITCH_EXTRUDER + move_extruder_servo(0); // Initialize extruder servo + #endif + + #if ENABLED(SWITCHING_NOZZLE) + move_nozzle_servo(0); // Initialize nozzle servo + #endif + + #if ENABLED(PARKING_EXTRUDER) + pe_magnet_init(); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + do_print_job_recovery(); + #endif + + #if ENABLED(USE_WATCHDOG) // Reinit watchdog after HAL_get_reset_source call + watchdog_init(); + #endif +} + +/** + * The main Marlin program loop + * + * - Save or log commands to SD + * - Process available commands (if not saving) + * - Call endstop manager + * - Call inactivity manager + */ +void loop() { + + for (;;) { + + #if ENABLED(SDSUPPORT) + card.checkautostart(); + #endif + + #if ENABLED(SDSUPPORT) && ENABLED(ULTIPANEL) + if (abort_sd_printing) { + abort_sd_printing = false; + card.stopSDPrint( + #if SD_RESORT + true + #endif + ); + clear_command_queue(); + quickstop_stepper(); + print_job_timer.stop(); + thermalManager.disable_all_heaters(); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #endif + wait_for_heatup = false; + } + #endif // SDSUPPORT && ULTIPANEL + + if (commands_in_queue < BUFSIZE) get_available_commands(); + advance_command_queue(); + endstops.report_state(); + idle(); + } +} diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h new file mode 100644 index 0000000000..1259a385c6 --- /dev/null +++ b/Marlin/src/Marlin.h @@ -0,0 +1,232 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ +#ifndef __MARLIN_H__ +#define __MARLIN_H__ + +#include "inc/MarlinConfig.h" + +#ifdef DEBUG_GCODE_PARSER + #include "gcode/parser.h" +#endif + +#include +#include +#include + +void stop(); + +void idle( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + bool no_stepper_sleep = false // pass true to keep steppers from disabling on timeout + #endif +); + +void manage_inactivity(const bool ignore_stepper_queue=false); + +#if HAS_X2_ENABLE + #define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0) +#elif HAS_X_ENABLE + #define enable_X() X_ENABLE_WRITE( X_ENABLE_ON) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0) +#else + #define enable_X() NOOP + #define disable_X() NOOP +#endif + +#if HAS_Y2_ENABLE + #define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0) +#elif HAS_Y_ENABLE + #define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0) +#else + #define enable_Y() NOOP + #define disable_Y() NOOP +#endif + +#if HAS_Z2_ENABLE + #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) +#elif HAS_Z_ENABLE + #define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) +#else + #define enable_Z() NOOP + #define disable_Z() NOOP +#endif + +#if ENABLED(MIXING_EXTRUDER) + + /** + * Mixing steppers synchronize their enable (and direction) together + */ + #if MIXING_STEPPERS > 3 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); } + #elif MIXING_STEPPERS > 2 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); } + #else + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); } + #endif + #define enable_E1() NOOP + #define disable_E1() NOOP + #define enable_E2() NOOP + #define disable_E2() NOOP + #define enable_E3() NOOP + #define disable_E3() NOOP + #define enable_E4() NOOP + #define disable_E4() NOOP + +#else // !MIXING_EXTRUDER + + #if HAS_E0_ENABLE + #define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E0() NOOP + #define disable_E0() NOOP + #endif + + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E1() NOOP + #define disable_E1() NOOP + #endif + + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E2() NOOP + #define disable_E2() NOOP + #endif + + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E3() NOOP + #define disable_E3() NOOP + #endif + + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E4() NOOP + #define disable_E4() NOOP + #endif + +#endif // !MIXING_EXTRUDER + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + extern TWIBus i2c; +#endif + +#if ENABLED(G38_PROBE_TARGET) + extern bool G38_move, // flag to tell the interrupt handler that a G38 command is being run + G38_endstop_hit; // flag from the interrupt handler to indicate if the endstop went active +#endif + +/** + * The axis order in all axis related arrays is X, Y, Z, E + */ +void enable_all_steppers(); +void disable_e_stepper(const uint8_t e); +void disable_e_steppers(); +void disable_all_steppers(); + +void kill(const char*); + +void quickstop_stepper(); + +extern bool Running; +inline bool IsRunning() { return Running; } +inline bool IsStopped() { return !Running; } + +extern uint8_t axis_homed, axis_known_position; + +constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); +FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } +FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } + +extern volatile bool wait_for_heatup; + +#if HAS_RESUME_CONTINUE + extern volatile bool wait_for_user; +#endif + +#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + extern bool suspend_auto_report; +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + typedef struct { double A, B, D; } linear_fit; + linear_fit* lsf_linear_fit(double x[], double y[], double z[], const int); +#endif + +// Inactivity shutdown timer +extern millis_t max_inactive_time, stepper_inactive_time; + +#if FAN_COUNT > 0 + extern int16_t fanSpeeds[FAN_COUNT]; + #if ENABLED(EXTRA_FAN_SPEED) + extern int16_t old_fanSpeeds[FAN_COUNT], + new_fanSpeeds[FAN_COUNT]; + #endif + #if ENABLED(PROBING_FANS_OFF) + extern bool fans_paused; + extern int16_t paused_fanSpeeds[FAN_COUNT]; + #endif +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + extern uint8_t controllerFanSpeed; +#endif + +#if HAS_POWER_SWITCH + extern bool powersupply_on; + #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PS_ON_AWAKE); powersupply_on = true; }while(0) + #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, PS_ON_ASLEEP); powersupply_on = false; }while(0) + #if ENABLED(AUTO_POWER_CONTROL) + #define PSU_ON() powerManager.power_on() + #define PSU_OFF() powerManager.power_off() + #else + #define PSU_ON() PSU_PIN_ON() + #define PSU_OFF() PSU_PIN_OFF() + #endif +#endif + +bool pin_is_protected(const pin_t pin); +void protected_pin_err(); + +#if HAS_SUICIDE + inline void suicide() { OUT_WRITE(SUICIDE_PIN, LOW); } +#endif + +#endif // __MARLIN_H__ diff --git a/Marlin/src/config/default/Configuration.h b/Marlin/src/config/default/Configuration.h new file mode 100644 index 0000000000..8586c4e54f --- /dev/null +++ b/Marlin/src/config/default/Configuration.h @@ -0,0 +1,1928 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/example_configurations/BIBO/TouchX/default/Configuration_adv.h b/Marlin/src/config/default/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/BIBO/TouchX/default/Configuration_adv.h rename to Marlin/src/config/default/Configuration_adv.h index 0decaf8871..26d238ad67 100644 --- a/Marlin/example_configurations/BIBO/TouchX/default/Configuration_adv.h +++ b/Marlin/src/config/default/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h similarity index 95% rename from Marlin/example_configurations/AlephObjects/TAZ4/Configuration.h rename to Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h index 3ef04273bb..7c7eb94125 100644 --- a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration.h +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -539,6 +548,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -552,6 +574,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -620,15 +659,14 @@ #define DEFAULT_EJERK 10.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -820,9 +858,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -903,6 +938,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1358,11 +1394,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1502,6 +1538,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1734,6 +1776,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h rename to Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h index 704d2a068e..776decb777 100644 --- a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,4,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 4, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/AliExpress/CL-260/Configuration.h b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h similarity index 95% rename from Marlin/example_configurations/AliExpress/CL-260/Configuration.h rename to Marlin/src/config/examples/AliExpress/CL-260/Configuration.h index c4304e8603..b679fc6652 100644 --- a/Marlin/example_configurations/AliExpress/CL-260/Configuration.h +++ b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/AliExpress/CL-260/README.txt b/Marlin/src/config/examples/AliExpress/CL-260/README.txt similarity index 100% rename from Marlin/example_configurations/AliExpress/CL-260/README.txt rename to Marlin/src/config/examples/AliExpress/CL-260/README.txt diff --git a/Marlin/example_configurations/Anet/A6/Configuration.h b/Marlin/src/config/examples/Anet/A6/Configuration.h similarity index 96% rename from Marlin/example_configurations/Anet/A6/Configuration.h rename to Marlin/src/config/examples/Anet/A6/Configuration.h index 8ca908e84a..c8651aa122 100644 --- a/Marlin/example_configurations/Anet/A6/Configuration.h +++ b/Marlin/src/config/examples/Anet/A6/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -539,6 +548,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -552,6 +574,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. #define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -648,15 +687,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -879,9 +917,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -997,6 +1032,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1490,11 +1526,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1634,6 +1670,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1868,6 +1910,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Anet/A6/Configuration_adv.h b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Anet/A6/Configuration_adv.h rename to Marlin/src/config/examples/Anet/A6/Configuration_adv.h index 0f92acd1a3..38ee9e67b9 100644 --- a/Marlin/example_configurations/Anet/A6/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Anet/A8/Configuration.h b/Marlin/src/config/examples/Anet/A8/Configuration.h similarity index 95% rename from Marlin/example_configurations/Anet/A8/Configuration.h rename to Marlin/src/config/examples/Anet/A8/Configuration.h index d1bd652912..841a226003 100644 --- a/Marlin/example_configurations/Anet/A8/Configuration.h +++ b/Marlin/src/config/examples/Anet/A8/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -526,6 +535,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -539,6 +561,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. #define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -607,15 +646,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -807,9 +845,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -890,6 +925,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1345,11 +1381,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1489,6 +1525,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1723,6 +1765,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Anet/A8/Configuration_adv.h b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Anet/A8/Configuration_adv.h rename to Marlin/src/config/examples/Anet/A8/Configuration_adv.h index 159e2d2eca..0dccff8e61 100644 --- a/Marlin/example_configurations/Anet/A8/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h new file mode 100644 index 0000000000..18847e905d --- /dev/null +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h @@ -0,0 +1,1948 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_AZTEEG_X5_GT +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axis (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axis (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 CYRILLIC + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +#define VIKI2 +//#define miniVIKI + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h new file mode 100644 index 0000000000..26d238ad67 --- /dev/null +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h @@ -0,0 +1,1703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h similarity index 95% rename from Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration.h rename to Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h index d30c9694bb..78a8241588 100644 --- a/Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration.h +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration_adv.h rename to Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h index 7a6a8dc294..3a7052615a 100644 --- a/Marlin/example_configurations/BIBO/TouchX/Cyclops/Configuration_adv.h +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/BIBO/TouchX/default/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h similarity index 95% rename from Marlin/example_configurations/BIBO/TouchX/default/Configuration.h rename to Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h index f5581ec7bd..7b7d42c0a1 100644 --- a/Marlin/example_configurations/BIBO/TouchX/default/Configuration.h +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h new file mode 100644 index 0000000000..0fcb9edb2e --- /dev/null +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h @@ -0,0 +1,1703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 2 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 45 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/BQ/Hephestos/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h similarity index 95% rename from Marlin/example_configurations/BQ/Hephestos/Configuration.h rename to Marlin/src/config/examples/BQ/Hephestos/Configuration.h index ee17625b66..782f8bb2a4 100644 --- a/Marlin/example_configurations/BQ/Hephestos/Configuration.h +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -507,6 +516,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -520,6 +542,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -588,15 +627,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -788,9 +826,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -871,6 +906,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1326,11 +1362,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1470,6 +1506,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1702,6 +1744,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h rename to Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h index c1c53725d4..8b8a94d4d5 100644 --- a/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/BQ/Hephestos_2/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h similarity index 92% rename from Marlin/example_configurations/BQ/Hephestos_2/Configuration.h rename to Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h index 944e6c4d45..bc198d460f 100644 --- a/Marlin/example_configurations/BQ/Hephestos_2/Configuration.h +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -67,14 +67,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -109,12 +109,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -333,7 +342,7 @@ #define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. // Bed temperature must be close to target for this long before M190 returns success -#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) #define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one #define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. @@ -350,12 +359,12 @@ // When temperature exceeds max temp, your heater will be switched off. // This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! // You should use MINTEMP for thermistor short/failure protection. -#define HEATER_0_MAXTEMP 275 +#define HEATER_0_MAXTEMP 230 #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 -#define BED_MAXTEMP 110 +#define BED_MAXTEMP 100 //=========================================================================== //============================= PID Settings ================================ @@ -374,13 +383,13 @@ //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with gcode: M301 E[extruder number, 0-2] - #define PID_FUNCTIONAL_RANGE 50 // If the temperature difference between the target temperature and the actual temperature - // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. // Tuned PID values using M303 - #define DEFAULT_Kp 19.18 - #define DEFAULT_Ki 1.36 - #define DEFAULT_Kd 67.42 + #define DEFAULT_Kp 23.75 + #define DEFAULT_Ki 2.12 + #define DEFAULT_Kd 66.63 // BQ firmware stock PID values //#define DEFAULT_Kp 10.7 @@ -520,6 +529,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -533,6 +555,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. #define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -558,14 +597,14 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 160, 160, 8000, 210.02 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 160, 160, 8000, 218.77 } /** * Default Max Feed Rate (mm/s) * Override with M203 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_MAX_FEEDRATE { 167, 167, 3.3, 167 } +#define DEFAULT_MAX_FEEDRATE { 300, 300, 3, 120 } /** * Default Max Acceleration (change/s) change = mm/s @@ -573,7 +612,7 @@ * Override with M201 * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ -#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 3000 } +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 3000 } /** * Default Acceleration (change/s) change = mm/s @@ -583,9 +622,9 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves -#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts -#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves +#define DEFAULT_ACCELERATION 900 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1300 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves /** * Default Jerk (mm/s) @@ -595,21 +634,20 @@ * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -#define DEFAULT_XJERK 10.0 -#define DEFAULT_YJERK 10.0 +#define DEFAULT_XJERK 5.0 +#define DEFAULT_YJERK 5.0 #define DEFAULT_ZJERK 0.3 -#define DEFAULT_EJERK 1.0 +#define DEFAULT_EJERK 10.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -728,7 +766,7 @@ */ #define X_PROBE_OFFSET_FROM_EXTRUDER 34 // X offset: -left +right [of the nozzle] #define Y_PROBE_OFFSET_FROM_EXTRUDER 15 // Y offset: -front +behind [the nozzle] -#define Z_PROBE_OFFSET_FROM_EXTRUDER -4 // Z offset: -below +above [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] // Certain types of probes need to stay away from edges #define MIN_PROBE_EDGE 10 @@ -763,16 +801,16 @@ */ #define Z_CLEARANCE_DEPLOY_PROBE 0 // Z Clearance for Deploy/Stow #define Z_CLEARANCE_BETWEEN_PROBES 2 // Z Clearance between probe points -//#define Z_AFTER_PROBING 2 // Z position after probing is done +//#define Z_AFTER_PROBING 5 // Z position after probing is done -#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping // For M851 give a range for adjusting the Z probe offset -#define Z_PROBE_OFFSET_RANGE_MIN -5.5 -#define Z_PROBE_OFFSET_RANGE_MAX -3 +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 // Enable the M48 repeatability test to test probe accuracy -#define Z_MIN_PROBE_REPEATABILITY_TEST +//#define Z_MIN_PROBE_REPEATABILITY_TEST // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // :{ 0:'Low', 1:'High' } @@ -801,9 +839,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -815,11 +850,11 @@ // @section homing -//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed +#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed //#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. -#define Z_HOMING_HEIGHT 5 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... +//#define Z_HOMING_HEIGHT 3 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... // Be sure you have this distance over your Z_MAX_POS in case. // Direction of endstops when homing; 1=MAX, -1=MIN @@ -963,8 +998,8 @@ #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. - #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. - #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 185.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 50.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. #endif #endif @@ -972,8 +1007,8 @@ #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) // Set the number of grid points per dimension. - #define GRID_MAX_POINTS_X 3 - #define GRID_MAX_POINTS_Y 4 + #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X // Set the boundaries for probing (where the probe can reach). //#define LEFT_PROBE_BED_POSITION X_MIN_POS + (X_PROBE_OFFSET_FROM_EXTRUDER) @@ -988,7 +1023,7 @@ // Beyond the probed grid, continue the implied tilt? // Default is to maintain the height of the nearest edge. - //#define EXTRAPOLATE_BEYOND_GRID + #define EXTRAPOLATE_BEYOND_GRID // // Experimental Subdivision of the grid by Catmull-Rom method. @@ -1002,17 +1037,6 @@ #endif -#elif ENABLED(AUTO_BED_LEVELING_3POINT) - - // 3 arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define PROBE_PT_1_X X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER - #define PROBE_PT_1_Y Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER - #define PROBE_PT_2_X X_MAX_POS - (X_PROBE_OFFSET_FROM_EXTRUDER) - #define PROBE_PT_2_Y Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER - #define PROBE_PT_3_X ((X_MIN_POS + X_MAX_POS) / 2) - #define PROBE_PT_3_Y Y_MAX_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER) - #elif ENABLED(AUTO_BED_LEVELING_UBL) //=========================================================================== @@ -1081,7 +1105,7 @@ * Commands to execute at the end of G29 probing. * Useful to retract or move the Z probe out of the way. */ -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" +#define Z_PROBE_END_SCRIPT "G27 P0" // @section homing @@ -1112,8 +1136,8 @@ #endif // Homing speeds (mm/m) -#define HOMING_FEEDRATE_XY (60*60) -#define HOMING_FEEDRATE_Z 120 +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z ( 4*60) // @section calibrate @@ -1197,7 +1221,7 @@ // every couple of seconds when it can't accept commands. // #define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages -#define DEFAULT_KEEPALIVE_INTERVAL 10 // Number of seconds between "busy" messages. Set with M113. +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. #define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating // @@ -1218,12 +1242,12 @@ // @section temperature // Preheat Constants -#define PREHEAT_1_TEMP_HOTEND 205 +#define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_BED 50 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 -#define PREHEAT_2_TEMP_HOTEND 245 -#define PREHEAT_2_TEMP_BED 50 +#define PREHEAT_2_TEMP_HOTEND 210 +#define PREHEAT_2_TEMP_BED 60 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 /** @@ -1284,7 +1308,7 @@ * Attention: EXPERIMENTAL. G-code arguments may change. * */ -#define NOZZLE_CLEAN_FEATURE +//#define NOZZLE_CLEAN_FEATURE #if ENABLED(NOZZLE_CLEAN_FEATURE) // Default number of pattern repetitions @@ -1294,8 +1318,8 @@ #define NOZZLE_CLEAN_TRIANGLES 3 // Specify positions as { X, Y, Z } - #define NOZZLE_CLEAN_START_POINT { X_MIN_POS + 10, Y_MAX_POS - 9, (Z_MIN_POS + 0.5)} - #define NOZZLE_CLEAN_END_POINT { X_MIN_POS + 90, Y_MAX_POS - 0, (Z_MIN_POS + 0.5)} + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} // Circular pattern radius #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 @@ -1305,7 +1329,7 @@ #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT // Moves the nozzle to the initial position - //#define NOZZLE_CLEAN_GOBACK + #define NOZZLE_CLEAN_GOBACK #endif /** @@ -1350,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1406,7 +1430,7 @@ * * Use CRC checks and retries on the SD communication. */ -#define SD_CHECK_AND_RETRY +//#define SD_CHECK_AND_RETRY /** * LCD Menu Items @@ -1423,13 +1447,13 @@ // This option overrides the default number of encoder pulses needed to // produce one step. Should be increased for high-resolution encoders. // -//#define ENCODER_PULSES_PER_STEP 4 +#define ENCODER_PULSES_PER_STEP 1 // // Use this option to override the number of step signals required to // move between next/prev menu items. // -//#define ENCODER_STEPS_PER_MENU_ITEM 1 +#define ENCODER_STEPS_PER_MENU_ITEM 5 /** * Encoder Direction Options @@ -1494,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1726,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate @@ -1767,7 +1803,7 @@ // @section extras // Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino -//#define FAST_PWM_FAN +#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency // which is not as annoying as with the hardware PWM. On the other hand, if this frequency diff --git a/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h similarity index 91% rename from Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h rename to Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h index 15bfb09e69..dbc4ea8298 100644 --- a/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -172,10 +172,10 @@ // Extruder runout prevention. // If the machine is idle and the temperature over MINTEMP // then extrude some filament every couple of SECONDS. -#define EXTRUDER_RUNOUT_PREVENT +//#define EXTRUDER_RUNOUT_PREVENT #if ENABLED(EXTRUDER_RUNOUT_PREVENT) - #define EXTRUDER_RUNOUT_MINTEMP 170 - #define EXTRUDER_RUNOUT_SECONDS 60 + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm #endif @@ -206,12 +206,22 @@ // When first starting the main fan, run it at full speed for the // given number of milliseconds. This gets the fan spinning reliably // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) -//#define FAN_KICKSTART_TIME 100 +#define FAN_KICKSTART_TIME 800 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -369,7 +379,7 @@ // Homing hits each endstop, retracts by these distances, then does a slower bump. #define X_HOME_BUMP_MM 5 #define Y_HOME_BUMP_MM 5 -#define Z_HOME_BUMP_MM 2 +#define Z_HOME_BUMP_MM 1 #define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) #define QUICK_HOME // If homing includes X and Y, do a diagonal move initially @@ -395,10 +405,10 @@ // Default stepper release if idle. Set to 0 to deactivate. // Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. // Time can be set by M18 and M84. -#define DEFAULT_STEPPER_DEACTIVE_TIME 120 -#define DISABLE_INACTIVE_X true -#define DISABLE_INACTIVE_Y true -#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DEFAULT_STEPPER_DEACTIVE_TIME 300 +#define DISABLE_INACTIVE_X false +#define DISABLE_INACTIVE_Y false +#define DISABLE_INACTIVE_Z false // set to false if the nozzle will fall down on your printed part when print has finished. #define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate @@ -409,7 +419,7 @@ // @section lcd #if ENABLED(ULTIPANEL) - #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel //#define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder #endif @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -464,7 +482,15 @@ * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 */ //#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps -#define DIGIPOT_MOTOR_CURRENT { 150, 170, 180, 190, 180 } // Values 0-255 (bq ZUM Mega 3D (default): X = 150 [~1.17A]; Y = 170 [~1.33A]; Z = 180 [~1.41A]; E0 = 190 [~1.49A]) + +#define DIGIPOT_MOTOR_CURRENT { 170, 170, 180, 190, 180 } // Values 0-255 + // + // bq ZUM Mega 3D defaults: + // X = 150 [~1.17A] + // Y = 170 [~1.33A] + // Z = 180 [~1.41A] + // E0 = 190 [~1.49A] + //#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis // Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) @@ -483,7 +509,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -492,17 +518,17 @@ //=============================Additional Features=========================== //=========================================================================== -//#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly -//#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value -//#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 30 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 50 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value //#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ -//#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again // @section lcd // Include a page of printer information in the LCD Main Menu -#define LCD_INFO_MENU +//#define LCD_INFO_MENU // Scroll a longer status message into view #define STATUS_MESSAGE_SCROLLING @@ -511,7 +537,7 @@ #define LCD_DECIMAL_SMALL_XY // The timeout (in ms) to return to the status screen from sub-menus -//#define LCD_TIMEOUT_TO_STATUS 15000 +#define LCD_TIMEOUT_TO_STATUS 60000 // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY @@ -553,8 +579,8 @@ // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). #define SD_DETECT_INVERTED - #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished - #define SD_FINISHED_RELEASECOMMAND "M104 S0\nM84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + #define SD_FINISHED_STEPPERRELEASE false // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "G27 P0" // You might want to keep the z enabled so your bed stays in place. // Reverse SD sort to show "more recent" files first, according to the card's FAT. // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. @@ -612,7 +638,7 @@ #endif // This allows hosts to request long names for files and folders with M33 - #define LONG_FILENAME_HOST_SUPPORT + //#define LONG_FILENAME_HOST_SUPPORT // Enable this option to scroll long filenames in the SD card menu //#define SCROLL_LONG_FILENAMES @@ -655,18 +681,18 @@ //#define DOGM_SD_PERCENT // Enable to save many cycles by drawing a hollow frame on the Info Screen - #define XYZ_HOLLOW_FRAME + //#define XYZ_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens #define MENU_HOLLOW_FRAME // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. - #define USE_BIG_EDIT_FONT + //#define USE_BIG_EDIT_FONT // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. - #define USE_SMALL_INFOFONT + //#define USE_SMALL_INFOFONT // Enable this option and reduce the value to optimize screen updates. // The normal delay is 10µs. Use the lowest value that still gives a reliable display. @@ -718,16 +744,16 @@ * * Warning: Does not respect endstops! */ -//#define BABYSTEPPING +#define BABYSTEPPING #if ENABLED(BABYSTEPPING) - //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! - #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way - #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. - //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping - //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. - #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. - // Note: Extra time may be added to mitigate controller latency. - //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 2 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1500 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor #endif // @section extruder @@ -764,12 +790,36 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // // G2/G3 Arc Support // -#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes #if ENABLED(ARC_SUPPORT) #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections @@ -790,11 +840,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. @@ -809,7 +876,7 @@ // The number of linear motions that can be in the plan at any give time. // THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. #if ENABLED(SDSUPPORT) - #define BLOCK_BUFFER_SIZE 32 // SD,LCD,Buttons take more memory, block buffer needs to be smaller + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller #else #define BLOCK_BUFFER_SIZE 64 // maximize block buffer #endif @@ -855,13 +922,13 @@ // enter the serial receive buffer, so they cannot be blocked. // Currently handles M108, M112, M410 // Does not work on boards using AT90USB (USBCON) processors! -#define EMERGENCY_PARSER +//#define EMERGENCY_PARSER // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. // Some other clients start sending commands while receiving a 'wait'. // This "wait" is only sent when the buffer is empty. 1 second is a good value here. -//#define NO_TIMEOUTS 1000 // Milliseconds +#define NO_TIMEOUTS 1000 // Milliseconds // Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. #define ADVANCED_OK diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/README.md b/Marlin/src/config/examples/BQ/Hephestos_2/README.md new file mode 100644 index 0000000000..ab28487e2d --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos_2/README.md @@ -0,0 +1,29 @@ +# Example Configuration for BQ [Hephestos 2](http://www.bq.com/uk/hephestos-2) +Based on the original configuration file shipped with the heavily modified Marlin fork by BQ. +The forked firmware and configuration files can be found at the [BQ Github repository](https://github.com/bq/Marlin). + +NOTE: The look and feel of the LCD menu will change dramatically when using the original Marlin firmware. + +## Changelog + * 2018/05/30 - Configuration updated to the latest Marlin version (43a55a9af). + ABL Bilinear 5x5 is active by default. + + * 2017/07/06 - Configuration updated to the latest Marlin version and added support for the + official BQ heated bed upgrade kit. + + * 2016/12/13 - Configuration updated to the latest Marlin version. + + * 2016/07/13 - Configuration updated to the latest Marlin version. + + * 2016/06/21 - Disabled heated bed related options, activated software endstops and SD printing now + disables the heater when finishes printing. + + * 2016/03/21 - Activated 4-point auto leveling by default and updated miscellaneous z-probe values. + + * 2016/03/01 - The first release of Marlin's configuration file for the + BQ Hephestos 2 3D printer. + + +## Support +This configuration should work easily with the stock Hephestos 2, nevertheless if you encounter any +issues you may contact me on [Github](https://github.com/jbrazio), [Twitter](https://twitter.com/jbrazio) or by mail. diff --git a/Marlin/example_configurations/BQ/Hephestos_2/_Bootscreen.h b/Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h similarity index 53% rename from Marlin/example_configurations/BQ/Hephestos_2/_Bootscreen.h rename to Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h index 3ba0129ea9..0e771c0c7f 100644 --- a/Marlin/example_configurations/BQ/Hephestos_2/_Bootscreen.h +++ b/Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h @@ -30,38 +30,39 @@ * http://marlinfw.org/tools/u8glib/converter.html */ -#define CUSTOM_BOOTSCREEN_BMPWIDTH 62 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 64 const unsigned char custom_start_bmp[] PROGMEM = { - B00000000,B00000000,B00000000,B00001111,B11110000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00011111,B11111000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00011111,B11111000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00011111,B11111000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00011111,B11111000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00011111,B11111000,B00000000,B00000000,B00000000, - B00000000,B00000011,B11000000,B00001111,B11110000,B00000111,B10000000,B00000000, - B00000000,B00000111,B11100000,B00000111,B11100000,B00001111,B11000000,B00000000, - B00000000,B00001111,B11110000,B00000011,B11000000,B00011111,B11100000,B00000000, - B00000000,B00011111,B11111000,B00000000,B00000000,B00111111,B11110000,B00000000, - B00000000,B00011111,B11111000,B00000000,B00000000,B00111111,B11110000,B00000000, - B00000000,B00011111,B11111000,B00000000,B00000000,B00111111,B11110000,B00000000, - B00000000,B00011111,B11111000,B00000000,B00000000,B00111111,B11110000,B00000000, - B00000000,B00011111,B11111000,B00000000,B00000000,B00111111,B11110000,B00000000, - B00000000,B00001111,B11110000,B00000000,B00000000,B00011111,B11100000,B00000000, - B00000000,B00000111,B11100000,B00000000,B00000000,B00001111,B11000000,B00000000, - B00000000,B00000011,B11000000,B00000000,B00000000,B00000111,B10000000,B00000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11111000,B00000111,B11111000,B00000111,B11000000,B00000000, + B00000000,B00000001,B11111100,B00000011,B11110000,B00001111,B11100000,B00000000, + B00000000,B00000011,B11111110,B00000000,B11000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111100,B00000000,B00000000,B00001111,B11100000,B00000000, + B00000000,B00000001,B11111000,B00000000,B00000000,B00001111,B11100000,B00000000, + B00000000,B00000000,B01110000,B00000000,B00000000,B00000011,B10000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, @@ -69,32 +70,31 @@ const unsigned char custom_start_bmp[] PROGMEM = { B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00001111,B10000000,B00000000,B00000000,B01110000,B00000000,B00000000,B00000000, + B00011111,B11000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111011,B11000000,B00001111,B00000000, + B00111111,B11000000,B00000000,B00000000,B01111111,B11110000,B00111111,B11000000, + B00011111,B10000000,B00000000,B00000000,B01111111,B11111000,B01111111,B11100000, + B00001111,B00000000,B00000000,B00000000,B01111110,B11111100,B11111001,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B11100000,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B11100000,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111100,B01111100,B11111001,B11110000, + B00000000,B00000000,B00000000,B00000000,B00011111,B11111000,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00001111,B11110000,B01111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00011111,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00011110,B00000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B00111111,B00000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B01111111,B10000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B11111111,B11000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B11111111,B11000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B11111111,B11000000,B00000000,B00000000,B11110000,B00000000,B00000000,B00000000, - B11111111,B11000000,B00000000,B00000000,B11110111,B11000000,B00011111,B10000000, - B11111111,B11000000,B00000000,B00000000,B11111111,B11110000,B01111111,B11000000, - B01111111,B10000000,B00000000,B00000000,B11111111,B11111000,B11111111,B11100000, - B00111111,B00000000,B00000000,B00000000,B11111100,B11111000,B11110000,B11111000, - B00011110,B00000000,B00000000,B00000000,B11111000,B01111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11110000,B00111101,B11100000,B01111000, - B00000000,B00000000,B00000000,B00000000,B11111000,B01111001,B11110000,B11111000, - B00000000,B00000000,B00000000,B00000000,B11111111,B11111000,B11111111,B11111000, - B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B01111111,B11111000, - B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00111111,B11111000, - B00000000,B00000000,B00000000,B00000000,B00000011,B10000000,B00001110,B01111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000 + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 }; diff --git a/Marlin/example_configurations/BQ/WITBOX/Configuration.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h similarity index 95% rename from Marlin/example_configurations/BQ/WITBOX/Configuration.h rename to Marlin/src/config/examples/BQ/WITBOX/Configuration.h index 9d2478c35a..3536e07727 100644 --- a/Marlin/example_configurations/BQ/WITBOX/Configuration.h +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -507,6 +516,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -520,6 +542,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -588,15 +627,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -788,9 +826,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -871,6 +906,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1326,11 +1362,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1470,6 +1506,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1702,6 +1744,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h rename to Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h index c1c53725d4..8b8a94d4d5 100644 --- a/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Cartesio/Configuration.h b/Marlin/src/config/examples/Cartesio/Configuration.h similarity index 95% rename from Marlin/example_configurations/Cartesio/Configuration.h rename to Marlin/src/config/examples/Cartesio/Configuration.h index aea0c13597..6421333b46 100644 --- a/Marlin/example_configurations/Cartesio/Configuration.h +++ b/Marlin/src/config/examples/Cartesio/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -518,6 +527,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -531,6 +553,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -599,15 +638,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -799,9 +837,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -882,6 +917,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1337,11 +1373,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1481,6 +1517,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1713,6 +1755,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Cartesio/Configuration_adv.h b/Marlin/src/config/examples/Cartesio/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Cartesio/Configuration_adv.h rename to Marlin/src/config/examples/Cartesio/Configuration_adv.h index 67e0870db4..ba19ef42b7 100644 --- a/Marlin/example_configurations/Cartesio/Configuration_adv.h +++ b/Marlin/src/config/examples/Cartesio/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -182,10 +182,10 @@ // @section temperature -#define TEMP_SENSOR_AD595_OFFSET 3.0 -#define TEMP_SENSOR_AD595_GAIN 2.0 // Calibration for AD595 / AD8495 sensor to adjust temperature measurements. // The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 #define TEMP_SENSOR_AD8495_OFFSET 0.0 #define TEMP_SENSOR_AD8495_GAIN 1.0 @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Cartesio/_Bootscreen.h b/Marlin/src/config/examples/Cartesio/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Cartesio/_Bootscreen.h rename to Marlin/src/config/examples/Cartesio/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/CR-10/Configuration.h b/Marlin/src/config/examples/Creality/CR-10/Configuration.h old mode 100755 new mode 100644 similarity index 95% rename from Marlin/example_configurations/Creality/CR-10/Configuration.h rename to Marlin/src/config/examples/Creality/CR-10/Configuration.h index 832a1b07c4..fa5e1ebff5 --- a/Marlin/example_configurations/Creality/CR-10/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -529,6 +538,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -542,6 +564,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -610,15 +649,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -810,9 +848,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -893,6 +928,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1348,11 +1384,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1492,6 +1528,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1724,6 +1766,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h old mode 100755 new mode 100644 similarity index 95% rename from Marlin/example_configurations/Creality/CR-10/Configuration_adv.h rename to Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h index a49b353314..9bf413d6fd --- a/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/CR-10/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/CR-10/_Bootscreen.h rename to Marlin/src/config/examples/Creality/CR-10/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/CR-10/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10/_Statusscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/CR-10/_Statusscreen.h rename to Marlin/src/config/examples/Creality/CR-10/_Statusscreen.h diff --git a/Marlin/example_configurations/Creality/CR-10S/Configuration.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-10S/Configuration.h rename to Marlin/src/config/examples/Creality/CR-10S/Configuration.h index 53764e6cb6..dcfb9db984 100644 --- a/Marlin/example_configurations/Creality/CR-10S/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING true // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #define FIL_RUNOUT_PIN 2 // Creality CR10-S stock sensor #endif @@ -1339,11 +1375,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1483,6 +1519,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1715,6 +1757,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/CR-10S/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-10S/Configuration_adv.h rename to Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h index 4c240c84ee..9dc7d3f9f1 100644 --- a/Marlin/example_configurations/Creality/CR-10S/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/CR-10S/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10S/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/CR-10S/_Bootscreen.h rename to Marlin/src/config/examples/Creality/CR-10S/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/CR-10S/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h similarity index 99% rename from Marlin/example_configurations/Creality/CR-10S/_Statusscreen.h rename to Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h index c956a55a71..30264c6def 100644 --- a/Marlin/example_configurations/Creality/CR-10S/_Statusscreen.h +++ b/Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h @@ -36,7 +36,10 @@ #define STATUS_SCREEN_BED_TEXT_X (HOTENDS > 1 ? 81 : 73) -#define FAN_ANIM_FRAMES 3 +// Can also be overridden in Configuration.h +#ifndef FAN_ANIM_FRAMES + #define FAN_ANIM_FRAMES 3 +#endif #define STATUS_SCREEN_FAN_TEXT_X (FAN_ANIM_FRAMES == 3 ? 103 : 105) #define STATUS_SCREEN_FAN_TEXT_Y (FAN_ANIM_FRAMES > 2 ? 28 : 27) diff --git a/Marlin/example_configurations/Creality/CR-10mini/Configuration.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-10mini/Configuration.h rename to Marlin/src/config/examples/Creality/CR-10mini/Configuration.h index 7b9a896bd9..43ca4c35da 100644 --- a/Marlin/example_configurations/Creality/CR-10mini/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h @@ -46,7 +46,7 @@ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -68,14 +68,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -110,12 +110,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -538,6 +547,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -551,6 +573,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -619,15 +658,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -819,9 +857,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -902,6 +937,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1357,11 +1393,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1501,6 +1537,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1733,6 +1775,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/CR-10mini/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-10mini/Configuration_adv.h rename to Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h index 0247e32341..3573d33b97 100644 --- a/Marlin/example_configurations/Creality/CR-10mini/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/CR-10mini/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10mini/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/CR-10mini/_Bootscreen.h rename to Marlin/src/config/examples/Creality/CR-10mini/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/CR-10mini/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10mini/_Statusscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/CR-10mini/_Statusscreen.h rename to Marlin/src/config/examples/Creality/CR-10mini/_Statusscreen.h diff --git a/Marlin/example_configurations/Creality/CR-8/Configuration.h b/Marlin/src/config/examples/Creality/CR-8/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-8/Configuration.h rename to Marlin/src/config/examples/Creality/CR-8/Configuration.h index c2334b9ab9..6454a826d1 100644 --- a/Marlin/example_configurations/Creality/CR-8/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -529,6 +538,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -542,6 +564,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -610,15 +649,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -810,9 +848,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -893,6 +928,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1348,11 +1384,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1492,6 +1528,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1724,6 +1766,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/CR-8/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/CR-8/Configuration_adv.h rename to Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h index e28d4e2a61..d97d93b6f4 100644 --- a/Marlin/example_configurations/Creality/CR-8/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/Ender-2/Configuration.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-2/Configuration.h rename to Marlin/src/config/examples/Creality/Ender-2/Configuration.h index 86e716df36..3c13a76609 100644 --- a/Marlin/example_configurations/Creality/Ender-2/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -523,6 +532,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -536,6 +558,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -604,15 +643,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -804,9 +842,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -887,6 +922,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1342,11 +1378,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1486,6 +1522,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1718,6 +1760,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/Ender-2/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-2/Configuration_adv.h rename to Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h index 9ff0967d72..48573751b4 100644 --- a/Marlin/example_configurations/Creality/Ender-2/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/Ender-2/README.md b/Marlin/src/config/examples/Creality/Ender-2/README.md similarity index 100% rename from Marlin/example_configurations/Creality/Ender-2/README.md rename to Marlin/src/config/examples/Creality/Ender-2/README.md diff --git a/Marlin/example_configurations/Creality/Ender-2/_Bootscreen.h b/Marlin/src/config/examples/Creality/Ender-2/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/Ender-2/_Bootscreen.h rename to Marlin/src/config/examples/Creality/Ender-2/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/Ender-2/_Statusscreen.h b/Marlin/src/config/examples/Creality/Ender-2/_Statusscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/Ender-2/_Statusscreen.h rename to Marlin/src/config/examples/Creality/Ender-2/_Statusscreen.h diff --git a/Marlin/example_configurations/Creality/Ender-3/Configuration.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-3/Configuration.h rename to Marlin/src/config/examples/Creality/Ender-3/Configuration.h index 30c33a3dd7..c2f9ac6df1 100644 --- a/Marlin/example_configurations/Creality/Ender-3/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -523,6 +532,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -536,6 +558,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -604,15 +643,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -804,9 +842,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -887,6 +922,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1342,11 +1378,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1486,6 +1522,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1718,6 +1760,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/Ender-3/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-3/Configuration_adv.h rename to Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h index edd0784c64..c93ec7a112 100644 --- a/Marlin/example_configurations/Creality/Ender-3/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Creality/Ender-3/README.md b/Marlin/src/config/examples/Creality/Ender-3/README.md similarity index 100% rename from Marlin/example_configurations/Creality/Ender-3/README.md rename to Marlin/src/config/examples/Creality/Ender-3/README.md diff --git a/Marlin/example_configurations/Creality/Ender-3/_Bootscreen.h b/Marlin/src/config/examples/Creality/Ender-3/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/Ender-3/_Bootscreen.h rename to Marlin/src/config/examples/Creality/Ender-3/_Bootscreen.h diff --git a/Marlin/example_configurations/Creality/Ender-3/_Statusscreen.h b/Marlin/src/config/examples/Creality/Ender-3/_Statusscreen.h similarity index 100% rename from Marlin/example_configurations/Creality/Ender-3/_Statusscreen.h rename to Marlin/src/config/examples/Creality/Ender-3/_Statusscreen.h diff --git a/Marlin/example_configurations/Creality/Ender-4/Configuration.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-4/Configuration.h rename to Marlin/src/config/examples/Creality/Ender-4/Configuration.h index 974e5e3302..5d22e744da 100644 --- a/Marlin/example_configurations/Creality/Ender-4/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -529,6 +538,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true//false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -542,6 +564,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -610,15 +649,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -810,9 +848,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -893,6 +928,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1348,11 +1384,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1492,6 +1528,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1724,6 +1766,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Creality/Ender-4/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Creality/Ender-4/Configuration_adv.h rename to Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h index e28d4e2a61..d97d93b6f4 100644 --- a/Marlin/example_configurations/Creality/Ender-4/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Felix/Configuration.h b/Marlin/src/config/examples/Felix/Configuration.h similarity index 95% rename from Marlin/example_configurations/Felix/Configuration.h rename to Marlin/src/config/examples/Felix/Configuration.h index 4376d96308..b79398bf35 100644 --- a/Marlin/example_configurations/Felix/Configuration.h +++ b/Marlin/src/config/examples/Felix/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -500,6 +509,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -513,6 +535,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -582,15 +621,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -782,9 +820,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -865,6 +900,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1320,11 +1356,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1464,6 +1500,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1696,6 +1738,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Felix/Configuration_adv.h b/Marlin/src/config/examples/Felix/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Felix/Configuration_adv.h rename to Marlin/src/config/examples/Felix/Configuration_adv.h index 7dd597b526..c54a909401 100644 --- a/Marlin/example_configurations/Felix/Configuration_adv.h +++ b/Marlin/src/config/examples/Felix/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Felix/DUAL/Configuration.h b/Marlin/src/config/examples/Felix/DUAL/Configuration.h similarity index 95% rename from Marlin/example_configurations/Felix/DUAL/Configuration.h rename to Marlin/src/config/examples/Felix/DUAL/Configuration.h index 6c9ad5e637..ba5f1e55b0 100644 --- a/Marlin/example_configurations/Felix/DUAL/Configuration.h +++ b/Marlin/src/config/examples/Felix/DUAL/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -500,6 +509,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -513,6 +535,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -582,15 +621,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -782,9 +820,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -865,6 +900,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1320,11 +1356,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1464,6 +1500,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1696,6 +1738,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Felix/README.md b/Marlin/src/config/examples/Felix/README.md similarity index 89% rename from Marlin/example_configurations/Felix/README.md rename to Marlin/src/config/examples/Felix/README.md index b1b8f36728..48fe099151 100644 --- a/Marlin/example_configurations/Felix/README.md +++ b/Marlin/src/config/examples/Felix/README.md @@ -11,19 +11,19 @@ Bringing silky smooth prints to Felix. - In both cases use the "Download Zip" button on the right. ``` -cd Marlin/Marlin -cp example_configurations/Felix/Configuration_adv.h . +cd Marlin/src +cp config/examples/Felix/Configuration_adv.h . ``` The next step depends on your setup: ### Single Extruder Configuration - cp example_configurations/Felix/Configuration.h . + cp config/examples/Felix/Configuration.h . ### Dual Extruder Configuration - cp example_configurations/Felix/DUAL/Configuration.h Configuration.h + cp config/examples/Felix/DUAL/Configuration.h Configuration.h ### Compile Firmware diff --git a/Marlin/example_configurations/FolgerTech/i3-2020/Configuration.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h similarity index 95% rename from Marlin/example_configurations/FolgerTech/i3-2020/Configuration.h rename to Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h index 816b72a072..361f185a7e 100644 --- a/Marlin/example_configurations/FolgerTech/i3-2020/Configuration.h +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -524,6 +533,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -537,6 +559,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -606,15 +645,14 @@ #define DEFAULT_EJERK 4.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -806,9 +844,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -889,6 +924,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1344,11 +1380,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1488,6 +1524,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1720,6 +1762,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h rename to Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h index 4395aafe0d..751080e1ae 100644 --- a/Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. @@ -1615,13 +1674,13 @@ #define MAX7219_DIN_PIN 57 // on RAMPS #define MAX7219_LOAD_PIN 44 // on RAMPS -//#define MAX7219_CLK_PIN 77 // on Re-ARM // Configuration of the 3 pins to control the display -//#define MAX7219_DIN_PIN 78 // on Re-ARM -//#define MAX7219_LOAD_PIN 79 // on Re-ARM +//#define MAX7219_CLK_PIN P1_04 // on Re-ARM ENET_TX_EN J12-10 +//#define MAX7219_DIN_PIN P1_00 // on Re-ARM ENET_TXD0 J12-11 +//#define MAX7219_LOAD_PIN P1_01 // on Re-ARM ENET_TXD1 J12-12 -//#define MAX7219_CLK_PIN 30 // for RAMPS E1 // Configuration of the 3 pins to control the display -//#define MAX7219_DIN_PIN 34 // for RAMPS E1 -//#define MAX7219_LOAD_PIN 36 // for RAMPS E1 +//#define MAX7219_CLK_PIN P4_29 // for RAMPS E1 on Re-ARM E1_ENABLE_PIN P4_29 +//#define MAX7219_DIN_PIN P2_13 // for RAMPS E1 on Re-ARM E1_DIR_PIN P2_13 +//#define MAX7219_LOAD_PIN P2_08 // for RAMPS E1 on Re-ARM E1_STEP_PIN P2_08 /** * Sample debug features diff --git a/Marlin/example_configurations/Geeetech/GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/GT2560/Configuration.h rename to Marlin/src/config/examples/Geeetech/GT2560/Configuration.h index cee6cbcc1b..c9fc21aa99 100644 --- a/Marlin/example_configurations/Geeetech/GT2560/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -534,6 +543,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -547,6 +569,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -615,15 +654,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -815,9 +853,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -898,6 +933,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1353,11 +1389,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1497,6 +1533,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1729,6 +1771,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/I3_Pro_X-GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/I3_Pro_X-GT2560/Configuration.h rename to Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h index 5df6b7c089..858b125506 100644 --- a/Marlin/example_configurations/Geeetech/I3_Pro_X-GT2560/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 4.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro B/README.md b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/README.md similarity index 100% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro B/README.md rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/README.md diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h index c5f9bf6f48..1177e3cad3 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -534,6 +543,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -547,6 +569,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -615,15 +654,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -816,9 +854,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -899,6 +934,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1354,11 +1390,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1498,6 +1534,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1730,6 +1772,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h index 0e4549e33d..94821804a1 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -534,6 +543,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -547,6 +569,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -615,15 +654,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -815,9 +853,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -898,6 +933,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1353,11 +1389,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1497,6 +1533,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1729,6 +1771,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h index d92d4a4fc1..1d6a8c19ee 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration_adv.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h index e3955ea4a8..d0bee3f0d2 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro C/Configuration_adv.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h index a900af3bd7..ae2d47433b 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration_adv.h rename to Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h index e3955ea4a8..d0bee3f0d2 100644 --- a/Marlin/example_configurations/Geeetech/Prusa i3 Pro W/Configuration_adv.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Infitary/i3-M508/Configuration.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h similarity index 95% rename from Marlin/example_configurations/Infitary/i3-M508/Configuration.h rename to Marlin/src/config/examples/Infitary/i3-M508/Configuration.h index e6c4396b97..20ff78d9d0 100644 --- a/Marlin/example_configurations/Infitary/i3-M508/Configuration.h +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -523,6 +532,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -536,6 +558,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -604,15 +643,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -804,9 +842,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -887,6 +922,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1342,11 +1378,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1486,6 +1522,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1718,6 +1760,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h rename to Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h index 5074482592..20a76eb5e0 100644 --- a/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/JGAurora/A5/Configuration.h b/Marlin/src/config/examples/JGAurora/A5/Configuration.h similarity index 95% rename from Marlin/example_configurations/JGAurora/A5/Configuration.h rename to Marlin/src/config/examples/JGAurora/A5/Configuration.h index f071345f35..a0b97c6aab 100644 --- a/Marlin/example_configurations/JGAurora/A5/Configuration.h +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration.h @@ -42,7 +42,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -64,14 +64,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -106,12 +106,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -531,6 +540,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -544,6 +566,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -612,15 +651,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -812,9 +850,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -895,6 +930,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1349,11 +1385,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1493,6 +1529,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1725,6 +1767,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/JGAurora/A5/Configuration_adv.h b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/JGAurora/A5/Configuration_adv.h rename to Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h index 3401d94849..4ff8e379bd 100644 --- a/Marlin/example_configurations/JGAurora/A5/Configuration_adv.h +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/JGAurora/A5/README.md b/Marlin/src/config/examples/JGAurora/A5/README.md similarity index 100% rename from Marlin/example_configurations/JGAurora/A5/README.md rename to Marlin/src/config/examples/JGAurora/A5/README.md diff --git a/Marlin/src/config/examples/MakerParts/Configuration.h b/Marlin/src/config/examples/MakerParts/Configuration.h new file mode 100644 index 0000000000..e9fed6c7e9 --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/Configuration.h @@ -0,0 +1,1948 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//===== Pololus calibration ================================================= +//=========================================================================== + +// Voltage reference on potentiometer on Green Pololus in millivolts +#define Vref_mV 800UL + +// Rsc value used on PCB of the Green Pololus +#define Rsc_mOhms 100UL + +// Estimated maximum acceleration for X and Y axis +#define MAX_XYAXIS_ACCEL (3UL * (Vref_mV) * 100UL / (Rsc_mOhms)) + +// Notes: +// If we could use 1.65A as motor current, then 3000 mm/s^2 as acceleration +// if perfectly achievable. Using 1A as motor current, 2400 mm/s^2 acceleration +// is perfectly possible without losing any steps +// On A4988 drivers, maximum current can be calculated as I_TripMax= Vref/(8*Rs) +// + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "ejtagle" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 0 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_DUO_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "MakerParts 3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +#define MACHINE_UUID "4250d842-4943-4601-acca-95ef77b8a4f1" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX + #define ENDSTOPPULLUP_XMIN + #define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 97 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 2, 30 } // For 300mm/s printing + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { MAX_XYAXIS_ACCEL, MAX_XYAXIS_ACCEL, 10, 200 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 100 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 2.0 +#define DEFAULT_YJERK 2.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 8.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/MakerParts/Configuration_adv.h b/Marlin/src/config/examples/MakerParts/Configuration_adv.h new file mode 100644 index 0000000000..0107419bf1 --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/Configuration_adv.h @@ -0,0 +1,1703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 180 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 30000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + #define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE true // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES true // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + #define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + #define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +#define RX_BUFFER_SIZE 4096 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + #define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + #define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + #define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/MakerParts/_Bootscreen.h b/Marlin/src/config/examples/MakerParts/_Bootscreen.h new file mode 100644 index 0000000000..5ddf5c7ff4 --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/_Bootscreen.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00011111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00011111,B11111111,B11111111,B11111111,B11000000,B00001111,B10000000,B01111100,B00000111,B11100000,B00111111,B00001111,B11011111,B11111111,B01111111,B11110000, + B00111111,B11111111,B11111111,B11111111,B11100000,B00001111,B11000000,B11111100,B00000111,B11100000,B00111111,B00011111,B10011111,B11111111,B01111111,B11111100, + B01111111,B10111111,B11111111,B11101111,B11110000,B00001111,B11000000,B11111100,B00001111,B11110000,B00111111,B00011111,B00011111,B11111111,B01111111,B11111110, + B01111110,B00001111,B11111111,B10000011,B11110000,B00001111,B11100001,B11111100,B00001111,B11110000,B00111111,B00111110,B00011111,B11111111,B01111111,B11111110, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11100001,B11111100,B00011111,B11111000,B00111111,B01111110,B00011111,B10000000,B01111100,B00111110, + B01111100,B00000011,B11111110,B00000001,B11110000,B00001111,B11110011,B11111100,B00011111,B11111000,B00111111,B11111100,B00011111,B10000000,B01111100,B00011110, + B01111100,B00000001,B11111100,B00000001,B11110000,B00001111,B11110011,B11111100,B00011111,B11111000,B00111111,B11111000,B00011111,B11111100,B01111100,B00111110, + B01111100,B00000000,B11111000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111000,B00011111,B11111100,B01111111,B11111110, + B01111100,B00000000,B01110000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111100,B00011111,B11111100,B01111111,B11111110, + B01111100,B00000000,B00100000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111100,B00011111,B11111100,B01111111,B11111100, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10111111,B01111100,B01111111,B11111110,B00111111,B11111110,B00011111,B11111100,B01111111,B11111000, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10111111,B01111100,B01111111,B11111110,B00111111,B11111110,B00011111,B10000000,B01111111,B11111000, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10011110,B01111100,B01111111,B11111110,B00111111,B00111111,B00011111,B10000000,B01111100,B11111000, + B01111100,B00000110,B00000011,B00000001,B11110000,B00001111,B10011110,B01111100,B11111111,B11111111,B00111111,B00111111,B00011111,B11111111,B01111100,B11111100, + B01111100,B00000111,B00000111,B00000001,B11110000,B00001111,B10001100,B01111100,B11111111,B11111111,B00111111,B00011111,B10011111,B11111111,B01111100,B11111100, + B01111100,B00000111,B10001111,B00000001,B11110000,B00001111,B10000000,B01111100,B11111000,B00011111,B00111111,B00011111,B10011111,B11111111,B01111100,B01111110, + B01111100,B00000111,B11011111,B00000001,B11110000,B00001111,B10000000,B01111101,B11111000,B00011111,B10111111,B00001111,B11011111,B11111111,B01111100,B00111111, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11111110,B00000011,B11110000,B00011111,B11111000,B00111111,B11111111,B10000111,B11111000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11111111,B00000011,B11110000,B00011111,B11111110,B00111111,B11111111,B10011111,B11111110,B00000000, + B01111100,B00000111,B11111111,B00000001,B11100000,B00001111,B11111111,B10000111,B11111000,B00011111,B11111111,B00111111,B11111111,B10011111,B11111110,B00000000, + B00111100,B00001111,B11111111,B10000001,B11100000,B00001111,B11111111,B11000111,B11111000,B00011111,B11111111,B10111111,B11111111,B10111111,B11111110,B00000000, + B00111100,B00001111,B11111111,B10000001,B11100000,B00001111,B11111111,B11000111,B11111000,B00011111,B11111111,B10111111,B11111111,B10111111,B00111100,B00000000, + B00011110,B00001111,B11111111,B10000011,B11000000,B00001111,B10000111,B11001111,B11111100,B00011111,B00001111,B11000001,B11110000,B00111110,B00000000,B00000000, + B00011110,B00001111,B11111111,B10000011,B11000000,B00001111,B10000011,B11001111,B11111100,B00011111,B00000111,B11000001,B11110000,B00111111,B11000000,B00000000, + B00001111,B00001111,B11111111,B10000111,B10000000,B00001111,B10000111,B11001111,B00111100,B00011111,B00001111,B10000001,B11110000,B00111111,B11111000,B00000000, + B00001111,B00001111,B11111111,B10000111,B10000000,B00001111,B11111111,B11011111,B00111110,B00011111,B11111111,B10000001,B11110000,B00011111,B11111110,B00000000, + B00000111,B10001111,B11111111,B10001111,B00000000,B00001111,B11111111,B10011111,B00111110,B00011111,B11111111,B10000001,B11110000,B00011111,B11111110,B00000000, + B00000111,B11001111,B11111111,B10011111,B00000000,B00001111,B11111111,B00011111,B00111110,B00011111,B11111111,B00000001,B11110000,B00000111,B11111111,B00000000, + B00000011,B11101111,B11111111,B10111110,B00000000,B00001111,B11111100,B00111111,B11111111,B00011111,B11111110,B00000001,B11110000,B00000000,B01111111,B00000000, + B00000001,B11101111,B11111111,B10111100,B00000000,B00001111,B10000000,B00111111,B11111111,B00011111,B00111110,B00000001,B11110000,B00011000,B00011111,B00000000, + B00000000,B11101111,B11111111,B10111000,B00000000,B00001111,B10000000,B00111111,B11111111,B00011111,B00111111,B00000001,B11110000,B00011110,B00111111,B01111100, + B00000000,B01101111,B11111111,B10110000,B00000000,B00001111,B10000000,B01111111,B11111111,B10011111,B00111111,B00000001,B11110000,B00111111,B11111111,B01111100, + B00000000,B00101111,B11111111,B10100000,B00000000,B00001111,B10000000,B01111111,B11111111,B10011111,B00011111,B10000001,B11110000,B01111111,B11111110,B01111100, + B00000000,B00001111,B11111111,B10000000,B00000000,B00001111,B10000000,B01111100,B00001111,B10011111,B00011111,B10000001,B11110000,B00111111,B11111110,B01111100, + B00000000,B00001111,B11111111,B10000000,B00000000,B00001111,B10000000,B11111100,B00001111,B11011111,B00001111,B11000001,B11110000,B00001111,B11111000,B01111100, + B00000000,B00000111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/example_configurations/Malyan/M150/Configuration.h b/Marlin/src/config/examples/Malyan/M150/Configuration.h similarity index 95% rename from Marlin/example_configurations/Malyan/M150/Configuration.h rename to Marlin/src/config/examples/Malyan/M150/Configuration.h index 2376cf9c8e..792f512dba 100644 --- a/Marlin/example_configurations/Malyan/M150/Configuration.h +++ b/Marlin/src/config/examples/Malyan/M150/Configuration.h @@ -42,7 +42,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -64,14 +64,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -106,12 +106,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -527,6 +536,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -541,6 +563,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -620,15 +659,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -824,9 +862,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -907,6 +942,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1366,11 +1402,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1510,6 +1546,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1742,6 +1784,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Malyan/M150/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Malyan/M150/Configuration_adv.h rename to Marlin/src/config/examples/Malyan/M150/Configuration_adv.h index 797a24ebc9..7451a2b8fc 100644 --- a/Marlin/example_configurations/Malyan/M150/Configuration_adv.h +++ b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Malyan/M150/README.md b/Marlin/src/config/examples/Malyan/M150/README.md similarity index 96% rename from Marlin/example_configurations/Malyan/M150/README.md rename to Marlin/src/config/examples/Malyan/M150/README.md index 6183603e05..44c308de22 100644 --- a/Marlin/example_configurations/Malyan/M150/README.md +++ b/Marlin/src/config/examples/Malyan/M150/README.md @@ -39,7 +39,7 @@ Config without automatic bed level sensor, or in other words, "as stock" 1. Configure Marlin * Copy `_Bootscreen.h`, `Configuration.h`, and `Configuration_adv.h` - from `Marlin/example_configurations/Malyan/M150` to `Marlin` + from `Marlin/config/examples/Malyan/M150` to `Marlin` (overwrite files) * Read `Configuration.h` and make any necessary changes diff --git a/Marlin/example_configurations/Malyan/M150/_Bootscreen.h b/Marlin/src/config/examples/Malyan/M150/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/Malyan/M150/_Bootscreen.h rename to Marlin/src/config/examples/Malyan/M150/_Bootscreen.h diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration.h b/Marlin/src/config/examples/Malyan/M200/Configuration.h new file mode 100644 index 0000000000..105992ee74 --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M200/Configuration.h @@ -0,0 +1,1927 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(xC0000005, Malyan M200 build)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 500000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 11 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 11 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 100 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 26.15 + #define DEFAULT_Ki 2.74 + #define DEFAULT_Kd 62.35 + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 231.09 + #define DEFAULT_bedKi 45.21 + #define DEFAULT_bedKd 295.34 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 93, 93, 1097.5, 97 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X true +#define DISABLE_Y true +#define DISABLE_Z true +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h new file mode 100644 index 0000000000..ef015ba974 --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h @@ -0,0 +1,1703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/Micromake/C1/README.md b/Marlin/src/config/examples/Micromake/C1/README.md similarity index 100% rename from Marlin/example_configurations/Micromake/C1/README.md rename to Marlin/src/config/examples/Micromake/C1/README.md diff --git a/Marlin/example_configurations/Micromake/C1/basic/Configuration.h b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h similarity index 95% rename from Marlin/example_configurations/Micromake/C1/basic/Configuration.h rename to Marlin/src/config/examples/Micromake/C1/basic/Configuration.h index 28d7e823aa..4ddb93c90d 100644 --- a/Marlin/example_configurations/Micromake/C1/basic/Configuration.h +++ b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -604,15 +643,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -804,9 +842,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -887,6 +922,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1342,11 +1378,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1486,6 +1522,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1718,6 +1760,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h similarity index 95% rename from Marlin/example_configurations/Micromake/C1/enhanced/Configuration.h rename to Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h index 47ee178f64..4335127a21 100644 --- a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration.h +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -604,15 +643,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -804,9 +842,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -887,6 +922,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1342,11 +1378,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1486,6 +1522,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1718,6 +1760,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h rename to Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h index bc8fcee0ee..f7a906139c 100644 --- a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt b/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt new file mode 100644 index 0000000000..1ec5e7fd7a --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt @@ -0,0 +1,38 @@ +The MKS products (all?) have the EXP1 & EXP2 LCD connectors rotated 180 degrees from the ones on the RepRap LCD controllers. + +In order to attach the RepRap Discount Full Graphic Smart Controller you'll need to do something like one of the following for both EXP1 & EXP2: + a. On one end only, shave the keying plug off the cables and plug the cables in backwards. + b. On one end only, carefully pry the housings off the board, rotate them 180 degrees and press them back onto the pins. + c. Make custom cables where one connector is rotated 180 degrees. + + MKS: 1 2 3 4 5 6 7 8 9 10 + RepRap: 10 9 8 7 6 5 4 3 2 1 + + +///////////////////////////////////////////////////////////////////// + +3 DEC 2017 + +The current Marlin 2.0.x firmware cannot properly access some of the pins on the EXP2 connector. In order to use the RepRap Discount Full Graphic Smart Controller you'll need a custom cable that gets three of the signals from a different connector. In that cable move the pin/wire that: + + used to go to P0.8 to J8-3 + " " " " P0.7 to J8-2 + " " " " P0.5 to J8-4 + +If pins different than the J8 ones above are used then the spi_pins.h file will need to be modified. + +An octopus cable something like the Adafruit 1199 will simply the construction of the custom cable. Just plug the Adafruit 1199 into one of the cables that came with the LCD and the individual pins into J8 and EXP2 as needed. + +Adafruit 10-pin IDC Socket Rainbow Breakout Cable [1199] + https://www.adafruit.com/product/1199 + + +///////////////////////////////////////////////////////////////////// + +27 APR 2018 + +If you also want a functional SD_DETECT_PIN then you'll need to also move the following pin: + + used to go to P0.27 to J8-5 + +if you decide to use a different pin then the pins_MKS_SBASE.h file will need to be modified. diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration.h b/Marlin/src/config/examples/Mks/Sbase/Configuration.h new file mode 100644 index 0000000000..72c5f624a8 --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration.h @@ -0,0 +1,1928 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_SBASE +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. +#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 32 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 5 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 213 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops curtail movement above maximum coordinate bounds +//#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h new file mode 100644 index 0000000000..b87d2b61b9 --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h @@ -0,0 +1,1711 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 6 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 110 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 4 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 100 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro +#define DIGIPOT_I2C + +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) // Default to settings in pins_XXXX.h files + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 5 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.2, 1.2, 1.2, 1.2, 1.2 } // MKS SBASE: 5 + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + + // VIKI2 and miniVIKI require DOGLCD_SCK and DOGLCD_MOSI to be defined. + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + #endif + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 4 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/RepRapPro/Huxley/Configuration.h b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h similarity index 96% rename from Marlin/example_configurations/RepRapPro/Huxley/Configuration.h rename to Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h index e6877d0b1b..2f3764d99e 100644 --- a/Marlin/example_configurations/RepRapPro/Huxley/Configuration.h +++ b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -640,15 +679,14 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -840,9 +878,6 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -932,6 +967,7 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1387,11 +1423,11 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1531,6 +1567,12 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1763,6 +1805,12 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h similarity index 95% rename from Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h rename to Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h index c7b6e9e5d0..4a337333d8 100644 --- a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h +++ b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/RigidBot/Configuration.h b/Marlin/src/config/examples/RigidBot/Configuration.h similarity index 95% rename from Marlin/example_configurations/RigidBot/Configuration.h rename to Marlin/src/config/examples/RigidBot/Configuration.h index 97e9aff1f2..96203ea78a 100644 --- a/Marlin/example_configurations/RigidBot/Configuration.h +++ b/Marlin/src/config/examples/RigidBot/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -515,6 +524,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -528,6 +550,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -598,15 +637,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -798,9 +836,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -881,6 +916,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1336,11 +1372,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1480,6 +1516,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/RigidBot/Configuration_adv.h b/Marlin/src/config/examples/RigidBot/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/RigidBot/Configuration_adv.h rename to Marlin/src/config/examples/RigidBot/Configuration_adv.h index e0eb35fc8a..215fd16ab5 100644 --- a/Marlin/example_configurations/RigidBot/Configuration_adv.h +++ b/Marlin/src/config/examples/RigidBot/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/SCARA/Configuration.h b/Marlin/src/config/examples/SCARA/Configuration.h similarity index 95% rename from Marlin/example_configurations/SCARA/Configuration.h rename to Marlin/src/config/examples/SCARA/Configuration.h index ef928d5e0d..956df12e33 100644 --- a/Marlin/example_configurations/SCARA/Configuration.h +++ b/Marlin/src/config/examples/SCARA/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -132,12 +132,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -512,26 +521,39 @@ // Specify here all the endstop connectors that are connected to any endstop or probe. // Almost all printers will be using one per axis. Probes will use one or more of the // extra connectors. Leave undefined any used for non-endstop and non-probe purposes. -//#define USE_XMIN_PLUG -//#define USE_YMIN_PLUG +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG #define USE_ZMIN_PLUG -#define USE_XMAX_PLUG -#define USE_YMAX_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG //#define USE_ZMAX_PLUG // Enable pullup for all endstops to prevent a floating state //#define ENDSTOPPULLUPS #if DISABLED(ENDSTOPPULLUPS) // Disable ENDSTOPPULLUPS to set pullups individually - #define ENDSTOPPULLUP_XMAX - #define ENDSTOPPULLUP_YMAX - //#define ENDSTOPPULLUP_ZMAX // open pin, inverted - //#define ENDSTOPPULLUP_XMIN // open pin, inverted - //#define ENDSTOPPULLUP_YMIN // open pin, inverted - #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX // open pin, inverted + #define ENDSTOPPULLUP_XMIN // open pin, inverted + #define ENDSTOPPULLUP_YMIN // open pin, inverted + //#define ENDSTOPPULLUP_ZMIN //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -545,6 +567,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -613,15 +652,14 @@ #define DEFAULT_EJERK 3.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -813,9 +851,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -896,6 +931,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1351,11 +1387,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1495,6 +1531,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1727,6 +1769,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/src/config/examples/SCARA/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/SCARA/Configuration_adv.h rename to Marlin/src/config/examples/SCARA/Configuration_adv.h index b2195b2386..225bcdfd1f 100644 --- a/Marlin/example_configurations/SCARA/Configuration_adv.h +++ b/Marlin/src/config/examples/SCARA/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/src/config/examples/STM32F10/Configuration.h b/Marlin/src/config/examples/STM32F10/Configuration.h new file mode 100644 index 0000000000..f96e34dc30 --- /dev/null +++ b/Marlin/src/config/examples/STM32F10/Configuration.h @@ -0,0 +1,1930 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION "STM32F103RET6 board" // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F1R +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CTC i3 Pro B" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#warning temp_sensor set to 998/999 (fake) +#define TEMP_SENSOR_0 999 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 998 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 60 +#define DUMMY_THERMISTOR_999_VALUE 205 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 180 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#warning "disabled temperature protection" +//#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +//#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 13.0 +#define DEFAULT_YJERK 13.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/STM32F4/Configuration.h b/Marlin/src/config/examples/STM32F4/Configuration.h new file mode 100644 index 0000000000..b6971ab744 --- /dev/null +++ b/Marlin/src/config/examples/STM32F4/Configuration.h @@ -0,0 +1,1928 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +////#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F4 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/example_configurations/Sanguinololu/Configuration.h b/Marlin/src/config/examples/Sanguinololu/Configuration.h similarity index 95% rename from Marlin/example_configurations/Sanguinololu/Configuration.h rename to Marlin/src/config/examples/Sanguinololu/Configuration.h index cd049b519d..791aae3f86 100644 --- a/Marlin/example_configurations/Sanguinololu/Configuration.h +++ b/Marlin/src/config/examples/Sanguinololu/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -631,15 +670,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -831,9 +869,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -914,6 +949,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1369,11 +1405,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1513,6 +1549,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1745,6 +1787,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Sanguinololu/Configuration_adv.h b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Sanguinololu/Configuration_adv.h rename to Marlin/src/config/examples/Sanguinololu/Configuration_adv.h index 15d6e76a92..3bda74ce4d 100644 --- a/Marlin/example_configurations/Sanguinololu/Configuration_adv.h +++ b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/src/config/examples/TheBorg/Configuration.h b/Marlin/src/config/examples/TheBorg/Configuration.h new file mode 100644 index 0000000000..93dfeb0c6e --- /dev/null +++ b/Marlin/src/config/examples/TheBorg/Configuration.h @@ -0,0 +1,1928 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Spawn32, The_Borg)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 5 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_THE_BORG +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 18.21 + #define DEFAULT_Ki 1.42 + #define DEFAULT_Kd 58.34 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 554.16 + #define DEFAULT_bedKi 64.07 + #define DEFAULT_bedKd 1198.25 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 32 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 5 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.3 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 1 +#define Y_ENABLE_ON 1 +#define Z_ENABLE_ON 1 +#define E_ENABLE_ON 1 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 213 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/TheBorg/Configuration_adv.h b/Marlin/src/config/examples/TheBorg/Configuration_adv.h new file mode 100644 index 0000000000..9a064958fb --- /dev/null +++ b/Marlin/src/config/examples/TheBorg/Configuration_adv.h @@ -0,0 +1,1704 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 6 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 100 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +//#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +#define HAVE_TMC26X + +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + #define X_IS_TMC26X + //#define X2_IS_TMC26X + #define Y_IS_TMC26X + //#define Y2_IS_TMC26X + #define Z_IS_TMC26X + #define Z2_IS_TMC26X + #define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1200 // in mA + #define X_SENSE_RESISTOR 50 // in mOhms + #define X_MICROSTEPS 32 // number of microsteps + + #define X2_MAX_CURRENT 1200 + #define X2_SENSE_RESISTOR 50 + #define X2_MICROSTEPS 32 + + #define Y_MAX_CURRENT 1200 + #define Y_SENSE_RESISTOR 50 + #define Y_MICROSTEPS 32 + + #define Y2_MAX_CURRENT 1200 + #define Y2_SENSE_RESISTOR 50 + #define Y2_MICROSTEPS 32 + + #define Z_MAX_CURRENT 1200 + #define Z_SENSE_RESISTOR 50 + #define Z_MICROSTEPS 32 + + #define Z2_MAX_CURRENT 1200 + #define Z2_SENSE_RESISTOR 50 + #define Z2_MICROSTEPS 32 + + #define E0_MAX_CURRENT 1200 + #define E0_SENSE_RESISTOR 50 + #define E0_MICROSTEPS 32 + + #define E1_MAX_CURRENT 1200 + #define E1_SENSE_RESISTOR 50 + #define E1_MICROSTEPS 32 + + #define E2_MAX_CURRENT 1200 + #define E2_SENSE_RESISTOR 50 + #define E2_MICROSTEPS 32 + + #define E3_MAX_CURRENT 1200 + #define E3_SENSE_RESISTOR 50 + #define E3_MICROSTEPS 32 + + #define E4_MAX_CURRENT 1200 + #define E4_SENSE_RESISTOR 50 + #define E4_MICROSTEPS 32 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/TinyBoy2/Configuration.h b/Marlin/src/config/examples/TinyBoy2/Configuration.h similarity index 95% rename from Marlin/example_configurations/TinyBoy2/Configuration.h rename to Marlin/src/config/examples/TinyBoy2/Configuration.h index 80c8224024..bb937c67b7 100644 --- a/Marlin/example_configurations/TinyBoy2/Configuration.h +++ b/Marlin/src/config/examples/TinyBoy2/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 /** * Sample configuration file for TinyBoy2 L10/L16 @@ -75,14 +75,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -117,12 +117,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -570,6 +579,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -583,6 +605,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. #define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -651,15 +690,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -851,9 +889,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba steppers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -939,6 +974,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1394,11 +1430,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1538,6 +1574,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1770,6 +1812,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/TinyBoy2/Configuration_adv.h b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/TinyBoy2/Configuration_adv.h rename to Marlin/src/config/examples/TinyBoy2/Configuration_adv.h index 1f33e81741..eae3b9aed5 100644 --- a/Marlin/example_configurations/TinyBoy2/Configuration_adv.h +++ b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Tronxy/X1/Configuration.h b/Marlin/src/config/examples/Tronxy/X1/Configuration.h similarity index 95% rename from Marlin/example_configurations/Tronxy/X1/Configuration.h rename to Marlin/src/config/examples/Tronxy/X1/Configuration.h index 727a3e2f14..cafc48dbe9 100644 --- a/Marlin/example_configurations/Tronxy/X1/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/X1/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Tronxy/X5S/Configuration.h b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h similarity index 95% rename from Marlin/example_configurations/Tronxy/X5S/Configuration.h rename to Marlin/src/config/examples/Tronxy/X5S/Configuration.h index 967acbf777..44ba239360 100644 --- a/Marlin/example_configurations/Tronxy/X5S/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Tronxy/XY100/Configuration.h b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h similarity index 95% rename from Marlin/example_configurations/Tronxy/XY100/Configuration.h rename to Marlin/src/config/examples/Tronxy/XY100/Configuration.h index a709790530..0fa57cd306 100644 --- a/Marlin/example_configurations/Tronxy/XY100/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -530,6 +539,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -543,6 +565,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -611,15 +650,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -811,9 +849,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -894,6 +929,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1349,11 +1385,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1493,6 +1529,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1725,6 +1767,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h new file mode 100644 index 0000000000..09d6bbd453 --- /dev/null +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h @@ -0,0 +1,1928 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ARCHIM2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h new file mode 100644 index 0000000000..2b9b4b15f6 --- /dev/null +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h @@ -0,0 +1,1703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge + //#define JUNCTION_DEVIATION_INCLUDE_E +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +//#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * Enable this section if you have TMC26X motor drivers. + * You will need to import the TMC26XStepper library into the Arduino IDE for this + * (https://github.com/trinamic/TMC26XStepper.git) + */ +//#define HAVE_TMC26X +#if ENABLED(HAVE_TMC26X) // Choose your axes here. This is mandatory! + //#define X_IS_TMC26X + //#define X2_IS_TMC26X + //#define Y_IS_TMC26X + //#define Y2_IS_TMC26X + //#define Z_IS_TMC26X + //#define Z2_IS_TMC26X + //#define E0_IS_TMC26X + //#define E1_IS_TMC26X + //#define E2_IS_TMC26X + //#define E3_IS_TMC26X + //#define E4_IS_TMC26X + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif + +// @section tmc_smart + +/** + * Enable this for SilentStepStick Trinamic TMC2130 SPI-configurable stepper drivers. + * + * You'll also need the TMC2130Stepper Arduino library + * (https://github.com/teemuatlut/TMC2130Stepper). + * + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + */ +//#define HAVE_TMC2130 +#if ENABLED(HAVE_TMC2130) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2130 + //#define X2_IS_TMC2130 + //#define Y_IS_TMC2130 + //#define Y2_IS_TMC2130 + //#define Z_IS_TMC2130 + //#define Z2_IS_TMC2130 + //#define E0_IS_TMC2130 + //#define E1_IS_TMC2130 + //#define E2_IS_TMC2130 + //#define E3_IS_TMC2130 + //#define E4_IS_TMC2130 +#endif + +/** + * Enable this for SilentStepStick Trinamic TMC2208 UART-configurable stepper drivers. + * Connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * You'll also need the TMC2208Stepper Arduino library + * (https://github.com/teemuatlut/TMC2208Stepper). + */ +//#define HAVE_TMC2208 +#if ENABLED(HAVE_TMC2208) // Choose your axes here. This is mandatory! + //#define X_IS_TMC2208 + //#define X2_IS_TMC2208 + //#define Y_IS_TMC2208 + //#define Y2_IS_TMC2208 + //#define Z_IS_TMC2208 + //#define Z2_IS_TMC2208 + //#define E0_IS_TMC2208 + //#define E1_IS_TMC2208 + //#define E2_IS_TMC2208 + //#define E3_IS_TMC2208 + //#define E4_IS_TMC2208 +#endif + +#if ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * Enable this section if you have L6470 motor drivers. + * You need to import the L6470 library into the Arduino IDE for this. + * (https://github.com/ameyer/Arduino-L6470) + */ + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + //#define X2_IS_L6470 + //#define Y_IS_L6470 + //#define Y2_IS_L6470 + //#define Z_IS_L6470 + //#define Z2_IS_L6470 + //#define E0_IS_L6470 + //#define E1_IS_L6470 + //#define E2_IS_L6470 + //#define E3_IS_L6470 + //#define E4_IS_L6470 + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip, which can be used as a status + * display. Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * + * Fully assembled MAX7219 boards can be found on the internet for under $2(US). + * For example, see https://www.ebay.com/sch/i.html?_nkw=332349290049 + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 // 77 on Re-ARM // Configuration of the 3 pins to control the display + #define MAX7219_DIN_PIN 57 // 78 on Re-ARM + #define MAX7219_LOAD_PIN 44 // 79 on Re-ARM + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_STEPPER_HEAD 3 // Show the stepper queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_STEPPER_TAIL 5 // Show the stepper queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_STEPPER_QUEUE 0 // Show the current stepper queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/Velleman/K8200/Configuration.h b/Marlin/src/config/examples/Velleman/K8200/Configuration.h similarity index 95% rename from Marlin/example_configurations/Velleman/K8200/Configuration.h rename to Marlin/src/config/examples/Velleman/K8200/Configuration.h index 3a0d92b0ef..745733b1dc 100644 --- a/Marlin/example_configurations/Velleman/K8200/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 /** * Sample configuration file for Vellemann K8200 @@ -75,14 +75,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -117,12 +117,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -549,6 +558,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -562,6 +584,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -629,15 +668,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -829,9 +867,6 @@ #define INVERT_Y_DIR false // K8200: false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -913,6 +948,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1371,11 +1407,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1515,6 +1551,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1747,6 +1789,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h similarity index 96% rename from Marlin/example_configurations/Velleman/K8200/Configuration_adv.h rename to Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h index 8d31733199..26295c1e65 100644 --- a/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h @@ -41,7 +41,7 @@ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -449,12 +449,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -496,7 +504,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -777,6 +785,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -803,11 +835,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Velleman/K8200/README.md b/Marlin/src/config/examples/Velleman/K8200/README.md similarity index 100% rename from Marlin/example_configurations/Velleman/K8200/README.md rename to Marlin/src/config/examples/Velleman/K8200/README.md diff --git a/Marlin/example_configurations/Velleman/K8400/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Configuration.h similarity index 95% rename from Marlin/example_configurations/Velleman/K8400/Configuration.h rename to Marlin/src/config/examples/Velleman/K8400/Configuration.h index c6bedf5b59..794d215a7a 100644 --- a/Marlin/example_configurations/Velleman/K8400/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 20.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -835,7 +870,7 @@ // Travel limits (mm) after homing, corresponding to endstop positions. #define X_MIN_POS 0 -#define Y_MIN_POS 20 +#define Y_MIN_POS 0 #define Z_MIN_POS 0 #define X_MAX_POS X_BED_SIZE #define Y_MAX_POS Y_BED_SIZE @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Velleman/K8400/Configuration_adv.h rename to Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h index 4743d8b9a3..848e57846c 100644 --- a/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/Velleman/K8400/Dual-head/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h similarity index 95% rename from Marlin/example_configurations/Velleman/K8400/Dual-head/Configuration.h rename to Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h index 4d27d1c95b..5eaffedfe9 100644 --- a/Marlin/example_configurations/Velleman/K8400/Dual-head/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 20.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1714,6 +1756,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Velleman/K8400/README.md b/Marlin/src/config/examples/Velleman/K8400/README.md similarity index 100% rename from Marlin/example_configurations/Velleman/K8400/README.md rename to Marlin/src/config/examples/Velleman/K8400/README.md diff --git a/Marlin/example_configurations/Wanhao/Duplicator 6/Configuration.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h similarity index 95% rename from Marlin/example_configurations/Wanhao/Duplicator 6/Configuration.h rename to Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h index cebe02cf42..ed48e0d00b 100644 --- a/Marlin/example_configurations/Wanhao/Duplicator 6/Configuration.h +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -529,6 +538,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -542,6 +564,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -610,15 +649,14 @@ #define DEFAULT_EJERK 1.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -810,9 +848,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -893,6 +928,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1348,11 +1384,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1492,6 +1528,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1522,12 +1564,6 @@ // //#define RIGIDBOT_PANEL -// -// RigidBot Panel V1.0 -// http://www.inventapart.com/ -// -//#define RIGIDBOT_PANEL - // // Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller // https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html @@ -1733,6 +1769,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/Wanhao/Duplicator 6/Configuration_adv.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/Wanhao/Duplicator 6/Configuration_adv.h rename to Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h index b2a81b4733..dd4471ffa5 100644 --- a/Marlin/example_configurations/Wanhao/Duplicator 6/Configuration_adv.h +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/adafruit/ST7565/Configuration.h b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h similarity index 95% rename from Marlin/example_configurations/adafruit/ST7565/Configuration.h rename to Marlin/src/config/examples/adafruit/ST7565/Configuration.h index c5f5d9accb..63bb6fbf85 100644 --- a/Marlin/example_configurations/adafruit/ST7565/Configuration.h +++ b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -519,6 +528,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -532,6 +554,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -600,15 +639,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -800,9 +838,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -883,6 +918,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1338,11 +1374,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1482,6 +1518,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1720,6 +1762,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration.h rename to Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h index bb07ef2684..10084ef040 100644 --- a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -592,6 +601,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -605,6 +627,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -682,15 +721,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -932,9 +970,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1015,6 +1050,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1134,17 +1170,6 @@ #endif -#elif ENABLED(AUTO_BED_LEVELING_3POINT) - - // 3 arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - //#define PROBE_PT_1_X 15 - //#define PROBE_PT_1_Y 180 - //#define PROBE_PT_2_X 15 - //#define PROBE_PT_2_Y 20 - //#define PROBE_PT_3_X 170 - //#define PROBE_PT_3_Y 20 - #elif ENABLED(AUTO_BED_LEVELING_UBL) //=========================================================================== @@ -1157,13 +1182,6 @@ #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X - //#define PROBE_PT_1_X 15 - //#define PROBE_PT_1_Y 180 - //#define PROBE_PT_2_X 15 - //#define PROBE_PT_2_Y 20 - //#define PROBE_PT_3_X 170 - //#define PROBE_PT_3_Y 20 - #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 @@ -1379,7 +1397,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1488,11 +1506,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1633,6 +1651,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1865,6 +1889,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h rename to Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h index 4ac3278812..96b9642429 100644 --- a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/FLSUN/kossel/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/FLSUN/kossel/Configuration.h rename to Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h index 4a56054fb5..82ab7866dc 100644 --- a/Marlin/example_configurations/delta/FLSUN/kossel/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -592,6 +601,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -605,6 +627,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -682,15 +721,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -931,9 +969,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1014,6 +1049,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1360,7 +1396,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1469,11 +1505,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1614,6 +1650,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1846,6 +1888,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/FLSUN/kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/FLSUN/kossel/Configuration_adv.h rename to Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h index 8ea1d74088..200d99d4d5 100644 --- a/Marlin/example_configurations/delta/FLSUN/kossel/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration.h rename to Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h index 44f009277c..c95791a122 100644 --- a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -592,6 +601,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -605,6 +627,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -682,15 +721,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -931,9 +969,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1014,6 +1049,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1360,7 +1396,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1469,11 +1505,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1613,6 +1649,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1845,6 +1887,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h rename to Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h index 0774e76e9f..1538174b1f 100644 --- a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/Hatchbox_Alpha/Configuration.h b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/Hatchbox_Alpha/Configuration.h rename to Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h index 0c99fb7e2e..52429cb741 100644 --- a/Marlin/example_configurations/delta/Hatchbox_Alpha/Configuration.h +++ b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h @@ -42,7 +42,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -64,14 +64,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -106,12 +106,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -597,6 +606,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -610,6 +632,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -687,15 +726,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -934,9 +972,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1017,6 +1052,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1363,7 +1399,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1472,11 +1508,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1616,6 +1652,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1848,6 +1890,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/generic/Configuration.h b/Marlin/src/config/examples/delta/generic/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/generic/Configuration.h rename to Marlin/src/config/examples/delta/generic/Configuration.h index 59e7c20405..863ab7b3aa 100644 --- a/Marlin/example_configurations/delta/generic/Configuration.h +++ b/Marlin/src/config/examples/delta/generic/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -582,6 +591,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -595,6 +617,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -672,15 +711,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -919,9 +957,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1002,6 +1037,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1348,7 +1384,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1457,11 +1493,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1601,6 +1637,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1833,6 +1875,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/generic/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h rename to Marlin/src/config/examples/delta/generic/Configuration_adv.h index 0774e76e9f..1538174b1f 100644 --- a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/generic/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/kossel_mini/Configuration.h rename to Marlin/src/config/examples/delta/kossel_mini/Configuration.h index c776ab15b2..b0a8155ee1 100644 --- a/Marlin/example_configurations/delta/kossel_mini/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -582,6 +591,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -595,6 +617,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -672,15 +711,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -921,9 +959,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1004,6 +1039,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1350,7 +1386,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1459,11 +1495,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1603,6 +1639,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1835,6 +1877,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/generic/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/generic/Configuration_adv.h rename to Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h index 0774e76e9f..1538174b1f 100644 --- a/Marlin/example_configurations/delta/generic/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/kossel_pro/Configuration.h rename to Marlin/src/config/examples/delta/kossel_pro/Configuration.h index bb02926bdf..1a5190c129 100644 --- a/Marlin/example_configurations/delta/kossel_pro/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h @@ -41,7 +41,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -63,14 +63,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -105,12 +105,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -568,6 +577,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -581,6 +603,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -665,15 +704,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -922,9 +960,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1005,6 +1040,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1351,7 +1387,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1460,11 +1496,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1604,6 +1640,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1836,6 +1878,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h rename to Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h index 64fe007078..c9f9667bd5 100644 --- a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -213,10 +213,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -443,12 +453,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -490,7 +508,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -771,6 +789,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -797,11 +839,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/kossel_pro/README.md b/Marlin/src/config/examples/delta/kossel_pro/README.md similarity index 100% rename from Marlin/example_configurations/delta/kossel_pro/README.md rename to Marlin/src/config/examples/delta/kossel_pro/README.md diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h similarity index 96% rename from Marlin/example_configurations/delta/kossel_xl/Configuration.h rename to Marlin/src/config/examples/delta/kossel_xl/Configuration.h index 0ab445f901..0d742089b2 100644 --- a/Marlin/example_configurations/delta/kossel_xl/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -586,6 +595,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -599,6 +621,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -675,15 +714,14 @@ #define DEFAULT_EJERK 20.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -922,9 +960,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -1005,6 +1040,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1351,7 +1387,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z } - #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif @@ -1460,11 +1496,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1604,6 +1640,12 @@ // #define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1836,6 +1878,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h rename to Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h index 81bf8e765f..8ca6fab818 100644 --- a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -438,12 +448,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -485,7 +503,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -766,6 +784,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -792,11 +834,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/delta/kossel_xl/README.md b/Marlin/src/config/examples/delta/kossel_xl/README.md similarity index 100% rename from Marlin/example_configurations/delta/kossel_xl/README.md rename to Marlin/src/config/examples/delta/kossel_xl/README.md diff --git a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h similarity index 95% rename from Marlin/example_configurations/gCreate/gMax1.5+/Configuration.h rename to Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h index 16daa74bd6..2617c6f754 100644 --- a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration.h +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -532,6 +541,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -545,6 +567,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. #define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -613,15 +652,14 @@ #define DEFAULT_EJERK 4.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -813,9 +851,6 @@ #define INVERT_Y_DIR true #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -897,6 +932,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1352,11 +1388,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1496,6 +1532,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1728,6 +1770,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h rename to Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h index ae85123273..7db4b97d56 100644 --- a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/example_configurations/gCreate/gMax1.5+/_Bootscreen.h b/Marlin/src/config/examples/gCreate/gMax1.5+/_Bootscreen.h similarity index 100% rename from Marlin/example_configurations/gCreate/gMax1.5+/_Bootscreen.h rename to Marlin/src/config/examples/gCreate/gMax1.5+/_Bootscreen.h diff --git a/Marlin/example_configurations/makibox/Configuration.h b/Marlin/src/config/examples/makibox/Configuration.h similarity index 95% rename from Marlin/example_configurations/makibox/Configuration.h rename to Marlin/src/config/examples/makibox/Configuration.h index 80c33873d7..5f1e4d8e86 100644 --- a/Marlin/example_configurations/makibox/Configuration.h +++ b/Marlin/src/config/examples/makibox/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -522,6 +531,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. @@ -535,6 +557,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -603,15 +642,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -803,9 +841,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -886,6 +921,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1341,11 +1377,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1485,6 +1521,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1717,6 +1759,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/src/config/examples/makibox/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/makibox/Configuration_adv.h rename to Marlin/src/config/examples/makibox/Configuration_adv.h index b41ae0c888..5da1710faf 100644 --- a/Marlin/example_configurations/makibox/Configuration_adv.h +++ b/Marlin/src/config/examples/makibox/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 4 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 4 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.7, 1.7, 1.7, 1.7 } // 5DPRINT @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,11 +832,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/src/config/examples/stm32f103ret6/Configuration.h b/Marlin/src/config/examples/stm32f103ret6/Configuration.h new file mode 100644 index 0000000000..a50e53b03d --- /dev/null +++ b/Marlin/src/config/examples/stm32f103ret6/Configuration.h @@ -0,0 +1,1930 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION "STM32F103RET6 board" // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respecfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F1R +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CTC i3 Pro B" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 3 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#warning temp_sensor set to 998/999 (fake) +#define TEMP_SENSOR_0 999 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 998 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 60 +#define DUMMY_THERMISTOR_999_VALUE 205 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 180 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#warning "disabled temperature protection" +//#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +//#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 13.0 +#define DEFAULT_YJERK 13.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, + * tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// This requires SDSUPPORT to be enabled +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOFSET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h similarity index 95% rename from Marlin/example_configurations/tvrrug/Round2/Configuration.h rename to Marlin/src/config/examples/tvrrug/Round2/Configuration.h index bff076d74c..5b202d729d 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration.h +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -508,6 +517,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -521,6 +543,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -595,15 +634,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -795,9 +833,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR true -// Enable this option for Toshiba stepper drivers -#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -878,6 +913,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1333,11 +1369,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1477,6 +1513,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1709,6 +1751,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h rename to Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h index 54b69487d6..41d2d80237 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -483,7 +501,7 @@ #endif //#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO @@ -764,6 +782,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -790,10 +832,27 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers -#define MINIMUM_STEPPER_PULSE 2 +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ +#define MINIMUM_STEPPER_PULSE 30 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 15000 // @section temperature diff --git a/Marlin/example_configurations/wt150/Configuration.h b/Marlin/src/config/examples/wt150/Configuration.h similarity index 95% rename from Marlin/example_configurations/wt150/Configuration.h rename to Marlin/src/config/examples/wt150/Configuration.h index e2b840d3cd..c3f1878b26 100644 --- a/Marlin/example_configurations/wt150/Configuration.h +++ b/Marlin/src/config/examples/wt150/Configuration.h @@ -37,7 +37,7 @@ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H -#define CONFIGURATION_H_VERSION 010109 +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -59,14 +59,14 @@ //============================= DELTA Printer =============================== //=========================================================================== // For a Delta printer start with one of the configuration files in the -// example_configurations/delta directory and customize for your machine. +// config/examples/delta directory and customize for your machine. // //=========================================================================== //============================= SCARA Printer =============================== //=========================================================================== // For a SCARA printer start with the configuration files in -// example_configurations/SCARA and customize for your machine. +// config/examples/SCARA and customize for your machine. // // @section info @@ -101,12 +101,21 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port 0 is always used by the Arduino bootloader regardless of this setting. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * - * :[0, 1, 2, 3, 4, 5, 6, 7] + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ #define SERIAL_PORT 0 +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + /** * This setting determines the communication speed of the printer. * @@ -524,6 +533,19 @@ //#define ENDSTOPPULLUP_ZMIN_PROBE #endif +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. @@ -537,6 +559,23 @@ // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + //============================================================================= //============================== Movement Settings ============================ //============================================================================= @@ -605,15 +644,14 @@ #define DEFAULT_EJERK 5.0 /** - * Realtime Jerk Control + * S-Curve Acceleration * * This option eliminates vibration during printing by fitting a Bézier * curve to move acceleration, producing much smoother direction changes. - * Because this is computationally-intensive, a 32-bit MCU is required. * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define BEZIER_JERK_CONTROL +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -805,9 +843,6 @@ #define INVERT_Y_DIR false #define INVERT_Z_DIR false -// Enable this option for Toshiba stepper drivers -//#define CONFIG_STEPPERS_TOSHIBA - // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. @@ -888,6 +923,7 @@ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" #endif @@ -1343,11 +1379,11 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cn, cz, cz_utf8, de, el, el-gr, es, es_utf8, eu, fi, fr, fr_utf8, - * gl, hr, it, kana, kana_utf8, nl, pl, pt, pt_utf8, pt-br, pt-br_utf8, ru, sk_utf8, + * en, an, bg, ca, cn, cz, de, el, el-gr, es, eu, fi, fr, + * gl, hr, it, jp-kana, nl, pl, pt, pt-br, ru, sk, * tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', test':'TEST' } */ #define LCD_LANGUAGE en @@ -1487,6 +1523,12 @@ // //#define REPRAP_DISCOUNT_SMART_CONTROLLER +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + // // ULTIMAKER Controller. // @@ -1719,6 +1761,12 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + // // Silvergate GLCD controller // http://github.com/android444/Silvergate diff --git a/Marlin/example_configurations/wt150/Configuration_adv.h b/Marlin/src/config/examples/wt150/Configuration_adv.h similarity index 95% rename from Marlin/example_configurations/wt150/Configuration_adv.h rename to Marlin/src/config/examples/wt150/Configuration_adv.h index df57683770..5acd4a3e3d 100644 --- a/Marlin/example_configurations/wt150/Configuration_adv.h +++ b/Marlin/src/config/examples/wt150/Configuration_adv.h @@ -32,7 +32,7 @@ */ #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H_VERSION 010109 +#define CONFIGURATION_ADV_H_VERSION 020000 // @section temperature @@ -208,10 +208,20 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// This defines the minimal speed for the main fan, run in PWM mode -// to enable uncomment and set minimal PWM speed for reliable running (1-255) -// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ //#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 // @section extruder @@ -436,12 +446,20 @@ // //#define JUNCTION_DEVIATION #if ENABLED(JUNCTION_DEVIATION) - #define JUNCTION_DEVIATION_FACTOR 0.02 + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge //#define JUNCTION_DEVIATION_INCLUDE_E #endif +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -484,7 +502,7 @@ #endif #define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster -#define DIGIPOT_I2C_NUM_CHANNELS 5 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 +#define DIGIPOT_I2C_NUM_CHANNELS 5 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. // These correspond to the physical drivers, so be mindful if the order is changed. #define DIGIPOT_I2C_MOTOR_CURRENTS { 0.22, 0.22, 0.39, 0.42, 0.42 } // MIGHTYBOARD_REVE @@ -765,6 +783,30 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + // @section extras // @@ -791,11 +833,28 @@ // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 -// The minimum pulse width (in µs) for stepping a stepper. -// Set this if you find stepping unreliable, or if using a very fast CPU. -// 0 is OK for AVR, 0 is OK for A4989 drivers, 2 is needed for DRV8825 drivers +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + */ #define MINIMUM_STEPPER_PULSE 2 +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + */ +#define MAXIMUM_STEPPER_RATE 250000 + // @section temperature // Control heater 0 and heater 1 in parallel. diff --git a/Marlin/boards.h b/Marlin/src/core/boards.h similarity index 66% rename from Marlin/boards.h rename to Marlin/src/core/boards.h index a7aceff081..a6d1ec27e1 100644 --- a/Marlin/boards.h +++ b/Marlin/src/core/boards.h @@ -153,9 +153,79 @@ #define BOARD_BRAINWAVE 82 // Brainwave (AT90USB646) #define BOARD_BRAINWAVE_PRO 85 // Brainwave Pro (AT90USB1286) #define BOARD_SAV_MKI 83 // SAV Mk-I (AT90USB1286) -#define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) - CLI compile: HARDWARE_MOTHERBOARD=84 make +#define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) #define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board -#define MB(board) (MOTHERBOARD==BOARD_##board) +// +// LPC1768 ARM Cortex M3 +// + +#define BOARD_RAMPS_14_RE_ARM_EFB 1743 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_14_RE_ARM_EEB 1744 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_14_RE_ARM_EFF 1745 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_14_RE_ARM_EEF 1746 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_14_RE_ARM_SF 1748 // Re-ARM with RAMPS 1.4 (Power outputs: Spindle, Controller Fan) +#define BOARD_MKS_SBASE 1750 // MKS-Sbase (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_AZSMZ_MINI 1751 // AZSMZ Mini +#define BOARD_AZTEEG_X5_GT 1752 // Azteeg X5 GT (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_BIQU_BQ111_A4 1753 // BIQU BQ111-A4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_SELENA_COMPACT 1754 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) +#define BOARD_COHESION3D_REMIX 1755 // Cohesion3D ReMix +#define BOARD_COHESION3D_MINI 1756 // Cohesion3D Mini + +// +// SAM3X8E ARM Cortex M3 +// + +#define BOARD_DUE3DOM 1411 // DUE3DOM for Arduino DUE +#define BOARD_DUE3DOM_MINI 1412 // DUE3DOM MINI for Arduino DUE +#define BOARD_RADDS 1502 // RADDS +#define BOARD_RAMPS_FD_V1 1503 // RAMPS-FD v1 +#define BOARD_RAMPS_FD_V2 1504 // RAMPS-FD v2 +#define BOARD_RAMPS_SMART_EFB 1523 // RAMPS-SMART (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_SMART_EEB 1524 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_SMART_EFF 1525 // RAMPS-SMART (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_SMART_EEF 1526 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_SMART_SF 1528 // RAMPS-SMART (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_DUO_EFB 1533 // RAMPS Duo (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_DUO_EEB 1534 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_DUO_EFF 1535 // RAMPS Duo (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_DUO_EEF 1536 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_DUO_SF 1538 // RAMPS Duo (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS4DUE_EFB 1543 // RAMPS4DUE (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS4DUE_EEB 1544 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS4DUE_EFF 1545 // RAMPS4DUE (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS4DUE_EEF 1546 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS4DUE_SF 1548 // RAMPS4DUE (Power outputs: Spindle, Controller Fan) +#define BOARD_RURAMPS4D 1550 // RuRAMPS4Duo v1 (Power outputs: Hotend0, Hotend2, Hotend2, Fan0, Fan1, Bed) +#define BOARD_ULTRATRONICS_PRO 1560 // ReprapWorld Ultratronics Pro V1.0 +#define BOARD_ARCHIM2 1590 // UltiMachine Archim2 (with TMC2130 drivers) +#define BOARD_ALLIGATOR 1602 // Alligator Board R2 + +// +// STM32 ARM Cortex-M3 +// + +#define BOARD_STM32F1R 1800 // STM32R Libmaple based STM32F1 controller +#define BOARD_MALYAN_M200 1801 // STM32C8T6 Libmaple based stm32f1 controller +#define BOARD_STM3R_MINI 1803 // STM32 Libmaple based stm32f1 controller +#define BOARD_GTM32_PRO_VB 1805 // STM32f103VET6 controller + +// +// STM32 ARM Cortex-M4F +// + +#define BOARD_TEENSY35_36 841 // Teensy3.5 and Teensy3.6 +#define BOARD_BEAST 1802 // STM32FxxxVxT6 Libmaple based stm32f4 controller +#define BOARD_STM32F4 1804 // STM32 STM32GENERIC based STM32F4 controller + +// +// ARM Cortex M7 +// + +#define BOARD_THE_BORG 1860 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) + + +#define MB(board) (defined(BOARD_##board) && MOTHERBOARD==BOARD_##board) #endif // __BOARDS_H diff --git a/Marlin/src/core/enum.h b/Marlin/src/core/enum.h new file mode 100644 index 0000000000..b9581bec89 --- /dev/null +++ b/Marlin/src/core/enum.h @@ -0,0 +1,88 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __ENUM_H__ +#define __ENUM_H__ + +/** + * Axis indices as enumerated constants + * + * - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space + * - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians + * - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics + */ +enum AxisEnum : unsigned char { + X_AXIS = 0, + A_AXIS = 0, + Y_AXIS = 1, + B_AXIS = 1, + Z_AXIS = 2, + C_AXIS = 2, + E_AXIS = 3, + X_HEAD = 4, + Y_HEAD = 5, + Z_HEAD = 6, + ALL_AXES = 0xFE, + NO_AXIS = 0xFF +}; + +#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=S; VAR<=N; VAR++) +#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=S; VAR0)-(a<0)) #define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1))) -// Macros to contrain values -#define NOLESS(v,n) do{ if (v < n) v = n; }while(0) -#define NOMORE(v,n) do{ if (v > n) v = n; }while(0) +// Macros to constrain values +// Avoid double evaluation of arguments to NOMORE/NOLESS/LIMIT +#undef NOMORE +#undef NOLESS +#undef LIMIT +#ifdef __cplusplus + + // C++11 solution that is standards compliant. + template static inline constexpr void NOLESS(V& v, const N n) { + if (v < n) v = n; + } + template static inline constexpr void NOMORE(V& v, const N n) { + if (v > n) v = n; + } + template static inline constexpr void LIMIT(V& v, const N1 n1, const N2 n2) { + if (v < n1) v = n1; + else if (v > n2) v = n2; + } + +#else + + // Using GCC extensions, but Travis GCC version does not like it and gives + // "error: statement-expressions are not allowed outside functions nor in template-argument lists" + #define NOLESS(v, n) \ + do { \ + __typeof__(n) _n = (n); \ + if (v < _n) v = _n; \ + } while(0) + + #define NOMORE(v, n) \ + do { \ + __typeof__(n) _n = (n); \ + if (v > _n) v = _n; \ + } while(0) + + #define LIMIT(v, n1, n2) \ + do { \ + __typeof__(n1) _n1 = (n1); \ + __typeof__(n2) _n2 = (n2); \ + if (v < _n1) v = _n1; \ + else if (v > _n2) v = _n2; \ + } while(0) + +#endif // Macros to support option testing #define _CAT(a, ...) a ## __VA_ARGS__ @@ -159,9 +143,11 @@ #define SWITCH_ENABLED_true 1 #define SWITCH_ENABLED_0 0 #define SWITCH_ENABLED_1 1 +#define SWITCH_ENABLED_0x0 0 +#define SWITCH_ENABLED_0x1 1 #define SWITCH_ENABLED_ 1 #define ENABLED(b) _CAT(SWITCH_ENABLED_, b) -#define DISABLED(b) (!_CAT(SWITCH_ENABLED_, b)) +#define DISABLED(b) !ENABLED(b) #define WITHIN(V,L,H) ((V) >= (L) && (V) <= (H)) #define NUMERIC(a) WITHIN(a, '0', '9') @@ -170,7 +156,7 @@ #define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+') #define COUNT(a) (sizeof(a)/sizeof(*a)) #define ZERO(a) memset(a,0,sizeof(a)) -#define COPY(a,b) memcpy(a,b,min(sizeof(a),sizeof(b))) +#define COPY(a,b) memcpy(a,b,MIN(sizeof(a),sizeof(b))) // Macros for initializing arrays #define ARRAY_6(v1, v2, v3, v4, v5, v6, ...) { v1, v2, v3, v4, v5, v6 } @@ -221,12 +207,48 @@ #define CEILING(x,y) (((x) + (y) - 1) / (y)) -#define MIN3(a, b, c) min(min(a, b), c) -#define MIN4(a, b, c, d) min(MIN3(a, b, c), d) -#define MIN5(a, b, c, d, e) min(MIN4(a, b, c, d), e) -#define MAX3(a, b, c) max(max(a, b), c) -#define MAX4(a, b, c, d) max(MAX3(a, b, c), d) -#define MAX5(a, b, c, d, e) max(MAX4(a, b, c, d), e) +// Avoid double evaluation of arguments on MIN/MAX/ABS +#undef MIN +#undef MAX +#undef ABS +#ifdef __cplusplus + + // C++11 solution that is standards compliant. Return type is deduced automatically + template static inline constexpr auto MIN(const L lhs, const R rhs) -> decltype(lhs + rhs) { + return lhs < rhs ? lhs : rhs; + } + template static inline constexpr auto MAX(const L lhs, const R rhs) -> decltype(lhs + rhs){ + return lhs > rhs ? lhs : rhs; + } + template static inline constexpr const T ABS(const T v) { + return v >= 0 ? v : -v; + } +#else + + // Using GCC extensions, but Travis GCC version does not like it and gives + // "error: statement-expressions are not allowed outside functions nor in template-argument lists" + #define MIN(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a < _b ? _a : _b;}) + + #define MAX(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a > _b ? _a : _b;}) + + #define ABS(a) \ + ({__typeof__(a) _a = (a); \ + _a >= 0 ? _a : -_a;}) + +#endif + +#define MIN3(a, b, c) MIN(MIN(a, b), c) +#define MIN4(a, b, c, d) MIN(MIN3(a, b, c), d) +#define MIN5(a, b, c, d, e) MIN(MIN4(a, b, c, d), e) +#define MAX3(a, b, c) MAX(MAX(a, b), c) +#define MAX4(a, b, c, d) MAX(MAX3(a, b, c), d) +#define MAX5(a, b, c, d, e) MAX(MAX4(a, b, c, d), e) #define UNEAR_ZERO(x) ((x) < 0.000001) #define NEAR_ZERO(x) WITHIN(x, -0.000001, 0.000001) @@ -239,7 +261,6 @@ // Maths macros that can be overridden by HAL // #define ATAN2(y, x) atan2(y, x) -#define FABS(x) fabs(x) #define POW(x, y) pow(x, y) #define SQRT(x) sqrt(x) #define CEIL(x) ceil(x) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp new file mode 100644 index 0000000000..2c0dabb522 --- /dev/null +++ b/Marlin/src/core/serial.cpp @@ -0,0 +1,78 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "serial.h" + +uint8_t marlin_debug_flags = DEBUG_NONE; + +const char errormagic[] PROGMEM = "Error:"; +const char echomagic[] PROGMEM = "echo:"; + +#if NUM_SERIAL > 1 + void serialprintPGM_P(const int8_t p, const char * str) { + while (char ch = pgm_read_byte(str++)) SERIAL_CHAR_P(p, ch); + } + + void serial_echopair_PGM_P(const int8_t p, const char* s_P, const char *v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, char v) { serialprintPGM_P(p, s_P); SERIAL_CHAR_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, int v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, long v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, float v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, double v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned int v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned long v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + + void serial_spaces_P(const int8_t p, uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR_P(p, ' '); } +#endif + +void serialprintPGM(const char * str) { + while (char ch = pgm_read_byte(str++)) SERIAL_CHAR(ch); +} + +void serial_echopair_PGM(const char* s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } +void serial_echopair_PGM(const char* s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, float v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, unsigned int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } + +void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } + +#if ENABLED(DEBUG_LEVELING_FEATURE) + + void print_xyz(const char* prefix, const char* suffix, const float x, const float y, const float z) { + serialprintPGM(prefix); + SERIAL_CHAR('('); + SERIAL_ECHO(x); + SERIAL_ECHOPAIR(", ", y); + SERIAL_ECHOPAIR(", ", z); + SERIAL_CHAR(')'); + if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); + } + + void print_xyz(const char* prefix, const char* suffix, const float xyz[]) { + print_xyz(prefix, suffix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]); + } + +#endif diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h new file mode 100644 index 0000000000..1b29cfc06a --- /dev/null +++ b/Marlin/src/core/serial.h @@ -0,0 +1,245 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __SERIAL_H__ +#define __SERIAL_H__ + +#include "../inc/MarlinConfig.h" + +/** + * Define debug bit-masks + */ +enum DebugFlags : unsigned char { + DEBUG_NONE = 0, + DEBUG_ECHO = _BV(0), ///< Echo commands in order as they are processed + DEBUG_INFO = _BV(1), ///< Print messages for code that has debug output + DEBUG_ERRORS = _BV(2), ///< Not implemented + DEBUG_DRYRUN = _BV(3), ///< Ignore temperature setting and E movement commands + DEBUG_COMMUNICATION = _BV(4), ///< Not implemented + DEBUG_LEVELING = _BV(5), ///< Print detailed output for homing and leveling + DEBUG_MESH_ADJUST = _BV(6), ///< UBL bed leveling + DEBUG_ALL = 0xFF +}; + +extern uint8_t marlin_debug_flags; +#define DEBUGGING(F) (marlin_debug_flags & (DEBUG_## F)) + +extern const char echomagic[] PROGMEM; +extern const char errormagic[] PROGMEM; + +#if TX_BUFFER_SIZE < 1 + #define SERIAL_FLUSHTX_P(p) + #define SERIAL_FLUSHTX() +#endif + +#if NUM_SERIAL > 1 + #define SERIAL_CHAR_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.write(x) : MYSERIAL1.write(x)) : SERIAL_CHAR(x)) + #define SERIAL_PROTOCOL_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x) : MYSERIAL1.print(x)) : SERIAL_PROTOCOL(x)) + #define SERIAL_PROTOCOL_F_P(p,x,y) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x,y) : MYSERIAL1.print(x,y)) : SERIAL_PROTOCOL_F(x,y)) + #define SERIAL_PROTOCOLLN_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.println(x) : MYSERIAL1.println(x)) : SERIAL_PROTOCOLLN(x)) + #define SERIAL_PRINT_P(p,x,b) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x,b) : MYSERIAL1.print(x,b)) : SERIAL_PRINT(x,b)) + #define SERIAL_PRINTLN_P(p,x,b) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.println(x,b) : MYSERIAL1.println(x,b)) : SERIAL_PRINTLN(x,b)) + #define SERIAL_PRINTF_P(p,args...) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.printf(args) : MYSERIAL1.printf(args)) : SERIAL_PRINTF(args)) + + #define SERIAL_CHAR(x) (MYSERIAL0.write(x), MYSERIAL1.write(x)) + #define SERIAL_PROTOCOL(x) (MYSERIAL0.print(x), MYSERIAL1.print(x)) + #define SERIAL_PROTOCOL_F(x,y) (MYSERIAL0.print(x,y), MYSERIAL1.print(x,y)) + #define SERIAL_PROTOCOLLN(x) (MYSERIAL0.println(x), MYSERIAL1.println(x)) + #define SERIAL_PRINT(x,b) (MYSERIAL0.print(x,b), MYSERIAL1.print(x,b)) + #define SERIAL_PRINTLN(x,b) (MYSERIAL0.println(x,b), MYSERIAL1.println(x,b)) + #define SERIAL_PRINTF(args...) (MYSERIAL0.printf(args), MYSERIAL1.printf(args)) + + #define SERIAL_FLUSH_P(p) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.flush() : MYSERIAL1.flush()) : SERIAL_FLUSH()) + #define SERIAL_FLUSH() (MYSERIAL0.flush(), MYSERIAL1.flush()) + #if TX_BUFFER_SIZE > 0 + #define SERIAL_FLUSHTX_P(p) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.flushTX() : MYSERIAL1.flushTX()) : SERIAL_FLUSHTX()) + #define SERIAL_FLUSHTX() (MYSERIAL0.flushTX(), MYSERIAL1.flushTX()) + #endif + + #define SERIAL_EOL_P(p) SERIAL_CHAR_P(p,'\n') + + #define SERIAL_PROTOCOLCHAR_P(p,x) SERIAL_CHAR_P(p,x) + #define SERIAL_PROTOCOLPGM_P(p,x) (serialprintPGM_P(p,PSTR(x))) + #define SERIAL_PROTOCOLLNPGM_P(p,x) (serialprintPGM_P(p,PSTR(x "\n"))) + #define SERIAL_PROTOCOLPAIR_P(p, pre, value) (serial_echopair_PGM_P(p,PSTR(pre),(value))) + #define SERIAL_PROTOCOLLNPAIR_P(p, pre, value) do { SERIAL_PROTOCOLPAIR_P(p, pre, value); SERIAL_EOL_P(p); } while(0) + + #define SERIAL_ECHO_START_P(p) (serialprintPGM_P(p,echomagic)) + #define SERIAL_ECHO_P(p,x) SERIAL_PROTOCOL_P(p,x) + #define SERIAL_ECHOPGM_P(p,x) SERIAL_PROTOCOLPGM_P(p,x) + #define SERIAL_ECHOLN_P(p,x) SERIAL_PROTOCOLLN_P(p,x) + #define SERIAL_ECHOLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM_P(p,x) + #define SERIAL_ECHOPAIR_P(p,pre,value) SERIAL_PROTOCOLPAIR_P(p, pre, value) + #define SERIAL_ECHOLNPAIR_P(p,pre, value) SERIAL_PROTOCOLLNPAIR_P(p, pre, value) + #define SERIAL_ECHO_F_P(p,x,y) SERIAL_PROTOCOL_F_P(p,x,y) + + #define SERIAL_ERROR_START_P(p) (serialprintPGM_P(p,errormagic)) + #define SERIAL_ERROR_P(p,x) SERIAL_PROTOCOL_P(p,x) + #define SERIAL_ERRORPGM_P(p,x) SERIAL_PROTOCOLPGM_P(p,x) + #define SERIAL_ERRORLN_P(p,x) SERIAL_PROTOCOLLN_P(p,x) + #define SERIAL_ERRORLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM_P(p,x) + + // These macros compensate for float imprecision + #define SERIAL_PROTOCOLPAIR_F_P(p, pre, value) SERIAL_PROTOCOLPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_PROTOCOLLNPAIR_F_P(p, pre, value) SERIAL_PROTOCOLLNPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_ECHOPAIR_F_P(p,pre,value) SERIAL_ECHOPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_ECHOLNPAIR_F_P(p,pre, value) SERIAL_ECHOLNPAIR_P(p, pre, FIXFLOAT(value)) + + void serial_echopair_PGM_P(const int8_t p, const char* s_P, const char *v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, char v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, int v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, long v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, float v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, double v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned int v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned long v); + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, uint8_t v) { serial_echopair_PGM_P(p, s_P, (int)v); } + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, bool v) { serial_echopair_PGM_P(p, s_P, (int)v); } + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, void *v) { serial_echopair_PGM_P(p, s_P, (unsigned long)v); } + + void serial_spaces_P(const int8_t p, uint8_t count); + #define SERIAL_ECHO_SP_P(p,C) serial_spaces_P(p,C) + #define SERIAL_ERROR_SP_P(p,C) serial_spaces_P(p,C) + #define SERIAL_PROTOCOL_SP_P(p,C) serial_spaces_P(p,C) + + void serialprintPGM_P(const int8_t p, const char* str); +#else + #define SERIAL_CHAR_P(p,x) SERIAL_CHAR(x) + #define SERIAL_PROTOCOL_P(p,x) SERIAL_PROTOCOL(x) + #define SERIAL_PROTOCOL_F_P(p,x,y) SERIAL_PROTOCOL_F(x,y) + #define SERIAL_PROTOCOLLN_P(p,x) SERIAL_PROTOCOLLN(x) + #define SERIAL_PRINT_P(p,x,b) SERIAL_PRINT(x,b) + #define SERIAL_PRINTLN_P(p,x,b) SERIAL_PRINTLN(x,b) + #define SERIAL_PRINTF_P(p,args...) SERIAL_PRINTF(args) + + #define SERIAL_CHAR(x) MYSERIAL0.write(x) + #define SERIAL_PROTOCOL(x) MYSERIAL0.print(x) + #define SERIAL_PROTOCOL_F(x,y) MYSERIAL0.print(x,y) + #define SERIAL_PROTOCOLLN(x) MYSERIAL0.println(x) + #define SERIAL_PRINT(x,b) MYSERIAL0.print(x,b) + #define SERIAL_PRINTLN(x,b) MYSERIAL0.println(x,b) + #define SERIAL_PRINTF(args...) MYSERIAL0.printf(args) + + #define SERIAL_FLUSH_P(p) SERIAL_FLUSH() + #define SERIAL_FLUSH() MYSERIAL0.flush() + #if TX_BUFFER_SIZE > 0 + #define SERIAL_FLUSHTX_P(p) SERIAL_FLUSHTX() + #define SERIAL_FLUSHTX() MYSERIAL0.flushTX() + #endif + + #define SERIAL_EOL_P(p) SERIAL_EOL() + + #define SERIAL_PROTOCOLCHAR_P(p,x) SERIAL_PROTOCOLCHAR(x) + #define SERIAL_PROTOCOLPGM_P(p,x) SERIAL_PROTOCOLPGM(x) + #define SERIAL_PROTOCOLLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM(x) + #define SERIAL_PROTOCOLPAIR_P(p, pre, value) SERIAL_PROTOCOLPAIR(pre, value) + #define SERIAL_PROTOCOLLNPAIR_P(p, pre, value) SERIAL_PROTOCOLLNPAIR(pre, value) + + #define SERIAL_ECHO_START_P(p) SERIAL_ECHO_START() + #define SERIAL_ECHO_P(p,x) SERIAL_ECHO(x) + #define SERIAL_ECHOPGM_P(p,x) SERIAL_ECHOPGM(x) + #define SERIAL_ECHOLN_P(p,x) SERIAL_ECHOLN(x) + #define SERIAL_ECHOLNPGM_P(p,x) SERIAL_ECHOLNPGM(x) + #define SERIAL_ECHOPAIR_P(p,pre,value) SERIAL_ECHOPAIR(pre, value) + #define SERIAL_ECHOLNPAIR_P(p,pre, value) SERIAL_ECHOLNPAIR(pre, value) + #define SERIAL_ECHO_F_P(p,x,y) SERIAL_ECHO_F(x,y) + + #define SERIAL_ERROR_START_P(p) SERIAL_ERROR_START() + #define SERIAL_ERROR_P(p,x) SERIAL_ERROR(x) + #define SERIAL_ERRORPGM_P(p,x) SERIAL_ERRORPGM(x) + #define SERIAL_ERRORLN_P(p,x) SERIAL_ERRORLN(x) + #define SERIAL_ERRORLNPGM_P(p,x) SERIAL_ERRORLNPGM(x) + + // These macros compensate for float imprecision + #define SERIAL_PROTOCOLPAIR_F_P(p, pre, value) SERIAL_PROTOCOLPAIR_F(pre, value) + #define SERIAL_PROTOCOLLNPAIR_F_P(p, pre, value) SERIAL_PROTOCOLLNPAIR_F(pre, value) + #define SERIAL_ECHOPAIR_F_P(p,pre,value) SERIAL_ECHOPAIR_F(pre, value) + #define SERIAL_ECHOLNPAIR_F_P(p,pre, value) SERIAL_ECHOLNPAIR_F(pre, value) + + #define serial_echopair_PGM_P(p,s_P,v) serial_echopair_PGM(s_P, v) + + #define serial_spaces_P(p,c) serial_spaces(c) + #define SERIAL_ECHO_SP_P(p,C) SERIAL_ECHO_SP(C) + #define SERIAL_ERROR_SP_P(p,C) SERIAL_ERROR_SP(C) + #define SERIAL_PROTOCOL_SP_P(p,C) SERIAL_PROTOCOL_SP(C) + + #define serialprintPGM_P(p,s) serialprintPGM(s) +#endif + +#define SERIAL_EOL() SERIAL_CHAR('\n') + +#define SERIAL_PROTOCOLCHAR(x) SERIAL_CHAR(x) +#define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x))) +#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x "\n"))) +#define SERIAL_PROTOCOLPAIR(pre, value) (serial_echopair_PGM(PSTR(pre), value)) +#define SERIAL_PROTOCOLLNPAIR(pre, value) do { SERIAL_PROTOCOLPAIR(pre, value); SERIAL_EOL(); } while(0) + +#define SERIAL_ECHO_START() (serialprintPGM(echomagic)) +#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x) +#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x) +#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x) +#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x) +#define SERIAL_ECHOPAIR(pre,value) SERIAL_PROTOCOLPAIR(pre, value) +#define SERIAL_ECHOLNPAIR(pre, value) SERIAL_PROTOCOLLNPAIR(pre, value) +#define SERIAL_ECHO_F(x,y) SERIAL_PROTOCOL_F(x, y) + +#define SERIAL_ERROR_START() (serialprintPGM(errormagic)) +#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x) +#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x) +#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x) +#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x) + +// These macros compensate for float imprecision +#define SERIAL_PROTOCOLPAIR_F(pre, value) SERIAL_PROTOCOLPAIR(pre, FIXFLOAT(value)) +#define SERIAL_PROTOCOLLNPAIR_F(pre, value) SERIAL_PROTOCOLLNPAIR(pre, FIXFLOAT(value)) +#define SERIAL_ECHOPAIR_F(pre,value) SERIAL_ECHOPAIR(pre, FIXFLOAT(value)) +#define SERIAL_ECHOLNPAIR_F(pre, value) SERIAL_ECHOLNPAIR(pre, FIXFLOAT(value)) + +void serial_echopair_PGM(const char* s_P, const char *v); +void serial_echopair_PGM(const char* s_P, char v); +void serial_echopair_PGM(const char* s_P, int v); +void serial_echopair_PGM(const char* s_P, long v); +void serial_echopair_PGM(const char* s_P, float v); +void serial_echopair_PGM(const char* s_P, double v); +void serial_echopair_PGM(const char* s_P, unsigned int v); +void serial_echopair_PGM(const char* s_P, unsigned long v); +FORCE_INLINE void serial_echopair_PGM(const char* s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } +FORCE_INLINE void serial_echopair_PGM(const char* s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } +FORCE_INLINE void serial_echopair_PGM(const char* s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } + +void serial_spaces(uint8_t count); +#define SERIAL_ECHO_SP(C) serial_spaces(C) +#define SERIAL_ERROR_SP(C) serial_spaces(C) +#define SERIAL_PROTOCOL_SP(C) serial_spaces(C) + +// +// Functions for serial printing from PROGMEM. (Saves loads of SRAM.) +// +void serialprintPGM(const char* str); + +#if ENABLED(DEBUG_LEVELING_FEATURE) + void print_xyz(const char* prefix, const char* suffix, const float x, const float y, const float z); + void print_xyz(const char* prefix, const char* suffix, const float xyz[]); + #define DEBUG_POS(SUFFIX,VAR) do { print_xyz(PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n"), VAR); } while(0) +#endif + +#endif // __SERIAL_H__ diff --git a/Marlin/types.h b/Marlin/src/core/types.h similarity index 84% rename from Marlin/types.h rename to Marlin/src/core/types.h index 8d4a0bd04c..db6587a08c 100644 --- a/Marlin/types.h +++ b/Marlin/src/core/types.h @@ -24,12 +24,8 @@ #define __TYPES_H__ #include +#include -typedef unsigned long millis_t; - -typedef struct { - int8_t x_index, y_index; - float distance; // When populated, the distance from the search location -} mesh_index_pair; +typedef uint32_t millis_t; #endif diff --git a/Marlin/utility.cpp b/Marlin/src/core/utility.cpp similarity index 57% rename from Marlin/utility.cpp rename to Marlin/src/core/utility.cpp index 88a0503d5e..7ec3fde5e8 100644 --- a/Marlin/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -20,9 +20,10 @@ * */ -#include "Marlin.h" #include "utility.h" -#include "temperature.h" + +#include "../Marlin.h" +#include "../module/temperature.h" void safe_delay(millis_t ms) { while (ms > 50) { @@ -47,7 +48,7 @@ void safe_delay(millis_t ms) { #endif // EEPROM_SETTINGS -#if ENABLED(ULTRA_LCD) || (ENABLED(DEBUG_LEVELING_FEATURE) && (ENABLED(MESH_BED_LEVELING) || (HAS_ABL && !ABL_PLANAR))) +#if ENABLED(ULTRA_LCD) || ENABLED(DEBUG_LEVELING_FEATURE) char conv[8] = { 0 }; @@ -251,4 +252,160 @@ void safe_delay(millis_t ms) { return &conv[1]; } -#endif // ULTRA_LCD || (DEBUG_LEVELING_FEATURE && (MESH_BED_LEVELING || (HAS_ABL && !ABL_PLANAR))) +#endif // ULTRA_LCD + +#if ENABLED(DEBUG_LEVELING_FEATURE) + + #include "../module/probe.h" + #include "../module/motion.h" + #include "../module/stepper.h" + #include "../feature/bedlevel/bedlevel.h" + + void log_machine_info() { + SERIAL_ECHOPGM("Machine Type: "); + #if ENABLED(DELTA) + SERIAL_ECHOLNPGM("Delta"); + #elif IS_SCARA + SERIAL_ECHOLNPGM("SCARA"); + #elif IS_CORE + SERIAL_ECHOLNPGM("Core"); + #else + SERIAL_ECHOLNPGM("Cartesian"); + #endif + + SERIAL_ECHOPGM("Probe: "); + #if ENABLED(PROBE_MANUALLY) + SERIAL_ECHOLNPGM("PROBE_MANUALLY"); + #elif ENABLED(FIX_MOUNTED_PROBE) + SERIAL_ECHOLNPGM("FIX_MOUNTED_PROBE"); + #elif ENABLED(BLTOUCH) + SERIAL_ECHOLNPGM("BLTOUCH"); + #elif HAS_Z_SERVO_PROBE + SERIAL_ECHOLNPGM("SERVO PROBE"); + #elif ENABLED(Z_PROBE_SLED) + SERIAL_ECHOLNPGM("Z_PROBE_SLED"); + #elif ENABLED(Z_PROBE_ALLEN_KEY) + SERIAL_ECHOLNPGM("Z_PROBE_ALLEN_KEY"); + #else + SERIAL_ECHOLNPGM("NONE"); + #endif + + #if HAS_BED_PROBE + SERIAL_ECHOPAIR("Probe Offset X:", X_PROBE_OFFSET_FROM_EXTRUDER); + SERIAL_ECHOPAIR(" Y:", Y_PROBE_OFFSET_FROM_EXTRUDER); + SERIAL_ECHOPAIR(" Z:", zprobe_zoffset); + #if X_PROBE_OFFSET_FROM_EXTRUDER > 0 + SERIAL_ECHOPGM(" (Right"); + #elif X_PROBE_OFFSET_FROM_EXTRUDER < 0 + SERIAL_ECHOPGM(" (Left"); + #elif Y_PROBE_OFFSET_FROM_EXTRUDER != 0 + SERIAL_ECHOPGM(" (Middle"); + #else + SERIAL_ECHOPGM(" (Aligned With"); + #endif + #if Y_PROBE_OFFSET_FROM_EXTRUDER > 0 + #if IS_SCARA + SERIAL_ECHOPGM("-Distal"); + #else + SERIAL_ECHOPGM("-Back"); + #endif + #elif Y_PROBE_OFFSET_FROM_EXTRUDER < 0 + #if IS_SCARA + SERIAL_ECHOPGM("-Proximal"); + #else + SERIAL_ECHOPGM("-Front"); + #endif + #elif X_PROBE_OFFSET_FROM_EXTRUDER != 0 + SERIAL_ECHOPGM("-Center"); + #endif + if (zprobe_zoffset < 0) + SERIAL_ECHOPGM(" & Below"); + else if (zprobe_zoffset > 0) + SERIAL_ECHOPGM(" & Above"); + else + SERIAL_ECHOPGM(" & Same Z as"); + SERIAL_ECHOLNPGM(" Nozzle)"); + #endif + + #if HAS_ABL + SERIAL_ECHOPGM("Auto Bed Leveling: "); + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + SERIAL_ECHOPGM("LINEAR"); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + SERIAL_ECHOPGM("BILINEAR"); + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + SERIAL_ECHOPGM("3POINT"); + #elif ENABLED(AUTO_BED_LEVELING_UBL) + SERIAL_ECHOPGM("UBL"); + #endif + if (planner.leveling_active) { + SERIAL_ECHOLNPGM(" (enabled)"); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) + SERIAL_ECHOLNPAIR("Z Fade: ", planner.z_fade_height); + #endif + #if ABL_PLANAR + const float diff[XYZ] = { + planner.get_axis_position_mm(X_AXIS) - current_position[X_AXIS], + planner.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS], + planner.get_axis_position_mm(Z_AXIS) - current_position[Z_AXIS] + }; + SERIAL_ECHOPGM("ABL Adjustment X"); + if (diff[X_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[X_AXIS]); + SERIAL_ECHOPGM(" Y"); + if (diff[Y_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[Y_AXIS]); + SERIAL_ECHOPGM(" Z"); + if (diff[Z_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[Z_AXIS]); + #else + #if ENABLED(AUTO_BED_LEVELING_UBL) + SERIAL_ECHOPGM("UBL Adjustment Z"); + const float rz = ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + SERIAL_ECHOPGM("ABL Adjustment Z"); + const float rz = bilinear_z_offset(current_position); + #endif + SERIAL_ECHO(ftostr43sign(rz, '+')); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) { + SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position[Z_AXIS]), '+')); + SERIAL_CHAR(')'); + } + #endif + #endif + } + else + SERIAL_ECHOLNPGM(" (disabled)"); + + SERIAL_EOL(); + + #elif ENABLED(MESH_BED_LEVELING) + + SERIAL_ECHOPGM("Mesh Bed Leveling"); + if (planner.leveling_active) { + SERIAL_ECHOLNPGM(" (enabled)"); + SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS] + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , 1.0 + #endif + ), '+')); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) { + SERIAL_ECHOPAIR(" (", ftostr43sign( + mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS], planner.fade_scaling_factor_for_z(current_position[Z_AXIS])), '+' + )); + SERIAL_CHAR(')'); + } + #endif + } + else + SERIAL_ECHOPGM(" (disabled)"); + + SERIAL_EOL(); + + #endif // MESH_BED_LEVELING + } + +#endif // DEBUG_LEVELING_FEATURE diff --git a/Marlin/utility.h b/Marlin/src/core/utility.h similarity index 75% rename from Marlin/utility.h rename to Marlin/src/core/utility.h index dff2cec105..4f0477884f 100644 --- a/Marlin/utility.h +++ b/Marlin/src/core/utility.h @@ -23,7 +23,9 @@ #ifndef __UTILITY_H__ #define __UTILITY_H__ -#include "types.h" +#include "../inc/MarlinConfigPre.h" + +constexpr char axis_codes[XYZE] = { 'X', 'Y', 'Z', 'E' }; void safe_delay(millis_t ms); @@ -31,7 +33,19 @@ void safe_delay(millis_t ms); void crc16(uint16_t *crc, const void * const data, uint16_t cnt); #endif -#if ENABLED(ULTRA_LCD) || (ENABLED(DEBUG_LEVELING_FEATURE) && (ENABLED(MESH_BED_LEVELING) || (HAS_ABL && !ABL_PLANAR))) +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + /** + * These support functions allow the use of large bit arrays of flags that take very + * little RAM. Currently they are limited to being 16x16 in size. Changing the declaration + * to unsigned long will allow us to go to 32x32 if higher resolution Mesh's are needed + * in the future. + */ + FORCE_INLINE void bitmap_clear(uint16_t bits[16], const uint8_t x, const uint8_t y) { CBI(bits[y], x); } + FORCE_INLINE void bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { SBI(bits[y], x); } + FORCE_INLINE bool is_bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } +#endif + +#if ENABLED(ULTRA_LCD) || ENABLED(DEBUG_LEVELING_FEATURE) // Convert uint8_t to string with 123 format char* i8tostr3(const uint8_t x); @@ -83,6 +97,10 @@ void safe_delay(millis_t ms); FORCE_INLINE char* ftostr4sign(const float &x) { return itostr4sign(int(x + (x < 0 ? -0.5 : 0.5))); } #endif -#endif // ULTRA_LCD || (DEBUG_LEVELING_FEATURE && (MESH_BED_LEVELING || (HAS_ABL && !ABL_PLANAR))) +#endif // ULTRA_LCD + +#if ENABLED(DEBUG_LEVELING_FEATURE) + void log_machine_info(); +#endif #endif // __UTILITY_H__ diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp new file mode 100644 index 0000000000..32a598810c --- /dev/null +++ b/Marlin/src/feature/I2CPositionEncoder.cpp @@ -0,0 +1,1140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +//todo: add support for multiple encoders on a single axis +//todo: add z axis auto-leveling +//todo: consolidate some of the related M codes? +//todo: add endstop-replacement mode? +//todo: try faster I2C speed; tweak TWI_FREQ (400000L, or faster?); or just TWBR = ((CPU_FREQ / 400000L) - 16) / 2; +//todo: consider Marlin-optimized Wire library; i.e. MarlinWire, like MarlinSerial + + +#include "../inc/MarlinConfig.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + +#include "I2CPositionEncoder.h" + +#include "../module/temperature.h" +#include "../module/stepper.h" +#include "../gcode/parser.h" +#include + +#include + +void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { + encoderAxis = axis; + i2cAddress = address; + + initialised++; + + SERIAL_ECHOPAIR("Setting up encoder on ", axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" axis, addr = ", address); + + position = get_position(); +} + +void I2CPositionEncoder::update() { + if (!initialised || !homed || !active) return; //check encoder is set up and active + + position = get_position(); + + //we don't want to stop things just because the encoder missed a message, + //so we only care about responses that indicate bad magnetic strength + + if (!passes_test(false)) { //check encoder data is good + lastErrorTime = millis(); + /* + if (trusted) { //commented out as part of the note below + trusted = false; + SERIAL_ECHOPGM("Fault detected on "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder. Disengaging error correction until module is trusted again."); + } + */ + return; + } + + if (!trusted) { + /** + * This is commented out because it introduces error and can cause bad print quality. + * + * This code is intended to manage situations where the encoder has reported bad magnetic strength. + * This indicates that the magnetic strip was too far away from the sensor to reliably track position. + * When this happens, this code resets the offset based on where the printer thinks it is. This has been + * shown to introduce errors in actual position which result in drifting prints and poor print quality. + * Perhaps a better method would be to disable correction on the axis with a problem, report it to the + * user via the status leds on the encoder module and prompt the user to re-home the axis at which point + * the encoder would be re-enabled. + */ + + /* + // If the magnetic strength has been good for a certain time, start trusting the module again + + if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { + trusted = true; + + SERIAL_ECHOPGM("Untrusted encoder module on "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis has been fault-free for set duration, reinstating error correction."); + + //the encoder likely lost its place when the error occured, so we'll reset and use the printer's + //idea of where it the axis is to re-initialise + const float pos = planner.get_axis_position_mm(encoderAxis); + int32_t positionInTicks = pos * get_ticks_unit(); + + //shift position from previous to current position + zeroOffset -= (positionInTicks - get_position()); + + #ifdef I2CPE_DEBUG + SERIAL_ECHOPGM("Current position is "); + SERIAL_ECHOLN(pos); + + SERIAL_ECHOPGM("Position in encoder ticks is "); + SERIAL_ECHOLN(positionInTicks); + + SERIAL_ECHOPGM("New zero-offset of "); + SERIAL_ECHOLN(zeroOffset); + + SERIAL_ECHOPGM("New position reads as "); + SERIAL_ECHO(get_position()); + SERIAL_CHAR('('); + SERIAL_ECHO(mm_from_count(get_position())); + SERIAL_ECHOLNPGM(")"); + #endif + } + */ + return; + } + + lastPosition = position; + const millis_t positionTime = millis(); + + //only do error correction if setup and enabled + if (ec && ecMethod != I2CPE_ECM_NONE) { + + #ifdef I2CPE_EC_THRESH_PROPORTIONAL + const millis_t deltaTime = positionTime - lastPositionTime; + const uint32_t distance = ABS(position - lastPosition), + speed = distance / deltaTime; + const float threshold = constrain((speed / 50), 1, 50) * ecThreshold; + #else + const float threshold = get_error_correct_threshold(); + #endif + + //check error + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + float sum = 0, diffSum = 0; + + errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; + err[errIdx] = get_axis_error_steps(false); + + LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { + sum += err[i]; + if (i) diffSum += ABS(err[i-1] - err[i]); + } + + const int32_t error = int32_t(sum / (I2CPE_ERR_ARRAY_SIZE + 1)); //calculate average for error + + #else + const int32_t error = get_axis_error_steps(false); + #endif + + //SERIAL_ECHOPGM("Axis error steps: "); + //SERIAL_ECHOLN(error); + + #ifdef I2CPE_ERR_THRESH_ABORT + if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.axis_steps_per_mm[encoderAxis]) { + //kill("Significant Error"); + SERIAL_ECHOPGM("Axis error greater than set threshold, aborting!"); + SERIAL_ECHOLN(error); + safe_delay(5000); + } + #endif + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + if (errIdx == 0) { + // In order to correct for "error" but avoid correcting for noise and non-skips + // it must be > threshold and have a difference average of < 10 and be < 2000 steps + if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis] && + diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) && ABS(error) < 2000) { // Check for persistent error (skip) + errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy + if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { + float sumP = 0; + LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; + const int32_t errorP = int32_t(sumP * (1.0 / (I2CPE_ERR_PRST_ARRAY_SIZE))); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" - err detected: ", errorP * planner.steps_to_mm[encoderAxis]); + SERIAL_ECHOLNPGM("mm; correcting!"); + thermalManager.babystepsTodo[encoderAxis] = -LROUND(errorP); + errPrstIdx = 0; + } + } + else + errPrstIdx = 0; + } + #else + if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis]) { + //SERIAL_ECHOLN(error); + //SERIAL_ECHOLN(position); + thermalManager.babystepsTodo[encoderAxis] = -LROUND(error / 2); + } + #endif + + if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.axis_steps_per_mm[encoderAxis]) { + const millis_t ms = millis(); + if (ELAPSED(ms, nextErrorCountTime)) { + SERIAL_ECHOPAIR("Large error on ", axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis. error: ", (int)error); + SERIAL_ECHOLNPAIR("; diffSum: ", diffSum); + errorCount++; + nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; + } + } + } + + lastPositionTime = positionTime; +} + +void I2CPositionEncoder::set_homed() { + if (active) { + reset(); // Reset module's offset to zero (so current position is homed / zero) + delay(10); + + zeroOffset = get_raw_count(); + homed++; + trusted++; + + #ifdef I2CPE_DEBUG + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis encoder homed, offset of ", zeroOffset); + SERIAL_ECHOLNPGM(" ticks."); + #endif + } +} + +bool I2CPositionEncoder::passes_test(const bool report) { + if (report) { + if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPGM(" axis "); + serialprintPGM(H == I2CPE_MAG_SIG_BAD ? PSTR("magnetic strip ") : PSTR("encoder ")); + switch (H) { + case I2CPE_MAG_SIG_GOOD: + case I2CPE_MAG_SIG_MID: + SERIAL_ECHOLNPGM("passes test; field strength "); + serialprintPGM(H == I2CPE_MAG_SIG_GOOD ? PSTR("good.\n") : PSTR("fair.\n")); + break; + default: + SERIAL_ECHOLNPGM("not detected!"); + } + } + return (H == I2CPE_MAG_SIG_GOOD || H == I2CPE_MAG_SIG_MID); +} + +float I2CPositionEncoder::get_axis_error_mm(const bool report) { + float target, actual, error; + + target = planner.get_axis_position_mm(encoderAxis); + actual = mm_from_count(position); + error = actual - target; + + if (ABS(error) > 10000) error = 0; // ? + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis target: ", target); + SERIAL_ECHOPAIR(", actual: ", actual); + SERIAL_ECHOLNPAIR(", error : ",error); + } + + return error; +} + +int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { + if (!active) { + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder not active!"); + } + return 0; + } + + float stepperTicksPerUnit; + int32_t encoderTicks = position, encoderCountInStepperTicksScaled; + //int32_t stepperTicks = stepper.position(encoderAxis); + + // With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm + stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.axis_steps_per_mm[encoderAxis]; + + //convert both 'ticks' into same units / base + encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit); + + int32_t target = stepper.position(encoderAxis), + error = (encoderCountInStepperTicksScaled - target); + + //suppress discontinuities (might be caused by bad I2C readings...?) + const bool suppressOutput = (ABS(error - errorPrev) > 100); + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis target: ", target); + SERIAL_ECHOPAIR(", actual: ", encoderCountInStepperTicksScaled); + SERIAL_ECHOLNPAIR(", error : ", error); + + if (suppressOutput) SERIAL_ECHOLNPGM("Discontinuity detected, suppressing error."); + } + + errorPrev = error; + + return (suppressOutput ? 0 : error); +} + +int32_t I2CPositionEncoder::get_raw_count() { + uint8_t index = 0; + i2cLong encoderCount; + + encoderCount.val = 0x00; + + if (Wire.requestFrom((int)i2cAddress, 3) != 3) { + //houston, we have a problem... + H = I2CPE_MAG_SIG_NF; + return 0; + } + + while (Wire.available()) + encoderCount.bval[index++] = (uint8_t)Wire.read(); + + //extract the magnetic strength + H = (B00000011 & (encoderCount.bval[2] >> 6)); + + //extract sign bit; sign = (encoderCount.bval[2] & B00100000); + //set all upper bits to the sign value to overwrite H + encoderCount.val = (encoderCount.bval[2] & B00100000) ? (encoderCount.val | 0xFFC00000) : (encoderCount.val & 0x003FFFFF); + + if (invert) encoderCount.val *= -1; + + return encoderCount.val; +} + +bool I2CPositionEncoder::test_axis() { + //only works on XYZ cartesian machines for the time being + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; + + float startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; + + const float startPosition = soft_endstop_min[encoderAxis] + 10, + endPosition = soft_endstop_max[encoderAxis] - 10, + feedrate = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); + + ec = false; + + LOOP_NA(i) { + startCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + endCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + } + + startCoord[encoderAxis] = startPosition; + endCoord[encoderAxis] = endPosition; + + planner.synchronize(); + + planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + // if the module isn't currently trusted, wait until it is (or until it should be if things are working) + if (!trusted) { + int32_t startWaitingTime = millis(); + while (!trusted && millis() - startWaitingTime < I2CPE_TIME_TRUSTED) + safe_delay(500); + } + + if (trusted) { // if trusted, commence test + planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + } + + return trusted; +} + +void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { + if (type != I2CPE_ENC_TYPE_LINEAR) { + SERIAL_ECHOLNPGM("Steps per mm calibration is only available using linear encoders."); + return; + } + + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) { + SERIAL_ECHOLNPGM("Automatic steps / mm calibration not supported for this axis."); + return; + } + + float old_steps_mm, new_steps_mm, + startDistance, endDistance, + travelDistance, travelledDistance, total = 0, + startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; + + float feedrate; + + int32_t startCount, stopCount; + + feedrate = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); + + bool oldec = ec; + ec = false; + + startDistance = 20; + endDistance = soft_endstop_max[encoderAxis] - 20; + travelDistance = endDistance - startDistance; + + LOOP_NA(i) { + startCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + endCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + } + + startCoord[encoderAxis] = startDistance; + endCoord[encoderAxis] = endDistance; + + planner.synchronize(); + + LOOP_L_N(i, iter) { + planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + delay(250); + startCount = get_position(); + + //do_blocking_move_to(endCoord[X_AXIS],endCoord[Y_AXIS],endCoord[Z_AXIS]); + + planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + //Read encoder distance + delay(250); + stopCount = get_position(); + + travelledDistance = mm_from_count(ABS(stopCount - startCount)); + + SERIAL_ECHOPAIR("Attempted to travel: ", travelDistance); + SERIAL_ECHOLNPGM("mm."); + + SERIAL_ECHOPAIR("Actually travelled: ", travelledDistance); + SERIAL_ECHOLNPGM("mm."); + + //Calculate new axis steps per unit + old_steps_mm = planner.axis_steps_per_mm[encoderAxis]; + new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance; + + SERIAL_ECHOLNPAIR("Old steps per mm: ", old_steps_mm); + SERIAL_ECHOLNPAIR("New steps per mm: ", new_steps_mm); + + //Save new value + planner.axis_steps_per_mm[encoderAxis] = new_steps_mm; + + if (iter > 1) { + total += new_steps_mm; + + // swap start and end points so next loop runs from current position + float tempCoord = startCoord[encoderAxis]; + startCoord[encoderAxis] = endCoord[encoderAxis]; + endCoord[encoderAxis] = tempCoord; + } + } + + if (iter > 1) { + total /= (float)iter; + SERIAL_ECHOLNPAIR("Average steps per mm: ", total); + } + + ec = oldec; + + SERIAL_ECHOLNPGM("Calculated steps per mm has been set. Please save to EEPROM (M500) if you wish to keep these values."); +} + +void I2CPositionEncoder::reset() { + Wire.beginTransmission(i2cAddress); + Wire.write(I2CPE_RESET_COUNT); + Wire.endTransmission(); + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + ZERO(err); + #endif +} + + +bool I2CPositionEncodersMgr::I2CPE_anyaxis; +uint8_t I2CPositionEncodersMgr::I2CPE_addr, + I2CPositionEncodersMgr::I2CPE_idx; +I2CPositionEncoder I2CPositionEncodersMgr::encoders[I2CPE_ENCODER_CNT]; + +void I2CPositionEncodersMgr::init() { + Wire.begin(); + + #if I2CPE_ENCODER_CNT > 0 + uint8_t i = 0; + + encoders[i].init(I2CPE_ENC_1_ADDR, I2CPE_ENC_1_AXIS); + + #ifdef I2CPE_ENC_1_TYPE + encoders[i].set_type(I2CPE_ENC_1_TYPE); + #endif + #ifdef I2CPE_ENC_1_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_1_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_1_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV); + #endif + #ifdef I2CPE_ENC_1_INVERT + encoders[i].set_inverted(I2CPE_ENC_1_INVERT); + #endif + #ifdef I2CPE_ENC_1_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD); + #endif + #ifdef I2CPE_ENC_1_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_1_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_1_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 1 + i++; + + encoders[i].init(I2CPE_ENC_2_ADDR, I2CPE_ENC_2_AXIS); + + #ifdef I2CPE_ENC_2_TYPE + encoders[i].set_type(I2CPE_ENC_2_TYPE); + #endif + #ifdef I2CPE_ENC_2_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_2_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_2_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV); + #endif + #ifdef I2CPE_ENC_2_INVERT + encoders[i].set_inverted(I2CPE_ENC_2_INVERT); + #endif + #ifdef I2CPE_ENC_2_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD); + #endif + #ifdef I2CPE_ENC_2_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_2_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_2_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 2 + i++; + + encoders[i].init(I2CPE_ENC_3_ADDR, I2CPE_ENC_3_AXIS); + + #ifdef I2CPE_ENC_3_TYPE + encoders[i].set_type(I2CPE_ENC_3_TYPE); + #endif + #ifdef I2CPE_ENC_3_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_3_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_3_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV); + #endif + #ifdef I2CPE_ENC_3_INVERT + encoders[i].set_inverted(I2CPE_ENC_3_INVERT); + #endif + #ifdef I2CPE_ENC_3_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD); + #endif + #ifdef I2CPE_ENC_3_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_3_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_3_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 3 + i++; + + encoders[i].init(I2CPE_ENC_4_ADDR, I2CPE_ENC_4_AXIS); + + #ifdef I2CPE_ENC_4_TYPE + encoders[i].set_type(I2CPE_ENC_4_TYPE); + #endif + #ifdef I2CPE_ENC_4_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_4_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_4_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV); + #endif + #ifdef I2CPE_ENC_4_INVERT + encoders[i].set_inverted(I2CPE_ENC_4_INVERT); + #endif + #ifdef I2CPE_ENC_4_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD); + #endif + #ifdef I2CPE_ENC_4_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_4_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_4_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 4 + i++; + + encoders[i].init(I2CPE_ENC_5_ADDR, I2CPE_ENC_5_AXIS); + + #ifdef I2CPE_ENC_5_TYPE + encoders[i].set_type(I2CPE_ENC_5_TYPE); + #endif + #ifdef I2CPE_ENC_5_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_5_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_5_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV); + #endif + #ifdef I2CPE_ENC_5_INVERT + encoders[i].set_inverted(I2CPE_ENC_5_INVERT); + #endif + #ifdef I2CPE_ENC_5_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD); + #endif + #ifdef I2CPE_ENC_5_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_5_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_5_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif +} + +void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { + CHECK_IDX(); + + if (units) + SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); + else { + if (noOffset) { + const int32_t raw_count = encoders[idx].get_raw_count(); + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_CHAR(' '); + + for (uint8_t j = 31; j > 0; j--) + SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); + + SERIAL_ECHO((bool)(0x00000001 & raw_count)); + SERIAL_CHAR(' '); + SERIAL_ECHOLN(raw_count); + } + else + SERIAL_ECHOLN(encoders[idx].get_position()); + } +} + +void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { + // First check 'new' address is not in use + Wire.beginTransmission(newaddr); + if (!Wire.endTransmission()) { + SERIAL_ECHOPAIR("?There is already a device with that address on the I2C bus! (", newaddr); + SERIAL_ECHOLNPGM(")"); + return; + } + + // Now check that we can find the module on the oldaddr address + Wire.beginTransmission(oldaddr); + if (Wire.endTransmission()) { + SERIAL_ECHOPAIR("?No module detected at this address! (", oldaddr); + SERIAL_ECHOLNPGM(")"); + return; + } + + SERIAL_ECHOPAIR("Module found at ", oldaddr); + SERIAL_ECHOLNPAIR(", changing address to ", newaddr); + + // Change the modules address + Wire.beginTransmission(oldaddr); + Wire.write(I2CPE_SET_ADDR); + Wire.write(newaddr); + Wire.endTransmission(); + + SERIAL_ECHOLNPGM("Address changed, resetting and waiting for confirmation.."); + + // Wait for the module to reset (can probably be improved by polling address with a timeout). + safe_delay(I2CPE_REBOOT_TIME); + + // Look for the module at the new address. + Wire.beginTransmission(newaddr); + if (Wire.endTransmission()) { + SERIAL_ECHOLNPGM("Address change failed! Check encoder module."); + return; + } + + SERIAL_ECHOLNPGM("Address change successful!"); + + // Now, if this module is configured, find which encoder instance it's supposed to correspond to + // and enable it (it will likely have failed initialisation on power-up, before the address change). + const int8_t idx = idx_from_addr(newaddr); + if (idx >= 0 && !encoders[idx].get_active()) { + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); + encoders[idx].set_active(encoders[idx].passes_test(true)); + } +} + +void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { + // First check there is a module + Wire.beginTransmission(address); + if (Wire.endTransmission()) { + SERIAL_ECHOPAIR("?No module detected at this address! (", address); + SERIAL_ECHOLNPGM(")"); + return; + } + + SERIAL_ECHOPAIR("Requesting version info from module at address ", address); + SERIAL_ECHOLNPGM(":"); + + Wire.beginTransmission(address); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_VERSION); + Wire.endTransmission(); + + // Read value + if (Wire.requestFrom((int)address, 32)) { + char c; + while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) + SERIAL_ECHO(c); + SERIAL_EOL(); + } + + // Set module back to normal (distance) mode + Wire.beginTransmission(address); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_DISTANCE); + Wire.endTransmission(); +} + +int8_t I2CPositionEncodersMgr::parse() { + I2CPE_addr = 0; + + if (parser.seen('A')) { + + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPGM("?A seen, but no address specified! [30-200]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_addr = parser.value_byte(); + if (!WITHIN(I2CPE_addr, 30, 200)) { // reserve the first 30 and last 55 + SERIAL_PROTOCOLLNPGM("?Address out of range. [30-200]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_idx = idx_from_addr(I2CPE_addr); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_PROTOCOLLNPGM("?No device with this address!"); + return I2CPE_PARSE_ERR; + } + } + else if (parser.seenval('I')) { + + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPAIR("?I seen, but no index specified! [0-", I2CPE_ENCODER_CNT - 1); + SERIAL_PROTOCOLLNPGM("]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_idx = parser.value_byte(); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_PROTOCOLLNPAIR("?Index out of range. [0-", I2CPE_ENCODER_CNT - 1); + SERIAL_ECHOLNPGM("]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_addr = encoders[I2CPE_idx].get_address(); + } + else + I2CPE_idx = 0xFF; + + I2CPE_anyaxis = parser.seen_axis(); + + return I2CPE_PARSE_OK; +}; + +/** + * M860: Report the position(s) of position encoder module(s). + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * O Include homed zero-offset in returned position. + * U Units in mm or raw step count. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M860() { + if (parse()) return; + + const bool hasU = parser.seen('U'), hasO = parser.seen('O'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_position(idx, hasU, hasO); + } + } + } + else + report_position(I2CPE_idx, hasU, hasO); +} + +/** + * M861: Report the status of position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M861() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_status(idx); + } + } + } + else + report_status(I2CPE_idx); +} + +/** + * M862: Perform an axis continuity test for position encoder + * modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M862() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) test_axis(idx); + } + } + } + else + test_axis(I2CPE_idx); +} + +/** + * M863: Perform steps-per-mm calibration for + * position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * P Number of rePeats/iterations. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M863() { + if (parse()) return; + + const uint8_t iterations = constrain(parser.byteval('P', 1), 1, 10); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) calibrate_steps_mm(idx, iterations); + } + } + } + else + calibrate_steps_mm(I2CPE_idx, iterations); +} + +/** + * M864: Change position encoder module I2C address. + * + * A Module current/old I2C address. If not present, + * assumes default address (030). [30, 200]. + * S Module new I2C address. [30, 200]. + * + * If S is not specified: + * X Use I2CPE_PRESET_ADDR_X (030). + * Y Use I2CPE_PRESET_ADDR_Y (031). + * Z Use I2CPE_PRESET_ADDR_Z (032). + * E Use I2CPE_PRESET_ADDR_E (033). + */ +void I2CPositionEncodersMgr::M864() { + uint8_t newAddress; + + if (parse()) return; + + if (!I2CPE_addr) I2CPE_addr = I2CPE_PRESET_ADDR_X; + + if (parser.seen('S')) { + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPGM("?S seen, but no address specified! [30-200]"); + return; + }; + + newAddress = parser.value_byte(); + if (!WITHIN(newAddress, 30, 200)) { + SERIAL_PROTOCOLLNPGM("?New address out of range. [30-200]"); + return; + } + } + else if (!I2CPE_anyaxis) { + SERIAL_PROTOCOLLNPGM("?You must specify S or [XYZE]."); + return; + } + else { + if (parser.seen('X')) newAddress = I2CPE_PRESET_ADDR_X; + else if (parser.seen('Y')) newAddress = I2CPE_PRESET_ADDR_Y; + else if (parser.seen('Z')) newAddress = I2CPE_PRESET_ADDR_Z; + else if (parser.seen('E')) newAddress = I2CPE_PRESET_ADDR_E; + else return; + } + + SERIAL_ECHOPAIR("Changing module at address ", I2CPE_addr); + SERIAL_ECHOLNPAIR(" to address ", newAddress); + + change_module_address(I2CPE_addr, newAddress); +} + +/** + * M865: Check position encoder module firmware version. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A or I not specified: + * X Check X axis encoder, if present. + * Y Check Y axis encoder, if present. + * Z Check Z axis encoder, if present. + * E Check E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M865() { + if (parse()) return; + + if (!I2CPE_addr) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_module_firmware(encoders[idx].get_address()); + } + } + } + else + report_module_firmware(I2CPE_addr); +} + +/** + * M866: Report or reset position encoder module error + * count. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * R Reset error counter. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M866() { + if (parse()) return; + + const bool hasR = parser.seen('R'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (hasR) + reset_error_count(idx, AxisEnum(i)); + else + report_error_count(idx, AxisEnum(i)); + } + } + } + } + else if (hasR) + reset_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); + else + report_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M867: Enable/disable or toggle error correction for position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * S<1|0> Enable/disable error correction. 1 enables, 0 disables. If not + * supplied, toggle. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M867() { + if (parse()) return; + + const int8_t onoff = parser.seenval('S') ? parser.value_int() : -1; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(idx, ena, AxisEnum(i)); + } + } + } + } + else { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(I2CPE_idx, ena, encoders[I2CPE_idx].get_axis()); + } +} + +/** + * M868: Report or set position encoder module error correction + * threshold. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * T New error correction threshold. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M868() { + if (parse()) return; + + const float newThreshold = parser.seenval('T') ? parser.value_float() : -9999; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (newThreshold != -9999) + set_ec_threshold(idx, newThreshold, encoders[idx].get_axis()); + else + get_ec_threshold(idx, encoders[idx].get_axis()); + } + } + } + } + else if (newThreshold != -9999) + set_ec_threshold(I2CPE_idx, newThreshold, encoders[I2CPE_idx].get_axis()); + else + get_ec_threshold(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M869: Report position encoder module error. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M869() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_error(idx); + } + } + } + else + report_error(I2CPE_idx); +} + +#endif // I2C_POSITION_ENCODERS diff --git a/Marlin/I2CPositionEncoder.h b/Marlin/src/feature/I2CPositionEncoder.h similarity index 69% rename from Marlin/I2CPositionEncoder.h rename to Marlin/src/feature/I2CPositionEncoder.h index 7e5513423f..4ed5c78836 100644 --- a/Marlin/I2CPositionEncoder.h +++ b/Marlin/src/feature/I2CPositionEncoder.h @@ -23,87 +23,86 @@ #ifndef I2CPOSENC_H #define I2CPOSENC_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" -#if ENABLED(I2C_POSITION_ENCODERS) +#include "../module/planner.h" - #include "enum.h" - #include "macros.h" - #include "types.h" - #include +#include - //=========== Advanced / Less-Common Encoder Configuration Settings ========== +//=========== Advanced / Less-Common Encoder Configuration Settings ========== - #define I2CPE_EC_THRESH_PROPORTIONAL // if enabled adjusts the error correction threshold - // proportional to the current speed of the axis allows - // for very small error margin at low speeds without - // stuttering due to reading latency at high speeds +#define I2CPE_EC_THRESH_PROPORTIONAL // if enabled adjusts the error correction threshold + // proportional to the current speed of the axis allows + // for very small error margin at low speeds without + // stuttering due to reading latency at high speeds - #define I2CPE_DEBUG // enable encoder-related debug serial echos +#define I2CPE_DEBUG // enable encoder-related debug serial echos - #define I2CPE_REBOOT_TIME 5000 // time we wait for an encoder module to reboot - // after changing address. +#define I2CPE_REBOOT_TIME 5000 // time we wait for an encoder module to reboot + // after changing address. - #define I2CPE_MAG_SIG_GOOD 0 - #define I2CPE_MAG_SIG_MID 1 - #define I2CPE_MAG_SIG_BAD 2 - #define I2CPE_MAG_SIG_NF 255 +#define I2CPE_MAG_SIG_GOOD 0 +#define I2CPE_MAG_SIG_MID 1 +#define I2CPE_MAG_SIG_BAD 2 +#define I2CPE_MAG_SIG_NF 255 - #define I2CPE_REQ_REPORT 0 - #define I2CPE_RESET_COUNT 1 - #define I2CPE_SET_ADDR 2 - #define I2CPE_SET_REPORT_MODE 3 - #define I2CPE_CLEAR_EEPROM 4 +#define I2CPE_REQ_REPORT 0 +#define I2CPE_RESET_COUNT 1 +#define I2CPE_SET_ADDR 2 +#define I2CPE_SET_REPORT_MODE 3 +#define I2CPE_CLEAR_EEPROM 4 - #define I2CPE_LED_PAR_MODE 10 - #define I2CPE_LED_PAR_BRT 11 - #define I2CPE_LED_PAR_RATE 14 +#define I2CPE_LED_PAR_MODE 10 +#define I2CPE_LED_PAR_BRT 11 +#define I2CPE_LED_PAR_RATE 14 - #define I2CPE_REPORT_DISTANCE 0 - #define I2CPE_REPORT_STRENGTH 1 - #define I2CPE_REPORT_VERSION 2 +#define I2CPE_REPORT_DISTANCE 0 +#define I2CPE_REPORT_STRENGTH 1 +#define I2CPE_REPORT_VERSION 2 - // Default I2C addresses - #define I2CPE_PRESET_ADDR_X 30 - #define I2CPE_PRESET_ADDR_Y 31 - #define I2CPE_PRESET_ADDR_Z 32 - #define I2CPE_PRESET_ADDR_E 33 +// Default I2C addresses +#define I2CPE_PRESET_ADDR_X 30 +#define I2CPE_PRESET_ADDR_Y 31 +#define I2CPE_PRESET_ADDR_Z 32 +#define I2CPE_PRESET_ADDR_E 33 - #define I2CPE_DEF_AXIS X_AXIS - #define I2CPE_DEF_ADDR I2CPE_PRESET_ADDR_X +#define I2CPE_DEF_AXIS X_AXIS +#define I2CPE_DEF_ADDR I2CPE_PRESET_ADDR_X - // Error event counter; tracks how many times there is an error exceeding a certain threshold - #define I2CPE_ERR_CNT_THRESH 3.00 - #define I2CPE_ERR_CNT_DEBOUNCE_MS 2000 +// Error event counter; tracks how many times there is an error exceeding a certain threshold +#define I2CPE_ERR_CNT_THRESH 3.00 +#define I2CPE_ERR_CNT_DEBOUNCE_MS 2000 - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - #define I2CPE_ERR_ARRAY_SIZE 32 - #define I2CPE_ERR_PRST_ARRAY_SIZE 10 - #endif +#if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + #define I2CPE_ERR_ARRAY_SIZE 32 + #define I2CPE_ERR_PRST_ARRAY_SIZE 10 +#endif - // Error Correction Methods - #define I2CPE_ECM_NONE 0 - #define I2CPE_ECM_MICROSTEP 1 - #define I2CPE_ECM_PLANNER 2 - #define I2CPE_ECM_STALLDETECT 3 +// Error Correction Methods +#define I2CPE_ECM_NONE 0 +#define I2CPE_ECM_MICROSTEP 1 +#define I2CPE_ECM_PLANNER 2 +#define I2CPE_ECM_STALLDETECT 3 - // Encoder types - #define I2CPE_ENC_TYPE_ROTARY 0 - #define I2CPE_ENC_TYPE_LINEAR 1 +// Encoder types +#define I2CPE_ENC_TYPE_ROTARY 0 +#define I2CPE_ENC_TYPE_LINEAR 1 - // Parser - #define I2CPE_PARSE_ERR 1 - #define I2CPE_PARSE_OK 0 +// Parser +#define I2CPE_PARSE_ERR 1 +#define I2CPE_PARSE_OK 0 - #define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) - #define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) +#define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) +#define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) - typedef union { - volatile int32_t val = 0; - uint8_t bval[4]; - } i2cLong; +extern const char axis_codes[XYZE]; - class I2CPositionEncoder { +typedef union { + volatile int32_t val = 0; + uint8_t bval[4]; +} i2cLong; + +class I2CPositionEncoder { private: AxisEnum encoderAxis = I2CPE_DEF_AXIS; @@ -216,9 +215,9 @@ FORCE_INLINE int get_stepper_ticks() { return stepperTicks; } FORCE_INLINE void set_stepper_ticks(const int ticks) { stepperTicks = ticks; } - }; +}; - class I2CPositionEncodersMgr { +class I2CPositionEncodersMgr { private: static bool I2CPE_anyaxis; static uint8_t I2CPE_addr, I2CPE_idx; @@ -239,7 +238,7 @@ static void report_status(const int8_t idx) { CHECK_IDX(); - SERIAL_ECHOPAIR("Encoder ",idx); + SERIAL_ECHOPAIR("Encoder ", idx); SERIAL_ECHOPGM(": "); encoders[idx].get_raw_count(); encoders[idx].passes_test(true); @@ -327,20 +326,8 @@ static void M869(); static I2CPositionEncoder encoders[I2CPE_ENCODER_CNT]; - }; +}; - extern I2CPositionEncodersMgr I2CPEM; +extern I2CPositionEncodersMgr I2CPEM; - FORCE_INLINE static void gcode_M860() { I2CPEM.M860(); } - FORCE_INLINE static void gcode_M861() { I2CPEM.M861(); } - FORCE_INLINE static void gcode_M862() { I2CPEM.M862(); } - FORCE_INLINE static void gcode_M863() { I2CPEM.M863(); } - FORCE_INLINE static void gcode_M864() { I2CPEM.M864(); } - FORCE_INLINE static void gcode_M865() { I2CPEM.M865(); } - FORCE_INLINE static void gcode_M866() { I2CPEM.M866(); } - FORCE_INLINE static void gcode_M867() { I2CPEM.M867(); } - FORCE_INLINE static void gcode_M868() { I2CPEM.M868(); } - FORCE_INLINE static void gcode_M869() { I2CPEM.M869(); } - -#endif //I2C_POSITION_ENCODERS #endif //I2CPOSENC_H diff --git a/Marlin/Max7219_Debug_LEDs.cpp b/Marlin/src/feature/Max7219_Debug_LEDs.cpp similarity index 95% rename from Marlin/Max7219_Debug_LEDs.cpp rename to Marlin/src/feature/Max7219_Debug_LEDs.cpp index 83b285a08c..8403f3c18b 100644 --- a/Marlin/Max7219_Debug_LEDs.cpp +++ b/Marlin/src/feature/Max7219_Debug_LEDs.cpp @@ -51,23 +51,28 @@ * void Max7219_idle_tasks(); */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(MAX7219_DEBUG) #include "Max7219_Debug_LEDs.h" -#include "planner.h" -#include "stepper.h" -#include "Marlin.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../Marlin.h" +#include "../HAL/Delay.h" static uint8_t LEDs[8] = { 0 }; -// Delay for 0.1875µs (16MHz AVR) or 0.15µs (20MHz AVR) -#define SIG_DELAY() DELAY_3_NOP +#ifdef CPU_32_BIT + // Approximate a 1µs delay on 32-bit ARM + #define SIG_DELAY() DELAY_US(1) +#else + // Delay for 0.1875µs (16MHz AVR) or 0.15µs (20MHz AVR) + #define SIG_DELAY() DELAY_NS(188) +#endif void Max7219_PutByte(uint8_t data) { - CRITICAL_SECTION_START for (uint8_t i = 8; i--;) { SIG_DELAY(); WRITE(MAX7219_CLK_PIN, LOW); // tick @@ -78,12 +83,10 @@ void Max7219_PutByte(uint8_t data) { SIG_DELAY(); data <<= 1; } - CRITICAL_SECTION_END } void Max7219(const uint8_t reg, const uint8_t data) { SIG_DELAY(); - CRITICAL_SECTION_START WRITE(MAX7219_LOAD_PIN, LOW); // begin SIG_DELAY(); Max7219_PutByte(reg); // specify register @@ -93,7 +96,6 @@ void Max7219(const uint8_t reg, const uint8_t data) { WRITE(MAX7219_LOAD_PIN, LOW); // and tell the chip to load the data SIG_DELAY(); WRITE(MAX7219_LOAD_PIN, HIGH); - CRITICAL_SECTION_END SIG_DELAY(); } @@ -275,14 +277,14 @@ void Max7219_init() { */ void Max7219_idle_tasks() { #if MAX7219_DEBUG_STEPPER_HEAD || MAX7219_DEBUG_STEPPER_TAIL || MAX7219_DEBUG_STEPPER_QUEUE - CRITICAL_SECTION_START + CRITICAL_SECTION_START; #if MAX7219_DEBUG_STEPPER_HEAD || MAX7219_DEBUG_STEPPER_QUEUE const uint8_t head = planner.block_buffer_head; #endif #if MAX7219_DEBUG_STEPPER_TAIL || MAX7219_DEBUG_STEPPER_QUEUE const uint8_t tail = planner.block_buffer_tail; #endif - CRITICAL_SECTION_END + CRITICAL_SECTION_END; #endif static uint16_t refresh_cnt = 0; // The Max7219 circuit boards available for several dollars on eBay @@ -341,8 +343,8 @@ void Max7219_idle_tasks() { NOMORE(current_depth, 16); // if the BLOCK_BUFFER_SIZE is greater than 16, two lines // of LEDs is enough to see if the buffer is draining - const uint8_t st = min(current_depth, last_depth), - en = max(current_depth, last_depth); + const uint8_t st = MIN(current_depth, last_depth), + en = MAX(current_depth, last_depth); if (current_depth < last_depth) for (uint8_t i = st; i <= en; i++) // clear the highest order LEDs Max7219_LED_Off(MAX7219_DEBUG_STEPPER_QUEUE + (i & 1), i / 2); diff --git a/Marlin/Max7219_Debug_LEDs.h b/Marlin/src/feature/Max7219_Debug_LEDs.h similarity index 100% rename from Marlin/Max7219_Debug_LEDs.h rename to Marlin/src/feature/Max7219_Debug_LEDs.h diff --git a/Marlin/src/feature/baricuda.cpp b/Marlin/src/feature/baricuda.cpp new file mode 100644 index 0000000000..c74e4b60bd --- /dev/null +++ b/Marlin/src/feature/baricuda.cpp @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(BARICUDA) + +#include "baricuda.h" + +uint8_t baricuda_valve_pressure = 0, + baricuda_e_to_p_pressure = 0; + +#endif // BARICUDA diff --git a/Marlin/src/feature/baricuda.h b/Marlin/src/feature/baricuda.h new file mode 100644 index 0000000000..7ed23925b8 --- /dev/null +++ b/Marlin/src/feature/baricuda.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __BARICUDA_H__ +#define __BARICUDA_H__ + +extern uint8_t baricuda_valve_pressure, + baricuda_e_to_p_pressure; + +#endif // __BARICUDA_H__ diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp new file mode 100644 index 0000000000..4b7658f8d3 --- /dev/null +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -0,0 +1,434 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + +#include "abl.h" + +#include "../../../module/motion.h" + +int bilinear_grid_spacing[2], bilinear_start[2]; +float bilinear_grid_factor[2], + z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + +/** + * Extrapolate a single point from its neighbors + */ +static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("Extrapolate ["); + if (x < 10) SERIAL_CHAR(' '); + SERIAL_ECHO((int)x); + SERIAL_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); + SERIAL_CHAR(' '); + if (y < 10) SERIAL_CHAR(' '); + SERIAL_ECHO((int)y); + SERIAL_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); + SERIAL_CHAR(']'); + } + #endif + if (!isnan(z_values[x][y])) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM(" (done)"); + #endif + return; // Don't overwrite good values. + } + SERIAL_EOL(); + + // Get X neighbors, Y neighbors, and XY neighbors + const uint8_t x1 = x + xdir, y1 = y + ydir, x2 = x1 + xdir, y2 = y1 + ydir; + float a1 = z_values[x1][y ], a2 = z_values[x2][y ], + b1 = z_values[x ][y1], b2 = z_values[x ][y2], + c1 = z_values[x1][y1], c2 = z_values[x2][y2]; + + // Treat far unprobed points as zero, near as equal to far + if (isnan(a2)) a2 = 0.0; + if (isnan(a1)) a1 = a2; + if (isnan(b2)) b2 = 0.0; + if (isnan(b1)) b1 = b2; + if (isnan(c2)) c2 = 0.0; + if (isnan(c1)) c1 = c2; + + const float a = 2 * a1 - a2, b = 2 * b1 - b2, c = 2 * c1 - c2; + + // Take the average instead of the median + z_values[x][y] = (a + b + c) / 3.0; + + // Median is robust (ignores outliers). + // z_values[x][y] = (a < b) ? ((b < c) ? b : (c < a) ? a : c) + // : ((c < b) ? b : (a < c) ? a : c); +} + +//Enable this if your SCARA uses 180° of total area +//#define EXTRAPOLATE_FROM_EDGE + +#if ENABLED(EXTRAPOLATE_FROM_EDGE) + #if GRID_MAX_POINTS_X < GRID_MAX_POINTS_Y + #define HALF_IN_X + #elif GRID_MAX_POINTS_Y < GRID_MAX_POINTS_X + #define HALF_IN_Y + #endif +#endif + +/** + * Fill in the unprobed points (corners of circular print surface) + * using linear extrapolation, away from the center. + */ +void extrapolate_unprobed_bed_level() { + #ifdef HALF_IN_X + constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; + #else + constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center + ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center + xlen = ctrx1; + #endif + + #ifdef HALF_IN_Y + constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; + #else + constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center + ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center + ylen = ctry1; + #endif + + for (uint8_t xo = 0; xo <= xlen; xo++) + for (uint8_t yo = 0; yo <= ylen; yo++) { + uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; + #ifndef HALF_IN_X + const uint8_t x1 = ctrx1 - xo; + #endif + #ifndef HALF_IN_Y + const uint8_t y1 = ctry1 - yo; + #ifndef HALF_IN_X + extrapolate_one_point(x1, y1, +1, +1); // left-below + + + #endif + extrapolate_one_point(x2, y1, -1, +1); // right-below - + + #endif + #ifndef HALF_IN_X + extrapolate_one_point(x1, y2, +1, -1); // left-above + - + #endif + extrapolate_one_point(x2, y2, -1, -1); // right-above - - + } + +} + +void print_bilinear_leveling_grid() { + SERIAL_ECHOLNPGM("Bilinear Leveling Grid:"); + print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 3, + [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } + ); +} + +#if ENABLED(ABL_BILINEAR_SUBDIVISION) + + #define ABL_GRID_POINTS_VIRT_X (GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_Y (GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) + #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) + float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; + int bilinear_grid_spacing_virt[2] = { 0 }; + float bilinear_grid_factor_virt[2] = { 0 }; + + void print_bilinear_leveling_grid_virt() { + SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); + print_2d_array(ABL_GRID_POINTS_VIRT_X, ABL_GRID_POINTS_VIRT_Y, 5, + [](const uint8_t ix, const uint8_t iy) { return z_values_virt[ix][iy]; } + ); + } + + #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) + float bed_level_virt_coord(const uint8_t x, const uint8_t y) { + uint8_t ep = 0, ip = 1; + if (!x || x == ABL_TEMP_POINTS_X - 1) { + if (x) { + ep = GRID_MAX_POINTS_X - 1; + ip = GRID_MAX_POINTS_X - 2; + } + if (WITHIN(y, 1, ABL_TEMP_POINTS_Y - 2)) + return LINEAR_EXTRAPOLATION( + z_values[ep][y - 1], + z_values[ip][y - 1] + ); + else + return LINEAR_EXTRAPOLATION( + bed_level_virt_coord(ep + 1, y), + bed_level_virt_coord(ip + 1, y) + ); + } + if (!y || y == ABL_TEMP_POINTS_Y - 1) { + if (y) { + ep = GRID_MAX_POINTS_Y - 1; + ip = GRID_MAX_POINTS_Y - 2; + } + if (WITHIN(x, 1, ABL_TEMP_POINTS_X - 2)) + return LINEAR_EXTRAPOLATION( + z_values[x - 1][ep], + z_values[x - 1][ip] + ); + else + return LINEAR_EXTRAPOLATION( + bed_level_virt_coord(x, ep + 1), + bed_level_virt_coord(x, ip + 1) + ); + } + return z_values[x - 1][y - 1]; + } + + static float bed_level_virt_cmr(const float p[4], const uint8_t i, const float t) { + return ( + p[i-1] * -t * sq(1 - t) + + p[i] * (2 - 5 * sq(t) + 3 * t * sq(t)) + + p[i+1] * t * (1 + 4 * t - 3 * sq(t)) + - p[i+2] * sq(t) * (1 - t) + ) * 0.5; + } + + static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { + float row[4], column[4]; + for (uint8_t i = 0; i < 4; i++) { + for (uint8_t j = 0; j < 4; j++) { + column[j] = bed_level_virt_coord(i + x - 1, j + y - 1); + } + row[i] = bed_level_virt_cmr(column, 1, ty); + } + return bed_level_virt_cmr(row, 1, tx); + } + + void bed_level_virt_interpolate() { + bilinear_grid_spacing_virt[X_AXIS] = bilinear_grid_spacing[X_AXIS] / (BILINEAR_SUBDIVISIONS); + bilinear_grid_spacing_virt[Y_AXIS] = bilinear_grid_spacing[Y_AXIS] / (BILINEAR_SUBDIVISIONS); + bilinear_grid_factor_virt[X_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[X_AXIS]); + bilinear_grid_factor_virt[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[Y_AXIS]); + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ty++) + for (uint8_t tx = 0; tx < BILINEAR_SUBDIVISIONS; tx++) { + if ((ty && y == GRID_MAX_POINTS_Y - 1) || (tx && x == GRID_MAX_POINTS_X - 1)) + continue; + z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = + bed_level_virt_2cmr( + x + 1, + y + 1, + (float)tx / (BILINEAR_SUBDIVISIONS), + (float)ty / (BILINEAR_SUBDIVISIONS) + ); + } + } +#endif // ABL_BILINEAR_SUBDIVISION + +// Refresh after other values have been updated +void refresh_bed_level() { + bilinear_grid_factor[X_AXIS] = RECIPROCAL(bilinear_grid_spacing[X_AXIS]); + bilinear_grid_factor[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing[Y_AXIS]); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif +} + +#if ENABLED(ABL_BILINEAR_SUBDIVISION) + #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt[A] + #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt[A] + #define ABL_BG_POINTS_X ABL_GRID_POINTS_VIRT_X + #define ABL_BG_POINTS_Y ABL_GRID_POINTS_VIRT_Y + #define ABL_BG_GRID(X,Y) z_values_virt[X][Y] +#else + #define ABL_BG_SPACING(A) bilinear_grid_spacing[A] + #define ABL_BG_FACTOR(A) bilinear_grid_factor[A] + #define ABL_BG_POINTS_X GRID_MAX_POINTS_X + #define ABL_BG_POINTS_Y GRID_MAX_POINTS_Y + #define ABL_BG_GRID(X,Y) z_values[X][Y] +#endif + +// Get the Z adjustment for non-linear bed leveling +float bilinear_z_offset(const float raw[XYZ]) { + + static float z1, d2, z3, d4, L, D, ratio_x, ratio_y, + last_x = -999.999, last_y = -999.999; + + // Whole units for the grid line indices. Constrained within bounds. + static int8_t gridx, gridy, nextx, nexty, + last_gridx = -99, last_gridy = -99; + + // XY relative to the probed area + const float rx = raw[X_AXIS] - bilinear_start[X_AXIS], + ry = raw[Y_AXIS] - bilinear_start[Y_AXIS]; + + #if ENABLED(EXTRAPOLATE_BEYOND_GRID) + // Keep using the last grid box + #define FAR_EDGE_OR_BOX 2 + #else + // Just use the grid far edge + #define FAR_EDGE_OR_BOX 1 + #endif + + if (last_x != rx) { + last_x = rx; + ratio_x = rx * ABL_BG_FACTOR(X_AXIS); + const float gx = constrain(FLOOR(ratio_x), 0, ABL_BG_POINTS_X - FAR_EDGE_OR_BOX); + ratio_x -= gx; // Subtract whole to get the ratio within the grid box + + #if DISABLED(EXTRAPOLATE_BEYOND_GRID) + // Beyond the grid maintain height at grid edges + NOLESS(ratio_x, 0); // Never < 0.0. (> 1.0 is ok when nextx==gridx.) + #endif + + gridx = gx; + nextx = MIN(gridx + 1, ABL_BG_POINTS_X - 1); + } + + if (last_y != ry || last_gridx != gridx) { + + if (last_y != ry) { + last_y = ry; + ratio_y = ry * ABL_BG_FACTOR(Y_AXIS); + const float gy = constrain(FLOOR(ratio_y), 0, ABL_BG_POINTS_Y - FAR_EDGE_OR_BOX); + ratio_y -= gy; + + #if DISABLED(EXTRAPOLATE_BEYOND_GRID) + // Beyond the grid maintain height at grid edges + NOLESS(ratio_y, 0); // Never < 0.0. (> 1.0 is ok when nexty==gridy.) + #endif + + gridy = gy; + nexty = MIN(gridy + 1, ABL_BG_POINTS_Y - 1); + } + + if (last_gridx != gridx || last_gridy != gridy) { + last_gridx = gridx; + last_gridy = gridy; + // Z at the box corners + z1 = ABL_BG_GRID(gridx, gridy); // left-front + d2 = ABL_BG_GRID(gridx, nexty) - z1; // left-back (delta) + z3 = ABL_BG_GRID(nextx, gridy); // right-front + d4 = ABL_BG_GRID(nextx, nexty) - z3; // right-back (delta) + } + + // Bilinear interpolate. Needed since ry or gridx has changed. + L = z1 + d2 * ratio_y; // Linear interp. LF -> LB + const float R = z3 + d4 * ratio_y; // Linear interp. RF -> RB + + D = R - L; + } + + const float offset = L + ratio_x * D; // the offset almost always changes + + /* + static float last_offset = 0; + if (ABS(last_offset - offset) > 0.2) { + SERIAL_ECHOPGM("Sudden Shift at "); + SERIAL_ECHOPAIR("x=", rx); + SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[X_AXIS]); + SERIAL_ECHOLNPAIR(" -> gridx=", gridx); + SERIAL_ECHOPAIR(" y=", ry); + SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[Y_AXIS]); + SERIAL_ECHOLNPAIR(" -> gridy=", gridy); + SERIAL_ECHOPAIR(" ratio_x=", ratio_x); + SERIAL_ECHOLNPAIR(" ratio_y=", ratio_y); + SERIAL_ECHOPAIR(" z1=", z1); + SERIAL_ECHOPAIR(" z2=", z2); + SERIAL_ECHOPAIR(" z3=", z3); + SERIAL_ECHOLNPAIR(" z4=", z4); + SERIAL_ECHOPAIR(" L=", L); + SERIAL_ECHOPAIR(" R=", R); + SERIAL_ECHOLNPAIR(" offset=", offset); + } + last_offset = offset; + //*/ + + return offset; +} + +#if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + + #define CELL_INDEX(A,V) ((V - bilinear_start[_AXIS(A)]) * ABL_BG_FACTOR(_AXIS(A))) + + /** + * Prepare a bilinear-leveled linear move on Cartesian, + * splitting the move where it crosses grid borders. + */ + void bilinear_line_to_destination(const float fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + // Get current and destination cells for this line + int cx1 = CELL_INDEX(X, current_position[X_AXIS]), + cy1 = CELL_INDEX(Y, current_position[Y_AXIS]), + cx2 = CELL_INDEX(X, destination[X_AXIS]), + cy2 = CELL_INDEX(Y, destination[Y_AXIS]); + cx1 = constrain(cx1, 0, ABL_BG_POINTS_X - 2); + cy1 = constrain(cy1, 0, ABL_BG_POINTS_Y - 2); + cx2 = constrain(cx2, 0, ABL_BG_POINTS_X - 2); + cy2 = constrain(cy2, 0, ABL_BG_POINTS_Y - 2); + + // Start and end in the same cell? No split needed. + if (cx1 == cx2 && cy1 == cy2) { + buffer_line_to_destination(fr_mm_s); + set_current_from_destination(); + return; + } + + #define LINE_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) + + float normalized_dist, end[XYZE]; + const int8_t gcx = MAX(cx1, cx2), gcy = MAX(cy1, cy2); + + // Crosses on the X and not already split on this X? + // The x_splits flags are insurance against rounding errors. + if (cx2 != cx1 && TEST(x_splits, gcx)) { + // Split on the X grid line + CBI(x_splits, gcx); + COPY(end, destination); + destination[X_AXIS] = bilinear_start[X_AXIS] + ABL_BG_SPACING(X_AXIS) * gcx; + normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); + destination[Y_AXIS] = LINE_SEGMENT_END(Y); + } + // Crosses on the Y and not already split on this Y? + else if (cy2 != cy1 && TEST(y_splits, gcy)) { + // Split on the Y grid line + CBI(y_splits, gcy); + COPY(end, destination); + destination[Y_AXIS] = bilinear_start[Y_AXIS] + ABL_BG_SPACING(Y_AXIS) * gcy; + normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); + destination[X_AXIS] = LINE_SEGMENT_END(X); + } + else { + // Must already have been split on these border(s) + // This should be a rare case. + buffer_line_to_destination(fr_mm_s); + set_current_from_destination(); + return; + } + + destination[Z_AXIS] = LINE_SEGMENT_END(Z); + destination[E_AXIS] = LINE_SEGMENT_END(E); + + // Do the split and look for more borders + bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); + + // Restore destination from stack + COPY(destination, end); + bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); + } + +#endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES + +#endif // AUTO_BED_LEVELING_BILINEAR diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h new file mode 100644 index 0000000000..0ac1f424bb --- /dev/null +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -0,0 +1,51 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __ABL_H__ +#define __ABL_H__ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + #include "../bedlevel.h" + + extern int bilinear_grid_spacing[2], bilinear_start[2]; + extern float bilinear_grid_factor[2], + z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + float bilinear_z_offset(const float raw[XYZ]); + + void extrapolate_unprobed_bed_level(); + void print_bilinear_leveling_grid(); + void refresh_bed_level(); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + void print_bilinear_leveling_grid_virt(); + void bed_level_virt_interpolate(); + #endif + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + void bilinear_line_to_destination(const float fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); + #endif + +#endif // AUTO_BED_LEVELING_BILINEAR + +#endif // __ABL_H__ diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp new file mode 100644 index 0000000000..797a9dc506 --- /dev/null +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -0,0 +1,287 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_LEVELING + +#include "bedlevel.h" + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) + #include "../../module/motion.h" +#endif + +#if PLANNER_LEVELING + #include "../../module/planner.h" +#endif + +#if ENABLED(PROBE_MANUALLY) + bool g29_in_progress = false; +#endif + +#if ENABLED(LCD_BED_LEVELING) + #include "../../lcd/ultralcd.h" +#endif + +#if ENABLED(G26_MESH_VALIDATION) + bool g26_debug_flag; // = false +#endif + +bool leveling_is_valid() { + return + #if ENABLED(MESH_BED_LEVELING) + mbl.has_mesh() + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + !!bilinear_grid_spacing[X_AXIS] + #elif ENABLED(AUTO_BED_LEVELING_UBL) + ubl.mesh_is_valid() + #else // 3POINT, LINEAR + true + #endif + ; +} + +/** + * Turn bed leveling on or off, fixing the current + * position as-needed. + * + * Disable: Current position = physical position + * Enable: Current position = "unleveled" physical position + */ +void set_bed_leveling_enabled(const bool enable/*=true*/) { + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const bool can_change = (!enable || leveling_is_valid()); + #else + constexpr bool can_change = true; + #endif + + if (can_change && enable != planner.leveling_active) { + + #if ENABLED(MESH_BED_LEVELING) + + if (!enable) + planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); + + const bool enabling = enable && leveling_is_valid(); + planner.leveling_active = enabling; + if (enabling) planner.unapply_leveling(current_position); + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + #if PLANNER_LEVELING + if (planner.leveling_active) { // leveling from on to off + // change unleveled current_position to physical current_position without moving steppers. + planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); + planner.leveling_active = false; // disable only AFTER calling apply_leveling + } + else { // leveling from off to on + planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored + // change physical current_position to unleveled current_position without moving steppers. + planner.unapply_leveling(current_position); + } + #else + // UBL equivalents for apply/unapply_leveling + #if ENABLED(SKEW_CORRECTION) + float pos[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + planner.skew(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS]); + #else + const float (&pos)[XYZE] = current_position; + #endif + if (planner.leveling_active) { + current_position[Z_AXIS] += ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); + planner.leveling_active = false; + } + else { + planner.leveling_active = true; + current_position[Z_AXIS] -= ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); + } + #endif + + #else // OLDSCHOOL_ABL + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + // Force bilinear_z_offset to re-calculate next time + const float reset[XYZ] = { -9999.999, -9999.999, 0 }; + (void)bilinear_z_offset(reset); + #endif + + // Enable or disable leveling compensation in the planner + planner.leveling_active = enable; + + if (!enable) + // When disabling just get the current position from the steppers. + // This will yield the smallest error when first converted back to steps. + set_current_from_steppers_for_axis( + #if ABL_PLANAR + ALL_AXES + #else + Z_AXIS + #endif + ); + else + // When enabling, remove compensation from the current position, + // so compensation will give the right stepper counts. + planner.unapply_leveling(current_position); + + SYNC_PLAN_POSITION_KINEMATIC(); + + #endif // OLDSCHOOL_ABL + } +} + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + + void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { + + if (planner.z_fade_height == zfh) return; + + const bool leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + + planner.set_z_fade_height(zfh); + + if (leveling_was_active) { + const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + set_bed_leveling_enabled(true); + if (do_report && memcmp(oldpos, current_position, sizeof(oldpos))) + report_current_position(); + } + } + +#endif // ENABLE_LEVELING_FADE_HEIGHT + +/** + * Reset calibration results to zero. + */ +void reset_bed_level() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level"); + #endif + set_bed_leveling_enabled(false); + #if ENABLED(MESH_BED_LEVELING) + mbl.reset(); + #elif ENABLED(AUTO_BED_LEVELING_UBL) + ubl.reset(); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_start[X_AXIS] = bilinear_start[Y_AXIS] = + bilinear_grid_spacing[X_AXIS] = bilinear_grid_spacing[Y_AXIS] = 0; + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + z_values[x][y] = NAN; + #elif ABL_PLANAR + planner.bed_level_matrix.set_to_identity(); + #endif +} + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) + + /** + * Enable to produce output in JSON format suitable + * for SCAD or JavaScript mesh visualizers. + * + * Visualize meshes in OpenSCAD using the included script. + * + * buildroot/shared/scripts/MarlinMesh.scad + */ + //#define SCAD_MESH_OUTPUT + + /** + * Print calibration results for plotting or manual frame adjustment. + */ + void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn) { + #ifndef SCAD_MESH_OUTPUT + for (uint8_t x = 0; x < sx; x++) { + for (uint8_t i = 0; i < precision + 2 + (x < 10 ? 1 : 0); i++) + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL((int)x); + } + SERIAL_EOL(); + #endif + #ifdef SCAD_MESH_OUTPUT + SERIAL_PROTOCOLLNPGM("measured_z = ["); // open 2D array + #endif + for (uint8_t y = 0; y < sy; y++) { + #ifdef SCAD_MESH_OUTPUT + SERIAL_PROTOCOLPGM(" ["); // open sub-array + #else + if (y < 10) SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL((int)y); + #endif + for (uint8_t x = 0; x < sx; x++) { + SERIAL_PROTOCOLCHAR(' '); + const float offset = fn(x, y); + if (!isnan(offset)) { + if (offset >= 0) SERIAL_PROTOCOLCHAR('+'); + SERIAL_PROTOCOL_F(offset, precision); + } + else { + #ifdef SCAD_MESH_OUTPUT + for (uint8_t i = 3; i < precision + 3; i++) + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOLPGM("NAN"); + #else + for (uint8_t i = 0; i < precision + 3; i++) + SERIAL_PROTOCOLCHAR(i ? '=' : ' '); + #endif + } + #ifdef SCAD_MESH_OUTPUT + if (x < sx - 1) SERIAL_PROTOCOLCHAR(','); + #endif + } + #ifdef SCAD_MESH_OUTPUT + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOLCHAR(']'); // close sub-array + if (y < sy - 1) SERIAL_PROTOCOLCHAR(','); + #endif + SERIAL_EOL(); + } + #ifdef SCAD_MESH_OUTPUT + SERIAL_PROTOCOLPGM("];"); // close 2D array + #endif + SERIAL_EOL(); + } + +#endif // AUTO_BED_LEVELING_BILINEAR || MESH_BED_LEVELING + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) + + void _manual_goto_xy(const float &rx, const float &ry) { + + #if MANUAL_PROBE_HEIGHT > 0 + const float prev_z = current_position[Z_AXIS]; + do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); + do_blocking_move_to_z(prev_z); + #else + do_blocking_move_to_xy(rx, ry); + #endif + + current_position[X_AXIS] = rx; + current_position[Y_AXIS] = ry; + + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif + } + +#endif + +#endif // HAS_LEVELING diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h new file mode 100644 index 0000000000..3db5aabd68 --- /dev/null +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __BEDLEVEL_H__ +#define __BEDLEVEL_H__ + +#include "../../inc/MarlinConfigPre.h" + +typedef struct { + int8_t x_index, y_index; + float distance; // When populated, the distance from the search location +} mesh_index_pair; + +#if ENABLED(G26_MESH_VALIDATION) + extern bool g26_debug_flag; +#else + constexpr bool g26_debug_flag = false; +#endif + +#if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; +#else + constexpr bool g29_in_progress = false; +#endif + +bool leveling_is_valid(); +void set_bed_leveling_enabled(const bool enable=true); +void reset_bed_level(); + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + void set_z_fade_height(const float zfh, const bool do_report=true); +#endif + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) + + #include + + typedef float (*element_2d_fn)(const uint8_t, const uint8_t); + + /** + * Print calibration results for plotting or manual frame adjustment. + */ + void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn); + +#endif + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) + void _manual_goto_xy(const float &x, const float &y); +#endif + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #define _GET_MESH_X(I) (bilinear_start[X_AXIS] + (I) * bilinear_grid_spacing[X_AXIS]) + #define _GET_MESH_Y(J) (bilinear_start[Y_AXIS] + (J) * bilinear_grid_spacing[Y_AXIS]) +#elif ENABLED(AUTO_BED_LEVELING_UBL) + #define _GET_MESH_X(I) ubl.mesh_index_to_xpos(I) + #define _GET_MESH_Y(J) ubl.mesh_index_to_ypos(J) +#elif ENABLED(MESH_BED_LEVELING) + #define _GET_MESH_X(I) mbl.index_to_xpos[I] + #define _GET_MESH_Y(J) mbl.index_to_ypos[J] +#endif + +#if ENABLED(MESH_BED_LEVELING) + #include "mbl/mesh_bed_leveling.h" +#elif ENABLED(AUTO_BED_LEVELING_UBL) + #include "ubl/ubl.h" +#elif HAS_ABL + #include "abl/abl.h" +#endif + +#endif // __BEDLEVEL_H__ diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp new file mode 100644 index 0000000000..36812b6355 --- /dev/null +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MESH_BED_LEVELING) + + #include "mesh_bed_leveling.h" + + #include "../../../module/motion.h" + #include "../../../feature/bedlevel/bedlevel.h" + + mesh_bed_leveling mbl; + + float mesh_bed_leveling::z_offset, + mesh_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y], + mesh_bed_leveling::index_to_xpos[GRID_MAX_POINTS_X], + mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; + + mesh_bed_leveling::mesh_bed_leveling() { + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) + index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); + for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) + index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); + reset(); + } + + void mesh_bed_leveling::reset() { + z_offset = 0; + ZERO(z_values); + } + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + + /** + * Prepare a mesh-leveled linear move in a Cartesian setup, + * splitting the move where it crosses mesh borders. + */ + void mesh_bed_leveling::line_to_destination(const float fr_mm_s, uint8_t x_splits, uint8_t y_splits) { + // Get current and destination cells for this line + int cx1 = cell_index_x(current_position[X_AXIS]), + cy1 = cell_index_y(current_position[Y_AXIS]), + cx2 = cell_index_x(destination[X_AXIS]), + cy2 = cell_index_y(destination[Y_AXIS]); + NOMORE(cx1, GRID_MAX_POINTS_X - 2); + NOMORE(cy1, GRID_MAX_POINTS_Y - 2); + NOMORE(cx2, GRID_MAX_POINTS_X - 2); + NOMORE(cy2, GRID_MAX_POINTS_Y - 2); + + // Start and end in the same cell? No split needed. + if (cx1 == cx2 && cy1 == cy2) { + line_to_destination(fr_mm_s); + set_current_from_destination(); + return; + } + + #define MBL_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) + + float normalized_dist, end[XYZE]; + const int8_t gcx = MAX(cx1, cx2), gcy = MAX(cy1, cy2); + + // Crosses on the X and not already split on this X? + // The x_splits flags are insurance against rounding errors. + if (cx2 != cx1 && TEST(x_splits, gcx)) { + // Split on the X grid line + CBI(x_splits, gcx); + COPY(end, destination); + destination[X_AXIS] = index_to_xpos[gcx]; + normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); + destination[Y_AXIS] = MBL_SEGMENT_END(Y); + } + // Crosses on the Y and not already split on this Y? + else if (cy2 != cy1 && TEST(y_splits, gcy)) { + // Split on the Y grid line + CBI(y_splits, gcy); + COPY(end, destination); + destination[Y_AXIS] = index_to_ypos[gcy]; + normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); + destination[X_AXIS] = MBL_SEGMENT_END(X); + } + else { + // Must already have been split on these border(s) + // This should be a rare case. + line_to_destination(fr_mm_s); + set_current_from_destination(); + return; + } + + destination[Z_AXIS] = MBL_SEGMENT_END(Z); + destination[E_AXIS] = MBL_SEGMENT_END(E); + + // Do the split and look for more borders + line_to_destination(fr_mm_s, x_splits, y_splits); + + // Restore destination from stack + COPY(destination, end); + line_to_destination(fr_mm_s, x_splits, y_splits); + } + + #endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES + + void mesh_bed_leveling::report_mesh() { + SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(GRID_MAX_POINTS_X) "," STRINGIFY(GRID_MAX_POINTS_Y)); + SERIAL_PROTOCOLPGM("Z offset: "); SERIAL_PROTOCOL_F(z_offset, 5); + SERIAL_PROTOCOLLNPGM("\nMeasured points:"); + print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 5, + [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } + ); + } + +#endif // MESH_BED_LEVELING diff --git a/Marlin/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h similarity index 94% rename from Marlin/mesh_bed_leveling.h rename to Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index f3a374af59..94dadeccf0 100644 --- a/Marlin/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -23,7 +23,7 @@ #ifndef _MESH_BED_LEVELING_H_ #define _MESH_BED_LEVELING_H_ -#include "MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" enum MeshLevelingState : char { MeshReport, @@ -113,6 +113,10 @@ public: #endif ; } + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + static void line_to_destination(const float fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); + #endif }; extern mesh_bed_leveling mbl; diff --git a/Marlin/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp similarity index 86% rename from Marlin/ubl.cpp rename to Marlin/src/feature/bedlevel/ubl/ubl.cpp index df9c212bbf..143d7a0fcc 100644 --- a/Marlin/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -20,44 +20,64 @@ * */ -#include "MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "Marlin.h" #include "ubl.h" - #include "hex_print_routines.h" - #include "temperature.h" - #include "planner.h" - #include "math.h" - unified_bed_leveling ubl; + #include "../../../module/configuration_store.h" + #include "../../../module/planner.h" + #include "../../../module/motion.h" + #include "../../bedlevel/bedlevel.h" + + #include "math.h" + uint8_t ubl_cnt = 0; - void unified_bed_leveling::echo_name() { SERIAL_PROTOCOLPGM("Unified Bed Leveling"); } + void unified_bed_leveling::echo_name( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { + SERIAL_PROTOCOLPGM_P(port, "Unified Bed Leveling"); + } - void unified_bed_leveling::report_current_mesh() { + void unified_bed_leveling::report_current_mesh( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { if (!leveling_is_valid()) return; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(" G29 I999"); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPGM_P(port, " G29 I99"); for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) if (!isnan(z_values[x][y])) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" M421 I", x); - SERIAL_ECHOPAIR(" J", y); - SERIAL_ECHOPGM(" Z"); - SERIAL_ECHO_F(z_values[x][y], 2); - SERIAL_EOL(); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, " M421 I", x); + SERIAL_ECHOPAIR_P(port, " J", y); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, z_values[x][y], 2); + SERIAL_EOL_P(port); + safe_delay(75); // Prevent Printrun from exploding } } - void unified_bed_leveling::report_state() { - echo_name(); - SERIAL_PROTOCOLPGM(" System v" UBL_VERSION " "); - if (!planner.leveling_active) SERIAL_PROTOCOLPGM("in"); - SERIAL_PROTOCOLLNPGM("active."); + void unified_bed_leveling::report_state( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { + echo_name( + #if NUM_SERIAL > 1 + port + #endif + ); + SERIAL_PROTOCOLPGM_P(port, " System v" UBL_VERSION " "); + if (!planner.leveling_active) SERIAL_PROTOCOLPGM_P(port, "in"); + SERIAL_PROTOCOLLNPGM_P(port, "active."); safe_delay(50); } @@ -241,16 +261,13 @@ if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Space for positive ('-' for negative) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits } - idle(); if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); // Closing Brace or Space if (human) SERIAL_CHAR(is_current ? ']' : ' '); - #if TX_BUFFER_SIZE > 0 - SERIAL_FLUSHTX(); - #endif - safe_delay(5); + SERIAL_FLUSHTX(); + idle(); } if (!lcd) SERIAL_EOL(); diff --git a/Marlin/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h similarity index 93% rename from Marlin/ubl.h rename to Marlin/src/feature/bedlevel/ubl/ubl.h index 5a401df2f8..eb88234823 100644 --- a/Marlin/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -23,14 +23,12 @@ #ifndef UNIFIED_BED_LEVELING_H #define UNIFIED_BED_LEVELING_H -#include "MarlinConfig.h" - //#define UBL_DEVEL_DEBUGGING -#include "Marlin.h" -#include "planner.h" -#include "math.h" -#include "configuration_store.h" +#include "../bedlevel.h" +#include "../../../module/planner.h" +#include "../../../module/motion.h" +#include "../../../Marlin.h" #define UBL_VERSION "1.01" #define UBL_OK false @@ -53,15 +51,11 @@ enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; // External references -char *ftostr43sign(const float&, char); -void home_all_axes(); - extern uint8_t ubl_cnt; /////////////////////////////////////////////////////////////////////////////////////////////////////// #if ENABLED(ULTRA_LCD) - extern char lcd_status_message[]; void lcd_quick_feedback(const bool clear_buttons); #endif @@ -95,7 +89,7 @@ class unified_bed_leveling { static bool g29_parameter_parsing() _O0; static void shift_mesh_height(); - static void probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, bool do_furthest) _O0; + static void probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); static void g29_what_command(); @@ -106,9 +100,21 @@ class unified_bed_leveling { public: - static void echo_name(); - static void report_current_mesh(); - static void report_state(); + static void echo_name( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + static void report_current_mesh( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + static void report_state( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); static void save_ubl_active_state_and_disable(); static void restore_ubl_active_state_and_leave(); static void display_map(const int) _O0; @@ -235,7 +241,7 @@ class unified_bed_leveling { const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * (1.0 / (MESH_X_DIST)), z1 = z_values[x1_i][yi]; - return z1 + xratio * (z_values[min(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + return z1 + xratio * (z_values[MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array // If it is, it is clamped to the last element of the // z_values[][] array and no correction is applied. } @@ -269,7 +275,7 @@ class unified_bed_leveling { const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * (1.0 / (MESH_Y_DIST)), z1 = z_values[xi][y1_i]; - return z1 + yratio * (z_values[xi][min(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + return z1 + yratio * (z_values[xi][MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array // If it is, it is clamped to the last element of the // z_values[][] array and no correction is applied. } @@ -295,11 +301,11 @@ class unified_bed_leveling { const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[min(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); + mesh_index_to_xpos(cx + 1), z_values[MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][min(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[min(cx, GRID_MAX_POINTS_X - 2) + 1][min(cy, GRID_MAX_POINTS_Y - 2) + 1]); + mesh_index_to_xpos(cx), z_values[cx][MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[MIN(cx, GRID_MAX_POINTS_X - 2) + 1][MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, @@ -356,23 +362,15 @@ class unified_bed_leveling { static void line_to_destination_cartesian(const float &fr, const uint8_t e); #endif - #define _CMPZ(a,b) (z_values[a][b] == z_values[a][b+1]) - #define CMPZ(a) (_CMPZ(a, 0) && _CMPZ(a, 1)) - #define ZZER(a) (z_values[a][0] == 0) - - FORCE_INLINE bool mesh_is_valid() { - return !( - ( CMPZ(0) && CMPZ(1) && CMPZ(2) // adjacent z values all equal? - && ZZER(0) && ZZER(1) && ZZER(2) // all zero at the edge? - ) - || isnan(z_values[0][0]) - ); + inline static bool mesh_is_valid() { + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (isnan(z_values[x][y])) return false; + return true; } }; // class unified_bed_leveling extern unified_bed_leveling ubl; -FORCE_INLINE void gcode_G29() { ubl.G29(); } - #endif // UNIFIED_BED_LEVELING_H diff --git a/Marlin/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp similarity index 98% rename from Marlin/ubl_G29.cpp rename to Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index d28edc161b..2ed21e4acc 100644 --- a/Marlin/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -20,25 +20,30 @@ * */ -#include "MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if ENABLED(AUTO_BED_LEVELING_UBL) //#define UBL_DEVEL_DEBUGGING #include "ubl.h" - #include "Marlin.h" - #include "hex_print_routines.h" - #include "configuration_store.h" - #include "ultralcd.h" - #include "stepper.h" - #include "planner.h" - #include "parser.h" - #include "serial.h" - #include "bitmap_flags.h" + + #include "../../../Marlin.h" + #include "../../../libs/hex_print_routines.h" + #include "../../../module/configuration_store.h" + #include "../../../lcd/ultralcd.h" + #include "../../../module/stepper.h" + #include "../../../module/planner.h" + #include "../../../module/probe.h" + #include "../../../gcode/gcode.h" + #include "../../../core/serial.h" + #include "../../../gcode/parser.h" + #include "../../../feature/bedlevel/bedlevel.h" + #include "../../../libs/least_squares_fit.h" + + #include "../../../feature/Max7219_Debug_LEDs.h" #include - #include "least_squares_fit.h" #define UBL_G29_P31 @@ -295,7 +300,7 @@ if (axis_unhomed_error()) { const int8_t p_val = parser.intval('P', -1); if (p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J')) - home_all_axes(); + gcode.home_all_axes(); } // Invalidate Mesh Points. This command is a little bit asymmetrical because @@ -446,7 +451,7 @@ if (parser.seen('B')) { g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness((float) Z_CLEARANCE_BETWEEN_PROBES); - if (FABS(g29_card_thickness) > 1.5) { + if (ABS(g29_card_thickness) > 1.5) { SERIAL_PROTOCOLLNPGM("?Error in Business Card measurement."); return; } @@ -769,7 +774,7 @@ wait_for_release(); while (!is_lcd_clicked()) { idle(); - reset_stepper_timeout(); // Keep steppers powered + gcode.reset_stepper_timeout(); // Keep steppers powered if (encoder_diff) { do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * multiplier); encoder_diff = 0; @@ -791,8 +796,8 @@ save_ubl_active_state_and_disable(); // Disable bed level correction for probing do_blocking_move_to(0.5 * (MESH_MAX_X - (MESH_MIN_X)), 0.5 * (MESH_MAX_Y - (MESH_MIN_Y)), in_height); - //, min(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS]) / 2.0); - stepper.synchronize(); + //, MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS]) / 2.0); + planner.synchronize(); SERIAL_PROTOCOLPGM("Place shim under nozzle"); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); @@ -801,7 +806,7 @@ const float z1 = measure_point_with_encoder(); do_blocking_move_to_z(current_position[Z_AXIS] + SIZE_OF_LITTLE_RAISE); - stepper.synchronize(); + planner.synchronize(); SERIAL_PROTOCOLPGM("Remove shim"); LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); @@ -811,7 +816,7 @@ do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES); - const float thickness = abs(z1 - z2); + const float thickness = ABS(z1 - z2); if (g29_verbose_level > 1) { SERIAL_PROTOCOLPGM("Business Card is "); @@ -1379,7 +1384,7 @@ const float rawx = mesh_index_to_xpos(location.x_index), rawy = mesh_index_to_ypos(location.y_index); - if (!position_is_reachable(rawx, rawy)) break; // SHOULD NOT OCCUR because find_closest_mesh_point_of_type will only return reachable + if (!position_is_reachable(rawx, rawy)) break; // SHOULD NOT OCCUR because find_closest_mesh_point_of_type will only return reachable do_blocking_move_to(rawx, rawy, Z_CLEARANCE_BETWEEN_PROBES); // Move the nozzle to the edit point with probe clearance @@ -1491,13 +1496,13 @@ #if HAS_BED_PROBE - #include "vector_3.h" + #include "../../../libs/vector_3.h" void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { - constexpr int16_t x_min = max(MIN_PROBE_X, MESH_MIN_X), - x_max = min(MAX_PROBE_X, MESH_MAX_X), - y_min = max(MIN_PROBE_Y, MESH_MIN_Y), - y_max = min(MAX_PROBE_Y, MESH_MAX_Y); + constexpr int16_t x_min = MAX(MIN_PROBE_X, MESH_MIN_X), + x_max = MIN(MAX_PROBE_X, MESH_MAX_X), + y_min = MAX(MIN_PROBE_Y, MESH_MIN_Y), + y_max = MIN(MAX_PROBE_Y, MESH_MAX_Y); bool abort_flag = false; @@ -1765,7 +1770,7 @@ SERIAL_ECHOPGM("Extrapolating mesh..."); - const float weight_scaled = weight_factor * max(MESH_X_DIST, MESH_Y_DIST); + const float weight_scaled = weight_factor * MAX(MESH_X_DIST, MESH_Y_DIST); for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp new file mode 100644 index 0000000000..4900f0e0df --- /dev/null +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -0,0 +1,585 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + +#include "../bedlevel.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" +#include "../../../module/motion.h" + +#if ENABLED(DELTA) + #include "../../../module/delta.h" +#endif + +#include "../../../Marlin.h" +#include + +#if AVR_AT90USB1286_FAMILY // Teensyduino & Printrboard IDE extensions have compile errors without this + inline void set_current_from_destination() { COPY(current_position, destination); } +#else + extern void set_current_from_destination(); +#endif + +#if !UBL_SEGMENTED + + void unified_bed_leveling::line_to_destination_cartesian(const float &feed_rate, const uint8_t extruder) { + /** + * Much of the nozzle movement will be within the same cell. So we will do as little computation + * as possible to determine if this is the case. If this move is within the same cell, we will + * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave + */ + #if ENABLED(SKEW_CORRECTION) + // For skew correction just adjust the destination point and we're done + float start[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }, + end[XYZE] = { destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS] }; + planner.skew(start[X_AXIS], start[Y_AXIS], start[Z_AXIS]); + planner.skew(end[X_AXIS], end[Y_AXIS], end[Z_AXIS]); + #else + const float (&start)[XYZE] = current_position, + (&end)[XYZE] = destination; + #endif + + const int cell_start_xi = get_cell_index_x(start[X_AXIS]), + cell_start_yi = get_cell_index_y(start[Y_AXIS]), + cell_dest_xi = get_cell_index_x(end[X_AXIS]), + cell_dest_yi = get_cell_index_y(end[Y_AXIS]); + + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" ubl.line_to_destination_cartesian(xe=", destination[X_AXIS]); + SERIAL_ECHOPAIR(", ye=", destination[Y_AXIS]); + SERIAL_ECHOPAIR(", ze=", destination[Z_AXIS]); + SERIAL_ECHOPAIR(", ee=", destination[E_AXIS]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + debug_current_and_destination(PSTR("Start of ubl.line_to_destination_cartesian()")); + } + + // A move within the same cell needs no splitting + if (cell_start_xi == cell_dest_xi && cell_start_yi == cell_dest_yi) { + + // For a move off the bed, use a constant Z raise + if (!WITHIN(cell_dest_xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cell_dest_yi, 0, GRID_MAX_POINTS_Y - 1)) { + + // Note: There is no Z Correction in this case. We are off the grid and don't know what + // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH + // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. + + const float z_raise = 0.0 + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + + UBL_Z_RAISE_WHEN_OFF_MESH + #endif + ; + planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + z_raise, end[E_AXIS], feed_rate, extruder); + set_current_from_destination(); + + if (g26_debug_flag) + debug_current_and_destination(PSTR("out of bounds in ubl.line_to_destination_cartesian()")); + + return; + } + + FINAL_MOVE: + + // The distance is always MESH_X_DIST so multiply by the constant reciprocal. + const float xratio = (end[X_AXIS] - mesh_index_to_xpos(cell_dest_xi)) * (1.0 / (MESH_X_DIST)); + + float z1 = z_values[cell_dest_xi ][cell_dest_yi ] + xratio * + (z_values[cell_dest_xi + 1][cell_dest_yi ] - z_values[cell_dest_xi][cell_dest_yi ]), + z2 = z_values[cell_dest_xi ][cell_dest_yi + 1] + xratio * + (z_values[cell_dest_xi + 1][cell_dest_yi + 1] - z_values[cell_dest_xi][cell_dest_yi + 1]); + + if (cell_dest_xi >= GRID_MAX_POINTS_X - 1) z1 = z2 = 0.0; + + // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. + const float yratio = (end[Y_AXIS] - mesh_index_to_ypos(cell_dest_yi)) * (1.0 / (MESH_Y_DIST)), + z0 = cell_dest_yi < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end[Z_AXIS]) : 0.0; + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + (isnan(z0) ? 0.0 : z0), end[E_AXIS], feed_rate, extruder); + + if (g26_debug_flag) + debug_current_and_destination(PSTR("FINAL_MOVE in ubl.line_to_destination_cartesian()")); + + set_current_from_destination(); + return; + } + + /** + * Past this point the move is known to cross one or more mesh lines. Check for the most common + * case - crossing only one X or Y line - after details are worked out to reduce computation. + */ + + const float dx = end[X_AXIS] - start[X_AXIS], + dy = end[Y_AXIS] - start[Y_AXIS]; + + const int left_flag = dx < 0.0 ? 1 : 0, + down_flag = dy < 0.0 ? 1 : 0; + + const float adx = left_flag ? -dx : dx, + ady = down_flag ? -dy : dy; + + const int dxi = cell_start_xi == cell_dest_xi ? 0 : left_flag ? -1 : 1, + dyi = cell_start_yi == cell_dest_yi ? 0 : down_flag ? -1 : 1; + + /** + * Compute the extruder scaling factor for each partial move, checking for + * zero-length moves that would result in an infinite scaling factor. + * A float divide is required for this, but then it just multiplies. + * Also select a scaling factor based on the larger of the X and Y + * components. The larger of the two is used to preserve precision. + */ + + const bool use_x_dist = adx > ady; + + float on_axis_distance = use_x_dist ? dx : dy, + e_position = end[E_AXIS] - start[E_AXIS], + z_position = end[Z_AXIS] - start[Z_AXIS]; + + const float e_normalized_dist = e_position / on_axis_distance, + z_normalized_dist = z_position / on_axis_distance; + + int current_xi = cell_start_xi, + current_yi = cell_start_yi; + + const float m = dy / dx, + c = start[Y_AXIS] - m * start[X_AXIS]; + + const bool inf_normalized_flag = (isinf(e_normalized_dist) != 0), + inf_m_flag = (isinf(m) != 0); + + /** + * Handle vertical lines that stay within one column. + * These need not be perfectly vertical. + */ + if (dxi == 0) { // Vertical line? + current_yi += down_flag; // Line going down? Just go to the bottom. + while (current_yi != cell_dest_yi + down_flag) { + current_yi += dyi; + const float next_mesh_line_y = mesh_index_to_ypos(current_yi); + + /** + * Skip the calculations for an infinite slope. + * For others the next X is the same so this can continue. + * Calculate X at the next Y mesh line. + */ + const float rx = inf_m_flag ? start[X_AXIS] : (next_mesh_line_y - c) / m; + + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi, current_yi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + const float ry = mesh_index_to_ypos(current_yi); + + /** + * Without this check, it's possible to generate a zero length move, as in the case where + * the line is heading down, starting exactly on a mesh line boundary. Since this is rare + * it might be fine to remove this check and let planner.buffer_segment() filter it out. + */ + if (ry != start[Y_AXIS]) { + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + } + else { + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; + } + + planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder); + } //else printf("FIRST MOVE PRUNED "); + } + + if (g26_debug_flag) + debug_current_and_destination(PSTR("vertical move done in ubl.line_to_destination_cartesian()")); + + // At the final destination? Usually not, but when on a Y Mesh Line it's completed. + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + goto FINAL_MOVE; + + set_current_from_destination(); + return; + } + + /** + * Handle horizontal lines that stay within one row. + * These need not be perfectly horizontal. + */ + if (dyi == 0) { // Horizontal line? + current_xi += left_flag; // Heading left? Just go to the left edge of the cell for the first move. + while (current_xi != cell_dest_xi + left_flag) { + current_xi += dxi; + const float next_mesh_line_x = mesh_index_to_xpos(current_xi), + ry = m * next_mesh_line_x + c; // Calculate Y at the next X mesh line + + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi, current_yi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + const float rx = mesh_index_to_xpos(current_xi); + + /** + * Without this check, it's possible to generate a zero length move, as in the case where + * the line is heading left, starting exactly on a mesh line boundary. Since this is rare + * it might be fine to remove this check and let planner.buffer_segment() filter it out. + */ + if (rx != start[X_AXIS]) { + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + } + else { + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; + } + + if (!planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder)) + break; + } //else printf("FIRST MOVE PRUNED "); + } + + if (g26_debug_flag) + debug_current_and_destination(PSTR("horizontal move done in ubl.line_to_destination_cartesian()")); + + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + goto FINAL_MOVE; + + set_current_from_destination(); + return; + } + + /** + * + * Handle the generic case of a line crossing both X and Y Mesh lines. + * + */ + + int xi_cnt = cell_start_xi - cell_dest_xi, + yi_cnt = cell_start_yi - cell_dest_yi; + + if (xi_cnt < 0) xi_cnt = -xi_cnt; + if (yi_cnt < 0) yi_cnt = -yi_cnt; + + current_xi += left_flag; + current_yi += down_flag; + + while (xi_cnt || yi_cnt) { + + const float next_mesh_line_x = mesh_index_to_xpos(current_xi + dxi), + next_mesh_line_y = mesh_index_to_ypos(current_yi + dyi), + ry = m * next_mesh_line_x + c, // Calculate Y at the next X mesh line + rx = (next_mesh_line_y - c) / m; // Calculate X at the next Y mesh line + // (No need to worry about m being zero. + // If that was the case, it was already detected + // as a vertical line move above.) + + if (left_flag == (rx > next_mesh_line_x)) { // Check if we hit the Y line first + // Yes! Crossing a Y Mesh Line next + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi - left_flag, current_yi + dyi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : next_mesh_line_y - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + } + else { + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; + } + if (!planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, feed_rate, extruder)) + break; + current_yi += dyi; + yi_cnt--; + } + else { + // Yes! Crossing a X Mesh Line next + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi + dxi, current_yi - down_flag) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? next_mesh_line_x - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; + } + else { + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; + } + + if (!planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, feed_rate, extruder)) + break; + current_xi += dxi; + xi_cnt--; + } + + if (xi_cnt < 0 || yi_cnt < 0) break; // Too far! Exit the loop and go to FINAL_MOVE + } + + if (g26_debug_flag) + debug_current_and_destination(PSTR("generic move done in ubl.line_to_destination_cartesian()")); + + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) + goto FINAL_MOVE; + + set_current_from_destination(); + } + +#else // UBL_SEGMENTED + + #if IS_SCARA // scale the feed rate from mm/s to degrees/s + static float scara_feed_factor, scara_oldA, scara_oldB; + #endif + + // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic, + // so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first. + + inline void _O2 ubl_buffer_segment_raw(const float (&in_raw)[XYZE], const float &fr) { + + #if ENABLED(SKEW_CORRECTION) + float raw[XYZE] = { in_raw[X_AXIS], in_raw[Y_AXIS], in_raw[Z_AXIS] }; + planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); + #else + const float (&raw)[XYZE] = in_raw; + #endif + + #if ENABLED(DELTA) // apply delta inverse_kinematics + + DELTA_IK(raw); + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], fr, active_extruder); + + #elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw) + + inverse_kinematics(raw); // this writes delta[ABC] from raw[XYZE] + // should move the feedrate scaling to scara inverse_kinematics + + const float adiff = ABS(delta[A_AXIS] - scara_oldA), + bdiff = ABS(delta[B_AXIS] - scara_oldB); + scara_oldA = delta[A_AXIS]; + scara_oldB = delta[B_AXIS]; + float s_feedrate = MAX(adiff, bdiff) * scara_feed_factor; + + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], s_feedrate, active_extruder); + + #else // CARTESIAN + + planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], in_raw[E_AXIS], fr, active_extruder); + + #endif + } + + #if IS_SCARA + #define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm + #elif ENABLED(DELTA) + #define DELTA_SEGMENT_MIN_LENGTH 0.10 // mm (still subject to DELTA_SEGMENTS_PER_SECOND) + #else // CARTESIAN + #ifdef LEVELED_SEGMENT_LENGTH + #define DELTA_SEGMENT_MIN_LENGTH LEVELED_SEGMENT_LENGTH + #else + #define DELTA_SEGMENT_MIN_LENGTH 1.00 // mm (similar to G2/G3 arc segmentation) + #endif + #endif + + /** + * Prepare a segmented linear move for DELTA/SCARA/CARTESIAN with UBL and FADE semantics. + * This calls planner.buffer_segment multiple times for small incremental moves. + * Returns true if did NOT move, false if moved (requires current_position update). + */ + + bool _O2 unified_bed_leveling::prepare_segmented_line_to(const float (&rtarget)[XYZE], const float &feedrate) { + + if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) // fail if moving outside reachable boundary + return true; // did not move, so current_position still accurate + + const float total[XYZE] = { + rtarget[X_AXIS] - current_position[X_AXIS], + rtarget[Y_AXIS] - current_position[Y_AXIS], + rtarget[Z_AXIS] - current_position[Z_AXIS], + rtarget[E_AXIS] - current_position[E_AXIS] + }; + + const float cartesian_xy_mm = HYPOT(total[X_AXIS], total[Y_AXIS]); // total horizontal xy distance + + #if IS_KINEMATIC + const float seconds = cartesian_xy_mm / feedrate; // seconds to move xy distance at requested rate + uint16_t segments = lroundf(delta_segments_per_second * seconds), // preferred number of segments for distance @ feedrate + seglimit = lroundf(cartesian_xy_mm * (1.0 / (DELTA_SEGMENT_MIN_LENGTH))); // number of segments at minimum segment length + NOMORE(segments, seglimit); // limit to minimum segment length (fewer segments) + #else + uint16_t segments = lroundf(cartesian_xy_mm * (1.0 / (DELTA_SEGMENT_MIN_LENGTH))); // cartesian fixed segment length + #endif + + NOLESS(segments, 1U); // must have at least one segment + const float inv_segments = 1.0 / segments; // divide once, multiply thereafter + + #if IS_SCARA // scale the feed rate from mm/s to degrees/s + scara_feed_factor = cartesian_xy_mm * inv_segments * feedrate; + scara_oldA = planner.get_axis_position_degrees(A_AXIS); + scara_oldB = planner.get_axis_position_degrees(B_AXIS); + #endif + + const float diff[XYZE] = { + total[X_AXIS] * inv_segments, + total[Y_AXIS] * inv_segments, + total[Z_AXIS] * inv_segments, + total[E_AXIS] * inv_segments + }; + + // Note that E segment distance could vary slightly as z mesh height + // changes for each segment, but small enough to ignore. + + float raw[XYZE] = { + current_position[X_AXIS], + current_position[Y_AXIS], + current_position[Z_AXIS], + current_position[E_AXIS] + }; + + // Only compute leveling per segment if ubl active and target below z_fade_height. + if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling + while (--segments) { + LOOP_XYZE(i) raw[i] += diff[i]; + ubl_buffer_segment_raw(raw, feedrate); + } + ubl_buffer_segment_raw(rtarget, feedrate); + return false; // moved but did not set_current_from_destination(); + } + + // Otherwise perform per-segment leveling + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + const float fade_scaling_factor = planner.fade_scaling_factor_for_z(rtarget[Z_AXIS]); + #endif + + // increment to first segment destination + LOOP_XYZE(i) raw[i] += diff[i]; + + for (;;) { // for each mesh cell encountered during the move + + // Compute mesh cell invariants that remain constant for all segments within cell. + // Note for cell index, if point is outside the mesh grid (in MESH_INSET perimeter) + // the bilinear interpolation from the adjacent cell within the mesh will still work. + // Inner loop will exit each time (because out of cell bounds) but will come back + // in top of loop and again re-find same adjacent cell and use it, just less efficient + // for mesh inset area. + + int8_t cell_xi = (raw[X_AXIS] - (MESH_MIN_X)) * (1.0 / (MESH_X_DIST)), + cell_yi = (raw[Y_AXIS] - (MESH_MIN_Y)) * (1.0 / (MESH_Y_DIST)); + + cell_xi = constrain(cell_xi, 0, (GRID_MAX_POINTS_X) - 1); + cell_yi = constrain(cell_yi, 0, (GRID_MAX_POINTS_Y) - 1); + + const float x0 = mesh_index_to_xpos(cell_xi), // 64 byte table lookup avoids mul+add + y0 = mesh_index_to_ypos(cell_yi); + + float z_x0y0 = z_values[cell_xi ][cell_yi ], // z at lower left corner + z_x1y0 = z_values[cell_xi+1][cell_yi ], // z at upper left corner + z_x0y1 = z_values[cell_xi ][cell_yi+1], // z at lower right corner + z_x1y1 = z_values[cell_xi+1][cell_yi+1]; // z at upper right corner + + if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) + if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points + if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, + if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points + + float cx = raw[X_AXIS] - x0, // cell-relative x and y + cy = raw[Y_AXIS] - y0; + + const float z_xmy0 = (z_x1y0 - z_x0y0) * (1.0 / (MESH_X_DIST)), // z slope per x along y0 (lower left to lower right) + z_xmy1 = (z_x1y1 - z_x0y1) * (1.0 / (MESH_X_DIST)); // z slope per x along y1 (upper left to upper right) + + float z_cxy0 = z_x0y0 + z_xmy0 * cx; // z height along y0 at cx (changes for each cx in cell) + + const float z_cxy1 = z_x0y1 + z_xmy1 * cx, // z height along y1 at cx + z_cxyd = z_cxy1 - z_cxy0; // z height difference along cx from y0 to y1 + + float z_cxym = z_cxyd * (1.0 / (MESH_Y_DIST)); // z slope per y along cx from y0 to y1 (changes for each cx in cell) + + // float z_cxcy = z_cxy0 + z_cxym * cy; // interpolated mesh z height along cx at cy (do inside the segment loop) + + // As subsequent segments step through this cell, the z_cxy0 intercept will change + // and the z_cxym slope will change, both as a function of cx within the cell, and + // each change by a constant for fixed segment lengths. + + const float z_sxy0 = z_xmy0 * diff[X_AXIS], // per-segment adjustment to z_cxy0 + z_sxym = (z_xmy1 - z_xmy0) * (1.0 / (MESH_Y_DIST)) * diff[X_AXIS]; // per-segment adjustment to z_cxym + + for (;;) { // for all segments within this mesh cell + + if (--segments == 0) // if this is last segment, use rtarget for exact + COPY(raw, rtarget); + + const float z_cxcy = (z_cxy0 + z_cxym * cy) // interpolated mesh z height along cx at cy + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + * fade_scaling_factor // apply fade factor to interpolated mesh height + #endif + ; + + const float z = raw[Z_AXIS]; + raw[Z_AXIS] += z_cxcy; + ubl_buffer_segment_raw(raw, feedrate); + raw[Z_AXIS] = z; + + if (segments == 0) // done with last segment + return false; // did not set_current_from_destination() + + LOOP_XYZE(i) raw[i] += diff[i]; + + cx += diff[X_AXIS]; + cy += diff[Y_AXIS]; + + if (!WITHIN(cx, 0, MESH_X_DIST) || !WITHIN(cy, 0, MESH_Y_DIST)) // done within this cell, break to next + break; + + // Next segment still within same mesh cell, adjust the per-segment + // slope and intercept to compute next z height. + + z_cxy0 += z_sxy0; // adjust z_cxy0 by per-segment z_sxy0 + z_cxym += z_sxym; // adjust z_cxym by per-segment z_sxym + + } // segment loop + } // cell loop + + return false; // caller will update current_position + } + +#endif // UBL_SEGMENTED + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp new file mode 100644 index 0000000000..e2cc23368a --- /dev/null +++ b/Marlin/src/feature/caselight.cpp @@ -0,0 +1,83 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_CASE_LIGHT + +uint8_t case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +bool case_light_on = CASE_LIGHT_DEFAULT_ON; + +#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #include "leds/leds.h" + LEDColor case_light_color = + #ifdef CASE_LIGHT_NEOPIXEL_COLOR + CASE_LIGHT_NEOPIXEL_COLOR + #else + { 255, 255, 255, 255 } + #endif + ; +#endif + +/** + * The following are needed because ARM chips ignore a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that + * are directly controlled by the PWM module. In order to turn them off the brightness level needs to be + * set to off. Since we can't use the pwm register to save the last brightness level we need a variable + * to save it. + */ +uint8_t case_light_brightness_sav; // saves brighness info so can restore when "M355 S1" received +bool case_light_arg_flag; // flag to notify if S or P argument type + +#ifndef INVERT_CASE_LIGHT + #define INVERT_CASE_LIGHT false +#endif + +void update_case_light() { + + if (!(case_light_arg_flag && !case_light_on)) + case_light_brightness_sav = case_light_brightness; // save brightness except if this is an S0 argument + if (case_light_arg_flag && case_light_on) + case_light_brightness = case_light_brightness_sav; // restore last brightens if this is an S1 argument + + const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; + + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + + leds.set_color( + MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), + false + ); + + #else // !CASE_LIGHT_USE_NEOPIXEL + + SET_OUTPUT(CASE_LIGHT_PIN); + if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) + analogWrite(CASE_LIGHT_PIN, n10ct); + else { + const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); + } + + #endif // !CASE_LIGHT_USE_NEOPIXEL +} + +#endif // HAS_CASE_LIGHT diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h new file mode 100644 index 0000000000..3e16819eb5 --- /dev/null +++ b/Marlin/src/feature/caselight.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __CASELIGHT_H__ +#define __CASELIGHT_H__ + +extern uint8_t case_light_brightness; +extern bool case_light_on; +extern uint8_t case_light_brightness_sav; // saves brighness info when case_light_on is false +extern bool case_light_arg_flag; // flag to notify if S or P argument type + +void update_case_light(); + +#endif // __CASELIGHT_H__ diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp new file mode 100644 index 0000000000..e1d6fc5ef4 --- /dev/null +++ b/Marlin/src/feature/controllerfan.cpp @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(USE_CONTROLLER_FAN) + +#include "../module/stepper_indirection.h" +#include "../module/temperature.h" + +uint8_t controllerFanSpeed; + +void controllerfan_update() { + static millis_t lastMotorOn = 0, // Last time a motor was turned on + nextMotorCheck = 0; // Last time the state was checked + const millis_t ms = millis(); + if (ELAPSED(ms, nextMotorCheck)) { + nextMotorCheck = ms + 2500UL; // Not a time critical function, so only check every 2.5s + if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON + #if HAS_HEATED_BED + || thermalManager.soft_pwm_amount_bed > 0 + #endif + || E0_ENABLE_READ == E_ENABLE_ON // If any of the drivers are enabled... + #if E_STEPPERS > 1 + || E1_ENABLE_READ == E_ENABLE_ON + #if HAS_X2_ENABLE + || X2_ENABLE_READ == X_ENABLE_ON + #endif + #if E_STEPPERS > 2 + || E2_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 3 + || E3_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 4 + || E4_ENABLE_READ == E_ENABLE_ON + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + ) { + lastMotorOn = ms; //... set time to NOW so the fan will turn on + } + + // Fan off if no steppers have been enabled for CONTROLLERFAN_SECS seconds + uint8_t speed = (!lastMotorOn || ELAPSED(ms, lastMotorOn + (CONTROLLERFAN_SECS) * 1000UL)) ? 0 : CONTROLLERFAN_SPEED; + controllerFanSpeed = speed; + + // allows digital or PWM fan output to be used (see M42 handling) + WRITE(CONTROLLER_FAN_PIN, speed); + analogWrite(CONTROLLER_FAN_PIN, speed); + } +} + +#endif // USE_CONTROLLER_FAN diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h new file mode 100644 index 0000000000..8a7b393c33 --- /dev/null +++ b/Marlin/src/feature/controllerfan.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __CONTROLLERFAN_H__ +#define __CONTROLLERFAN_H__ + +void controllerfan_update(); + +#endif // __CONTROLLERFAN_H__ diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp new file mode 100644 index 0000000000..934b3165bd --- /dev/null +++ b/Marlin/src/feature/dac/dac_dac084s085.cpp @@ -0,0 +1,98 @@ +/*************************************************************** + * + * External DAC for Alligator Board + * + ****************************************************************/ + +#include "../../inc/MarlinConfig.h" + +#if MB(ALLIGATOR) + +#include "dac_dac084s085.h" + +#include "../../Marlin.h" +#include "../../module/stepper.h" +#include "../../HAL/Delay.h" + +dac084s085::dac084s085() { } + +void dac084s085::begin() { + uint8_t externalDac_buf[] = { 0x20, 0x00 }; // all off + + // All SPI chip-select HIGH + SET_OUTPUT(DAC0_SYNC); + #if EXTRUDERS > 1 + SET_OUTPUT(DAC1_SYNC); + #endif + cshigh(); + spiBegin(); + + //init onboard DAC + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + DELAY_US(2); + WRITE(DAC0_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); + WRITE(DAC0_SYNC, HIGH); + + #if EXTRUDERS > 1 + //init Piggy DAC + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + DELAY_US(2); + WRITE(DAC1_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); + WRITE(DAC1_SYNC, HIGH); + #endif + + return; +} + +void dac084s085::setValue(const uint8_t channel, const uint8_t value) { + if (channel >= 7) return; // max channel (X,Y,Z,E0,E1,E2,E3) + + const uint8_t externalDac_buf[] = { + 0x10 | ((channel > 3 ? 7 : 3) - channel << 6) | (value >> 4), + 0x00 | (value << 4) + }; + + // All SPI chip-select HIGH + cshigh(); + + if (channel > 3) { // DAC Piggy E1,E2,E3 + WRITE(DAC1_SYNC, LOW); + DELAY_US(2); + WRITE(DAC1_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + } + else { // DAC onboard X,Y,Z,E0 + WRITE(DAC0_SYNC, LOW); + DELAY_US(2); + WRITE(DAC0_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + } + + DELAY_US(2); + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); +} + +void dac084s085::cshigh() { + WRITE(DAC0_SYNC, HIGH); + #if EXTRUDERS > 1 + WRITE(DAC1_SYNC, HIGH); + #endif + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM2_CS, HIGH); + WRITE(SPI_FLASH_CS, HIGH); + WRITE(SS_PIN, HIGH); +} + +#endif // MB(ALLIGATOR) diff --git a/Marlin/src/feature/dac/dac_dac084s085.h b/Marlin/src/feature/dac/dac_dac084s085.h new file mode 100644 index 0000000000..af98c16776 --- /dev/null +++ b/Marlin/src/feature/dac/dac_dac084s085.h @@ -0,0 +1,13 @@ +#ifndef DAC084S085_H +#define DAC084S085_H + +class dac084s085 { + public: + dac084s085(); + static void begin(void); + static void setValue(const uint8_t channel, const uint8_t value); + private: + static void cshigh(); +}; + +#endif // DAC084S085_H diff --git a/Marlin/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp similarity index 98% rename from Marlin/dac_mcp4728.cpp rename to Marlin/src/feature/dac/dac_mcp4728.cpp index 783f9fb5e0..01568fb5c6 100644 --- a/Marlin/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -30,12 +30,11 @@ * http://arduino.cc/forum/index.php/topic,51842.0.html */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(DAC_STEPPER_CURRENT) #include "dac_mcp4728.h" -#include "enum.h" uint16_t mcp4728_values[XYZE]; @@ -101,17 +100,18 @@ uint8_t mcp4728_setGain_all(uint8_t value) { */ uint16_t mcp4728_getValue(uint8_t channel) { return mcp4728_values[channel]; } +#if 0 /** * Steph: Might be useful in the future * Return Vout - * + */ uint16_t mcp4728_getVout(uint8_t channel) { uint32_t vref = 2048, vOut = (vref * mcp4728_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; if (vOut > defaultVDD) vOut = defaultVDD; return vOut; } -*/ +#endif /** * Returns DAC values as a 0-100 percentage of drive strength diff --git a/Marlin/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h similarity index 78% rename from Marlin/dac_mcp4728.h rename to Marlin/src/feature/dac/dac_mcp4728.h index f8337316de..aeacaaa0bc 100644 --- a/Marlin/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -27,30 +27,26 @@ #ifndef DAC_MCP4728_H #define DAC_MCP4728_H -#include "MarlinConfig.h" - -#if ENABLED(DAC_STEPPER_CURRENT) -#include "Wire.h" +#include #define defaultVDD DAC_STEPPER_MAX //was 5000 but differs with internal Vref #define BASE_ADDR 0x60 -#define RESET 0B00000110 -#define WAKE 0B00001001 -#define UPDATE 0B00001000 -#define MULTIWRITE 0B01000000 -#define SINGLEWRITE 0B01011000 -#define SEQWRITE 0B01010000 -#define VREFWRITE 0B10000000 -#define GAINWRITE 0B11000000 -#define POWERDOWNWRITE 0B10100000 -#define GENERALCALL 0B00000000 -#define GAINWRITE 0B11000000 +#define RESET 0b00000110 +#define WAKE 0b00001001 +#define UPDATE 0b00001000 +#define MULTIWRITE 0b01000000 +#define SINGLEWRITE 0b01011000 +#define SEQWRITE 0b01010000 +#define VREFWRITE 0b10000000 +#define GAINWRITE 0b11000000 +#define POWERDOWNWRITE 0b10100000 +#define GENERALCALL 0b00000000 +#define GAINWRITE 0b11000000 // This is taken from the original lib, makes it easy to edit if needed // DAC_OR_ADDRESS defined in pins_BOARD.h file #define DAC_DEV_ADDRESS (BASE_ADDR | DAC_OR_ADDRESS) - void mcp4728_init(); uint8_t mcp4728_analogWrite(uint8_t channel, uint16_t value); uint8_t mcp4728_eepromWrite(); @@ -62,5 +58,4 @@ uint8_t mcp4728_simpleCommand(byte simpleCommand); uint8_t mcp4728_getDrvPct(uint8_t channel); void mcp4728_setDrvPct(uint8_t pct[XYZE]); -#endif #endif // DAC_MCP4728_H diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp new file mode 100644 index 0000000000..458eb61f1a --- /dev/null +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -0,0 +1,125 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * stepper_dac.cpp - To set stepper current via DAC + * + * Part of Marlin + * + * Copyright (c) 2016 MarlinFirmware + * + * Marlin 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 3 of the License, or + * (at your option) any later version. + * + * Marlin 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 Marlin. If not, see . + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DAC_STEPPER_CURRENT) + +#include "stepper_dac.h" + +bool dac_present = false; +const uint8_t dac_order[NUM_AXIS] = DAC_STEPPER_ORDER; +uint8_t dac_channel_pct[XYZE] = DAC_MOTOR_CURRENT_DEFAULT; + +int dac_init() { + #if PIN_EXISTS(DAC_DISABLE) + OUT_WRITE(DAC_DISABLE_PIN, LOW); // set pin low to enable DAC + #endif + + mcp4728_init(); + + if (mcp4728_simpleCommand(RESET)) return -1; + + dac_present = true; + + mcp4728_setVref_all(DAC_STEPPER_VREF); + mcp4728_setGain_all(DAC_STEPPER_GAIN); + + if (mcp4728_getDrvPct(0) < 1 || mcp4728_getDrvPct(1) < 1 || mcp4728_getDrvPct(2) < 1 || mcp4728_getDrvPct(3) < 1 ) { + mcp4728_setDrvPct(dac_channel_pct); + mcp4728_eepromWrite(); + } + + return 0; +} + +void dac_current_percent(uint8_t channel, float val) { + if (!dac_present) return; + + NOMORE(val, 100); + + mcp4728_analogWrite(dac_order[channel], val * 0.01 * (DAC_STEPPER_MAX)); + mcp4728_simpleCommand(UPDATE); +} + +void dac_current_raw(uint8_t channel, uint16_t val) { + if (!dac_present) return; + + NOMORE(val, DAC_STEPPER_MAX); + + mcp4728_analogWrite(dac_order[channel], val); + mcp4728_simpleCommand(UPDATE); +} + +static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) * (1.0 / (DAC_STEPPER_MAX)); } +static float dac_amps(int8_t n) { return mcp4728_getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * (1.0 / (DAC_STEPPER_SENSE)); } + +uint8_t dac_current_get_percent(AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } +void dac_current_set_percents(const uint8_t pct[XYZE]) { + LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; + mcp4728_setDrvPct(dac_channel_pct); +} + +void dac_print_values() { + if (!dac_present) return; + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Stepper current values in % (Amps):"); + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" X:", dac_perc(X_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(X_AXIS)); + SERIAL_ECHOPAIR(") Y:", dac_perc(Y_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(Y_AXIS)); + SERIAL_ECHOPAIR(") Z:", dac_perc(Z_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(Z_AXIS)); + SERIAL_ECHOPAIR(") E:", dac_perc(E_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(E_AXIS)); + SERIAL_ECHOLNPGM(")"); +} + +void dac_commit_eeprom() { + if (!dac_present) return; + mcp4728_eepromWrite(); +} + +#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h similarity index 60% rename from Marlin/stepper_dac.h rename to Marlin/src/feature/dac/stepper_dac.h index cf56050e72..e74bac5f15 100644 --- a/Marlin/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -21,25 +21,25 @@ */ /** - stepper_dac.h - To set stepper current via DAC - - Part of Marlin - - Copyright (c) 2016 MarlinFirmware - - Marlin 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 3 of the License, or - (at your option) any later version. - - Marlin 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 Marlin. If not, see . -*/ + * stepper_dac.h - To set stepper current via DAC + * + * Part of Marlin + * + * Copyright (c) 2016 MarlinFirmware + * + * Marlin 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 3 of the License, or + * (at your option) any later version. + * + * Marlin 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 Marlin. If not, see . + */ #ifndef STEPPER_DAC_H #define STEPPER_DAC_H @@ -51,7 +51,7 @@ void dac_current_percent(uint8_t channel, float val); void dac_current_raw(uint8_t channel, uint16_t val); void dac_print_values(); void dac_commit_eeprom(); -uint8_t dac_current_get_percent(const AxisEnum axis); +uint8_t dac_current_get_percent(AxisEnum axis); void dac_current_set_percents(const uint8_t pct[XYZE]); #endif // STEPPER_DAC_H diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h new file mode 100644 index 0000000000..f2cd00ba6e --- /dev/null +++ b/Marlin/src/feature/digipot/digipot.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __DIGIPOT_H__ +#define __DIGIPOT_H__ + +void digipot_i2c_set_current(const uint8_t channel, const float current); +void digipot_i2c_init(); + +#endif // __DIGIPOT_H__ diff --git a/Marlin/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp similarity index 92% rename from Marlin/digipot_mcp4018.cpp rename to Marlin/src/feature/digipot/digipot_mcp4018.cpp index 06622d057f..12a180e7d4 100644 --- a/Marlin/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -20,19 +20,17 @@ * */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(DIGIPOT_I2C) && ENABLED(DIGIPOT_MCP4018) -#include "enum.h" +#include "../../core/enum.h" #include "Stream.h" #include "utility/twi.h" #include //https://github.com/stawel/SlowSoftI2CMaster // Settings for the I2C based DIGIPOT (MCP4018) based on WT150 -#define DIGIPOT_I2C_ADDRESS 0x2F - #define DIGIPOT_A4988_Rsx 0.250 #define DIGIPOT_A4988_Vrefmax 1.666 #define DIGIPOT_A4988_MAX_VALUE 127 @@ -81,15 +79,15 @@ static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { static void i2c_send(const uint8_t channel, const byte v) { if (WITHIN(channel, 0, DIGIPOT_I2C_NUM_CHANNELS - 1)) { - pots[channel].i2c_start(((DIGIPOT_I2C_ADDRESS) << 1) | I2C_WRITE); + pots[channel].i2c_start(((DIGIPOT_I2C_ADDRESS_A) << 1) | I2C_WRITE); pots[channel].i2c_write(v); pots[channel].i2c_stop(); } } // This is for the MCP4018 I2C based digipot -void digipot_i2c_set_current(uint8_t channel, float current) { - i2c_send(channel, current_to_wiper(min(max(current, 0.0f), float(DIGIPOT_A4988_MAX_CURRENT)))); +void digipot_i2c_set_current(const uint8_t channel, const float current) { + i2c_send(channel, current_to_wiper(MIN(MAX(current, 0.0f), float(DIGIPOT_A4988_MAX_CURRENT)))); } void digipot_i2c_init() { diff --git a/Marlin/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp similarity index 73% rename from Marlin/digipot_mcp4451.cpp rename to Marlin/src/feature/digipot/digipot_mcp4451.cpp index d79915cc94..ca02977f85 100644 --- a/Marlin/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -20,13 +20,16 @@ * */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(DIGIPOT_I2C) && DISABLED(DIGIPOT_MCP4018) #include "Stream.h" -#include "utility/twi.h" -#include "Wire.h" +#include + +#if MB(MKS_SBASE) + #include "digipot_mcp4451_I2C_routines.h" +#endif // Settings for the I2C based DIGIPOT (MCP4451) on Azteeg X3 Pro #if MB(5DPRINT) @@ -42,22 +45,23 @@ static byte current_to_wiper(const float current) { } static void i2c_send(const byte addr, const byte a, const byte b) { - Wire.beginTransmission(addr); - Wire.write(a); - Wire.write(b); - Wire.endTransmission(); + #if MB(MKS_SBASE) + digipot_mcp4451_start(addr); + digipot_mcp4451_send_byte(a); + digipot_mcp4451_send_byte(b); + #else + Wire.beginTransmission(addr); + Wire.write(a); + Wire.write(b); + Wire.endTransmission(); + #endif } // This is for the MCP4451 I2C based digipot -void digipot_i2c_set_current(uint8_t channel, float current) { - current = min((float) max(current, 0.0f), DIGIPOT_I2C_MAX_CURRENT); +void digipot_i2c_set_current(const uint8_t channel, const float current) { // these addresses are specific to Azteeg X3 Pro, can be set to others, // In this case first digipot is at address A0=0, A1= 0, second one is at A0=0, A1= 1 - byte addr = 0x2C; // channel 0-3 - if (channel >= 4) { - addr = 0x2E; // channel 4-7 - channel -= 4; - } + const byte addr = channel < 4 ? DIGIPOT_I2C_ADDRESS_A : DIGIPOT_I2C_ADDRESS_B; // channel 0-3 vs 4-7 // Initial setup i2c_send(addr, 0x40, 0xFF); @@ -65,13 +69,17 @@ void digipot_i2c_set_current(uint8_t channel, float current) { // Set actual wiper value byte addresses[4] = { 0x00, 0x10, 0x60, 0x70 }; - i2c_send(addr, addresses[channel], current_to_wiper(current)); + i2c_send(addr, addresses[channel & 0x3], current_to_wiper(MIN((float) MAX(current, 0.0f), DIGIPOT_I2C_MAX_CURRENT))); } void digipot_i2c_init() { - static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; - Wire.begin(); + #if MB(MKS_SBASE) + digipot_mcp4451_init(); + #else + Wire.begin(); + #endif // setup initial currents as defined in Configuration_adv.h + static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/emergency_parser.cpp b/Marlin/src/feature/emergency_parser.cpp similarity index 93% rename from Marlin/emergency_parser.cpp rename to Marlin/src/feature/emergency_parser.cpp index c1cab3a2c7..3c9cbf12e5 100644 --- a/Marlin/emergency_parser.cpp +++ b/Marlin/src/feature/emergency_parser.cpp @@ -24,7 +24,7 @@ * emergency_parser.cpp - Intercept special commands directly in the serial stream */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" #if ENABLED(EMERGENCY_PARSER) @@ -32,7 +32,6 @@ // Static data members bool EmergencyParser::killed_by_M112; // = false -EmergencyParser::State EmergencyParser::state; // = EP_RESET // Global instance EmergencyParser emergency_parser; diff --git a/Marlin/emergency_parser.h b/Marlin/src/feature/emergency_parser.h similarity index 98% rename from Marlin/emergency_parser.h rename to Marlin/src/feature/emergency_parser.h index 73981cc38e..127b5c20da 100644 --- a/Marlin/emergency_parser.h +++ b/Marlin/src/feature/emergency_parser.h @@ -52,12 +52,11 @@ public: }; static bool killed_by_M112; - static State state; EmergencyParser() {} __attribute__((always_inline)) inline - static void update(const uint8_t c) { + static void update(State &state, const uint8_t c) { switch (state) { case EP_RESET: diff --git a/Marlin/src/feature/fanmux.cpp b/Marlin/src/feature/fanmux.cpp new file mode 100644 index 0000000000..3457fe49b4 --- /dev/null +++ b/Marlin/src/feature/fanmux.cpp @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * feature/pause.cpp - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_FANMUX + +#include "fanmux.h" + +void fanmux_switch(const uint8_t e) { + WRITE(FANMUX0_PIN, TEST(e, 0) ? HIGH : LOW); + #if PIN_EXISTS(FANMUX1) + WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW); + #if PIN_EXISTS(FANMUX2) + WRITE(FANMUX2, TEST(e, 2) ? HIGH : LOW); + #endif + #endif +} + +void fanmux_init(void) { + SET_OUTPUT(FANMUX0_PIN); + #if PIN_EXISTS(FANMUX1) + SET_OUTPUT(FANMUX1_PIN); + #if PIN_EXISTS(FANMUX2) + SET_OUTPUT(FANMUX2_PIN); + #endif + #endif + fanmux_switch(0); +} + +#endif // HAS_FANMUX diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h new file mode 100644 index 0000000000..2524876146 --- /dev/null +++ b/Marlin/src/feature/fanmux.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * feature/fanmux.h - Cooling Fan Multiplexer support functions + */ + +#ifndef _FANMUX_H_ +#define _FANMUX_H_ + +extern void fanmux_switch(const uint8_t e); +extern void fanmux_init(void); + +#endif // _FANMUX_H_ diff --git a/Marlin/src/feature/filwidth.cpp b/Marlin/src/feature/filwidth.cpp new file mode 100644 index 0000000000..98743713c8 --- /dev/null +++ b/Marlin/src/feature/filwidth.cpp @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + +#include "filwidth.h" + +bool filament_sensor; // = false; // M405/M406 turns filament sensor control ON/OFF. +float filament_width_nominal = DEFAULT_NOMINAL_FILAMENT_DIA, // Nominal filament width. Change with M404. + filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; // Measured filament diameter +uint8_t meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting +int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 + filwidth_delay_index[2] = { 0, -1 }; // Indexes into ring buffer + +#endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h new file mode 100644 index 0000000000..1f0dfc6f04 --- /dev/null +++ b/Marlin/src/feature/filwidth.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __FILWIDTH_H__ +#define __FILWIDTH_H__ + +#include "../inc/MarlinConfig.h" + +extern bool filament_sensor; // M405/M406 turns filament sensor control ON/OFF. +extern float filament_width_nominal, // Nominal filament width. Change with M404. + filament_width_meas; // Measured filament diameter +extern uint8_t meas_delay_cm; // Distance delay setting +extern int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 + filwidth_delay_index[2]; // Indexes into ring buffer + +#endif // __FILWIDTH_H__ diff --git a/Marlin/fwretract.cpp b/Marlin/src/feature/fwretract.cpp similarity index 96% rename from Marlin/fwretract.cpp rename to Marlin/src/feature/fwretract.cpp index c77337b12d..bc26a97371 100644 --- a/Marlin/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -24,17 +24,18 @@ * fwretract.cpp - Implement firmware-based retraction */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(FWRETRACT) #include "fwretract.h" -#include "Marlin.h" -#include "planner.h" -#include "stepper.h" FWRetract fwretract; // Single instance - this calls the constructor +#include "../module/motion.h" +#include "../module/planner.h" +#include "../module/stepper.h" + // private: #if EXTRUDERS > 1 @@ -153,7 +154,8 @@ void FWRetract::retract(const bool retracting else { // If a hop was done and Z hasn't changed, undo the Z hop if (hop_amount) { - destination[Z_AXIS] -= hop_amount; // Move back down by the total hop amount + current_position[Z_AXIS] += hop_amount; // Restore the actual Z position + SYNC_PLAN_POSITION_KINEMATIC(); // Unspoof the position planner feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Z feedrate to max prepare_move_to_destination(); // Lower Z, set_current_to_destination hop_amount = 0.0; // Clear the hop amount diff --git a/Marlin/fwretract.h b/Marlin/src/feature/fwretract.h similarity index 98% rename from Marlin/fwretract.h rename to Marlin/src/feature/fwretract.h index d72f193eb4..bb086df832 100644 --- a/Marlin/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -27,15 +27,17 @@ #ifndef FWRETRACT_H #define FWRETRACT_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" class FWRetract { -public: - static bool autoretract_enabled, // M209 S - Autoretract switch - retracted[EXTRUDERS]; // Which extruders are currently retracted +private: #if EXTRUDERS > 1 static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted #endif + +public: + static bool autoretract_enabled, // M209 S - Autoretract switch + retracted[EXTRUDERS]; // Which extruders are currently retracted static float retract_length, // M207 S - G10 Retract length retract_feedrate_mm_s, // M207 F - G10 Retract feedrate retract_zlift, // M207 Z - G10 Retract hop size diff --git a/Marlin/blinkm.cpp b/Marlin/src/feature/leds/blinkm.cpp similarity index 97% rename from Marlin/blinkm.cpp rename to Marlin/src/feature/leds/blinkm.cpp index 7eba6c0d92..ff5bb71a95 100644 --- a/Marlin/blinkm.cpp +++ b/Marlin/src/feature/leds/blinkm.cpp @@ -24,7 +24,7 @@ * blinkm.cpp - Control a BlinkM over i2c */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(BLINKM) diff --git a/Marlin/blinkm.h b/Marlin/src/feature/leds/blinkm.h similarity index 100% rename from Marlin/blinkm.h rename to Marlin/src/feature/leds/blinkm.h diff --git a/Marlin/leds.cpp b/Marlin/src/feature/leds/leds.cpp similarity index 98% rename from Marlin/leds.cpp rename to Marlin/src/feature/leds/leds.cpp index df798acf8f..d3175a0314 100644 --- a/Marlin/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -24,7 +24,7 @@ * leds.cpp - Marlin RGB LED general support */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if HAS_COLOR_LEDS diff --git a/Marlin/leds.h b/Marlin/src/feature/leds/leds.h similarity index 99% rename from Marlin/leds.h rename to Marlin/src/feature/leds/leds.h index f5e74b3caa..fe00cd3c48 100644 --- a/Marlin/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -27,7 +27,7 @@ #ifndef __LEDS_H__ #define __LEDS_H__ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(NEOPIXEL_LED) #include "neopixel.h" diff --git a/Marlin/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp similarity index 67% rename from Marlin/neopixel.cpp rename to Marlin/src/feature/leds/neopixel.cpp index 8daca3badf..729b4b190a 100644 --- a/Marlin/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -21,17 +21,17 @@ */ /** - * neopixel.cpp + * Marlin RGB LED general support */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(NEOPIXEL_LED) #include "neopixel.h" #if ENABLED(NEOPIXEL_STARTUP_TEST) - #include "utility.h" + #include "../../core/utility.h" #endif Adafruit_NeoPixel pixels(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800); @@ -57,8 +57,29 @@ void setup_neopixel() { set_neopixel_color(pixels.Color(0, 0, 255, 0)); // blue safe_delay(1000); #endif - set_neopixel_color(pixels.Color(NEO_WHITE)); // white + + #if ENABLED(LED_USER_PRESET_STARTUP) + set_neopixel_color(pixels.Color(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE)); + #else + set_neopixel_color(pixels.Color(0, 0, 0, 0)); + #endif } -#endif // NEOPIXEL_LED +#if 0 +bool neopixel_set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p) { + const uint32_t color = pixels.Color(r, g, b, w); + pixels.setBrightness(p); + #if DISABLED(NEOPIXEL_IS_SEQUENTIAL) + set_neopixel_color(color); + return false; + #else + static uint16_t nextLed = 0; + pixels.setPixelColor(nextLed, color); + pixels.show(); + if (++nextLed >= pixels.numPixels()) nextLed = 0; + return true; + #endif +} +#endif +#endif // NEOPIXEL_LED diff --git a/Marlin/neopixel.h b/Marlin/src/feature/leds/neopixel.h similarity index 84% rename from Marlin/neopixel.h rename to Marlin/src/feature/leds/neopixel.h index b7ed45c827..9f24b0287a 100644 --- a/Marlin/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -21,10 +21,16 @@ */ /** - * neopixel.h + * Neopixel support */ -#include "MarlinConfig.h" +#ifndef __NEOPIXEL_H__ +#define __NEOPIXEL_H__ + +#include "../../inc/MarlinConfig.h" + +#include +#include #define NEOPIXEL_IS_RGB (NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR) #define NEOPIXEL_IS_RGBW !NEOPIXEL_IS_RGB @@ -35,10 +41,10 @@ #define NEO_WHITE 0, 0, 0, 255 #endif -#include -#include - void setup_neopixel(); void set_neopixel_color(const uint32_t color); +//bool neopixel_set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); extern Adafruit_NeoPixel pixels; + +#endif // __NEOPIXEL_H__ diff --git a/Marlin/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp similarity index 98% rename from Marlin/pca9632.cpp rename to Marlin/src/feature/leds/pca9632.cpp index 2b4ee7f40b..a95a48190a 100644 --- a/Marlin/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -25,7 +25,7 @@ * Written by Robert Mendon Feb 2017. */ -#include "MarlinConfig.h" +#include "../../inc/MarlinConfig.h" #if ENABLED(PCA9632) diff --git a/Marlin/pca9632.h b/Marlin/src/feature/leds/pca9632.h similarity index 100% rename from Marlin/pca9632.h rename to Marlin/src/feature/leds/pca9632.h diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp new file mode 100644 index 0000000000..5ab0d2efab --- /dev/null +++ b/Marlin/src/feature/leds/tempstat.cpp @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Marlin RGB LED general support + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TEMP_STAT_LEDS) + +#include "tempstat.h" +#include "../../module/temperature.h" + +void handle_status_leds(void) { + static bool red_led = false; + static millis_t next_status_led_update_ms = 0; + if (ELAPSED(millis(), next_status_led_update_ms)) { + next_status_led_update_ms += 500; // Update every 0.5s + float max_temp = 0.0; + #if HAS_HEATED_BED + max_temp = MAX3(max_temp, thermalManager.degTargetBed(), thermalManager.degBed()); + #endif + HOTEND_LOOP() + max_temp = MAX3(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); + const bool new_led = (max_temp > 55.0) ? true : (max_temp < 54.0) ? false : red_led; + if (new_led != red_led) { + red_led = new_led; + #if PIN_EXISTS(STAT_LED_RED) + WRITE(STAT_LED_RED_PIN, new_led ? HIGH : LOW); + #if PIN_EXISTS(STAT_LED_BLUE) + WRITE(STAT_LED_BLUE_PIN, new_led ? LOW : HIGH); + #endif + #else + WRITE(STAT_LED_BLUE_PIN, new_led ? HIGH : LOW); + #endif + } + } +} + +#endif // TEMP_STAT_LEDS diff --git a/Marlin/Conditionals.h b/Marlin/src/feature/leds/tempstat.h similarity index 81% rename from Marlin/Conditionals.h rename to Marlin/src/feature/leds/tempstat.h index ff6c6b187f..290e73f1c0 100644 --- a/Marlin/Conditionals.h +++ b/Marlin/src/feature/leds/tempstat.h @@ -21,7 +21,12 @@ */ /** - * Conditionals.h - * OBSOLETE: Replaced by Conditionals_LCD.h and Conditionals_post.h + * Marlin general RGB LED support */ -#error "Old configurations? Please delete all #include lines from Configuration.h and Configuration_adv.h." + +#ifndef __TEMPSTAT_H__ +#define __TEMPSTAT_H__ + +void handle_status_leds(void); + +#endif // __TEMPSTAT_H__ diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp new file mode 100644 index 0000000000..b1054c2946 --- /dev/null +++ b/Marlin/src/feature/mixing.cpp @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(MIXING_EXTRUDER) + +#if ENABLED(DIRECT_MIXING_IN_G1) + #include "../gcode/parser.h" +#endif + +float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. + +#if MIXING_VIRTUAL_TOOLS > 1 + + float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + + void mixing_tools_init() { + // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. + for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS && t < MIXING_STEPPERS; t++) + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[t][i] = (t == i) ? 1.0 : 0.0; + + // Remaining virtual tools are 100% filament 1 + #if MIXING_STEPPERS < MIXING_VIRTUAL_TOOLS + for (uint8_t t = MIXING_STEPPERS; t < MIXING_VIRTUAL_TOOLS; t++) + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[t][i] = (i == 0) ? 1.0 : 0.0; + #endif + + // Initialize mixing to tool 0 color + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_factor[i] = mixing_virtual_tool_mix[0][i]; + } + +#endif // MIXING_VIRTUAL_TOOLS > 1 + +void normalize_mix() { + float mix_total = 0.0; + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]); + // Scale all values if they don't add up to ~1.0 + if (!NEAR(mix_total, 1.0)) { + SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; + } +} + +#if ENABLED(DIRECT_MIXING_IN_G1) + // Get mixing parameters from the GCode + // The total "must" be 1.0 (but it will be normalized) + // If no mix factors are given, the old mix is preserved + void gcode_get_mix() { + const char mixing_codes[] = { 'A', 'B', 'C', 'D', 'H', 'I' }; + byte mix_bits = 0; + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) { + if (parser.seenval(mixing_codes[i])) { + SBI(mix_bits, i); + float v = parser.value_float(); + NOLESS(v, 0.0); + mixing_factor[i] = RECIPROCAL(v); + } + } + // If any mixing factors were included, clear the rest + // If none were included, preserve the last mix + if (mix_bits) { + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + if (!TEST(mix_bits, i)) mixing_factor[i] = 0.0; + normalize_mix(); + } + } +#endif + +#endif // MIXING_EXTRUDER diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h new file mode 100644 index 0000000000..fff240c0e0 --- /dev/null +++ b/Marlin/src/feature/mixing.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __MIXING_H__ +#define __MIXING_H__ + +#include "../inc/MarlinConfig.h" + +extern float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. + +#if MIXING_VIRTUAL_TOOLS > 1 + extern float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + void mixing_tools_init(); +#endif + +void normalize_mix(); + +#if ENABLED(DIRECT_MIXING_IN_G1) + void gcode_get_mix(); +#endif + +#endif // __MIXING_H__ diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp new file mode 100644 index 0000000000..d2188c7c7a --- /dev/null +++ b/Marlin/src/feature/pause.cpp @@ -0,0 +1,566 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * feature/pause.cpp - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../Marlin.h" +#include "../gcode/gcode.h" +#include "../module/motion.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../module/printcounter.h" +#include "../module/temperature.h" + +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #include "../feature/runout.h" +#endif + +#if ENABLED(ULTIPANEL) + #include "../lcd/ultralcd.h" +#endif + +#include "../libs/buzzer.h" +#include "../libs/nozzle.h" +#include "pause.h" + +// private: + +static float resume_position[XYZE]; + +AdvancedPauseMenuResponse advanced_pause_menu_response; + +float filament_change_unload_length[EXTRUDERS], + filament_change_load_length[EXTRUDERS]; + +#if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" +#endif + +#if HAS_BUZZER + static void filament_change_beep(const int8_t max_beep_count, const bool init=false) { + static millis_t next_buzz = 0; + static int8_t runout_beep = 0; + + if (init) next_buzz = runout_beep = 0; + + const millis_t ms = millis(); + if (ELAPSED(ms, next_buzz)) { + if (max_beep_count < 0 || runout_beep < max_beep_count + 5) { // Only beep as long as we're supposed to + next_buzz = ms + ((max_beep_count < 0 || runout_beep < max_beep_count) ? 1000 : 500); + BUZZ(50, 880 - (runout_beep & 1) * 220); + runout_beep++; + } + } + } +#endif + +/** + * Ensure a safe temperature for extrusion + * + * - Fail if the TARGET temperature is too low + * - Display LCD placard with temperature status + * - Return when heating is done or aborted + * + * Returns 'true' if heating was completed, 'false' for abort + */ +static bool ensure_safe_temperature(const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT) { + + #if ENABLED(PREVENT_COLD_EXTRUSION) + if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); + return false; + } + #endif + + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT, mode); + #else + UNUSED(mode); + #endif + + wait_for_heatup = true; // M108 will clear this + while (wait_for_heatup && thermalManager.wait_for_heating(active_extruder)) idle(); + const bool status = wait_for_heatup; + wait_for_heatup = false; + + return status; +} + +static void do_pause_e_move(const float &length, const float &fr) { + set_destination_from_current(); + destination[E_AXIS] += length / planner.e_factor[active_extruder]; + planner.buffer_line_kinematic(destination, fr, active_extruder); + set_current_from_destination(); + planner.synchronize(); +} + +/** + * Load filament into the hotend + * + * - Fail if the a safe temperature was not reached + * - If pausing for confirmation, wait for a click or M108 + * - Show "wait for load" placard + * - Load and purge filament + * - Show "Purge more" / "Continue" menu + * - Return when "Continue" is selected + * + * Returns 'true' if load was completed, 'false' for abort + */ +bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, + const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, + const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/ +) { + #if DISABLED(ULTIPANEL) + UNUSED(show_lcd); + #endif + + if (!ensure_safe_temperature(mode)) { + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif + + return false; + } + + if (pause_for_user) { + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show "insert filament" + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT, mode); + #endif + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_FILAMENT_CHANGE_INSERT); + + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #else + UNUSED(max_beep_count); + #endif + + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; // LCD click or M108 will clear this + while (wait_for_user) { + #if HAS_BUZZER + filament_change_beep(max_beep_count); + #endif + idle(true); + } + KEEPALIVE_STATE(IN_HANDLER); + } + + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show "wait for load" message + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, mode); + #endif + + // Slow Load filament + if (slow_load_length) do_pause_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); + + // Fast Load Filament + if (fast_load_length) { + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + const float saved_acceleration = planner.retract_acceleration; + planner.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL; + #endif + + do_pause_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE); + + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + planner.retract_acceleration = saved_acceleration; + #endif + } + + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + + #if ENABLED(ULTIPANEL) + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE); + #endif + + wait_for_user = true; + for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) + do_pause_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); + wait_for_user = false; + + #else + + do { + if (purge_length > 0) { + // "Wait for filament purge" + #if ENABLED(ULTIPANEL) + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_PURGE, mode); + #endif + + // Extrude filament to get into hotend + do_pause_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); + } + + // Show "Purge More" / "Resume" menu and wait for reply + #if ENABLED(ULTIPANEL) + if (show_lcd) { + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = false; + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_OPTION, mode); + while (advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_WAIT_FOR) idle(true); + KEEPALIVE_STATE(IN_HANDLER); + } + #endif + + // Keep looping if "Purge More" was selected + } while ( + #if ENABLED(ULTIPANEL) + show_lcd && advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE + #else + 0 + #endif + ); + + #endif + + return true; +} + +/** + * Unload filament from the hotend + * + * - Fail if the a safe temperature was not reached + * - Show "wait for unload" placard + * - Retract, pause, then unload filament + * - Disable E stepper (on most machines) + * + * Returns 'true' if unload was completed, 'false' for abort + */ +bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, + const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/ +) { + if (!ensure_safe_temperature(mode)) { + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif + + return false; + } + + #if DISABLED(ULTIPANEL) + UNUSED(show_lcd); + #else + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, mode); + #endif + + // Retract filament + do_pause_e_move(-FILAMENT_UNLOAD_RETRACT_LENGTH, PAUSE_PARK_RETRACT_FEEDRATE); + + // Wait for filament to cool + safe_delay(FILAMENT_UNLOAD_DELAY); + + // Quickly purge + do_pause_e_move(FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH, planner.max_feedrate_mm_s[E_AXIS]); + + // Unload filament + #if FILAMENT_CHANGE_UNLOAD_ACCEL > 0 + const float saved_acceleration = planner.retract_acceleration; + planner.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL; + #endif + + do_pause_e_move(unload_length, FILAMENT_CHANGE_UNLOAD_FEEDRATE); + + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + planner.retract_acceleration = saved_acceleration; + #endif + + // Disable extruders steppers for manual filament changing (only on boards that have separate ENABLE_PINS) + #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN + disable_e_stepper(active_extruder); + safe_delay(100); + #endif + + return true; +} + +// public: + +/** + * Pause procedure + * + * - Abort if already paused + * - Send host action for pause, if configured + * - Abort if TARGET temperature is too low + * - Display "wait for start of filament change" (if a length was specified) + * - Initial retract, if current temperature is hot enough + * - Park the nozzle at the given position + * - Call unload_filament (if a length was specified) + * + * Returns 'true' if pause was completed, 'false' for abort + */ +uint8_t did_pause_print = 0; + +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/) { + if (did_pause_print) return false; // already paused + + #ifdef ACTION_ON_PAUSE + SERIAL_ECHOLNPGM("//action:" ACTION_ON_PAUSE); + #endif + + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show initial message + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT); + #endif + + if (!DEBUGGING(DRYRUN) && unload_length && thermalManager.targetTooColdToExtrude(active_extruder)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); + + #if ENABLED(ULTIPANEL) + if (show_lcd) { // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + LCD_MESSAGEPGM(MSG_M600_TOO_COLD); + } + #endif + + return false; // unable to reach safe temperature + } + + // Indicate that the printer is paused + ++did_pause_print; + + // Pause the print job and timer + #if ENABLED(SDSUPPORT) + if (card.sdprinting) { + card.pauseSDPrint(); + ++did_pause_print; // Indicate SD pause also + } + #endif + print_job_timer.pause(); + + // Save current position + COPY(resume_position, current_position); + + // Wait for buffered blocks to complete + planner.synchronize(); + + // Initial retract before move to filament change position + if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) + do_pause_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); + + #if ENABLED(NO_MOTION_BEFORE_HOMING) + if (!axis_unhomed_error()) + #endif + // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) + Nozzle::park(2, park_point); + + // Unload the filament + if (unload_length) + unload_filament(unload_length, show_lcd); + + return true; +} + +/** + * - Show "Insert filament and press button to continue" + * - Wait for a click before returning + * - Heaters can time out, reheated before accepting a click + * + * Used by M125 and M600 + */ +void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { + bool nozzle_timed_out = false; + + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); + #endif + SERIAL_ECHO_START(); + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); + + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #endif + + // Start the heater idle timers + const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; + + HOTEND_LOOP() + thermalManager.start_heater_idle_timer(e, nozzle_timeout); + + // Wait for filament insert by user and press button + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; // LCD click or M108 will clear this + while (wait_for_user) { + #if HAS_BUZZER + filament_change_beep(max_beep_count); + #endif + + // If the nozzle has timed out, wait for the user to press the button to re-heat the nozzle, then + // re-heat the nozzle, re-show the insert screen, restart the idle timers, and start over + if (!nozzle_timed_out) + HOTEND_LOOP() + nozzle_timed_out |= thermalManager.is_heater_idle(e); + + if (nozzle_timed_out) { + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE); + #endif + SERIAL_ECHO_START(); + #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT); + #elif ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_M108); + #else + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_LCD); + #endif + + // Wait for LCD click or M108 + while (wait_for_user) idle(true); + + // Re-enable the heaters if they timed out + HOTEND_LOOP() thermalManager.reset_heater_idle_timer(e); + + // Wait for the heaters to reach the target temperatures + ensure_safe_temperature(); + + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); + #endif + SERIAL_ECHO_START(); + #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); + #elif ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_M108); + #else + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_LCD); + #endif + + // Start the heater idle timers + const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; + + HOTEND_LOOP() + thermalManager.start_heater_idle_timer(e, nozzle_timeout); + + wait_for_user = true; // Wait for user to load filament + nozzle_timed_out = false; + + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #endif + } + + idle(true); + } + KEEPALIVE_STATE(IN_HANDLER); +} + +/** + * Resume or Start print procedure + * + * - Abort if not paused + * - Reset heater idle timers + * - Load filament if specified, but only if: + * - a nozzle timed out, or + * - the nozzle is already heated. + * - Display "wait for print to resume" + * - Re-prime the nozzle... + * - FWRETRACT: Recover/prime from the prior G10. + * - !FWRETRACT: Retract by resume_position[E], if negative. + * Not sure how this logic comes into use. + * - Move the nozzle back to resume_position + * - Sync the planner E to resume_position[E] + * - Send host action for resume, if configured + * - Resume the current SD print job, if any + */ +void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/) { + if (!did_pause_print) return; + + // Re-enable the heaters if they timed out + bool nozzle_timed_out = false; + HOTEND_LOOP() { + nozzle_timed_out |= thermalManager.is_heater_idle(e); + thermalManager.reset_heater_idle_timer(e); + } + + if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) { + // Load the new filament + load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out); + } + + #if ENABLED(ULTIPANEL) + // "Wait for print to resume" + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_RESUME); + #endif + + // Intelligent resuming + #if ENABLED(FWRETRACT) + // If retracted before goto pause + if (fwretract.retracted[active_extruder]) + do_pause_e_move(-fwretract.retract_length, fwretract.retract_feedrate_mm_s); + #endif + + // If resume_position is negative + if (resume_position[E_AXIS] < 0) do_pause_e_move(resume_position[E_AXIS], PAUSE_PARK_RETRACT_FEEDRATE); + + // Move XY to starting position, then Z + do_blocking_move_to_xy(resume_position[X_AXIS], resume_position[Y_AXIS], NOZZLE_PARK_XY_FEEDRATE); + + // Move Z_AXIS to saved position + do_blocking_move_to_z(resume_position[Z_AXIS], NOZZLE_PARK_Z_FEEDRATE); + + // Now all extrusion positions are resumed and ready to be confirmed + // Set extruder to saved position + planner.set_e_position_mm((destination[E_AXIS] = current_position[E_AXIS] = resume_position[E_AXIS])); + + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.reset(); + #endif + + #if ENABLED(ULTIPANEL) + // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif + + #ifdef ACTION_ON_RESUME + SERIAL_ECHOLNPGM("//action:" ACTION_ON_RESUME); + #endif + + --did_pause_print; + + #if ENABLED(SDSUPPORT) + if (did_pause_print) { + card.startFileprint(); + --did_pause_print; + } + #endif +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h new file mode 100644 index 0000000000..c920fd599f --- /dev/null +++ b/Marlin/src/feature/pause.h @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * feature/pause.h - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +#ifndef _PAUSE_H_ +#define _PAUSE_H_ + +#include "../libs/nozzle.h" + +#include "../inc/MarlinConfigPre.h" + +enum AdvancedPauseMode : char { + ADVANCED_PAUSE_MODE_PAUSE_PRINT, + ADVANCED_PAUSE_MODE_LOAD_FILAMENT, + ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT +}; + +enum AdvancedPauseMessage : char { + ADVANCED_PAUSE_MESSAGE_INIT, + ADVANCED_PAUSE_MESSAGE_UNLOAD, + ADVANCED_PAUSE_MESSAGE_INSERT, + ADVANCED_PAUSE_MESSAGE_LOAD, + ADVANCED_PAUSE_MESSAGE_PURGE, + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE, + #endif + ADVANCED_PAUSE_MESSAGE_OPTION, + ADVANCED_PAUSE_MESSAGE_RESUME, + ADVANCED_PAUSE_MESSAGE_STATUS, + ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE, + ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT +}; + +enum AdvancedPauseMenuResponse : char { + ADVANCED_PAUSE_RESPONSE_WAIT_FOR, + ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE, + ADVANCED_PAUSE_RESPONSE_RESUME_PRINT +}; + +extern AdvancedPauseMenuResponse advanced_pause_menu_response; + +extern float filament_change_unload_length[EXTRUDERS], + filament_change_load_length[EXTRUDERS]; + +extern uint8_t did_pause_print; + +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false); + +void wait_for_filament_reload(const int8_t max_beep_count=0); + +void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0); + +bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, + const bool pause_for_user=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); + +bool unload_filament(const float &unload_length, const bool show_lcd=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); + +#endif // _PAUSE_H_ diff --git a/Marlin/power.cpp b/Marlin/src/feature/power.cpp similarity index 92% rename from Marlin/power.cpp rename to Marlin/src/feature/power.cpp index df0579153a..0365980db5 100644 --- a/Marlin/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -24,13 +24,14 @@ * power.cpp - power control */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(AUTO_POWER_CONTROL) #include "power.h" -#include "temperature.h" -#include "stepper_indirection.h" +#include "../module/temperature.h" +#include "../module/stepper_indirection.h" +#include "../Marlin.h" Power powerManager; @@ -50,9 +51,9 @@ bool Power::is_power_needed() { #endif if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON - #if HAS_HEATED_BED - || thermalManager.soft_pwm_amount_bed > 0 - #endif + #if HAS_HEATED_BED + || thermalManager.soft_pwm_amount_bed > 0 + #endif || E0_ENABLE_READ == E_ENABLE_ON // If any of the drivers are enabled... #if E_STEPPERS > 1 || E1_ENABLE_READ == E_ENABLE_ON diff --git a/Marlin/power.h b/Marlin/src/feature/power.h similarity index 97% rename from Marlin/power.h rename to Marlin/src/feature/power.h index a5c7dba793..225e4dc6f3 100644 --- a/Marlin/power.h +++ b/Marlin/src/feature/power.h @@ -27,7 +27,7 @@ #ifndef POWER_H #define POWER_H -#include "types.h" +#include "../core/types.h" class Power { public: diff --git a/Marlin/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp similarity index 97% rename from Marlin/power_loss_recovery.cpp rename to Marlin/src/feature/power_loss_recovery.cpp index 5b5948b924..b879a26341 100644 --- a/Marlin/power_loss_recovery.cpp +++ b/Marlin/src/feature/power_loss_recovery.cpp @@ -24,18 +24,19 @@ * power_loss_recovery.cpp - Resume an SD print after power-loss */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "power_loss_recovery.h" -#include "cardreader.h" -#include "planner.h" -#include "printcounter.h" -#include "serial.h" -#include "temperature.h" -#include "ultralcd.h" +#include "../lcd/ultralcd.h" +#include "../gcode/queue.h" +#include "../module/planner.h" +#include "../module/printcounter.h" +#include "../module/temperature.h" +#include "../sd/cardreader.h" +#include "../core/serial.h" // Recovery data job_recovery_info_t job_recovery_info; @@ -43,9 +44,6 @@ JobRecoveryPhase job_recovery_phase = JOB_RECOVERY_IDLE; uint8_t job_recovery_commands_count; //=0 char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; -// Extern -extern uint8_t commands_in_queue, cmd_queue_index_r; - // Private static char sd_filename[MAXPATHNAMELENGTH]; diff --git a/Marlin/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h similarity index 95% rename from Marlin/power_loss_recovery.h rename to Marlin/src/feature/power_loss_recovery.h index f693b5f9ba..d08b500247 100644 --- a/Marlin/power_loss_recovery.h +++ b/Marlin/src/feature/power_loss_recovery.h @@ -27,9 +27,9 @@ #ifndef _POWER_LOSS_RECOVERY_H_ #define _POWER_LOSS_RECOVERY_H_ -#include "cardreader.h" -#include "types.h" -#include "MarlinConfig.h" +#include "../sd/cardreader.h" +#include "../core/types.h" +#include "../inc/MarlinConfigPre.h" #define SAVE_INFO_INTERVAL_MS 0 //#define SAVE_EACH_CMD_MODE diff --git a/Marlin/runout.cpp b/Marlin/src/feature/runout.cpp similarity index 90% rename from Marlin/runout.cpp rename to Marlin/src/feature/runout.cpp index 44ca694df1..fde93e7f7a 100644 --- a/Marlin/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -21,10 +21,10 @@ */ /** - * runout.cpp - Runout sensor support + * feature/runout.cpp - Runout sensor support */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" #if ENABLED(FILAMENT_RUNOUT_SENSOR) @@ -39,6 +39,8 @@ void FilamentRunoutSensor::setup() { #if ENABLED(FIL_RUNOUT_PULLUP) #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) + #elif ENABLED(FIL_RUNOUT_PULLDOWN) + #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) #else #define INIT_RUNOUT_PIN(P) SET_INPUT(P) #endif diff --git a/Marlin/runout.h b/Marlin/src/feature/runout.h similarity index 91% rename from Marlin/runout.h rename to Marlin/src/feature/runout.h index d94c21ef64..47bd2cf7b8 100644 --- a/Marlin/runout.h +++ b/Marlin/src/feature/runout.h @@ -21,18 +21,18 @@ */ /** - * runout.h - Runout sensor support + * feature/runout.h - Runout sensor support */ #ifndef _RUNOUT_H_ #define _RUNOUT_H_ -#include "cardreader.h" -#include "printcounter.h" -#include "stepper.h" -#include "Marlin.h" +#include "../sd/cardreader.h" +#include "../module/printcounter.h" +#include "../module/stepper.h" +#include "../gcode/queue.h" -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #define FIL_RUNOUT_THRESHOLD 5 @@ -48,7 +48,7 @@ class FilamentRunoutSensor { if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) { filament_ran_out = true; enqueue_and_echo_commands_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); - stepper.synchronize(); + planner.synchronize(); } } private: diff --git a/Marlin/src/feature/snmm.cpp b/Marlin/src/feature/snmm.cpp new file mode 100644 index 0000000000..e8c04f2197 --- /dev/null +++ b/Marlin/src/feature/snmm.cpp @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(MK2_MULTIPLEXER) + +#include "../module/stepper.h" + +void select_multiplexed_stepper(const uint8_t e) { + planner.synchronize(); + disable_e_steppers(); + WRITE(E_MUX0_PIN, TEST(e, 0) ? HIGH : LOW); + WRITE(E_MUX1_PIN, TEST(e, 1) ? HIGH : LOW); + WRITE(E_MUX2_PIN, TEST(e, 2) ? HIGH : LOW); + safe_delay(100); +} + +#endif // MK2_MULTIPLEXER diff --git a/Marlin/src/feature/snmm.h b/Marlin/src/feature/snmm.h new file mode 100644 index 0000000000..b15f9147a6 --- /dev/null +++ b/Marlin/src/feature/snmm.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __SNMM_H__ +#define __SNMM_H__ + +void select_multiplexed_stepper(const uint8_t e); + +#endif // __SNMM_H__ diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp new file mode 100644 index 0000000000..dcb63cd866 --- /dev/null +++ b/Marlin/src/feature/solenoid.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(EXT_SOLENOID) + +#include "solenoid.h" + +#include "../module/motion.h" // for active_extruder + +inline void enable_solenoid(const uint8_t num) { + switch (num) { + case 0: + OUT_WRITE(SOL0_PIN, HIGH); + break; + #if HAS_SOLENOID_1 && EXTRUDERS > 1 + case 1: + OUT_WRITE(SOL1_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_2 && EXTRUDERS > 2 + case 2: + OUT_WRITE(SOL2_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_3 && EXTRUDERS > 3 + case 3: + OUT_WRITE(SOL3_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_4 && EXTRUDERS > 4 + case 4: + OUT_WRITE(SOL4_PIN, HIGH); + break; + #endif + default: + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID); + break; + } +} + +void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } + +void disable_all_solenoids() { + OUT_WRITE(SOL0_PIN, LOW); + #if HAS_SOLENOID_1 && EXTRUDERS > 1 + OUT_WRITE(SOL1_PIN, LOW); + #endif + #if HAS_SOLENOID_2 && EXTRUDERS > 2 + OUT_WRITE(SOL2_PIN, LOW); + #endif + #if HAS_SOLENOID_3 && EXTRUDERS > 3 + OUT_WRITE(SOL3_PIN, LOW); + #endif + #if HAS_SOLENOID_4 && EXTRUDERS > 4 + OUT_WRITE(SOL4_PIN, LOW); + #endif +} + +#endif // EXT_SOLENOID diff --git a/Marlin/src/feature/solenoid.h b/Marlin/src/feature/solenoid.h new file mode 100644 index 0000000000..5959b99a4e --- /dev/null +++ b/Marlin/src/feature/solenoid.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __SOLENOID_H__ +#define __SOLENOID_H__ + +void enable_solenoid_on_active_extruder(); +void disable_all_solenoids(); + +#endif // __SOLENOID_H__ diff --git a/Marlin/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp similarity index 98% rename from Marlin/tmc_util.cpp rename to Marlin/src/feature/tmc_util.cpp index 3f7272fec1..a5dc428592 100644 --- a/Marlin/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -20,18 +20,20 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if HAS_TRINAMIC #include "tmc_util.h" -#include "Marlin.h" -#include "printcounter.h" -#include "duration_t.h" -#include "stepper_indirection.h" +#include "../Marlin.h" + +#include "../module/stepper_indirection.h" +#include "../module/printcounter.h" +#include "../libs/duration_t.h" +#include "../gcode/gcode.h" #if ENABLED(TMC_DEBUG) - #include "planner.h" + #include "../module/planner.h" #endif bool report_tmc_status = false; @@ -534,7 +536,7 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { TMC_REPORT("Run current", TMC_IRUN); TMC_REPORT("Hold current", TMC_IHOLD); TMC_REPORT("CS actual\t", TMC_CS_ACTUAL); - TMC_REPORT("PWM scale", TMC_PWM_SCALE); + TMC_REPORT("PWM scale\t", TMC_PWM_SCALE); TMC_REPORT("vsense\t", TMC_VSENSE); TMC_REPORT("stealthChop", TMC_STEALTHCHOP); TMC_REPORT("msteps\t", TMC_MICROSTEPS); @@ -580,8 +582,8 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if ENABLED(SENSORLESS_HOMING) void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable/*=true*/) { + st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0); #if ENABLED(STEALTHCHOP) - st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0); st.stealthChop(!enable); #endif st.diag1_stall(enable ? 1 : 0); diff --git a/Marlin/tmc_util.h b/Marlin/src/feature/tmc_util.h similarity index 92% rename from Marlin/tmc_util.h rename to Marlin/src/feature/tmc_util.h index 8de85e2159..094b65e9b7 100644 --- a/Marlin/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -23,7 +23,7 @@ #ifndef _TMC_UTIL_H_ #define _TMC_UTIL_H_ -#include "MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" #if ENABLED(HAVE_TMC2130) #include @@ -53,7 +53,7 @@ void tmc_get_current(TMC &st, const TMC_AxisEnum axis) { _tmc_say_current(axis, st.getCurrent()); } template -void tmc_set_current(TMC &st, const TMC_AxisEnum axis, const int mA) { +void tmc_set_current(TMC &st, const int mA) { st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER); } template @@ -70,7 +70,7 @@ void tmc_get_pwmthrs(TMC &st, const TMC_AxisEnum axis, const uint16_t spmm) { _tmc_say_pwmthrs(axis, _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm)); } template -void tmc_set_pwmthrs(TMC &st, const TMC_AxisEnum axis, const int32_t thrs, const uint32_t spmm) { +void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) { st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm)); } template @@ -78,7 +78,7 @@ void tmc_get_sgt(TMC &st, const TMC_AxisEnum axis) { _tmc_say_sgt(axis, st.sgt()); } template -void tmc_set_sgt(TMC &st, const TMC_AxisEnum axis, const int8_t sgt_val) { +void tmc_set_sgt(TMC &st, const int8_t sgt_val) { st.sgt(sgt_val); } diff --git a/Marlin/twibus.cpp b/Marlin/src/feature/twibus.cpp similarity index 98% rename from Marlin/twibus.cpp rename to Marlin/src/feature/twibus.cpp index 777d151e4f..ef1fa742a0 100644 --- a/Marlin/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -20,13 +20,13 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(EXPERIMENTAL_I2CBUS) #include "twibus.h" + #include -#include "Marlin.h" TWIBus::TWIBus() { #if I2C_SLAVE_ADDRESS == 0 @@ -95,7 +95,7 @@ void TWIBus::echoprefix(uint8_t bytes, const char prefix[], uint8_t adr) { serialprintPGM(prefix); SERIAL_ECHOPAIR(": from:", adr); SERIAL_ECHOPAIR(" bytes:", bytes); - SERIAL_ECHOPGM (" data:"); + SERIAL_ECHOPGM(" data:"); } // static diff --git a/Marlin/twibus.h b/Marlin/src/feature/twibus.h similarity index 99% rename from Marlin/twibus.h rename to Marlin/src/feature/twibus.h index 03763972a7..7a17e2d53a 100644 --- a/Marlin/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -23,7 +23,7 @@ #ifndef TWIBUS_H #define TWIBUS_H -#include "macros.h" +#include "../core/macros.h" #include diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp new file mode 100644 index 0000000000..cbccdee89b --- /dev/null +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -0,0 +1,919 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Marlin Firmware -- G26 - Mesh Validation Tool + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(G26_MESH_VALIDATION) + +#define G26_OK false +#define G26_ERR true + +#include "../../gcode/gcode.h" +#include "../../feature/bedlevel/bedlevel.h" + +#include "../../Marlin.h" +#include "../../module/planner.h" +#include "../../module/stepper.h" +#include "../../module/motion.h" +#include "../../module/temperature.h" +#include "../../lcd/ultralcd.h" + +#define EXTRUSION_MULTIPLIER 1.0 +#define RETRACTION_MULTIPLIER 1.0 +#define PRIME_LENGTH 10.0 +#define OOZE_AMOUNT 0.3 + +#define INTERSECTION_CIRCLE_RADIUS 5 +#define CROSSHAIRS_SIZE 3 + +#if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS + #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." +#endif + +#define G26_OK false +#define G26_ERR true + +#if ENABLED(ARC_SUPPORT) + void plan_arc(const float (&cart)[XYZE], const float (&offset)[2], const uint8_t clockwise); +#endif + +/** + * G26 Mesh Validation Tool + * + * G26 is a Mesh Validation Tool intended to provide support for the Marlin Unified Bed Leveling System. + * In order to fully utilize and benefit from the Marlin Unified Bed Leveling System an accurate Mesh must + * be defined. G29 is designed to allow the user to quickly validate the correctness of her Mesh. It will + * first heat the bed and nozzle. It will then print lines and circles along the Mesh Cell boundaries and + * the intersections of those lines (respectively). + * + * This action allows the user to immediately see where the Mesh is properly defined and where it needs to + * be edited. The command will generate the Mesh lines closest to the nozzle's starting position. Alternatively + * the user can specify the X and Y position of interest with command parameters. This allows the user to + * focus on a particular area of the Mesh where attention is needed. + * + * B # Bed Set the Bed Temperature. If not specified, a default of 60 C. will be assumed. + * + * C Current When searching for Mesh Intersection points to draw, use the current nozzle location + * as the base for any distance comparison. + * + * D Disable Disable the Unified Bed Leveling System. In the normal case the user is invoking this + * command to see how well a Mesh as been adjusted to match a print surface. In order to do + * this the Unified Bed Leveling System is turned on by the G26 command. The D parameter + * alters the command's normal behaviour and disables the Unified Bed Leveling System even if + * it is on. + * + * H # Hotend Set the Nozzle Temperature. If not specified, a default of 205 C. will be assumed. + * + * F # Filament Used to specify the diameter of the filament being used. If not specified + * 1.75mm filament is assumed. If you are not getting acceptable results by using the + * 'correct' numbers, you can scale this number up or down a little bit to change the amount + * of filament that is being extruded during the printing of the various lines on the bed. + * + * K Keep-On Keep the heaters turned on at the end of the command. + * + * L # Layer Layer height. (Height of nozzle above bed) If not specified .20mm will be used. + * + * O # Ooooze How much your nozzle will Ooooze filament while getting in position to print. This + * is over kill, but using this parameter will let you get the very first 'circle' perfect + * so you have a trophy to peel off of the bed and hang up to show how perfectly you have your + * Mesh calibrated. If not specified, a filament length of .3mm is assumed. + * + * P # Prime Prime the nozzle with specified length of filament. If this parameter is not + * given, no prime action will take place. If the parameter specifies an amount, that much + * will be purged before continuing. If no amount is specified the command will start + * purging filament until the user provides an LCD Click and then it will continue with + * printing the Mesh. You can carefully remove the spent filament with a needle nose + * pliers while holding the LCD Click wheel in a depressed state. If you do not have + * an LCD, you must specify a value if you use P. + * + * Q # Multiplier Retraction Multiplier. Normally not needed. Retraction defaults to 1.0mm and + * un-retraction is at 1.2mm These numbers will be scaled by the specified amount + * + * R # Repeat Prints the number of patterns given as a parameter, starting at the current location. + * If a parameter isn't given, every point will be printed unless G26 is interrupted. + * This works the same way that the UBL G29 P4 R parameter works. + * + * NOTE: If you do not have an LCD, you -must- specify R. This is to ensure that you are + * aware that there's some risk associated with printing without the ability to abort in + * cases where mesh point Z value may be inaccurate. As above, if you do not include a + * parameter, every point will be printed. + * + * S # Nozzle Used to control the size of nozzle diameter. If not specified, a .4mm nozzle is assumed. + * + * U # Random Randomize the order that the circles are drawn on the bed. The search for the closest + * undrawn cicle is still done. But the distance to the location for each circle has a + * random number of the size specified added to it. Specifying S50 will give an interesting + * deviation from the normal behaviour on a 10 x 10 Mesh. + * + * X # X Coord. Specify the starting location of the drawing activity. + * + * Y # Y Coord. Specify the starting location of the drawing activity. + */ + +// External references + +// Private functions + +static uint16_t circle_flags[16], horizontal_mesh_line_flags[16], vertical_mesh_line_flags[16]; +float g26_e_axis_feedrate = 0.025, + random_deviation = 0.0; + +static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched + // retracts/recovers won't result in a bad state. + +float g26_extrusion_multiplier, + g26_retraction_multiplier, + g26_layer_height, + g26_prime_length; + +float g26_x_pos = 0, g26_y_pos = 0; + +int16_t g26_bed_temp, + g26_hotend_temp; + +int8_t g26_prime_flag; + +#if ENABLED(ULTIPANEL) + + /** + * If the LCD is clicked, cancel, wait for release, return true + */ + bool user_canceled() { + if (!is_lcd_clicked()) return false; // Return if the button isn't pressed + lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99); + #if ENABLED(ULTIPANEL) + lcd_quick_feedback(true); + #endif + wait_for_release(); + return true; + } + + bool exit_from_g26() { + lcd_setstatusPGM(PSTR("Leaving G26"), -1); + wait_for_release(); + return G26_ERR; + } + +#endif + +mesh_index_pair find_closest_circle_to_print(const float &X, const float &Y) { + float closest = 99999.99; + mesh_index_pair return_val; + + return_val.x_index = return_val.y_index = -1; + + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { + if (!is_bitmap_set(circle_flags, i, j)) { + const float mx = _GET_MESH_X(i), // We found a circle that needs to be printed + my = _GET_MESH_Y(j); + + // Get the distance to this intersection + float f = HYPOT(X - mx, Y - my); + + // It is possible that we are being called with the values + // to let us find the closest circle to the start position. + // But if this is not the case, add a small weighting to the + // distance calculation to help it choose a better place to continue. + f += HYPOT(g26_x_pos - mx, g26_y_pos - my) / 15.0; + + // Add in the specified amount of Random Noise to our search + if (random_deviation > 1.0) + f += random(0.0, random_deviation); + + if (f < closest) { + closest = f; // We found a closer location that is still + return_val.x_index = i; // un-printed --- save the data for it + return_val.y_index = j; + return_val.distance = closest; + } + } + } + } + bitmap_set(circle_flags, return_val.x_index, return_val.y_index); // Mark this location as done. + return return_val; +} + +void G26_line_to_destination(const float &feed_rate) { + const float save_feedrate = feedrate_mm_s; + feedrate_mm_s = feed_rate; + prepare_move_to_destination(); // will ultimately call ubl.line_to_destination_cartesian or ubl.prepare_linear_move_to for UBL_SEGMENTED + feedrate_mm_s = save_feedrate; +} + +void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { + float feed_value; + static float last_z = -999.99; + + bool has_xy_component = (rx != current_position[X_AXIS] || ry != current_position[Y_AXIS]); // Check if X or Y is involved in the movement. + + if (z != last_z) { + last_z = z; + feed_value = planner.max_feedrate_mm_s[Z_AXIS]/(3.0); // Base the feed rate off of the configured Z_AXIS feed rate + + destination[X_AXIS] = current_position[X_AXIS]; + destination[Y_AXIS] = current_position[Y_AXIS]; + destination[Z_AXIS] = z; // We know the last_z==z or we wouldn't be in this block of code. + destination[E_AXIS] = current_position[E_AXIS]; + + G26_line_to_destination(feed_value); + set_destination_from_current(); + } + + // Check if X or Y is involved in the movement. + // Yes: a 'normal' movement. No: a retract() or recover() + feed_value = has_xy_component ? PLANNER_XY_FEEDRATE() / 10.0 : planner.max_feedrate_mm_s[E_AXIS] / 1.5; + + if (g26_debug_flag) SERIAL_ECHOLNPAIR("in move_to() feed_value for XY:", feed_value); + + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + destination[E_AXIS] += e_delta; + + G26_line_to_destination(feed_value); + set_destination_from_current(); +} + +FORCE_INLINE void move_to(const float (&where)[XYZE], const float &de) { move_to(where[X_AXIS], where[Y_AXIS], where[Z_AXIS], de); } + +void retract_filament(const float (&where)[XYZE]) { + if (!g26_retracted) { // Only retract if we are not already retracted! + g26_retracted = true; + move_to(where, -1.0 * g26_retraction_multiplier); + } +} + +void recover_filament(const float (&where)[XYZE]) { + if (g26_retracted) { // Only un-retract if we are retracted. + move_to(where, 1.2 * g26_retraction_multiplier); + g26_retracted = false; + } +} + +/** + * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one + * to the other. But there are really three sets of coordinates involved. The first coordinate + * is the present location of the nozzle. We don't necessarily want to print from this location. + * We first need to move the nozzle to the start of line segment where we want to print. Once + * there, we can use the two coordinates supplied to draw the line. + * + * Note: Although we assume the first set of coordinates is the start of the line and the second + * set of coordinates is the end of the line, it does not always work out that way. This function + * optimizes the movement to minimize the travel distance before it can start printing. This saves + * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does + * cause a lot of very little short retracement of th nozzle when it draws the very first line + * segment of a 'circle'. The time this requires is very short and is easily saved by the other + * cases where the optimization comes into play. + */ +void print_line_from_here_to_there(const float &sx, const float &sy, const float &sz, const float &ex, const float &ey, const float &ez) { + const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual line segment + dy_s = current_position[Y_AXIS] - sy, + dist_start = HYPOT2(dx_s, dy_s), // We don't need to do a sqrt(), we can compare the distance^2 + // to save computation time + dx_e = current_position[X_AXIS] - ex, // find our distance from the end of the actual line segment + dy_e = current_position[Y_AXIS] - ey, + dist_end = HYPOT2(dx_e, dy_e), + + line_length = HYPOT(ex - sx, ey - sy); + + // If the end point of the line is closer to the nozzle, flip the direction, + // moving from the end to the start. On very small lines the optimization isn't worth it. + if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) + return print_line_from_here_to_there(ex, ey, ez, sx, sy, sz); + + // Decide whether to retract & bump + + if (dist_start > 2.0) { + retract_filament(destination); + //todo: parameterize the bump height with a define + move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping + move_to(sx, sy, sz + 0.500, 0.0); // Get to the starting point with no extrusion while bumped + } + + move_to(sx, sy, sz, 0.0); // Get to the starting point with no extrusion / un-Z bump + + const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; + + recover_filament(destination); + move_to(ex, ey, ez, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion +} + +inline bool look_for_lines_to_connect() { + float sx, sy, ex, ey; + + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { + + #if ENABLED(ULTIPANEL) + if (user_canceled()) return true; // Check if the user wants to stop the Mesh Validation + #endif + + if (i < GRID_MAX_POINTS_X) { // We can't connect to anything to the right than GRID_MAX_POINTS_X. + // This is already a half circle because we are at the edge of the bed. + + if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i + 1, j)) { // check if we can do a line to the left + if (!is_bitmap_set(horizontal_mesh_line_flags, i, j)) { + + // + // We found two circles that need a horizontal line to connect them + // Print it! + // + sx = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge + ex = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge + + sx = constrain(sx, X_MIN_POS + 1, X_MAX_POS - 1); + sy = ey = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + ex = constrain(ex, X_MIN_POS + 1, X_MAX_POS - 1); + + if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { + + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" Connecting with horizontal line (sx=", sx); + SERIAL_ECHOPAIR(", sy=", sy); + SERIAL_ECHOPAIR(") -> (ex=", ex); + SERIAL_ECHOPAIR(", ey=", ey); + SERIAL_CHAR(')'); + SERIAL_EOL(); + //debug_current_and_destination(PSTR("Connecting horizontal line.")); + } + print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + } + bitmap_set(horizontal_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if we skipped it + } + } + + if (j < GRID_MAX_POINTS_Y) { // We can't connect to anything further back than GRID_MAX_POINTS_Y. + // This is already a half circle because we are at the edge of the bed. + + if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i, j + 1)) { // check if we can do a line straight down + if (!is_bitmap_set( vertical_mesh_line_flags, i, j)) { + // + // We found two circles that need a vertical line to connect them + // Print it! + // + sy = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge + ey = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge + + sx = ex = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + sy = constrain(sy, Y_MIN_POS + 1, Y_MAX_POS - 1); + ey = constrain(ey, Y_MIN_POS + 1, Y_MAX_POS - 1); + + if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { + + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" Connecting with vertical line (sx=", sx); + SERIAL_ECHOPAIR(", sy=", sy); + SERIAL_ECHOPAIR(") -> (ex=", ex); + SERIAL_ECHOPAIR(", ey=", ey); + SERIAL_CHAR(')'); + SERIAL_EOL(); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + debug_current_and_destination(PSTR("Connecting vertical line.")); + #endif + } + print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + } + bitmap_set(vertical_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if skipped + } + } + } + } + } + } + return false; +} + +/** + * Turn on the bed and nozzle heat and + * wait for them to get up to temperature. + */ +inline bool turn_on_heaters() { + millis_t next = millis() + 5000UL; + #if HAS_HEATED_BED + #if ENABLED(ULTRA_LCD) + if (g26_bed_temp > 25) { + lcd_setstatusPGM(PSTR("G26 Heating Bed."), 99); + lcd_quick_feedback(true); + #if ENABLED(ULTIPANEL) + lcd_external_control = true; + #endif + #endif + thermalManager.setTargetBed(g26_bed_temp); + while (ABS(thermalManager.degBed() - g26_bed_temp) > 3) { + + #if ENABLED(ULTIPANEL) + if (is_lcd_clicked()) return exit_from_g26(); + #endif + + if (ELAPSED(millis(), next)) { + next = millis() + 5000UL; + thermalManager.print_heaterstates(); + SERIAL_EOL(); + } + idle(); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + #if ENABLED(ULTRA_LCD) + } + lcd_setstatusPGM(PSTR("G26 Heating Nozzle."), 99); + lcd_quick_feedback(true); + #endif + #endif + + // Start heating the nozzle and wait for it to reach temperature. + thermalManager.setTargetHotend(g26_hotend_temp, 0); + while (ABS(thermalManager.degHotend(0) - g26_hotend_temp) > 3) { + + #if ENABLED(ULTIPANEL) + if (is_lcd_clicked()) return exit_from_g26(); + #endif + + if (ELAPSED(millis(), next)) { + next = millis() + 5000UL; + thermalManager.print_heaterstates(); + SERIAL_EOL(); + } + idle(); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + + #if ENABLED(ULTRA_LCD) + lcd_reset_status(); + lcd_quick_feedback(true); + #endif + + return G26_OK; +} + +/** + * Prime the nozzle if needed. Return true on error. + */ +inline bool prime_nozzle() { + + #if ENABLED(ULTIPANEL) + float Total_Prime = 0.0; + + if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged + + lcd_external_control = true; + lcd_setstatusPGM(PSTR("User-Controlled Prime"), 99); + lcd_chirp(); + + set_destination_from_current(); + + recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). + + while (!is_lcd_clicked()) { + lcd_chirp(); + destination[E_AXIS] += 0.25; + #ifdef PREVENT_LENGTHY_EXTRUDE + Total_Prime += 0.25; + if (Total_Prime >= EXTRUDE_MAXLENGTH) return G26_ERR; + #endif + G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); + set_destination_from_current(); + planner.synchronize(); // Without this synchronize, the purge is more consistent, + // but because the planner has a buffer, we won't be able + // to stop as quickly. So we put up with the less smooth + // action to give the user a more responsive 'Stop'. + } + + wait_for_release(); + + lcd_setstatusPGM(PSTR("Done Priming"), 99); + lcd_quick_feedback(true); + lcd_external_control = false; + } + else + #endif + { + #if ENABLED(ULTRA_LCD) + lcd_setstatusPGM(PSTR("Fixed Length Prime."), 99); + lcd_quick_feedback(true); + #endif + set_destination_from_current(); + destination[E_AXIS] += g26_prime_length; + G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); + set_destination_from_current(); + retract_filament(destination); + } + + return G26_OK; +} + +float valid_trig_angle(float d) { + while (d > 360.0) d -= 360.0; + while (d < 0.0) d += 360.0; + return d; +} + +/** + * G26: Mesh Validation Pattern generation. + * + * Used to interactively edit the mesh by placing the + * nozzle in a problem area and doing a G29 P4 R command. + * + * Parameters: + * + * B Bed Temperature + * C Continue from the Closest mesh point + * D Disable leveling before starting + * F Filament diameter + * H Hotend Temperature + * K Keep heaters on when completed + * L Layer Height + * O Ooze extrusion length + * P Prime length + * Q Retraction multiplier + * R Repetitions (number of grid points) + * S Nozzle Size (diameter) in mm + * U Random deviation (50 if no value given) + * X X position + * Y Y position + */ +void GcodeSuite::G26() { + SERIAL_ECHOLNPGM("G26 command started. Waiting for heater(s)."); + + // Don't allow Mesh Validation without homing first, + // or if the parameter parsing did not go OK, abort + if (axis_unhomed_error()) return; + + g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; + g26_retraction_multiplier = RETRACTION_MULTIPLIER; + g26_layer_height = MESH_TEST_LAYER_HEIGHT; + g26_prime_length = PRIME_LENGTH; + g26_bed_temp = MESH_TEST_BED_TEMP; + g26_hotend_temp = MESH_TEST_HOTEND_TEMP; + g26_prime_flag = 0; + + float g26_nozzle = MESH_TEST_NOZZLE_SIZE, + g26_filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, + g26_ooze_amount = parser.linearval('O', OOZE_AMOUNT); + + bool g26_continue_with_closest = parser.boolval('C'), + g26_keep_heaters_on = parser.boolval('K'); + + if (parser.seenval('B')) { + g26_bed_temp = parser.value_celsius(); + if (g26_bed_temp && !WITHIN(g26_bed_temp, 40, 140)) { + SERIAL_PROTOCOLLNPGM("?Specified bed temperature not plausible (40-140C)."); + return; + } + } + + if (parser.seenval('L')) { + g26_layer_height = parser.value_linear_units(); + if (!WITHIN(g26_layer_height, 0.0, 2.0)) { + SERIAL_PROTOCOLLNPGM("?Specified layer height not plausible."); + return; + } + } + + if (parser.seen('Q')) { + if (parser.has_value()) { + g26_retraction_multiplier = parser.value_float(); + if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { + SERIAL_PROTOCOLLNPGM("?Specified Retraction Multiplier not plausible."); + return; + } + } + else { + SERIAL_PROTOCOLLNPGM("?Retraction Multiplier must be specified."); + return; + } + } + + if (parser.seenval('S')) { + g26_nozzle = parser.value_float(); + if (!WITHIN(g26_nozzle, 0.1, 1.0)) { + SERIAL_PROTOCOLLNPGM("?Specified nozzle size not plausible."); + return; + } + } + + if (parser.seen('P')) { + if (!parser.has_value()) { + #if ENABLED(ULTIPANEL) + g26_prime_flag = -1; + #else + SERIAL_PROTOCOLLNPGM("?Prime length must be specified when not using an LCD."); + return; + #endif + } + else { + g26_prime_flag++; + g26_prime_length = parser.value_linear_units(); + if (!WITHIN(g26_prime_length, 0.0, 25.0)) { + SERIAL_PROTOCOLLNPGM("?Specified prime length not plausible."); + return; + } + } + } + + if (parser.seenval('F')) { + g26_filament_diameter = parser.value_linear_units(); + if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { + SERIAL_PROTOCOLLNPGM("?Specified filament size not plausible."); + return; + } + } + g26_extrusion_multiplier *= sq(1.75) / sq(g26_filament_diameter); // If we aren't using 1.75mm filament, we need to + // scale up or down the length needed to get the + // same volume of filament + + g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size + + if (parser.seenval('H')) { + g26_hotend_temp = parser.value_celsius(); + if (!WITHIN(g26_hotend_temp, 165, 280)) { + SERIAL_PROTOCOLLNPGM("?Specified nozzle temperature not plausible."); + return; + } + } + + if (parser.seen('U')) { + randomSeed(millis()); + // This setting will persist for the next G26 + random_deviation = parser.has_value() ? parser.value_float() : 50.0; + } + + int16_t g26_repeats; + #if ENABLED(ULTIPANEL) + g26_repeats = parser.intval('R', GRID_MAX_POINTS + 1); + #else + if (!parser.seen('R')) { + SERIAL_PROTOCOLLNPGM("?(R)epeat must be specified when not using an LCD."); + return; + } + else + g26_repeats = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS + 1; + #endif + if (g26_repeats < 1) { + SERIAL_PROTOCOLLNPGM("?(R)epeat value not plausible; must be at least 1."); + return; + } + + g26_x_pos = parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position[X_AXIS]; + g26_y_pos = parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position[Y_AXIS]; + if (!position_is_reachable(g26_x_pos, g26_y_pos)) { + SERIAL_PROTOCOLLNPGM("?Specified X,Y coordinate out of bounds."); + return; + } + + /** + * Wait until all parameters are verified before altering the state! + */ + set_bed_leveling_enabled(!parser.seen('D')); + + if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) { + do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + set_current_from_destination(); + } + + if (turn_on_heaters() != G26_OK) goto LEAVE; + + current_position[E_AXIS] = 0.0; + sync_plan_position_e(); + + if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; + + /** + * Bed is preheated + * + * Nozzle is at temperature + * + * Filament is primed! + * + * It's "Show Time" !!! + */ + + ZERO(circle_flags); + ZERO(horizontal_mesh_line_flags); + ZERO(vertical_mesh_line_flags); + + // Move nozzle to the specified height for the first layer + set_destination_from_current(); + destination[Z_AXIS] = g26_layer_height; + move_to(destination, 0.0); + move_to(destination, g26_ooze_amount); + + #if ENABLED(ULTIPANEL) + lcd_external_control = true; + #endif + + //debug_current_and_destination(PSTR("Starting G26 Mesh Validation Pattern.")); + + #if DISABLED(ARC_SUPPORT) + + /** + * Pre-generate radius offset values at 30 degree intervals to reduce CPU load. + */ + #define A_INT 30 + #define _ANGS (360 / A_INT) + #define A_CNT (_ANGS / 2) + #define _IND(A) ((A + _ANGS * 8) % _ANGS) + #define _COS(A) (trig_table[_IND(A) % A_CNT] * (_IND(A) >= A_CNT ? -1 : 1)) + #define _SIN(A) (-_COS((A + A_CNT / 2) % _ANGS)) + #if A_CNT & 1 + #error "A_CNT must be a positive value. Please change A_INT." + #endif + float trig_table[A_CNT]; + for (uint8_t i = 0; i < A_CNT; i++) + trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); + + #endif // !ARC_SUPPORT + + mesh_index_pair location; + do { + location = g26_continue_with_closest + ? find_closest_circle_to_print(current_position[X_AXIS], current_position[Y_AXIS]) + : find_closest_circle_to_print(g26_x_pos, g26_y_pos); // Find the closest Mesh Intersection to where we are now. + + if (location.x_index >= 0 && location.y_index >= 0) { + const float circle_x = _GET_MESH_X(location.x_index), + circle_y = _GET_MESH_Y(location.y_index); + + // If this mesh location is outside the printable_radius, skip it. + if (!position_is_reachable(circle_x, circle_y)) continue; + + // Determine where to start and end the circle, + // which is always drawn counter-clockwise. + const uint8_t xi = location.x_index, yi = location.y_index; + const bool f = yi == 0, r = xi >= GRID_MAX_POINTS_X - 1, b = yi >= GRID_MAX_POINTS_Y - 1; + + #if ENABLED(ARC_SUPPORT) + + #define ARC_LENGTH(quarters) (INTERSECTION_CIRCLE_RADIUS * M_PI * (quarters) / 2) + float sx = circle_x + INTERSECTION_CIRCLE_RADIUS, // default to full circle + ex = circle_x + INTERSECTION_CIRCLE_RADIUS, + sy = circle_y, ey = circle_y, + arc_length = ARC_LENGTH(4); + + // Figure out where to start and end the arc - we always print counterclockwise + if (xi == 0) { // left edge + sx = f ? circle_x + INTERSECTION_CIRCLE_RADIUS : circle_x; + ex = b ? circle_x + INTERSECTION_CIRCLE_RADIUS : circle_x; + sy = f ? circle_y : circle_y - INTERSECTION_CIRCLE_RADIUS; + ey = b ? circle_y : circle_y + INTERSECTION_CIRCLE_RADIUS; + arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); + } + else if (r) { // right edge + sx = b ? circle_x - INTERSECTION_CIRCLE_RADIUS : circle_x; + ex = f ? circle_x - INTERSECTION_CIRCLE_RADIUS : circle_x; + sy = b ? circle_y : circle_y + INTERSECTION_CIRCLE_RADIUS; + ey = f ? circle_y : circle_y - INTERSECTION_CIRCLE_RADIUS; + arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); + } + else if (f) { + sx = circle_x + INTERSECTION_CIRCLE_RADIUS; + ex = circle_x - INTERSECTION_CIRCLE_RADIUS; + sy = ey = circle_y; + arc_length = ARC_LENGTH(2); + } + else if (b) { + sx = circle_x - INTERSECTION_CIRCLE_RADIUS; + ex = circle_x + INTERSECTION_CIRCLE_RADIUS; + sy = ey = circle_y; + arc_length = ARC_LENGTH(2); + } + const float arc_offset[2] = { + circle_x - sx, + circle_y - sy + }; + + const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual circle + dy_s = current_position[Y_AXIS] - sy, + dist_start = HYPOT2(dx_s, dy_s); + const float endpoint[XYZE] = { + ex, ey, + g26_layer_height, + current_position[E_AXIS] + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + }; + + if (dist_start > 2.0) { + retract_filament(destination); + //todo: parameterize the bump height with a define + move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping + move_to(sx, sy, g26_layer_height + 0.500, 0.0); // Get to the starting point with no extrusion while bumped + } + + move_to(sx, sy, g26_layer_height, 0.0); // Get to the starting point with no extrusion / un-Z bump + + recover_filament(destination); + const float save_feedrate = feedrate_mm_s; + feedrate_mm_s = PLANNER_XY_FEEDRATE() / 10.0; + plan_arc(endpoint, arc_offset, false); // Draw a counter-clockwise arc + feedrate_mm_s = save_feedrate; + set_destination_from_current(); + #if ENABLED(ULTIPANEL) + if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation + #endif + + #else // !ARC_SUPPORT + + int8_t start_ind = -2, end_ind = 9; // Assume a full circle (from 5:00 to 5:00) + if (xi == 0) { // Left edge? Just right half. + start_ind = f ? 0 : -3; // 03:00 to 12:00 for front-left + end_ind = b ? 0 : 2; // 06:00 to 03:00 for back-left + } + else if (r) { // Right edge? Just left half. + start_ind = b ? 6 : 3; // 12:00 to 09:00 for front-right + end_ind = f ? 5 : 8; // 09:00 to 06:00 for back-right + } + else if (f) { // Front edge? Just back half. + start_ind = 0; // 03:00 + end_ind = 5; // 09:00 + } + else if (b) { // Back edge? Just front half. + start_ind = 6; // 09:00 + end_ind = 11; // 03:00 + } + + for (int8_t ind = start_ind; ind <= end_ind; ind++) { + + #if ENABLED(ULTIPANEL) + if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation + #endif + + float rx = circle_x + _COS(ind), // For speed, these are now a lookup table entry + ry = circle_y + _SIN(ind), + xe = circle_x + _COS(ind + 1), + ye = circle_y + _SIN(ind + 1); + + #if IS_KINEMATIC + // Check to make sure this segment is entirely on the bed, skip if not. + if (!position_is_reachable(rx, ry) || !position_is_reachable(xe, ye)) continue; + #else // not, we need to skip + rx = constrain(rx, X_MIN_POS + 1, X_MAX_POS - 1); // This keeps us from bumping the endstops + ry = constrain(ry, Y_MIN_POS + 1, Y_MAX_POS - 1); + xe = constrain(xe, X_MIN_POS + 1, X_MAX_POS - 1); + ye = constrain(ye, Y_MIN_POS + 1, Y_MAX_POS - 1); + #endif + + print_line_from_here_to_there(rx, ry, g26_layer_height, xe, ye, g26_layer_height); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + + #endif // !ARC_SUPPORT + + if (look_for_lines_to_connect()) goto LEAVE; + } + + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + + } while (--g26_repeats && location.x_index >= 0 && location.y_index >= 0); + + LEAVE: + lcd_setstatusPGM(PSTR("Leaving G26"), -1); + + retract_filament(destination); + destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; + + //debug_current_and_destination(PSTR("ready to do Z-Raise.")); + move_to(destination, 0); // Raise the nozzle + //debug_current_and_destination(PSTR("done doing Z-Raise.")); + + destination[X_AXIS] = g26_x_pos; // Move back to the starting position + destination[Y_AXIS] = g26_y_pos; + //destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is + + move_to(destination, 0); // Move back to the starting position + //debug_current_and_destination(PSTR("done doing X/Y move.")); + + #if ENABLED(ULTIPANEL) + lcd_external_control = false; // Give back control of the LCD Panel! + #endif + + if (!g26_keep_heaters_on) { + #if HAS_HEATED_BED + thermalManager.setTargetBed(0); + #endif + thermalManager.setTargetHotend(0, 0); + } +} + +#endif // G26_MESH_VALIDATION diff --git a/Marlin/src/gcode/bedlevel/G42.cpp b/Marlin/src/gcode/bedlevel/G42.cpp new file mode 100644 index 0000000000..727e4cf1da --- /dev/null +++ b/Marlin/src/gcode/bedlevel/G42.cpp @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_MESH + +#include "../gcode.h" +#include "../../Marlin.h" // for IsRunning() +#include "../../module/motion.h" +#include "../../feature/bedlevel/bedlevel.h" + +/** + * G42: Move X & Y axes to mesh coordinates (I & J) + */ +void GcodeSuite::G42() { + if (MOTION_CONDITIONS) { + const bool hasI = parser.seenval('I'); + const int8_t ix = hasI ? parser.value_int() : 0; + const bool hasJ = parser.seenval('J'); + const int8_t iy = hasJ ? parser.value_int() : 0; + + if ((hasI && !WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) || (hasJ && !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1))) { + SERIAL_ECHOLNPGM(MSG_ERR_MESH_XY); + return; + } + + set_destination_from_current(); + if (hasI) destination[X_AXIS] = _GET_MESH_X(ix); + if (hasJ) destination[Y_AXIS] = _GET_MESH_Y(iy); + if (parser.boolval('P')) { + if (hasI) destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; + if (hasJ) destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; + } + + const float fval = parser.linearval('F'); + if (fval > 0.0) feedrate_mm_s = MMM_TO_MMS(fval); + + // SCARA kinematic has "safe" XY raw moves + #if IS_SCARA + prepare_uninterpolated_move_to_destination(); + #else + prepare_move_to_destination(); + #endif + } +} + +#endif // HAS_MESH diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp new file mode 100644 index 0000000000..2b950ef718 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -0,0 +1,214 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_LEVELING + +#include "../gcode.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/planner.h" + +#if ENABLED(EEPROM_SETTINGS) + #include "../../module/configuration_store.h" +#endif + +//#define M420_C_USE_MEAN + +/** + * M420: Enable/Disable Bed Leveling and/or set the Z fade height. + * + * S[bool] Turns leveling on or off + * Z[height] Sets the Z fade height (0 or none to disable) + * V[bool] Verbose - Print the leveling grid + * + * With AUTO_BED_LEVELING_UBL only: + * + * L[index] Load UBL mesh from index (0 is default) + * T[map] 0:Human-readable 1:CSV 2:"LCD" 4:Compact + * + * With mesh-based leveling only: + * + * C Center mesh on the mean of the lowest and highest + */ +void GcodeSuite::M420() { + const bool seen_S = parser.seen('S'); + bool to_enable = seen_S ? parser.value_bool() : planner.leveling_active; + + // If disabling leveling do it right away + // (Don't disable for just M420 or M420 V) + if (seen_S && !to_enable) set_bed_leveling_enabled(false); + + const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + // L to load a mesh from the EEPROM + if (parser.seen('L')) { + + set_bed_leveling_enabled(false); + + #if ENABLED(EEPROM_SETTINGS) + const int8_t storage_slot = parser.has_value() ? parser.value_int() : ubl.storage_slot; + const int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); + return; + } + + if (!WITHIN(storage_slot, 0, a - 1)) { + SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); + return; + } + + settings.load_mesh(storage_slot); + ubl.storage_slot = storage_slot; + + #else + + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); + return; + + #endif + } + + // L or V display the map info + if (parser.seen('L') || parser.seen('V')) { + ubl.display_map(parser.byteval('T')); + SERIAL_ECHOPGM("Mesh is "); + if (!ubl.mesh_is_valid()) SERIAL_ECHOPGM("in"); + SERIAL_ECHOLNPAIR("valid\nStorage slot: ", ubl.storage_slot); + } + + #endif // AUTO_BED_LEVELING_UBL + + #if HAS_MESH + + #if ENABLED(MESH_BED_LEVELING) + #define Z_VALUES(X,Y) mbl.z_values[X][Y] + #else + #define Z_VALUES(X,Y) z_values[X][Y] + #endif + + // Subtract the given value or the mean from all mesh values + if (leveling_is_valid() && parser.seen('C')) { + const float cval = parser.value_float(); + #if ENABLED(AUTO_BED_LEVELING_UBL) + + set_bed_leveling_enabled(false); + ubl.adjust_mesh_to_mean(true, cval); + + #else + + #if ENABLED(M420_C_USE_MEAN) + + // Get the sum and average of all mesh values + float mesh_sum = 0; + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) + mesh_sum += Z_VALUES(x, y); + const float zmean = mesh_sum / float(GRID_MAX_POINTS); + + #else + + // Find the low and high mesh values + float lo_val = 100, hi_val = -100; + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) { + const float z = Z_VALUES(x, y); + NOMORE(lo_val, z); + NOLESS(hi_val, z); + } + // Take the mean of the lowest and highest + const float zmean = (lo_val + hi_val) / 2.0 + cval; + + #endif + + // If not very close to 0, adjust the mesh + if (!NEAR_ZERO(zmean)) { + set_bed_leveling_enabled(false); + // Subtract the mean from all values + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) + Z_VALUES(x, y) -= zmean; + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif + } + + #endif + } + + #endif // HAS_MESH + + // V to print the matrix or mesh + if (parser.seen('V')) { + #if ABL_PLANAR + planner.bed_level_matrix.debug(PSTR("Bed Level Correction Matrix:")); + #else + if (leveling_is_valid()) { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + print_bilinear_leveling_grid(); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + print_bilinear_leveling_grid_virt(); + #endif + #elif ENABLED(MESH_BED_LEVELING) + SERIAL_ECHOLNPGM("Mesh Bed Level data:"); + mbl.report_mesh(); + #endif + } + #endif + } + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (parser.seen('Z')) set_z_fade_height(parser.value_linear_units(), false); + #endif + + // Enable leveling if specified, or if previously active + set_bed_leveling_enabled(to_enable); + + // Error if leveling failed to enable or reenable + if (to_enable && !planner.leveling_active) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M420_FAILED); + } + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Bed Leveling ", planner.leveling_active ? MSG_ON : MSG_OFF); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Fade Height "); + if (planner.z_fade_height > 0.0) + SERIAL_ECHOLN(planner.z_fade_height); + else + SERIAL_ECHOLNPGM(MSG_OFF); + #endif + + // Report change in position + if (memcmp(oldpos, current_position, sizeof(oldpos))) + report_current_position(); +} + +#endif // HAS_LEVELING \ No newline at end of file diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp new file mode 100644 index 0000000000..fb8a2e55ff --- /dev/null +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -0,0 +1,991 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * G29.cpp - Auto Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if OLDSCHOOL_ABL + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" +#include "../../../module/probe.h" +#include "../../queue.h" + +#if ENABLED(LCD_BED_LEVELING) && ENABLED(PROBE_MANUALLY) + #include "../../../lcd/ultralcd.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) + #include "../../../libs/least_squares_fit.h" +#endif + +#if ABL_PLANAR + #include "../../../libs/vector_3.h" +#endif + +#if ABL_GRID + #if ENABLED(PROBE_Y_FIRST) + #define PR_OUTER_VAR xCount + #define PR_OUTER_END abl_grid_points_x + #define PR_INNER_VAR yCount + #define PR_INNER_END abl_grid_points_y + #else + #define PR_OUTER_VAR yCount + #define PR_OUTER_END abl_grid_points_y + #define PR_INNER_VAR xCount + #define PR_INNER_END abl_grid_points_x + #endif +#endif + +/** + * G29: Detailed Z probe, probes the bed at 3 or more points. + * Will fail if the printer has not been homed with G28. + * + * Enhanced G29 Auto Bed Leveling Probe Routine + * + * O Auto-level only if needed + * + * D Dry-Run mode. Just evaluate the bed Topology - Don't apply + * or alter the bed level data. Useful to check the topology + * after a first run of G29. + * + * J Jettison current bed leveling data + * + * V Set the verbose level (0-4). Example: "G29 V3" + * + * Parameters With LINEAR leveling only: + * + * P Set the size of the grid that will be probed (P x P points). + * Example: "G29 P4" + * + * X Set the X size of the grid that will be probed (X x Y points). + * Example: "G29 X7 Y5" + * + * Y Set the Y size of the grid that will be probed (X x Y points). + * + * T Generate a Bed Topology Report. Example: "G29 P5 T" for a detailed report. + * This is useful for manual bed leveling and finding flaws in the bed (to + * assist with part placement). + * Not supported by non-linear delta printer bed leveling. + * + * Parameters With LINEAR and BILINEAR leveling only: + * + * S Set the XY travel speed between probe points (in units/min) + * + * F Set the Front limit of the probing grid + * B Set the Back limit of the probing grid + * L Set the Left limit of the probing grid + * R Set the Right limit of the probing grid + * + * Parameters with DEBUG_LEVELING_FEATURE only: + * + * C Make a totally fake grid with no actual probing. + * For use in testing when no probing is possible. + * + * Parameters with BILINEAR leveling only: + * + * Z Supply an additional Z probe offset + * + * Extra parameters with PROBE_MANUALLY: + * + * To do manual probing simply repeat G29 until the procedure is complete. + * The first G29 accepts parameters. 'G29 Q' for status, 'G29 A' to abort. + * + * Q Query leveling and G29 state + * + * A Abort current leveling procedure + * + * Extra parameters with BILINEAR only: + * + * W Write a mesh point. (If G29 is idle.) + * I X index for mesh point + * J Y index for mesh point + * X X for mesh point, overrides I + * Y Y for mesh point, overrides J + * Z Z for mesh point. Otherwise, raw current Z. + * + * Without PROBE_MANUALLY: + * + * E By default G29 will engage the Z probe, test the bed, then disengage. + * Include "E" to engage/disengage the Z probe for each sample. + * There's no extra effect if you have a fixed Z probe. + * + */ +void GcodeSuite::G29() { + + #if ENABLED(DEBUG_LEVELING_FEATURE) || ENABLED(PROBE_MANUALLY) + const bool seenQ = parser.seen('Q'); + #else + constexpr bool seenQ = false; + #endif + + // G29 Q is also available if debugging + #if ENABLED(DEBUG_LEVELING_FEATURE) + const uint8_t old_debug_flags = marlin_debug_flags; + if (seenQ) marlin_debug_flags |= DEBUG_LEVELING; + if (DEBUGGING(LEVELING)) { + DEBUG_POS(">>> G29", current_position); + log_machine_info(); + } + marlin_debug_flags = old_debug_flags; + #if DISABLED(PROBE_MANUALLY) + if (seenQ) return; + #endif + #endif + + #if ENABLED(PROBE_MANUALLY) + const bool seenA = parser.seen('A'); + #else + constexpr bool seenA = false; + #endif + + const bool no_action = seenA || seenQ, + faux = + #if ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) + parser.boolval('C') + #else + no_action + #endif + ; + + // Don't allow auto-leveling without homing first + if (axis_unhomed_error()) return; + + if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("> Auto-level not needed, skip"); + SERIAL_ECHOLNPGM("<<< G29"); + } + #endif + return; + } + + // Define local vars 'static' for manual probing, 'auto' otherwise + #if ENABLED(PROBE_MANUALLY) + #define ABL_VAR static + #else + #define ABL_VAR + #endif + + ABL_VAR int verbose_level; + ABL_VAR float xProbe, yProbe, measured_z; + ABL_VAR bool dryrun, abl_should_enable; + + #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR int abl_probe_index; + #endif + + #if HAS_SOFTWARE_ENDSTOPS && ENABLED(PROBE_MANUALLY) + ABL_VAR bool enable_soft_endstops = true; + #endif + + #if ABL_GRID + + #if ENABLED(PROBE_MANUALLY) + ABL_VAR uint8_t PR_OUTER_VAR; + ABL_VAR int8_t PR_INNER_VAR; + #endif + + ABL_VAR int left_probe_bed_position, right_probe_bed_position, front_probe_bed_position, back_probe_bed_position; + ABL_VAR float xGridSpacing = 0, yGridSpacing = 0; + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR uint8_t abl_grid_points_x = GRID_MAX_POINTS_X, + abl_grid_points_y = GRID_MAX_POINTS_Y; + ABL_VAR bool do_topography_map; + #else // Bilinear + uint8_t constexpr abl_grid_points_x = GRID_MAX_POINTS_X, + abl_grid_points_y = GRID_MAX_POINTS_Y; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR int abl_points; + #elif ENABLED(PROBE_MANUALLY) // Bilinear + int constexpr abl_points = GRID_MAX_POINTS; + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + ABL_VAR float zoffset; + + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + + ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + + ABL_VAR float eqnAMatrix[GRID_MAX_POINTS * 3], // "A" matrix of the linear system of equations + eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points + mean; + #endif + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + #if ENABLED(PROBE_MANUALLY) + int constexpr abl_points = 3; // used to show total points + #endif + + // Probe at 3 arbitrary points + ABL_VAR vector_3 points[3] = { + vector_3(PROBE_PT_1_X, PROBE_PT_1_Y, 0), + vector_3(PROBE_PT_2_X, PROBE_PT_2_Y, 0), + vector_3(PROBE_PT_3_X, PROBE_PT_3_Y, 0) + }; + + #endif // AUTO_BED_LEVELING_3POINT + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + struct linear_fit_data lsf_results; + incremental_LSF_reset(&lsf_results); + #endif + + /** + * On the initial G29 fetch command parameters. + */ + if (!g29_in_progress) { + + #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) + abl_probe_index = -1; + #endif + + abl_should_enable = planner.leveling_active; + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + const bool seen_w = parser.seen('W'); + if (seen_w) { + if (!leveling_is_valid()) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("No bilinear grid"); + return; + } + + const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position[Z_AXIS]; + if (!WITHIN(rz, -10, 10)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Bad Z value"); + return; + } + + const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), + ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); + int8_t i = parser.byteval('I', -1), + j = parser.byteval('J', -1); + + if (!isnan(rx) && !isnan(ry)) { + // Get nearest i / j from rx / ry + i = (rx - bilinear_start[X_AXIS] + 0.5 * xGridSpacing) / xGridSpacing; + j = (ry - bilinear_start[Y_AXIS] + 0.5 * yGridSpacing) / yGridSpacing; + i = constrain(i, 0, GRID_MAX_POINTS_X - 1); + j = constrain(j, 0, GRID_MAX_POINTS_Y - 1); + } + if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { + set_bed_leveling_enabled(false); + z_values[i][j] = rz; + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif + set_bed_leveling_enabled(abl_should_enable); + if (abl_should_enable) report_current_position(); + } + return; + } // parser.seen('W') + + #else + + constexpr bool seen_w = false; + + #endif + + // Jettison bed leveling data + if (!seen_w && parser.seen('J')) { + reset_bed_level(); + return; + } + + verbose_level = parser.intval('V'); + if (!WITHIN(verbose_level, 0, 4)) { + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); + return; + } + + dryrun = parser.boolval('D') + #if ENABLED(PROBE_MANUALLY) + || no_action + #endif + ; + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + do_topography_map = verbose_level > 2 || parser.boolval('T'); + + // X and Y specify points in each direction, overriding the default + // These values may be saved with the completed mesh + abl_grid_points_x = parser.intval('X', GRID_MAX_POINTS_X); + abl_grid_points_y = parser.intval('Y', GRID_MAX_POINTS_Y); + if (parser.seenval('P')) abl_grid_points_x = abl_grid_points_y = parser.value_int(); + + if (!WITHIN(abl_grid_points_x, 2, GRID_MAX_POINTS_X)) { + SERIAL_PROTOCOLLNPGM("?Probe points (X) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); + return; + } + if (!WITHIN(abl_grid_points_y, 2, GRID_MAX_POINTS_Y)) { + SERIAL_PROTOCOLLNPGM("?Probe points (Y) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); + return; + } + + abl_points = abl_grid_points_x * abl_grid_points_y; + mean = 0; + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + zoffset = parser.linearval('Z'); + + #endif + + #if ABL_GRID + + xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); + + left_probe_bed_position = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : LEFT_PROBE_BED_POSITION; + right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : RIGHT_PROBE_BED_POSITION; + front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : FRONT_PROBE_BED_POSITION; + back_probe_bed_position = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : BACK_PROBE_BED_POSITION; + + if ( + #if IS_SCARA || ENABLED(DELTA) + !position_is_reachable_by_probe(left_probe_bed_position, 0) + || !position_is_reachable_by_probe(right_probe_bed_position, 0) + || !position_is_reachable_by_probe(0, front_probe_bed_position) + || !position_is_reachable_by_probe(0, back_probe_bed_position) + #else + !position_is_reachable_by_probe(left_probe_bed_position, front_probe_bed_position) + || !position_is_reachable_by_probe(right_probe_bed_position, back_probe_bed_position) + #endif + ) { + SERIAL_PROTOCOLLNPGM("? (L,R,F,B) out of bounds."); + return; + } + + // probe at the points of a lattice grid + xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (abl_grid_points_x - 1); + yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (abl_grid_points_y - 1); + + #endif // ABL_GRID + + if (verbose_level > 0) { + SERIAL_PROTOCOLPGM("G29 Auto Bed Leveling"); + if (dryrun) SERIAL_PROTOCOLPGM(" (DRYRUN)"); + SERIAL_EOL(); + } + + planner.synchronize(); + + // Disable auto bed leveling during G29. + // Be formal so G29 can be done successively without G28. + if (!no_action) set_bed_leveling_enabled(false); + + #if HAS_BED_PROBE + // Deploy the probe. Probe will raise if needed. + if (DEPLOY_PROBE()) { + set_bed_leveling_enabled(abl_should_enable); + return; + } + #endif + + if (!faux) setup_for_endstop_or_probe_move(); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + #if ENABLED(PROBE_MANUALLY) + if (!no_action) + #endif + if ( xGridSpacing != bilinear_grid_spacing[X_AXIS] + || yGridSpacing != bilinear_grid_spacing[Y_AXIS] + || left_probe_bed_position != bilinear_start[X_AXIS] + || front_probe_bed_position != bilinear_start[Y_AXIS] + ) { + // Reset grid to 0.0 or "not probed". (Also disables ABL) + reset_bed_level(); + + // Initialize a grid with the given dimensions + bilinear_grid_spacing[X_AXIS] = xGridSpacing; + bilinear_grid_spacing[Y_AXIS] = yGridSpacing; + bilinear_start[X_AXIS] = left_probe_bed_position; + bilinear_start[Y_AXIS] = front_probe_bed_position; + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + #endif // AUTO_BED_LEVELING_BILINEAR + + #if ENABLED(AUTO_BED_LEVELING_3POINT) + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> 3-point Leveling"); + #endif + + // Probe at 3 arbitrary points + points[0].z = points[1].z = points[2].z = 0; + + #endif // AUTO_BED_LEVELING_3POINT + + } // !g29_in_progress + + #if ENABLED(PROBE_MANUALLY) + + // For manual probing, get the next index to probe now. + // On the first probe this will be incremented to 0. + if (!no_action) { + ++abl_probe_index; + g29_in_progress = true; + } + + // Abort current G29 procedure, go back to idle state + if (seenA && g29_in_progress) { + SERIAL_PROTOCOLLNPGM("Manual G29 aborted"); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif + set_bed_leveling_enabled(abl_should_enable); + g29_in_progress = false; + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif + } + + // Query G29 status + if (verbose_level || seenQ) { + SERIAL_PROTOCOLPGM("Manual G29 "); + if (g29_in_progress) { + SERIAL_PROTOCOLPAIR("point ", MIN(abl_probe_index + 1, abl_points)); + SERIAL_PROTOCOLLNPAIR(" of ", abl_points); + } + else + SERIAL_PROTOCOLLNPGM("idle"); + } + + if (no_action) return; + + if (abl_probe_index == 0) { + // For the initial G29 S2 save software endstop state + #if HAS_SOFTWARE_ENDSTOPS + enable_soft_endstops = soft_endstops_enabled; + #endif + // Move close to the bed before the first point + do_blocking_move_to_z(0); + } + else { + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) + const uint16_t index = abl_probe_index - 1; + #endif + + // For G29 after adjusting Z. + // Save the previous Z before going to the next point + measured_z = current_position[Z_AXIS]; + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + mean += measured_z; + eqnBVector[index] = measured_z; + eqnAMatrix[index + 0 * abl_points] = xProbe; + eqnAMatrix[index + 1 * abl_points] = yProbe; + eqnAMatrix[index + 2 * abl_points] = 1; + + incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + points[index].z = measured_z; + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + z_values[xCount][yCount] = measured_z + zoffset; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_PROTOCOLPAIR("Save X", xCount); + SERIAL_PROTOCOLPAIR(" Y", yCount); + SERIAL_PROTOCOLLNPAIR(" Z", measured_z + zoffset); + } + #endif + + #endif + } + + // + // If there's another point to sample, move there with optional lift. + // + + #if ABL_GRID + + // Skip any unreachable points + while (abl_probe_index < abl_points) { + + // Set xCount, yCount based on abl_probe_index, with zig-zag + PR_OUTER_VAR = abl_probe_index / PR_INNER_END; + PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); + + // Probe in reverse order for every other row/column + bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); + + if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; + + const float xBase = xCount * xGridSpacing + left_probe_bed_position, + yBase = yCount * yGridSpacing + front_probe_bed_position; + + xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); + yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + indexIntoAB[xCount][yCount] = abl_probe_index; + #endif + + // Keep looping till a reachable point is found + if (position_is_reachable(xProbe, yProbe)) break; + ++abl_probe_index; + } + + // Is there a next point to move to? + if (abl_probe_index < abl_points) { + _manual_goto_xy(xProbe, yProbe); // Can be used here too! + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif + return; + } + else { + + // Leveling done! Fall through to G29 finishing code below + + SERIAL_PROTOCOLLNPGM("Grid probing done."); + + // Re-enable software endstops, if needed + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif + } + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + // Probe at 3 arbitrary points + if (abl_probe_index < abl_points) { + xProbe = points[abl_probe_index].x; + yProbe = points[abl_probe_index].y; + _manual_goto_xy(xProbe, yProbe); + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif + return; + } + else { + + SERIAL_PROTOCOLLNPGM("3-point probing done."); + + // Re-enable software endstops, if needed + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif + + if (!dryrun) { + vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); + if (planeNormal.z < 0) { + planeNormal.x *= -1; + planeNormal.y *= -1; + planeNormal.z *= -1; + } + planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + } + + #endif // AUTO_BED_LEVELING_3POINT + + #else // !PROBE_MANUALLY + { + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + measured_z = 0; + + #if ABL_GRID + + bool zig = PR_OUTER_END & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION + + measured_z = 0; + + // Outer loop is Y with PROBE_Y_FIRST disabled + for (uint8_t PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + + int8_t inStart, inStop, inInc; + + if (zig) { // away from origin + inStart = 0; + inStop = PR_INNER_END; + inInc = 1; + } + else { // towards origin + inStart = PR_INNER_END - 1; + inStop = -1; + inInc = -1; + } + + zig ^= true; // zag + + // Inner loop is Y with PROBE_Y_FIRST enabled + for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) { + + float xBase = left_probe_bed_position + xGridSpacing * xCount, + yBase = front_probe_bed_position + yGridSpacing * yCount; + + xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); + yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + indexIntoAB[xCount][yCount] = ++abl_probe_index; // 0... + #endif + + #if IS_KINEMATIC + // Avoid probing outside the round or hexagonal area + if (!position_is_reachable_by_probe(xProbe, yProbe)) continue; + #endif + + measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); + + if (isnan(measured_z)) { + set_bed_leveling_enabled(abl_should_enable); + break; + } + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + mean += measured_z; + eqnBVector[abl_probe_index] = measured_z; + eqnAMatrix[abl_probe_index + 0 * abl_points] = xProbe; + eqnAMatrix[abl_probe_index + 1 * abl_points] = yProbe; + eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; + + incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + z_values[xCount][yCount] = measured_z + zoffset; + + #endif + + abl_should_enable = false; + idle(); + + } // inner + } // outer + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + // Probe at 3 arbitrary points + + for (uint8_t i = 0; i < 3; ++i) { + // Retain the last probe position + xProbe = points[i].x; + yProbe = points[i].y; + measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); + if (isnan(measured_z)) { + set_bed_leveling_enabled(abl_should_enable); + break; + } + points[i].z = measured_z; + } + + if (!dryrun && !isnan(measured_z)) { + vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); + if (planeNormal.z < 0) { + planeNormal.x *= -1; + planeNormal.y *= -1; + planeNormal.z *= -1; + } + planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + #endif // AUTO_BED_LEVELING_3POINT + + // Stow the probe. No raise for FIX_MOUNTED_PROBE. + if (STOW_PROBE()) { + set_bed_leveling_enabled(abl_should_enable); + measured_z = NAN; + } + } + #endif // !PROBE_MANUALLY + + // + // G29 Finishing Code + // + // Unless this is a dry run, auto bed leveling will + // definitely be enabled after this point. + // + // If code above wants to continue leveling, it should + // return or loop before this point. + // + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); + #endif + + #if ENABLED(PROBE_MANUALLY) + g29_in_progress = false; + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif + #endif + + // Calculate leveling, print reports, correct the position + if (!isnan(measured_z)) { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (!dryrun) extrapolate_unprobed_bed_level(); + print_bilinear_leveling_grid(); + + refresh_bed_level(); + + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + print_bilinear_leveling_grid_virt(); + #endif + + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + + // For LINEAR leveling calculate matrix, print reports, correct the position + + /** + * solve the plane equation ax + by + d = z + * A is the matrix with rows [x y 1] for all the probed points + * B is the vector of the Z positions + * the normal vector to the plane is formed by the coefficients of the + * plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0 + * so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z + */ + float plane_equation_coefficients[3]; + + finish_incremental_LSF(&lsf_results); + plane_equation_coefficients[0] = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below + plane_equation_coefficients[1] = -lsf_results.B; // but that is not yet tested. + plane_equation_coefficients[2] = -lsf_results.D; + + mean /= abl_points; + + if (verbose_level) { + SERIAL_PROTOCOLPGM("Eqn coefficients: a: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[0], 8); + SERIAL_PROTOCOLPGM(" b: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[1], 8); + SERIAL_PROTOCOLPGM(" d: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[2], 8); + SERIAL_EOL(); + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM("Mean of sampled points: "); + SERIAL_PROTOCOL_F(mean, 8); + SERIAL_EOL(); + } + } + + // Create the matrix but don't correct the position yet + if (!dryrun) + planner.bed_level_matrix = matrix_3x3::create_look_at( + vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1) // We can eliminate the '-' here and up above + ); + + // Show the Topography map if enabled + if (do_topography_map) { + + SERIAL_PROTOCOLLNPGM("\nBed Height Topography:\n" + " +--- BACK --+\n" + " | |\n" + " L | (+) | R\n" + " E | | I\n" + " F | (-) N (+) | G\n" + " T | | H\n" + " | (-) | T\n" + " | |\n" + " O-- FRONT --+\n" + " (0,0)"); + + float min_diff = 999; + + for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { + for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { + int ind = indexIntoAB[xx][yy]; + float diff = eqnBVector[ind] - mean, + x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], + z_tmp = 0; + + apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); + + NOMORE(min_diff, eqnBVector[ind] - z_tmp); + + if (diff >= 0.0) + SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment + else + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + + if (verbose_level > 3) { + SERIAL_PROTOCOLLNPGM("\nCorrected Bed Height vs. Bed Topology:"); + + for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { + for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { + int ind = indexIntoAB[xx][yy]; + float x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], + z_tmp = 0; + + apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); + + float diff = eqnBVector[ind] - z_tmp - min_diff; + if (diff >= 0.0) + SERIAL_PROTOCOLPGM(" +"); + // Include + for column alignment + else + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + } + } //do_topography_map + + #endif // AUTO_BED_LEVELING_LINEAR + + #if ABL_PLANAR + + // For LINEAR and 3POINT leveling correct the current position + + if (verbose_level > 0) + planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:")); + + if (!dryrun) { + // + // Correct the current XYZ position based on the tilted plane. + // + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); + #endif + + float converted[XYZ]; + COPY(converted, current_position); + + planner.leveling_active = true; + planner.unapply_leveling(converted); // use conversion machinery + planner.leveling_active = false; + + // Use the last measured distance to the bed, if possible + if ( NEAR(current_position[X_AXIS], xProbe - (X_PROBE_OFFSET_FROM_EXTRUDER)) + && NEAR(current_position[Y_AXIS], yProbe - (Y_PROBE_OFFSET_FROM_EXTRUDER)) + ) { + const float simple_z = current_position[Z_AXIS] - measured_z; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Z from Probe:", simple_z); + SERIAL_ECHOPAIR(" Matrix:", converted[Z_AXIS]); + SERIAL_ECHOLNPAIR(" Discrepancy:", simple_z - converted[Z_AXIS]); + } + #endif + converted[Z_AXIS] = simple_z; + } + + // The rotated XY and corrected Z are now current_position + COPY(current_position, converted); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); + #endif + } + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (!dryrun) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("G29 uncorrected Z:", current_position[Z_AXIS]); + #endif + + // Unapply the offset because it is going to be immediately applied + // and cause compensation movement in Z + current_position[Z_AXIS] -= bilinear_z_offset(current_position); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR(" corrected Z:", current_position[Z_AXIS]); + #endif + } + + #endif // ABL_PLANAR + + #ifdef Z_PROBE_END_SCRIPT + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + #endif + planner.synchronize(); + enqueue_and_echo_commands_P(PSTR(Z_PROBE_END_SCRIPT)); + #endif + + // Auto Bed Leveling is complete! Enable if possible. + planner.leveling_active = dryrun ? abl_should_enable : true; + } // !isnan(measured_z) + + // Restore state after probing + if (!faux) clean_up_after_endstop_or_probe_move(); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G29"); + #endif + + KEEPALIVE_STATE(IN_HANDLER); + + if (planner.leveling_active) + SYNC_PLAN_POSITION_KINEMATIC(); + + #if HAS_BED_PROBE && defined(Z_AFTER_PROBING) + move_z_after_probing(); + #endif + + report_current_position(); +} + +#endif // OLDSCHOOL_ABL diff --git a/Marlin/src/gcode/bedlevel/abl/M421.cpp b/Marlin/src/gcode/bedlevel/abl/M421.cpp new file mode 100644 index 0000000000..8f3683af8c --- /dev/null +++ b/Marlin/src/gcode/bedlevel/abl/M421.cpp @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * M421.cpp - Auto Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/abl/abl.h" + +/** + * M421: Set a single Mesh Bed Leveling Z coordinate + * + * Usage: + * M421 I J Z + * M421 I J Q + */ +void GcodeSuite::M421() { + int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); + const bool hasI = ix >= 0, + hasJ = iy >= 0, + hasZ = parser.seen('Z'), + hasQ = !hasZ && parser.seen('Q'); + + if (!hasI || !hasJ || !(hasZ || hasQ)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } + else { + z_values[ix][iy] = parser.value_linear_units() + (hasQ ? z_values[ix][iy] : 0); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif + } +} + +#endif // AUTO_BED_LEVELING_BILINEAR diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp new file mode 100644 index 0000000000..8c970e89b0 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -0,0 +1,215 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * G29.cpp - Mesh Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MESH_BED_LEVELING) + +#include "../../../feature/bedlevel/bedlevel.h" + +#include "../../gcode.h" +#include "../../queue.h" + +#include "../../../libs/buzzer.h" +#include "../../../lcd/ultralcd.h" +#include "../../../module/motion.h" +#include "../../../module/stepper.h" + +// Save 130 bytes with non-duplication of PSTR +void echo_not_entered() { SERIAL_PROTOCOLLNPGM(" not entered."); } + +/** + * G29: Mesh-based Z probe, probes a grid and produces a + * mesh to compensate for variable bed height + * + * Parameters With MESH_BED_LEVELING: + * + * S0 Produce a mesh report + * S1 Start probing mesh points + * S2 Probe the next mesh point + * S3 Xn Yn Zn.nn Manually modify a single point + * S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed. + * S5 Reset and disable mesh + * + * The S0 report the points as below + * + * +----> X-axis 1-n + * | + * | + * v Y-axis 1-n + * + */ +void GcodeSuite::G29() { + + static int mbl_probe_index = -1; + #if HAS_SOFTWARE_ENDSTOPS + static bool enable_soft_endstops; + #endif + + MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); + if (!WITHIN(state, 0, 5)) { + SERIAL_PROTOCOLLNPGM("S out of range (0-5)."); + return; + } + + int8_t px, py; + + switch (state) { + case MeshReport: + if (leveling_is_valid()) { + SERIAL_PROTOCOLLNPAIR("State: ", planner.leveling_active ? MSG_ON : MSG_OFF); + mbl.report_mesh(); + } + else + SERIAL_PROTOCOLLNPGM("Mesh bed leveling has no data."); + break; + + case MeshStart: + mbl.reset(); + mbl_probe_index = 0; + if (!lcd_wait_for_move) { + enqueue_and_echo_commands_P(PSTR("G28\nG29 S2")); + return; + } + state = MeshNext; + + case MeshNext: + if (mbl_probe_index < 0) { + SERIAL_PROTOCOLLNPGM("Start mesh probing with \"G29 S1\" first."); + return; + } + // For each G29 S2... + if (mbl_probe_index == 0) { + #if HAS_SOFTWARE_ENDSTOPS + // For the initial G29 S2 save software endstop state + enable_soft_endstops = soft_endstops_enabled; + #endif + // Move close to the bed before the first point + do_blocking_move_to_z(0); + } + else { + // Save Z for the previous mesh position + mbl.set_zigzag_z(mbl_probe_index - 1, current_position[Z_AXIS]); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif + } + // If there's another point to sample, move there with optional lift. + if (mbl_probe_index < GRID_MAX_POINTS) { + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif + + mbl.zigzag(mbl_probe_index++, px, py); + _manual_goto_xy(mbl.index_to_xpos[px], mbl.index_to_ypos[py]); + } + else { + // One last "return to the bed" (as originally coded) at completion + current_position[Z_AXIS] = MANUAL_PROBE_HEIGHT; + line_to_current_position(); + planner.synchronize(); + + // After recording the last point, activate home and activate + mbl_probe_index = -1; + SERIAL_PROTOCOLLNPGM("Mesh probing done."); + BUZZ(100, 659); + BUZZ(100, 698); + + gcode.home_all_axes(); + set_bed_leveling_enabled(true); + + #if ENABLED(MESH_G28_REST_ORIGIN) + current_position[Z_AXIS] = 0; + set_destination_from_current(); + buffer_line_to_destination(homing_feedrate(Z_AXIS)); + planner.synchronize(); + #endif + + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif + } + break; + + case MeshSet: + if (parser.seenval('X')) { + px = parser.value_int() - 1; + if (!WITHIN(px, 0, GRID_MAX_POINTS_X - 1)) { + SERIAL_PROTOCOLLNPGM("X out of range (1-" STRINGIFY(GRID_MAX_POINTS_X) ")."); + return; + } + } + else { + SERIAL_CHAR('X'); echo_not_entered(); + return; + } + + if (parser.seenval('Y')) { + py = parser.value_int() - 1; + if (!WITHIN(py, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_PROTOCOLLNPGM("Y out of range (1-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); + return; + } + } + else { + SERIAL_CHAR('Y'); echo_not_entered(); + return; + } + + if (parser.seenval('Z')) + mbl.z_values[px][py] = parser.value_linear_units(); + else { + SERIAL_CHAR('Z'); echo_not_entered(); + return; + } + break; + + case MeshSetZOffset: + if (parser.seenval('Z')) + mbl.z_offset = parser.value_linear_units(); + else { + SERIAL_CHAR('Z'); echo_not_entered(); + return; + } + break; + + case MeshReset: + reset_bed_level(); + break; + + } // switch(state) + + if (state == MeshNext) { + SERIAL_PROTOCOLPAIR("MBL G29 point ", MIN(mbl_probe_index, GRID_MAX_POINTS)); + SERIAL_PROTOCOLLNPAIR(" of ", int(GRID_MAX_POINTS)); + } + + report_current_position(); +} + +#endif // MESH_BED_LEVELING diff --git a/Marlin/src/gcode/bedlevel/mbl/M421.cpp b/Marlin/src/gcode/bedlevel/mbl/M421.cpp new file mode 100644 index 0000000000..3e0cd7f016 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/mbl/M421.cpp @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * M421.cpp - Mesh Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MESH_BED_LEVELING) + +#include "../../gcode.h" +#include "../../../module/motion.h" +#include "../../../feature/bedlevel/mbl/mesh_bed_leveling.h" + +/** + * M421: Set a single Mesh Bed Leveling Z coordinate + * + * Usage: + * M421 X Y Z + * M421 X Y Q + * M421 I J Z + * M421 I J Q + */ +void GcodeSuite::M421() { + const bool hasX = parser.seen('X'), hasI = parser.seen('I'); + const int8_t ix = hasI ? parser.value_int() : hasX ? mbl.probe_index_x(RAW_X_POSITION(parser.value_linear_units())) : -1; + const bool hasY = parser.seen('Y'), hasJ = parser.seen('J'); + const int8_t iy = hasJ ? parser.value_int() : hasY ? mbl.probe_index_y(RAW_Y_POSITION(parser.value_linear_units())) : -1; + const bool hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); + + if (int(hasI && hasJ) + int(hasX && hasY) != 1 || !(hasZ || hasQ)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (ix < 0 || iy < 0) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } + else + mbl.set_z(ix, iy, parser.value_linear_units() + (hasQ ? mbl.z_values[ix][iy] : 0)); +} + +#endif // MESH_BED_LEVELING diff --git a/Marlin/src/gcode/bedlevel/ubl/G29.cpp b/Marlin/src/gcode/bedlevel/ubl/G29.cpp new file mode 100644 index 0000000000..1dbf2dfe41 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/G29.cpp @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * G29.cpp - Unified Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/ubl/ubl.h" + +void GcodeSuite::G29() { ubl.G29(); } + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp new file mode 100644 index 0000000000..e8597eee22 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -0,0 +1,71 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * unified.cpp - Unified Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +/** + * M421: Set a single Mesh Bed Leveling Z coordinate + * + * Usage: + * M421 I J Z + * M421 I J Q + * M421 I J N + * M421 C Z + * M421 C Q + */ +void GcodeSuite::M421() { + int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); + const bool hasI = ix >= 0, + hasJ = iy >= 0, + hasC = parser.seen('C'), + hasN = parser.seen('N'), + hasZ = parser.seen('Z'), + hasQ = !hasZ && parser.seen('Q'); + + if (hasC) { + const mesh_index_pair location = ubl.find_closest_mesh_point_of_type(REAL, current_position[X_AXIS], current_position[Y_AXIS], USE_NOZZLE_AS_REFERENCE, NULL); + ix = location.x_index; + iy = location.y_index; + } + + if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } + else + ubl.z_values[ix][iy] = hasN ? NAN : parser.value_linear_units() + (hasQ ? ubl.z_values[ix][iy] : 0); +} + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M49.cpp b/Marlin/src/gcode/bedlevel/ubl/M49.cpp new file mode 100644 index 0000000000..b83ffad61b --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/M49.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * M49.cpp - Toggle the G26 debug flag + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(G26_MESH_VALIDATION) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +void GcodeSuite::M49() { + g26_debug_flag ^= true; + SERIAL_PROTOCOLPGM("G26 Debug: "); + serialprintPGM(g26_debug_flag ? PSTR("On\n") : PSTR("Off\n")); +} + +#endif // G26_MESH_VALIDATION diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp new file mode 100644 index 0000000000..7a0f835939 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -0,0 +1,381 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#include "../gcode.h" + +#include "../../module/stepper.h" +#include "../../module/endstops.h" + +#if HOTENDS > 1 + #include "../../module/tool_change.h" +#endif + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(SENSORLESS_HOMING) + #include "../../feature/tmc_util.h" +#endif + +#if HOMING_Z_WITH_PROBE || ENABLED(BLTOUCH) + #include "../../module/probe.h" +#endif + +#include "../../lcd/ultralcd.h" + +#if ENABLED(QUICK_HOME) + + static void quick_home_xy() { + + // Pretend the current position is 0,0 + current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; + sync_plan_position(); + + const int x_axis_home_dir = + #if ENABLED(DUAL_X_CARRIAGE) + x_home_dir(active_extruder) + #else + home_dir(X_AXIS) + #endif + ; + + const float mlx = max_length(X_AXIS), + mly = max_length(Y_AXIS), + mlratio = mlx > mly ? mly / mlx : mlx / mly, + fr_mm_s = MIN(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * SQRT(sq(mlratio) + 1.0); + + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(X_AXIS); + sensorless_homing_per_axis(Y_AXIS); + #endif + + do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); + endstops.hit_on_purpose(); // clear endstop hit flags + current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; + + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(X_AXIS, false); + sensorless_homing_per_axis(Y_AXIS, false); + #endif + } + +#endif // QUICK_HOME + +#if ENABLED(Z_SAFE_HOMING) + + inline void home_z_safely() { + + // Disallow Z homing if X or Y are unknown + if (!TEST(axis_known_position, X_AXIS) || !TEST(axis_known_position, Y_AXIS)) { + LCD_MESSAGEPGM(MSG_ERR_Z_HOMING); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_Z_HOMING); + return; + } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Z_SAFE_HOMING >>>"); + #endif + + SYNC_PLAN_POSITION_KINEMATIC(); + + /** + * Move the Z probe (or just the nozzle) to the safe homing point + */ + destination[X_AXIS] = Z_SAFE_HOMING_X_POINT; + destination[Y_AXIS] = Z_SAFE_HOMING_Y_POINT; + destination[Z_AXIS] = current_position[Z_AXIS]; // Z is already at the right height + + #if HOMING_Z_WITH_PROBE + destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; + destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; + #endif + + if (position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Z_SAFE_HOMING", destination); + #endif + + // This causes the carriage on Dual X to unpark + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder_parked = false; + #endif + + #if ENABLED(SENSORLESS_HOMING) + safe_delay(500); // Short delay needed to settle + #endif + + do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]); + HOMEAXIS(Z); + } + else { + LCD_MESSAGEPGM(MSG_ZPROBE_OUT); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT); + } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< Z_SAFE_HOMING"); + #endif + } + +#endif // Z_SAFE_HOMING + +/** + * G28: Home all axes according to settings + * + * Parameters + * + * None Home to all axes with no parameters. + * With QUICK_HOME enabled XY will home together, then Z. + * + * O Home only if position is unknown + * + * Rn Raise by n mm/inches before homing + * + * Cartesian/SCARA parameters + * + * X Home to the X endstop + * Y Home to the Y endstop + * Z Home to the Z endstop + * + */ +void GcodeSuite::G28(const bool always_home_all) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM(">>> G28"); + log_machine_info(); + } + #endif + + if (all_axes_known() && parser.boolval('O')) { // home only if needed + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("> homing not needed, skip"); + SERIAL_ECHOLNPGM("<<< G28"); + } + #endif + return; + } + + // Wait for planner moves to finish! + planner.synchronize(); + + // Cancel the active G29 session + #if ENABLED(PROBE_MANUALLY) + g29_in_progress = false; + #endif + + // Disable the leveling matrix before homing + #if HAS_LEVELING + #if ENABLED(RESTORE_LEVELING_AFTER_G28) + const bool leveling_was_active = planner.leveling_active; + #endif + set_bed_leveling_enabled(false); + #endif + + #if ENABLED(CNC_WORKSPACE_PLANES) + workspace_plane = PLANE_XY; + #endif + + #if ENABLED(BLTOUCH) + set_bltouch_deployed(false); + #endif + + // Always home with tool 0 active + #if HOTENDS > 1 + #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) + const uint8_t old_tool_index = active_extruder; + #endif + tool_change(0, 0, true); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + extruder_duplication_enabled = false; + #endif + + setup_for_endstop_or_probe_move(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> endstops.enable(true)"); + #endif + endstops.enable(true); // Enable endstops for next homing move + + #if ENABLED(DELTA) + + home_delta(); + UNUSED(always_home_all); + + #else // NOT DELTA + + const bool homeX = always_home_all || parser.seen('X'), + homeY = always_home_all || parser.seen('Y'), + homeZ = always_home_all || parser.seen('Z'), + home_all = (!homeX && !homeY && !homeZ) || (homeX && homeY && homeZ); + + set_destination_from_current(); + + #if Z_HOME_DIR > 0 // If homing away from BED do Z first + + if (home_all || homeZ) HOMEAXIS(Z); + + #endif + + const float z_homing_height = ( + #if ENABLED(UNKNOWN_Z_NO_RAISE) + !TEST(axis_known_position, Z_AXIS) ? 0 : + #endif + (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) + ); + + if (z_homing_height && (home_all || homeX || homeY)) { + // Raise Z before homing any other axes and z is not already high enough (never lower z) + destination[Z_AXIS] = z_homing_height; + if (destination[Z_AXIS] > current_position[Z_AXIS]) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) + SERIAL_ECHOLNPAIR("Raise Z (before homing) to ", destination[Z_AXIS]); + #endif + + do_blocking_move_to_z(destination[Z_AXIS]); + } + } + + #if ENABLED(QUICK_HOME) + + if (home_all || (homeX && homeY)) quick_home_xy(); + + #endif + + // Home Y (before X) + #if ENABLED(HOME_Y_BEFORE_X) + + if (home_all || homeY + #if ENABLED(CODEPENDENT_XY_HOMING) + || homeX + #endif + ) HOMEAXIS(Y); + + #endif + + // Home X + if (home_all || homeX + #if ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X) + || homeY + #endif + ) { + + #if ENABLED(DUAL_X_CARRIAGE) + + // Always home the 2nd (right) extruder first + active_extruder = 1; + HOMEAXIS(X); + + // Remember this extruder's position for later tool change + inactive_extruder_x_pos = current_position[X_AXIS]; + + // Home the 1st (left) extruder + active_extruder = 0; + HOMEAXIS(X); + + // Consider the active extruder to be parked + COPY(raised_parked_position, current_position); + delayed_move_time = 0; + active_extruder_parked = true; + + #else + + HOMEAXIS(X); + + #endif + } + + // Home Y (after X) + #if DISABLED(HOME_Y_BEFORE_X) + if (home_all || homeY) HOMEAXIS(Y); + #endif + + // Home Z last if homing towards the bed + #if Z_HOME_DIR < 0 + if (home_all || homeZ) { + #if ENABLED(Z_SAFE_HOMING) + home_z_safely(); + #else + HOMEAXIS(Z); + #endif + + #if HOMING_Z_WITH_PROBE && defined(Z_AFTER_PROBING) + move_z_after_probing(); + #endif + + } // home_all || homeZ + #endif // Z_HOME_DIR < 0 + + SYNC_PLAN_POSITION_KINEMATIC(); + + #endif // !DELTA (G28) + + endstops.not_homing(); + + #if ENABLED(DELTA) && ENABLED(DELTA_HOME_TO_SAFE_ZONE) + // move to a height where we can use the full xy-area + do_blocking_move_to_z(delta_clip_start_height); + #endif + + #if ENABLED(RESTORE_LEVELING_AFTER_G28) + set_bed_leveling_enabled(leveling_was_active); + #endif + + clean_up_after_endstop_or_probe_move(); + + // Restore the active tool after homing + #if HOTENDS > 1 && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) + #if ENABLED(PARKING_EXTRUDER) + #define NO_FETCH false // fetch the previous toolhead + #else + #define NO_FETCH true + #endif + tool_change(old_tool_index, 0, NO_FETCH); + #endif + + lcd_refresh(); + + report_current_position(); + #if ENABLED(NANODLP_Z_SYNC) + #if ENABLED(NANODLP_ALL_AXIS) + #define _HOME_SYNC true // For any axis, output sync text. + #else + #define _HOME_SYNC (home_all || homeZ) // Only for Z-axis + #endif + if (_HOME_SYNC) + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G28"); + #endif +} diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp new file mode 100644 index 0000000000..78b48790f9 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -0,0 +1,734 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DELTA_AUTO_CALIBRATION) + +#include "../gcode.h" +#include "../../module/delta.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/endstops.h" +#include "../../lcd/ultralcd.h" + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#if HOTENDS > 1 + #include "../../module/tool_change.h" +#endif + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +constexpr uint8_t _7P_STEP = 1, // 7-point step - to change number of calibration points + _4P_STEP = _7P_STEP * 2, // 4-point step + NPP = _7P_STEP * 6; // number of calibration points on the radius +enum CalEnum : char { // the 7 main calibration points - add definitions if needed + CEN = 0, + __A = 1, + _AB = __A + _7P_STEP, + __B = _AB + _7P_STEP, + _BC = __B + _7P_STEP, + __C = _BC + _7P_STEP, + _CA = __C + _7P_STEP, +}; + +#define LOOP_CAL_PT(VAR, S, N) for (uint8_t VAR=S; VAR<=NPP; VAR+=N) +#define F_LOOP_CAL_PT(VAR, S, N) for (float VAR=S; VARCEN+0.9999; VAR-=N) +#define LOOP_CAL_ALL(VAR) LOOP_CAL_PT(VAR, CEN, 1) +#define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) +#define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) + +#if HOTENDS > 1 + const uint8_t old_tool_index = active_extruder; + #define AC_CLEANUP() ac_cleanup(old_tool_index) +#else + #define AC_CLEANUP() ac_cleanup() +#endif + +float lcd_probe_pt(const float &rx, const float &ry); + +bool ac_home() { + endstops.enable(true); + if (!home_delta()) + return false; + endstops.not_homing(); + return true; +} + +void ac_setup(const bool reset_bed) { + #if HOTENDS > 1 + tool_change(0, 0, true); + #endif + + planner.synchronize(); + setup_for_endstop_or_probe_move(); + + #if HAS_LEVELING + if (reset_bed) reset_bed_level(); // After full calibration bed-level data is no longer valid + #endif +} + +void ac_cleanup( + #if HOTENDS > 1 + const uint8_t old_tool_index + #endif +) { + #if ENABLED(DELTA_HOME_TO_SAFE_ZONE) + do_blocking_move_to_z(delta_clip_start_height); + #endif + #if HAS_BED_PROBE + STOW_PROBE(); + #endif + clean_up_after_endstop_or_probe_move(); + #if HOTENDS > 1 + tool_change(old_tool_index, 0, true); + #endif +} + +void print_signed_float(const char * const prefix, const float &f) { + SERIAL_PROTOCOLPGM(" "); + serialprintPGM(prefix); + SERIAL_PROTOCOLCHAR(':'); + if (f >= 0) SERIAL_CHAR('+'); + SERIAL_PROTOCOL_F(f, 2); +} + +/** + * - Print the delta settings + */ +static void print_calibration_settings(const bool end_stops, const bool tower_angles) { + SERIAL_PROTOCOLPAIR(".Height:", delta_height); + if (end_stops) { + print_signed_float(PSTR("Ex"), delta_endstop_adj[A_AXIS]); + print_signed_float(PSTR("Ey"), delta_endstop_adj[B_AXIS]); + print_signed_float(PSTR("Ez"), delta_endstop_adj[C_AXIS]); + } + if (end_stops && tower_angles) { + SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); + SERIAL_EOL(); + SERIAL_CHAR('.'); + SERIAL_PROTOCOL_SP(13); + } + if (tower_angles) { + print_signed_float(PSTR("Tx"), delta_tower_angle_trim[A_AXIS]); + print_signed_float(PSTR("Ty"), delta_tower_angle_trim[B_AXIS]); + print_signed_float(PSTR("Tz"), delta_tower_angle_trim[C_AXIS]); + } + if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR + SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); + } + #if HAS_BED_PROBE + if (!end_stops && !tower_angles) { + SERIAL_PROTOCOL_SP(30); + print_signed_float(PSTR("Offset"), zprobe_zoffset); + } + #endif + SERIAL_EOL(); +} + +/** + * - Print the probe results + */ +static void print_calibration_results(const float z_pt[NPP + 1], const bool tower_points, const bool opposite_points) { + SERIAL_PROTOCOLPGM(". "); + print_signed_float(PSTR("c"), z_pt[CEN]); + if (tower_points) { + print_signed_float(PSTR(" x"), z_pt[__A]); + print_signed_float(PSTR(" y"), z_pt[__B]); + print_signed_float(PSTR(" z"), z_pt[__C]); + } + if (tower_points && opposite_points) { + SERIAL_EOL(); + SERIAL_CHAR('.'); + SERIAL_PROTOCOL_SP(13); + } + if (opposite_points) { + print_signed_float(PSTR("yz"), z_pt[_BC]); + print_signed_float(PSTR("zx"), z_pt[_CA]); + print_signed_float(PSTR("xy"), z_pt[_AB]); + } + SERIAL_EOL(); +} + +/** + * - Calculate the standard deviation from the zero plane + */ +static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool _1p_cal, const bool _4p_cal, const bool _4p_opp) { + if (!_0p_cal) { + float S2 = sq(z_pt[CEN]); + int16_t N = 1; + if (!_1p_cal) { // std dev from zero plane + LOOP_CAL_ACT(rad, _4p_cal, _4p_opp) { + S2 += sq(z_pt[rad]); + N++; + } + return round(SQRT(S2 / N) * 1000.0) / 1000.0 + 0.00001; + } + } + return 0.00001; +} + +/** + * - Probe a point + */ +static float calibration_probe(const float &nx, const float &ny, const bool stow, const bool set_up) { + #if HAS_BED_PROBE + return probe_pt(nx, ny, set_up ? PROBE_PT_BIG_RAISE : stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); + #else + UNUSED(stow); + UNUSED(set_up); + return lcd_probe_pt(nx, ny); + #endif +} + +#if HAS_BED_PROBE + static float probe_z_shift(const float center) { + STOW_PROBE(); + endstops.enable_z_probe(false); + float z_shift = lcd_probe_pt(0, 0) - center; + endstops.enable_z_probe(true); + return z_shift; + } +#endif + +/** + * - Probe a grid + */ +static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool set_up) { + const bool _0p_calibration = probe_points == 0, + _1p_calibration = probe_points == 1 || probe_points == -1, + _4p_calibration = probe_points == 2, + _4p_opposite_points = _4p_calibration && !towers_set, + _7p_calibration = probe_points >= 3, + _7p_no_intermediates = probe_points == 3, + _7p_1_intermediates = probe_points == 4, + _7p_2_intermediates = probe_points == 5, + _7p_4_intermediates = probe_points == 6, + _7p_6_intermediates = probe_points == 7, + _7p_8_intermediates = probe_points == 8, + _7p_11_intermediates = probe_points == 9, + _7p_14_intermediates = probe_points == 10, + _7p_intermed_points = probe_points >= 4, + _7p_6_center = probe_points >= 5 && probe_points <= 7, + _7p_9_center = probe_points >= 8; + + LOOP_CAL_ALL(rad) z_pt[rad] = 0.0; + + if (!_0p_calibration) { + + if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center + z_pt[CEN] += calibration_probe(0, 0, stow_after_each, set_up); + if (isnan(z_pt[CEN])) return false; + } + + if (_7p_calibration) { // probe extra center points + const float start = _7p_9_center ? _CA + _7P_STEP / 3.0 : _7p_6_center ? _CA : __C, + steps = _7p_9_center ? _4P_STEP / 3.0 : _7p_6_center ? _7P_STEP : _4P_STEP; + I_LOOP_CAL_PT(rad, start, steps) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = delta_calibration_radius * 0.1; + z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); + if (isnan(z_pt[CEN])) return false; + } + z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); + } + + if (!_1p_calibration) { // probe the radius + const CalEnum start = _4p_opposite_points ? _AB : __A; + const float steps = _7p_14_intermediates ? _7P_STEP / 15.0 : // 15r * 6 + 10c = 100 + _7p_11_intermediates ? _7P_STEP / 12.0 : // 12r * 6 + 9c = 81 + _7p_8_intermediates ? _7P_STEP / 9.0 : // 9r * 6 + 10c = 64 + _7p_6_intermediates ? _7P_STEP / 7.0 : // 7r * 6 + 7c = 49 + _7p_4_intermediates ? _7P_STEP / 5.0 : // 5r * 6 + 6c = 36 + _7p_2_intermediates ? _7P_STEP / 3.0 : // 3r * 6 + 7c = 25 + _7p_1_intermediates ? _7P_STEP / 2.0 : // 2r * 6 + 4c = 16 + _7p_no_intermediates ? _7P_STEP : // 1r * 6 + 3c = 9 + _4P_STEP; // .5r * 6 + 1c = 4 + bool zig_zag = true; + F_LOOP_CAL_PT(rad, start, _7p_9_center ? steps * 3 : steps) { + const int8_t offset = _7p_9_center ? 2 : 0; + for (int8_t circle = 0; circle <= offset; circle++) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), + interpol = fmod(rad, 1); + const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); + if (isnan(z_temp)) return false; + // split probe point to neighbouring calibration points + z_pt[uint8_t(round(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); + z_pt[uint8_t(round(rad - interpol)) % NPP + 1] += z_temp * sq(sin(RADIANS(interpol * 90))); + } + zig_zag = !zig_zag; + } + if (_7p_intermed_points) + LOOP_CAL_RAD(rad) + z_pt[rad] /= _7P_STEP / steps; + + do_blocking_move_to_xy(0.0, 0.0); + } + } + return true; +} + +/** + * kinematics routines and auto tune matrix scaling parameters: + * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for + * - formulae for approximative forward kinematics in the end-stop displacement matrix + * - definition of the matrix scaling parameters + */ +static void reverse_kinematics_probe_points(float z_pt[NPP + 1], float mm_at_pt_axis[NPP + 1][ABC]) { + float pos[XYZ] = { 0.0 }; + + LOOP_CAL_ALL(rad) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = (rad == CEN ? 0.0 : delta_calibration_radius); + pos[X_AXIS] = cos(a) * r; + pos[Y_AXIS] = sin(a) * r; + pos[Z_AXIS] = z_pt[rad]; + inverse_kinematics(pos); + LOOP_XYZ(axis) mm_at_pt_axis[rad][axis] = delta[axis]; + } +} + +static void forward_kinematics_probe_points(float mm_at_pt_axis[NPP + 1][ABC], float z_pt[NPP + 1]) { + const float r_quot = delta_calibration_radius / delta_radius; + + #define ZPP(N,I,A) ((1 / 3.0 + r_quot * (N) / 3.0 ) * mm_at_pt_axis[I][A]) + #define Z00(I, A) ZPP( 0, I, A) + #define Zp1(I, A) ZPP(+1, I, A) + #define Zm1(I, A) ZPP(-1, I, A) + #define Zp2(I, A) ZPP(+2, I, A) + #define Zm2(I, A) ZPP(-2, I, A) + + z_pt[CEN] = Z00(CEN, A_AXIS) + Z00(CEN, B_AXIS) + Z00(CEN, C_AXIS); + z_pt[__A] = Zp2(__A, A_AXIS) + Zm1(__A, B_AXIS) + Zm1(__A, C_AXIS); + z_pt[__B] = Zm1(__B, A_AXIS) + Zp2(__B, B_AXIS) + Zm1(__B, C_AXIS); + z_pt[__C] = Zm1(__C, A_AXIS) + Zm1(__C, B_AXIS) + Zp2(__C, C_AXIS); + z_pt[_BC] = Zm2(_BC, A_AXIS) + Zp1(_BC, B_AXIS) + Zp1(_BC, C_AXIS); + z_pt[_CA] = Zp1(_CA, A_AXIS) + Zm2(_CA, B_AXIS) + Zp1(_CA, C_AXIS); + z_pt[_AB] = Zp1(_AB, A_AXIS) + Zp1(_AB, B_AXIS) + Zm2(_AB, C_AXIS); +} + +static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], float delta_e[ABC], float delta_r, float delta_t[ABC]) { + const float z_center = z_pt[CEN]; + float diff_mm_at_pt_axis[NPP + 1][ABC], + new_mm_at_pt_axis[NPP + 1][ABC]; + + reverse_kinematics_probe_points(z_pt, diff_mm_at_pt_axis); + + delta_radius += delta_r; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] += delta_t[axis]; + recalc_delta_settings(); + reverse_kinematics_probe_points(z_pt, new_mm_at_pt_axis); + + LOOP_XYZ(axis) LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad][axis] -= new_mm_at_pt_axis[rad][axis] + delta_e[axis]; + forward_kinematics_probe_points(diff_mm_at_pt_axis, z_pt); + + LOOP_CAL_RAD(rad) z_pt[rad] -= z_pt[CEN] - z_center; + z_pt[CEN] = z_center; + + delta_radius -= delta_r; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= delta_t[axis]; + recalc_delta_settings(); +} + +static float auto_tune_h() { + const float r_quot = delta_calibration_radius / delta_radius; + float h_fac = 0.0; + + h_fac = r_quot / (2.0 / 3.0); + h_fac = 1.0 / h_fac; // (2/3)/CR + return h_fac; +} + +static float auto_tune_r() { + const float diff = 0.01; + float r_fac = 0.0, + z_pt[NPP + 1] = { 0.0 }, + delta_e[ABC] = {0.0}, + delta_r = {0.0}, + delta_t[ABC] = {0.0}; + + delta_r = diff; + calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); + r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0; + r_fac = diff / r_fac / 3.0; // 1/(3*delta_Z) + return r_fac; +} + +static float auto_tune_a() { + const float diff = 0.01; + float a_fac = 0.0, + z_pt[NPP + 1] = { 0.0 }, + delta_e[ABC] = {0.0}, + delta_r = {0.0}, + delta_t[ABC] = {0.0}; + + LOOP_XYZ(axis) { + LOOP_XYZ(axis_2) delta_t[axis_2] = 0.0; + delta_t[axis] = diff; + calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); + a_fac += z_pt[uint8_t((axis * _4P_STEP) - _7P_STEP + NPP) % NPP + 1] / 6.0; + a_fac -= z_pt[uint8_t((axis * _4P_STEP) + 1 + _7P_STEP)] / 6.0; + } + a_fac = diff / a_fac / 3.0; // 1/(3*delta_Z) + return a_fac; +} + +/** + * G33 - Delta '1-4-7-point' Auto-Calibration + * Calibrate height, z_offset, endstops, delta radius, and tower angles. + * + * Parameters: + * + * S Setup mode; disables probe protection + * + * Pn Number of probe points: + * P-1 Checks the z_offset with a center probe and paper test. + * P0 Normalizes calibration. + * P1 Calibrates height only with center probe. + * P2 Probe center and towers. Calibrate height, endstops and delta radius. + * P3 Probe all positions: center, towers and opposite towers. Calibrate all. + * P4-P10 Probe all positions at different intermediate locations and average them. + * + * T Don't calibrate tower angle corrections + * + * Cn.nn Calibration precision; when omitted calibrates to maximum precision + * + * Fn Force to run at least n iterations and take the best result + * + * Vn Verbose level: + * V0 Dry-run mode. Report settings and probe results. No calibration. + * V1 Report start and end settings only + * V2 Report settings at each iteration + * V3 Report settings and probe results + * + * E Engage the probe for each point + */ +void GcodeSuite::G33() { + + const bool set_up = + #if HAS_BED_PROBE + parser.seen('S'); + #else + false; + #endif + + const int8_t probe_points = set_up ? 2 : parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); + if (!WITHIN(probe_points, -1, 10)) { + SERIAL_PROTOCOLLNPGM("?(P)oints is implausible (-1 - 10)."); + return; + } + + const bool towers_set = !parser.seen('T'); + + const float calibration_precision = set_up ? Z_CLEARANCE_BETWEEN_PROBES / 5.0 : parser.floatval('C', 0.0); + if (calibration_precision < 0) { + SERIAL_PROTOCOLLNPGM("?(C)alibration precision is implausible (>=0)."); + return; + } + + const int8_t force_iterations = parser.intval('F', 0); + if (!WITHIN(force_iterations, 0, 30)) { + SERIAL_PROTOCOLLNPGM("?(F)orce iteration is implausible (0 - 30)."); + return; + } + + const int8_t verbose_level = parser.byteval('V', 1); + if (!WITHIN(verbose_level, 0, 3)) { + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0 - 3)."); + return; + } + + const bool stow_after_each = parser.seen('E'); + + if (set_up) { + delta_height = 999.99; + delta_radius = DELTA_PRINTABLE_RADIUS; + ZERO(delta_endstop_adj); + ZERO(delta_tower_angle_trim); + recalc_delta_settings(); + } + + const bool _0p_calibration = probe_points == 0, + _1p_calibration = probe_points == 1 || probe_points == -1, + _4p_calibration = probe_points == 2, + _4p_opposite_points = _4p_calibration && !towers_set, + _7p_9_center = probe_points >= 8, + _tower_results = (_4p_calibration && towers_set) || probe_points >= 3, + _opposite_results = (_4p_calibration && !towers_set) || probe_points >= 3, + _endstop_results = probe_points != 1 && probe_points != -1 && probe_points != 0, + _angle_results = probe_points >= 3 && towers_set; + static const char save_message[] PROGMEM = "Save with M500 and/or copy to Configuration.h"; + int8_t iterations = 0; + float test_precision, + zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end + zero_std_dev_min = zero_std_dev, + zero_std_dev_old = zero_std_dev, + h_factor, + r_factor, + a_factor, + e_old[ABC] = { + delta_endstop_adj[A_AXIS], + delta_endstop_adj[B_AXIS], + delta_endstop_adj[C_AXIS] + }, + r_old = delta_radius, + h_old = delta_height, + a_old[ABC] = { + delta_tower_angle_trim[A_AXIS], + delta_tower_angle_trim[B_AXIS], + delta_tower_angle_trim[C_AXIS] + }; + + SERIAL_PROTOCOLLNPGM("G33 Auto Calibrate"); + + if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable + LOOP_CAL_RAD(axis) { + const float a = RADIANS(210 + (360 / NPP) * (axis - 1)), + r = delta_calibration_radius; + if (!position_is_reachable(cos(a) * r, sin(a) * r)) { + SERIAL_PROTOCOLLNPGM("?(M665 B)ed radius is implausible."); + return; + } + } + } + + // Report settings + const char* checkingac = PSTR("Checking... AC"); + serialprintPGM(checkingac); + if (verbose_level == 0) SERIAL_PROTOCOLPGM(" (DRY-RUN)"); + if (set_up) SERIAL_PROTOCOLPGM(" (SET-UP)"); + SERIAL_EOL(); + lcd_setstatusPGM(checkingac); + + print_calibration_settings(_endstop_results, _angle_results); + + ac_setup(!_0p_calibration && !_1p_calibration); + + if (!_0p_calibration) + if (!ac_home()) return; + + do { // start iterations + + float z_at_pt[NPP + 1] = { 0.0 }; + + test_precision = zero_std_dev_old != 999.0 ? (zero_std_dev + zero_std_dev_old) / 2 : zero_std_dev; + iterations++; + + // Probe the points + zero_std_dev_old = zero_std_dev; + if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, set_up)) { + SERIAL_PROTOCOLLNPGM("Correct delta settings with M665 and M666"); + return AC_CLEANUP(); + } + zero_std_dev = std_dev_points(z_at_pt, _0p_calibration, _1p_calibration, _4p_calibration, _4p_opposite_points); + + // Solve matrices + + if ((zero_std_dev < test_precision || iterations <= force_iterations) && zero_std_dev > calibration_precision) { + + #if !HAS_BED_PROBE + test_precision = 0.00; // forced end + #endif + + if (zero_std_dev < zero_std_dev_min) { + // set roll-back point + COPY(e_old, delta_endstop_adj); + r_old = delta_radius; + h_old = delta_height; + COPY(a_old, delta_tower_angle_trim); + } + + float e_delta[ABC] = { 0.0 }, + r_delta = 0.0, + t_delta[ABC] = { 0.0 }; + + /** + * convergence matrices: + * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for + * - definition of the matrix scaling parameters + * - matrices for 4 and 7 point calibration + */ + #define ZP(N,I) ((N) * z_at_pt[I] / 4.0) // 4.0 = divider to normalize to integers + #define Z12(I) ZP(12, I) + #define Z4(I) ZP(4, I) + #define Z2(I) ZP(2, I) + #define Z1(I) ZP(1, I) + #define Z0(I) ZP(0, I) + + // calculate factors + const float cr_old = delta_calibration_radius; + if (_7p_9_center) delta_calibration_radius *= 0.9; + h_factor = auto_tune_h(); + r_factor = auto_tune_r(); + a_factor = auto_tune_a(); + delta_calibration_radius = cr_old; + + switch (probe_points) { + case -1: + #if HAS_BED_PROBE + zprobe_zoffset += probe_z_shift(z_at_pt[CEN]); + #endif + + case 0: + test_precision = 0.00; // forced end + break; + + case 1: + test_precision = 0.00; // forced end + LOOP_XYZ(axis) e_delta[axis] = +Z4(CEN); + break; + + case 2: + if (towers_set) { // see 4 point calibration (towers) matrix + e_delta[A_AXIS] = (+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN); + r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; + } + else { // see 4 point calibration (opposites) matrix + e_delta[A_AXIS] = (-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN); + r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; + } + break; + + default: // see 7 point calibration (towers & opposites) matrix + e_delta[A_AXIS] = (+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN); + r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; + + if (towers_set) { // see 7 point tower angle calibration (towers & opposites) matrix + t_delta[A_AXIS] = (+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor; + t_delta[B_AXIS] = (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor; + t_delta[C_AXIS] = (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor; + } + break; + } + LOOP_XYZ(axis) delta_endstop_adj[axis] += e_delta[axis]; + delta_radius += r_delta; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] += t_delta[axis]; + } + else if (zero_std_dev >= test_precision) { + // roll back + COPY(delta_endstop_adj, e_old); + delta_radius = r_old; + delta_height = h_old; + COPY(delta_tower_angle_trim, a_old); + } + + if (verbose_level != 0) { // !dry run + + // normalise angles to least squares + if (_angle_results) { + float a_sum = 0.0; + LOOP_XYZ(axis) a_sum += delta_tower_angle_trim[axis]; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0; + } + + // adjust delta_height and endstops by the max amount + const float z_temp = MAX3(delta_endstop_adj[A_AXIS], delta_endstop_adj[B_AXIS], delta_endstop_adj[C_AXIS]); + delta_height -= z_temp; + LOOP_XYZ(axis) delta_endstop_adj[axis] -= z_temp; + } + recalc_delta_settings(); + NOMORE(zero_std_dev_min, zero_std_dev); + + // print report + + if (verbose_level == 3) + print_calibration_results(z_at_pt, _tower_results, _opposite_results); + + if (verbose_level != 0) { // !dry run + if ((zero_std_dev >= test_precision && iterations > force_iterations) || zero_std_dev <= calibration_precision) { // end iterations + SERIAL_PROTOCOLPGM("Calibration OK"); + SERIAL_PROTOCOL_SP(32); + #if HAS_BED_PROBE + if (zero_std_dev >= test_precision && !_1p_calibration && !_0p_calibration) + SERIAL_PROTOCOLPGM("rolling back."); + else + #endif + { + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev_min, 3); + } + SERIAL_EOL(); + char mess[21]; + strcpy_P(mess, PSTR("Calibration sd:")); + if (zero_std_dev_min < 1) + sprintf_P(&mess[15], PSTR("0.%03i"), (int)round(zero_std_dev_min * 1000.0)); + else + sprintf_P(&mess[15], PSTR("%03i.x"), (int)round(zero_std_dev_min)); + lcd_setstatus(mess); + print_calibration_settings(_endstop_results, _angle_results); + serialprintPGM(save_message); + SERIAL_EOL(); + } + else { // !end iterations + char mess[15]; + if (iterations < 31) + sprintf_P(mess, PSTR("Iteration : %02i"), (int)iterations); + else + strcpy_P(mess, PSTR("No convergence")); + SERIAL_PROTOCOL(mess); + SERIAL_PROTOCOL_SP(32); + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev, 3); + SERIAL_EOL(); + lcd_setstatus(mess); + if (verbose_level > 1) + print_calibration_settings(_endstop_results, _angle_results); + } + } + else { // dry run + const char *enddryrun = PSTR("End DRY-RUN"); + serialprintPGM(enddryrun); + SERIAL_PROTOCOL_SP(35); + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev, 3); + SERIAL_EOL(); + + char mess[21]; + strcpy_P(mess, enddryrun); + strcpy_P(&mess[11], PSTR(" sd:")); + if (zero_std_dev < 1) + sprintf_P(&mess[15], PSTR("0.%03i"), (int)round(zero_std_dev * 1000.0)); + else + sprintf_P(&mess[15], PSTR("%03i.x"), (int)round(zero_std_dev)); + lcd_setstatus(mess); + } + if (!ac_home()) return; + } + while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); + + AC_CLEANUP(); +} + +#endif // DELTA_AUTO_CALIBRATION diff --git a/Marlin/M100_Free_Mem_Chk.cpp b/Marlin/src/gcode/calibrate/M100.cpp similarity index 84% rename from Marlin/M100_Free_Mem_Chk.cpp rename to Marlin/src/gcode/calibrate/M100.cpp index 9680908dc5..fe6e586897 100644 --- a/Marlin/M100_Free_Mem_Chk.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -20,6 +20,16 @@ * */ +#include "../../inc/MarlinConfig.h" + +#if ENABLED(M100_FREE_MEMORY_WATCHER) + +#include "../gcode.h" +#include "../queue.h" +#include "../../libs/hex_print_routines.h" + +#include "../../Marlin.h" // for idle() + /** * M100 Free Memory Watcher * @@ -45,18 +55,9 @@ * * Initial version by Roxy-3D */ - -#include "MarlinConfig.h" - -#if ENABLED(M100_FREE_MEMORY_WATCHER) - #define M100_FREE_MEMORY_DUMPER // Enable for the `M100 D` Dump sub-command #define M100_FREE_MEMORY_CORRUPTOR // Enable for the `M100 C` Corrupt sub-command -#include "Marlin.h" -#include "parser.h" -#include "hex_print_routines.h" - #define TEST_BYTE ((char) 0xE5) extern char* __brkval; @@ -68,7 +69,6 @@ extern char __bss_end; // #define END_OF_HEAP() (__brkval ? __brkval : &__bss_end) -int check_for_free_memory_corruption(const char * const title); // Location of a variable on its stack frame. Returns a value above // the stack (once the function returns to the caller). @@ -78,8 +78,8 @@ char* top_of_stack() { } // Count the number of test bytes at the specified location. -int16_t count_test_bytes(const char * const ptr) { - for (uint16_t i = 0; i < 32000; i++) +inline int32_t count_test_bytes(const char * const ptr) { + for (uint32_t i = 0; i < 32000; i++) if (((char) ptr[i]) != TEST_BYTE) return i - 1; @@ -100,17 +100,17 @@ int16_t count_test_bytes(const char * const ptr) { * the block. If so, it may indicate memory corruption due to a bad pointer. * Unexpected bytes are flagged in the right column. */ - void dump_free_memory(const char *ptr, const char *sp) { + inline void dump_free_memory(const char *ptr, const char *sp) { // // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). // - ptr = (char *)((uint16_t)ptr & 0xFFF0); // Align to 16-byte boundary - sp = (char *)((uint16_t)sp | 0x000F); // Align sp to the 15th byte (at or above sp) + ptr = (char*)((ptr_int_t)((uint32_t)ptr & 0xFFFFFFF0)); // Align to 16-byte boundary + sp = (char*)((ptr_int_t)((uint32_t)sp | 0x0000000F)); // Align sp to the 15th byte (at or above sp) // Dump command main loop while (ptr < sp) { - print_hex_word((uint16_t)ptr); // Print the address + print_hex_address(ptr); // Print the address SERIAL_CHAR(':'); for (uint8_t i = 0; i < 16; i++) { // and 16 data bytes if (i == 8) SERIAL_CHAR('-'); @@ -136,31 +136,92 @@ int16_t count_test_bytes(const char * const ptr) { } } -void M100_dump_routine(const char * const title, const char *start, const char *end) { - SERIAL_ECHOLN(title); - // - // Round the start and end locations to produce full lines of output - // - start = (char*)((uint16_t) start & 0xFFF0); - end = (char*)((uint16_t) end | 0x000F); - dump_free_memory(start, end); -} + void M100_dump_routine(const char * const title, const char *start, const char *end) { + SERIAL_ECHOLN(title); + // + // Round the start and end locations to produce full lines of output + // + start = (char*)((ptr_int_t)((uint32_t)start & 0xFFFFFFF0)); // Align to 16-byte boundary + end = (char*)((ptr_int_t)((uint32_t)end | 0x0000000F)); // Align sp to the 15th byte (at or above sp) + dump_free_memory(start, end); + } #endif // M100_FREE_MEMORY_DUMPER +inline int check_for_free_memory_corruption(const char * const title) { + SERIAL_ECHO(title); + + char *ptr = END_OF_HEAP(), *sp = top_of_stack(); + int n = sp - ptr; + + SERIAL_ECHOPAIR("\nfmc() n=", n); + SERIAL_ECHOPAIR("\n&__brkval: ", hex_address(&__brkval)); + SERIAL_ECHOPAIR("=", hex_address(__brkval)); + SERIAL_ECHOPAIR("\n__bss_end: ", hex_address(&__bss_end)); + SERIAL_ECHOPAIR(" sp=", hex_address(sp)); + + if (sp < ptr) { + SERIAL_ECHOPGM(" sp < Heap "); + // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board + // safe_delay(5); // this code can be enabled to pause the display as soon as the + // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch + // idle(); // being on pin-63 which is unassigend and available on most controller + // safe_delay(20); // boards. + // while ( !READ(63)) + // idle(); + safe_delay(20); + #if ENABLED(M100_FREE_MEMORY_DUMPER) + M100_dump_routine(" Memory corruption detected with sp 8) { + // SERIAL_ECHOPAIR("Found ", j); + // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(ptr + i)); + i += j; + block_cnt++; + SERIAL_ECHOPAIR(" (", block_cnt); + SERIAL_ECHOPAIR(") found=", j); + SERIAL_ECHOPGM(" "); + } + } + } + SERIAL_ECHOPAIR(" block_found=", block_cnt); + + if (block_cnt != 1 || __brkval != NULL) + SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); + + if (block_cnt == 0) // Make sure the special case of no free blocks shows up as an + block_cnt = -1; // error to the calling code! + + SERIAL_ECHOPGM(" return="); + if (block_cnt == 1) { + SERIAL_CHAR('0'); // if the block_cnt is 1, nothing has broken up the free memory + SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. + return 0; + } + SERIAL_ECHOLNPGM("true"); + return block_cnt; +} + /** * M100 F * Return the number of free bytes in the memory pool, * with other vital statistics defining the pool. */ -void free_memory_pool_report(char * const ptr, const int16_t size) { - int16_t max_cnt = -1, block_cnt = 0; +inline void free_memory_pool_report(char * const ptr, const int32_t size) { + int32_t max_cnt = -1, block_cnt = 0; char *max_addr = NULL; // Find the longest block of test bytes in the buffer - for (int16_t i = 0; i < size; i++) { + for (int32_t i = 0; i < size; i++) { char *addr = ptr + i; if (*addr == TEST_BYTE) { - const int16_t j = count_test_bytes(addr); + const int32_t j = count_test_bytes(addr); if (j > 8) { SERIAL_ECHOPAIR("Found ", j); SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(addr)); @@ -187,13 +248,13 @@ void free_memory_pool_report(char * const ptr, const int16_t size) { * Corrupt locations in the free memory pool and report the corrupt addresses. * This is useful to check the correctness of the M100 D and the M100 F commands. */ - void corrupt_free_memory(char *ptr, const uint16_t size) { + inline void corrupt_free_memory(char *ptr, const uint32_t size) { ptr += 8; - const uint16_t near_top = top_of_stack() - ptr - 250, // -250 to avoid interrupt activity that's altered the stack. + const uint32_t near_top = top_of_stack() - ptr - 250, // -250 to avoid interrupt activity that's altered the stack. j = near_top / (size + 1); SERIAL_ECHOLNPGM("Corrupting free memory block.\n"); - for (uint16_t i = 1; i <= size; i++) { + for (uint32_t i = 1; i <= size; i++) { char * const addr = ptr + i * j; *addr = i; SERIAL_ECHOPAIR("\nCorrupting address: ", hex_address(addr)); @@ -206,7 +267,7 @@ void free_memory_pool_report(char * const ptr, const int16_t size) { * M100 I * Init memory for the M100 tests. (Automatically applied on the first M100.) */ -void init_free_memory(char *ptr, int16_t size) { +inline void init_free_memory(char *ptr, int32_t size) { SERIAL_ECHOLNPGM("Initializing free memory block.\n\n"); size -= 250; // -250 to avoid interrupt activity that's altered the stack. @@ -222,7 +283,7 @@ void init_free_memory(char *ptr, int16_t size) { SERIAL_ECHO(size); SERIAL_ECHOLNPGM(" bytes of memory initialized.\n"); - for (int16_t i = 0; i < size; i++) { + for (int32_t i = 0; i < size; i++) { if (ptr[i] != TEST_BYTE) { SERIAL_ECHOPAIR("? address : ", hex_address(ptr + i)); SERIAL_ECHOLNPAIR("=", hex_byte(ptr[i])); @@ -234,7 +295,7 @@ void init_free_memory(char *ptr, int16_t size) { /** * M100: Free Memory Check */ -void gcode_M100() { +void GcodeSuite::M100() { SERIAL_ECHOPAIR("\n__brkval : ", hex_address(__brkval)); SERIAL_ECHOPAIR("\n__bss_end : ", hex_address(&__bss_end)); @@ -266,67 +327,4 @@ void gcode_M100() { #endif } -int check_for_free_memory_corruption(const char * const title) { - SERIAL_ECHO(title); - - char *ptr = END_OF_HEAP(), *sp = top_of_stack(); - int n = sp - ptr; - - SERIAL_ECHOPAIR("\nfmc() n=", n); - SERIAL_ECHOPAIR("\n&__brkval: ", hex_address(&__brkval)); - SERIAL_ECHOPAIR("=", hex_address(__brkval)); - SERIAL_ECHOPAIR("\n__bss_end: ", hex_address(&__bss_end)); - SERIAL_ECHOPAIR(" sp=", hex_address(sp)); - - if (sp < ptr) { - SERIAL_ECHOPGM(" sp < Heap "); - // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board - // safe_delay(5); // this code can be enabled to pause the display as soon as the - // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch - // idle(); // being on pin-63 which is unassigend and available on most controller - // safe_delay(20); // boards. - // while ( !READ(63)) - // idle(); - safe_delay(20); - #ifdef M100_FREE_MEMORY_DUMPER - M100_dump_routine(" Memory corruption detected with sp 8) { - // SERIAL_ECHOPAIR("Found ", j); - // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(ptr + i)); - i += j; - block_cnt++; - SERIAL_ECHOPAIR(" (", block_cnt); - SERIAL_ECHOPAIR(") found=", j); - SERIAL_ECHOPGM(" "); - } - } - } - SERIAL_ECHOPAIR(" block_found=", block_cnt); - - if (block_cnt != 1 || __brkval != 0x0000) - SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); - - if (block_cnt == 0) // Make sure the special case of no free blocks shows up as an - block_cnt = -1; // error to the calling code! - - SERIAL_ECHOPGM(" return="); - if (block_cnt == 1) { - SERIAL_CHAR('0'); // if the block_cnt is 1, nothing has broken up the free memory - SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. - return 0; - } - SERIAL_ECHOLNPGM("true"); - return block_cnt; -} - #endif // M100_FREE_MEMORY_WATCHER - - diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp new file mode 100644 index 0000000000..3b5a18bbdd --- /dev/null +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -0,0 +1,277 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" + + +#include "../../feature/bedlevel/bedlevel.h" + + +#if HAS_LEVELING + #include "../../module/planner.h" +#endif + +/** + * M48: Z probe repeatability measurement function. + * + * Usage: + * M48 + * P = Number of sampled points (4-50, default 10) + * X = Sample X position + * Y = Sample Y position + * V = Verbose level (0-4, default=1) + * E = Engage Z probe for each reading + * L = Number of legs of movement before probe + * S = Schizoid (Or Star if you prefer) + * + * This function requires the machine to be homed before invocation. + */ +void GcodeSuite::M48() { + + if (axis_unhomed_error()) return; + + const int8_t verbose_level = parser.byteval('V', 1); + if (!WITHIN(verbose_level, 0, 4)) { + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); + return; + } + + if (verbose_level > 0) + SERIAL_PROTOCOLLNPGM("M48 Z-Probe Repeatability Test"); + + const int8_t n_samples = parser.byteval('P', 10); + if (!WITHIN(n_samples, 4, 50)) { + SERIAL_PROTOCOLLNPGM("?Sample size not plausible (4-50)."); + return; + } + + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + float X_current = current_position[X_AXIS], + Y_current = current_position[Y_AXIS]; + + const float X_probe_location = parser.linearval('X', X_current + X_PROBE_OFFSET_FROM_EXTRUDER), + Y_probe_location = parser.linearval('Y', Y_current + Y_PROBE_OFFSET_FROM_EXTRUDER); + + if (!position_is_reachable_by_probe(X_probe_location, Y_probe_location)) { + SERIAL_PROTOCOLLNPGM("? (X,Y) out of bounds."); + return; + } + + bool seen_L = parser.seen('L'); + uint8_t n_legs = seen_L ? parser.value_byte() : 0; + if (n_legs > 15) { + SERIAL_PROTOCOLLNPGM("?Number of legs in movement not plausible (0-15)."); + return; + } + if (n_legs == 1) n_legs = 2; + + const bool schizoid_flag = parser.boolval('S'); + if (schizoid_flag && !seen_L) n_legs = 7; + + /** + * Now get everything to the specified probe point So we can safely do a + * probe to get us close to the bed. If the Z-Axis is far from the bed, + * we don't want to use that as a starting point for each probe. + */ + if (verbose_level > 2) + SERIAL_PROTOCOLLNPGM("Positioning the probe..."); + + // Disable bed level correction in M48 because we want the raw data when we probe + + #if HAS_LEVELING + const bool was_enabled = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif + + setup_for_endstop_or_probe_move(); + + double mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; + + // Move to the first point, deploy, and probe + const float t = probe_pt(X_probe_location, Y_probe_location, raise_after, verbose_level); + bool probing_good = !isnan(t); + + if (probing_good) { + randomSeed(millis()); + + for (uint8_t n = 0; n < n_samples; n++) { + if (n_legs) { + const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise + float angle = random(0, 360); + const float radius = random( + #if ENABLED(DELTA) + (int) (0.1250000000 * (DELTA_PRINTABLE_RADIUS)), + (int) (0.3333333333 * (DELTA_PRINTABLE_RADIUS)) + #else + (int) 5.0, (int) (0.125 * MIN(X_BED_SIZE, Y_BED_SIZE)) + #endif + ); + + if (verbose_level > 3) { + SERIAL_ECHOPAIR("Starting radius: ", radius); + SERIAL_ECHOPAIR(" angle: ", angle); + SERIAL_ECHOPGM(" Direction: "); + if (dir > 0) SERIAL_ECHOPGM("Counter-"); + SERIAL_ECHOLNPGM("Clockwise"); + } + + for (uint8_t l = 0; l < n_legs - 1; l++) { + double delta_angle; + + if (schizoid_flag) + // The points of a 5 point star are 72 degrees apart. We need to + // skip a point and go to the next one on the star. + delta_angle = dir * 2.0 * 72.0; + + else + // If we do this line, we are just trying to move further + // around the circle. + delta_angle = dir * (float) random(25, 45); + + angle += delta_angle; + + while (angle > 360.0) // We probably do not need to keep the angle between 0 and 2*PI, but the + angle -= 360.0; // Arduino documentation says the trig functions should not be given values + while (angle < 0.0) // outside of this range. It looks like they behave correctly with + angle += 360.0; // numbers outside of the range, but just to be safe we clamp them. + + X_current = X_probe_location - (X_PROBE_OFFSET_FROM_EXTRUDER) + cos(RADIANS(angle)) * radius; + Y_current = Y_probe_location - (Y_PROBE_OFFSET_FROM_EXTRUDER) + sin(RADIANS(angle)) * radius; + + #if DISABLED(DELTA) + X_current = constrain(X_current, X_MIN_POS, X_MAX_POS); + Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS); + #else + // If we have gone out too far, we can do a simple fix and scale the numbers + // back in closer to the origin. + while (!position_is_reachable_by_probe(X_current, Y_current)) { + X_current *= 0.8; + Y_current *= 0.8; + if (verbose_level > 3) { + SERIAL_ECHOPAIR("Pulling point towards center:", X_current); + SERIAL_ECHOLNPAIR(", ", Y_current); + } + } + #endif + if (verbose_level > 3) { + SERIAL_PROTOCOLPGM("Going to:"); + SERIAL_ECHOPAIR(" X", X_current); + SERIAL_ECHOPAIR(" Y", Y_current); + SERIAL_ECHOLNPAIR(" Z", current_position[Z_AXIS]); + } + do_blocking_move_to_xy(X_current, Y_current); + } // n_legs loop + } // n_legs + + // Probe a single point + sample_set[n] = probe_pt(X_probe_location, Y_probe_location, raise_after, 0); + + // Break the loop if the probe fails + probing_good = !isnan(sample_set[n]); + if (!probing_good) break; + + /** + * Get the current mean for the data points we have so far + */ + double sum = 0.0; + for (uint8_t j = 0; j <= n; j++) sum += sample_set[j]; + mean = sum / (n + 1); + + NOMORE(min, sample_set[n]); + NOLESS(max, sample_set[n]); + + /** + * Now, use that mean to calculate the standard deviation for the + * data points we have so far + */ + sum = 0.0; + for (uint8_t j = 0; j <= n; j++) + sum += sq(sample_set[j] - mean); + + sigma = SQRT(sum / (n + 1)); + if (verbose_level > 0) { + if (verbose_level > 1) { + SERIAL_PROTOCOL(n + 1); + SERIAL_PROTOCOLPGM(" of "); + SERIAL_PROTOCOL((int)n_samples); + SERIAL_PROTOCOLPGM(": z: "); + SERIAL_PROTOCOL_F(sample_set[n], 3); + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM(" mean: "); + SERIAL_PROTOCOL_F(mean, 4); + SERIAL_PROTOCOLPGM(" sigma: "); + SERIAL_PROTOCOL_F(sigma, 6); + SERIAL_PROTOCOLPGM(" min: "); + SERIAL_PROTOCOL_F(min, 3); + SERIAL_PROTOCOLPGM(" max: "); + SERIAL_PROTOCOL_F(max, 3); + SERIAL_PROTOCOLPGM(" range: "); + SERIAL_PROTOCOL_F(max-min, 3); + } + SERIAL_EOL(); + } + } + + } // n_samples loop + } + + STOW_PROBE(); + + if (probing_good) { + SERIAL_PROTOCOLLNPGM("Finished!"); + + if (verbose_level > 0) { + SERIAL_PROTOCOLPGM("Mean: "); + SERIAL_PROTOCOL_F(mean, 6); + SERIAL_PROTOCOLPGM(" Min: "); + SERIAL_PROTOCOL_F(min, 3); + SERIAL_PROTOCOLPGM(" Max: "); + SERIAL_PROTOCOL_F(max, 3); + SERIAL_PROTOCOLPGM(" Range: "); + SERIAL_PROTOCOL_F(max-min, 3); + SERIAL_EOL(); + } + + SERIAL_PROTOCOLPGM("Standard Deviation: "); + SERIAL_PROTOCOL_F(sigma, 6); + SERIAL_EOL(); + SERIAL_EOL(); + } + + clean_up_after_endstop_or_probe_move(); + + // Re-enable bed level correction if it had been on + #if HAS_LEVELING + set_bed_leveling_enabled(was_enabled); + #endif + + report_current_position(); +} + +#endif // Z_MIN_PROBE_REPEATABILITY_TEST diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp new file mode 100644 index 0000000000..75d01b849a --- /dev/null +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if IS_KINEMATIC + +#include "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(DELTA) + + #include "../../module/delta.h" + /** + * M665: Set delta configurations + * + * H = delta height + * L = diagonal rod + * R = delta radius + * S = segments per second + * B = delta calibration radius + * X = Alpha (Tower 1) angle trim + * Y = Beta (Tower 2) angle trim + * Z = Gamma (Tower 3) angle trim + */ + void GcodeSuite::M665() { + if (parser.seen('H')) delta_height = parser.value_linear_units(); + if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seen('R')) delta_radius = parser.value_linear_units(); + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); + if (parser.seen('B')) delta_calibration_radius = parser.value_float(); + if (parser.seen('X')) delta_tower_angle_trim[A_AXIS] = parser.value_float(); + if (parser.seen('Y')) delta_tower_angle_trim[B_AXIS] = parser.value_float(); + if (parser.seen('Z')) delta_tower_angle_trim[C_AXIS] = parser.value_float(); + recalc_delta_settings(); + } + +#elif IS_SCARA + + #include "../../module/scara.h" + + /** + * M665: Set SCARA settings + * + * Parameters: + * + * S[segments-per-second] - Segments-per-second + * P[theta-psi-offset] - Theta-Psi offset, added to the shoulder (A/X) angle + * T[theta-offset] - Theta offset, added to the elbow (B/Y) angle + * + * A, P, and X are all aliases for the shoulder angle + * B, T, and Y are all aliases for the elbow angle + */ + void GcodeSuite::M665() { + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); + + const bool hasA = parser.seen('A'), hasP = parser.seen('P'), hasX = parser.seen('X'); + const uint8_t sumAPX = hasA + hasP + hasX; + if (sumAPX == 1) + home_offset[A_AXIS] = parser.value_float(); + else if (sumAPX > 1) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Only one of A, P, or X is allowed."); + return; + } + + const bool hasB = parser.seen('B'), hasT = parser.seen('T'), hasY = parser.seen('Y'); + const uint8_t sumBTY = hasB + hasT + hasY; + if (sumBTY == 1) + home_offset[B_AXIS] = parser.value_float(); + else if (sumBTY > 1) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Only one of B, T, or Y is allowed."); + return; + } + } + +#endif + +#endif // IS_KINEMATIC diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp new file mode 100644 index 0000000000..1cad2d0181 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -0,0 +1,107 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + +#include "../gcode.h" + +#if ENABLED(DELTA) + + #include "../../module/delta.h" + #include "../../module/motion.h" + + /** + * M666: Set delta endstop adjustment + */ + void GcodeSuite::M666() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM(">>> M666"); + } + #endif + LOOP_XYZ(i) { + if (parser.seen(axis_codes[i])) { + const float v = parser.value_linear_units(); + if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("delta_endstop_adj[", axis_codes[i]); + SERIAL_ECHOLNPAIR("] = ", delta_endstop_adj[i]); + } + #endif + } + } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("<<< M666"); + } + #endif + } + +#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + + #include "../../module/endstops.h" + + /** + * M666: Set Dual Endstops offsets for X, Y, and/or Z. + * With no parameters report current offsets. + */ + void GcodeSuite::M666() { + bool report = true; + #if ENABLED(X_DUAL_ENDSTOPS) + if (parser.seen('X')) { + endstops.x_endstop_adj = parser.value_linear_units(); + report = false; + } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (parser.seen('Y')) { + endstops.y_endstop_adj = parser.value_linear_units(); + report = false; + } + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + if (parser.seen('Z')) { + endstops.z_endstop_adj = parser.value_linear_units(); + report = false; + } + #endif + if (report) { + SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); + #if ENABLED(X_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" X", endstops.x_endstop_adj); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" Y", endstops.y_endstop_adj); + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" Z", endstops.z_endstop_adj); + #endif + SERIAL_EOL(); + } + } + +#endif // X_DUAL_ENDSTOPS || Y_DUAL_ENDSTOPS || Z_DUAL_ENDSTOPS + +#endif // DELTA || X_DUAL_ENDSTOPS || Y_DUAL_ENDSTOPS || Z_DUAL_ENDSTOPS diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp new file mode 100644 index 0000000000..4841cecbc0 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -0,0 +1,108 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SKEW_CORRECTION_GCODE) + +#include "../gcode.h" +#include "../../module/planner.h" + +/** + * M852: Get or set the machine skew factors. Reports current values with no arguments. + * + * S[xy_factor] - Alias for 'I' + * I[xy_factor] - New XY skew factor + * J[xz_factor] - New XZ skew factor + * K[yz_factor] - New YZ skew factor + */ +void GcodeSuite::M852() { + uint8_t ijk = 0, badval = 0, setval = 0; + + if (parser.seen('I') || parser.seen('S')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.xy_skew_factor != value) { + planner.xy_skew_factor = value; + ++setval; + } + } + else + ++badval; + } + + #if ENABLED(SKEW_CORRECTION_FOR_Z) + + if (parser.seen('J')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.xz_skew_factor != value) { + planner.xz_skew_factor = value; + ++setval; + } + } + else + ++badval; + } + + if (parser.seen('K')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.yz_skew_factor != value) { + planner.yz_skew_factor = value; + ++setval; + } + } + else + ++badval; + } + + #endif + + if (badval) + SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); + + // When skew is changed the current position changes + if (setval) { + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); + report_current_position(); + } + + if (!ijk) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_SKEW_FACTOR " XY: "); + SERIAL_ECHO_F(planner.xy_skew_factor, 6); + SERIAL_EOL(); + #if ENABLED(SKEW_CORRECTION_FOR_Z) + SERIAL_ECHOPAIR(" XZ: ", planner.xz_skew_factor); + SERIAL_ECHOLNPAIR(" YZ: ", planner.yz_skew_factor); + #else + SERIAL_EOL(); + #endif + } +} + +#endif // SKEW_CORRECTION_GCODE diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp new file mode 100644 index 0000000000..c73f8da3cc --- /dev/null +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../Marlin.h" +#include "../../module/planner.h" + +#if DISABLED(NO_VOLUMETRICS) + + /** + * M200: Set filament diameter and set E axis units to cubic units + * + * T - Optional extruder number. Current extruder if omitted. + * D - Diameter of the filament. Use "D0" to switch back to linear units on the E axis. + */ + void GcodeSuite::M200() { + + if (get_target_extruder_from_command()) return; + + if (parser.seen('D')) { + // setting any extruder filament size disables volumetric on the assumption that + // slicers either generate in extruder values as cubic mm or as as filament feeds + // for all extruders + if ( (parser.volumetric_enabled = (parser.value_linear_units() != 0.0)) ) + planner.set_filament_size(target_extruder, parser.value_linear_units()); + } + planner.calculate_volumetric_multipliers(); + } + +#endif // !NO_VOLUMETRICS + +/** + * M201: Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000) + * + * With multiple extruders use T to specify which one. + */ +void GcodeSuite::M201() { + + GET_TARGET_EXTRUDER(); + + LOOP_XYZE(i) { + if (parser.seen(axis_codes[i])) { + const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); + planner.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a); + } + } + // steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner) + planner.reset_acceleration_rates(); +} + +/** + * M203: Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in units/sec + * + * With multiple extruders use T to specify which one. + */ +void GcodeSuite::M203() { + + GET_TARGET_EXTRUDER(); + + LOOP_XYZE(i) + if (parser.seen(axis_codes[i])) { + const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); + planner.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a); + } +} + +/** + * M204: Set Accelerations in units/sec^2 (M204 P1200 R3000 T3000) + * + * P = Printing moves + * R = Retract only (no X, Y, Z) moves + * T = Travel (non printing) moves + */ +void GcodeSuite::M204() { + bool report = true; + if (parser.seenval('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments. + planner.travel_acceleration = planner.acceleration = parser.value_linear_units(); + report = false; + } + if (parser.seenval('P')) { + planner.acceleration = parser.value_linear_units(); + report = false; + } + if (parser.seenval('R')) { + planner.retract_acceleration = parser.value_linear_units(); + report = false; + } + if (parser.seenval('T')) { + planner.travel_acceleration = parser.value_linear_units(); + report = false; + } + if (report) { + SERIAL_ECHOPAIR("Acceleration: P", planner.acceleration); + SERIAL_ECHOPAIR(" R", planner.retract_acceleration); + SERIAL_ECHOLNPAIR(" T", planner.travel_acceleration); + } +} + +/** + * M205: Set Advanced Settings + * + * B = Min Segment Time (µs) + * S = Min Feed Rate (units/s) + * T = Min Travel Feed Rate (units/s) + * X = Max X Jerk (units/sec^2) + * Y = Max Y Jerk (units/sec^2) + * Z = Max Z Jerk (units/sec^2) + * E = Max E Jerk (units/sec^2) + * J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION) + */ +void GcodeSuite::M205() { + if (parser.seen('B')) planner.min_segment_time_us = parser.value_ulong(); + if (parser.seen('S')) planner.min_feedrate_mm_s = parser.value_linear_units(); + if (parser.seen('T')) planner.min_travel_feedrate_mm_s = parser.value_linear_units(); + #if ENABLED(JUNCTION_DEVIATION) + if (parser.seen('J')) { + const float junc_dev = parser.value_linear_units(); + if (WITHIN(junc_dev, 0.01, 0.3)) { + planner.junction_deviation_mm = junc_dev; + planner.recalculate_max_e_jerk_factor(); + } + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("?J out of range (0.01 to 0.3)"); + } + } + #else + if (parser.seen('X')) planner.max_jerk[X_AXIS] = parser.value_linear_units(); + if (parser.seen('Y')) planner.max_jerk[Y_AXIS] = parser.value_linear_units(); + if (parser.seen('Z')) { + planner.max_jerk[Z_AXIS] = parser.value_linear_units(); + #if HAS_MESH + if (planner.max_jerk[Z_AXIS] <= 0.1) + SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); + #endif + } + if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); + #endif +} diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp new file mode 100644 index 0000000000..47910e0745 --- /dev/null +++ b/Marlin/src/gcode/config/M218.cpp @@ -0,0 +1,84 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HOTENDS > 1 + +#include "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(DELTA) + #include "../../module/planner.h" +#endif + +/** + * M218 - set hotend offset (in linear units) + * + * T + * X + * Y + * Z - Available with DUAL_X_CARRIAGE, SWITCHING_NOZZLE and PARKING_EXTRUDER + */ +void GcodeSuite::M218() { + if (get_target_extruder_from_command() || target_extruder == 0) return; + + bool report = true; + if (parser.seenval('X')) { + hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } + if (parser.seenval('Y')) { + hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } + + #if HAS_HOTEND_OFFSET_Z + if (parser.seenval('Z')) { + hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } + #endif + + if (report) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); + HOTEND_LOOP() { + SERIAL_CHAR(' '); + SERIAL_ECHO(hotend_offset[X_AXIS][e]); + SERIAL_CHAR(','); + SERIAL_ECHO(hotend_offset[Y_AXIS][e]); + #if HAS_HOTEND_OFFSET_Z + SERIAL_CHAR(','); + SERIAL_ECHO(hotend_offset[Z_AXIS][e]); + #endif + } + SERIAL_EOL(); + } + + #if ENABLED(DELTA) + if (target_extruder == active_extruder) + do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.max_feedrate_mm_s[X_AXIS]); + #endif +} + +#endif // HOTENDS > 1 diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp new file mode 100644 index 0000000000..82fa9c0ba3 --- /dev/null +++ b/Marlin/src/gcode/config/M220.cpp @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/motion.h" + +/** + * M220: Set speed percentage factor, aka "Feed Rate" (M220 S95) + */ +void GcodeSuite::M220() { + + if (parser.seenval('S')) + feedrate_percentage = parser.value_int(); + +} diff --git a/Marlin/src/gcode/config/M221.cpp b/Marlin/src/gcode/config/M221.cpp new file mode 100644 index 0000000000..e5d4204f5e --- /dev/null +++ b/Marlin/src/gcode/config/M221.cpp @@ -0,0 +1,43 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/planner.h" + +/** + * M221: Set extrusion percentage (M221 T0 S95) + */ +void GcodeSuite::M221() { + if (get_target_extruder_from_command()) return; + if (parser.seenval('S')) { + planner.flow_percentage[target_extruder] = parser.value_int(); + planner.refresh_e_factor(target_extruder); + } + else { + SERIAL_ECHO_START(); + SERIAL_CHAR('E'); + SERIAL_CHAR('0' + target_extruder); + SERIAL_ECHOPAIR(" Flow: ", planner.flow_percentage[target_extruder]); + SERIAL_CHAR('%'); + SERIAL_EOL(); + } +} diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp new file mode 100644 index 0000000000..f61896ac73 --- /dev/null +++ b/Marlin/src/gcode/config/M301.cpp @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PIDTEMP) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M301: Set PID parameters P I D (and optionally C, L) + * + * P[float] Kp term + * I[float] Ki term (unscaled) + * D[float] Kd term (unscaled) + * + * With PID_EXTRUSION_SCALING: + * + * C[float] Kc term + * L[int] LPQ length + */ +void GcodeSuite::M301() { + + // multi-extruder PID patch: M301 updates or prints a single extruder's PID values + // default behaviour (omitting E parameter) is to update for extruder 0 only + const uint8_t e = parser.byteval('E'); // extruder being updated + + if (e < HOTENDS) { // catch bad input value + if (parser.seen('P')) PID_PARAM(Kp, e) = parser.value_float(); + if (parser.seen('I')) PID_PARAM(Ki, e) = scalePID_i(parser.value_float()); + if (parser.seen('D')) PID_PARAM(Kd, e) = scalePID_d(parser.value_float()); + #if ENABLED(PID_EXTRUSION_SCALING) + if (parser.seen('C')) PID_PARAM(Kc, e) = parser.value_float(); + if (parser.seenval('L')) thermalManager.lpq_len = parser.value_int(); + NOMORE(thermalManager.lpq_len, LPQ_MAX_LEN); + NOLESS(thermalManager.lpq_len, 0); + #endif + + thermalManager.updatePID(); + SERIAL_ECHO_START(); + #if ENABLED(PID_PARAMS_PER_HOTEND) + SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output + #endif // PID_PARAMS_PER_HOTEND + SERIAL_ECHOPAIR(" p:", PID_PARAM(Kp, e)); + SERIAL_ECHOPAIR(" i:", unscalePID_i(PID_PARAM(Ki, e))); + SERIAL_ECHOPAIR(" d:", unscalePID_d(PID_PARAM(Kd, e))); + #if ENABLED(PID_EXTRUSION_SCALING) + //Kc does not have scaling applied above, or in resetting defaults + SERIAL_ECHOPAIR(" c:", PID_PARAM(Kc, e)); + #endif + SERIAL_EOL(); + } + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER); + } +} + +#endif // PIDTEMP diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp new file mode 100644 index 0000000000..5097c5493a --- /dev/null +++ b/Marlin/src/gcode/config/M302.cpp @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PREVENT_COLD_EXTRUSION) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M302: Allow cold extrudes, or set the minimum extrude temperature + * + * S sets the minimum extrude temperature + * P enables (1) or disables (0) cold extrusion + * + * Examples: + * + * M302 ; report current cold extrusion state + * M302 P0 ; enable cold extrusion checking + * M302 P1 ; disables cold extrusion checking + * M302 S0 ; always allow extrusion (disables checking) + * M302 S170 ; only allow extrusion above 170 + * M302 S170 P1 ; set min extrude temp to 170 but leave disabled + */ +void GcodeSuite::M302() { + const bool seen_S = parser.seen('S'); + if (seen_S) { + thermalManager.extrude_min_temp = parser.value_celsius(); + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); + } + + if (parser.seen('P')) + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || parser.value_bool(); + else if (!seen_S) { + // Report current state + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("Cold extrudes are ", (thermalManager.allow_cold_extrude ? "en" : "dis")); + SERIAL_ECHOPAIR("abled (min temp ", thermalManager.extrude_min_temp); + SERIAL_ECHOLNPGM("C)"); + } +} + +#endif // PREVENT_COLD_EXTRUSION diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp new file mode 100644 index 0000000000..3bc645903f --- /dev/null +++ b/Marlin/src/gcode/config/M304.cpp @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PIDTEMPBED) + +#include "../gcode.h" +#include "../../module/temperature.h" + +void GcodeSuite::M304() { + if (parser.seen('P')) thermalManager.bedKp = parser.value_float(); + if (parser.seen('I')) thermalManager.bedKi = scalePID_i(parser.value_float()); + if (parser.seen('D')) thermalManager.bedKd = scalePID_d(parser.value_float()); + + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" p:", thermalManager.bedKp); + SERIAL_ECHOPAIR(" i:", unscalePID_i(thermalManager.bedKi)); + SERIAL_ECHOLNPAIR(" d:", unscalePID_d(thermalManager.bedKd)); +} + +#endif // PIDTEMPBED diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp new file mode 100644 index 0000000000..e9d36efd67 --- /dev/null +++ b/Marlin/src/gcode/config/M43.cpp @@ -0,0 +1,331 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PINS_DEBUGGING) + +#include "../gcode.h" +#include "../../Marlin.h" // for pin_is_protected +#include "../../pins/pinsDebug.h" +#include "../../module/endstops.h" + +#if HAS_Z_SERVO_PROBE + #include "../../module/probe.h" + #include "../../module/servo.h" +#endif + +inline void toggle_pins() { + const bool ignore_protection = parser.boolval('I'); + const int repeat = parser.intval('R', 1), + start = PARSED_PIN_INDEX('S', 0), + end = PARSED_PIN_INDEX('E', NUM_DIGITAL_PINS - 1), + wait = parser.intval('W', 500); + + for (uint8_t i = start; i <= end; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + //report_pin_state_extended(pin, ignore_protection, false); + if (!VALID_PIN(pin)) continue; + if (!ignore_protection && pin_is_protected(pin)) { + report_pin_state_extended(pin, ignore_protection, true, "Untouched "); + SERIAL_EOL(); + } + else { + report_pin_state_extended(pin, ignore_protection, true, "Pulsing "); + #if AVR_AT90USB1286_FAMILY // Teensy IDEs don't know about these pins so must use FASTIO + if (pin == TEENSY_E2) { + SET_OUTPUT(TEENSY_E2); + for (int16_t j = 0; j < repeat; j++) { + WRITE(TEENSY_E2, LOW); safe_delay(wait); + WRITE(TEENSY_E2, HIGH); safe_delay(wait); + WRITE(TEENSY_E2, LOW); safe_delay(wait); + } + } + else if (pin == TEENSY_E3) { + SET_OUTPUT(TEENSY_E3); + for (int16_t j = 0; j < repeat; j++) { + WRITE(TEENSY_E3, LOW); safe_delay(wait); + WRITE(TEENSY_E3, HIGH); safe_delay(wait); + WRITE(TEENSY_E3, LOW); safe_delay(wait); + } + } + else + #endif + { + pinMode(pin, OUTPUT); + for (int16_t j = 0; j < repeat; j++) { + digitalWrite(pin, 0); safe_delay(wait); + digitalWrite(pin, 1); safe_delay(wait); + digitalWrite(pin, 0); safe_delay(wait); + } + } + + } + SERIAL_EOL(); + } + SERIAL_ECHOLNPGM("Done."); + +} // toggle_pins + +inline void servo_probe_test() { + #if !(NUM_SERVOS > 0 && HAS_SERVO_0) + + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("SERVO not setup"); + + #elif !HAS_Z_SERVO_PROBE + + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Z_PROBE_SERVO_NR not setup"); + + #else // HAS_Z_SERVO_PROBE + + const uint8_t probe_index = parser.byteval('P', Z_PROBE_SERVO_NR); + + SERIAL_PROTOCOLLNPGM("Servo probe test"); + SERIAL_PROTOCOLLNPAIR(". using index: ", probe_index); + SERIAL_PROTOCOLLNPAIR(". deploy angle: ", z_servo_angle[0]); + SERIAL_PROTOCOLLNPAIR(". stow angle: ", z_servo_angle[1]); + + bool probe_inverting; + + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + + #define PROBE_TEST_PIN Z_MIN_PIN + + SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN pin: ", PROBE_TEST_PIN); + SERIAL_PROTOCOLLNPGM(". uses Z_MIN_ENDSTOP_INVERTING (ignores Z_MIN_PROBE_ENDSTOP_INVERTING)"); + SERIAL_PROTOCOLPGM(". Z_MIN_ENDSTOP_INVERTING: "); + + #if Z_MIN_ENDSTOP_INVERTING + SERIAL_PROTOCOLLNPGM("true"); + #else + SERIAL_PROTOCOLLNPGM("false"); + #endif + + probe_inverting = Z_MIN_ENDSTOP_INVERTING; + + #elif ENABLED(Z_MIN_PROBE_ENDSTOP) + + #define PROBE_TEST_PIN Z_MIN_PROBE_PIN + SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN_PROBE_PIN: ", PROBE_TEST_PIN); + SERIAL_PROTOCOLLNPGM(". uses Z_MIN_PROBE_ENDSTOP_INVERTING (ignores Z_MIN_ENDSTOP_INVERTING)"); + SERIAL_PROTOCOLPGM(". Z_MIN_PROBE_ENDSTOP_INVERTING: "); + + #if Z_MIN_PROBE_ENDSTOP_INVERTING + SERIAL_PROTOCOLLNPGM("true"); + #else + SERIAL_PROTOCOLLNPGM("false"); + #endif + + probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; + + #endif + + SERIAL_PROTOCOLLNPGM(". deploy & stow 4 times"); + SET_INPUT_PULLUP(PROBE_TEST_PIN); + uint8_t i = 0; + bool deploy_state, stow_state; + do { + MOVE_SERVO(probe_index, z_servo_angle[0]); //deploy + safe_delay(500); + deploy_state = READ(PROBE_TEST_PIN); + MOVE_SERVO(probe_index, z_servo_angle[1]); //stow + safe_delay(500); + stow_state = READ(PROBE_TEST_PIN); + } while (++i < 4); + if (probe_inverting != deploy_state) SERIAL_PROTOCOLLNPGM("WARNING - INVERTING setting probably backwards"); + + if (deploy_state != stow_state) { + SERIAL_PROTOCOLLNPGM("BLTouch clone detected"); + if (deploy_state) { + SERIAL_PROTOCOLLNPGM(". DEPLOYED state: HIGH (logic 1)"); + SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: LOW (logic 0)"); + } + else { + SERIAL_PROTOCOLLNPGM(". DEPLOYED state: LOW (logic 0)"); + SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: HIGH (logic 1)"); + } + #if ENABLED(BLTOUCH) + SERIAL_PROTOCOLLNPGM("ERROR: BLTOUCH enabled - set this device up as a Z Servo Probe with inverting as true."); + #endif + } + else { // measure active signal length + MOVE_SERVO(probe_index, z_servo_angle[0]); // deploy + safe_delay(500); + SERIAL_PROTOCOLLNPGM("please trigger probe"); + uint16_t probe_counter = 0; + + // Allow 30 seconds max for operator to trigger probe + for (uint16_t j = 0; j < 500 * 30 && probe_counter == 0 ; j++) { + + safe_delay(2); + + if (0 == j % (500 * 1)) gcode.reset_stepper_timeout(); // Keep steppers powered + + if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered + + for (probe_counter = 1; probe_counter < 50 && deploy_state != READ(PROBE_TEST_PIN); ++probe_counter) + safe_delay(2); + + if (probe_counter == 50) + SERIAL_PROTOCOLLNPGM("Z Servo Probe detected"); // >= 100mS active time + else if (probe_counter >= 2) + SERIAL_PROTOCOLLNPAIR("BLTouch compatible probe detected - pulse width (+/- 4mS): ", probe_counter * 2); // allow 4 - 100mS pulse + else + SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse + + MOVE_SERVO(probe_index, z_servo_angle[1]); //stow + + } // pulse detected + + } // for loop waiting for trigger + + if (probe_counter == 0) SERIAL_PROTOCOLLNPGM("trigger not detected"); + + } // measure active signal length + + #endif + +} // servo_probe_test + +/** + * M43: Pin debug - report pin state, watch pins, toggle pins and servo probe test/report + * + * M43 - report name and state of pin(s) + * P Pin to read or watch. If omitted, reads all pins. + * I Flag to ignore Marlin's pin protection. + * + * M43 W - Watch pins -reporting changes- until reset, click, or M108. + * P Pin to read or watch. If omitted, read/watch all pins. + * I Flag to ignore Marlin's pin protection. + * + * M43 E - Enable / disable background endstop monitoring + * - Machine continues to operate + * - Reports changes to endstops + * - Toggles LED_PIN when an endstop changes + * - Cannot reliably catch the 5mS pulse from BLTouch type probes + * + * M43 T - Toggle pin(s) and report which pin is being toggled + * S - Start Pin number. If not given, will default to 0 + * L - End Pin number. If not given, will default to last pin defined for this board + * I - Flag to ignore Marlin's pin protection. Use with caution!!!! + * R - Repeat pulses on each pin this number of times before continueing to next pin + * W - Wait time (in miliseconds) between pulses. If not given will default to 500 + * + * M43 S - Servo probe test + * P - Probe index (optional - defaults to 0 + */ +void GcodeSuite::M43() { + + if (parser.seen('T')) { // must be first or else its "S" and "E" parameters will execute endstop or servo test + toggle_pins(); + return; + } + + // Enable or disable endstop monitoring + if (parser.seen('E')) { + endstops.monitor_flag = parser.value_bool(); + SERIAL_PROTOCOLPGM("endstop monitor "); + serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); + SERIAL_PROTOCOLLNPGM("abled"); + return; + } + + if (parser.seen('S')) { + servo_probe_test(); + return; + } + + // Get the range of pins to test or watch + uint8_t first_pin = PARSED_PIN_INDEX('P', 0), + last_pin = parser.seenval('P') ? first_pin : NUMBER_PINS_TOTAL - 1; + + if (first_pin > last_pin) return; + + const bool ignore_protection = parser.boolval('I'); + + // Watch until click, M108, or reset + if (parser.boolval('W')) { + SERIAL_PROTOCOLLNPGM("Watching pins"); + + #ifdef ARDUINO_ARCH_SAM + NOLESS(first_pin, 2); // don't hijack the UART pins + #endif + uint8_t pin_state[last_pin - first_pin + 1]; + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + if (!VALID_PIN(pin)) continue; + if (!ignore_protection && pin_is_protected(pin)) continue; + pinMode(pin, INPUT_PULLUP); + delay(1); + /* + if (IS_ANALOG(pin)) + pin_state[pin - first_pin] = analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)); // int16_t pin_state[...] + else + //*/ + pin_state[i - first_pin] = digitalRead(pin); + } + + #if HAS_RESUME_CONTINUE + wait_for_user = true; + KEEPALIVE_STATE(PAUSED_FOR_USER); + #endif + + for (;;) { + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + if (!VALID_PIN(pin)) continue; + if (!ignore_protection && pin_is_protected(pin)) continue; + const byte val = + /* + IS_ANALOG(pin) + ? analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)) : // int16_t val + : + //*/ + digitalRead(pin); + if (val != pin_state[i - first_pin]) { + report_pin_state_extended(pin, ignore_protection, false); + pin_state[i - first_pin] = val; + } + } + + #if HAS_RESUME_CONTINUE + if (!wait_for_user) { + KEEPALIVE_STATE(IN_HANDLER); + break; + } + #endif + + safe_delay(200); + } + return; + } + + // Report current state of selected pin(s) + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); + } +} + +#endif // PINS_DEBUGGING diff --git a/Marlin/src/gcode/config/M540.cpp b/Marlin/src/gcode/config/M540.cpp new file mode 100644 index 0000000000..d554258030 --- /dev/null +++ b/Marlin/src/gcode/config/M540.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M540: Set whether SD card print should abort on endstop hit (M540 S<0|1>) + */ +void GcodeSuite::M540() { + + if (parser.seen('S')) + planner.abort_on_endstop_hit = parser.value_bool(); + +} + +#endif // ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp new file mode 100644 index 0000000000..c1b8ed2eec --- /dev/null +++ b/Marlin/src/gcode/config/M92.cpp @@ -0,0 +1,56 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/planner.h" + +/** + * M92: Set axis steps-per-unit for one or more axes, X, Y, Z, and E. + * (Follows the same syntax as G92) + * + * With multiple extruders use T to specify which one. + */ +void GcodeSuite::M92() { + + GET_TARGET_EXTRUDER(); + + LOOP_XYZE(i) { + if (parser.seen(axis_codes[i])) { + if (i == E_AXIS) { + const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER)); + if (value < 20.0) { + float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab. + #if DISABLED(JUNCTION_DEVIATION) + planner.max_jerk[E_AXIS] *= factor; + #endif + planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor; + planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor; + } + planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value; + } + else { + planner.axis_steps_per_mm[i] = parser.value_per_axis_unit((AxisEnum)i); + } + } + } + planner.refresh_positioning(); +} diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp new file mode 100644 index 0000000000..7b49951266 --- /dev/null +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if DISABLED(EMERGENCY_PARSER) + +#include "../gcode.h" +#include "../../Marlin.h" // for wait_for_heatup, kill, quickstop_stepper + +/** + * M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature. + */ +void GcodeSuite::M108() { + wait_for_heatup = false; +} + +/** + * M112: Emergency Stop + */ +void GcodeSuite::M112() { + kill(PSTR(MSG_KILLED)); +} + +/** + * M410: Quickstop - Abort all planned moves + * + * This will stop the carriages mid-move, so most likely they + * will be out of sync with the stepper position after this. + */ +void GcodeSuite::M410() { + quickstop_stepper(); +} + +#endif // !EMERGENCY_PARSER diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp new file mode 100644 index 0000000000..96587a1fc1 --- /dev/null +++ b/Marlin/src/gcode/control/M111.cpp @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" + +/** + * M111: Set the debug level + */ +void GcodeSuite::M111() { + if (parser.seen('S')) marlin_debug_flags = parser.byteval('S'); + + static const char str_debug_1[] PROGMEM = MSG_DEBUG_ECHO, + str_debug_2[] PROGMEM = MSG_DEBUG_INFO, + str_debug_4[] PROGMEM = MSG_DEBUG_ERRORS, + str_debug_8[] PROGMEM = MSG_DEBUG_DRYRUN, + str_debug_16[] PROGMEM = MSG_DEBUG_COMMUNICATION + #if ENABLED(DEBUG_LEVELING_FEATURE) + , str_debug_32[] PROGMEM = MSG_DEBUG_LEVELING + #endif + ; + + static const char* const debug_strings[] PROGMEM = { + str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16 + #if ENABLED(DEBUG_LEVELING_FEATURE) + , str_debug_32 + #endif + }; + + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_DEBUG_PREFIX); + if (marlin_debug_flags) { + uint8_t comma = 0; + for (uint8_t i = 0; i < COUNT(debug_strings); i++) { + if (TEST(marlin_debug_flags, i)) { + if (comma++) SERIAL_CHAR(','); + serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); + } + } + } + else { + SERIAL_ECHOPGM(MSG_DEBUG_OFF); + #if !defined(__AVR__) || !defined(USBCON) + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + SERIAL_ECHOPAIR("\nBuffer Overruns: ", customizedSerial.buffer_overruns()); + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + SERIAL_ECHOPAIR("\nFraming Errors: ", customizedSerial.framing_errors()); + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + SERIAL_ECHOPAIR("\nDropped bytes: ", customizedSerial.dropped()); + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + SERIAL_ECHOPAIR("\nMax RX Queue Size: ", customizedSerial.rxMaxEnqueued()); + #endif + #endif // !defined(__AVR__) || !defined(USBCON) + } + SERIAL_EOL(); +} diff --git a/Marlin/src/gcode/control/M120_M121.cpp b/Marlin/src/gcode/control/M120_M121.cpp new file mode 100644 index 0000000000..3425fc9477 --- /dev/null +++ b/Marlin/src/gcode/control/M120_M121.cpp @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/endstops.h" + +/** + * M120: Enable endstops and set non-homing endstop state to "enabled" + */ +void GcodeSuite::M120() { endstops.enable_globally(true); } + +/** + * M121: Disable endstops and set non-homing endstop state to "disabled" + */ +void GcodeSuite::M121() { endstops.enable_globally(false); } diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp new file mode 100644 index 0000000000..c428a87877 --- /dev/null +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../Marlin.h" // for stepper_inactive_time +#include "../../lcd/ultralcd.h" +#include "../../module/stepper.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTRA_LCD) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +/** + * M17: Enable power on all stepper motors + */ +void GcodeSuite::M17() { + LCD_MESSAGEPGM(MSG_NO_MOVE); + enable_all_steppers(); +} + +/** + * M18, M84: Disable stepper motors + */ +void GcodeSuite::M18_M84() { + if (parser.seenval('S')) { + stepper_inactive_time = parser.value_millis_from_seconds(); + } + else { + bool all_axis = !(parser.seen('X') || parser.seen('Y') || parser.seen('Z') || parser.seen('E')); + if (all_axis) { + planner.finish_and_disable(); + } + else { + planner.synchronize(); + if (parser.seen('X')) disable_X(); + if (parser.seen('Y')) disable_Y(); + if (parser.seen('Z')) disable_Z(); + #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN // Only disable on boards that have separate ENABLE_PINS + if (parser.seen('E')) disable_e_steppers(); + #endif + } + + #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD + if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; + #endif + } +} diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp new file mode 100644 index 0000000000..1f3be868a7 --- /dev/null +++ b/Marlin/src/gcode/control/M211.cpp @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/motion.h" + +/** + * M211: Enable, Disable, and/or Report software endstops + * + * Usage: M211 S1 to enable, M211 S0 to disable, M211 alone for report + */ +void GcodeSuite::M211() { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_SOFT_ENDSTOPS); + #if HAS_SOFTWARE_ENDSTOPS + if (parser.seen('S')) soft_endstops_enabled = parser.value_bool(); + serialprintPGM(soft_endstops_enabled ? PSTR(MSG_ON) : PSTR(MSG_OFF)); + #else + SERIAL_ECHOPGM(MSG_OFF); + #endif + SERIAL_ECHOPGM(MSG_SOFT_MIN); + SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_min[X_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_min[Y_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_min[Z_AXIS])); + SERIAL_ECHOPGM(MSG_SOFT_MAX); + SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_max[X_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_max[Y_AXIS])); + SERIAL_ECHOLNPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_max[Z_AXIS])); +} diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp new file mode 100644 index 0000000000..59071aadf3 --- /dev/null +++ b/Marlin/src/gcode/control/M226.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../Marlin.h" // for pin_is_protected and idle() +#include "../../module/stepper.h" + +/** + * M226: Wait until the specified pin reaches the state required (M226 P S) + */ +void GcodeSuite::M226() { + if (parser.seen('P')) { + const int pin_number = PARSED_PIN_INDEX('P', 0), + pin_state = parser.intval('S', -1); // required pin state - default is inverted + const pin_t pin = GET_PIN_MAP_PIN(pin_number); + + if (WITHIN(pin_state, -1, 1) && pin > -1) { + if (pin_is_protected(pin)) + protected_pin_err(); + else { + int target = LOW; + planner.synchronize(); + pinMode(pin, INPUT); + switch (pin_state) { + case 1: target = HIGH; break; + case 0: target = LOW; break; + case -1: target = !digitalRead(pin); break; + } + while (digitalRead(pin) != target) idle(); + } + } // pin_state -1 0 1 && pin > -1 + } // parser.seen('P') +} diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp new file mode 100644 index 0000000000..1cfb6c89fd --- /dev/null +++ b/Marlin/src/gcode/control/M280.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "../gcode.h" +#include "../../module/servo.h" + +/** + * M280: Get or set servo position. P [S] + */ +void GcodeSuite::M280() { + if (!parser.seen('P')) return; + const int servo_index = parser.value_int(); + if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { + if (parser.seen('S')) + MOVE_SERVO(servo_index, parser.value_int()); + else { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" Servo ", servo_index); + SERIAL_ECHOLNPAIR(": ", servo[servo_index].read()); + } + } + else { + SERIAL_ERROR_START(); + SERIAL_ECHOPAIR("Servo ", servo_index); + SERIAL_ECHOLNPGM(" out of range"); + } +} + +#endif // HAS_SERVOS diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp new file mode 100644 index 0000000000..ea0895a5c2 --- /dev/null +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" +#include "../gcode.h" +#include "../../module/stepper.h" +#if ENABLED(SPINDLE_LASER_ENABLE) + + + +/** + * M3: Spindle Clockwise + * M4: Spindle Counter-clockwise + * + * S0 turns off spindle. + * + * If no speed PWM output is defined then M3/M4 just turns it on. + * + * At least 12.8KHz (50Hz * 256) is needed for spindle PWM. + * Hardware PWM is required. ISRs are too slow. + * + * NOTE: WGM for timers 3, 4, and 5 must be either Mode 1 or Mode 5. + * No other settings give a PWM signal that goes from 0 to 5 volts. + * + * The system automatically sets WGM to Mode 1, so no special + * initialization is needed. + * + * WGM bits for timer 2 are automatically set by the system to + * Mode 1. This produces an acceptable 0 to 5 volt signal. + * No special initialization is needed. + * + * NOTE: A minimum PWM frequency of 50 Hz is needed. All prescaler + * factors for timers 2, 3, 4, and 5 are acceptable. + * + * SPINDLE_LASER_ENABLE_PIN needs an external pullup or it may power on + * the spindle/laser during power-up or when connecting to the host + * (usually goes through a reset which sets all I/O pins to tri-state) + * + * PWM duty cycle goes from 0 (off) to 255 (always on). + */ + +// Wait for spindle to come up to speed +inline void delay_for_power_up() { gcode.dwell(SPINDLE_LASER_POWERUP_DELAY); } + +// Wait for spindle to stop turning +inline void delay_for_power_down() { gcode.dwell(SPINDLE_LASER_POWERDOWN_DELAY); } + +/** + * ocr_val_mode() is used for debugging and to get the points needed to compute the RPM vs ocr_val line + * + * it accepts inputs of 0-255 + */ + +inline void ocr_val_mode() { + uint8_t spindle_laser_power = parser.value_byte(); + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) + if (SPINDLE_LASER_PWM_INVERT) spindle_laser_power = 255 - spindle_laser_power; + analogWrite(SPINDLE_LASER_PWM_PIN, spindle_laser_power); +} + +void GcodeSuite::M3_M4(bool is_M3) { + + planner.synchronize(); // wait until previous movement commands (G0/G0/G2/G3) have completed before playing with the spindle + #if SPINDLE_DIR_CHANGE + const bool rotation_dir = (is_M3 != SPINDLE_INVERT_DIR); + if (SPINDLE_STOP_ON_DIR_CHANGE \ + && READ(SPINDLE_LASER_ENABLE_PIN) == SPINDLE_LASER_ENABLE_INVERT \ + && READ(SPINDLE_DIR_PIN) != rotation_dir + ) { + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off + delay_for_power_down(); + } + WRITE(SPINDLE_DIR_PIN, rotation_dir); + #endif + + /** + * Our final value for ocr_val is an unsigned 8 bit value between 0 and 255 which usually means uint8_t. + * Went to uint16_t because some of the uint8_t calculations would sometimes give 1000 0000 rather than 1111 1111. + * Then needed to AND the uint16_t result with 0x00FF to make sure we only wrote the byte of interest. + */ + #if ENABLED(SPINDLE_LASER_PWM) + if (parser.seen('O')) ocr_val_mode(); + else { + const float spindle_laser_power = parser.floatval('S'); + if (spindle_laser_power == 0) { + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off (active low) + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // only write low byte + delay_for_power_down(); + } + else { + int16_t ocr_val = (spindle_laser_power - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // convert RPM to PWM duty cycle + NOMORE(ocr_val, 255); // limit to max the Atmel PWM will support + if (spindle_laser_power <= SPEED_POWER_MIN) + ocr_val = (SPEED_POWER_MIN - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // minimum setting + if (spindle_laser_power >= SPEED_POWER_MAX) + ocr_val = (SPEED_POWER_MAX - (SPEED_POWER_INTERCEPT)) * (1.0 / (SPEED_POWER_SLOPE)); // limit to max RPM + if (SPINDLE_LASER_PWM_INVERT) ocr_val = 255 - ocr_val; + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) + analogWrite(SPINDLE_LASER_PWM_PIN, ocr_val & 0xFF); // only write low byte + delay_for_power_up(); + } + } + #else + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) if spindle speed option not enabled + delay_for_power_up(); + #endif +} + +/** + * M5 turn off spindle + */ +void GcodeSuite::M5() { + planner.synchronize(); + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); + #if ENABLED(SPINDLE_LASER_PWM) + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); + #endif + delay_for_power_down(); +} + +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(FAN_AS_LASER) + /** + * M3, M4: Laser On + */ + void GcodeSuite::M3_M4(bool is_M3) { + planner.synchronize(); + const uint16_t s = parser.ushortval('S', 255); + fanSpeeds[FAN_NUM_AS_LASER] = MIN(s, 255U); + } + + /** + * M5: Laser Off + */ + void GcodeSuite::M5() { + planner.synchronize(); + if (FAN_NUM_AS_LASER < FAN_COUNT) fanSpeeds[FAN_NUM_AS_LASER] = 0; + } +#endif diff --git a/Marlin/src/gcode/control/M350_M351.cpp b/Marlin/src/gcode/control/M350_M351.cpp new file mode 100644 index 0000000000..cd75e7b2b1 --- /dev/null +++ b/Marlin/src/gcode/control/M350_M351.cpp @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_MICROSTEPS + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M350: Set axis microstepping modes. S sets mode for all drivers. + * + * Warning: Steps-per-unit remains unchanged. + */ +void GcodeSuite::M350() { + if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.microstep_mode(i, parser.value_byte()); + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte()); + if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte()); + stepper.microstep_readings(); +} + +/** + * M351: Toggle MS1 MS2 pins directly with axis codes X Y Z E B + * S# determines MS1 or MS2, X# sets the pin high/low. + */ +void GcodeSuite::M351() { + if (parser.seenval('S')) switch (parser.value_byte()) { + case 1: + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1); + if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1); + break; + case 2: + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte()); + if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte()); + break; + } + stepper.microstep_readings(); +} + +#endif // HAS_MICROSTEPS diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp new file mode 100644 index 0000000000..5ebca12657 --- /dev/null +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EXT_SOLENOID) + +#include "../gcode.h" +#include "../../feature/solenoid.h" + +/** + * M380: Enable solenoid on the active extruder + */ +void GcodeSuite::M380() { enable_solenoid_on_active_extruder(); } + +/** + * M381: Disable all solenoids + */ +void GcodeSuite::M381() { disable_all_solenoids(); } + +#endif // EXT_SOLENOID diff --git a/Marlin/src/gcode/control/M400.cpp b/Marlin/src/gcode/control/M400.cpp new file mode 100644 index 0000000000..f55f626d09 --- /dev/null +++ b/Marlin/src/gcode/control/M400.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M400: Finish all moves + */ +void GcodeSuite::M400() { + + planner.synchronize(); + +} diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp new file mode 100644 index 0000000000..f197b6e37f --- /dev/null +++ b/Marlin/src/gcode/control/M42.cpp @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../Marlin.h" // for pin_is_protected +#include "../../inc/MarlinConfig.h" + +/** + * M42: Change pin status via GCode + * + * P Pin number (LED if omitted) + * For LPC1768 specify pin P1_02 as M42 P102, + * P1_20 as M42 P120, etc. + * + * S Pin status from 0 - 255 + */ +void GcodeSuite::M42() { + if (!parser.seenval('S')) return; + const byte pin_status = parser.value_byte(); + + const int pin_index = PARSED_PIN_INDEX('P', GET_PIN_MAP_INDEX(LED_PIN)); + if (pin_index < 0) return; + + const pin_t pin = GET_PIN_MAP_PIN(pin_index); + + if (pin_is_protected(pin)) return protected_pin_err(); + + pinMode(pin, OUTPUT); + digitalWrite(pin, pin_status); + analogWrite(pin, pin_status); + + #if FAN_COUNT > 0 + switch (pin) { + #if HAS_FAN0 + case FAN_PIN: fanSpeeds[0] = pin_status; break; + #endif + #if HAS_FAN1 + case FAN1_PIN: fanSpeeds[1] = pin_status; break; + #endif + #if HAS_FAN2 + case FAN2_PIN: fanSpeeds[2] = pin_status; break; + #endif + } + #endif +} diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp new file mode 100644 index 0000000000..13ab424603 --- /dev/null +++ b/Marlin/src/gcode/control/M605.cpp @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" + +#if ENABLED(DUAL_X_CARRIAGE) + + /** + * M605: Set dual x-carriage movement mode + * + * M605 S0: Full control mode. The slicer has full control over x-carriage movement + * M605 S1: Auto-park mode. The inactive head will auto park/unpark without slicer involvement + * M605 S2 [Xnnn] [Rmmm]: Duplication mode. The second extruder will duplicate the first with nnn + * units x-offset and an optional differential hotend temperature of + * mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate + * the first with a spacing of 100mm in the x direction and 2 degrees hotter. + * + * Note: the X axis should be homed after changing dual x-carriage mode. + */ + void GcodeSuite::M605() { + planner.synchronize(); + if (parser.seen('S')) dual_x_carriage_mode = (DualXMode)parser.value_byte(); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + case DXC_AUTO_PARK_MODE: + break; + case DXC_DUPLICATION_MODE: + if (parser.seen('X')) duplicate_extruder_x_offset = MAX(parser.value_linear_units(), X2_MIN_POS - x_home_pos(0)); + if (parser.seen('R')) duplicate_extruder_temp_offset = parser.value_celsius_diff(); + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); + SERIAL_CHAR(' '); + SERIAL_ECHO(hotend_offset[X_AXIS][0]); + SERIAL_CHAR(','); + SERIAL_ECHO(hotend_offset[Y_AXIS][0]); + SERIAL_CHAR(' '); + SERIAL_ECHO(duplicate_extruder_x_offset); + SERIAL_CHAR(','); + SERIAL_ECHOLN(hotend_offset[Y_AXIS][1]); + break; + default: + dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + break; + } + active_extruder_parked = false; + extruder_duplication_enabled = false; + delayed_move_time = 0; + } + +#elif ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + + void GcodeSuite::M605() { + planner.synchronize(); + extruder_duplication_enabled = parser.intval('S') == (int)DXC_DUPLICATION_MODE; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(MSG_DUPLICATION_MODE, extruder_duplication_enabled ? MSG_ON : MSG_OFF); + } + +#endif // DUAL_NOZZLE_DUPLICATION_MODE + +#endif // DUAL_X_CARRIAGE || DUAL_NOZZLE_DUPLICATION_MODE diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp new file mode 100644 index 0000000000..4047049f54 --- /dev/null +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/stepper.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ULTIPANEL) + #include "../../lcd/ultralcd.h" +#endif + +#if HAS_SUICIDE + #include "../../Marlin.h" +#endif + +#if HAS_POWER_SWITCH + + #if ENABLED(AUTO_POWER_CONTROL) + #include "../../feature/power.h" + #endif + + // Could be moved to a feature, but this is all the data + bool powersupply_on = ( + #if ENABLED(PS_DEFAULT_OFF) + false + #else + true + #endif + ); + + #if HAS_TRINAMIC + #include "../../feature/tmc_util.h" + #endif + + /** + * M80 : Turn on the Power Supply + * M80 S : Report the current state and exit + */ + void GcodeSuite::M80() { + + // S: Report the current power supply state and exit + if (parser.seen('S')) { + serialprintPGM(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); + return; + } + + PSU_ON(); + + /** + * If you have a switch on suicide pin, this is useful + * if you want to start another print with suicide feature after + * a print without suicide... + */ + #if HAS_SUICIDE + OUT_WRITE(SUICIDE_PIN, HIGH); + #endif + + #if DISABLED(AUTO_POWER_CONTROL) + delay(100); // Wait for power to settle + restore_stepper_drivers(); + #endif + + #if ENABLED(ULTIPANEL) + lcd_reset_status(); + #endif + } + +#endif // HAS_POWER_SWITCH + +/** + * M81: Turn off Power, including Power Supply, if there is one. + * + * This code should ALWAYS be available for EMERGENCY SHUTDOWN! + */ +void GcodeSuite::M81() { + thermalManager.disable_all_heaters(); + planner.finish_and_disable(); + + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #if ENABLED(PROBING_FANS_OFF) + fans_paused = false; + ZERO(paused_fanSpeeds); + #endif + #endif + + safe_delay(1000); // Wait 1 second before switching off + + #if HAS_SUICIDE + suicide(); + #elif HAS_POWER_SWITCH + PSU_OFF(); + #endif + + #if ENABLED(ULTIPANEL) + LCD_MESSAGEPGM(MACHINE_NAME " " MSG_OFF "."); + #endif +} diff --git a/Marlin/src/gcode/control/M85.cpp b/Marlin/src/gcode/control/M85.cpp new file mode 100644 index 0000000000..2d8ab08b99 --- /dev/null +++ b/Marlin/src/gcode/control/M85.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../Marlin.h" // for max_inactive_time + +/** + * M85: Set inactivity shutdown timer with parameter S. To disable set zero (default) + */ +void GcodeSuite::M85() { + + if (parser.seen('S')) max_inactive_time = parser.value_millis_from_seconds(); + +} diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp new file mode 100644 index 0000000000..12c2cfdc59 --- /dev/null +++ b/Marlin/src/gcode/control/M999.cpp @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" + +#include "../../lcd/ultralcd.h" // for lcd_reset_alert_level +#include "../../Marlin.h" // for Running +#include "../queue.h" // for flush_and_request_resend + +/** + * M999: Restart after being stopped + * + * Default behaviour is to flush the serial buffer and request + * a resend to the host starting on the last N line received. + * + * Sending "M999 S1" will resume printing without flushing the + * existing command buffer. + * + */ +void GcodeSuite::M999() { + Running = true; + lcd_reset_alert_level(); + + if (parser.boolval('S')) return; + + // gcode_LastN = Stopped_gcode_LastN; + flush_and_request_resend(); +} diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp new file mode 100644 index 0000000000..3911b8fbc4 --- /dev/null +++ b/Marlin/src/gcode/control/T.cpp @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/tool_change.h" + +#if ENABLED(DEBUG_LEVELING_FEATURE) || HOTENDS > 1 + #include "../../module/motion.h" +#endif + +/** + * T0-T3: Switch tool, usually switching extruders + * + * F[units/min] Set the movement feedrate + * S1 Don't move the tool in XY after change + */ +void GcodeSuite::T(const uint8_t tmp_extruder) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> T(", tmp_extruder); + SERIAL_CHAR(')'); + SERIAL_EOL(); + DEBUG_POS("BEFORE", current_position); + } + #endif + + #if HOTENDS == 1 || (ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1) + + tool_change(tmp_extruder); + + #elif HOTENDS > 1 + + tool_change( + tmp_extruder, + MMM_TO_MMS(parser.linearval('F')), + (tmp_extruder == active_extruder) || parser.boolval('S') + ); + + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + DEBUG_POS("AFTER", current_position); + SERIAL_ECHOLNPGM("<<< T()"); + } + #endif +} diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp new file mode 100644 index 0000000000..8c5e3af9df --- /dev/null +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/configuration_store.h" +#include "../../core/serial.h" +#include "../../inc/MarlinConfig.h" + +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +#if ADD_PORT_ARG + #define CHAT_PORT command_queue_port[cmd_queue_index_r] +#else + #define CHAT_PORT +#endif + +/** + * M500: Store settings in EEPROM + */ +void GcodeSuite::M500() { + (void)settings.save(CHAT_PORT); +} + +/** + * M501: Read settings from EEPROM + */ +void GcodeSuite::M501() { + (void)settings.load( + #if ENABLED(EEPROM_SETTINGS) + CHAT_PORT + #endif + ); +} + +/** + * M502: Revert to default settings + */ +void GcodeSuite::M502() { + (void)settings.reset(CHAT_PORT); +} + +#if DISABLED(DISABLE_M503) + + /** + * M503: print settings currently in memory + */ + void GcodeSuite::M503() { + (void)settings.report( + parser.seen('S') && !parser.value_bool() + #if NUM_SERIAL > 1 + , command_queue_port[cmd_queue_index_r] + #endif + ); + } + +#endif // !DISABLE_M503 + +#if ENABLED(EEPROM_SETTINGS) + /** + * M504: Validate EEPROM Contents + */ + void GcodeSuite::M504() { + if (settings.validate(CHAT_PORT)) { + SERIAL_ECHO_START_P(command_queue_port[cmd_queue_index_r]); + SERIAL_ECHOLNPGM_P(command_queue_port[cmd_queue_index_r], "EEPROM OK"); + } + } +#endif diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp new file mode 100644 index 0000000000..3627869a06 --- /dev/null +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(LIN_ADVANCE) + +#include "../../gcode.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" + +/** + * M900: Get or Set Linear Advance K-factor + * + * K Set advance K factor + */ +void GcodeSuite::M900() { + if (parser.seenval('K')) { + const float newK = parser.floatval('K'); + if (WITHIN(newK, 0, 10)) { + planner.synchronize(); + planner.extruder_advance_K = newK; + } + else + SERIAL_PROTOCOLLNPGM("?K value out of range (0-10)."); + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K); + } +} + +#endif // LIN_ADVANCE diff --git a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp new file mode 100644 index 0000000000..aaad59f465 --- /dev/null +++ b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(BARICUDA) + +#include "../../gcode.h" +#include "../../../feature/baricuda.h" + +#if HAS_HEATER_1 + + /** + * M126: Heater 1 valve open + */ + void GcodeSuite::M126() { baricuda_valve_pressure = parser.byteval('S', 255); } + + /** + * M127: Heater 1 valve close + */ + void GcodeSuite::M127() { baricuda_valve_pressure = 0; } + +#endif // HAS_HEATER_1 + +#if HAS_HEATER_2 + + /** + * M128: Heater 2 valve open + */ + void GcodeSuite::M128() { baricuda_e_to_p_pressure = parser.byteval('S', 255); } + + /** + * M129: Heater 2 valve close + */ + void GcodeSuite::M129() { baricuda_e_to_p_pressure = 0; } + +#endif // HAS_HEATER_2 + +#endif // BARICUDA diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp new file mode 100644 index 0000000000..9d729acf33 --- /dev/null +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -0,0 +1,61 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if defined(CHDK) || HAS_PHOTOGRAPH + +#include "../../gcode.h" + +/** + * M240: Trigger a camera by emulating a Canon RC-1 + * See http://www.doc-diy.net/photo/rc-1_hacked/ + */ +void GcodeSuite::M240() { + #ifdef CHDK + + OUT_WRITE(CHDK, HIGH); + chdkHigh = millis(); + chdkActive = true; + + #elif HAS_PHOTOGRAPH + + const uint8_t NUM_PULSES = 16; + const float PULSE_LENGTH = 0.01524; + for (int i = 0; i < NUM_PULSES; i++) { + WRITE(PHOTOGRAPH_PIN, HIGH); + _delay_ms(PULSE_LENGTH); + WRITE(PHOTOGRAPH_PIN, LOW); + _delay_ms(PULSE_LENGTH); + } + delay(7.33); + for (int i = 0; i < NUM_PULSES; i++) { + WRITE(PHOTOGRAPH_PIN, HIGH); + _delay_ms(PULSE_LENGTH); + WRITE(PHOTOGRAPH_PIN, LOW); + _delay_ms(PULSE_LENGTH); + } + + #endif +} + +#endif // CHDK || HAS_PHOTOGRAPH diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp new file mode 100644 index 0000000000..f22936d13c --- /dev/null +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../gcode.h" + +#include "../../../inc/MarlinConfig.h" + +#if HAS_CASE_LIGHT + #include "../../../feature/caselight.h" +#endif + +/** + * M355: Turn case light on/off and set brightness + * + * P Set case light brightness (PWM pin required - ignored otherwise) + * + * S Set case light on/off + * + * When S turns on the light on a PWM pin then the current brightness level is used/restored + * + * M355 P200 S0 turns off the light & sets the brightness level + * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) + */ +void GcodeSuite::M355() { + #if HAS_CASE_LIGHT + uint8_t args = 0; + if (parser.seenval('P')) { + ++args, case_light_brightness = parser.value_byte(); + case_light_arg_flag = false; + } + if (parser.seenval('S')) { + ++args, case_light_on = parser.value_bool(); + case_light_arg_flag = true; + } + if (args) update_case_light(); + + // always report case light status + SERIAL_ECHO_START(); + if (!case_light_on) { + SERIAL_ECHOLNPGM("Case light: off"); + } + else { + if (!USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM("Case light: on"); + else SERIAL_ECHOLNPAIR("Case light: ", case_light_brightness); + } + #else + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M355_NONE); + #endif +} diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp new file mode 100644 index 0000000000..dbd9dd3ce3 --- /dev/null +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + +#include "../../../libs/nozzle.h" + +#include "../../gcode.h" +#include "../../parser.h" +#include "../../../module/motion.h" + +/** + * G12: Clean the nozzle + */ +void GcodeSuite::G12() { + // Don't allow nozzle cleaning without homing first + if (axis_unhomed_error()) return; + + const uint8_t pattern = parser.ushortval('P', 0), + strokes = parser.ushortval('S', NOZZLE_CLEAN_STROKES), + objects = parser.ushortval('T', NOZZLE_CLEAN_TRIANGLES); + const float radius = parser.floatval('R', NOZZLE_CLEAN_CIRCLE_RADIUS); + + Nozzle::clean(pattern, strokes, radius, objects); +} + +#endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp new file mode 100644 index 0000000000..10849f2eb8 --- /dev/null +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) + +#include "../../gcode.h" + +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + #include "../../../module/stepper.h" +#endif + +#if ENABLED(DIGIPOT_I2C) + #include "../../../feature/digipot/digipot.h" +#endif + +#if ENABLED(DAC_STEPPER_CURRENT) + #include "../../../feature/dac/stepper_dac.h" +#endif + +/** + * M907: Set digital trimpot motor current using axis codes X, Y, Z, E, B, S + */ +void GcodeSuite::M907() { + #if HAS_DIGIPOTSS + + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.digipot_current(i, parser.value_int()); + if (parser.seen('B')) stepper.digipot_current(4, parser.value_int()); + if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.digipot_current(i, parser.value_int()); + + #elif HAS_MOTOR_CURRENT_PWM + + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + if (parser.seen('X')) stepper.digipot_current(0, parser.value_int()); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + if (parser.seen('Z')) stepper.digipot_current(1, parser.value_int()); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + if (parser.seen('E')) stepper.digipot_current(2, parser.value_int()); + #endif + + #endif + + #if ENABLED(DIGIPOT_I2C) + // this one uses actual amps in floating point + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) digipot_i2c_set_current(i, parser.value_float()); + // for each additional extruder (named B,C,D,E..., channels 4,5,6,7...) + for (uint8_t i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (parser.seen('B' + i - (NUM_AXIS))) digipot_i2c_set_current(i, parser.value_float()); + #endif + + #if ENABLED(DAC_STEPPER_CURRENT) + if (parser.seen('S')) { + const float dac_percent = parser.value_float(); + for (uint8_t i = 0; i <= 4; i++) dac_current_percent(i, dac_percent); + } + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) dac_current_percent(i, parser.value_float()); + #endif +} + +#if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) + + /** + * M908: Control digital trimpot directly (M908 P S) + */ + void GcodeSuite::M908() { + #if HAS_DIGIPOTSS + stepper.digitalPotWrite( + parser.intval('P'), + parser.intval('S') + ); + #endif + #if ENABLED(DAC_STEPPER_CURRENT) + dac_current_raw( + parser.byteval('P', -1), + parser.ushortval('S', 0) + ); + #endif + } + +#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT + +#if ENABLED(DAC_STEPPER_CURRENT) + + void GcodeSuite::M909() { dac_print_values(); } + void GcodeSuite::M910() { dac_commit_eeprom(); } + +#endif // DAC_STEPPER_CURRENT + +#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT || HAS_MOTOR_CURRENT_PWM || DIGIPOT_I2C diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp new file mode 100644 index 0000000000..a096feef17 --- /dev/null +++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + +#include "../../../feature/filwidth.h" +#include "../../../module/planner.h" +#include "../../../module/temperature.h" +#include "../../../Marlin.h" +#include "../../gcode.h" + +/** + * M404: Display or set (in current units) the nominal filament width (3mm, 1.75mm ) W<3.0> + */ +void GcodeSuite::M404() { + if (parser.seen('W')) { + filament_width_nominal = parser.value_linear_units(); + planner.volumetric_area_nominal = CIRCLE_AREA(filament_width_nominal * 0.5); + } + else { + SERIAL_PROTOCOLPGM("Filament dia (nominal mm):"); + SERIAL_PROTOCOLLN(filament_width_nominal); + } +} + +/** + * M405: Turn on filament sensor for control + */ +void GcodeSuite::M405() { + // This is technically a linear measurement, but since it's quantized to centimeters and is a different + // unit than everything else, it uses parser.value_byte() instead of parser.value_linear_units(). + if (parser.seen('D')) { + meas_delay_cm = parser.value_byte(); + NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); + } + + if (filwidth_delay_index[1] == -1) { // Initialize the ring buffer if not done since startup + const int8_t temp_ratio = thermalManager.widthFil_to_size_ratio(); + + for (uint8_t i = 0; i < COUNT(measurement_delay); ++i) + measurement_delay[i] = temp_ratio; + + filwidth_delay_index[0] = filwidth_delay_index[1] = 0; + } + + filament_sensor = true; +} + +/** + * M406: Turn off filament sensor for control + */ +void GcodeSuite::M406() { + filament_sensor = false; + planner.calculate_volumetric_multipliers(); // Restore correct 'volumetric_multiplier' value +} + +/** + * M407: Get measured filament diameter on serial output + */ +void GcodeSuite::M407() { + SERIAL_PROTOCOLPGM("Filament dia (measured mm):"); + SERIAL_PROTOCOLLN(filament_width_meas); +} + +#endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp new file mode 100644 index 0000000000..9231386d35 --- /dev/null +++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(FWRETRACT) + +#include "../../../feature/fwretract.h" +#include "../../gcode.h" +#include "../../../module/motion.h" + +/** + * G10 - Retract filament according to settings of M207 + */ +void GcodeSuite::G10() { + #if EXTRUDERS > 1 + const bool rs = parser.boolval('S'); + #endif + fwretract.retract(true + #if EXTRUDERS > 1 + , rs + #endif + ); +} + +/** + * G11 - Recover filament according to settings of M208 + */ +void GcodeSuite::G11() { fwretract.retract(false); } + +#endif // FWRETRACT diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp new file mode 100644 index 0000000000..827f03ebb0 --- /dev/null +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(FWRETRACT) + +#include "../../../feature/fwretract.h" +#include "../../gcode.h" + +/** + * M207: Set firmware retraction values + * + * S[+units] retract_length + * W[+units] swap_retract_length (multi-extruder) + * F[units/min] retract_feedrate_mm_s + * Z[units] retract_zlift + */ +void GcodeSuite::M207() { + if (parser.seen('S')) fwretract.retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('Z')) fwretract.retract_zlift = parser.value_linear_units(); + if (parser.seen('W')) fwretract.swap_retract_length = parser.value_axis_units(E_AXIS); +} + +/** + * M208: Set firmware un-retraction values + * + * S[+units] retract_recover_length (in addition to M207 S*) + * W[+units] swap_retract_recover_length (multi-extruder) + * F[units/min] retract_recover_feedrate_mm_s + * R[units/min] swap_retract_recover_feedrate_mm_s + */ +void GcodeSuite::M208() { + if (parser.seen('S')) fwretract.retract_recover_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('R')) fwretract.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('W')) fwretract.swap_retract_recover_length = parser.value_axis_units(E_AXIS); +} + +/** + * M209: Enable automatic retract (M209 S1) + * For slicers that don't support G10/11, reversed extrude-only + * moves will be classified as retraction. + */ +void GcodeSuite::M209() { + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { + if (parser.seen('S')) { + fwretract.enable_autoretract(parser.value_bool()); + } + } +} + +#endif // FWRETRACT diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp new file mode 100644 index 0000000000..918e764c40 --- /dev/null +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(EXPERIMENTAL_I2CBUS) + +#include "../../gcode.h" + +#include "../../../Marlin.h" // for i2c + +/** + * M260: Send data to a I2C slave device + * + * This is a PoC, the formating and arguments for the GCODE will + * change to be more compatible, the current proposal is: + * + * M260 A ; Sets the I2C slave address the data will be sent to + * + * M260 B + * M260 B + * M260 B + * + * M260 S1 ; Send the buffered data and reset the buffer + * M260 R1 ; Reset the buffer without sending data + * + */ +void GcodeSuite::M260() { + // Set the target address + if (parser.seen('A')) i2c.address(parser.value_byte()); + + // Add a new byte to the buffer + if (parser.seen('B')) i2c.addbyte(parser.value_byte()); + + // Flush the buffer to the bus + if (parser.seen('S')) i2c.send(); + + // Reset and rewind the buffer + else if (parser.seen('R')) i2c.reset(); +} + +/** + * M261: Request X bytes from I2C slave device + * + * Usage: M261 A B + */ +void GcodeSuite::M261() { + if (parser.seen('A')) i2c.address(parser.value_byte()); + + uint8_t bytes = parser.byteval('B', 1); + + if (i2c.addr && bytes && bytes <= TWIBUS_BUFFER_SIZE) { + i2c.relay(bytes); + } + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Bad i2c request"); + } +} + +#endif diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp new file mode 100644 index 0000000000..7eb8eb70de --- /dev/null +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_COLOR_LEDS + +#include "../../gcode.h" +#include "../../../feature/leds/leds.h" + +/** + * M150: Set Status LED Color - Use R-U-B-W for R-G-B-W + * and Brightness - Use P (for NEOPIXEL only) + * + * Always sets all 3 or 4 components. If a component is left out, set to 0. + * If brightness is left out, no value changed + * + * Examples: + * + * M150 R255 ; Turn LED red + * M150 R255 U127 ; Turn LED orange (PWM only) + * M150 ; Turn LED off + * M150 R U B ; Turn LED white + * M150 W ; Turn LED white using a white LED + * M150 P127 ; Set LED 50% brightness + * M150 P ; Set LED full brightness + */ +void GcodeSuite::M150() { + leds.set_color(MakeLEDColor( + parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, + parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, + parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, + parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, + parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : pixels.getBrightness() + )); +} + +#endif // HAS_COLOR_LEDS diff --git a/Marlin/src/gcode/feature/mixing/M163-M165.cpp b/Marlin/src/gcode/feature/mixing/M163-M165.cpp new file mode 100644 index 0000000000..34d84163ea --- /dev/null +++ b/Marlin/src/gcode/feature/mixing/M163-M165.cpp @@ -0,0 +1,85 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MIXING_EXTRUDER) + +#include "../../gcode.h" +#include "../../../feature/mixing.h" + +/** + * M163: Set a single mix factor for a mixing extruder + * This is called "weight" by some systems. + * + * S[index] The channel index to set + * P[float] The mix value + * + */ +void GcodeSuite::M163() { + const int mix_index = parser.intval('S'); + if (mix_index < MIXING_STEPPERS) { + float mix_value = parser.floatval('P'); + NOLESS(mix_value, 0.0); + mixing_factor[mix_index] = RECIPROCAL(mix_value); + } +} + +#if MIXING_VIRTUAL_TOOLS > 1 + + /** + * M164: Store the current mix factors as a virtual tool. + * + * S[index] The virtual tool to store + * + */ + void GcodeSuite::M164() { + const int tool_index = parser.intval('S'); + if (tool_index < MIXING_VIRTUAL_TOOLS) { + normalize_mix(); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[tool_index][i] = mixing_factor[i]; + } + } + +#endif // MIXING_VIRTUAL_TOOLS > 1 + +#if ENABLED(DIRECT_MIXING_IN_G1) + + /** + * M165: Set multiple mix factors for a mixing extruder. + * Factors that are left out will be set to 0. + * All factors together must add up to 1.0. + * + * A[factor] Mix factor for extruder stepper 1 + * B[factor] Mix factor for extruder stepper 2 + * C[factor] Mix factor for extruder stepper 3 + * D[factor] Mix factor for extruder stepper 4 + * H[factor] Mix factor for extruder stepper 5 + * I[factor] Mix factor for extruder stepper 6 + * + */ + void GcodeSuite::M165() { gcode_get_mix(); } + +#endif // DIRECT_MIXING_IN_G1 + +#endif // MIXING_EXTRUDER diff --git a/Marlin/src/gcode/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp new file mode 100644 index 0000000000..b7e77928a2 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(NOZZLE_PARK_FEATURE) + +#include "../../gcode.h" +#include "../../../libs/nozzle.h" +#include "../../../module/motion.h" + +/** + * G27: Park the nozzle + */ +void GcodeSuite::G27() { + // Don't allow nozzle parking without homing first + if (axis_unhomed_error()) return; + Nozzle::park(parser.ushortval('P')); +} + +#endif // NOZZLE_PARK_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp new file mode 100644 index 0000000000..fbba475f2a --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(PARK_HEAD_ON_PAUSE) + +#include "../../gcode.h" +#include "../../parser.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" + +#if DISABLED(SDSUPPORT) + #include "../../../module/printcounter.h" +#endif + +/** + * M125: Store current position and move to filament change position. + * Called on pause (by M25) to prevent material leaking onto the + * object. On resume (M24) the head will be moved back and the + * print will resume. + * + * If Marlin is compiled without SD Card support, M125 can be + * used directly to pause the print and move to park position, + * resuming with a button click or M108. + * + * L = override retract length + * X = override X + * Y = override Y + * Z = override Z raise + */ +void GcodeSuite::M125() { + // Initial retract before move to filament change position + const float retract = -ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : 0 + #ifdef PAUSE_PARK_RETRACT_LENGTH + + (PAUSE_PARK_RETRACT_LENGTH) + #endif + ); + + point_t park_point = NOZZLE_PARK_POINT; + + // Move XY axes to filament change position or given position + if (parser.seenval('X')) park_point.x = parser.linearval('X'); + if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); + + // Lift Z axis + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + #if HOTENDS > 1 && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) + park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); + park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); + #endif + + #if DISABLED(SDSUPPORT) + const bool job_running = print_job_timer.isRunning(); + #endif + + if (pause_print(retract, park_point)) { + #if DISABLED(SDSUPPORT) + // Wait for lcd click or M108 + wait_for_filament_reload(); + + // Return to print position and continue + resume_print(); + + if (job_running) print_job_timer.start(); + #endif + } +} + +#endif // PARK_HEAD_ON_PAUSE diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp new file mode 100644 index 0000000000..be03c736c9 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -0,0 +1,131 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../../gcode.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" +#include "../../../module/printcounter.h" + +#if EXTRUDERS > 1 + #include "../../../module/tool_change.h" +#endif + +#if ENABLED(ULTIPANEL) + #include "../../../lcd/ultralcd.h" +#endif + +/** + * M600: Pause for filament change + * + * E[distance] - Retract the filament this far + * Z[distance] - Move the Z axis by this distance + * X[position] - Move to this X position, with Y + * Y[position] - Move to this Y position, with X + * U[distance] - Retract distance for removal (manual reload) + * L[distance] - Extrude distance for insertion (manual reload) + * B[count] - Number of times to beep, -1 for indefinite (if equipped with a buzzer) + * T[toolhead] - Select extruder for filament change + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M600() { + point_t park_point = NOZZLE_PARK_POINT; + + if (get_target_extruder_from_command()) return; + + // Show initial "wait for start" message + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, target_extruder); + #endif + + #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) + // Don't allow filament change without homing first + if (axis_unhomed_error()) home_all_axes(); + #endif + + #if EXTRUDERS > 1 + // Change toolhead if specified + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, 0, true); + #endif + + // Initial retract before move to filament change position + const float retract = -ABS(parser.seen('E') ? parser.value_axis_units(E_AXIS) : 0 + #ifdef PAUSE_PARK_RETRACT_LENGTH + + (PAUSE_PARK_RETRACT_LENGTH) + #endif + ); + + // Lift Z axis + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Move XY axes to filament change position or given position + if (parser.seenval('X')) park_point.x = parser.linearval('X'); + if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); + + #if HOTENDS > 1 && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) + park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); + park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); + #endif + + // Unload filament + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) + : filament_change_unload_length[active_extruder]); + + // Slow load filament + constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + + // Fast load filament + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : filament_change_load_length[active_extruder]); + + const int beep_count = parser.intval('B', + #ifdef FILAMENT_CHANGE_ALERT_BEEPS + FILAMENT_CHANGE_ALERT_BEEPS + #else + -1 + #endif + ); + + const bool job_running = print_job_timer.isRunning(); + + if (pause_print(retract, park_point, unload_length, true)) { + wait_for_filament_reload(beep_count); + resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, beep_count); + } + + #if EXTRUDERS > 1 + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, 0, true); + #endif + + // Resume the print job timer if it was running + if (job_running) print_job_timer.start(); +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp new file mode 100644 index 0000000000..a6231c3169 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -0,0 +1,65 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../../gcode.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" +#include "../../../module/printcounter.h" + +#if EXTRUDERS > 1 + #include "../../../module/tool_change.h" +#endif + +/** + * M603: Configure filament change + * + * T[toolhead] - Select extruder to configure, active extruder if not specified + * U[distance] - Retract distance for removal, for the specified extruder + * L[distance] - Extrude distance for insertion, for the specified extruder + * + */ +void GcodeSuite::M603() { + + if (get_target_extruder_from_command()) return; + + // Unload length + if (parser.seen('U')) { + filament_change_unload_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS)); + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + NOMORE(filament_change_unload_length[target_extruder], EXTRUDE_MAXLENGTH); + #endif + } + + // Load length + if (parser.seen('L')) { + filament_change_load_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS)); + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + NOMORE(filament_change_load_length[target_extruder], EXTRUDE_MAXLENGTH); + #endif + } +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp new file mode 100644 index 0000000000..5dd37de6cc --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -0,0 +1,175 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + +#include "../../gcode.h" +#include "../../../Marlin.h" +#include "../../../module/motion.h" +#include "../../../module/temperature.h" +#include "../../../libs/point_t.h" + +#if EXTRUDERS > 1 + #include "../../../module/tool_change.h" +#endif + +#if ENABLED(ULTIPANEL) + #include "../../../lcd/ultralcd.h" +#endif + +/** + * M701: Load filament + * + * T[extruder] - Optional extruder number. Current extruder if omitted. + * Z[distance] - Move the Z axis by this distance + * L[distance] - Extrude distance for insertion (positive value) (manual reload) + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M701() { + point_t park_point = NOZZLE_PARK_POINT; + + #if ENABLED(NO_MOTION_BEFORE_HOMING) + // Only raise Z if the machine is homed + if (axis_unhomed_error()) park_point.z = 0; + #endif + + if (get_target_extruder_from_command()) return; + + // Z axis lift + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Show initial "wait for load" message + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, ADVANCED_PAUSE_MODE_LOAD_FILAMENT, target_extruder); + #endif + + #if EXTRUDERS > 1 + // Change toolhead if specified + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, 0, true); + #endif + + // Lift Z axis + if (park_point.z > 0) + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); + + // Load filament + constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : filament_change_load_length[active_extruder]); + load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS, + true, thermalManager.wait_for_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT); + + // Restore Z axis + if (park_point.z > 0) + do_blocking_move_to_z(MAX(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); + + #if EXTRUDERS > 1 + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, 0, true); + #endif + + // Show status screen + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif +} + +/** + * M702: Unload filament + * + * T[extruder] - Optional extruder number. If omitted, current extruder + * (or ALL extruders with FILAMENT_UNLOAD_ALL_EXTRUDERS). + * Z[distance] - Move the Z axis by this distance + * U[distance] - Retract distance for removal (manual reload) + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M702() { + point_t park_point = NOZZLE_PARK_POINT; + + #if ENABLED(NO_MOTION_BEFORE_HOMING) + // Only raise Z if the machine is homed + if (axis_unhomed_error()) park_point.z = 0; + #endif + + if (get_target_extruder_from_command()) return; + + // Z axis lift + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Show initial "wait for unload" message + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, target_extruder); + #endif + + #if EXTRUDERS > 1 + // Change toolhead if specified + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, 0, true); + #endif + + // Lift Z axis + if (park_point.z > 0) + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); + + // Unload filament + #if EXTRUDERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + if (!parser.seenval('T')) { + HOTEND_LOOP() { + if (e != active_extruder) tool_change(e, 0, true); + unload_filament(-filament_change_unload_length[e], true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); + } + } + else + #endif + { + // Unload length + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) : + filament_change_unload_length[target_extruder]); + + unload_filament(unload_length, true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); + } + + // Restore Z axis + if (park_point.z > 0) + do_blocking_move_to_z(MAX(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); + + #if EXTRUDERS > 1 + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, 0, true); + #endif + + // Show status screen + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp new file mode 100644 index 0000000000..42899613d3 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(TMC_DEBUG) + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" + +/** + * M122: Debug TMC drivers + */ +void GcodeSuite::M122() { + if (parser.seen('S')) + tmc_set_report_status(parser.value_bool()); + else + tmc_report_all(); +} + +#endif // TMC_DEBUG diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp new file mode 100644 index 0000000000..1ac22641cf --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -0,0 +1,136 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TRINAMIC + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper_indirection.h" + +/** + * M906: Set motor current in milliamps using axis codes X, Y, Z, E + * Report driver currents when no axis specified + */ +void GcodeSuite::M906() { + #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q, TMC_##Q) + #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value) + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { + report = false; + switch (i) { + case X_AXIS: + #if X_IS_TRINAMIC + if (index == 0) TMC_SET_CURRENT(X); + #endif + #if X2_IS_TRINAMIC + if (index == 1) TMC_SET_CURRENT(X2); + #endif + break; + case Y_AXIS: + #if Y_IS_TRINAMIC + if (index == 0) TMC_SET_CURRENT(Y); + #endif + #if Y2_IS_TRINAMIC + if (index == 1) TMC_SET_CURRENT(Y2); + #endif + break; + case Z_AXIS: + #if Z_IS_TRINAMIC + if (index == 0) TMC_SET_CURRENT(Z); + #endif + #if Z2_IS_TRINAMIC + if (index == 1) TMC_SET_CURRENT(Z2); + #endif + break; + case E_AXIS: { + if (get_target_extruder_from_command()) return; + switch (target_extruder) { + #if E0_IS_TRINAMIC + case 0: TMC_SET_CURRENT(E0); break; + #endif + #if E1_IS_TRINAMIC + case 1: TMC_SET_CURRENT(E1); break; + #endif + #if E2_IS_TRINAMIC + case 2: TMC_SET_CURRENT(E2); break; + #endif + #if E3_IS_TRINAMIC + case 3: TMC_SET_CURRENT(E3); break; + #endif + #if E4_IS_TRINAMIC + case 4: TMC_SET_CURRENT(E4); break; + #endif + } + } break; + } + } + + if (report) LOOP_XYZE(i) switch (i) { + case X_AXIS: + #if X_IS_TRINAMIC + TMC_SAY_CURRENT(X); + #endif + #if X2_IS_TRINAMIC + TMC_SAY_CURRENT(X2); + #endif + break; + case Y_AXIS: + #if Y_IS_TRINAMIC + TMC_SAY_CURRENT(Y); + #endif + #if Y2_IS_TRINAMIC + TMC_SAY_CURRENT(Y2); + #endif + break; + case Z_AXIS: + #if Z_IS_TRINAMIC + TMC_SAY_CURRENT(Z); + #endif + #if Z2_IS_TRINAMIC + TMC_SAY_CURRENT(Z2); + #endif + break; + case E_AXIS: + #if E0_IS_TRINAMIC + TMC_SAY_CURRENT(E0); + #endif + #if E1_IS_TRINAMIC + TMC_SAY_CURRENT(E1); + #endif + #if E2_IS_TRINAMIC + TMC_SAY_CURRENT(E2); + #endif + #if E3_IS_TRINAMIC + TMC_SAY_CURRENT(E3); + #endif + #if E4_IS_TRINAMIC + TMC_SAY_CURRENT(E4); + #endif + break; + } +} + +#endif // HAS_TRINAMIC diff --git a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp new file mode 100644 index 0000000000..8a59837658 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp @@ -0,0 +1,370 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TRINAMIC + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper_indirection.h" +#include "../../../module/planner.h" +#include "../../queue.h" + +#define M91x_USE(A) (ENABLED(A##_IS_TMC2130) || (ENABLED(A##_IS_TMC2208) && PIN_EXISTS(A##_SERIAL_RX))) +#define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) +#define M91x_USE_X (ENABLED(IS_TRAMS) || M91x_USE(X)) +#define M91x_USE_Y (ENABLED(IS_TRAMS) || M91x_USE(Y)) +#define M91x_USE_Z (ENABLED(IS_TRAMS) || M91x_USE(Z)) +#define M91x_USE_E0 (ENABLED(IS_TRAMS) || M91x_USE_E(0)) + +/** + * M911: Report TMC stepper driver overtemperature pre-warn flag + * This flag is held by the library, persisting until cleared by M912 + */ +void GcodeSuite::M911() { + #if M91x_USE_X + tmc_report_otpw(stepperX, TMC_X); + #endif + #if M91x_USE(X2) + tmc_report_otpw(stepperX2, TMC_X2); + #endif + #if M91x_USE_Y + tmc_report_otpw(stepperY, TMC_Y); + #endif + #if M91x_USE(Y2) + tmc_report_otpw(stepperY2, TMC_Y2); + #endif + #if M91x_USE_Z + tmc_report_otpw(stepperZ, TMC_Z); + #endif + #if M91x_USE(Z2) + tmc_report_otpw(stepperZ2, TMC_Z2); + #endif + #if M91x_USE_E0 + tmc_report_otpw(stepperE0, TMC_E0); + #endif + #if M91x_USE_E(1) + tmc_report_otpw(stepperE1, TMC_E1); + #endif + #if M91x_USE_E(2) + tmc_report_otpw(stepperE2, TMC_E2); + #endif + #if M91x_USE_E(3) + tmc_report_otpw(stepperE3, TMC_E3); + #endif + #if M91x_USE_E(4) + tmc_report_otpw(stepperE4, TMC_E4); + #endif +} + +/** + * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library + * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, and E[index]. + * If no axes are given, clear all. + * + * Examples: + * M912 X ; clear X and X2 + * M912 X1 ; clear X1 only + * M912 X2 ; clear X2 only + * M912 X E ; clear X, X2, and all E + * M912 E1 ; clear E1 only + */ +void GcodeSuite::M912() { + const bool hasX = parser.seen(axis_codes[X_AXIS]), + hasY = parser.seen(axis_codes[Y_AXIS]), + hasZ = parser.seen(axis_codes[Z_AXIS]), + hasE = parser.seen(axis_codes[E_AXIS]), + hasNone = !hasX && !hasY && !hasZ && !hasE; + + #if M91x_USE_X || M91x_USE(X2) + const uint8_t xval = parser.byteval(axis_codes[X_AXIS], 10); + #if M91x_USE_X + if (hasNone || xval == 1 || (hasX && xval == 10)) tmc_clear_otpw(stepperX, TMC_X); + #endif + #if M91x_USE(X2) + if (hasNone || xval == 2 || (hasX && xval == 10)) tmc_clear_otpw(stepperX2, TMC_X2); + #endif + #endif + + #if M91x_USE_Y || M91x_USE(Y2) + const uint8_t yval = parser.byteval(axis_codes[Y_AXIS], 10); + #if M91x_USE_Y + if (hasNone || yval == 1 || (hasY && yval == 10)) tmc_clear_otpw(stepperY, TMC_Y); + #endif + #if M91x_USE(Y2) + if (hasNone || yval == 2 || (hasY && yval == 10)) tmc_clear_otpw(stepperY2, TMC_Y2); + #endif + #endif + + #if M91x_USE_Z || M91x_USE(Z2) + const uint8_t zval = parser.byteval(axis_codes[Z_AXIS], 10); + #if M91x_USE_Z + if (hasNone || zval == 1 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ, TMC_Z); + #endif + #if M91x_USE(Z2) + if (hasNone || zval == 2 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ2, TMC_Z2); + #endif + #endif + + #if M91x_USE_E0 || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) + const uint8_t eval = parser.byteval(axis_codes[E_AXIS], 10); + #if M91x_USE_E0 + if (hasNone || eval == 0 || (hasE && eval == 10)) tmc_clear_otpw(stepperE0, TMC_E0); + #endif + #if M91x_USE_E(1) + if (hasNone || eval == 1 || (hasE && eval == 10)) tmc_clear_otpw(stepperE1, TMC_E1); + #endif + #if M91x_USE_E(2) + if (hasNone || eval == 2 || (hasE && eval == 10)) tmc_clear_otpw(stepperE2, TMC_E2); + #endif + #if M91x_USE_E(3) + if (hasNone || eval == 3 || (hasE && eval == 10)) tmc_clear_otpw(stepperE3, TMC_E3); + #endif + #if M91x_USE_E(4) + if (hasNone || eval == 4 || (hasE && eval == 10)) tmc_clear_otpw(stepperE4, TMC_E4); + #endif + #endif +} + +/** + * M913: Set HYBRID_THRESHOLD speed. + */ +#if ENABLED(HYBRID_THRESHOLD) + void GcodeSuite::M913() { + #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, TMC_##Q, planner.axis_steps_per_mm[_AXIS(A)]) + #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)]) + #define TMC_SAY_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, TMC_E##E, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) + #define TMC_SET_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZE(i) if (int32_t value = parser.longval(axis_codes[i])) { + report = false; + switch (i) { + case X_AXIS: + #if X_IS_TRINAMIC + if (index == 0) TMC_SET_PWMTHRS(X,X); + #endif + #if X2_IS_TRINAMIC + if (index == 1) TMC_SET_PWMTHRS(X,X2); + #endif + break; + case Y_AXIS: + #if Y_IS_TRINAMIC + if (index == 0) TMC_SET_PWMTHRS(Y,Y); + #endif + #if Y2_IS_TRINAMIC + if (index == 1) TMC_SET_PWMTHRS(Y,Y2); + #endif + break; + case Z_AXIS: + #if Z_IS_TRINAMIC + if (index == 0) TMC_SET_PWMTHRS(Z,Z); + #endif + #if Z2_IS_TRINAMIC + if (index == 1) TMC_SET_PWMTHRS(Z,Z2); + #endif + break; + case E_AXIS: { + if (get_target_extruder_from_command()) return; + switch (target_extruder) { + #if E0_IS_TRINAMIC + case 0: TMC_SET_PWMTHRS_E(0); break; + #endif + #if E_STEPPERS > 1 && E1_IS_TRINAMIC + case 1: TMC_SET_PWMTHRS_E(1); break; + #endif + #if E_STEPPERS > 2 && E2_IS_TRINAMIC + case 2: TMC_SET_PWMTHRS_E(2); break; + #endif + #if E_STEPPERS > 3 && E3_IS_TRINAMIC + case 3: TMC_SET_PWMTHRS_E(3); break; + #endif + #if E_STEPPERS > 4 && E4_IS_TRINAMIC + case 4: TMC_SET_PWMTHRS_E(4); break; + #endif + } + } break; + } + } + + if (report) LOOP_XYZE(i) switch (i) { + case X_AXIS: + #if X_IS_TRINAMIC + TMC_SAY_PWMTHRS(X,X); + #endif + #if X2_IS_TRINAMIC + TMC_SAY_PWMTHRS(X,X2); + #endif + break; + case Y_AXIS: + #if Y_IS_TRINAMIC + TMC_SAY_PWMTHRS(Y,Y); + #endif + #if Y2_IS_TRINAMIC + TMC_SAY_PWMTHRS(Y,Y2); + #endif + break; + case Z_AXIS: + #if Z_IS_TRINAMIC + TMC_SAY_PWMTHRS(Z,Z); + #endif + #if Z2_IS_TRINAMIC + TMC_SAY_PWMTHRS(Z,Z2); + #endif + break; + case E_AXIS: + #if E0_IS_TRINAMIC + TMC_SAY_PWMTHRS_E(0); + #endif + #if E_STEPPERS > 1 && E1_IS_TRINAMIC + TMC_SAY_PWMTHRS_E(1); + #endif + #if E_STEPPERS > 2 && E2_IS_TRINAMIC + TMC_SAY_PWMTHRS_E(2); + #endif + #if E_STEPPERS > 3 && E3_IS_TRINAMIC + TMC_SAY_PWMTHRS_E(3); + #endif + #if E_STEPPERS > 4 && E4_IS_TRINAMIC + TMC_SAY_PWMTHRS_E(4); + #endif + break; + } + } +#endif // HYBRID_THRESHOLD + +/** + * M914: Set SENSORLESS_HOMING sensitivity. + */ +#if ENABLED(SENSORLESS_HOMING) + void GcodeSuite::M914() { + #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q, TMC_##Q) + #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value) + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZ(i) if (parser.seen(axis_codes[i])) { + const int8_t value = (int8_t)constrain(parser.value_int(), -64, 63); + report = false; + switch (i) { + case X_AXIS: + #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) + if (index == 0) TMC_SET_SGT(X); + #endif + #if ENABLED(X2_IS_TMC2130) + if (index == 1) TMC_SET_SGT(X2); + #endif + break; + case Y_AXIS: + #if ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS) + if (index == 0) TMC_SET_SGT(Y); + #endif + #if ENABLED(Y2_IS_TMC2130) + if (index == 1) TMC_SET_SGT(Y2); + #endif + break; + case Z_AXIS: + #if ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS) + if (index == 0) TMC_SET_SGT(Z); + #endif + #if ENABLED(Z2_IS_TMC2130) + if (index == 1) TMC_SET_SGT(Z2); + #endif + break; + } + } + + if (report) LOOP_XYZ(i) switch (i) { + case X_AXIS: + #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) + TMC_SAY_SGT(X); + #endif + #if ENABLED(X2_IS_TMC2130) + TMC_SAY_SGT(X2); + #endif + break; + case Y_AXIS: + #if ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS) + TMC_SAY_SGT(Y); + #endif + #if ENABLED(Y2_IS_TMC2130) + TMC_SAY_SGT(Y2); + #endif + break; + case Z_AXIS: + #if ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS) + TMC_SAY_SGT(Z); + #endif + #if ENABLED(Z2_IS_TMC2130) + TMC_SAY_SGT(Z2); + #endif + break; + } + } +#endif // SENSORLESS_HOMING + +/** + * TMC Z axis calibration routine + */ +#if ENABLED(TMC_Z_CALIBRATION) + void GcodeSuite::M915() { + const uint16_t _rms = parser.seenval('S') ? parser.value_int() : CALIBRATION_CURRENT, + _z = parser.seenval('Z') ? parser.value_linear_units() : CALIBRATION_EXTRA_HEIGHT; + + if (!TEST(axis_known_position, Z_AXIS)) { + SERIAL_ECHOLNPGM("\nPlease home Z axis first"); + return; + } + + #if Z_IS_TRINAMIC + const uint16_t Z_current_1 = stepperZ.getCurrent(); + stepperZ.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); + #endif + #if Z2_IS_TRINAMIC + const uint16_t Z2_current_1 = stepperZ2.getCurrent(); + stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); + #endif + + SERIAL_ECHOPAIR("\nCalibration current: Z", _rms); + + soft_endstops_enabled = false; + + do_blocking_move_to_z(Z_MAX_POS+_z); + + #if Z_IS_TRINAMIC + stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER); + #endif + #if Z2_IS_TRINAMIC + stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER); + #endif + + do_blocking_move_to_z(Z_MAX_POS); + soft_endstops_enabled = true; + + SERIAL_ECHOLNPGM("\nHoming Z because we lost steps"); + enqueue_and_echo_commands_P(PSTR("G28 Z")); + } +#endif + +#endif // HAS_TRINAMIC diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp new file mode 100644 index 0000000000..44cbddd7f0 --- /dev/null +++ b/Marlin/src/gcode/gcode.cpp @@ -0,0 +1,767 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * gcode.cpp - Temporary container for all gcode handlers + * Most will migrate to classes, by feature. + */ + +#include "gcode.h" +GcodeSuite gcode; + +#include "parser.h" +#include "queue.h" +#include "../module/motion.h" + +#if ENABLED(PRINTCOUNTER) + #include "../module/printcounter.h" +#endif + +#if ENABLED(DIRECT_MIXING_IN_G1) + #include "../feature/mixing.h" +#endif + +#include "../Marlin.h" // for idle() and suspend_auto_report + +uint8_t GcodeSuite::target_extruder; +millis_t GcodeSuite::previous_move_ms; + +bool GcodeSuite::axis_relative_modes[] = AXIS_RELATIVE_MODES; + +#if ENABLED(HOST_KEEPALIVE_FEATURE) + GcodeSuite::MarlinBusyState GcodeSuite::busy_state = NOT_BUSY; + uint8_t GcodeSuite::host_keepalive_interval = DEFAULT_KEEPALIVE_INTERVAL; +#endif + +#if ENABLED(CNC_WORKSPACE_PLANES) + GcodeSuite::WorkspacePlane GcodeSuite::workspace_plane = PLANE_XY; +#endif + +#if ENABLED(CNC_COORDINATE_SYSTEMS) + int8_t GcodeSuite::active_coordinate_system = -1; // machine space + float GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; +#endif + +#if HAS_LEVELING && ENABLED(G29_RETRY_AND_RECOVER) + #include "../feature/bedlevel/bedlevel.h" + #include "../module/planner.h" +#endif + +/** + * Set target_extruder from the T parameter or the active_extruder + * + * Returns TRUE if the target is invalid + */ +bool GcodeSuite::get_target_extruder_from_command() { + if (parser.seenval('T')) { + const int8_t e = parser.value_byte(); + if (e >= EXTRUDERS) { + SERIAL_ECHO_START(); + SERIAL_CHAR('M'); + SERIAL_ECHO(parser.codenum); + SERIAL_ECHOLNPAIR(" " MSG_INVALID_EXTRUDER " ", e); + return true; + } + target_extruder = e; + } + else + target_extruder = active_extruder; + + return false; +} + +/** + * Set XYZE destination and feedrate from the current GCode command + * + * - Set destination from included axis codes + * - Set to current for missing axis codes + * - Set the feedrate, if included + */ +void GcodeSuite::get_destination_from_command() { + LOOP_XYZE(i) { + if (parser.seen(axis_codes[i])) { + const float v = parser.value_axis_units((AxisEnum)i); + destination[i] = (axis_relative_modes[i] || relative_mode) + ? current_position[i] + v + : (i == E_AXIS) ? v : LOGICAL_TO_NATIVE(v, i); + } + else + destination[i] = current_position[i]; + } + + if (parser.linearval('F') > 0.0) + feedrate_mm_s = MMM_TO_MMS(parser.value_feedrate()); + + #if ENABLED(PRINTCOUNTER) + if (!DEBUGGING(DRYRUN)) + print_job_timer.incFilamentUsed(destination[E_AXIS] - current_position[E_AXIS]); + #endif + + // Get ABCDHI mixing factors + #if ENABLED(MIXING_EXTRUDER) && ENABLED(DIRECT_MIXING_IN_G1) + gcode_get_mix(); + #endif +} + +/** + * Dwell waits immediately. It does not synchronize. Use M400 instead of G4 + */ +void GcodeSuite::dwell(millis_t time) { + time += millis(); + while (PENDING(millis(), time)) idle(); +} + +/** + * When G29_RETRY_AND_RECOVER is enabled, call G29() in + * a loop with recovery and retry handling. + */ +#if HAS_LEVELING && ENABLED(G29_RETRY_AND_RECOVER) + + void GcodeSuite::G29_with_retry() { + set_bed_leveling_enabled(false); + for (uint8_t i = G29_MAX_RETRIES; i--;) { + G29(); + if (planner.leveling_active) break; + #ifdef G29_ACTION_ON_RECOVER + SERIAL_ECHOLNPGM("//action:" G29_ACTION_ON_RECOVER); + #endif + #ifdef G29_RECOVER_COMMANDS + process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); + #endif + } + if (planner.leveling_active) { + #ifdef G29_SUCCESS_COMMANDS + process_subcommands_now_P(PSTR(G29_SUCCESS_COMMANDS)); + #endif + } + else { + #ifdef G29_FAILURE_COMMANDS + process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); + #endif + #ifdef G29_ACTION_ON_FAILURE + SERIAL_ECHOLNPGM("//action:" G29_ACTION_ON_FAILURE); + #endif + #if ENABLED(G29_HALT_ON_FAILURE) + kill(PSTR(MSG_ERR_PROBING_FAILED)); + #endif + } + } + +#endif // HAS_LEVELING && G29_RETRY_AND_RECOVER + +// +// Placeholders for non-migrated codes +// +#if ENABLED(M100_FREE_MEMORY_WATCHER) + extern void M100_dump_routine(const char * const title, const char *start, const char *end); +#endif + +/** + * Process the parsed command and dispatch it to its handler + */ +void GcodeSuite::process_parsed_command( + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + const bool no_ok + #endif +) { + KEEPALIVE_STATE(IN_HANDLER); + + // Handle a known G, M, or T + switch (parser.command_letter) { + case 'G': switch (parser.codenum) { + + case 0: case 1: G0_G1( // G0: Fast Move, G1: Linear Move + #if IS_SCARA + parser.codenum == 0 + #endif + ); + break; + + #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) + case 2: case 3: G2_G3(parser.codenum == 2); break; // G2: CW ARC, G3: CCW ARC + #endif + + case 4: G4(); break; // G4: Dwell + + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: G5(); break; // G5: Cubic B_spline + #endif + + #if ENABLED(FWRETRACT) + case 10: G10(); break; // G10: Retract / Swap Retract + case 11: G11(); break; // G11: Recover / Swap Recover + #endif + + #if ENABLED(NOZZLE_CLEAN_FEATURE) + case 12: G12(); break; // G12: Nozzle Clean + #endif + + #if ENABLED(CNC_WORKSPACE_PLANES) + case 17: G17(); break; // G17: Select Plane XY + case 18: G18(); break; // G18: Select Plane ZX + case 19: G19(); break; // G19: Select Plane YZ + #endif + + #if ENABLED(INCH_MODE_SUPPORT) + case 20: G20(); break; // G20: Inch Mode + case 21: G21(); break; // G21: MM Mode + #endif + + #if ENABLED(G26_MESH_VALIDATION) + case 26: G26(); break; // G26: Mesh Validation Pattern generation + #endif + + #if ENABLED(NOZZLE_PARK_FEATURE) + case 27: G27(); break; // G27: Nozzle Park + #endif + + case 28: G28(false); break; // G28: Home all axes, one at a time + + #if HAS_LEVELING + case 29: // G29: Bed leveling calibration + #if ENABLED(G29_RETRY_AND_RECOVER) + G29_with_retry(); + #else + G29(); + #endif + break; + #endif // HAS_LEVELING + + #if HAS_BED_PROBE + case 30: G30(); break; // G30: Single Z probe + #if ENABLED(Z_PROBE_SLED) + case 31: G31(); break; // G31: dock the sled + case 32: G32(); break; // G32: undock the sled + #endif + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) + case 33: G33(); break; // G33: Delta Auto-Calibration + #endif + + #if ENABLED(G38_PROBE_TARGET) + case 38: // G38.2 & G38.3 + if (parser.subcode == 2 || parser.subcode == 3) + G38(parser.subcode == 2); + break; + #endif + + case 90: relative_mode = false; break; // G90: Relative Mode + case 91: relative_mode = true; break; // G91: Absolute Mode + + case 92: G92(); break; // G92: Set current axis position(s) + + #if HAS_MESH + case 42: G42(); break; // G42: Coordinated move to a mesh point + #endif + + #if ENABLED(DEBUG_GCODE_PARSER) + case 800: parser.debug(); break; // G800: GCode Parser Test for G + #endif + + default: parser.unknown_command_error(); break; + } + break; + + case 'M': switch (parser.codenum) { + #if HAS_RESUME_CONTINUE + case 0: // M0: Unconditional stop - Wait for user button press on LCD + case 1: M0_M1(); break; // M1: Conditional stop - Wait for user button press on LCD + #endif + + #if ENABLED(SPINDLE_LASER_ENABLE) + case 3: M3_M4(true ); break; // M3: turn spindle/laser on, set laser/spindle power/speed, set rotation direction CW + case 4: M3_M4(false); break; // M4: turn spindle/laser on, set laser/spindle power/speed, set rotation direction CCW + case 5: M5(); break; // M5 - turn spindle/laser off + #endif + #if ENABLED(FAN_AS_LASER) + case 3: M3_M4(true); break; // M3: Laser Power On + case 5: M5(); break; // M5: Laser OFF + #endif + + case 17: M17(); break; // M17: Enable all stepper motors + + #if ENABLED(SDSUPPORT) + case 20: M20(); break; // M20: list SD card + case 21: M21(); break; // M21: init SD card + case 22: M22(); break; // M22: release SD card + case 23: M23(); break; // M23: Select file + case 24: M24(); break; // M24: Start SD print + case 25: M25(); break; // M25: Pause SD print + case 26: M26(); break; // M26: Set SD index + case 27: M27(); break; // M27: Get SD status + case 28: M28(); break; // M28: Start SD write + case 29: M29(); break; // M29: Stop SD write + case 30: M30(); break; // M30 Delete File + case 32: M32(); break; // M32: Select file and start SD print + + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + case 33: M33(); break; // M33: Get the long full path to a file or folder + #endif + + #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) + case 34: M34(); break; // M34: Set SD card sorting options + #endif + + case 928: M928(); break; // M928: Start SD write + #endif // SDSUPPORT + + case 31: M31(); break; // M31: Report time since the start of SD print or last M109 + case 42: M42(); break; // M42: Change pin state + + #if ENABLED(PINS_DEBUGGING) + case 43: M43(); break; // M43: Read pin state + #endif + + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + case 48: M48(); break; // M48: Z probe repeatability test + #endif + + #if ENABLED(G26_MESH_VALIDATION) + case 49: M49(); break; // M49: Turn on or off G26 debug flag for verbose output + #endif + + #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) + case 73: M73(); break; // M73: Set progress percentage (for display on LCD) + #endif + + case 75: M75(); break; // M75: Start print timer + case 76: M76(); break; // M76: Pause print timer + case 77: M77(); break; // M77: Stop print timer + + #if ENABLED(PRINTCOUNTER) + case 78: M78(); break; // M78: Show print statistics + #endif + + #if ENABLED(M100_FREE_MEMORY_WATCHER) + case 100: M100(); break; // M100: Free Memory Report + #endif + + case 104: M104(); break; // M104: Set hot end temperature + case 109: M109(); break; // M109: Wait for hotend temperature to reach target + case 110: M110(); break; // M110: Set Current Line Number + case 111: M111(); break; // M111: Set debug level + + #if DISABLED(EMERGENCY_PARSER) + case 108: M108(); break; // M108: Cancel Waiting + case 112: M112(); break; // M112: Emergency Stop + case 410: M410(); break; // M410: Quickstop - Abort all the planned moves. + #endif + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + case 113: M113(); break; // M113: Set Host Keepalive interval + #endif + + #if HAS_HEATED_BED + case 140: M140(); break; // M140: Set bed temperature + case 190: M190(); break; // M190: Wait for bed temperature to reach target + #endif + + case 105: M105(); KEEPALIVE_STATE(NOT_BUSY); return; // M105: Report Temperatures (and say "ok") + + #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR + case 155: M155(); break; // M155: Set temperature auto-report interval + #endif + + #if FAN_COUNT > 0 + case 106: M106(); break; // M106: Fan On + case 107: M107(); break; // M107: Fan Off + #endif + + #if ENABLED(PARK_HEAD_ON_PAUSE) + case 125: M125(); break; // M125: Store current position and move to filament change position + #endif + + #if ENABLED(BARICUDA) + // PWM for HEATER_1_PIN + #if HAS_HEATER_1 + case 126: M126(); break; // M126: valve open + case 127: M127(); break; // M127: valve closed + #endif + + // PWM for HEATER_2_PIN + #if HAS_HEATER_2 + case 128: M128(); break; // M128: valve open + case 129: M129(); break; // M129: valve closed + #endif + #endif // BARICUDA + + #if HAS_POWER_SWITCH + case 80: M80(); break; // M80: Turn on Power Supply + #endif + case 81: M81(); break; // M81: Turn off Power, including Power Supply, if possible + + case 82: M82(); break; // M82: Set E axis normal mode (same as other axes) + case 83: M83(); break; // M83: Set E axis relative mode + case 18: case 84: M18_M84(); break; // M18/M84: Disable Steppers / Set Timeout + case 85: M85(); break; // M85: Set inactivity stepper shutdown timeout + case 92: M92(); break; // M92: Set the steps-per-unit for one or more axes + case 114: M114(); break; // M114: Report current position + case 115: M115(); break; // M115: Report capabilities + case 117: M117(); break; // M117: Set LCD message text, if possible + case 118: M118(); break; // M118: Display a message in the host console + case 119: M119(); break; // M119: Report endstop states + case 120: M120(); break; // M120: Enable endstops + case 121: M121(); break; // M121: Disable endstops + + #if ENABLED(ULTIPANEL) + case 145: M145(); break; // M145: Set material heatup parameters + #endif + + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + case 149: M149(); break; // M149: Set temperature units + #endif + + #if HAS_COLOR_LEDS + case 150: M150(); break; // M150: Set Status LED Color + #endif + + #if ENABLED(MIXING_EXTRUDER) + case 163: M163(); break; // M163: Set a component weight for mixing extruder + #if MIXING_VIRTUAL_TOOLS > 1 + case 164: M164(); break; // M164: Save current mix as a virtual extruder + #endif + #if ENABLED(DIRECT_MIXING_IN_G1) + case 165: M165(); break; // M165: Set multiple mix weights + #endif + #endif + + #if DISABLED(NO_VOLUMETRICS) + case 200: M200(); break; // M200: Set filament diameter, E to cubic units + #endif + + case 201: M201(); break; // M201: Set max acceleration for print moves (units/s^2) + + #if 0 + case 202: M202(); break; // M202: Not used for Sprinter/grbl gen6 + #endif + + case 203: M203(); break; // M203: Set max feedrate (units/sec) + case 204: M204(); break; // M204: Set acceleration + case 205: M205(); break; // M205: Set advanced settings + + #if HAS_M206_COMMAND + case 206: M206(); break; // M206: Set home offsets + #endif + + #if ENABLED(DELTA) + case 665: M665(); break; // M665: Set delta configurations + #endif + + #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + case 666: M666(); break; // M666: Set delta or dual endstop adjustment + #endif + + #if ENABLED(FWRETRACT) + case 207: M207(); break; // M207: Set Retract Length, Feedrate, and Z lift + case 208: M208(); break; // M208: Set Recover (unretract) Additional Length and Feedrate + case 209: + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) M209(); // M209: Turn Automatic Retract Detection on/off + break; + #endif + + case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops + + #if HOTENDS > 1 + case 218: M218(); break; // M218: Set a tool offset + #endif + + case 220: M220(); break; // M220: Set Feedrate Percentage: S ("FR" on your LCD) + case 221: M221(); break; // M221: Set Flow Percentage + case 226: M226(); break; // M226: Wait until a pin reaches a state + + #if HAS_SERVOS + case 280: M280(); break; // M280: Set servo position absolute + #endif + + #if ENABLED(BABYSTEPPING) + case 290: M290(); break; // M290: Babystepping + #endif + + #if HAS_BUZZER + case 300: M300(); break; // M300: Play beep tone + #endif + + #if ENABLED(PIDTEMP) + case 301: M301(); break; // M301: Set hotend PID parameters + #endif + + #if ENABLED(PIDTEMPBED) + case 304: M304(); break; // M304: Set bed PID parameters + #endif + + #if defined(CHDK) || HAS_PHOTOGRAPH + case 240: M240(); break; // M240: Trigger a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/ + #endif + + #if HAS_LCD_CONTRAST + case 250: M250(); break; // M250: Set LCD contrast + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) + case 260: M260(); break; // M260: Send data to an i2c slave + case 261: M261(); break; // M261: Request data from an i2c slave + #endif + + #if ENABLED(PREVENT_COLD_EXTRUSION) + case 302: M302(); break; // M302: Allow cold extrudes (set the minimum extrude temperature) + #endif + + case 303: M303(); break; // M303: PID autotune + + #if ENABLED(MORGAN_SCARA) + case 360: if (M360()) return; break; // M360: SCARA Theta pos1 + case 361: if (M361()) return; break; // M361: SCARA Theta pos2 + case 362: if (M362()) return; break; // M362: SCARA Psi pos1 + case 363: if (M363()) return; break; // M363: SCARA Psi pos2 + case 364: if (M364()) return; break; // M364: SCARA Psi pos3 (90 deg to Theta) + #endif + + #if ENABLED(EXT_SOLENOID) + case 380: M380(); break; // M380: Activate solenoid on active extruder + case 381: M381(); break; // M381: Disable all solenoids + #endif + + case 400: M400(); break; // M400: Finish all moves + + #if HAS_BED_PROBE + case 401: M401(); break; // M401: Deploy probe + case 402: M402(); break; // M402: Stow probe + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case 404: M404(); break; // M404: Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or display nominal filament width + case 405: M405(); break; // M405: Turn on filament sensor for control + case 406: M406(); break; // M406: Turn off filament sensor for control + case 407: M407(); break; // M407: Display measured filament diameter + #endif + + #if HAS_LEVELING + case 420: M420(); break; // M420: Enable/Disable Bed Leveling + #endif + + #if HAS_MESH + case 421: M421(); break; // M421: Set a Mesh Bed Leveling Z coordinate + #endif + + #if HAS_M206_COMMAND + case 428: M428(); break; // M428: Apply current_position to home_offset + #endif + + case 500: M500(); break; // M500: Store settings in EEPROM + case 501: M501(); break; // M501: Read settings from EEPROM + case 502: M502(); break; // M502: Revert to default settings + #if DISABLED(DISABLE_M503) + case 503: M503(); break; // M503: print settings currently in memory + #endif + #if ENABLED(EEPROM_SETTINGS) + case 504: M504(); break; // M504: Validate EEPROM contents + #endif + + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + case 540: M540(); break; // M540: Set abort on endstop hit for SD printing + #endif + + #if HAS_BED_PROBE + case 851: M851(); break; // M851: Set Z Probe Z Offset + #endif + + #if ENABLED(SKEW_CORRECTION_GCODE) + case 852: M852(); break; // M852: Set Skew factors + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + case 600: M600(); break; // M600: Pause for Filament Change + case 603: M603(); break; // M603: Configure Filament Change + #endif + + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + case 605: M605(); break; // M605: Set Dual X Carriage movement mode + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + case 701: M701(); break; // M701: Load Filament + case 702: M702(); break; // M702: Unload Filament + #endif + + #if ENABLED(LIN_ADVANCE) + case 900: M900(); break; // M900: Set advance K factor. + #endif + + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) + case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes. + #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) + case 908: M908(); break; // M908: Control digital trimpot directly. + #if ENABLED(DAC_STEPPER_CURRENT) + case 909: M909(); break; // M909: Print digipot/DAC current value + case 910: M910(); break; // M910: Commit digipot/DAC value to external EEPROM + #endif + #endif + #endif + + #if HAS_TRINAMIC + #if ENABLED(TMC_DEBUG) + case 122: M122(); break; + #endif + case 906: M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E + case 911: M911(); break; // M911: Report TMC2130 prewarn triggered flags + case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags + #if ENABLED(HYBRID_THRESHOLD) + case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. + #endif + #if ENABLED(SENSORLESS_HOMING) + case 914: M914(); break; // M914: Set SENSORLESS_HOMING sensitivity. + #endif + #if ENABLED(TMC_Z_CALIBRATION) + case 915: M915(); break; // M915: TMC Z axis calibration. + #endif + #endif + + #if HAS_MICROSTEPS + case 350: M350(); break; // M350: Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers. + case 351: M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. + #endif + + case 355: M355(); break; // M355: Set case light brightness + + #if ENABLED(DEBUG_GCODE_PARSER) + case 800: parser.debug(); break; // M800: GCode Parser Test for M + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + case 860: M860(); break; // M860: Report encoder module position + case 861: M861(); break; // M861: Report encoder module status + case 862: M862(); break; // M862: Perform axis test + case 863: M863(); break; // M863: Calibrate steps/mm + case 864: M864(); break; // M864: Change module address + case 865: M865(); break; // M865: Check module firmware version + case 866: M866(); break; // M866: Report axis error count + case 867: M867(); break; // M867: Toggle error correction + case 868: M868(); break; // M868: Set error correction threshold + case 869: M869(); break; // M869: Report axis error + #endif + + case 999: M999(); break; // M999: Restart after being Stopped + + default: parser.unknown_command_error(); break; + } + break; + + case 'T': T(parser.codenum); break; // Tn: Tool Change + + default: parser.unknown_command_error(); + } + + KEEPALIVE_STATE(NOT_BUSY); + + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + if (!no_ok) + #endif + ok_to_send(); +} + +/** + * Process a single command and dispatch it to its handler + * This is called from the main loop() + */ +void GcodeSuite::process_next_command() { + char * const current_command = command_queue[cmd_queue_index_r]; + + if (DEBUGGING(ECHO)) { + SERIAL_ECHO_START(); + SERIAL_ECHOLN(current_command); + #if ENABLED(M100_FREE_MEMORY_WATCHER) + SERIAL_ECHOPAIR("slot:", cmd_queue_index_r); + M100_dump_routine(" Command Queue:", (const char*)command_queue, (const char*)(command_queue + sizeof(command_queue))); + #endif + } + + reset_stepper_timeout(); // Keep steppers powered + + // Parse the next command in the queue + parser.parse(current_command); + process_parsed_command(); +} + +#if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + /** + * Run a series of commands, bypassing the command queue to allow + * G-code "macros" to be called from within other G-code handlers. + */ + void GcodeSuite::process_subcommands_now_P(const char *pgcode) { + // Save the parser state + char * const saved_cmd = parser.command_ptr; + + // Process individual commands in string + while (pgm_read_byte_near(pgcode)) { + // Break up string at '\n' delimiters + const char *delim = strchr_P(pgcode, '\n'); + size_t len = delim ? delim - pgcode : strlen_P(pgcode); + char cmd[len + 1]; + strncpy_P(cmd, pgcode, len); + cmd[len] = '\0'; + pgcode += len; + if (delim) pgcode++; + + // Parse the next command in the string + parser.parse(cmd); + process_parsed_command(true); + } + + // Restore the parser state + parser.parse(saved_cmd); + } +#endif + +#if ENABLED(HOST_KEEPALIVE_FEATURE) + + /** + * Output a "busy" message at regular intervals + * while the machine is not accepting commands. + */ + void GcodeSuite::host_keepalive() { + const millis_t ms = millis(); + static millis_t next_busy_signal_ms = 0; + if (!suspend_auto_report && host_keepalive_interval && busy_state != NOT_BUSY) { + if (PENDING(ms, next_busy_signal_ms)) return; + switch (busy_state) { + case IN_HANDLER: + case IN_PROCESS: + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PROCESSING); + break; + case PAUSED_FOR_USER: + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_USER); + break; + case PAUSED_FOR_INPUT: + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_INPUT); + break; + default: + break; + } + } + next_busy_signal_ms = ms + host_keepalive_interval * 1000UL; + } + +#endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h new file mode 100644 index 0000000000..8f510146fc --- /dev/null +++ b/Marlin/src/gcode/gcode.h @@ -0,0 +1,796 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * gcode.h - Temporary container for all gcode handlers + */ + +/** + * ----------------- + * G-Codes in Marlin + * ----------------- + * + * Helpful G-code references: + * - http://linuxcnc.org/handbook/gcode/g-code.html + * - http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes + * + * Help to document Marlin's G-codes online: + * - http://reprap.org/wiki/G-code + * - https://github.com/MarlinFirmware/MarlinDocumentation + * + * ----------------- + * + * "G" Codes + * + * G0 -> G1 + * G1 - Coordinated Movement X Y Z E + * G2 - CW ARC + * G3 - CCW ARC + * G4 - Dwell S or P + * G5 - Cubic B-spline with XYZE destination and IJPQ offsets + * G10 - Retract filament according to settings of M207 (Requires FWRETRACT) + * G11 - Retract recover filament according to settings of M208 (Requires FWRETRACT) + * G12 - Clean tool (Requires NOZZLE_CLEAN_FEATURE) + * G17 - Select Plane XY (Requires CNC_WORKSPACE_PLANES) + * G18 - Select Plane ZX (Requires CNC_WORKSPACE_PLANES) + * G19 - Select Plane YZ (Requires CNC_WORKSPACE_PLANES) + * G20 - Set input units to inches (Requires INCH_MODE_SUPPORT) + * G21 - Set input units to millimeters (Requires INCH_MODE_SUPPORT) + * G26 - Mesh Validation Pattern (Requires G26_MESH_VALIDATION) + * G27 - Park Nozzle (Requires NOZZLE_PARK_FEATURE) + * G28 - Home one or more axes + * G29 - Start or continue the bed leveling probe procedure (Requires bed leveling) + * G30 - Single Z probe, probes bed at X Y location (defaults to current XY location) + * G31 - Dock sled (Z_PROBE_SLED only) + * G32 - Undock sled (Z_PROBE_SLED only) + * G33 - Delta Auto-Calibration (Requires DELTA_AUTO_CALIBRATION) + * G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET) + * G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL) + * G90 - Use Absolute Coordinates + * G91 - Use Relative Coordinates + * G92 - Set current position to coordinates given + * + * "M" Codes + * + * M0 - Unconditional stop - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled) + * M1 -> M0 + * M3 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to clockwise + * M4 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to counter-clockwise + * M5 - Turn laser/spindle off + * M17 - Enable/Power all stepper motors + * M18 - Disable all stepper motors; same as M84 + * M20 - List SD card. (Requires SDSUPPORT) + * M21 - Init SD card. (Requires SDSUPPORT) + * M22 - Release SD card. (Requires SDSUPPORT) + * M23 - Select SD file: "M23 /path/file.gco". (Requires SDSUPPORT) + * M24 - Start/resume SD print. (Requires SDSUPPORT) + * M25 - Pause SD print. (Requires SDSUPPORT) + * M26 - Set SD position in bytes: "M26 S12345". (Requires SDSUPPORT) + * M27 - Report SD print status. (Requires SDSUPPORT) + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. + * M28 - Start SD write: "M28 /path/file.gco". (Requires SDSUPPORT) + * M29 - Stop SD write. (Requires SDSUPPORT) + * M30 - Delete file from SD: "M30 /path/file.gco" + * M31 - Report time since last M109 or SD card start to serial. + * M32 - Select file and start SD print: "M32 [S] !/path/file.gco#". (Requires SDSUPPORT) + * Use P to run other files as sub-programs: "M32 P !filename#" + * The '#' is necessary when calling from within sd files, as it stops buffer prereading + * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) + * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) + * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. + * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) + * M75 - Start the print job timer. + * M76 - Pause the print job timer. + * M77 - Stop the print job timer. + * M78 - Show statistical information about the print jobs. (Requires PRINTCOUNTER) + * M80 - Turn on Power Supply. (Requires POWER_SUPPLY > 0) + * M81 - Turn off Power Supply. (Requires POWER_SUPPLY > 0) + * M82 - Set E codes absolute (default). + * M83 - Set E codes relative while in Absolute (G90) mode. + * M84 - Disable steppers until next move, or use S to specify an idle + * duration after which steppers should turn off. S0 disables the timeout. + * M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default) + * M92 - Set planner.axis_steps_per_mm for one or more axes. + * M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER) + * M104 - Set extruder target temp. + * M105 - Report current temperatures. + * M106 - Set print fan speed. + * M107 - Print fan off. + * M108 - Break out of heating loops (M109, M190, M303). With no controller, breaks out of M0/M1. (Requires EMERGENCY_PARSER) + * M109 - Sxxx Wait for extruder current temp to reach target temp. Waits only when heating + * Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling + * If AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F + * M110 - Set the current line number. (Used by host printing) + * M111 - Set debug flags: "M111 S". See flag bits defined in enum.h. + * M112 - Emergency stop. + * M113 - Get or set the timeout interval for Host Keepalive "busy" messages. (Requires HOST_KEEPALIVE_FEATURE) + * M114 - Report current position. + * M115 - Report capabilities. (Extended capabilities requires EXTENDED_CAPABILITIES_REPORT) + * M117 - Display a message on the controller screen. (Requires an LCD) + * M118 - Display a message in the host console. + * M119 - Report endstops status. + * M120 - Enable endstops detection. + * M121 - Disable endstops detection. + * M122 - Debug stepper (Requires HAVE_TMC2130 or HAVE_TMC2208) + * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) + * M126 - Solenoid Air Valve Open. (Requires BARICUDA) + * M127 - Solenoid Air Valve Closed. (Requires BARICUDA) + * M128 - EtoP Open. (Requires BARICUDA) + * M129 - EtoP Closed. (Requires BARICUDA) + * M140 - Set bed target temp. S + * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) + * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) + * M150 - Set Status LED Color as R U B P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, or PCA9632). + * M155 - Auto-report temperatures with interval of S. (Requires AUTO_REPORT_TEMPERATURES) + * M163 - Set a single proportion for a mixing extruder. (Requires MIXING_EXTRUDER) + * M164 - Save the mix as a virtual extruder. (Requires MIXING_EXTRUDER and MIXING_VIRTUAL_TOOLS) + * M165 - Set the proportions for a mixing extruder. Use parameters ABCDHI to set the mixing factors. (Requires MIXING_EXTRUDER) + * M190 - Sxxx Wait for bed current temp to reach target temp. ** Waits only when heating! ** + * Rxxx Wait for bed current temp to reach target temp. ** Waits for heating or cooling. ** + * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) + * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" + * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** + * M203 - Set maximum feedrate: "M203 X Y Z E" in units/sec. + * M204 - Set default acceleration in units/sec^2: P R T + * M205 - Set advanced settings. Current units apply: + S T minimum speeds + B + X, Y, Z, E + * M206 - Set additional homing offset. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) + * M207 - Set Retract Length: S, Feedrate: F, and Z lift: Z. (Requires FWRETRACT) + * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (Requires FWRETRACT) + * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT) + Every normal extrude-only move will be classified as retract depending on the direction. + * M211 - Enable, Disable, and/or Report software endstops: S<0|1> (Requires MIN_SOFTWARE_ENDSTOPS or MAX_SOFTWARE_ENDSTOPS) + * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) + * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) + * M221 - Set Flow Percentage: "M221 S" + * M226 - Wait until a pin is in a given state: "M226 P S" + * M240 - Trigger a camera to take a photograph. (Requires CHDK or PHOTOGRAPH_PIN) + * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) + * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) + * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS) + * M280 - Set servo position absolute: "M280 P S". (Requires servos) + * M290 - Babystepping (Requires BABYSTEPPING) + * M300 - Play beep sound S P + * M301 - Set PID parameters P I and D. (Requires PIDTEMP) + * M302 - Allow cold extrudes, or set the minimum extrude S. (Requires PREVENT_COLD_EXTRUSION) + * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) + * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) + * M350 - Set microstepping mode. (Requires digital microstepping pins.) + * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) + * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) + * M380 - Activate solenoid on active extruder. (Requires EXT_SOLENOID) + * M381 - Disable all solenoids. (Requires EXT_SOLENOID) + * M400 - Finish all moves. + * M401 - Deploy and activate Z probe. (Requires a probe) + * M402 - Deactivate and stow Z probe. (Requires a probe) + * M404 - Display or set the Nominal Filament Width: "W". (Requires FILAMENT_WIDTH_SENSOR) + * M405 - Enable Filament Sensor flow control. "M405 D". (Requires FILAMENT_WIDTH_SENSOR) + * M406 - Disable Filament Sensor flow control. (Requires FILAMENT_WIDTH_SENSOR) + * M407 - Display measured filament diameter in millimeters. (Requires FILAMENT_WIDTH_SENSOR) + * M410 - Quickstop. Abort all planned moves. + * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) + * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL) + * M428 - Set the home_offset based on the current_position. Nearest edge applies. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) + * M500 - Store parameters in EEPROM. (Requires EEPROM_SETTINGS) + * M501 - Restore parameters from EEPROM. (Requires EEPROM_SETTINGS) + * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** + * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. + * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + * M600 - Pause for filament change: "M600 X Y Z E L". (Requires ADVANCED_PAUSE_FEATURE) + * M603 - Configure filament change: "M603 T U L". (Requires ADVANCED_PAUSE_FEATURE) + * M605 - Set Dual X-Carriage movement mode: "M605 S [X] [R]". (Requires DUAL_X_CARRIAGE) + * M665 - Set delta configurations: "M665 H L R S B X Y Z (Requires DELTA) + * M666 - Set/get offsets for delta (Requires DELTA) or dual endstops (Requires [XYZ]_DUAL_ENDSTOPS). + * M701 - Load filament (requires FILAMENT_LOAD_UNLOAD_GCODES) + * M702 - Unload filament (requires FILAMENT_LOAD_UNLOAD_GCODES) + * M851 - Set Z probe's Z offset in current units. (Negative = below the nozzle.) + * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) + * M860 - Report the position of position encoder modules. + * M861 - Report the status of position encoder modules. + * M862 - Perform an axis continuity test for position encoder modules. + * M863 - Perform steps-per-mm calibration for position encoder modules. + * M864 - Change position encoder module I2C address. + * M865 - Check position encoder module firmware version. + * M866 - Report or reset position encoder module error count. + * M867 - Enable/disable or toggle error correction for position encoder modules. + * M868 - Report or set position encoder module error correction threshold. + * M869 - Report position encoder module error. + * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires HAVE_TMC2130 or HAVE_TMC2208) + * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) + * M908 - Control digital trimpot directly. (Requires DAC_STEPPER_CURRENT or DIGIPOTSS_PIN) + * M909 - Print digipot/DAC current value. (Requires DAC_STEPPER_CURRENT) + * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires DAC_STEPPER_CURRENT) + * M911 - Report stepper driver overtemperature pre-warn condition. (Requires HAVE_TMC2130 or HAVE_TMC2208) + * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires HAVE_TMC2130 or HAVE_TMC2208) + * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) + * M914 - Set SENSORLESS_HOMING sensitivity. (Requires SENSORLESS_HOMING) + * + * M360 - SCARA calibration: Move to cal-position ThetaA (0 deg calibration) + * M361 - SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) + * M362 - SCARA calibration: Move to cal-position PsiA (0 deg calibration) + * M363 - SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) + * M364 - SCARA calibration: Move to cal-position PSIC (90 deg to Theta calibration position) + * + * ************ Custom codes - This can change to suit future G-code regulations + * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) + * M999 - Restart after being stopped by error + * + * "T" Codes + * + * T0-T3 - Select an extruder (tool) by index: "T F" + * + */ + +#ifndef _GCODE_H_ +#define _GCODE_H_ + +#include "../inc/MarlinConfig.h" +#include "parser.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "../feature/I2CPositionEncoder.h" +#endif + +class GcodeSuite { +public: + + GcodeSuite() {} + + static uint8_t target_extruder; + + static bool axis_relative_modes[]; + + #if ENABLED(CNC_WORKSPACE_PLANES) + /** + * Workspace planes only apply to G2/G3 moves + * (and "canned cycles" - not a current feature) + */ + enum WorkspacePlane : char { PLANE_XY, PLANE_ZX, PLANE_YZ }; + static WorkspacePlane workspace_plane; + #endif + + #define MAX_COORDINATE_SYSTEMS 9 + #if ENABLED(CNC_COORDINATE_SYSTEMS) + static int8_t active_coordinate_system; + static float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; + static bool select_coordinate_system(const int8_t _new); + #endif + + static millis_t previous_move_ms; + FORCE_INLINE static void reset_stepper_timeout() { previous_move_ms = millis(); } + + static bool get_target_extruder_from_command(); + static void get_destination_from_command(); + static void process_parsed_command( + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + const bool no_ok = false + #endif + ); + static void process_next_command(); + + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + static void process_subcommands_now_P(const char *pgcode); + #endif + + FORCE_INLINE static void home_all_axes() { G28(true); } + + /** + * Multi-stepper support for M92, M201, M203 + */ + #if ENABLED(DISTINCT_E_FACTORS) + #define GET_TARGET_EXTRUDER() if (gcode.get_target_extruder_from_command()) return + #define TARGET_EXTRUDER gcode.target_extruder + #else + #define GET_TARGET_EXTRUDER() NOOP + #define TARGET_EXTRUDER 0 + #endif + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + /** + * States for managing Marlin and host communication + * Marlin sends messages if blocked or busy + */ + enum MarlinBusyState : char { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) + }; + + static MarlinBusyState busy_state; + static uint8_t host_keepalive_interval; + + static void host_keepalive(); + + #define KEEPALIVE_STATE(n) gcode.busy_state = gcode.n + #else + #define KEEPALIVE_STATE(n) NOOP + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) && HAS_RESUME_CONTINUE + static bool lights_off_after_print; + #endif + + static void dwell(millis_t time); + +private: + + static void G0_G1( + #if IS_SCARA + bool fast_move=false + #endif + ); + + #if ENABLED(ARC_SUPPORT) + static void G2_G3(const bool clockwise); + #endif + + static void G4(); + + #if ENABLED(BEZIER_CURVE_SUPPORT) + static void G5(); + #endif + + #if ENABLED(FWRETRACT) + static void G10(); + static void G11(); + #endif + + #if ENABLED(NOZZLE_CLEAN_FEATURE) + static void G12(); + #endif + + #if ENABLED(CNC_WORKSPACE_PLANES) + static void G17(); + static void G18(); + static void G19(); + #endif + + #if ENABLED(INCH_MODE_SUPPORT) + static void G20(); + static void G21(); + #endif + + #if ENABLED(G26_MESH_VALIDATION) + static void G26(); + #endif + + #if ENABLED(NOZZLE_PARK_FEATURE) + static void G27(); + #endif + + static void G28(const bool always_home_all); + + #if HAS_LEVELING + static void G29(); + #if ENABLED(G29_RETRY_AND_RECOVER) + static void G29_with_retry(); + #endif + #endif + + #if HAS_BED_PROBE + static void G30(); + #if ENABLED(Z_PROBE_SLED) + static void G31(); + static void G32(); + #endif + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) + static void G33(); + #endif + + #if ENABLED(G38_PROBE_TARGET) + static void G38(const bool is_38_2); + #endif + + #if HAS_MESH + static void G42(); + #endif + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + static void G53(); + static void G54(); + static void G55(); + static void G56(); + static void G57(); + static void G58(); + static void G59(); + #endif + + static void G92(); + + #if HAS_RESUME_CONTINUE + static void M0_M1(); + #endif + + #if (ENABLED(SPINDLE_LASER_ENABLE) || ENABLED(FAN_AS_LASER)) + static void M3_M4(bool is_M3); + static void M5(); + #endif + + static void M17(); + + static void M18_M84(); + + #if ENABLED(SDSUPPORT) + static void M20(); + static void M21(); + static void M22(); + static void M23(); + static void M24(); + static void M25(); + static void M26(); + static void M27(); + static void M28(); + static void M29(); + static void M30(); + #endif + + static void M31(); + + #if ENABLED(SDSUPPORT) + static void M32(); + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void M33(); + #endif + #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) + static void M34(); + #endif + #endif + + static void M42(); + + #if ENABLED(PINS_DEBUGGING) + static void M43(); + #endif + + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + static void M48(); + #endif + + #if ENABLED(G26_MESH_VALIDATION) + static void M49(); + #endif + + #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) + static void M73(); + #endif + + static void M75(); + static void M76(); + static void M77(); + + #if ENABLED(PRINTCOUNTER) + static void M78(); + #endif + + #if HAS_POWER_SWITCH + static void M80(); + #endif + + static void M81(); + static void M82(); + static void M83(); + static void M85(); + static void M92(); + + #if ENABLED(M100_FREE_MEMORY_WATCHER) + static void M100(); + #endif + + static void M104(); + static void M105(); + static void M106(); + static void M107(); + + #if DISABLED(EMERGENCY_PARSER) + static void M108(); + static void M112(); + static void M410(); + #endif + + static void M109(); + + static void M110(); + static void M111(); + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + static void M113(); + #endif + + static void M114(); + static void M115(); + static void M117(); + static void M118(); + static void M119(); + static void M120(); + static void M121(); + + #if ENABLED(PARK_HEAD_ON_PAUSE) + static void M125(); + #endif + + #if ENABLED(BARICUDA) + #if HAS_HEATER_1 + static void M126(); + static void M127(); + #endif + #if HAS_HEATER_2 + static void M128(); + static void M129(); + #endif + #endif + + #if HAS_HEATED_BED + static void M140(); + static void M190(); + #endif + + #if ENABLED(ULTIPANEL) + static void M145(); + #endif + + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + static void M149(); + #endif + + #if HAS_COLOR_LEDS + static void M150(); + #endif + + #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR + static void M155(); + #endif + + #if ENABLED(MIXING_EXTRUDER) + static void M163(); + #if MIXING_VIRTUAL_TOOLS > 1 + static void M164(); + #endif + #if ENABLED(DIRECT_MIXING_IN_G1) + static void M165(); + #endif + #endif + + static void M200(); + static void M201(); + + #if 0 + static void M202(); // Not used for Sprinter/grbl gen6 + #endif + + static void M203(); + static void M204(); + static void M205(); + + #if HAS_M206_COMMAND + static void M206(); + #endif + + #if ENABLED(FWRETRACT) + static void M207(); + static void M208(); + static void M209(); + #endif + + static void M211(); + + #if HOTENDS > 1 + static void M218(); + #endif + + static void M220(); + static void M221(); + static void M226(); + + #if defined(CHDK) || HAS_PHOTOGRAPH + static void M240(); + #endif + + #if HAS_LCD_CONTRAST + static void M250(); + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) + static void M260(); + static void M261(); + #endif + + #if HAS_SERVOS + static void M280(); + #endif + + #if ENABLED(BABYSTEPPING) + static void M290(); + #endif + + #if HAS_BUZZER + static void M300(); + #endif + + #if ENABLED(PIDTEMP) + static void M301(); + #endif + + #if ENABLED(PREVENT_COLD_EXTRUSION) + static void M302(); + #endif + + static void M303(); + + #if ENABLED(PIDTEMPBED) + static void M304(); + #endif + + #if HAS_MICROSTEPS + static void M350(); + static void M351(); + #endif + + static void M355(); + + #if ENABLED(MORGAN_SCARA) + static bool M360(); + static bool M361(); + static bool M362(); + static bool M363(); + static bool M364(); + #endif + + #if ENABLED(EXT_SOLENOID) + static void M380(); + static void M381(); + #endif + + static void M400(); + + #if HAS_BED_PROBE + static void M401(); + static void M402(); + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static void M404(); + static void M405(); + static void M406(); + static void M407(); + #endif + + #if HAS_LEVELING + static void M420(); + static void M421(); + #endif + + #if HAS_M206_COMMAND + static void M428(); + #endif + + static void M500(); + static void M501(); + static void M502(); + #if DISABLED(DISABLE_M503) + static void M503(); + #endif + #if ENABLED(EEPROM_SETTINGS) + static void M504(); + #endif + + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + static void M540(); + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + static void M600(); + static void M603(); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + static void M605(); + #endif + + #if IS_KINEMATIC + static void M665(); + #endif + + #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + static void M666(); + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + static void M701(); + static void M702(); + #endif + + #if HAS_BED_PROBE + static void M851(); + #endif + + #if ENABLED(SKEW_CORRECTION_GCODE) + static void M852(); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + FORCE_INLINE static void M860() { I2CPEM.M860(); } + FORCE_INLINE static void M861() { I2CPEM.M861(); } + FORCE_INLINE static void M862() { I2CPEM.M862(); } + FORCE_INLINE static void M863() { I2CPEM.M863(); } + FORCE_INLINE static void M864() { I2CPEM.M864(); } + FORCE_INLINE static void M865() { I2CPEM.M865(); } + FORCE_INLINE static void M866() { I2CPEM.M866(); } + FORCE_INLINE static void M867() { I2CPEM.M867(); } + FORCE_INLINE static void M868() { I2CPEM.M868(); } + FORCE_INLINE static void M869() { I2CPEM.M869(); } + #endif + + #if ENABLED(LIN_ADVANCE) + static void M900(); + #endif + + #if HAS_TRINAMIC + #if ENABLED(TMC_DEBUG) + static void M122(); + #endif + static void M906(); + static void M911(); + static void M912(); + #if ENABLED(HYBRID_THRESHOLD) + static void M913(); + #endif + #if ENABLED(SENSORLESS_HOMING) + static void M914(); + #endif + #if ENABLED(TMC_Z_CALIBRATION) + static void M915(); + #endif + #endif + + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) + static void M907(); + #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) + static void M908(); + #if ENABLED(DAC_STEPPER_CURRENT) + static void M909(); + static void M910(); + #endif + #endif + #endif + + #if ENABLED(SDSUPPORT) + static void M928(); + #endif + + static void M999(); + + static void T(const uint8_t tmp_extruder); + +}; + +extern GcodeSuite gcode; + +#endif // _GCODE_H_ diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp new file mode 100644 index 0000000000..d386e2eed2 --- /dev/null +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(CNC_WORKSPACE_PLANES) + +#include "../gcode.h" + +inline void report_workspace_plane() { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Workspace Plane "); + serialprintPGM( + gcode.workspace_plane == GcodeSuite::PLANE_YZ ? PSTR("YZ\n") + : gcode.workspace_plane == GcodeSuite::PLANE_ZX ? PSTR("ZX\n") + : PSTR("XY\n") + ); +} + +inline void set_workspace_plane(const GcodeSuite::WorkspacePlane plane) { + gcode.workspace_plane = plane; + if (DEBUGGING(INFO)) report_workspace_plane(); +} + +/** + * G17: Select Plane XY + * G18: Select Plane ZX + * G19: Select Plane YZ + */ +void GcodeSuite::G17() { set_workspace_plane(PLANE_XY); } +void GcodeSuite::G18() { set_workspace_plane(PLANE_ZX); } +void GcodeSuite::G19() { set_workspace_plane(PLANE_YZ); } + +#endif // CNC_WORKSPACE_PLANES diff --git a/Marlin/src/gcode/geometry/G53-G59.cpp b/Marlin/src/gcode/geometry/G53-G59.cpp new file mode 100644 index 0000000000..09708c03ea --- /dev/null +++ b/Marlin/src/gcode/geometry/G53-G59.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(CNC_COORDINATE_SYSTEMS) + +#include "../../module/stepper.h" + +/** + * Select a coordinate system and update the workspace offset. + * System index -1 is used to specify machine-native. + */ +bool GcodeSuite::select_coordinate_system(const int8_t _new) { + if (active_coordinate_system == _new) return false; + planner.synchronize(); + float old_offset[XYZ] = { 0 }, new_offset[XYZ] = { 0 }; + if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) + COPY(old_offset, coordinate_system[active_coordinate_system]); + if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1)) + COPY(new_offset, coordinate_system[_new]); + active_coordinate_system = _new; + LOOP_XYZ(i) { + const float diff = new_offset[i] - old_offset[i]; + if (diff) { + position_shift[i] += diff; + update_software_endstops((AxisEnum)i); + } + } + return true; +} + +/** + * G53: Apply native workspace to the current move + * + * In CNC G-code G53 is a modifier. + * It precedes a movement command (or other modifiers) on the same line. + * This is the first command to use parser.chain() to make this possible. + * + * Marlin also uses G53 on a line by itself to go back to native space. + */ +inline void GcodeSuite::G53() { + const int8_t _system = active_coordinate_system; + active_coordinate_system = -1; + if (parser.chain()) { // If this command has more following... + process_parsed_command(); + active_coordinate_system = _system; + } +} + +/** + * G54-G59.3: Select a new workspace + * + * A workspace is an XYZ offset to the machine native space. + * All workspaces default to 0,0,0 at start, or with EEPROM + * support they may be restored from a previous session. + * + * G92 is used to set the current workspace's offset. + */ +void G54_59(uint8_t subcode=0) { + const int8_t _space = parser.codenum - 54 + subcode; + if (gcode.select_coordinate_system(_space)) { + SERIAL_PROTOCOLLNPAIR("Select workspace ", _space); + report_current_position(); + } +} +void GcodeSuite::G54() { G54_59(); } +void GcodeSuite::G55() { G54_59(); } +void GcodeSuite::G56() { G54_59(); } +void GcodeSuite::G57() { G54_59(); } +void GcodeSuite::G58() { G54_59(); } +void GcodeSuite::G59() { G54_59(parser.subcode); } + +#endif // CNC_COORDINATE_SYSTEMS diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp new file mode 100644 index 0000000000..933a6e1cdb --- /dev/null +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "../../feature/I2CPositionEncoder.h" +#endif + +/** + * G92: Set current position to given X Y Z E + */ +void GcodeSuite::G92() { + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + switch (parser.subcode) { + case 1: + // Zero the G92 values and restore current position + #if !IS_SCARA + LOOP_XYZ(i) { + const float v = position_shift[i]; + if (v) { + position_shift[i] = 0; + update_software_endstops((AxisEnum)i); + } + } + #endif // Not SCARA + return; + } + #endif + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + #define IS_G92_0 (parser.subcode == 0) + #else + #define IS_G92_0 true + #endif + + bool didE = false; + #if IS_SCARA || !HAS_POSITION_SHIFT + bool didXYZ = false; + #else + constexpr bool didXYZ = false; + #endif + + if (IS_G92_0) LOOP_XYZE(i) { + if (parser.seenval(axis_codes[i])) { + const float l = parser.value_axis_units((AxisEnum)i), + v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), + d = v - current_position[i]; + if (!NEAR_ZERO(d)) { + #if IS_SCARA || !HAS_POSITION_SHIFT + if (i == E_AXIS) didE = true; else didXYZ = true; + current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior + #elif HAS_POSITION_SHIFT + if (i == E_AXIS) { + didE = true; + current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly + } + else { + position_shift[i] += d; // Other axes simply offset the coordinate space + update_software_endstops((AxisEnum)i); + } + #endif + } + } + } + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + // Apply workspace offset to the active coordinate system + if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) + COPY(coordinate_system[active_coordinate_system], position_shift); + #endif + + if (didXYZ) SYNC_PLAN_POSITION_KINEMATIC(); + else if (didE) sync_plan_position_e(); + + report_current_position(); +} diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp new file mode 100644 index 0000000000..88a60d545b --- /dev/null +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -0,0 +1,88 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_M206_COMMAND + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" +#include "../../libs/buzzer.h" +#include "../../Marlin.h" // for axis_homed + +/** + * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y + * + * *** @thinkyhead: I recommend deprecating M206 for SCARA in favor of M665. + * *** M206 for SCARA will remain enabled in 1.1.x for compatibility. + * *** In the 2.0 release, it will simply be disabled by default. + */ +void GcodeSuite::M206() { + LOOP_XYZ(i) + if (parser.seen(axis_codes[i])) + set_home_offset((AxisEnum)i, parser.value_linear_units()); + + #if ENABLED(MORGAN_SCARA) + if (parser.seen('T')) set_home_offset(A_AXIS, parser.value_float()); // Theta + if (parser.seen('P')) set_home_offset(B_AXIS, parser.value_float()); // Psi + #endif + + report_current_position(); +} + +/** + * M428: Set home_offset based on the distance between the + * current_position and the nearest "reference point." + * If an axis is past center its endstop position + * is the reference-point. Otherwise it uses 0. This allows + * the Z offset to be set near the bed when using a max endstop. + * + * M428 can't be used more than 2cm away from 0 or an endstop. + * + * Use M206 to set these values directly. + */ +void GcodeSuite::M428() { + if (axis_unhomed_error()) return; + + float diff[XYZ]; + LOOP_XYZ(i) { + diff[i] = base_home_pos((AxisEnum)i) - current_position[i]; + if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0) + diff[i] = -current_position[i]; + if (!WITHIN(diff[i], -20, 20)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR); + LCD_ALERTMESSAGEPGM("Err: Too far!"); + BUZZ(200, 40); + return; + } + } + + LOOP_XYZ(i) set_home_offset((AxisEnum)i, diff[i]); + report_current_position(); + LCD_MESSAGEPGM(MSG_HOME_OFFSETS_APPLIED); + BUZZ(100, 659); + BUZZ(100, 698); +} + +#endif // HAS_M206_COMMAND diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp new file mode 100644 index 0000000000..fc53611d90 --- /dev/null +++ b/Marlin/src/gcode/host/M110.cpp @@ -0,0 +1,31 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../queue.h" // for gcode_LastN + +/** + * M110: Set Current Line Number + */ +void GcodeSuite::M110() { + if (parser.seenval('N')) gcode_LastN = parser.value_long(); +} diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp new file mode 100644 index 0000000000..97a827de0e --- /dev/null +++ b/Marlin/src/gcode/host/M113.cpp @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(HOST_KEEPALIVE_FEATURE) + +#include "../gcode.h" + +/** + * M113: Get or set Host Keepalive interval (0 to disable) + * + * S Optional. Set the keepalive interval. + */ +void GcodeSuite::M113() { + if (parser.seenval('S')) { + host_keepalive_interval = parser.value_byte(); + NOMORE(host_keepalive_interval, 60); + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("M113 S", (unsigned long)host_keepalive_interval); + } +} + +#endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp new file mode 100644 index 0000000000..e273c4e101 --- /dev/null +++ b/Marlin/src/gcode/host/M114.cpp @@ -0,0 +1,131 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" + +#if ENABLED(M114_DETAIL) + + void report_xyze(const float pos[], const uint8_t n = 4, const uint8_t precision = 3) { + char str[12]; + for (uint8_t i = 0; i < n; i++) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[i]); + SERIAL_CHAR(':'); + SERIAL_PROTOCOL(dtostrf(pos[i], 8, precision, str)); + } + SERIAL_EOL(); + } + + inline void report_xyz(const float pos[]) { report_xyze(pos, 3); } + + void report_current_position_detail() { + + SERIAL_PROTOCOLPGM("\nLogical:"); + const float logical[XYZ] = { + LOGICAL_X_POSITION(current_position[X_AXIS]), + LOGICAL_Y_POSITION(current_position[Y_AXIS]), + LOGICAL_Z_POSITION(current_position[Z_AXIS]) + }; + report_xyz(logical); + + SERIAL_PROTOCOLPGM("Raw: "); + report_xyz(current_position); + + float leveled[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + + #if PLANNER_LEVELING + SERIAL_PROTOCOLPGM("Leveled:"); + planner.apply_leveling(leveled); + report_xyz(leveled); + + SERIAL_PROTOCOLPGM("UnLevel:"); + float unleveled[XYZ] = { leveled[X_AXIS], leveled[Y_AXIS], leveled[Z_AXIS] }; + planner.unapply_leveling(unleveled); + report_xyz(unleveled); + #endif + + #if IS_KINEMATIC + #if IS_SCARA + SERIAL_PROTOCOLPGM("ScaraK: "); + #else + SERIAL_PROTOCOLPGM("DeltaK: "); + #endif + inverse_kinematics(leveled); // writes delta[] + report_xyz(delta); + #endif + + planner.synchronize(); + + SERIAL_PROTOCOLPGM("Stepper:"); + LOOP_XYZE(i) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[i]); + SERIAL_CHAR(':'); + SERIAL_PROTOCOL(stepper.position((AxisEnum)i)); + } + SERIAL_EOL(); + + #if IS_SCARA + const float deg[XYZ] = { + planner.get_axis_position_degrees(A_AXIS), + planner.get_axis_position_degrees(B_AXIS) + }; + SERIAL_PROTOCOLPGM("Degrees:"); + report_xyze(deg, 2); + #endif + + SERIAL_PROTOCOLPGM("FromStp:"); + get_cartesian_from_steppers(); // writes cartes[XYZ] (with forward kinematics) + const float from_steppers[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], planner.get_axis_position_mm(E_AXIS) }; + report_xyze(from_steppers); + + const float diff[XYZE] = { + from_steppers[X_AXIS] - leveled[X_AXIS], + from_steppers[Y_AXIS] - leveled[Y_AXIS], + from_steppers[Z_AXIS] - leveled[Z_AXIS], + from_steppers[E_AXIS] - current_position[E_AXIS] + }; + SERIAL_PROTOCOLPGM("Differ: "); + report_xyze(diff); + } + +#endif // M114_DETAIL + +/** + * M114: Report current position to host + */ +void GcodeSuite::M114() { + + #if ENABLED(M114_DETAIL) + if (parser.seen('D')) { + report_current_position_detail(); + return; + } + #endif + + planner.synchronize(); + report_current_position(); +} diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp new file mode 100644 index 0000000000..c828e519e0 --- /dev/null +++ b/Marlin/src/gcode/host/M115.cpp @@ -0,0 +1,157 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../inc/MarlinConfig.h" + +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +#if ENABLED(EXTENDED_CAPABILITIES_REPORT) + static void cap_line(const char * const name, bool ena=false) { + SERIAL_PROTOCOLPGM("Cap:"); + serialprintPGM(name); + SERIAL_CHAR(':'); + SERIAL_PROTOCOLLN(int(ena ? 1 : 0)); + } +#endif + +/** + * M115: Capabilities string + */ +void GcodeSuite::M115() { + #if NUM_SERIAL > 1 + const int8_t port = command_queue_port[cmd_queue_index_r]; + #define CAPLINE(STR,...) cap_line(PSTR(STR), port, __VA_ARGS__) + #else + #define CAPLINE(STR,...) cap_line(PSTR(STR), __VA_ARGS__) + #endif + + SERIAL_PROTOCOLLNPGM_P(port, MSG_M115_REPORT); + + #if ENABLED(EXTENDED_CAPABILITIES_REPORT) + + // SERIAL_XON_XOFF + cap_line(PSTR("SERIAL_XON_XOFF") + #if ENABLED(SERIAL_XON_XOFF) + , true + #endif + ); + + // EEPROM (M500, M501) + cap_line(PSTR("EEPROM") + #if ENABLED(EEPROM_SETTINGS) + , true + #endif + ); + + // Volumetric Extrusion (M200) + cap_line(PSTR("VOLUMETRIC") + #if DISABLED(NO_VOLUMETRICS) + , true + #endif + ); + + // AUTOREPORT_TEMP (M155) + cap_line(PSTR("AUTOREPORT_TEMP") + #if ENABLED(AUTO_REPORT_TEMPERATURES) + , true + #endif + ); + + // PROGRESS (M530 S L, M531 , M532 X L) + cap_line(PSTR("PROGRESS")); + + // Print Job timer M75, M76, M77 + cap_line(PSTR("PRINT_JOB"), true); + + // AUTOLEVEL (G29) + cap_line(PSTR("AUTOLEVEL") + #if HAS_AUTOLEVEL + , true + #endif + ); + + // Z_PROBE (G30) + cap_line(PSTR("Z_PROBE") + #if HAS_BED_PROBE + , true + #endif + ); + + // MESH_REPORT (M420 V) + cap_line(PSTR("LEVELING_DATA") + #if HAS_LEVELING + , true + #endif + ); + + // BUILD_PERCENT (M73) + cap_line(PSTR("BUILD_PERCENT") + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + , true + #endif + ); + + // SOFTWARE_POWER (M80, M81) + cap_line(PSTR("SOFTWARE_POWER") + #if HAS_POWER_SWITCH + , true + #endif + ); + + // CASE LIGHTS (M355) + cap_line(PSTR("TOGGLE_LIGHTS") + #if HAS_CASE_LIGHT + , true + #endif + ); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS") + #if HAS_CASE_LIGHT + , USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN) + #endif + ); + + // EMERGENCY_PARSER (M108, M112, M410) + cap_line(PSTR("EMERGENCY_PARSER") + #if ENABLED(EMERGENCY_PARSER) + , true + #endif + ); + + // AUTOREPORT_SD_STATUS (M27 extension) + cap_line(PSTR("AUTOREPORT_SD_STATUS") + #if ENABLED(AUTO_REPORT_SD_STATUS) + , true + #endif + ); + + // THERMAL_PROTECTION + cap_line(PSTR("THERMAL_PROTECTION") + #if ENABLED(THERMAL_PROTECTION_HOTENDS) && ENABLED(THERMAL_PROTECTION_BED) + , true + #endif + ); + + #endif // EXTENDED_CAPABILITIES_REPORT +} diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp new file mode 100644 index 0000000000..1bd132a3a6 --- /dev/null +++ b/Marlin/src/gcode/host/M118.cpp @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" + +/** + * M118: Display a message in the host console. + * + * A1 Prepend '// ' for an action command, as in OctoPrint + * E1 Have the host 'echo:' the text + */ +void GcodeSuite::M118() { + bool hasE = false, hasA = false; + char *p = parser.string_arg; + for (uint8_t i = 2; i--;) + if ((p[0] == 'A' || p[0] == 'E') && p[1] == '1') { + if (p[0] == 'A') hasA = true; + if (p[0] == 'E') hasE = true; + p += 2; + while (*p == ' ') ++p; + } + if (hasE) SERIAL_ECHO_START(); + if (hasA) SERIAL_ECHOPGM("// "); + SERIAL_ECHOLN(p); +} diff --git a/Marlin/src/gcode/host/M119.cpp b/Marlin/src/gcode/host/M119.cpp new file mode 100644 index 0000000000..7e2399e169 --- /dev/null +++ b/Marlin/src/gcode/host/M119.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/endstops.h" + +/** + * M119: Output endstop states to serial output + */ +void GcodeSuite::M119() { + + endstops.M119(); + +} diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp new file mode 100644 index 0000000000..7563f85ff6 --- /dev/null +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -0,0 +1,108 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_RESUME_CONTINUE + +#include "../gcode.h" +#include "../../module/stepper.h" + +#if ENABLED(ULTIPANEL) + #include "../../lcd/ultralcd.h" +#endif + +#include "../../sd/cardreader.h" + +#if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) + bool GcodeSuite::lights_off_after_print; + #include "../../feature/leds/leds.h" +#endif + +/** + * M0: Unconditional stop - Wait for user button press on LCD + * M1: Conditional stop - Wait for user button press on LCD + */ +void GcodeSuite::M0_M1() { + const char * const args = parser.string_arg; + + millis_t ms = 0; + bool hasP = false, hasS = false; + if (parser.seenval('P')) { + ms = parser.value_millis(); // milliseconds to wait + hasP = ms > 0; + } + if (parser.seenval('S')) { + ms = parser.value_millis_from_seconds(); // seconds to wait + hasS = ms > 0; + } + + const bool has_message = !hasP && !hasS && args && *args; + + planner.synchronize(); + + #if ENABLED(ULTIPANEL) + + if (has_message) + lcd_setstatus(args, true); + else { + LCD_MESSAGEPGM(MSG_USERWAIT); + #if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 + dontExpireStatus(); + #endif + } + + #else + + if (has_message) { + SERIAL_ECHO_START(); + SERIAL_ECHOLN(args); + } + + #endif + + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; + + if (ms > 0) { + ms += millis(); // wait until this time for a click + while (PENDING(millis(), ms) && wait_for_user) idle(); + } + else + while (wait_for_user) idle(); + + #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) + if (lights_off_after_print) { + leds.set_off(); + lights_off_after_print = false; + } + #endif + + #if ENABLED(ULTIPANEL) + lcd_reset_status(); + #endif + + wait_for_user = false; + KEEPALIVE_STATE(IN_HANDLER); +} + +#endif // HAS_RESUME_CONTINUE diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp new file mode 100644 index 0000000000..0f508d8eb9 --- /dev/null +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M117: Set LCD Status Message + */ +void GcodeSuite::M117() { + + lcd_setstatus(parser.string_arg); + +} diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp new file mode 100644 index 0000000000..3fda5bb047 --- /dev/null +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ULTIPANEL) + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M145: Set the heatup state for a material in the LCD menu + * + * S (0=PLA, 1=ABS) + * H + * B + * F + */ +void GcodeSuite::M145() { + const uint8_t material = (uint8_t)parser.intval('S'); + if (material >= COUNT(lcd_preheat_hotend_temp)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MATERIAL_INDEX); + } + else { + int v; + if (parser.seenval('H')) { + v = parser.value_int(); + lcd_preheat_hotend_temp[material] = constrain(v, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - 15); + } + if (parser.seenval('F')) { + v = parser.value_int(); + lcd_preheat_fan_speed[material] = constrain(v, 0, 255); + } + #if TEMP_SENSOR_BED != 0 + if (parser.seenval('B')) { + v = parser.value_int(); + lcd_preheat_bed_temp[material] = constrain(v, BED_MINTEMP, BED_MAXTEMP - 15); + } + #endif + } +} + +#endif // ULTIPANEL diff --git a/Marlin/src/gcode/lcd/M250.cpp b/Marlin/src/gcode/lcd/M250.cpp new file mode 100644 index 0000000000..bede88126a --- /dev/null +++ b/Marlin/src/gcode/lcd/M250.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_LCD_CONTRAST + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M250: Read and optionally set the LCD contrast + */ +void GcodeSuite::M250() { + if (parser.seen('C')) set_lcd_contrast(parser.value_int()); + SERIAL_PROTOCOLPGM("lcd contrast value: "); + SERIAL_PROTOCOL(lcd_contrast); + SERIAL_EOL(); +} + +#endif // HAS_LCD_CONTRAST diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp new file mode 100644 index 0000000000..0e56587934 --- /dev/null +++ b/Marlin/src/gcode/lcd/M300.cpp @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_BUZZER + +#include "../gcode.h" + +#include "../../lcd/ultralcd.h" // i2c-based BUZZ +#include "../../libs/buzzer.h" // Buzzer, if possible + +/** + * M300: Play beep sound S P + */ +void GcodeSuite::M300() { + uint16_t const frequency = parser.ushortval('S', 260); + uint16_t duration = parser.ushortval('P', 1000); + + // Limits the tone duration to 0-5 seconds. + NOMORE(duration, 5000U); + + BUZZ(duration, frequency); +} + +#endif // HAS_BUZZER diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp new file mode 100644 index 0000000000..1c1deee9f9 --- /dev/null +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" +#include "../../sd/cardreader.h" + +/** + * M73: Set percentage complete (for display on LCD) + * + * Example: + * M73 P25 ; Set progress to 25% + * + * Notes: + * This has no effect during an SD print job + */ +void GcodeSuite::M73() { + if (!IS_SD_PRINTING && parser.seen('P')) { + progress_bar_percent = parser.value_byte(); + NOMORE(progress_bar_percent, 100); + } +} + +#endif // ULTRA_LCD && LCD_SET_PROGRESS_MANUALLY diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp new file mode 100644 index 0000000000..b0e088b821 --- /dev/null +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/motion.h" + +#include "../../Marlin.h" + +#if ENABLED(FWRETRACT) + #include "../../feature/fwretract.h" +#endif + +#include "../../sd/cardreader.h" + +#if ENABLED(NANODLP_Z_SYNC) + #include "../../module/stepper.h" +#endif + +extern float destination[XYZE]; + +#if ENABLED(NO_MOTION_BEFORE_HOMING) + #define G0_G1_CONDITION !axis_unhomed_error(parser.seen('X'), parser.seen('Y'), parser.seen('Z')) +#else + #define G0_G1_CONDITION true +#endif + +/** + * G0, G1: Coordinated movement of X Y Z E axes + */ +void GcodeSuite::G0_G1( + #if IS_SCARA + bool fast_move/*=false*/ + #endif +) { + if (IsRunning() && G0_G1_CONDITION) { + get_destination_from_command(); // For X Y Z E F + + #if ENABLED(FWRETRACT) + + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { + // When M209 Autoretract is enabled, convert E-only moves to firmware retract/recover moves + if (fwretract.autoretract_enabled && parser.seen('E') && !(parser.seen('X') || parser.seen('Y') || parser.seen('Z'))) { + const float echange = destination[E_AXIS] - current_position[E_AXIS]; + // Is this a retract or recover move? + if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) { + current_position[E_AXIS] = destination[E_AXIS]; // Hide a G1-based retract/recover from calculations + sync_plan_position_e(); // AND from the planner + return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) + } + } + } + + #endif // FWRETRACT + + #if IS_SCARA + fast_move ? prepare_uninterpolated_move_to_destination() : prepare_move_to_destination(); + #else + prepare_move_to_destination(); + #endif + + #if ENABLED(NANODLP_Z_SYNC) + #if ENABLED(NANODLP_ALL_AXIS) + #define _MOVE_SYNC parser.seenval('X') || parser.seenval('Y') || parser.seenval('Z') // For any move wait and output sync message + #else + #define _MOVE_SYNC parser.seenval('Z') // Only for Z move + #endif + if (_MOVE_SYNC) { + planner.synchronize(); + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); + } + #endif + } +} diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp new file mode 100644 index 0000000000..4c2c5ac913 --- /dev/null +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -0,0 +1,319 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ARC_SUPPORT) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/temperature.h" + +#if ENABLED(DELTA) + #include "../../module/delta.h" +#elif ENABLED(SCARA) + #include "../../module/scara.h" +#endif + +#if ENABLED(SCARA_FEEDRATE_SCALING) && ENABLED(AUTO_BED_LEVELING_BILINEAR) + #include "../../feature/bedlevel/abl/abl.h" +#endif + +#if N_ARC_CORRECTION < 1 + #undef N_ARC_CORRECTION + #define N_ARC_CORRECTION 1 +#endif + +/** + * Plan an arc in 2 dimensions + * + * The arc is approximated by generating many small linear segments. + * The length of each segment is configured in MM_PER_ARC_SEGMENT (Default 1mm) + * Arcs should only be made relatively large (over 5mm), as larger arcs with + * larger segments will tend to be more efficient. Your slicer should have + * options for G2/G3 arc generation. In future these options may be GCode tunable. + */ +void plan_arc( + const float (&cart)[XYZE], // Destination position + const float (&offset)[2], // Center of rotation relative to current_position + const uint8_t clockwise // Clockwise? +) { + #if ENABLED(CNC_WORKSPACE_PLANES) + AxisEnum p_axis, q_axis, l_axis; + switch (gcode.workspace_plane) { + default: + case GcodeSuite::PLANE_XY: p_axis = X_AXIS; q_axis = Y_AXIS; l_axis = Z_AXIS; break; + case GcodeSuite::PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; + case GcodeSuite::PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; + } + #else + constexpr AxisEnum p_axis = X_AXIS, q_axis = Y_AXIS, l_axis = Z_AXIS; + #endif + + // Radius vector from center to current location + float r_P = -offset[0], r_Q = -offset[1]; + + const float radius = HYPOT(r_P, r_Q), + center_P = current_position[p_axis] - r_P, + center_Q = current_position[q_axis] - r_Q, + rt_X = cart[p_axis] - center_P, + rt_Y = cart[q_axis] - center_Q, + linear_travel = cart[l_axis] - current_position[l_axis], + extruder_travel = cart[E_AXIS] - current_position[E_AXIS]; + + // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. + float angular_travel = ATAN2(r_P * rt_Y - r_Q * rt_X, r_P * rt_X + r_Q * rt_Y); + if (angular_travel < 0) angular_travel += RADIANS(360); + if (clockwise) angular_travel -= RADIANS(360); + + // Make a circle if the angular rotation is 0 and the target is current position + if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) + angular_travel = RADIANS(360); + + const float flat_mm = radius * angular_travel, + mm_of_travel = linear_travel ? HYPOT(flat_mm, linear_travel) : ABS(flat_mm); + if (mm_of_travel < 0.001) return; + + uint16_t segments = FLOOR(mm_of_travel / (MM_PER_ARC_SEGMENT)); + if (segments == 0) segments = 1; + + /** + * Vector rotation by transformation matrix: r is the original vector, r_T is the rotated vector, + * and phi is the angle of rotation. Based on the solution approach by Jens Geisler. + * r_T = [cos(phi) -sin(phi); + * sin(phi) cos(phi)] * r ; + * + * For arc generation, the center of the circle is the axis of rotation and the radius vector is + * defined from the circle center to the initial position. Each line segment is formed by successive + * vector rotations. This requires only two cos() and sin() computations to form the rotation + * matrix for the duration of the entire arc. Error may accumulate from numerical round-off, since + * all double numbers are single precision on the Arduino. (True double precision will not have + * round off issues for CNC applications.) Single precision error can accumulate to be greater than + * tool precision in some cases. Therefore, arc path correction is implemented. + * + * Small angle approximation may be used to reduce computation overhead further. This approximation + * holds for everything, but very small circles and large MM_PER_ARC_SEGMENT values. In other words, + * theta_per_segment would need to be greater than 0.1 rad and N_ARC_CORRECTION would need to be large + * to cause an appreciable drift error. N_ARC_CORRECTION~=25 is more than small enough to correct for + * numerical drift error. N_ARC_CORRECTION may be on the order a hundred(s) before error becomes an + * issue for CNC machines with the single precision Arduino calculations. + * + * This approximation also allows plan_arc to immediately insert a line segment into the planner + * without the initial overhead of computing cos() or sin(). By the time the arc needs to be applied + * a correction, the planner should have caught up to the lag caused by the initial plan_arc overhead. + * This is important when there are successive arc motions. + */ + // Vector rotation matrix values + float raw[XYZE]; + const float theta_per_segment = angular_travel / segments, + linear_per_segment = linear_travel / segments, + extruder_per_segment = extruder_travel / segments, + sin_T = theta_per_segment, + cos_T = 1 - 0.5 * sq(theta_per_segment); // Small angle approximation + + // Initialize the linear axis + raw[l_axis] = current_position[l_axis]; + + // Initialize the extruder axis + raw[E_AXIS] = current_position[E_AXIS]; + + const float fr_mm_s = MMS_SCALED(feedrate_mm_s); + + millis_t next_idle_ms = millis() + 200UL; + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // SCARA needs to scale the feed rate from mm/s to degrees/s + const float inv_segment_length = 1.0 / (MM_PER_ARC_SEGMENT), + inverse_secs = inv_segment_length * fr_mm_s; + float oldA = planner.position_float[A_AXIS], + oldB = planner.position_float[B_AXIS]; + #endif + + #if N_ARC_CORRECTION > 1 + int8_t arc_recalc_count = N_ARC_CORRECTION; + #endif + + for (uint16_t i = 1; i < segments; i++) { // Iterate (segments-1) times + + thermalManager.manage_heater(); + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + + #if N_ARC_CORRECTION > 1 + if (--arc_recalc_count) { + // Apply vector rotation matrix to previous r_P / 1 + const float r_new_Y = r_P * sin_T + r_Q * cos_T; + r_P = r_P * cos_T - r_Q * sin_T; + r_Q = r_new_Y; + } + else + #endif + { + #if N_ARC_CORRECTION > 1 + arc_recalc_count = N_ARC_CORRECTION; + #endif + + // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments. + // Compute exact location by applying transformation matrix from initial radius vector(=-offset). + // To reduce stuttering, the sin and cos could be computed at different times. + // For now, compute both at the same time. + const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); + r_P = -offset[0] * cos_Ti + offset[1] * sin_Ti; + r_Q = -offset[0] * sin_Ti - offset[1] * cos_Ti; + } + + // Update raw location + raw[p_axis] = center_P + r_P; + raw[q_axis] = center_Q + r_Q; + raw[l_axis] += linear_per_segment; + raw[E_AXIS] += extruder_per_segment; + + clamp_to_software_endstops(raw); + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + inverse_kinematics(raw); + ADJUST_DELTA(raw); + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder)) + break; + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; + #elif HAS_UBL_AND_CURVES + float pos[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; + planner.apply_leveling(pos); + if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], raw[E_AXIS], fr_mm_s, active_extruder)) + break; + #else + if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder)) + break; + #endif + } + + // Ensure last segment arrives at target location. + #if ENABLED(SCARA_FEEDRATE_SCALING) + inverse_kinematics(cart); + ADJUST_DELTA(cart); + const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); + if (diff2) + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], cart[Z_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder); + #elif HAS_UBL_AND_CURVES + float pos[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; + planner.apply_leveling(pos); + planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], cart[E_AXIS], fr_mm_s, active_extruder); + #else + planner.buffer_line_kinematic(cart, fr_mm_s, active_extruder); + #endif + + COPY(current_position, cart); +} // plan_arc + +/** + * G2: Clockwise Arc + * G3: Counterclockwise Arc + * + * This command has two forms: IJ-form and R-form. + * + * - I specifies an X offset. J specifies a Y offset. + * At least one of the IJ parameters is required. + * X and Y can be omitted to do a complete circle. + * The given XY is not error-checked. The arc ends + * based on the angle of the destination. + * Mixing I or J with R will throw an error. + * + * - R specifies the radius. X or Y is required. + * Omitting both X and Y will throw an error. + * X or Y must differ from the current XY. + * Mixing R with I or J will throw an error. + * + * - P specifies the number of full circles to do + * before the specified arc move. + * + * Examples: + * + * G2 I10 ; CW circle centered at X+10 + * G3 X20 Y12 R14 ; CCW circle with r=14 ending at X20 Y12 + */ +void GcodeSuite::G2_G3(const bool clockwise) { + if (MOTION_CONDITIONS) { + + #if ENABLED(SF_ARC_FIX) + const bool relative_mode_backup = relative_mode; + relative_mode = true; + #endif + + get_destination_from_command(); + + #if ENABLED(SF_ARC_FIX) + relative_mode = relative_mode_backup; + #endif + + float arc_offset[2] = { 0.0, 0.0 }; + if (parser.seenval('R')) { + const float r = parser.value_linear_units(), + p1 = current_position[X_AXIS], q1 = current_position[Y_AXIS], + p2 = destination[X_AXIS], q2 = destination[Y_AXIS]; + if (r && (p2 != p1 || q2 != q1)) { + const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 + dx = p2 - p1, dy = q2 - q1, // X and Y differences + d = HYPOT(dx, dy), // Linear distance between the points + h = SQRT(sq(r) - sq(d * 0.5)), // Distance to the arc pivot-point + mx = (p1 + p2) * 0.5, my = (q1 + q2) * 0.5, // Point between the two points + sx = -dy / d, sy = dx / d, // Slope of the perpendicular bisector + cx = mx + e * h * sx, cy = my + e * h * sy; // Pivot-point of the arc + arc_offset[0] = cx - p1; + arc_offset[1] = cy - q1; + } + } + else { + if (parser.seenval('I')) arc_offset[0] = parser.value_linear_units(); + if (parser.seenval('J')) arc_offset[1] = parser.value_linear_units(); + } + + if (arc_offset[0] || arc_offset[1]) { + + #if ENABLED(ARC_P_CIRCLES) + // P indicates number of circles to do + int8_t circles_to_do = parser.byteval('P'); + if (!WITHIN(circles_to_do, 0, 100)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); + } + while (circles_to_do--) + plan_arc(current_position, arc_offset, clockwise); + #endif + + // Send the arc to the planner + plan_arc(destination, arc_offset, clockwise); + reset_stepper_timeout(); + } + else { + // Bad arguments + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); + } + } +} + +#endif // ARC_SUPPORT diff --git a/Marlin/src/gcode/motion/G4.cpp b/Marlin/src/gcode/motion/G4.cpp new file mode 100644 index 0000000000..7d53cb0304 --- /dev/null +++ b/Marlin/src/gcode/motion/G4.cpp @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/stepper.h" +#include "../../lcd/ultralcd.h" + +/** + * G4: Dwell S or P + */ +void GcodeSuite::G4() { + millis_t dwell_ms = 0; + + if (parser.seenval('P')) dwell_ms = parser.value_millis(); // milliseconds to wait + if (parser.seenval('S')) dwell_ms = parser.value_millis_from_seconds(); // seconds to wait + + planner.synchronize(); + #if ENABLED(NANODLP_Z_SYNC) + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); + #endif + + if (!lcd_hasstatus()) LCD_MESSAGEPGM(MSG_DWELL); + + dwell(dwell_ms); +} diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp new file mode 100644 index 0000000000..8cd70da15d --- /dev/null +++ b/Marlin/src/gcode/motion/G5.cpp @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(BEZIER_CURVE_SUPPORT) + +#include "../../module/motion.h" +#include "../../module/planner_bezier.h" + +void plan_cubic_move(const float (&cart)[XYZE], const float (&offset)[4]) { + cubic_b_spline(current_position, cart, offset, MMS_SCALED(feedrate_mm_s), active_extruder); + COPY(current_position, cart); +} + +/** + * Parameters interpreted according to: + * http://linuxcnc.org/docs/2.6/html/gcode/parser.html#sec:G5-Cubic-Spline + * However I, J omission is not supported at this point; all + * parameters can be omitted and default to zero. + */ + +#include "../gcode.h" +#include "../../Marlin.h" // for IsRunning() + +/** + * G5: Cubic B-spline + */ +void GcodeSuite::G5() { + if (MOTION_CONDITIONS) { + + #if ENABLED(CNC_WORKSPACE_PLANES) + if (workspace_plane != PLANE_XY) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_BAD_PLANE_MODE); + return; + } + #endif + + get_destination_from_command(); + + const float offset[4] = { + parser.linearval('I'), + parser.linearval('J'), + parser.linearval('P'), + parser.linearval('Q') + }; + + plan_cubic_move(destination, offset); + } +} + +#endif // BEZIER_CURVE_SUPPORT diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp new file mode 100644 index 0000000000..00426ad231 --- /dev/null +++ b/Marlin/src/gcode/motion/M290.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(BABYSTEPPING) + +#include "../gcode.h" +#include "../../module/probe.h" +#include "../../module/temperature.h" +#include "../../module/planner.h" + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../core/serial.h" +#endif + + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + FORCE_INLINE void mod_zprobe_zoffset(const float &offs) { + zprobe_zoffset += offs; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset); + } +#endif + +/** + * M290: Babystepping + */ +void GcodeSuite::M290() { + #if ENABLED(BABYSTEP_XY) + for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) + if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) { + const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); + thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]); + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_zprobe_zoffset(offs); + #endif + } + #else + if (parser.seenval('Z') || parser.seenval('S')) { + const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); + thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]); + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (!parser.seen('P') || parser.value_bool()) mod_zprobe_zoffset(offs); + #endif + } + #endif +} + +#endif // BABYSTEPPING diff --git a/Marlin/parser.cpp b/Marlin/src/gcode/parser.cpp similarity index 96% rename from Marlin/parser.cpp rename to Marlin/src/gcode/parser.cpp index 178583cad0..392532646c 100644 --- a/Marlin/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -26,8 +26,11 @@ #include "parser.h" -#include "Marlin.h" -#include "language.h" +#include "../Marlin.h" + +#if NUM_SERIAL > 1 + #include "queue.h" +#endif // Must be declared for allocation and to satisfy the linker // Zero values need no initialization. @@ -249,10 +252,13 @@ void GCodeParser::parse(char *p) { #endif // CNC_COORDINATE_SYSTEMS void GCodeParser::unknown_command_error() { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(MSG_UNKNOWN_COMMAND, command_ptr); - SERIAL_CHAR('"'); - SERIAL_EOL(); + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, MSG_UNKNOWN_COMMAND, command_ptr); + SERIAL_CHAR_P(port, '"'); + SERIAL_EOL_P(port); } #if ENABLED(DEBUG_GCODE_PARSER) diff --git a/Marlin/parser.h b/Marlin/src/gcode/parser.h similarity index 94% rename from Marlin/parser.h rename to Marlin/src/gcode/parser.h index 6676f228db..e355856709 100644 --- a/Marlin/parser.h +++ b/Marlin/src/gcode/parser.h @@ -22,21 +22,18 @@ /** * parser.h - Parser for a GCode line, providing a parameter interface. - * Codes like M149 control the way the GCode parser behaves, - * so settings for these codes are located in this class. + * Codes like M149 control the way the GCode parser behaves, + * so settings for these codes are located in this class. */ #ifndef _PARSER_H_ #define _PARSER_H_ -#include "enum.h" -#include "types.h" -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" //#define DEBUG_GCODE_PARSER #if ENABLED(DEBUG_GCODE_PARSER) - #include "hex_print_routines.h" - #include "serial.h" + #include "../libs/hex_print_routines.h" #endif /** @@ -133,11 +130,6 @@ public: if (ind >= COUNT(param)) return false; // Only A-Z const bool b = TEST32(codebits, ind); if (b) { - #if ENABLED(DEBUG_GCODE_PARSER) - if (codenum == 800) { - SERIAL_CHAR('\''); SERIAL_CHAR(c); SERIAL_ECHOLNPGM("' is seen"); - } - #endif char * const ptr = command_ptr + param[ind]; value_ptr = param[ind] && valid_float(ptr) ? ptr : (char*)NULL; } @@ -153,7 +145,7 @@ public: // Code is found in the string. If not found, value_ptr is unchanged. // This allows "if (seen('A')||seen('B'))" to use the last-found value. static bool seen(const char c) { - const char *p = strchr(command_args, c); + char *p = strchr(command_args, c); const bool b = !!p; if (b) value_ptr = valid_float(&p[1]) ? &p[1] : (char*)NULL; return b; @@ -317,7 +309,7 @@ public: // Provide simple value accessors with default option FORCE_INLINE static float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } - FORCE_INLINE static bool boolval(const char c) { return seenval(c) ? value_bool() : seen(c); } + FORCE_INLINE static bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } FORCE_INLINE static uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } FORCE_INLINE static int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } FORCE_INLINE static uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp new file mode 100644 index 0000000000..0c8472e05c --- /dev/null +++ b/Marlin/src/gcode/probe/G30.cpp @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" +#include "../../feature/bedlevel/bedlevel.h" + +/** + * G30: Do a single Z probe at the current XY + * + * Parameters: + * + * X Probe X position (default current X) + * Y Probe Y position (default current Y) + * E Engage the probe for each probe (default 1) + */ +void GcodeSuite::G30() { + const float xpos = parser.linearval('X', current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER), + ypos = parser.linearval('Y', current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER); + + if (!position_is_reachable_by_probe(xpos, ypos)) return; + + // Disable leveling so the planner won't mess with us + #if HAS_LEVELING + set_bed_leveling_enabled(false); + #endif + + setup_for_endstop_or_probe_move(); + + const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; + const float measured_z = probe_pt(xpos, ypos, raise_after, 1); + + if (!isnan(measured_z)) { + SERIAL_PROTOCOLPAIR_F("Bed X: ", xpos); + SERIAL_PROTOCOLPAIR_F(" Y: ", ypos); + SERIAL_PROTOCOLLNPAIR_F(" Z: ", measured_z); + } + + clean_up_after_endstop_or_probe_move(); + + #ifdef Z_AFTER_PROBING + if (raise_after == PROBE_PT_STOW) move_z_after_probing(); + #endif + + report_current_position(); +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/G31_G32.cpp b/Marlin/src/gcode/probe/G31_G32.cpp new file mode 100644 index 0000000000..751efca5b3 --- /dev/null +++ b/Marlin/src/gcode/probe/G31_G32.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(Z_PROBE_SLED) + +#include "../gcode.h" +#include "../../module/probe.h" + +/** + * G31: Deploy the Z probe + */ +void GcodeSuite::G31() { DEPLOY_PROBE(); } + +/** + * G32: Stow the Z probe + */ +void GcodeSuite::G32() { STOW_PROBE(); } + +#endif // Z_PROBE_SLED diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp new file mode 100644 index 0000000000..bdbb635ef3 --- /dev/null +++ b/Marlin/src/gcode/probe/G38.cpp @@ -0,0 +1,121 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(G38_PROBE_TARGET) + +#include "../gcode.h" + +#include "../../module/endstops.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/probe.h" + +static bool G38_run_probe() { + + bool G38_pass_fail = false; + + #if MULTIPLE_PROBING > 1 + // Get direction of move and retract + float retract_mm[XYZ]; + LOOP_XYZ(i) { + const float dist = destination[i] - current_position[i]; + retract_mm[i] = ABS(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm((AxisEnum)i) * (dist > 0 ? -1 : 1); + } + #endif + + planner.synchronize(); // wait until the machine is idle + + // Move until destination reached or target hit + endstops.enable(true); + G38_move = true; + G38_endstop_hit = false; + prepare_move_to_destination(); + planner.synchronize(); + G38_move = false; + + endstops.hit_on_purpose(); + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); + + if (G38_endstop_hit) { + + G38_pass_fail = true; + + #if MULTIPLE_PROBING > 1 + // Move away by the retract distance + set_destination_from_current(); + LOOP_XYZ(i) destination[i] += retract_mm[i]; + endstops.enable(false); + prepare_move_to_destination(); + planner.synchronize(); + + feedrate_mm_s /= 4; + + // Bump the target more slowly + LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; + + endstops.enable(true); + G38_move = true; + prepare_move_to_destination(); + planner.synchronize(); + G38_move = false; + + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); + #endif + } + + endstops.hit_on_purpose(); + endstops.not_homing(); + return G38_pass_fail; +} + +/** + * G38.2 - probe toward workpiece, stop on contact, signal error if failure + * G38.3 - probe toward workpiece, stop on contact + * + * Like G28 except uses Z min probe for all axes + */ +void GcodeSuite::G38(const bool is_38_2) { + // Get X Y Z E F + get_destination_from_command(); + + setup_for_endstop_or_probe_move(); + + // If any axis has enough movement, do the move + LOOP_XYZ(i) + if (ABS(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { + if (!parser.seenval('F')) feedrate_mm_s = homing_feedrate((AxisEnum)i); + // If G38.2 fails throw an error + if (!G38_run_probe() && is_38_2) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Failed to reach target"); + } + break; + } + + clean_up_after_endstop_or_probe_move(); +} + +#endif // G38_PROBE_TARGET diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp new file mode 100644 index 0000000000..1e81e6b4a7 --- /dev/null +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" + +/** + * M401: Deploy and activate the Z probe + */ +void GcodeSuite::M401() { + DEPLOY_PROBE(); + report_current_position(); +} + +/** + * M402: Deactivate and stow the Z probe + */ +void GcodeSuite::M402() { + STOW_PROBE(); + #ifdef Z_AFTER_PROBING + move_z_after_probing(); + #endif + report_current_position(); +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp new file mode 100644 index 0000000000..36f7162371 --- /dev/null +++ b/Marlin/src/gcode/probe/M851.cpp @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + +#include "../gcode.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/probe.h" + +void GcodeSuite::M851() { + if (parser.seenval('Z')) { + const float value = parser.value_linear_units(); + if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + zprobe_zoffset = value; + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("?Z out of range (" STRINGIFY(Z_PROBE_OFFSET_RANGE_MIN) " to " STRINGIFY(Z_PROBE_OFFSET_RANGE_MAX) ")"); + } + return; + } + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_PROBE_Z_OFFSET); + SERIAL_ECHOLNPAIR(": ", zprobe_zoffset); +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp new file mode 100644 index 0000000000..7e92579eed --- /dev/null +++ b/Marlin/src/gcode/queue.cpp @@ -0,0 +1,589 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * queue.cpp - The G-code command queue + */ + +#include "queue.h" +#include "gcode.h" + +#include "../lcd/ultralcd.h" +#include "../sd/cardreader.h" +#include "../module/planner.h" +#include "../module/temperature.h" +#include "../Marlin.h" + +#if HAS_COLOR_LEDS + #include "../feature/leds/leds.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/power_loss_recovery.h" +#endif + +/** + * GCode line number handling. Hosts may opt to include line numbers when + * sending commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ +long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; + +/** + * GCode Command Queue + * A simple ring buffer of BUFSIZE command strings. + * + * Commands are copied into this buffer by the command injectors + * (immediate, serial, sd card) and they are processed sequentially by + * the main loop. The gcode.process_next_command method parses the next + * command and hands off execution to individual handler functions. + */ +uint8_t commands_in_queue = 0, // Count of commands in the queue + cmd_queue_index_r = 0, // Ring buffer read position + cmd_queue_index_w = 0; // Ring buffer write position + +char command_queue[BUFSIZE][MAX_CMD_SIZE]; + +/* + * The port that the command was received on + */ +#if NUM_SERIAL > 1 + int16_t command_queue_port[BUFSIZE]; +#endif + +/** + * Serial command injection + */ + +// Number of characters read in the current line of serial input +static int serial_count[NUM_SERIAL] = { 0 }; + +bool send_ok[BUFSIZE]; + +/** + * Next Injected Command pointer. NULL if no commands are being injected. + * Used by Marlin internally to ensure that commands initiated from within + * are enqueued ahead of any pending serial or sd card commands. + */ +static const char *injected_commands_P = NULL; + +void queue_setup() { + // Send "ok" after commands by default + for (uint8_t i = 0; i < COUNT(send_ok); i++) send_ok[i] = true; +} + +/** + * Clear the Marlin command queue + */ +void clear_command_queue() { + cmd_queue_index_r = cmd_queue_index_w = commands_in_queue = 0; +} + +/** + * Once a new command is in the ring buffer, call this to commit it + */ +inline void _commit_command(bool say_ok + #if NUM_SERIAL > 1 + , int16_t port = -1 + #endif +) { + send_ok[cmd_queue_index_w] = say_ok; + #if NUM_SERIAL > 1 + command_queue_port[cmd_queue_index_w] = port; + #endif + if (++cmd_queue_index_w >= BUFSIZE) cmd_queue_index_w = 0; + commands_in_queue++; +} + +/** + * Copy a command from RAM into the main command buffer. + * Return true if the command was successfully added. + * Return false for a full buffer, or if the 'command' is a comment. + */ +inline bool _enqueuecommand(const char* cmd, bool say_ok=false + #if NUM_SERIAL > 1 + , int16_t port = -1 + #endif +) { + if (*cmd == ';' || commands_in_queue >= BUFSIZE) return false; + strcpy(command_queue[cmd_queue_index_w], cmd); + _commit_command(say_ok + #if NUM_SERIAL > 1 + , port + #endif + ); + return true; +} + +/** + * Enqueue with Serial Echo + */ +bool enqueue_and_echo_command(const char* cmd) { + if (_enqueuecommand(cmd)) { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(MSG_ENQUEUEING, cmd); + SERIAL_CHAR('"'); + SERIAL_EOL(); + return true; + } + return false; +} + +/** + * Inject the next "immediate" command, when possible, onto the front of the queue. + * Return true if any immediate commands remain to inject. + */ +static bool drain_injected_commands_P() { + if (injected_commands_P != NULL) { + size_t i = 0; + char c, cmd[30]; + strncpy_P(cmd, injected_commands_P, sizeof(cmd) - 1); + cmd[sizeof(cmd) - 1] = '\0'; + while ((c = cmd[i]) && c != '\n') i++; // find the end of this gcode command + cmd[i] = '\0'; + if (enqueue_and_echo_command(cmd)) // success? + injected_commands_P = c ? injected_commands_P + i + 1 : NULL; // next command or done + } + return (injected_commands_P != NULL); // return whether any more remain +} + +/** + * Record one or many commands to run from program memory. + * Aborts the current queue, if any. + * Note: drain_injected_commands_P() must be called repeatedly to drain the commands afterwards + */ +void enqueue_and_echo_commands_P(const char * const pgcode) { + injected_commands_P = pgcode; + (void)drain_injected_commands_P(); // first command executed asap (when possible) +} + +#if HAS_QUEUE_NOW + /** + * Enqueue and return only when commands are actually enqueued + */ + void enqueue_and_echo_command_now(const char* cmd) { + while (!enqueue_and_echo_command(cmd)) idle(); + } + #if HAS_LCD_QUEUE_NOW + /** + * Enqueue from program memory and return only when commands are actually enqueued + */ + void enqueue_and_echo_commands_now_P(const char * const pgcode) { + enqueue_and_echo_commands_P(pgcode); + while (drain_injected_commands_P()) idle(); + } + #endif +#endif + +/** + * Send an "ok" message to the host, indicating + * that a command was successfully processed. + * + * If ADVANCED_OK is enabled also include: + * N Line number of the command, if any + * P Planner space remaining + * B Block queue space remaining + */ +void ok_to_send() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + if (port < 0) return; + #endif + if (!send_ok[cmd_queue_index_r]) return; + SERIAL_PROTOCOLPGM_P(port, MSG_OK); + #if ENABLED(ADVANCED_OK) + char* p = command_queue[cmd_queue_index_r]; + if (*p == 'N') { + SERIAL_PROTOCOL_P(port, ' '); + SERIAL_ECHO_P(port, *p++); + while (NUMERIC_SIGNED(*p)) + SERIAL_ECHO_P(port, *p++); + } + SERIAL_PROTOCOLPGM_P(port, " P"); SERIAL_PROTOCOL_P(port, int(BLOCK_BUFFER_SIZE - planner.movesplanned() - 1)); + SERIAL_PROTOCOLPGM_P(port, " B"); SERIAL_PROTOCOL_P(port, BUFSIZE - commands_in_queue); + #endif + SERIAL_EOL_P(port); +} + +/** + * Send a "Resend: nnn" message to the host to + * indicate that a command needs to be re-sent. + */ +void flush_and_request_resend() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + if (port < 0) return; + #endif + SERIAL_FLUSH_P(port); + SERIAL_PROTOCOLPGM_P(port, MSG_RESEND); + SERIAL_PROTOCOLLN_P(port, gcode_LastN + 1); + ok_to_send(); +} + +void gcode_line_error(const char* err, uint8_t port) { + SERIAL_ERROR_START_P(port); + serialprintPGM_P(port, err); + SERIAL_ERRORLN_P(port, gcode_LastN); + flush_and_request_resend(); + serial_count[port] = 0; +} + +static bool serial_data_available() { + return (MYSERIAL0.available() ? true : + #if NUM_SERIAL > 1 + MYSERIAL1.available() ? true : + #endif + false); +} + +static int read_serial(const int index) { + switch (index) { + case 0: return MYSERIAL0.read(); + #if NUM_SERIAL > 1 + case 1: return MYSERIAL1.read(); + #endif + default: return -1; + } +} + +/** + * Get all commands waiting on the serial port and queue them. + * Exit when the buffer is full or when no more characters are + * left on the serial port. + */ +inline void get_serial_commands() { + static char serial_line_buffer[NUM_SERIAL][MAX_CMD_SIZE]; + static bool serial_comment_mode[NUM_SERIAL] = { false }; + + // If the command buffer is empty for too long, + // send "wait" to indicate Marlin is still waiting. + #if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; + const millis_t ms = millis(); + if (commands_in_queue == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + SERIAL_ECHOLNPGM(MSG_WAIT); + last_command_time = ms; + } + #endif + + /** + * Loop while serial characters are incoming and the queue is not full + */ + while (commands_in_queue < BUFSIZE && serial_data_available()) { + for (uint8_t i = 0; i < NUM_SERIAL; ++i) { + int c; + if ((c = read_serial(i)) < 0) continue; + + char serial_char = c; + + /** + * If the character ends the line + */ + if (serial_char == '\n' || serial_char == '\r') { + + serial_comment_mode[i] = false; // end of line == end of comment + + // Skip empty lines and comments + if (!serial_count[i]) { thermalManager.manage_heater(); continue; } + + serial_line_buffer[i][serial_count[i]] = 0; // Terminate string + serial_count[i] = 0; // Reset buffer + + char* command = serial_line_buffer[i]; + + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : NULL; // Require the N parameter to start the line + + if (npos) { + + bool M110 = strstr_P(command, PSTR("M110")) != NULL; + + if (M110) { + char* n2pos = strchr(command + 4, 'N'); + if (n2pos) npos = n2pos; + } + + gcode_N = strtol(npos + 1, NULL, 10); + + if (gcode_N != gcode_LastN + 1 && !M110) + return gcode_line_error(PSTR(MSG_ERR_LINE_NO), i); + + char *apos = strrchr(command, '*'); + if (apos) { + uint8_t checksum = 0, count = uint8_t(apos - command); + while (count) checksum ^= command[--count]; + if (strtol(apos + 1, NULL, 10) != checksum) + return gcode_line_error(PSTR(MSG_ERR_CHECKSUM_MISMATCH), i); + } + else + return gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM), i); + + gcode_LastN = gcode_N; + } + #if ENABLED(SDSUPPORT) + else if (card.saving) + return gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM), i); + #endif + + // Movement commands alert when stopped + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + const int codenum = strtol(gpos + 1, NULL, 10); + switch (codenum) { + case 0: + case 1: + case 2: + case 3: + SERIAL_ERRORLNPGM_P(i, MSG_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (strcmp(command, "M108") == 0) { + wait_for_heatup = false; + #if ENABLED(ULTIPANEL) + wait_for_user = false; + #endif + } + if (strcmp(command, "M112") == 0) kill(PSTR(MSG_KILLED)); + if (strcmp(command, "M410") == 0) quickstop_stepper(); + #endif + + #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 + last_command_time = ms; + #endif + + // Add the command to the queue + _enqueuecommand(serial_line_buffer[i], true + #if NUM_SERIAL > 1 + , i + #endif + ); + } + else if (serial_count[i] >= MAX_CMD_SIZE - 1) { + // Keep fetching, but ignore normal characters beyond the max length + // The command will be injected when EOL is reached + } + else if (serial_char == '\\') { // Handle escapes + // if we have one more character, copy it over + if ((c = read_serial(i)) >= 0 && !serial_comment_mode[i]) + serial_line_buffer[i][serial_count[i]++] = (char)c; + } + else { // it's not a newline, carriage return or escape char + if (serial_char == ';') serial_comment_mode[i] = true; + if (!serial_comment_mode[i]) serial_line_buffer[i][serial_count[i]++] = serial_char; + } + } // for NUM_SERIAL + } // queue has space, serial has data +} + +#if ENABLED(SDSUPPORT) + + /** + * Get commands from the SD Card until the command buffer is full + * or until the end of the file is reached. The special character '#' + * can also interrupt buffering. + */ + inline void get_sdcard_commands() { + static bool stop_buffering = false, + sd_comment_mode = false; + + if (!IS_SD_PRINTING) return; + + /** + * '#' stops reading from SD to the buffer prematurely, so procedural + * macro calls are possible. If it occurs, stop_buffering is triggered + * and the buffer is run dry; this character _can_ occur in serial com + * due to checksums, however, no checksums are used in SD printing. + */ + + if (commands_in_queue == 0) stop_buffering = false; + + uint16_t sd_count = 0; + bool card_eof = card.eof(); + while (commands_in_queue < BUFSIZE && !card_eof && !stop_buffering) { + const int16_t n = card.get(); + char sd_char = (char)n; + card_eof = card.eof(); + if (card_eof || n == -1 + || sd_char == '\n' || sd_char == '\r' + || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode) + ) { + if (card_eof) { + + card.printingHasFinished(); + + if (card.sdprinting) + sd_count = 0; // If a sub-file was printing, continue from call point + else { + SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); + #if ENABLED(PRINTER_EVENT_LEDS) + LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS); + leds.set_green(); + #if HAS_RESUME_CONTINUE + gcode.lights_off_after_print = true; + enqueue_and_echo_commands_P(PSTR("M0 S" + #if ENABLED(NEWPANEL) + "1800" + #else + "60" + #endif + )); + #else + safe_delay(2000); + leds.set_off(); + #endif + #endif // PRINTER_EVENT_LEDS + } + } + else if (n == -1) { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPGM(MSG_SD_ERR_READ); + } + if (sd_char == '#') stop_buffering = true; + + sd_comment_mode = false; // for new command + + // Skip empty lines and comments + if (!sd_count) { thermalManager.manage_heater(); continue; } + + command_queue[cmd_queue_index_w][sd_count] = '\0'; // terminate string + sd_count = 0; // clear sd line buffer + + _commit_command(false); + } + else if (sd_count >= MAX_CMD_SIZE - 1) { + /** + * Keep fetching, but ignore normal characters beyond the max length + * The command will be injected when EOL is reached + */ + } + else { + if (sd_char == ';') sd_comment_mode = true; + if (!sd_comment_mode) command_queue[cmd_queue_index_w][sd_count++] = sd_char; + } + } + } + + #if ENABLED(POWER_LOSS_RECOVERY) + + inline bool drain_job_recovery_commands() { + static uint8_t job_recovery_commands_index = 0; // Resets on reboot + if (job_recovery_commands_count) { + if (_enqueuecommand(job_recovery_commands[job_recovery_commands_index])) { + ++job_recovery_commands_index; + if (!--job_recovery_commands_count) job_recovery_phase = JOB_RECOVERY_IDLE; + } + return true; + } + return false; + } + + #endif + +#endif // SDSUPPORT + +/** + * Add to the circular command queue the next command from: + * - The command-injection queue (injected_commands_P) + * - The active serial input (usually USB) + * - The SD card file being actively printed + */ +void get_available_commands() { + + // if any immediate commands remain, don't get other commands yet + if (drain_injected_commands_P()) return; + + get_serial_commands(); + + #if ENABLED(POWER_LOSS_RECOVERY) + // Commands for power-loss recovery take precedence + if (job_recovery_phase == JOB_RECOVERY_YES && drain_job_recovery_commands()) return; + #endif + + #if ENABLED(SDSUPPORT) + get_sdcard_commands(); + #endif +} + +/** + * Get the next command in the queue, optionally log it to SD, then dispatch it + */ +void advance_command_queue() { + + if (!commands_in_queue) return; + + #if ENABLED(SDSUPPORT) + + if (card.saving) { + char* command = command_queue[cmd_queue_index_r]; + if (strstr_P(command, PSTR("M29"))) { + // M29 closes the file + card.closefile(); + SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED); + + #if !defined(__AVR__) || !defined(USBCON) + #if ENABLED(SERIAL_STATS_DROPPED_RX) + SERIAL_ECHOLNPAIR("Dropped bytes: ", customizedSerial.dropped()); + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + SERIAL_ECHOLNPAIR("Max RX Queue Size: ", customizedSerial.rxMaxEnqueued()); + #endif + #endif // !defined(__AVR__) || !defined(USBCON) + + ok_to_send(); + } + else { + // Write the string from the read buffer to SD + card.write_command(command); + if (card.logging) + gcode.process_next_command(); // The card is saving because it's logging + else + ok_to_send(); + } + } + else { + gcode.process_next_command(); + #if ENABLED(POWER_LOSS_RECOVERY) + if (card.cardOK && card.sdprinting) save_job_recovery_info(); + #endif + } + + #else + + gcode.process_next_command(); + + #endif // SDSUPPORT + + // The queue may be reset by a command handler or by code invoked by idle() within a handler + if (commands_in_queue) { + --commands_in_queue; + if (++cmd_queue_index_r >= BUFSIZE) cmd_queue_index_r = 0; + } + +} diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h new file mode 100644 index 0000000000..5b37f14ae0 --- /dev/null +++ b/Marlin/src/gcode/queue.h @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * queue.h - The G-code command queue, which holds commands before they + * go to the parser and dispatcher. + */ + +#ifndef GCODE_QUEUE_H +#define GCODE_QUEUE_H + +#include "../inc/MarlinConfig.h" + +/** + * GCode line number handling. Hosts may include line numbers when sending + * commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ +extern long gcode_LastN, Stopped_gcode_LastN; + +/** + * GCode Command Queue + * A simple ring buffer of BUFSIZE command strings. + * + * Commands are copied into this buffer by the command injectors + * (immediate, serial, sd card) and they are processed sequentially by + * the main loop. The gcode.process_next_command method parses the next + * command and hands off execution to individual handler functions. + */ +extern uint8_t commands_in_queue, // Count of commands in the queue + cmd_queue_index_r; // Ring buffer read position + +extern char command_queue[BUFSIZE][MAX_CMD_SIZE]; + +/* + * The port that the command was received on + */ +#if NUM_SERIAL > 1 + extern int16_t command_queue_port[BUFSIZE]; +#endif + +/** + * Initialization of queue for setup() + */ +void queue_setup(); + +/** + * Clear the Marlin command queue + */ +void clear_command_queue(); + +/** + * Clear the serial line and request a resend of + * the next expected line number. + */ +void flush_and_request_resend(); + +/** + * Send an "ok" message to the host, indicating + * that a command was successfully processed. + * + * If ADVANCED_OK is enabled also include: + * N Line number of the command, if any + * P Planner space remaining + * B Block queue space remaining + */ +void ok_to_send(); + +/** + * Record one or many commands to run from program memory. + * Aborts the current queue, if any. + * Note: drain_injected_commands_P() must be called repeatedly to drain the commands afterwards + */ +void enqueue_and_echo_commands_P(const char * const pgcode); + +/** + * Enqueue with Serial Echo + */ +bool enqueue_and_echo_command(const char* cmd); + +#define HAS_LCD_QUEUE_NOW (ENABLED(MALYAN_LCD) || (ENABLED(ULTIPANEL) && (ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(PID_AUTOTUNE_MENU) || ENABLED(ADVANCED_PAUSE_FEATURE)))) +#define HAS_QUEUE_NOW (ENABLED(SDSUPPORT) || HAS_LCD_QUEUE_NOW) + +#if HAS_QUEUE_NOW + /** + * Enqueue and return only when commands are actually enqueued + */ + void enqueue_and_echo_command_now(const char* cmd); + #if HAS_LCD_QUEUE_NOW + /** + * Enqueue from program memory and return only when commands are actually enqueued + */ + void enqueue_and_echo_commands_now_P(const char * const cmd); + #endif +#endif + +/** + * Add to the circular command queue the next command from: + * - The command-injection queue (injected_commands_P) + * - The active serial input (usually USB) + * - The SD card file being actively printed + */ +void get_available_commands(); + +/** + * Get the next command in the queue, optionally log it to SD, then dispatch it + */ +void advance_command_queue(); + +#endif // GCODE_QUEUE_H diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp new file mode 100644 index 0000000000..471fdf871d --- /dev/null +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -0,0 +1,84 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(MORGAN_SCARA) + +#include "../gcode.h" +#include "../../module/scara.h" +#include "../../module/motion.h" +#include "../../Marlin.h" // for IsRunning() + +inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { + if (IsRunning()) { + forward_kinematics_SCARA(delta_a, delta_b); + destination[X_AXIS] = cartes[X_AXIS]; + destination[Y_AXIS] = cartes[Y_AXIS]; + destination[Z_AXIS] = current_position[Z_AXIS]; + prepare_move_to_destination(); + return true; + } + return false; +} + +/** + * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration) + */ +bool GcodeSuite::M360() { + SERIAL_ECHOLNPGM(" Cal: Theta 0"); + return SCARA_move_to_cal(0, 120); +} + +/** + * M361: SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) + */ +bool GcodeSuite::M361() { + SERIAL_ECHOLNPGM(" Cal: Theta 90"); + return SCARA_move_to_cal(90, 130); +} + +/** + * M362: SCARA calibration: Move to cal-position PsiA (0 deg calibration) + */ +bool GcodeSuite::M362() { + SERIAL_ECHOLNPGM(" Cal: Psi 0"); + return SCARA_move_to_cal(60, 180); +} + +/** + * M363: SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) + */ +bool GcodeSuite::M363() { + SERIAL_ECHOLNPGM(" Cal: Psi 90"); + return SCARA_move_to_cal(50, 90); +} + +/** + * M364: SCARA calibration: Move to cal-position PsiC (90 deg to Theta calibration position) + */ +bool GcodeSuite::M364() { + SERIAL_ECHOLNPGM(" Cal: Theta-Psi 90"); + return SCARA_move_to_cal(45, 135); +} + +#endif // MORGAN_SCARA diff --git a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp new file mode 100644 index 0000000000..85b352bb0e --- /dev/null +++ b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp @@ -0,0 +1,245 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../module/printcounter.h" +#include "../../module/stepper.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../feature/power_loss_recovery.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../feature/pause.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) || NUM_SERIAL > 1 + #include "../queue.h" +#endif + +/** + * M20: List SD card to serial output + */ +void GcodeSuite::M20() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + SERIAL_PROTOCOLLNPGM_P(port, MSG_BEGIN_FILE_LIST); + card.ls( + #if NUM_SERIAL > 1 + port + #endif + ); + SERIAL_PROTOCOLLNPGM_P(port, MSG_END_FILE_LIST); +} + +/** + * M21: Init SD Card + */ +void GcodeSuite::M21() { card.initsd(); } + +/** + * M22: Release SD Card + */ +void GcodeSuite::M22() { card.release(); } + +/** + * M23: Open a file + */ +void GcodeSuite::M23() { + // Simplify3D includes the size, so zero out all spaces (#7227) + for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0'; + card.openFile(parser.string_arg, true); +} + +/** + * M24: Start or Resume SD Print + */ +void GcodeSuite::M24() { + #if ENABLED(POWER_LOSS_RECOVERY) + card.removeJobRecoveryFile(); + #endif + + #if ENABLED(PARK_HEAD_ON_PAUSE) + resume_print(); + #endif + + card.startFileprint(); + print_job_timer.start(); +} + +/** + * M25: Pause SD Print + */ +void GcodeSuite::M25() { + card.pauseSDPrint(); + print_job_timer.pause(); + + #if ENABLED(PARK_HEAD_ON_PAUSE) + enqueue_and_echo_commands_P(PSTR("M125")); // Must be enqueued with pauseSDPrint set to be last in the buffer + #endif +} + +/** + * M26: Set SD Card file index + */ +void GcodeSuite::M26() { + if (card.cardOK && parser.seenval('S')) + card.setIndex(parser.value_long()); +} + +/** + * M27: Get SD Card status + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. + */ +void GcodeSuite::M27() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + if (parser.seen('C')) { + SERIAL_ECHOPGM_P(port, "Current file: "); + card.printFilename(); + } + + #if ENABLED(AUTO_REPORT_SD_STATUS) + else if (parser.seenval('S')) + card.set_auto_report_interval(parser.value_byte() + #if NUM_SERIAL > 1 + , port + #endif + ); + #endif + + else + card.getStatus( + #if NUM_SERIAL > 1 + port + #endif + ); +} + +/** + * M28: Start SD Write + */ +void GcodeSuite::M28() { card.openFile(parser.string_arg, false); } + +/** + * M29: Stop SD Write + * Processed in write to file routine + */ +void GcodeSuite::M29() { + // card.saving = false; +} + +/** + * M30 : Delete SD Card file + */ +void GcodeSuite::M30() { + if (card.cardOK) { + card.closefile(); + card.removeFile(parser.string_arg); + } +} + +/** + * M32: Select file and start SD Print + * + * Examples: + * + * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO + * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure + * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 + * + */ +void GcodeSuite::M32() { + if (card.sdprinting) planner.synchronize(); + + if (card.cardOK) { + const bool call_procedure = parser.boolval('P'); + + card.openFile(parser.string_arg, true, call_procedure); + + if (parser.seenval('S')) card.setIndex(parser.value_long()); + + card.startFileprint(); + + // Procedure calls count as normal print time. + if (!call_procedure) print_job_timer.start(); + } +} + +#if ENABLED(LONG_FILENAME_HOST_SUPPORT) + + /** + * M33: Get the long full path of a file or folder + * + * Parameters: + * Case-insensitive DOS-style path to a file or folder + * + * Example: + * M33 miscel~1/armchair/armcha~1.gco + * + * Output: + * /Miscellaneous/Armchair/Armchair.gcode + */ + void GcodeSuite::M33() { + card.printLongPath(parser.string_arg + #if NUM_SERIAL > 1 + , command_queue_port[cmd_queue_index_r] + #endif + ); + } + +#endif // LONG_FILENAME_HOST_SUPPORT + +#if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) + + /** + * M34: Set SD Card Sorting Options + */ + void GcodeSuite::M34() { + if (parser.seen('S')) card.setSortOn(parser.value_bool()); + if (parser.seenval('F')) { + const int v = parser.value_long(); + card.setSortFolders(v < 0 ? -1 : v > 0 ? 1 : 0); + } + //if (parser.seen('R')) card.setSortReverse(parser.value_bool()); + } + +#endif // SDCARD_SORT_ALPHA && SDSORT_GCODE + +/** + * M928: Start SD Write + */ +void GcodeSuite::M928() { + card.openLogFile(parser.string_arg); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp new file mode 100644 index 0000000000..958556e544 --- /dev/null +++ b/Marlin/src/gcode/stats/M31.cpp @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../core/serial.h" +#include "../../module/printcounter.h" +#include "../../libs/duration_t.h" +#include "../../lcd/ultralcd.h" + +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +/** + * M31: Get the time since the start of SD Print (or last M109) + */ +void GcodeSuite::M31() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + char buffer[21]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toString(buffer); + lcd_setstatus(buffer); + + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPAIR_P(port, "Print time: ", buffer); +} diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp new file mode 100644 index 0000000000..351efd10c7 --- /dev/null +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/printcounter.h" + +/** + * M75: Start print timer + */ +void GcodeSuite::M75() { print_job_timer.start(); } + +/** + * M76: Pause print timer + */ +void GcodeSuite::M76() { print_job_timer.pause(); } + +/** + * M77: Stop print timer + */ +void GcodeSuite::M77() { print_job_timer.stop(); } + +#if ENABLED(PRINTCOUNTER) + +/** + * M78: Show print statistics + */ +void GcodeSuite::M78() { + if (parser.intval('S') == 78) // "M78 S78" will reset the statistics + print_job_timer.initStats(); + else + print_job_timer.showStats(); +} + +#endif // PRINTCOUNTER diff --git a/Marlin/src/gcode/temperature/M104_M109.cpp b/Marlin/src/gcode/temperature/M104_M109.cpp new file mode 100644 index 0000000000..8cc02401ac --- /dev/null +++ b/Marlin/src/gcode/temperature/M104_M109.cpp @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../lcd/ultralcd.h" +#include "../../Marlin.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +/** + * M104: Set hot end temperature + */ +void GcodeSuite::M104() { + if (get_target_extruder_from_command()) return; + if (DEBUGGING(DRYRUN)) return; + + const uint8_t e = target_extruder; + + #if ENABLED(SINGLENOZZLE) + if (e != active_extruder) return; + #endif + + if (parser.seenval('S')) { + const int16_t temp = parser.value_celsius(); + thermalManager.setTargetHotend(temp, e); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && e == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Stop the timer at the end of print. Start is managed by 'heat and wait' M109. + * We use half EXTRUDE_MINTEMP here to allow nozzles to be put into hot + * standby mode, for instance in a dual extruder setup, without affecting + * the running print timer. + */ + if (temp <= (EXTRUDE_MINTEMP) / 2) { + print_job_timer.stop(); + lcd_reset_status(); + } + #endif + } + + #if ENABLED(AUTOTEMP) + planner.autotemp_M104_M109(); + #endif +} + +/** + * M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating. + * Rxxx Wait for extruder(s) to reach temperature. Waits when heating and cooling. + */ + +#ifndef MIN_COOLING_SLOPE_DEG + #define MIN_COOLING_SLOPE_DEG 1.50 +#endif +#ifndef MIN_COOLING_SLOPE_TIME + #define MIN_COOLING_SLOPE_TIME 60 +#endif + +void GcodeSuite::M109() { + + if (get_target_extruder_from_command()) return; + if (DEBUGGING(DRYRUN)) return; + + #if ENABLED(SINGLENOZZLE) + if (target_extruder != active_extruder) return; + #endif + + const bool no_wait_for_cooling = parser.seenval('S'); + if (no_wait_for_cooling || parser.seenval('R')) { + const int16_t temp = parser.value_celsius(); + thermalManager.setTargetHotend(temp, target_extruder); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Use half EXTRUDE_MINTEMP to allow nozzles to be put into hot + * standby mode, (e.g., in a dual extruder setup) without affecting + * the running print timer. + */ + if (parser.value_celsius() <= (EXTRUDE_MINTEMP) / 2) { + print_job_timer.stop(); + lcd_reset_status(); + } + else + print_job_timer.start(); + #endif + + #if ENABLED(ULTRA_LCD) + const bool heating = thermalManager.isHeatingHotend(target_extruder); + if (heating || !no_wait_for_cooling) + #if HOTENDS > 1 + lcd_status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), target_extruder + 1); + #else + lcd_setstatusPGM(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING)); + #endif + #endif + } + else return; + + #if ENABLED(AUTOTEMP) + planner.autotemp_M104_M109(); + #endif + + #if TEMP_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + // Loop until the temperature has stabilized + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL)) + #else + // Loop until the temperature is very close target + #define TEMP_CONDITIONS (wants_to_cool ? thermalManager.isCoolingHotend(target_extruder) : thermalManager.isHeatingHotend(target_extruder)) + #endif + + float target_temp = -1.0, old_temp = 9999.0; + bool wants_to_cool = false; + wait_for_heatup = true; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = thermalManager.degHotend(target_extruder); + uint8_t old_blue = 0; + #endif + + do { + // Target temperature might be changed during the loop + if (target_temp != thermalManager.degTargetHotend(target_extruder)) { + wants_to_cool = thermalManager.isCoolingHotend(target_extruder); + target_temp = thermalManager.degTargetHotend(target_extruder); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { //Print temp & remaining time every 1s while waiting + next_temp_ms = now + 1000UL; + thermalManager.print_heaterstates(); + #if TEMP_RESIDENCY_TIME > 0 + SERIAL_PROTOCOLPGM(" W:"); + if (residency_start_ms) + SERIAL_PROTOCOL(long((((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_PROTOCOLCHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + reset_stepper_timeout(); // Keep steppers powered + + const float temp = thermalManager.degHotend(target_extruder); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from violet to red as nozzle heats up + if (!wants_to_cool) { + const uint8_t blue = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 255, 0); + if (blue != old_blue) { + old_blue = blue; + leds.set_color( + MakeLEDColor(255, 0, blue, 0, pixels.getBrightness()) + #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) + , true + #endif + ); + } + } + #endif + + #if TEMP_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_WINDOW) residency_start_ms = now; + } + else if (temp_diff > TEMP_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + #endif + + // Prevent a wait-forever situation if R is misused i.e. M109 R0 + if (wants_to_cool) { + // break after MIN_COOLING_SLOPE_TIME seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < MIN_COOLING_SLOPE_DEG) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; + old_temp = temp; + } + } + + } while (wait_for_heatup && TEMP_CONDITIONS); + + if (wait_for_heatup) { + lcd_reset_status(); + #if ENABLED(PRINTER_EVENT_LEDS) + leds.set_white(); + #endif + } + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif +} diff --git a/Marlin/src/gcode/temperature/M105.cpp b/Marlin/src/gcode/temperature/M105.cpp new file mode 100644 index 0000000000..4216c417e7 --- /dev/null +++ b/Marlin/src/gcode/temperature/M105.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" + +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +/** + * M105: Read hot end and bed temperature + */ +void GcodeSuite::M105() { + if (get_target_extruder_from_command()) return; + + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + #if HAS_TEMP_SENSOR + SERIAL_PROTOCOLPGM_P(port, MSG_OK); + thermalManager.print_heaterstates( + #if NUM_SERIAL > 1 + port + #endif + ); + #else // !HAS_TEMP_SENSOR + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, MSG_ERR_NO_THERMISTORS); + #endif + + SERIAL_EOL_P(port); +} diff --git a/Marlin/src/gcode/temperature/M106_M107.cpp b/Marlin/src/gcode/temperature/M106_M107.cpp new file mode 100644 index 0000000000..deea62c081 --- /dev/null +++ b/Marlin/src/gcode/temperature/M106_M107.cpp @@ -0,0 +1,83 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if FAN_COUNT > 0 + +#include "../gcode.h" +#include "../../Marlin.h" // for fanSpeeds — should move those to Planner + +/** + * M106: Set Fan Speed + * + * S Speed between 0-255 + * P Fan index, if more than one fan + * + * With EXTRA_FAN_SPEED enabled: + * + * T Restore/Use/Set Temporary Speed: + * 1 = Restore previous speed after T2 + * 2 = Use temporary speed set with T3-255 + * 3-255 = Set the speed for use with T2 + */ +void GcodeSuite::M106() { + const uint8_t p = parser.byteval('P'); + #if(ENABLED(LASER_PIN_DEDICATED) && ENABLED(FAN_AS_LASER) && (FAN_NUM_AS_LASER==p)) + return + #endif + if (p < FAN_COUNT) { + #if ENABLED(EXTRA_FAN_SPEED) + const int16_t t = parser.intval('T'); + if (t > 0) { + switch (t) { + case 1: + fanSpeeds[p] = old_fanSpeeds[p]; + break; + case 2: + old_fanSpeeds[p] = fanSpeeds[p]; + fanSpeeds[p] = new_fanSpeeds[p]; + break; + default: + new_fanSpeeds[p] = MIN(t, 255); + break; + } + return; + } + #endif // EXTRA_FAN_SPEED + const uint16_t s = parser.ushortval('S', 255); + fanSpeeds[p] = MIN(s, 255U); + } +} + +/** + * M107: Fan Off + */ +void GcodeSuite::M107() { + const uint16_t p = parser.ushortval('P'); + #if(ENABLED(LASER_PIN_DEDICATED) && ENABLED(FAN_AS_LASER) && (FAN_NUM_AS_LASER==p)) + return + #endif + if (p < FAN_COUNT) fanSpeeds[p] = 0; +} + +#endif // FAN_COUNT > 0 diff --git a/Marlin/src/gcode/temperature/M140_M190.cpp b/Marlin/src/gcode/temperature/M140_M190.cpp new file mode 100644 index 0000000000..324a1b9f93 --- /dev/null +++ b/Marlin/src/gcode/temperature/M140_M190.cpp @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_HEATED_BED + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +#include "../../Marlin.h" // for wait_for_heatup and idle() + +/** + * M140: Set bed temperature + */ +void GcodeSuite::M140() { + if (DEBUGGING(DRYRUN)) return; + if (parser.seenval('S')) thermalManager.setTargetBed(parser.value_celsius()); +} + +#ifndef MIN_COOLING_SLOPE_DEG_BED + #define MIN_COOLING_SLOPE_DEG_BED 1.50 +#endif +#ifndef MIN_COOLING_SLOPE_TIME_BED + #define MIN_COOLING_SLOPE_TIME_BED 60 +#endif + +/** + * M190: Sxxx Wait for bed current temp to reach target temp. Waits only when heating + * Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling + */ +void GcodeSuite::M190() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (no_wait_for_cooling || parser.seenval('R')) { + thermalManager.setTargetBed(parser.value_celsius()); + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + if (parser.value_celsius() > BED_MINTEMP) + print_job_timer.start(); + #endif + } + else return; + + lcd_setstatusPGM(thermalManager.isHeatingBed() ? PSTR(MSG_BED_HEATING) : PSTR(MSG_BED_COOLING)); + + #if TEMP_BED_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + // Loop until the temperature has stabilized + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_BED_RESIDENCY_TIME) * 1000UL)) + #else + // Loop until the temperature is very close target + #define TEMP_BED_CONDITIONS (wants_to_cool ? thermalManager.isCoolingBed() : thermalManager.isHeatingBed()) + #endif + + float target_temp = -1.0, old_temp = 9999.0; + bool wants_to_cool = false; + wait_for_heatup = true; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + target_extruder = active_extruder; // for print_heaterstates + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = thermalManager.degBed(); + uint8_t old_red = 127; + #endif + + do { + // Target temperature might be changed during the loop + if (target_temp != thermalManager.degTargetBed()) { + wants_to_cool = thermalManager.isCoolingBed(); + target_temp = thermalManager.degTargetBed(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { //Print Temp Reading every 1 second while heating up. + next_temp_ms = now + 1000UL; + thermalManager.print_heaterstates(); + #if TEMP_BED_RESIDENCY_TIME > 0 + SERIAL_PROTOCOLPGM(" W:"); + if (residency_start_ms) + SERIAL_PROTOCOL(long((((TEMP_BED_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_PROTOCOLCHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + reset_stepper_timeout(); // Keep steppers powered + + const float temp = thermalManager.degBed(); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from blue to violet as bed heats up + if (!wants_to_cool) { + const uint8_t red = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 0, 255); + if (red != old_red) { + old_red = red; + leds.set_color( + MakeLEDColor(red, 0, 255, 0, pixels.getBrightness()) + #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) + , true + #endif + ); + } + } + #endif + + #if TEMP_BED_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_BED_WINDOW) residency_start_ms = now; + } + else if (temp_diff > TEMP_BED_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + #endif // TEMP_BED_RESIDENCY_TIME > 0 + + // Prevent a wait-forever situation if R is misused i.e. M190 R0 + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_BED seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < MIN_COOLING_SLOPE_DEG_BED) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; + old_temp = temp; + } + } + + } while (wait_for_heatup && TEMP_BED_CONDITIONS); + + if (wait_for_heatup) lcd_reset_status(); + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif +} + +#endif // HAS_HEATED_BED diff --git a/Marlin/src/gcode/temperature/M155.cpp b/Marlin/src/gcode/temperature/M155.cpp new file mode 100644 index 0000000000..611676a672 --- /dev/null +++ b/Marlin/src/gcode/temperature/M155.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M155: Set temperature auto-report interval. M155 S + */ +void GcodeSuite::M155() { + + if (parser.seenval('S')) + thermalManager.set_auto_report_interval(parser.value_byte()); + +} + +#endif // AUTO_REPORT_TEMPERATURES && HAS_TEMP_SENSOR diff --git a/Marlin/src/gcode/temperature/M303.cpp b/Marlin/src/gcode/temperature/M303.cpp new file mode 100644 index 0000000000..583ea9d7e4 --- /dev/null +++ b/Marlin/src/gcode/temperature/M303.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M303: PID relay autotune + * + * S sets the target temperature. (default 150C / 70C) + * E (-1 for the bed) (default 0) + * C + * U with a non-zero value will apply the result to current settings + */ +void GcodeSuite::M303() { + #if HAS_PID_HEATING + const int e = parser.intval('E'), c = parser.intval('C', 5); + const bool u = parser.boolval('U'); + + int16_t temp = parser.celsiusval('S', e < 0 ? 70 : 150); + + if (WITHIN(e, 0, HOTENDS - 1)) + target_extruder = e; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + thermalManager.PID_autotune(temp, e, c, u); + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif + #else + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M303_DISABLED); + #endif +} diff --git a/Marlin/src/gcode/units/G20_G21.cpp b/Marlin/src/gcode/units/G20_G21.cpp new file mode 100644 index 0000000000..74ff343af5 --- /dev/null +++ b/Marlin/src/gcode/units/G20_G21.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(INCH_MODE_SUPPORT) + +#include "../gcode.h" + +/** + * G20: Set input mode to inches + */ +void GcodeSuite::G20() { parser.set_input_linear_units(LINEARUNIT_INCH); } + +/** + * G21: Set input mode to millimeters + */ +void GcodeSuite::G21() { parser.set_input_linear_units(LINEARUNIT_MM); } + +#endif // INCH_MODE_SUPPORT diff --git a/Marlin/src/gcode/units/M149.cpp b/Marlin/src/gcode/units/M149.cpp new file mode 100644 index 0000000000..307258816f --- /dev/null +++ b/Marlin/src/gcode/units/M149.cpp @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TEMPERATURE_UNITS_SUPPORT) + +#include "../gcode.h" + +/** + * M149: Set temperature units + */ +void GcodeSuite::M149() { + if (parser.seenval('C')) parser.set_input_temp_units(TEMPUNIT_C); + else if (parser.seenval('K')) parser.set_input_temp_units(TEMPUNIT_K); + else if (parser.seenval('F')) parser.set_input_temp_units(TEMPUNIT_F); +} + +#endif // TEMPERATURE_UNITS_SUPPORT diff --git a/Marlin/src/gcode/units/M82_M83.cpp b/Marlin/src/gcode/units/M82_M83.cpp new file mode 100644 index 0000000000..b68d6a28ee --- /dev/null +++ b/Marlin/src/gcode/units/M82_M83.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../gcode.h" + +/** + * M82: Set E codes absolute (default) + */ +void GcodeSuite::M82() { axis_relative_modes[E_AXIS] = false; } + +/** + * M83: Set E codes relative while in Absolute Coordinates (G90) mode + */ +void GcodeSuite::M83() { axis_relative_modes[E_AXIS] = true; } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h new file mode 100644 index 0000000000..0abd45135e --- /dev/null +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -0,0 +1,524 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Conditionals_LCD.h + * Conditionals that need to be set before Configuration_adv.h or pins.h + */ + +#ifndef CONDITIONALS_LCD_H // Get the LCD defines which are needed first +#define CONDITIONALS_LCD_H + +#define LCD_HAS_DIRECTIONAL_BUTTONS (BUTTON_EXISTS(UP) || BUTTON_EXISTS(DWN) || BUTTON_EXISTS(LFT) || BUTTON_EXISTS(RT)) + +#if ENABLED(CARTESIO_UI) + + #define DOGLCD + #define ULTIPANEL + #define DEFAULT_LCD_CONTRAST 90 + #define LCD_CONTRAST_MIN 60 + #define LCD_CONTRAST_MAX 140 + +#elif ENABLED(MAKRPANEL) + + #define U8GLIB_ST7565_64128N + +#elif ENABLED(ZONESTAR_LCD) + + #define REPRAPWORLD_KEYPAD + #define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + #define ADC_KEYPAD + #define ADC_KEY_NUM 8 + #define ULTIPANEL + + // this helps to implement ADC_KEYPAD menus + #define ENCODER_PULSES_PER_STEP 1 + #define ENCODER_STEPS_PER_MENU_ITEM 1 + #define ENCODER_FEEDRATE_DEADZONE 2 + #define REVERSE_MENU_DIRECTION + +#elif ENABLED(RADDS_DISPLAY) + #define ULTIPANEL + #define ENCODER_PULSES_PER_STEP 2 + +#elif ENABLED(ANET_FULL_GRAPHICS_LCD) + + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +#elif ENABLED(BQ_LCD_SMART_CONTROLLER) + + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +#elif ENABLED(miniVIKI) || ENABLED(VIKI2) || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) || ENABLED(AZSMZ_12864) + + #define ULTRA_LCD //general LCD support, also 16x2 + #define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) + #define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. + + #if ENABLED(miniVIKI) + #define LCD_CONTRAST_MIN 75 + #define LCD_CONTRAST_MAX 115 + #define DEFAULT_LCD_CONTRAST 95 + #define U8GLIB_ST7565_64128N + #elif ENABLED(VIKI2) + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 140 + #define U8GLIB_ST7565_64128N + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define LCD_CONTRAST_MIN 90 + #define LCD_CONTRAST_MAX 130 + #define DEFAULT_LCD_CONTRAST 110 + #define U8GLIB_LM6059_AF + #define SD_DETECT_INVERTED + #elif ENABLED(AZSMZ_12864) + #define LCD_CONTRAST_MIN 120 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 190 + #define U8GLIB_ST7565_64128N + #endif + +#elif ENABLED(OLED_PANEL_TINYBOY2) + + #define U8GLIB_SSD1306 + #define ULTIPANEL + #define REVERSE_ENCODER_DIRECTION + #define REVERSE_MENU_DIRECTION + +#elif ENABLED(RA_CONTROL_PANEL) + + #define LCD_I2C_TYPE_PCA8574 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + #define ULTIPANEL + +#elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define DOGLCD + #define U8GLIB_ST7920 + #define ULTIPANEL + +#elif ENABLED(CR10_STOCKDISPLAY) + + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(125) + #endif + +#elif ENABLED(MKS_12864OLED) + + #define REPRAP_DISCOUNT_SMART_CONTROLLER + #define U8GLIB_SH1106 + +#elif ENABLED(MKS_12864OLED_SSD1306) + + #define REPRAP_DISCOUNT_SMART_CONTROLLER + #define U8GLIB_SSD1306 + +#elif ENABLED(MKS_MINI_12864) + + #define MINIPANEL + +#endif + +#if ENABLED(MAKRPANEL) || ENABLED(MINIPANEL) + #define DOGLCD + #define ULTIPANEL + #define DEFAULT_LCD_CONTRAST 17 +#endif + +#if ENABLED(ULTI_CONTROLLER) + #define U8GLIB_SSD1309 + #define REVERSE_ENCODER_DIRECTION + #define LCD_RESET_PIN LCD_PINS_D6 // This controller need a reset pin + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 254 + #define DEFAULT_LCD_CONTRAST 127 + #define ENCODER_PULSES_PER_STEP 2 + #define ENCODER_STEPS_PER_MENU_ITEM 2 +#endif + +// Generic support for SSD1306 / SSD1309 / SH1106 OLED based LCDs. +#if ENABLED(U8GLIB_SSD1306) || ENABLED(U8GLIB_SSD1309) || ENABLED(U8GLIB_SH1106) + #define ULTRA_LCD //general LCD support, also 16x2 + #define DOGLCD // Support for I2C LCD 128x64 (Controller SSD1306 / SSD1309 / SH1106 graphic Display Family) +#endif + +#if ENABLED(PANEL_ONE) || ENABLED(U8GLIB_SH1106) + + #define ULTIMAKERCONTROLLER + +#elif ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) + + #define REPRAP_DISCOUNT_SMART_CONTROLLER + #define LCD_WIDTH 16 + #define LCD_HEIGHT 2 + +#endif + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(LCD_FOR_MELZI) || ENABLED(SILVER_GATE_GLCD_CONTROLLER) + #define DOGLCD + #define U8GLIB_ST7920 + #define REPRAP_DISCOUNT_SMART_CONTROLLER +#endif + +#if ENABLED(ULTIMAKERCONTROLLER) \ + || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ + || ENABLED(G3D_PANEL) \ + || ENABLED(RIGIDBOT_PANEL) \ + || ENABLED(ULTI_CONTROLLER) + #define ULTIPANEL +#endif + +#if ENABLED(REPRAPWORLD_KEYPAD) + #define NEWPANEL + #if ENABLED(ULTIPANEL) && !defined(REPRAPWORLD_KEYPAD_MOVE_STEP) + #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + #endif +#endif + +/** + * I2C PANELS + */ + +#if ENABLED(LCD_SAINSMART_I2C_1602) || ENABLED(LCD_SAINSMART_I2C_2004) + + #define LCD_I2C_TYPE_PCF8575 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + + #if ENABLED(LCD_SAINSMART_I2C_2004) + #define LCD_WIDTH 20 + #define LCD_HEIGHT 4 + #endif + +#elif ENABLED(LCD_I2C_PANELOLU2) + + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs + + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (optional) + #define ULTIPANEL + +#elif ENABLED(LCD_I2C_VIKI) + + /** + * Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs + * + * This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) + * Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. + * Note: The pause/stop/resume LCD button pin should be connected to the Arduino + * BTN_ENC pin (or set BTN_ENC to -1 if not used) + */ + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) + #define ULTIPANEL + + #define ENCODER_FEEDRATE_DEADZONE 4 + + #define STD_ENCODER_PULSES_PER_STEP 1 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 2 + +#elif ENABLED(G3D_PANEL) + + #define STD_ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + +#elif ENABLED(miniVIKI) || ENABLED(VIKI2) \ + || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + || ENABLED(AZSMZ_12864) \ + || ENABLED(OLED_PANEL_TINYBOY2) \ + || ENABLED(BQ_LCD_SMART_CONTROLLER) \ + || ENABLED(LCD_I2C_PANELOLU2) \ + || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define STD_ENCODER_PULSES_PER_STEP 4 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 +#endif + +#ifndef STD_ENCODER_PULSES_PER_STEP + #define STD_ENCODER_PULSES_PER_STEP 5 +#endif +#ifndef STD_ENCODER_STEPS_PER_MENU_ITEM + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 +#endif +#ifndef ENCODER_PULSES_PER_STEP + #define ENCODER_PULSES_PER_STEP STD_ENCODER_PULSES_PER_STEP +#endif +#ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM STD_ENCODER_STEPS_PER_MENU_ITEM +#endif +#ifndef ENCODER_FEEDRATE_DEADZONE + #define ENCODER_FEEDRATE_DEADZONE 6 +#endif + +// Shift register panels +// --------------------- +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection + +#if ENABLED(SAV_3DLCD) + #define SR_LCD_2W_NL // Non latching 2 wire shift register + #define ULTIPANEL +#endif + +#if ENABLED(DOGLCD) // Change number of lines to match the DOG graphic display + #ifndef LCD_WIDTH + #ifdef LCD_WIDTH_OVERRIDE + #define LCD_WIDTH LCD_WIDTH_OVERRIDE + #else + #define LCD_WIDTH 22 + #endif + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 5 + #endif +#endif + +#if ENABLED(NO_LCD_MENUS) + #undef ULTIPANEL +#endif + +#if ENABLED(ULTIPANEL) + #define NEWPANEL // Disable this if you actually have no click-encoder panel + #define ULTRA_LCD + #ifndef LCD_WIDTH + #define LCD_WIDTH 20 + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 4 + #endif +#elif ENABLED(ULTRA_LCD) // no panel but just LCD + #ifndef LCD_WIDTH + #define LCD_WIDTH 16 + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 2 + #endif +#endif + +#if ENABLED(DOGLCD) + /* Custom characters defined in font Marlin_symbols.fon which was merged to ISO10646-0-3.bdf */ + // \x00 intentionally skipped to avoid problems in strings + #define LCD_STR_REFRESH "\x01" + #define LCD_STR_FOLDER "\x02" + #define LCD_STR_ARROW_RIGHT "\x03" + #define LCD_STR_UPLEVEL "\x04" + #define LCD_STR_CLOCK "\x05" + #define LCD_STR_FEEDRATE "\x06" + #define LCD_STR_BEDTEMP "\x07" + #define LCD_STR_THERMOMETER "\x08" + #define LCD_STR_DEGREE "\x09" + + #define LCD_STR_SPECIAL_MAX '\x09' + // Maximum here is 0x1F because 0x20 is ' ' (space) and the normal charsets begin. + // Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here. + + // Symbol characters + #define LCD_STR_FILAM_DIA "\xf8" + #define LCD_STR_FILAM_MUL "\xa4" +#else + // Custom characters defined in the first 8 characters of the LCD + #define LCD_BEDTEMP_CHAR 0x00 // Print only as a char. This will have 'unexpected' results when used in a string! + #define LCD_DEGREE_CHAR 0x01 + #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation + #define LCD_UPLEVEL_CHAR 0x03 + #define LCD_STR_REFRESH "\x04" + #define LCD_STR_FOLDER "\x05" + #define LCD_FEEDRATE_CHAR 0x06 + #define LCD_CLOCK_CHAR 0x07 + #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ +#endif + +/** + * Default LCD contrast for dogm-like LCD displays + */ +#if ENABLED(DOGLCD) + + #define HAS_LCD_CONTRAST ( \ + ENABLED(MAKRPANEL) \ + || ENABLED(CARTESIO_UI) \ + || ENABLED(VIKI2) \ + || ENABLED(AZSMZ_12864) \ + || ENABLED(miniVIKI) \ + || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + ) + + #if HAS_LCD_CONTRAST + #ifndef LCD_CONTRAST_MIN + #define LCD_CONTRAST_MIN 0 + #endif + #ifndef LCD_CONTRAST_MAX + #define LCD_CONTRAST_MAX 63 + #endif + #ifndef DEFAULT_LCD_CONTRAST + #define DEFAULT_LCD_CONTRAST 32 + #endif + #endif +#endif + +// Boot screens +#if DISABLED(ULTRA_LCD) + #undef SHOW_BOOTSCREEN +#elif !defined(BOOTSCREEN_TIMEOUT) + #define BOOTSCREEN_TIMEOUT 2500 +#endif + +#define HAS_DEBUG_MENU (ENABLED(ULTIPANEL) && ENABLED(LCD_PROGRESS_BAR_TEST)) + +// MK2 Multiplexer forces SINGLENOZZLE and kills DISABLE_INACTIVE_EXTRUDER +#if ENABLED(MK2_MULTIPLEXER) + #define SINGLENOZZLE + #undef DISABLE_INACTIVE_EXTRUDER +#endif + +/** + * Extruders have some combination of stepper motors and hotends + * so we separate these concepts into the defines: + * + * EXTRUDERS - Number of Selectable Tools + * HOTENDS - Number of hotends, whether connected or separate + * E_STEPPERS - Number of actual E stepper motors + * E_MANUAL - Number of E steppers for LCD move options + * + */ +#define HOTEND_LOOP() for (int8_t e = 0; e < HOTENDS; e++) + +#if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS + #if EXTRUDERS > 4 + #define E_STEPPERS 3 + #elif EXTRUDERS > 2 + #define E_STEPPERS 2 + #else + #define E_STEPPERS 1 + #endif + #if DISABLED(SWITCHING_NOZZLE) + #define HOTENDS E_STEPPERS + #endif + #define E_MANUAL EXTRUDERS +#elif ENABLED(MIXING_EXTRUDER) + #define E_STEPPERS MIXING_STEPPERS + #define E_MANUAL 1 +#else + #define E_STEPPERS EXTRUDERS + #define E_MANUAL EXTRUDERS +#endif + +#if ENABLED(SINGLENOZZLE) || ENABLED(MIXING_EXTRUDER) // One hotend, one thermistor, no XY offset + #undef HOTENDS + #define HOTENDS 1 + #undef TEMP_SENSOR_1_AS_REDUNDANT + #undef HOTEND_OFFSET_X + #undef HOTEND_OFFSET_Y +#endif + +#ifndef HOTENDS + #define HOTENDS EXTRUDERS +#endif + +#define DO_SWITCH_EXTRUDER (ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR)) + +/** + * DISTINCT_E_FACTORS affects how some E factors are accessed + */ +#if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1 + #define XYZE_N (XYZ + E_STEPPERS) + #define E_AXIS_N (E_AXIS + extruder) +#else + #undef DISTINCT_E_FACTORS + #define XYZE_N XYZE + #define E_AXIS_N E_AXIS +#endif + +/** + * The BLTouch Probe emulates a servo probe + * and uses "special" angles for its state. + */ +#if ENABLED(BLTOUCH) + #ifndef Z_PROBE_SERVO_NR + #define Z_PROBE_SERVO_NR 0 + #endif + #ifndef NUM_SERVOS + #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) + #endif + #undef DEACTIVATE_SERVOS_AFTER_MOVE + #if NUM_SERVOS == 1 + #undef SERVO_DELAY + #define SERVO_DELAY { 50 } + #endif + #ifndef BLTOUCH_DELAY + #define BLTOUCH_DELAY 375 + #endif + #undef Z_SERVO_ANGLES + #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } + + #define BLTOUCH_DEPLOY 10 + #define BLTOUCH_STOW 90 + #define BLTOUCH_SELFTEST 120 + #define BLTOUCH_RESET 160 + #define _TEST_BLTOUCH(P) (READ(P##_PIN) != P##_ENDSTOP_INVERTING) + + // Always disable probe pin inverting for BLTouch + #undef Z_MIN_PROBE_ENDSTOP_INVERTING + #define Z_MIN_PROBE_ENDSTOP_INVERTING false + + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #undef Z_MIN_ENDSTOP_INVERTING + #define Z_MIN_ENDSTOP_INVERTING Z_MIN_PROBE_ENDSTOP_INVERTING + #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN) + #else + #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN_PROBE) + #endif +#endif + +/** + * Set a flag for a servo probe + */ +#define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0) + +/** + * Set flags for enabled probes + */ +#define HAS_BED_PROBE (ENABLED(FIX_MOUNTED_PROBE) || ENABLED(Z_PROBE_ALLEN_KEY) || HAS_Z_SERVO_PROBE || ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) +#define PROBE_SELECTED (HAS_BED_PROBE || ENABLED(PROBE_MANUALLY)) + +#if !HAS_BED_PROBE + // Clear probe pin settings when no probe is selected + #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + #undef Z_MIN_PROBE_ENDSTOP +#elif ENABLED(Z_PROBE_ALLEN_KEY) + // Extra test for Allen Key Probe + #define PROBE_IS_TRIGGERED_WHEN_STOWED_TEST +#endif + +#define HOMING_Z_WITH_PROBE (HAS_BED_PROBE && Z_HOME_DIR < 0 && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) + +#define HAS_SOFTWARE_ENDSTOPS (ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS)) +#define HAS_RESUME_CONTINUE (ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER)) +#define HAS_COLOR_LEDS (ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED)) + +#endif // CONDITIONALS_LCD_H diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h new file mode 100644 index 0000000000..289f174373 --- /dev/null +++ b/Marlin/src/inc/Conditionals_adv.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Conditionals_adv.h + * Defines that depend on advanced configuration. + */ + +#ifndef CONDITIONALS_ADV_H +#define CONDITIONALS_ADV_H + + #if !defined(__AVR__) || !defined(USBCON) + // Define constants and variables for buffering serial data. + // Use only 0 or powers of 2 greater than 1 + // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] + #ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 + #endif + // 256 is the max TX buffer limit due to uint8_t head and tail + // : [0, 4, 8, 16, 32, 64, 128, 256] + #ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 + #endif + #else + // SERIAL_XON_XOFF not supported on USB-native devices + #undef SERIAL_XON_XOFF + #endif + +#endif // CONDITIONALS_ADV_H diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h new file mode 100644 index 0000000000..0f6feb1a90 --- /dev/null +++ b/Marlin/src/inc/Conditionals_post.h @@ -0,0 +1,1447 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Conditionals_post.h + * Defines that depend on configuration but are not editable. + */ + +#ifndef CONDITIONALS_POST_H +#define CONDITIONALS_POST_H + +#define AVR_ATmega2560_FAMILY_PLUS_70 ( \ + MB(BQ_ZUM_MEGA_3D) \ + || MB(MIGHTYBOARD_REVE) \ + || MB(MINIRAMBO) \ + || MB(SCOOVO_X9H) \ +) + +#ifdef TEENSYDUINO + #undef max + #define max(a,b) ((a)>(b)?(a):(b)) + #undef min + #define min(a,b) ((a)<(b)?(a):(b)) + + #undef NOT_A_PIN // Override Teensyduino legacy CapSense define work-around + #define NOT_A_PIN 0 // For PINS_DEBUGGING +#endif + +#define IS_SCARA (ENABLED(MORGAN_SCARA) || ENABLED(MAKERARM_SCARA)) +#define IS_KINEMATIC (ENABLED(DELTA) || IS_SCARA) +#define IS_CARTESIAN !IS_KINEMATIC + +/** + * Axis lengths and center + */ +#define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) +#define Y_MAX_LENGTH (Y_MAX_POS - (Y_MIN_POS)) +#define Z_MAX_LENGTH (Z_MAX_POS - (Z_MIN_POS)) + +// Defined only if the sanity-check is bypassed +#ifndef X_BED_SIZE + #define X_BED_SIZE X_MAX_LENGTH +#endif +#ifndef Y_BED_SIZE + #define Y_BED_SIZE Y_MAX_LENGTH +#endif + +// Require 0,0 bed center for Delta and SCARA +#if IS_KINEMATIC + #define BED_CENTER_AT_0_0 +#endif + +// Define center values for future use +#if ENABLED(BED_CENTER_AT_0_0) + #define X_CENTER 0 + #define Y_CENTER 0 +#else + #define X_CENTER ((X_BED_SIZE) / 2) + #define Y_CENTER ((Y_BED_SIZE) / 2) +#endif +#define Z_CENTER ((Z_MIN_POS + Z_MAX_POS) / 2) + +// Get the linear boundaries of the bed +#define X_MIN_BED (X_CENTER - (X_BED_SIZE) / 2) +#define X_MAX_BED (X_CENTER + (X_BED_SIZE) / 2) +#define Y_MIN_BED (Y_CENTER - (Y_BED_SIZE) / 2) +#define Y_MAX_BED (Y_CENTER + (Y_BED_SIZE) / 2) + +/** + * CoreXY, CoreXZ, and CoreYZ - and their reverse + */ +#define CORE_IS_XY (ENABLED(COREXY) || ENABLED(COREYX)) +#define CORE_IS_XZ (ENABLED(COREXZ) || ENABLED(COREZX)) +#define CORE_IS_YZ (ENABLED(COREYZ) || ENABLED(COREZY)) +#define IS_CORE (CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ) +#if IS_CORE + #if CORE_IS_XY + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS + #elif CORE_IS_XZ + #define CORE_AXIS_1 A_AXIS + #define NORMAL_AXIS Y_AXIS + #define CORE_AXIS_2 C_AXIS + #elif CORE_IS_YZ + #define NORMAL_AXIS X_AXIS + #define CORE_AXIS_1 B_AXIS + #define CORE_AXIS_2 C_AXIS + #endif + #if ENABLED(COREYX) || ENABLED(COREZX) || ENABLED(COREZY) + #define CORESIGN(n) (-(n)) + #else + #define CORESIGN(n) (n) + #endif +#endif + +/** + * No adjustable bed on non-cartesians + */ +#if IS_KINEMATIC + #undef LEVEL_BED_CORNERS +#endif + +/** + * SCARA cannot use SLOWDOWN and requires QUICKHOME + */ +#if IS_SCARA + #undef SLOWDOWN + #define QUICK_HOME +#endif + +/** + * Set the home position based on settings or manual overrides + */ +#ifdef MANUAL_X_HOME_POS + #define X_HOME_POS MANUAL_X_HOME_POS +#elif ENABLED(BED_CENTER_AT_0_0) + #if ENABLED(DELTA) + #define X_HOME_POS 0 + #else + #define X_HOME_POS ((X_BED_SIZE) * (X_HOME_DIR) * 0.5) + #endif +#else + #if ENABLED(DELTA) + #define X_HOME_POS (X_MIN_POS + (X_BED_SIZE) * 0.5) + #else + #define X_HOME_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) + #endif +#endif + +#ifdef MANUAL_Y_HOME_POS + #define Y_HOME_POS MANUAL_Y_HOME_POS +#elif ENABLED(BED_CENTER_AT_0_0) + #if ENABLED(DELTA) + #define Y_HOME_POS 0 + #else + #define Y_HOME_POS ((Y_BED_SIZE) * (Y_HOME_DIR) * 0.5) + #endif +#else + #if ENABLED(DELTA) + #define Y_HOME_POS (Y_MIN_POS + (Y_BED_SIZE) * 0.5) + #else + #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) + #endif +#endif + +#ifdef MANUAL_Z_HOME_POS + #define Z_HOME_POS MANUAL_Z_HOME_POS +#else + #define Z_HOME_POS (Z_HOME_DIR < 0 ? Z_MIN_POS : Z_MAX_POS) +#endif + +/** + * If DELTA_HEIGHT isn't defined use the old setting + */ +#if ENABLED(DELTA) && !defined(DELTA_HEIGHT) + #define DELTA_HEIGHT Z_HOME_POS +#endif + +/** + * Z Sled Probe requires Z_SAFE_HOMING + */ +#if ENABLED(Z_PROBE_SLED) + #define Z_SAFE_HOMING +#endif + +/** + * DELTA should ignore Z_SAFE_HOMING and SLOWDOWN + */ +#if ENABLED(DELTA) + #undef Z_SAFE_HOMING + #undef SLOWDOWN +#endif + +/** + * Safe Homing Options + */ +#if ENABLED(Z_SAFE_HOMING) + #ifndef Z_SAFE_HOMING_X_POINT + #define Z_SAFE_HOMING_X_POINT X_CENTER + #endif + #ifndef Z_SAFE_HOMING_Y_POINT + #define Z_SAFE_HOMING_Y_POINT Y_CENTER + #endif + #define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT + #define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT +#else + #define X_TILT_FULCRUM X_HOME_POS + #define Y_TILT_FULCRUM Y_HOME_POS +#endif + +/** + * Host keep alive + */ +#ifndef DEFAULT_KEEPALIVE_INTERVAL + #define DEFAULT_KEEPALIVE_INTERVAL 2 +#endif + +/** + * Provide a MAX_AUTORETRACT for older configs + */ +#if ENABLED(FWRETRACT) && !defined(MAX_AUTORETRACT) + #define MAX_AUTORETRACT 99 +#endif + +// MS1 MS2 Stepper Driver Microstepping mode table +#define MICROSTEP1 LOW,LOW +#if ENABLED(HEROIC_STEPPER_DRIVERS) + #define MICROSTEP128 LOW,HIGH +#else + #define MICROSTEP2 HIGH,LOW + #define MICROSTEP4 LOW,HIGH +#endif +#define MICROSTEP8 HIGH,HIGH +#ifdef __SAM3X8E__ + #if MB(ALLIGATOR) + #define MICROSTEP16 LOW,LOW + #define MICROSTEP32 HIGH,HIGH + #else + #define MICROSTEP16 HIGH,HIGH + #endif +#else + #define MICROSTEP16 HIGH,HIGH +#endif + +/** + * Override here because this is set in Configuration_adv.h + */ +#if ENABLED(ULTIPANEL) && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #undef SD_DETECT_INVERTED +#endif + +/** + * Set defaults for missing (newer) options + */ +#ifndef DISABLE_INACTIVE_X + #define DISABLE_INACTIVE_X DISABLE_X +#endif +#ifndef DISABLE_INACTIVE_Y + #define DISABLE_INACTIVE_Y DISABLE_Y +#endif +#ifndef DISABLE_INACTIVE_Z + #define DISABLE_INACTIVE_Z DISABLE_Z +#endif +#ifndef DISABLE_INACTIVE_E + #define DISABLE_INACTIVE_E DISABLE_E +#endif + +// Power Signal Control Definitions +// By default use ATX definition +#ifndef POWER_SUPPLY + #define POWER_SUPPLY 1 +#endif +#if (POWER_SUPPLY == 1) // 1 = ATX + #define PS_ON_AWAKE LOW + #define PS_ON_ASLEEP HIGH +#elif (POWER_SUPPLY == 2) // 2 = X-Box 360 203W + #define PS_ON_AWAKE HIGH + #define PS_ON_ASLEEP LOW +#endif +#define HAS_POWER_SWITCH (POWER_SUPPLY > 0 && PIN_EXISTS(PS_ON)) + +/** + * Temp Sensor defines + */ +#if TEMP_SENSOR_0 == -4 + #define HEATER_0_USES_AD8495 +#elif TEMP_SENSOR_0 == -3 + #define HEATER_0_USES_MAX6675 + #define MAX6675_IS_MAX31855 + #define MAX6675_TMIN -270 + #define MAX6675_TMAX 1800 +#elif TEMP_SENSOR_0 == -2 + #define HEATER_0_USES_MAX6675 + #define MAX6675_TMIN 0 + #define MAX6675_TMAX 1024 +#elif TEMP_SENSOR_0 == -1 + #define HEATER_0_USES_AD595 +#elif TEMP_SENSOR_0 == 0 + #undef HEATER_0_MINTEMP + #undef HEATER_0_MAXTEMP +#elif TEMP_SENSOR_0 > 0 + #define THERMISTORHEATER_0 TEMP_SENSOR_0 + #define HEATER_0_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_1 == -4 + #define HEATER_1_USES_AD8495 +#elif TEMP_SENSOR_1 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_1." +#elif TEMP_SENSOR_1 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_1." +#elif TEMP_SENSOR_1 == -1 + #define HEATER_1_USES_AD595 +#elif TEMP_SENSOR_1 == 0 + #undef HEATER_1_MINTEMP + #undef HEATER_1_MAXTEMP +#elif TEMP_SENSOR_1 > 0 + #define THERMISTORHEATER_1 TEMP_SENSOR_1 + #define HEATER_1_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_2 == -4 + #define HEATER_2_USES_AD8495 +#elif TEMP_SENSOR_2 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_2." +#elif TEMP_SENSOR_2 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_2." +#elif TEMP_SENSOR_2 == -1 + #define HEATER_2_USES_AD595 +#elif TEMP_SENSOR_2 == 0 + #undef HEATER_2_MINTEMP + #undef HEATER_2_MAXTEMP +#elif TEMP_SENSOR_2 > 0 + #define THERMISTORHEATER_2 TEMP_SENSOR_2 + #define HEATER_2_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_3 == -4 + #define HEATER_3_USES_AD8495 +#elif TEMP_SENSOR_3 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_3." +#elif TEMP_SENSOR_3 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_3." +#elif TEMP_SENSOR_3 == -1 + #define HEATER_3_USES_AD595 +#elif TEMP_SENSOR_3 == 0 + #undef HEATER_3_MINTEMP + #undef HEATER_3_MAXTEMP +#elif TEMP_SENSOR_3 > 0 + #define THERMISTORHEATER_3 TEMP_SENSOR_3 + #define HEATER_3_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_4 == -4 + #define HEATER_4_USES_AD8495 +#elif TEMP_SENSOR_4 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_4." +#elif TEMP_SENSOR_4 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_4." +#elif TEMP_SENSOR_4 == -1 + #define HEATER_4_USES_AD595 +#elif TEMP_SENSOR_4 == 0 + #undef HEATER_4_MINTEMP + #undef HEATER_4_MAXTEMP +#elif TEMP_SENSOR_4 > 0 + #define THERMISTORHEATER_4 TEMP_SENSOR_4 + #define HEATER_4_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_BED == -4 + #define HEATER_BED_USES_AD8495 +#elif TEMP_SENSOR_BED == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_BED." +#elif TEMP_SENSOR_BED == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." +#elif TEMP_SENSOR_BED == -1 + #define HEATER_BED_USES_AD595 +#elif TEMP_SENSOR_BED == 0 + #undef BED_MINTEMP + #undef BED_MAXTEMP +#elif TEMP_SENSOR_BED > 0 + #define THERMISTORBED TEMP_SENSOR_BED + #define HEATER_BED_USES_THERMISTOR +#endif + +#if TEMP_SENSOR_CHAMBER == -4 + #define HEATER_CHAMBER_USES_AD8495 +#elif TEMP_SENSOR_CHAMBER == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_CHAMBER." +#elif TEMP_SENSOR_CHAMBER == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_CHAMBER." +#elif TEMP_SENSOR_CHAMBER == -1 + #define HEATER_CHAMBER_USES_AD595 +#elif TEMP_SENSOR_CHAMBER > 0 + #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER + #define HEATER_CHAMBER_USES_THERMISTOR +#endif + +#define HOTEND_USES_THERMISTOR (ENABLED(HEATER_0_USES_THERMISTOR) || ENABLED(HEATER_1_USES_THERMISTOR) || ENABLED(HEATER_2_USES_THERMISTOR) || ENABLED(HEATER_3_USES_THERMISTOR) || ENABLED(HEATER_4_USES_THERMISTOR)) + +/** + * Default hotend offsets, if not defined + */ +#define HAS_HOTEND_OFFSET_Z (HOTENDS > 1 && (ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER))) +#if HOTENDS > 1 + #ifndef HOTEND_OFFSET_X + #define HOTEND_OFFSET_X { 0 } // X offsets for each extruder + #endif + #ifndef HOTEND_OFFSET_Y + #define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder + #endif + #if HAS_HOTEND_OFFSET_Z && !defined(HOTEND_OFFSET_Z) + #define HOTEND_OFFSET_Z { 0 } + #endif +#endif + +/** + * ARRAY_BY_EXTRUDERS based on EXTRUDERS + */ +#define ARRAY_BY_EXTRUDERS(...) ARRAY_N(EXTRUDERS, __VA_ARGS__) +#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1, v1, v1) + +/** + * ARRAY_BY_HOTENDS based on HOTENDS + */ +#define ARRAY_BY_HOTENDS(...) ARRAY_N(HOTENDS, __VA_ARGS__) +#define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1) + +/** + * X_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(X_DUAL_ENDSTOPS) + #if X_HOME_DIR > 0 + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN X_MIN_PIN + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN Z_MAX_PIN + #else + #define X2_MAX_ENDSTOP_INVERTING false + #endif + #define X2_MIN_ENDSTOP_INVERTING false + #else + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN X_MIN_PIN + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN Z_MAX_PIN + #else + #define X2_MIN_ENDSTOP_INVERTING false + #endif + #define X2_MAX_ENDSTOP_INVERTING false + #endif +#endif + +// Is an endstop plug used for the X2 endstop? +#define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) + +/** + * Y_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(Y_DUAL_ENDSTOPS) + #if Y_HOME_DIR > 0 + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN X_MIN_PIN + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN Z_MAX_PIN + #else + #define Y2_MAX_ENDSTOP_INVERTING false + #endif + #define Y2_MIN_ENDSTOP_INVERTING false + #else + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN X_MIN_PIN + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN Z_MAX_PIN + #else + #define Y2_MIN_ENDSTOP_INVERTING false + #endif + #define Y2_MAX_ENDSTOP_INVERTING false + #endif +#endif + +// Is an endstop plug used for the Y2 endstop or the bed probe? +#define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) + +/** + * Z_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(Z_DUAL_ENDSTOPS) + #if Z_HOME_DIR > 0 + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN X_MIN_PIN + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN Z_MAX_PIN + #else + #define Z2_MAX_ENDSTOP_INVERTING false + #endif + #define Z2_MIN_ENDSTOP_INVERTING false + #else + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN X_MIN_PIN + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN Z_MAX_PIN + #else + #define Z2_MIN_ENDSTOP_INVERTING false + #endif + #define Z2_MAX_ENDSTOP_INVERTING false + #endif +#endif + +// Is an endstop plug used for the Z2 endstop or the bed probe? +#define IS_Z2_OR_PROBE(A,M) ( \ + (ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) \ + || (ENABLED(Z_MIN_PROBE_ENDSTOP) && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) + +/** + * Set ENDSTOPPULLUPS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLUPS) + #if ENABLED(USE_XMAX_PLUG) + #define ENDSTOPPULLUP_XMAX + #endif + #if ENABLED(USE_YMAX_PLUG) + #define ENDSTOPPULLUP_YMAX + #endif + #if ENABLED(USE_ZMAX_PLUG) + #define ENDSTOPPULLUP_ZMAX + #endif + #if ENABLED(USE_XMIN_PLUG) + #define ENDSTOPPULLUP_XMIN + #endif + #if ENABLED(USE_YMIN_PLUG) + #define ENDSTOPPULLUP_YMIN + #endif + #if ENABLED(USE_ZMIN_PLUG) + #define ENDSTOPPULLUP_ZMIN + #endif +#endif + +/** + * Set ENDSTOPPULLDOWNS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLDOWNS) + #if ENABLED(USE_XMAX_PLUG) + #define ENDSTOPPULLDOWN_XMAX + #endif + #if ENABLED(USE_YMAX_PLUG) + #define ENDSTOPPULLDOWN_YMAX + #endif + #if ENABLED(USE_ZMAX_PLUG) + #define ENDSTOPPULLDOWN_ZMAX + #endif + #if ENABLED(USE_XMIN_PLUG) + #define ENDSTOPPULLDOWN_XMIN + #endif + #if ENABLED(USE_YMIN_PLUG) + #define ENDSTOPPULLDOWN_YMIN + #endif + #if ENABLED(USE_ZMIN_PLUG) + #define ENDSTOPPULLDOWN_ZMIN + #endif +#endif + +/** + * Shorthand for pin tests, used wherever needed + */ + +// Steppers +#define HAS_X_ENABLE (PIN_EXISTS(X_ENABLE)) +#define HAS_X_DIR (PIN_EXISTS(X_DIR)) +#define HAS_X_STEP (PIN_EXISTS(X_STEP)) +#define HAS_X_MICROSTEPS (PIN_EXISTS(X_MS1)) + +#define HAS_X2_ENABLE (PIN_EXISTS(X2_ENABLE)) +#define HAS_X2_DIR (PIN_EXISTS(X2_DIR)) +#define HAS_X2_STEP (PIN_EXISTS(X2_STEP)) +#define HAS_Y_MICROSTEPS (PIN_EXISTS(Y_MS1)) + +#define HAS_Y_ENABLE (PIN_EXISTS(Y_ENABLE)) +#define HAS_Y_DIR (PIN_EXISTS(Y_DIR)) +#define HAS_Y_STEP (PIN_EXISTS(Y_STEP)) +#define HAS_Z_MICROSTEPS (PIN_EXISTS(Z_MS1)) + +#define HAS_Y2_ENABLE (PIN_EXISTS(Y2_ENABLE)) +#define HAS_Y2_DIR (PIN_EXISTS(Y2_DIR)) +#define HAS_Y2_STEP (PIN_EXISTS(Y2_STEP)) + +#define HAS_Z_ENABLE (PIN_EXISTS(Z_ENABLE)) +#define HAS_Z_DIR (PIN_EXISTS(Z_DIR)) +#define HAS_Z_STEP (PIN_EXISTS(Z_STEP)) + +#define HAS_Z2_ENABLE (PIN_EXISTS(Z2_ENABLE)) +#define HAS_Z2_DIR (PIN_EXISTS(Z2_DIR)) +#define HAS_Z2_STEP (PIN_EXISTS(Z2_STEP)) + +// Extruder steppers and solenoids +#define HAS_E0_ENABLE (PIN_EXISTS(E0_ENABLE)) +#define HAS_E0_DIR (PIN_EXISTS(E0_DIR)) +#define HAS_E0_STEP (PIN_EXISTS(E0_STEP)) +#define HAS_E0_MICROSTEPS (PIN_EXISTS(E0_MS1)) +#define HAS_SOLENOID_0 (PIN_EXISTS(SOL0)) + +#define HAS_E1_ENABLE (PIN_EXISTS(E1_ENABLE)) +#define HAS_E1_DIR (PIN_EXISTS(E1_DIR)) +#define HAS_E1_STEP (PIN_EXISTS(E1_STEP)) +#define HAS_E1_MICROSTEPS (PIN_EXISTS(E1_MS1)) +#define HAS_SOLENOID_1 (PIN_EXISTS(SOL1)) + +#define HAS_E2_ENABLE (PIN_EXISTS(E2_ENABLE)) +#define HAS_E2_DIR (PIN_EXISTS(E2_DIR)) +#define HAS_E2_STEP (PIN_EXISTS(E2_STEP)) +#define HAS_E2_MICROSTEPS (PIN_EXISTS(E2_MS1)) +#define HAS_SOLENOID_2 (PIN_EXISTS(SOL2)) + +#define HAS_E3_ENABLE (PIN_EXISTS(E3_ENABLE)) +#define HAS_E3_DIR (PIN_EXISTS(E3_DIR)) +#define HAS_E3_STEP (PIN_EXISTS(E3_STEP)) +#define HAS_E3_MICROSTEPS (PIN_EXISTS(E3_MS1)) +#define HAS_SOLENOID_3 (PIN_EXISTS(SOL3)) + +#define HAS_E4_ENABLE (PIN_EXISTS(E4_ENABLE)) +#define HAS_E4_DIR (PIN_EXISTS(E4_DIR)) +#define HAS_E4_STEP (PIN_EXISTS(E4_STEP)) +#define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1)) +#define HAS_SOLENOID_4 (PIN_EXISTS(SOL4)) + +// Trinamic Stepper Drivers +#define HAS_TRINAMIC (ENABLED(HAVE_TMC2130) || ENABLED(HAVE_TMC2208) || ENABLED(IS_TRAMS)) +#define X_IS_TRINAMIC (ENABLED( X_IS_TMC2130) || ENABLED( X_IS_TMC2208) || ENABLED(IS_TRAMS)) +#define X2_IS_TRINAMIC (ENABLED(X2_IS_TMC2130) || ENABLED(X2_IS_TMC2208)) +#define Y_IS_TRINAMIC (ENABLED( Y_IS_TMC2130) || ENABLED( Y_IS_TMC2208) || ENABLED(IS_TRAMS)) +#define Y2_IS_TRINAMIC (ENABLED(Y2_IS_TMC2130) || ENABLED(Y2_IS_TMC2208)) +#define Z_IS_TRINAMIC (ENABLED( Z_IS_TMC2130) || ENABLED( Z_IS_TMC2208) || ENABLED(IS_TRAMS)) +#define Z2_IS_TRINAMIC (ENABLED(Z2_IS_TMC2130) || ENABLED(Z2_IS_TMC2208)) +#define E0_IS_TRINAMIC (ENABLED(E0_IS_TMC2130) || ENABLED(E0_IS_TMC2208) || ENABLED(IS_TRAMS)) +#define E1_IS_TRINAMIC (ENABLED(E1_IS_TMC2130) || ENABLED(E1_IS_TMC2208)) +#define E2_IS_TRINAMIC (ENABLED(E2_IS_TMC2130) || ENABLED(E2_IS_TMC2208)) +#define E3_IS_TRINAMIC (ENABLED(E3_IS_TMC2130) || ENABLED(E3_IS_TMC2208)) +#define E4_IS_TRINAMIC (ENABLED(E4_IS_TMC2130) || ENABLED(E4_IS_TMC2208)) + +#if ENABLED(SENSORLESS_HOMING) + // Disable Z axis sensorless homing if a probe is used to home the Z axis + #if HOMING_Z_WITH_PROBE + #undef Z_HOMING_SENSITIVITY + #endif + #define X_SENSORLESS (ENABLED(X_IS_TMC2130) && defined(X_HOMING_SENSITIVITY)) + #define Y_SENSORLESS (ENABLED(Y_IS_TMC2130) && defined(Y_HOMING_SENSITIVITY)) + #define Z_SENSORLESS (ENABLED(Z_IS_TMC2130) && defined(Z_HOMING_SENSITIVITY)) +#endif + +// Endstops and bed probe +#define HAS_STOP_TEST(A,M) (PIN_EXISTS(A##_##M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_OR_PROBE(A,M)) +#define HAS_X_MIN HAS_STOP_TEST(X,MIN) +#define HAS_X_MAX HAS_STOP_TEST(X,MAX) +#define HAS_Y_MIN HAS_STOP_TEST(Y,MIN) +#define HAS_Y_MAX HAS_STOP_TEST(Y,MAX) +#define HAS_Z_MIN HAS_STOP_TEST(Z,MIN) +#define HAS_Z_MAX HAS_STOP_TEST(Z,MAX) +#define HAS_X2_MIN (PIN_EXISTS(X2_MIN)) +#define HAS_X2_MAX (PIN_EXISTS(X2_MAX)) +#define HAS_Y2_MIN (PIN_EXISTS(Y2_MIN)) +#define HAS_Y2_MAX (PIN_EXISTS(Y2_MAX)) +#define HAS_Z2_MIN (PIN_EXISTS(Z2_MIN)) +#define HAS_Z2_MAX (PIN_EXISTS(Z2_MAX)) +#define HAS_Z_MIN_PROBE_PIN (PIN_EXISTS(Z_MIN_PROBE)) + +// ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) +#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && DISABLED(HEATER_##P##_USES_MAX6675)) +#define HAS_TEMP_ADC_0 HAS_ADC_TEST(0) +#define HAS_TEMP_ADC_1 HAS_ADC_TEST(1) +#define HAS_TEMP_ADC_2 HAS_ADC_TEST(2) +#define HAS_TEMP_ADC_3 HAS_ADC_TEST(3) +#define HAS_TEMP_ADC_4 HAS_ADC_TEST(4) +#define HAS_TEMP_ADC_BED HAS_ADC_TEST(BED) +#define HAS_TEMP_ADC_CHAMBER HAS_ADC_TEST(CHAMBER) + +#define HAS_TEMP_HOTEND (HAS_TEMP_ADC_0 || ENABLED(HEATER_0_USES_MAX6675)) +#define HAS_TEMP_BED HAS_TEMP_ADC_BED +#define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER + +// Heaters +#define HAS_HEATER_0 (PIN_EXISTS(HEATER_0)) +#define HAS_HEATER_1 (PIN_EXISTS(HEATER_1)) +#define HAS_HEATER_2 (PIN_EXISTS(HEATER_2)) +#define HAS_HEATER_3 (PIN_EXISTS(HEATER_3)) +#define HAS_HEATER_4 (PIN_EXISTS(HEATER_4)) +#define HAS_HEATER_BED (PIN_EXISTS(HEATER_BED)) + +// Shorthand for common combinations +#define HAS_HEATED_BED (HAS_TEMP_BED && HAS_HEATER_BED) +#define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_TEMP_CHAMBER) + +// PID heating +#if !HAS_HEATED_BED + #undef PIDTEMPBED +#endif +#define HAS_PID_HEATING (ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)) +#define HAS_PID_FOR_BOTH (ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED)) + +// Thermal protection +#define HAS_THERMALLY_PROTECTED_BED (HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED)) +#define WATCH_HOTENDS (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0) +#define WATCH_THE_BED (HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0) + +// Auto fans +#define HAS_AUTO_FAN_0 (PIN_EXISTS(E0_AUTO_FAN)) +#define HAS_AUTO_FAN_1 (HOTENDS > 1 && PIN_EXISTS(E1_AUTO_FAN)) +#define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN)) +#define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN)) +#define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN)) +#define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN)) +#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN) +#define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_3_IS_0 (E3_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_3_IS_1 (E3_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_3_IS_2 (E3_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_4_IS_0 (E4_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) + +// Other fans +#define HAS_FAN0 (PIN_EXISTS(FAN)) +#define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLER_FAN_PIN != FAN1_PIN && E0_AUTO_FAN_PIN != FAN1_PIN && E1_AUTO_FAN_PIN != FAN1_PIN && E2_AUTO_FAN_PIN != FAN1_PIN && E3_AUTO_FAN_PIN != FAN1_PIN) +#define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLER_FAN_PIN != FAN2_PIN && E0_AUTO_FAN_PIN != FAN2_PIN && E1_AUTO_FAN_PIN != FAN2_PIN && E2_AUTO_FAN_PIN != FAN2_PIN && E3_AUTO_FAN_PIN != FAN2_PIN) +#define HAS_CONTROLLER_FAN (PIN_EXISTS(CONTROLLER_FAN)) + +// Servos +#define HAS_SERVO_0 (PIN_EXISTS(SERVO0)) +#define HAS_SERVO_1 (PIN_EXISTS(SERVO1)) +#define HAS_SERVO_2 (PIN_EXISTS(SERVO2)) +#define HAS_SERVO_3 (PIN_EXISTS(SERVO3)) +#define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0) + +#if HAS_SERVOS && !defined(Z_PROBE_SERVO_NR) + #define Z_PROBE_SERVO_NR -1 +#endif + +// Sensors +#define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH)) + +// User Interface +#define HAS_HOME (PIN_EXISTS(HOME)) +#define HAS_KILL (PIN_EXISTS(KILL)) +#define HAS_SUICIDE (PIN_EXISTS(SUICIDE)) +#define HAS_PHOTOGRAPH (PIN_EXISTS(PHOTOGRAPH)) +#define HAS_BUZZER (PIN_EXISTS(BEEPER) || ENABLED(LCD_USE_I2C_BUZZER)) +#define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE)) + +// Digital control +#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS) +#define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET)) +#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) +#define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E)) + +#if !HAS_TEMP_SENSOR + #undef AUTO_REPORT_TEMPERATURES +#endif + +#define HAS_AUTO_REPORTING (ENABLED(AUTO_REPORT_TEMPERATURES) || ENABLED(AUTO_REPORT_SD_STATUS)) + +/** + * This setting is also used by M109 when trying to calculate + * a ballpark safe margin to prevent wait-forever situation. + */ +#ifndef EXTRUDE_MINTEMP + #define EXTRUDE_MINTEMP 170 +#endif + +/** + * Heater signal inversion defaults + */ + +#if HAS_HEATER_0 && !defined(HEATER_0_INVERTING) + #define HEATER_0_INVERTING false +#endif + +#if HAS_HEATER_1 && !defined(HEATER_1_INVERTING) + #define HEATER_1_INVERTING false +#endif + +#if HAS_HEATER_2 && !defined(HEATER_2_INVERTING) + #define HEATER_2_INVERTING false +#endif + +#if HAS_HEATER_3 && !defined(HEATER_3_INVERTING) + #define HEATER_3_INVERTING false +#endif + +#if HAS_HEATER_4 && !defined(HEATER_4_INVERTING) + #define HEATER_4_INVERTING false +#endif + +/** + * Helper Macros for heaters and extruder fan + */ + +#define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, (v) ^ HEATER_0_INVERTING) +#if HOTENDS > 1 || ENABLED(HEATERS_PARALLEL) + #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, (v) ^ HEATER_1_INVERTING) + #if HOTENDS > 2 + #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, (v) ^ HEATER_2_INVERTING) + #if HOTENDS > 3 + #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING) + #if HOTENDS > 4 + #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING) + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 +#endif // HOTENDS > 1 +#if ENABLED(HEATERS_PARALLEL) + #define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); } +#else + #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) +#endif + +/** + * Heated bed requires settings + */ +#if HAS_HEATED_BED + #ifndef MAX_BED_POWER + #define MAX_BED_POWER 255 + #endif + #ifndef HEATER_BED_INVERTING + #define HEATER_BED_INVERTING false + #endif + #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, (v) ^ HEATER_BED_INVERTING) +#endif + +/** + * Up to 3 PWM fans + */ +#if HAS_FAN2 + #define FAN_COUNT 3 +#elif HAS_FAN1 + #define FAN_COUNT 2 +#elif HAS_FAN0 + #define FAN_COUNT 1 +#else + #define FAN_COUNT 0 +#endif + +#if HAS_FAN0 + #define WRITE_FAN(v) WRITE(FAN_PIN, v) + #define WRITE_FAN0(v) WRITE_FAN(v) +#endif +#if HAS_FAN1 + #define WRITE_FAN1(v) WRITE(FAN1_PIN, v) +#endif +#if HAS_FAN2 + #define WRITE_FAN2(v) WRITE(FAN2_PIN, v) +#endif +#define WRITE_FAN_N(n, v) WRITE_FAN##n(v) + +/** + * Part Cooling fan multipliexer + */ +#define HAS_FANMUX PIN_EXISTS(FANMUX0) + +/** + * MIN/MAX fan PWM scaling + */ +#ifndef FAN_MIN_PWM + #define FAN_MIN_PWM 0 +#endif +#ifndef FAN_MAX_PWM + #define FAN_MAX_PWM 255 +#endif +#if FAN_MIN_PWM < 0 || FAN_MIN_PWM > 255 + #error "FAN_MIN_PWM must be a value from 0 to 255." +#elif FAN_MAX_PWM < 0 || FAN_MAX_PWM > 255 + #error "FAN_MAX_PWM must be a value from 0 to 255." +#elif FAN_MIN_PWM > FAN_MAX_PWM + #error "FAN_MIN_PWM must be less than or equal to FAN_MAX_PWM." +#endif + +/** + * Bed Probe dependencies + */ +#if HAS_BED_PROBE + #if ENABLED(ENDSTOPPULLUPS) && HAS_Z_MIN_PROBE_PIN + #define ENDSTOPPULLUP_ZMIN_PROBE + #endif + #ifndef Z_PROBE_OFFSET_RANGE_MIN + #define Z_PROBE_OFFSET_RANGE_MIN -20 + #endif + #ifndef Z_PROBE_OFFSET_RANGE_MAX + #define Z_PROBE_OFFSET_RANGE_MAX 20 + #endif + #ifndef XY_PROBE_SPEED + #ifdef HOMING_FEEDRATE_XY + #define XY_PROBE_SPEED HOMING_FEEDRATE_XY + #else + #define XY_PROBE_SPEED 4000 + #endif + #endif +#else + #undef X_PROBE_OFFSET_FROM_EXTRUDER + #undef Y_PROBE_OFFSET_FROM_EXTRUDER + #undef Z_PROBE_OFFSET_FROM_EXTRUDER + #define X_PROBE_OFFSET_FROM_EXTRUDER 0 + #define Y_PROBE_OFFSET_FROM_EXTRUDER 0 + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 +#endif + +/** + * XYZ Bed Skew Correction + */ +#if ENABLED(SKEW_CORRECTION) + #define SKEW_FACTOR_MIN -1 + #define SKEW_FACTOR_MAX 1 + + #define _GET_SIDE(a,b,c) (SQRT(2*sq(a)+2*sq(b)-4*sq(c))*0.5) + #define _SKEW_SIDE(a,b,c) tan(M_PI*0.5-acos((sq(a)-sq(b)-sq(c))/(2*c*b))) + #define _SKEW_FACTOR(a,b,c) _SKEW_SIDE(float(a),_GET_SIDE(float(a),float(b),float(c)),float(c)) + + #ifndef XY_SKEW_FACTOR + constexpr float XY_SKEW_FACTOR = ( + #if defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD) + _SKEW_FACTOR(XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD) + #else + 0.0 + #endif + ); + #endif + #ifndef XZ_SKEW_FACTOR + #if defined(XY_SIDE_AD) && !defined(XZ_SIDE_AD) + #define XZ_SIDE_AD XY_SIDE_AD + #endif + constexpr float XZ_SKEW_FACTOR = ( + #if defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD) + _SKEW_FACTOR(XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD) + #else + 0.0 + #endif + ); + #endif + #ifndef YZ_SKEW_FACTOR + constexpr float YZ_SKEW_FACTOR = ( + #if defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD) + _SKEW_FACTOR(YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD) + #else + 0.0 + #endif + ); + #endif +#endif // SKEW_CORRECTION + +/** + * Set granular options based on the specific type of leveling + */ +#define UBL_SEGMENTED (ENABLED(AUTO_BED_LEVELING_UBL) && (ENABLED(DELTA))) +#define ABL_PLANAR (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT)) +#define ABL_GRID (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)) +#define OLDSCHOOL_ABL (ABL_PLANAR || ABL_GRID) +#define HAS_ABL (OLDSCHOOL_ABL || ENABLED(AUTO_BED_LEVELING_UBL)) +#define HAS_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING)) +#define HAS_AUTOLEVEL (HAS_ABL && DISABLED(PROBE_MANUALLY)) +#define HAS_MESH (ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(MESH_BED_LEVELING)) +#define PLANNER_LEVELING (OLDSCHOOL_ABL || ENABLED(MESH_BED_LEVELING) || UBL_SEGMENTED || ENABLED(SKEW_CORRECTION)) +#define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) +#define HAS_UBL_AND_CURVES (ENABLED(AUTO_BED_LEVELING_UBL) && !PLANNER_LEVELING && (ENABLED(ARC_SUPPORT) || ENABLED(BEZIER_CURVE_SUPPORT))) + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #undef LCD_BED_LEVELING +#endif + +/** + * Heater & Fan Pausing + */ +#if FAN_COUNT == 0 + #undef PROBING_FANS_OFF +#endif +#define QUIET_PROBING (HAS_BED_PROBE && (ENABLED(PROBING_HEATERS_OFF) || ENABLED(PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)) +#define HEATER_IDLE_HANDLER (ENABLED(ADVANCED_PAUSE_FEATURE) || ENABLED(PROBING_HEATERS_OFF)) + +#if ENABLED(ADVANCED_PAUSE_FEATURE) && !defined(FILAMENT_CHANGE_SLOW_LOAD_LENGTH) + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 +#endif + +/** + * Only constrain Z on DELTA / SCARA machines + */ +#if IS_KINEMATIC + #undef MIN_SOFTWARE_ENDSTOP_X + #undef MIN_SOFTWARE_ENDSTOP_Y + #undef MAX_SOFTWARE_ENDSTOP_X + #undef MAX_SOFTWARE_ENDSTOP_Y +#endif + +/** + * Bed Probing rectangular bounds + * These can be further constrained in code for Delta and SCARA + */ + +#ifndef MIN_PROBE_EDGE + #define MIN_PROBE_EDGE 0 +#endif + +#if ENABLED(DELTA) + /** + * Delta radius/rod trimmers/angle trimmers + */ + #define _PROBE_RADIUS (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #ifndef DELTA_CALIBRATION_RADIUS + #ifdef X_PROBE_OFFSET_FROM_EXTRUDER + #define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - MAX3(abs(X_PROBE_OFFSET_FROM_EXTRUDER), abs(Y_PROBE_OFFSET_FROM_EXTRUDER), abs(MIN_PROBE_EDGE))) + #else + #define DELTA_CALIBRATION_RADIUS _PROBE_RADIUS + #endif + #endif + #ifndef DELTA_ENDSTOP_ADJ + #define DELTA_ENDSTOP_ADJ { 0, 0, 0 } + #endif + #ifndef DELTA_TOWER_ANGLE_TRIM + #define DELTA_TOWER_ANGLE_TRIM {0, 0, 0} + #endif + #ifndef DELTA_RADIUS_TRIM_TOWER + #define DELTA_RADIUS_TRIM_TOWER {0, 0, 0} + #endif + #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER + #define DELTA_DIAGONAL_ROD_TRIM_TOWER {0, 0, 0} + #endif + + // Probing points may be verified at compile time within the radius + // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") + // so that may be added to SanityCheck.h in the future. + #define _MIN_PROBE_X (X_CENTER - (_PROBE_RADIUS)) + #define _MIN_PROBE_Y (Y_CENTER - (_PROBE_RADIUS)) + #define _MAX_PROBE_X (X_CENTER + _PROBE_RADIUS) + #define _MAX_PROBE_Y (Y_CENTER + _PROBE_RADIUS) + +#elif IS_SCARA + + #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) + #define _PROBE_RADIUS (SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #define _MIN_PROBE_X (X_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) + #define _MIN_PROBE_Y (Y_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) + #define _MAX_PROBE_X (X_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #define _MAX_PROBE_Y (Y_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + +#else + + // Boundaries for Cartesian probing based on bed limits + #define _MIN_PROBE_X (max(X_MIN_BED + MIN_PROBE_EDGE, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MIN_PROBE_Y (max(Y_MIN_BED + MIN_PROBE_EDGE, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MAX_PROBE_X (min(X_MAX_BED - (MIN_PROBE_EDGE), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MAX_PROBE_Y (min(Y_MAX_BED - (MIN_PROBE_EDGE), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + +#endif + +#if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) + #define LEVELED_SEGMENT_LENGTH 5 +#endif + +// These may be overridden in Configuration.h if a smaller area is desired +#ifndef MIN_PROBE_X + #define MIN_PROBE_X _MIN_PROBE_X +#endif +#ifndef MIN_PROBE_Y + #define MIN_PROBE_Y _MIN_PROBE_Y +#endif +#ifndef MAX_PROBE_X + #define MAX_PROBE_X _MAX_PROBE_X +#endif +#ifndef MAX_PROBE_Y + #define MAX_PROBE_Y _MAX_PROBE_Y +#endif + +/** + * Default mesh area is an area with an inset margin on the print area. + */ +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + #if IS_KINEMATIC + // Probing points may be verified at compile time within the radius + // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") + // so that may be added to SanityCheck.h in the future. + #define _MESH_MIN_X (X_MIN_BED + MESH_INSET) + #define _MESH_MIN_Y (Y_MIN_BED + MESH_INSET) + #define _MESH_MAX_X (X_MAX_BED - (MESH_INSET)) + #define _MESH_MAX_Y (Y_MAX_BED - (MESH_INSET)) + #else + // Boundaries for Cartesian probing based on set limits + #if ENABLED(AUTO_BED_LEVELING_UBL) + #define _MESH_MIN_X (max(X_MIN_BED + MESH_INSET, X_MIN_POS)) // UBL is careful not to probe off the bed. It does not + #define _MESH_MIN_Y (max(Y_MIN_BED + MESH_INSET, Y_MIN_POS)) // need *_PROBE_OFFSET_FROM_EXTRUDER in the mesh dimensions + #define _MESH_MAX_X (min(X_MAX_BED - (MESH_INSET), X_MAX_POS)) + #define _MESH_MAX_Y (min(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) + #else + #define _MESH_MIN_X (max(X_MIN_BED + MESH_INSET, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MIN_Y (max(Y_MIN_BED + MESH_INSET, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MAX_X (min(X_MAX_BED - (MESH_INSET), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MAX_Y (min(Y_MAX_BED - (MESH_INSET), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #endif + #endif + + // These may be overridden in Configuration.h if a smaller area is desired + #ifndef MESH_MIN_X + #define MESH_MIN_X _MESH_MIN_X + #endif + #ifndef MESH_MIN_Y + #define MESH_MIN_Y _MESH_MIN_Y + #endif + #ifndef MESH_MAX_X + #define MESH_MAX_X _MESH_MAX_X + #endif + #ifndef MESH_MAX_Y + #define MESH_MAX_Y _MESH_MAX_Y + #endif + +#endif // MESH_BED_LEVELING || AUTO_BED_LEVELING_UBL + +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_3POINT) + #if IS_KINEMATIC + #define SIN0 0.0 + #define SIN120 0.866025 + #define SIN240 -0.866025 + #define COS0 1.0 + #define COS120 -0.5 + #define COS240 -0.5 + #ifndef PROBE_PT_1_X + #define PROBE_PT_1_X (X_CENTER + (_PROBE_RADIUS) * COS0) + #endif + #ifndef PROBE_PT_1_Y + #define PROBE_PT_1_Y (Y_CENTER + (_PROBE_RADIUS) * SIN0) + #endif + #ifndef PROBE_PT_2_X + #define PROBE_PT_2_X (X_CENTER + (_PROBE_RADIUS) * COS120) + #endif + #ifndef PROBE_PT_2_Y + #define PROBE_PT_2_Y (Y_CENTER + (_PROBE_RADIUS) * SIN120) + #endif + #ifndef PROBE_PT_3_X + #define PROBE_PT_3_X (X_CENTER + (_PROBE_RADIUS) * COS240) + #endif + #ifndef PROBE_PT_3_Y + #define PROBE_PT_3_Y (Y_CENTER + (_PROBE_RADIUS) * SIN240) + #endif + #else + #ifndef PROBE_PT_1_X + #define PROBE_PT_1_X MIN_PROBE_X + #endif + #ifndef PROBE_PT_1_Y + #define PROBE_PT_1_Y MIN_PROBE_Y + #endif + #ifndef PROBE_PT_2_X + #define PROBE_PT_2_X MAX_PROBE_X + #endif + #ifndef PROBE_PT_2_Y + #define PROBE_PT_2_Y MIN_PROBE_Y + #endif + #ifndef PROBE_PT_3_X + #define PROBE_PT_3_X X_CENTER + #endif + #ifndef PROBE_PT_3_Y + #define PROBE_PT_3_Y MAX_PROBE_Y + #endif + #endif +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + #ifndef LEFT_PROBE_BED_POSITION + #define LEFT_PROBE_BED_POSITION MIN_PROBE_X + #endif + #ifndef RIGHT_PROBE_BED_POSITION + #define RIGHT_PROBE_BED_POSITION MAX_PROBE_X + #endif + #ifndef FRONT_PROBE_BED_POSITION + #define FRONT_PROBE_BED_POSITION MIN_PROBE_Y + #endif + #ifndef BACK_PROBE_BED_POSITION + #define BACK_PROBE_BED_POSITION MAX_PROBE_Y + #endif +#endif + +/** + * Buzzer/Speaker + */ +#if ENABLED(LCD_USE_I2C_BUZZER) + #ifndef LCD_FEEDBACK_FREQUENCY_HZ + #define LCD_FEEDBACK_FREQUENCY_HZ 1000 + #endif + #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS + #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 + #endif +#else + #ifndef LCD_FEEDBACK_FREQUENCY_HZ + #define LCD_FEEDBACK_FREQUENCY_HZ 5000 + #endif + #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS + #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 + #endif +#endif + +/** + * VIKI2, miniVIKI, AZSMZ_12864, and MKS_12864OLED_SSD1306 require DOGLCD_SCK and DOGLCD_MOSI to be defined. + */ +#if ENABLED(VIKI2) || ENABLED(miniVIKI) || ENABLED(AZSMZ_12864) || ENABLED(MKS_12864OLED_SSD1306) + #ifndef DOGLCD_SCK + #define DOGLCD_SCK SCK_PIN + #endif + #ifndef DOGLCD_MOSI + #define DOGLCD_MOSI MOSI_PIN + #endif +#endif + +/** + * Z_HOMING_HEIGHT / Z_CLEARANCE_BETWEEN_PROBES + */ +#ifndef Z_HOMING_HEIGHT + #ifndef Z_CLEARANCE_BETWEEN_PROBES + #define Z_HOMING_HEIGHT 0 + #else + #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES + #endif +#endif +#ifndef Z_CLEARANCE_BETWEEN_PROBES + #define Z_CLEARANCE_BETWEEN_PROBES Z_HOMING_HEIGHT +#endif +#if Z_CLEARANCE_BETWEEN_PROBES > Z_HOMING_HEIGHT + #define MANUAL_PROBE_HEIGHT Z_CLEARANCE_BETWEEN_PROBES +#else + #define MANUAL_PROBE_HEIGHT Z_HOMING_HEIGHT +#endif + +#ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation + #undef UI_VOLTAGE_LEVEL + #undef RADDS_DISPLAY + #undef MOTOR_CURRENT +#endif + +// Updated G92 behavior shifts the workspace +#define HAS_POSITION_SHIFT DISABLED(NO_WORKSPACE_OFFSETS) +// The home offset also shifts the coordinate space +#define HAS_HOME_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA)) +// Either offset yields extra calculations on all moves +#define HAS_WORKSPACE_OFFSET (HAS_POSITION_SHIFT || HAS_HOME_OFFSET) +// M206 doesn't apply to DELTA +#define HAS_M206_COMMAND (HAS_HOME_OFFSET && DISABLED(DELTA)) + +// LCD timeout to status screen default is 15s +#ifndef LCD_TIMEOUT_TO_STATUS + #define LCD_TIMEOUT_TO_STATUS 15000 +#endif + +// Shorthand +#define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) + +// Add commands that need sub-codes to this list +#define USE_GCODE_SUBCODES ENABLED(G38_PROBE_TARGET) || ENABLED(CNC_COORDINATE_SYSTEMS) || ENABLED(POWER_LOSS_RECOVERY) + +// Parking Extruder +#if ENABLED(PARKING_EXTRUDER) + #ifndef PARKING_EXTRUDER_GRAB_DISTANCE + #define PARKING_EXTRUDER_GRAB_DISTANCE 0 + #endif + #ifndef PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE HIGH + #endif +#endif + +// Use float instead of double. Needs profiling. +#if defined(ARDUINO_ARCH_SAM) && ENABLED(DELTA_FAST_SQRT) + #undef ATAN2 + #undef FABS + #undef POW + #undef SQRT + #undef CEIL + #undef FLOOR + #undef LROUND + #undef FMOD + #define ATAN2(y, x) atan2f(y, x) + #define POW(x, y) powf(x, y) + #define SQRT(x) sqrtf(x) + #define CEIL(x) ceilf(x) + #define FLOOR(x) floorf(x) + #define LROUND(x) lroundf(x) + #define FMOD(x, y) fmodf(x, y) +#endif + +// Number of VFAT entries used. Each entry has 13 UTF-16 characters +#if ENABLED(SCROLL_LONG_FILENAMES) + #define MAX_VFAT_ENTRIES (5) +#else + #define MAX_VFAT_ENTRIES (2) +#endif + +// Set defaults for unspecified LED user colors +#if ENABLED(LED_CONTROL_MENU) + #ifndef LED_USER_PRESET_RED + #define LED_USER_PRESET_RED 255 + #endif + #ifndef LED_USER_PRESET_GREEN + #define LED_USER_PRESET_GREEN 255 + #endif + #ifndef LED_USER_PRESET_BLUE + #define LED_USER_PRESET_BLUE 255 + #endif + #ifndef LED_USER_PRESET_WHITE + #define LED_USER_PRESET_WHITE 0 + #endif + #ifndef LED_USER_PRESET_BRIGHTNESS + #ifdef NEOPIXEL_BRIGHTNESS + #define LED_USER_PRESET_BRIGHTNESS NEOPIXEL_BRIGHTNESS + #else + #define LED_USER_PRESET_BRIGHTNESS 255 + #endif + #endif +#endif + +// Nozzle park +#if ENABLED(NOZZLE_PARK_FEATURE) && ENABLED(DELTA) + #undef NOZZLE_PARK_Z_FEEDRATE + #define NOZZLE_PARK_Z_FEEDRATE NOZZLE_PARK_XY_FEEDRATE +#endif + +// Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768 +// because of a bug in the shared SPI implementation. (See #8122) +#if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define SDCARD_SORT_ALPHA // Keeps one directory level in RAM. Changing + // directory levels still glitches the screen, + // but the following LCD update cleans it up. + #undef SDSORT_LIMIT + #undef SDSORT_USES_RAM + #undef SDSORT_USES_STACK + #undef SDSORT_CACHE_NAMES + #define SDSORT_LIMIT 64 + #define SDSORT_USES_RAM true + #define SDSORT_USES_STACK false + #define SDSORT_CACHE_NAMES true + #ifndef FOLDER_SORTING + #define FOLDER_SORTING -1 + #endif + #ifndef SDSORT_GCODE + #define SDSORT_GCODE false + #endif + #ifndef SDSORT_DYNAMIC_RAM + #define SDSORT_DYNAMIC_RAM false + #endif + #ifndef SDSORT_CACHE_VFATS + #define SDSORT_CACHE_VFATS 2 + #endif +#endif + +// needs to be here so that we catch the above changes to our defines +#if ENABLED(SDCARD_SORT_ALPHA) + #define HAS_FOLDER_SORTING (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) +#endif + +// If platform requires early initialization of watchdog to properly boot +#define EARLY_WATCHDOG (ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM)) + +#if ENABLED(G29_RETRY_AND_RECOVER) + #define USE_EXECUTE_COMMANDS_IMMEDIATE +#endif + +#endif // CONDITIONALS_POST_H diff --git a/Marlin/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h similarity index 74% rename from Marlin/MarlinConfig.h rename to Marlin/src/inc/MarlinConfig.h index 5f77dba0e4..539726e405 100644 --- a/Marlin/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -20,24 +20,28 @@ * */ -#ifndef MARLIN_CONFIG_H -#define MARLIN_CONFIG_H +#ifndef _MARLIN_CONFIG_H_ +#define _MARLIN_CONFIG_H_ + +#include "MarlinConfigPre.h" + +#include HAL_PATH(../HAL, HAL.h) + +#include "../pins/pins.h" -#include "fastio.h" -#include "macros.h" -#include "boards.h" -#include "Version.h" -#include "Configuration.h" -#include "Conditionals_LCD.h" -#include "Configuration_adv.h" -#include "pins.h" #if defined(__AVR__) && !defined(USBCON) #define HardwareSerial_h // trick to disable the standard HWserial #endif -#include "Arduino.h" + #include "Conditionals_post.h" #include "SanityCheck.h" -#include +#include HAL_PATH(../HAL, SanityCheck.h) -#endif // MARLIN_CONFIG_H +// Include all core headers +#include "../core/enum.h" +#include "../core/language.h" +#include "../core/utility.h" +#include "../core/serial.h" + +#endif // _MARLIN_CONFIG_H_ diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h new file mode 100644 index 0000000000..9ed1ee8ffa --- /dev/null +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef _MARLIN_CONFIGPRE_H_ +#define _MARLIN_CONFIGPRE_H_ + +#include "../HAL/platforms.h" +#include "../core/boards.h" +#include "../core/macros.h" +#include "../core/types.h" +#include "Version.h" +#include "../../Configuration.h" +#include "Conditionals_LCD.h" +#include "../../Configuration_adv.h" +#include "Conditionals_adv.h" + +#endif // _MARLIN_CONFIGPRE_H_ diff --git a/Marlin/SanityCheck.h b/Marlin/src/inc/SanityCheck.h similarity index 90% rename from Marlin/SanityCheck.h rename to Marlin/src/inc/SanityCheck.h index 6e7b622862..f84e50f260 100644 --- a/Marlin/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -54,7 +54,9 @@ /** * Warnings for old configurations */ -#if !defined(X_BED_SIZE) || !defined(Y_BED_SIZE) +#ifndef MOTHERBOARD + #error "MOTHERBOARD is required. Please update your configuration." +#elif !defined(X_BED_SIZE) || !defined(Y_BED_SIZE) #error "X_BED_SIZE and Y_BED_SIZE are now required! Please update your configuration." #elif WATCH_TEMP_PERIOD > 500 #error "WATCH_TEMP_PERIOD now uses seconds instead of milliseconds." @@ -273,6 +275,14 @@ #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH. Please update your configuration." #elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET) #error "LEVEL_BED_CORNERS requires a LEVEL_CORNERS_INSET value. Please update your Configuration.h." +#elif defined(BEZIER_JERK_CONTROL) + #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION. Please update your configuration." +#elif defined(JUNCTION_DEVIATION_FACTOR) + #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM. Please update your configuration." +#elif defined(JUNCTION_ACCELERATION_FACTOR) + #error "JUNCTION_ACCELERATION_FACTOR is obsolete. Delete it from Configuration_adv.h." +#elif defined(JUNCTION_ACCELERATION) + #error "JUNCTION_ACCELERATION is obsolete. Delete it from Configuration_adv.h." #endif #define BOARD_MKS_13 -47 @@ -314,8 +324,6 @@ #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." #elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." - #elif ENABLED(BLUETOOTH) - #error "BLUETOOTH is only supported with AT90USB." #endif #elif ENABLED(SERIAL_XON_XOFF) || ENABLED(SERIAL_STATS_MAX_RX_QUEUED) || ENABLED(SERIAL_STATS_DROPPED_RX) #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." @@ -325,6 +333,10 @@ #error "Set SERIAL_PORT to the port on your board. Usually this is 0." #endif +#if SERIAL_PORT_2 && NUM_SERIAL < 2 + #error "SERIAL_PORT_2 is not supported for your MOTHERBOARD. Disable it to continue." +#endif + /** * Dual Stepper Drivers */ @@ -363,6 +375,35 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #endif #endif +#if !defined(TARGET_LPC1768) && ( \ + ENABLED(ENDSTOPPULLDOWNS) \ + || ENABLED(ENDSTOPPULLDOWN_XMAX) \ + || ENABLED(ENDSTOPPULLDOWN_YMAX) \ + || ENABLED(ENDSTOPPULLDOWN_ZMAX) \ + || ENABLED(ENDSTOPPULLDOWN_XMIN) \ + || ENABLED(ENDSTOPPULLDOWN_YMIN) \ + || ENABLED(ENDSTOPPULLDOWN_ZMIN) ) + #error "PULLDOWN pin mode is not available on the selected board." +#endif + +#if ENABLED(ENDSTOPPULLUPS) && ENABLED(ENDSTOPPULLDOWNS) + #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." +#elif ENABLED(FIL_RUNOUT_PULLUP) && ENABLED(FIL_RUNOUT_PULLDOWN) + #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." +#elif ENABLED(ENDSTOPPULLUP_XMAX) && ENABLED(ENDSTOPPULLDOWN_XMAX) + #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." +#elif ENABLED(ENDSTOPPULLUP_YMAX) && ENABLED(ENDSTOPPULLDOWN_YMAX) + #error "Enable only one of ENDSTOPPULLUP_Y_MAX or ENDSTOPPULLDOWN_Y_MAX." +#elif ENABLED(ENDSTOPPULLUP_ZMAX) && ENABLED(ENDSTOPPULLDOWN_ZMAX) + #error "Enable only one of ENDSTOPPULLUP_Z_MAX or ENDSTOPPULLDOWN_Z_MAX." +#elif ENABLED(ENDSTOPPULLUP_XMIN) && ENABLED(ENDSTOPPULLDOWN_XMIN) + #error "Enable only one of ENDSTOPPULLUP_X_MIN or ENDSTOPPULLDOWN_X_MIN." +#elif ENABLED(ENDSTOPPULLUP_YMIN) && ENABLED(ENDSTOPPULLDOWN_YMIN) + #error "Enable only one of ENDSTOPPULLUP_Y_MIN or ENDSTOPPULLDOWN_Y_MIN." +#elif ENABLED(ENDSTOPPULLUP_ZMIN) && ENABLED(ENDSTOPPULLDOWN_ZMIN) + #error "Enable only one of ENDSTOPPULLUP_Z_MIN or ENDSTOPPULLDOWN_Z_MIN." +#endif + /** * Progress Bar */ @@ -1350,6 +1391,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, * miniVIKI => ULTIMAKERCONTROLLER * VIKI2 => ULTIMAKERCONTROLLER * ELB_FULL_GRAPHIC_CONTROLLER => ULTIMAKERCONTROLLER + * AZSMZ_12864 => ULTIMAKERCONTROLLER * PANEL_ONE => ULTIMAKERCONTROLLER */ #if 1 < 0 \ @@ -1358,6 +1400,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, && DISABLED(miniVIKI) \ && DISABLED(VIKI2) \ && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + && DISABLED(AZSMZ_12864) \ && DISABLED(PANEL_ONE) \ && DISABLED(MKS_12864OLED) \ && DISABLED(MKS_12864OLED_SSD1306) ) \ @@ -1379,6 +1422,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, + ENABLED(VIKI2) \ + ENABLED(miniVIKI) \ + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + + ENABLED(AZSMZ_12864) \ + ENABLED(G3D_PANEL) \ + (ENABLED(MINIPANEL) && DISABLED(MKS_MINI_12864)) \ + ENABLED(MKS_MINI_12864) \ @@ -1404,36 +1448,36 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, * Make sure HAVE_TMC26X is warranted */ #if ENABLED(HAVE_TMC26X) && !( \ - ENABLED( X_IS_TMC26X) \ - || ENABLED(X2_IS_TMC26X) \ - || ENABLED( Y_IS_TMC26X) \ - || ENABLED(Y2_IS_TMC26X) \ - || ENABLED( Z_IS_TMC26X) \ - || ENABLED(Z2_IS_TMC26X) \ - || ENABLED(E0_IS_TMC26X) \ - || ENABLED(E1_IS_TMC26X) \ - || ENABLED(E2_IS_TMC26X) \ - || ENABLED(E3_IS_TMC26X) \ - || ENABLED(E4_IS_TMC26X) \ + ENABLED( X_IS_TMC26X ) \ + || ENABLED( X2_IS_TMC26X ) \ + || ENABLED( Y_IS_TMC26X ) \ + || ENABLED( Y2_IS_TMC26X ) \ + || ENABLED( Z_IS_TMC26X ) \ + || ENABLED( Z2_IS_TMC26X ) \ + || ENABLED( E0_IS_TMC26X ) \ + || ENABLED( E1_IS_TMC26X ) \ + || ENABLED( E2_IS_TMC26X ) \ + || ENABLED( E3_IS_TMC26X ) \ + || ENABLED( E4_IS_TMC26X ) \ ) #error "HAVE_TMC26X requires at least one TMC26X stepper to be set." #endif /** - * TMC2130 Requirements + * Make sure HAVE_TMC2130 is warranted */ #if ENABLED(HAVE_TMC2130) - #if !( ENABLED( X_IS_TMC2130) \ - || ENABLED(X2_IS_TMC2130) \ - || ENABLED( Y_IS_TMC2130) \ - || ENABLED(Y2_IS_TMC2130) \ - || ENABLED( Z_IS_TMC2130) \ - || ENABLED(Z2_IS_TMC2130) \ - || ENABLED(E0_IS_TMC2130) \ - || ENABLED(E1_IS_TMC2130) \ - || ENABLED(E2_IS_TMC2130) \ - || ENABLED(E3_IS_TMC2130) \ - || ENABLED(E4_IS_TMC2130) ) + #if !( ENABLED( X_IS_TMC2130 ) \ + || ENABLED( X2_IS_TMC2130 ) \ + || ENABLED( Y_IS_TMC2130 ) \ + || ENABLED( Y2_IS_TMC2130 ) \ + || ENABLED( Z_IS_TMC2130 ) \ + || ENABLED( Z2_IS_TMC2130 ) \ + || ENABLED( E0_IS_TMC2130 ) \ + || ENABLED( E1_IS_TMC2130 ) \ + || ENABLED( E2_IS_TMC2130 ) \ + || ENABLED( E3_IS_TMC2130 ) \ + || ENABLED( E4_IS_TMC2130 ) ) #error "HAVE_TMC2130 requires at least one TMC2130 stepper to be set." #elif ENABLED(HYBRID_THRESHOLD) && DISABLED(STEALTHCHOP) #error "Enable STEALTHCHOP to use HYBRID_THRESHOLD." @@ -1470,18 +1514,14 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, // clearing the stallGuard activated status is found. #if ENABLED(DELTA) && !ENABLED(STEALTHCHOP) #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP." - #elif X_SENSORLESS && X_HOME_DIR == -1 && (DISABLED(X_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_XMIN)) - #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMIN when homing to X_MIN." - #elif X_SENSORLESS && X_HOME_DIR == 1 && (DISABLED(X_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_XMAX)) - #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMAX when homing to X_MAX." - #elif Y_SENSORLESS && Y_HOME_DIR == -1 && (DISABLED(Y_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_YMIN)) - #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMIN when homing to Y_MIN." - #elif Y_SENSORLESS && Y_HOME_DIR == 1 && (DISABLED(Y_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_YMAX)) - #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMAX when homing to Y_MAX." - #elif Z_SENSORLESS && Z_HOME_DIR == -1 && (DISABLED(Z_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_ZMIN)) - #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMIN when homing to Z_MIN." - #elif Z_SENSORLESS && Z_HOME_DIR == 1 && (DISABLED(Z_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_ZMAX)) - #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMAX when homing to Z_MAX." + #elif X_HOME_DIR == -1 && DISABLED(X_MIN_ENDSTOP_INVERTING) + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING when homing to X_MIN." + #elif X_HOME_DIR == 1 && DISABLED(X_MAX_ENDSTOP_INVERTING) + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING when homing to X_MAX." + #elif Y_HOME_DIR == -1 && DISABLED(Y_MIN_ENDSTOP_INVERTING) + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING when homing to Y_MIN." + #elif Y_HOME_DIR == 1 && DISABLED(Y_MAX_ENDSTOP_INVERTING) + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING when homing to Y_MAX." #endif #endif @@ -1501,36 +1541,38 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #endif /** - * TMC2208 Requirements + * Make sure HAVE_TMC2208 is warranted */ -#if ENABLED(HAVE_TMC2208) - #if !( ENABLED( X_IS_TMC2208) \ - || ENABLED(X2_IS_TMC2208) \ - || ENABLED( Y_IS_TMC2208) \ - || ENABLED(Y2_IS_TMC2208) \ - || ENABLED( Z_IS_TMC2208) \ - || ENABLED(Z2_IS_TMC2208) \ - || ENABLED(E0_IS_TMC2208) \ - || ENABLED(E1_IS_TMC2208) \ - || ENABLED(E2_IS_TMC2208) \ - || ENABLED(E3_IS_TMC2208) \ - || ENABLED(E4_IS_TMC2208 ) ) - #error "HAVE_TMC2208 requires at least one TMC2208 stepper to be set." - // Software UART and ENDSTOP_INTERRUPTS both use Pin Change interrupts (PCI) - #elif ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && \ - !( defined( X_HARDWARE_SERIAL) \ - || defined(X2_HARDWARE_SERIAL) \ - || defined( Y_HARDWARE_SERIAL) \ - || defined(Y2_HARDWARE_SERIAL) \ - || defined( Z_HARDWARE_SERIAL) \ - || defined(Z2_HARDWARE_SERIAL) \ - || defined(E0_HARDWARE_SERIAL) \ - || defined(E1_HARDWARE_SERIAL) \ - || defined(E2_HARDWARE_SERIAL) \ - || defined(E3_HARDWARE_SERIAL) \ - || defined(E4_HARDWARE_SERIAL) ) - #error "Select *_HARDWARE_SERIAL to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." - #endif +#if ENABLED(HAVE_TMC2208) && !( \ + ENABLED( X_IS_TMC2208 ) \ + || ENABLED( X2_IS_TMC2208 ) \ + || ENABLED( Y_IS_TMC2208 ) \ + || ENABLED( Y2_IS_TMC2208 ) \ + || ENABLED( Z_IS_TMC2208 ) \ + || ENABLED( Z2_IS_TMC2208 ) \ + || ENABLED( E0_IS_TMC2208 ) \ + || ENABLED( E1_IS_TMC2208 ) \ + || ENABLED( E2_IS_TMC2208 ) \ + || ENABLED( E3_IS_TMC2208 ) ) + #error "HAVE_TMC2208 requires at least one TMC2208 stepper to be set." +#endif + +/** + * TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) + */ +#if ENABLED(HAVE_TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ + defined(X_HARDWARE_SERIAL ) \ + || defined(X2_HARDWARE_SERIAL) \ + || defined(Y_HARDWARE_SERIAL ) \ + || defined(Y2_HARDWARE_SERIAL) \ + || defined(Z_HARDWARE_SERIAL ) \ + || defined(Z2_HARDWARE_SERIAL) \ + || defined(E0_HARDWARE_SERIAL) \ + || defined(E1_HARDWARE_SERIAL) \ + || defined(E2_HARDWARE_SERIAL) \ + || defined(E3_HARDWARE_SERIAL) \ + || defined(E4_HARDWARE_SERIAL) ) + #error "select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." #endif #if ENABLED(HYBRID_THRESHOLD) && DISABLED(STEALTHCHOP) @@ -1545,17 +1587,17 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, * Make sure HAVE_L6470DRIVER is warranted */ #if ENABLED(HAVE_L6470DRIVER) && !( \ - ENABLED( X_IS_L6470) \ - || ENABLED(X2_IS_L6470) \ - || ENABLED( Y_IS_L6470) \ - || ENABLED(Y2_IS_L6470) \ - || ENABLED( Z_IS_L6470) \ - || ENABLED(Z2_IS_L6470) \ - || ENABLED(E0_IS_L6470) \ - || ENABLED(E1_IS_L6470) \ - || ENABLED(E2_IS_L6470) \ - || ENABLED(E3_IS_L6470) \ - || ENABLED(E4_IS_L6470) \ + ENABLED( X_IS_L6470 ) \ + || ENABLED( X2_IS_L6470 ) \ + || ENABLED( Y_IS_L6470 ) \ + || ENABLED( Y2_IS_L6470 ) \ + || ENABLED( Z_IS_L6470 ) \ + || ENABLED( Z2_IS_L6470 ) \ + || ENABLED( E0_IS_L6470 ) \ + || ENABLED( E1_IS_L6470 ) \ + || ENABLED( E2_IS_L6470 ) \ + || ENABLED( E3_IS_L6470 ) \ + || ENABLED( E4_IS_L6470 ) \ ) #error "HAVE_L6470DRIVER requires at least one L6470 stepper to be set." #endif @@ -1664,67 +1706,6 @@ static_assert(COUNT(sanity_arr_1) <= XYZE_N, "DEFAULT_AXIS_STEPS_PER_UNIT has to static_assert(COUNT(sanity_arr_2) <= XYZE_N, "DEFAULT_MAX_FEEDRATE has too many elements."); static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too many elements."); -/** - * Sanity checks for Spindle / Laser - */ -#if ENABLED(SPINDLE_LASER_ENABLE) - #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) - #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." - #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) - #error "SPINDLE_DIR_PIN not defined." - #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) - #if !(WITHIN(SPINDLE_LASER_PWM_PIN, 2, 13) || WITHIN(SPINDLE_LASER_PWM_PIN, 44, 46)) - #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." - #elif SPINDLE_LASER_POWERUP_DELAY < 1 - #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." - #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 - #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." - #elif !defined(SPINDLE_LASER_PWM_INVERT) - #error "SPINDLE_LASER_PWM_INVERT missing." - #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) - #error "SPINDLE_LASER_PWM equation constant(s) missing." - #elif SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) - #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." - #elif PIN_EXISTS(X_MAX) && X_MAX_PIN == SPINDLE_LASER_PWM_PIN - #error "SPINDLE_LASER_PWM pin is in use by X_MAX endstop." - #elif PIN_EXISTS(X_MIN) && X_MIN_PIN == SPINDLE_LASER_PWM_PIN - #error "SPINDLE_LASER_PWM pin is in use by X_MIN endstop." - #elif PIN_EXISTS(Z_STEP) && Z_STEP_PIN == SPINDLE_LASER_PWM_PIN - #error "SPINDLE_LASER_PWM pin in use by Z_STEP." - #elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) - #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." - #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN - #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." - #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." - #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." - #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." - #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." - #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." - #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." - #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN - #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." - #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN - #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." - #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN - #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." - #elif PIN_EXISTS(MOTOR_CURRENT_PWM_XY) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_XY_PIN - #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_XY." - #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_Z_PIN - #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_Z." - #elif PIN_EXISTS(MOTOR_CURRENT_PWM_E) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_E_PIN - #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_E." - #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN - #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT." - #endif - #endif -#endif // SPINDLE_LASER_ENABLE - #if ENABLED(CNC_COORDINATE_SYSTEMS) && ENABLED(NO_WORKSPACE_OFFSETS) #error "CNC_COORDINATE_SYSTEMS is incompatible with NO_WORKSPACE_OFFSETS." #endif @@ -1759,4 +1740,8 @@ static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too m #error "POWER_LOSS_RECOVERY currently requires an LCD Controller." #endif +#if ENABLED(FAST_PWM_FAN) && !(defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM)) + #error "FAST_PWM_FAN only supported by 8 bit CPUs." +#endif + #endif // _SANITYCHECK_H_ diff --git a/Marlin/Version.h b/Marlin/src/inc/Version.h similarity index 87% rename from Marlin/Version.h rename to Marlin/src/inc/Version.h index fa3ec9feca..161411774a 100644 --- a/Marlin/Version.h +++ b/Marlin/src/inc/Version.h @@ -20,10 +20,15 @@ * */ +#ifndef _VERSION_H_ +#define _VERSION_H_ + +#include "../core/macros.h" // for ENABLED + /** - * This file is the standard Marlin version identifier file, all fields can be - * overriden by the ones defined on _Version.h by using the Configuration.h - * directive USE_AUTOMATIC_VERSIONING. + * This file is the standard Marlin version identifier file. + * Use -DUSE_AUTOMATIC_VERSIONING=1 and a custom _Version.h + * to override these values. */ #if ENABLED(USE_AUTOMATIC_VERSIONING) @@ -35,7 +40,7 @@ /** * Marlin release version identifier */ - #define SHORT_BUILD_VERSION "bugfix-1.1.x" + #define SHORT_BUILD_VERSION "bugfix-2.0.x" /** * Verbose version identifier which should contain a reference to the location @@ -57,8 +62,8 @@ * but not limited to: ADD, DELETE RENAME OR REPURPOSE any directive/option on * the configuration files. */ - #define REQUIRED_CONFIGURATION_H_VERSION 010109 - #define REQUIRED_CONFIGURATION_ADV_H_VERSION 010109 + #define REQUIRED_CONFIGURATION_H_VERSION 020000 + #define REQUIRED_CONFIGURATION_ADV_H_VERSION 020000 /** * The protocol for communication to the host. Protocol indicates communication @@ -92,3 +97,5 @@ #define WEBSITE_URL "http://marlinfw.org" #endif // USE_AUTOMATIC_VERSIONING + +#endif // _VERSION_H_ diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h new file mode 100644 index 0000000000..4b860a1f6e --- /dev/null +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + + +// use this file to create the public interface for device drivers that are NOT in the U8G library + +extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi; +extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi; +class U8GLIB_64128N_2X_HAL : public U8GLIB +{ + public: + U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } + U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } +}; + + +extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi; +extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi; +class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB +{ + public: + U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } + U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } +}; + + +// AVR version uses ultralcd_st7920_u8glib_rrd_AVR.cpp, HAL version uses u8g_dev_st7920_128x64_HAL.cpp +extern u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi; +class U8GLIB_ST7920_128X64_RRD : public U8GLIB +{ + public: + U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } +}; + + +extern u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire; +class U8GLIB_SH1106_128X64_2X_I2C_2_WIRE : public U8GLIB { + public: + U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options) + { } +}; + + + +extern u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire; +class U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE : public U8GLIB { + public: + U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options) + { } +}; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h new file mode 100644 index 0000000000..1f3c280421 --- /dev/null +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// use this file to select the com driver for device drivers that are NOT in the U8G library + + +#ifndef U8G_HAL_LINKS + + uint8_t u8g_com_arduino_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_arduino_sw_spi_fn + + #ifdef __SAM3X8E__ + uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_DUE_shared_hw_spi_fn + + uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_DUE_ST7920_sw_spi_fn + #else + uint8_t u8g_com_arduino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_arduino_hw_spi_fn + + uint8_t u8g_com_arduino_st7920_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_arduino_st7920_spi_fn + #endif + + uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_arduino_st7920_hw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn + +#elif TARGET_LPC1768 + uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_LPC1768_sw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_LPC1768_hw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_SSD_I2C_HAL u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +#else // need to give them some definition or else get compiler errors + uint8_t u8g_com_null_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_null_fn + #define U8G_COM_HAL_HW_SPI_FN u8g_com_null_fn + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_null_fn + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_null_fn + #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn +#endif \ No newline at end of file diff --git a/Marlin/dogm_bitmaps.h b/Marlin/src/lcd/dogm/dogm_bitmaps.h similarity index 99% rename from Marlin/dogm_bitmaps.h rename to Marlin/src/lcd/dogm/dogm_bitmaps.h index f75aa41c92..d138aa75a5 100644 --- a/Marlin/dogm_bitmaps.h +++ b/Marlin/src/lcd/dogm/dogm_bitmaps.h @@ -27,8 +27,9 @@ * http://marlinfw.org/tools/u8glib/converter.html */ -#include "MarlinConfig.h" +#include +#include "../../inc/MarlinConfig.h" #if ENABLED(SHOW_BOOTSCREEN) @@ -36,7 +37,7 @@ #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) - #include "_Bootscreen.h" + #include "../../../_Bootscreen.h" #ifndef CUSTOM_BOOTSCREEN_TIMEOUT #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 @@ -133,10 +134,11 @@ // This file must define STATUS_SCREENWIDTH and status_screen[012]_bmp. // It can also define STATUS_SCREEN_X, STATUS_SCREEN_{BED,FAN}_TEXT_X and // STATUS_SCREEN_HOTEND_TEXT_X(i) to modify draw locations. - #include "_Statusscreen.h" + #include "../../../_Statusscreen.h" #else // !CUSTOM_STATUS_SCREEN_IMAGE + // Can also be overridden in Configuration.h // If you can afford it, try the 3-frame fan animation! #ifndef FAN_ANIM_FRAMES #define FAN_ANIM_FRAMES 2 @@ -1148,7 +1150,9 @@ #define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH)) #endif -#if FAN_ANIM_FRAMES > 3 +#ifndef FAN_ANIM_FRAMES + #define FAN_ANIM_FRAMES 2 +#elif FAN_ANIM_FRAMES > 3 #error "Only 3 fan animation frames currently supported." #endif #ifndef STATUS_SCREEN_X diff --git a/Marlin/dogm_font_data_6x9_marlin.h b/Marlin/src/lcd/dogm/dogm_font_data_6x9_marlin.h similarity index 100% rename from Marlin/dogm_font_data_6x9_marlin.h rename to Marlin/src/lcd/dogm/dogm_font_data_6x9_marlin.h diff --git a/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h b/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h new file mode 100644 index 0000000000..26e93f3a36 --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h @@ -0,0 +1,306 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ +#include + +#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 + Font Bounding box w= 6 h=12 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent = 8 descent=-2 +*/ + +const u8g_fntpgm_uint8_t ISO10646_1_5x7[1328] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x06,0x0c,0x00,0xfe,0x07,0x02,0x29,0x03,0xbf,0x01,0x7f,0xfe,0x08,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0xff,0xe0,0x80,0xc0,0xb0,0xa8, + 0x28,0x30,0x28,0x28,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88, + 0x88,0xa8,0xf8,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8, + 0xa8,0x88,0x70,0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06, + 0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff, + 0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8, + 0xc8,0x10,0x20,0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40, + 0xa8,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06, + 0x01,0xff,0x20,0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01, + 0xff,0x80,0x40,0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xa8,0x70,0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8, + 0x20,0x20,0x02,0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00, + 0x03,0xf8,0x02,0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98, + 0xa8,0xc8,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40, + 0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00, + 0x00,0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0xf0,0x08,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0, + 0xc0,0x00,0xc0,0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80, + 0x03,0x05,0x05,0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00, + 0x02,0xf8,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70, + 0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80, + 0x80,0x98,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80, + 0x80,0x80,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01, + 0xff,0xe0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05, + 0x01,0x01,0x06,0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09, + 0x09,0x06,0x01,0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07, + 0x06,0x00,0x00,0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00, + 0xc0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8, + 0xa8,0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88, + 0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78, + 0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x40,0x20,0x40,0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff + }; +#else + // extended (original) font (symbols 1 - 255) + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 + Font Bounding box w= 6 h=12 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent =10 descent=-2 +*/ +const u8g_fntpgm_uint8_t ISO10646_1_5x7[2651] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x06,0x0c,0x00,0xfe,0x07,0x02,0x29,0x03,0xbf,0x01,0xff,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0xff,0xe0,0x80,0xc0,0xb0,0xa8, + 0x28,0x30,0x28,0x28,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88, + 0x88,0xa8,0xf8,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8, + 0xa8,0x88,0x70,0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06, + 0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff, + 0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8, + 0xc8,0x10,0x20,0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40, + 0xa8,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06, + 0x01,0xff,0x20,0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01, + 0xff,0x80,0x40,0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xa8,0x70,0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8, + 0x20,0x20,0x02,0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00, + 0x03,0xf8,0x02,0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98, + 0xa8,0xc8,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40, + 0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00, + 0x00,0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0xf0,0x08,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0, + 0xc0,0x00,0xc0,0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80, + 0x03,0x05,0x05,0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00, + 0x02,0xf8,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70, + 0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80, + 0x80,0x98,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80, + 0x80,0x80,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01, + 0xff,0xe0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05, + 0x01,0x01,0x06,0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09, + 0x09,0x06,0x01,0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07, + 0x06,0x00,0x00,0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00, + 0xc0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8, + 0xa8,0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88, + 0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78, + 0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x40,0x20,0x40,0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80, + 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05, + 0x06,0x00,0x00,0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50, + 0xf8,0x20,0xf8,0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80, + 0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0, + 0x03,0x01,0x01,0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, + 0xa4,0xb4,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05, + 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01, + 0xf8,0x08,0x08,0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00, + 0x78,0x84,0xb4,0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04, + 0x04,0x06,0x01,0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x20,0x40,0xe0, + 0x03,0x05,0x05,0x06,0x01,0x05,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01, + 0x05,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80, + 0x80,0x05,0x08,0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02, + 0x02,0x02,0x06,0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03, + 0x05,0x05,0x06,0x01,0x05,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05, + 0x40,0xa0,0x40,0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09, + 0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x20,0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x78,0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70, + 0x88,0x80,0x80,0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8, + 0x48,0x48,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8, + 0x98,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09, + 0x06,0x00,0xff,0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06, + 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01, + 0x00,0x80,0xe0,0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x90,0xa0,0x90,0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08, + 0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88, + 0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05, + 0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07, + 0x06,0x00,0x00,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00, + 0x20,0x50,0x20,0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28, + 0x70,0xa0,0x78,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60, + 0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08, + 0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06, + 0x00,0x00,0x20,0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00, + 0xc0,0x40,0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40, + 0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40, + 0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09, + 0x09,0x06,0x00,0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10, + 0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88, + 0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70, + 0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x78,0x98,0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88, + 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88, + 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x50,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80}; + +#endif diff --git a/Marlin/src/lcd/dogm/language_data_an.h b/Marlin/src/lcd/dogm/language_data_an.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_an.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_bg.h b/Marlin/src/lcd/dogm/language_data_bg.h new file mode 100644 index 0000000000..5ea82240aa --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_bg.h @@ -0,0 +1,77 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xff,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, + 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8 + }; +const u8g_fntpgm_uint8_t fontpage_8_151_152[43] U8G_FONT_SECTION("fontpage_8_151_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_154_164[160] U8G_FONT_SECTION("fontpage_8_154_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20 + }; +const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 + }; +const u8g_fntpgm_uint8_t fontpage_8_175_195[260] U8G_FONT_SECTION("fontpage_8_175_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc3,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, + 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, + 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_197_200[63] U8G_FONT_SECTION("fontpage_8_197_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc8,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,0x06, + 0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_202_202[28] U8G_FONT_SECTION("fontpage_8_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'Ð' -- 'Е' + FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И' + FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф' + FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' + FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у' + FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'Ñ…' -- 'ш' + FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ÑŠ' -- 'ÑŠ' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ÑŽ' -- 'Ñ' +}; diff --git a/Marlin/src/lcd/dogm/language_data_ca.h b/Marlin/src/lcd/dogm/language_data_ca.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_ca.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_cz.h b/Marlin/src/lcd/dogm/language_data_cz.h new file mode 100644 index 0000000000..5858e707b4 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_cz.h @@ -0,0 +1,52 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_143_143[33] U8G_FONT_SECTION("fontpage_2_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0x00,0x00, + 0x00,0x06,0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_2_155_155[31] U8G_FONT_SECTION("fontpage_2_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xf0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_200_200[31] U8G_FONT_SECTION("fontpage_2_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_216_217[47] U8G_FONT_SECTION("fontpage_2_216_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd9,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, + 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'ÄŒ' -- 'Ä' + FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'Ä' -- 'Ä' + FONTDATA_ITEM(2, 155, 155, fontpage_2_155_155), // 'Ä›' -- 'Ä›' + FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň' + FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'Å™' + FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'Å¡' -- 'Å¡' + FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'Å¥' -- 'Å¥' + FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_da.h b/Marlin/src/lcd/dogm/language_data_da.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_da.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_de.h b/Marlin/src/lcd/dogm/language_data_de.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_de.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_el-gr.h b/Marlin/src/lcd/dogm/language_data_el-gr.h new file mode 100644 index 0000000000..558ea2fa68 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_el-gr.h @@ -0,0 +1,86 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_199[303] U8G_FONT_SECTION("fontpage_7_177_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xc7,0x00,0x09,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70, + 0x05,0x08,0x08,0x06,0x00,0xff,0xf8,0x20,0x40,0x40,0x40,0x30,0x08,0x30,0x05,0x07, + 0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07,0x07,0x06,0x01, + 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02,0x00,0x80,0x80, + 0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x09, + 0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20,0x40,0x70,0x80, + 0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x06, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80, + 0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8,0xa8,0xa8,0x70, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Î' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 199, fontpage_7_177_199), // 'α' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ÏŒ' -- 'ÏŽ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/language_data_el.h b/Marlin/src/lcd/dogm/language_data_el.h new file mode 100644 index 0000000000..1c7e810f6d --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_el.h @@ -0,0 +1,90 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_169_169[30] U8G_FONT_SECTION("fontpage_7_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x50,0xd8}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_199[303] U8G_FONT_SECTION("fontpage_7_177_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xc7,0x00,0x09,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70, + 0x05,0x08,0x08,0x06,0x00,0xff,0xf8,0x20,0x40,0x40,0x40,0x30,0x08,0x30,0x05,0x07, + 0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07,0x07,0x06,0x01, + 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02,0x00,0x80,0x80, + 0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x09, + 0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20,0x40,0x70,0x80, + 0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x06, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80, + 0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8,0xa8,0xa8,0x70, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Î' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 169, 169, fontpage_7_169_169), // 'Ω' -- 'Ω' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 199, fontpage_7_177_199), // 'α' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ÏŒ' -- 'ÏŽ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/language_data_en.h b/Marlin/src/lcd/dogm/language_data_en.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_en.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_es.h b/Marlin/src/lcd/dogm/language_data_es.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_es.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_eu.h b/Marlin/src/lcd/dogm/language_data_eu.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_eu.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_fi.h b/Marlin/src/lcd/dogm/language_data_fi.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_fi.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_fr.h b/Marlin/src/lcd/dogm/language_data_fr.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_fr.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_gl.h b/Marlin/src/lcd/dogm/language_data_gl.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_gl.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_hr.h b/Marlin/src/lcd/dogm/language_data_hr.h new file mode 100644 index 0000000000..88254cdc67 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_hr.h @@ -0,0 +1,32 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_145_145[31] U8G_FONT_SECTION("fontpage_2_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, + 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1c,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'ÄŒ' -- 'Ä' + FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'Ä‘' -- 'Ä‘' + FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'Å¡' -- 'Å¡' + FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_it.h b/Marlin/src/lcd/dogm/language_data_it.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_it.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_jp-kana.h b/Marlin/src/lcd/dogm/language_data_jp-kana.h new file mode 100644 index 0000000000..2a2229e27e --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_jp-kana.h @@ -0,0 +1,116 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_97_161_164[61] U8G_FONT_SECTION("fontpage_97_161_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa4,0x00,0x06,0x00,0x00, + 0x00,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x05,0x06,0x06,0x06,0x00, + 0x00,0xf8,0x08,0x28,0x30,0x20,0x40,0x03,0x04,0x04,0x06,0x01,0x00,0x20,0x40,0xc0, + 0x40,0x04,0x06,0x06,0x06,0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_166_166[29] U8G_FONT_SECTION("fontpage_97_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x88,0x08,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_168_168[28] U8G_FONT_SECTION("fontpage_97_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0xf8}; +const u8g_fntpgm_uint8_t fontpage_97_170_181[167] U8G_FONT_SECTION("fontpage_97_170_181") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xb5,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xf8,0x30,0x50,0x90,0x10,0x05,0x06,0x06, + 0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20, + 0xf8,0x20,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xf8,0x20, + 0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0x40, + 0x78,0x90,0x10,0x10,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x40,0x78,0x90, + 0x10,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x10,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_183_187[77] U8G_FONT_SECTION("fontpage_97_183_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xbb,0x00,0x07,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x10,0x20,0x50, + 0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_189_193[77] U8G_FONT_SECTION("fontpage_97_189_193") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xc1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x48,0xa8,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x78,0x48,0xa8,0x10, + 0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_195_196[38] U8G_FONT_SECTION("fontpage_97_195_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc4,0x00,0x05,0x00,0x00, + 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x05,0x05,0x06,0x00, + 0x00,0xa8,0xa8,0x08,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_198_211[190] U8G_FONT_SECTION("fontpage_97_198_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xd3,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x03,0x06,0x06,0x06,0x01, + 0x00,0x80,0x80,0xc0,0xa0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x50,0x00,0x80, + 0x80,0xc0,0xa0,0x80,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0x20,0x40, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x08,0x50,0x20,0xd0,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x10, + 0x20,0x70,0xa8,0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x20,0x40,0x80,0x05, + 0x05,0x05,0x06,0x00,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0x28,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00, + 0x10,0x88,0x88,0x88,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0xf8,0x80,0x80, + 0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x80,0x80,0xf8,0x80,0x80,0x78}; +const u8g_fntpgm_uint8_t fontpage_97_213_217[77] U8G_FONT_SECTION("fontpage_97_213_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd9,0x00,0x08,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x08,0x08,0x06,0x00,0x00,0x18, + 0x18,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x04,0x04,0x06,0x00,0x01,0x40,0xa0,0x10, + 0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x28,0x00,0x40,0xa0,0x10,0x08}; +const u8g_fntpgm_uint8_t fontpage_97_219_220[43] U8G_FONT_SECTION("fontpage_97_219_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdc,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_222_223[39] U8G_FONT_SECTION("fontpage_97_222_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x50,0x20,0x10,0x04,0x05,0x05,0x06, + 0x01,0x00,0xe0,0x00,0xe0,0x00,0xf0}; +const u8g_fntpgm_uint8_t fontpage_97_225_226[39] U8G_FONT_SECTION("fontpage_97_225_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe2,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x28,0x10,0x28,0xc0,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x40,0xf8,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_228_229[39] U8G_FONT_SECTION("fontpage_97_228_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x40,0x04,0x04,0x04, + 0x06,0x00,0x00,0x60,0x20,0x20,0xf0}; +const u8g_fntpgm_uint8_t fontpage_97_231_237[96] U8G_FONT_SECTION("fontpage_97_231_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xed,0x00,0x06,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0xf0,0x10,0xf0,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x08,0xf8,0x08,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8, + 0x08,0x10,0x20,0x04,0x06,0x06,0x06,0x00,0x00,0x90,0x90,0x90,0x90,0x10,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x20,0xa0,0xa8,0xa8,0xb0,0x04,0x05,0x05,0x06,0x00,0x00, + 0x80,0x80,0x90,0xa0,0xc0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0xf8 + }; +const u8g_fntpgm_uint8_t fontpage_97_242_243[39] U8G_FONT_SECTION("fontpage_97_242_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf3,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x30,0x05,0x05,0x05,0x06, + 0x00,0x00,0xc0,0x08,0x08,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_97_252_252[24] U8G_FONT_SECTION("fontpage_97_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x03,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x02,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ã‚¡' -- 'イ' + FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' + FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' + FONTDATA_ITEM(97, 170, 181, fontpage_97_170_181), // 'オ' -- 'サ' + FONTDATA_ITEM(97, 183, 187, fontpage_97_183_187), // 'ã‚·' -- 'ã‚»' + FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'ãƒ' + FONTDATA_ITEM(97, 195, 196, fontpage_97_195_196), // 'ッ' -- 'ツ' + FONTDATA_ITEM(97, 198, 211, fontpage_97_198_211), // 'テ' -- 'ビ' + FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' + FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' + FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' + FONTDATA_ITEM(97, 225, 226, fontpage_97_225_226), // 'メ' -- 'モ' + FONTDATA_ITEM(97, 228, 229, fontpage_97_228_229), // 'ヤ' -- 'ュ' + FONTDATA_ITEM(97, 231, 237, fontpage_97_231_237), // 'ョ' -- 'ロ' + FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' + FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' +}; diff --git a/Marlin/src/lcd/dogm/language_data_nl.h b/Marlin/src/lcd/dogm/language_data_nl.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_nl.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_pl.h b/Marlin/src/lcd/dogm/language_data_pl.h new file mode 100644 index 0000000000..2f2e48e4b0 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pl.h @@ -0,0 +1,39 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_133_133[30] U8G_FONT_SECTION("fontpage_2_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_153_153[30] U8G_FONT_SECTION("fontpage_2_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0xf0,0x80,0x70,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_193_196[73] U8G_FONT_SECTION("fontpage_2_193_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc4,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xc0,0x40,0x40,0x78,0x03,0x07, + 0x07,0x06,0x01,0x00,0xc0,0x40,0x60,0xc0,0x40,0x40,0xe0,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_218_219[47] U8G_FONT_SECTION("fontpage_2_218_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xdb,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 133, 133, fontpage_2_133_133), // 'Ä…' -- 'Ä…' + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'Ä™' -- 'Ä™' + FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Å' -- 'Å„' + FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Åš' -- 'Å›' + FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż' +}; diff --git a/Marlin/src/lcd/dogm/language_data_pt-br.h b/Marlin/src/lcd/dogm/language_data_pt-br.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pt-br.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_pt.h b/Marlin/src/lcd/dogm/language_data_pt.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pt.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_ru.h b/Marlin/src/lcd/dogm/language_data_ru.h new file mode 100644 index 0000000000..43650b54dd --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_ru.h @@ -0,0 +1,78 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_144_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x98,0x00,0x07,0xff,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, + 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_154_168[214] U8G_FONT_SECTION("fontpage_8_154_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa8,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06, + 0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8, + 0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xad,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, + 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, + 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8, + 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, + 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; +const u8g_fntpgm_uint8_t fontpage_8_203_207[72] U8G_FONT_SECTION("fontpage_8_203_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06, + 0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70, + 0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05, + 0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90}; +const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 152, fontpage_8_144_152), // 'Ð' -- 'И' + FONTDATA_ITEM(8, 154, 168, fontpage_8_154_168), // 'К' -- 'Ш' + FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э' + FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' + FONTDATA_ITEM(8, 203, 207, fontpage_8_203_207), // 'Ñ‹' -- 'Ñ' + FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'Ñ‘' -- 'Ñ‘' +}; diff --git a/Marlin/src/lcd/dogm/language_data_sk.h b/Marlin/src/lcd/dogm/language_data_sk.h new file mode 100644 index 0000000000..37e10057c3 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_sk.h @@ -0,0 +1,60 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8f,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x06, + 0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_185_186[49] U8G_FONT_SECTION("fontpage_2_185_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xba,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, + 0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_189_190[49] U8G_FONT_SECTION("fontpage_2_189_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0xa0,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, + 0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc8,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_212_213[47] U8G_FONT_SECTION("fontpage_2_212_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0xb0,0xc8,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe1,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_228_229[49] U8G_FONT_SECTION("fontpage_2_228_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x20,0x20,0x20,0x20,0x20, + 0x20,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, + 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'ÄŒ' -- 'Ä' + FONTDATA_ITEM(2, 185, 186, fontpage_2_185_186), // 'Ĺ' -- 'ĺ' + FONTDATA_ITEM(2, 189, 190, fontpage_2_189_190), // 'Ľ' -- 'ľ' + FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň' + FONTDATA_ITEM(2, 212, 213, fontpage_2_212_213), // 'Å”' -- 'Å•' + FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Å ' -- 'Å¡' + FONTDATA_ITEM(2, 228, 229, fontpage_2_228_229), // 'Ť' -- 'Å¥' + FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_test.h b/Marlin/src/lcd/dogm/language_data_test.h new file mode 100644 index 0000000000..875071abea --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_test.h @@ -0,0 +1,225 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x0a,0xfe,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, + 0x05,0x09,0x09,0x06,0x00,0xfe,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xf0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40, + 0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10, + 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xa0,0xa0,0xb0,0xa8,0xa8,0xb0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xa0,0xa0,0xa0,0xf0,0xa8,0xa8,0xb0,0x05,0x07,0x07,0x06, + 0x00,0x00,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88, + 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x88, + 0x88,0x88,0x88,0x88,0x88,0xf8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88, + 0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70, + 0x20,0x70,0xa8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a, + 0x0a,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20, + 0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe, + 0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, + 0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xc0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07,0x07,0x06, + 0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xa8,0xa8,0xe8, + 0xa8,0xa8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88, + 0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06, + 0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05, + 0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88, + 0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88, + 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8, + 0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, + 0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8, + 0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08, + 0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90, + 0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, + 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, + 0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, + 0x70,0x80,0xe0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0, + 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,0x06, + 0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0,0x04,0x08,0x08,0x06,0x01,0xfe,0x10,0x00, + 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xa0,0xb0,0xa8, + 0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0xa0,0xf0,0xa8,0xb0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, + 0x40,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0x88,0x98,0xa8,0xc8,0x88,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x88,0x88, + 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x88,0xf8, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, + 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xf0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf0, + 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xa0,0xa0,0xf8,0xa0,0xa0, + 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xa0,0xf8,0xa0,0x98,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x50,0x50,0x88,0xf8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, + 0x50,0x50,0x88,0xf8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xb8,0xf8,0xb8, + 0xb8,0xb8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xf8,0xb8,0xb8,0x05,0x08,0x08, + 0x06,0x00,0x00,0xf8,0x88,0x50,0x50,0x70,0xa8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00, + 0x00,0xf8,0x88,0x50,0x70,0xa8,0xa8,0x06,0x08,0x08,0x06,0x00,0x00,0xfc,0xc4,0xa8, + 0x90,0xf8,0xb8,0xb8,0xa8,0x06,0x06,0x06,0x06,0x00,0x00,0xfc,0xa8,0x90,0xf8,0xb8, + 0xa8,0x05,0x0c,0x0c,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, + 0x70,0x80,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x30,0x08, + 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0x70,0x20,0x20,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20,0x05,0x08,0x08,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0x40, + 0xa0,0xa0,0xb8,0xb8,0xb8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xfe,0x58,0xb8, + 0xb8,0xb8,0x58,0x08,0x10,0x05,0x0a,0x0a,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, + 0x88,0x88,0xa8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, + 0xa8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, + 0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xa8,0x88,0xa8,0x50,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, + 0x08,0x08,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_97_129_191[870] U8G_FONT_SECTION("fontpage_97_129_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x04,0x00,0x4e,0x00,0x55,0x00,0x64, + 0x80,0x48,0x40,0xa8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0b,0x0b, + 0x0c,0x01,0xff,0x20,0x10,0x70,0x1c,0x28,0xe2,0x39,0x21,0x21,0x12,0x0c,0x08,0x07, + 0x07,0x0c,0x02,0xff,0x28,0x2e,0xf5,0x21,0x16,0x10,0x10,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xc0,0x9c,0x20,0x70,0x20,0x09,0xc0,0x08, + 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0c,0x03,0xff,0x10,0x9c,0xb2, + 0xd2,0x9c,0x10,0x20,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x82,0x00,0x47,0x80, + 0x4a,0x40,0x52,0x20,0x62,0x20,0x6a,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, + 0x07,0x07,0x07,0x0c,0x02,0xff,0x10,0x1c,0x10,0x10,0x78,0x96,0x60,0x09,0x0b,0x16, + 0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x09,0x80,0x0e,0x00,0x08,0x00,0x08,0x00,0x08, + 0x00,0x78,0x00,0x8e,0x00,0x89,0x80,0x70,0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20, + 0x18,0x40,0x80,0x80,0xbc,0xc2,0x82,0x02,0x0c,0x70,0x07,0x0b,0x0b,0x0c,0x02,0xff, + 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0a,0x0a,0x0c,0x01, + 0xff,0x4e,0x34,0x08,0x10,0x3e,0x61,0x81,0x19,0x26,0x1c,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xd8,0x80,0x10,0x80,0x10,0x80,0x30, + 0x80,0x50,0x80,0xb0,0x60,0x10,0x00,0x08,0x0a,0x0a,0x0c,0x01,0xff,0x4e,0x34,0x08, + 0x10,0x3e,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0c,0x02,0xff,0x40,0x30,0xee, + 0x31,0x61,0xa2,0x24,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x10,0x00,0x10,0x00, + 0x9b,0x80,0x7c,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xb1,0x80,0x10,0x00, + 0x0a,0x0a,0x14,0x0c,0x01,0xff,0x4e,0x00,0x34,0x00,0x04,0x00,0x1f,0x00,0x28,0x80, + 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff, + 0x20,0x00,0x1f,0x00,0x04,0x00,0x1f,0x00,0x20,0x80,0x4c,0x80,0x13,0x00,0x0c,0x00, + 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00, + 0x9e,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8c,0x00,0x14,0x00,0x24,0x00,0x20,0x00, + 0x1f,0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, + 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0a,0x0b,0x16,0x0c, + 0x00,0xff,0x10,0x00,0x0c,0x80,0x00,0x40,0x1d,0x00,0xe2,0x80,0x02,0x00,0x02,0x00, + 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xff,0xff,0xff,0xff,0x04,0x03,0x03,0x0c, + 0x00,0x07,0x20,0x90,0x40,0xff,0x04,0x03,0x03,0x0c,0x00,0x06,0x20,0x90,0x40,0x03, + 0x03,0x03,0x0c,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0x05,0x03,0x03,0x06,0x00, + 0x01,0xf8,0x00,0xf8,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x05,0x06, + 0x06,0x06,0x00,0x00,0xf8,0x08,0x28,0x30,0x20,0x40,0x03,0x04,0x04,0x06,0x01,0x00, + 0x20,0x40,0xc0,0x40,0x04,0x06,0x06,0x06,0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x20, + 0x04,0x04,0x04,0x06,0x00,0x00,0x20,0xf0,0x90,0x20,0x05,0x06,0x06,0x06,0x00,0x00, + 0x20,0xf8,0x88,0x08,0x10,0x20,0x03,0x04,0x04,0x06,0x01,0x00,0xe0,0x40,0x40,0xe0, + 0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0xf8,0x04,0x04,0x04,0x06,0x00, + 0x00,0x20,0xf0,0x60,0xa0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xf8,0x30,0x50,0x90, + 0x10,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x06,0x06,0x06,0x00, + 0x00,0x20,0xf8,0x20,0xf8,0x20,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x20, + 0xf8,0x20,0xf8,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x70,0x90,0x10,0x20,0xc0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x06,0x06, + 0x06,0x00,0x00,0x40,0x78,0x90,0x10,0x10,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x40,0x78,0x90,0x10,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08, + 0x08,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05, + 0x06,0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x10,0x20,0x40,0x05,0x08,0x08,0x06,0x00, + 0x00,0x28,0x00,0x50,0xf8,0x50,0x10,0x20,0x40,0x05,0x05,0x05,0x06,0x00,0x00,0xc0, + 0x08,0xc8,0x10,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xc0,0x08,0xc8,0x10, + 0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x10,0x20,0x50,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x40, + 0xf8,0x48,0x50,0x40,0x38,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x40,0xf8,0x48, + 0x50,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x07, + 0x07,0x06,0x00,0x00,0x28,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x05,0x05,0x06,0x00, + 0x00,0x78,0x48,0xa8,0x10,0x60}; +const u8g_fntpgm_uint8_t fontpage_97_193_255[753] U8G_FONT_SECTION("fontpage_97_193_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xff,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40,0x05,0x04,0x04,0x06,0x00, + 0x00,0xa8,0xa8,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0x08,0x10,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xa8,0xa8,0x08,0x10,0x20,0x05,0x06,0x06, + 0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x03,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xc0, + 0xa0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x50,0x00,0x80,0x80,0xc0,0xa0,0x80, + 0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0x20,0x40,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08, + 0x50,0x20,0xd0,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x10,0x20,0x70,0xa8,0x03, + 0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x10,0x88, + 0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00,0x10,0x88,0x88,0x88, + 0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0xf8,0x80,0x80,0x78,0x05,0x07,0x07, + 0x06,0x00,0x00,0x28,0x80,0x80,0xf8,0x80,0x80,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x18,0x98,0x80,0xf8,0x80,0x80,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x10,0x60,0x05, + 0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x04,0x04, + 0x06,0x00,0x01,0x40,0xa0,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x28,0x00,0x40, + 0xa0,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x18,0x18,0x40,0xa0,0x10,0x08,0x05, + 0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08,0x06,0x00, + 0x00,0x28,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x18, + 0x18,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x50, + 0x20,0x10,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x00,0xe0,0x00,0xf0,0x05,0x05,0x05, + 0x06,0x00,0x00,0x20,0x40,0x88,0xf8,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x28, + 0x10,0x28,0xc0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x40,0xf8,0x40,0x38,0x05,0x04, + 0x04,0x06,0x00,0x00,0x40,0xf8,0x50,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8, + 0x48,0x50,0x40,0x40,0x04,0x04,0x04,0x06,0x00,0x00,0x60,0x20,0x20,0xf0,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x10,0x10,0x10,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0, + 0x10,0xf0,0x10,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0xf8,0x05, + 0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8,0x08,0x10,0x20,0x04,0x06,0x06,0x06,0x00, + 0x00,0x90,0x90,0x90,0x90,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0xa0,0xa8, + 0xa8,0xb0,0x04,0x05,0x05,0x06,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0x05,0x05,0x05, + 0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0xf8,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x90, + 0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x88,0x08,0x10,0x20,0x05,0x06,0x06, + 0x06,0x00,0x00,0x10,0xf8,0x50,0x50,0xf8,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x08,0x30,0x20,0xf8,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x30,0x05, + 0x05,0x05,0x06,0x00,0x00,0xc0,0x08,0x08,0x10,0xe0,0x05,0x08,0x08,0x06,0x00,0x00, + 0x28,0x00,0x20,0xf8,0x88,0x08,0x10,0x20,0x04,0x04,0x04,0x06,0x00,0x00,0x40,0xf0, + 0x50,0xa0,0x04,0x04,0x04,0x06,0x00,0x00,0x40,0xf0,0x20,0x40,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x88,0x08,0x10,0x60,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x10,0xf8,0x50,0x50,0xf8,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8, + 0x08,0x30,0x20,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0xf8,0x08, + 0x30,0x02,0x02,0x02,0x06,0x02,0x02,0xc0,0xc0,0x05,0x01,0x01,0x06,0x00,0x02,0xf8, + 0x05,0x04,0x04,0x06,0x00,0x01,0x80,0x60,0x10,0x08,0x05,0x05,0x05,0x06,0x00,0x01, + 0x28,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x08, + 0x08}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'Ñ¿' + FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'ã‚' -- 'ã‚¿' + FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'ãƒ' -- 'ヿ' +}; diff --git a/Marlin/src/lcd/dogm/language_data_tr.h b/Marlin/src/lcd/dogm/language_data_tr.h new file mode 100644 index 0000000000..23850ecfd7 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_tr.h @@ -0,0 +1,25 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_159_159[33] U8G_FONT_SECTION("fontpage_2_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_2_176_177[43] U8G_FONT_SECTION("fontpage_2_176_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb1,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0, + 0x03,0x05,0x05,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_223_223[30] U8G_FONT_SECTION("fontpage_2_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x80,0x70,0x08,0xf0,0x10,0x60}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 159, 159, fontpage_2_159_159), // 'ÄŸ' -- 'ÄŸ' + FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı' + FONTDATA_ITEM(2, 223, 223, fontpage_2_223_223), // 'ÅŸ' -- 'ÅŸ' +}; diff --git a/Marlin/src/lcd/dogm/language_data_uk.h b/Marlin/src/lcd/dogm/language_data_uk.h new file mode 100644 index 0000000000..9886e41d2e --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_uk.h @@ -0,0 +1,93 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, + 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_144_146[56] U8G_FONT_SECTION("fontpage_8_144_146") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x92,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0}; +const u8g_fntpgm_uint8_t fontpage_8_148_149[44] U8G_FONT_SECTION("fontpage_8_148_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x95,0x00,0x07,0xff,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_151_154[72] U8G_FONT_SECTION("fontpage_8_151_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x9a,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_156_164[134] U8G_FONT_SECTION("fontpage_8_156_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0xa4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x70,0xa8,0xa8,0xa8,0x70,0x20}; +const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 + }; +const u8g_fntpgm_uint8_t fontpage_8_168_168[30] U8G_FONT_SECTION("fontpage_8_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_176_201[321] U8G_FONT_SECTION("fontpage_8_176_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0, + 0x88,0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05, + 0x06,0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70, + 0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90, + 0x05,0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88, + 0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88, + 0x88,0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8, + 0xa8,0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08, + 0x08}; +const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; +const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xe0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_214_214[29] U8G_FONT_SECTION("fontpage_8_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x06,0x00,0x00, + 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І' + FONTDATA_ITEM(8, 144, 146, fontpage_8_144_146), // 'Ð' -- 'Ð’' + FONTDATA_ITEM(8, 148, 149, fontpage_8_148_149), // 'Д' -- 'Е' + FONTDATA_ITEM(8, 151, 154, fontpage_8_151_154), // 'З' -- 'К' + FONTDATA_ITEM(8, 156, 164, fontpage_8_156_164), // 'М' -- 'Ф' + FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' + FONTDATA_ITEM(8, 168, 168, fontpage_8_168_168), // 'Ш' -- 'Ш' + FONTDATA_ITEM(8, 176, 201, fontpage_8_176_201), // 'а' -- 'щ' + FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ÑŒ' -- 'ÑŒ' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ÑŽ' -- 'Ñ' + FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'Ñ”' -- 'Ñ”' + FONTDATA_ITEM(8, 214, 214, fontpage_8_214_214), // 'Ñ–' -- 'Ñ–' +}; diff --git a/Marlin/src/lcd/dogm/language_data_zh_CN.h b/Marlin/src/lcd/dogm/language_data_zh_CN.h new file mode 100644 index 0000000000..e2e8788577 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_zh_CN.h @@ -0,0 +1,1289 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_157_157[45] U8G_FONT_SECTION("fontpage_156_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x29,0x40,0x4a,0x40,0xf7, + 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xf7,0xc0,0x00,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xc0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, + 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0xff,0x80,0x01,0x00,0x02,0x00,0x0c,0x00,0x08, + 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x28,0x00,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_142_142[45] U8G_FONT_SECTION("fontpage_157_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1c,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157_206_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0x11,0x00,0x2a,0x80,0x2a,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, + 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, + 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, + 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, + 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; +const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, + 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, + 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; +const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, + 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, + 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, + 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, + 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, + 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x61,0x20,0x57,0xc0,0x41,0x40,0x77,0xe0,0xd1, + 0x00,0x53,0xc0,0x56,0x40,0x53,0xc0,0x5a,0x40,0x52,0x40,0x43,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_200_200[45] U8G_FONT_SECTION("fontpage_162_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, + 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, + 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_243_243[45] U8G_FONT_SECTION("fontpage_162_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x04,0x00,0x04, + 0x00,0xff,0xc0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, + 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, + 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_201_201[45] U8G_FONT_SECTION("fontpage_163_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x4f,0xe0,0x40,0x00,0x07,0xc0,0x24, + 0x40,0x24,0x40,0x27,0xc0,0xc1,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, + 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; +const u8g_fntpgm_uint8_t fontpage_164_155_155[45] U8G_FONT_SECTION("fontpage_164_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x18,0x20,0x24,0xa0,0x42,0xa0,0xbc, + 0xa0,0x24,0xa0,0x24,0xa0,0x38,0xa0,0x22,0x20,0x22,0x20,0x1e,0x60}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, + 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; +const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; +const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xfa,0x20,0x0a,0x20,0x04,0xc0}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_207_207[45] U8G_FONT_SECTION("fontpage_166_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x42,0x00,0x4f,0x80,0xe2,0x80,0x42, + 0x80,0x4a,0xc0,0x52,0xa0,0x44,0x80,0x44,0x80,0x4a,0x80,0x51,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_213_213[45] U8G_FONT_SECTION("fontpage_166_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x7f,0xc0,0x44,0x40,0x7f, + 0xc0,0x44,0x40,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, + 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, + 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, + 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_204_204[43] U8G_FONT_SECTION("fontpage_167_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x40,0x4a,0x40,0x2a,0x40,0x11, + 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_216_216[45] U8G_FONT_SECTION("fontpage_167_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x12,0x00,0x52,0x80,0x92, + 0x40,0x00,0x00,0x7f,0x80,0x12,0x00,0x0c,0x00,0x12,0x00,0xe1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, + 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; +const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_168_142_142[45] U8G_FONT_SECTION("fontpage_168_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x2f,0xc0,0x28,0x40,0x48,0x40,0x4f,0xc0,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_175_175[45] U8G_FONT_SECTION("fontpage_168_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f, + 0xc0,0x20,0x00,0x3f,0xc0,0x30,0x40,0x50,0x40,0x5f,0xc0,0x90,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, + 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_171_183_183[45] U8G_FONT_SECTION("fontpage_171_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xaf,0xe0,0xe8,0x20,0xa9,0x20,0x09,0x20,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, + 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; +const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, + 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_173_254_254[45] U8G_FONT_SECTION("fontpage_173_254_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x90,0x40,0x9f,0x40,0xb2,0x40,0xcc, + 0x40,0x92,0x40,0xe9,0xc0,0x84,0x40,0x88,0x40,0x84,0x40,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_174_215_215[45] U8G_FONT_SECTION("fontpage_174_215_215") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x27,0xc0,0xf9,0x40,0x21, + 0x40,0x21,0x40,0x2f,0xe0,0x31,0x00,0xc2,0x80,0x04,0x40,0x18,0x20}; +const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, + 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_175_171_171[45] U8G_FONT_SECTION("fontpage_175_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xff,0x80,0x22,0x80,0x36,0xa0,0xe3, + 0xa0,0x2c,0xe0,0x64,0x00,0x04,0x00,0x3f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, + 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_243_243[45] U8G_FONT_SECTION("fontpage_177_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0xc0,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x20,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_135_135[45] U8G_FONT_SECTION("fontpage_178_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x31,0x00,0x4e,0x00,0x0b, + 0x00,0x30,0xe0,0xff,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80}; +const u8g_fntpgm_uint8_t fontpage_178_141_141[45] U8G_FONT_SECTION("fontpage_178_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x3f,0xe0,0x60,0x80,0xbf,0x80,0x20, + 0x80,0x3f,0x80,0x10,0x00,0x3f,0x80,0xc9,0x00,0x06,0x00,0xf9,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, + 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, + 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, + 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, + 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, + 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, + 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, + 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, + 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x1f,0xe0,0x90,0x80,0x50, + 0x80,0x24,0x80,0x22,0x80,0x50,0x80,0x50,0x80,0x82,0x80,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, + 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_184_207_207[45] U8G_FONT_SECTION("fontpage_184_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x20,0x20,0x3f,0xe0,0x28,0x40,0x24, + 0x80,0x3f,0xe0,0x24,0x80,0x3f,0xe0,0x24,0x80,0x48,0x80,0x90,0x80}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, + 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, + 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_188_246_246[45] U8G_FONT_SECTION("fontpage_188_246_246") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, + 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_148_148[45] U8G_FONT_SECTION("fontpage_189_148_148") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x7f,0xe0,0x40,0x00,0x44, + 0x40,0x52,0x40,0x4a,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_189_159_159[45] U8G_FONT_SECTION("fontpage_189_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x3f,0xe0,0x2a,0x80,0x2a,0x40,0x3f, + 0xe0,0x24,0x00,0x27,0xc0,0x2a,0x40,0x31,0x80,0x42,0x40,0x8c,0x20}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, + 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0xff,0xe0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_190_210_210[45] U8G_FONT_SECTION("fontpage_190_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0x17,0xc0,0x90,0x40,0x90,0x40,0x90, + 0x40,0x97,0xc0,0x90,0x40,0x90,0x40,0x20,0x40,0x4f,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191_132_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, + 0x40,0x68,0x20,0xa7,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f,0xe0,0x20,0x80,0x6f, + 0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, + 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, + 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_192_187_187[45] U8G_FONT_SECTION("fontpage_192_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x3f,0x80,0x20,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x04,0x40,0x52,0xa0,0x50,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, + 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, + 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_183_183[45] U8G_FONT_SECTION("fontpage_196_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x3f,0xc0,0x20,0x40,0x20, + 0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, + 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, + 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, + 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0xff,0x80,0x22,0x80,0x2a, + 0x80,0x36,0x80,0x62,0x80,0xa7,0xa0,0x24,0xa0,0xa8,0xa0,0x50,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, + 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, + 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; +const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, + 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, + 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_233_233[45] U8G_FONT_SECTION("fontpage_197_233_233") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x22,0x40,0xf9,0x80,0x22,0x40,0x2c, + 0x20,0x31,0x00,0x67,0xc0,0xa1,0x00,0x2f,0xe0,0x21,0x00,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, + 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_198_161_161[45] U8G_FONT_SECTION("fontpage_198_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x20,0xfb,0x40,0x21,0x00,0x2f, + 0xe0,0x30,0x20,0x60,0x20,0xa7,0xe0,0x20,0x20,0x20,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198_164_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xfa,0x40,0x21,0x80,0x2e, + 0x60,0x30,0x00,0x62,0x40,0xa2,0x40,0x22,0x40,0x24,0x40,0xe8,0x40}; +const u8g_fntpgm_uint8_t fontpage_198_226_226[45] U8G_FONT_SECTION("fontpage_198_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xfc,0x80,0x27,0xc0,0x2d, + 0x40,0x35,0x40,0x6f,0xe0,0xa1,0x00,0x22,0x80,0x24,0x40,0xe8,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, + 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x93,0xe0,0x94,0x40,0x9a, + 0x40,0x92,0x40,0xb2,0x80,0xd1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x95,0x00,0x59,0x00,0xfd,0xe0,0x33,0x40,0x59, + 0x40,0x95,0x40,0xfd,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xee,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, + 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, + 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, + 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, + 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_224_224[45] U8G_FONT_SECTION("fontpage_203_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x0a,0x00,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_203_246_246[45] U8G_FONT_SECTION("fontpage_203_246_246") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x9f,0xe0,0x90,0x80,0x94, + 0x80,0xf2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xf0,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, + 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_130_130[45] U8G_FONT_SECTION("fontpage_205_130_130") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0xfb,0x80,0x52,0x00,0xfb,0xe0,0x12, + 0x80,0xf4,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, + 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, + 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, + 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; +const u8g_fntpgm_uint8_t fontpage_206_186_186[45] U8G_FONT_SECTION("fontpage_206_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0x80,0x24,0x80,0xfc,0x80,0x24, + 0x80,0x74,0x80,0x6c,0x80,0xa4,0x80,0xa4,0x80,0x28,0xa0,0x30,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, + 0xc0,0x04,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_225_225[45] U8G_FONT_SECTION("fontpage_206_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x29,0x00,0x46,0x00,0x0a, + 0x00,0x35,0x80,0xc4,0x60,0x3f,0x80,0x15,0x00,0x24,0x80,0xdc,0x40}; +const u8g_fntpgm_uint8_t fontpage_206_229_229[45] U8G_FONT_SECTION("fontpage_206_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x24,0x80,0x15,0x00,0xff, + 0xe0,0x04,0x00,0x0e,0x00,0x15,0x00,0x24,0x80,0xc4,0x60,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, + 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, + 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, + 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_209_192_192[45] U8G_FONT_SECTION("fontpage_209_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xfc,0x40,0x28,0x20,0x27, + 0xc0,0x70,0x00,0x69,0x20,0xa4,0xa0,0x22,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, + 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, + 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_214_226_226[45] U8G_FONT_SECTION("fontpage_214_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, + 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; +const u8g_fntpgm_uint8_t fontpage_217_161_161[45] U8G_FONT_SECTION("fontpage_217_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xe0,0x10, + 0x00,0x2f,0xc0,0x24,0x80,0x42,0x80,0xc3,0x00,0x44,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x8f,0xe0,0x49,0x20,0x19, + 0x00,0x2f,0xc0,0x28,0x40,0xca,0x80,0x49,0x00,0x52,0x80,0x6c,0x60}; +const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, + 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; +const u8g_fntpgm_uint8_t fontpage_218_203_203[45] U8G_FONT_SECTION("fontpage_218_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xbe,0x20,0x62,0xa0,0x2a,0xa0,0xaa,0xa0,0x6a, + 0xa0,0x2a,0xa0,0x2a,0xa0,0xc8,0xa0,0x54,0x20,0x62,0x20,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, + 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; +const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, + 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; +const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0xc0,0x94,0x40,0x57, + 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, + 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; +const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, + 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_224_237_237[43] U8G_FONT_SECTION("fontpage_224_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x24,0x40,0x24,0x40,0x24, + 0x80,0x4a,0x00,0x0a,0x00,0x11,0x00,0x20,0xe0,0xc0,0x40}; +const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x17,0xe0,0x54,0x80,0x58,0x80,0x50, + 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; +const u8g_fntpgm_uint8_t fontpage_225_185_185[45] U8G_FONT_SECTION("fontpage_225_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x3f, + 0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_225_237_237[45] U8G_FONT_SECTION("fontpage_225_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xf7,0x80,0x22,0x80,0x32,0x80,0x66, + 0x80,0xa3,0x80,0x24,0xa0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_228_249_249[45] U8G_FONT_SECTION("fontpage_228_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xa7,0xc0,0xf1,0x00,0xa1,0x00,0xaf, + 0xe0,0x30,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, + 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, + 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; +const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234_181_181") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0xff, + 0x80,0x88,0x80,0x88,0x80,0xff,0x80,0x08,0x40,0x08,0x40,0x07,0xc0}; +const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, + 0xff,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, + 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; +const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1f, + 0x80,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, + 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_239_239[45] U8G_FONT_SECTION("fontpage_243_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0xe3,0xe0,0x22,0x20,0xfa,0x20,0x22, + 0x20,0x73,0xe0,0x68,0x00,0xa2,0x40,0xa2,0x40,0x24,0x20,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, + 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, + 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, + 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, + 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_248_251_251[45] U8G_FONT_SECTION("fontpage_248_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24, + 0x80,0x40,0x40,0x04,0x00,0xff,0xe0,0x0a,0x00,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, + 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, + 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_191_191[45] U8G_FONT_SECTION("fontpage_253_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0x43,0xc0,0x4e,0x00,0xe3, + 0xe0,0x2e,0x00,0x42,0x40,0xf2,0x80,0x09,0x20,0x32,0xa0,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_198_198[45] U8G_FONT_SECTION("fontpage_253_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x44,0xa0,0x54,0xa0,0xe4, + 0xa0,0x27,0xe0,0x44,0xa0,0xf4,0xa0,0x04,0xa0,0x37,0xe0,0xc4,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xea,0x80,0x21, + 0x00,0x42,0x80,0xec,0x60,0x01,0x00,0x30,0xc0,0xc3,0x00,0x00,0xc0}; +const u8g_fntpgm_uint8_t fontpage_253_223_223[45] U8G_FONT_SECTION("fontpage_253_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x42,0x00,0x54,0x40,0xef, + 0xe0,0x22,0xa0,0x42,0x80,0xf2,0x80,0x02,0xa0,0x34,0xa0,0xc8,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_231_231[45] U8G_FONT_SECTION("fontpage_253_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x26,0xa0,0x45,0xc0,0x54,0x80,0xe7, + 0xe0,0x24,0x80,0x45,0xc0,0xf6,0xa0,0x04,0x80,0x34,0x80,0xc7,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_234_234[45] U8G_FONT_SECTION("fontpage_253_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xa0,0x49,0x40,0x57,0xe0,0xe1, + 0x00,0x23,0xe0,0x46,0x20,0xf3,0xe0,0x0a,0x20,0x33,0xe0,0xc2,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_237_237[45] U8G_FONT_SECTION("fontpage_253_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x41,0x00,0x57,0xe0,0xe4, + 0xa0,0x2a,0x80,0x44,0x80,0xef,0xe0,0x01,0x00,0x32,0xc0,0xcc,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x20,0x40,0x43,0xc0,0xf0,0x40,0x2f, + 0xe0,0x41,0x20,0xf5,0x40,0x03,0x80,0x35,0x40,0xc9,0x20,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_254_150_150[45] U8G_FONT_SECTION("fontpage_254_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x48,0x20,0x5f,0xe0,0xe8, + 0x00,0x2f,0xe0,0x4a,0xa0,0xff,0xe0,0x0a,0xa0,0x3a,0xa0,0xc8,0x60}; +const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x41,0x00,0x7b,0xc0,0xa1,0x40,0x21, + 0x40,0xff,0xe0,0x21,0x00,0xa9,0x00,0xaa,0x80,0xfa,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x91,0x40,0xd5,0x40,0xa2, + 0x40,0x92,0x40,0xad,0x40,0xc5,0x40,0x88,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, + 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, + 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_256_234_234[45] U8G_FONT_SECTION("fontpage_256_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x40,0xfa,0x80,0x57,0xc0,0x54,0x40,0x74, + 0x40,0x57,0xc0,0x71,0x00,0x5a,0xa0,0xf6,0xa0,0x1a,0x40,0x11,0xc0}; +const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, + 0xfe,0x82}; +const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x01,0xc0,0x7e, + 0x80,0x28,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, + 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, + 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, + 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, + 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; +const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, + 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_279_161_161[45] U8G_FONT_SECTION("fontpage_279_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x01,0x00,0x0f,0xe0,0xe1, + 0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_279_174_174[45] U8G_FONT_SECTION("fontpage_279_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xe4, + 0x40,0x22,0x80,0x22,0x80,0x29,0x00,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_190_190[45] U8G_FONT_SECTION("fontpage_279_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xe0,0xe0, + 0x00,0x2f,0xc0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1c,0x60}; +const u8g_fntpgm_uint8_t fontpage_279_213_213[45] U8G_FONT_SECTION("fontpage_279_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x40,0x21,0x20,0x1f,0xe0,0x01,0x00,0xef, + 0x00,0x25,0x00,0x25,0x00,0x24,0xa0,0x26,0xa0,0x38,0x60,0x20,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_239_239[45] U8G_FONT_SECTION("fontpage_279_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x04,0x40,0x07,0xc0,0xe0, + 0x00,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x21,0x00,0x07,0xc0,0xe1, + 0x00,0x2f,0xe0,0x24,0x40,0x27,0xc0,0x24,0x40,0x37,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_280_131_131[45] U8G_FONT_SECTION("fontpage_280_131_131") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x0b,0xa0,0xe9,0x20,0x2f, + 0xe0,0x28,0x20,0x2b,0xa0,0x2a,0xa0,0x3b,0xa0,0x28,0x20,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282_165_165") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x89,0x00,0xa9,0xe0,0xa9,0x40,0xab, + 0x40,0xad,0x40,0xa9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8a,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_244_244[45] U8G_FONT_SECTION("fontpage_286_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x47,0xe0,0x64,0xa0,0xa4, + 0xa0,0xfc,0xa0,0x27,0xe0,0x3c,0xa0,0xe4,0xa0,0x27,0xe0,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_253_253[45] U8G_FONT_SECTION("fontpage_286_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x40,0x11,0x20,0xff,0xe0,0x21, + 0x00,0xfd,0x20,0x51,0x40,0x7c,0x80,0x10,0xa0,0xfd,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_287_145_145[45] U8G_FONT_SECTION("fontpage_287_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x43,0xc0,0x60,0x00,0xa7, + 0xe0,0xfa,0x40,0x23,0x40,0x3a,0xc0,0xe2,0x60,0x2f,0xc0,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_287_147_147[45] U8G_FONT_SECTION("fontpage_287_147_147") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x42,0x80,0xf4,0x40,0x4b,0xa0,0xa0, + 0x00,0xfe,0x20,0x2a,0xa0,0x3e,0xa0,0xea,0xa0,0x2e,0xa0,0x2a,0x60}; +const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x2f,0xe0,0x01,0x20,0xe1, + 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xc0,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x20,0x00,0x20,0x00,0x0f,0xe0,0xe2, + 0x00,0x22,0x80,0x24,0x40,0x2f,0xa0,0x24,0x20,0x50,0x00,0x8f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4,0x80,0x24,0x80,0x24, + 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_216_216[45] U8G_FONT_SECTION("fontpage_287_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x20,0x80,0x21,0x00,0x01,0x00,0xe3, + 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287_219_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x24,0x80,0x2f,0xc0,0x04,0x80,0xe4, + 0x80,0x3f,0xe0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, + 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_137_137[45] U8G_FONT_SECTION("fontpage_288_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x45,0x00,0x25,0x00,0x27,0xc0,0x09,0x00,0xef, + 0xe0,0x22,0x80,0x22,0xa0,0x24,0xa0,0x28,0x60,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, + 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, + 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, + 0x60,0x31,0x00,0x6f,0xc0,0xa1,0x00,0xaf,0xe0,0x21,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, + 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_297_136_136[45] U8G_FONT_SECTION("fontpage_297_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xfb, + 0xe0,0x20,0x80,0xf8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_297_174_174[45] U8G_FONT_SECTION("fontpage_297_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x47,0xc0,0x79,0x40,0x81,0x40,0xf9, + 0x40,0x27,0xc0,0xfa,0x40,0x22,0x40,0x2a,0x40,0x32,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x80,0x4f,0xe0,0x72,0x80,0x82,0x80,0xef, + 0xe0,0x40,0x00,0xf7,0xc0,0x44,0x40,0x47,0xc0,0x54,0x40,0x67,0xc0}; +const u8g_fntpgm_uint8_t fontpage_298_174_174[45] U8G_FONT_SECTION("fontpage_298_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x5c,0x80,0x47,0xe0,0x68,0xa0,0x8b,0xe0,0xfc, + 0xa0,0x47,0xe0,0xe4,0x80,0x57,0xe0,0x48,0x80,0x6c,0x80,0x53,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_255_255[45] U8G_FONT_SECTION("fontpage_298_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, + 0x00,0xff,0xc0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xc0}; +const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0x20,0x20,0x82,0x20,0x82,0x20,0xbf, + 0xa0,0x86,0x20,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0x20,0x80,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_244_244[45] U8G_FONT_SECTION("fontpage_299_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x4f,0xc0,0x20,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x9e,0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, + 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, + 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, + 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_304_249_249[45] U8G_FONT_SECTION("fontpage_304_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x3d,0x20,0xc1,0x80,0x02,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, + 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_157_157[45] U8G_FONT_SECTION("fontpage_305_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0x87,0xe0,0x7a,0x20,0xca, + 0xa0,0x32,0xa0,0x4a,0xa0,0xfe,0xa0,0x4a,0xa0,0x79,0x40,0x4e,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_206_206[45] U8G_FONT_SECTION("fontpage_305_206_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4c, + 0x80,0x44,0x80,0x4c,0x80,0x52,0x80,0x62,0xa0,0x80,0x60,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x47,0xc0,0x7c,0x40,0x97,0x40,0xad, + 0x40,0x25,0x40,0x27,0x40,0x24,0xc0,0x2c,0x20,0x34,0x20,0x23,0xe0}; +const u8g_fntpgm_uint8_t fontpage_308_241_241[45] U8G_FONT_SECTION("fontpage_308_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf3,0xe0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, + 0xa0,0x7a,0x40,0x0a,0x40,0xea,0xa0,0x0b,0x20,0x0a,0x00,0x33,0xe0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, + 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, + 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' + FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' + FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' + FONTDATA_ITEM(156, 157, 157, fontpage_156_157_157), // 'ä¸' -- 'ä¸' + FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' + FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' + FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' + FONTDATA_ITEM(157, 134, 134, fontpage_157_134_134), // '了' -- '了' + FONTDATA_ITEM(157, 142, 142, fontpage_157_142_142), // '于' -- '于' + FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' + FONTDATA_ITEM(157, 206, 206, fontpage_157_206_206), // '从' -- '从' + FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' + FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' + FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // 'ä½' -- '低' + FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // 'ä¾›' -- 'ä¾›' + FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // 'ä¿' -- 'ä¿' + FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // 'ä¿¡' -- 'ä¿¡' + FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // 'å' -- 'å' + FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // 'åœ' -- 'åœ' + FONTDATA_ITEM(161, 168, 168, fontpage_161_168_168), // '储' -- '储' + FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // 'å……' -- 'å……' + FONTDATA_ITEM(162, 200, 200, fontpage_162_200_200), // 'å…ˆ' -- 'å…ˆ' + FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // 'å…¥' -- 'å…¥' + FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // 'å…¨' -- 'å…¨' + FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // 'å…±' -- 'å…±' + FONTDATA_ITEM(162, 243, 243, fontpage_162_243_243), // 'å…³' -- 'å…³' + FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // 'å…·' -- 'å…·' + FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' + FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' + FONTDATA_ITEM(163, 201, 201, fontpage_163_201_201), // '凉' -- '凉' + FONTDATA_ITEM(163, 250, 251, fontpage_163_250_251), // '出' -- '击' + FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 155, 155, fontpage_164_155_155), // '创' -- '创' + FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // 'åˆ' -- 'åˆ' + FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' + FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' + FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' + FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // 'åŠ' -- 'åŠ' + FONTDATA_ITEM(166, 207, 207, fontpage_166_207_207), // 'å' -- 'å' + FONTDATA_ITEM(166, 213, 213, fontpage_166_213_213), // 'å•' -- 'å•' + FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // 'å¡' -- 'å¡' + FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // 'å¸' -- 'å¸' + FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' + FONTDATA_ITEM(167, 204, 204, fontpage_167_204_204), // 'åŒ' -- 'åŒ' + FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // 'å–' -- 'å–' + FONTDATA_ITEM(167, 216, 216, fontpage_167_216_216), // 'å˜' -- 'å˜' + FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // 'åˆ' -- 'åˆ' + FONTDATA_ITEM(168, 142, 142, fontpage_168_142_142), // 'åŽ' -- 'åŽ' + FONTDATA_ITEM(168, 175, 175, fontpage_168_175_175), // 'å¯' -- 'å¯' + FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' + FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // 'å’Œ' -- 'å’Œ' + FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // 'å–·' -- 'å–·' + FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' + FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' + FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // 'å› ' -- 'å› ' + FONTDATA_ITEM(173, 254, 254, fontpage_173_254_254), // '图' -- '图' + FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(174, 215, 215, fontpage_174_215_215), // 'å—' -- 'å—' + FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // 'åž‹' -- 'åž‹' + FONTDATA_ITEM(175, 171, 171, fontpage_175_171_171), // 'åž«' -- 'åž«' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // 'å¡«' -- 'å¡«' + FONTDATA_ITEM(177, 243, 243, fontpage_177_243_243), // '壳' -- '壳' + FONTDATA_ITEM(178, 135, 135, fontpage_178_135_135), // '备' -- '备' + FONTDATA_ITEM(178, 141, 141, fontpage_178_141_141), // 'å¤' -- 'å¤' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' + FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' + FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' + FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // 'å§‹' -- 'å§‹' + FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // 'å­' -- 'å­' + FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // 'å­˜' -- 'å­˜' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' + FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' + FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' + FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' + FONTDATA_ITEM(183, 249, 249, fontpage_183_249_249), // '对' -- '对' + FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // 'å°' -- 'å°' + FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // 'å°±' -- 'å°±' + FONTDATA_ITEM(184, 207, 207, fontpage_184_207_207), // 'å±' -- 'å±' + FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // 'å·¥' -- 'å·¥' + FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // 'å·²' -- 'å·²' + FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // 'å¹³' -- 'å¹³' + FONTDATA_ITEM(188, 246, 246, fontpage_188_246_246), // 'å¹¶' -- 'å¹¶' + FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 148, 148, fontpage_189_148_148), // '应' -- '应' + FONTDATA_ITEM(189, 159, 159, fontpage_189_159_159), // '废' -- '废' + FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' + FONTDATA_ITEM(190, 128, 128, fontpage_190_128_128), // 'å¼€' -- 'å¼€' + FONTDATA_ITEM(190, 210, 210, fontpage_190_210_210), // 'å½’' -- 'å½’' + FONTDATA_ITEM(191, 132, 133, fontpage_191_132_133), // '径' -- 'å¾…' + FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // 'å¾®' -- 'å¾®' + FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' + FONTDATA_ITEM(192, 187, 187, fontpage_192_187_187), // '总' -- '总' + FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // 'æ¢' -- 'æ¢' + FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // 'æ¯' -- 'æ¯' + FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // 'æˆ' -- 'æˆ' + FONTDATA_ITEM(196, 183, 183, fontpage_196_183_183), // '户' -- '户' + FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' + FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' + FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' + FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' + FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // 'æ‹”' -- 'æ‹”' + FONTDATA_ITEM(197, 233, 233, fontpage_197_233_233), // 'æ‹©' -- 'æ‹©' + FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' + FONTDATA_ITEM(198, 161, 161, fontpage_198_161_161), // '挡' -- '挡' + FONTDATA_ITEM(198, 164, 164, fontpage_198_164_164), // '挤' -- '挤' + FONTDATA_ITEM(198, 226, 226, fontpage_198_226_226), // 'æ¢' -- 'æ¢' + FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' + FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' + FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' + FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // 'æ’' -- 'æ’' + FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // 'æ”¶' -- 'æ”¶' + FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' + FONTDATA_ITEM(202, 240, 240, fontpage_202_240_240), // 'æ•°' -- 'æ•°' + FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // 'æ•´' -- 'æ•´' + FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // 'æ–™' -- 'æ–™' + FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // 'æ–œ' -- 'æ–œ' + FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // 'æ–°' -- 'æ–°' + FONTDATA_ITEM(203, 224, 224, fontpage_203_224_224), // 'æ— ' -- 'æ— ' + FONTDATA_ITEM(203, 246, 246, fontpage_203_246_246), // 'æ—¶' -- 'æ—¶' + FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(205, 130, 130, fontpage_205_130_130), // 'æš‚' -- 'æš‚' + FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // 'æš«' -- 'æš«' + FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // 'æ›´' -- 'æ›´' + FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' + FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' + FONTDATA_ITEM(206, 186, 186, fontpage_206_186_186), // '机' -- '机' + FONTDATA_ITEM(206, 192, 192, fontpage_206_192_192), // 'æ€' -- 'æ€' + FONTDATA_ITEM(206, 225, 225, fontpage_206_225_225), // 'æ¡' -- 'æ¡' + FONTDATA_ITEM(206, 229, 229, fontpage_206_229_229), // 'æ¥' -- 'æ¥' + FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // 'æ¿' -- 'æ¿' + FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' + FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // 'æ ¡' -- 'æ ¡' + FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // 'æ ¼' -- 'æ ¼' + FONTDATA_ITEM(209, 192, 192, fontpage_209_192_192), // '检' -- '检' + FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // 'æ§½' -- 'æ§½' + FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // 'æ©™' -- 'æ©™' + FONTDATA_ITEM(214, 226, 226, fontpage_214_226_226), // 'æ­¢' -- 'æ­¢' + FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // 'æ­¥' -- 'æ­¥' + FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' + FONTDATA_ITEM(217, 161, 161, fontpage_217_161_161), // '没' -- '没' + FONTDATA_ITEM(217, 226, 226, fontpage_217_226_226), // 'æ³¢' -- 'æ³¢' + FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // 'æ´»' -- 'æ´»' + FONTDATA_ITEM(218, 203, 203, fontpage_218_203_203), // '测' -- '测' + FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' + FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // 'æ·¡' -- 'æ·¡' + FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' + FONTDATA_ITEM(220, 169, 169, fontpage_220_169_169), // '温' -- '温' + FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // 'æº' -- 'æº' + FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // 'æ¿€' -- 'æ¿€' + FONTDATA_ITEM(224, 237, 237, fontpage_224_237_237), // 'ç­' -- 'ç­' + FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // 'ç¯' -- 'ç¯' + FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点' + FONTDATA_ITEM(225, 237, 237, fontpage_225_237_237), // '热' -- '热' + FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(228, 249, 249, fontpage_228_249_249), // '特' -- '特' + FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' + FONTDATA_ITEM(234, 181, 181, fontpage_234_181_181), // '电' -- '电' + FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' + FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // 'çš„' -- 'çš„' + FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // 'ç›´' -- 'ç›´' + FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // 'çœ' -- 'çœ' + FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' + FONTDATA_ITEM(243, 239, 239, fontpage_243_239_239), // '积' -- '积' + FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // 'ç§»' -- 'ç§»' + FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // 'ç­‰' -- 'ç­‰' + FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(248, 251, 251, fontpage_248_251_251), // 'ç±»' -- 'ç±»' + FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // 'ç´«' -- 'ç´«' + FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(253, 191, 191, fontpage_253_191_191), // '线' -- '线' + FONTDATA_ITEM(253, 198, 198, fontpage_253_198_198), // '细' -- '细' + FONTDATA_ITEM(253, 200, 200, fontpage_253_200_200), // '终' -- '终' + FONTDATA_ITEM(253, 223, 223, fontpage_253_223_223), // '统' -- '统' + FONTDATA_ITEM(253, 231, 231, fontpage_253_231_231), // 'ç»§' -- 'ç»§' + FONTDATA_ITEM(253, 234, 234, fontpage_253_234_234), // '绪' -- '绪' + FONTDATA_ITEM(253, 237, 237, fontpage_253_237_237), // 'ç»­' -- 'ç»­' + FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' + FONTDATA_ITEM(254, 150, 150, fontpage_254_150_150), // 'ç¼–' -- 'ç¼–' + FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' + FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' + FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // 'ç½®' -- 'ç½®' + FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // 'ç½²' -- 'ç½²' + FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // 'èª' -- 'èª' + FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // 'èœ' -- 'èœ' + FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // 'è“' -- 'è“' + FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' + FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' + FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // 'è§’' -- 'è§’' + FONTDATA_ITEM(279, 161, 161, fontpage_279_161_161), // '计' -- '计' + FONTDATA_ITEM(279, 174, 174, fontpage_279_174_174), // 'è®®' -- 'è®®' + FONTDATA_ITEM(279, 190, 190, fontpage_279_190_190), // '设' -- '设' + FONTDATA_ITEM(279, 213, 213, fontpage_279_213_213), // '试' -- '试' + FONTDATA_ITEM(279, 239, 239, fontpage_279_239_239), // '误' -- '误' + FONTDATA_ITEM(279, 247, 247, fontpage_279_247_247), // '请' -- '请' + FONTDATA_ITEM(280, 131, 131, fontpage_280_131_131), // 'è°ƒ' -- 'è°ƒ' + FONTDATA_ITEM(282, 165, 165, fontpage_282_165_165), // 'è´¥' -- 'è´¥' + FONTDATA_ITEM(286, 244, 244, fontpage_286_244_244), // 'è½´' -- 'è½´' + FONTDATA_ITEM(286, 253, 253, fontpage_286_253_253), // 'è½½' -- 'è½½' + FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑' + FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输' + FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // 'è¾¹' -- 'è¾¹' + FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // 'è¿' -- 'è¿‘' + FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // 'è¿”' -- 'è¿”' + FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还' + FONTDATA_ITEM(287, 219, 219, fontpage_287_219_219), // 'è¿›' -- 'è¿›' + FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' + FONTDATA_ITEM(288, 137, 137, fontpage_288_137_137), // '选' -- '选' + FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' + FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' + FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // 'é‡' -- 'é‡' + FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // 'é‡' -- 'é‡' + FONTDATA_ITEM(297, 136, 136, fontpage_297_136_136), // 'é’ˆ' -- 'é’ˆ' + FONTDATA_ITEM(297, 174, 174, fontpage_297_174_174), // 'é’®' -- 'é’®' + FONTDATA_ITEM(298, 153, 153, fontpage_298_153_153), // 'é”™' -- 'é”™' + FONTDATA_ITEM(298, 174, 174, fontpage_298_174_174), // 'é”®' -- 'é”®' + FONTDATA_ITEM(298, 255, 255, fontpage_298_255_255), // 'é•¿' -- 'é•¿' + FONTDATA_ITEM(299, 237, 237, fontpage_299_237_237), // 'é—­' -- 'é—­' + FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // 'é—´' -- 'é—´' + FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // 'é™' -- 'é™' + FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // 'é’' -- 'é’' + FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // 'éž' -- 'éž' + FONTDATA_ITEM(304, 249, 249, fontpage_304_249_249), // '项' -- '项' + FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' + FONTDATA_ITEM(305, 157, 157, fontpage_305_157_157), // 'é¢' -- 'é¢' + FONTDATA_ITEM(305, 206, 206, fontpage_305_206_206), // '风' -- '风' + FONTDATA_ITEM(306, 241, 241, fontpage_306_241_241), // '饱' -- '饱' + FONTDATA_ITEM(308, 241, 241, fontpage_308_241_241), // '驱' -- '驱' + FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' + FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' + FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' +}; diff --git a/Marlin/src/lcd/dogm/language_data_zh_TW.h b/Marlin/src/lcd/dogm/language_data_zh_TW.h new file mode 100644 index 0000000000..478eb92eaa --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_zh_TW.h @@ -0,0 +1,1367 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_166_166[45] U8G_FONT_SECTION("fontpage_156_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0xff,0xe0,0x0a,0x00,0x4a, + 0x40,0x4a,0x40,0x2a,0x40,0x2a,0x80,0x0a,0x00,0x0a,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xc0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, + 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, + 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, + 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, + 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, + 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; +const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, + 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_134_134[45] U8G_FONT_SECTION("fontpage_159_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x24,0x80,0x24, + 0x80,0x55,0x40,0x8e,0x20,0x15,0x00,0x24,0x80,0xc4,0x60,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, + 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; +const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, + 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, + 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_160_139_139[45] U8G_FONT_SECTION("fontpage_160_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x29,0x20,0x29,0x20,0x2f,0xe0,0x69, + 0x20,0xab,0xa0,0x2a,0xa0,0x2b,0xa0,0x28,0x20,0x2f,0xe0,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, + 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, + 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, + 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_161_153_153[45] U8G_FONT_SECTION("fontpage_161_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x2f,0xc0,0x24,0x80,0x3f,0xe0,0x64, + 0x00,0xaf,0xe0,0x29,0x20,0x3f,0xe0,0x29,0x20,0x2f,0xe0,0x29,0x20}; +const u8g_fntpgm_uint8_t fontpage_161_179_179[45] U8G_FONT_SECTION("fontpage_161_179_179") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb3,0xb3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x2a,0x40,0x2f,0xc0,0x6a, + 0x40,0xbf,0xc0,0x22,0x80,0x3f,0xe0,0x28,0x80,0x24,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_162_178_178[45] U8G_FONT_SECTION("fontpage_162_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x80,0x3d,0xe0,0x40,0xa0,0x5d,0xe0,0xc0, + 0x80,0x5d,0xe0,0x43,0x20,0x5d,0xe0,0x55,0x20,0x5d,0xe0,0x55,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_200_200[45] U8G_FONT_SECTION("fontpage_162_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, + 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, + 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, + 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, + 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_250_250[45] U8G_FONT_SECTION("fontpage_163_250_250") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, + 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; +const u8g_fntpgm_uint8_t fontpage_164_151_151[45] U8G_FONT_SECTION("fontpage_164_151_151") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x20,0x10,0x20,0x11,0x20,0x3d,0x20,0x25, + 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, + 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_245_245[45] U8G_FONT_SECTION("fontpage_164_245_245") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x28,0x20,0x54,0xa0,0xfe,0xa0,0x44, + 0xa0,0x7c,0xa0,0x44,0xa0,0x7c,0xa0,0xc4,0x20,0x44,0x20,0x7c,0xe0}; +const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; +const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xfa,0x20,0x0a,0x20,0x04,0xc0}; +const u8g_fntpgm_uint8_t fontpage_165_213_213[45] U8G_FONT_SECTION("fontpage_165_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x78,0x80,0x10,0x80,0xfe,0x80,0x55,0xe0,0x7c, + 0xa0,0x54,0xa0,0x7c,0xa0,0x10,0xa0,0x7d,0x20,0x11,0x20,0xfe,0x60}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_212_212[45] U8G_FONT_SECTION("fontpage_166_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x27,0xc0,0x22,0x40,0xfa,0x40,0x24, + 0x80,0x24,0x80,0x3f,0xe0,0x2a,0xa0,0x2a,0xa0,0x33,0x20,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, + 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, + 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, + 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, + 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; +const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, + 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_170_223_223[45] U8G_FONT_SECTION("fontpage_170_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x45,0xe0,0x7d,0x40,0x43, + 0x40,0x5d,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9d,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_171_174_174[45] U8G_FONT_SECTION("fontpage_171_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xf3,0xc0,0x92,0x40,0x92,0x40,0xff,0xc0,0x44, + 0x80,0x7f,0x80,0x44,0x80,0x7f,0x80,0x04,0x00,0xff,0xc0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, + 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; +const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, + 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_174_150_150[45] U8G_FONT_SECTION("fontpage_174_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x20,0x9f,0x20,0x84,0x20,0xff, + 0xe0,0xaa,0xa0,0xae,0xa0,0xa0,0xa0,0xbf,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, + 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_202_202[45] U8G_FONT_SECTION("fontpage_176_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0x29,0x20,0xff,0xe0,0x29, + 0x20,0x2f,0xe0,0x21,0x40,0x33,0xa0,0xe5,0xe0,0x09,0x20,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, + 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_138_138[45] U8G_FONT_SECTION("fontpage_177_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x23,0xc0,0xf9,0x40,0x51,0x40,0xfb, + 0x40,0x22,0xc0,0xfc,0x20,0x24,0x20,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, + 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, + 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, + 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, + 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, + 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, + 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, + 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, + 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_141_141[45] U8G_FONT_SECTION("fontpage_184_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x40,0xaa,0x40,0x6c,0x40,0xff,0xe0,0x28, + 0x40,0x7d,0x40,0x10,0xc0,0x7c,0x40,0x10,0x40,0x1d,0x40,0xe0,0x80}; +const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, + 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, + 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, + 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, + 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, + 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_189_226_226[45] U8G_FONT_SECTION("fontpage_189_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x55,0x40,0x48,0xa0,0x7d, + 0xc0,0x45,0x20,0x5e,0x00,0x51,0xc0,0x5d,0x40,0x84,0x80,0x9b,0x60}; +const u8g_fntpgm_uint8_t fontpage_189_250_250[45] U8G_FONT_SECTION("fontpage_189_250_250") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xef,0xc0,0x22,0x40,0x5f,0xe0,0xe2, + 0x40,0x2f,0xc0,0xa2,0x00,0x6f,0xe0,0x22,0x00,0x52,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_133_133[45] U8G_FONT_SECTION("fontpage_191_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f, + 0xe0,0x20,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_140_140[45] U8G_FONT_SECTION("fontpage_191_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2f, + 0xe0,0x64,0x20,0xa7,0xc0,0x2c,0x40,0x32,0x80,0x23,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_191_145_145[45] U8G_FONT_SECTION("fontpage_191_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xe0,0x25,0x40,0x45,0x40,0x9a,0x80,0x25, + 0x40,0x65,0x40,0xa0,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_158_158[45] U8G_FONT_SECTION("fontpage_191_158_158") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9e,0x9e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x40,0x22,0x40,0x45,0xa0,0x99,0x20,0x20, + 0x00,0x65,0x00,0xa5,0x00,0x25,0xe0,0x25,0x00,0x2b,0x00,0x31,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_169_169[45] U8G_FONT_SECTION("fontpage_191_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x27,0xe0,0x4c,0x40,0x97,0xc0,0x24, + 0x40,0x67,0xc0,0xa4,0x00,0x27,0xc0,0x2c,0x80,0x33,0x00,0x2c,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, + 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, + 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, + 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_195_182_182[45] U8G_FONT_SECTION("fontpage_195_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xb2,0x80,0xaf,0xe0,0xa4, + 0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x25,0x40,0x2c,0xa0,0x33,0xa0}; +const u8g_fntpgm_uint8_t fontpage_195_201_201[45] U8G_FONT_SECTION("fontpage_195_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x4a,0x80,0x57,0xe0,0x7c, + 0x80,0x57,0xc0,0x54,0x80,0x57,0xe0,0x4a,0x40,0xa8,0xa0,0x4f,0xa0}; +const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, + 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_182_182[45] U8G_FONT_SECTION("fontpage_196_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xc0,0x20, + 0x40,0x20,0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, + 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, + 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, + 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0xff,0x80,0x22,0x80,0x2a, + 0x80,0x36,0x80,0x62,0x80,0xa7,0xa0,0x24,0xa0,0xa8,0xa0,0x50,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, + 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, + 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; +const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, + 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, + 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, + 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, + 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_219_219[45] U8G_FONT_SECTION("fontpage_199_219_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x80,0x2f,0xe0,0x2a, + 0xa0,0x3a,0xa0,0x6c,0x60,0xa1,0x00,0x2f,0xe0,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_201_199_199[45] U8G_FONT_SECTION("fontpage_201_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x2a,0xa0,0xff,0xe0,0x21,0x00,0x2f, + 0xe0,0x32,0x80,0xe7,0xc0,0x21,0x00,0x2f,0xe0,0xa1,0x00,0x61,0x00}; +const u8g_fntpgm_uint8_t fontpage_201_202_203[73] U8G_FONT_SECTION("fontpage_201_202_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfd,0xc0,0xa9,0x40,0xf9,0x60,0xab,0xc0,0xfd, + 0x40,0xa9,0x80,0xab,0x60,0xfe,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x29,0x20,0x25,0x40,0xff,0xe0,0x2a,0xa0,0x2b,0x80,0x30,0x00,0xef, + 0xe0,0x29,0x20,0x2f,0xe0,0xa9,0x20,0x6f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_201_224_224[45] U8G_FONT_SECTION("fontpage_201_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xfa,0xa0,0x25,0x40,0x2d, + 0x60,0x35,0x40,0xe4,0x40,0x27,0xc0,0x24,0x40,0xa7,0xc0,0x68,0x40}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_215_215[45] U8G_FONT_SECTION("fontpage_202_215_215") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7d,0x00,0x45,0x00,0x7d,0xe0,0x47,0x40,0x7d, + 0x40,0x45,0x40,0x7d,0x40,0x45,0x40,0x28,0x80,0x45,0x40,0x86,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, + 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_202_248_248[45] U8G_FONT_SECTION("fontpage_202_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x55,0xe0,0xff,0x40,0x55, + 0x40,0xfd,0x40,0x95,0x40,0xff,0x40,0x28,0x80,0x19,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, + 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, + 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, + 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_188_188[45] U8G_FONT_SECTION("fontpage_203_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfd,0x40,0x21,0x40,0x3a, + 0x20,0x2c,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, + 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_194_194[45] U8G_FONT_SECTION("fontpage_204_194_194") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xf7,0xc0,0x91,0x00,0x91,0x00,0xff, + 0xe0,0x90,0x80,0x9f,0xe0,0x94,0x80,0xf2,0x80,0x00,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, + 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, + 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, + 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; +const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, + 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, + 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, + 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_209_157_157[45] U8G_FONT_SECTION("fontpage_209_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x27,0xe0,0x5a,0x40,0x51,0x80,0xde, + 0x60,0x51,0x00,0x5f,0xe0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, + 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, + 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_212_223_223[45] U8G_FONT_SECTION("fontpage_212_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x25,0x40,0x29,0xa0,0xff,0x40,0x25,0x20,0x6f, + 0xe0,0x75,0x40,0xaf,0xe0,0xa5,0x40,0x26,0xa0,0x29,0x60,0x32,0x20}; +const u8g_fntpgm_uint8_t fontpage_213_162_162[45] U8G_FONT_SECTION("fontpage_213_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xf4,0x40,0x2b,0xa0,0x60, + 0x00,0x7e,0xe0,0xaa,0xa0,0xae,0xe0,0x24,0x40,0x2a,0xc0,0x31,0x20}; +const u8g_fntpgm_uint8_t fontpage_214_226_226[45] U8G_FONT_SECTION("fontpage_214_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, + 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_214_248_248[45] U8G_FONT_SECTION("fontpage_214_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0xc0,0xf0,0x40,0x93,0xc0,0xf8,0x40,0x8f, + 0xe0,0xfc,0xa0,0x20,0x80,0xbb,0xe0,0xa2,0xa0,0xba,0xe0,0xe0,0x80}; +const u8g_fntpgm_uint8_t fontpage_215_188_188[45] U8G_FONT_SECTION("fontpage_215_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xc0,0xfd,0x40,0x11,0x40,0xff,0x60,0x84, + 0x00,0x7b,0xe0,0x01,0x40,0x79,0x40,0x4a,0x80,0x4d,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; +const u8g_fntpgm_uint8_t fontpage_217_146_146[45] U8G_FONT_SECTION("fontpage_217_146_146") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x23,0xc0,0x84,0x40,0x59,0x40,0x10, + 0x80,0x27,0xc0,0x24,0x40,0xc2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, + 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, + 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_188_188[45] U8G_FONT_SECTION("fontpage_219_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x00,0x8f,0xe0,0x50,0x00,0x17, + 0xc0,0x24,0x40,0x27,0xc0,0xc1,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; +const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, + 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; +const u8g_fntpgm_uint8_t fontpage_220_172_172[45] U8G_FONT_SECTION("fontpage_220_172_172") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0x20,0x2a,0xa0,0x0a,0xa0,0x8e,0xa0,0x5a, + 0xa0,0x2e,0xa0,0x2a,0xa0,0xca,0xa0,0x4e,0x20,0x4a,0x20,0x51,0x60}; +const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, + 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; +const u8g_fntpgm_uint8_t fontpage_221_150_150[45] U8G_FONT_SECTION("fontpage_221_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x85,0x00,0x4f,0xe0,0x99,0x00,0x4f,0xc0,0x49, + 0x00,0xcf,0xc0,0x49,0x00,0x4f,0xe0,0x04,0x00,0xff,0xe0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_221_171_171[45] U8G_FONT_SECTION("fontpage_221_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x25,0x40,0x06,0xc0,0x84,0x40,0x47, + 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, + 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_224_237_237[43] U8G_FONT_SECTION("fontpage_224_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x24,0x40,0x24,0x40,0x24, + 0x80,0x4a,0x00,0x0a,0x00,0x11,0x00,0x20,0xe0,0xc0,0x40}; +const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x17,0xe0,0x54,0x80,0x58,0x80,0x50, + 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; +const u8g_fntpgm_uint8_t fontpage_226_161_161[45] U8G_FONT_SECTION("fontpage_226_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7f,0xe0,0xaa,0x80,0x2a,0x80,0xff, + 0xe0,0x2a,0x80,0x2a,0x80,0xff,0xe0,0x12,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_177_177[45] U8G_FONT_SECTION("fontpage_227_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf9,0x00,0x23,0xc0,0xfd,0x40,0x53, + 0x40,0xa9,0x40,0xfa,0xe0,0x22,0x20,0xfa,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_200_200[45] U8G_FONT_SECTION("fontpage_227_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xa0,0x2b,0x40,0xac,0x80,0xb7,0xc0,0xa8, + 0x20,0x37,0xc0,0x24,0x40,0x27,0xc0,0x52,0x80,0x49,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, + 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, + 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; +const u8g_fntpgm_uint8_t fontpage_234_204_204[45] U8G_FONT_SECTION("fontpage_234_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f, + 0xc0,0x0a,0x00,0x31,0x80,0xd1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, + 0xff,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, + 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; +const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1f, + 0x80,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, + 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_240_141_141[45] U8G_FONT_SECTION("fontpage_240_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xfa,0x00,0x23,0xe0,0x24,0x20,0x79, + 0x40,0xc9,0x00,0x49,0x00,0x49,0x00,0x7a,0x80,0x4c,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, + 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_244_205_205[45] U8G_FONT_SECTION("fontpage_244_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xef,0xe0,0x21,0x00,0xff,0xc0,0x21, + 0x00,0x2f,0xe0,0x34,0x40,0x6f,0xc0,0xa4,0x40,0x27,0xc0,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, + 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, + 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, + 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_249_251_251[45] U8G_FONT_SECTION("fontpage_249_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x03,0x80,0xfc,0x00,0x11,0x00,0x7e,0x00,0x08, + 0x00,0x11,0x00,0xff,0x80,0x08,0x80,0x2a,0x00,0x49,0x00,0x98,0x80}; +const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, + 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_250_176_176[45] U8G_FONT_SECTION("fontpage_250_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x55,0x20,0xf5,0x20,0x25, + 0x20,0x57,0xe0,0xed,0x20,0x05,0x20,0x55,0x20,0xaf,0xe0,0xac,0x20}; +const u8g_fntpgm_uint8_t fontpage_250_194_194[45] U8G_FONT_SECTION("fontpage_250_194_194") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xf2,0x80,0x21, + 0x00,0x52,0x80,0xec,0x60,0x01,0x00,0x50,0x80,0xab,0x00,0x80,0xc0}; +const u8g_fntpgm_uint8_t fontpage_250_241_242[73] U8G_FONT_SECTION("fontpage_250_241_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0x57,0xe0,0xf1,0x00,0x22, + 0x40,0x57,0xa0,0xe8,0x00,0x02,0x80,0x52,0xa0,0xac,0xa0,0xa8,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x52,0x40,0xf7,0x80,0x21,0x40,0x57,0xe0,0xe8, + 0x80,0x02,0xc0,0x54,0xa0,0xa8,0xa0,0xa9,0x80}; +const u8g_fntpgm_uint8_t fontpage_251_178_178[45] U8G_FONT_SECTION("fontpage_251_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xe0,0x24,0x20,0x55,0x60,0xf4,0xa0,0x27, + 0xe0,0x54,0xa0,0xef,0xe0,0x05,0x20,0x55,0xe0,0xac,0x20,0xac,0x60}; +const u8g_fntpgm_uint8_t fontpage_251_210_210[45] U8G_FONT_SECTION("fontpage_251_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x20,0x27,0xa0,0x51,0x40,0xff,0xe0,0x21, + 0x00,0x53,0xe0,0xee,0x20,0x03,0xe0,0x52,0x20,0xab,0xe0,0xaa,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_218_218[45] U8G_FONT_SECTION("fontpage_251_218_218") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xda,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x54,0x40,0xf7,0xc0,0x24, + 0x40,0x57,0xc0,0xe9,0x20,0x07,0x40,0x53,0x80,0xad,0x40,0xab,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_232_232[45] U8G_FONT_SECTION("fontpage_251_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x58,0x20,0xff,0xe0,0x28, + 0x00,0x5f,0xe0,0xea,0xa0,0x0f,0xe0,0x5a,0xa0,0xaa,0xa0,0xaa,0x60}; +const u8g_fntpgm_uint8_t fontpage_252_174_174[45] U8G_FONT_SECTION("fontpage_252_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x44,0x20,0xfb,0xe0,0x24, + 0x80,0x5d,0xe0,0xf5,0x20,0x05,0xe0,0x55,0x20,0xad,0xe0,0xa5,0x20}; +const u8g_fntpgm_uint8_t fontpage_252_189_189[45] U8G_FONT_SECTION("fontpage_252_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x55,0x60,0xf6,0xa0,0x25, + 0x20,0x56,0xa0,0xef,0xe0,0x01,0x40,0x56,0xa0,0xaa,0x60,0xa9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_252_252_252[45] U8G_FONT_SECTION("fontpage_252_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4a,0x40,0x4d,0xa0,0x8a,0x40,0xfd,0xa0,0x28, + 0x00,0x4f,0xe0,0xfa,0x40,0x0d,0xa0,0x5a,0x40,0xad,0xa0,0xaf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_140_140[45] U8G_FONT_SECTION("fontpage_253_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x4f,0xe0,0x91,0x00,0xef,0xe0,0x2a, + 0xa0,0x5f,0xe0,0xf4,0x40,0x07,0xc0,0x54,0x40,0xaf,0xc0,0xac,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, + 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x20,0x40,0x43,0xc0,0xf0,0x40,0x2f, + 0xe0,0x41,0x20,0xf5,0x40,0x03,0x80,0x35,0x40,0xc9,0x20,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x41,0x00,0x7b,0xc0,0xa1,0x40,0x21, + 0x40,0xff,0xe0,0x21,0x00,0xa9,0x00,0xaa,0x80,0xfa,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x91,0x40,0xd5,0x40,0xa2, + 0x40,0x92,0x40,0xad,0x40,0xc5,0x40,0x88,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, + 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, + 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_256_240_240[45] U8G_FONT_SECTION("fontpage_256_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x57,0xe0,0x56,0xa0,0x75,0x20,0x56, + 0xa0,0x77,0xe0,0x51,0x00,0x52,0xc0,0xfe,0x20,0x12,0x60,0x11,0xc0}; +const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, + 0xfe,0x82}; +const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, + 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, + 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_272_232_232[45] U8G_FONT_SECTION("fontpage_272_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x0a,0x40,0x12,0x80,0x31,0x00,0xd4,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, + 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, + 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; +const u8g_fntpgm_uint8_t fontpage_273_221_221[45] U8G_FONT_SECTION("fontpage_273_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x51,0x00,0x7f,0xe0,0x11,0x00,0xf1,0x00,0x57, + 0xc0,0x84,0x00,0xff,0xe0,0x14,0x80,0x33,0x00,0xd5,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_274_135_135[45] U8G_FONT_SECTION("fontpage_274_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x27,0xe0,0xf8,0x00,0x17,0xc0,0x2c, + 0x40,0x77,0xc0,0xac,0x40,0x27,0xc0,0x2c,0x40,0x33,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, + 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_136_136[45] U8G_FONT_SECTION("fontpage_276_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfc,0x80,0x00,0x80,0x7f, + 0xe0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_138_138[45] U8G_FONT_SECTION("fontpage_276_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xc0,0xf2,0x40,0x02,0x40,0xf2,0x40,0x02, + 0x40,0xff,0xc0,0x02,0x40,0xf2,0x40,0x92,0x60,0xf2,0x60,0x92,0x20}; +const u8g_fntpgm_uint8_t fontpage_276_152_152[45] U8G_FONT_SECTION("fontpage_276_152_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0xf7,0xc0,0x00,0x40,0xf0,0x40,0x07, + 0xc0,0xf4,0x40,0x04,0x00,0xf4,0x00,0x94,0x20,0xf4,0x20,0x93,0xe0}; +const u8g_fntpgm_uint8_t fontpage_276_173_173[45] U8G_FONT_SECTION("fontpage_276_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0xf4,0x80,0x04,0x80,0xf4,0xe0,0x08, + 0x00,0xf7,0xc0,0x04,0x40,0xf2,0x80,0x91,0x00,0xf2,0x80,0x9c,0x60}; +const u8g_fntpgm_uint8_t fontpage_276_230_230[45] U8G_FONT_SECTION("fontpage_276_230_230") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe6,0xe6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0xf0,0xa0,0x0f,0xe0,0xf0,0x80,0x07, + 0x80,0xf2,0x80,0x02,0x80,0xf2,0x80,0x93,0xa0,0xfc,0x60,0x90,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_164_164[45] U8G_FONT_SECTION("fontpage_277_164_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0xf4,0x40,0x04,0x40,0xf7,0xc0,0x00, + 0x00,0xf7,0xc0,0x01,0x00,0xff,0xe0,0x92,0x80,0xf4,0x40,0x98,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_191_191[45] U8G_FONT_SECTION("fontpage_277_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0xf4,0x20,0x05,0x20,0xf7,0xa0,0x05, + 0x20,0xf7,0xe0,0x04,0x20,0xf7,0xa0,0x96,0xa0,0xf7,0xa0,0x98,0x60}; +const u8g_fntpgm_uint8_t fontpage_277_203_203[45] U8G_FONT_SECTION("fontpage_277_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, + 0x00,0xff,0xe0,0x04,0x40,0xf7,0xc0,0x94,0x40,0xf7,0xc0,0x94,0x40}; +const u8g_fntpgm_uint8_t fontpage_278_240_240[45] U8G_FONT_SECTION("fontpage_278_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x40,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, + 0x00,0xff,0xe0,0x04,0xa0,0xff,0xe0,0x94,0xa0,0xfe,0x40,0x95,0xa0}; +const u8g_fntpgm_uint8_t fontpage_279_138_138[45] U8G_FONT_SECTION("fontpage_279_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x40,0xae,0xa0,0x40,0x40,0xae,0xa0,0xea, + 0xe0,0x5e,0x40,0xa0,0xa0,0x1f,0xc0,0x69,0x00,0x06,0x00,0x79,0xe0}; +const u8g_fntpgm_uint8_t fontpage_281_199_199[45] U8G_FONT_SECTION("fontpage_281_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x88,0x00,0x5f,0xc0,0x22,0x40,0xff,0x00,0x61, + 0xc0,0x3f,0x00,0x21,0x00,0x3f,0x00,0x21,0x00,0x3f,0x00,0xe1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_285_248_248[45] U8G_FONT_SECTION("fontpage_285_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x23,0xe0,0xfa,0xa0,0xaa, + 0xa0,0xfa,0xa0,0xab,0xe0,0xfa,0xa0,0x22,0xa0,0xfb,0xe0,0x22,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_137_137[45] U8G_FONT_SECTION("fontpage_286_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x80,0x7d,0x40,0x11,0x00,0xff,0xe0,0x11, + 0x00,0xff,0x20,0x55,0x40,0x7c,0x80,0x54,0xa0,0xff,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_175_175[45] U8G_FONT_SECTION("fontpage_286_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x23,0xc0,0xf8,0x00,0xaf, + 0xe0,0xfa,0x40,0xab,0xc0,0xfa,0x40,0x22,0xe0,0xff,0x40,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_286_184_184[45] U8G_FONT_SECTION("fontpage_286_184_184") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xfa,0x80,0x24,0x60,0xfb,0x80,0xae, + 0x20,0xfa,0xa0,0xae,0xa0,0xfa,0xa0,0x2e,0xa0,0xfa,0x20,0x2a,0x60}; +const u8g_fntpgm_uint8_t fontpage_287_209_209[45] U8G_FONT_SECTION("fontpage_287_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4, + 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, + 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, + 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_178_178[45] U8G_FONT_SECTION("fontpage_288_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0x00,0x24,0x80,0x27,0xe0,0x0c,0x80,0xf7, + 0xe0,0x24,0x80,0x27,0xe0,0x24,0x80,0x27,0xe0,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_203_203[45] U8G_FONT_SECTION("fontpage_288_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x2f,0xe0,0x05,0x40,0xe7, + 0xc0,0x25,0x40,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_212_212[45] U8G_FONT_SECTION("fontpage_288_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x27,0xc0,0x21,0x00,0x0f,0xe0,0xe2, + 0x80,0x2f,0xe0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_248_248[45] U8G_FONT_SECTION("fontpage_288_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0xe0,0x2a,0xa0,0x2e,0xe0,0x08,0x80,0xea, + 0xa0,0x2f,0xe0,0x22,0x80,0x2f,0xe0,0x22,0x40,0x54,0x20,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_132_132[45] U8G_FONT_SECTION("fontpage_289_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x9f,0xc0,0x55,0x40,0x5f,0xc0,0x00,0x00,0xff, + 0xe0,0x28,0x80,0x2f,0xa0,0x27,0x40,0x2a,0x80,0x52,0x40,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_138_138[45] U8G_FONT_SECTION("fontpage_289_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x2f,0xc0,0x28,0x40,0x1f,0xe0,0xf4, + 0xa0,0x29,0x40,0x3f,0xe0,0x22,0x00,0x27,0xc0,0x58,0xc0,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, + 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, + 0x60,0x31,0x00,0x6f,0xc0,0xa1,0x00,0xaf,0xe0,0x21,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, + 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_221_221[45] U8G_FONT_SECTION("fontpage_291_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, + 0xe0,0xf8,0x80,0x20,0x80,0xa8,0x80,0x70,0x80,0x38,0x80,0xc0,0x80}; +const u8g_fntpgm_uint8_t fontpage_292_149_149[45] U8G_FONT_SECTION("fontpage_292_149_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x31,0x40,0x49,0x40,0xf9,0x40,0x21, + 0x40,0xff,0xc0,0x22,0x40,0xaa,0x40,0x72,0x40,0x3a,0x40,0xc7,0xe0}; +const u8g_fntpgm_uint8_t fontpage_294_175_175[45] U8G_FONT_SECTION("fontpage_294_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x40,0x57,0xe0,0x8a,0x40,0x7a,0x40,0x27, + 0xe0,0xf8,0x00,0x23,0xe0,0xaa,0x20,0x73,0xe0,0x3a,0x20,0xe3,0xe0}; +const u8g_fntpgm_uint8_t fontpage_294_245_245[45] U8G_FONT_SECTION("fontpage_294_245_245") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2c,0x80,0x25,0xe0,0x54,0xa0,0xfb,0xe0,0x2c, + 0xa0,0xf7,0xe0,0x24,0x80,0xb7,0xe0,0x6c,0x80,0x34,0x80,0xcb,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_247_247[45] U8G_FONT_SECTION("fontpage_298_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x3f,0x80,0x20,0x00,0x3f,0x00,0x20,0x00,0x3f, + 0x00,0x20,0x00,0xff,0xc0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xc0}; +const u8g_fntpgm_uint8_t fontpage_299_137_137[45] U8G_FONT_SECTION("fontpage_299_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x82,0x20,0xbf,0xa0,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_139_139[45] U8G_FONT_SECTION("fontpage_299_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x80,0x20,0x9f,0x20,0x8a,0x20,0xbf,0xa0,0x8a,0x20,0x92,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_147_147[45] U8G_FONT_SECTION("fontpage_299_147_147") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x9f,0x20,0x91,0x20,0x9f,0x20,0x91,0x20,0x9f,0x20,0x80,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_220_220[45] U8G_FONT_SECTION("fontpage_299_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xf5, + 0xe0,0xaa,0xa0,0xbb,0xa0,0xaa,0xa0,0xbb,0xa0,0x8a,0x20,0xb2,0x60}; +const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, + 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, + 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; +const u8g_fntpgm_uint8_t fontpage_301_217_217[45] U8G_FONT_SECTION("fontpage_301_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x3f,0xe0,0x6a,0x80,0xbf,0xc0,0x2a, + 0x80,0x3f,0xe0,0x00,0x00,0x3f,0xc0,0x08,0x80,0x07,0x00,0x78,0xe0}; +const u8g_fntpgm_uint8_t fontpage_301_251_251[45] U8G_FONT_SECTION("fontpage_301_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0xa4,0xa0,0x7f, + 0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x04,0x20,0x07,0xe0}; +const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, + 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x08,0x00,0x10,0x00,0xff,0xc0,0x92, + 0x40,0x9e,0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_304_133_133[45] U8G_FONT_SECTION("fontpage_304_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x27, + 0xe0,0x24,0x20,0x3f,0xe0,0xc4,0x20,0x07,0xe0,0x02,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_144_144[45] U8G_FONT_SECTION("fontpage_304_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x00,0x67,0xc0,0x24,0x40,0xff, + 0xc0,0x24,0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_304_205_205[45] U8G_FONT_SECTION("fontpage_304_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0xa7,0xe0,0x3a,0x20,0x4b, + 0xe0,0xb2,0x20,0x4b,0xe0,0xfe,0x20,0x4b,0xe0,0x79,0x40,0x4e,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_222_222[45] U8G_FONT_SECTION("fontpage_304_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xab,0xe0,0x70,0x80,0x23,0xe0,0xfa,0x20,0x73, + 0xe0,0xaa,0x20,0x23,0xe0,0xfa,0x20,0x23,0xe0,0x51,0x40,0x8e,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, + 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_168_168[45] U8G_FONT_SECTION("fontpage_305_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x21,0x40,0x2e,0x40,0x24,0x40,0x3f, + 0x40,0x35,0x40,0x3f,0x40,0x25,0x40,0x27,0x60,0x5c,0xa0,0x88,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_253_253[45] U8G_FONT_SECTION("fontpage_305_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x52,0x00,0xab,0xe0,0xfc,0x20,0x8b, + 0xa0,0xfa,0xa0,0x8b,0xa0,0xfa,0x40,0x92,0x20,0xaa,0x20,0xc9,0xe0}; +const u8g_fntpgm_uint8_t fontpage_307_172_172[45] U8G_FONT_SECTION("fontpage_307_172_172") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x24,0x00,0x3f,0x80,0x24,0x00,0x3f, + 0x80,0x24,0x00,0x3f,0xe0,0x00,0x20,0x55,0x20,0x4a,0xa0,0x8a,0xc0}; +const u8g_fntpgm_uint8_t fontpage_308_197_197[45] U8G_FONT_SECTION("fontpage_308_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x54,0x00,0x7d,0xc0,0x55,0x40,0x7d, + 0xc0,0x54,0x00,0x7f,0xe0,0x5e,0xa0,0xaf,0xe0,0xac,0x00,0x17,0xe0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, + 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, + 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0xa8,0x80,0xf8,0xe0,0xa8,0x80,0xf8, + 0x80,0x23,0xe0,0xfa,0x20,0x22,0x20,0xfa,0x20,0x52,0x20,0xab,0xe0}; +const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' + FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' + FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' + FONTDATA_ITEM(156, 166, 166, fontpage_156_166_166), // '並' -- '並' + FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' + FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' + FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' + FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' + FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' + FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' + FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // 'ä½' -- '低' + FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(159, 134, 134, fontpage_159_134_134), // '來' -- '來' + FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // 'ä¾›' -- 'ä¾›' + FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // 'ä¿' -- 'ä¿' + FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // 'ä¿¡' -- 'ä¿¡' + FONTDATA_ITEM(160, 139, 139, fontpage_160_139_139), // '個' -- '個' + FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // 'å' -- 'å' + FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // 'åœ' -- 'åœ' + FONTDATA_ITEM(161, 153, 153, fontpage_161_153_153), // 'å‚™' -- 'å‚™' + FONTDATA_ITEM(161, 179, 179, fontpage_161_179_179), // '傳' -- '傳' + FONTDATA_ITEM(162, 178, 178, fontpage_162_178_178), // '儲' -- '儲' + FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // 'å……' -- 'å……' + FONTDATA_ITEM(162, 200, 200, fontpage_162_200_200), // 'å…ˆ' -- 'å…ˆ' + FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // 'å…¥' -- 'å…¥' + FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // 'å…¨' -- 'å…¨' + FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // 'å…±' -- 'å…±' + FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // 'å…·' -- 'å…·' + FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' + FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' + FONTDATA_ITEM(163, 250, 250, fontpage_163_250_250), // '出' -- '出' + FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 151, 151, fontpage_164_151_151), // '列' -- '列' + FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // 'åˆ' -- 'åˆ' + FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' + FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(164, 245, 245, fontpage_164_245_245), // '創' -- '創' + FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' + FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' + FONTDATA_ITEM(165, 213, 213, fontpage_165_213_213), // 'å‹•' -- 'å‹•' + FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // 'åŠ' -- 'åŠ' + FONTDATA_ITEM(166, 212, 212, fontpage_166_212_212), // 'å”' -- 'å”' + FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // 'å¡' -- 'å¡' + FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // 'å¸' -- 'å¸' + FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' + FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // 'å–' -- 'å–' + FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // 'åˆ' -- 'åˆ' + FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' + FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // 'å’Œ' -- 'å’Œ' + FONTDATA_ITEM(170, 223, 223, fontpage_170_223_223), // '啟' -- '啟' + FONTDATA_ITEM(171, 174, 174, fontpage_171_174_174), // 'å–®' -- 'å–®' + FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' + FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // 'å™´' -- 'å™´' + FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' + FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // 'å› ' -- 'å› ' + FONTDATA_ITEM(174, 150, 150, fontpage_174_150_150), // '圖' -- '圖' + FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // 'åž‹' -- 'åž‹' + FONTDATA_ITEM(176, 202, 202, fontpage_176_202_202), // '塊' -- '塊' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // 'å¡«' -- 'å¡«' + FONTDATA_ITEM(177, 138, 138, fontpage_177_138_138), // '墊' -- '墊' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' + FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' + FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' + FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // 'å§‹' -- 'å§‹' + FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // 'å­' -- 'å­' + FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // 'å­˜' -- 'å­˜' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' + FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' + FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' + FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' + FONTDATA_ITEM(184, 141, 141, fontpage_184_141_141), // 'å°' -- 'å°' + FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // 'å°' -- 'å°' + FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // 'å°±' -- 'å°±' + FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // 'å·¥' -- 'å·¥' + FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // 'å·²' -- 'å·²' + FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // 'å¹³' -- 'å¹³' + FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' + FONTDATA_ITEM(189, 226, 226, fontpage_189_226_226), // '廢' -- '廢' + FONTDATA_ITEM(189, 250, 250, fontpage_189_250_250), // '建' -- '建' + FONTDATA_ITEM(191, 133, 133, fontpage_191_133_133), // 'å¾…' -- 'å¾…' + FONTDATA_ITEM(191, 140, 140, fontpage_191_140_140), // '後' -- '後' + FONTDATA_ITEM(191, 145, 145, fontpage_191_145_145), // '徑' -- '徑' + FONTDATA_ITEM(191, 158, 158, fontpage_191_158_158), // '從' -- '從' + FONTDATA_ITEM(191, 169, 169, fontpage_191_169_169), // '復' -- '復' + FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // 'å¾®' -- 'å¾®' + FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' + FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // 'æ¢' -- 'æ¢' + FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // 'æ¯' -- 'æ¯' + FONTDATA_ITEM(195, 182, 182, fontpage_195_182_182), // '憶' -- '憶' + FONTDATA_ITEM(195, 201, 201, fontpage_195_201_201), // '應' -- '應' + FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // 'æˆ' -- 'æˆ' + FONTDATA_ITEM(196, 182, 182, fontpage_196_182_182), // '戶' -- '戶' + FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' + FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' + FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' + FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' + FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // 'æ‹”' -- 'æ‹”' + FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' + FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' + FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' + FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' + FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // 'æ’' -- 'æ’' + FONTDATA_ITEM(199, 219, 219, fontpage_199_219_219), // 'æ›' -- 'æ›' + FONTDATA_ITEM(201, 199, 199, fontpage_201_199_199), // '擇' -- '擇' + FONTDATA_ITEM(201, 202, 203, fontpage_201_202_203), // '擊' -- 'æ“‹' + FONTDATA_ITEM(201, 224, 224, fontpage_201_224_224), // 'æ“ ' -- 'æ“ ' + FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' + FONTDATA_ITEM(202, 215, 215, fontpage_202_215_215), // 'æ•—' -- 'æ•—' + FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // 'æ•´' -- 'æ•´' + FONTDATA_ITEM(202, 248, 248, fontpage_202_248_248), // '數' -- '數' + FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // 'æ–™' -- 'æ–™' + FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // 'æ–œ' -- 'æ–œ' + FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // 'æ–°' -- 'æ–°' + FONTDATA_ITEM(203, 188, 188, fontpage_203_188_188), // 'æ–¼' -- 'æ–¼' + FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(204, 194, 194, fontpage_204_194_194), // '時' -- '時' + FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // 'æš«' -- 'æš«' + FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // 'æ›´' -- 'æ›´' + FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' + FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' + FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // 'æ¿' -- 'æ¿' + FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' + FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // 'æ ¡' -- 'æ ¡' + FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // 'æ ¼' -- 'æ ¼' + FONTDATA_ITEM(209, 157, 157, fontpage_209_157_157), // 'æ¢' -- 'æ¢' + FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // 'æ§½' -- 'æ§½' + FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // 'æ©™' -- 'æ©™' + FONTDATA_ITEM(212, 223, 223, fontpage_212_223_223), // '機' -- '機' + FONTDATA_ITEM(213, 162, 162, fontpage_213_162_162), // '檢' -- '檢' + FONTDATA_ITEM(214, 226, 226, fontpage_214_226_226), // 'æ­¢' -- 'æ­¢' + FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // 'æ­¥' -- 'æ­¥' + FONTDATA_ITEM(214, 248, 248, fontpage_214_248_248), // 'æ­¸' -- 'æ­¸' + FONTDATA_ITEM(215, 188, 188, fontpage_215_188_188), // '殼' -- '殼' + FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' + FONTDATA_ITEM(217, 146, 146, fontpage_217_146_146), // 'æ²’' -- 'æ²’' + FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // 'æ´»' -- 'æ´»' + FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' + FONTDATA_ITEM(219, 188, 188, fontpage_219_188_188), // 'æ¶¼' -- 'æ¶¼' + FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // 'æ·¡' -- 'æ·¡' + FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' + FONTDATA_ITEM(220, 172, 172, fontpage_220_172_172), // '測' -- '測' + FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // 'æº' -- 'æº' + FONTDATA_ITEM(221, 150, 150, fontpage_221_150_150), // '準' -- '準' + FONTDATA_ITEM(221, 171, 171, fontpage_221_171_171), // '溫' -- '溫' + FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // 'æ¿€' -- 'æ¿€' + FONTDATA_ITEM(224, 237, 237, fontpage_224_237_237), // 'ç­' -- 'ç­' + FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // 'ç¯' -- 'ç¯' + FONTDATA_ITEM(226, 161, 161, fontpage_226_161_161), // 'ç„¡' -- 'ç„¡' + FONTDATA_ITEM(227, 177, 177, fontpage_227_177_177), // '熱' -- '熱' + FONTDATA_ITEM(227, 200, 200, fontpage_227_200_200), // '燈' -- '燈' + FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' + FONTDATA_ITEM(234, 204, 204, fontpage_234_204_204), // '界' -- '界' + FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' + FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // 'çš„' -- 'çš„' + FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // 'ç›´' -- 'ç›´' + FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // 'çœ' -- 'çœ' + FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' + FONTDATA_ITEM(240, 141, 141, fontpage_240_141_141), // 'ç ' -- 'ç ' + FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // 'ç§»' -- 'ç§»' + FONTDATA_ITEM(244, 205, 205, fontpage_244_205_205), // 'ç©' -- 'ç©' + FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // 'ç­‰' -- 'ç­‰' + FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(249, 251, 251, fontpage_249_251_251), // 'ç³»' -- 'ç³»' + FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // 'ç´«' -- 'ç´«' + FONTDATA_ITEM(250, 176, 176, fontpage_250_176_176), // 'ç´°' -- 'ç´°' + FONTDATA_ITEM(250, 194, 194, fontpage_250_194_194), // '終' -- '終' + FONTDATA_ITEM(250, 241, 242, fontpage_250_241_242), // 'çµ±' -- 'çµ²' + FONTDATA_ITEM(251, 178, 178, fontpage_251_178_178), // 'ç¶²' -- 'ç¶²' + FONTDATA_ITEM(251, 210, 210, fontpage_251_210_210), // 'ç·’' -- 'ç·’' + FONTDATA_ITEM(251, 218, 218, fontpage_251_218_218), // 'ç·š' -- 'ç·š' + FONTDATA_ITEM(251, 232, 232, fontpage_251_232_232), // 'ç·¨' -- 'ç·¨' + FONTDATA_ITEM(252, 174, 174, fontpage_252_174_174), // '縮' -- '縮' + FONTDATA_ITEM(252, 189, 189, fontpage_252_189_189), // '總' -- '總' + FONTDATA_ITEM(252, 252, 252, fontpage_252_252_252), // 'ç¹¼' -- 'ç¹¼' + FONTDATA_ITEM(253, 140, 140, fontpage_253_140_140), // '續' -- '續' + FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' + FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' + FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' + FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // 'ç½®' -- 'ç½®' + FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // 'ç½²' -- 'ç½²' + FONTDATA_ITEM(256, 240, 240, fontpage_256_240_240), // 'è°' -- 'è°' + FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // 'è“' -- 'è“' + FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' + FONTDATA_ITEM(272, 232, 232, fontpage_272_232_232), // '表' -- '表' + FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' + FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(273, 221, 221, fontpage_273_221_221), // 'è£' -- 'è£' + FONTDATA_ITEM(274, 135, 135, fontpage_274_135_135), // '複' -- '複' + FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // 'è§’' -- 'è§’' + FONTDATA_ITEM(276, 136, 136, fontpage_276_136_136), // '計' -- '計' + FONTDATA_ITEM(276, 138, 138, fontpage_276_138_138), // '訊' -- '訊' + FONTDATA_ITEM(276, 152, 152, fontpage_276_152_152), // '記' -- '記' + FONTDATA_ITEM(276, 173, 173, fontpage_276_173_173), // '設' -- '設' + FONTDATA_ITEM(276, 230, 230, fontpage_276_230_230), // '試' -- '試' + FONTDATA_ITEM(277, 164, 164, fontpage_277_164_164), // '誤' -- '誤' + FONTDATA_ITEM(277, 191, 191, fontpage_277_191_191), // '調' -- '調' + FONTDATA_ITEM(277, 203, 203, fontpage_277_203_203), // 'è«‹' -- 'è«‹' + FONTDATA_ITEM(278, 240, 240, fontpage_278_240_240), // 'è­°' -- 'è­°' + FONTDATA_ITEM(279, 138, 138, fontpage_279_138_138), // '變' -- '變' + FONTDATA_ITEM(281, 199, 199, fontpage_281_199_199), // '資' -- '資' + FONTDATA_ITEM(285, 248, 248, fontpage_285_248_248), // '軸' -- '軸' + FONTDATA_ITEM(286, 137, 137, fontpage_286_137_137), // '載' -- '載' + FONTDATA_ITEM(286, 175, 175, fontpage_286_175_175), // '輯' -- '輯' + FONTDATA_ITEM(286, 184, 184, fontpage_286_184_184), // '輸' -- '輸' + FONTDATA_ITEM(287, 209, 209, fontpage_287_209_209), // 'è¿‘' -- 'è¿‘' + FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // 'è¿”' -- 'è¿”' + FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' + FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' + FONTDATA_ITEM(288, 178, 178, fontpage_288_178_178), // '進' -- '進' + FONTDATA_ITEM(288, 203, 203, fontpage_288_203_203), // 'é‹' -- 'é‹' + FONTDATA_ITEM(288, 212, 212, fontpage_288_212_212), // 'é”' -- 'é”' + FONTDATA_ITEM(288, 248, 248, fontpage_288_248_248), // 'é¸' -- 'é¸' + FONTDATA_ITEM(289, 132, 132, fontpage_289_132_132), // 'é‚„' -- 'é‚„' + FONTDATA_ITEM(289, 138, 138, fontpage_289_138_138), // '邊' -- '邊' + FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' + FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // 'é‡' -- 'é‡' + FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // 'é‡' -- 'é‡' + FONTDATA_ITEM(291, 221, 221, fontpage_291_221_221), // 'é‡' -- 'é‡' + FONTDATA_ITEM(292, 149, 149, fontpage_292_149_149), // '鈕' -- '鈕' + FONTDATA_ITEM(294, 175, 175, fontpage_294_175_175), // '錯' -- '錯' + FONTDATA_ITEM(294, 245, 245, fontpage_294_245_245), // 'éµ' -- 'éµ' + FONTDATA_ITEM(298, 247, 247, fontpage_298_247_247), // 'é•·' -- 'é•·' + FONTDATA_ITEM(299, 137, 137, fontpage_299_137_137), // 'é–‰' -- 'é–‰' + FONTDATA_ITEM(299, 139, 139, fontpage_299_139_139), // 'é–‹' -- 'é–‹' + FONTDATA_ITEM(299, 147, 147, fontpage_299_147_147), // 'é–“' -- 'é–“' + FONTDATA_ITEM(299, 220, 220, fontpage_299_220_220), // 'é—œ' -- 'é—œ' + FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // 'é™' -- 'é™' + FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(301, 217, 217, fontpage_301_217_217), // 'é›™' -- 'é›™' + FONTDATA_ITEM(301, 251, 251, fontpage_301_251_251), // 'é›»' -- 'é›»' + FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // 'é’' -- 'é’' + FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // 'éž' -- 'éž' + FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // 'é¢' -- 'é¢' + FONTDATA_ITEM(304, 133, 133, fontpage_304_133_133), // 'é …' -- 'é …' + FONTDATA_ITEM(304, 144, 144, fontpage_304_144_144), // 'é ' -- 'é ' + FONTDATA_ITEM(304, 205, 205, fontpage_304_205_205), // 'é¡' -- 'é¡' + FONTDATA_ITEM(304, 222, 222, fontpage_304_222_222), // '類' -- '類' + FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' + FONTDATA_ITEM(305, 168, 168, fontpage_305_168_168), // '風' -- '風' + FONTDATA_ITEM(305, 253, 253, fontpage_305_253_253), // '飽' -- '飽' + FONTDATA_ITEM(307, 172, 172, fontpage_307_172_172), // '馬' -- '馬' + FONTDATA_ITEM(308, 197, 197, fontpage_308_197_197), // 'é©…' -- 'é©…' + FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' + FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' + FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' + FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' +}; diff --git a/Marlin/status_screen_DOGM.h b/Marlin/src/lcd/dogm/status_screen_DOGM.h similarity index 64% rename from Marlin/status_screen_DOGM.h rename to Marlin/src/lcd/dogm/status_screen_DOGM.h index cee8856f95..fc8f2324c0 100644 --- a/Marlin/status_screen_DOGM.h +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.h @@ -31,9 +31,9 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t x, const uint8_t y) { const char * const str = itostr3(temp); - u8g.setPrintPos(x - (str[0] != ' ' ? 0 : str[1] != ' ' ? 1 : 2) * DOG_CHAR_WIDTH / 2, y); - lcd_print(str); - lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); + lcd_moveto(x - (str[0] != ' ' ? 0 : str[1] != ' ' ? 1 : 2) * DOG_CHAR_WIDTH / 2, y); + lcd_put_u8str(str); + lcd_put_u8str_P(PSTR(LCD_STR_DEGREE " ")); } #ifndef HEAT_INDICATOR_X @@ -71,7 +71,7 @@ FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, cons ); } - if (PAGE_CONTAINS(21, 28)) + if (PAGE_CONTAINS(21, 28)) { _draw_centered_temp(0.5 + ( #if HAS_HEATED_BED isBed ? thermalManager.degBed() : @@ -80,37 +80,43 @@ FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, cons ), x, 28 ); - if (PAGE_CONTAINS(17, 20)) { - const uint8_t h = isBed ? 7 : HEAT_INDICATOR_X, - y = isBed ? 18 : 17; - if ( - #if HAS_HEATED_BED - isBed ? thermalManager.isHeatingBed() : - #endif - thermalManager.isHeatingHotend(heater) - ) { - u8g.setColorIndex(0); // white on black - u8g.drawBox(x + h, y, 2, 2); - u8g.setColorIndex(1); // black on white + if (PAGE_CONTAINS(17, 20)) { + const uint8_t h = isBed ? 7 : HEAT_INDICATOR_X, + y = isBed ? 18 : 17; + if ( + #if HAS_HEATED_BED + isBed ? thermalManager.isHeatingBed() : + #endif + thermalManager.isHeatingHotend(heater) + ) { + u8g.setColorIndex(0); // white on black + u8g.drawBox(x + h, y, 2, 2); + u8g.setColorIndex(1); // black on white + } + else + u8g.drawBox(x + h, y, 2, 2); } - else - u8g.drawBox(x + h, y, 2, 2); } } -FORCE_INLINE void _draw_axis_label(const AxisEnum axis, const char* const pstr, const bool blink) { +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { if (blink) - lcd_printPGM(pstr); + lcd_put_u8str(value); else { - if (!axis_homed[axis]) - u8g.print('?'); + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); else { #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - if (!axis_known_position[axis]) - u8g.print(' '); + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); else #endif - lcd_printPGM(pstr); + lcd_put_u8str(value); } } } @@ -118,36 +124,77 @@ FORCE_INLINE void _draw_axis_label(const AxisEnum axis, const char* const pstr, inline void lcd_implementation_status_message(const bool blink) { #if ENABLED(STATUS_MESSAGE_SCROLLING) static bool last_blink = false; - const uint8_t slen = lcd_strlen(lcd_status_message); - const char *stat = lcd_status_message + status_scroll_pos; - if (slen <= LCD_WIDTH) - lcd_print_utf(stat); // The string isn't scrolling + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(lcd_status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + } else { - if (status_scroll_pos <= slen - LCD_WIDTH) - lcd_print_utf(stat); // The string fills the screen + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = lcd_status_message + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= LCD_WIDTH) { + // The remaining string fills the screen - Print it + lcd_put_u8str_max(stat, LCD_PIXEL_WIDTH); + } else { - uint8_t chars = LCD_WIDTH; - if (status_scroll_pos < slen) { // First string still visible - lcd_print_utf(stat); // The string leaves space - chars -= slen - status_scroll_pos; // Amount of space left - } - u8g.print('.'); // Always at 1+ spaces left, draw a dot - if (--chars) { - if (status_scroll_pos < slen + 1) // Draw a second dot if there's space - --chars, u8g.print('.'); - if (chars) lcd_print_utf(lcd_status_message, chars); // Print a second copy of the message + // The remaining string does not completely fill the screen + lcd_put_u8str_max(stat, LCD_PIXEL_WIDTH); // The string leaves space + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) { + // Print a second copy of the message + lcd_put_u8str_max(lcd_status_message, LCD_PIXEL_WIDTH - ((rlen+2) * DOG_CHAR_WIDTH)); + } } } if (last_blink != blink) { last_blink = blink; - // Skip any non-printing bytes - if (status_scroll_pos < slen) while (!PRINTABLE(lcd_status_message[status_scroll_pos])) status_scroll_pos++; - if (++status_scroll_pos >= slen + 2) status_scroll_pos = 0; + + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(lcd_status_message[status_scroll_offset])) + status_scroll_offset++; + } + else + status_scroll_offset = 0; } } #else UNUSED(blink); - lcd_print_utf(lcd_status_message); + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // Just print the string to the LCD + lcd_put_u8str_max(lcd_status_message, LCD_PIXEL_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } #endif } @@ -220,13 +267,13 @@ static void lcd_implementation_status_screen() { #endif #if HAS_FAN0 - if (PAGE_CONTAINS(20, 27)) { + if (PAGE_CONTAINS(STATUS_SCREEN_FAN_TEXT_Y - 7, STATUS_SCREEN_FAN_TEXT_Y)) { // Fan const int16_t per = ((fanSpeeds[0] + 1) * 100) / 256; if (per) { - u8g.setPrintPos(STATUS_SCREEN_FAN_TEXT_X, STATUS_SCREEN_FAN_TEXT_Y); - lcd_print(itostr3(per)); - u8g.print('%'); + lcd_moveto(STATUS_SCREEN_FAN_TEXT_X, STATUS_SCREEN_FAN_TEXT_Y); + lcd_put_u8str(itostr3(per)); + lcd_put_wchar('%'); } } #endif @@ -284,9 +331,9 @@ static void lcd_implementation_status_screen() { #if ENABLED(DOGM_SD_PERCENT) if (PAGE_CONTAINS(41, 48)) { // Percent complete - u8g.setPrintPos(55, 48); - u8g.print(itostr3(progress_bar_percent)); - u8g.print('%'); + lcd_moveto(55, 48); + lcd_put_u8str(itostr3(progress_bar_percent)); + lcd_put_wchar('%'); } #endif } @@ -306,8 +353,8 @@ static void lcd_implementation_status_screen() { duration_t elapsed = print_job_timer.duration(); bool has_days = (elapsed.value >= 60*60*24L); uint8_t len = elapsed.toDigital(buffer, has_days); - u8g.setPrintPos(SD_DURATION_X, 48); - lcd_print(buffer); + lcd_moveto(SD_DURATION_X, 48); + lcd_put_u8str(buffer); } #endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY @@ -330,10 +377,6 @@ static void lcd_implementation_status_screen() { #define XYZ_FRAME_HEIGHT INFO_FONT_HEIGHT + 1 #endif - // Before homing the axis letters are blinking 'X' <-> '?'. - // When axis is homed but axis_known_position is false the axis letters are blinking 'X' <-> ' '. - // When everything is ok you see a constant 'X'. - static char xstring[5], ystring[5], zstring[7]; #if ENABLED(FILAMENT_LCD_DISPLAY) static char wstring[5], mstring[4]; @@ -369,20 +412,20 @@ static void lcd_implementation_status_screen() { u8g.setColorIndex(0); // white on black #endif - u8g.setPrintPos(0 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - _draw_axis_label(X_AXIS, PSTR(MSG_X), blink); - u8g.setPrintPos(0 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - lcd_print(xstring); + lcd_moveto(0 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('X'); + lcd_moveto(0 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(X_AXIS, xstring, blink); - u8g.setPrintPos(1 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - _draw_axis_label(Y_AXIS, PSTR(MSG_Y), blink); - u8g.setPrintPos(1 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - lcd_print(ystring); + lcd_moveto(1 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('Y'); + lcd_moveto(1 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(Y_AXIS, ystring, blink); - u8g.setPrintPos(2 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - _draw_axis_label(Z_AXIS, PSTR(MSG_Z), blink); - u8g.setPrintPos(2 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - lcd_print(zstring); + lcd_moveto(2 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('Z'); + lcd_moveto(2 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(Z_AXIS, zstring, blink); #if DISABLED(XYZ_HOLLOW_FRAME) u8g.setColorIndex(1); // black on white @@ -396,28 +439,28 @@ static void lcd_implementation_status_screen() { if (PAGE_CONTAINS(51 - INFO_FONT_HEIGHT, 49)) { lcd_setFont(FONT_MENU); - u8g.setPrintPos(3, 50); - lcd_print(LCD_STR_FEEDRATE[0]); + lcd_moveto(3, 50); + lcd_put_wchar(LCD_STR_FEEDRATE[0]); lcd_setFont(FONT_STATUSMENU); - u8g.setPrintPos(12, 50); - lcd_print(itostr3(feedrate_percentage)); - u8g.print('%'); + lcd_moveto(12, 50); + lcd_put_u8str(itostr3(feedrate_percentage)); + lcd_put_wchar('%'); // // Filament sensor display if SD is disabled // #if ENABLED(FILAMENT_LCD_DISPLAY) && DISABLED(SDSUPPORT) - u8g.setPrintPos(56, 50); - lcd_print(wstring); - u8g.setPrintPos(102, 50); - lcd_print(mstring); - u8g.print('%'); + lcd_moveto(56, 50); + lcd_put_u8str(wstring); + lcd_moveto(102, 50); + lcd_put_u8str(mstring); + lcd_put_wchar('%'); lcd_setFont(FONT_MENU); - u8g.setPrintPos(47, 50); - lcd_print(LCD_STR_FILAM_DIA); - u8g.setPrintPos(93, 50); - lcd_print(LCD_STR_FILAM_MUL); + lcd_moveto(47, 50); + lcd_put_wchar(LCD_STR_FILAM_DIA[0]); // lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_moveto(93, 50); + lcd_put_wchar(LCD_STR_FILAM_MUL[0]); #endif } @@ -428,20 +471,20 @@ static void lcd_implementation_status_screen() { #define STATUS_BASELINE (55 + INFO_FONT_HEIGHT) if (PAGE_CONTAINS(STATUS_BASELINE - (INFO_FONT_HEIGHT - 1), STATUS_BASELINE)) { - u8g.setPrintPos(0, STATUS_BASELINE); + lcd_moveto(0, STATUS_BASELINE); #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) if (PENDING(millis(), previous_lcd_status_ms + 5000UL)) { //Display both Status message line and Filament display on the last line lcd_implementation_status_message(blink); } else { - lcd_printPGM(PSTR(LCD_STR_FILAM_DIA)); - u8g.print(':'); - lcd_print(wstring); - lcd_printPGM(PSTR(" " LCD_STR_FILAM_MUL)); - u8g.print(':'); - lcd_print(mstring); - u8g.print('%'); + lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_put_wchar(':'); + lcd_put_u8str(wstring); + lcd_put_u8str_P(PSTR(" " LCD_STR_FILAM_MUL)); + lcd_put_wchar(':'); + lcd_put_u8str(mstring); + lcd_put_wchar('%'); } #else lcd_implementation_status_message(blink); diff --git a/Marlin/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h similarity index 92% rename from Marlin/status_screen_lite_ST7920.h rename to Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index 987aba4f76..23a7f1a10a 100644 --- a/Marlin/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -38,7 +38,7 @@ #include "status_screen_lite_ST7920_class.h" -#include "duration_t.h" +#include "../../libs/duration_t.h" #define BUFFER_WIDTH 256 #define BUFFER_HEIGHT 32 @@ -615,36 +615,71 @@ void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint8_t percentag void ST7920_Lite_Status_Screen::draw_status_message(const char *str) { set_ddram_address(DDRAM_LINE_4); begin_data(); + const uint8_t lcd_len = 16; #if ENABLED(STATUS_MESSAGE_SCROLLING) - const uint8_t lcd_len = 16; - const uint8_t padding = 2; - uint8_t str_len = strlen(str); - // Trim whitespace at the end of the str, as for some reason - // messages like "Card Inserted" are padded with many spaces - while (str_len && str[str_len - 1] == ' ') str_len--; + uint8_t slen = utf8_strlen(str); - if (str_len <= lcd_len) { - // It all fits on the LCD without scrolling + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= lcd_len) { + + // The string isn't scrolling and may not fill the screen write_str(str); + + // Fill the rest with spaces + while (slen < lcd_len) { + write_byte(' '); + ++slen; + } } else { - // Print the message repeatedly until covering the LCD - uint8_t c = status_scroll_pos; - for (uint8_t n = 0; n < lcd_len; n++) { - write_byte(c < str_len ? str[c] : ' '); - c++; - c %= str_len + padding; // Wrap around + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = str + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= lcd_len) { + // The remaining string fills the screen - Print it + write_str(stat, lcd_len); + } + else { + // The remaining string does not completely fill the screen + write_str(stat); // The string leaves space + uint8_t chars = lcd_len - rlen; // Amount of space left in characters + + write_byte('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + write_byte('.'); + if (--chars) + write_str(str, chars); // Print a second copy of the message + } } - // Scroll the message - if (status_scroll_pos == str_len + padding) - status_scroll_pos = 0; + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(str[status_scroll_offset])) + status_scroll_offset++; + } else - status_scroll_pos++; + status_scroll_offset = 0; } #else - write_str(str, 16); + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(str); + + // Just print the string to the LCD + write_str(str, lcd_len); + + // Fill the rest with spaces if there are missing spaces + while (slen < lcd_len) { + write_byte(' '); + ++slen; + } #endif } @@ -792,7 +827,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { */ if (forceUpdate || status_changed()) { #if ENABLED(STATUS_MESSAGE_SCROLLING) - status_scroll_pos = 0; + status_scroll_offset = 0; #endif #if STATUS_EXPIRE_SECONDS countdown = lcd_status_message[0] ? STATUS_EXPIRE_SECONDS : 0; @@ -833,9 +868,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { #if ENABLED(DISABLE_REDUCED_ACCURACY_WARNING) true #else - axis_known_position[X_AXIS] && - axis_known_position[Y_AXIS] && - axis_known_position[Z_AXIS] + all_axes_known() #endif ); } diff --git a/Marlin/status_screen_lite_ST7920_class.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h similarity index 98% rename from Marlin/status_screen_lite_ST7920_class.h rename to Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h index 75cede08ca..9ae4fc48c3 100644 --- a/Marlin/status_screen_lite_ST7920_class.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h @@ -17,8 +17,8 @@ #ifndef STATUS_SCREEN_LITE_ST7920_CLASS_H #define STATUS_SCREEN_LITE_ST7920_CLASS_H -#include "macros.h" -#include "duration.h" +#include "../../core/macros.h" +#include "../../libs/duration_t.h" typedef const __FlashStringHelper *progmem_str; diff --git a/Marlin/status_screen_lite_ST7920_spi.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_spi.h similarity index 100% rename from Marlin/status_screen_lite_ST7920_spi.h rename to Marlin/src/lcd/dogm/status_screen_lite_ST7920_spi.h diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp new file mode 100644 index 0000000000..3249068299 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -0,0 +1,284 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Based on u8g_dev_ssd1306_128x64.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * These routines are meant for two wire I2C interfaces. + * + * Three and four wire I2C interfaces have an A0 line. That line is + * used to switch between command and data modes. + * + * The two wire LCDs use an instruction byte to signal if data or + * command info is to follow. The command stream needs the instruction + * byte between eack command byte. The data stream needs one at the + * beginning. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq); + +// The sh1106 is compatible to the ssd1306, but is 132x64. 128x64 display area is centered within +// the 132x64. + +static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { + 0x010, // set upper 4 bit of the col adr to 0 + 0x002, // set lower 4 bit of the col adr to 2 (centered display with ssd1306) + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { + U8G_ESC_ADR(0), // initiate command mode + 0x0AE, // display off, sleep mode + 0x0A8, 0x03F, // mux ratio + 0x0D3, 0x00, // display offset + 0x040, // start line + 0x0A1, // segment remap a0/a1 + 0x0C8, // c0: scan dir normal, c8: reverse + 0x0DA, 0x012, // com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + 0x081, 0x0CF, // [2] set contrast control + 0x020, 0x002, // 2012-05-27: page addressing mode + 0x21, 2, 0x81, // set column range from 0 through 131 + 0x22, 0, 7, // set page range from 0 through 7 + 0x0D9, 0x0F1, // [2] pre-charge period 0x022/f1 + 0x0DB, 0x040, // vcomh deselect level + 0x0A4, // output ram to display + 0x0A6, // none inverted normal display mode + 0x0D5, 0x080, // clock divide ratio (0x00=1) and oscillator frequency (0x8) + 0x08D, 0x014, // [2] charge pump setting (p62): 0x014 enable, 0x010 disable + 0x02E, // 2012-05-27: Deactivate scroll + 0x0AF, // display on + U8G_ESC_END // end of sequence +}; + +uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_init_seq_2_wire); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2+1)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf}; +u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire = { u8g_dev_sh1106_128x64_2x_2_wire_fn, &u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; + +///////////////////////////////////////////////////////////////////////////////////////////// + +static const uint8_t u8g_dev_ssd1306_128x64_data_start_2_wire[] PROGMEM = { + 0x010, // set upper 4 bit of the col adr to 0 + 0x000, // set lower 4 bit of the col adr to 0 + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { + U8G_ESC_ADR(0), // initiate command mode + 0x0AE, // display off, sleep mode + 0x0A8, 0x03F, // mux ratio + 0x0D3, 0x00, // display offset + 0x040, // start line + 0x0A1, // segment remap a0/a1 + 0x0C8, // c0: scan dir normal, c8: reverse + 0x0DA, 0x012, // com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + 0x081, 0x0CF, // [2] set contrast control + 0x020, 0x002, // 2012-05-27: page addressing mode + 0x21, 0, 0x7F, // set column range from 0 through 127 + 0x22, 0, 7, // set page range from 0 through 7 + 0x0D9, 0x0F1, // [2] pre-charge period 0x022/f1 + 0x0DB, 0x040, // vcomh deselect level + 0x0A4, // output ram to display + 0x0A6, // none inverted normal display mode + 0x0D5, 0x080, // clock divide ratio (0x00=1) and oscillator frequency (0x8) + 0x08D, 0x014, // [2] charge pump setting (p62): 0x014 enable, 0x010 disable + 0x02E, // 2012-05-27: Deactivate scroll + 0x0AF, // display on + U8G_ESC_END // end of sequence +}; + +uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_init_seq_2_wire); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2+1)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + + +uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf}; +u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_wire_fn, &u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; + + +///////////////////////////////////////////////////////////////////////////////////////////// + +// This routine adds the instruction byte in between the command bytes. This makes the init +// sequences a lot easier to read. + +#define I2C_CMD_MODE 0x080 + +uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) { + uint8_t is_escape = 0; + uint8_t value; + for(;;) { + value = u8g_pgm_read(esc_seq); + if (is_escape == 0) { + if (value != 255) { + if (u8g_WriteByte(u8g, dev, value) == 0 ) + return 0; + if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0 ) + return 0; + } + else { + is_escape = 1; + } + } + else { + if (value == 255) { + if (u8g_WriteByte(u8g, dev, value) == 0 ) + return 0; + if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0 ) + return 0; + } + else if (value == 254) { + break; + } + else if (value >= 0x0F0) { + /* not yet used, do nothing */ + } + else if (value >= 0xE0 ) { + u8g_SetAddress(u8g, dev, value & 0x0F); + } + else if (value >= 0xD0) { + u8g_SetChipSelect(u8g, dev, value & 0x0F); + } + else if (value >= 0xC0) { + u8g_SetResetLow(u8g, dev); + value &= 0x0F; + value <<= 4; + value+=2; + u8g_Delay(value); + u8g_SetResetHigh(u8g, dev); + u8g_Delay(value); + } + else if (value >= 0xBE) { /* not yet implemented */ + /* u8g_SetVCC(u8g, dev, value & 0x01); */ + } + else if (value <= 127) { + u8g_Delay(value); + } + is_escape = 0; + } + esc_seq++; + } + return 1; +} + +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp new file mode 100644 index 0000000000..515ac32f6c --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * u8g_dev_st7565_64128n_HAL.c (Displaytech) + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(DOGLCD) + +#include + +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +#define ST7565_ADC_REVERSE(N) (0xA0 | ((N) & 0x1)) +#define ST7565_BIAS_MODE(N) (0xA2 | ((N) & 0x1)) +#define ST7565_ALL_PIX(N) (0xA4 | ((N) & 0x1)) +#define ST7565_INVERTED(N) (0xA6 | ((N) & 0x1)) +#define ST7565_ON(N) (0xAE | ((N) & 0x1)) +#define ST7565_OUT_MODE(N) (0xC0 | ((N) & 0x1) << 3) +#define ST7565_POWER_CONTROL(N) (0x28 | (N)) +#define ST7565_V0_RATIO(N) (0x10 | ((N) & 0x7)) // Specific to Displaytech 64128N? (ST7565 is 0x20 | N) +#define ST7565_CONTRAST(N) (0x81), (N) + +#define ST7565_COLUMN_ADR(N) (0x10 | (((N) >> 4) & 0xF)), ((N) & 0xF) +#define ST7565_PAGE_ADR(N) (0xB0 | (N)) +#define ST7565_START_LINE(N) (0x40 | (N)) +#define ST7565_SLEEP_MODE() (0xAC) +#define ST7565_NOOP() (0xE3) + +/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ +static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // disable chip + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ + + ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) + ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) + + ST7565_OUT_MODE(1), // common output mode: set scan direction normal operation/SHL Select, 0xC0 --> SHL = 0, normal, 0xC8 --> SHL = 1 + ST7565_START_LINE(0), // Display start line for Displaytech 64128N + + ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_POWER_CONTROL(0x6), // power control: turn on voltage regulator + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_POWER_CONTROL(0x7), // power control: turn on voltage follower + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_V0_RATIO(0), // Set V0 voltage resistor ratio. Setting for controlling brightness of Displaytech 64128N + + ST7565_INVERTED(0), // display normal, bit val 0: LCD pixel off. + + ST7565_CONTRAST(0x1E), // Contrast value. Setting for controlling brightness of Displaytech 64128N + + ST7565_ON(1), // display on + + U8G_ESC_DLY(100), // delay 100 ms + ST7565_ALL_PIX(1), // display all points, ST7565 + U8G_ESC_DLY(100), // delay 100 ms + U8G_ESC_DLY(100), // delay 100 ms + ST7565_ALL_PIX(0), // normal display + U8G_ESC_CS(0), // disable chip + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_st7565_64128n_HAL_data_start[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_COLUMN_ADR(0x00), // high 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_SLEEP_MODE(), // static indicator off + //0x00, // indicator register set (not sure if this is required) + ST7565_ON(0), // display off + ST7565_ALL_PIX(1), // all points on + U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 + U8G_ESC_END // end of sequence + }; + +static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_ALL_PIX(0), // all points off + ST7565_ON(1), // display on + U8G_ESC_DLY(50), // delay 50 ms + U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 + U8G_ESC_END // end of sequence +}; + +uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_off); + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_off); + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_SW_SPI_FN); + +uint8_t u8g_dev_st7565_64128n_HAL_2x_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_st7565_64128n_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7565_64128n_HAL_2x_buf}; +u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; + + +U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_HW_SPI_FN); +u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; + +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp new file mode 100644 index 0000000000..86a9fd110b --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -0,0 +1,212 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * u8g_dev_st7920_128x64_HAL.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ +static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // disable chip + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay) + U8G_ESC_DLY(100), // 8 Dez 2012: additional delay 100 ms because of reset + U8G_ESC_CS(1), // enable chip + U8G_ESC_DLY(50), // delay 50 ms + + 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) + 0x00C, // display on, cursor & blink off; 0x08: all off + 0x006, // Entry mode: Cursor move to right ,DDRAM address counter (AC) plus 1, no shift + 0x002, // disable scroll, enable CGRAM adress + 0x001, // clear RAM, needs 1.6 ms + U8G_ESC_DLY(100), // delay 100 ms + + U8G_ESC_CS(0), // disable chip + U8G_ESC_END // end of sequence +}; + +void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev){ + u8g_SetChipSelect(u8g, dev, 1); + u8g_Delay(1); + u8g_SetAddress(u8g, dev, 0); // cmd mode + u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off + u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active + for (uint8_t y = 0; y < (HEIGHT) / 2; y++) { //clear GDRAM + u8g_WriteByte(u8g, dev, 0x80 | y); //set y + u8g_WriteByte(u8g, dev, 0x80); //set x = 0 + u8g_SetAddress(u8g, dev, 1); /* data mode */ + for (uint8_t i = 0; i < 2 * (WIDTH) / 8; i++) //2x width clears both segments + u8g_WriteByte(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + } + + u8g_WriteByte(u8g, dev, 0x0C); //display on, cursor+blink off + + u8g_SetChipSelect(u8g, dev, 0); +} + +uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); + clear_graphics_DRAM(u8g, dev); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + uint8_t y, i; + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetChipSelect(u8g, dev, 1); + y = pb->p.page_y0; + ptr = (uint8_t *)pb->buf; + for (i = 0; i < 8; i ++) { + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + + if (y < 32) { + u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + } + else { + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + } + + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, WIDTH/8, ptr); + ptr += WIDTH/8; + y++; + } + u8g_SetChipSelect(u8g, dev, 0); + } + break; + } + return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); + clear_graphics_DRAM(u8g, dev); + break; + + case U8G_DEV_MSG_STOP: + break; + + case U8G_DEV_MSG_PAGE_NEXT: { + uint8_t y, i; + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetChipSelect(u8g, dev, 1); + y = pb->p.page_y0; + ptr = (uint8_t *)pb->buf; + for (i = 0; i < 32; i ++) { + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + + if (y < 32) { + u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + } + else { + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + } + + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, WIDTH/8, ptr); + ptr += WIDTH/8; + y++; + } + u8g_SetChipSelect(u8g, dev, 0); + } + break; + } + return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_SW_SPI); + +#define QWIDTH (WIDTH*4) +uint8_t u8g_dev_st7920_128x64_HAL_4x_buf[QWIDTH] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_st7920_128x64_HAL_4x_pb = { {32, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7920_128x64_HAL_4x_buf}; +u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; + +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); +u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; + +#if defined(U8G_HAL_LINKS) || defined(__SAM3X8E__) + // Also use this device for HAL version of rrd class. This results in the same device being used + // for the ST7920 for HAL systems no matter what is selected in ultralcd_impl_DOGM.h. + u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; +#endif + +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp new file mode 100644 index 0000000000..e58bb34fae --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017, 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + + +/* + + based on u8g_dev_uc1701_mini12864_HAL.c (dealextreme) + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ + U8G_ESC_CS(1), /* enable chip */ + + 0x0E2, /* soft reset */ + 0x040, /* set display start line to 0 */ + 0x0A0, /* ADC set to reverse */ + 0x0C8, /* common output mode */ + 0x0A6, /* display normal, bit val 0: LCD pixel off. */ + 0x0A2, /* LCD bias 1/9 */ + 0x02F, /* all power control circuits on */ + 0x0F8, /* set booster ratio to */ + 0x000, /* 4x */ + 0x023, /* set V0 voltage resistor ratio to large */ + 0x081, /* set contrast */ + 0x027, /* contrast value */ + 0x0AC, /* indicator */ + 0x000, /* disable */ + 0x0AF, /* display on */ + + U8G_ESC_DLY(100), /* delay 100 ms */ + 0x0A5, /* display all points, ST7565 */ + U8G_ESC_DLY(100), /* delay 100 ms */ + U8G_ESC_DLY(100), /* delay 100 ms */ + 0x0A4, /* normal display */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x010, /* set upper 4 bit of the col adr to 0 */ + 0x000, /* set lower 4 bit of the col adr to 4 */ + U8G_ESC_END /* end of sequence */ +}; + +uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) + return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch(msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page+1)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_uc1701_mini12864_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_uc1701_mini12864_HAL_fn, U8G_COM_HAL_SW_SPI_FN); +U8G_PB_DEV(u8g_dev_uc1701_mini12864_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_uc1701_mini12864_HAL_fn, U8G_COM_HAL_HW_SPI_FN); + +uint8_t u8g_dev_uc1701_mini12864_HAL_2x_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_uc1701_mini12864_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1701_mini12864_HAL_2x_buf}; +u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; +u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_hw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; + +#endif // DOGLCD \ No newline at end of file diff --git a/Marlin/ultralcd_st7920_u8glib_rrd.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp similarity index 80% rename from Marlin/ultralcd_st7920_u8glib_rrd.h rename to Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index 3b379726f2..8e176b8a01 100644 --- a/Marlin/ultralcd_st7920_u8glib_rrd.h +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -20,10 +20,16 @@ * */ -#ifndef ULCDST7920_H -#define ULCDST7920_H +// NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the +// file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include +#include "../../inc/MarlinConfig.h" + +#if ENABLED(U8GLIB_ST7920) + +#if !(defined(U8G_HAL_LINKS) || defined(__SAM3X8E__)) + +#include "../../HAL/Delay.h" #define ST7920_CLK_PIN LCD_PINS_D4 #define ST7920_DAT_PIN LCD_PINS_ENABLE @@ -36,34 +42,40 @@ #define LCD_PIXEL_WIDTH 128 #define LCD_PIXEL_HEIGHT 64 +#include + //set optimization so ARDUINO optimizes this file #pragma GCC optimize (3) // If you want you can define your own set of delays in Configuration.h -//#define ST7920_DELAY_1 DELAY_0_NOP -//#define ST7920_DELAY_2 DELAY_0_NOP -//#define ST7920_DELAY_3 DELAY_0_NOP +//#define ST7920_DELAY_1 DELAY_NS(0) +//#define ST7920_DELAY_2 DELAY_NS(0) +//#define ST7920_DELAY_3 DELAY_NS(0) #if F_CPU >= 20000000 - #define CPU_ST7920_DELAY_1 DELAY_0_NOP - #define CPU_ST7920_DELAY_2 DELAY_0_NOP - #define CPU_ST7920_DELAY_3 DELAY_1_NOP + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(50) #elif MB(3DRAG) || MB(K8200) || MB(K8400) || MB(SILVER_GATE) - #define CPU_ST7920_DELAY_1 DELAY_0_NOP - #define CPU_ST7920_DELAY_2 DELAY_3_NOP - #define CPU_ST7920_DELAY_3 DELAY_0_NOP + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(188) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) #elif MB(MINIRAMBO) - #define CPU_ST7920_DELAY_1 DELAY_0_NOP - #define CPU_ST7920_DELAY_2 DELAY_4_NOP - #define CPU_ST7920_DELAY_3 DELAY_0_NOP + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(250) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) #elif MB(RAMBO) - #define CPU_ST7920_DELAY_1 DELAY_0_NOP - #define CPU_ST7920_DELAY_2 DELAY_0_NOP - #define CPU_ST7920_DELAY_3 DELAY_0_NOP + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(BQ_ZUM_MEGA_3D) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(189) #elif F_CPU == 16000000 - #define CPU_ST7920_DELAY_1 DELAY_0_NOP - #define CPU_ST7920_DELAY_2 DELAY_0_NOP - #define CPU_ST7920_DELAY_3 DELAY_1_NOP + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(63) #else #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd.h'" #endif @@ -95,10 +107,10 @@ static void ST7920_SWSPI_SND_8BIT(uint8_t val) { ST7920_SND_BIT; // 8 } -#if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0 - #define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US) +#if DOGM_SPI_DELAY_US > 0 + #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) #else - #define U8G_DELAY() u8g_10MicroDelay() + #define U8G_DELAY() DELAY_US(10) #endif #define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } @@ -178,11 +190,6 @@ uint8_t u8g_dev_st7920_128x64_rrd_buf[(LCD_PIXEL_WIDTH) * (PAGE_HEIGHT) / 8] U u8g_pb_t u8g_dev_st7920_128x64_rrd_pb = {{PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0}, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf}; u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = {u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn}; -class U8GLIB_ST7920_128X64_RRD : public U8GLIB { - public: - U8GLIB_ST7920_128X64_RRD(uint8_t dummy) : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi) { UNUSED(dummy); } -}; - #if ENABLED(LIGHTWEIGHT_UI) // We have to include the code for the lightweight UI here // as it relies on macros that are only defined in this file. @@ -191,4 +198,6 @@ class U8GLIB_ST7920_128X64_RRD : public U8GLIB { #pragma GCC reset_options -#endif // ULCDST7920_H +#endif // U8G_HAL_LINKS + +#endif // U8GLIB_ST7920 diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp new file mode 100644 index 0000000000..08afb2ed8a --- /dev/null +++ b/Marlin/src/lcd/fontutils.cpp @@ -0,0 +1,183 @@ +/** + * @file fontutils.cpp + * @brief help functions for font and char + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(ULTRA_LCD) +#include "ultralcd.h" +#include "../Marlin.h" +#endif + +#include "fontutils.h" + +uint8_t read_byte_ram(uint8_t * str) { + return *str; +} + +uint8_t read_byte_rom(uint8_t * str) { + return pgm_read_byte(str); +} + +/** + * @brief Using binary search to find the position by data_pin + * + * @param userdata : User's data + * @param num_data : the item number of the sorted data + * @param cb_comp : the callback function to compare the user's data and pin + * @param data_pin : The reference data to be found + * @param ret_idx : the position of the required data; If failed, then it is the failed position, which is the insert position if possible. + * + * @return 0 on found, <0 on failed(fail position is saved by ret_idx) + * + * Using binary search to find the position by data_pin. The user's data should be sorted. + */ +int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, void *data_pinpoint, size_t *ret_idx) { + int retcomp; + + if (num_data < 1) { + *ret_idx = 0; + return -1; + } + + size_t i = 0, ileft = 1, iright = num_data; + bool flg_found = false; + for (; ileft <= iright;) { + i = (ileft + iright) / 2 - 1; + /* cb_comp should return the *userdata[i] - *data_pinpoint */ + retcomp = cb_comp (userdata, i, data_pinpoint); + if (retcomp > 0) + iright = i; + else if (retcomp < 0) + ileft = i + 2; + else { + /* found ! */ + flg_found = true; + break; + } + } + + if (flg_found) { + *ret_idx = i; + return 0; + } + if (iright <= i) + *ret_idx = i; + else if (ileft >= i + 2) + *ret_idx = i + 1; + return -1; +} + +/* This function gets the character at the pstart position, interpreting UTF8 multybyte sequences + and returns the pointer to the next character */ +uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval) { + uint32_t val = 0; + uint8_t *p = pstart; + + uint8_t valcur = cb_read_byte(p); + if (0 == (0x80 & valcur)) { + val = valcur; + p++; + } + else if (0xC0 == (0xE0 & valcur)) { + val = valcur & 0x1F; + val <<= 6; + p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xE0 == (0xF0 & valcur)) { + val = valcur & 0x0F; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xF0 == (0xF8 & valcur)) { + val = valcur & 0x07; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xF8 == (0xFC & valcur)) { + val = valcur & 0x03; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xFC == (0xFE & valcur)) { + val = valcur & 0x01; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0x80 == (0xC0 & valcur)) + for (; 0x80 == (0xC0 & valcur); ) { p++; valcur = cb_read_byte(p); } + else + for (; ((0xFE & valcur) > 0xFC); ) { p++; valcur = cb_read_byte(p); } + + if (pval) *pval = val; + + return p; +} + +static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_byte) { + + uint8_t cnt = 0; + uint8_t *pnext = (uint8_t *)pstart; + for (;;) { + wchar_t ch; + pnext = get_utf8_value_cb(pnext, cb_read_byte, &ch); + if (!ch) break; + cnt++; + } + return cnt; +} + +uint8_t utf8_strlen(const char *pstart) { + return utf8_strlen_cb(pstart, read_byte_ram); +} + +uint8_t utf8_strlen_P(const char *pstart) { + return utf8_strlen_cb(pstart, read_byte_rom); +} + diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h new file mode 100644 index 0000000000..e226d0e52c --- /dev/null +++ b/Marlin/src/lcd/fontutils.h @@ -0,0 +1,48 @@ +/** + * @file fontutils.h + * @brief help functions for font and char + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ +#ifndef _FONT_UTILS_H +#define _FONT_UTILS_H + +#include +#include "../core/macros.h" +#include // wchar_t +#include // uint32_t + +// read a byte from ROM or RAM +typedef uint8_t (*read_byte_cb_t)(uint8_t * str); + +uint8_t read_byte_ram(uint8_t * str); +uint8_t read_byte_rom(uint8_t * str); + +// there's overflow of the wchar_t due to the 2-byte size in Arduino +// sizeof(wchar_t)=2; sizeof(size_t)=2; sizeof(uint32_t)=4; +// sizeof(int)=2; sizeof(long)=4; sizeof(unsigned)=2; +//#undef wchar_t +#define wchar_t uint32_t +//typedef uint32_t wchar_t; + +#ifndef NUM_ARRAY + #define NUM_ARRAY(a) (sizeof(a)/sizeof((a)[0])) +#endif + +typedef uint16_t pixel_len_t; +#define PIXEL_LEN_NOLIMIT ((pixel_len_t)(-1)) + +/* Perform binary search */ +typedef int (* pf_bsearch_cb_comp_t)(void *userdata, size_t idx, void * data_pin); /*"data_list[idx] - *data_pin"*/ +int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, void *data_pinpoint, size_t *ret_idx); + +/* Get the character, decoding multibyte UTF8 characters and returning a pointer to the start of the next UTF8 character */ +uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval); + +/* Returns lenght of string in CHARACTERS, NOT BYTES */ +uint8_t utf8_strlen(const char *pstart); +uint8_t utf8_strlen_P(const char *pstart); + +#endif // _FONT_UTILS_H diff --git a/Marlin/language_an.h b/Marlin/src/lcd/language/language_an.h similarity index 100% rename from Marlin/language_an.h rename to Marlin/src/lcd/language/language_an.h diff --git a/Marlin/language_bg.h b/Marlin/src/lcd/language/language_bg.h similarity index 99% rename from Marlin/language_bg.h rename to Marlin/src/lcd/language/language_bg.h index 8edeed405f..2bd7c7e2be 100644 --- a/Marlin/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_BG_H #define LANGUAGE_BG_H -#define MAPPER_D0D1 // For Cyrillic #define DISPLAY_CHARSET_ISO10646_5 #define CHARSIZE 2 diff --git a/Marlin/language_ca.h b/Marlin/src/lcd/language/language_ca.h similarity index 99% rename from Marlin/language_ca.h rename to Marlin/src/lcd/language/language_ca.h index 7aa5f00298..dd1c8117fb 100644 --- a/Marlin/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -30,8 +30,6 @@ #ifndef LANGUAGE_CA_H #define LANGUAGE_CA_H -#define MAPPER_C2C3 // because of "ó" -#define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 #define WELCOME_MSG MACHINE_NAME _UxGT(" preparada.") diff --git a/Marlin/language_cz_utf8.h b/Marlin/src/lcd/language/language_cz.h similarity index 99% rename from Marlin/language_cz_utf8.h rename to Marlin/src/lcd/language/language_cz.h index 49ea9bd17e..bb79f68181 100644 --- a/Marlin/language_cz_utf8.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -35,7 +35,6 @@ #ifndef LANGUAGE_CZ_UTF_H #define LANGUAGE_CZ_UTF_H -#define MAPPER_C3C4C5_CZ #define DISPLAY_CHARSET_ISO10646_CZ #define CHARSIZE 2 @@ -149,8 +148,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL PostupnÄ›") #define MSG_LED_CONTROL _UxGT("LED Nastavení") -#define MSG_LEDS_ON _UxGT("SvÄ›tla Zap") -#define MSG_LEDS_OFF _UxGT("SvÄ›tla Vyp") +#define MSG_LEDS _UxGT("SvÄ›tla") #define MSG_LED_PRESETS _UxGT("SvÄ›tla PÅ™edvolby") #define MSG_SET_LEDS_RED _UxGT("ÄŒervená") #define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") diff --git a/Marlin/language_da.h b/Marlin/src/lcd/language/language_da.h similarity index 99% rename from Marlin/language_da.h rename to Marlin/src/lcd/language/language_da.h index 1bd2b02df6..af09e174a0 100644 --- a/Marlin/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_DA_H #define LANGUAGE_DA_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 diff --git a/Marlin/language_de.h b/Marlin/src/lcd/language/language_de.h similarity index 99% rename from Marlin/language_de.h rename to Marlin/src/lcd/language/language_de.h index e2d11f6fc9..67b79d7b57 100644 --- a/Marlin/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -30,8 +30,6 @@ #ifndef LANGUAGE_DE_H #define LANGUAGE_DE_H -#define MAPPER_C2C3 -#define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 #define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("ÄäÖöÜüß²³") @@ -311,8 +309,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Schrittweises UBL") #define MSG_LED_CONTROL _UxGT("LED Kontrolle") -#define MSG_LEDS_ON _UxGT("Licht an") -#define MSG_LEDS_OFF _UxGT("Licht aus") +#define MSG_LEDS _UxGT("Licht") #define MSG_LED_PRESETS _UxGT("Licht Einstellungen") #define MSG_SET_LEDS_RED _UxGT("Rot") #define MSG_SET_LEDS_ORANGE _UxGT("Orange") diff --git a/Marlin/language_el-gr.h b/Marlin/src/lcd/language/language_el-gr.h similarity index 99% rename from Marlin/language_el-gr.h rename to Marlin/src/lcd/language/language_el-gr.h index 89ac76eb03..90b44849de 100644 --- a/Marlin/language_el-gr.h +++ b/Marlin/src/lcd/language/language_el-gr.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_EL_GR_H #define LANGUAGE_EL_GR_H -#define MAPPER_CECF #define DISPLAY_CHARSET_ISO10646_GREEK #define CHARSIZE 2 diff --git a/Marlin/language_el.h b/Marlin/src/lcd/language/language_el.h similarity index 99% rename from Marlin/language_el.h rename to Marlin/src/lcd/language/language_el.h index 8cfda5a171..9fc326c440 100644 --- a/Marlin/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_EL_H #define LANGUAGE_EL_H -#define MAPPER_CECF #define DISPLAY_CHARSET_ISO10646_GREEK #define CHARSIZE 2 diff --git a/Marlin/language_en.h b/Marlin/src/lcd/language/language_en.h similarity index 98% rename from Marlin/language_en.h rename to Marlin/src/lcd/language/language_en.h index 03483d6148..0d65224094 100644 --- a/Marlin/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -371,11 +371,8 @@ #ifndef MSG_LED_CONTROL #define MSG_LED_CONTROL _UxGT("LED Control") #endif -#ifndef MSG_LEDS_ON - #define MSG_LEDS_ON _UxGT("Lights On") -#endif -#ifndef MSG_LEDS_OFF - #define MSG_LEDS_OFF _UxGT("Lights Off") +#ifndef MSG_LEDS + #define MSG_LEDS _UxGT("Lights") #endif #ifndef MSG_LED_PRESETS #define MSG_LED_PRESETS _UxGT("Light Presets") @@ -471,6 +468,14 @@ #ifndef MSG_EXTRA_FAN_SPEED #define MSG_EXTRA_FAN_SPEED _UxGT("Extra fan speed") #endif + +#ifndef MSG_LASER_ON + #define MSG_LASER_ON _UxGT("Laser On") +#endif +#ifndef MSG_LASER_OFF + #define MSG_LASER_OFF _UxGT("Laser Off") +#endif + #ifndef MSG_FLOW #define MSG_FLOW _UxGT("Flow") #endif @@ -540,6 +545,9 @@ #ifndef MSG_VE_JERK #define MSG_VE_JERK _UxGT("Ve-jerk") #endif +#ifndef MSG_JUNCTION_DEVIATION + #define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") +#endif #ifndef MSG_VELOCITY #define MSG_VELOCITY _UxGT("Velocity") #endif diff --git a/Marlin/language_es.h b/Marlin/src/lcd/language/language_es.h similarity index 80% rename from Marlin/language_es.h rename to Marlin/src/lcd/language/language_es.h index cbff5ee08e..8ad5f3c2fe 100644 --- a/Marlin/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -27,22 +27,21 @@ * See also http://marlinfw.org/docs/development/lcd_language.html * */ -#ifndef LANGUAGE_ES_H -#define LANGUAGE_ES_H +#ifndef LANGUAGE_ES_UTF_H +#define LANGUAGE_ES_UTF_H #define DISPLAY_CHARSET_ISO10646_1 -#define NOT_EXTENDED_ISO10646_1_5X7 #define CHARSIZE 2 #define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") -#define MSG_BACK _UxGT("Atras") +#define MSG_BACK _UxGT("Atrás") #define MSG_SD_INSERTED _UxGT("Tarjeta colocada") #define MSG_SD_REMOVED _UxGT("Tarjeta retirada") #define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menu principal") -#define MSG_AUTOSTART _UxGT("Inicio automatico") +#define MSG_MAIN _UxGT("Menú principal") +#define MSG_AUTOSTART _UxGT("Inicio automático") #define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") -#define MSG_DEBUG_MENU _UxGT("Menu depurar") +#define MSG_DEBUG_MENU _UxGT("Menú depurar") #define MSG_PROGRESS_BAR_TEST _UxGT("Prueba barra avance") #define MSG_AUTO_HOME _UxGT("Llevar al origen") #define MSG_AUTO_HOME_X _UxGT("Origen X") @@ -51,30 +50,30 @@ #define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") #define MSG_LEVEL_BED_WAITING _UxGT("Iniciar (Presione)") #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Siguiente punto") -#define MSG_LEVEL_BED_DONE _UxGT("Nivelacion lista!") +#define MSG_LEVEL_BED_DONE _UxGT("Nivelación lista!") #define MSG_SET_HOME_OFFSETS _UxGT("Ajustar desfases") #define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicado") #define MSG_SET_ORIGIN _UxGT("Establecer origen") #define MSG_PREHEAT_1 _UxGT("Precalentar PLA") #define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT("Todo") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Todo") #define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT("Plataforma") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT("Config") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Cama") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Config") #define MSG_PREHEAT_2 _UxGT("Precalentar ABS") #define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT("Todo") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Todo") #define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT("Plataforma") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT("Config") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Cama") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Config") #define MSG_COOLDOWN _UxGT("Enfriar") #define MSG_SWITCH_PS_ON _UxGT("Encender") #define MSG_SWITCH_PS_OFF _UxGT("Apagar") #define MSG_EXTRUDE _UxGT("Extruir") #define MSG_RETRACT _UxGT("Retraer") #define MSG_MOVE_AXIS _UxGT("Mover ejes") -#define MSG_BED_LEVELING _UxGT("Nivelar plataforma") -#define MSG_LEVEL_BED _UxGT("Nivelar plataforma") +#define MSG_BED_LEVELING _UxGT("Nivelar cama") +#define MSG_LEVEL_BED _UxGT("Nivelar cama") #define MSG_MOVING _UxGT("Moviendo...") #define MSG_FREE_XY _UxGT("Libre XY") #define MSG_MOVE_X _UxGT("Mover X") @@ -85,9 +84,9 @@ #define MSG_MOVE_1MM _UxGT("Mover 1mm") #define MSG_MOVE_10MM _UxGT("Mover 10mm") #define MSG_SPEED _UxGT("Velocidad") -#define MSG_BED_Z _UxGT("Plataforma Z") +#define MSG_BED_Z _UxGT("Cama Z") #define MSG_NOZZLE _UxGT("Boquilla") -#define MSG_BED _UxGT("Plataforma") +#define MSG_BED _UxGT("Cama") #define MSG_FAN_SPEED _UxGT("Ventilador") #define MSG_FLOW _UxGT("Flujo") #define MSG_CONTROL _UxGT("Control") @@ -102,21 +101,11 @@ #define MSG_PID_D _UxGT("PID-D") #define MSG_PID_C _UxGT("PID-C") #define MSG_SELECT _UxGT("Seleccionar") -#define MSG_ACC _UxGT("Aceleracion") +#define MSG_ACC _UxGT("Aceleración") #define MSG_JERK _UxGT("Jerk") -#if IS_SCARA - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#elif IS_DELTA - #define MSG_VA_JERK _UxGT("Va-jerk") - #define MSG_VB_JERK _UxGT("Vb-jerk") - #define MSG_VC_JERK _UxGT("Vc-jerk") -#else - #define MSG_VA_JERK _UxGT("Vx-jerk") - #define MSG_VB_JERK _UxGT("Vy-jerk") - #define MSG_VC_JERK _UxGT("Vz-jerk") -#endif +#define MSG_VX_JERK _UxGT("Vx-jerk") +#define MSG_VY_JERK _UxGT("Vy-jerk") +#define MSG_VZ_JERK _UxGT("Vz-jerk") #define MSG_VE_JERK _UxGT("Ve-jerk") #define MSG_VMAX _UxGT("Vmax") #define MSG_VMIN _UxGT("Vmin") @@ -126,19 +115,9 @@ #define MSG_A_RETRACT _UxGT("Acel. retrac.") #define MSG_A_TRAVEL _UxGT("Acel. Viaje") #define MSG_STEPS_PER_MM _UxGT("Pasos/mm") -#if IS_SCARA - #define MSG_ASTEPS _UxGT("A pasos/deg") - #define MSG_BSTEPS _UxGT("B pasos/deg") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#elif IS_DELTA - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#else - #define MSG_ASTEPS _UxGT("X pasos/mm") - #define MSG_BSTEPS _UxGT("Y pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#endif +#define MSG_XSTEPS _UxGT("X pasos/mm") +#define MSG_YSTEPS _UxGT("Y pasos/mm") +#define MSG_ZSTEPS _UxGT("Z pasos/mm") #define MSG_ESTEPS _UxGT("E pasos/mm") #define MSG_E1STEPS _UxGT("E1 pasos/mm") #define MSG_E2STEPS _UxGT("E2 pasos/mm") @@ -156,17 +135,17 @@ #define MSG_LOAD_EEPROM _UxGT("Cargar memoria") #define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") #define MSG_REFRESH _UxGT("Volver a cargar") -#define MSG_WATCH _UxGT("Informacion") +#define MSG_WATCH _UxGT("Información") #define MSG_PREPARE _UxGT("Preparar") #define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impresion") -#define MSG_RESUME_PRINT _UxGT("Reanudar impresion") -#define MSG_STOP_PRINT _UxGT("Detener impresion") -#define MSG_CARD_MENU _UxGT("Menu de SD") +#define MSG_PAUSE_PRINT _UxGT("Pausar impresión") +#define MSG_RESUME_PRINT _UxGT("Reanudar impresión") +#define MSG_STOP_PRINT _UxGT("Detener impresión") +#define MSG_CARD_MENU _UxGT("Menú de SD") #define MSG_NO_CARD _UxGT("No hay tarjeta SD") #define MSG_DWELL _UxGT("Reposo...") -#define MSG_USERWAIT _UxGT("Esperando ordenes") -#define MSG_PRINT_ABORTED _UxGT("Impresion cancelada") +#define MSG_USERWAIT _UxGT("Esperando órdenes") +#define MSG_PRINT_ABORTED _UxGT("Impresión cancelada") #define MSG_NO_MOVE _UxGT("Sin movimiento") #define MSG_KILLED _UxGT("Parada de emergencia") #define MSG_STOPPED _UxGT("Detenida") @@ -177,7 +156,7 @@ #define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Interc. DesRet mm") #define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") -#define MSG_AUTORETRACT _UxGT("Retraccion Auto.") +#define MSG_AUTORETRACT _UxGT("Retracción Auto.") #define MSG_FILAMENTCHANGE _UxGT("Cambiar filamento") #define MSG_INIT_SDCARD _UxGT("Iniciando tarjeta") #define MSG_CNG_SDCARD _UxGT("Cambiar tarjeta") @@ -185,7 +164,7 @@ #define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Prueba") #define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") #define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("inic.") +#define MSG_FIRST _UxGT("primero") #define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") #define MSG_BABYSTEP_X _UxGT("Micropaso X") #define MSG_BABYSTEP_Y _UxGT("Micropaso Y") @@ -194,10 +173,10 @@ #define MSG_HEATING_FAILED_LCD _UxGT("Error: al calentar") #define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") #define MSG_THERMAL_RUNAWAY _UxGT("Error: temperatura") -#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Maxima") -#define MSG_ERR_MINTEMP _UxGT("Error: Temp Minima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max Plat") -#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min Plat") +#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Máxima") +#define MSG_ERR_MINTEMP _UxGT("Error: Temp Mínima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max Cama") +#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min Cama") #define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST #define MSG_HALTED _UxGT("IMPRESORA PARADA") #define MSG_PLEASE_RESET _UxGT("Por favor, reinicie") @@ -205,17 +184,17 @@ #define MSG_SHORT_HOUR _UxGT("h") // One character only #define MSG_SHORT_MINUTE _UxGT("m") // One character only #define MSG_HEATING _UxGT("Calentando...") -#define MSG_BED_HEATING _UxGT("Calentando Plat...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibracion Delta") +#define MSG_BED_HEATING _UxGT("Calentando Cama...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibración Delta") #define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") #define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") #define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") #define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibracion") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibración") #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Est. Altura Delta") #define MSG_INFO_MENU _UxGT("Inf. Impresora") #define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_STATS_MENU _UxGT("Estadisticas Imp.") +#define MSG_INFO_STATS_MENU _UxGT("Estadísticas Imp.") #define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") #define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") #define MSG_INFO_EXTRUDERS _UxGT("Extrusores") @@ -224,36 +203,38 @@ #define MSG_CASE_LIGHT _UxGT("Luz cabina") #if LCD_WIDTH > 19 - #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresion") + #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresión") #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total de imp.") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impresion mas larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusion") + #define MSG_INFO_PRINT_LONGEST _UxGT("Impresión más larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusión") #else #define MSG_INFO_PRINT_COUNT _UxGT("Impresiones") #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Mas larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusion") + #define MSG_INFO_PRINT_LONGEST _UxGT("Más larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusión") #endif -#define MSG_INFO_MIN_TEMP _UxGT("Temperatura minima") -#define MSG_INFO_MAX_TEMP _UxGT("Temperatura maxima") +#define MSG_INFO_MIN_TEMP _UxGT("Temperatura mínima") +#define MSG_INFO_MAX_TEMP _UxGT("Temperatura máxima") #define MSG_INFO_PSU _UxGT("Fuente de poder") #define MSG_DRIVE_STRENGTH _UxGT("Potencia driver") #define MSG_DAC_PERCENT _UxGT("Driver %") #define MSG_DAC_EEPROM_WRITE _UxGT("Escribe DAC EEPROM") -#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPR. PAUSADA") +#define MSG_FILAMENT_CHANGE_HEADER _UxGT("IMPR. PAUSADA") #define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPC. REINICIO:") +#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extruir más") #define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") +#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp Mínima es ") #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando iniciar") #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el boton") +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el botón") #if LCD_HEIGHT >= 4 // Up to 3 lines allowed @@ -270,11 +251,13 @@ #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamento expulsado") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado por") #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Cargar filamento") +#define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperado por") +#define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("Extruir filamento") #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.") #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir") -#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima boton para") +#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima botón para") #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Calentar la boquilla") #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando boquilla") #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espere por favor") -#endif // LANGUAGE_ES_H +#endif // LANGUAGE_ES_UTF_H diff --git a/Marlin/language_eu.h b/Marlin/src/lcd/language/language_eu.h similarity index 99% rename from Marlin/language_eu.h rename to Marlin/src/lcd/language/language_eu.h index d6e51bc250..c28eaa6f94 100644 --- a/Marlin/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -142,8 +142,7 @@ //#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") //#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") #define MSG_LED_CONTROL _UxGT("LED ezarpenak") -#define MSG_LEDS_ON _UxGT("Argiak piztu") -#define MSG_LEDS_OFF _UxGT("Argiak itzali") +#define MSG_LEDS _UxGT("Argiak") #define MSG_LED_PRESETS _UxGT("Argi aurrehautaketak") #define MSG_SET_LEDS_RED _UxGT("Gorria") #define MSG_SET_LEDS_ORANGE _UxGT("Laranja") diff --git a/Marlin/language_fi.h b/Marlin/src/lcd/language/language_fi.h similarity index 99% rename from Marlin/language_fi.h rename to Marlin/src/lcd/language/language_fi.h index 70ef4cf90a..383e2d03a3 100644 --- a/Marlin/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_FI_H #define LANGUAGE_FI_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 diff --git a/Marlin/language_fr_utf8.h b/Marlin/src/lcd/language/language_fr.h similarity index 99% rename from Marlin/language_fr_utf8.h rename to Marlin/src/lcd/language/language_fr.h index a54fb76c23..9b05a05e82 100644 --- a/Marlin/language_fr_utf8.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_FR_UTF_H #define LANGUAGE_FR_UTF_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 @@ -145,8 +144,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Pas à pas") #define MSG_LED_CONTROL _UxGT("Contrôle LED") -#define MSG_LEDS_ON _UxGT("Lumière ON") -#define MSG_LEDS_OFF _UxGT("Lumière OFF") +#define MSG_LEDS _UxGT("Lumière") #define MSG_LED_PRESETS _UxGT("Préregl. LED") #define MSG_SET_LEDS_RED _UxGT("Rouge") #define MSG_SET_LEDS_ORANGE _UxGT("Orange") @@ -295,6 +293,7 @@ #define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP. MAX LIT") #define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP. MIN LIT") #define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST + #define MSG_HALTED _UxGT("IMPR. STOPPÉE") #define MSG_PLEASE_RESET _UxGT("RàZ. SVP") #define MSG_SHORT_DAY _UxGT("j") // One character only diff --git a/Marlin/language_gl.h b/Marlin/src/lcd/language/language_gl.h similarity index 99% rename from Marlin/language_gl.h rename to Marlin/src/lcd/language/language_gl.h index b97a414417..24e7c81301 100644 --- a/Marlin/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_GL_H #define LANGUAGE_GL_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 diff --git a/Marlin/language_hr.h b/Marlin/src/lcd/language/language_hr.h similarity index 100% rename from Marlin/language_hr.h rename to Marlin/src/lcd/language/language_hr.h diff --git a/Marlin/language_it.h b/Marlin/src/lcd/language/language_it.h similarity index 99% rename from Marlin/language_it.h rename to Marlin/src/lcd/language/language_it.h index 1439d3e5c6..cc18859085 100644 --- a/Marlin/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_IT_H #define LANGUAGE_IT_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") @@ -144,8 +143,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo passo") #define MSG_LED_CONTROL _UxGT("Controllo LED") -#define MSG_LEDS_ON _UxGT("Luci On") -#define MSG_LEDS_OFF _UxGT("Luci Off") +#define MSG_LEDS _UxGT("Luci") #define MSG_LED_PRESETS _UxGT("Preset luci") #define MSG_SET_LEDS_RED _UxGT("Rosso") #define MSG_SET_LEDS_ORANGE _UxGT("Arancione") @@ -301,6 +299,7 @@ #define MSG_SHORT_MINUTE _UxGT("m") // One character only #define MSG_HEATING _UxGT("Riscaldamento...") #define MSG_COOLING _UxGT("Raffreddamento..") +#define MSG_COOLING_COMPLETE _UxGT("Raff.completato.") #define MSG_BED_HEATING _UxGT("Risc. piatto...") #define MSG_BED_COOLING _UxGT("Raffr. piatto...") #define MSG_DELTA_CALIBRATE _UxGT("Calibraz. Delta") diff --git a/Marlin/language_kana_utf8.h b/Marlin/src/lcd/language/language_jp-kana.h similarity index 98% rename from Marlin/language_kana_utf8.h rename to Marlin/src/lcd/language/language_jp-kana.h index f33432532f..8d71925f90 100644 --- a/Marlin/language_kana_utf8.h +++ b/Marlin/src/lcd/language/language_jp-kana.h @@ -32,7 +32,6 @@ #ifndef LANGUAGE_KANA_UTF_H #define LANGUAGE_KANA_UTF_H -#define MAPPER_E382E383 #define DISPLAY_CHARSET_ISO10646_KANA #define CHARSIZE 3 @@ -78,7 +77,7 @@ #define MSG_MOVE_AXIS _UxGT("ジクイドウ") // "Move axis" #define MSG_BED_LEVELING _UxGT("ベッドレベリング") // "Bed leveling" #define MSG_LEVEL_BED _UxGT("ベッドレベリング") // "Level bed" -#define MSG_MOVING _UxGT("イドウãƒãƒ¥ã‚¦...") // "Moving..." +#define MSG_MOVING _UxGT("イドウãƒãƒ¥ã‚¦") // "Moving..." #define MSG_FREE_XY _UxGT("XYジク カイホウ") // "Free XY" #define MSG_MOVE_X _UxGT("Xジク イドウ") // "Move X" #define MSG_MOVE_Y _UxGT("Yジク イドウ") // "Move Y" @@ -142,8 +141,8 @@ #define MSG_STOP_PRINT _UxGT("プリントテイシ") // "Stop print" #define MSG_CARD_MENU _UxGT("SDカードカラプリント") // "Print from SD" #define MSG_NO_CARD _UxGT("SDカードガアリマセン") // "No SD card" -#define MSG_DWELL _UxGT("キュウシ...") // "Sleep..." -#define MSG_USERWAIT _UxGT("ã‚·ãƒãƒ©ã‚¯ã‚ªãƒžãƒã‚¯ãƒ€ã‚µã‚¤...") // "Wait for user..." +#define MSG_DWELL _UxGT("キュウシ") // "Sleep..." +#define MSG_USERWAIT _UxGT("ã‚·ãƒãƒ©ã‚¯ã‚ªãƒžãƒã‚¯ãƒ€ã‚µã‚¤") // "Wait for user..." #define MSG_PRINT_ABORTED _UxGT("プリントガãƒãƒ¥ã‚¦ã‚·ã‚µãƒ¬ãƒžã‚·ã‚¿") // "Print aborted" #define MSG_NO_MOVE _UxGT("ウゴキマセン") // "No move." #define MSG_KILLED _UxGT("ヒジョウテイシ") // "KILLED. " @@ -176,14 +175,14 @@ #define MSG_ERR_MINTEMP _UxGT("エラー:サイテイオンミマン") // "Err: MINTEMP" #define MSG_ERR_MAXTEMP_BED _UxGT("エラー:ベッド サイコウオンãƒãƒ§ã‚¦ã‚«") // "Err: MAXTEMP BED" #define MSG_ERR_MINTEMP_BED _UxGT("エラー:ベッド サイテイオンミマン") // "Err: MINTEMP BED" -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST // "G28 Z Forbidden" +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST // "Home XY first" #define MSG_HALTED _UxGT("プリンターãƒãƒ†ã‚¤ã‚·ã‚·ãƒžã‚·ã‚¿") // "PRINTER HALTED" #define MSG_PLEASE_RESET _UxGT("リセットシテクダサイ") // "Please reset" #define MSG_SHORT_DAY _UxGT("d") // One character only #define MSG_SHORT_HOUR _UxGT("h") // One character only #define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("ã‚«ãƒãƒ„ãƒãƒ¥ã‚¦...") // "Heating..." -#define MSG_BED_HEATING _UxGT("ベッド ã‚«ãƒãƒ„ãƒãƒ¥ã‚¦...") // "Bed Heating..." +#define MSG_HEATING _UxGT("ã‚«ãƒãƒ„ãƒãƒ¥ã‚¦") // "Heating..." +#define MSG_BED_HEATING _UxGT("ベッド ã‚«ãƒãƒ„ãƒãƒ¥ã‚¦") // "Bed Heating..." #define MSG_DELTA_CALIBRATE _UxGT("デルタ コウセイ") // "Delta Calibration" #define MSG_DELTA_CALIBRATE_X _UxGT("Xジク コウセイ") // "Calibrate X" #define MSG_DELTA_CALIBRATE_Y _UxGT("Yジク コウセイ") // "Calibrate Y" diff --git a/Marlin/language_nl.h b/Marlin/src/lcd/language/language_nl.h similarity index 100% rename from Marlin/language_nl.h rename to Marlin/src/lcd/language/language_nl.h diff --git a/Marlin/language_pl-DOGM.h b/Marlin/src/lcd/language/language_pl.h similarity index 99% rename from Marlin/language_pl-DOGM.h rename to Marlin/src/lcd/language/language_pl.h index 8210fe51f2..b246df9f37 100644 --- a/Marlin/language_pl-DOGM.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -26,6 +26,9 @@ #ifndef LANGUAGE_PL_DOGM_H #define LANGUAGE_PL_DOGM_H + +#define DISPLAY_CHARSET_ISO10646_PL + #define CHARSIZE 2 #define WELCOME_MSG MACHINE_NAME _UxGT(" gotowy.") diff --git a/Marlin/language_pt-br.h b/Marlin/src/lcd/language/language_pt-br.h similarity index 78% rename from Marlin/language_pt-br.h rename to Marlin/src/lcd/language/language_pt-br.h index 8793202517..467153156b 100644 --- a/Marlin/language_pt-br.h +++ b/Marlin/src/lcd/language/language_pt-br.h @@ -22,22 +22,25 @@ /** * Portuguese (Brazil) + * UTF-8 for Graphical Display * * LCD Menu Messages * See also http://marlinfw.org/docs/development/lcd_language.html * */ -#ifndef LANGUAGE_PT_BR_H -#define LANGUAGE_PT_BR_H +#ifndef LANGUAGE_PT_BR_UTF_H +#define LANGUAGE_PT_BR_UTF_H -#define DISPLAY_CHARSET_ISO10646_1 -#define NOT_EXTENDED_ISO10646_1_5X7 +// Put characters here that should be displayed with M117 +//_UxGT("áãàçÉéêíóõ") + +#define CHARSIZE 2 #define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") #define MSG_BACK _UxGT("Voltar") -#define MSG_SD_INSERTED _UxGT("Cartao inserido") -#define MSG_SD_REMOVED _UxGT("Cartao removido") +#define MSG_SD_INSERTED _UxGT("Cartão inserido") +#define MSG_SD_REMOVED _UxGT("Cartão removido") #define MSG_LCD_ENDSTOPS _UxGT("Finais") #define MSG_MAIN _UxGT("Menu principal") #define MSG_AUTOSTART _UxGT("Autostart") @@ -50,11 +53,11 @@ #define MSG_AUTO_HOME _UxGT("Ir na origem XYZ") #define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") #define MSG_LEVEL_BED_WAITING _UxGT("Clique para Iniciar") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Proximo Ponto") -#define MSG_LEVEL_BED_DONE _UxGT("Fim da nivelacao!") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo Ponto") +#define MSG_LEVEL_BED_DONE _UxGT("Fim nivelação!") #define MSG_Z_FADE_HEIGHT _UxGT("Suavizar altura") #define MSG_SET_HOME_OFFSETS _UxGT("Compensar origem") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Alteracao feita") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Alteração feita") #define MSG_SET_ORIGIN _UxGT("Ajustar Origem") #define MSG_PREHEAT_1 _UxGT("Pre-aquecer PLA") #define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") @@ -74,11 +77,11 @@ #define MSG_EXTRUDE _UxGT("Extrusar") #define MSG_RETRACT _UxGT("Retrair") #define MSG_MOVE_AXIS _UxGT("Mover eixo") -#define MSG_BED_LEVELING _UxGT("Nivelacao Mesa") +#define MSG_BED_LEVELING _UxGT("Nivelação Mesa") #define MSG_LEVEL_BED _UxGT("Nivelar Mesa") #define MSG_LEVEL_CORNERS _UxGT("Nivelar Cantos") -#define MSG_NEXT_CORNER _UxGT("Proximo Canto") -#define MSG_EDITING_STOPPED _UxGT("Fim da Edicao") +#define MSG_NEXT_CORNER _UxGT("Próximo Canto") +#define MSG_EDITING_STOPPED _UxGT("Fim da Edição") #define MSG_USER_MENU _UxGT("Comando customizado") #define MSG_UBL_DOING_G29 _UxGT("Executando G29") @@ -86,11 +89,11 @@ #define MSG_UBL_TOOLS _UxGT("Ferramentas UBL") #define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") #define MSG_UBL_MANUAL_MESH _UxGT("Fazer malha manual") -#define MSG_UBL_BC_INSERT _UxGT("Calcar e calibrar") +#define MSG_UBL_BC_INSERT _UxGT("Calçar e calibrar") #define MSG_UBL_BC_INSERT2 _UxGT("Medir") #define MSG_UBL_BC_REMOVE _UxGT("Remover e calibrar") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Indo para o Proximo") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Indo para o Próximo") #define MSG_UBL_ACTIVATE_MESH _UxGT("Ativar UBL") #define MSG_UBL_DEACTIVATE_MESH _UxGT("Desativar UBL") #define MSG_UBL_SET_BED_TEMP _UxGT("Temp. Mesa") @@ -100,22 +103,22 @@ #define MSG_UBL_MESH_EDIT _UxGT("Editar Malha") #define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editar Malha Custom") #define MSG_UBL_FINE_TUNE_MESH _UxGT("Ajuste Fino da Malha") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Fim da Edicao") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Fim da Edição") #define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Montar Customi") #define MSG_UBL_BUILD_MESH_MENU _UxGT("Montar ") #define MSG_UBL_BUILD_PLA_MESH _UxGT("Montar PLA") #define MSG_UBL_BUILD_ABS_MESH _UxGT("Montar ABS") #define MSG_UBL_BUILD_COLD_MESH _UxGT("Montar fria") #define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajustar Altura") -#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Tamanho da Elevacao") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Tamanho da Elevação") #define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validar Malha") #define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Checar PLA") #define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Checar ABS") #define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validar Malha Custom") #define MSG_UBL_CONTINUE_MESH _UxGT("Continuar Malha") -#define MSG_UBL_MESH_LEVELING _UxGT("Nivelacao da Malha") -#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelacao 3 pontos") -#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivelacao Grid") +#define MSG_UBL_MESH_LEVELING _UxGT("Nivelação da Malha") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelação 3 pontos") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivelação Grid") #define MSG_UBL_MESH_LEVEL _UxGT("Nivelar Malha") #define MSG_UBL_SIDE_POINTS _UxGT("Cantos") #define MSG_UBL_MAP_TYPE _UxGT("Tipo de Mapa") @@ -123,18 +126,18 @@ #define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Enviar Para Host") #define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Salvar Malha CSV") #define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Salvar Backup") -#define MSG_UBL_INFO_UBL _UxGT("Informacao do UBL") +#define MSG_UBL_INFO_UBL _UxGT("Informação do UBL") #define MSG_UBL_EDIT_MESH_MENU _UxGT("Editar Malha") #define MSG_UBL_FILLIN_AMOUNT _UxGT("Qtd de Enchimento") #define MSG_UBL_MANUAL_FILLIN _UxGT("Enchimento Manual") #define MSG_UBL_SMART_FILLIN _UxGT("Enchimento Smart") #define MSG_UBL_FILLIN_MESH _UxGT("Preencher malha") #define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidar tudo") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar proximo") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar próximo") #define MSG_UBL_FINE_TUNE_ALL _UxGT("Ajuste Fino de Todos") -#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajuar Mais Proximo") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajuar Mais Próximo") #define MSG_UBL_STORAGE_MESH_MENU _UxGT("Armazenamento Malha") -#define MSG_UBL_STORAGE_SLOT _UxGT("Slot de Memoria") +#define MSG_UBL_STORAGE_SLOT _UxGT("Slot de Memória") #define MSG_UBL_LOAD_MESH _UxGT("Ler Malha") #define MSG_UBL_SAVE_MESH _UxGT("Salvar Malha") #define MSG_MESH_LOADED _UxGT("Malha %i carregada") @@ -142,12 +145,11 @@ #define MSG_NO_STORAGE _UxGT("Sem armazenamento") #define MSG_UBL_SAVE_ERROR _UxGT("Erro ao salvar UBL") #define MSG_UBL_RESTORE_ERROR _UxGT("Erro no restauro UBL") -#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Compensacao Z parou") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Compensação Z parou") #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo a passo") #define MSG_LED_CONTROL _UxGT("Controle do LED") -#define MSG_LEDS_ON _UxGT("Luz Acesa") -#define MSG_LEDS_OFF _UxGT("Luz Apagada") -#define MSG_LED_PRESETS _UxGT("Configuracao da Luz") +#define MSG_LEDS _UxGT("Luz") +#define MSG_LED_PRESETS _UxGT("Configuração da Luz") #define MSG_SET_LEDS_RED _UxGT("Luz Vermelha") #define MSG_SET_LEDS_ORANGE _UxGT("Luz Laranja") #define MSG_SET_LEDS_YELLOW _UxGT("Luz Amarela") @@ -156,7 +158,7 @@ #define MSG_SET_LEDS_INDIGO _UxGT("Luz Indigo") #define MSG_SET_LEDS_VIOLET _UxGT("Luz Violeta") #define MSG_SET_LEDS_WHITE _UxGT("Luz Branca") -#define MSG_SET_LEDS_DEFAULT _UxGT("Luz Padrao") +#define MSG_SET_LEDS_DEFAULT _UxGT("Luz Padrão") #define MSG_CUSTOM_LEDS _UxGT("Luz Customizada") #define MSG_INTENSITY_R _UxGT("Intensidade Vermelho") #define MSG_INTENSITY_G _UxGT("Intensidade Verde") @@ -178,12 +180,12 @@ #define MSG_NOZZLE _UxGT("Bocal") #define MSG_BED _UxGT("Mesa") #define MSG_FAN_SPEED _UxGT("Vel. Ventoinha") -#define MSG_FLOW _UxGT("Vazao") +#define MSG_FLOW _UxGT("Vazão") #define MSG_CONTROL _UxGT("Controle") #define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") #define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") #define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fator") -#define MSG_AUTOTEMP _UxGT("Temp. Automatica") +#define MSG_AUTOTEMP _UxGT("Temp. Automática") #define MSG_ON _UxGT("Ligado ") #define MSG_OFF _UxGT("Desligado") #define MSG_PID_P _UxGT("PID-P") @@ -237,28 +239,28 @@ #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimento") #define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("Extrusao em mm3") +#define MSG_VOLUMETRIC_ENABLED _UxGT("Extrusão em mm3") #define MSG_FILAMENT_DIAM _UxGT("Diâmetro Fil.") -#define MSG_ADVANCE_K _UxGT("Avancar K") +#define MSG_ADVANCE_K _UxGT("Avançar K") #define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Salvar Configuracao") -#define MSG_LOAD_EEPROM _UxGT("Ler Configuracao") +#define MSG_STORE_EEPROM _UxGT("Salvar Configuração") +#define MSG_LOAD_EEPROM _UxGT("Ler Configuração") #define MSG_RESTORE_FAILSAFE _UxGT("Restauro seguro") #define MSG_INIT_EEPROM _UxGT("Iniciar EEPROM") -#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Atualizacao") -#define MSG_WATCH _UxGT("Informacoes") +#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Atualização") +#define MSG_WATCH _UxGT("Informações") #define MSG_PREPARE _UxGT("Preparar") #define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impressao") -#define MSG_RESUME_PRINT _UxGT("Resumir impressao") -#define MSG_STOP_PRINT _UxGT("Parar impressao") +#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") +#define MSG_RESUME_PRINT _UxGT("Resumir impressão") +#define MSG_STOP_PRINT _UxGT("Parar impressão") #define MSG_CARD_MENU _UxGT("Imprimir do SD") -#define MSG_NO_CARD _UxGT("Sem cartao SD") +#define MSG_NO_CARD _UxGT("Sem cartão SD") #define MSG_DWELL _UxGT("ZzZzZz...") #define MSG_USERWAIT _UxGT("Clique para retomar") -#define MSG_PRINT_ABORTED _UxGT("Impressao Abortada") +#define MSG_PRINT_ABORTED _UxGT("Impressão Abortada") #define MSG_NO_MOVE _UxGT("Sem movimento") -#define MSG_KILLED _UxGT("PARADA DE EMERGENCIA") +#define MSG_KILLED _UxGT("PARADA DE EMERGÊNCIA") #define MSG_STOPPED _UxGT("PAROU. ") #define MSG_CONTROL_RETRACT _UxGT("Retrair mm") #define MSG_CONTROL_RETRACT_SWAP _UxGT("Retrair Troca mm") @@ -267,7 +269,7 @@ #define MSG_CONTROL_RETRACT_RECOVER _UxGT("Des-Retrair mm") #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Des-RetTroca mm") #define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Des-Retrair V") -#define MSG_AUTORETRACT _UxGT("Retracao Automatica") +#define MSG_AUTORETRACT _UxGT("Retração Automática") #define MSG_FILAMENTCHANGE _UxGT("Trocar Filamento") #define MSG_INIT_SDCARD _UxGT("Iniciar SD") #define MSG_CNG_SDCARD _UxGT("Trocar SD") @@ -288,11 +290,11 @@ #define MSG_ENDSTOP_ABORT _UxGT("Fim de Curso") #define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") #define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro:Temp Redundante") -#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TERMICO") -#define MSG_ERR_MAXTEMP _UxGT("Erro:Temp Maxima") -#define MSG_ERR_MINTEMP _UxGT("Erro:Temp Minima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Erro:Temp Mesa Max") -#define MSG_ERR_MINTEMP_BED _UxGT("Erro:Temp Mesa Min") +#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TÉRMICO") +#define MSG_ERR_MAXTEMP _UxGT("Erro:Temp Máxima") +#define MSG_ERR_MINTEMP _UxGT("Erro:Temp Mínima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Erro:Temp Mesa Máx") +#define MSG_ERR_MINTEMP_BED _UxGT("Erro:Temp Mesa Mín") #define MSG_HEATING _UxGT("Aquecendo...") #define MSG_BED_HEATING _UxGT("Aquecendo base...") #define MSG_DELTA_CALIBRATE _UxGT("Calibrar Delta") @@ -301,8 +303,8 @@ #define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") #define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_DELTA_SETTINGS _UxGT("Configuracao Delta") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-Calibracao") +#define MSG_DELTA_SETTINGS _UxGT("Configuração Delta") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-Calibração") #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Calibrar Altura") #define MSG_DELTA_DIAG_ROD _UxGT("Haste Diagonal") #define MSG_DELTA_HEIGHT _UxGT("Altura") @@ -314,69 +316,69 @@ #define MSG_BILINEAR_LEVELING _UxGT("Nivelamento Bilinear") #define MSG_UBL_LEVELING _UxGT("Nivelamento UBL") #define MSG_MESH_LEVELING _UxGT("Nivelamento da Malha") -#define MSG_INFO_STATS_MENU _UxGT("Estatisticas") +#define MSG_INFO_STATS_MENU _UxGT("Estatísticas") #define MSG_INFO_BOARD_MENU _UxGT("Info. da Placa") #define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") #define MSG_INFO_EXTRUDERS _UxGT("Extrusoras") -#define MSG_INFO_BAUDRATE _UxGT("Frequencia Baud") +#define MSG_INFO_BAUDRATE _UxGT("Frequência Baud") #define MSG_INFO_PROTOCOL _UxGT("Protocolo") #define MSG_CASE_LIGHT _UxGT("Luz da Estrutura") #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Intensidade Brilho") -#define MSG_INFO_PRINT_COUNT _UxGT("Qtd Impressoes") -#define MSG_INFO_COMPLETED_PRINTS _UxGT("Completas") -#define MSG_INFO_PRINT_TIME _UxGT("Tempo de Imprimindo") -#define MSG_INFO_PRINT_LONGEST _UxGT("Impressao Mais Longa") -#define MSG_INFO_PRINT_FILAMENT _UxGT("Depositado") +#define MSG_INFO_PRINT_COUNT _UxGT("Qtd de Impressões") +#define MSG_INFO_COMPLETED_PRINTS _UxGT("Fim") +#define MSG_INFO_PRINT_TIME _UxGT("Tempo de Impressão") +#define MSG_INFO_PRINT_LONGEST _UxGT("Trabalho Mais longo") +#define MSG_INFO_PRINT_FILAMENT _UxGT("Total Depositado") #define MSG_INFO_MIN_TEMP _UxGT("Temp Min") #define MSG_INFO_MAX_TEMP _UxGT("Temp Max") #define MSG_INFO_PSU _UxGT("PSU") -#define MSG_DRIVE_STRENGTH _UxGT("Forca do Motor") +#define MSG_DRIVE_STRENGTH _UxGT("Força do Motor") #define MSG_DAC_PERCENT _UxGT("Driver %") #define MSG_DAC_EEPROM_WRITE _UxGT("Escrever Eeprom DAC") #define MSG_FILAMENT_CHANGE_HEADER _UxGT("Troca de Filamento") #define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Config. de Retomada") #define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extrusar Mais") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar Impressao") -#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp. Minima eh ") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar Impressão") +#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp. Mínima é ") #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Bocal: ") -#define MSG_ERR_HOMING_FAILED _UxGT("Falha ao ir a origem") +#define MSG_ERR_HOMING_FAILED _UxGT("Falha ao ir à origem") #define MSG_ERR_PROBING_FAILED _UxGT("Falha ao sondar") #if LCD_HEIGHT >= 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando o") - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("inicio da") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("troca de Filamento") + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando o") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("inicio da") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("troca de Filamento") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("remocao de filamento") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("remoção de filamento") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Coloque Filamento") - #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("pressione o botao") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Coloque Filamento") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("pressione o botão") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") - #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pressione o botao") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("p/ Aquecer o Bocal") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pressione o botão") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("p/ Aquecer o Bocal") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo o Bocal") - #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Aguarde...") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo o Bocal") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Aguarde...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperando") - #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamento") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperando") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamento") - #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperando extrusao") - #define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("de filamento") + #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperando extrusão") + #define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("de filamento") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressao") - #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") -#else LCD_HEIGHT < 4 - #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") - #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") - #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo...") - #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregando...") - #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Extrusando...") - #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Continuando...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressão") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregando...") + #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Extrusando...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Continuando...") #endif -#endif // LANGUAGE_PT_BR_H +#endif // LANGUAGE_PT_BR_UTF_H diff --git a/Marlin/language_pt_utf8.h b/Marlin/src/lcd/language/language_pt.h similarity index 99% rename from Marlin/language_pt_utf8.h rename to Marlin/src/lcd/language/language_pt.h index df402884fa..6901b53d57 100644 --- a/Marlin/language_pt_utf8.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -31,7 +31,6 @@ #ifndef LANGUAGE_PT_UTF_H #define LANGUAGE_PT_UTF_H -#define MAPPER_C2C3 #define DISPLAY_CHARSET_ISO10646_1 #define CHARSIZE 2 diff --git a/Marlin/language_ru.h b/Marlin/src/lcd/language/language_ru.h similarity index 98% rename from Marlin/language_ru.h rename to Marlin/src/lcd/language/language_ru.h index b7235ebb1d..60cb707c17 100644 --- a/Marlin/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_RU_H #define LANGUAGE_RU_H -#define MAPPER_D0D1 // For Cyrillic #define DISPLAY_CHARSET_ISO10646_5 #define CHARSIZE 2 @@ -145,8 +144,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Пошаговое UBL") #define MSG_LED_CONTROL _UxGT("ÐаÑтройки LED") -#define MSG_LEDS_ON _UxGT("Включить подÑветку") -#define MSG_LEDS_OFF _UxGT("Выключить подÑветку") +#define MSG_LEDS _UxGT("ПодÑветку") #define MSG_LED_PRESETS _UxGT("ПредуÑтановки Ñвета") #define MSG_SET_LEDS_RED _UxGT("КраÑный Ñвет") #define MSG_SET_LEDS_ORANGE _UxGT("Оранжевый Ñвет") @@ -253,7 +251,6 @@ #define MSG_DWELL _UxGT("Сон...") #define MSG_USERWAIT _UxGT("Продолжить...") #define MSG_PRINT_PAUSED _UxGT("Печать на паузе") -#define MSG_PRINTING _UxGT("Печать...") #define MSG_PRINT_ABORTED _UxGT("Печать отменена") #define MSG_NO_MOVE _UxGT("Ðет движениÑ.") #define MSG_KILLED _UxGT("УБИТО. ") @@ -304,6 +301,7 @@ #define MSG_SHORT_MINUTE _UxGT("м") // One character only #define MSG_HEATING _UxGT("Ðагрев...") #define MSG_COOLING _UxGT("Охлаждение...") +#define MSG_COOLING_COMPLETE _UxGT("Охлаждение выполнено") #define MSG_BED_HEATING _UxGT("Ðагрев Ñтола...") #define MSG_BED_COOLING _UxGT("Охлаждение Ñтола...") #define MSG_DELTA_CALIBRATE _UxGT("Калибровка Delta") diff --git a/Marlin/language_sk_utf8.h b/Marlin/src/lcd/language/language_sk.h similarity index 98% rename from Marlin/language_sk_utf8.h rename to Marlin/src/lcd/language/language_sk.h index a7ce610c56..e3d83c649f 100644 --- a/Marlin/language_sk_utf8.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -34,7 +34,12 @@ #ifndef LANGUAGE_SK_UTF_H #define LANGUAGE_SK_UTF_H -#define MAPPER_C3C4C5_SK +// Put characters here that should be displayed with M117 +//_UxGT("aäAÄaáAÃeéEÉiíIÃlĺLĹ") +//_UxGT("oóOÓoôOÔrÅ•RÅ”uúUÚyýYÃ") +//_UxGT("cÄCÄŒdÄDÄŽlľLĽnňNŇsÅ¡SÅ ") +//_UxGT("tÅ¥TŤzžZŽ") + #define DISPLAY_CHARSET_ISO10646_SK #define CHARSIZE 2 @@ -148,8 +153,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Postupne") #define MSG_LED_CONTROL _UxGT("Nastavenie LED") -#define MSG_LEDS_ON _UxGT("Zapnúť svetlo") -#define MSG_LEDS_OFF _UxGT("Vypnúť svetlo") +#define MSG_LEDS _UxGT("Svetlo") #define MSG_LED_PRESETS _UxGT("Prednastavené farby") #define MSG_SET_LEDS_RED _UxGT("ÄŒervená") #define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") @@ -308,6 +312,7 @@ #define MSG_SHORT_MINUTE _UxGT("m") #define MSG_HEATING _UxGT("Ohrev...") #define MSG_COOLING _UxGT("Ochladzovanie...") +#define MSG_COOLING_COMPLETE _UxGT("Ochladzovanie prebehlo.") #define MSG_BED_HEATING _UxGT("Ohrev podl...") #define MSG_BED_COOLING _UxGT("Ochladzovanie podl...") #define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrácia") diff --git a/Marlin/language_test.h b/Marlin/src/lcd/language/language_test.h similarity index 73% rename from Marlin/language_test.h rename to Marlin/src/lcd/language/language_test.h index 8823bd5f11..32805f11a3 100644 --- a/Marlin/language_test.h +++ b/Marlin/src/lcd/language/language_test.h @@ -46,11 +46,6 @@ // Kanji (an other Japanese symbol set) uses far more than two codepages. So currently I don't see a chance to map the Unicodes. Its not // impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system). -//#define MAPPER_C2C3 // For most European languages when language file is in utf8 -//#define MAPPER_D0D1 // For Cyrillic -//#define MAPPER_E382E383 // For Katakana -//#define MAPPER_NON // For direct ascii codes. Fall back mapper - if no other is defined. - // Select the better font for full graphic displays. //#define DISPLAY_CHARSET_ISO10646_1 @@ -69,39 +64,39 @@ // TESTSTRINGS -#define STRG_ASCII_2 " !\"#$%&'()*+,-./" -#define STRG_ASCII_3 "0123456789:;<=>?" -#define STRG_ASCII_4 "@ABCDEFGHIJKLMNO" -#define STRG_ASCII_5 "PQRSTUVWXYZ[\]^_" -#define STRG_ASCII_6 "`abcdefghijklmno" -#define STRG_ASCII_7 "pqrstuvwxyz{|}~" +#define STRG_ASCII_2 _UxGT(" !\"#$%&'()*+,-./") +#define STRG_ASCII_3 _UxGT("0123456789:;<=>?") +#define STRG_ASCII_4 _UxGT("@ABCDEFGHIJKLMNO") +#define STRG_ASCII_5 _UxGT("PQRSTUVWXYZ[\]^_") +#define STRG_ASCII_6 _UxGT("`abcdefghijklmno") +#define STRG_ASCII_7 _UxGT("pqrstuvwxyz{|}~") -#define STRG_C2_8 "" -#define STRG_C2_9 "" -#define STRG_C2_a " ¡¢£¤¥¦§¨©ª«¬­®¯" -#define STRG_C2_b "°±²³´µ¶·¸¹º»¼½¾¿" -#define STRG_C3_8 "ÈÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃ" -#define STRG_C3_9 "ÃÑÒÓÔÕÖרÙÚÛÜÃÞß" -#define STRG_C3_a "àáâãäåæçèéêëìíîï" -#define STRG_C3_b "ðñòóôõö÷øùúûüýþÿ" +#define STRG_C2_8 _UxGT("") +#define STRG_C2_9 _UxGT("") +#define STRG_C2_a _UxGT(" ¡¢£¤¥¦§¨©ª«¬­®¯") +#define STRG_C2_b _UxGT("°±²³´µ¶·¸¹º»¼½¾¿") +#define STRG_C3_8 _UxGT("ÈÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃ") +#define STRG_C3_9 _UxGT("ÃÑÒÓÔÕÖרÙÚÛÜÃÞß") +#define STRG_C3_a _UxGT("àáâãäåæçèéêëìíîï") +#define STRG_C3_b _UxGT("ðñòóôõö÷øùúûüýþÿ") -#define STRG_D0_8 "ЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐ" -#define STRG_D0_9 "ÐБВГДЕЖЗИЙКЛМÐОП" -#define STRG_D0_a "РСТУФХЦЧШЩЪЫЬЭЮЯ" -#define STRG_D0_b "абвгдежзийклмноп" -#define STRG_D1_8 "Ñ€ÑтуфхцчшщъыьÑÑŽÑ" -#define STRG_D1_9 "ÑёђѓєѕіїјљњћќÑўџ" -#define STRG_D1_a "ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯ" -#define STRG_D1_b "ѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ" +#define STRG_D0_8 _UxGT("ЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐ") +#define STRG_D0_9 _UxGT("ÐБВГДЕЖЗИЙКЛМÐОП") +#define STRG_D0_a _UxGT("РСТУФХЦЧШЩЪЫЬЭЮЯ") +#define STRG_D0_b _UxGT("абвгдежзийклмноп") +#define STRG_D1_8 _UxGT("Ñ€ÑтуфхцчшщъыьÑÑŽÑ") +#define STRG_D1_9 _UxGT("ÑёђѓєѕіїјљњћќÑўџ") +#define STRG_D1_a _UxGT("ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯ") +#define STRG_D1_b _UxGT("ѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ") -#define STRG_E382_8 "よã‚もゃやゅゆょよらりるれã‚ゎã‚" -#define STRG_E382_9 "ã‚ゑをんゔゕゖ゗゘゙゚゛ ゜ã‚ゞゟ" -#define STRG_E382_a "゠ァアィイゥウェエォオカガキギク" -#define STRG_E382_b "グケゲコゴサザシジスズセゼソゾタ" -#define STRG_E383_8 "トãƒãƒ‚ッツヅテデトドナニヌãƒãƒŽãƒ" -#define STRG_E383_9 "ãƒãƒ‘ヒビピフブプヘベペホボãƒãƒžãƒŸ" -#define STRG_E383_a "ムメモャヤュユョヨラリルレロヮワ" -#define STRG_E383_b "ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ" +#define STRG_E382_8 _UxGT("よã‚もゃやゅゆょよらりるれã‚ゎã‚") +#define STRG_E382_9 _UxGT("ã‚ゑをんゔゕゖ゗゘゙゚゛ ゜ã‚ゞゟ") +#define STRG_E382_a _UxGT("゠ァアィイゥウェエォオカガキギク") +#define STRG_E382_b _UxGT("グケゲコゴサザシジスズセゼソゾタ") +#define STRG_E383_8 _UxGT("トãƒãƒ‚ッツヅテデトドナニヌãƒãƒŽãƒ") +#define STRG_E383_9 _UxGT("ãƒãƒ‘ヒビピフブプヘベペホボãƒãƒžãƒŸ") +#define STRG_E383_a _UxGT("ムメモャヤュユョヨラリルレロヮワ") +#define STRG_E383_b _UxGT("ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ") #define STRG_OKTAL_0 "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" #define STRG_OKTAL_1 "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" @@ -121,21 +116,21 @@ #define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" #if ENABLED(DISPLAYTEST) - #define WELCOME_MSG "Language TEST" + #define WELCOME_MSG _UxGT("Language TEST") - #define MSG_WATCH "Display test" + #define MSG_WATCH _UxGT("Display test") #define MSG_PREPARE STRG_OKTAL_b #define MSG_CONTROL STRG_OKTAL_c #endif #if ENABLED(WEST) - #define WELCOME_MSG "Language TEST" + #define WELCOME_MSG _UxGT("Language TEST") - #define MSG_WATCH "\001\002\003\004\005\006\007\010\011" - #define MSG_PREPARE "UTF8" - #define MSG_CONTROL "ASCII" + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - //#define MSG_MAIN ".." + //#define MSG_MAIN _UxGT("..") #define MSG_DISABLE_STEPPERS STRG_C2_8 #define MSG_AUTO_HOME STRG_C2_9 #define MSG_SET_HOME_OFFSETS STRG_C2_a @@ -164,13 +159,13 @@ #endif #if ENABLED(CYRIL) - #define WELCOME_MSG "Language TEST" + #define WELCOME_MSG _UxGT("Language TEST") - #define MSG_WATCH "\001\002\003\004\005\006\007\010\011" - #define MSG_PREPARE "UTF8" - #define MSG_CONTROL "ASCII" + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - //#define MSG_MAIN ".." + //#define MSG_MAIN _UxGT("..") #define MSG_DISABLE_STEPPERS STRG_D0_8 #define MSG_AUTO_HOME STRG_D0_9 #define MSG_SET_HOME_OFFSETS STRG_D0_a @@ -199,13 +194,13 @@ #endif #if ENABLED(KANA) - #define WELCOME_MSG "Language TEST" + #define WELCOME_MSG _UxGT("Language TEST") - #define MSG_WATCH "\001\002\003\004\005\006\007\010\011" - #define MSG_PREPARE "UTF8" - #define MSG_CONTROL "ASCII" + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - //#define MSG_MAIN ".." + //#define MSG_MAIN _UxGT("..") #define MSG_DISABLE_STEPPERS STRG_E382_8 #define MSG_AUTO_HOME STRG_E382_9 #define MSG_SET_HOME_OFFSETS STRG_E382_a diff --git a/Marlin/language_tr.h b/Marlin/src/lcd/language/language_tr.h similarity index 99% rename from Marlin/language_tr.h rename to Marlin/src/lcd/language/language_tr.h index 9df9f32396..848d6b1b71 100644 --- a/Marlin/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -30,14 +30,9 @@ #ifndef LANGUAGE_TR_H #define LANGUAGE_TR_H -#define MAPPER_C2C3_TR #define DISPLAY_CHARSET_ISO10646_TR #define CHARSIZE 2 -#if DISABLED(DOGLCD) - #error "Turkish needs a graphical display." -#endif - #define WELCOME_MSG MACHINE_NAME _UxGT(" hazır.") // hazır. #define MSG_SD_INSERTED _UxGT("SD YerleÅŸti.") // SD YerleÅŸti. #define MSG_SD_REMOVED _UxGT("SD Çıkarıldı.") // SD Çıkarıldı. diff --git a/Marlin/language_uk.h b/Marlin/src/lcd/language/language_uk.h similarity index 99% rename from Marlin/language_uk.h rename to Marlin/src/lcd/language/language_uk.h index 3e3227d867..ce131d8542 100644 --- a/Marlin/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -30,7 +30,6 @@ #ifndef LANGUAGE_UK_H #define LANGUAGE_UK_H -#define MAPPER_D0D1 // For Cyrillic #define DISPLAY_CHARSET_ISO10646_5 #define CHARSIZE 2 diff --git a/Marlin/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h similarity index 99% rename from Marlin/language_zh_CN.h rename to Marlin/src/lcd/language/language_zh_CN.h index c62bbc77b2..a348e40712 100644 --- a/Marlin/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -30,6 +30,8 @@ #ifndef LANGUAGE_ZH_CN_H #define LANGUAGE_ZH_CN_H +//#define TALL_FONT_CORRECTION (1) + #define CHARSIZE 3 #define WELCOME_MSG MACHINE_NAME _UxGT("已就绪.") //" ready." @@ -141,8 +143,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" #define MSG_LED_CONTROL _UxGT("ç¯ç®¡æŽ§åˆ¶") // "LED Control") -#define MSG_LEDS_ON _UxGT("ç¯äº®") // "Lights On") -#define MSG_LEDS_OFF _UxGT("ç¯ç­") // "Lights Off") +#define MSG_LEDS _UxGT("ç¯") // "Lights") #define MSG_LED_PRESETS _UxGT("ç¯é¢„ç½®") // "Light Presets") #define MSG_SET_LEDS_RED _UxGT("红") // "Red") #define MSG_SET_LEDS_ORANGE _UxGT("æ©™") // "Orange") @@ -296,7 +297,7 @@ #define MSG_SHORT_HOUR _UxGT("æ—¶") //"h" // One character only #define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only #define MSG_HEATING _UxGT("加热中 ...") //"Heating..." -#define MSG_BED_HEATING _UxGT("加热热床中...") //"Bed Heating..." +#define MSG_BED_HEATING _UxGT("加热热床中 ...") //"Bed Heating..." #define MSG_DELTA_CALIBRATE _UxGT("⊿校准") //"Delta Calibration" #define MSG_DELTA_CALIBRATE_X _UxGT("⊿校准X") //"Calibrate X" #define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校准Y") //"Calibrate Y" diff --git a/Marlin/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h similarity index 99% rename from Marlin/language_zh_TW.h rename to Marlin/src/lcd/language/language_zh_TW.h index 4eb420f423..d57f2deef9 100644 --- a/Marlin/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -30,6 +30,8 @@ #ifndef LANGUAGE_ZH_TW_H #define LANGUAGE_ZH_TW_H +//#define TALL_FONT_CORRECTION (1) + #define CHARSIZE 3 #define WELCOME_MSG MACHINE_NAME _UxGT("已就緒.") //" ready." @@ -141,8 +143,7 @@ #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" #define MSG_LED_CONTROL _UxGT("ç¯ç®¡æŽ§åˆ¶") // "LED Control") -#define MSG_LEDS_ON _UxGT("ç¯äº®") // "Lights On") -#define MSG_LEDS_OFF _UxGT("ç¯ç­") // "Lights Off") +#define MSG_LEDS _UxGT("ç¯") // "Lights") #define MSG_LED_PRESETS _UxGT("ç¯é¢„ç½®") // "Light Presets") #define MSG_SET_LEDS_RED _UxGT("红") // "Red") #define MSG_SET_LEDS_ORANGE _UxGT("æ©™") // "Orange") @@ -296,7 +297,7 @@ #define MSG_SHORT_HOUR _UxGT("時") //"h" // One character only #define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only #define MSG_HEATING _UxGT("加熱中 ...") //"Heating..." -#define MSG_BED_HEATING _UxGT("加熱熱床中...") //"Bed Heating..." +#define MSG_BED_HEATING _UxGT("加熱熱床中 ...") //"Bed Heating..." #define MSG_DELTA_CALIBRATE _UxGT("⊿校準") //"Delta Calibration" #define MSG_DELTA_CALIBRATE_X _UxGT("⊿校準X") //"Calibrate X" #define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校準Y") //"Calibrate Y" diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h new file mode 100644 index 0000000000..c266401652 --- /dev/null +++ b/Marlin/src/lcd/lcdprint.h @@ -0,0 +1,58 @@ +/** + * @file lcdprint.h + * @brief LCD print api + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ +#ifndef _LCDPRINT_H +#define _LCDPRINT_H + +#include "fontutils.h" + +#if DISABLED(DOGLCD) + #define _UxGT(a) a +#else + #include "u8g_fontutf8.h" +#endif + +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) + +int lcd_glyph_height(void); + +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length); + +/** + * @brief Draw a UTF-8 string + * + * @param utf8_str : the UTF-8 string + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the pixel width + * + * Draw a UTF-8 string + */ +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length); + +/** + * @brief Draw a ROM UTF-8 string + * + * @param utf8_str_P : the ROM UTF-8 string + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the pixel width + * + * Draw a ROM UTF-8 string + */ +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length); + +void lcd_moveto(int col, int row); + +inline int lcd_put_u8str_P(const char *str) { return lcd_put_u8str_max_P(str, PIXEL_LEN_NOLIMIT); } + +inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } + +inline int lcd_put_wchar(wchar_t c) { return lcd_put_wchar_max(c, PIXEL_LEN_NOLIMIT); } + +#endif // _LCDPRINT_H diff --git a/Marlin/src/lcd/lcdprint_hd44780.cpp b/Marlin/src/lcd/lcdprint_hd44780.cpp new file mode 100644 index 0000000000..03bc70fd32 --- /dev/null +++ b/Marlin/src/lcd/lcdprint_hd44780.cpp @@ -0,0 +1,1044 @@ +/** + * @file lcdprint_hd44780.c + * @brief LCD print api for HD44780 + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +/** + * Due to the limitation of the HD44780 hardware, the current available LCD modules can only support + * Western(English), Cyrillic(Russian), Kana(Japanese) charsets. + */ + +#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" + +#if ENABLED(ULTRA_LCD) +#include "ultralcd.h" +#include "../Marlin.h" + +#if DISABLED(DOGLCD) +#include +#include "fontutils.h" +#include "lcdprint.h" + +#include "ultralcd_common_HD44780.h" +#ifndef LCD_CLASS + #include + #define LCD_CLASS LiquidCrystal +#endif +extern LCD_CLASS lcd; +LCD_CLASS *plcd = &lcd; + +int lcd_glyph_height(void) { return 1; } + +//////////////////////////////////////////////////////////// +typedef struct _hd44780_charmap_t { + wchar_t uchar; // the unicode char + uint8_t idx; // the glyph of the char in the ROM + uint8_t idx2; // the char used to be combined with the idx to simulate a single char +} hd44780_charmap_t; + +#if defined(__AVR__) + #define IV(a) U##a +#else + #define IV(a) L##a +#endif + +static const hd44780_charmap_t g_hd44780_charmap_device[] PROGMEM = { + // sorted by uchar: + #if DISPLAY_CHARSET_HD44780 == JAPANESE + + {IV('¢'), 0xEC, 0}, // A2 + {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('ä'), 0xE1, 0}, // E4 + {IV('ö'), 0xEF, 0}, // F6 + {IV('÷'), 0xFD, 0}, // 00F7 + {IV('ü'), 0xF5, 0}, // 00FC + {IV('Ë£'), 0xEB, 0}, // 02E3 + + {IV('·'), 0xA5, 0}, // 0387 + {IV('Î'), 0xF4, 0}, // 038F + {IV('Θ'), 0xF2, 0}, // 0398, Theta + {IV('Ξ'), 0xE3, 0}, // 039E, Xi + {IV('Σ'), 0xF6, 0}, // 03A3, Sigma + {IV('Ω'), 0xF4, 0}, // 03A9, Omega + {IV('ά'), 0xE0, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('α'), 0xE0, 0}, // 03B1, alpha + {IV('β'), 0xE2, 0}, // 03B2, beta + {IV('ε'), 0xE3, 0}, // 03B5, epsilon + {IV('θ'), 0xF2, 0}, // 03B8, theta + {IV('μ'), 0xE4, 0}, // 03BC, mu + {IV('ξ'), 0xE3, 0}, // 03BE, xi + {IV('Ï€'), 0xF7, 0}, // 03C0, pi + {IV('Ï'), 0xE6, 0}, // 03C1, rho + {IV('σ'), 0xE5, 0}, // 03C3, sigma + + {IV('â†'), 0x7F, 0}, // 2190 + {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) + {IV('√'), 0xE8, 0}, // 221A + {IV('∞'), 0xF3, 0}, // 221E + {IV('â–ˆ'), 0xFF, 0}, // 2588 + + //{IV(''), 0xA0, 0}, + {IV('。'), 0xA1, 0}, + {IV('「'), 0xA2, 0}, + {IV('ã€'), 0xA3, 0}, + {IV('ã‚›'), 0xDE, 0}, // ‶ + {IV('゜'), 0xDF, 0}, // '〫' + {IV('ã‚ '), '=', 0}, + {IV('ã‚¡'), 0xA7, 0}, + {IV('ã‚¢'), 0xB1, 0}, + {IV('ã‚£'), 0xA8, 0}, + {IV('イ'), 0xB2, 0}, + {IV('ã‚¥'), 0xA9, 0}, + {IV('ウ'), 0xB3, 0}, + {IV('ã‚§'), 0xAA, 0}, + {IV('エ'), 0xB4, 0}, + {IV('ã‚©'), 0xAB, 0}, + + {IV('オ'), 0xB5, 0}, + {IV('ã‚«'), 0xB6, 0}, + {IV('ガ'), 0xB6, 0xDE}, + {IV('ã‚­'), 0xB7, 0}, + {IV('ã‚®'), 0xB7, 0xDE}, // + {IV('ク'), 0xB8, 0}, + {IV('ã‚°'), 0xB8, 0xDE}, + {IV('ケ'), 0xB9, 0}, + {IV('ゲ'), 0xB9, 0xDE}, + {IV('コ'), 0xBA, 0}, + {IV('ã‚´'), 0xBA, 0xDE}, + {IV('サ'), 0xBB, 0}, + {IV('ã‚¶'), 0xBB, 0xDE}, + {IV('ã‚·'), 0xBC, 0}, + {IV('ジ'), 0xBC, 0xDE}, + {IV('ス'), 0xBD, 0}, + {IV('ズ'), 0xBD, 0xDE}, + {IV('ã‚»'), 0xBE, 0}, + {IV('ゼ'), 0xBE, 0xDE}, + {IV('ソ'), 0xBF, 0}, + {IV('ゾ'), 0xBF, 0xDE}, + + {IV('ã‚¿'), 0xC0, 0}, + {IV('ダ'), 0xC0, 0xDE}, + {IV('ãƒ'), 0xC1, 0}, + {IV('ヂ'), 0xC1, 0xDE}, + {IV('ッ'), 0xAF, 0}, + {IV('ツ'), 0xC2, 0}, + {IV('ヅ'), 0xC2, 0xDE}, + {IV('テ'), 0xC3, 0}, + {IV('デ'), 0xC3, 0xDE}, + {IV('ト'), 0xC4, 0}, + {IV('ド'), 0xC4, 0xDE}, + {IV('ナ'), 0xC5, 0}, + {IV('ニ'), 0xC6, 0}, + {IV('ヌ'), 0xC7, 0}, + {IV('ãƒ'), 0xC8, 0}, + {IV('ノ'), 0xC9, 0}, + {IV('ãƒ'), 0xCA, 0}, + {IV('ãƒ'), 0xCA, 0xDE}, + {IV('パ'), 0xCA, 0xDF}, + {IV('ヒ'), 0xCB, 0}, + {IV('ビ'), 0xCB, 0xDE}, + {IV('ピ'), 0xCB, 0xDF}, + {IV('フ'), 0xCC, 0}, + {IV('ブ'), 0xCC, 0xDE}, + {IV('プ'), 0xCC, 0xDF}, + {IV('ヘ'), 0xCD, 0}, + {IV('ベ'), 0xCD, 0xDE}, + {IV('ペ'), 0xCD, 0xDF}, + {IV('ホ'), 0xCE, 0}, + {IV('ボ'), 0xCE, 0xDE}, + {IV('ãƒ'), 0xCE, 0xDF}, + {IV('マ'), 0xCF, 0}, + + {IV('ミ'), 0xD0, 0}, + {IV('ム'), 0xD1, 0}, + {IV('メ'), 0xD2, 0}, + {IV('モ'), 0xD3, 0}, + {IV('ャ'), 0xAC, 0}, + {IV('ヤ'), 0xD4, 0}, + {IV('ュ'), 0xAD, 0}, + {IV('ユ'), 0xD5, 0}, + {IV('ョ'), 0xAE, 0}, + {IV('ヨ'), 0xD6, 0}, + {IV('ラ'), 0xD7, 0}, + {IV('リ'), 0xD8, 0}, + {IV('ル'), 0xD9, 0}, + {IV('レ'), 0xDA, 0}, + {IV('ロ'), 0xDB, 0}, + {IV('ワ'), 0xDC, 0}, + {IV('ヲ'), 0xA6, 0}, + {IV('ン'), 0xDD, 0}, + {IV('ヴ'), 0xB3, 0xDE}, + {IV('ヷ'), 0xDC, 0xDE}, + {IV('ヺ'), 0xA6, 0xDE}, + {IV('・'), 0xA5, 0}, + {IV('ー'), 0xB0, 0}, + {IV('ヽ'), 0xA4, 0}, + + //{IV('g'), 0xE7, 0}, // error + //{IV(''), 0xE9, 0}, + //{IV('j'), 0xEA, 0}, // error + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + + //{IV('p'), 0xF0, 0}, // error + //{IV('q'), 0xF1, 0}, // error + //{IV(''), 0xF8, 0}, + //{IV('y'), 0xF9, 0}, // error + {IV('万'), 0xFB, 0}, + {IV('円'), 0xFC, 0}, + {IV('åƒ'), 0xFA, 0}, + //{IV(''), 0xFE, 0}, + + //、・ヲァィゥェォャュョッー + {IV('、'), 0xA4, 0}, //ヽ + {IV('ï½¥'), 0xA5, 0}, //・ + {IV('ヲ'), 0xA6, 0}, //ヲ + {IV('ï½§'), 0xA7, 0}, //ã‚¡ + {IV('ィ'), 0xA8, 0}, //ã‚£ + {IV('ゥ'), 0xA9, 0}, //ã‚¥ + {IV('ェ'), 0xAA, 0}, //ã‚§ + {IV('ォ'), 0xAB, 0}, //ã‚© + {IV('ャ'), 0xAC, 0}, //ャ + {IV('ï½­'), 0xAD, 0}, //ュ + {IV('ï½®'), 0xAE, 0}, //ョ + {IV('ッ'), 0xAF, 0}, //ッ + {IV('ï½°'), 0xB0, 0}, //ー + + //アイウエオカキクケコサシスセ + {IV('ï½±'), 0xB1, 0}, //ã‚¢ + {IV('ï½²'), 0xB2, 0}, //イ + {IV('ï½³'), 0xB3, 0}, //ウ + {IV('ï½´'), 0xB4, 0}, //エ + {IV('ï½µ'), 0xB5, 0}, //オ + {IV('ï½¶'), 0xB6, 0}, //ã‚« + {IV('ï½·'), 0xB7, 0}, //ã‚­ + {IV('ク'), 0xB8, 0}, //ク + {IV('ï½¹'), 0xB9, 0}, //ケ + {IV('コ'), 0xBA, 0}, //コ + {IV('ï½»'), 0xBB, 0}, //サ + {IV('ï½¼'), 0xBC, 0}, //ã‚· + {IV('ï½½'), 0xBD, 0}, //ス + {IV('ï½¾'), 0xBE, 0}, //ã‚» + + //ソタï¾ï¾‚テトナニヌネノハヒフ + {IV('ソ'), 0xBF, 0}, //ソ + {IV('ï¾€'), 0xC0, 0}, //ã‚¿ + {IV('ï¾'), 0xC1, 0}, //ム+ {IV('ツ'), 0xC2, 0}, //ツ + {IV('テ'), 0xC3, 0}, //テ + {IV('ト'), 0xC4, 0}, //ト + {IV('ï¾…'), 0xC5, 0}, //ナ + {IV('ニ'), 0xC6, 0}, //ニ + {IV('ヌ'), 0xC7, 0}, //ヌ + {IV('ネ'), 0xC8, 0}, //ム+ {IV('ノ'), 0xC9, 0}, //ノ + {IV('ハ'), 0xCA, 0}, //ム+ {IV('ヒ'), 0xCB, 0}, //ヒ + {IV('フ'), 0xCC, 0}, //フ + + //ï¾ï¾Žï¾ï¾ï¾‘メモヤユヨラリルレロワï¾ï¾žï¾Ÿ + {IV('ï¾'), 0xCD, 0}, //ヘ + {IV('ホ'), 0xCE, 0}, //ホ + {IV('ï¾'), 0xCF, 0}, //マ + {IV('ï¾'), 0xD0, 0}, //ミ + {IV('ム'), 0xD1, 0}, //ム + {IV('ï¾’'), 0xD2, 0}, //メ + {IV('モ'), 0xD3, 0}, //モ + {IV('ï¾”'), 0xD4, 0}, //ヤ + {IV('ユ'), 0xD5, 0}, //ユ + {IV('ï¾–'), 0xD6, 0}, //ヨ + {IV('ï¾—'), 0xD7, 0}, //ラ + {IV('リ'), 0xD8, 0}, //リ + {IV('ï¾™'), 0xD9, 0}, //ル + {IV('レ'), 0xDA, 0}, //レ + {IV('ï¾›'), 0xDB, 0}, //ロ + {IV('ワ'), 0xDC, 0}, //ワ + {IV('ï¾'), 0xDD, 0}, //ン + {IV('゙'), 0xDE, 0}, // ã‚› + {IV('゚'), 0xDF, 0}, // ゜ + + {IV('ï¿¥'), 0x5C, 0}, + + #elif DISPLAY_CHARSET_HD44780 == WESTERN + // 0x10 -- 0x1F (except 0x1C) + // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) + + {IV('¡'), 0xA9, 0}, + {IV('¢'), 0xA4, 0}, + {IV('£'), 0xA5, 0}, + {IV('Â¥'), 0xA6, 0}, + {IV('§'), 0xD2, 0}, // section sign + {IV('©'), 0xCF, 0}, + + {IV('ª'), 0x9D, 0}, + {IV('«'), 0xBB, 0}, + {IV('®'), 0xCE, 0}, + + {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) + //{IV(''), 0xD1, 0}, + {IV('±'), 0x10, 0}, //∓± + //{'='), 0x1C, 0}, // error + {IV('²'), 0x1E, 0}, + {IV('³'), 0x1F, 0}, + {IV('¶'), 0xD3, 0}, // pilcrow sign + {IV('º'), 0x9E, 0}, + {IV('»'), 0xBC, 0}, // 00BB + //{IV(''), 0xB3, 0}, // error + //{IV(''), 0xB4, 0}, // error + {IV('¼'), 0xB6, 0}, // 00BC + {IV('½'), 0xB5, 0}, // 00BD + //{IV('¾'), '3', 0}, // 00BE + {IV('¿'), 0x9F, 0}, // 00BF + + {IV('Â'), 0x8F, 0}, + {IV('Ã'), 0xAA, 0}, + {IV('Ä'), 0x8E, 0}, + {IV('Æ'), 0x92, 0}, + {IV('Ç'), 0x80, 0}, + {IV('É'), 0x90, 0}, + {IV('Ñ'), 0x9C, 0}, + {IV('Õ'), 0xAC, 0}, + {IV('Ö'), 0x99, 0}, + {IV('×'), 0xB7, 0}, + {IV('Ø'), 0xAE, 0}, + {IV('Ü'), 0x9A, 0}, + {IV('à'), 0x85, 0}, + {IV('á'), 0xA0, 0}, + {IV('â'), 0x83, 0}, + {IV('ã'), 0xAB, 0}, + {IV('ä'), 0x84, 0}, + {IV('Ã¥'), 0x86, 0}, + {IV('æ'), 0x91, 0}, + {IV('ç'), 0x87, 0}, + {IV('è'), 0x8A, 0}, + {IV('é'), 0x82, 0}, + {IV('ê'), 0x88, 0}, + {IV('ë'), 0x89, 0}, + {IV('ì'), 0x8D, 0}, + {IV('í'), 0xA1, 0}, + {IV('î'), 0x8C, 0}, + {IV('ï'), 0x8B, 0}, + + {IV('ñ'), 0x9B, 0}, + {IV('ò'), 0x95, 0}, + {IV('ó'), 0xA2, 0}, + {IV('ô'), 0x93, 0}, + {IV('õ'), 0xAD, 0}, + {IV('ö'), 0x94, 0}, + {IV('÷'), 0xB8, 0}, + {IV('ø'), 0xAF, 0}, + {IV('ù'), 0x97, 0}, + {IV('ú'), 0xA3, 0}, + {IV('û'), 0x96, 0}, + {IV('ü'), 0x81, 0}, + {IV('ÿ'), 0x98, 0}, + + //{IV(''), 0xB0, 0}, // error + //{IV(''), 0xB1, 0}, // error + {IV('Æ’'), 0xA8, 0}, // 0192 + + {IV('ÎŽ'), 0xDB, 0}, // 038E + {IV('Î'), 0xDE, 0}, // 038F + {IV('Î'), 0xE7, 0}, // 0390 + + {IV('Γ'), 0xD4, 0}, // 0393, Gamma + {IV('Δ'), 0xD5, 0}, // 0394, Delta, â—¿ + {IV('Θ'), 0xD6, 0}, // 0398, Theta + {IV('Λ'), 0xD7, 0}, // 039B, Lambda + {IV('Ξ'), 0xD8, 0}, // 039E, Xi + {IV('Π'), 0xD9, 0}, // Pi + {IV('Σ'), 0xDA, 0}, // Sigma + {IV('Î¥'), 0xDB, 0}, // Upsilon + {IV('Φ'), 0xDC, 0}, // Phi + {IV('Ψ'), 0xDD, 0}, // Psi + {IV('Ω'), 0xDE, 0}, // Omega + + {IV('ά'), 0xDF, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('ή'), 0xE5, 0}, // 03AE + {IV('ί'), 0xE7, 0}, // 03AF + {IV('ΰ'), 0xF1, 0}, // 03B0 + + {IV('α'), 0xDF, 0}, // alpha + {IV('β'), 0xE0, 0}, // beta + {IV('γ'), 0xE1, 0}, // gamma + {IV('δ'), 0xE2, 0}, // delta + {IV('ε'), 0xE3, 0}, // epsilon + {IV('ζ'), 0xE4, 0}, // zeta + {IV('η'), 0xE5, 0}, // eta + {IV('θ'), 0xE6, 0}, // theta + {IV('ι'), 0xE7, 0}, // lota + {IV('κ'), 0xE8, 0}, // kappa + {IV('λ'), 0xE9, 0}, // lambda + {IV('μ'), 0xEA, 0}, // mu + {IV('ν'), 0xEB, 0}, // nu + {IV('ξ'), 0xEC, 0}, // xi + {IV('Ï€'), 0xED, 0}, // pi + {IV('Ï'), 0xEE, 0}, // rho + {IV('σ'), 0xEF, 0}, // sigma + + {IV('Ï„'), 0xF0, 0}, // tau + {IV('Ï…'), 0xF1, 0}, // upsilon + {IV('χ'), 0xF2, 0}, // chi + {IV('ψ'), 0xF3, 0}, // psi + {IV('ω'), 0xF4, 0}, // 03C9, omega + {IV('ÏŠ'), 0xE7, 0}, // 03CA + {IV('Ï‹'), 0xF1, 0}, // 03CB + {IV('Ï'), 0xF1, 0}, // 03CD + {IV('ÏŽ'), 0xF4, 0}, // 03CE + + {IV('•'), 0xCD, 0}, // · + {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 + {IV('â„¢'), 0xD0, 0}, + {IV('↤'), 0xF9, 0}, // ⟻ + {IV('↵'), 0xC4, 0}, + {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('⇥'), 0xFB, 0}, + {IV('√'), 0xBE, 0}, // √ + {IV('∞'), 0xC2, 0}, // infinity + {IV('∫'), 0x1B, 0}, + {IV('∼'), 0x1D, 0}, + {IV('≈'), 0x1A, 0}, + {IV('≠'), 0xBD, 0}, + {IV('≡'), 0x11, 0}, + {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ + {IV('≥'), 0xBA, 0}, + //{IV(''), 0xBF, 0}, // error + + {IV('⌠'), 0xC0, 0}, + {IV('⌡'), 0xC1, 0}, + + {IV('⎧'), 0x14, 0}, + {IV('⎩'), 0x15, 0}, + {IV('⎫'), 0x16, 0}, + {IV('⎭'), 0x17, 0}, + {IV('⎰'), 0x18, 0}, + {IV('⎱'), 0x19, 0}, + {IV('⎲'), 0x12, 0}, + {IV('⎳'), 0x13, 0}, + + {IV('â±'), 0x07, 0}, // Marlin special: 'ðŸ•🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜ðŸ•🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛â°â±â³â§–â§—' LCD_STR_CLOCK (0x05) + {IV('┌'), 0xC9, 0}, + {IV('â”'), 0xCA, 0}, + {IV('â””'), 0xCB, 0}, + {IV('┘'), 0xCC, 0}, + {IV('â—¸'), 0xC3, 0}, // â—¿ + {IV('â­ '), 0xC8, 0}, + {IV('â­¡'), 0xC5, 0}, + {IV('â­¢'), 0xC7, 0}, + {IV('â­£'), 0xC6, 0}, + + + {IV('⯆'), 0xF5, 0}, + {IV('⯇'), 0xF7, 0}, // ⯅ + {IV('⯈'), 0xF6, 0}, + //{IV(''), 0xF8, 0}, // error + //{IV(''), 0xFA, 0}, // error + //{IV(''), 0xFC, 0}, // error + //{IV(''), 0xFD, 0}, // error + //{IV(''), 0xFE, 0}, // error + //{IV(''), 0xFF, 0}, // error + + #elif DISPLAY_CHARSET_HD44780 == CYRILLIC + + {IV('¢'), 0x5C, 0}, // 00A2 + {IV('£'), 0xCF, 0}, // 00A3 + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + + //{IV(''), 0x80, 0}, + //{IV(''), 0x81, 0}, + //{IV(''), 0x82, 0}, + //{IV(''), 0x83, 0}, + //{IV(''), 0x84, 0}, + //{IV(''), 0x85, 0}, + //{IV(''), 0x86, 0}, + //{IV(''), 0x87, 0}, + //{IV(''), 0x88, 0}, + //{IV(''), 0x89, 0}, + //{IV(''), 0x8A, 0}, + //{IV(''), 0x8B, 0}, + //{IV(''), 0x8C, 0}, + //{IV(''), 0x8D, 0}, + //{IV(''), 0x8E, 0}, + //{IV(''), 0x8F, 0}, + + //{IV(''), 0x90, 0}, + //{IV(''), 0x91, 0}, + //{IV(''), 0x92, 0}, + //{IV(''), 0x93, 0}, + //{IV(''), 0x94, 0}, + //{IV(''), 0x95, 0}, + //{IV(''), 0x96, 0}, + //{IV(''), 0x97, 0}, + //{IV(''), 0x98, 0}, + //{IV(''), 0x99, 0}, + //{IV(''), 0x9A, 0}, + //{IV(''), 0x9B, 0}, + //{IV(''), 0x9C, 0}, + //{IV(''), 0x9D, 0}, + //{IV(''), 0x9E, 0}, + //{IV(''), 0x9F, 0}, + + + {IV('¼'), 0xF0, 0}, // 00BC + {IV('â…“'), 0xF1, 0}, + {IV('½'), 0xF2, 0}, // 00BD + {IV('¾'), 0xF3, 0}, // 00BE + {IV('¿'), 0xCD, 0}, // 00BF + + {IV('Ð'), 0xA2, 0}, // 0401 + {IV('Ð'), 'A', 0}, // 0410 + {IV('Б'), 0xA0, 0}, + {IV('Ð’'), 'B', 0}, + {IV('Г'), 0xA1, 0}, + {IV('Д'), 0xE0, 0}, + {IV('Е'), 'E', 0}, + {IV('Ж'), 0xA3, 0}, + {IV('З'), 0xA4, 0}, + {IV('И'), 0xA5, 0}, + {IV('Й'), 0xA6, 0}, + {IV('К'), 'K', 0}, + {IV('Л'), 0xA7, 0}, + {IV('М'), 'M', 0}, + {IV('Ð'), 'H', 0}, + {IV('О'), 'O', 0}, + {IV('П'), 0xA8, 0}, + {IV('Р'), 'P', 0}, + {IV('С'), 'C', 0}, + {IV('Т'), 'T', 0}, + {IV('У'), 0xA9, 0}, + {IV('Ф'), 0xAA, 0}, + {IV('Ð¥'), 'X', 0}, + {IV('Ц'), 0xE1, 0}, + {IV('Ч'), 0xAB, 0}, + {IV('Ш'), 0xAC, 0}, + {IV('Щ'), 0xE2, 0}, + {IV('Ъ'), 0xAD, 0}, + {IV('Ы'), 0xAE, 0}, + {IV('Ь'), 'b', 0}, + {IV('Э'), 0xAF, 0}, + {IV('Ю'), 0xB0, 0}, + {IV('Я'), 0xB1, 0}, + {IV('а'), 'a', 0}, + + {IV('б'), 0xB2, 0}, + {IV('в'), 0xB3, 0}, + {IV('г'), 0xB4, 0}, + {IV('д'), 0xE3, 0}, + {IV('е'), 'e', 0}, + {IV('ж'), 0xB6, 0}, + {IV('з'), 0xB7, 0}, + {IV('и'), 0xB8, 0}, + {IV('й'), 0xB9, 0}, + {IV('к'), 0xBA, 0}, //клмноп + {IV('л'), 0xBB, 0}, + {IV('м'), 0xBC, 0}, + {IV('н'), 0xBD, 0}, + {IV('о'), 'o', 0}, + {IV('п'), 0xBE, 0}, + {IV('Ñ€'), 'p', 0}, + {IV('Ñ'), 'c', 0}, + {IV('Ñ‚'), 0xBF, 0}, + + {IV('у'), 'y', 0}, + {IV('Ñ„'), 0xE4, 0}, + {IV('Ñ…'), 'x', 0}, + {IV('ц'), 0xE5, 0}, + {IV('ч'), 0xC0, 0}, + {IV('ш'), 0xC1, 0}, + {IV('щ'), 0xE6, 0}, + {IV('ÑŠ'), 0xC2, 0}, + {IV('Ñ‹'), 0xC3, 0}, + {IV('ÑŒ'), 0xC4, 0}, + {IV('Ñ'), 0xC5, 0}, + {IV('ÑŽ'), 0xC6, 0}, + {IV('Ñ'), 0xC7, 0}, // 044F + {IV('Ñ‘'), 0xB5, 0}, // 0451 + //{IV(''), 0xC8, 0}, + //{IV(''), 0xC9, 0}, + //{IV(''), 0xCA, 0}, + //{IV(''), 0xCB, 0}, + //{IV(''), 0xCC, 0}, + //{IV(''), 0xCD, 0}, + //{IV(''), 0xCE, 0}, + + //{IV(''), 0xD0, 0}, + //{IV(''), 0xD1, 0}, + //{IV(''), 0xD2, 0}, + //{IV(''), 0xD3, 0}, + //{IV(''), 0xD4, 0}, + //{IV(''), 0xD5, 0}, + //{IV(''), 0xD6, 0}, + //{IV(''), 0xD7, 0}, + //{IV(''), 0xD8, 0}, + //{IV(''), 0xDB, 0}, + //{IV(''), 0xDC, 0}, + //{IV(''), 0xDD, 0}, + //{IV(''), 0xDE, 0}, + //{IV(''), 0xDF, 0}, + + //{IV(''), 0xE7, 0}, + //{IV(''), 0xE8, 0}, + //{IV(''), 0xE9, 0}, + //{IV(''), 0xEA, 0}, + //{IV(''), 0xEB, 0}, + //{IV(''), 0xEC, 0}, + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + //{IV(''), 0xEF, 0}, + + //{IV(''), 0xF4, 0}, + //{IV(''), 0xF5, 0}, + //{IV(''), 0xF6, 0}, + //{IV(''), 0xF7, 0}, + //{IV(''), 0xF8, 0}, + //{IV(''), 0xF9, 0}, + //{IV(''), 0xFA, 0}, + //{IV(''), 0xFB, 0}, + //{IV(''), 0xFC, 0}, + //{IV(''), 0xFD, 0}, + //{IV(''), 0xFE, 0}, + //{IV(''), 0xFF, 0}, + + {IV('↑'), 0xD9, 0}, // 2191 â†â†‘→↓ + {IV('↓'), 0xDA, 0}, // 2193 + #endif +}; + +// the plain ASCII replacement for various char +static const hd44780_charmap_t g_hd44780_charmap_common[] PROGMEM = { + {IV('¡'), 'i', 0}, // A1 + {IV('¢'), 'c', 0}, // A2 + {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) + + // map WESTERN code to the plain ASCII + {IV('Ã'), 'A', 0}, // C1 + {IV('Â'), 'A', 0}, // C2 + {IV('Ã'), 'A', 0}, // C3 + {IV('Ä'), 'A', 0}, // C4 + {IV('Ã…'), 'A', 0}, // C5 + {IV('Æ'), 'A', 'E'}, // C6 + {IV('Ç'), 'C', 0}, // C7 + {IV('È'), 'E', 0}, // C8 + {IV('É'), 'E', 0}, // C9 + {IV('Ã'), 'I', 0}, // CD + {IV('Ñ'), 'N', 0}, // D1 + {IV('Õ'), 'O', 0}, // D5 + {IV('Ö'), 'O', 0}, // D6 + {IV('×'), 'x', 0}, // D7 + {IV('Ü'), 'U', 0}, // DC + {IV('Ã'), 'Y', 0}, // DD + {IV('à'), 'a', 0}, // E0 + {IV('á'), 'a', 0}, + {IV('â'), 'a', 0}, + {IV('ã'), 'a', 0}, + {IV('ä'), 'a', 0}, + {IV('Ã¥'), 'a', 0}, + {IV('æ'), 'a', 'e'}, + {IV('ç'), 'c', 0}, + {IV('è'), 'e', 0}, // 00E8 + {IV('é'), 'e', 0}, + {IV('ê'), 'e', 0}, + {IV('ë'), 'e', 0}, + {IV('ì'), 'i', 0}, // 00EC + {IV('í'), 'i', 0}, + {IV('î'), 'i', 0}, + {IV('ï'), 'i', 0}, // 00EF + + {IV('ñ'), 'n', 0}, // 00F1 + {IV('ò'), 'o', 0}, + {IV('ó'), 'o', 0}, + {IV('ô'), 'o', 0}, + {IV('õ'), 'o', 0}, + {IV('ö'), 'o', 0}, + //{IV('÷'), 0xB8, 0}, + {IV('ø'), 'o', 0}, + {IV('ù'), 'u', 0}, + {IV('ú'), 'u', 0}, + {IV('û'), 'u', 0}, + {IV('ü'), 'u', 0}, // FC + {IV('ý'), 'y', 0}, // FD + {IV('ÿ'), 'y', 0}, // FF + + {IV('Ä„'), 'A', 0}, // 0104 + {IV('Ä…'), 'a', 0}, // 0105 + {IV('Ć'), 'C', 0}, // 0106 + {IV('ć'), 'c', 0}, // 0107 + {IV('ÄŒ'), 'C', 0}, // 010C + {IV('Ä'), 'c', 0}, // 010D + {IV('ÄŽ'), 'D', 0}, // 010E + {IV('Ä'), 'd', 0}, // 010F + {IV('Ä‘'), 'd', 0}, // 0111 + {IV('Ä™'), 'e', 0}, // 0119 + {IV('ÄŸ'), 'g', 0}, // 011F + {IV('İ'), 'I', 0}, // 0130 + {IV('ı'), 'i', 0}, // 0131 + + {IV('Å'), 'L', 0}, // 0141 + {IV('Å‚'), 'l', 0}, // 0142 + {IV('Ń'), 'N', 0}, // 0143 + {IV('Å„'), 'n', 0}, // 0144 + {IV('ň'), 'n', 0}, // 0148 + + {IV('Å™'), 'r', 0}, // 0159 + {IV('Åš'), 'S', 0}, // 015A + {IV('Å›'), 's', 0}, // 015B + {IV('ÅŸ'), 's', 0}, // 015F + {IV('Å '), 'S', 0}, // 0160 + {IV('Å¡'), 's', 0}, // 0161 + {IV('Å¥'), 't', 0}, // 0165 + {IV('ů'), 'u', 0}, // 016F + {IV('ż'), 'z', 0}, // 017C + {IV('Ž'), 'Z', 0}, // 017D + {IV('ž'), 'z', 0}, // 017E + {IV('Æ’'), 'f', 0}, // 0192 + + {IV('Ë£'), 'x', 0}, // 02E3 + + {IV('΄'), '\'', 0}, // 0384 + {IV('Î…'), '\'', 0}, // 0385 + {IV('Ά'), 'A', 0}, // 0386 + {IV('·'), '.', 0}, // 0387 + {IV('Έ'), 'E', 0}, // 0388 + {IV('Ή'), 'H', 0}, // 0389 + {IV('Ί'), 'I', 0}, // 038A + {IV('ÎŒ'), 'O', 0}, // 038C + {IV('ÎŽ'), 'Y', 0}, // 038E + {IV('Î'), 'O', 0}, // 038F + {IV('Î'), 'i', 0}, // 0390 + {IV('Α'), 'A', 0}, // 0391 + {IV('Î’'), 'B', 0}, // 0392 + {IV('Γ'), 'T', 0}, // 0393, Gamma + {IV('Δ'), '4', 0}, // 0394, Delta, â—¿ + {IV('Ε'), 'E', 0}, // 0395 + {IV('Ζ'), 'Z', 0}, // 0396 + {IV('Η'), 'H', 0}, // 0397 + {IV('Θ'), '0', 0}, // 0398, Theta + {IV('Ι'), 'I', 0}, // 0399 + {IV('Κ'), 'K', 0}, // 039A + {IV('Λ'), '^', 0}, // 039B, Lambda + {IV('Μ'), 'M', 0}, // 039C + {IV('Î'), 'N', 0}, // 039D + {IV('Ξ'), '3', 0}, // 039E, Xi + {IV('Ο'), 'O', 0}, // 039F + {IV('Π'), 'n', 0}, // 03A0, Pi + {IV('Ρ'), 'P', 0}, // 03A1 + {IV('Σ'), 'E', 0}, // 03A3, Sigma + {IV('Τ'), 'T', 0}, // 03A4 + {IV('Î¥'), 'Y', 0}, // 03A5, Upsilon + {IV('Φ'), 'p', 0}, // 03A6, Phi + {IV('Χ'), 'X', 0}, // 03A7 + {IV('Ψ'), 'P', 0}, // 03A8, Psi + {IV('Ω'), 'O', 0}, // 03A9, Omega + {IV('Ϊ'), 'I', 0}, // 03AA + {IV('Ϋ'), 'Y', 0}, // 03AB + {IV('ά'), 'a', 0}, // 03AC + {IV('έ'), 'e', 0}, // 03AD + {IV('ή'), 'n', 0}, // 03AE + {IV('ί'), 'i', 0}, // 03AF + {IV('ΰ'), 'v', 0}, // 03B0 + {IV('α'), 'a', 0}, // 03B1, alpha + {IV('β'), 'B', 0}, // 03B2, beta + {IV('γ'), 'v', 0}, // 03B3, gamma + {IV('δ'), 'd', 0}, // 03B4, delta + {IV('ε'), 'e', 0}, // 03B5, epsilon + {IV('ζ'), 'Z', 0}, // 03B6, zeta + {IV('η'), 'n', 0}, // 03B7, eta + {IV('θ'), '0', 0}, // 03B8, theta + {IV('ι'), 'i', 0}, // 03B9, lota + {IV('κ'), 'k', 0}, // 03BA, kappa + {IV('λ'), 'L', 0}, // 03BB, lambda + {IV('μ'), 'u', 0}, // 03BC, mu + {IV('ν'), 'v', 0}, // 03BD, nu + {IV('ξ'), 'e', 0}, // 03BE, xi + {IV('ο'), 'o', 0}, // 03BF + {IV('Ï€'), 'n', 0}, // 03C0, pi + {IV('Ï'), 'p', 0}, // 03C1, rho + {IV('Ï‚'), 'c', 0}, // 03C2 + {IV('σ'), 'o', 0}, // 03C3, sigma + {IV('Ï„'), 't', 0}, // 03C4, tau + {IV('Ï…'), 'v', 0}, // 03C5, upsilon + {IV('φ'), 'p', 0}, // 03C6 + {IV('χ'), 'X', 0}, // 03C7, chi + {IV('ψ'), 'W', 0}, // 03C8, psi + {IV('ω'), 'w', 0}, // 03C9, omega + {IV('ÏŠ'), 'i', 0}, // 03CA + {IV('Ï‹'), 'v', 0}, // 03CB + {IV('ÏŒ'), 'o', 0}, // 03CC + {IV('Ï'), 'v', 0}, // 03CD + {IV('ÏŽ'), 'w', 0}, // 03CE + + // map CYRILLIC code to the plain ASCII + {IV('Ð'), 'E', 0}, // 0401 + {IV('Ð'), 'A', 0}, // 0410 + {IV('Б'), 'b', 0}, // 0411 + {IV('Ð’'), 'B', 0}, // 0412 + {IV('Г'), 'T', 0}, // 0413 + {IV('Д'), 'Q', 0}, // 0414 + {IV('Е'), 'E', 0}, // 0415 + {IV('Ж'), '*', 0}, // 0416 + {IV('З'), 'E', 0}, // 0417 + {IV('И'), 'N', 0}, // 0418 + {IV('Й'), 'N', 0}, // 0419 + {IV('К'), 'K', 0}, // 041A + {IV('Л'), 'T', 0}, // 041B + {IV('М'), 'M', 0}, // 041C + {IV('Ð'), 'H', 0}, // 041D + {IV('О'), 'O', 0}, // 041E + {IV('П'), 'n', 0}, // 041F + {IV('Р'), 'P', 0}, // 0420 + {IV('С'), 'C', 0}, // 0421 + {IV('Т'), 'T', 0}, // 0422 + {IV('У'), 'Y', 0}, + {IV('Ф'), 'o', 0}, + {IV('Ð¥'), 'X', 0}, + {IV('Ц'), 'U', 0}, + {IV('Ч'), 'y', 0}, + {IV('Ш'), 'W', 0}, + {IV('Щ'), 'W', 0}, + {IV('Ъ'), 'b', 0}, + {IV('Ы'), 'b', '|'}, + {IV('Ь'), 'b'}, + {IV('Э'), 'e'}, + {IV('Ю'), '|', 'O'}, + {IV('Я'), '9', '|'}, // 042F + + {IV('а'), 'a', 0}, // 0430 + {IV('б'), '6', 0}, // 0431 + {IV('в'), 'B', 0}, // 0432, + {IV('г'), 'r', 0}, // 0433 + {IV('д'), 'a', 0}, // 0434, + {IV('е'), 'e', 0}, // 0435 + {IV('ж'), '*', 0}, // 0436 + {IV('з'), 'e', 0}, // 0437, + {IV('и'), 'u', 0}, // 0438 + {IV('й'), 'u', 0}, // 0439, + {IV('к'), 'k', 0}, // 043A + {IV('л'), 'n', 0}, + {IV('м'), 'm', 0}, + {IV('н'), 'H', 0}, + {IV('о'), 'o', 0}, + {IV('п'), 'n', 0}, + {IV('Ñ€'), 'p', 0}, + {IV('Ñ'), 'c', 0}, + {IV('Ñ‚'), 't', 0}, + {IV('у'), 'y', 0}, + {IV('Ñ„'), 'q', 'p'}, + {IV('Ñ…'), 'x', 0}, + {IV('ц'), 'u', 0}, + {IV('ч'), 'y', 0}, + {IV('ш'), 'w', 0}, + {IV('щ'), 'w', 0}, + {IV('ÑŠ'), 'b', 0}, + {IV('Ñ‹'), 'b', '|'}, + {IV('ÑŒ'), 'b', 0}, + {IV('Ñ'), 'e', 0}, + {IV('ÑŽ'), '|', 'o'}, + {IV('Ñ'), 'g', 0}, // 044F + {IV('Ñ‘'), 'e', 0}, // 0451 + + {IV('•'), '.', 0}, // 2022 · + {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 + {IV('â„¢'), 'T', 'M'}, // 2122 + {IV('â†'), '<', '-'}, // 2190 + {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→âµâžŸâž âž¡' LCD_STR_ARROW_RIGHT (0x03) + //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('∼'), '~', 0}, // 223C + {IV('≈'), '~', '='}, // 2248 + {IV('≠'), '!', '='}, // 2260 + {IV('≡'), '=', 0}, // 2261 + {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ + {IV('≥'), '>', '='}, // 2265 + {IV('â±'), 0x07, 0}, // 23F1, Marlin special: 'ðŸ•🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜ðŸ•🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛â°â±â³â§–â§—' LCD_STR_CLOCK (0x05) + + {IV('ã‚ '), '=', 0}, // 30A0 + + // â°â±â²â³â—´â—µâ—¶â—· + // â»â¼â™â™‚ + //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) + {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) + {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: 'ðŸ“📂' LCD_STR_FOLDER (0x02) + //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) +}; + +/* return v1 - v2 */ +static int hd44780_charmap_compare(hd44780_charmap_t * v1, hd44780_charmap_t * v2) { + if (v1->uchar < v2->uchar) + return -1; + else if (v1->uchar > v2->uchar) + return 1; + return 0; +} + +static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { + hd44780_charmap_t localval; + hd44780_charmap_t *p_hd44780_charmap = (hd44780_charmap_t *)userdata; + memcpy_P(&localval, p_hd44780_charmap + idx, sizeof(localval)); + return hd44780_charmap_compare(&localval, (hd44780_charmap_t *)data_pin); +} + +#if DEBUG + +int test_hd44780_charmap(hd44780_charmap_t *data, size_t size, char *name, char flg_show_contents) { + int ret; + size_t idx = 0; + hd44780_charmap_t preval = {0, 0, 0}; + hd44780_charmap_t pinval = {0, 0, 0}; + char flg_error = 0; + + int i; + + TRACE("Test %s\n", name); + + for (i = 0; i < size; i ++) { + memcpy_P (&pinval, &(data[i]), sizeof(pinval)); + + if (flg_show_contents) { + #if 1 + TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #else + TRACE("[% 4d]", i); + TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); + TRACE("0x%02X,", (unsigned int)(pinval.idx)); + TRACE("0x%02X,", (unsigned int)(pinval.idx2)); + TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #endif + } + if (preval.uchar >= pinval.uchar) { + flg_error = 1; + // TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + // return -1; + } + memcpy (&preval, &pinval, sizeof(pinval)); + + ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret < 0) { + flg_error = 1; + TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + if (idx != i) { + flg_error = 1; + TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + } + if (flg_error) { + TRACE("\nError: in array %s\n\n", name); + return -1; + } + TRACE("\nPASS array %s\n\n", name); + return 0; +} + +int test_hd44780_charmap_all(void) { + int flg_error = 0; + if (test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 1); + } + if (test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 1); + } + if (flg_error) { + TRACE("\nFAILED in hd44780 tests!\n"); + return -1; + } + TRACE("\nPASS in hd44780 tests.\n"); + return 0; +} + +#endif // DEBUG + +void lcd_moveto(int col, int row) { + plcd->setCursor(col, row); +} + +// return < 0 on error +// return the advanced cols +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + + // find the HD44780 internal ROM first + int ret; + size_t idx = 0; + hd44780_charmap_t pinval; + hd44780_charmap_t *copy_address = NULL; + pinval.uchar = c; + pinval.idx = -1; + + if (max_length < 1) return 0; + + // TODO: fix the '\\' that doesnt exist in the HD44870 + if (c < 128) { + plcd->write((uint8_t)c); + return 1; + } + copy_address = NULL; + ret = pf_bsearch_r((void *)g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) { + copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_device + idx); + } + else { + ret = pf_bsearch_r((void *)g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_common + idx); + } + + if (ret >= 0) { + hd44780_charmap_t localval; + // found + memcpy_P(&localval, copy_address, sizeof(localval)); + plcd->write(localval.idx); + if (max_length >= 2 && localval.idx2 > 0) { + plcd->write(localval.idx2); + return 2; + } + return 1; + } + + // Not found, print '?' instead + plcd->write((uint8_t)'?'); + return 1; +} + +/** +* @brief Draw a UTF-8 string +* +* @param utf8_str : the UTF-8 string +* @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) +* @param max_length : the pixel length of the string allowed (or number of slots in HD44780) +* +* @return the number of pixels advanced +* +* Draw a UTF-8 string +*/ +static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { + pixel_len_t ret = 0; + uint8_t *p = (uint8_t *)utf8_str; + while (ret < max_length) { + wchar_t ch = 0; + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + ret += lcd_put_wchar_max(ch, max_length - ret); + } + return (int)ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); +} + +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); +} + +#endif // DOGLCD +#endif // ULTRA_LCD diff --git a/Marlin/src/lcd/lcdprint_u8g.cpp b/Marlin/src/lcd/lcdprint_u8g.cpp new file mode 100644 index 0000000000..39ac8acc30 --- /dev/null +++ b/Marlin/src/lcd/lcdprint_u8g.cpp @@ -0,0 +1,65 @@ +/** + * @file lcdprint_u8g.c + * @brief LCD print api for u8glib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +extern U8GLIB *pu8g; +#define _lcd_write(a) pu8g->print(a) +#define _lcd_setcursor(col, row) pu8g->setPrintPos((col), (row)); + +#include "ultralcd.h" +#include "../Marlin.h" + +#include "fontutils.h" +#include "u8g_fontutf8.h" +#include "lcdprint.h" + +int lcd_glyph_height(void) { + return u8g_GetFontBBXHeight(pu8g->getU8g()); +} + +void lcd_moveto(int col, int row) { + _lcd_setcursor(col, row); +} + +// return < 0 on error +// return the advanced pixels +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (c < 256) { + _lcd_write((char)c); + return u8g_GetFontBBXWidth(pu8g->getU8g()); + } + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawWchar(pu8g->getU8g(), x, y, c, max_length); + pu8g->setPrintPos(x + ret, y); + + return ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawUtf8Str(pu8g->getU8g(), x, y, utf8_str, max_length); + pu8g->setPrintPos(x + ret, y); + return ret; +} + +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length) { + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawUtf8StrP(pu8g->getU8g(), x, y, utf8_str_P, max_length); + pu8g->setPrintPos(x + ret, y); + return ret; +} + +#endif // DOGLCD diff --git a/Marlin/malyanlcd.cpp b/Marlin/src/lcd/malyanlcd.cpp similarity index 71% rename from Marlin/malyanlcd.cpp rename to Marlin/src/lcd/malyanlcd.cpp index 894b8ae642..daeeba2f38 100644 --- a/Marlin/malyanlcd.cpp +++ b/Marlin/src/lcd/malyanlcd.cpp @@ -41,21 +41,29 @@ * Copyright (c) 2017 Jason Nelson (xC0000005) */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(MALYAN_LCD) -#include "cardreader.h" -#include "SdFatConfig.h" -#include "temperature.h" -#include "planner.h" -#include "stepper.h" -#include "duration_t.h" -#include "printcounter.h" -#include "parser.h" -#include "configuration_store.h" +#include "../module/temperature.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../module/motion.h" +#include "../module/probe.h" +#include "../libs/duration_t.h" +#include "../module/printcounter.h" +#include "../gcode/gcode.h" +#include "../gcode/queue.h" +#include "../module/configuration_store.h" -#include "Marlin.h" +#include "../Marlin.h" + +#if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" + #include "../sd/SdFatConfig.h" +#else + #define LONG_FILENAME_LENGTH 0 +#endif // On the Malyan M200, this will be Serial1. On a RAMPS board, // it might not be. @@ -72,7 +80,7 @@ int inbound_count; // Everything written needs the high bit set. void write_to_lcd_P(const char * const message) { char encoded_message[MAX_CURLY_COMMAND]; - uint8_t message_length = min(strlen_P(message), sizeof(encoded_message)); + uint8_t message_length = MIN(strlen_P(message), sizeof(encoded_message)); for (uint8_t i = 0; i < message_length; i++) encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; @@ -82,7 +90,7 @@ void write_to_lcd_P(const char * const message) { void write_to_lcd(const char * const message) { char encoded_message[MAX_CURLY_COMMAND]; - const uint8_t message_length = min(strlen(message), sizeof(encoded_message)); + const uint8_t message_length = MIN(strlen(message), sizeof(encoded_message)); for (uint8_t i = 0; i < message_length; i++) encoded_message[i] = message[i] | 0x80; @@ -132,8 +140,6 @@ void process_lcd_c_command(const char* command) { void process_lcd_eb_command(const char* command) { char elapsed_buffer[10]; duration_t elapsed; - bool has_days; - uint8_t len; switch (command[0]) { case '0': { elapsed = print_job_timer.duration(); @@ -144,9 +150,17 @@ void process_lcd_eb_command(const char* command) { PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}{TQ:%03i}{TT:%s}"), thermalManager.degHotend(0), thermalManager.degTargetHotend(0), - thermalManager.degBed(), - thermalManager.degTargetBed(), - card.percentDone(), + #if HAS_HEATED_BED + thermalManager.degBed(), + thermalManager.degTargetBed(), + #else + 0, 0, + #endif + #if ENABLED(SDSUPPORT) + card.percentDone(), + #else + 0, + #endif elapsed_buffer); write_to_lcd(message_buffer); } break; @@ -223,51 +237,55 @@ void process_lcd_p_command(const char* command) { switch (command[0]) { case 'X': - // cancel print - write_to_lcd_P(PSTR("{SYS:CANCELING}")); - card.stopSDPrint( - #if SD_RESORT - true + #if ENABLED(SDSUPPORT) + // cancel print + write_to_lcd_P(PSTR("{SYS:CANCELING}")); + card.stopSDPrint( + #if SD_RESORT + true + #endif + ); + clear_command_queue(); + quickstop_stepper(); + print_job_timer.stop(); + thermalManager.disable_all_heaters(); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; #endif - ); - clear_command_queue(); - quickstop_stepper(); - print_job_timer.stop(); - thermalManager.disable_all_heaters(); - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + wait_for_heatup = false; + write_to_lcd_P(PSTR("{SYS:STARTED}")); #endif - wait_for_heatup = false; - write_to_lcd_P(PSTR("{SYS:STARTED}")); break; case 'H': // Home all axis enqueue_and_echo_commands_now_P(PSTR("G28")); break; default: { - // Print file 000 - a three digit number indicating which - // file to print in the SD card. If it's a directory, - // then switch to the directory. + #if ENABLED(SDSUPPORT) + // Print file 000 - a three digit number indicating which + // file to print in the SD card. If it's a directory, + // then switch to the directory. - // Find the name of the file to print. - // It's needed to echo the PRINTFILE option. - // The {S:L} command should've ensured the SD card was mounted. - card.getfilename(atoi(command)); + // Find the name of the file to print. + // It's needed to echo the PRINTFILE option. + // The {S:L} command should've ensured the SD card was mounted. + card.getfilename(atoi(command)); - // There may be a difference in how V1 and V2 LCDs handle subdirectory - // prints. Investigate more. This matches the V1 motion controller actions - // but the V2 LCD switches to "print" mode on {SYS:DIR} response. - if (card.filenameIsDir) { - card.chdir(card.filename); - write_to_lcd_P(PSTR("{SYS:DIR}")); - } - else { - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.filename); - write_to_lcd(message_buffer); - write_to_lcd_P(PSTR("{SYS:BUILD}")); - card.openAndPrintFile(card.filename); - } + // There may be a difference in how V1 and V2 LCDs handle subdirectory + // prints. Investigate more. This matches the V1 motion controller actions + // but the V2 LCD switches to "print" mode on {SYS:DIR} response. + if (card.filenameIsDir) { + card.chdir(card.filename); + write_to_lcd_P(PSTR("{SYS:DIR}")); + } + else { + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.filename); + write_to_lcd(message_buffer); + write_to_lcd_P(PSTR("{SYS:BUILD}")); + card.openAndPrintFile(card.filename); + } + #endif } break; // default } // switch } @@ -292,34 +310,40 @@ void process_lcd_s_command(const char* command) { char message_buffer[MAX_CURLY_COMMAND]; sprintf_P(message_buffer, PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}"), thermalManager.degHotend(0), thermalManager.degTargetHotend(0), - thermalManager.degBed(), thermalManager.degTargetBed() + #if HAS_HEATED_BED + thermalManager.degBed(), thermalManager.degTargetBed() + #else + 0, 0 + #endif ); write_to_lcd(message_buffer); } break; case 'H': // Home all axis - enqueue_and_echo_command("G28", false); + enqueue_and_echo_command("G28"); break; case 'L': { - if (!card.cardOK) card.initsd(); + #if ENABLED(SDSUPPORT) + if (!card.cardOK) card.initsd(); - // A more efficient way to do this would be to - // implement a callback in the ls_SerialPrint code, but - // that requires changes to the core cardreader class that - // would not benefit the majority of users. Since one can't - // select a file for printing during a print, there's - // little reason not to do it this way. - char message_buffer[MAX_CURLY_COMMAND]; - uint16_t file_count = card.get_num_Files(); - for (uint16_t i = 0; i < file_count; i++) { - card.getfilename(i); - sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.filename); - write_to_lcd(message_buffer); - } + // A more efficient way to do this would be to + // implement a callback in the ls_SerialPrint code, but + // that requires changes to the core cardreader class that + // would not benefit the majority of users. Since one can't + // select a file for printing during a print, there's + // little reason not to do it this way. + char message_buffer[MAX_CURLY_COMMAND]; + uint16_t file_count = card.get_num_Files(); + for (uint16_t i = 0; i < file_count; i++) { + card.getfilename(i); + sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.filename); + write_to_lcd(message_buffer); + } - write_to_lcd_P(PSTR("{SYS:OK}")); + write_to_lcd_P(PSTR("{SYS:OK}")); + #endif } break; default: @@ -379,7 +403,7 @@ void update_usb_status(const bool forceUpdate) { // appears to use the usb discovery status. // This is more logical. if (last_usb_connected_status != Serial || forceUpdate) { - last_usb_connected_status = Serial; + last_usb_connected_status = Serial; write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); } } @@ -390,7 +414,7 @@ void update_usb_status(const bool forceUpdate) { * The optimize attribute fixes a register Compile * error for amtel. */ -void lcd_update() _O2 { +void lcd_update() { static char inbound_buffer[MAX_CURLY_COMMAND]; // First report USB status. @@ -408,15 +432,17 @@ void lcd_update() _O2 { } } - // If there's a print in progress, we need to emit the status as - // {TQ:} - if (card.sdprinting) { - // We also need to send: T:-2538.0 E:0 - // I have no idea what this means. - char message_buffer[10]; - sprintf_P(message_buffer, PSTR("{TQ:%03i}"), card.percentDone()); - write_to_lcd(message_buffer); - } + #if ENABLED(SDSUPPORT) + // If there's a print in progress, we need to emit the status as + // {TQ:} + if (card.sdprinting) { + // We also need to send: T:-2538.0 E:0 + // I have no idea what this means. + char message_buffer[10]; + sprintf_P(message_buffer, PSTR("{TQ:%03i}"), card.percentDone()); + write_to_lcd(message_buffer); + } + #endif } /** diff --git a/Marlin/thermistornames.h b/Marlin/src/lcd/thermistornames.h similarity index 88% rename from Marlin/thermistornames.h rename to Marlin/src/lcd/thermistornames.h index c26a1fe91c..2ffaba11ad 100644 --- a/Marlin/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -20,6 +20,15 @@ * */ +/** + * thermistornames.h + * + * Used by LCD code to obtain a thermistor name + * + * Usage: Set THERMISTOR_ID then #include this file + * to set a new value for THERMISTOR_NAME. + */ + #undef THERMISTOR_NAME // Thermcouples @@ -46,11 +55,11 @@ #elif THERMISTOR_ID == 6 #define THERMISTOR_NAME "EPCOS (alt)" #elif THERMISTOR_ID == 7 - #define THERMISTOR_NAME "Honeywell 104LAG" + #define THERMISTOR_NAME "HW 104LAG" #elif THERMISTOR_ID == 71 - #define THERMISTOR_NAME "Honeywell 104LAF" + #define THERMISTOR_NAME "HW 104LAF" #elif THERMISTOR_ID == 8 - #define THERMISTOR_NAME "E3104FHT" + #define THERMISTOR_NAME "E3104FXT" #elif THERMISTOR_ID == 9 #define THERMISTOR_NAME "GE AL03006" #elif THERMISTOR_ID == 10 @@ -58,9 +67,9 @@ #elif THERMISTOR_ID == 11 #define THERMISTOR_NAME "1% beta 3950" #elif THERMISTOR_ID == 12 - #define THERMISTOR_NAME "Unknown" + #define THERMISTOR_NAME "E3104FXT (alt)" #elif THERMISTOR_ID == 13 - #define THERMISTOR_NAME "Hisens" + #define THERMISTOR_NAME "Hisens 3950" #elif THERMISTOR_ID == 20 #define THERMISTOR_NAME "PT100 UltiMB" #elif THERMISTOR_ID == 60 diff --git a/Marlin/src/lcd/u8g_fontutf8.cpp b/Marlin/src/lcd/u8g_fontutf8.cpp new file mode 100644 index 0000000000..b79d9906eb --- /dev/null +++ b/Marlin/src/lcd/u8g_fontutf8.cpp @@ -0,0 +1,320 @@ +/** + * @file u8g_fontutf8.cpp + * @brief font api for u8g lib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright GPL/BSD + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include "fontutils.h" +#include "u8g_fontutf8.h" + +//////////////////////////////////////////////////////////// +typedef void font_t; + +/** + * @brief the callback function to draw something + * + * @param userdata : User's data + * @param msg : the u8g's string + * @param fnt_current : the font + * + * @return 0 on success, 1 to force quit, <0 on error + * + * Get the screen pixel width of a ROM UTF-8 string + */ +typedef int (* fontgroup_cb_draw_t)(void *userdata, const font_t *fnt_current, const char *msg); + +//////////////////////////////////////////////////////////// +/* return v1 - v2 */ +static int fontinfo_compare(uxg_fontinfo_t * v1, uxg_fontinfo_t * v2) { + if (v1->page < v2->page) return -1; + else if (v1->page > v2->page) return 1; + + if (v1->end < v2->begin) return -1; + else if (v1->begin > v2->end) return 1; + + return 0; +} + +/*"data_list[idx] - *data_pin"*/ +static int pf_bsearch_cb_comp_fntifo_pgm (void *userdata, size_t idx, void *data_pin) { + uxg_fontinfo_t *fntinfo = (uxg_fontinfo_t*)userdata; + uxg_fontinfo_t localval; + memcpy_P(&localval, fntinfo + idx, sizeof(localval)); + return fontinfo_compare(&localval, (uxg_fontinfo_t*)data_pin); +} + +typedef struct _font_group_t { + const uxg_fontinfo_t * m_fntifo; + int m_fntinfo_num; +} font_group_t; + +static int fontgroup_init(font_group_t * root, const uxg_fontinfo_t * fntinfo, int number) { + root->m_fntifo = fntinfo; + root->m_fntinfo_num = number; + return 0; +} + +static const font_t* fontgroup_find(font_group_t * root, wchar_t val) { + uxg_fontinfo_t vcmp = {(uint16_t)(val / 128), (uint8_t)(val % 128 + 128), (uint8_t)(val % 128 + 128), 0, 0}; + size_t idx = 0; + + if (val < 256) return NULL; + + if (pf_bsearch_r((void*)root->m_fntifo, root->m_fntinfo_num, pf_bsearch_cb_comp_fntifo_pgm, (void*)&vcmp, &idx) < 0) + return NULL; + + memcpy_P(&vcmp, root->m_fntifo + idx, sizeof(vcmp)); + return vcmp.fntdata; +} + +static void fontgroup_drawwchar(font_group_t *group, const font_t *fnt_default, wchar_t val, void * userdata, fontgroup_cb_draw_t cb_draw_ram) { + uint8_t buf[2] = {0, 0}; + const font_t * fntpqm = (font_t*)fontgroup_find(group, val); + if (!fntpqm) { + // Unknown char, use default font + buf[0] = (uint8_t)(val & 0xFF); + fntpqm = fnt_default; + } + if (fnt_default != fntpqm) { + buf[0] = (uint8_t)(val & 0x7F); + buf[0] |= 0x80; // use upper page to avoid 0x00 error in C. you may want to generate the font data + } + + cb_draw_ram (userdata, fntpqm, (char*) buf); +} + +/** + * @brief try to process a utf8 string + * + * @param pu8g : U8G pointer + * @param fnt_default : the default font + * @param utf8_msg : the UTF-8 string + * @param cb_read_byte : how to read the utf8_msg, from RAM or ROM (call read_byte_ram or pgm_read_byte) + * @param userdata : User's data + * @param cb_draw_ram : the callback function of userdata to draw a !RAM! string (actural it is to draw a one byte string in RAM) + * + * @return N/A + * + * Get the screen pixel width of a ROM UTF-8 string + */ +static void fontgroup_drawstring(font_group_t *group, const font_t *fnt_default, const char *utf8_msg, read_byte_cb_t cb_read_byte, void * userdata, fontgroup_cb_draw_t cb_draw_ram) { + uint8_t *p = (uint8_t*)utf8_msg; + for (;;) { + wchar_t val = 0; + p = get_utf8_value_cb(p, cb_read_byte, &val); + if (!val) break; + fontgroup_drawwchar(group, fnt_default, val, userdata, cb_draw_ram); + } +} + +//////////////////////////////////////////////////////////// +static bool flag_fontgroup_was_inited = false; +static font_group_t g_fontgroup_root = {NULL, 0}; + +/** + * @brief check if font is loaded + */ +static inline bool uxg_Utf8FontIsInited(void) { return flag_fontgroup_was_inited; } + +int uxg_SetUtf8Fonts (const uxg_fontinfo_t * fntinfo, int number) { + flag_fontgroup_was_inited = 1; + return fontgroup_init(&g_fontgroup_root, fntinfo, number); +} + +struct _uxg_drawu8_data_t { + u8g_t *pu8g; + unsigned int x; + unsigned int y; + unsigned int adv; + unsigned int max_width; // the max pixel width of the string allowed + const void * fnt_prev; +}; + +static int fontgroup_cb_draw_u8g(void *userdata, const font_t *fnt_current, const char *msg) { + struct _uxg_drawu8_data_t * pdata = (_uxg_drawu8_data_t*)userdata; + + if (pdata->fnt_prev != fnt_current) { + u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + //u8g_SetFontPosBottom(pdata->pu8g); + pdata->fnt_prev = fnt_current; + } + if ((pdata->max_width != PIXEL_LEN_NOLIMIT) && (pdata->adv + u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg) > pdata->max_width)) + return 1; + pdata->adv += u8g_DrawStr(pdata->pu8g, pdata->x + pdata->adv, pdata->y, (char*) msg); + return 0; +} + +/** + * @brief Draw a wchar_t at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param ch : the wchar_t + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a UTF-8 string at the specified position + */ +unsigned int uxg_DrawWchar(u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = NULL; + fontgroup_drawwchar(group, fnt_default, ch, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Draw a UTF-8 string at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param utf8_msg : the UTF-8 string + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a UTF-8 string at the specified position + */ +unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = NULL; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_ram, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Draw a ROM UTF-8 string at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param utf8_msg : the UTF-8 string + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a ROM UTF-8 string at the specified position + */ +unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = NULL; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_rom, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +static int fontgroup_cb_draw_u8gstrlen(void *userdata, const font_t *fnt_current, const char *msg) { + struct _uxg_drawu8_data_t * pdata = (_uxg_drawu8_data_t*)userdata; + + if (pdata->fnt_prev != fnt_current) { + u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + u8g_SetFontPosBottom(pdata->pu8g); + pdata->fnt_prev = fnt_current; + } + pdata->adv += u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg); + return 0; +} + +/** + * @brief Get the screen pixel width of a UTF-8 string + * + * @param pu8g : U8G pointer + * @param utf8_msg : the UTF-8 string + * + * @return the pixel width + * + * Get the screen pixel width of a UTF-8 string + */ +int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) return -1; + + memset(&data, 0, sizeof(data)); + data.pu8g = pu8g; + data.adv = 0; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_ram, (void*)&data, fontgroup_cb_draw_u8gstrlen); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Get the screen pixel width of a ROM UTF-8 string + * + * @param pu8g : U8G pointer + * @param utf8_msg : the UTF-8 string + * + * @return the pixel width + * + * Get the screen pixel width of a ROM UTF-8 string + */ +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, const char *utf8_msg) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) return -1; + + memset(&data, 0, sizeof(data)); + data.pu8g = pu8g; + data.adv = 0; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_rom, (void*)&data, fontgroup_cb_draw_u8gstrlen); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + return data.adv; +} + +#endif // DOGLCD diff --git a/Marlin/src/lcd/u8g_fontutf8.h b/Marlin/src/lcd/u8g_fontutf8.h new file mode 100644 index 0000000000..80522784c0 --- /dev/null +++ b/Marlin/src/lcd/u8g_fontutf8.h @@ -0,0 +1,40 @@ +/** + * @file fontutf8.h + * @brief font api for u8g lib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright GPL/BSD + */ +#ifndef _UXG_FONTUTF8_H +#define _UXG_FONTUTF8_H 1 + +#include +#include "fontutils.h" + +// the macro to indicate a UTF-8 string +// You should to save the C/C++ source in UTF-8 encoding! +// Once you change your UTF-8 strings, you need to call the script uxggenpages.sh to create the font data file fontutf8-data.h +#define _UxGT(a) a + +typedef struct _uxg_fontinfo_t { + uint16_t page; + uint8_t begin; + uint8_t end; + uint16_t size; + const u8g_fntpgm_uint8_t *fntdata; +} uxg_fontinfo_t; + +int uxg_SetUtf8Fonts (const uxg_fontinfo_t * fntinfo, int number); // fntinfo is type of PROGMEM + +unsigned int uxg_DrawWchar (u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_length); + +unsigned int uxg_DrawUtf8Str (u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); +unsigned int uxg_DrawUtf8StrP (u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); + +int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg); +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, const char *utf8_msg); + +#define uxg_GetFont(puxg) ((puxg)->font) + +#endif // _UXG_FONTUTF8_H diff --git a/Marlin/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp similarity index 94% rename from Marlin/ultralcd.cpp rename to Marlin/src/lcd/ultralcd.cpp index 45f83531ea..6548bb94aa 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -20,49 +20,58 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" #if ENABLED(ULTRA_LCD) +#include + #include "ultralcd.h" -#include "Marlin.h" -#include "language.h" -#include "cardreader.h" -#include "temperature.h" -#include "planner.h" -#include "stepper.h" -#include "configuration_store.h" -#include "utility.h" -#include "parser.h" -#if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) - #include "buzzer.h" -#endif +#include "../sd/cardreader.h" +#include "../module/temperature.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../module/motion.h" +#include "../module/probe.h" +#include "../module/printcounter.h" +#include "../gcode/gcode.h" +#include "../gcode/queue.h" +#include "../module/configuration_store.h" -#include "printcounter.h" +#include "../Marlin.h" -#if ENABLED(PRINTCOUNTER) - #include "duration_t.h" -#endif - -#if ENABLED(BLTOUCH) - #include "endstops.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" -#elif HAS_ABL - #include "planner.h" -#elif ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING) - #include "mesh_bed_leveling.h" -#endif - -#if ENABLED(FWRETRACT) - #include "fwretract.h" +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) - #include "power_loss_recovery.h" + #include "../feature/power_loss_recovery.h" +#endif + +#if ENABLED(PRINTCOUNTER) && ENABLED(LCD_INFO_MENU) + #include "../libs/duration_t.h" +#endif + +#if ENABLED(FILAMENT_LCD_DISPLAY) + #include "../feature/filwidth.h" +#endif + +#if ENABLED(BLTOUCH) + #include "../module/endstops.h" +#endif + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(LED_CONTROL_MENU) + #include "../feature/leds/leds.h" +#endif + +// For i2c define BUZZ to use lcd_buzz +#if DISABLED(LCD_USE_I2C_BUZZER) + #include "../libs/buzzer.h" #endif #if ENABLED(STATUS_MESSAGE_SCROLLING) @@ -71,7 +80,7 @@ #else #define MAX_MESSAGE_LENGTH CHARSIZE * 2 * (LCD_WIDTH) #endif - uint8_t status_scroll_pos = 0; + uint8_t status_scroll_offset = 0; #else #define MAX_MESSAGE_LENGTH CHARSIZE * (LCD_WIDTH) #endif @@ -94,9 +103,7 @@ uint8_t lcd_status_update_delay = 1, // First update one loop delayed #if ENABLED(DOGLCD) #include "ultralcd_impl_DOGM.h" - #include - bool drawing_screen, // = false - first_page; + bool drawing_screen, first_page; // = false #else #include "ultralcd_impl_HD44780.h" constexpr bool first_page = true; @@ -164,7 +171,7 @@ uint16_t max_display_update_time = 0; #endif #if ENABLED(DAC_STEPPER_CURRENT) - #include "stepper_dac.h" //was dac_mcp4728.h MarlinMain uses stepper dac for the m-codes + #include "../feature/dac/stepper_dac.h" //was dac_mcp4728.h MarlinMain uses stepper dac for the m-codes uint8_t driverPercent[XYZE]; #endif @@ -199,7 +206,6 @@ uint16_t max_display_update_time = 0; #endif // LCD_INFO_MENU #if ENABLED(LED_CONTROL_MENU) - #include "leds.h" void lcd_led_menu(); #endif @@ -219,6 +225,7 @@ uint16_t max_display_update_time = 0; #endif #if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" void lcd_control_retract_menu(); #endif @@ -226,6 +233,10 @@ uint16_t max_display_update_time = 0; void lcd_delta_calibrate_menu(); #endif + #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING) + #include "../feature/bedlevel/mbl/mesh_bed_leveling.h" + #endif + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) static float new_z_fade_height; void _lcd_set_z_fade_height() { set_z_fade_height(new_z_fade_height); } @@ -493,6 +504,11 @@ uint16_t max_display_update_time = 0; void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder/*=0*/) { if (currentScreen != screen) { + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + // Shadow for editing the fade height + new_z_fade_height = planner.z_fade_height; + #endif + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) && ENABLED(BABYSTEPPING) static millis_t doubleclick_expire_ms = 0; // Going to lcd_main_menu from status screen? Remember first click time. @@ -501,7 +517,7 @@ uint16_t max_display_update_time = 0; if (currentScreen == lcd_status_screen) doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; } - else if (screen == lcd_status_screen && currentScreen == lcd_main_menu && PENDING(millis(), doubleclick_expire_ms)) + else if (screen == lcd_status_screen && currentScreen == lcd_main_menu && PENDING(millis(), doubleclick_expire_ms) && (planner.movesplanned() || IS_SD_PRINTING)) screen = #if ENABLED(BABYSTEP_ZPROBE_OFFSET) lcd_babystep_zoffset @@ -559,7 +575,7 @@ uint16_t max_display_update_time = 0; no_reentry = true; const screenFunc_t old_screen = currentScreen; lcd_goto_screen(_lcd_synchronize); - stepper.synchronize(); // idle() is called until moves complete + planner.synchronize(); // idle() is called until moves complete no_reentry = false; lcd_goto_screen(old_screen); } @@ -618,7 +634,7 @@ uint16_t max_display_update_time = 0; screen_changed = false; } if (screen_items > 0 && encoderLine >= screen_items - limit) { - encoderLine = max(0, screen_items - limit); + encoderLine = MAX(0, screen_items - limit); encoderPosition = encoderLine * (ENCODER_STEPS_PER_MENU_ITEM); } if (is_menu) { @@ -925,9 +941,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #if ENABLED(MENU_ITEM_CASE_LIGHT) - extern uint8_t case_light_brightness; - extern bool case_light_on; - extern void update_case_light(); + #include "../feature/caselight.h" void case_light_menu() { START_MENU(); @@ -935,7 +949,7 @@ void lcd_quick_feedback(const bool clear_buttons) { // ^ Main // MENU_BACK(MSG_MAIN); - MENU_ITEM_EDIT_CALLBACK(int8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); + //MENU_ITEM_EDIT_CALLBACK(int8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); END_MENU(); } @@ -1067,13 +1081,6 @@ void lcd_quick_feedback(const bool clear_buttons) { * */ - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void _lcd_goto_tune_menu() { - lcd_goto_screen(lcd_tune_menu); - new_z_fade_height = planner.z_fade_height; - } - #endif - void lcd_main_menu() { START_MENU(); MENU_BACK(MSG_WATCH); @@ -1100,18 +1107,11 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); #endif - if (planner.movesplanned() || IS_SD_PRINTING) { - MENU_ITEM(submenu, MSG_TUNE, - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - _lcd_goto_tune_menu - #else - lcd_tune_menu - #endif - ); - } - else { + if (planner.movesplanned() || IS_SD_PRINTING) + MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); + else MENU_ITEM(submenu, MSG_PREPARE, lcd_prepare_menu); - } + MENU_ITEM(submenu, MSG_CONTROL, lcd_control_menu); #if ENABLED(SDSUPPORT) @@ -1441,26 +1441,32 @@ void lcd_quick_feedback(const bool clear_buttons) { // Fan Speed: // #if FAN_COUNT > 0 - #if HAS_FAN0 + #if (HAS_FAN0 && FAN_NUM_AS_LASER!=0) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &fanSpeeds[0], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &new_fanSpeeds[0], 3, 255); #endif #endif - #if HAS_FAN1 + #if (HAS_FAN1 && FAN_NUM_AS_LASER!=1) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 2", &new_fanSpeeds[1], 3, 255); #endif #endif - #if HAS_FAN2 + #if (HAS_FAN2 && FAN_NUM_AS_LASER!=2) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 3", &new_fanSpeeds[2], 3, 255); #endif #endif #endif // FAN_COUNT > 0 - + // + // Laser ON/OFF: + // + #if ENABLED(FAN_AS_LASER) + MENU_ITEM(gcode, MSG_LASER_ON, PSTR(" M3 ")); + MENU_ITEM(gcode, MSG_LASER_OFF, PSTR(" M5 ")); + #endif // // Flow: // Flow [1-5]: @@ -1570,7 +1576,7 @@ void lcd_quick_feedback(const bool clear_buttons) { * */ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb, const int16_t fan) { - if (temph > 0) thermalManager.setTargetHotend(min(heater_maxtemp[endnum], temph), endnum); + if (temph > 0) thermalManager.setTargetHotend(MIN(heater_maxtemp[endnum], temph), endnum); #if HAS_HEATED_BED if (tempb >= 0) thermalManager.setTargetBed(tempb); #else @@ -1675,7 +1681,7 @@ void lcd_quick_feedback(const bool clear_buttons) { void lcd_preheat_m2_bedonly() { _lcd_preheat(0, 0, lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } #endif - #if HAS_TEMP_HOTEND && (TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || HAS_HEATED_BED) + #if HAS_TEMP_HOTEND || HAS_HEATED_BED void lcd_preheat_m1_menu() { START_MENU(); @@ -1687,7 +1693,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #else MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0_only); #endif - #else + #elif HOTENDS > 1 #if HAS_HEATED_BED MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H1, lcd_preheat_m1_e0); MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E1, lcd_preheat_m1_e0_only); @@ -1739,7 +1745,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #else MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0_only); #endif - #else + #elif HOTENDS > 1 #if HAS_HEATED_BED MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H1, lcd_preheat_m2_e0); MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E1, lcd_preheat_m2_e0_only); @@ -1781,7 +1787,7 @@ void lcd_quick_feedback(const bool clear_buttons) { END_MENU(); } - #endif // TEMP_SENSOR_0 && (TEMP_SENSOR_1 || TEMP_SENSOR_2 || TEMP_SENSOR_3 || TEMP_SENSOR_4 || TEMP_SENSOR_BED) + #endif // HAS_TEMP_HOTEND || HAS_HEATED_BED void lcd_cooldown() { #if FAN_COUNT > 0 @@ -2026,8 +2032,7 @@ void lcd_quick_feedback(const bool clear_buttons) { void _lcd_level_bed_homing() { if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL); lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) - lcd_goto_screen(_lcd_level_bed_homing_done); + if (all_axes_homed()) lcd_goto_screen(_lcd_level_bed_homing_done); } #if ENABLED(PROBE_MANUALLY) @@ -2039,7 +2044,7 @@ void lcd_quick_feedback(const bool clear_buttons) { */ void _lcd_level_bed_continue() { defer_return_to_status = true; - axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false; + axis_homed = 0; lcd_goto_screen(_lcd_level_bed_homing); enqueue_and_echo_commands_P(PSTR("G28")); } @@ -2048,13 +2053,6 @@ void lcd_quick_feedback(const bool clear_buttons) { void _lcd_ubl_level_bed(); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void _lcd_goto_ubl_level_bed() { - lcd_goto_screen(_lcd_ubl_level_bed); - new_z_fade_height = planner.z_fade_height; - } - #endif - static int16_t ubl_storage_slot = 0, custom_hotend_temp = 190, side_points = 3, @@ -2109,7 +2107,7 @@ void lcd_quick_feedback(const bool clear_buttons) { char UBL_LCD_GCODE[16]; const int ind = ubl_height_amount > 0 ? 9 : 10; strcpy_P(UBL_LCD_GCODE, PSTR("G29 P6 C -")); - sprintf_P(&UBL_LCD_GCODE[ind], PSTR(".%i"), abs(ubl_height_amount)); + sprintf_P(&UBL_LCD_GCODE[ind], PSTR(".%i"), ABS(ubl_height_amount)); lcd_enqueue_command(UBL_LCD_GCODE); } @@ -2376,7 +2374,7 @@ void lcd_quick_feedback(const bool clear_buttons) { defer_return_to_status = true; if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT < 3 ? 0 : (LCD_HEIGHT > 4 ? 2 : 1), PSTR(MSG_LEVEL_BED_HOMING)); lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) { + if (all_axes_homed()) { ubl.lcd_map_control = true; // Return to the map screen lcd_goto_screen(_lcd_ubl_output_map_lcd); } @@ -2406,15 +2404,14 @@ void lcd_quick_feedback(const bool clear_buttons) { * UBL LCD "radar" map */ void set_current_from_steppers_for_axis(const AxisEnum axis); + void sync_plan_position(); void _lcd_do_nothing() {} void _lcd_hard_stop() { - stepper.quick_stop(); const screenFunc_t old_screen = currentScreen; currentScreen = _lcd_do_nothing; - while (planner.movesplanned()) idle(); + planner.quick_stop(); currentScreen = old_screen; - stepper.cleaning_buffer_counter = 0; set_current_from_steppers_for_axis(ALL_AXES); sync_plan_position(); } @@ -2422,7 +2419,7 @@ void lcd_quick_feedback(const bool clear_buttons) { void _lcd_ubl_output_map_lcd() { static int16_t step_scaler = 0; - if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) + if (!all_axes_known()) return lcd_goto_screen(_lcd_ubl_map_homing); if (use_click()) return _lcd_ubl_map_lcd_edit_cmd(); @@ -2431,7 +2428,7 @@ void lcd_quick_feedback(const bool clear_buttons) { if (encoderPosition) { step_scaler += (int32_t)encoderPosition; x_plot += step_scaler / (ENCODER_STEPS_PER_MENU_ITEM); - if (abs(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) step_scaler = 0; + if (ABS(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) step_scaler = 0; encoderPosition = 0; lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } @@ -2471,8 +2468,8 @@ void lcd_quick_feedback(const bool clear_buttons) { * UBL Homing before LCD map */ void _lcd_ubl_output_map_lcd_cmd() { - if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) { - axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false; + if (!all_axes_known()) { + axis_homed = 0; enqueue_and_echo_commands_P(PSTR("G28")); } lcd_goto_screen(_lcd_ubl_map_homing); @@ -2600,7 +2597,7 @@ void lcd_quick_feedback(const bool clear_buttons) { START_MENU(); MENU_BACK(MSG_PREPARE); - const bool is_homed = axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS]; + const bool is_homed = all_axes_known(); // Auto Home if not using manual probing #if DISABLED(PROBE_MANUALLY) && DISABLED(MESH_BED_LEVELING) @@ -2642,8 +2639,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #if ENABLED(LEVEL_BED_CORNERS) // Move to the next corner for leveling - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) - MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + if (all_axes_homed()) MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif #if ENABLED(EEPROM_SETTINGS) @@ -2653,13 +2649,6 @@ void lcd_quick_feedback(const bool clear_buttons) { END_MENU(); } - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void _lcd_goto_bed_leveling() { - lcd_goto_screen(lcd_bed_leveling); - new_z_fade_height = planner.z_fade_height; - } - #endif - #endif // LCD_BED_LEVELING /** @@ -2680,7 +2669,7 @@ void lcd_quick_feedback(const bool clear_buttons) { // Move Axis // #if ENABLED(DELTA) - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) + if (all_axes_homed()) #endif MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu); @@ -2699,29 +2688,14 @@ void lcd_quick_feedback(const bool clear_buttons) { // #if ENABLED(AUTO_BED_LEVELING_UBL) - MENU_ITEM(submenu, MSG_UBL_LEVEL_BED, ( - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - _lcd_goto_ubl_level_bed - #else - _lcd_ubl_level_bed - #endif - ) - ); + MENU_ITEM(submenu, MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); #elif ENABLED(LCD_BED_LEVELING) #if ENABLED(PROBE_MANUALLY) if (!g29_in_progress) #endif - - MENU_ITEM(submenu, MSG_BED_LEVELING, ( - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - _lcd_goto_bed_leveling - #else - lcd_bed_leveling - #endif - ) - ); + MENU_ITEM(submenu, MSG_BED_LEVELING, lcd_bed_leveling); #elif PLANNER_LEVELING && DISABLED(SLIM_LCD_MENUS) @@ -2739,7 +2713,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #endif #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) + if (all_axes_homed()) MENU_ITEM(function, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); #endif @@ -2843,7 +2817,7 @@ void lcd_quick_feedback(const bool clear_buttons) { do_blocking_move_to_xy(rx, ry); lcd_synchronize(); - move_menu_scale = max(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); + move_menu_scale = MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); lcd_goto_screen(lcd_move_z); } @@ -2869,7 +2843,7 @@ void lcd_quick_feedback(const bool clear_buttons) { void _lcd_calibrate_homing() { if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_LEVEL_BED_HOMING)); lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) + if (all_axes_homed()) lcd_goto_previous_menu(); } @@ -2924,7 +2898,7 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM(submenu, MSG_DELTA_SETTINGS, lcd_delta_settings); #if ENABLED(DELTA_CALIBRATION_MENU) MENU_ITEM(submenu, MSG_AUTO_HOME, _lcd_delta_calibrate_home); - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) { + if (all_axes_homed()) { MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_X, _goto_tower_x); MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Y, _goto_tower_y); MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Z, _goto_tower_z); @@ -3220,7 +3194,7 @@ void lcd_quick_feedback(const bool clear_buttons) { */ #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) - #define _MOVE_XYZ_ALLOWED (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) + #define _MOVE_XYZ_ALLOWED (all_axes_homed()) #else #define _MOVE_XYZ_ALLOWED true #endif @@ -3258,7 +3232,7 @@ void lcd_quick_feedback(const bool clear_buttons) { else MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); - #if ENABLED(SWITCHING_EXTRUDER) + #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) #if EXTRUDERS == 4 switch (active_extruder) { @@ -3290,20 +3264,36 @@ void lcd_quick_feedback(const bool clear_buttons) { #endif - MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); - #if E_MANUAL > 1 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E1, lcd_move_get_e0_amount); - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E2, lcd_move_get_e1_amount); - #if E_MANUAL > 2 + #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) + + // Only the current... + MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); + // ...and the non-switching + #if E_MANUAL == 5 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + #elif E_MANUAL == 3 MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); - #if E_MANUAL > 3 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount); - #if E_MANUAL > 4 - MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); - #endif // E_MANUAL > 4 - #endif // E_MANUAL > 3 - #endif // E_MANUAL > 2 - #endif // E_MANUAL > 1 + #endif + + #else + + // Independent extruders with one E-stepper per hotend + MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); + #if E_MANUAL > 1 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E1, lcd_move_get_e0_amount); + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E2, lcd_move_get_e1_amount); + #if E_MANUAL > 2 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); + #if E_MANUAL > 3 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount); + #if E_MANUAL > 4 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + #endif // E_MANUAL > 4 + #endif // E_MANUAL > 3 + #endif // E_MANUAL > 2 + #endif // E_MANUAL > 1 + + #endif END_MENU(); } @@ -3323,7 +3313,7 @@ void lcd_quick_feedback(const bool clear_buttons) { lcd_completion_feedback(); } - #if ENABLED(EEPROM_SETTINGS) + #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) static void lcd_init_eeprom() { lcd_completion_feedback(settings.init_eeprom()); @@ -3506,30 +3496,33 @@ void lcd_quick_feedback(const bool clear_buttons) { // Fan Speed: // #if FAN_COUNT > 0 - #if HAS_FAN0 + #if (HAS_FAN0 && FAN_NUM_AS_LASER!=0) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &fanSpeeds[0], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &new_fanSpeeds[0], 3, 255); #endif #endif - #if HAS_FAN1 + #if (HAS_FAN1 && FAN_NUM_AS_LASER!=1) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 2", &new_fanSpeeds[1], 3, 255); #endif #endif - #if HAS_FAN2 + #if (HAS_FAN2 && FAN_NUM_AS_LASER!=2) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); #if ENABLED(EXTRA_FAN_SPEED) MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 3", &new_fanSpeeds[2], 3, 255); #endif #endif #endif // FAN_COUNT > 0 - + #if ENABLED(FAN_AS_LASER) + MENU_ITEM(gcode, MSG_LASER_ON, PSTR("M3")); + MENU_ITEM(gcode, MSG_LASER_OFF, PSTR("M5")); + #endif // // Autotemp, Min, Max, Fact // - #if ENABLED(AUTOTEMP) && (HAS_TEMP_HOTEND) + #if ENABLED(AUTOTEMP) && HAS_TEMP_HOTEND MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); MENU_ITEM_EDIT(float3, MSG_MIN, &planner.autotemp_min, 0, HEATER_0_MAXTEMP - 15); MENU_ITEM_EDIT(float3, MSG_MAX, &planner.autotemp_max, 0, HEATER_0_MAXTEMP - 15); @@ -3615,8 +3608,8 @@ void lcd_quick_feedback(const bool clear_buttons) { #define MINTEMP_ALL MIN3(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP) #define MAXTEMP_ALL MAX3(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP) #elif HOTENDS > 1 - #define MINTEMP_ALL min(HEATER_0_MINTEMP, HEATER_1_MINTEMP) - #define MAXTEMP_ALL max(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP) + #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP) + #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP) #else #define MINTEMP_ALL HEATER_0_MINTEMP #define MAXTEMP_ALL HEATER_0_MAXTEMP @@ -3693,32 +3686,32 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_MOTION); // M203 Max Feedrate - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_A, &planner.max_feedrate_mm_s[A_AXIS], 1, 999); - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_B, &planner.max_feedrate_mm_s[B_AXIS], 1, 999); - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_C, &planner.max_feedrate_mm_s[C_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_A, &planner.max_feedrate_mm_s[A_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_B, &planner.max_feedrate_mm_s[B_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_C, &planner.max_feedrate_mm_s[C_AXIS], 1, 999); #if ENABLED(DISTINCT_E_FACTORS) - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS + active_extruder], 1, 999); - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E1, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E2, &planner.max_feedrate_mm_s[E_AXIS + 1], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS + active_extruder], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E1, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E2, &planner.max_feedrate_mm_s[E_AXIS + 1], 1, 999); #if E_STEPPERS > 2 - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E3, &planner.max_feedrate_mm_s[E_AXIS + 2], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E3, &planner.max_feedrate_mm_s[E_AXIS + 2], 1, 999); #if E_STEPPERS > 3 - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999); #if E_STEPPERS > 4 - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999); #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 #else - MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); #endif // M205 S Min Feedrate - MENU_ITEM_EDIT(float3, MSG_VMIN, &planner.min_feedrate_mm_s, 0, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMIN, &planner.min_feedrate_mm_s, 0, 999); // M205 T Min Travel Feedrate - MENU_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.min_travel_feedrate_mm_s, 0, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.min_travel_feedrate_mm_s, 0, 999); END_MENU(); } @@ -3729,34 +3722,34 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_MOTION); // M204 P Acceleration - MENU_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000); + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000); // M204 R Retract Acceleration - MENU_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.retract_acceleration, 100, 99000); + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.retract_acceleration, 100, 99000); // M204 T Travel Acceleration - MENU_ITEM_EDIT(float5, MSG_A_TRAVEL, &planner.travel_acceleration, 100, 99000); + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_TRAVEL, &planner.travel_acceleration, 100, 99000); // M201 settings - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_A, &planner.max_acceleration_mm_per_s2[A_AXIS], 100, 99000, _reset_acceleration_rates); - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_B, &planner.max_acceleration_mm_per_s2[B_AXIS], 100, 99000, _reset_acceleration_rates); - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_C, &planner.max_acceleration_mm_per_s2[C_AXIS], 10, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_A, &planner.max_acceleration_mm_per_s2[A_AXIS], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_B, &planner.max_acceleration_mm_per_s2[B_AXIS], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_C, &planner.max_acceleration_mm_per_s2[C_AXIS], 10, 99000, _reset_acceleration_rates); #if ENABLED(DISTINCT_E_FACTORS) - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS + active_extruder], 100, 99000, _reset_acceleration_rates); - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E1, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_e0_acceleration_rate); - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E2, &planner.max_acceleration_mm_per_s2[E_AXIS + 1], 100, 99000, _reset_e1_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS + active_extruder], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E1, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_e0_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E2, &planner.max_acceleration_mm_per_s2[E_AXIS + 1], 100, 99000, _reset_e1_acceleration_rate); #if E_STEPPERS > 2 - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E3, &planner.max_acceleration_mm_per_s2[E_AXIS + 2], 100, 99000, _reset_e2_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E3, &planner.max_acceleration_mm_per_s2[E_AXIS + 2], 100, 99000, _reset_e2_acceleration_rate); #if E_STEPPERS > 3 - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate); #if E_STEPPERS > 4 - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate); #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 #else - MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates); #endif END_MENU(); @@ -3767,14 +3760,18 @@ void lcd_quick_feedback(const bool clear_buttons) { START_MENU(); MENU_BACK(MSG_MOTION); - MENU_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990); - MENU_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990); - #if ENABLED(DELTA) - MENU_ITEM_EDIT(float3, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 1, 990); + #if ENABLED(JUNCTION_DEVIATION) + MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01, 0.3, planner.recalculate_max_e_jerk_factor); #else - MENU_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1, 990); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990); + #if ENABLED(DELTA) + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 1, 990); + #else + MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1, 990); + #endif + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990); #endif - MENU_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990); END_MENU(); } @@ -3844,7 +3841,7 @@ void lcd_quick_feedback(const bool clear_buttons) { // M540 S - Abort on endstop hit when SD printing #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &stepper.abort_on_endstop_hit); + MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); #endif END_MENU(); @@ -4269,10 +4266,8 @@ void lcd_quick_feedback(const bool clear_buttons) { void lcd_led_menu() { START_MENU(); MENU_BACK(MSG_MAIN); - if (leds.lights_on) - MENU_ITEM(function, MSG_LEDS_OFF, leds.toggle); - else - MENU_ITEM(function, MSG_LEDS_ON, leds.toggle); + bool led_on = leds.lights_on; + MENU_ITEM_EDIT_CALLBACK(bool, MSG_LEDS, &led_on, leds.toggle); MENU_ITEM(function, MSG_SET_LEDS_DEFAULT, leds.set_default); #if ENABLED(LED_COLOR_PRESETS) MENU_ITEM(submenu, MSG_LED_PRESETS, lcd_led_presets_menu); @@ -4857,7 +4852,7 @@ void lcd_quick_feedback(const bool clear_buttons) { callbackFunc = callback; \ liveEdit = live; \ } \ - typedef void _name + typedef void _name##_void DEFINE_MENU_EDIT_TYPE(int16_t, int3, itostr3, 1); DEFINE_MENU_EDIT_TYPE(uint8_t, int8, i8tostr3, 1); @@ -4942,7 +4937,7 @@ void lcd_quick_feedback(const bool clear_buttons) { if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up(); #endif - if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) { + if (all_axes_homed()) { #if ENABLED(DELTA) || Z_HOME_DIR != -1 if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up(); #endif @@ -5068,24 +5063,6 @@ void lcd_init() { #endif } -int16_t lcd_strlen(const char* s) { - int16_t i = 0, j = 0; - while (s[i]) { - if (PRINTABLE(s[i])) j++; - i++; - } - return j; -} - -int16_t lcd_strlen_P(const char* s) { - int16_t j = 0; - while (pgm_read_byte(s)) { - if (PRINTABLE(pgm_read_byte(s))) j++; - s++; - } - return j; -} - bool lcd_blink() { static uint8_t blink = 0; static millis_t next_blink_ms = 0; @@ -5237,7 +5214,7 @@ void lcd_update() { #endif - const bool encoderPastThreshold = (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP); + const bool encoderPastThreshold = (ABS(encoderDiff) >= ENCODER_PULSES_PER_STEP); if (encoderPastThreshold || lcd_clicked) { if (encoderPastThreshold) { int32_t encoderMultiplier = 1; @@ -5245,7 +5222,7 @@ void lcd_update() { #if ENABLED(ENCODER_RATE_MULTIPLIER) if (encoderRateMultiplierEnabled) { - int32_t encoderMovementSteps = abs(encoderDiff) / ENCODER_PULSES_PER_STEP; + int32_t encoderMovementSteps = ABS(encoderDiff) / ENCODER_PULSES_PER_STEP; if (lastEncoderMovementMillis) { // Note that the rate is always calculated between two passes through the @@ -5408,30 +5385,8 @@ void lcd_update() { } // ELAPSED(ms, next_lcd_update_ms) } -inline void pad_message_string() { - uint8_t i = 0, j = 0; - char c; - lcd_status_message[MAX_MESSAGE_LENGTH] = '\0'; - while ((c = lcd_status_message[i]) && j < LCD_WIDTH) { - if (PRINTABLE(c)) j++; - i++; - } - if (true - #if ENABLED(STATUS_MESSAGE_SCROLLING) - && j < LCD_WIDTH - #endif - ) { - // pad with spaces to fill up the line - while (j++ < LCD_WIDTH) lcd_status_message[i++] = ' '; - // chop off at the edge - lcd_status_message[i] = '\0'; - } -} - void lcd_finishstatus(const bool persist=false) { - pad_message_string(); - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE > 0)) UNUSED(persist); #endif @@ -5449,7 +5404,7 @@ void lcd_finishstatus(const bool persist=false) { #endif #if ENABLED(STATUS_MESSAGE_SCROLLING) - status_scroll_pos = 0; + status_scroll_offset = 0; #endif } @@ -5461,7 +5416,26 @@ bool lcd_hasstatus() { return (lcd_status_message[0] != '\0'); } void lcd_setstatus(const char * const message, const bool persist) { if (lcd_status_message_level > 0) return; - strncpy(lcd_status_message, message, MAX_MESSAGE_LENGTH); + + // Here we have a problem. The message is encoded in UTF8, so + // arbitrarily cutting it will be a problem. We MUST be sure + // that there is no cutting in the middle of a multibyte character! + + // Get a pointer to the null terminator + const char* pend = message + strlen(message); + + // If length of supplied UTF8 string is greater than + // our buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(*pend)) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy(lcd_status_message, message, maxLen); + lcd_status_message[maxLen] = '\0'; + lcd_finishstatus(persist); } @@ -5469,7 +5443,26 @@ void lcd_setstatusPGM(const char * const message, int8_t level) { if (level < 0) level = lcd_status_message_level = 0; if (level < lcd_status_message_level) return; lcd_status_message_level = level; - strncpy_P(lcd_status_message, message, MAX_MESSAGE_LENGTH); + + // Here we have a problem. The message is encoded in UTF8, so + // arbitrarily cutting it will be a problem. We MUST be sure + // that there is no cutting in the middle of a multibyte character! + + // Get a pointer to the null terminator + const char* pend = message + strlen_P(message); + + // If length of supplied UTF8 string is greater than + // our buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(pgm_read_byte(pend))) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy_P(lcd_status_message, message, maxLen); + lcd_status_message[maxLen] = '\0'; + lcd_finishstatus(level > 0); } @@ -5543,11 +5536,9 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } #if BUTTON_EXISTS(EN1) if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; #endif - #if BUTTON_EXISTS(EN2) if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; #endif - #if BUTTON_EXISTS(ENC) if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; #endif @@ -5676,11 +5667,7 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } #if ENABLED(G26_MESH_VALIDATION) void lcd_chirp() { - #if ENABLED(LCD_USE_I2C_BUZZER) - lcd.buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ); - #elif PIN_EXISTS(BEEPER) - buzzer.tone(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ); - #endif + lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ); } #endif diff --git a/Marlin/ultralcd.h b/Marlin/src/lcd/ultralcd.h similarity index 89% rename from Marlin/ultralcd.h rename to Marlin/src/lcd/ultralcd.h index bf7ae0fef0..229f4cbce1 100644 --- a/Marlin/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -23,7 +23,7 @@ #ifndef ULTRALCD_H #define ULTRALCD_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(ULTRA_LCD) || ENABLED(MALYAN_LCD) void lcd_init(); @@ -39,10 +39,12 @@ #if ENABLED(ULTRA_LCD) - #include "Marlin.h" + #include "../Marlin.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" + #endif - int16_t lcd_strlen(const char* s); - int16_t lcd_strlen_P(const char* s); bool lcd_hasstatus(); void lcd_setstatus(const char* message, const bool persist=false); void lcd_setstatusPGM(const char* message, const int8_t level=0); @@ -87,7 +89,7 @@ #define BUTTON_EXISTS(BN) (defined(BTN_## BN) && BTN_## BN >= 0) #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - #if ENABLED(ULTIPANEL) + #if ENABLED(ULTIPANEL) // LCD with a click-wheel input extern bool defer_return_to_status; @@ -111,27 +113,6 @@ void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder=0); - // Encoder click is directly connected - - #define BLEN_A 0 - #define BLEN_B 1 - - #define EN_A (_BV(BLEN_A)) - #define EN_B (_BV(BLEN_B)) - - #if BUTTON_EXISTS(ENC) - #define BLEN_C 2 - #define EN_C (_BV(BLEN_C)) - #endif - - #if BUTTON_EXISTS(BACK) - #define BLEN_D 3 - #define EN_D _BV(BLEN_D) - #define LCD_BACK_CLICKED (buttons & EN_D) - #endif - - extern volatile uint8_t buttons; // The last-checked buttons in a bit array. - void lcd_buttons_update(); void lcd_completion_feedback(const bool good=true); #if ENABLED(ADVANCED_PAUSE_FEATURE) @@ -139,7 +120,7 @@ void lcd_advanced_pause_show_message(const AdvancedPauseMessage message, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT, const uint8_t extruder=active_extruder); - #endif // ADVANCED_PAUSE_FEATURE + #endif #if ENABLED(G26_MESH_VALIDATION) void lcd_chirp(); @@ -152,10 +133,6 @@ float lcd_z_offset_edit(); #endif - #else - - inline void lcd_buttons_update() {} - #endif #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) @@ -203,12 +180,6 @@ #define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons_reprapworld_keypad & KEYPAD_HOME) #define REPRAPWORLD_KEYPAD_MOVE_MENU (buttons_reprapworld_keypad & KEYPAD_EN_C) - #if BUTTON_EXISTS(ENC) - #define LCD_CLICKED ((buttons & EN_C) || REPRAPWORLD_KEYPAD_MOVE_MENU) - #else - #define LCD_CLICKED REPRAPWORLD_KEYPAD_MOVE_MENU - #endif - #define REPRAPWORLD_KEYPAD_PRESSED (buttons_reprapworld_keypad & ( \ EN_REPRAPWORLD_KEYPAD_F3 | \ EN_REPRAPWORLD_KEYPAD_F2 | \ @@ -220,14 +191,6 @@ EN_REPRAPWORLD_KEYPAD_LEFT) \ ) - #elif ENABLED(NEWPANEL) - - #define LCD_CLICKED (buttons & EN_C) - - #else - - #define LCD_CLICKED false - #endif #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) @@ -240,7 +203,6 @@ constexpr bool lcd_wait_for_move = false; inline void lcd_refresh() {} - inline void lcd_buttons_update() {} inline bool lcd_hasstatus() { return false; } inline void lcd_setstatus(const char* const message, const bool persist=false) { UNUSED(message); UNUSED(persist); } inline void lcd_setstatusPGM(const char* const message, const int8_t level=0) { UNUSED(message); UNUSED(level); } @@ -250,9 +212,59 @@ #endif // ULTRA_LCD +#if ENABLED(ULTIPANEL) + + #if ENABLED(NEWPANEL) // Uses digital switches, not a shift register + + // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) + #define BLEN_A 0 + #define BLEN_B 1 + + #define EN_A _BV(BLEN_A) + #define EN_B _BV(BLEN_B) + + #if BUTTON_EXISTS(ENC) + #define BLEN_C 2 + #define EN_C _BV(BLEN_C) + #endif + + #if BUTTON_EXISTS(BACK) + #define BLEN_D 3 + #define EN_D _BV(BLEN_D) + #define LCD_BACK_CLICKED (buttons & EN_D) + #endif + + #endif // NEWPANEL + + extern volatile uint8_t buttons; // The last-checked buttons in a bit array. + void lcd_buttons_update(); + +#else + + inline void lcd_buttons_update() {} + +#endif + +#if ENABLED(REPRAPWORLD_KEYPAD) + #ifdef EN_C + #define LCD_CLICKED ((buttons & EN_C) || REPRAPWORLD_KEYPAD_MOVE_MENU) + #else + #define LCD_CLICKED REPRAPWORLD_KEYPAD_MOVE_MENU + #endif +#elif defined(EN_C) + #define LCD_CLICKED (buttons & EN_C) +#else + #define LCD_CLICKED false +#endif + #define LCD_MESSAGEPGM(x) lcd_setstatusPGM(PSTR(x)) #define LCD_ALERTMESSAGEPGM(x) lcd_setalertstatusPGM(PSTR(x)) +// For i2c define BUZZ to use lcd_buzz +#if ENABLED(LCD_USE_I2C_BUZZER) + #define BUZZ(d,f) lcd_buzz(d, f) +#endif + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) void lcd_reselect_last_file(); #endif diff --git a/Marlin/src/lcd/ultralcd_common_HD44780.h b/Marlin/src/lcd/ultralcd_common_HD44780.h new file mode 100644 index 0000000000..b366459cb3 --- /dev/null +++ b/Marlin/src/lcd/ultralcd_common_HD44780.h @@ -0,0 +1,203 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef ULTRALCD_COMMON_HD44780_H +#define ULTRALCD_COMMON_HD44780_H + +/** + * Implementation of the LCD display routines for a Hitachi HD44780 display. + * These are the most common LCD character displays. + */ + +#include "../inc/MarlinConfig.h" + +#if LCD_HEIGHT > 3 + #include "../libs/duration_t.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../feature/bedlevel/ubl/ubl.h" + + #if ENABLED(ULTIPANEL) + #define ULTRA_X_PIXELS_PER_CHAR 5 + #define ULTRA_Y_PIXELS_PER_CHAR 8 + #define ULTRA_COLUMNS_FOR_MESH_MAP 7 + #define ULTRA_ROWS_FOR_MESH_MAP 4 + + #define N_USER_CHARS 8 + + #define TOP_LEFT _BV(0) + #define TOP_RIGHT _BV(1) + #define LOWER_LEFT _BV(2) + #define LOWER_RIGHT _BV(3) + #endif +#endif + +#include + +extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. + +//////////////////////////////////// +// Setup button and encode mappings for each panel (into 'buttons' variable +// +// This is just to map common functions (across different panels) onto the same +// macro name. The mapping is independent of whether the button is directly connected or +// via a shift/i2c register. + +#if ENABLED(ULTIPANEL) + + // + // Setup other button mappings of each panel + // + #if ENABLED(LCD_I2C_VIKI) + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + // button and encoder bit positions within 'buttons' + #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C + #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) + #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) + #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) + #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) + + #undef LCD_CLICKED + #if BUTTON_EXISTS(ENC) + // the pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define LCD_CLICKED (buttons & (B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop. + #else + #define LCD_CLICKED (buttons & (B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + #define LCD_HAS_SLOW_BUTTONS + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + + #undef LCD_CLICKED + #define LCD_CLICKED (buttons & B_MI) + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + #define LCD_HAS_SLOW_BUTTONS + + #endif + + #elif DISABLED(NEWPANEL) // old style ULTIPANEL + // Shift register bits correspond to buttons: + #define BL_LE 7 // Left + #define BL_UP 6 // Up + #define BL_MI 5 // Middle + #define BL_DW 4 // Down + #define BL_RI 3 // Right + #define BL_ST 2 // Red Button + #define B_LE (_BV(BL_LE)) + #define B_UP (_BV(BL_UP)) + #define B_MI (_BV(BL_MI)) + #define B_DW (_BV(BL_DW)) + #define B_RI (_BV(BL_RI)) + #define B_ST (_BV(BL_ST)) + #define LCD_CLICKED (buttons & (B_MI|B_ST)) + #endif + +#endif // ULTIPANEL + +//////////////////////////////////// +// Create LCD class instance and chipset-specific information +#if ENABLED(LCD_I2C_TYPE_PCF8575) + // NOTE: These are register-mapped pins on the PCF8575 controller, not Arduino pins. + #define LCD_I2C_PIN_BL 3 + #define LCD_I2C_PIN_EN 2 + #define LCD_I2C_PIN_RW 1 + #define LCD_I2C_PIN_RS 0 + #define LCD_I2C_PIN_D4 4 + #define LCD_I2C_PIN_D5 5 + #define LCD_I2C_PIN_D6 6 + #define LCD_I2C_PIN_D7 7 + + #include + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + +#elif ENABLED(LCD_I2C_TYPE_MCP23017) + // For the LED indicators (which may be mapped to different events in lcd_implementation_update_indicators()) + #define LED_A 0x04 //100 + #define LED_B 0x02 //010 + #define LED_C 0x01 //001 + + #define LCD_HAS_STATUS_INDICATORS + + #include + #include + #define LCD_CLASS LiquidTWI2 + +#elif ENABLED(LCD_I2C_TYPE_MCP23008) + #include + #include + #define LCD_CLASS LiquidTWI2 + +#elif ENABLED(LCD_I2C_TYPE_PCA8574) + #include + #define LCD_CLASS LiquidCrystal_I2C + +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +#elif ENABLED(SR_LCD_2W_NL) + extern "C" void __cxa_pure_virtual() { while (1); } + #include + #include + #define LCD_CLASS LiquidCrystal_SR + +#elif ENABLED(LCM1602) + #include + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + +#else + // Standard directly connected LCD implementations + #include + #define LCD_CLASS LiquidCrystal + +#endif + +#include "fontutils.h" +#include "lcdprint.h" + +#if ENABLED(LCD_PROGRESS_BAR) + #define LCD_STR_PROGRESS "\x03\x04\x05" +#endif + +enum HD44780CharSet : char { + CHARSET_MENU, + CHARSET_INFO, + CHARSET_BOOT +}; + +#endif // ULTRALCD_COMMON_HD44780_H + + diff --git a/Marlin/ultralcd_impl_DOGM.h b/Marlin/src/lcd/ultralcd_impl_DOGM.h similarity index 65% rename from Marlin/ultralcd_impl_DOGM.h rename to Marlin/src/lcd/ultralcd_impl_DOGM.h index 511a0e9a4a..f9b0fb452b 100644 --- a/Marlin/ultralcd_impl_DOGM.h +++ b/Marlin/src/lcd/ultralcd_impl_DOGM.h @@ -36,7 +36,7 @@ #ifndef ULTRALCD_IMPL_DOGM_H #define ULTRALCD_IMPL_DOGM_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" /** * Implementation of the LCD display routines for a DOGM128 graphic display. @@ -44,22 +44,29 @@ */ #include "ultralcd.h" -#if ENABLED(U8GLIB_ST7920) - #include "ultralcd_st7920_u8glib_rrd.h" -#endif - +/* #if ENABLED(U8GLIB_ST7565_64128N) - #include "ultralcd_st7565_u8glib_VIKI.h" + #include "dogm/ultralcd_st7565_u8glib_VIKI.h" +#elif ENABLED(U8GLIB_ST7920) + #include "dogm/ultralcd_st7920_u8glib_rrd.h" #endif +*/ -#include "dogm_bitmaps.h" -#include "utility.h" -#include "duration_t.h" +#include "dogm/dogm_bitmaps.h" + +#if ENABLED(SDSUPPORT) + #include "../libs/duration_t.h" +#endif #include +#include "fontutils.h" +#include "u8g_fontutf8.h" + +#include "dogm/HAL_LCD_class_defines.h" + #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" + #include "../feature/bedlevel/ubl/ubl.h" #endif // Only Western languages support big / small fonts @@ -69,7 +76,7 @@ #endif #if ENABLED(USE_SMALL_INFOFONT) - #include "dogm_font_data_6x9_marlin.h" + #include "dogm/dogm_font_data_6x9_marlin.h" #define FONT_STATUSMENU_NAME u8g_font_6x9 #define INFO_FONT_HEIGHT 7 #else @@ -77,57 +84,13 @@ #define INFO_FONT_HEIGHT 8 #endif -#include "dogm_font_data_Marlin_symbols.h" // The Marlin special symbols -#define FONT_SPECIAL_NAME Marlin_symbols +// The Marlin special symbols is now in the dogm_font_data_ISO10646_1.h +#define FONT_SPECIAL_NAME ISO10646_1_5x7 -#if DISABLED(SIMULATE_ROMFONT) - #if ENABLED(DISPLAY_CHARSET_ISO10646_1) - #include "dogm_font_data_ISO10646_1.h" - #define FONT_MENU_NAME ISO10646_1_5x7 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_PL) - #include "dogm_font_data_ISO10646_1_PL.h" - #define FONT_MENU_NAME ISO10646_1_PL_5x7 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_5) - #include "dogm_font_data_ISO10646_5_Cyrillic.h" - #define FONT_MENU_NAME ISO10646_5_Cyrillic_5x7 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_KANA) - #include "dogm_font_data_ISO10646_Kana.h" - #define FONT_MENU_NAME ISO10646_Kana_5x7 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_GREEK) - #include "dogm_font_data_ISO10646_Greek.h" - #define FONT_MENU_NAME ISO10646_Greek_5x7 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_CN) - #include "dogm_font_data_ISO10646_CN.h" - #define FONT_MENU_NAME ISO10646_CN - #define TALL_FONT_CORRECTION 1 - #elif ENABLED(DISPLAY_CHARSET_ISO10646_TR) - #include "dogm_font_data_ISO10646_1_tr.h" - #define FONT_MENU_NAME ISO10646_TR - #elif ENABLED(DISPLAY_CHARSET_ISO10646_CZ) - #include "dogm_font_data_ISO10646_CZ.h" - #define FONT_MENU_NAME ISO10646_CZ - #elif ENABLED(DISPLAY_CHARSET_ISO10646_SK) - #include "dogm_font_data_ISO10646_SK.h" - #define FONT_MENU_NAME ISO10646_SK - #else // fall-back - #include "dogm_font_data_ISO10646_1.h" - #define FONT_MENU_NAME ISO10646_1_5x7 - #endif -#else // SIMULATE_ROMFONT - #if DISPLAY_CHARSET_HD44780 == JAPANESE - #include "dogm_font_data_HD44780_J.h" - #define FONT_MENU_NAME HD44780_J_5x7 - #elif DISPLAY_CHARSET_HD44780 == WESTERN - #include "dogm_font_data_HD44780_W.h" - #define FONT_MENU_NAME HD44780_W_5x7 - #elif DISPLAY_CHARSET_HD44780 == CYRILLIC - #include "dogm_font_data_HD44780_C.h" - #define FONT_MENU_NAME HD44780_C_5x7 - #else // fall-back - #include "dogm_font_data_ISO10646_1.h" - #define FONT_MENU_NAME ISO10646_1_5x7 - #endif -#endif // SIMULATE_ROMFONT +#include LANGUAGE_DATA_INCL(LCD_LANGUAGE) + +#include "dogm/dogm_font_data_ISO10646_1.h" +#define FONT_MENU_NAME ISO10646_1_5x7 //#define FONT_STATUSMENU_NAME FONT_MENU_NAME @@ -157,61 +120,75 @@ // LCD selection #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_RS); // 2 stripes - // U8GLIB_ST7920_128X64 u8g(LCD_PINS_RS); // 8 stripes + #ifdef DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_RS); // 2 stripes, HW SPI (shared with SD card) + #else + U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 2 stripes, SW SPI + #endif + #elif ENABLED(U8GLIB_ST7920) - //U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 2 stripes - // No 4 stripe device available from u8glib. - //U8GLIB_ST7920_128X64_1X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 8 stripes - U8GLIB_ST7920_128X64_RRD u8g(0); // Number of stripes can be adjusted in ultralcd_st7920_u8glib_rrd.h with PAGE_HEIGHT + // RepRap Discount Full Graphics Smart Controller + #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + U8GLIB_ST7920_128X64_4X_HAL u8g(LCD_PINS_RS); // 2 stripes, HW SPI (shared with SD card, on AVR does not use standard LCD adapter) + #else + //U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 2 stripes, SW SPI + U8GLIB_ST7920_128X64_RRD u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Number of stripes can be adjusted in ultralcd_st7920_u8glib_rrd.h with PAGE_HEIGHT + // AVR version ignores these pin settings + // HAL version uses these pin settings + #endif + #elif ENABLED(CARTESIO_UI) // The CartesioUI display - #if DOGLCD_MOSI != -1 && DOGLCD_SCK != -1 - // using SW-SPI - //U8GLIB_DOGM128 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes - U8GLIB_DOGM128_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes - #else - //U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes + //U8GLIB_DOGM128_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes U8GLIB_DOGM128_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes - #endif + #elif ENABLED(U8GLIB_LM6059_AF) // Based on the Adafruit ST7565 (http://www.adafruit.com/products/250) - //U8GLIB_LM6059 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes - U8GLIB_LM6059_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes + //U8GLIB_LM6059 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes + U8GLIB_LM6059_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes + #elif ENABLED(U8GLIB_ST7565_64128N) - // The MaKrPanel, Mini Viki, and Viki 2.0, ST7565 controller as well - // U8GLIB_ST7565_64128n_2x_VIKI u8g(0); // using SW-SPI DOGLCD_MOSI != -1 && DOGLCD_SCK - U8GLIB_ST7565_64128n_2x_VIKI u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // using SW-SPI - //U8GLIB_NHD_C12864_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes HWSPI + // The MaKrPanel, Mini Viki, Viki 2.0 & AZSMZ 12864 ST7565 controller + #define SMART_RAMPS (MB(RAMPS_SMART_EFB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_SMART_EFF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_SMART_SF)) + #if DOGLCD_SCK == SCK_PIN && DOGLCD_MOSI == MOSI_PIN && !SMART_RAMPS + U8GLIB_64128N_2X_HAL u8g(DOGLCD_CS, DOGLCD_A0); // using HW-SPI + #else + U8GLIB_64128N_2X_HAL u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // using SW-SPI + #endif + #elif ENABLED(MKS_12864OLED_SSD1306) // MKS 128x64 (SSD1306) OLED I2C LCD - U8GLIB_SSD1306_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes - //U8GLIB_SSD1306_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes + U8GLIB_SSD1306_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes + //U8GLIB_SSD1306_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes + #elif ENABLED(U8GLIB_SSD1306) // Generic support for SSD1306 OLED I2C LCDs - //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 8 stripes - U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + //U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + #elif ENABLED(MKS_12864OLED) // MKS 128x64 (SH1106) OLED I2C LCD - U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes - //U8GLIB_SH1106_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes + U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes + //U8GLIB_SH1106_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes #elif ENABLED(U8GLIB_SH1106) // Generic support for SH1106 OLED I2C LCDs - //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 8 stripes - U8GLIB_SH1106_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + //U8GLIB_SH1106_128X64_2X_I2C_2_WIRE u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + U8GLIB_SH1106_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes #elif ENABLED(U8GLIB_SSD1309) // Generic support for SSD1309 OLED I2C LCDs U8GLIB_SSD1309_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); #elif ENABLED(MINIPANEL) // The MINIPanel display - //U8GLIB_MINI12864 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes - U8GLIB_MINI12864_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes + //U8GLIB_MINI12864 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes + U8GLIB_MINI12864_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes #else // for regular DOGM128 display with HW-SPI - //U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 8 stripes - U8GLIB_DOGM128_2X u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 4 stripes + //U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 8 stripes + U8GLIB_DOGM128_2X u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 4 stripes #endif +U8GLIB *pu8g = &u8g; + #ifndef LCD_PIXEL_WIDTH #define LCD_PIXEL_WIDTH 128 #endif @@ -219,7 +196,7 @@ #define LCD_PIXEL_HEIGHT 64 #endif -#include "utf_mapper.h" +#include "lcdprint.h" int16_t lcd_contrast; // Initialized by settings.load() static char currentfont = 0; @@ -234,50 +211,13 @@ u8g_page_t &page = ((u8g_pb_t *)((u8g.getU8g())->dev->dev_mem))->p; static void lcd_setFont(const char font_nr) { switch (font_nr) { case FONT_STATUSMENU : {u8g.setFont(FONT_STATUSMENU_NAME); currentfont = FONT_STATUSMENU;}; break; + default: case FONT_MENU : {u8g.setFont(FONT_MENU_NAME); currentfont = FONT_MENU;}; break; case FONT_SPECIAL : {u8g.setFont(FONT_SPECIAL_NAME); currentfont = FONT_SPECIAL;}; break; case FONT_MENU_EDIT : {u8g.setFont(FONT_MENU_EDIT_NAME); currentfont = FONT_MENU_EDIT;}; break; - break; } } -void lcd_print(const char c) { - if (WITHIN(c, 1, LCD_STR_SPECIAL_MAX)) { - u8g.setFont(FONT_SPECIAL_NAME); - u8g.print(c); - lcd_setFont(currentfont); - } - else charset_mapper(c); -} - -char lcd_print_and_count(const char c) { - if (WITHIN(c, 1, LCD_STR_SPECIAL_MAX)) { - u8g.setFont(FONT_SPECIAL_NAME); - u8g.print(c); - lcd_setFont(currentfont); - return 1; - } - else return charset_mapper(c); -} - -/** - * Core LCD printing functions - * On DOGM all strings go through a filter for utf - * But only use lcd_print_utf and lcd_printPGM_utf for translated text - */ -void lcd_print(const char *str) { while (*str) lcd_print(*str++); } -void lcd_printPGM(const char *str) { while (const char c = pgm_read_byte(str)) lcd_print(c), ++str; } - -void lcd_print_utf(const char *str, uint8_t n=LCD_WIDTH) { - char c; - while (n && (c = *str)) n -= charset_mapper(c), ++str; -} - -void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { - char c; - while (n && (c = pgm_read_byte(str))) n -= charset_mapper(c), ++str; -} - #if ENABLED(SHOW_BOOTSCREEN) #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) @@ -287,7 +227,7 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { top = (LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2; #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH, - bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; + bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; #endif u8g.firstPage(); do { @@ -344,9 +284,9 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { #endif // SHOW_BOOTSCREEN #if ENABLED(LIGHTWEIGHT_UI) - #include "status_screen_lite_ST7920.h" + #include "dogm/status_screen_lite_ST7920.h" #else - #include "status_screen_DOGM.h" + #include "dogm/status_screen_DOGM.h" #endif // Initialize or re-initialize the LCD @@ -357,9 +297,10 @@ static void lcd_implementation_init() { #endif #if ENABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) + SET_OUTPUT(LCD_PINS_DC); OUT_WRITE(LCD_PINS_RS, LOW); _delay_ms(500); - OUT_WRITE(LCD_PINS_RS, HIGH); + WRITE(LCD_PINS_RS, HIGH); #endif #if PIN_EXISTS(LCD_RESET) @@ -384,6 +325,8 @@ static void lcd_implementation_init() { #elif ENABLED(LCD_SCREEN_ROT_270) u8g.setRot270(); // Rotate screen by 270° #endif + + uxg_SetUtf8Fonts (g_fontinfo, NUM_ARRAY(g_fontinfo)); } // The kill screen is displayed for unrecoverable conditions @@ -395,12 +338,12 @@ void lcd_kill_screen() { u8g.firstPage(); do { lcd_setFont(FONT_MENU); - u8g.setPrintPos(0, h4 * 1); - lcd_print_utf(lcd_status_message); - u8g.setPrintPos(0, h4 * 2); - lcd_printPGM_utf(PSTR(MSG_HALTED)); - u8g.setPrintPos(0, h4 * 3); - lcd_printPGM_utf(PSTR(MSG_PLEASE_RESET)); + lcd_moveto(0, h4 * 1); + lcd_put_u8str(lcd_status_message); + lcd_moveto(0, h4 * 2); + lcd_put_u8str_P(PSTR(MSG_HALTED)); + lcd_moveto(0, h4 * 3); + lcd_put_u8str_P(PSTR(MSG_PLEASE_RESET)); } while (u8g.nextPage()); } @@ -419,25 +362,25 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return; - u8g.setPrintPos(LCD_PIXEL_WIDTH - 11 * (DOG_CHAR_WIDTH), row_y2); - lcd_print('E'); - lcd_print((char)('1' + extruder)); - lcd_print(' '); - lcd_print(itostr3(thermalManager.degHotend(extruder))); - lcd_print('/'); + lcd_moveto(LCD_PIXEL_WIDTH - 11 * (DOG_CHAR_WIDTH), row_y2); + lcd_put_wchar('E'); + lcd_put_wchar((char)('1' + extruder)); + lcd_put_wchar(' '); + lcd_put_u8str(itostr3(thermalManager.degHotend(extruder))); + lcd_put_wchar('/'); if (lcd_blink() || !thermalManager.is_heater_idle(extruder)) - lcd_print(itostr3(thermalManager.degTargetHotend(extruder))); + lcd_put_u8str(itostr3(thermalManager.degTargetHotend(extruder))); } #endif // ADVANCED_PAUSE_FEATURE // Set the colors for a menu item based on whether it is selected - static void lcd_implementation_mark_as_selected(const uint8_t row, const bool isSelected) { + static bool lcd_implementation_mark_as_selected(const uint8_t row, const bool isSelected) { row_y1 = row * row_height + 1; row_y2 = row_y1 + row_height - 1; - if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return; + if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return false; if (isSelected) { #if ENABLED(MENU_HOLLOW_FRAME) @@ -454,51 +397,46 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop u8g.setColorIndex(1); // unmarked text is black on white } #endif - u8g.setPrintPos((START_COL) * (DOG_CHAR_WIDTH), row_y2); + + if (!PAGE_CONTAINS(row_y1, row_y2)) return false; + + lcd_moveto((START_COL) * (DOG_CHAR_WIDTH), row_y2); + return true; } // Draw a static line of text in the same idiom as a menu item static void lcd_implementation_drawmenu_static(const uint8_t row, const char* pstr, const bool center=true, const bool invert=false, const char* valstr=NULL) { - lcd_implementation_mark_as_selected(row, invert); + if (lcd_implementation_mark_as_selected(row, invert)) { - if (!PAGE_CONTAINS(row_y1, row_y2)) return; + uint8_t n = LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * (START_COL); // pixel width of string allowed - char c; - int8_t n = LCD_WIDTH - (START_COL); + if (center && !valstr) { + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd_put_wchar(' '); n--; } + } + n -= lcd_put_u8str_max_P(pstr, n); + if (NULL != valstr) { + n -= lcd_put_u8str_max(valstr, n); + } - if (center && !valstr) { - int8_t pad = (LCD_WIDTH - lcd_strlen_P(pstr)) / 2; - while (--pad >= 0) { u8g.print(' '); n--; } + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } } - while (n > 0 && (c = pgm_read_byte(pstr))) { - n -= lcd_print_and_count(c); - pstr++; - } - if (valstr) while (n > 0 && (c = *valstr)) { - n -= lcd_print_and_count(c); - valstr++; - } - while (n-- > 0) u8g.print(' '); } // Draw a generic menu item static void lcd_implementation_drawmenu_generic(const bool isSelected, const uint8_t row, const char* pstr, const char pre_char, const char post_char) { UNUSED(pre_char); - lcd_implementation_mark_as_selected(row, isSelected); - - if (!PAGE_CONTAINS(row_y1, row_y2)) return; - - uint8_t n = LCD_WIDTH - (START_COL) - 2; - while (char c = pgm_read_byte(pstr)) { - n -= lcd_print_and_count(c); - pstr++; + if (lcd_implementation_mark_as_selected(row, isSelected)) { + uint8_t n = LCD_WIDTH - (START_COL) - 2; + n *= DOG_CHAR_WIDTH; + n -= lcd_put_u8str_max_P(pstr, n); + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + lcd_moveto(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH), row_y2); + lcd_put_wchar(post_char); + lcd_put_wchar(' '); } - while (n--) u8g.print(' '); - u8g.setPrintPos(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH), row_y2); - lcd_print(post_char); - u8g.print(' '); } // Macros for specific types of menu items @@ -509,22 +447,16 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop // Draw a menu item with an editable value static void _drawmenu_setting_edit_generic(const bool isSelected, const uint8_t row, const char* pstr, const char* const data, const bool pgm) { - - lcd_implementation_mark_as_selected(row, isSelected); - - if (!PAGE_CONTAINS(row_y1, row_y2)) return; - - const uint8_t vallen = (pgm ? lcd_strlen_P(data) : (lcd_strlen((char*)data))); - uint8_t n = LCD_WIDTH - (START_COL) - 2 - vallen; - - while (char c = pgm_read_byte(pstr)) { - n -= lcd_print_and_count(c); - pstr++; + if (lcd_implementation_mark_as_selected(row, isSelected)) { + const uint8_t vallen = (pgm ? utf8_strlen_P(data) : utf8_strlen((char*)data)); + uint8_t n = LCD_WIDTH - (START_COL) - 2 - vallen; + n *= DOG_CHAR_WIDTH; + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + lcd_moveto(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * vallen, row_y2); + if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str((char*)data); } - u8g.print(':'); - while (n--) u8g.print(' '); - u8g.setPrintPos(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * vallen, row_y2); - if (pgm) lcd_printPGM(data); else lcd_print((char*)data); } // Macros for edit items @@ -535,8 +467,8 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop #define DRAW_BOOL_SETTING(sel, row, pstr, data) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) void lcd_implementation_drawedit(const char* const pstr, const char* const value=NULL) { - const uint8_t labellen = lcd_strlen_P(pstr), - vallen = lcd_strlen(value); + const uint8_t labellen = utf8_strlen_P(pstr), + vallen = utf8_strlen(value); uint8_t rows = (labellen > LCD_WIDTH - 2 - vallen) ? 2 : 1; @@ -566,20 +498,20 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop bool onpage = PAGE_CONTAINS(baseline + 1 - (DOG_CHAR_HEIGHT_EDIT), baseline); if (onpage) { - u8g.setPrintPos(0, baseline); - lcd_printPGM_utf(pstr); + lcd_moveto(0, baseline); + lcd_put_u8str_P(pstr); } if (value != NULL) { - u8g.print(':'); + lcd_put_wchar(':'); if (rows == 2) { baseline += segmentHeight; onpage = PAGE_CONTAINS(baseline + 1 - (DOG_CHAR_HEIGHT_EDIT), baseline); } if (onpage) { - u8g.setPrintPos(((lcd_width - 1) - (vallen + 1)) * char_width, baseline); // Right-justified, leaving padded by spaces - u8g.print(' '); // overwrite char if value gets shorter - lcd_print(value); + lcd_moveto(((lcd_width - 1) - (vallen + 1)) * char_width, baseline); // Right-justified, leaving padded by spaces + lcd_put_wchar(' '); // overwrite char if value gets shorter + lcd_put_u8str(value); } } } @@ -603,7 +535,7 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor if (filename_scroll_hash != name_hash) { // If the hash changed... filename_scroll_hash = name_hash; // Save the new hash - filename_scroll_max = max(0, lcd_strlen(longFilename) - maxlen); // Update the scroll limit + filename_scroll_max = MAX(0, utf8_strlen(longFilename) - maxlen); // Update the scroll limit filename_scroll_pos = 0; // Reset scroll to the start lcd_status_update_delay = 8; // Don't scroll right away } @@ -614,15 +546,12 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop #endif } - if (isDir) lcd_print(LCD_STR_FOLDER[0]); + if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); - char c; - uint8_t n = maxlen; - while (n && (c = *outstr)) { - n -= lcd_print_and_count(c); - ++outstr; - } - while (n) { --n; u8g.print(' '); } + int n; + n = lcd_put_u8str_max(outstr, maxlen * (DOG_CHAR_WIDTH)); + n = maxlen * (DOG_CHAR_WIDTH) - n; + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } } #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false) @@ -689,30 +618,30 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop // Show X and Y positions at top of screen u8g.setColorIndex(1); if (PAGE_UNDER(7)) { - u8g.setPrintPos(5, 7); - lcd_print("X:"); - lcd_print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); - u8g.setPrintPos(74, 7); - lcd_print("Y:"); - lcd_print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + lcd_moveto(5, 7); + lcd_put_u8str("X:"); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd_moveto(74, 7); + lcd_put_u8str("Y:"); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); } // Print plot position if (PAGE_CONTAINS(LCD_PIXEL_HEIGHT - (INFO_FONT_HEIGHT - 1), LCD_PIXEL_HEIGHT)) { - u8g.setPrintPos(5, LCD_PIXEL_HEIGHT); - lcd_print('('); + lcd_moveto(5, LCD_PIXEL_HEIGHT); + lcd_put_wchar('('); u8g.print(x_plot); - lcd_print(','); + lcd_put_wchar(','); u8g.print(y_plot); - lcd_print(')'); + lcd_put_wchar(')'); // Show the location value - u8g.setPrintPos(74, LCD_PIXEL_HEIGHT); - lcd_print("Z:"); + lcd_moveto(74, LCD_PIXEL_HEIGHT); + lcd_put_u8str("Z:"); if (!isnan(ubl.z_values[x_plot][y_plot])) - lcd_print(ftostr43sign(ubl.z_values[x_plot][y_plot])); + lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); else - lcd_printPGM(PSTR(" -----")); + lcd_put_u8str_P(PSTR(" -----")); } } diff --git a/Marlin/ultralcd_impl_HD44780.h b/Marlin/src/lcd/ultralcd_impl_HD44780.h similarity index 71% rename from Marlin/ultralcd_impl_HD44780.h rename to Marlin/src/lcd/ultralcd_impl_HD44780.h index 85b2b83b5b..4ea2fdc22b 100644 --- a/Marlin/ultralcd_impl_HD44780.h +++ b/Marlin/src/lcd/ultralcd_impl_HD44780.h @@ -28,128 +28,14 @@ * These are the most common LCD character displays. */ -#include "utility.h" -#include "duration_t.h" - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" - - #if ENABLED(ULTIPANEL) - #define ULTRA_X_PIXELS_PER_CHAR 5 - #define ULTRA_Y_PIXELS_PER_CHAR 8 - #define ULTRA_COLUMNS_FOR_MESH_MAP 7 - #define ULTRA_ROWS_FOR_MESH_MAP 4 - - #define N_USER_CHARS 8 - - #define TOP_LEFT _BV(0) - #define TOP_RIGHT _BV(1) - #define LOWER_LEFT _BV(2) - #define LOWER_RIGHT _BV(3) - #endif -#endif - -extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. - -//////////////////////////////////// -// Setup button and encode mappings for each panel (into 'buttons' variable -// -// This is just to map common functions (across different panels) onto the same -// macro name. The mapping is independent of whether the button is directly connected or -// via a shift/i2c register. - -#if ENABLED(ULTIPANEL) - - // - // Setup other button mappings of each panel - // - #if ENABLED(LCD_I2C_VIKI) - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - // button and encoder bit positions within 'buttons' - #define B_LE (BUTTON_LEFT< - #include - #include - #define LCD_CLASS LiquidCrystal_I2C LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_I2C_PIN_EN, LCD_I2C_PIN_RW, LCD_I2C_PIN_RS, LCD_I2C_PIN_D4, LCD_I2C_PIN_D5, LCD_I2C_PIN_D6, LCD_I2C_PIN_D7); #elif ENABLED(LCD_I2C_TYPE_MCP23017) - //for the LED indicators (which maybe mapped to different things in lcd_implementation_update_indicators()) - #define LED_A 0x04 //100 - #define LED_B 0x02 //010 - #define LED_C 0x01 //001 - - #define LCD_HAS_STATUS_INDICATORS - - #include - #include - #define LCD_CLASS LiquidTWI2 #if ENABLED(DETECT_DEVICE) LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); #else @@ -157,9 +43,6 @@ extern volatile uint8_t buttons; //an extended version of the last checked butt #endif #elif ENABLED(LCD_I2C_TYPE_MCP23008) - #include - #include - #define LCD_CLASS LiquidTWI2 #if ENABLED(DETECT_DEVICE) LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); #else @@ -167,43 +50,33 @@ extern volatile uint8_t buttons; //an extended version of the last checked butt #endif #elif ENABLED(LCD_I2C_TYPE_PCA8574) - #include - #define LCD_CLASS LiquidCrystal_I2C LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); // 2 wire Non-latching LCD SR from: // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection #elif ENABLED(SR_LCD_2W_NL) - extern "C" void __cxa_pure_virtual() { while (1); } - #include - #include - #define LCD_CLASS LiquidCrystal_SR #if PIN_EXISTS(SR_STROBE) LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN, SR_STROBE_PIN); #else LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); #endif + #elif ENABLED(LCM1602) - #include - #include - #include - #define LCD_CLASS LiquidCrystal_I2C LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); + #else // Standard directly connected LCD implementations - #include - #define LCD_CLASS LiquidCrystal LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 #endif -#include "utf_mapper.h" +#include "fontutils.h" +#include "lcdprint.h" #if ENABLED(LCD_PROGRESS_BAR) static millis_t progress_bar_ms = 0; // Start millis of the current progress bar cycle #if PROGRESS_MSG_EXPIRE > 0 static millis_t expire_status_ms = 0; // millis at which to expire the status message #endif - #define LCD_STR_PROGRESS "\x03\x04\x05" #endif #if ENABLED(LCD_HAS_STATUS_INDICATORS) @@ -217,10 +90,6 @@ static void createChar_P(const char c, const byte * const ptr) { lcd.createChar(c, temp); } -#define CHARSET_MENU 0 -#define CHARSET_INFO 1 -#define CHARSET_BOOT 2 - static void lcd_set_custom_characters( #if ENABLED(LCD_PROGRESS_BAR) || ENABLED(SHOW_BOOTSCREEN) const uint8_t screen_charset=CHARSET_INFO @@ -425,6 +294,7 @@ static void lcd_set_custom_characters( #endif } } + } static void lcd_implementation_init( @@ -468,46 +338,60 @@ static void lcd_implementation_init( void lcd_implementation_clear() { lcd.clear(); } -void lcd_print(const char c) { charset_mapper(c); } - -void lcd_print(const char *str) { while (*str) lcd.print(*str++); } -void lcd_printPGM(const char *str) { while (const char c = pgm_read_byte(str)) lcd.print(c), ++str; } - -void lcd_print_utf(const char *str, uint8_t n=LCD_WIDTH) { - char c; - while (n && (c = *str)) n -= charset_mapper(c), ++str; -} - -void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { - char c; - while (n && (c = pgm_read_byte(str))) n -= charset_mapper(c), ++str; -} - #if ENABLED(SHOW_BOOTSCREEN) void lcd_erase_line(const int16_t line) { - lcd.setCursor(0, line); + lcd_moveto(0, line); for (uint8_t i = LCD_WIDTH + 1; --i;) - lcd.write(' '); + lcd_put_wchar(' '); } // Scroll the PSTR 'text' in a 'len' wide field for 'time' milliseconds at position col,line - void lcd_scroll(const int16_t col, const int16_t line, const char* const text, const int16_t len, const int16_t time) { - char tmp[LCD_WIDTH + 1] = {0}; - int16_t n = max(lcd_strlen_P(text) - len, 0); - for (int16_t i = 0; i <= n; i++) { - strncpy_P(tmp, text + i, min(len, LCD_WIDTH)); - lcd.setCursor(col, line); - lcd_print(tmp); - delay(time / max(n, 1)); + void lcd_scroll(const uint8_t col, const uint8_t line, const char* const text, const uint8_t len, const int16_t time) { + uint8_t slen = utf8_strlen_P(text); + if (slen < len) { + // Fits into, + lcd_moveto(col, line); + lcd_put_u8str_max_P(text, len); + while (slen < len) { + lcd_put_wchar(' '); + ++slen; + } + safe_delay(time); + } + else { + const char* p = text; + int dly = time / MAX(slen, 1); + for (uint8_t i = 0; i <= slen; i++) { + + // Go to the correct place + lcd_moveto(col, line); + + // Print the text + lcd_put_u8str_max_P(p, len); + + // Fill with spaces + uint8_t ix = slen - i; + while (ix < len) { + lcd_put_wchar(' '); + ++ix; + } + + // Delay + safe_delay(dly); + + // Advance to the next UTF8 valid position + p++; + while (!START_OF_UTF8_CHAR(pgm_read_byte(p))) p++; + } } } static void logo_lines(const char* const extra) { - int16_t indent = (LCD_WIDTH - 8 - lcd_strlen_P(extra)) / 2; - lcd.setCursor(indent, 0); lcd.print('\x00'); lcd_printPGM(PSTR( "------" )); lcd.write('\x01'); - lcd.setCursor(indent, 1); lcd_printPGM(PSTR("|Marlin|")); lcd_printPGM(extra); - lcd.setCursor(indent, 2); lcd.write('\x02'); lcd_printPGM(PSTR( "------" )); lcd.write('\x03'); + int16_t indent = (LCD_WIDTH - 8 - utf8_strlen_P(extra)) / 2; + lcd_moveto(indent, 0); lcd_put_wchar('\x00'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x01'); + lcd_moveto(indent, 1); lcd_put_u8str_P(PSTR("|Marlin|")); lcd_put_u8str_P(extra); + lcd_moveto(indent, 2); lcd_put_wchar('\x02'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x03'); } void lcd_bootscreen() { @@ -518,9 +402,9 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { #define CENTER_OR_SCROLL(STRING,DELAY) \ lcd_erase_line(3); \ - if (strlen(STRING) <= LCD_WIDTH) { \ - lcd.setCursor((LCD_WIDTH - lcd_strlen_P(PSTR(STRING))) / 2, 3); \ - lcd_printPGM_utf(PSTR(STRING)); \ + if (utf8_strlen(STRING) <= LCD_WIDTH) { \ + lcd_moveto((LCD_WIDTH - utf8_strlen_P(PSTR(STRING))) / 2, 3); \ + lcd_put_u8str_P(PSTR(STRING)); \ safe_delay(DELAY); \ } \ else { \ @@ -531,7 +415,7 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { // // Show the Marlin logo with splash line 1 // - if (LCD_EXTRA_SPACE >= strlen(STRING_SPLASH_LINE1) + 1) { + if (LCD_EXTRA_SPACE >= utf8_strlen(STRING_SPLASH_LINE1) + 1) { // // Show the Marlin logo, splash line1, and splash line 2 // @@ -562,7 +446,7 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { // // Show splash line 2 only, alongside the logo if possible // - if (LCD_EXTRA_SPACE >= strlen(STRING_SPLASH_LINE2) + 1) { + if (LCD_EXTRA_SPACE >= utf8_strlen(STRING_SPLASH_LINE2) + 1) { logo_lines(PSTR(" " STRING_SPLASH_LINE2)); safe_delay(2000); } @@ -587,31 +471,37 @@ void lcd_printPGM_utf(const char *str, uint8_t n=LCD_WIDTH) { #endif // SHOW_BOOTSCREEN void lcd_kill_screen() { - lcd.setCursor(0, 0); - lcd_print_utf(lcd_status_message); + lcd_moveto(0, 0); + lcd_put_u8str(lcd_status_message); #if LCD_HEIGHT < 4 - lcd.setCursor(0, 2); + lcd_moveto(0, 2); #else - lcd.setCursor(0, 2); - lcd_printPGM_utf(PSTR(MSG_HALTED)); - lcd.setCursor(0, 3); + lcd_moveto(0, 2); + lcd_put_u8str_P(PSTR(MSG_HALTED)); + lcd_moveto(0, 3); #endif - lcd_printPGM_utf(PSTR(MSG_PLEASE_RESET)); + lcd_put_u8str_P(PSTR(MSG_PLEASE_RESET)); } -FORCE_INLINE void _draw_axis_label(const AxisEnum axis, const char* const pstr, const bool blink) { +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + lcd_put_wchar('X' + uint8_t(axis)); if (blink) - lcd_printPGM(pstr); + lcd_put_u8str(value); else { - if (!axis_homed[axis]) - lcd.write('?'); + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); else { #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - if (!axis_known_position[axis]) - lcd.write(' '); + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); else #endif - lcd_printPGM(pstr); + lcd_put_u8str(value); } } } @@ -625,10 +515,10 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co const float t1 = thermalManager.degHotend(heater), t2 = thermalManager.degTargetHotend(heater); #endif - if (prefix >= 0) lcd.print(prefix); + if (prefix >= 0) lcd_put_wchar(prefix); - lcd.print(itostr3(t1 + 0.5)); - lcd.write('/'); + lcd_put_u8str(itostr3(t1 + 0.5)); + lcd_put_wchar('/'); #if !HEATER_IDLE_HANDLER UNUSED(blink); @@ -641,18 +531,18 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co ); if (!blink && is_idle) { - lcd.write(' '); - if (t2 >= 10) lcd.write(' '); - if (t2 >= 100) lcd.write(' '); + lcd_put_wchar(' '); + if (t2 >= 10) lcd_put_wchar(' '); + if (t2 >= 100) lcd_put_wchar(' '); } else #endif - lcd.print(itostr3left(t2 + 0.5)); + lcd_put_u8str(itostr3left(t2 + 0.5)); if (prefix >= 0) { - lcd.print((char)LCD_DEGREE_CHAR); - lcd.write(' '); - if (t2 < 10) lcd.write(' '); + lcd_put_wchar(LCD_DEGREE_CHAR); + lcd_put_wchar(' '); + if (t2 < 10) lcd_put_wchar(' '); } } @@ -672,7 +562,7 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co b = LCD_STR_PROGRESS[rem - 1]; msg[i] = b; } - lcd.print(msg); + lcd_put_u8str(msg); } #endif // LCD_PROGRESS_BAR @@ -707,7 +597,7 @@ static void lcd_implementation_status_screen() { // Line 1 // - lcd.setCursor(0, 0); + lcd_moveto(0, 0); #if LCD_WIDTH < 20 @@ -719,18 +609,18 @@ static void lcd_implementation_status_screen() { // // Hotend 1 or Bed Temperature // - #if HOTENDS > 1 || TEMP_SENSOR_BED + #if HOTENDS > 1 || HAS_HEATED_BED - lcd.setCursor(8, 0); + lcd_moveto(8, 0); #if HOTENDS > 1 - lcd.print((char)LCD_STR_THERMOMETER[0]); + lcd_put_wchar((char)LCD_STR_THERMOMETER[0]); _draw_heater_status(1, -1, blink); #else - lcd.print((char)LCD_BEDTEMP_CHAR); + lcd_put_wchar((char)LCD_BEDTEMP_CHAR); _draw_heater_status(-1, -1, blink); #endif - #endif // HOTENDS > 1 || TEMP_SENSOR_BED + #endif // HOTENDS > 1 || HAS_HEATED_BED #else // LCD_WIDTH >= 20 @@ -742,8 +632,8 @@ static void lcd_implementation_status_screen() { // // Hotend 1 or Bed Temperature // - #if HOTENDS > 1 || TEMP_SENSOR_BED - lcd.setCursor(10, 0); + #if HOTENDS > 1 || HAS_HEATED_BED + lcd_moveto(10, 0); #if HOTENDS > 1 _draw_heater_status(1, LCD_STR_THERMOMETER[0], blink); #else @@ -755,7 +645,7 @@ static void lcd_implementation_status_screen() { ), blink); #endif - #endif // HOTENDS > 1 || TEMP_SENSOR_BED != 0 + #endif // HOTENDS > 1 || HAS_HEATED_BED #endif // LCD_WIDTH >= 20 @@ -768,27 +658,27 @@ static void lcd_implementation_status_screen() { #if LCD_WIDTH < 20 #if ENABLED(SDSUPPORT) - lcd.setCursor(0, 2); - lcd_printPGM(PSTR("SD")); + lcd_moveto(0, 2); + lcd_put_u8str_P(PSTR("SD")); if (IS_SD_PRINTING) - lcd.print(itostr3(card.percentDone())); + lcd_put_u8str(itostr3(card.percentDone())); else - lcd_printPGM(PSTR("---")); - lcd.write('%'); + lcd_put_u8str_P(PSTR("---")); + lcd_put_wchar('%'); #endif // SDSUPPORT #else // LCD_WIDTH >= 20 - lcd.setCursor(0, 1); + lcd_moveto(0, 1); // If the first line has two extruder temps, // show more temperatures on the next line - #if HOTENDS > 2 || (HOTENDS > 1 && TEMP_SENSOR_BED) + #if HOTENDS > 2 || (HOTENDS > 1 && HAS_HEATED_BED) #if HOTENDS > 2 _draw_heater_status(2, LCD_STR_THERMOMETER[0], blink); - lcd.setCursor(10, 1); + lcd_moveto(10, 1); #endif _draw_heater_status(-1, ( @@ -798,29 +688,23 @@ static void lcd_implementation_status_screen() { LCD_BEDTEMP_CHAR ), blink); - #else // HOTENDS <= 2 && (HOTENDS <= 1 || !TEMP_SENSOR_BED) - // Before homing the axis letters are blinking 'X' <-> '?'. - // When axis is homed but axis_known_position is false the axis letters are blinking 'X' <-> ' '. - // When everything is ok you see a constant 'X'. + #else // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) - _draw_axis_label(X_AXIS, PSTR(MSG_X), blink); - lcd.print(ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS]))); + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); - lcd.write(' '); + lcd_put_wchar(' '); - _draw_axis_label(Y_AXIS, PSTR(MSG_Y), blink); - lcd.print(ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS]))); + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); - #endif // HOTENDS <= 2 && (HOTENDS <= 1 || !TEMP_SENSOR_BED) + #endif // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) #endif // LCD_WIDTH >= 20 - lcd.setCursor(LCD_WIDTH - 8, 1); - _draw_axis_label(Z_AXIS, PSTR(MSG_Z), blink); - lcd.print(ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS]))); + lcd_moveto(LCD_WIDTH - 8, 1); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); - #if HAS_LEVELING && !TEMP_SENSOR_BED - lcd.write(planner.leveling_active || blink ? '_' : ' '); + #if HAS_LEVELING && !HAS_HEATED_BED + lcd_put_wchar(planner.leveling_active || blink ? '_' : ' '); #endif #endif // LCD_HEIGHT > 2 @@ -831,20 +715,20 @@ static void lcd_implementation_status_screen() { #if LCD_HEIGHT > 3 - lcd.setCursor(0, 2); - lcd.print((char)LCD_FEEDRATE_CHAR); - lcd.print(itostr3(feedrate_percentage)); - lcd.write('%'); + lcd_moveto(0, 2); + lcd_put_wchar(LCD_FEEDRATE_CHAR); + lcd_put_u8str(itostr3(feedrate_percentage)); + lcd_put_wchar('%'); #if LCD_WIDTH >= 20 && ENABLED(SDSUPPORT) - lcd.setCursor(7, 2); - lcd_printPGM(PSTR("SD")); + lcd_moveto(7, 2); + lcd_put_u8str_P(PSTR("SD")); if (IS_SD_PRINTING) - lcd.print(itostr3(card.percentDone())); + lcd_put_u8str(itostr3(card.percentDone())); else - lcd_printPGM(PSTR("---")); - lcd.write('%'); + lcd_put_u8str_P(PSTR("---")); + lcd_put_wchar('%'); #endif // LCD_WIDTH >= 20 && SDSUPPORT @@ -852,9 +736,9 @@ static void lcd_implementation_status_screen() { duration_t elapsed = print_job_timer.duration(); uint8_t len = elapsed.toDigital(buffer); - lcd.setCursor(LCD_WIDTH - len - 1, 2); - lcd.print((char)LCD_CLOCK_CHAR); - lcd_print(buffer); + lcd_moveto(LCD_WIDTH - len - 1, 2); + lcd_put_wchar(LCD_CLOCK_CHAR); + lcd_put_u8str(buffer); #endif // LCD_HEIGHT > 3 @@ -863,7 +747,7 @@ static void lcd_implementation_status_screen() { // Status Message (which may be a Progress Bar or Filament display) // - lcd.setCursor(0, LCD_HEIGHT - 1); + lcd_moveto(0, LCD_HEIGHT - 1); #if ENABLED(LCD_PROGRESS_BAR) @@ -880,16 +764,16 @@ static void lcd_implementation_status_screen() { // Show Filament Diameter and Volumetric Multiplier % // After allowing lcd_status_message to show for 5 seconds if (ELAPSED(millis(), previous_lcd_status_ms + 5000UL)) { - lcd_printPGM(PSTR("Dia ")); - lcd.print(ftostr12ns(filament_width_meas)); - lcd_printPGM(PSTR(" V")); - lcd.print(itostr3(100.0 * ( + lcd_put_u8str_P(PSTR("Dia ")); + lcd_put_u8str(ftostr12ns(filament_width_meas)); + lcd_put_u8str_P(PSTR(" V")); + lcd_put_u8str(itostr3(100.0 * ( parser.volumetric_enabled ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] ) )); - lcd.write('%'); + lcd_put_wchar('%'); return; } @@ -897,35 +781,76 @@ static void lcd_implementation_status_screen() { #if ENABLED(STATUS_MESSAGE_SCROLLING) static bool last_blink = false; - const uint8_t slen = lcd_strlen(lcd_status_message); - const char *stat = lcd_status_message + status_scroll_pos; - if (slen <= LCD_WIDTH) - lcd_print_utf(stat); // The string isn't scrolling + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(lcd_status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + } else { - if (status_scroll_pos <= slen - LCD_WIDTH) - lcd_print_utf(stat); // The string fills the screen + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = lcd_status_message + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= LCD_WIDTH) { + // The remaining string fills the screen - Print it + lcd_put_u8str_max(stat, LCD_WIDTH); + } else { - uint8_t chars = LCD_WIDTH; - if (status_scroll_pos < slen) { // First string still visible - lcd_print_utf(stat); // The string leaves space - chars -= slen - status_scroll_pos; // Amount of space left - } - lcd.write('.'); // Always at 1+ spaces left, draw a dot - if (--chars) { - if (status_scroll_pos < slen + 1) // Draw a second dot if there's space - --chars, lcd.write('.'); - if (chars) lcd_print_utf(lcd_status_message, chars); // Print a second copy of the message + + // The remaining string does not completely fill the screen + lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) + lcd_put_u8str_max(lcd_status_message, chars); // Print a second copy of the message } } if (last_blink != blink) { last_blink = blink; - // Skip any non-printing bytes - if (status_scroll_pos < slen) while (!PRINTABLE(lcd_status_message[status_scroll_pos])) status_scroll_pos++; - if (++status_scroll_pos >= slen + 2) status_scroll_pos = 0; + + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(lcd_status_message[status_scroll_offset])) + status_scroll_offset++; + } + else + status_scroll_offset = 0; } } #else - lcd_print_utf(lcd_status_message); + UNUSED(blink); + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // Just print the string to the LCD + lcd_put_u8str_max(lcd_status_message, LCD_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } #endif } @@ -935,7 +860,7 @@ static void lcd_implementation_status_screen() { static void lcd_implementation_hotend_status(const uint8_t row, const uint8_t extruder=active_extruder) { if (row < LCD_HEIGHT) { - lcd.setCursor(LCD_WIDTH - 9, row); + lcd_moveto(LCD_WIDTH - 9, row); _draw_heater_status(extruder, LCD_STR_THERMOMETER[0], lcd_blink()); } } @@ -944,76 +869,58 @@ static void lcd_implementation_status_screen() { static void lcd_implementation_drawmenu_static(const uint8_t row, const char* pstr, const bool center=true, const bool invert=false, const char *valstr=NULL) { UNUSED(invert); - char c; int8_t n = LCD_WIDTH; - lcd.setCursor(0, row); + lcd_moveto(0, row); if (center && !valstr) { - int8_t pad = (LCD_WIDTH - lcd_strlen_P(pstr)) / 2; - while (--pad >= 0) { lcd.write(' '); n--; } + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd_put_wchar(' '); n--; } } - while (n > 0 && (c = pgm_read_byte(pstr))) { - n -= charset_mapper(c); - pstr++; - } - if (valstr) while (n > 0 && (c = *valstr)) { - n -= charset_mapper(c); - valstr++; - } - while (n-- > 0) lcd.write(' '); + n -= lcd_put_u8str_max_P(pstr, n); + if (valstr) n -= lcd_put_u8str_max(valstr, n); + for (; n > 0; --n) lcd_put_wchar(' '); } static void lcd_implementation_drawmenu_generic(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char post_char) { - char c; uint8_t n = LCD_WIDTH - 2; - lcd.setCursor(0, row); - lcd.print(sel ? pre_char : ' '); - while ((c = pgm_read_byte(pstr)) && n > 0) { - n -= charset_mapper(c); - pstr++; - } - while (n--) lcd.write(' '); - lcd.print(post_char); + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + while (n--) lcd_put_wchar(' '); + lcd_put_wchar(post_char); } static void lcd_implementation_drawmenu_setting_edit_generic(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char* const data) { - char c; - uint8_t n = LCD_WIDTH - 2 - lcd_strlen(data); - lcd.setCursor(0, row); - lcd.print(sel ? pre_char : ' '); - while ((c = pgm_read_byte(pstr)) && n > 0) { - n -= charset_mapper(c); - pstr++; - } - lcd.write(':'); - while (n--) lcd.write(' '); - lcd_print(data); + uint8_t n = LCD_WIDTH - 2 - utf8_strlen(data); + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n--) lcd_put_wchar(' '); + lcd_put_u8str(data); } static void lcd_implementation_drawmenu_setting_edit_generic_P(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char* const data) { - char c; - uint8_t n = LCD_WIDTH - 2 - lcd_strlen_P(data); - lcd.setCursor(0, row); - lcd.print(sel ? pre_char : ' '); - while ((c = pgm_read_byte(pstr)) && n > 0) { - n -= charset_mapper(c); - pstr++; - } - lcd.write(':'); - while (n--) lcd.write(' '); - lcd_printPGM(data); + uint8_t n = LCD_WIDTH - 2 - utf8_strlen_P(data); + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n--) lcd_put_wchar(' '); + lcd_put_u8str_P(data); } #define DRAWMENU_SETTING_EDIT_GENERIC(_src) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', _src) #define DRAW_BOOL_SETTING(sel, row, pstr, data) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) void lcd_implementation_drawedit(const char* pstr, const char* const value=NULL) { - lcd.setCursor(1, 1); - lcd_printPGM_utf(pstr); + lcd_moveto(1, 1); + lcd_put_u8str_P(pstr); if (value != NULL) { - lcd.write(':'); - const uint8_t valrow = (lcd_strlen_P(pstr) + 1 + lcd_strlen(value) + 1) > (LCD_WIDTH - 2) ? 2 : 1; // Value on the next row if it won't fit - lcd.setCursor((LCD_WIDTH - 1) - (lcd_strlen(value) + 1), valrow); // Right-justified, padded by spaces - lcd.write(' '); // overwrite char if value gets shorter - lcd_print(value); + lcd_put_wchar(':'); + int len = utf8_strlen(value); + const uint8_t valrow = (utf8_strlen_P(pstr) + 1 + len + 1) > (LCD_WIDTH - 2) ? 2 : 1; // Value on the next row if it won't fit + lcd_moveto((LCD_WIDTH - 1) - (len + 1), valrow); // Right-justified, padded by spaces + lcd_put_wchar(' '); // overwrite char if value gets shorter + lcd_put_u8str(value); } } @@ -1021,8 +928,8 @@ static void lcd_implementation_status_screen() { static void lcd_implementation_drawmenu_sd(const bool sel, const uint8_t row, const char* const pstr, const char* filename, char* const longFilename, const uint8_t concat, const char post_char) { UNUSED(pstr); - lcd.setCursor(0, row); - lcd.print(sel ? '>' : ' '); + lcd_moveto(0, row); + lcd_put_wchar(sel ? '>' : ' '); uint8_t n = LCD_WIDTH - concat; const char *outstr = longFilename[0] ? longFilename : filename; @@ -1034,7 +941,7 @@ static void lcd_implementation_status_screen() { name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor if (filename_scroll_hash != name_hash) { // If the hash changed... filename_scroll_hash = name_hash; // Save the new hash - filename_scroll_max = max(0, lcd_strlen(longFilename) - n); // Update the scroll limit + filename_scroll_max = MAX(0, utf8_strlen(longFilename) - n); // Update the scroll limit filename_scroll_pos = 0; // Reset scroll to the start lcd_status_update_delay = 8; // Don't scroll right away } @@ -1045,14 +952,12 @@ static void lcd_implementation_status_screen() { #endif } - char c; - while (n && (c = *outstr)) { - n -= charset_mapper(c); - ++outstr; - } - while (n) { --n; lcd.write(' '); } + lcd_moveto(0, row); + lcd_put_wchar(sel ? '>' : ' '); + n -= lcd_put_u8str_max(outstr, n); - lcd.print(post_char); + while (n) { --n; lcd_put_wchar(' '); } + lcd_put_wchar(post_char); } static void lcd_implementation_drawmenu_sdfile(const bool sel, const uint8_t row, const char* pstr, const char* filename, char* const longFilename) { @@ -1206,7 +1111,7 @@ static void lcd_implementation_status_screen() { #define _LCD_W_POS 12 #define _PLOT_X 1 #define _MAP_X 3 - #define _LABEL(C,X,Y) lcd.setCursor(X, Y); lcd.print(C) + #define _LABEL(C,X,Y) lcd_moveto(X, Y); lcd_put_u8str(C) #define _XLABEL(X,Y) _LABEL("X:",X,Y) #define _YLABEL(X,Y) _LABEL("Y:",X,Y) #define _ZLABEL(X,Y) _LABEL("Z:",X,Y) @@ -1214,7 +1119,7 @@ static void lcd_implementation_status_screen() { #define _LCD_W_POS 8 #define _PLOT_X 0 #define _MAP_X 1 - #define _LABEL(X,Y,C) lcd.setCursor(X, Y); lcd.write(C) + #define _LABEL(X,Y,C) lcd_moveto(X, Y); lcd_put_wchar(C) #define _XLABEL(X,Y) _LABEL('X',X,Y) #define _YLABEL(X,Y) _LABEL('Y',X,Y) #define _ZLABEL(X,Y) _LABEL('Z',X,Y) @@ -1226,12 +1131,12 @@ static void lcd_implementation_status_screen() { * Show X and Y positions */ _XLABEL(_PLOT_X, 0); - lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); _YLABEL(_LCD_W_POS, 0); - lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); - lcd.setCursor(_PLOT_X, 0); + lcd_moveto(_PLOT_X, 0); #else // 16x4 or 20x4 display @@ -1278,18 +1183,18 @@ static void lcd_implementation_status_screen() { n_cols = right_edge / (ULTRA_X_PIXELS_PER_CHAR) + 1; for (i = 0; i < n_cols; i++) { - lcd.setCursor(i, 0); - lcd.print((char)0x00); // top line of the box + lcd_moveto(i, 0); + lcd_put_wchar((char)0x00); // top line of the box - lcd.setCursor(i, n_rows - 1); - lcd.write(0x01); // bottom line of the box + lcd_moveto(i, n_rows - 1); + lcd_put_wchar(0x01); // bottom line of the box } for (j = 0; j < n_rows; j++) { - lcd.setCursor(0, j); - lcd.write(0x02); // Left edge of the box - lcd.setCursor(n_cols - 1, j); - lcd.write(0x03); // right edge of the box + lcd_moveto(0, j); + lcd_put_wchar(0x02); // Left edge of the box + lcd_moveto(n_cols - 1, j); + lcd_put_wchar(0x03); // right edge of the box } /** @@ -1299,10 +1204,10 @@ static void lcd_implementation_status_screen() { k = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 2; l = (ULTRA_Y_PIXELS_PER_CHAR) * n_rows; if (l > k && l - k >= (ULTRA_Y_PIXELS_PER_CHAR) / 2) { - lcd.setCursor(0, n_rows - 1); // left edge of the box - lcd.write(' '); - lcd.setCursor(n_cols - 1, n_rows - 1); // right edge of the box - lcd.write(' '); + lcd_moveto(0, n_rows - 1); // left edge of the box + lcd_put_wchar(' '); + lcd_moveto(n_cols - 1, n_rows - 1); // right edge of the box + lcd_put_wchar(' '); } clear_custom_char(&new_char); @@ -1347,7 +1252,7 @@ static void lcd_implementation_status_screen() { //dump_custom_char("at entry:", &new_char); clear_custom_char(&new_char); - const uint8_t ypix = min(upper_left.y_pixel_offset + pixels_per_y_mesh_pnt, ULTRA_Y_PIXELS_PER_CHAR); + const uint8_t ypix = MIN(upper_left.y_pixel_offset + pixels_per_y_mesh_pnt, ULTRA_Y_PIXELS_PER_CHAR); for (j = upper_left.y_pixel_offset; j < ypix; j++) { i = upper_left.x_pixel_mask; for (k = 0; k < pixels_per_x_mesh_pnt; k++) { @@ -1361,8 +1266,8 @@ static void lcd_implementation_status_screen() { //dump_custom_char("after add edges", &new_char); lcd.createChar(4, (uint8_t*)&new_char); - lcd.setCursor(upper_left.column, upper_left.row); - lcd.write(0x04); + lcd_moveto(upper_left.column, upper_left.row); + lcd_put_wchar(0x04); //dump_custom_char("after lcd update:", &new_char); /** @@ -1383,8 +1288,8 @@ static void lcd_implementation_status_screen() { lcd.createChar(5, (uint8_t *) &new_char); - lcd.setCursor(lower_right.column, upper_left.row); - lcd.write(0x05); + lcd_moveto(lower_right.column, upper_left.row); + lcd_put_wchar(0x05); } /** @@ -1404,8 +1309,8 @@ static void lcd_implementation_status_screen() { add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, LOWER_LEFT); lcd.createChar(6, (uint8_t *) &new_char); - lcd.setCursor(upper_left.column, lower_right.row); - lcd.write(0x06); + lcd_moveto(upper_left.column, lower_right.row); + lcd_put_wchar(0x06); } /** @@ -1429,8 +1334,8 @@ static void lcd_implementation_status_screen() { add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, LOWER_RIGHT); lcd.createChar(7, (uint8_t*)&new_char); - lcd.setCursor(lower_right.column, lower_right.row); - lcd.write(0x07); + lcd_moveto(lower_right.column, lower_right.row); + lcd_put_wchar(0x07); } #endif @@ -1438,12 +1343,12 @@ static void lcd_implementation_status_screen() { /** * Print plot position */ - lcd.setCursor(_LCD_W_POS, 0); - lcd.write('('); - lcd.print(x); - lcd.write(','); - lcd.print(inverted_y); - lcd.write(')'); + lcd_moveto(_LCD_W_POS, 0); + lcd_put_wchar('('); + lcd_put_u8str(itostr3(x)); + lcd_put_wchar(','); + lcd_put_u8str(itostr3(inverted_y)); + lcd_put_wchar(')'); #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display @@ -1452,9 +1357,9 @@ static void lcd_implementation_status_screen() { */ _ZLABEL(_LCD_W_POS, 1); if (!isnan(ubl.z_values[x][inverted_y])) - lcd.print(ftostr43sign(ubl.z_values[x][inverted_y])); + lcd_put_u8str(ftostr43sign(ubl.z_values[x][inverted_y])); else - lcd_printPGM(PSTR(" -----")); + lcd_put_u8str_P(PSTR(" -----")); #else // 16x4 or 20x4 display @@ -1462,18 +1367,18 @@ static void lcd_implementation_status_screen() { * Show all values at right of screen */ _XLABEL(_LCD_W_POS, 1); - lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); _YLABEL(_LCD_W_POS, 2); - lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); /** * Show the location value */ _ZLABEL(_LCD_W_POS, 3); if (!isnan(ubl.z_values[x][inverted_y])) - lcd.print(ftostr43sign(ubl.z_values[x][inverted_y])); + lcd_put_u8str(ftostr43sign(ubl.z_values[x][inverted_y])); else - lcd_printPGM(PSTR(" -----")); + lcd_put_u8str_P(PSTR(" -----")); #endif // LCD_HEIGHT > 3 } diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp new file mode 100644 index 0000000000..117104001e --- /dev/null +++ b/Marlin/src/libs/buzzer.cpp @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if DISABLED(LCD_USE_I2C_BUZZER) && PIN_EXISTS(BEEPER) + +#include "buzzer.h" +#include "../module/temperature.h" + +Buzzer::state_t Buzzer::state; +CircularQueue Buzzer::buffer; +Buzzer buzzer; + +/** + * @brief Add a tone to the queue + * @details Adds a tone_t structure to the ring buffer, will block IO if the + * queue is full waiting for one slot to get available. + * + * @param duration Duration of the tone in milliseconds + * @param frequency Frequency of the tone in hertz + */ +void Buzzer::tone(const uint16_t duration, const uint16_t frequency/*=0*/) { + while (buffer.isFull()) { + tick(); + thermalManager.manage_heater(); + } + tone_t tone = { duration, frequency }; + buffer.enqueue(tone); +} + +void Buzzer::tick() { + const millis_t now = millis(); + + if (!state.endtime) { + if (buffer.isEmpty()) return; + + state.tone = buffer.dequeue(); + state.endtime = now + state.tone.duration; + + if (state.tone.frequency > 0) { + #if ENABLED(SPEAKER) + CRITICAL_SECTION_START; + ::tone(BEEPER_PIN, state.tone.frequency, state.tone.duration); + CRITICAL_SECTION_END; + #else + on(); + #endif + } + } + else if (ELAPSED(now, state.endtime)) reset(); +} + +#endif // !LCD_USE_I2C_BUZZER && BEEPER diff --git a/Marlin/buzzer.h b/Marlin/src/libs/buzzer.h similarity index 63% rename from Marlin/buzzer.h rename to Marlin/src/libs/buzzer.h index d36447deb4..9cc23695c7 100644 --- a/Marlin/buzzer.h +++ b/Marlin/src/libs/buzzer.h @@ -23,12 +23,14 @@ #ifndef __BUZZER_H__ #define __BUZZER_H__ -#include "types.h" -#include "fastio.h" -#include "circularqueue.h" -#include "temperature.h" +#include "../inc/MarlinConfig.h" -#include "MarlinConfig.h" +// Make a buzzer and macro +#if ENABLED(LCD_USE_I2C_BUZZER) + // BUZZ() will be defined in ultralcd.h +#elif PIN_EXISTS(BEEPER) + +#include "circularqueue.h" #define TONE_QUEUE_LENGTH 4 @@ -45,46 +47,44 @@ struct tone_t { * @brief Buzzer class */ class Buzzer { - private: - struct state_t { + public: + + typedef struct { tone_t tone; uint32_t endtime; - } state; + } state_t; + + private: + static state_t state; protected: - CircularQueue buffer; + static CircularQueue buffer; /** * @brief Inverts the sate of a digital PIN * @details This will invert the current state of an digital IO pin. */ - void invert() { - TOGGLE(BEEPER_PIN); - } + FORCE_INLINE static void invert() { TOGGLE(BEEPER_PIN); } /** * @brief Turn off a digital PIN * @details Alias of digitalWrite(PIN, LOW) using FastIO */ - void off() { - WRITE(BEEPER_PIN, LOW); - } + FORCE_INLINE static void off() { WRITE(BEEPER_PIN, LOW); } /** * @brief Turn on a digital PIN * @details Alias of digitalWrite(PIN, HIGH) using FastIO */ - void on() { - WRITE(BEEPER_PIN, HIGH); - } + FORCE_INLINE static void on() { WRITE(BEEPER_PIN, HIGH); } /** * @brief Resets the state of the class * @details Brings the class state to a known one. */ - void reset() { - this->off(); - this->state.endtime = 0; + inline static void reset() { + off(); + state.endtime = 0; } public: @@ -93,7 +93,7 @@ class Buzzer { */ Buzzer() { SET_OUTPUT(BEEPER_PIN); - this->reset(); + reset(); } /** @@ -104,43 +104,24 @@ class Buzzer { * @param duration Duration of the tone in milliseconds * @param frequency Frequency of the tone in hertz */ - void tone(const uint16_t &duration, const uint16_t &frequency=0) { - while (buffer.isFull()) { - this->tick(); - thermalManager.manage_heater(); - } - tone_t tone = { duration, frequency }; - this->buffer.enqueue(tone); - } + static void tone(const uint16_t duration, const uint16_t frequency=0); /** - * @brief Loop function + * @brief Tick function * @details This function should be called at loop, it will take care of * playing the tones in the queue. */ - virtual void tick() { - const millis_t now = millis(); - - if (!this->state.endtime) { - if (this->buffer.isEmpty()) return; - - this->state.tone = this->buffer.dequeue(); - this->state.endtime = now + this->state.tone.duration; - - if (this->state.tone.frequency > 0) { - #if ENABLED(SPEAKER) - CRITICAL_SECTION_START; - ::tone(BEEPER_PIN, this->state.tone.frequency, this->state.tone.duration); - CRITICAL_SECTION_END; - #else - this->on(); - #endif - } - } - else if (ELAPSED(now, this->state.endtime)) this->reset(); - } + static void tick(); }; -extern Buzzer buzzer; + // Provide a buzzer instance + extern Buzzer buzzer; + #define BUZZ(d,f) buzzer.tone(d, f) + +#else // No buzz capability + + #define BUZZ(d,f) NOOP + +#endif #endif diff --git a/Marlin/circularqueue.h b/Marlin/src/libs/circularqueue.h similarity index 99% rename from Marlin/circularqueue.h rename to Marlin/src/libs/circularqueue.h index 9aafb99aca..d10e79bac9 100644 --- a/Marlin/circularqueue.h +++ b/Marlin/src/libs/circularqueue.h @@ -23,7 +23,7 @@ #ifndef __CIRCULARQUEUE_H__ #define __CIRCULARQUEUE_H__ -#include +#include /** * @brief Circular Queue class diff --git a/Marlin/duration_t.h b/Marlin/src/libs/duration_t.h similarity index 99% rename from Marlin/duration_t.h rename to Marlin/src/libs/duration_t.h index bcc3011bb6..f38ab0224d 100644 --- a/Marlin/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -23,9 +23,6 @@ #ifndef __DURATION_T__ #define __DURATION_T__ -#include -#include - struct duration_t { /** * @brief Duration is stored in seconds diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp new file mode 100644 index 0000000000..ebf8bca7ec --- /dev/null +++ b/Marlin/src/libs/hex_print_routines.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "../inc/MarlinConfig.h" +#include "../gcode/parser.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(M100_FREE_MEMORY_WATCHER) || ENABLED(DEBUG_GCODE_PARSER) + + #include "hex_print_routines.h" + + #ifdef CPU_32_BIT + constexpr int byte_start = 4; + static char _hex[] = "0x00000000"; + #else + constexpr int byte_start = 0; + static char _hex[] = "0x0000"; + #endif + + char* hex_byte(const uint8_t b) { + _hex[byte_start + 4] = hex_nybble(b >> 4); + _hex[byte_start + 5] = hex_nybble(b); + return &_hex[byte_start + 4]; + } + + inline void _hex_word(const uint16_t w) { + _hex[byte_start + 2] = hex_nybble(w >> 12); + _hex[byte_start + 3] = hex_nybble(w >> 8); + _hex[byte_start + 4] = hex_nybble(w >> 4); + _hex[byte_start + 5] = hex_nybble(w); + } + + char* hex_word(const uint16_t w) { + _hex_word(w); + return &_hex[byte_start + 2]; + } + + #ifdef CPU_32_BIT + char* hex_long(const uint32_t l) { + _hex[2] = hex_nybble(l >> 28); + _hex[3] = hex_nybble(l >> 24); + _hex[4] = hex_nybble(l >> 20); + _hex[5] = hex_nybble(l >> 16); + _hex_word((uint16_t)(l & 0xFFFF)); + return &_hex[2]; + } + #endif + + char* hex_address(const void * const w) { + #ifdef CPU_32_BIT + (void)hex_long((ptr_int_t)w); + #else + (void)hex_word((ptr_int_t)w); + #endif + return _hex; + } + + void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } + void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } + void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } + void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } + +#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER || DEBUG_GCODE_PARSER diff --git a/Marlin/hex_print_routines.h b/Marlin/src/libs/hex_print_routines.h similarity index 90% rename from Marlin/hex_print_routines.h rename to Marlin/src/libs/hex_print_routines.h index 05f1e79914..859b79fe31 100644 --- a/Marlin/hex_print_routines.h +++ b/Marlin/src/libs/hex_print_routines.h @@ -29,7 +29,7 @@ // Utility functions to create and print hex strings as nybble, byte, and word. // -inline char hex_nybble(const uint8_t n) { +FORCE_INLINE char hex_nybble(const uint8_t n) { return (n & 0xF) + ((n & 0xF) < 10 ? '0' : 'A' - 10); } char* hex_byte(const uint8_t b); @@ -41,4 +41,10 @@ void print_hex_byte(const uint8_t b); void print_hex_word(const uint16_t w); void print_hex_address(const void * const w); +#ifdef CPU_32_BIT + typedef uint32_t ptr_int_t; +#else + typedef uint16_t ptr_int_t; +#endif + #endif // HEX_PRINT_ROUTINES_H diff --git a/Marlin/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp similarity index 95% rename from Marlin/least_squares_fit.cpp rename to Marlin/src/libs/least_squares_fit.cpp index 66821ce58f..6d7fc580d8 100644 --- a/Marlin/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -32,15 +32,14 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_LINEAR) -#include "macros.h" -#include - #include "least_squares_fit.h" +#include + int finish_incremental_LSF(struct linear_fit_data *lsf) { const float N = lsf->N; @@ -59,7 +58,7 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { lsf->xzbar = lsf->xzbar / N - lsf->xbar * lsf->zbar; const float DD = lsf->x2bar * lsf->y2bar - sq(lsf->xybar); - if (FABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy)) + if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy)) return 1; lsf->A = (lsf->yzbar * lsf->xybar - lsf->xzbar * lsf->y2bar) / DD; diff --git a/Marlin/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h similarity index 86% rename from Marlin/least_squares_fit.h rename to Marlin/src/libs/least_squares_fit.h index 9ed923ab49..cbd42d2c6b 100644 --- a/Marlin/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -32,12 +32,10 @@ * */ -#include "MarlinConfig.h" +#ifndef _LEAST_SQUARES_FIT_H_ +#define _LEAST_SQUARES_FIT_H_ -#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_LINEAR) - -#include "Marlin.h" -#include "macros.h" +#include "../inc/MarlinConfig.h" #include struct linear_fit_data { @@ -54,7 +52,7 @@ void inline incremental_LSF_reset(struct linear_fit_data *lsf) { void inline incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { // weight each accumulator by factor w, including the "number" of samples - // (analagous to calling inc_LSF twice with same values to weight it by 2X) + // (analogous to calling inc_LSF twice with same values to weight it by 2X) lsf->xbar += w * x; lsf->ybar += w * y; lsf->zbar += w * z; @@ -65,8 +63,8 @@ void inline incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->xzbar += w * x * z; lsf->yzbar += w * y * z; lsf->N += w; - lsf->max_absx = max(FABS(w * x), lsf->max_absx); - lsf->max_absy = max(FABS(w * y), lsf->max_absy); + lsf->max_absx = MAX(ABS(w * x), lsf->max_absx); + lsf->max_absy = MAX(ABS(w * y), lsf->max_absy); } void inline incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { @@ -79,12 +77,11 @@ void inline incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->xybar += x * y; lsf->xzbar += x * z; lsf->yzbar += y * z; - lsf->max_absx = max(FABS(x), lsf->max_absx); - lsf->max_absy = max(FABS(y), lsf->max_absy); + lsf->max_absx = MAX(ABS(x), lsf->max_absx); + lsf->max_absy = MAX(ABS(y), lsf->max_absy); lsf->N += 1.0; } int finish_incremental_LSF(struct linear_fit_data *); -#endif - +#endif // _LEAST_SQUARES_FIT_H_ diff --git a/Marlin/nozzle.cpp b/Marlin/src/libs/nozzle.cpp similarity index 93% rename from Marlin/nozzle.cpp rename to Marlin/src/libs/nozzle.cpp index da43e264bf..fd845685d8 100644 --- a/Marlin/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -20,13 +20,14 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(NOZZLE_CLEAN_FEATURE) || ENABLED(NOZZLE_PARK_FEATURE) #include "nozzle.h" -#include "Marlin.h" +#include "../Marlin.h" +#include "../module/motion.h" #include "point_t.h" #if ENABLED(NOZZLE_CLEAN_FEATURE) @@ -78,7 +79,7 @@ do_blocking_move_to(start.x, start.y, start.z); const uint8_t zigs = objects << 1; - const bool horiz = FABS(diffx) >= FABS(diffy); // Do a horizontal wipe? + const bool horiz = ABS(diffx) >= ABS(diffy); // Do a horizontal wipe? const float P = (horiz ? diffx : diffy) / zigs; // Period of each zig / zag const point_t *side; for (uint8_t j = 0; j < strokes; j++) { @@ -161,7 +162,7 @@ #if ENABLED(NOZZLE_PARK_FEATURE) - void Nozzle::park(const uint8_t &z_action, const point_t &park /*= NOZZLE_PARK_POINT*/) { + void Nozzle::park(const uint8_t z_action, const point_t &park /*= NOZZLE_PARK_POINT*/) { const float fr_xy = NOZZLE_PARK_XY_FEEDRATE; const float fr_z = NOZZLE_PARK_Z_FEEDRATE; @@ -171,11 +172,11 @@ break; case 2: // Raise by Z-park height - do_blocking_move_to_z(min(current_position[Z_AXIS] + park.z, Z_MAX_POS), fr_z); + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park.z, Z_MAX_POS), fr_z); break; default: // Raise to at least the Z-park height - do_blocking_move_to_z(max(park.z, current_position[Z_AXIS]), fr_z); + do_blocking_move_to_z(MAX(park.z, current_position[Z_AXIS]), fr_z); } do_blocking_move_to_xy(park.x, park.y, fr_xy); diff --git a/Marlin/nozzle.h b/Marlin/src/libs/nozzle.h similarity index 95% rename from Marlin/nozzle.h rename to Marlin/src/libs/nozzle.h index e564081e52..3adf6f3ac8 100644 --- a/Marlin/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -23,7 +23,7 @@ #ifndef __NOZZLE_H__ #define __NOZZLE_H__ -#include "Marlin.h" +#include "../inc/MarlinConfig.h" #include "point_t.h" /** @@ -86,7 +86,7 @@ class Nozzle { #if ENABLED(NOZZLE_PARK_FEATURE) - static void park(const uint8_t &z_action, const point_t &park=NOZZLE_PARK_POINT) _Os; + static void park(const uint8_t z_action, const point_t &park=NOZZLE_PARK_POINT) _Os; #endif }; diff --git a/Marlin/point_t.h b/Marlin/src/libs/point_t.h similarity index 100% rename from Marlin/point_t.h rename to Marlin/src/libs/point_t.h diff --git a/Marlin/MarlinSPI.h b/Marlin/src/libs/private_spi.h similarity index 89% rename from Marlin/MarlinSPI.h rename to Marlin/src/libs/private_spi.h index 61e85fc63c..7998de7bea 100644 --- a/Marlin/MarlinSPI.h +++ b/Marlin/src/libs/private_spi.h @@ -20,14 +20,14 @@ * */ -#ifndef __MARLIN_SPI_H__ -#define __MARLIN_SPI_H__ +#ifndef __PRIVATE_SPI_H__ +#define __PRIVATE_SPI_H__ -#include #include "softspi.h" +#include template -class SPI { +class SPIclass { static SoftSPI softSPI; public: FORCE_INLINE static void init() { softSPI.begin(); } @@ -38,7 +38,7 @@ class SPI { // Hardware SPI template<> -class SPI { +class SPIclass { public: FORCE_INLINE static void init() { OUT_WRITE(SCK_PIN, LOW); @@ -48,10 +48,10 @@ class SPI { } FORCE_INLINE static uint8_t receive() { SPDR = 0; - while (!TEST(SPSR, SPIF)) { /* nada */ } + for (;!TEST(SPSR, SPIF);); return SPDR; } }; -#endif // __MARLIN_SPI_H__ +#endif // __PRIVATE_SPI_H__ diff --git a/Marlin/softspi.h b/Marlin/src/libs/softspi.h similarity index 99% rename from Marlin/softspi.h rename to Marlin/src/libs/softspi.h index c9fbea01b4..e3a28fdc73 100644 --- a/Marlin/softspi.h +++ b/Marlin/src/libs/softspi.h @@ -42,10 +42,11 @@ bool fastDigitalRead(uint8_t pin){ */ static inline __attribute__((always_inline)) void fastDigitalWrite(uint8_t pin, bool value){ - if (value) + if(value) { g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin; - else + } else { g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin; + } } #endif // CORE_TEENSY //------------------------------------------------------------------------------ @@ -194,7 +195,7 @@ static const pin_map_t pinMap[] = { || defined(__AVR_ATmega324__)\ || defined(__AVR_ATmega16__) -#if defined(VARIANT_MIGHTY) +#ifdef VARIANT_MIGHTY // Mighty Layout static const pin_map_t pinMap[] = { {&DDRB, &PINB, &PORTB, 0}, // B0 0 @@ -638,7 +639,7 @@ class DigitalPin { //------------------------------------------------------------------------------ /** Nop for timing. */ -#define nop asm volatile ("nop\n\t") +#define nop __asm__ volatile ("nop") //------------------------------------------------------------------------------ /** Pin Mode for MISO is input.*/ const bool MISO_MODE = false; @@ -765,5 +766,3 @@ class SoftSPI { } //---------------------------------------------------------------------------- }; - - diff --git a/Marlin/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp similarity index 98% rename from Marlin/stopwatch.cpp rename to Marlin/src/libs/stopwatch.cpp index e5bc015904..2817190aa6 100644 --- a/Marlin/stopwatch.cpp +++ b/Marlin/src/libs/stopwatch.cpp @@ -22,7 +22,7 @@ #include "stopwatch.h" -#include "Marlin.h" +#include "../inc/MarlinConfig.h" Stopwatch::State Stopwatch::state; millis_t Stopwatch::accumulator; diff --git a/Marlin/stopwatch.h b/Marlin/src/libs/stopwatch.h similarity index 93% rename from Marlin/stopwatch.h rename to Marlin/src/libs/stopwatch.h index f5e04bbde8..69efe0c3a2 100644 --- a/Marlin/stopwatch.h +++ b/Marlin/src/libs/stopwatch.h @@ -26,8 +26,8 @@ // Print debug messages with M111 S2 (Uses 156 bytes of PROGMEM) //#define DEBUG_STOPWATCH -#include "macros.h" -#include "types.h" +#include "../core/macros.h" +#include "../core/types.h" /** * @brief Stopwatch class @@ -55,8 +55,8 @@ class Stopwatch { /** * @brief Stop the stopwatch - * @details Stop the running timer. Silently ignore the request if - * no timer is running. + * @details Stop the running timer, it will silently ignore the request if + * no timer is currently running. * @return true on success */ static bool stop(); @@ -64,7 +64,7 @@ class Stopwatch { /** * @brief Pause the stopwatch * @details Pause the running timer, it will silently ignore the request if - * no timer is running. + * no timer is currently running. * @return true on success */ static bool pause(); diff --git a/Marlin/vector_3.cpp b/Marlin/src/libs/vector_3.cpp similarity index 83% rename from Marlin/vector_3.cpp rename to Marlin/src/libs/vector_3.cpp index 4bfcdeb933..c0dfbc93fb 100644 --- a/Marlin/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -21,30 +21,30 @@ */ /** - vector_3.cpp - Vector library for bed leveling - Copyright (c) 2012 Lars Brubaker. All right reserved. + * vector_3.cpp - Vector library for bed leveling + * Copyright (c) 2012 Lars Brubaker. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. +#include "../inc/MarlinConfig.h" - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "MarlinConfig.h" - -#if ABL_PLANAR || (HAS_BED_PROBE && ENABLED(AUTO_BED_LEVELING_UBL)) +#if ABL_PLANAR || ENABLED(AUTO_BED_LEVELING_UBL) #include "vector_3.h" -#include "serial.h" + #include vector_3::vector_3() : x(0), y(0), z(0) { } @@ -163,3 +163,4 @@ void matrix_3x3::debug(const char * const title) { } #endif // HAS_ABL + diff --git a/Marlin/vector_3.h b/Marlin/src/libs/vector_3.h similarity index 66% rename from Marlin/vector_3.h rename to Marlin/src/libs/vector_3.h index a92660018f..aed4364b91 100644 --- a/Marlin/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -21,23 +21,24 @@ */ /** - vector_3.cpp - Vector library for bed leveling - Copyright (c) 2012 Lars Brubaker. All right reserved. + * vector_3.cpp - Vector library for bed leveling + * Copyright (c) 2012 Lars Brubaker. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ #ifndef VECTOR_3_H #define VECTOR_3_H diff --git a/Marlin/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp similarity index 69% rename from Marlin/configuration_store.cpp rename to Marlin/src/module/configuration_store.cpp index ab49001df5..0a6e60b5d3 100644 --- a/Marlin/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -37,7 +37,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V54" +#define EEPROM_VERSION "V55" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -45,32 +45,51 @@ //#define DEBUG_EEPROM_READWRITE #include "configuration_store.h" -#include "Marlin.h" -#include "language.h" + +#if ADD_PORT_ARG + #define PORTARG_SOLO const int8_t port + #define PORTARG_AFTER ,const int8_t port + #define PORTVAR_SOLO port +#else + #define PORTARG_SOLO + #define PORTARG_AFTER + #define PORTVAR_SOLO +#endif + #include "endstops.h" #include "planner.h" -#include "temperature.h" -#include "ultralcd.h" #include "stepper.h" -#include "parser.h" -#include "vector_3.h" +#include "temperature.h" +#include "../lcd/ultralcd.h" +#include "../core/language.h" +#include "../libs/vector_3.h" +#include "../gcode/gcode.h" +#include "../Marlin.h" -#if ENABLED(MESH_BED_LEVELING) - #include "mesh_bed_leveling.h" +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_BED_PROBE + #include "../module/probe.h" #endif #if HAS_TRINAMIC #include "stepper_indirection.h" - #include "tmc_util.h" - #define TMC_GET_PWMTHRS(P,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[P##_AXIS]) -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" + #include "../feature/tmc_util.h" + #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)]) #endif #if ENABLED(FWRETRACT) - #include "fwretract.h" + #include "../feature/fwretract.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" +#endif + +#if ENABLED(PID_EXTRUSION_SCALING) + #define LPQ_LEN thermalManager.lpq_len #endif #pragma pack(push, 1) // No padding between variables @@ -93,16 +112,17 @@ typedef struct SettingsDataStruct { // uint8_t esteppers; // XYZE_N - XYZ + uint32_t planner_max_acceleration_mm_per_s2[XYZE_N], // M201 XYZE planner.max_acceleration_mm_per_s2[XYZE_N] + planner_min_segment_time_us; // M205 B planner.min_segment_time_us float planner_axis_steps_per_mm[XYZE_N], // M92 XYZE planner.axis_steps_per_mm[XYZE_N] - planner_max_feedrate_mm_s[XYZE_N]; // M203 XYZE planner.max_feedrate_mm_s[XYZE_N] - uint32_t planner_max_acceleration_mm_per_s2[XYZE_N]; // M201 XYZE planner.max_acceleration_mm_per_s2[XYZE_N] - float planner_acceleration, // M204 P planner.acceleration + planner_max_feedrate_mm_s[XYZE_N], // M203 XYZE planner.max_feedrate_mm_s[XYZE_N] + planner_acceleration, // M204 P planner.acceleration planner_retract_acceleration, // M204 R planner.retract_acceleration planner_travel_acceleration, // M204 T planner.travel_acceleration planner_min_feedrate_mm_s, // M205 S planner.min_feedrate_mm_s - planner_min_travel_feedrate_mm_s; // M205 T planner.min_travel_feedrate_mm_s - uint32_t planner_min_segment_time_us; // M205 B planner.min_segment_time_us - float planner_max_jerk[XYZE]; // M205 XYZE planner.max_jerk[XYZE] + planner_min_travel_feedrate_mm_s, // M205 T planner.min_travel_feedrate_mm_s + planner_max_jerk[XYZE], // M205 XYZE planner.max_jerk[XYZE] + planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm float home_offset[XYZ]; // M206 XYZ @@ -183,7 +203,7 @@ typedef struct SettingsDataStruct { // PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U - int lpq_len; // M301 L + int16_t lpq_len; // M301 L // // PIDTEMPBED @@ -256,10 +276,6 @@ typedef struct SettingsDataStruct { MarlinSettings settings; -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - extern void refresh_bed_level(); -#endif - uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } /** @@ -314,6 +330,10 @@ void MarlinSettings::postprocess() { fwretract.refresh_autoretract(); #endif + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + planner.recalculate_max_e_jerk_factor(); + #endif + // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm // and init stepper.count[], planner.position[] with current_position planner.refresh_positioning(); @@ -324,14 +344,16 @@ void MarlinSettings::postprocess() { } #if ENABLED(EEPROM_SETTINGS) + #include "../HAL/persistent_store_api.h" #define DUMMY_PID_VALUE 3000.0f - #define EEPROM_START() int eeprom_index = EEPROM_OFFSET + #define EEPROM_START() int eeprom_index = EEPROM_OFFSET; HAL::PersistentStore::access_start() + #define EEPROM_FINISH() HAL::PersistentStore::access_finish() #define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR) - #define EEPROM_WRITE(VAR) write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) - #define EEPROM_READ(VAR) read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) - #define EEPROM_READ_ALWAYS(VAR) read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, true) - #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START(); SERIAL_ERRORLNPGM(ERR); eeprom_error = true; }while(0) + #define EEPROM_WRITE(VAR) HAL::PersistentStore::write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) + #define EEPROM_READ(VAR) HAL::PersistentStore::read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating) + #define EEPROM_READ_ALWAYS(VAR) HAL::PersistentStore::read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) + #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START_P(port); SERIAL_ERRORLNPGM_P(port, ERR); eeprom_error = true; }while(0) #if ENABLED(DEBUG_EEPROM_READWRITE) #define _FIELD_TEST(FIELD) \ @@ -347,43 +369,12 @@ void MarlinSettings::postprocess() { bool MarlinSettings::eeprom_error, MarlinSettings::validating; - void MarlinSettings::write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { - if (eeprom_error) { pos += size; return; } - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); - eeprom_error = true; - return; - } - } - crc16(crc, &v, 1); - pos++; - value++; - }; - } - - void MarlinSettings::read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool force/*=false*/) { - if (eeprom_error) { pos += size; return; } - do { - uint8_t c = eeprom_read_byte((unsigned char*)pos); - if (!validating || force) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - } - - bool MarlinSettings::size_error(const uint16_t size) { + bool MarlinSettings::size_error(const uint16_t size PORTARG_AFTER) { if (size != datasize()) { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("EEPROM datasize error."); + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, "EEPROM datasize error."); + #endif return true; } return false; @@ -392,7 +383,7 @@ void MarlinSettings::postprocess() { /** * M500 - Store Configuration */ - bool MarlinSettings::save() { + bool MarlinSettings::save(PORTARG_SOLO) { float dummy = 0.0f; char ver[4] = "ERR"; @@ -401,8 +392,11 @@ void MarlinSettings::postprocess() { EEPROM_START(); eeprom_error = false; - - EEPROM_WRITE(ver); // invalidate data first + #if ENABLED(FLASH_EEPROM_EMULATION) + EEPROM_SKIP(ver); // Flash doesn't allow rewriting without erase + #else + EEPROM_WRITE(ver); // invalidate data first + #endif EEPROM_SKIP(working_crc); // Skip the checksum slot working_crc = 0; // clear before first "real data" @@ -412,17 +406,25 @@ void MarlinSettings::postprocess() { const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ; EEPROM_WRITE(esteppers); + EEPROM_WRITE(planner.max_acceleration_mm_per_s2); + EEPROM_WRITE(planner.min_segment_time_us); EEPROM_WRITE(planner.axis_steps_per_mm); EEPROM_WRITE(planner.max_feedrate_mm_s); - EEPROM_WRITE(planner.max_acceleration_mm_per_s2); - EEPROM_WRITE(planner.acceleration); EEPROM_WRITE(planner.retract_acceleration); EEPROM_WRITE(planner.travel_acceleration); EEPROM_WRITE(planner.min_feedrate_mm_s); EEPROM_WRITE(planner.min_travel_feedrate_mm_s); - EEPROM_WRITE(planner.min_segment_time_us); - EEPROM_WRITE(planner.max_jerk); + + #if ENABLED(JUNCTION_DEVIATION) + const float planner_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; + EEPROM_WRITE(planner_max_jerk); + EEPROM_WRITE(planner.junction_deviation_mm); + #else + EEPROM_WRITE(planner.max_jerk); + dummy = 0.02; + EEPROM_WRITE(dummy); + #endif _FIELD_TEST(home_offset); @@ -609,9 +611,9 @@ void MarlinSettings::postprocess() { _FIELD_TEST(lpq_len); #if DISABLED(PID_EXTRUSION_SCALING) - int lpq_len = 20; + const int16_t LPQ_LEN = 20; #endif - EEPROM_WRITE(lpq_len); + EEPROM_WRITE(LPQ_LEN); #if DISABLED(PIDTEMPBED) dummy = DUMMY_PID_VALUE; @@ -866,7 +868,7 @@ void MarlinSettings::postprocess() { _FIELD_TEST(coordinate_system); #if ENABLED(CNC_COORDINATE_SYSTEMS) - EEPROM_WRITE(coordinate_system); // 27 floats + EEPROM_WRITE(gcode.coordinate_system); // 27 floats #else dummy = 0.0f; for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_WRITE(dummy); @@ -922,14 +924,15 @@ void MarlinSettings::postprocess() { // Report storage size #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Settings Stored (", eeprom_size); - SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)final_crc); - SERIAL_ECHOLNPGM(")"); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, "Settings Stored (", eeprom_size); + SERIAL_ECHOPAIR_P(port, " bytes; crc ", (uint32_t)final_crc); + SERIAL_ECHOLNPGM_P(port, ")"); #endif eeprom_error |= size_error(eeprom_size); } + EEPROM_FINISH(); // // UBL Mesh @@ -945,7 +948,7 @@ void MarlinSettings::postprocess() { /** * M501 - Retrieve Configuration */ - bool MarlinSettings::_load() { + bool MarlinSettings::_load(PORTARG_SOLO) { uint16_t working_crc = 0; EEPROM_START(); @@ -963,12 +966,11 @@ void MarlinSettings::postprocess() { stored_ver[1] = '\0'; } #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("EEPROM version mismatch "); - SERIAL_ECHOPAIR("(EEPROM=", stored_ver); - SERIAL_ECHOLNPGM(" Marlin=" EEPROM_VERSION ")"); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, "EEPROM version mismatch "); + SERIAL_ECHOPAIR_P(port, "(EEPROM=", stored_ver); + SERIAL_ECHOLNPGM_P(port, " Marlin=" EEPROM_VERSION ")"); #endif - if (!validating) reset(); eeprom_error = true; } else { @@ -991,17 +993,20 @@ void MarlinSettings::postprocess() { // Get only the number of E stepper parameters previously stored // Any steppers added later are set to their defaults - const float def1[] = DEFAULT_AXIS_STEPS_PER_UNIT, def2[] = DEFAULT_MAX_FEEDRATE; - const uint32_t def3[] = DEFAULT_MAX_ACCELERATION; - float tmp1[XYZ + esteppers], tmp2[XYZ + esteppers]; - uint32_t tmp3[XYZ + esteppers]; - EEPROM_READ(tmp1); - EEPROM_READ(tmp2); - EEPROM_READ(tmp3); + const uint32_t def1[] = DEFAULT_MAX_ACCELERATION; + const float def2[] = DEFAULT_AXIS_STEPS_PER_UNIT, def3[] = DEFAULT_MAX_FEEDRATE; + + uint32_t tmp1[XYZ + esteppers]; + EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 + EEPROM_READ(planner.min_segment_time_us); + + float tmp2[XYZ + esteppers], tmp3[XYZ + esteppers]; + EEPROM_READ(tmp2); // axis_steps_per_mm + EEPROM_READ(tmp3); // max_feedrate_mm_s if (!validating) LOOP_XYZE_N(i) { - planner.axis_steps_per_mm[i] = i < XYZ + esteppers ? tmp1[i] : def1[i < COUNT(def1) ? i : COUNT(def1) - 1]; - planner.max_feedrate_mm_s[i] = i < XYZ + esteppers ? tmp2[i] : def2[i < COUNT(def2) ? i : COUNT(def2) - 1]; - planner.max_acceleration_mm_per_s2[i] = i < XYZ + esteppers ? tmp3[i] : def3[i < COUNT(def3) ? i : COUNT(def3) - 1]; + planner.max_acceleration_mm_per_s2[i] = i < XYZ + esteppers ? tmp1[i] : def1[i < COUNT(def1) ? i : COUNT(def1) - 1]; + planner.axis_steps_per_mm[i] = i < XYZ + esteppers ? tmp2[i] : def2[i < COUNT(def2) ? i : COUNT(def2) - 1]; + planner.max_feedrate_mm_s[i] = i < XYZ + esteppers ? tmp3[i] : def3[i < COUNT(def3) ? i : COUNT(def3) - 1]; } EEPROM_READ(planner.acceleration); @@ -1009,8 +1014,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(planner.travel_acceleration); EEPROM_READ(planner.min_feedrate_mm_s); EEPROM_READ(planner.min_travel_feedrate_mm_s); - EEPROM_READ(planner.min_segment_time_us); - EEPROM_READ(planner.max_jerk); + + #if ENABLED(JUNCTION_DEVIATION) + for (uint8_t q = 4; q--;) EEPROM_READ(dummy); + EEPROM_READ(planner.junction_deviation_mm); + #else + EEPROM_READ(planner.max_jerk); + EEPROM_READ(dummy); + #endif // // Home Offset (M206) @@ -1214,9 +1225,9 @@ void MarlinSettings::postprocess() { _FIELD_TEST(lpq_len); #if DISABLED(PID_EXTRUSION_SCALING) - int lpq_len; + int16_t LPQ_LEN; #endif - EEPROM_READ(lpq_len); + EEPROM_READ(LPQ_LEN); // // Heated Bed PID @@ -1340,7 +1351,7 @@ void MarlinSettings::postprocess() { #endif #if ENABLED(HYBRID_THRESHOLD) - #define TMC_SET_PWMTHRS(P,Q) tmc_set_pwmthrs(stepper##Q, TMC_##Q, tmc_hybrid_threshold[TMC_##Q], planner.axis_steps_per_mm[P##_AXIS]) + #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold[TMC_##Q], planner.axis_steps_per_mm[_AXIS(A)]) uint32_t tmc_hybrid_threshold[TMC_AXES]; EEPROM_READ(tmc_hybrid_threshold); if (!validating) { @@ -1452,8 +1463,8 @@ void MarlinSettings::postprocess() { _FIELD_TEST(coordinate_system); #if ENABLED(CNC_COORDINATE_SYSTEMS) - if (!validating) (void)select_coordinate_system(-1); // Go back to machine space - EEPROM_READ(coordinate_system); // 27 floats + if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space + EEPROM_READ(gcode.coordinate_system); // 27 floats #else for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_READ(dummy); #endif @@ -1498,52 +1509,52 @@ void MarlinSettings::postprocess() { eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); if (eeprom_error) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET))); - SERIAL_ECHOLNPAIR(" Size: ", datasize()); + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, "Index: ", int(eeprom_index - (EEPROM_OFFSET))); + SERIAL_ECHOLNPAIR_P(port, " Size: ", datasize()); + #endif } else if (working_crc != stored_crc) { eeprom_error = true; #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ERROR_START(); - SERIAL_ERRORPGM("EEPROM CRC mismatch - (stored) "); - SERIAL_ERROR(stored_crc); - SERIAL_ERRORPGM(" != "); - SERIAL_ERROR(working_crc); - SERIAL_ERRORLNPGM(" (calculated)!"); + SERIAL_ERROR_START_P(port); + SERIAL_ERRORPGM_P(port, "EEPROM CRC mismatch - (stored) "); + SERIAL_ERROR_P(port, stored_crc); + SERIAL_ERRORPGM_P(port, " != "); + SERIAL_ERROR_P(port, working_crc); + SERIAL_ERRORLNPGM_P(port, " (calculated)!"); #endif } else if (!validating) { #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHO_START(); - SERIAL_ECHO(version); - SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET)); - SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)working_crc); - SERIAL_ECHOLNPGM(")"); + SERIAL_ECHO_START_P(port); + SERIAL_ECHO_P(port, version); + SERIAL_ECHOPAIR_P(port, " stored settings retrieved (", eeprom_index - (EEPROM_OFFSET)); + SERIAL_ECHOPAIR_P(port, " bytes; crc ", (uint32_t)working_crc); + SERIAL_ECHOLNPGM_P(port, ")"); #endif } - if (!validating) { - if (eeprom_error) reset(); else postprocess(); - } + if (!validating && !eeprom_error) postprocess(); #if ENABLED(AUTO_BED_LEVELING_UBL) - ubl.report_state(); - if (!validating) { + ubl.report_state(); + if (!ubl.sanity_check()) { - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(EEPROM_CHITCHAT) ubl.echo_name(); - SERIAL_ECHOLNPGM(" initialized.\n"); + SERIAL_ECHOLNPGM_P(port, " initialized.\n"); #endif } else { eeprom_error = true; #if ENABLED(EEPROM_CHITCHAT) - SERIAL_PROTOCOLPGM("?Can't enable "); + SERIAL_PROTOCOLPGM_P(port, "?Can't enable "); ubl.echo_name(); - SERIAL_PROTOCOLLNPGM("."); + SERIAL_PROTOCOLLNPGM_P(port, "."); #endif ubl.reset(); } @@ -1551,14 +1562,14 @@ void MarlinSettings::postprocess() { if (ubl.storage_slot >= 0) { load_mesh(ubl.storage_slot); #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHOPAIR("Mesh ", ubl.storage_slot); - SERIAL_ECHOLNPGM(" loaded from storage."); + SERIAL_ECHOPAIR_P(port, "Mesh ", ubl.storage_slot); + SERIAL_ECHOLNPGM_P(port, " loaded from storage."); #endif } else { ubl.reset(); #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHOLNPGM("UBL System reset()"); + SERIAL_ECHOLNPGM_P(port, "UBL System reset()"); #endif } } @@ -1566,21 +1577,22 @@ void MarlinSettings::postprocess() { } #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) - if (!validating) report(); + if (!validating) report(PORTVAR_SOLO); #endif + EEPROM_FINISH(); return !eeprom_error; } - bool MarlinSettings::validate() { + bool MarlinSettings::validate(PORTARG_SOLO) { validating = true; - const bool success = _load(); + const bool success = _load(PORTVAR_SOLO); validating = false; return success; } - bool MarlinSettings::load() { - if (validate()) return _load(); + bool MarlinSettings::load(PORTARG_SOLO) { + if (validate(PORTVAR_SOLO)) return _load(PORTVAR_SOLO); reset(); return true; } @@ -1625,12 +1637,19 @@ void MarlinSettings::postprocess() { int pos = mesh_slot_offset(slot); uint16_t crc = 0; - write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); + + HAL::PersistentStore::access_start(); + const bool status = HAL::PersistentStore::write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); + HAL::PersistentStore::access_finish(); + + if (status) + SERIAL_PROTOCOLPGM("?Unable to save mesh data.\n"); // Write crc to MAT along with other data, or just tack on to the beginning or end #if ENABLED(EEPROM_CHITCHAT) - SERIAL_PROTOCOLLNPAIR("Mesh saved in slot ", slot); + if (!status) + SERIAL_PROTOCOLLNPAIR("Mesh saved in slot ", slot); #endif #else @@ -1656,13 +1675,19 @@ void MarlinSettings::postprocess() { int pos = mesh_slot_offset(slot); uint16_t crc = 0; uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; - read_data(pos, dest, sizeof(ubl.z_values), &crc); - // Compare crc with crc from MAT, or read from end + HAL::PersistentStore::access_start(); + const uint16_t status = HAL::PersistentStore::read_data(pos, dest, sizeof(ubl.z_values), &crc); + HAL::PersistentStore::access_finish(); + + if (status) + SERIAL_PROTOCOLPGM("?Unable to load mesh data.\n"); #if ENABLED(EEPROM_CHITCHAT) - SERIAL_PROTOCOLLNPAIR("Mesh loaded from slot ", slot); + else + SERIAL_PROTOCOLLNPAIR("Mesh loaded from slot ", slot); #endif + EEPROM_FINISH(); #else @@ -1678,9 +1703,11 @@ void MarlinSettings::postprocess() { #else // !EEPROM_SETTINGS - bool MarlinSettings::save() { - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM("EEPROM disabled"); + bool MarlinSettings::save(PORTARG_SOLO) { + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, "EEPROM disabled"); + #endif return false; } @@ -1689,7 +1716,7 @@ void MarlinSettings::postprocess() { /** * M502 - Reset Configuration */ -void MarlinSettings::reset() { +void MarlinSettings::reset(PORTARG_SOLO) { static const float tmp1[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT, tmp2[] PROGMEM = DEFAULT_MAX_FEEDRATE; static const uint32_t tmp3[] PROGMEM = DEFAULT_MAX_ACCELERATION; LOOP_XYZE_N(i) { @@ -1698,16 +1725,21 @@ void MarlinSettings::reset() { planner.max_acceleration_mm_per_s2[i] = pgm_read_dword_near(&tmp3[i < COUNT(tmp3) ? i : COUNT(tmp3) - 1]); } + planner.min_segment_time_us = DEFAULT_MINSEGMENTTIME; planner.acceleration = DEFAULT_ACCELERATION; planner.retract_acceleration = DEFAULT_RETRACT_ACCELERATION; planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION; planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE; planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE; - planner.min_segment_time_us = DEFAULT_MINSEGMENTTIME; - planner.max_jerk[X_AXIS] = DEFAULT_XJERK; - planner.max_jerk[Y_AXIS] = DEFAULT_YJERK; - planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK; - planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + + #if ENABLED(JUNCTION_DEVIATION) + planner.junction_deviation_mm = JUNCTION_DEVIATION_MM; + #else + planner.max_jerk[X_AXIS] = DEFAULT_XJERK; + planner.max_jerk[Y_AXIS] = DEFAULT_YJERK; + planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK; + planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + #endif #if HAS_HOME_OFFSET ZERO(home_offset); @@ -1811,7 +1843,7 @@ void MarlinSettings::reset() { #endif } #if ENABLED(PID_EXTRUSION_SCALING) - lpq_len = 20; // default last-position-queue size + thermalManager.lpq_len = 20; // default last-position-queue size #endif #endif // PIDTEMP @@ -1881,46 +1913,59 @@ void MarlinSettings::reset() { postprocess(); #if ENABLED(EEPROM_CHITCHAT) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded"); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPGM_P(port, "Hardcoded Default Settings Loaded"); #endif } #if DISABLED(DISABLE_M503) - #define CONFIG_ECHO_START do{ if (!forReplay) SERIAL_ECHO_START(); }while(0) + #define CONFIG_ECHO_START do{ if (!forReplay) SERIAL_ECHO_START_P(port); }while(0) #if HAS_TRINAMIC - void say_M906() { SERIAL_ECHOPGM(" M906 "); } + void say_M906(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M906"); } #if ENABLED(HYBRID_THRESHOLD) - void say_M913() { SERIAL_ECHOPGM(" M913 "); } + void say_M913(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M913"); } #endif #if ENABLED(SENSORLESS_HOMING) - void say_M914() { SERIAL_ECHOPGM(" M914 "); } + void say_M914(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M914"); } #endif #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) - void say_M603() { SERIAL_ECHOPGM(" M603 "); } + void say_M603(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M603 "); } #endif - inline void say_units(const bool colon=false) { - serialprintPGM( + inline void say_units( + #if NUM_SERIAL > 1 + const int8_t port, + #endif + const bool colon + ) { + serialprintPGM_P(port, #if ENABLED(INCH_MODE_SUPPORT) parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : #endif PSTR(" (mm)") ); - if (colon) SERIAL_ECHOLNPGM(":"); + if (colon) SERIAL_ECHOLNPGM_P(port, ":"); } + #if NUM_SERIAL > 1 + #define SAY_UNITS_P(PORT, COLON) say_units(PORT, COLON) + #else + #define SAY_UNITS_P(PORT, COLON) say_units(COLON) + #endif /** * M503 - Report current settings in RAM * * Unless specifically disabled, M503 is available even without EEPROM */ - void MarlinSettings::report(const bool forReplay) { - + void MarlinSettings::report(const bool forReplay + #if NUM_SERIAL > 1 + , const int8_t port/*=-1*/ + #endif + ) { /** * Announce current units, in case inches are being displayed */ @@ -1928,17 +1973,17 @@ void MarlinSettings::reset() { #if ENABLED(INCH_MODE_SUPPORT) #define LINEAR_UNIT(N) (float(N) / parser.linear_unit_factor) #define VOLUMETRIC_UNIT(N) (float(N) / (parser.volumetric_enabled ? parser.volumetric_unit_factor : parser.linear_unit_factor)) - SERIAL_ECHOPGM(" G2"); - SERIAL_CHAR(parser.linear_unit_factor == 1.0 ? '1' : '0'); - SERIAL_ECHOPGM(" ;"); - say_units(); + SERIAL_ECHOPGM_P(port, " G2"); + SERIAL_CHAR_P(port, parser.linear_unit_factor == 1.0 ? '1' : '0'); + SERIAL_ECHOPGM_P(port, " ;"); + SAY_UNITS_P(port, false); #else #define LINEAR_UNIT(N) (N) #define VOLUMETRIC_UNIT(N) (N) - SERIAL_ECHOPGM(" G21 ;"); - say_units(); + SERIAL_ECHOPGM_P(port, " G21 ; Units in mm"); + SAY_UNITS_P(port, false); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(ULTIPANEL) @@ -1947,18 +1992,18 @@ void MarlinSettings::reset() { CONFIG_ECHO_START; #if ENABLED(TEMPERATURE_UNITS_SUPPORT) #define TEMP_UNIT(N) parser.to_temp_units(N) - SERIAL_ECHOPGM(" M149 "); - SERIAL_CHAR(parser.temp_units_code()); - SERIAL_ECHOPGM(" ; Units in "); - serialprintPGM(parser.temp_units_name()); + SERIAL_ECHOPGM_P(port, " M149 "); + SERIAL_CHAR_P(port, parser.temp_units_code()); + SERIAL_ECHOPGM_P(port, " ; Units in "); + serialprintPGM_P(port, parser.temp_units_name()); #else #define TEMP_UNIT(N) (N) - SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius"); + SERIAL_ECHOLNPGM_P(port, " M149 C ; Units in Celsius"); #endif #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if DISABLED(NO_VOLUMETRICS) @@ -1967,32 +2012,32 @@ void MarlinSettings::reset() { */ if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOPGM("Filament settings:"); + SERIAL_ECHOPGM_P(port, "Filament settings:"); if (parser.volumetric_enabled) - SERIAL_EOL(); + SERIAL_EOL_P(port); else - SERIAL_ECHOLNPGM(" Disabled"); + SERIAL_ECHOLNPGM_P(port, " Disabled"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M200 D", LINEAR_UNIT(planner.filament_size[0])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M200 D", LINEAR_UNIT(planner.filament_size[0])); + SERIAL_EOL_P(port); #if EXTRUDERS > 1 CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M200 T1 D", LINEAR_UNIT(planner.filament_size[1])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M200 T1 D", LINEAR_UNIT(planner.filament_size[1])); + SERIAL_EOL_P(port); #if EXTRUDERS > 2 CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M200 T2 D", LINEAR_UNIT(planner.filament_size[2])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M200 T2 D", LINEAR_UNIT(planner.filament_size[2])); + SERIAL_EOL_P(port); #if EXTRUDERS > 3 CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M200 T3 D", LINEAR_UNIT(planner.filament_size[3])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M200 T3 D", LINEAR_UNIT(planner.filament_size[3])); + SERIAL_EOL_P(port); #if EXTRUDERS > 4 CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M200 T4 D", LINEAR_UNIT(planner.filament_size[4])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M200 T4 D", LINEAR_UNIT(planner.filament_size[4])); + SERIAL_EOL_P(port); #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -2000,118 +2045,134 @@ void MarlinSettings::reset() { if (!parser.volumetric_enabled) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM(" M200 D0"); + SERIAL_ECHOLNPGM_P(port, " M200 D0"); } #endif // !NO_VOLUMETRICS if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Steps per unit:"); + SERIAL_ECHOLNPGM_P(port, "Steps per unit:"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M92 X", LINEAR_UNIT(planner.axis_steps_per_mm[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.axis_steps_per_mm[Y_AXIS])); - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.axis_steps_per_mm[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " M92 X", LINEAR_UNIT(planner.axis_steps_per_mm[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.axis_steps_per_mm[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.axis_steps_per_mm[Z_AXIS])); #if DISABLED(DISTINCT_E_FACTORS) - SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS])); + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS])); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(DISTINCT_E_FACTORS) CONFIG_ECHO_START; for (uint8_t i = 0; i < E_STEPPERS; i++) { - SERIAL_ECHOPAIR(" M92 T", (int)i); - SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS + i])); + SERIAL_ECHOPAIR_P(port, " M92 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS + i])); } #endif if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Maximum feedrates (units/s):"); + SERIAL_ECHOLNPGM_P(port, "Maximum feedrates (units/s):"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M203 X", LINEAR_UNIT(planner.max_feedrate_mm_s[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_feedrate_mm_s[Y_AXIS])); - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_feedrate_mm_s[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " M203 X", LINEAR_UNIT(planner.max_feedrate_mm_s[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_feedrate_mm_s[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_feedrate_mm_s[Z_AXIS])); #if DISABLED(DISTINCT_E_FACTORS) - SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS])); + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS])); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(DISTINCT_E_FACTORS) CONFIG_ECHO_START; for (uint8_t i = 0; i < E_STEPPERS; i++) { - SERIAL_ECHOPAIR(" M203 T", (int)i); - SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS + i])); + SERIAL_ECHOPAIR_P(port, " M203 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS + i])); } #endif if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Maximum Acceleration (units/s2):"); + SERIAL_ECHOLNPGM_P(port, "Maximum Acceleration (units/s2):"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M201 X", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Y_AXIS])); - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " M201 X", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Z_AXIS])); #if DISABLED(DISTINCT_E_FACTORS) - SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS])); + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS])); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(DISTINCT_E_FACTORS) CONFIG_ECHO_START; for (uint8_t i = 0; i < E_STEPPERS; i++) { - SERIAL_ECHOPAIR(" M201 T", (int)i); - SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS + i])); + SERIAL_ECHOPAIR_P(port, " M201 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS + i])); } #endif if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Acceleration (units/s2): P R T"); + SERIAL_ECHOLNPGM_P(port, "Acceleration (units/s2): P R T"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M204 P", LINEAR_UNIT(planner.acceleration)); - SERIAL_ECHOPAIR(" R", LINEAR_UNIT(planner.retract_acceleration)); - SERIAL_ECHOLNPAIR(" T", LINEAR_UNIT(planner.travel_acceleration)); + SERIAL_ECHOPAIR_P(port, " M204 P", LINEAR_UNIT(planner.acceleration)); + SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(planner.retract_acceleration)); + SERIAL_ECHOLNPAIR_P(port, " T", LINEAR_UNIT(planner.travel_acceleration)); if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Advanced: S T B X Z E"); + SERIAL_ECHOPGM_P(port, "Advanced: B S T"); + #if ENABLED(JUNCTION_DEVIATION) + SERIAL_ECHOPGM_P(port, " J"); + #else + SERIAL_ECHOPGM_P(port, " X Y Z"); + #endif + #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE) + SERIAL_ECHOPGM_P(port, " E"); + #endif + SERIAL_EOL_P(port); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M205 S", LINEAR_UNIT(planner.min_feedrate_mm_s)); - SERIAL_ECHOPAIR(" T", LINEAR_UNIT(planner.min_travel_feedrate_mm_s)); - SERIAL_ECHOPAIR(" B", planner.min_segment_time_us); - SERIAL_ECHOPAIR(" X", LINEAR_UNIT(planner.max_jerk[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS])); - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS])); - SERIAL_ECHOLNPAIR(" E", LINEAR_UNIT(planner.max_jerk[E_AXIS])); + SERIAL_ECHOPAIR_P(port, " M205 B", LINEAR_UNIT(planner.min_segment_time_us)); + SERIAL_ECHOPAIR_P(port, " S", LINEAR_UNIT(planner.min_feedrate_mm_s)); + SERIAL_ECHOPAIR_P(port, " T", LINEAR_UNIT(planner.min_travel_feedrate_mm_s)); + + #if ENABLED(JUNCTION_DEVIATION) + SERIAL_ECHOPAIR_P(port, " J", LINEAR_UNIT(planner.junction_deviation_mm)); + #else + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(planner.max_jerk[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS])); + #endif + + SERIAL_EOL_P(port); #if HAS_M206_COMMAND if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Home offset:"); + SERIAL_ECHOLNPGM_P(port, "Home offset:"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M206 X", LINEAR_UNIT(home_offset[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(home_offset[Y_AXIS])); - SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(home_offset[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " M206 X", LINEAR_UNIT(home_offset[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(home_offset[Y_AXIS])); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(home_offset[Z_AXIS])); #endif #if HOTENDS > 1 if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Hotend offsets:"); + SERIAL_ECHOLNPGM_P(port, "Hotend offsets:"); } CONFIG_ECHO_START; for (uint8_t e = 1; e < HOTENDS; e++) { - SERIAL_ECHOPAIR(" M218 T", (int)e); - SERIAL_ECHOPAIR(" X", LINEAR_UNIT(hotend_offset[X_AXIS][e])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(hotend_offset[Y_AXIS][e])); - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE) ||ENABLED(PARKING_EXTRUDER) - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(hotend_offset[Z_AXIS][e])); + SERIAL_ECHOPAIR_P(port, " M218 T", (int)e); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(hotend_offset[X_AXIS][e])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(hotend_offset[Y_AXIS][e])); + #if HAS_HOTEND_OFFSET_Z + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(hotend_offset[Z_AXIS][e])); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); } #endif @@ -2124,7 +2185,7 @@ void MarlinSettings::reset() { if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Mesh Bed Leveling:"); + SERIAL_ECHOLNPGM_P(port, "Mesh Bed Leveling:"); } #elif ENABLED(AUTO_BED_LEVELING_UBL) @@ -2132,24 +2193,24 @@ void MarlinSettings::reset() { if (!forReplay) { CONFIG_ECHO_START; ubl.echo_name(); - SERIAL_ECHOLNPGM(":"); + SERIAL_ECHOLNPGM_P(port, ":"); } #elif HAS_ABL if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Auto Bed Leveling:"); + SERIAL_ECHOLNPGM_P(port, "Auto Bed Leveling:"); } #endif CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M420 S", planner.leveling_active ? 1 : 0); + SERIAL_ECHOPAIR_P(port, " M420 S", planner.leveling_active ? 1 : 0); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.z_fade_height)); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.z_fade_height)); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #if ENABLED(MESH_BED_LEVELING) @@ -2157,11 +2218,11 @@ void MarlinSettings::reset() { for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) { for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) { CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" G29 S3 X", (int)px + 1); - SERIAL_ECHOPAIR(" Y", (int)py + 1); - SERIAL_ECHOPGM(" Z"); - SERIAL_PROTOCOL_F(LINEAR_UNIT(mbl.z_values[px][py]), 5); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " G29 S3 X", (int)px + 1); + SERIAL_ECHOPAIR_P(port, " Y", (int)py + 1); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(mbl.z_values[px][py]), 5); + SERIAL_EOL_P(port); } } } @@ -2169,14 +2230,14 @@ void MarlinSettings::reset() { #elif ENABLED(AUTO_BED_LEVELING_UBL) if (!forReplay) { - SERIAL_EOL(); + SERIAL_EOL_P(port); ubl.report_state(); - SERIAL_ECHOLNPAIR("\nActive Mesh Slot: ", ubl.storage_slot); - SERIAL_ECHOPAIR("EEPROM can hold ", calc_num_meshes()); - SERIAL_ECHOLNPGM(" meshes.\n"); + SERIAL_ECHOLNPAIR_P(port, "\nActive Mesh Slot: ", ubl.storage_slot); + SERIAL_ECHOPAIR_P(port, "EEPROM can hold ", calc_num_meshes()); + SERIAL_ECHOLNPGM_P(port, " meshes.\n"); } - ubl.report_current_mesh(); + ubl.report_current_mesh(PORTVAR_SOLO); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -2184,11 +2245,11 @@ void MarlinSettings::reset() { for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) { for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) { CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" G29 W I", (int)px + 1); - SERIAL_ECHOPAIR(" J", (int)py + 1); - SERIAL_ECHOPGM(" Z"); - SERIAL_PROTOCOL_F(LINEAR_UNIT(z_values[px][py]), 5); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " G29 W I", (int)px); + SERIAL_ECHOPAIR_P(port, " J", (int)py); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(z_values[px][py]), 5); + SERIAL_EOL_P(port); } } } @@ -2201,59 +2262,59 @@ void MarlinSettings::reset() { if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Endstop adjustment:"); + SERIAL_ECHOLNPGM_P(port, "Endstop adjustment:"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M666 X", LINEAR_UNIT(delta_endstop_adj[X_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(delta_endstop_adj[Y_AXIS])); - SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(delta_endstop_adj[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " M666 X", LINEAR_UNIT(delta_endstop_adj[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(delta_endstop_adj[Y_AXIS])); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(delta_endstop_adj[Z_AXIS])); if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Delta settings: L R H S B XYZ"); + SERIAL_ECHOLNPGM_P(port, "Delta settings: L R H S B XYZ"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M665 L", LINEAR_UNIT(delta_diagonal_rod)); - SERIAL_ECHOPAIR(" R", LINEAR_UNIT(delta_radius)); - SERIAL_ECHOPAIR(" H", LINEAR_UNIT(delta_height)); - SERIAL_ECHOPAIR(" S", delta_segments_per_second); - SERIAL_ECHOPAIR(" B", LINEAR_UNIT(delta_calibration_radius)); - SERIAL_ECHOPAIR(" X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS])); - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS])); - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(delta_tower_angle_trim[C_AXIS])); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M665 L", LINEAR_UNIT(delta_diagonal_rod)); + SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(delta_radius)); + SERIAL_ECHOPAIR_P(port, " H", LINEAR_UNIT(delta_height)); + SERIAL_ECHOPAIR_P(port, " S", delta_segments_per_second); + SERIAL_ECHOPAIR_P(port, " B", LINEAR_UNIT(delta_calibration_radius)); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(delta_tower_angle_trim[C_AXIS])); + SERIAL_EOL_P(port); #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Endstop adjustment:"); + SERIAL_ECHOLNPGM_P(port, "Endstop adjustment:"); } CONFIG_ECHO_START; - SERIAL_ECHOPGM(" M666"); + SERIAL_ECHOPGM_P(port, " M666"); #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" X", LINEAR_UNIT(endstops.x_endstop_adj)); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(endstops.x_endstop_adj)); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(endstops.y_endstop_adj)); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(endstops.y_endstop_adj)); #endif #if ENABLED(Z_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(endstops.z_endstop_adj)); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(endstops.z_endstop_adj)); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #endif // [XYZ]_DUAL_ENDSTOPS #if ENABLED(ULTIPANEL) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Material heatup parameters:"); + SERIAL_ECHOLNPGM_P(port, "Material heatup parameters:"); } for (uint8_t i = 0; i < COUNT(lcd_preheat_hotend_temp); i++) { CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M145 S", (int)i); - SERIAL_ECHOPAIR(" H", TEMP_UNIT(lcd_preheat_hotend_temp[i])); - SERIAL_ECHOPAIR(" B", TEMP_UNIT(lcd_preheat_bed_temp[i])); - SERIAL_ECHOLNPAIR(" F", lcd_preheat_fan_speed[i]); + SERIAL_ECHOPAIR_P(port, " M145 S", (int)i); + SERIAL_ECHOPAIR_P(port, " H", TEMP_UNIT(lcd_preheat_hotend_temp[i])); + SERIAL_ECHOPAIR_P(port, " B", TEMP_UNIT(lcd_preheat_bed_temp[i])); + SERIAL_ECHOLNPAIR_P(port, " F", lcd_preheat_fan_speed[i]); } #endif // ULTIPANEL @@ -2261,22 +2322,22 @@ void MarlinSettings::reset() { if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("PID settings:"); + SERIAL_ECHOLNPGM_P(port, "PID settings:"); } #if ENABLED(PIDTEMP) #if HOTENDS > 1 if (forReplay) { HOTEND_LOOP() { CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M301 E", e); - SERIAL_ECHOPAIR(" P", PID_PARAM(Kp, e)); - SERIAL_ECHOPAIR(" I", unscalePID_i(PID_PARAM(Ki, e))); - SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, e))); + SERIAL_ECHOPAIR_P(port, " M301 E", e); + SERIAL_ECHOPAIR_P(port, " P", PID_PARAM(Kp, e)); + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(PID_PARAM(Ki, e))); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(PID_PARAM(Kd, e))); #if ENABLED(PID_EXTRUSION_SCALING) - SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e)); - if (e == 0) SERIAL_ECHOPAIR(" L", lpq_len); + SERIAL_ECHOPAIR_P(port, " C", PID_PARAM(Kc, e)); + if (e == 0) SERIAL_ECHOPAIR_P(port, " L", thermalManager.lpq_len); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); } } else @@ -2284,23 +2345,23 @@ void MarlinSettings::reset() { // !forReplay || HOTENDS == 1 { CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M301 P", PID_PARAM(Kp, 0)); // for compatibility with hosts, only echo values for E0 - SERIAL_ECHOPAIR(" I", unscalePID_i(PID_PARAM(Ki, 0))); - SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, 0))); + SERIAL_ECHOPAIR_P(port, " M301 P", PID_PARAM(Kp, 0)); // for compatibility with hosts, only echo values for E0 + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(PID_PARAM(Ki, 0))); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(PID_PARAM(Kd, 0))); #if ENABLED(PID_EXTRUSION_SCALING) - SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, 0)); - SERIAL_ECHOPAIR(" L", lpq_len); + SERIAL_ECHOPAIR_P(port, " C", PID_PARAM(Kc, 0)); + SERIAL_ECHOPAIR_P(port, " L", thermalManager.lpq_len); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); } #endif // PIDTEMP #if ENABLED(PIDTEMPBED) CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M304 P", thermalManager.bedKp); - SERIAL_ECHOPAIR(" I", unscalePID_i(thermalManager.bedKi)); - SERIAL_ECHOPAIR(" D", unscalePID_d(thermalManager.bedKd)); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M304 P", thermalManager.bedKp); + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(thermalManager.bedKi)); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(thermalManager.bedKd)); + SERIAL_EOL_P(port); #endif #endif // PIDTEMP || PIDTEMPBED @@ -2308,39 +2369,39 @@ void MarlinSettings::reset() { #if HAS_LCD_CONTRAST if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("LCD Contrast:"); + SERIAL_ECHOLNPGM_P(port, "LCD Contrast:"); } CONFIG_ECHO_START; - SERIAL_ECHOLNPAIR(" M250 C", lcd_contrast); + SERIAL_ECHOLNPAIR_P(port, " M250 C", lcd_contrast); #endif #if ENABLED(FWRETRACT) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Retract: S F Z"); + SERIAL_ECHOLNPGM_P(port, "Retract: S F Z"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M207 S", LINEAR_UNIT(fwretract.retract_length)); - SERIAL_ECHOPAIR(" W", LINEAR_UNIT(fwretract.swap_retract_length)); - SERIAL_ECHOPAIR(" F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_feedrate_mm_s))); - SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(fwretract.retract_zlift)); + SERIAL_ECHOPAIR_P(port, " M207 S", LINEAR_UNIT(fwretract.retract_length)); + SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_length)); + SERIAL_ECHOPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_feedrate_mm_s))); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(fwretract.retract_zlift)); if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Recover: S F"); + SERIAL_ECHOLNPGM_P(port, "Recover: S F"); } CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M208 S", LINEAR_UNIT(fwretract.retract_recover_length)); - SERIAL_ECHOPAIR(" W", LINEAR_UNIT(fwretract.swap_retract_recover_length)); - SERIAL_ECHOLNPAIR(" F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_recover_feedrate_mm_s))); + SERIAL_ECHOPAIR_P(port, " M208 S", LINEAR_UNIT(fwretract.retract_recover_length)); + SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_recover_length)); + SERIAL_ECHOLNPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_recover_feedrate_mm_s))); if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); + SERIAL_ECHOLNPGM_P(port, "Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); } CONFIG_ECHO_START; - SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0); + SERIAL_ECHOLNPAIR_P(port, " M209 S", fwretract.autoretract_enabled ? 1 : 0); #endif // FWRETRACT @@ -2350,11 +2411,11 @@ void MarlinSettings::reset() { #if HAS_BED_PROBE if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOPGM("Z-Probe Offset"); - say_units(true); + SERIAL_ECHOPGM_P(port, "Z-Probe Offset (mm):"); + SAY_UNITS_P(port, true); } CONFIG_ECHO_START; - SERIAL_ECHOLNPAIR(" M851 Z", LINEAR_UNIT(zprobe_zoffset)); + SERIAL_ECHOLNPAIR_P(port, " M851 Z", LINEAR_UNIT(zprobe_zoffset)); #endif /** @@ -2363,21 +2424,21 @@ void MarlinSettings::reset() { #if ENABLED(SKEW_CORRECTION_GCODE) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Skew Factor: "); + SERIAL_ECHOLNPGM_P(port, "Skew Factor: "); } CONFIG_ECHO_START; #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPGM(" M852 I"); - SERIAL_ECHO_F(LINEAR_UNIT(planner.xy_skew_factor), 6); - SERIAL_ECHOPGM(" J"); - SERIAL_ECHO_F(LINEAR_UNIT(planner.xz_skew_factor), 6); - SERIAL_ECHOPGM(" K"); - SERIAL_ECHO_F(LINEAR_UNIT(planner.yz_skew_factor), 6); - SERIAL_EOL(); + SERIAL_ECHOPGM_P(port, " M852 I"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6); + SERIAL_ECHOPGM_P(port, " J"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xz_skew_factor), 6); + SERIAL_ECHOPGM_P(port, " K"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.yz_skew_factor), 6); + SERIAL_EOL_P(port); #else - SERIAL_ECHOPGM(" M852 S"); - SERIAL_ECHO_F(LINEAR_UNIT(planner.xy_skew_factor), 6); - SERIAL_EOL(); + SERIAL_ECHOPGM_P(port, " M852 S"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6); + SERIAL_EOL_P(port); #endif #endif @@ -2388,54 +2449,61 @@ void MarlinSettings::reset() { */ if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Stepper driver current:"); + SERIAL_ECHOLNPGM_P(port, "Stepper driver current:"); } CONFIG_ECHO_START; - #if X_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("X", stepperX.getCurrent()); + #if X_IS_TRINAMIC || Y_IS_TRINAMIC || Z_IS_TRINAMIC + say_M906(PORTVAR_SOLO); #endif - #if X2_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("I1 X", stepperX2.getCurrent()); + #if X_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " X", stepperX.getCurrent()); #endif #if Y_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("Y", stepperY.getCurrent()); - #endif - #if Y2_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("I1 Y", stepperY2.getCurrent()); + SERIAL_ECHOPAIR_P(port, " Y", stepperY.getCurrent()); #endif #if Z_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("Z", stepperZ.getCurrent()); + SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getCurrent()); + #endif + #if X_IS_TRINAMIC || Y_IS_TRINAMIC || Z_IS_TRINAMIC + SERIAL_EOL_P(port); + #endif + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC + say_M906(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #endif + #if X2_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " X", stepperX2.getCurrent()); + #endif + #if Y2_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getCurrent()); #endif #if Z2_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("I1 Z", stepperZ2.getCurrent()); + SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getCurrent()); + #endif + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC + SERIAL_EOL_P(port); #endif #if E0_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("T0 E", stepperE0.getCurrent()); + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getCurrent()); #endif #if E_STEPPERS > 1 && E1_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("T1 E", stepperE1.getCurrent()); + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getCurrent()); #endif #if E_STEPPERS > 2 && E2_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("T2 E", stepperE2.getCurrent()); + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getCurrent()); #endif #if E_STEPPERS > 3 && E3_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("T3 E", stepperE3.getCurrent()); + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getCurrent()); #endif #if E_STEPPERS > 4 && E4_IS_TRINAMIC - say_M906(); - SERIAL_ECHOLNPAIR("T4 E", stepperE4.getCurrent()); + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent()); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); /** * TMC2130 / TMC2208 / TRAMS Hybrid Threshold @@ -2443,54 +2511,61 @@ void MarlinSettings::reset() { #if ENABLED(HYBRID_THRESHOLD) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Hybrid Threshold:"); + SERIAL_ECHOLNPGM_P(port, "Hybrid Threshold:"); } CONFIG_ECHO_START; - #if X_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("X", TMC_GET_PWMTHRS(X, X)); + #if X_IS_TRINAMIC || Y_IS_TRINAMIC || Z_IS_TRINAMIC + say_M913(PORTVAR_SOLO); #endif - #if X2_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("I1 X", TMC_GET_PWMTHRS(X, X2)); + #if X_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X)); #endif #if Y_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("Y", TMC_GET_PWMTHRS(Y, Y)); - #endif - #if Y2_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("I1 Y", TMC_GET_PWMTHRS(Y, Y2)); + SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y)); #endif #if Z_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("Z", TMC_GET_PWMTHRS(Z, Z)); + SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z)); + #endif + #if X_IS_TRINAMIC || Y_IS_TRINAMIC || Z_IS_TRINAMIC + SERIAL_EOL_P(port); + #endif + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC + say_M913(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #endif + #if X2_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X2)); + #endif + #if Y2_IS_TRINAMIC + SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y2)); #endif #if Z2_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("I1 Z", TMC_GET_PWMTHRS(Z, Z2)); + SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z2)); + #endif + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC + SERIAL_EOL_P(port); #endif #if E0_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("T0 E", TMC_GET_PWMTHRS(E, E0)); + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0)); #endif #if E_STEPPERS > 1 && E1_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("T1 E", TMC_GET_PWMTHRS(E, E1)); + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T1 E", TMC_GET_PWMTHRS(E, E1)); #endif #if E_STEPPERS > 2 && E2_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("T2 E", TMC_GET_PWMTHRS(E, E2)); + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T2 E", TMC_GET_PWMTHRS(E, E2)); #endif #if E_STEPPERS > 3 && E3_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("T3 E", TMC_GET_PWMTHRS(E, E3)); + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T3 E", TMC_GET_PWMTHRS(E, E3)); #endif #if E_STEPPERS > 4 && E4_IS_TRINAMIC - say_M913(); - SERIAL_ECHOLNPAIR("T4 E", TMC_GET_PWMTHRS(E, E4)); + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4)); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); #endif // HYBRID_THRESHOLD /** @@ -2499,41 +2574,45 @@ void MarlinSettings::reset() { #if ENABLED(SENSORLESS_HOMING) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Sensorless homing threshold:"); + SERIAL_ECHOLNPGM_P(port, "Sensorless homing threshold:"); } CONFIG_ECHO_START; - #ifdef X_HOMING_SENSITIVITY - #if ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS) - say_M914(); - SERIAL_ECHOLNPAIR("X", stepperX.sgt()); + #define HAS_X_SENSORLESS (defined(X_HOMING_SENSITIVITY) && (ENABLED(X_IS_TMC2130) || ENABLED(IS_TRAMS))) + #define HAS_Y_SENSORLESS (defined(Y_HOMING_SENSITIVITY) && (ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS))) + #define HAS_Z_SENSORLESS (defined(Z_HOMING_SENSITIVITY) && (ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS))) + #if HAS_X_SENSORLESS || HAS_Y_SENSORLESS || HAS_Z_SENSORLESS + say_M914(PORTVAR_SOLO); + #if HAS_X_SENSORLESS + SERIAL_ECHOPAIR_P(port, " X", stepperX.sgt()); #endif - #if ENABLED(X2_IS_TMC2130) - say_M914(); - SERIAL_ECHOLNPAIR("I1 X", stepperX2.sgt()); + #if HAS_Y_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Y", stepperY.sgt()); #endif + #if HAS_Z_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Z", stepperZ.sgt()); + #endif + SERIAL_EOL_P(port); #endif - #ifdef Y_HOMING_SENSITIVITY - #if ENABLED(Y_IS_TMC2130) || ENABLED(IS_TRAMS) - say_M914(); - SERIAL_ECHOLNPAIR("Y", stepperY.sgt()); + + #define HAS_X2_SENSORLESS (defined(X_HOMING_SENSITIVITY) && ENABLED(X2_IS_TMC2130)) + #define HAS_Y2_SENSORLESS (defined(Y_HOMING_SENSITIVITY) && ENABLED(Y2_IS_TMC2130)) + #define HAS_Z2_SENSORLESS (defined(Z_HOMING_SENSITIVITY) && ENABLED(Z2_IS_TMC2130)) + #if HAS_X2_SENSORLESS || HAS_Y2_SENSORLESS || HAS_Z2_SENSORLESS + say_M914(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #if HAS_X2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " X", stepperX2.sgt()); #endif - #if ENABLED(Y2_IS_TMC2130) - say_M914(); - SERIAL_ECHOLNPAIR("I1 Y", stepperY2.sgt()); + #if HAS_Y2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Y", stepperY2.sgt()); #endif + #if HAS_Z2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.sgt()); + #endif + SERIAL_EOL_P(port); #endif - #ifdef Z_HOMING_SENSITIVITY - #if ENABLED(Z_IS_TMC2130) || ENABLED(IS_TRAMS) - say_M914(); - SERIAL_ECHOLNPAIR("Z", stepperZ.sgt()); - #endif - #if ENABLED(Z2_IS_TMC2130) - say_M914(); - SERIAL_ECHOLNPAIR("I1 Z", stepperZ2.sgt()); - #endif - #endif - SERIAL_EOL(); - #endif + + #endif // SENSORLESS_HOMING #endif // HAS_TRINAMIC @@ -2543,22 +2622,22 @@ void MarlinSettings::reset() { #if ENABLED(LIN_ADVANCE) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Linear Advance:"); + SERIAL_ECHOLNPGM_P(port, "Linear Advance:"); } CONFIG_ECHO_START; - SERIAL_ECHOLNPAIR(" M900 K", planner.extruder_advance_K); + SERIAL_ECHOLNPAIR_P(port, " M900 K", planner.extruder_advance_K); #endif #if HAS_MOTOR_CURRENT_PWM CONFIG_ECHO_START; if (!forReplay) { - SERIAL_ECHOLNPGM("Stepper motor currents:"); + SERIAL_ECHOLNPGM_P(port, "Stepper motor currents:"); CONFIG_ECHO_START; } - SERIAL_ECHOPAIR(" M907 X", stepper.motor_current_setting[0]); - SERIAL_ECHOPAIR(" Z", stepper.motor_current_setting[1]); - SERIAL_ECHOPAIR(" E", stepper.motor_current_setting[2]); - SERIAL_EOL(); + SERIAL_ECHOPAIR_P(port, " M907 X", stepper.motor_current_setting[0]); + SERIAL_ECHOPAIR_P(port, " Z", stepper.motor_current_setting[1]); + SERIAL_ECHOPAIR_P(port, " E", stepper.motor_current_setting[2]); + SERIAL_EOL_P(port); #endif /** @@ -2567,36 +2646,36 @@ void MarlinSettings::reset() { #if ENABLED(ADVANCED_PAUSE_FEATURE) if (!forReplay) { CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Filament load/unload lengths:"); + SERIAL_ECHOLNPGM_P(port, "Filament load/unload lengths:"); } CONFIG_ECHO_START; #if EXTRUDERS == 1 - say_M603(); - SERIAL_ECHOPAIR("L", LINEAR_UNIT(filament_change_load_length[0])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[0])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "L", LINEAR_UNIT(filament_change_load_length[0])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0])); #else - say_M603(); - SERIAL_ECHOPAIR("T0 L", LINEAR_UNIT(filament_change_load_length[0])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[0])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T0 L", LINEAR_UNIT(filament_change_load_length[0])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0])); CONFIG_ECHO_START; - say_M603(); - SERIAL_ECHOPAIR("T1 L", LINEAR_UNIT(filament_change_load_length[1])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[1])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T1 L", LINEAR_UNIT(filament_change_load_length[1])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[1])); #if EXTRUDERS > 2 CONFIG_ECHO_START; - say_M603(); - SERIAL_ECHOPAIR("T2 L", LINEAR_UNIT(filament_change_load_length[2])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[2])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T2 L", LINEAR_UNIT(filament_change_load_length[2])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[2])); #if EXTRUDERS > 3 CONFIG_ECHO_START; - say_M603(); - SERIAL_ECHOPAIR("T3 L", LINEAR_UNIT(filament_change_load_length[3])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[3])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T3 L", LINEAR_UNIT(filament_change_load_length[3])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[3])); #if EXTRUDERS > 4 CONFIG_ECHO_START; - say_M603(); - SERIAL_ECHOPAIR("T4 L", LINEAR_UNIT(filament_change_load_length[4])); - SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[4])); + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4])); #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 diff --git a/Marlin/configuration_store.h b/Marlin/src/module/configuration_store.h similarity index 74% rename from Marlin/configuration_store.h rename to Marlin/src/module/configuration_store.h index 1f0a33c599..6ae756f48f 100644 --- a/Marlin/configuration_store.h +++ b/Marlin/src/module/configuration_store.h @@ -23,7 +23,17 @@ #ifndef CONFIGURATION_STORE_H #define CONFIGURATION_STORE_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" + +#define ADD_PORT_ARG ENABLED(EEPROM_CHITCHAT) && NUM_SERIAL > 1 + +#if ADD_PORT_ARG + #define PORTINIT_SOLO const int8_t port=-1 + #define PORTINIT_AFTER ,const int8_t port=-1 +#else + #define PORTINIT_SOLO + #define PORTINIT_AFTER +#endif class MarlinSettings { public: @@ -31,24 +41,25 @@ class MarlinSettings { static uint16_t datasize(); - static void reset(); - static bool save(); // Return 'true' if data was saved + static void reset(PORTINIT_SOLO); + static bool save(PORTINIT_SOLO); // Return 'true' if data was saved FORCE_INLINE static bool init_eeprom() { - bool success = true; reset(); #if ENABLED(EEPROM_SETTINGS) - success = save(); + const bool success = save(); #if ENABLED(EEPROM_CHITCHAT) if (success) report(); #endif + return success; + #else + return true; #endif - return success; } #if ENABLED(EEPROM_SETTINGS) - static bool load(); // Return 'true' if data was loaded ok - static bool validate(); // Return 'true' if EEPROM data is ok + static bool load(PORTINIT_SOLO); // Return 'true' if data was loaded ok + static bool validate(PORTINIT_SOLO); // Return 'true' if EEPROM data is ok #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system // That can store is enabled @@ -68,7 +79,11 @@ class MarlinSettings { #endif #if DISABLED(DISABLE_M503) - static void report(const bool forReplay=false); + static void report(const bool forReplay=false + #if NUM_SERIAL > 1 + , const int8_t port=-1 + #endif + ); #else FORCE_INLINE static void report(const bool forReplay=false) { UNUSED(forReplay); } @@ -88,13 +103,14 @@ class MarlinSettings { #endif - static bool _load(); - static void write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc); - static void read_data(int &pos, uint8_t *value, uint16_t size, uint16_t *crc, const bool force=false); - static bool size_error(const uint16_t size); + static bool _load(PORTINIT_SOLO); + static bool size_error(const uint16_t size PORTINIT_AFTER); #endif }; extern MarlinSettings settings; +#undef PORTINIT_SOLO +#undef PORTINIT_AFTER + #endif // CONFIGURATION_STORE_H diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp new file mode 100644 index 0000000000..dded33f9fd --- /dev/null +++ b/Marlin/src/module/delta.cpp @@ -0,0 +1,300 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * delta.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(DELTA) + +#include "delta.h" +#include "motion.h" + +// For homing: +#include "planner.h" +#include "endstops.h" +#include "../lcd/ultralcd.h" +#include "../Marlin.h" + +#if ENABLED(SENSORLESS_HOMING) + #include "../feature/tmc_util.h" +#endif + +// Initialized by settings.load() +float delta_height, + delta_endstop_adj[ABC] = { 0 }, + delta_radius, + delta_diagonal_rod, + delta_segments_per_second, + delta_calibration_radius, + delta_tower_angle_trim[ABC]; + +float delta_tower[ABC][2], + delta_diagonal_rod_2_tower[ABC], + delta_clip_start_height = Z_MAX_POS; + +float delta_safe_distance_from_top(); + +/** + * Recalculate factors used for delta kinematics whenever + * settings have been changed (e.g., by M665). + */ +void recalc_delta_settings() { + const float trt[ABC] = DELTA_RADIUS_TRIM_TOWER, + drt[ABC] = DELTA_DIAGONAL_ROD_TRIM_TOWER; + delta_tower[A_AXIS][X_AXIS] = cos(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); // front left tower + delta_tower[A_AXIS][Y_AXIS] = sin(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); + delta_tower[B_AXIS][X_AXIS] = cos(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); // front right tower + delta_tower[B_AXIS][Y_AXIS] = sin(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); + delta_tower[C_AXIS][X_AXIS] = cos(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); // back middle tower + delta_tower[C_AXIS][Y_AXIS] = sin(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); + delta_diagonal_rod_2_tower[A_AXIS] = sq(delta_diagonal_rod + drt[A_AXIS]); + delta_diagonal_rod_2_tower[B_AXIS] = sq(delta_diagonal_rod + drt[B_AXIS]); + delta_diagonal_rod_2_tower[C_AXIS] = sq(delta_diagonal_rod + drt[C_AXIS]); + update_software_endstops(Z_AXIS); + axis_homed = 0; +} + +/** + * Delta Inverse Kinematics + * + * Calculate the tower positions for a given machine + * position, storing the result in the delta[] array. + * + * This is an expensive calculation, requiring 3 square + * roots per segmented linear move, and strains the limits + * of a Mega2560 with a Graphical Display. + * + * Suggested optimizations include: + * + * - Disable the home_offset (M206) and/or position_shift (G92) + * features to remove up to 12 float additions. + * + * - Use a fast-inverse-sqrt function and add the reciprocal. + * (see above) + */ + +#if ENABLED(DELTA_FAST_SQRT) && defined(__AVR__) + /** + * Fast inverse sqrt from Quake III Arena + * See: https://en.wikipedia.org/wiki/Fast_inverse_square_root + */ + float Q_rsqrt(float number) { + long i; + float x2, y; + const float threehalfs = 1.5f; + x2 = number * 0.5f; + y = number; + i = * ( long * ) &y; // evil floating point bit level hacking + i = 0x5F3759DF - ( i >> 1 ); // what the f***? + y = * ( float * ) &i; + y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration + // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed + return y; + } +#endif + +#define DELTA_DEBUG(VAR) do { \ + SERIAL_ECHOPAIR("cartesian X:", VAR[X_AXIS]); \ + SERIAL_ECHOPAIR(" Y:", VAR[Y_AXIS]); \ + SERIAL_ECHOLNPAIR(" Z:", VAR[Z_AXIS]); \ + SERIAL_ECHOPAIR("delta A:", delta[A_AXIS]); \ + SERIAL_ECHOPAIR(" B:", delta[B_AXIS]); \ + SERIAL_ECHOLNPAIR(" C:", delta[C_AXIS]); \ + }while(0) + +void inverse_kinematics(const float raw[XYZ]) { + #if HOTENDS > 1 + // Delta hotend offsets must be applied in Cartesian space with no "spoofing" + const float pos[XYZ] = { + raw[X_AXIS] - hotend_offset[X_AXIS][active_extruder], + raw[Y_AXIS] - hotend_offset[Y_AXIS][active_extruder], + raw[Z_AXIS] + }; + DELTA_IK(pos); + //DELTA_DEBUG(pos); + #else + DELTA_IK(raw); + //DELTA_DEBUG(raw); + #endif +} + +/** + * Calculate the highest Z position where the + * effector has the full range of XY motion. + */ +float delta_safe_distance_from_top() { + float cartesian[XYZ] = { 0, 0, 0 }; + inverse_kinematics(cartesian); + float centered_extent = delta[A_AXIS]; + cartesian[Y_AXIS] = DELTA_PRINTABLE_RADIUS; + inverse_kinematics(cartesian); + return ABS(centered_extent - delta[A_AXIS]); +} + +/** + * Delta Forward Kinematics + * + * See the Wikipedia article "Trilateration" + * https://en.wikipedia.org/wiki/Trilateration + * + * Establish a new coordinate system in the plane of the + * three carriage points. This system has its origin at + * tower1, with tower2 on the X axis. Tower3 is in the X-Y + * plane with a Z component of zero. + * We will define unit vectors in this coordinate system + * in our original coordinate system. Then when we calculate + * the Xnew, Ynew and Znew values, we can translate back into + * the original system by moving along those unit vectors + * by the corresponding values. + * + * Variable names matched to Marlin, c-version, and avoid the + * use of any vector library. + * + * by Andreas Hardtung 2016-06-07 + * based on a Java function from "Delta Robot Kinematics V3" + * by Steve Graves + * + * The result is stored in the cartes[] array. + */ +void forward_kinematics_DELTA(float z1, float z2, float z3) { + // Create a vector in old coordinates along x axis of new coordinate + float p12[3] = { delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z2 - z1 }; + + // Get the Magnitude of vector. + float d = SQRT( sq(p12[0]) + sq(p12[1]) + sq(p12[2]) ); + + // Create unit vector by dividing by magnitude. + float ex[3] = { p12[0] / d, p12[1] / d, p12[2] / d }; + + // Get the vector from the origin of the new system to the third point. + float p13[3] = { delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z3 - z1 }; + + // Use the dot product to find the component of this vector on the X axis. + float i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2]; + + // Create a vector along the x axis that represents the x component of p13. + float iex[3] = { ex[0] * i, ex[1] * i, ex[2] * i }; + + // Subtract the X component from the original vector leaving only Y. We use the + // variable that will be the unit vector after we scale it. + float ey[3] = { p13[0] - iex[0], p13[1] - iex[1], p13[2] - iex[2] }; + + // The magnitude of Y component + float j = SQRT( sq(ey[0]) + sq(ey[1]) + sq(ey[2]) ); + + // Convert to a unit vector + ey[0] /= j; ey[1] /= j; ey[2] /= j; + + // The cross product of the unit x and y is the unit z + // float[] ez = vectorCrossProd(ex, ey); + float ez[3] = { + ex[1] * ey[2] - ex[2] * ey[1], + ex[2] * ey[0] - ex[0] * ey[2], + ex[0] * ey[1] - ex[1] * ey[0] + }; + + // We now have the d, i and j values defined in Wikipedia. + // Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew + float Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + sq(d)) / (d * 2), + Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + HYPOT2(i, j)) / 2 - i * Xnew) / j, + Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew)); + + // Start from the origin of the old coordinates and add vectors in the + // old coords that represent the Xnew, Ynew and Znew to find the point + // in the old system. + cartes[X_AXIS] = delta_tower[A_AXIS][X_AXIS] + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew; + cartes[Y_AXIS] = delta_tower[A_AXIS][Y_AXIS] + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew; + cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew; +} + +#if ENABLED(SENSORLESS_HOMING) + inline void delta_sensorless_homing(const bool on=true) { + sensorless_homing_per_axis(A_AXIS, on); + sensorless_homing_per_axis(B_AXIS, on); + sensorless_homing_per_axis(C_AXIS, on); + } +#endif + +/** + * A delta can only safely home all axes at the same time + * This is like quick_home_xy() but for 3 towers. + */ +bool home_delta() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); + #endif + // Init the current position of all carriages to 0,0,0 + ZERO(current_position); + sync_plan_position(); + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + delta_sensorless_homing(); + #endif + + // Move all carriages together linearly until an endstop is hit. + current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (delta_height + 10); + feedrate_mm_s = homing_feedrate(X_AXIS); + line_to_current_position(); + planner.synchronize(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + delta_sensorless_homing(false); + #endif + + // If an endstop was not hit, then damage can occur if homing is continued. + // This can occur if the delta height not set correctly. + if (!(endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX)))) { + LCD_MESSAGEPGM(MSG_ERR_HOMING_FAILED); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_HOMING_FAILED); + return false; + } + + endstops.hit_on_purpose(); // clear endstop hit flags + + // At least one carriage has reached the top. + // Now re-home each carriage separately. + HOMEAXIS(A); + HOMEAXIS(B); + HOMEAXIS(C); + + // Set all carriages to their home positions + // Do this here all at once for Delta, because + // XYZ isn't ABC. Applying this per-tower would + // give the impression that they are the same. + LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); + + SYNC_PLAN_POSITION_KINEMATIC(); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); + #endif + + return true; +} + +#endif // DELTA diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h new file mode 100644 index 0000000000..59c01981fc --- /dev/null +++ b/Marlin/src/module/delta.h @@ -0,0 +1,133 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * delta.h - Delta-specific functions + */ + +#ifndef __DELTA_H__ +#define __DELTA_H__ + +extern float delta_height, + delta_endstop_adj[ABC], + delta_radius, + delta_diagonal_rod, + delta_segments_per_second, + delta_calibration_radius, + delta_tower_angle_trim[ABC]; + +extern float delta_tower[ABC][2], + delta_diagonal_rod_2_tower[ABC], + delta_clip_start_height; + +/** + * Recalculate factors used for delta kinematics whenever + * settings have been changed (e.g., by M665). + */ +void recalc_delta_settings(); + +/** + * Delta Inverse Kinematics + * + * Calculate the tower positions for a given machine + * position, storing the result in the delta[] array. + * + * This is an expensive calculation, requiring 3 square + * roots per segmented linear move, and strains the limits + * of a Mega2560 with a Graphical Display. + * + * Suggested optimizations include: + * + * - Disable the home_offset (M206) and/or position_shift (G92) + * features to remove up to 12 float additions. + * + * - Use a fast-inverse-sqrt function and add the reciprocal. + * (see above) + */ + +#if ENABLED(DELTA_FAST_SQRT) && defined(__AVR__) + /** + * Fast inverse sqrt from Quake III Arena + * See: https://en.wikipedia.org/wiki/Fast_inverse_square_root + */ + float Q_rsqrt(float number); + #define _SQRT(n) (1.0f / Q_rsqrt(n)) +#else + #define _SQRT(n) SQRT(n) +#endif + +// Macro to obtain the Z position of an individual tower +#define DELTA_Z(V,T) V[Z_AXIS] + _SQRT( \ + delta_diagonal_rod_2_tower[T] - HYPOT2( \ + delta_tower[T][X_AXIS] - V[X_AXIS], \ + delta_tower[T][Y_AXIS] - V[Y_AXIS] \ + ) \ + ) + +#define DELTA_IK(V) do { \ + delta[A_AXIS] = DELTA_Z(V, A_AXIS); \ + delta[B_AXIS] = DELTA_Z(V, B_AXIS); \ + delta[C_AXIS] = DELTA_Z(V, C_AXIS); \ +}while(0) + +void inverse_kinematics(const float raw[XYZ]); + +/** + * Calculate the highest Z position where the + * effector has the full range of XY motion. + */ +float delta_safe_distance_from_top(); + +/** + * Delta Forward Kinematics + * + * See the Wikipedia article "Trilateration" + * https://en.wikipedia.org/wiki/Trilateration + * + * Establish a new coordinate system in the plane of the + * three carriage points. This system has its origin at + * tower1, with tower2 on the X axis. Tower3 is in the X-Y + * plane with a Z component of zero. + * We will define unit vectors in this coordinate system + * in our original coordinate system. Then when we calculate + * the Xnew, Ynew and Znew values, we can translate back into + * the original system by moving along those unit vectors + * by the corresponding values. + * + * Variable names matched to Marlin, c-version, and avoid the + * use of any vector library. + * + * by Andreas Hardtung 2016-06-07 + * based on a Java function from "Delta Robot Kinematics V3" + * by Steve Graves + * + * The result is stored in the cartes[] array. + */ +void forward_kinematics_DELTA(float z1, float z2, float z3); + +FORCE_INLINE void forward_kinematics_DELTA(float point[ABC]) { + forward_kinematics_DELTA(point[A_AXIS], point[B_AXIS], point[C_AXIS]); +} + +bool home_delta(); + +#endif // __DELTA_H__ diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp new file mode 100644 index 0000000000..acf0be796b --- /dev/null +++ b/Marlin/src/module/endstops.cpp @@ -0,0 +1,791 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * endstops.cpp - A singleton object to manage endstops + */ + +#include "endstops.h" +#include "stepper.h" + +#include "../Marlin.h" +#include "../sd/cardreader.h" +#include "../module/temperature.h" +#include "../lcd/ultralcd.h" + +#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + #include HAL_PATH(../HAL, endstop_interrupts.h) +#endif + +#if HAS_BED_PROBE + #define ENDSTOPS_ENABLED (enabled || z_probe_enabled) +#else + #define ENDSTOPS_ENABLED enabled +#endif + +Endstops endstops; + +// public: + +bool Endstops::enabled, Endstops::enabled_globally; // Initialized by settings.load() +volatile uint8_t Endstops::hit_state; + +Endstops::esbits_t Endstops::live_state = 0; +#if ENABLED(ENDSTOP_NOISE_FILTER) + Endstops::esbits_t Endstops::old_live_state, + Endstops::validated_live_state; + uint8_t Endstops::endstop_poll_count; +#endif + +#if HAS_BED_PROBE + volatile bool Endstops::z_probe_enabled = false; +#endif + +// Initialized by settings.load() +#if ENABLED(X_DUAL_ENDSTOPS) + float Endstops::x_endstop_adj; +#endif +#if ENABLED(Y_DUAL_ENDSTOPS) + float Endstops::y_endstop_adj; +#endif +#if ENABLED(Z_DUAL_ENDSTOPS) + float Endstops::z_endstop_adj; +#endif + +/** + * Class and Instance Methods + */ + +void Endstops::init() { + + #if HAS_X_MIN + #if ENABLED(ENDSTOPPULLUP_XMIN) + SET_INPUT_PULLUP(X_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMIN) + SET_INPUT_PULLDOWN(X_MIN_PIN); + #else + SET_INPUT(X_MIN_PIN); + #endif + #endif + + #if HAS_X2_MIN + #if ENABLED(ENDSTOPPULLUP_XMIN) + SET_INPUT_PULLUP(X2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMIN) + SET_INPUT_PULLDOWN(X2_MIN_PIN); + #else + SET_INPUT(X2_MIN_PIN); + #endif + #endif + + #if HAS_Y_MIN + #if ENABLED(ENDSTOPPULLUP_YMIN) + SET_INPUT_PULLUP(Y_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMIN) + SET_INPUT_PULLDOWN(Y_MIN_PIN); + #else + SET_INPUT(Y_MIN_PIN); + #endif + #endif + + #if HAS_Y2_MIN + #if ENABLED(ENDSTOPPULLUP_YMIN) + SET_INPUT_PULLUP(Y2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMIN) + SET_INPUT_PULLDOWN(Y2_MIN_PIN); + #else + SET_INPUT(Y2_MIN_PIN); + #endif + #endif + + #if HAS_Z_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z_MIN_PIN); + #else + SET_INPUT(Z_MIN_PIN); + #endif + #endif + + #if HAS_Z2_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z2_MIN_PIN); + #else + SET_INPUT(Z2_MIN_PIN); + #endif + #endif + + #if HAS_X_MAX + #if ENABLED(ENDSTOPPULLUP_XMAX) + SET_INPUT_PULLUP(X_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMAX) + SET_INPUT_PULLDOWN(X_MAX_PIN); + #else + SET_INPUT(X_MAX_PIN); + #endif + #endif + + #if HAS_X2_MAX + #if ENABLED(ENDSTOPPULLUP_XMAX) + SET_INPUT_PULLUP(X2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMAX) + SET_INPUT_PULLDOWN(X2_MAX_PIN); + #else + SET_INPUT(X2_MAX_PIN); + #endif + #endif + + #if HAS_Y_MAX + #if ENABLED(ENDSTOPPULLUP_YMAX) + SET_INPUT_PULLUP(Y_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMAX) + SET_INPUT_PULLDOWN(Y_MAX_PIN); + #else + SET_INPUT(Y_MAX_PIN); + #endif + #endif + + #if HAS_Y2_MAX + #if ENABLED(ENDSTOPPULLUP_YMAX) + SET_INPUT_PULLUP(Y2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMAX) + SET_INPUT_PULLDOWN(Y2_MAX_PIN); + #else + SET_INPUT(Y2_MAX_PIN); + #endif + #endif + + #if HAS_Z_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z_MAX_PIN); + #else + SET_INPUT(Z_MAX_PIN); + #endif + #endif + + #if HAS_Z2_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z2_MAX_PIN); + #else + SET_INPUT(Z2_MAX_PIN); + #endif + #endif + + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) + SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN_PROBE) + SET_INPUT_PULLDOWN(Z_MIN_PROBE_PIN); + #else + SET_INPUT(Z_MIN_PROBE_PIN); + #endif + #endif + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + setup_endstop_interrupts(); + #endif + + // Enable endstops + enable_globally( + #if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) + true + #else + false + #endif + ); + +} // Endstops::init + +// Called from ISR. A change was detected. Find out what happened! +void Endstops::check_possible_change() { if (ENDSTOPS_ENABLED) update(); } + +// Called from ISR: Poll endstop state if required +void Endstops::poll() { + + #if ENABLED(PINS_DEBUGGING) + run_monitor(); // report changes in endstop status + #endif + + #if DISABLED(ENDSTOP_INTERRUPTS_FEATURE) || ENABLED(ENDSTOP_NOISE_FILTER) + if (ENDSTOPS_ENABLED) update(); + #endif +} + +void Endstops::enable_globally(const bool onoff) { + enabled_globally = enabled = onoff; + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + if (onoff) update(); // If enabling, update state now + #endif +} + +// Enable / disable endstop checking +void Endstops::enable(const bool onoff) { + enabled = onoff; + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + if (onoff) update(); // If enabling, update state now + #endif +} + +// Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable +void Endstops::not_homing() { + enabled = enabled_globally; + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + if (enabled) update(); // If enabling, update state now + #endif +} + +// Enable / disable endstop z-probe checking +#if HAS_BED_PROBE + void Endstops::enable_z_probe(const bool onoff) { + z_probe_enabled = onoff; + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + if (enabled) update(); // If enabling, update state now + #endif + } +#endif + +#if ENABLED(PINS_DEBUGGING) + void Endstops::run_monitor() { + if (!monitor_flag) return; + static uint8_t monitor_count = 16; // offset this check from the others + monitor_count += _BV(1); // 15 Hz + monitor_count &= 0x7F; + if (!monitor_count) monitor(); // report changes in endstop status + } +#endif + +void Endstops::report_state() { + if (hit_state) { + #if ENABLED(ULTRA_LCD) + char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; + #define _SET_STOP_CHAR(A,C) (chr## A = C) + #else + #define _SET_STOP_CHAR(A,C) ; + #endif + + #define _ENDSTOP_HIT_ECHO(A,C) do{ \ + SERIAL_ECHOPAIR(" " STRINGIFY(A) ":", planner.triggered_position_mm(_AXIS(A))); \ + _SET_STOP_CHAR(A,C); }while(0) + + #define _ENDSTOP_HIT_TEST(A,C) \ + if (TEST(hit_state, A ##_MIN) || TEST(hit_state, A ##_MAX)) \ + _ENDSTOP_HIT_ECHO(A,C) + + #define ENDSTOP_HIT_TEST_X() _ENDSTOP_HIT_TEST(X,'X') + #define ENDSTOP_HIT_TEST_Y() _ENDSTOP_HIT_TEST(Y,'Y') + #define ENDSTOP_HIT_TEST_Z() _ENDSTOP_HIT_TEST(Z,'Z') + + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT); + ENDSTOP_HIT_TEST_X(); + ENDSTOP_HIT_TEST_Y(); + ENDSTOP_HIT_TEST_Z(); + + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + #define P_AXIS Z_AXIS + if (TEST(hit_state, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); + #endif + SERIAL_EOL(); + + #if ENABLED(ULTRA_LCD) + lcd_status_printf_P(0, PSTR(MSG_LCD_ENDSTOPS " %c %c %c %c"), chrX, chrY, chrZ, chrP); + #endif + + hit_on_purpose(); + + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && ENABLED(SDSUPPORT) + if (planner.abort_on_endstop_hit) { + card.sdprinting = false; + card.closefile(); + quickstop_stepper(); + thermalManager.disable_all_heaters(); // switch off all heaters. + } + #endif + } +} // Endstops::report_state + +void Endstops::M119() { + SERIAL_PROTOCOLLNPGM(MSG_M119_REPORT); + #define ES_REPORT(AXIS) do{ \ + SERIAL_PROTOCOLPGM(MSG_##AXIS); \ + SERIAL_PROTOCOLLN(((READ(AXIS##_PIN)^AXIS##_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); \ + }while(0) + #if HAS_X_MIN + ES_REPORT(X_MIN); + #endif + #if HAS_X2_MIN + ES_REPORT(X2_MIN); + #endif + #if HAS_X_MAX + ES_REPORT(X_MAX); + #endif + #if HAS_X2_MAX + ES_REPORT(X2_MAX); + #endif + #if HAS_Y_MIN + ES_REPORT(Y_MIN); + #endif + #if HAS_Y2_MIN + ES_REPORT(Y2_MIN); + #endif + #if HAS_Y_MAX + ES_REPORT(Y_MAX); + #endif + #if HAS_Y2_MAX + ES_REPORT(Y2_MAX); + #endif + #if HAS_Z_MIN + ES_REPORT(Z_MIN); + #endif + #if HAS_Z2_MIN + ES_REPORT(Z2_MIN); + #endif + #if HAS_Z_MAX + ES_REPORT(Z_MAX); + #endif + #if HAS_Z2_MAX + ES_REPORT(Z2_MAX); + #endif + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + SERIAL_PROTOCOLPGM(MSG_Z_PROBE); + SERIAL_PROTOCOLLN(((READ(Z_MIN_PROBE_PIN)^Z_MIN_PROBE_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + SERIAL_PROTOCOLPGM(MSG_FILAMENT_RUNOUT_SENSOR); + SERIAL_PROTOCOLLN(((READ(FIL_RUNOUT_PIN)^FIL_RUNOUT_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); + #endif +} // Endstops::M119 + +// The following routines are called from an ISR context. It could be the temperature ISR, the +// endstop ISR or the Stepper ISR. + +#define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX +#define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN +#define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING + +// Check endstops - Could be called from ISR! +void Endstops::update() { + + // UPDATE_ENDSTOP_BIT: set the current endstop bits for an endstop to its status + #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) + // COPY_BIT: copy the value of SRC_BIT to DST_BIT in DST + #define COPY_BIT(DST, SRC_BIT, DST_BIT) SET_BIT_TO(DST, DST_BIT, TEST(DST, SRC_BIT)) + + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + // If G38 command is active check Z_MIN_PROBE for ALL movement + if (G38_move) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); + #endif + + // With Dual X, endstops are only checked in the homing direction for the active extruder + #if ENABLED(DUAL_X_CARRIAGE) + #define E0_ACTIVE stepper.movement_extruder() == 0 + #define X_MIN_TEST ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) + #define X_MAX_TEST ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) + #else + #define X_MIN_TEST true + #define X_MAX_TEST true + #endif + + // Use HEAD for core axes, AXIS for others + #if CORE_IS_XY || CORE_IS_XZ + #define X_AXIS_HEAD X_HEAD + #else + #define X_AXIS_HEAD X_AXIS + #endif + #if CORE_IS_XY || CORE_IS_YZ + #define Y_AXIS_HEAD Y_HEAD + #else + #define Y_AXIS_HEAD Y_AXIS + #endif + #if CORE_IS_XZ || CORE_IS_YZ + #define Z_AXIS_HEAD Z_HEAD + #else + #define Z_AXIS_HEAD Z_AXIS + #endif + + /** + * Check and update endstops according to conditions + */ + if (stepper.axis_is_moving(X_AXIS)) { + if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction + #if HAS_X_MIN + #if ENABLED(X_DUAL_ENDSTOPS) && X_HOME_DIR < 0 + UPDATE_ENDSTOP_BIT(X, MIN); + #if HAS_X2_MIN + UPDATE_ENDSTOP_BIT(X2, MIN); + #else + COPY_BIT(live_state, X_MIN, X2_MIN); + #endif + #else + if (X_MIN_TEST) UPDATE_ENDSTOP_BIT(X, MIN); + #endif + #endif + } + else { // +direction + #if HAS_X_MAX + #if ENABLED(X_DUAL_ENDSTOPS) && X_HOME_DIR > 0 + UPDATE_ENDSTOP_BIT(X, MAX); + #if HAS_X2_MAX + UPDATE_ENDSTOP_BIT(X2, MAX); + #else + COPY_BIT(live_state, X_MAX, X2_MAX); + #endif + #else + if (X_MAX_TEST) UPDATE_ENDSTOP_BIT(X, MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Y_AXIS)) { + if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction + #if HAS_Y_MIN && Y_HOME_DIR < 0 + #if ENABLED(Y_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Y, MIN); + #if HAS_Y2_MIN + UPDATE_ENDSTOP_BIT(Y2, MIN); + #else + COPY_BIT(live_state, Y_MIN, Y2_MIN); + #endif + #else + UPDATE_ENDSTOP_BIT(Y, MIN); + #endif + #endif + } + else { // +direction + #if HAS_Y_MAX && Y_HOME_DIR > 0 + #if ENABLED(Y_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Y, MAX); + #if HAS_Y2_MAX + UPDATE_ENDSTOP_BIT(Y2, MAX); + #else + COPY_BIT(live_state, Y_MAX, Y2_MAX); + #endif + #else + UPDATE_ENDSTOP_BIT(Y, MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Z_AXIS)) { + if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. + #if HAS_Z_MIN + #if ENABLED(Z_DUAL_ENDSTOPS) && Z_HOME_DIR < 0 + UPDATE_ENDSTOP_BIT(Z, MIN); + #if HAS_Z2_MIN + UPDATE_ENDSTOP_BIT(Z2, MIN); + #else + COPY_BIT(live_state, Z_MIN, Z2_MIN); + #endif + #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + if (z_probe_enabled) UPDATE_ENDSTOP_BIT(Z, MIN); + #elif Z_HOME_DIR < 0 + UPDATE_ENDSTOP_BIT(Z, MIN); + #endif + #endif + + // When closing the gap check the enabled probe + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + if (z_probe_enabled) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); + #endif + } + else { // Z +direction. Gantry up, bed down. + #if HAS_Z_MAX && Z_HOME_DIR > 0 + // Check both Z dual endstops + #if ENABLED(Z_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Z, MAX); + #if HAS_Z2_MAX + UPDATE_ENDSTOP_BIT(Z2, MAX); + #else + COPY_BIT(live_state, Z_MAX, Z2_MAX); + #endif + #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN + // If this pin isn't the bed probe it's the Z endstop + UPDATE_ENDSTOP_BIT(Z, MAX); + #endif + #endif + } + } + + // All endstops were updated. + #if ENABLED(ENDSTOP_NOISE_FILTER) + if (old_live_state != live_state) { // We detected a change. Reinit the timeout + /** + * Filtering out noise on endstops requires a delayed decision. Let's assume, due to noise, + * that 50% of endstop signal samples are good and 50% are bad (assuming normal distribution + * of random noise). Then the first sample has a 50% chance to be good or bad. The 2nd sample + * also has a 50% chance to be good or bad. The chances of 2 samples both being bad becomes + * 50% of 50%, or 25%. That was the previous implementation of Marlin endstop handling. It + * reduces chances of bad readings in half, at the cost of 1 extra sample period, but chances + * still exist. The only way to reduce them further is to increase the number of samples. + * To reduce the chance to 1% (1/128th) requires 7 samples (adding 7ms of delay). + */ + endstop_poll_count = 7; + old_live_state = live_state; + } + else if (endstop_poll_count && !--endstop_poll_count) + validated_live_state = live_state; + + #else + + // Lets accept the new endstop values as valid - We assume hardware filtering of lines + esbits_t validated_live_state = live_state; + + #endif + + // Endstop readings are validated in validated_live_state + + // Test the current status of an endstop + #define TEST_ENDSTOP(ENDSTOP) (TEST(validated_live_state, ENDSTOP)) + + // Record endstop was hit + #define _ENDSTOP_HIT(AXIS, MINMAX) SBI(hit_state, _ENDSTOP(AXIS, MINMAX)) + + // Call the endstop triggered routine for single endstops + #define PROCESS_ENDSTOP(AXIS,MINMAX) do { \ + if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX))) { \ + _ENDSTOP_HIT(AXIS, MINMAX); \ + planner.endstop_triggered(_AXIS(AXIS)); \ + } \ + }while(0) + + // Call the endstop triggered routine for dual endstops + #define PROCESS_DUAL_ENDSTOP(AXIS1, AXIS2, MINMAX) do { \ + const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1); \ + if (dual_hit) { \ + _ENDSTOP_HIT(AXIS1, MINMAX); \ + /* if not performing home or if both endstops were trigged during homing... */ \ + if (!stepper.homing_dual_axis || dual_hit == 0x3) \ + planner.endstop_triggered(_AXIS(AXIS1)); \ + } \ + }while(0) + + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + // If G38 command is active check Z_MIN_PROBE for ALL movement + if (G38_move) { + if (TEST_ENDSTOP(_ENDSTOP(Z, MIN_PROBE))) { + if (stepper.axis_is_moving(X_AXIS)) { _ENDSTOP_HIT(X, MIN); planner.endstop_triggered(X_AXIS); } + else if (stepper.axis_is_moving(Y_AXIS)) { _ENDSTOP_HIT(Y, MIN); planner.endstop_triggered(Y_AXIS); } + else if (stepper.axis_is_moving(Z_AXIS)) { _ENDSTOP_HIT(Z, MIN); planner.endstop_triggered(Z_AXIS); } + G38_endstop_hit = true; + } + } + #endif + + // Now, we must signal, after validation, if an endstop limit is pressed or not + if (stepper.axis_is_moving(X_AXIS)) { + if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction + #if HAS_X_MIN + #if ENABLED(X_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(X, X2, MIN); + #else + if (X_MIN_TEST) PROCESS_ENDSTOP(X, MIN); + #endif + #endif + } + else { // +direction + #if HAS_X_MAX + #if ENABLED(X_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(X, X2, MAX); + #else + if (X_MAX_TEST) PROCESS_ENDSTOP(X, MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Y_AXIS)) { + if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction + #if HAS_Y_MIN + #if ENABLED(Y_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Y, Y2, MIN); + #else + PROCESS_ENDSTOP(Y, MIN); + #endif + #endif + } + else { // +direction + #if HAS_Y_MAX + #if ENABLED(Y_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Y, Y2, MAX); + #else + PROCESS_ENDSTOP(Y, MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Z_AXIS)) { + if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. + #if HAS_Z_MIN + #if ENABLED(Z_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Z, Z2, MIN); + #else + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); + #else + PROCESS_ENDSTOP(Z, MIN); + #endif + #endif + #endif + + // When closing the gap check the enabled probe + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN_PROBE); + #endif + } + else { // Z +direction. Gantry up, bed down. + #if HAS_Z_MAX + #if ENABLED(Z_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Z, Z2, MAX); + #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN + // If this pin is not hijacked for the bed probe + // then it belongs to the Z endstop + PROCESS_ENDSTOP(Z, MAX); + #endif + #endif + } + } +} // Endstops::update() + +#if ENABLED(PINS_DEBUGGING) + + bool Endstops::monitor_flag = false; + + /** + * monitors endstops & Z probe for changes + * + * If a change is detected then the LED is toggled and + * a message is sent out the serial port + * + * Yes, we could miss a rapid back & forth change but + * that won't matter because this is all manual. + * + */ + void Endstops::monitor() { + + static uint16_t old_live_state_local = 0; + static uint8_t local_LED_status = 0; + uint16_t live_state_local = 0; + + #if HAS_X_MIN + if (READ(X_MIN_PIN)) SBI(live_state_local, X_MIN); + #endif + #if HAS_X_MAX + if (READ(X_MAX_PIN)) SBI(live_state_local, X_MAX); + #endif + #if HAS_Y_MIN + if (READ(Y_MIN_PIN)) SBI(live_state_local, Y_MIN); + #endif + #if HAS_Y_MAX + if (READ(Y_MAX_PIN)) SBI(live_state_local, Y_MAX); + #endif + #if HAS_Z_MIN + if (READ(Z_MIN_PIN)) SBI(live_state_local, Z_MIN); + #endif + #if HAS_Z_MAX + if (READ(Z_MAX_PIN)) SBI(live_state_local, Z_MAX); + #endif + #if HAS_Z_MIN_PROBE_PIN + if (READ(Z_MIN_PROBE_PIN)) SBI(live_state_local, Z_MIN_PROBE); + #endif + #if HAS_X2_MIN + if (READ(X2_MIN_PIN)) SBI(live_state_local, X2_MIN); + #endif + #if HAS_X2_MAX + if (READ(X2_MAX_PIN)) SBI(live_state_local, X2_MAX); + #endif + #if HAS_Y2_MIN + if (READ(Y2_MIN_PIN)) SBI(live_state_local, Y2_MIN); + #endif + #if HAS_Y2_MAX + if (READ(Y2_MAX_PIN)) SBI(live_state_local, Y2_MAX); + #endif + #if HAS_Z2_MIN + if (READ(Z2_MIN_PIN)) SBI(live_state_local, Z2_MIN); + #endif + #if HAS_Z2_MAX + if (READ(Z2_MAX_PIN)) SBI(live_state_local, Z2_MAX); + #endif + + uint16_t endstop_change = live_state_local ^ old_live_state_local; + + if (endstop_change) { + #if HAS_X_MIN + if (TEST(endstop_change, X_MIN)) SERIAL_PROTOCOLPAIR(" X_MIN:", TEST(live_state_local, X_MIN)); + #endif + #if HAS_X_MAX + if (TEST(endstop_change, X_MAX)) SERIAL_PROTOCOLPAIR(" X_MAX:", TEST(live_state_local, X_MAX)); + #endif + #if HAS_Y_MIN + if (TEST(endstop_change, Y_MIN)) SERIAL_PROTOCOLPAIR(" Y_MIN:", TEST(live_state_local, Y_MIN)); + #endif + #if HAS_Y_MAX + if (TEST(endstop_change, Y_MAX)) SERIAL_PROTOCOLPAIR(" Y_MAX:", TEST(live_state_local, Y_MAX)); + #endif + #if HAS_Z_MIN + if (TEST(endstop_change, Z_MIN)) SERIAL_PROTOCOLPAIR(" Z_MIN:", TEST(live_state_local, Z_MIN)); + #endif + #if HAS_Z_MAX + if (TEST(endstop_change, Z_MAX)) SERIAL_PROTOCOLPAIR(" Z_MAX:", TEST(live_state_local, Z_MAX)); + #endif + #if HAS_Z_MIN_PROBE_PIN + if (TEST(endstop_change, Z_MIN_PROBE)) SERIAL_PROTOCOLPAIR(" PROBE:", TEST(live_state_local, Z_MIN_PROBE)); + #endif + #if HAS_X2_MIN + if (TEST(endstop_change, X2_MIN)) SERIAL_PROTOCOLPAIR(" X2_MIN:", TEST(live_state_local, X2_MIN)); + #endif + #if HAS_X2_MAX + if (TEST(endstop_change, X2_MAX)) SERIAL_PROTOCOLPAIR(" X2_MAX:", TEST(live_state_local, X2_MAX)); + #endif + #if HAS_Y2_MIN + if (TEST(endstop_change, Y2_MIN)) SERIAL_PROTOCOLPAIR(" Y2_MIN:", TEST(live_state_local, Y2_MIN)); + #endif + #if HAS_Y2_MAX + if (TEST(endstop_change, Y2_MAX)) SERIAL_PROTOCOLPAIR(" Y2_MAX:", TEST(live_state_local, Y2_MAX)); + #endif + #if HAS_Z2_MIN + if (TEST(endstop_change, Z2_MIN)) SERIAL_PROTOCOLPAIR(" Z2_MIN:", TEST(live_state_local, Z2_MIN)); + #endif + #if HAS_Z2_MAX + if (TEST(endstop_change, Z2_MAX)) SERIAL_PROTOCOLPAIR(" Z2_MAX:", TEST(live_state_local, Z2_MAX)); + #endif + SERIAL_PROTOCOLPGM("\n\n"); + analogWrite(LED_PIN, local_LED_status); + local_LED_status ^= 255; + old_live_state_local = live_state_local; + } + } + +#endif // PINS_DEBUGGING diff --git a/Marlin/endstops.h b/Marlin/src/module/endstops.h similarity index 54% rename from Marlin/endstops.h rename to Marlin/src/module/endstops.h index 96cb3d089c..fe5c3a7b76 100644 --- a/Marlin/endstops.h +++ b/Marlin/src/module/endstops.h @@ -27,15 +27,30 @@ #ifndef __ENDSTOPS_H__ #define __ENDSTOPS_H__ -#include "enum.h" -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" +#include + +enum EndstopEnum : char { + X_MIN, + Y_MIN, + Z_MIN, + Z_MIN_PROBE, + X_MAX, + Y_MAX, + Z_MAX, + X2_MIN, + X2_MAX, + Y2_MIN, + Y2_MAX, + Z2_MIN, + Z2_MAX +}; class Endstops { public: static bool enabled, enabled_globally; - static volatile char endstop_hit_bits; // use X_MIN, Y_MIN, Z_MIN and Z_MIN_PROBE as BIT value #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) typedef uint16_t esbits_t; @@ -49,35 +64,64 @@ class Endstops { static float z_endstop_adj; #endif #else - typedef byte esbits_t; + typedef uint8_t esbits_t; #endif - static esbits_t current_endstop_bits, old_endstop_bits; + private: + static esbits_t live_state; + static volatile uint8_t hit_state; // Use X_MIN, Y_MIN, Z_MIN and Z_MIN_PROBE as BIT index + #if ENABLED(ENDSTOP_NOISE_FILTER) + static esbits_t old_live_state, // Old endstop value for debouncing and denoising + validated_live_state; // The validated (accepted as true) endstop bits + static uint8_t endstop_poll_count; // Countdown from threshold for polling + #endif - Endstops() { - enable_globally( - #if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) - true - #else - false - #endif - ); - }; + public: + Endstops() {}; /** * Initialize the endstop pins */ static void init(); + /** + * A change was detected or presumed to be in endstops pins. Find out what + * changed, if anything. Called from ISR contexts + */ + static void check_possible_change(); + + /** + * Periodic call to poll endstops if required. Called from temperature ISR + */ + static void poll(); + /** * Update the endstops bits from the pins */ static void update(); /** - * Print an error message reporting the position when the endstops were last hit. + * Get Endstop hit state. */ - static void report_state(); //call from somewhere to create an serial error message with the locations the endstops where hit, in case they were triggered + FORCE_INLINE static uint8_t trigger_state() { return hit_state; } + + /** + * Get current endstops state + */ + FORCE_INLINE static esbits_t state() { + return + #if ENABLED(ENDSTOP_NOISE_FILTER) + validated_live_state + #else + live_state + #endif + ; + } + + /** + * Report endstop hits to serial. Called from loop(). + */ + static void report_state(); /** * Report endstop positions in response to M119 @@ -85,42 +129,31 @@ class Endstops { static void M119(); // Enable / disable endstop checking globally - static void enable_globally(bool onoff=true) { enabled_globally = enabled = onoff; } + static void enable_globally(const bool onoff=true); // Enable / disable endstop checking - static void enable(bool onoff=true) { enabled = onoff; } + static void enable(const bool onoff=true); // Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable - static void not_homing() { enabled = enabled_globally; } + static void not_homing(); // Clear endstops (i.e., they were hit intentionally) to suppress the report - static void hit_on_purpose() { endstop_hit_bits = 0; } + FORCE_INLINE static void hit_on_purpose() { hit_state = 0; } // Enable / disable endstop z-probe checking #if HAS_BED_PROBE static volatile bool z_probe_enabled; - static void enable_z_probe(bool onoff=true) { z_probe_enabled = onoff; } + static void enable_z_probe(const bool onoff=true); #endif - private: - - #if ENABLED(X_DUAL_ENDSTOPS) - static void test_dual_x_endstops(const EndstopEnum es1, const EndstopEnum es2); - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - static void test_dual_y_endstops(const EndstopEnum es1, const EndstopEnum es2); - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - static void test_dual_z_endstops(const EndstopEnum es1, const EndstopEnum es2); + // Debugging of endstops + #if ENABLED(PINS_DEBUGGING) + static bool monitor_flag; + static void monitor(); + static void run_monitor(); #endif }; extern Endstops endstops; -#if HAS_BED_PROBE - #define ENDSTOPS_ENABLED (endstops.enabled || endstops.z_probe_enabled) -#else - #define ENDSTOPS_ENABLED endstops.enabled -#endif - #endif // __ENDSTOPS_H__ diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp new file mode 100644 index 0000000000..e8e3ee5bb7 --- /dev/null +++ b/Marlin/src/module/motion.cpp @@ -0,0 +1,1507 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * motion.cpp + */ + +#include "motion.h" +#include "endstops.h" +#include "stepper.h" +#include "planner.h" +#include "temperature.h" + +#include "../gcode/gcode.h" + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + #include "../libs/buzzer.h" + #include "../lcd/ultralcd.h" +#endif + +#if HAS_BED_PROBE + #include "probe.h" +#endif + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_AXIS_UNHOMED_ERR && ENABLED(ULTRA_LCD) + #include "../lcd/ultralcd.h" +#endif + +#if ENABLED(SENSORLESS_HOMING) + #include "../feature/tmc_util.h" +#endif + +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + +#define XYZ_CONSTS(type, array, CONFIG) const PROGMEM type array##_P[XYZ] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG } + +XYZ_CONSTS(float, base_min_pos, MIN_POS); +XYZ_CONSTS(float, base_max_pos, MAX_POS); +XYZ_CONSTS(float, base_home_pos, HOME_POS); +XYZ_CONSTS(float, max_length, MAX_LENGTH); +XYZ_CONSTS(float, home_bump_mm, HOME_BUMP_MM); +XYZ_CONSTS(signed char, home_dir, HOME_DIR); + +// Relative Mode. Enable with G91, disable with G90. +bool relative_mode; // = false; + +/** + * Cartesian Current Position + * Used to track the native machine position as moves are queued. + * Used by 'buffer_line_to_current_position' to do a move after changing it. + * Used by 'SYNC_PLAN_POSITION_KINEMATIC' to update 'planner.position'. + */ +float current_position[XYZE] = { 0.0 }; + +/** + * Cartesian Destination + * The destination for a move, filled in by G-code movement commands, + * and expected by functions like 'prepare_move_to_destination'. + * Set with 'get_destination_from_command' or 'set_destination_from_current'. + */ +float destination[XYZE] = { 0.0 }; + + +// The active extruder (tool). Set with T command. +uint8_t active_extruder; // = 0; + +// Extruder offsets +#if HOTENDS > 1 + float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load() +#endif + +// The feedrate for the current move, often used as the default if +// no other feedrate is specified. Overridden for special moves. +// Set by the last G0 through G5 command's "F" parameter. +// Functions that override this for custom moves *must always* restore it! +float feedrate_mm_s = MMM_TO_MMS(1500.0); + +int16_t feedrate_percentage = 100; + +// Homing feedrate is const progmem - compare to constexpr in the header +const float homing_feedrate_mm_s[4] PROGMEM = { + #if ENABLED(DELTA) + MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z), + #else + MMM_TO_MMS(HOMING_FEEDRATE_XY), MMM_TO_MMS(HOMING_FEEDRATE_XY), + #endif + MMM_TO_MMS(HOMING_FEEDRATE_Z), 0 +}; + +// Cartesian conversion result goes here: +float cartes[XYZ]; + +// Until kinematics.cpp is created, create this here +#if IS_KINEMATIC + float delta[ABC]; +#endif + +/** + * The workspace can be offset by some commands, or + * these offsets may be omitted to save on computation. + */ +#if HAS_WORKSPACE_OFFSET + #if HAS_POSITION_SHIFT + // The distance that XYZ has been offset by G92. Reset by G28. + float position_shift[XYZ] = { 0 }; + #endif + #if HAS_HOME_OFFSET + // This offset is added to the configured home position. + // Set by M206, M428, or menu item. Saved to EEPROM. + float home_offset[XYZ] = { 0 }; + #endif + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + // The above two are combined to save on computes + float workspace_offset[XYZ] = { 0 }; + #endif +#endif + +#if OLDSCHOOL_ABL + float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); +#endif + +/** + * Output the current position to serial + */ +void report_current_position() { + SERIAL_PROTOCOLPGM("X:"); + SERIAL_PROTOCOL(LOGICAL_X_POSITION(current_position[X_AXIS])); + SERIAL_PROTOCOLPGM(" Y:"); + SERIAL_PROTOCOL(LOGICAL_Y_POSITION(current_position[Y_AXIS])); + SERIAL_PROTOCOLPGM(" Z:"); + SERIAL_PROTOCOL(LOGICAL_Z_POSITION(current_position[Z_AXIS])); + SERIAL_PROTOCOLPGM(" E:"); + SERIAL_PROTOCOL(current_position[E_AXIS]); + + stepper.report_positions(); + + #if IS_SCARA + scara_report_positions(); + #endif +} + +/** + * sync_plan_position + * + * Set the planner/stepper positions directly from current_position with + * no kinematic translation. Used for homing axes and cartesian/core syncing. + */ +void sync_plan_position() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); + #endif + planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); +} + +void sync_plan_position_e() { planner.set_e_position_mm(current_position[E_AXIS]); } + +/** + * Get the stepper positions in the cartes[] array. + * Forward kinematics are applied for DELTA and SCARA. + * + * The result is in the current coordinate space with + * leveling applied. The coordinates need to be run through + * unapply_leveling to obtain the "ideal" coordinates + * suitable for current_position, etc. + */ +void get_cartesian_from_steppers() { + #if ENABLED(DELTA) + forward_kinematics_DELTA( + planner.get_axis_position_mm(A_AXIS), + planner.get_axis_position_mm(B_AXIS), + planner.get_axis_position_mm(C_AXIS) + ); + #else + #if IS_SCARA + forward_kinematics_SCARA( + planner.get_axis_position_degrees(A_AXIS), + planner.get_axis_position_degrees(B_AXIS) + ); + #else + cartes[X_AXIS] = planner.get_axis_position_mm(X_AXIS); + cartes[Y_AXIS] = planner.get_axis_position_mm(Y_AXIS); + #endif + cartes[Z_AXIS] = planner.get_axis_position_mm(Z_AXIS); + #endif +} + +/** + * Set the current_position for an axis based on + * the stepper positions, removing any leveling that + * may have been applied. + * + * To prevent small shifts in axis position always call + * SYNC_PLAN_POSITION_KINEMATIC after updating axes with this. + * + * To keep hosts in sync, always call report_current_position + * after updating the current_position. + */ +void set_current_from_steppers_for_axis(const AxisEnum axis) { + get_cartesian_from_steppers(); + #if PLANNER_LEVELING + planner.unapply_leveling(cartes); + #endif + if (axis == ALL_AXES) + COPY(current_position, cartes); + else + current_position[axis] = cartes[axis]; +} + +/** + * Move the planner to the current position from wherever it last moved + * (or from wherever it has been told it is located). + */ +void line_to_current_position() { + planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate_mm_s, active_extruder); +} + +/** + * Move the planner to the position stored in the destination array, which is + * used by G0/G1/G2/G3/G5 and many other functions to set a destination. + */ +void buffer_line_to_destination(const float fr_mm_s) { + planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], fr_mm_s, active_extruder); +} + +#if IS_KINEMATIC + + void sync_plan_position_kinematic() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_kinematic", current_position); + #endif + planner.set_position_mm_kinematic(current_position); + } + + /** + * Calculate delta, start a line, and set current_position to destination + */ + void prepare_uninterpolated_move_to_destination(const float fr_mm_s/*=0.0*/) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination); + #endif + + #if UBL_SEGMENTED + // ubl segmented line will do z-only moves in single segment + ubl.prepare_segmented_line_to(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s)); + #else + if ( current_position[X_AXIS] == destination[X_AXIS] + && current_position[Y_AXIS] == destination[Y_AXIS] + && current_position[Z_AXIS] == destination[Z_AXIS] + && current_position[E_AXIS] == destination[E_AXIS] + ) return; + + planner.buffer_line_kinematic(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder); + #endif + + set_current_from_destination(); + } + +#endif // IS_KINEMATIC + +/** + * Plan a move to (X, Y, Z) and set the current_position + * The final current_position may not be the one that was requested + */ +void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s/*=0.0*/) { + const float old_feedrate_mm_s = feedrate_mm_s; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) print_xyz(PSTR(">>> do_blocking_move_to"), NULL, rx, ry, rz); + #endif + + const float z_feedrate = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS); + + #if ENABLED(DELTA) + + if (!position_is_reachable(rx, ry)) return; + + feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; + + set_destination_from_current(); // sync destination at the start + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("set_destination_from_current", destination); + #endif + + // when in the danger zone + if (current_position[Z_AXIS] > delta_clip_start_height) { + if (rz > delta_clip_start_height) { // staying in the danger zone + destination[X_AXIS] = rx; // move directly (uninterpolated) + destination[Y_AXIS] = ry; + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); + #endif + return; + } + destination[Z_AXIS] = delta_clip_start_height; + prepare_uninterpolated_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); + #endif + } + + if (rz > current_position[Z_AXIS]) { // raising? + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); + #endif + } + + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + prepare_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); + #endif + + if (rz < current_position[Z_AXIS]) { // lowering? + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); + #endif + } + + #elif IS_SCARA + + if (!position_is_reachable(rx, ry)) return; + + set_destination_from_current(); + + // If Z needs to raise, do it before moving XY + if (destination[Z_AXIS] < rz) { + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); + } + + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S); + + // If Z needs to lower, do it after moving XY + if (destination[Z_AXIS] > rz) { + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); + } + + #else + + // If Z needs to raise, do it before moving XY + if (current_position[Z_AXIS] < rz) { + feedrate_mm_s = z_feedrate; + current_position[Z_AXIS] = rz; + line_to_current_position(); + } + + feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; + current_position[X_AXIS] = rx; + current_position[Y_AXIS] = ry; + line_to_current_position(); + + // If Z needs to lower, do it after moving XY + if (current_position[Z_AXIS] > rz) { + feedrate_mm_s = z_feedrate; + current_position[Z_AXIS] = rz; + line_to_current_position(); + } + + #endif + + feedrate_mm_s = old_feedrate_mm_s; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< do_blocking_move_to"); + #endif + + planner.synchronize(); +} +void do_blocking_move_to_x(const float &rx, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, current_position[Y_AXIS], current_position[Z_AXIS], fr_mm_s); +} +void do_blocking_move_to_z(const float &rz, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], rz, fr_mm_s); +} +void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, ry, current_position[Z_AXIS], fr_mm_s); +} + +// +// Prepare to do endstop or probe moves +// with custom feedrates. +// +// - Save current feedrates +// - Reset the rate multiplier +// - Reset the command timeout +// - Enable the endstops (for endstop moves) +// +void bracket_probe_move(const bool before) { + static float saved_feedrate_mm_s; + static int16_t saved_feedrate_percentage; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("bracket_probe_move", current_position); + #endif + if (before) { + saved_feedrate_mm_s = feedrate_mm_s; + saved_feedrate_percentage = feedrate_percentage; + feedrate_percentage = 100; + } + else { + feedrate_mm_s = saved_feedrate_mm_s; + feedrate_percentage = saved_feedrate_percentage; + } +} + +void setup_for_endstop_or_probe_move() { bracket_probe_move(true); } +void clean_up_after_endstop_or_probe_move() { bracket_probe_move(false); } + +// Software Endstops are based on the configured limits. +float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, + soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS }; + +#if HAS_SOFTWARE_ENDSTOPS + + // Software Endstops are based on the configured limits. + bool soft_endstops_enabled = true; + + #if IS_KINEMATIC + float soft_endstop_radius, soft_endstop_radius_2; + #endif + + /** + * Constrain the given coordinates to the software endstops. + * + * For DELTA/SCARA the XY constraint is based on the smallest + * radius within the set software endstops. + */ + void clamp_to_software_endstops(float target[XYZ]) { + if (!soft_endstops_enabled) return; + #if IS_KINEMATIC + const float dist_2 = HYPOT2(target[X_AXIS], target[Y_AXIS]); + if (dist_2 > soft_endstop_radius_2) { + const float ratio = soft_endstop_radius / SQRT(dist_2); // 200 / 300 = 0.66 + target[X_AXIS] *= ratio; + target[Y_AXIS] *= ratio; + } + #else + #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) + NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]); + #endif + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) + NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) + NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) + NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]); + #endif + #endif + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) + NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) + NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]); + #endif + } + +#endif + +#if !UBL_SEGMENTED +#if IS_KINEMATIC + + #if IS_SCARA + /** + * Before raising this value, use M665 S[seg_per_sec] to decrease + * the number of segments-per-second. Default is 200. Some deltas + * do better with 160 or lower. It would be good to know how many + * segments-per-second are actually possible for SCARA on AVR. + * + * Longer segments result in less kinematic overhead + * but may produce jagged lines. Try 0.5mm, 1.0mm, and 2.0mm + * and compare the difference. + */ + #define SCARA_MIN_SEGMENT_LENGTH 0.5 + #endif + + /** + * Prepare a linear move in a DELTA or SCARA setup. + * + * Called from prepare_move_to_destination as the + * default Delta/SCARA segmenter. + * + * This calls planner.buffer_line several times, adding + * small incremental moves for DELTA or SCARA. + * + * For Unified Bed Leveling (Delta or Segmented Cartesian) + * the ubl.prepare_segmented_line_to method replaces this. + * + * For Auto Bed Leveling (Bilinear) with SEGMENT_LEVELED_MOVES + * this is replaced by segmented_line_to_destination below. + */ + inline bool prepare_kinematic_move_to(const float (&rtarget)[XYZE]) { + + // Get the top feedrate of the move in the XY plane + const float _feedrate_mm_s = MMS_SCALED(feedrate_mm_s); + + const float xdiff = rtarget[X_AXIS] - current_position[X_AXIS], + ydiff = rtarget[Y_AXIS] - current_position[Y_AXIS]; + + // If the move is only in Z/E don't split up the move + if (!xdiff && !ydiff) { + planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder); + return false; // caller will update current_position + } + + // Fail if attempting move outside printable radius + if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) return true; + + // Remaining cartesian distances + const float zdiff = rtarget[Z_AXIS] - current_position[Z_AXIS], + ediff = rtarget[E_AXIS] - current_position[E_AXIS]; + + // Get the linear distance in XYZ + float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); + + // If the move is very short, check the E move distance + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); + + // No E move either? Game over. + if (UNEAR_ZERO(cartesian_mm)) return true; + + // Minimum number of seconds to move the given distance + const float seconds = cartesian_mm / _feedrate_mm_s; + + // The number of segments-per-second times the duration + // gives the number of segments + uint16_t segments = delta_segments_per_second * seconds; + + // For SCARA enforce a minimum segment size + #if IS_SCARA + NOMORE(segments, cartesian_mm * (1.0 / SCARA_MIN_SEGMENT_LENGTH)); + #endif + + // At least one segment is required + NOLESS(segments, 1U); + + // The approximate length of each segment + const float inv_segments = 1.0 / float(segments), + segment_distance[XYZE] = { + xdiff * inv_segments, + ydiff * inv_segments, + zdiff * inv_segments, + ediff * inv_segments + }; + + #if DISABLED(SCARA_FEEDRATE_SCALING) + const float cartesian_segment_mm = cartesian_mm * inv_segments; + #endif + + /* + SERIAL_ECHOPAIR("mm=", cartesian_mm); + SERIAL_ECHOPAIR(" seconds=", seconds); + SERIAL_ECHOPAIR(" segments=", segments); + #if DISABLED(SCARA_FEEDRATE_SCALING) + SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); + #else + SERIAL_EOL(); + #endif + //*/ + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // SCARA needs to scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + const float segment_length = cartesian_mm * inv_segments, + inv_segment_length = 1.0 / segment_length, // 1/mm/segs + inverse_secs = inv_segment_length * _feedrate_mm_s; + + float oldA = planner.position_float[A_AXIS], + oldB = planner.position_float[B_AXIS]; + + /* + SERIAL_ECHOPGM("Scaled kinematic move: "); + SERIAL_ECHOPAIR(" segment_length (inv)=", segment_length); + SERIAL_ECHOPAIR(" (", inv_segment_length); + SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s); + SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs); + SERIAL_ECHOPAIR(" oldA=", oldA); + SERIAL_ECHOLNPAIR(" oldB=", oldB); + safe_delay(5); + //*/ + #endif + + // Get the current position as starting point + float raw[XYZE]; + COPY(raw, current_position); + + // Calculate and execute the segments + while (--segments) { + + static millis_t next_idle_ms = millis() + 200UL; + thermalManager.manage_heater(); // This returns immediately if not really needed. + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + + LOOP_XYZE(i) raw[i] += segment_distance[i]; + + #if ENABLED(DELTA) && HOTENDS < 2 + DELTA_IK(raw); // Delta can inline its kinematics + #else + inverse_kinematics(raw); + #endif + ADJUST_DELTA(raw); // Adjust Z if bed leveling is enabled + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder)) + break; + /* + SERIAL_ECHO(segments); + SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); + SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); + SERIAL_ECHOLNPAIR(" F", HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs * 60); + safe_delay(5); + //*/ + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; + #else + if (!planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm)) + break; + #endif + } + + // Ensure last segment arrives at target location. + #if ENABLED(SCARA_FEEDRATE_SCALING) + inverse_kinematics(rtarget); + ADJUST_DELTA(rtarget); + const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); + if (diff2) { + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder); + + /* + SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); + SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); + SERIAL_ECHOLNPAIR(" F", (SQRT(diff2) * inverse_secs) * 60); + SERIAL_EOL(); + safe_delay(5); + //*/ + } + #else + planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder, cartesian_segment_mm); + #endif + + return false; // caller will update current_position + } + +#else // !IS_KINEMATIC + + #if ENABLED(SEGMENT_LEVELED_MOVES) + + /** + * Prepare a segmented move on a CARTESIAN setup. + * + * This calls planner.buffer_line several times, adding + * small incremental moves. This allows the planner to + * apply more detailed bed leveling to the full move. + */ + inline void segmented_line_to_destination(const float &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { + + const float xdiff = destination[X_AXIS] - current_position[X_AXIS], + ydiff = destination[Y_AXIS] - current_position[Y_AXIS]; + + // If the move is only in Z/E don't split up the move + if (!xdiff && !ydiff) { + planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder); + return; + } + + // Remaining cartesian distances + const float zdiff = destination[Z_AXIS] - current_position[Z_AXIS], + ediff = destination[E_AXIS] - current_position[E_AXIS]; + + // Get the linear distance in XYZ + // If the move is very short, check the E move distance + // No E move either? Game over. + float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); + if (UNEAR_ZERO(cartesian_mm)) return; + + // The length divided by the segment size + // At least one segment is required + uint16_t segments = cartesian_mm / segment_size; + NOLESS(segments, 1U); + + // The approximate length of each segment + const float inv_segments = 1.0 / float(segments), + cartesian_segment_mm = cartesian_mm * inv_segments, + segment_distance[XYZE] = { + xdiff * inv_segments, + ydiff * inv_segments, + zdiff * inv_segments, + ediff * inv_segments + }; + + // SERIAL_ECHOPAIR("mm=", cartesian_mm); + // SERIAL_ECHOLNPAIR(" segments=", segments); + // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); + + // Get the raw current position as starting point + float raw[XYZE]; + COPY(raw, current_position); + + // Calculate and execute the segments + while (--segments) { + static millis_t next_idle_ms = millis() + 200UL; + thermalManager.manage_heater(); // This returns immediately if not really needed. + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + LOOP_XYZE(i) raw[i] += segment_distance[i]; + if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder, cartesian_segment_mm)) + break; + } + + // Since segment_distance is only approximate, + // the final move must be to the exact destination. + planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder, cartesian_segment_mm); + } + + #endif // SEGMENT_LEVELED_MOVES + + /** + * Prepare a linear move in a Cartesian setup. + * + * When a mesh-based leveling system is active, moves are segmented + * according to the configuration of the leveling system. + * + * Returns true if current_position[] was set to destination[] + */ + inline bool prepare_move_to_destination_cartesian() { + #if HAS_MESH + if (planner.leveling_active && planner.leveling_active_at_z(destination[Z_AXIS])) { + #if ENABLED(AUTO_BED_LEVELING_UBL) + ubl.line_to_destination_cartesian(MMS_SCALED(feedrate_mm_s), active_extruder); // UBL's motion routine needs to know about + return true; // all moves, including Z-only moves. + #elif ENABLED(SEGMENT_LEVELED_MOVES) + segmented_line_to_destination(MMS_SCALED(feedrate_mm_s)); + return false; // caller will update current_position + #else + /** + * For MBL and ABL-BILINEAR only segment moves when X or Y are involved. + * Otherwise fall through to do a direct single move. + */ + if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) { + #if ENABLED(MESH_BED_LEVELING) + mbl.line_to_destination(MMS_SCALED(feedrate_mm_s)); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s)); + #endif + return true; + } + #endif + } + #endif // HAS_MESH + + buffer_line_to_destination(MMS_SCALED(feedrate_mm_s)); + return false; // caller will update current_position + } + +#endif // !IS_KINEMATIC +#endif // !UBL_SEGMENTED + +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + bool extruder_duplication_enabled = false; // Used in Dual X mode 2 +#endif + +#if ENABLED(DUAL_X_CARRIAGE) + + DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + float inactive_extruder_x_pos = X2_MAX_POS, // used in mode 0 & 1 + raised_parked_position[XYZE], // used in mode 1 + duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 + bool active_extruder_parked = false; // used in mode 1 & 2 + millis_t delayed_move_time = 0; // used in mode 1 + int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 + + float x_home_pos(const int extruder) { + if (extruder == 0) + return base_home_pos(X_AXIS); + else + /** + * In dual carriage mode the extruder offset provides an override of the + * second X-carriage position when homed - otherwise X2_HOME_POS is used. + * This allows soft recalibration of the second extruder home position + * without firmware reflash (through the M218 command). + */ + return hotend_offset[X_AXIS][1] > 0 ? hotend_offset[X_AXIS][1] : X2_HOME_POS; + } + + /** + * Prepare a linear move in a dual X axis setup + * + * Return true if current_position[] was set to destination[] + */ + inline bool dual_x_carriage_unpark() { + if (active_extruder_parked) { + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + break; + case DXC_AUTO_PARK_MODE: + if (current_position[E_AXIS] == destination[E_AXIS]) { + // This is a travel move (with no extrusion) + // Skip it, but keep track of the current position + // (so it can be used as the start of the next non-travel move) + if (delayed_move_time != 0xFFFFFFFFUL) { + set_current_from_destination(); + NOLESS(raised_parked_position[Z_AXIS], destination[Z_AXIS]); + delayed_move_time = millis(); + return true; + } + } + // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower + for (uint8_t i = 0; i < 3; i++) + if (!planner.buffer_line( + i == 0 ? raised_parked_position[X_AXIS] : current_position[X_AXIS], + i == 0 ? raised_parked_position[Y_AXIS] : current_position[Y_AXIS], + i == 2 ? current_position[Z_AXIS] : raised_parked_position[Z_AXIS], + current_position[E_AXIS], + i == 1 ? PLANNER_XY_FEEDRATE() : planner.max_feedrate_mm_s[Z_AXIS], + active_extruder) + ) break; + delayed_move_time = 0; + active_extruder_parked = false; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Clear active_extruder_parked"); + #endif + break; + case DXC_DUPLICATION_MODE: + if (active_extruder == 0) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Set planner X", inactive_extruder_x_pos); + SERIAL_ECHOLNPAIR(" ... Line to X", current_position[X_AXIS] + duplicate_extruder_x_offset); + } + #endif + // move duplicate extruder into correct duplication position. + planner.set_position_mm(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + if (!planner.buffer_line( + current_position[X_AXIS] + duplicate_extruder_x_offset, + current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], + planner.max_feedrate_mm_s[X_AXIS], 1) + ) break; + planner.synchronize(); + SYNC_PLAN_POSITION_KINEMATIC(); + extruder_duplication_enabled = true; + active_extruder_parked = false; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); + #endif + } + else { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Active extruder not 0"); + #endif + } + break; + } + } + return false; + } + +#endif // DUAL_X_CARRIAGE + +/** + * Prepare a single move and get ready for the next one + * + * This may result in several calls to planner.buffer_line to + * do smaller moves for DELTA, SCARA, mesh moves, etc. + * + * Make sure current_position[E] and destination[E] are good + * before calling or cold/lengthy extrusion may get missed. + */ +void prepare_move_to_destination() { + clamp_to_software_endstops(destination); + + #if ENABLED(PREVENT_COLD_EXTRUSION) || ENABLED(PREVENT_LENGTHY_EXTRUDE) + + if (!DEBUGGING(DRYRUN)) { + if (destination[E_AXIS] != current_position[E_AXIS]) { + #if ENABLED(PREVENT_COLD_EXTRUSION) + if (thermalManager.tooColdToExtrude(active_extruder)) { + current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); + } + #endif // PREVENT_COLD_EXTRUSION + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + if (ABS(destination[E_AXIS] - current_position[E_AXIS]) * planner.e_factor[active_extruder] > (EXTRUDE_MAXLENGTH)) { + current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_LONG_EXTRUDE_STOP); + } + #endif // PREVENT_LENGTHY_EXTRUDE + } + } + + #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE + + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_unpark()) return; + #endif + + if ( + #if UBL_SEGMENTED + ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) + #elif IS_KINEMATIC + prepare_kinematic_move_to(destination) + #else + prepare_move_to_destination_cartesian() + #endif + ) return; + + set_current_from_destination(); +} + +#if HAS_AXIS_UNHOMED_ERR + + bool axis_unhomed_error(const bool x/*=true*/, const bool y/*=true*/, const bool z/*=true*/) { + #if ENABLED(HOME_AFTER_DEACTIVATE) + const bool xx = x && !TEST(axis_known_position, X_AXIS), + yy = y && !TEST(axis_known_position, Y_AXIS), + zz = z && !TEST(axis_known_position, Z_AXIS); + #else + const bool xx = x && !TEST(axis_homed, X_AXIS), + yy = y && !TEST(axis_homed, Y_AXIS), + zz = z && !TEST(axis_homed, Z_AXIS); + #endif + if (xx || yy || zz) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_HOME " "); + if (xx) SERIAL_ECHOPGM(MSG_X); + if (yy) SERIAL_ECHOPGM(MSG_Y); + if (zz) SERIAL_ECHOPGM(MSG_Z); + SERIAL_ECHOLNPGM(" " MSG_FIRST); + + #if ENABLED(ULTRA_LCD) + lcd_status_printf_P(0, PSTR(MSG_HOME " %s%s%s " MSG_FIRST), xx ? MSG_X : "", yy ? MSG_Y : "", zz ? MSG_Z : ""); + #endif + return true; + } + return false; + } + +#endif // HAS_AXIS_UNHOMED_ERR + +/** + * Homing bump feedrate (mm/s) + */ +inline float get_homing_bump_feedrate(const AxisEnum axis) { + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + #endif + static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; + uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); + if (hbd < 1) { + hbd = 10; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Warning: Homing Bump Divisor < 1"); + } + return homing_feedrate(axis) / hbd; +} + +#if ENABLED(SENSORLESS_HOMING) + + /** + * Set sensorless homing if the axis has it, accounting for Core Kinematics. + */ + void sensorless_homing_per_axis(const AxisEnum axis, const bool enable/*=true*/) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + tmc_sensorless_homing(stepperX, enable); + #if CORE_IS_XY && Y_SENSORLESS + tmc_sensorless_homing(stepperY, enable); + #elif CORE_IS_XZ && Z_SENSORLESS + tmc_sensorless_homing(stepperZ, enable); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + tmc_sensorless_homing(stepperY, enable); + #if CORE_IS_XY && X_SENSORLESS + tmc_sensorless_homing(stepperX, enable); + #elif CORE_IS_YZ && Z_SENSORLESS + tmc_sensorless_homing(stepperZ, enable); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + tmc_sensorless_homing(stepperZ, enable); + #if CORE_IS_XZ && X_SENSORLESS + tmc_sensorless_homing(stepperX, enable); + #elif CORE_IS_YZ && Y_SENSORLESS + tmc_sensorless_homing(stepperY, enable); + #endif + break; + #endif + } + } + +#endif // SENSORLESS_HOMING + +/** + * Home an individual linear axis + */ +static void do_homing_move(const AxisEnum axis, const float distance, const float fr_mm_s=0.0) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> do_homing_move(", axis_codes[axis]); + SERIAL_ECHOPAIR(", ", distance); + SERIAL_ECHOPGM(", "); + if (fr_mm_s) + SERIAL_ECHO(fr_mm_s); + else { + SERIAL_ECHOPAIR("[", homing_feedrate(axis)); + SERIAL_CHAR(']'); + } + SERIAL_ECHOLNPGM(")"); + } + #endif + + #if HOMING_Z_WITH_PROBE && HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + if (axis == Z_AXIS && distance < 0 && thermalManager.isHeatingBed()) { + serialprintPGM(msg_wait_for_bed_heating); + LCD_MESSAGEPGM(MSG_BED_HEATING); + while (thermalManager.isHeatingBed()) safe_delay(200); + lcd_reset_status(); + } + #endif + + // Only do some things when moving towards an endstop + const int8_t axis_home_dir = + #if ENABLED(DUAL_X_CARRIAGE) + (axis == X_AXIS) ? x_home_dir(active_extruder) : + #endif + home_dir(axis); + const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); + + if (is_home_dir) { + + if (axis == Z_AXIS) { + #if HOMING_Z_WITH_PROBE + #if ENABLED(BLTOUCH) + set_bltouch_deployed(true); + #endif + #if QUIET_PROBING + probing_pause(true); + #endif + #endif + } + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(axis); + #endif + } + + // Tell the planner the axis is at 0 + current_position[axis] = 0; + + #if IS_SCARA + SYNC_PLAN_POSITION_KINEMATIC(); + current_position[axis] = distance; + inverse_kinematics(current_position); + planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); + #else + sync_plan_position(); + current_position[axis] = distance; // Set delta/cartesian axes directly + planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); + #endif + + planner.synchronize(); + + if (is_home_dir) { + + if (axis == Z_AXIS) { + #if HOMING_Z_WITH_PROBE + #if QUIET_PROBING + probing_pause(false); + #endif + #if ENABLED(BLTOUCH) + set_bltouch_deployed(false); + #endif + #endif + } + + endstops.hit_on_purpose(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(axis, false); + #endif + } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("<<< do_homing_move(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif +} + +/** + * Set an axis' current position to its home position (after homing). + * + * For Core and Cartesian robots this applies one-to-one when an + * individual axis has been homed. + * + * DELTA should wait until all homing is done before setting the XYZ + * current_position to home, because homing is a single operation. + * In the case where the axis positions are already known and previously + * homed, DELTA could home to X or Y individually by moving either one + * to the center. However, homing Z always homes XY and Z. + * + * SCARA should wait until all XY homing is done before setting the XY + * current_position to home, because neither X nor Y is at home until + * both are at home. Z can however be homed individually. + * + * Callers must sync the planner position after calling this! + */ +void set_axis_is_at_home(const AxisEnum axis) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> set_axis_is_at_home(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + SBI(axis_known_position, axis); + SBI(axis_homed, axis); + + #if HAS_POSITION_SHIFT + position_shift[axis] = 0; + update_software_endstops(axis); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { + current_position[X_AXIS] = x_home_pos(active_extruder); + return; + } + #endif + + #if ENABLED(MORGAN_SCARA) + scara_set_axis_is_at_home(axis); + #elif ENABLED(DELTA) + current_position[axis] = (axis == Z_AXIS ? delta_height : base_home_pos(axis)); + #else + current_position[axis] = base_home_pos(axis); + #endif + + /** + * Z Probe Z Homing? Account for the probe's Z offset. + */ + #if HAS_BED_PROBE && Z_HOME_DIR < 0 + if (axis == Z_AXIS) { + #if HOMING_Z_WITH_PROBE + + current_position[Z_AXIS] -= zprobe_zoffset; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***"); + SERIAL_ECHOLNPAIR("> zprobe_zoffset = ", zprobe_zoffset); + } + #endif + + #elif ENABLED(DEBUG_LEVELING_FEATURE) + + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("*** Z HOMED TO ENDSTOP (Z_MIN_PROBE_ENDSTOP) ***"); + + #endif + } + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + #if HAS_HOME_OFFSET + SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]); + SERIAL_ECHOLNPAIR("] = ", home_offset[axis]); + #endif + DEBUG_POS("", current_position); + SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + I2CPEM.homed(axis); + #endif +} + +/** + * Home an individual "raw axis" to its endstop. + * This applies to XYZ on Cartesian and Core robots, and + * to the individual ABC steppers on DELTA and SCARA. + * + * At the end of the procedure the axis is marked as + * homed and the current position of that axis is updated. + * Kinematic robots should wait till all axes are homed + * before updating the current position. + */ + +void homeaxis(const AxisEnum axis) { + + #if IS_SCARA + // Only Z homing (with probe) is permitted + if (axis != Z_AXIS) { BUZZ(100, 880); return; } + #else + #define CAN_HOME(A) \ + (axis == _AXIS(A) && ((A##_MIN_PIN > -1 && A##_HOME_DIR < 0) || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0))) + if (!CAN_HOME(X) && !CAN_HOME(Y) && !CAN_HOME(Z)) return; + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> homeaxis(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + const int axis_home_dir = ( + #if ENABLED(DUAL_X_CARRIAGE) + axis == X_AXIS ? x_home_dir(active_extruder) : + #endif + home_dir(axis) + ); + + // Homing Z towards the bed? Deploy the Z probe or endstop. + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && DEPLOY_PROBE()) return; + #endif + + // Set flags for X, Y, Z motor locking + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + switch (axis) { + #if ENABLED(X_DUAL_ENDSTOPS) + case X_AXIS: + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + case Y_AXIS: + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + case Z_AXIS: + #endif + stepper.set_homing_dual_axis(true); + default: break; + } + #endif + + // Fast move towards endstop until triggered + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 1 Fast:"); + #endif + do_homing_move(axis, 1.5 * max_length(axis) * axis_home_dir); + + // When homing Z with probe respect probe clearance + const float bump = axis_home_dir * ( + #if HOMING_Z_WITH_PROBE + (axis == Z_AXIS && (Z_HOME_BUMP_MM)) ? MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_HOME_BUMP_MM) : + #endif + home_bump_mm(axis) + ); + + // If a second homing move is configured... + if (bump) { + // Move away from the endstop by the axis HOME_BUMP_MM + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Move Away:"); + #endif + do_homing_move(axis, -bump + #if HOMING_Z_WITH_PROBE + , axis == Z_AXIS ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0.0 + #endif + ); + + // Slow move towards endstop until triggered + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 2 Slow:"); + #endif + do_homing_move(axis, 2 * bump, get_homing_bump_feedrate(axis)); + } + + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + const bool pos_dir = axis_home_dir > 0; + #if ENABLED(X_DUAL_ENDSTOPS) + if (axis == X_AXIS) { + const float adj = ABS(endstops.x_endstop_adj); + if (pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_x_lock(false); + stepper.set_x2_lock(false); + } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (axis == Y_AXIS) { + const float adj = ABS(endstops.y_endstop_adj); + if (pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_y_lock(false); + stepper.set_y2_lock(false); + } + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + if (axis == Z_AXIS) { + const float adj = ABS(endstops.z_endstop_adj); + if (pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0)) stepper.set_z_lock(true); else stepper.set_z2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_z_lock(false); + stepper.set_z2_lock(false); + } + #endif + stepper.set_homing_dual_axis(false); + #endif + + #if IS_SCARA + + set_axis_is_at_home(axis); + SYNC_PLAN_POSITION_KINEMATIC(); + + #elif ENABLED(DELTA) + + // Delta has already moved all three towers up in G28 + // so here it re-homes each tower in turn. + // Delta homing treats the axes as normal linear axes. + + // retrace by the amount specified in delta_endstop_adj + additional dist in order to have minimum steps + if (delta_endstop_adj[axis] * Z_HOME_DIR <= 0) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("delta_endstop_adj:"); + #endif + do_homing_move(axis, delta_endstop_adj[axis] - (MIN_STEPS_PER_SEGMENT + 1) * planner.steps_to_mm[axis] * Z_HOME_DIR); + } + + #else + + // For cartesian/core machines, + // set the axis to its home position + set_axis_is_at_home(axis); + sync_plan_position(); + + destination[axis] = current_position[axis]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + #endif + + #endif + + // Put away the Z probe + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && STOW_PROBE()) return; + #endif + + // Clear retracted status if homing the Z axis + #if ENABLED(FWRETRACT) + if (axis == Z_AXIS) fwretract.hop_amount = 0.0; + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("<<< homeaxis(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif +} // homeaxis() + +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) + + /** + * Software endstops can be used to monitor the open end of + * an axis that has a hardware endstop on the other end. Or + * they can prevent axes from moving past endstops and grinding. + * + * To keep doing their job as the coordinate system changes, + * the software endstop positions must be refreshed to remain + * at the same positions relative to the machine. + */ + void update_software_endstops(const AxisEnum axis) { + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + workspace_offset[axis] = home_offset[axis] + position_shift[axis]; + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + if (axis == X_AXIS) { + + // In Dual X mode hotend_offset[X] is T1's home position + float dual_max_x = MAX(hotend_offset[X_AXIS][1], X2_MAX_POS); + + if (active_extruder != 0) { + // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) + soft_endstop_min[X_AXIS] = X2_MIN_POS; + soft_endstop_max[X_AXIS] = dual_max_x; + } + else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { + // In Duplication Mode, T0 can move as far left as X_MIN_POS + // but not so far to the right that T1 would move past the end + soft_endstop_min[X_AXIS] = base_min_pos(X_AXIS); + soft_endstop_max[X_AXIS] = MIN(base_max_pos(X_AXIS), dual_max_x - duplicate_extruder_x_offset); + } + else { + // In other modes, T0 can move from X_MIN_POS to X_MAX_POS + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = base_max_pos(axis); + } + } + #elif ENABLED(DELTA) + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = (axis == Z_AXIS ? delta_height : base_max_pos(axis)); + #else + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = base_max_pos(axis); + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("For ", axis_codes[axis]); + #if HAS_HOME_OFFSET + SERIAL_ECHOPAIR(" axis:\n home_offset = ", home_offset[axis]); + #endif + #if HAS_POSITION_SHIFT + SERIAL_ECHOPAIR("\n position_shift = ", position_shift[axis]); + #endif + SERIAL_ECHOPAIR("\n soft_endstop_min = ", soft_endstop_min[axis]); + SERIAL_ECHOLNPAIR("\n soft_endstop_max = ", soft_endstop_max[axis]); + } + #endif + + #if ENABLED(DELTA) + switch (axis) { + #if HAS_SOFTWARE_ENDSTOPS + case X_AXIS: + case Y_AXIS: + // Get a minimum radius for clamping + soft_endstop_radius = MIN3(ABS(MAX(soft_endstop_min[X_AXIS], soft_endstop_min[Y_AXIS])), soft_endstop_max[X_AXIS], soft_endstop_max[Y_AXIS]); + soft_endstop_radius_2 = sq(soft_endstop_radius); + break; + #endif + case Z_AXIS: + delta_clip_start_height = soft_endstop_max[axis] - delta_safe_distance_from_top(); + default: break; + } + #endif + } + +#endif // HAS_WORKSPACE_OFFSET || DUAL_X_CARRIAGE || DELTA + +#if HAS_M206_COMMAND + /** + * Change the home offset for an axis. + * Also refreshes the workspace offset. + */ + void set_home_offset(const AxisEnum axis, const float v) { + home_offset[axis] = v; + update_software_endstops(axis); + } +#endif // HAS_M206_COMMAND diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h new file mode 100644 index 0000000000..e06474654d --- /dev/null +++ b/Marlin/src/module/motion.h @@ -0,0 +1,359 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * motion.h + * + * High-level motion commands to feed the planner + * Some of these methods may migrate to the planner class. + */ + +#ifndef MOTION_H +#define MOTION_H + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + #include "../module/scara.h" +#endif + +extern bool relative_mode; + +extern float current_position[XYZE], // High-level current tool position + destination[XYZE]; // Destination for a move + +// Scratch space for a cartesian result +extern float cartes[XYZ]; + +// Until kinematics.cpp is created, declare this here +#if IS_KINEMATIC + extern float delta[ABC]; +#endif + +#if OLDSCHOOL_ABL + extern float xy_probe_feedrate_mm_s; + #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s +#elif defined(XY_PROBE_SPEED) + #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) +#else + #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() +#endif + +/** + * Feed rates are often configured with mm/m + * but the planner and stepper like mm/s units. + */ +extern const float homing_feedrate_mm_s[4]; +FORCE_INLINE float homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } + +extern float feedrate_mm_s; + +/** + * Feedrate scaling and conversion + */ +extern int16_t feedrate_percentage; +#define MMS_SCALED(MM_S) ((MM_S)*feedrate_percentage*0.01) + +extern uint8_t active_extruder; + +#if HOTENDS > 1 + extern float hotend_offset[XYZ][HOTENDS]; +#endif + +extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; + +FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float_near(p); } +FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte_near(p); } + +#define XYZ_DEFS(type, array, CONFIG) \ + extern const type array##_P[XYZ]; \ + FORCE_INLINE type array(AxisEnum axis) { return pgm_read_any(&array##_P[axis]); } \ + typedef void __void_##CONFIG##__ + +XYZ_DEFS(float, base_min_pos, MIN_POS); +XYZ_DEFS(float, base_max_pos, MAX_POS); +XYZ_DEFS(float, base_home_pos, HOME_POS); +XYZ_DEFS(float, max_length, MAX_LENGTH); +XYZ_DEFS(float, home_bump_mm, HOME_BUMP_MM); +XYZ_DEFS(signed char, home_dir, HOME_DIR); + +#if HAS_SOFTWARE_ENDSTOPS + extern bool soft_endstops_enabled; + void clamp_to_software_endstops(float target[XYZ]); +#else + #define soft_endstops_enabled false + #define clamp_to_software_endstops(x) NOOP +#endif + +void report_current_position(); + +inline void set_current_from_destination() { COPY(current_position, destination); } +inline void set_destination_from_current() { COPY(destination, current_position); } + +void get_cartesian_from_steppers(); +void set_current_from_steppers_for_axis(const AxisEnum axis); + +/** + * sync_plan_position + * + * Set the planner/stepper positions directly from current_position with + * no kinematic translation. Used for homing axes and cartesian/core syncing. + */ +void sync_plan_position(); +void sync_plan_position_e(); + +#if IS_KINEMATIC + void sync_plan_position_kinematic(); + #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position_kinematic() +#else + #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position() +#endif + +/** + * Move the planner to the current position from wherever it last moved + * (or from wherever it has been told it is located). + */ +void line_to_current_position(); + +/** + * Move the planner to the position stored in the destination array, which is + * used by G0/G1/G2/G3/G5 and many other functions to set a destination. + */ +void buffer_line_to_destination(const float fr_mm_s); + +#if IS_KINEMATIC + void prepare_uninterpolated_move_to_destination(const float fr_mm_s=0.0); +#endif + +void prepare_move_to_destination(); + +/** + * Blocking movement and shorthand functions + */ +void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s=0.0); +void do_blocking_move_to_x(const float &rx, const float &fr_mm_s=0.0); +void do_blocking_move_to_z(const float &rz, const float &fr_mm_s=0.0); +void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s=0.0); + +void setup_for_endstop_or_probe_move(); +void clean_up_after_endstop_or_probe_move(); + +void bracket_probe_move(const bool before); +void setup_for_endstop_or_probe_move(); +void clean_up_after_endstop_or_probe_move(); + +// +// Homing +// + +#define HAS_AXIS_UNHOMED_ERR ( \ + ENABLED(Z_PROBE_ALLEN_KEY) \ + || ENABLED(Z_PROBE_SLED) \ + || HAS_PROBING_PROCEDURE \ + || HOTENDS > 1 \ + || ENABLED(NOZZLE_CLEAN_FEATURE) \ + || ENABLED(NOZZLE_PARK_FEATURE) \ + || (ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(HOME_BEFORE_FILAMENT_CHANGE)) \ + || HAS_M206_COMMAND \ + ) || ENABLED(NO_MOTION_BEFORE_HOMING) + +#if HAS_AXIS_UNHOMED_ERR + bool axis_unhomed_error(const bool x=true, const bool y=true, const bool z=true); +#endif + +#if ENABLED(NO_MOTION_BEFORE_HOMING) + #define MOTION_CONDITIONS (IsRunning() && !axis_unhomed_error()) +#else + #define MOTION_CONDITIONS IsRunning() +#endif + +void set_axis_is_at_home(const AxisEnum axis); + +void homeaxis(const AxisEnum axis); +#define HOMEAXIS(A) homeaxis(_AXIS(A)) + +#if ENABLED(SENSORLESS_HOMING) + void sensorless_homing_per_axis(const AxisEnum axis, const bool enable=true); +#endif + +// +// Macros +// + +/** + * Workspace offsets + */ +#if HAS_WORKSPACE_OFFSET + #if HAS_HOME_OFFSET + extern float home_offset[XYZ]; + #endif + #if HAS_POSITION_SHIFT + extern float position_shift[XYZ]; + #endif + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + extern float workspace_offset[XYZ]; + #define WORKSPACE_OFFSET(AXIS) workspace_offset[AXIS] + #elif HAS_HOME_OFFSET + #define WORKSPACE_OFFSET(AXIS) home_offset[AXIS] + #elif HAS_POSITION_SHIFT + #define WORKSPACE_OFFSET(AXIS) position_shift[AXIS] + #endif + #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + WORKSPACE_OFFSET(AXIS)) + #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - WORKSPACE_OFFSET(AXIS)) +#else + #define NATIVE_TO_LOGICAL(POS, AXIS) (POS) + #define LOGICAL_TO_NATIVE(POS, AXIS) (POS) +#endif +#define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) +#define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) +#define LOGICAL_Z_POSITION(POS) NATIVE_TO_LOGICAL(POS, Z_AXIS) +#define RAW_X_POSITION(POS) LOGICAL_TO_NATIVE(POS, X_AXIS) +#define RAW_Y_POSITION(POS) LOGICAL_TO_NATIVE(POS, Y_AXIS) +#define RAW_Z_POSITION(POS) LOGICAL_TO_NATIVE(POS, Z_AXIS) + +/** + * position_is_reachable family of functions + */ + +#if IS_KINEMATIC // (DELTA or SCARA) + + #if IS_SCARA + extern const float L1, L2; + #endif + + // Return true if the given point is within the printable area + inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { + #if ENABLED(DELTA) + return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset); + #elif IS_SCARA + const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); + return ( + R2 <= sq(L1 + L2) - inset + #if MIDDLE_DEAD_ZONE_R > 0 + && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) + #endif + ); + #endif + } + + #if HAS_BED_PROBE + // Return true if the both nozzle and the probe can reach the given point. + // Note: This won't work on SCARA since the probe offset rotates with the arm. + inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { + return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) + && position_is_reachable(rx, ry, ABS(MIN_PROBE_EDGE)); + } + #endif + +#else // CARTESIAN + + // Return true if the given position is within the machine bounds. + inline bool position_is_reachable(const float &rx, const float &ry) { + // Add 0.001 margin to deal with float imprecision + return WITHIN(rx, X_MIN_POS - 0.001, X_MAX_POS + 0.001) + && WITHIN(ry, Y_MIN_POS - 0.001, Y_MAX_POS + 0.001); + } + + #if HAS_BED_PROBE + /** + * Return whether the given position is within the bed, and whether the nozzle + * can reach the position required to put the probe at the given position. + * + * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the + * nozzle must be be able to reach +10,-10. + */ + inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { + return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) + && WITHIN(rx, MIN_PROBE_X - 0.001, MAX_PROBE_X + 0.001) + && WITHIN(ry, MIN_PROBE_Y - 0.001, MAX_PROBE_Y + 0.001); + } + #endif + +#endif // CARTESIAN + +#if !HAS_BED_PROBE + FORCE_INLINE bool position_is_reachable_by_probe(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } +#endif + +/** + * Dual X Carriage / Dual Nozzle + */ +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + extern bool extruder_duplication_enabled; // Used in Dual X mode 2 +#endif + +/** + * Dual X Carriage + */ +#if ENABLED(DUAL_X_CARRIAGE) + + enum DualXMode : char { + DXC_FULL_CONTROL_MODE, // DUAL_X_CARRIAGE only + DXC_AUTO_PARK_MODE, // DUAL_X_CARRIAGE only + DXC_DUPLICATION_MODE + }; + + extern DualXMode dual_x_carriage_mode; + extern float inactive_extruder_x_pos, // used in mode 0 & 1 + raised_parked_position[XYZE], // used in mode 1 + duplicate_extruder_x_offset; // used in mode 2 + extern bool active_extruder_parked; // used in mode 1 & 2 + extern millis_t delayed_move_time; // used in mode 1 + extern int16_t duplicate_extruder_temp_offset; // used in mode 2 + + float x_home_pos(const int extruder); + + FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } + +#elif ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + + enum DualXMode : char { + DXC_DUPLICATION_MODE = 2 + }; + +#endif + +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) + void update_software_endstops(const AxisEnum axis); +#endif + +#if HAS_M206_COMMAND + void set_home_offset(const AxisEnum axis, const float v); +#endif + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #if ENABLED(DELTA) + #define ADJUST_DELTA(V) \ + if (planner.leveling_active) { \ + const float zadj = bilinear_z_offset(V); \ + delta[A_AXIS] += zadj; \ + delta[B_AXIS] += zadj; \ + delta[C_AXIS] += zadj; \ + } + #else + #define ADJUST_DELTA(V) if (planner.leveling_active) { delta[Z_AXIS] += bilinear_z_offset(V); } + #endif +#else + #define ADJUST_DELTA(V) NOOP +#endif + +#endif // MOTION_H diff --git a/Marlin/planner.cpp b/Marlin/src/module/planner.cpp similarity index 50% rename from Marlin/planner.cpp rename to Marlin/src/module/planner.cpp index d32290f7da..6393829fe9 100644 --- a/Marlin/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -56,27 +56,46 @@ * * IntersectionDistance[s1_, s2_, a_, d_] := (2 a d - s1^2 + s2^2)/(4 a) * + * -- + * + * The fast inverse function needed for Bézier interpolation for AVR + * was designed, written and tested by Eduardo José Tagle on April/2018 */ #include "planner.h" #include "stepper.h" -#include "temperature.h" -#include "ultralcd.h" -#include "language.h" -#include "parser.h" +#include "motion.h" +#include "../module/temperature.h" +#include "../lcd/ultralcd.h" +#include "../core/language.h" +#include "../gcode/parser.h" -#include "Marlin.h" +#include "../Marlin.h" -#if ENABLED(MESH_BED_LEVELING) - #include "mesh_bed_leveling.h" -#elif ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl.h" +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #include "../feature/filwidth.h" +#endif + +#if ENABLED(BARICUDA) + #include "../feature/baricuda.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" #endif #if ENABLED(AUTO_POWER_CONTROL) - #include "power.h" + #include "../feature/power.h" #endif +// Delay for delivery of first block to the stepper ISR, if the queue contains 2 or +// fewer movements. The delay is measured in milliseconds, and must be less than 250ms +#define BLOCK_DELAY_FOR_1ST_MOVE 100 + Planner planner; // public: @@ -85,15 +104,43 @@ Planner planner; * A ring buffer of moves described in steps */ block_t Planner::block_buffer[BLOCK_BUFFER_SIZE]; -volatile uint8_t Planner::block_buffer_head, // Index of the next block to be pushed - Planner::block_buffer_tail; +volatile uint8_t Planner::block_buffer_head, // Index of the next block to be pushed + Planner::block_buffer_tail; // Index of the busy block, if any +uint16_t Planner::cleaning_buffer_counter; // A counter to disable queuing of blocks +uint8_t Planner::delay_before_delivering, // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks + Planner::block_buffer_planned; // Index of the optimally planned block -float Planner::max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second - Planner::axis_steps_per_mm[XYZE_N], - Planner::steps_to_mm[XYZE_N]; +uint32_t Planner::max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE + Planner::max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2 + Planner::min_segment_time_us; // (µs) M205 B + +float Planner::max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds + Planner::axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter + Planner::steps_to_mm[XYZE_N], // (mm) Millimeters per step + Planner::min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate + Planner::acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. + Planner::retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes + Planner::travel_acceleration, // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. + Planner::min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate + +#if ENABLED(JUNCTION_DEVIATION) + float Planner::junction_deviation_mm; // (mm) M205 J + #if ENABLED(LIN_ADVANCE) + float Planner::max_e_jerk_factor; // Calculated from junction_deviation_mm + #endif +#else + float Planner::max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. +#endif + +#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + bool Planner::abort_on_endstop_hit = false; +#endif #if ENABLED(DISTINCT_E_FACTORS) uint8_t Planner::last_extruder = 0; // Respond to extruder change + #define _EINDEX (E_AXIS + active_extruder) +#else + #define _EINDEX E_AXIS #endif int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder @@ -106,19 +153,6 @@ float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0); // The flow perce Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner #endif -uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N], - Planner::max_acceleration_mm_per_s2[XYZE_N]; // Use M201 to override by software - -uint32_t Planner::min_segment_time_us; - -// Initialized by settings.load() -float Planner::min_feedrate_mm_s, - Planner::acceleration, // Normal acceleration mm/s^2 DEFAULT ACCELERATION for all printing moves. M204 SXXXX - Planner::retract_acceleration, // Retract acceleration mm/s^2 filament pull-back and push-forward while standing still in the other axes M204 TXXXX - Planner::travel_acceleration, // Travel acceleration mm/s^2 DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX - Planner::max_jerk[XYZE], // The largest speed change requiring no acceleration - Planner::min_travel_feedrate_mm_s; - #if HAS_LEVELING bool Planner::leveling_active = false; // Flag that auto bed leveling is enabled #if ABL_PLANAR @@ -160,7 +194,7 @@ int32_t Planner::position[NUM_AXIS] = { 0 }; uint32_t Planner::cutoff_long; float Planner::previous_speed[NUM_AXIS], - Planner::previous_nominal_speed; + Planner::previous_nominal_speed_sqr; #if ENABLED(DISABLE_INACTIVE_EXTRUDER) uint8_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; @@ -197,520 +231,468 @@ void Planner::init() { ZERO(position_float); #endif ZERO(previous_speed); - previous_nominal_speed = 0.0; + previous_nominal_speed_sqr = 0.0; #if ABL_PLANAR bed_level_matrix.set_to_identity(); #endif clear_block_buffer(); + block_buffer_planned = 0; + delay_before_delivering = 0; } -#if ENABLED(BEZIER_JERK_CONTROL) +#if ENABLED(S_CURVE_ACCELERATION) - // This routine, for AVR, returns 0x1000000 / d, but trying to get the inverse as - // fast as possible. A fast converging iterative Newton-Raphson method is able to - // reach full precision in just 1 iteration, and takes 211 cycles (worst case, mean - // case is less, up to 30 cycles for small divisors), instead of the 500 cycles a - // normal division would take. - // - // Inspired by the following page, - // https://stackoverflow.com/questions/27801397/newton-raphson-division-with-big-integers - // - // Suppose we want to calculate - // floor(2 ^ k / B) where B is a positive integer - // Then - // B must be <= 2^k, otherwise, the quotient is 0. - // - // The Newton - Raphson iteration for x = B / 2 ^ k yields: - // q[n + 1] = q[n] * (2 - q[n] * B / 2 ^ k) - // - // We can rearrange it as: - // q[n + 1] = q[n] * (2 ^ (k + 1) - q[n] * B) >> k - // - // Each iteration of this kind requires only integer multiplications - // and bit shifts. - // Does it converge to floor(2 ^ k / B) ?: Not necessarily, but, in - // the worst case, it eventually alternates between floor(2 ^ k / B) - // and ceiling(2 ^ k / B)). - // So we can use some not-so-clever test to see if we are in this - // case, and extract floor(2 ^ k / B). - // Lastly, a simple but important optimization for this approach is to - // truncate multiplications (i.e.calculate only the higher bits of the - // product) in the early iterations of the Newton - Raphson method.The - // reason to do so, is that the results of the early iterations are far - // from the quotient, and it doesn't matter to perform them inaccurately. - // Finally, we should pick a good starting value for x. Knowing how many - // digits the divisor has, we can estimate it: - // - // 2^k / x = 2 ^ log2(2^k / x) - // 2^k / x = 2 ^(log2(2^k)-log2(x)) - // 2^k / x = 2 ^(k*log2(2)-log2(x)) - // 2^k / x = 2 ^ (k-log2(x)) - // 2^k / x >= 2 ^ (k-floor(log2(x))) - // floor(log2(x)) simply is the index of the most significant bit set. - // - // If we could improve this estimation even further, then the number of - // iterations can be dropped quite a bit, thus saving valuable execution time. - // The paper "Software Integer Division" by Thomas L.Rodeheffer, Microsoft - // Research, Silicon Valley,August 26, 2008, that is available at - // https://www.microsoft.com/en-us/research/wp-content/uploads/2008/08/tr-2008-141.pdf - // suggests , for its integer division algorithm, that using a table to supply the - // first 8 bits of precision, and due to the quadratic convergence nature of the - // Newton-Raphon iteration, then just 2 iterations should be enough to get - // maximum precision of the division. - // If we precompute values of inverses for small denominator values, then - // just one Newton-Raphson iteration is enough to reach full precision - // We will use the top 9 bits of the denominator as index. - // - // The AVR assembly function is implementing the following C code, included - // here as reference: - // - // uint32_t get_period_inverse(uint32_t d) { - // static const uint8_t inv_tab[256] = { - // 255,253,252,250,248,246,244,242,240,238,236,234,233,231,229,227, - // 225,224,222,220,218,217,215,213,212,210,208,207,205,203,202,200, - // 199,197,195,194,192,191,189,188,186,185,183,182,180,179,178,176, - // 175,173,172,170,169,168,166,165,164,162,161,160,158,157,156,154, - // 153,152,151,149,148,147,146,144,143,142,141,139,138,137,136,135, - // 134,132,131,130,129,128,127,126,125,123,122,121,120,119,118,117, - // 116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101, - // 100,99,98,97,96,95,94,93,92,91,90,89,88,88,87,86, - // 85,84,83,82,81,80,80,79,78,77,76,75,74,74,73,72, - // 71,70,70,69,68,67,66,66,65,64,63,62,62,61,60,59, - // 59,58,57,56,56,55,54,53,53,52,51,50,50,49,48,48, - // 47,46,46,45,44,43,43,42,41,41,40,39,39,38,37,37, - // 36,35,35,34,33,33,32,32,31,30,30,29,28,28,27,27, - // 26,25,25,24,24,23,22,22,21,21,20,19,19,18,18,17, - // 17,16,15,15,14,14,13,13,12,12,11,10,10,9,9,8, - // 8,7,7,6,6,5,5,4,4,3,3,2,2,1,0,0 - // }; - // - // // For small denominators, it is cheaper to directly store the result, - // // because those denominators would require 2 Newton-Raphson iterations - // // to converge to the required result precision. For bigger ones, just - // // ONE Newton-Raphson iteration is enough to get maximum precision! - // static const uint32_t small_inv_tab[111] PROGMEM = { - // 16777216,16777216,8388608,5592405,4194304,3355443,2796202,2396745,2097152,1864135,1677721,1525201,1398101,1290555,1198372,1118481, - // 1048576,986895,932067,883011,838860,798915,762600,729444,699050,671088,645277,621378,599186,578524,559240,541200, - // 524288,508400,493447,479349,466033,453438,441505,430185,419430,409200,399457,390167,381300,372827,364722,356962, - // 349525,342392,335544,328965,322638,316551,310689,305040,299593,294337,289262,284359,279620,275036,270600,266305, - // 262144,258111,254200,250406,246723,243148,239674,236298,233016,229824,226719,223696,220752,217885,215092,212369, - // 209715,207126,204600,202135,199728,197379,195083,192841,190650,188508,186413,184365,182361,180400,178481,176602, - // 174762,172960,171196,169466,167772,166111,164482,162885,161319,159783,158275,156796,155344,153919,152520 - // }; - // - // // For small divisors, it is best to directly retrieve the results - // if (d <= 110) - // return pgm_read_dword(&small_inv_tab[d]); - // - // // Compute initial estimation of 0x1000000/x - - // // Get most significant bit set on divider - // uint8_t idx = 0; - // uint32_t nr = d; - // if (!(nr & 0xFF0000)) { - // nr <<= 8; - // idx += 8; - // if (!(nr & 0xFF0000)) { - // nr <<= 8; - // idx += 8; - // } - // } - // if (!(nr & 0xF00000)) { - // nr <<= 4; - // idx += 4; - // } - // if (!(nr & 0xC00000)) { - // nr <<= 2; - // idx += 2; - // } - // if (!(nr & 0x800000)) { - // nr <<= 1; - // idx += 1; - // } - // - // // Isolate top 9 bits of the denominator, to be used as index into the initial estimation table - // uint32_t tidx = nr >> 15; // top 9 bits. bit8 is always set - // uint32_t ie = inv_tab[tidx & 0xFF] + 256; // Get the table value. bit9 is always set - // uint32_t x = idx <= 8 ? (ie >> (8 - idx)) : (ie << (idx - 8)); // Position the estimation at the proper place - // - // // Now, refine estimation by newton-raphson. 1 iteration is enough - // x = uint32_t((x * uint64_t((1 << 25) - x * d)) >> 24); - // - // // Estimate remainder - // uint32_t r = (1 << 24) - x * d; - // - // // Check if we must adjust result - // if (r >= d) x++; - // - // // x holds the proper estimation - // return uint32_t(x); - // } - // - static uint32_t get_period_inverse(uint32_t d) { + #ifdef __AVR__ + /** + * This routine returns 0x1000000 / d, getting the inverse as fast as possible. + * A fast-converging iterative Newton-Raphson method can reach full precision in + * just 1 iteration, and takes 211 cycles (worst case; the mean case is less, up + * to 30 cycles for small divisors), instead of the 500 cycles a normal division + * would take. + * + * Inspired by the following page: + * https://stackoverflow.com/questions/27801397/newton-raphson-division-with-big-integers + * + * Suppose we want to calculate floor(2 ^ k / B) where B is a positive integer + * Then, B must be <= 2^k, otherwise, the quotient is 0. + * + * The Newton - Raphson iteration for x = B / 2 ^ k yields: + * q[n + 1] = q[n] * (2 - q[n] * B / 2 ^ k) + * + * This can be rearranged to: + * q[n + 1] = q[n] * (2 ^ (k + 1) - q[n] * B) >> k + * + * Each iteration requires only integer multiplications and bit shifts. + * It doesn't necessarily converge to floor(2 ^ k / B) but in the worst case + * it eventually alternates between floor(2 ^ k / B) and ceil(2 ^ k / B). + * So it checks for this case and extracts floor(2 ^ k / B). + * + * A simple but important optimization for this approach is to truncate + * multiplications (i.e., calculate only the higher bits of the product) in the + * early iterations of the Newton - Raphson method. This is done so the results + * of the early iterations are far from the quotient. Then it doesn't matter if + * they are done inaccurately. + * It's important to pick a good starting value for x. Knowing how many + * digits the divisor has, it can be estimated: + * + * 2^k / x = 2 ^ log2(2^k / x) + * 2^k / x = 2 ^(log2(2^k)-log2(x)) + * 2^k / x = 2 ^(k*log2(2)-log2(x)) + * 2^k / x = 2 ^ (k-log2(x)) + * 2^k / x >= 2 ^ (k-floor(log2(x))) + * floor(log2(x)) is simply the index of the most significant bit set. + * + * If this estimation can be improved even further the number of iterations can be + * reduced a lot, saving valuable execution time. + * The paper "Software Integer Division" by Thomas L.Rodeheffer, Microsoft + * Research, Silicon Valley,August 26, 2008, available at + * https://www.microsoft.com/en-us/research/wp-content/uploads/2008/08/tr-2008-141.pdf + * suggests, for its integer division algorithm, using a table to supply the first + * 8 bits of precision, then, due to the quadratic convergence nature of the + * Newton-Raphon iteration, just 2 iterations should be enough to get maximum + * precision of the division. + * By precomputing values of inverses for small denominator values, just one + * Newton-Raphson iteration is enough to reach full precision. + * This code uses the top 9 bits of the denominator as index. + * + * The AVR assembly function implements this C code using the data below: + * + * // For small divisors, it is best to directly retrieve the results + * if (d <= 110) return pgm_read_dword(&small_inv_tab[d]); + * + * // Compute initial estimation of 0x1000000/x - + * // Get most significant bit set on divider + * uint8_t idx = 0; + * uint32_t nr = d; + * if (!(nr & 0xFF0000)) { + * nr <<= 8; idx += 8; + * if (!(nr & 0xFF0000)) { nr <<= 8; idx += 8; } + * } + * if (!(nr & 0xF00000)) { nr <<= 4; idx += 4; } + * if (!(nr & 0xC00000)) { nr <<= 2; idx += 2; } + * if (!(nr & 0x800000)) { nr <<= 1; idx += 1; } + * + * // Isolate top 9 bits of the denominator, to be used as index into the initial estimation table + * uint32_t tidx = nr >> 15, // top 9 bits. bit8 is always set + * ie = inv_tab[tidx & 0xFF] + 256, // Get the table value. bit9 is always set + * x = idx <= 8 ? (ie >> (8 - idx)) : (ie << (idx - 8)); // Position the estimation at the proper place + * + * x = uint32_t((x * uint64_t(_BV(25) - x * d)) >> 24); // Refine estimation by newton-raphson. 1 iteration is enough + * const uint32_t r = _BV(24) - x * d; // Estimate remainder + * if (r >= d) x++; // Check whether to adjust result + * return uint32_t(x); // x holds the proper estimation + * + */ + static uint32_t get_period_inverse(uint32_t d) { - static const uint8_t inv_tab[256] PROGMEM = { - 255,253,252,250,248,246,244,242,240,238,236,234,233,231,229,227, - 225,224,222,220,218,217,215,213,212,210,208,207,205,203,202,200, - 199,197,195,194,192,191,189,188,186,185,183,182,180,179,178,176, - 175,173,172,170,169,168,166,165,164,162,161,160,158,157,156,154, - 153,152,151,149,148,147,146,144,143,142,141,139,138,137,136,135, - 134,132,131,130,129,128,127,126,125,123,122,121,120,119,118,117, - 116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101, - 100,99,98,97,96,95,94,93,92,91,90,89,88,88,87,86, - 85,84,83,82,81,80,80,79,78,77,76,75,74,74,73,72, - 71,70,70,69,68,67,66,66,65,64,63,62,62,61,60,59, - 59,58,57,56,56,55,54,53,53,52,51,50,50,49,48,48, - 47,46,46,45,44,43,43,42,41,41,40,39,39,38,37,37, - 36,35,35,34,33,33,32,32,31,30,30,29,28,28,27,27, - 26,25,25,24,24,23,22,22,21,21,20,19,19,18,18,17, - 17,16,15,15,14,14,13,13,12,12,11,10,10,9,9,8, - 8,7,7,6,6,5,5,4,4,3,3,2,2,1,0,0 - }; + static const uint8_t inv_tab[256] PROGMEM = { + 255,253,252,250,248,246,244,242,240,238,236,234,233,231,229,227, + 225,224,222,220,218,217,215,213,212,210,208,207,205,203,202,200, + 199,197,195,194,192,191,189,188,186,185,183,182,180,179,178,176, + 175,173,172,170,169,168,166,165,164,162,161,160,158,157,156,154, + 153,152,151,149,148,147,146,144,143,142,141,139,138,137,136,135, + 134,132,131,130,129,128,127,126,125,123,122,121,120,119,118,117, + 116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101, + 100,99,98,97,96,95,94,93,92,91,90,89,88,88,87,86, + 85,84,83,82,81,80,80,79,78,77,76,75,74,74,73,72, + 71,70,70,69,68,67,66,66,65,64,63,62,62,61,60,59, + 59,58,57,56,56,55,54,53,53,52,51,50,50,49,48,48, + 47,46,46,45,44,43,43,42,41,41,40,39,39,38,37,37, + 36,35,35,34,33,33,32,32,31,30,30,29,28,28,27,27, + 26,25,25,24,24,23,22,22,21,21,20,19,19,18,18,17, + 17,16,15,15,14,14,13,13,12,12,11,10,10,9,9,8, + 8,7,7,6,6,5,5,4,4,3,3,2,2,1,0,0 + }; - // For small denominators, it is cheaper to directly store the result. - // For bigger ones, just ONE Newton-Raphson iteration is enough to get - // maximum precision we need - static const uint32_t small_inv_tab[111] PROGMEM = { - 16777216,16777216,8388608,5592405,4194304,3355443,2796202,2396745,2097152,1864135,1677721,1525201,1398101,1290555,1198372,1118481, - 1048576,986895,932067,883011,838860,798915,762600,729444,699050,671088,645277,621378,599186,578524,559240,541200, - 524288,508400,493447,479349,466033,453438,441505,430185,419430,409200,399457,390167,381300,372827,364722,356962, - 349525,342392,335544,328965,322638,316551,310689,305040,299593,294337,289262,284359,279620,275036,270600,266305, - 262144,258111,254200,250406,246723,243148,239674,236298,233016,229824,226719,223696,220752,217885,215092,212369, - 209715,207126,204600,202135,199728,197379,195083,192841,190650,188508,186413,184365,182361,180400,178481,176602, - 174762,172960,171196,169466,167772,166111,164482,162885,161319,159783,158275,156796,155344,153919,152520 - }; + // For small denominators, it is cheaper to directly store the result. + // For bigger ones, just ONE Newton-Raphson iteration is enough to get + // maximum precision we need + static const uint32_t small_inv_tab[111] PROGMEM = { + 16777216,16777216,8388608,5592405,4194304,3355443,2796202,2396745,2097152,1864135,1677721,1525201,1398101,1290555,1198372,1118481, + 1048576,986895,932067,883011,838860,798915,762600,729444,699050,671088,645277,621378,599186,578524,559240,541200, + 524288,508400,493447,479349,466033,453438,441505,430185,419430,409200,399457,390167,381300,372827,364722,356962, + 349525,342392,335544,328965,322638,316551,310689,305040,299593,294337,289262,284359,279620,275036,270600,266305, + 262144,258111,254200,250406,246723,243148,239674,236298,233016,229824,226719,223696,220752,217885,215092,212369, + 209715,207126,204600,202135,199728,197379,195083,192841,190650,188508,186413,184365,182361,180400,178481,176602, + 174762,172960,171196,169466,167772,166111,164482,162885,161319,159783,158275,156796,155344,153919,152520 + }; - // For small divisors, it is best to directly retrieve the results - if (d <= 110) - return pgm_read_dword(&small_inv_tab[d]); + // For small divisors, it is best to directly retrieve the results + if (d <= 110) return pgm_read_dword(&small_inv_tab[d]); - register uint8_t r8 = d & 0xFF; - register uint8_t r9 = (d >> 8) & 0xFF; - register uint8_t r10 = (d >> 16) & 0xFF; - register uint8_t r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; - register const uint8_t* ptab = inv_tab; + register uint8_t r8 = d & 0xFF, + r9 = (d >> 8) & 0xFF, + r10 = (d >> 16) & 0xFF, + r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; + register const uint8_t* ptab = inv_tab; - __asm__ __volatile__( - // %8:%7:%6 = interval - // r31:r30: MUST be those registers, and they must point to the inv_tab + __asm__ __volatile__( + // %8:%7:%6 = interval + // r31:r30: MUST be those registers, and they must point to the inv_tab - A("clr %13") // %13 = 0 + A("clr %13") // %13 = 0 - // Now we must compute - // result = 0xFFFFFF / d - // %8:%7:%6 = interval - // %16:%15:%14 = nr - // %13 = 0 + // Now we must compute + // result = 0xFFFFFF / d + // %8:%7:%6 = interval + // %16:%15:%14 = nr + // %13 = 0 - // A plain division of 24x24 bits should take 388 cycles to complete. We will - // use Newton-Raphson for the calculation, and will strive to get way less cycles - // for the same result - Using C division, it takes 500cycles to complete . + // A plain division of 24x24 bits should take 388 cycles to complete. We will + // use Newton-Raphson for the calculation, and will strive to get way less cycles + // for the same result - Using C division, it takes 500cycles to complete . - A("clr %3") // idx = 0 - A("mov %14,%6") - A("mov %15,%7") - A("mov %16,%8") // nr = interval - A("tst %16") // nr & 0xFF0000 == 0 ? - A("brne 2f") // No, skip this - A("mov %16,%15") - A("mov %15,%14") // nr <<= 8, %14 not needed - A("subi %3,-8") // idx += 8 - A("tst %16") // nr & 0xFF0000 == 0 ? - A("brne 2f") // No, skip this - A("mov %16,%15") // nr <<= 8, %14 not needed - A("clr %15") // We clear %14 - A("subi %3,-8") // idx += 8 + A("clr %3") // idx = 0 + A("mov %14,%6") + A("mov %15,%7") + A("mov %16,%8") // nr = interval + A("tst %16") // nr & 0xFF0000 == 0 ? + A("brne 2f") // No, skip this + A("mov %16,%15") + A("mov %15,%14") // nr <<= 8, %14 not needed + A("subi %3,-8") // idx += 8 + A("tst %16") // nr & 0xFF0000 == 0 ? + A("brne 2f") // No, skip this + A("mov %16,%15") // nr <<= 8, %14 not needed + A("clr %15") // We clear %14 + A("subi %3,-8") // idx += 8 - // here %16 != 0 and %16:%15 contains at least 9 MSBits, or both %16:%15 are 0 - L("2") - A("cpi %16,0x10") // (nr & 0xF00000) == 0 ? - A("brcc 3f") // No, skip this - A("swap %15") // Swap nibbles - A("swap %16") // Swap nibbles. Low nibble is 0 - A("mov %14, %15") - A("andi %14,0x0F") // Isolate low nibble - A("andi %15,0xF0") // Keep proper nibble in %15 - A("or %16, %14") // %16:%15 <<= 4 - A("subi %3,-4") // idx += 4 + // here %16 != 0 and %16:%15 contains at least 9 MSBits, or both %16:%15 are 0 + L("2") + A("cpi %16,0x10") // (nr & 0xF00000) == 0 ? + A("brcc 3f") // No, skip this + A("swap %15") // Swap nibbles + A("swap %16") // Swap nibbles. Low nibble is 0 + A("mov %14, %15") + A("andi %14,0x0F") // Isolate low nibble + A("andi %15,0xF0") // Keep proper nibble in %15 + A("or %16, %14") // %16:%15 <<= 4 + A("subi %3,-4") // idx += 4 - L("3") - A("cpi %16,0x40") // (nr & 0xC00000) == 0 ? - A("brcc 4f") // No, skip this - A("add %15,%15") - A("adc %16,%16") - A("add %15,%15") - A("adc %16,%16") // %16:%15 <<= 2 - A("subi %3,-2") // idx += 2 + L("3") + A("cpi %16,0x40") // (nr & 0xC00000) == 0 ? + A("brcc 4f") // No, skip this + A("add %15,%15") + A("adc %16,%16") + A("add %15,%15") + A("adc %16,%16") // %16:%15 <<= 2 + A("subi %3,-2") // idx += 2 - L("4") - A("cpi %16,0x80") // (nr & 0x800000) == 0 ? - A("brcc 5f") // No, skip this - A("add %15,%15") - A("adc %16,%16") // %16:%15 <<= 1 - A("inc %3") // idx += 1 + L("4") + A("cpi %16,0x80") // (nr & 0x800000) == 0 ? + A("brcc 5f") // No, skip this + A("add %15,%15") + A("adc %16,%16") // %16:%15 <<= 1 + A("inc %3") // idx += 1 - // Now %16:%15 contains its MSBit set to 1, or %16:%15 is == 0. We are now absolutely sure - // we have at least 9 MSBits available to enter the initial estimation table - L("5") - A("add %15,%15") - A("adc %16,%16") // %16:%15 = tidx = (nr <<= 1), we lose the top MSBit (always set to 1, %16 is the index into the inverse table) - A("add r30,%16") // Only use top 8 bits - A("adc r31,%13") // r31:r30 = inv_tab + (tidx) - A("lpm %14, Z") // %14 = inv_tab[tidx] - A("ldi %15, 1") // %15 = 1 %15:%14 = inv_tab[tidx] + 256 + // Now %16:%15 contains its MSBit set to 1, or %16:%15 is == 0. We are now absolutely sure + // we have at least 9 MSBits available to enter the initial estimation table + L("5") + A("add %15,%15") + A("adc %16,%16") // %16:%15 = tidx = (nr <<= 1), we lose the top MSBit (always set to 1, %16 is the index into the inverse table) + A("add r30,%16") // Only use top 8 bits + A("adc r31,%13") // r31:r30 = inv_tab + (tidx) + A("lpm %14, Z") // %14 = inv_tab[tidx] + A("ldi %15, 1") // %15 = 1 %15:%14 = inv_tab[tidx] + 256 - // We must scale the approximation to the proper place - A("clr %16") // %16 will always be 0 here - A("subi %3,8") // idx == 8 ? - A("breq 6f") // yes, no need to scale - A("brcs 7f") // If C=1, means idx < 8, result was negative! + // We must scale the approximation to the proper place + A("clr %16") // %16 will always be 0 here + A("subi %3,8") // idx == 8 ? + A("breq 6f") // yes, no need to scale + A("brcs 7f") // If C=1, means idx < 8, result was negative! - // idx > 8, now %3 = idx - 8. We must perform a left shift. idx range:[1-8] - A("sbrs %3,0") // shift by 1bit position? - A("rjmp 8f") // No - A("add %14,%14") - A("adc %15,%15") // %15:16 <<= 1 - L("8") - A("sbrs %3,1") // shift by 2bit position? - A("rjmp 9f") // No - A("add %14,%14") - A("adc %15,%15") - A("add %14,%14") - A("adc %15,%15") // %15:16 <<= 1 - L("9") - A("sbrs %3,2") // shift by 4bits position? - A("rjmp 16f") // No - A("swap %15") // Swap nibbles. lo nibble of %15 will always be 0 - A("swap %14") // Swap nibbles - A("mov %12,%14") - A("andi %12,0x0F") // isolate low nibble - A("andi %14,0xF0") // and clear it - A("or %15,%12") // %15:%16 <<= 4 - L("16") - A("sbrs %3,3") // shift by 8bits position? - A("rjmp 6f") // No, we are done - A("mov %16,%15") - A("mov %15,%14") - A("clr %14") - A("jmp 6f") + // idx > 8, now %3 = idx - 8. We must perform a left shift. idx range:[1-8] + A("sbrs %3,0") // shift by 1bit position? + A("rjmp 8f") // No + A("add %14,%14") + A("adc %15,%15") // %15:16 <<= 1 + L("8") + A("sbrs %3,1") // shift by 2bit position? + A("rjmp 9f") // No + A("add %14,%14") + A("adc %15,%15") + A("add %14,%14") + A("adc %15,%15") // %15:16 <<= 1 + L("9") + A("sbrs %3,2") // shift by 4bits position? + A("rjmp 16f") // No + A("swap %15") // Swap nibbles. lo nibble of %15 will always be 0 + A("swap %14") // Swap nibbles + A("mov %12,%14") + A("andi %12,0x0F") // isolate low nibble + A("andi %14,0xF0") // and clear it + A("or %15,%12") // %15:%16 <<= 4 + L("16") + A("sbrs %3,3") // shift by 8bits position? + A("rjmp 6f") // No, we are done + A("mov %16,%15") + A("mov %15,%14") + A("clr %14") + A("jmp 6f") - // idx < 8, now %3 = idx - 8. Get the count of bits - L("7") - A("neg %3") // %3 = -idx = count of bits to move right. idx range:[1...8] - A("sbrs %3,0") // shift by 1 bit position ? - A("rjmp 10f") // No, skip it - A("asr %15") // (bit7 is always 0 here) - A("ror %14") - L("10") - A("sbrs %3,1") // shift by 2 bit position ? - A("rjmp 11f") // No, skip it - A("asr %15") // (bit7 is always 0 here) - A("ror %14") - A("asr %15") // (bit7 is always 0 here) - A("ror %14") - L("11") - A("sbrs %3,2") // shift by 4 bit position ? - A("rjmp 12f") // No, skip it - A("swap %15") // Swap nibbles - A("andi %14, 0xF0") // Lose the lowest nibble - A("swap %14") // Swap nibbles. Upper nibble is 0 - A("or %14,%15") // Pass nibble from upper byte - A("andi %15, 0x0F") // And get rid of that nibble - L("12") - A("sbrs %3,3") // shift by 8 bit position ? - A("rjmp 6f") // No, skip it - A("mov %14,%15") - A("clr %15") - L("6") // %16:%15:%14 = initial estimation of 0x1000000 / d) + // idx < 8, now %3 = idx - 8. Get the count of bits + L("7") + A("neg %3") // %3 = -idx = count of bits to move right. idx range:[1...8] + A("sbrs %3,0") // shift by 1 bit position ? + A("rjmp 10f") // No, skip it + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + L("10") + A("sbrs %3,1") // shift by 2 bit position ? + A("rjmp 11f") // No, skip it + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + L("11") + A("sbrs %3,2") // shift by 4 bit position ? + A("rjmp 12f") // No, skip it + A("swap %15") // Swap nibbles + A("andi %14, 0xF0") // Lose the lowest nibble + A("swap %14") // Swap nibbles. Upper nibble is 0 + A("or %14,%15") // Pass nibble from upper byte + A("andi %15, 0x0F") // And get rid of that nibble + L("12") + A("sbrs %3,3") // shift by 8 bit position ? + A("rjmp 6f") // No, skip it + A("mov %14,%15") + A("clr %15") + L("6") // %16:%15:%14 = initial estimation of 0x1000000 / d - // Now, we must refine the estimation present on %16:%15:%14 using 1 iteration - // of Newton-Raphson. As it has a quadratic convergence, 1 iteration is enough - // to get more than 18bits of precision (the initial table lookup gives 9 bits of - // precision to start from). 18bits of precision is all what is needed here for result + // Now, we must refine the estimation present on %16:%15:%14 using 1 iteration + // of Newton-Raphson. As it has a quadratic convergence, 1 iteration is enough + // to get more than 18bits of precision (the initial table lookup gives 9 bits of + // precision to start from). 18bits of precision is all what is needed here for result - // %8:%7:%6 = d = interval - // %16:%15:%14 = x = initial estimation of 0x1000000 / d - // %13 = 0 - // %3:%2:%1:%0 = working accumulator + // %8:%7:%6 = d = interval + // %16:%15:%14 = x = initial estimation of 0x1000000 / d + // %13 = 0 + // %3:%2:%1:%0 = working accumulator - // Compute 1<<25 - x*d. Result should never exceed 25 bits and should always be positive - A("clr %0") - A("clr %1") - A("clr %2") - A("ldi %3,2") // %3:%2:%1:%0 = 0x2000000 - A("mul %6,%14") // r1:r0 = LO(d) * LO(x) - A("sub %0,r0") - A("sbc %1,r1") - A("sbc %2,%13") - A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) - A("mul %7,%14") // r1:r0 = MI(d) * LO(x) - A("sub %1,r0") - A("sbc %2,r1") - A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 - A("mul %8,%14") // r1:r0 = HI(d) * LO(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 - A("mul %6,%15") // r1:r0 = LO(d) * MI(x) - A("sub %1,r0") - A("sbc %2,r1") - A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 - A("mul %7,%15") // r1:r0 = MI(d) * MI(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 - A("mul %8,%15") // r1:r0 = HI(d) * MI(x) - A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 - A("mul %6,%16") // r1:r0 = LO(d) * HI(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 - A("mul %7,%16") // r1:r0 = MI(d) * HI(x) - A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 - // %3:%2:%1:%0 = (1<<25) - x*d [169] + // Compute 1<<25 - x*d. Result should never exceed 25 bits and should always be positive + A("clr %0") + A("clr %1") + A("clr %2") + A("ldi %3,2") // %3:%2:%1:%0 = 0x2000000 + A("mul %6,%14") // r1:r0 = LO(d) * LO(x) + A("sub %0,r0") + A("sbc %1,r1") + A("sbc %2,%13") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) + A("mul %7,%14") // r1:r0 = MI(d) * LO(x) + A("sub %1,r0") + A("sbc %2,r1" ) + A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 + A("mul %8,%14") // r1:r0 = HI(d) * LO(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 + A("mul %6,%15") // r1:r0 = LO(d) * MI(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 + A("mul %7,%15") // r1:r0 = MI(d) * MI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 + A("mul %8,%15") // r1:r0 = HI(d) * MI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 + A("mul %6,%16") // r1:r0 = LO(d) * HI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 + A("mul %7,%16") // r1:r0 = MI(d) * HI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 + // %3:%2:%1:%0 = (1<<25) - x*d [169] - // We need to multiply that result by x, and we are only interested in the top 24bits of that multiply + // We need to multiply that result by x, and we are only interested in the top 24bits of that multiply - // %16:%15:%14 = x = initial estimation of 0x1000000 / d - // %3:%2:%1:%0 = (1<<25) - x*d = acc - // %13 = 0 + // %16:%15:%14 = x = initial estimation of 0x1000000 / d + // %3:%2:%1:%0 = (1<<25) - x*d = acc + // %13 = 0 - // result = %11:%10:%9:%5:%4 - A("mul %14,%0") // r1:r0 = LO(x) * LO(acc) - A("mov %4,r1") - A("clr %5") - A("clr %9") - A("clr %10") - A("clr %11") // %11:%10:%9:%5:%4 = LO(x) * LO(acc) >> 8 - A("mul %15,%0") // r1:r0 = MI(x) * LO(acc) - A("add %4,r0") - A("adc %5,r1") - A("adc %9,%13") - A("adc %10,%13") - A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) - A("mul %16,%0") // r1:r0 = HI(x) * LO(acc) - A("add %5,r0") - A("adc %9,r1") - A("adc %10,%13") - A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) << 8 + // result = %11:%10:%9:%5:%4 + A("mul %14,%0") // r1:r0 = LO(x) * LO(acc) + A("mov %4,r1") + A("clr %5") + A("clr %9") + A("clr %10") + A("clr %11") // %11:%10:%9:%5:%4 = LO(x) * LO(acc) >> 8 + A("mul %15,%0") // r1:r0 = MI(x) * LO(acc) + A("add %4,r0") + A("adc %5,r1") + A("adc %9,%13") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) + A("mul %16,%0") // r1:r0 = HI(x) * LO(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) << 8 - A("mul %14,%1") // r1:r0 = LO(x) * MIL(acc) - A("add %4,r0") - A("adc %5,r1") - A("adc %9,%13") - A("adc %10,%13") - A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIL(acc) - A("mul %15,%1") // r1:r0 = MI(x) * MIL(acc) - A("add %5,r0") - A("adc %9,r1") - A("adc %10,%13") - A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 8 - A("mul %16,%1") // r1:r0 = HI(x) * MIL(acc) - A("add %9,r0") - A("adc %10,r1") - A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 16 + A("mul %14,%1") // r1:r0 = LO(x) * MIL(acc) + A("add %4,r0") + A("adc %5,r1") + A("adc %9,%13") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIL(acc) + A("mul %15,%1") // r1:r0 = MI(x) * MIL(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 8 + A("mul %16,%1") // r1:r0 = HI(x) * MIL(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 16 - A("mul %14,%2") // r1:r0 = LO(x) * MIH(acc) - A("add %5,r0") - A("adc %9,r1") - A("adc %10,%13") - A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIH(acc) << 8 - A("mul %15,%2") // r1:r0 = MI(x) * MIH(acc) - A("add %9,r0") - A("adc %10,r1") - A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 16 - A("mul %16,%2") // r1:r0 = HI(x) * MIH(acc) - A("add %10,r0") - A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 24 + A("mul %14,%2") // r1:r0 = LO(x) * MIH(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIH(acc) << 8 + A("mul %15,%2") // r1:r0 = MI(x) * MIH(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 16 + A("mul %16,%2") // r1:r0 = HI(x) * MIH(acc) + A("add %10,r0") + A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 24 - A("mul %14,%3") // r1:r0 = LO(x) * HI(acc) - A("add %9,r0") - A("adc %10,r1") - A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * HI(acc) << 16 - A("mul %15,%3") // r1:r0 = MI(x) * HI(acc) - A("add %10,r0") - A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 24 - A("mul %16,%3") // r1:r0 = HI(x) * HI(acc) - A("add %11,r0") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 32 + A("mul %14,%3") // r1:r0 = LO(x) * HI(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * HI(acc) << 16 + A("mul %15,%3") // r1:r0 = MI(x) * HI(acc) + A("add %10,r0") + A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 24 + A("mul %16,%3") // r1:r0 = HI(x) * HI(acc) + A("add %11,r0") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 32 - // At this point, %11:%10:%9 contains the new estimation of x. + // At this point, %11:%10:%9 contains the new estimation of x. - // Finally, we must correct the result. Estimate remainder as - // (1<<24) - x*d - // %11:%10:%9 = x - // %8:%7:%6 = d = interval" "\n\t" - A("ldi %3,1") - A("clr %2") - A("clr %1") - A("clr %0") // %3:%2:%1:%0 = 0x1000000 - A("mul %6,%9") // r1:r0 = LO(d) * LO(x) - A("sub %0,r0") - A("sbc %1,r1") - A("sbc %2,%13") - A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) - A("mul %7,%9") // r1:r0 = MI(d) * LO(x) - A("sub %1,r0") - A("sbc %2,r1") - A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 - A("mul %8,%9") // r1:r0 = HI(d) * LO(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 - A("mul %6,%10") // r1:r0 = LO(d) * MI(x) - A("sub %1,r0") - A("sbc %2,r1") - A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 - A("mul %7,%10") // r1:r0 = MI(d) * MI(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 - A("mul %8,%10") // r1:r0 = HI(d) * MI(x) - A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 - A("mul %6,%11") // r1:r0 = LO(d) * HI(x) - A("sub %2,r0") - A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 - A("mul %7,%11") // r1:r0 = MI(d) * HI(x) - A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 - // %3:%2:%1:%0 = r = (1<<24) - x*d - // %8:%7:%6 = d = interval + // Finally, we must correct the result. Estimate remainder as + // (1<<24) - x*d + // %11:%10:%9 = x + // %8:%7:%6 = d = interval" "\n\t" + A("ldi %3,1") + A("clr %2") + A("clr %1") + A("clr %0") // %3:%2:%1:%0 = 0x1000000 + A("mul %6,%9") // r1:r0 = LO(d) * LO(x) + A("sub %0,r0") + A("sbc %1,r1") + A("sbc %2,%13") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) + A("mul %7,%9") // r1:r0 = MI(d) * LO(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 + A("mul %8,%9") // r1:r0 = HI(d) * LO(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 + A("mul %6,%10") // r1:r0 = LO(d) * MI(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 + A("mul %7,%10") // r1:r0 = MI(d) * MI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 + A("mul %8,%10") // r1:r0 = HI(d) * MI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 + A("mul %6,%11") // r1:r0 = LO(d) * HI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 + A("mul %7,%11") // r1:r0 = MI(d) * HI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 + // %3:%2:%1:%0 = r = (1<<24) - x*d + // %8:%7:%6 = d = interval - // Perform the final correction - A("sub %0,%6") - A("sbc %1,%7") - A("sbc %2,%8") // r -= d - A("brcs 14f") // if ( r >= d) + // Perform the final correction + A("sub %0,%6") + A("sbc %1,%7") + A("sbc %2,%8") // r -= d + A("brcs 14f") // if ( r >= d) - // %11:%10:%9 = x - A("ldi %3,1") - A("add %9,%3") - A("adc %10,%13") - A("adc %11,%13") // x++ - L("14") + // %11:%10:%9 = x + A("ldi %3,1") + A("add %9,%3") + A("adc %10,%13") + A("adc %11,%13") // x++ + L("14") - // Estimation is done. %11:%10:%9 = x - A("clr __zero_reg__") // Make C runtime happy - // [211 cycles total] - : "=r" (r2), - "=r" (r3), - "=r" (r4), - "=d" (r5), - "=r" (r6), - "=r" (r7), - "+r" (r8), - "+r" (r9), - "+r" (r10), - "=d" (r11), - "=r" (r12), - "=r" (r13), - "=d" (r14), - "=d" (r15), - "=d" (r16), - "=d" (r17), - "=d" (r18), - "+z" (ptab) - : - : "r0", "r1", "cc" - ); + // Estimation is done. %11:%10:%9 = x + A("clr __zero_reg__") // Make C runtime happy + // [211 cycles total] + : "=r" (r2), + "=r" (r3), + "=r" (r4), + "=d" (r5), + "=r" (r6), + "=r" (r7), + "+r" (r8), + "+r" (r9), + "+r" (r10), + "=d" (r11), + "=r" (r12), + "=r" (r13), + "=d" (r14), + "=d" (r15), + "=d" (r16), + "=d" (r17), + "=d" (r18), + "+z" (ptab) + : + : "r0", "r1", "cc" + ); - // Return the result - return r11 | (uint16_t(r12) << 8) | (uint32_t(r13) << 16); - } - -#endif // BEZIER_JERK_CONTROL + // Return the result + return r11 | (uint16_t(r12) << 8) | (uint32_t(r13) << 16); + } + #else + // All other 32-bit MPUs can easily do inverse using hardware division, + // so we don't need to reduce precision or to use assembly language at all. + // This routine, for all other archs, returns 0x100000000 / d ~= 0xFFFFFFFF / d + static FORCE_INLINE uint32_t get_period_inverse(const uint32_t d) { return 0xFFFFFFFF / d; } + #endif +#endif #define MINIMAL_STEP_RATE 120 @@ -719,41 +701,41 @@ void Planner::init() { * by the provided factors. */ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor) { + uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) // Limit minimal step rate (Otherwise the timer will overflow.) - NOLESS(initial_rate, MINIMAL_STEP_RATE); - NOLESS(final_rate, MINIMAL_STEP_RATE); + NOLESS(initial_rate, uint32_t(MINIMAL_STEP_RATE)); + NOLESS(final_rate, uint32_t(MINIMAL_STEP_RATE)); - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) uint32_t cruise_rate = initial_rate; #endif const int32_t accel = block->acceleration_steps_per_s2; // Steps required for acceleration, deceleration to/from nominal rate - int32_t accelerate_steps = CEIL(estimate_acceleration_distance(initial_rate, block->nominal_rate, accel)), - decelerate_steps = FLOOR(estimate_acceleration_distance(block->nominal_rate, final_rate, -accel)), + uint32_t accelerate_steps = CEIL(estimate_acceleration_distance(initial_rate, block->nominal_rate, accel)), + decelerate_steps = FLOOR(estimate_acceleration_distance(block->nominal_rate, final_rate, -accel)); // Steps between acceleration and deceleration, if any - plateau_steps = block->step_event_count - accelerate_steps - decelerate_steps; + int32_t plateau_steps = block->step_event_count - accelerate_steps - decelerate_steps; // Does accelerate_steps + decelerate_steps exceed step_event_count? // Then we can't possibly reach the nominal rate, there will be no cruising. // Use intersection_distance() to calculate accel / braking time in order to // reach the final_rate exactly at the end of this block. if (plateau_steps < 0) { - accelerate_steps = CEIL(intersection_distance(initial_rate, final_rate, accel, block->step_event_count)); - NOLESS(accelerate_steps, 0); // Check limits due to numerical round-off - accelerate_steps = min((uint32_t)accelerate_steps, block->step_event_count);//(We can cast here to unsigned, because the above line ensures that we are above zero) + const float accelerate_steps_float = CEIL(intersection_distance(initial_rate, final_rate, accel, block->step_event_count)); + accelerate_steps = MIN(uint32_t(MAX(accelerate_steps_float, 0)), block->step_event_count); plateau_steps = 0; - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) // We won't reach the cruising rate. Let's calculate the speed we will reach cruise_rate = final_speed(initial_rate, accel, accelerate_steps); #endif } - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) else // We have some plateau time, so the cruise rate will be the nominal rate cruise_rate = block->nominal_rate; #endif @@ -761,10 +743,10 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e // block->accelerate_until = accelerate_steps; // block->decelerate_after = accelerate_steps+plateau_steps; - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) // Jerk controlled speed requires to express speed versus time, NOT steps - uint32_t acceleration_time = ((float)(cruise_rate - initial_rate) / accel) * (HAL_STEPPER_TIMER_RATE), - deceleration_time = ((float)(cruise_rate - final_rate) / accel) * (HAL_STEPPER_TIMER_RATE); + uint32_t acceleration_time = ((float)(cruise_rate - initial_rate) / accel) * (STEPPER_TIMER_RATE), + deceleration_time = ((float)(cruise_rate - final_rate) / accel) * (STEPPER_TIMER_RATE); // And to offload calculations from the ISR, we also calculate the inverse of those times here uint32_t acceleration_time_inverse = get_period_inverse(acceleration_time); @@ -772,12 +754,16 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e #endif - CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section - if (!TEST(block->flag, BLOCK_BIT_BUSY)) { // Don't update variables if block is busy. + // Fill variables used by the stepper in a critical section + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + // Don't update variables if block is busy: It is being interpreted by the planner + if (!TEST(block->flag, BLOCK_BIT_BUSY)) { block->accelerate_until = accelerate_steps; block->decelerate_after = accelerate_steps + plateau_steps; block->initial_rate = initial_rate; - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) block->acceleration_time = acceleration_time; block->deceleration_time = deceleration_time; block->acceleration_time_inverse = acceleration_time_inverse; @@ -786,100 +772,209 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e #endif block->final_rate = final_rate; } - CRITICAL_SECTION_END; + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); } -// "Junction jerk" in this context is the immediate change in speed at the junction of two blocks. -// This method will calculate the junction jerk as the euclidean distance between the nominal -// velocities of the respective blocks. -//inline float junction_jerk(block_t *before, block_t *after) { -// return SQRT( -// POW((before->speed_x-after->speed_x), 2)+POW((before->speed_y-after->speed_y), 2)); -//} +/* PLANNER SPEED DEFINITION + +--------+ <- current->nominal_speed + / \ + current->entry_speed -> + \ + | + <- next->entry_speed (aka exit speed) + +-------------+ + time --> + Recalculates the motion plan according to the following basic guidelines: + + 1. Go over every feasible block sequentially in reverse order and calculate the junction speeds + (i.e. current->entry_speed) such that: + a. No junction speed exceeds the pre-computed maximum junction speed limit or nominal speeds of + neighboring blocks. + b. A block entry speed cannot exceed one reverse-computed from its exit speed (next->entry_speed) + with a maximum allowable deceleration over the block travel distance. + c. The last (or newest appended) block is planned from a complete stop (an exit speed of zero). + 2. Go over every block in chronological (forward) order and dial down junction speed values if + a. The exit speed exceeds the one forward-computed from its entry speed with the maximum allowable + acceleration over the block travel distance. + + When these stages are complete, the planner will have maximized the velocity profiles throughout the all + of the planner blocks, where every block is operating at its maximum allowable acceleration limits. In + other words, for all of the blocks in the planner, the plan is optimal and no further speed improvements + are possible. If a new block is added to the buffer, the plan is recomputed according to the said + guidelines for a new optimal plan. + + To increase computational efficiency of these guidelines, a set of planner block pointers have been + created to indicate stop-compute points for when the planner guidelines cannot logically make any further + changes or improvements to the plan when in normal operation and new blocks are streamed and added to the + planner buffer. For example, if a subset of sequential blocks in the planner have been planned and are + bracketed by junction velocities at their maximums (or by the first planner block as well), no new block + added to the planner buffer will alter the velocity profiles within them. So we no longer have to compute + them. Or, if a set of sequential blocks from the first block in the planner (or a optimal stop-compute + point) are all accelerating, they are all optimal and can not be altered by a new block added to the + planner buffer, as this will only further increase the plan speed to chronological blocks until a maximum + junction velocity is reached. However, if the operational conditions of the plan changes from infrequently + used feed holds or feedrate overrides, the stop-compute pointers will be reset and the entire plan is + recomputed as stated in the general guidelines. + + Planner buffer index mapping: + - block_buffer_tail: Points to the beginning of the planner buffer. First to be executed or being executed. + - block_buffer_head: Points to the buffer block after the last block in the buffer. Used to indicate whether + the buffer is full or empty. As described for standard ring buffers, this block is always empty. + - block_buffer_planned: Points to the first buffer block after the last optimally planned block for normal + streaming operating conditions. Use for planning optimizations by avoiding recomputing parts of the + planner buffer that don't change with the addition of a new block, as describe above. In addition, + this block can never be less than block_buffer_tail and will always be pushed forward and maintain + this requirement when encountered by the plan_discard_current_block() routine during a cycle. + + NOTE: Since the planner only computes on what's in the planner buffer, some motions with lots of short + line segments, like G2/3 arcs or complex curves, may seem to move slow. This is because there simply isn't + enough combined distance traveled in the entire buffer to accelerate up to the nominal speed and then + decelerate to a complete stop at the end of the buffer, as stated by the guidelines. If this happens and + becomes an annoyance, there are a few simple solutions: (1) Maximize the machine acceleration. The planner + will be able to compute higher velocity profiles within the same combined distance. (2) Maximize line + motion(s) distance per block to a desired tolerance. The more combined distance the planner has to use, + the faster it can go. (3) Maximize the planner buffer size. This also will increase the combined distance + for the planner to compute over. It also increases the number of computations the planner has to perform + to compute an optimal plan, so select carefully. +*/ // The kernel called by recalculate() when scanning the plan from last to first entry. void Planner::reverse_pass_kernel(block_t* const current, const block_t * const next) { - if (!current || !next) return; - // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. - // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and - // check for maximum allowable speed reductions to ensure maximum possible planned speed. - float max_entry_speed = current->max_entry_speed; - if (current->entry_speed != max_entry_speed) { - // If nominal length true, max junction speed is guaranteed to be reached. Only compute - // for max allowable speed if block is decelerating and nominal length is false. - current->entry_speed = (TEST(current->flag, BLOCK_BIT_NOMINAL_LENGTH) || max_entry_speed <= next->entry_speed) - ? max_entry_speed - : min(max_entry_speed, max_allowable_speed(-current->acceleration, next->entry_speed, current->millimeters)); - SBI(current->flag, BLOCK_BIT_RECALCULATE); - } -} + if (current) { + // If entry speed is already at the maximum entry speed, and there was no change of speed + // in the next block, there is no need to recheck. Block is cruising and there is no need to + // compute anything for this block, + // If not, block entry speed needs to be recalculated to ensure maximum possible planned speed. + const float max_entry_speed_sqr = current->max_entry_speed_sqr; -/** - * recalculate() needs to go over the current plan twice. - * Once in reverse and once forward. This implements the reverse pass. - */ -void Planner::reverse_pass() { - if (movesplanned() > 2) { - const uint8_t endnr = BLOCK_MOD(block_buffer_tail + 1); // tail is running. tail+1 shouldn't be altered because it's connected to the running block. - uint8_t blocknr = prev_block_index(block_buffer_head); - block_t* current = &block_buffer[blocknr]; + // Compute maximum entry speed decelerating over the current block from its exit speed. + // If not at the maximum entry speed, or the previous block entry speed changed + if (current->entry_speed_sqr != max_entry_speed_sqr || (next && TEST(next->flag, BLOCK_BIT_RECALCULATE))) { - // Last/newest block in buffer: - const float max_entry_speed = current->max_entry_speed; - if (current->entry_speed != max_entry_speed) { - // If nominal length true, max junction speed is guaranteed to be reached. Only compute - // for max allowable speed if block is decelerating and nominal length is false. - current->entry_speed = TEST(current->flag, BLOCK_BIT_NOMINAL_LENGTH) - ? max_entry_speed - : min(max_entry_speed, max_allowable_speed(-current->acceleration, MINIMUM_PLANNER_SPEED, current->millimeters)); - SBI(current->flag, BLOCK_BIT_RECALCULATE); - } + // If nominal length true, max junction speed is guaranteed to be reached. + // If a block can de/ac-celerate from nominal speed to zero within the length of the block, then + // the current block and next block junction speeds are guaranteed to always be at their maximum + // junction speeds in deceleration and acceleration, respectively. This is due to how the current + // block nominal speed limits both the current and next maximum junction speeds. Hence, in both + // the reverse and forward planners, the corresponding block junction speed will always be at the + // the maximum junction speed and may always be ignored for any speed reduction checks. - do { - const block_t * const next = current; - blocknr = prev_block_index(blocknr); - current = &block_buffer[blocknr]; - reverse_pass_kernel(current, next); - } while (blocknr != endnr); - } -} + const float new_entry_speed_sqr = TEST(current->flag, BLOCK_BIT_NOMINAL_LENGTH) + ? max_entry_speed_sqr + : MIN(max_entry_speed_sqr, max_allowable_speed_sqr(-current->acceleration, next ? next->entry_speed_sqr : sq(MINIMUM_PLANNER_SPEED), current->millimeters)); + if (current->entry_speed_sqr != new_entry_speed_sqr) { + current->entry_speed_sqr = new_entry_speed_sqr; -// The kernel called by recalculate() when scanning the plan from first to last entry. -void Planner::forward_pass_kernel(const block_t * const previous, block_t* const current) { - if (!previous) return; - - // If the previous block is an acceleration block, but it is not long enough to complete the - // full speed change within the block, we need to adjust the entry speed accordingly. Entry - // speeds have already been reset, maximized, and reverse planned by reverse planner. - // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. - if (!TEST(previous->flag, BLOCK_BIT_NOMINAL_LENGTH)) { - if (previous->entry_speed < current->entry_speed) { - float entry_speed = min(current->entry_speed, - max_allowable_speed(-previous->acceleration, previous->entry_speed, previous->millimeters)); - // Check for junction speed change - if (current->entry_speed != entry_speed) { - current->entry_speed = entry_speed; + // Need to recalculate the block speed SBI(current->flag, BLOCK_BIT_RECALCULATE); } } } } +/** + * recalculate() needs to go over the current plan twice. + * Once in reverse and once forward. This implements the reverse pass. + */ +void Planner::reverse_pass() { + // Initialize block index to the last block in the planner buffer. + uint8_t block_index = prev_block_index(block_buffer_head); + + // Read the index of the last buffer planned block. + // The ISR may change it so get a stable local copy. + uint8_t planned_block_index = block_buffer_planned; + + // If there was a race condition and block_buffer_planned was incremented + // or was pointing at the head (queue empty) break loop now and avoid + // planning already consumed blocks + if (planned_block_index == block_buffer_head) return; + + // Reverse Pass: Coarsely maximize all possible deceleration curves back-planning from the last + // block in buffer. Cease planning when the last optimal planned or tail pointer is reached. + // NOTE: Forward pass will later refine and correct the reverse pass to create an optimal plan. + block_t *current; + const block_t *next = NULL; + while (block_index != planned_block_index) { + + // Perform the reverse pass + current = &block_buffer[block_index]; + + // Only consider non sync blocks + if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION)) { + reverse_pass_kernel(current, next); + next = current; + } + + // Advance to the next + block_index = prev_block_index(block_index); + } +} + +// The kernel called by recalculate() when scanning the plan from first to last entry. +void Planner::forward_pass_kernel(const block_t* const previous, block_t* const current, const uint8_t block_index) { + if (previous) { + // If the previous block is an acceleration block, too short to complete the full speed + // change, adjust the entry speed accordingly. Entry speeds have already been reset, + // maximized, and reverse-planned. If nominal length is set, max junction speed is + // guaranteed to be reached. No need to recheck. + if (!TEST(previous->flag, BLOCK_BIT_NOMINAL_LENGTH) && + previous->entry_speed_sqr < current->entry_speed_sqr) { + + // Compute the maximum allowable speed + const float new_entry_speed_sqr = max_allowable_speed_sqr(-previous->acceleration, previous->entry_speed_sqr, previous->millimeters); + + // If true, current block is full-acceleration and we can move the planned pointer forward. + if (new_entry_speed_sqr < current->entry_speed_sqr) { + + // Always <= max_entry_speed_sqr. Backward pass sets this. + current->entry_speed_sqr = new_entry_speed_sqr; // Always <= max_entry_speed_sqr. Backward pass sets this. + + // Set optimal plan pointer. + block_buffer_planned = block_index; + + // And mark we need to recompute the trapezoidal shape + SBI(current->flag, BLOCK_BIT_RECALCULATE); + } + } + + // Any block set at its maximum entry speed also creates an optimal plan up to this + // point in the buffer. When the plan is bracketed by either the beginning of the + // buffer and a maximum entry speed or two maximum entry speeds, every block in between + // cannot logically be further improved. Hence, we don't have to recompute them anymore. + if (current->entry_speed_sqr == current->max_entry_speed_sqr) + block_buffer_planned = block_index; + } +} + /** * recalculate() needs to go over the current plan twice. * Once in reverse and once forward. This implements the forward pass. */ void Planner::forward_pass() { - block_t* block[3] = { NULL, NULL, NULL }; - for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block[0] = block[1]; - block[1] = block[2]; - block[2] = &block_buffer[b]; - forward_pass_kernel(block[0], block[1]); + // Forward Pass: Forward plan the acceleration curve from the planned pointer onward. + // Also scans for optimal plan breakpoints and appropriately updates the planned pointer. + + // Begin at buffer planned pointer. Note that block_buffer_planned can be modified + // by the stepper ISR, so read it ONCE. It it guaranteed that block_buffer_planned + // will never lead head, so the loop is safe to execute. Also note that the forward + // pass will never modify the values at the tail. + uint8_t block_index = block_buffer_planned; + + block_t *current; + const block_t * previous = NULL; + while (block_index != block_buffer_head) { + + // Perform the forward pass + current = &block_buffer[block_index]; + + // Skip SYNC blocks + if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION)) { + forward_pass_kernel(previous, current, block_index); + previous = current; + } + // Advance to the previous + block_index = next_block_index(block_index); } - forward_pass_kernel(block[1], block[2]); } /** @@ -888,38 +983,73 @@ void Planner::forward_pass() { * recalculate() after updating the blocks. */ void Planner::recalculate_trapezoids() { - int8_t block_index = block_buffer_tail; - block_t *current, *next = NULL; + // The tail may be changed by the ISR so get a local copy. + uint8_t block_index = block_buffer_tail; + + // As there could be a sync block in the head of the queue, and the next loop must not + // recalculate the head block (as it needs to be specially handled), scan backwards until + // we find the first non SYNC block + uint8_t head_block_index = block_buffer_head; + while (head_block_index != block_index) { + + // Go back (head always point to the first free block) + uint8_t prev_index = prev_block_index(head_block_index); + + // Get the pointer to the block + block_t *prev = &block_buffer[prev_index]; + + // If not dealing with a sync block, we are done. The last block is not a SYNC block + if (!TEST(prev->flag, BLOCK_BIT_SYNC_POSITION)) break; + + // Examine the previous block. This and all following are SYNC blocks + head_block_index = prev_index; + }; + + // Go from the tail (currently executed block) to the first block, without including it) + block_t *current = NULL, *next = NULL; + float current_entry_speed = 0.0, next_entry_speed = 0.0; + while (block_index != head_block_index) { - while (block_index != block_buffer_head) { - current = next; next = &block_buffer[block_index]; - if (current) { - // Recalculate if current block entry or exit junction speed has changed. - if (TEST(current->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) { - // NOTE: Entry and exit factors always > 0 by all previous logic operations. - const float nomr = 1.0 / current->nominal_speed; - calculate_trapezoid_for_block(current, current->entry_speed * nomr, next->entry_speed * nomr); - #if ENABLED(LIN_ADVANCE) - if (current->use_advance_lead) { - const float comp = current->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; - current->max_adv_steps = current->nominal_speed * comp; - current->final_adv_steps = next->entry_speed * comp; - } - #endif - CBI(current->flag, BLOCK_BIT_RECALCULATE); // Reset current only to ensure next trapezoid is computed + + // Skip sync blocks + if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION)) { + next_entry_speed = SQRT(next->entry_speed_sqr); + + if (current) { + // Recalculate if current block entry or exit junction speed has changed. + if (TEST(current->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) { + // NOTE: Entry and exit factors always > 0 by all previous logic operations. + const float current_nominal_speed = SQRT(current->nominal_speed_sqr), + nomr = 1.0 / current_nominal_speed; + calculate_trapezoid_for_block(current, current_entry_speed * nomr, next_entry_speed * nomr); + #if ENABLED(LIN_ADVANCE) + if (current->use_advance_lead) { + const float comp = current->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; + current->max_adv_steps = current_nominal_speed * comp; + current->final_adv_steps = next_entry_speed * comp; + } + #endif + CBI(current->flag, BLOCK_BIT_RECALCULATE); // Reset current only to ensure next trapezoid is computed + } } + + current = next; + current_entry_speed = next_entry_speed; } + block_index = next_block_index(block_index); } + // Last/newest block in buffer. Exit speed is set with MINIMUM_PLANNER_SPEED. Always recalculated. if (next) { - const float nomr = 1.0 / next->nominal_speed; - calculate_trapezoid_for_block(next, next->entry_speed * nomr, (MINIMUM_PLANNER_SPEED) * nomr); + const float next_nominal_speed = SQRT(next->nominal_speed_sqr), + nomr = 1.0 / next_nominal_speed; + calculate_trapezoid_for_block(next, next_entry_speed * nomr, (MINIMUM_PLANNER_SPEED) * nomr); #if ENABLED(LIN_ADVANCE) if (next->use_advance_lead) { const float comp = next->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; - next->max_adv_steps = next->nominal_speed * comp; + next->max_adv_steps = next_nominal_speed * comp; next->final_adv_steps = (MINIMUM_PLANNER_SPEED) * comp; } #endif @@ -927,33 +1057,14 @@ void Planner::recalculate_trapezoids() { } } -/** - * Recalculate the motion plan according to the following algorithm: - * - * 1. Go over every block in reverse order... - * - * Calculate a junction speed reduction (block_t.entry_factor) so: - * - * a. The junction jerk is within the set limit, and - * - * b. No speed reduction within one block requires faster - * deceleration than the one, true constant acceleration. - * - * 2. Go over every block in chronological order... - * - * Dial down junction speed reduction values if: - * a. The speed increase within one block would require faster - * acceleration than the one, true constant acceleration. - * - * After that, all blocks will have an entry_factor allowing all speed changes to - * be performed using only the one, true constant acceleration, and where no junction - * jerk is jerkier than the set limit, Jerky. Finally it will: - * - * 3. Recalculate "trapezoids" for all blocks. - */ void Planner::recalculate() { - reverse_pass(); - forward_pass(); + // Initialize block index to the last block in the planner buffer. + const uint8_t block_index = prev_block_index(block_buffer_head); + // If there is just one block, no planning can be done. Avoid it! + if (block_index != block_buffer_planned) { + reverse_pass(); + forward_pass(); + } recalculate_trapezoids(); } @@ -969,7 +1080,7 @@ void Planner::recalculate() { for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t* block = &block_buffer[b]; if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) { - float se = (float)block->steps[E_AXIS] / block->step_event_count * block->nominal_speed; // mm/sec; + const float se = (float)block->steps[E_AXIS] / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; NOLESS(high, se); } } @@ -1079,8 +1190,8 @@ void Planner::check_axes_activity() { #endif // FAN_KICKSTART_TIME > 0 - #ifdef FAN_MIN_PWM - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? ( FAN_MIN_PWM + (tail_fan_speed[f] * (255 - FAN_MIN_PWM)) / 255 ) : 0) + #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 + #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : 0) #else #define CALC_FAN_SPEED(f) tail_fan_speed[f] #endif @@ -1270,16 +1381,160 @@ void Planner::check_axes_activity() { #endif // PLANNER_LEVELING +void Planner::quick_stop() { + + // Remove all the queued blocks. Note that this function is NOT + // called from the Stepper ISR, so we must consider tail as readonly! + // that is why we set head to tail - But there is a race condition that + // must be handled: The tail could change between the read and the assignment + // so this must be enclosed in a critical section + + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + // Drop all queue entries + block_buffer_planned = block_buffer_head = block_buffer_tail; + + // Restart the block delay for the first movement - As the queue was + // forced to empty, there's no risk the ISR will touch this. + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + + #if ENABLED(ULTRA_LCD) + // Clear the accumulated runtime + clear_block_buffer_runtime(); + #endif + + // Make sure to drop any attempt of queuing moves for at least 1 second + cleaning_buffer_counter = 1000; + + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + + // And stop the stepper ISR + stepper.quick_stop(); +} + +void Planner::endstop_triggered(const AxisEnum axis) { + // Record stepper position and discard the current block + stepper.endstop_triggered(axis); +} + +float Planner::triggered_position_mm(const AxisEnum axis) { + return stepper.triggered_position(axis) * steps_to_mm[axis]; +} + +void Planner::finish_and_disable() { + while (has_blocks_queued() || cleaning_buffer_counter) idle(); + disable_all_steppers(); +} + +/** + * Get an axis position according to stepper position(s) + * For CORE machines apply translation from ABC to XYZ. + */ +float Planner::get_axis_position_mm(const AxisEnum axis) { + float axis_steps; + #if IS_CORE + // Requesting one of the "core" axes? + if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { + + // Protect the access to the position. + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + // ((a1+a2)+(a1-a2))/2 -> (a1+a2+a1-a2)/2 -> (a1+a1)/2 -> a1 + // ((a1+a2)-(a1-a2))/2 -> (a1+a2-a1+a2)/2 -> (a2+a2)/2 -> a2 + axis_steps = 0.5f * ( + axis == CORE_AXIS_2 ? CORESIGN(stepper.position(CORE_AXIS_1) - stepper.position(CORE_AXIS_2)) + : stepper.position(CORE_AXIS_1) + stepper.position(CORE_AXIS_2) + ); + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + } + else + axis_steps = stepper.position(axis); + #else + axis_steps = stepper.position(axis); + #endif + return axis_steps * steps_to_mm[axis]; +} + +/** + * Block until all buffered steps are executed / cleaned + */ +void Planner::synchronize() { while (has_blocks_queued() || cleaning_buffer_counter) idle(); } + /** * Planner::_buffer_steps * - * Add a new linear movement to the buffer (in terms of steps). + * Add a new linear movement to the planner queue (in terms of steps). * * target - target position in steps units * fr_mm_s - (target) speed of the move * extruder - target extruder + * millimeters - the length of the movement, if known + * + * Returns true if movement was properly queued, false otherwise */ -void Planner::_buffer_steps(const int32_t (&target)[XYZE] +bool Planner::_buffer_steps(const int32_t (&target)[XYZE] + #if HAS_POSITION_FLOAT + , const float (&target_float)[XYZE] + #endif + , float fr_mm_s, const uint8_t extruder, const float &millimeters +) { + + // If we are cleaning, do not accept queuing of movements + if (cleaning_buffer_counter) return false; + + // Wait for the next available block + uint8_t next_buffer_head; + block_t * const block = get_next_free_block(next_buffer_head); + + // Fill the block with the specified movement + if (!_populate_block(block, false, target + #if HAS_POSITION_FLOAT + , target_float + #endif + , fr_mm_s, extruder, millimeters + )) { + // Movement was not queued, probably because it was too short. + // Simply accept that as movement queued and done + return true; + } + + // If this is the first added movement, reload the delay, otherwise, cancel it. + if (block_buffer_head == block_buffer_tail) { + // If it was the first queued block, restart the 1st block delivery delay, to + // give the planner an opportunity to queue more movements and plan them + // As there are no queued movements, the Stepper ISR will not touch this + // variable, so there is no risk setting this here (but it MUST be done + // before the following line!!) + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + } + + // Move buffer head + block_buffer_head = next_buffer_head; + + // Recalculate and optimize trapezoidal speed profiles + recalculate(); + + // Movement successfully queued! + return true; +} + +/** + * Planner::_populate_block + * + * Fills a new linear movement in the block (in terms of steps). + * + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * + * Returns true is movement is acceptable, false otherwise + */ +bool Planner::_populate_block(block_t * const block, bool split_move, + const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT , const float (&target_float)[XYZE] #endif @@ -1293,7 +1548,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] int32_t de = target[E_AXIS] - position[E_AXIS]; /* <-- add a slash to enable - SERIAL_ECHOPAIR(" _buffer_steps FR:", fr_mm_s); + SERIAL_ECHOPAIR(" _populate_block FR:", fr_mm_s); SERIAL_ECHOPAIR(" A:", target[A_AXIS]); SERIAL_ECHOPAIR(" (", da); SERIAL_ECHOPAIR(" steps) B:", target[B_AXIS]); @@ -1319,7 +1574,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] } #endif // PREVENT_COLD_EXTRUSION #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - if (labs(de * e_factor[extruder]) > (int32_t)axis_steps_per_mm[E_AXIS_N] * (EXTRUDE_MAXLENGTH)) { // It's not important to get max. extrusion length in a precision < 1mm, so save some cycles and cast to int + if (ABS(de * e_factor[extruder]) > (int32_t)axis_steps_per_mm[E_AXIS_N] * (EXTRUDE_MAXLENGTH)) { // It's not important to get max. extrusion length in a precision < 1mm, so save some cycles and cast to int position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part #if HAS_POSITION_FLOAT position_float[E_AXIS] = target_float[E_AXIS]; @@ -1360,11 +1615,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] if (de < 0) SBI(dm, E_AXIS); const float esteps_float = de * e_factor[extruder]; - const int32_t esteps = abs(esteps_float) + 0.5; - - // Wait for the next available block - uint8_t next_buffer_head; - block_t * const block = get_next_free_block(next_buffer_head); + const uint32_t esteps = ABS(esteps_float) + 0.5; // Clear all flags, including the "busy" bit block->flag = 0x00; @@ -1375,38 +1626,44 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // Number of steps for each axis // See http://www.corexy.com/theory.html #if CORE_IS_XY - block->steps[A_AXIS] = labs(da + db); - block->steps[B_AXIS] = labs(da - db); - block->steps[Z_AXIS] = labs(dc); + block->steps[A_AXIS] = ABS(da + db); + block->steps[B_AXIS] = ABS(da - db); + block->steps[Z_AXIS] = ABS(dc); #elif CORE_IS_XZ - block->steps[A_AXIS] = labs(da + dc); - block->steps[Y_AXIS] = labs(db); - block->steps[C_AXIS] = labs(da - dc); + block->steps[A_AXIS] = ABS(da + dc); + block->steps[Y_AXIS] = ABS(db); + block->steps[C_AXIS] = ABS(da - dc); #elif CORE_IS_YZ - block->steps[X_AXIS] = labs(da); - block->steps[B_AXIS] = labs(db + dc); - block->steps[C_AXIS] = labs(db - dc); + block->steps[X_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db + dc); + block->steps[C_AXIS] = ABS(db - dc); #elif IS_SCARA - block->steps[A_AXIS] = labs(da); - block->steps[B_AXIS] = labs(db); - block->steps[Z_AXIS] = labs(dc); + block->steps[A_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db); + block->steps[Z_AXIS] = ABS(dc); #else // default non-h-bot planning - block->steps[A_AXIS] = labs(da); - block->steps[B_AXIS] = labs(db); - block->steps[C_AXIS] = labs(dc); + block->steps[A_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db); + block->steps[C_AXIS] = ABS(dc); #endif block->steps[E_AXIS] = esteps; block->step_event_count = MAX4(block->steps[A_AXIS], block->steps[B_AXIS], block->steps[C_AXIS], esteps); // Bail if this is a zero-length block - if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return; + if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; - // For a mixing extruder, get a magnified step_event_count for each + // For a mixing extruder, get a magnified esteps for each #if ENABLED(MIXING_EXTRUDER) for (uint8_t i = 0; i < MIXING_STEPPERS; i++) - block->mix_event_count[i] = mixing_factor[i] * block->step_event_count; + block->mix_steps[i] = mixing_factor[i] * ( + #if ENABLED(LIN_ADVANCE) + esteps + #else + block->step_event_count + #endif + ); #endif #if FAN_COUNT > 0 @@ -1595,7 +1852,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] delta_mm[E_AXIS] = esteps_float * steps_to_mm[E_AXIS_N]; if (block->steps[A_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[B_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[C_AXIS] < MIN_STEPS_PER_SEGMENT) { - block->millimeters = FABS(delta_mm[E_AXIS]); + block->millimeters = ABS(delta_mm[E_AXIS]); } else if (!millimeters) { block->millimeters = SQRT( @@ -1641,12 +1898,16 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] #endif #if ENABLED(ULTRA_LCD) - CRITICAL_SECTION_START - block_buffer_runtime_us += segment_time_us; - CRITICAL_SECTION_END + // Protect the access to the position. + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + block_buffer_runtime_us += segment_time_us; + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); #endif - block->nominal_speed = block->millimeters * inverse_secs; // (mm/sec) Always > 0 + block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0 block->nominal_rate = CEIL(block->step_event_count * inverse_secs); // (step/sec) Always > 0 #if ENABLED(FILAMENT_WIDTH_SENSOR) @@ -1686,7 +1947,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // Calculate and limit speed in mm/sec for each axis float current_speed[NUM_AXIS], speed_factor = 1.0; // factor <1 decreases speed LOOP_XYZE(i) { - const float cs = FABS((current_speed[i] = delta_mm[i] * inverse_secs)); + const float cs = ABS((current_speed[i] = delta_mm[i] * inverse_secs)); #if ENABLED(DISTINCT_E_FACTORS) if (i == E_AXIS) i += extruder; #endif @@ -1724,7 +1985,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] const uint32_t max_x_segment_time = MAX3(xs0, xs1, xs2), max_y_segment_time = MAX3(ys0, ys1, ys2), - min_xy_segment_time = min(max_x_segment_time, max_y_segment_time); + min_xy_segment_time = MIN(max_x_segment_time, max_y_segment_time); if (min_xy_segment_time < MAX_FREQ_TIME_US) { const float low_sf = speed_factor * min_xy_segment_time / (MAX_FREQ_TIME_US); NOMORE(speed_factor, low_sf); @@ -1734,8 +1995,8 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // Correct the speed if (speed_factor < 1.0) { LOOP_XYZE(i) current_speed[i] *= speed_factor; - block->nominal_speed *= speed_factor; block->nominal_rate *= speed_factor; + block->nominal_speed_sqr = block->nominal_speed_sqr * sq(speed_factor); } // Compute and limit the acceleration rate for the trapezoid generator. @@ -1767,6 +2028,13 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] accel = CEIL((esteps ? acceleration : travel_acceleration) * steps_per_mm); #if ENABLED(LIN_ADVANCE) + + #if ENABLED(JUNCTION_DEVIATION) + #define MAX_E_JERK (max_e_jerk_factor * max_acceleration_mm_per_s2[_EINDEX]) + #else + #define MAX_E_JERK max_jerk[E_AXIS] + #endif + /** * * Use LIN_ADVANCE for blocks if all these are true: @@ -1797,10 +2065,9 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] if (block->e_D_ratio > 3.0) block->use_advance_lead = false; else { - const uint32_t max_accel_steps_per_s2 = max_jerk[E_AXIS] / (extruder_advance_K * block->e_D_ratio) * steps_per_mm; + const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K * block->e_D_ratio) * steps_per_mm; #if ENABLED(LA_DEBUG) - if (accel > max_accel_steps_per_s2) - SERIAL_ECHOLNPGM("Acceleration limited."); + if (accel > max_accel_steps_per_s2) SERIAL_ECHOLNPGM("Acceleration limited."); #endif NOMORE(accel, max_accel_steps_per_s2); } @@ -1829,14 +2096,14 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] } block->acceleration_steps_per_s2 = accel; block->acceleration = accel / steps_per_mm; - #if DISABLED(BEZIER_JERK_CONTROL) - block->acceleration_rate = (long)(accel * (4096.0 * 4096.0 / (HAL_STEPPER_TIMER_RATE))); // * 8.388608 + #if DISABLED(S_CURVE_ACCELERATION) + block->acceleration_rate = (uint32_t)(accel * (4096.0 * 4096.0 / (STEPPER_TIMER_RATE))); #endif #if ENABLED(LIN_ADVANCE) if (block->use_advance_lead) { - block->advance_speed = (HAL_STEPPER_TIMER_RATE) / (extruder_advance_K * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS]); + block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS_N]); #if ENABLED(LA_DEBUG) - if (extruder_advance_K * block->e_D_ratio * block->acceleration * 2 < block->nominal_speed * block->e_D_ratio) + if (extruder_advance_K * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) SERIAL_ECHOLNPGM("More than 2 steps per eISR loop executed."); if (block->advance_speed < 200) SERIAL_ECHOLNPGM("eISR running at > 10kHz."); @@ -1844,33 +2111,43 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] } #endif - float vmax_junction; // Initial limit on the segment entry velocity + float vmax_junction_sqr; // Initial limit on the segment entry velocity (mm/s)^2 #if ENABLED(JUNCTION_DEVIATION) /** * Compute maximum allowable entry speed at junction by centripetal acceleration approximation. - * Let a circle be tangent to both previous and current path line segments, where the junction - * deviation is defined as the distance from the junction to the closest edge of the circle, - * colinear with the circle center. The circular segment joining the two paths represents the + * Let a circle be tangent to both previous and current path line segments, where the junction + * deviation is defined as the distance from the junction to the closest edge of the circle, + * colinear with the circle center. The circular segment joining the two paths represents the * path of centripetal acceleration. Solve for max velocity based on max acceleration about the - * radius of the circle, defined indirectly by junction deviation. This may be also viewed as - * path width or max_jerk in the previous Grbl version. This approach does not actually deviate + * radius of the circle, defined indirectly by junction deviation. This may be also viewed as + * path width or max_jerk in the previous Grbl version. This approach does not actually deviate * from path, but used as a robust way to compute cornering speeds, as it takes into account the * nonlinearities of both the junction angle and junction velocity. * - * NOTE: If the junction deviation value is finite, Grbl executes the motions in an exact path + * NOTE: If the junction deviation value is finite, Grbl executes the motions in an exact path * mode (G61). If the junction deviation value is zero, Grbl will execute the motion in an exact * stop mode (G61.1) manner. In the future, if continuous mode (G64) is desired, the math here * is exactly the same. Instead of motioning all the way to junction point, the machine will * just follow the arc circle defined here. The Arduino doesn't have the CPU cycles to perform - * a continuous mode path, but ARM-based microcontrollers most certainly do. - * + * a continuous mode path, but ARM-based microcontrollers most certainly do. + * * NOTE: The max junction speed is a fixed value, since machine acceleration limits cannot be * changed dynamically during operation nor can the line move geometry. This must be kept in - * memory in the event of a feedrate override changing the nominal speeds of blocks, which can + * memory in the event of a feedrate override changing the nominal speeds of blocks, which can * change the overall maximum entry speed conditions of all blocks. - */ + * + * ####### + * https://github.com/MarlinFirmware/Marlin/issues/10341#issuecomment-388191754 + * + * hoffbaked: on May 10 2018 tuned and improved the GRBL algorithm for Marlin: + Okay! It seems to be working good. I somewhat arbitrarily cut it off at 1mm + on then on anything with less sides than an octagon. With this, and the + reverse pass actually recalculating things, a corner acceleration value + of 1000 junction deviation of .05 are pretty reasonable. If the cycles + can be spared, a better acos could be used. For all I know, it may be + already calculated in a different place. */ // Unit vector of previous path line segment static float previous_unit_vec[ @@ -1891,7 +2168,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] }; // Skip first block or when previous_nominal_speed is used as a flag for homing and offset cycles. - if (moves_queued && !UNEAR_ZERO(previous_nominal_speed)) { + if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { // Compute cosine of angle between previous and current path. (prev_unit_vec is negative) // NOTE: Max junction velocity is computed without sin() or acos() by trig half angle identity. float junction_cos_theta = -previous_unit_vec[X_AXIS] * unit_vec[X_AXIS] @@ -1905,21 +2182,44 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // NOTE: Computed without any expensive trig, sin() or acos(), by trig half angle identity of cos(theta). if (junction_cos_theta > 0.999999) { // For a 0 degree acute junction, just set minimum junction speed. - vmax_junction = MINIMUM_PLANNER_SPEED; + vmax_junction_sqr = sq(MINIMUM_PLANNER_SPEED); } else { - junction_cos_theta = max(junction_cos_theta, -0.999999); // Check for numerical round-off to avoid divide by zero. - const float sin_theta_d2 = SQRT(0.5 * (1.0 - junction_cos_theta)); // Trig half angle identity. Always positive. + NOLESS(junction_cos_theta, -0.999999); // Check for numerical round-off to avoid divide by zero. - // TODO: Technically, the acceleration used in calculation needs to be limited by the minimum of the - // two junctions. However, this shouldn't be a significant problem except in extreme circumstances. - vmax_junction = SQRT((block->acceleration * JUNCTION_DEVIATION_FACTOR * sin_theta_d2) / (1.0 - sin_theta_d2)); + float junction_unit_vec[JD_AXES] = { + unit_vec[X_AXIS] - previous_unit_vec[X_AXIS], + unit_vec[Y_AXIS] - previous_unit_vec[Y_AXIS], + unit_vec[Z_AXIS] - previous_unit_vec[Z_AXIS] + #if ENABLED(JUNCTION_DEVIATION_INCLUDE_E) + , unit_vec[E_AXIS] - previous_unit_vec[E_AXIS] + #endif + }; + // Convert delta vector to unit vector + normalize_junction_vector(junction_unit_vec); + + const float junction_acceleration = limit_value_by_axis_maximum(block->acceleration, junction_unit_vec), + sin_theta_d2 = SQRT(0.5 * (1.0 - junction_cos_theta)); // Trig half angle identity. Always positive. + + vmax_junction_sqr = (junction_acceleration * junction_deviation_mm * sin_theta_d2) / (1.0 - sin_theta_d2); + if (block->millimeters < 1.0) { + + // Fast acos approximation, minus the error bar to be safe + const float junction_theta = (RADIANS(-40) * sq(junction_cos_theta) - RADIANS(50)) * junction_cos_theta + RADIANS(90) - 0.18; + + // If angle is greater than 135 degrees (octagon), find speed for approximate arc + if (junction_theta > RADIANS(135)) { + const float limit_sqr = block->millimeters / (RADIANS(180) - junction_theta) * junction_acceleration; + NOMORE(vmax_junction_sqr, limit_sqr); + } + } } - vmax_junction = MIN3(vmax_junction, block->nominal_speed, previous_nominal_speed); + // Get the lowest speed + vmax_junction_sqr = MIN3(vmax_junction_sqr, block->nominal_speed_sqr, previous_nominal_speed_sqr); } else // Init entry speed to zero. Assume it starts from rest. Planner will correct this later. - vmax_junction = 0.0; + vmax_junction_sqr = 0.0; COPY(previous_unit_vec, unit_vec); @@ -1935,13 +2235,15 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // Exit speed limited by a jerk to full halt of a previous last segment static float previous_safe_speed; - float safe_speed = block->nominal_speed; + const float nominal_speed = SQRT(block->nominal_speed_sqr); + float safe_speed = nominal_speed; + uint8_t limited = 0; LOOP_XYZE(i) { - const float jerk = FABS(current_speed[i]), maxj = max_jerk[i]; + const float jerk = ABS(current_speed[i]), maxj = max_jerk[i]; if (jerk > maxj) { if (limited) { - const float mjerk = maxj * block->nominal_speed; + const float mjerk = maxj * nominal_speed; if (jerk * safe_speed > mjerk) safe_speed = mjerk / jerk; } else { @@ -1951,19 +2253,21 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] } } - if (moves_queued && !UNEAR_ZERO(previous_nominal_speed)) { + float vmax_junction; + if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { // Estimate a maximum velocity allowed at a joint of two successive segments. // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. - // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. - // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - vmax_junction = min(block->nominal_speed, previous_nominal_speed); - // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. float v_factor = 1; limited = 0; + // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. + // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. + const float previous_nominal_speed = SQRT(previous_nominal_speed_sqr); + vmax_junction = MIN(nominal_speed, previous_nominal_speed); + // Now limit the jerk in all axes. const float smaller_speed_factor = vmax_junction / previous_nominal_speed; LOOP_XYZE(axis) { @@ -1978,9 +2282,9 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // Calculate jerk depending on whether the axis is coasting in the same direction or reversing. const float jerk = (v_exit > v_entry) ? // coasting axis reversal - ( (v_entry > 0 || v_exit < 0) ? (v_exit - v_entry) : max(v_exit, -v_entry) ) + ( (v_entry > 0 || v_exit < 0) ? (v_exit - v_entry) : MAX(v_exit, -v_entry) ) : // v_exit <= v_entry coasting axis reversal - ( (v_entry < 0 || v_exit > 0) ? (v_entry - v_exit) : max(-v_exit, v_entry) ); + ( (v_entry < 0 || v_exit > 0) ? (v_entry - v_exit) : MAX(-v_exit, v_entry) ); if (jerk > max_jerk[axis]) { v_factor *= max_jerk[axis] / jerk; @@ -1996,18 +2300,21 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] } else vmax_junction = safe_speed; - + previous_safe_speed = safe_speed; + vmax_junction_sqr = sq(vmax_junction); + #endif // Classic Jerk Limiting // Max entry speed of this block equals the max exit speed of the previous block. - block->max_entry_speed = vmax_junction; + block->max_entry_speed_sqr = vmax_junction_sqr; // Initialize block entry speed. Compute based on deceleration to user-defined MINIMUM_PLANNER_SPEED. - const float v_allowable = max_allowable_speed(-block->acceleration, MINIMUM_PLANNER_SPEED, block->millimeters); - // If stepper ISR is disabled, this indicates buffer_segment wants to add a split block. - // In this case start with the max. allowed speed to avoid an interrupted first move. - block->entry_speed = STEPPER_ISR_ENABLED() ? MINIMUM_PLANNER_SPEED : min(vmax_junction, v_allowable); + const float v_allowable_sqr = max_allowable_speed_sqr(-block->acceleration, sq(MINIMUM_PLANNER_SPEED), block->millimeters); + + // If we are trying to add a split block, start with the + // max. allowed speed to avoid an interrupted first move. + block->entry_speed_sqr = !split_move ? sq(MINIMUM_PLANNER_SPEED) : MIN(vmax_junction_sqr, v_allowable_sqr); // Initialize planner efficiency flags // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. @@ -2017,25 +2324,22 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE] // block nominal speed limits both the current and next maximum junction speeds. Hence, in both // the reverse and forward planners, the corresponding block junction speed will always be at the // the maximum junction speed and may always be ignored for any speed reduction checks. - block->flag |= block->nominal_speed <= v_allowable ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; + block->flag |= block->nominal_speed_sqr <= v_allowable_sqr ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; // Update previous path unit_vector and nominal speed COPY(previous_speed, current_speed); - previous_nominal_speed = block->nominal_speed; + previous_nominal_speed_sqr = block->nominal_speed_sqr; - // Move buffer head - block_buffer_head = next_buffer_head; - - // Update the position (only when a move was queued) + // Update the position static_assert(COUNT(target) > 1, "Parameter to _buffer_steps must be (&target)[XYZE]!"); COPY(position, target); #if HAS_POSITION_FLOAT COPY(position_float, target_float); #endif - recalculate(); - -} // _buffer_steps() + // Movement was accepted + return true; +} // _populate_block() /** * Planner::buffer_sync_block @@ -2046,31 +2350,28 @@ void Planner::buffer_sync_block() { uint8_t next_buffer_head; block_t * const block = get_next_free_block(next_buffer_head); + // Clear block + memset(block, 0, sizeof(block_t)); + block->flag = BLOCK_FLAG_SYNC_POSITION; - block->steps[A_AXIS] = position[A_AXIS]; - block->steps[B_AXIS] = position[B_AXIS]; - block->steps[C_AXIS] = position[C_AXIS]; - block->steps[E_AXIS] = position[E_AXIS]; + block->position[A_AXIS] = position[A_AXIS]; + block->position[B_AXIS] = position[B_AXIS]; + block->position[C_AXIS] = position[C_AXIS]; + block->position[E_AXIS] = position[E_AXIS]; - #if ENABLED(LIN_ADVANCE) - block->use_advance_lead = false; - #endif - - block->nominal_speed = - block->entry_speed = - block->max_entry_speed = - block->millimeters = - block->acceleration = 0; - - block->step_event_count = - block->nominal_rate = - block->initial_rate = - block->final_rate = - block->acceleration_steps_per_s2 = - block->segment_time_us = 0; + // If this is the first added movement, reload the delay, otherwise, cancel it. + if (block_buffer_head == block_buffer_tail) { + // If it was the first queued block, restart the 1st block delivery delay, to + // give the planner an opportunity to queue more movements and plan them + // As there are no queued movements, the Stepper ISR will not touch this + // variable, so there is no risk setting this here (but it MUST be done + // before the following line!!) + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + } block_buffer_head = next_buffer_head; + stepper.wake_up(); } // buffer_sync_block() @@ -2086,7 +2387,11 @@ void Planner::buffer_sync_block() { * extruder - target extruder * millimeters - the length of the movement, if known */ -void Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/) { +bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/) { + + // If we are cleaning, do not accept queuing of movements + if (cleaning_buffer_counter) return false; + // When changing extruders recalculate steps corresponding to the E position #if ENABLED(DISTINCT_E_FACTORS) if (last_extruder != extruder && axis_steps_per_mm[E_AXIS_N] != axis_steps_per_mm[E_AXIS + last_extruder]) { @@ -2144,48 +2449,18 @@ void Planner::buffer_segment(const float &a, const float &b, const float &c, con SERIAL_ECHOLNPGM(")"); //*/ - // Always split the first move into two (if not homing or probing) - if (!has_blocks_queued()) { - - #define _BETWEEN(A) (position[A##_AXIS] + target[A##_AXIS]) >> 1 - const int32_t between[ABCE] = { _BETWEEN(A), _BETWEEN(B), _BETWEEN(C), _BETWEEN(E) }; - - #if HAS_POSITION_FLOAT - #define _BETWEEN_F(A) (position_float[A##_AXIS] + target_float[A##_AXIS]) * 0.5 - const float between_float[ABCE] = { _BETWEEN_F(A), _BETWEEN_F(B), _BETWEEN_F(C), _BETWEEN_F(E) }; - #endif - - DISABLE_STEPPER_DRIVER_INTERRUPT(); - - _buffer_steps(between - #if HAS_POSITION_FLOAT - , between_float - #endif - , fr_mm_s, extruder, millimeters * 0.5 - ); - - const uint8_t next = block_buffer_head; - - _buffer_steps(target - #if HAS_POSITION_FLOAT - , target_float - #endif - , fr_mm_s, extruder, millimeters * 0.5 - ); - - SBI(block_buffer[next].flag, BLOCK_BIT_CONTINUED); - ENABLE_STEPPER_DRIVER_INTERRUPT(); - } - else - _buffer_steps(target + // Queue the movement + if ( + !_buffer_steps(target #if HAS_POSITION_FLOAT , target_float #endif , fr_mm_s, extruder, millimeters - ); + ) + ) return false; stepper.wake_up(); - + return true; } // buffer_segment() /** @@ -2197,10 +2472,7 @@ void Planner::buffer_segment(const float &a, const float &b, const float &c, con void Planner::_set_position_mm(const float &a, const float &b, const float &c, const float &e) { #if ENABLED(DISTINCT_E_FACTORS) - #define _EINDEX (E_AXIS + active_extruder) last_extruder = active_extruder; - #else - #define _EINDEX E_AXIS #endif position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]), position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]), @@ -2212,9 +2484,13 @@ void Planner::_set_position_mm(const float &a, const float &b, const float &c, c position_float[C_AXIS] = c; position_float[E_AXIS] = e; #endif - previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. - ZERO(previous_speed); - buffer_sync_block(); + if (has_blocks_queued()) { + //previous_nominal_speed_sqr = 0.0; // Reset planner junction speeds. Assume start from rest. + //ZERO(previous_speed); + buffer_sync_block(); + } + else + stepper.set_position(position[A_AXIS], position[B_AXIS], position[C_AXIS], position[E_AXIS]); } void Planner::set_position_mm_kinematic(const float (&cart)[XYZE]) { @@ -2232,22 +2508,6 @@ void Planner::set_position_mm_kinematic(const float (&cart)[XYZE]) { #endif } -/** - * Sync from the stepper positions. (e.g., after an interrupted move) - */ -void Planner::sync_from_steppers() { - LOOP_XYZE(i) { - position[i] = stepper.position((AxisEnum)i); - #if HAS_POSITION_FLOAT - position_float[i] = position[i] * steps_to_mm[i - #if ENABLED(DISTINCT_E_FACTORS) - + (i == E_AXIS ? active_extruder : 0) - #endif - ]; - #endif - } -} - /** * Setters for planner position (also setting stepper position). */ @@ -2262,8 +2522,12 @@ void Planner::set_position_mm(const AxisEnum axis, const float &v) { #if HAS_POSITION_FLOAT position_float[axis] = v; #endif - previous_speed[axis] = 0.0; - buffer_sync_block(); + if (has_blocks_queued()) { + //previous_speed[axis] = 0.0; + buffer_sync_block(); + } + else + stepper.set_position(axis, position[axis]); } // Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 diff --git a/Marlin/planner.h b/Marlin/src/module/planner.h similarity index 64% rename from Marlin/planner.h rename to Marlin/src/module/planner.h index edc61ea6ee..0e313152dd 100644 --- a/Marlin/planner.h +++ b/Marlin/src/module/planner.h @@ -32,12 +32,17 @@ #ifndef PLANNER_H #define PLANNER_H -#include "types.h" -#include "enum.h" -#include "Marlin.h" +#include "../Marlin.h" + +#include "motion.h" +#include "../gcode/queue.h" + +#if ENABLED(DELTA) + #include "delta.h" +#endif #if ABL_PLANAR - #include "vector_3.h" + #include "../libs/vector_3.h" #endif enum BlockFlagBit : char { @@ -49,7 +54,7 @@ enum BlockFlagBit : char { // from a safe speed (in consideration of jerking from zero speed). BLOCK_BIT_NOMINAL_LENGTH, - // The block is busy + // The block is busy, being interpreted by the stepper ISR BLOCK_BIT_BUSY, // The block is segment 2+ of a longer move @@ -80,33 +85,44 @@ typedef struct { uint8_t flag; // Block flags (See BlockFlag enum above) - unsigned char active_extruder; // The extruder to move (if E move) + // Fields used by the motion planner to manage acceleration + float nominal_speed_sqr, // The nominal speed for this block in (mm/sec)^2 + entry_speed_sqr, // Entry speed at previous-current junction in (mm/sec)^2 + max_entry_speed_sqr, // Maximum allowable junction entry speed in (mm/sec)^2 + millimeters, // The total travel of this block in mm + acceleration; // acceleration mm/sec^2 - // Fields used by the Bresenham algorithm for tracing the line - int32_t steps[NUM_AXIS]; // Step count along each axis + union { + // Data used by all move blocks + struct { + // Fields used by the Bresenham algorithm for tracing the line + uint32_t steps[NUM_AXIS]; // Step count along each axis + }; + // Data used by all sync blocks + struct { + int32_t position[NUM_AXIS]; // New position to force when this sync block is executed + }; + }; uint32_t step_event_count; // The number of step events required to complete this block + uint8_t active_extruder; // The extruder to move (if E move) + #if ENABLED(MIXING_EXTRUDER) - uint32_t mix_event_count[MIXING_STEPPERS]; // Scaled step_event_count for the mixing steppers + uint32_t mix_steps[MIXING_STEPPERS]; // Scaled steps[E_AXIS] for the mixing steppers #endif // Settings for the trapezoid generator - int32_t accelerate_until, // The index of the step event on which to stop acceleration - decelerate_after; // The index of the step event on which to start decelerating + uint32_t accelerate_until, // The index of the step event on which to stop acceleration + decelerate_after; // The index of the step event on which to start decelerating - uint32_t nominal_rate, // The nominal step rate for this block in step_events/sec - initial_rate, // The jerk-adjusted step rate at start of block - final_rate, // The minimal rate at exit - acceleration_steps_per_s2; // acceleration steps/sec^2 - - #if ENABLED(BEZIER_JERK_CONTROL) - uint32_t cruise_rate; // The actual cruise rate to use, between end of the acceleration phase and start of deceleration phase - uint32_t acceleration_time, // Acceleration time and deceleration time in STEP timer counts - deceleration_time; - uint32_t acceleration_time_inverse, // Inverse of acceleration and deceleration periods, expressed as integer. Scale depends on CPU being used + #if ENABLED(S_CURVE_ACCELERATION) + uint32_t cruise_rate, // The actual cruise rate to use, between end of the acceleration phase and start of deceleration phase + acceleration_time, // Acceleration time and deceleration time in STEP timer counts + deceleration_time, + acceleration_time_inverse, // Inverse of acceleration and deceleration periods, expressed as integer. Scale depends on CPU being used deceleration_time_inverse; #else - int32_t acceleration_rate; // The acceleration rate used for acceleration calculation + uint32_t acceleration_rate; // The acceleration rate used for acceleration calculation #endif uint8_t direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) @@ -114,18 +130,16 @@ typedef struct { // Advance extrusion #if ENABLED(LIN_ADVANCE) bool use_advance_lead; - uint16_t advance_speed, // Timer value for extruder speed offset + uint16_t advance_speed, // STEP timer value for extruder speed offset ISR max_adv_steps, // max. advance steps to get cruising speed pressure (not always nominal_speed!) final_adv_steps; // advance steps due to exit speed float e_D_ratio; #endif - // Fields used by the motion planner to manage acceleration - float nominal_speed, // The nominal speed for this block in mm/sec - entry_speed, // Entry speed at previous-current junction in mm/sec - max_entry_speed, // Maximum allowable junction entry speed in mm/sec - millimeters, // The total travel of this block in mm - acceleration; // acceleration mm/sec^2 + uint32_t nominal_rate, // The nominal step rate for this block in step_events/sec + initial_rate, // The jerk-adjusted step rate at start of block + final_rate, // The minimal rate at exit + acceleration_steps_per_s2; // acceleration steps/sec^2 #if FAN_COUNT > 0 uint16_t fan_speed[FAN_COUNT]; @@ -162,6 +176,9 @@ class Planner { static block_t block_buffer[BLOCK_BUFFER_SIZE]; static volatile uint8_t block_buffer_head, // Index of the next block to be pushed block_buffer_tail; // Index of the busy block, if any + static uint16_t cleaning_buffer_counter; // A counter to disable queuing of blocks + static uint8_t delay_before_delivering, // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks + block_buffer_planned; // Index of the optimally planned block #if ENABLED(DISTINCT_E_FACTORS) static uint8_t last_extruder; // Respond to extruder change @@ -178,19 +195,26 @@ class Planner { // May be auto-adjusted by a filament width sensor #endif - static float max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second - axis_steps_per_mm[XYZE_N], - steps_to_mm[XYZE_N]; - static uint32_t max_acceleration_steps_per_s2[XYZE_N], - max_acceleration_mm_per_s2[XYZE_N]; // Use M201 to override + static uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE + max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2 + min_segment_time_us; // (µs) M205 B + static float max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds + axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter + steps_to_mm[XYZE_N], // (mm) Millimeters per step + min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate + acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. + retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes + travel_acceleration, // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. + min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate - static uint32_t min_segment_time_us; // Use 'M205 B<µs>' to override - static float min_feedrate_mm_s, - acceleration, // Normal acceleration mm/s^2 DEFAULT ACCELERATION for all printing moves. M204 SXXXX - retract_acceleration, // Retract acceleration mm/s^2 filament pull-back and push-forward while standing still in the other axes M204 TXXXX - travel_acceleration, // Travel acceleration mm/s^2 DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX - max_jerk[XYZE], // The largest speed change requiring no acceleration - min_travel_feedrate_mm_s; + #if ENABLED(JUNCTION_DEVIATION) + static float junction_deviation_mm; // (mm) M205 J + #if ENABLED(LIN_ADVANCE) + static float max_e_jerk_factor; // Calculated from junction_deviation_mm + #endif + #else + static float max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. + #endif #if HAS_LEVELING static bool leveling_active; // Flag that bed leveling is enabled @@ -229,6 +253,10 @@ class Planner { #endif #endif + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + static bool abort_on_endstop_hit; + #endif + private: /** @@ -243,9 +271,9 @@ class Planner { static float previous_speed[NUM_AXIS]; /** - * Nominal speed of previous path line segment + * Nominal speed of previous path line segment (mm/s)^2 */ - static float previous_nominal_speed; + static float previous_nominal_speed_sqr; /** * Limit where 64bit math is necessary for acceleration calculation @@ -304,15 +332,6 @@ class Planner { // Manage fans, paste pressure, etc. static void check_axes_activity(); - /** - * Number of moves currently in the planner - */ - FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail + BLOCK_BUFFER_SIZE); } - - FORCE_INLINE static void clear_block_buffer() { block_buffer_head = block_buffer_tail = 0; } - - FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } - // Update multipliers based on new diameter measurements static void calculate_volumetric_multipliers(); @@ -420,16 +439,32 @@ class Planner { #define ARG_Z const float &rz #endif + // Number of moves currently in the planner + FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail); } + + // Remove all blocks from the buffer + FORCE_INLINE static void clear_block_buffer() { block_buffer_head = block_buffer_tail = 0; } + + // Check if movement queue is full + FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } + + // Get count of movement slots free + FORCE_INLINE static uint8_t moves_free() { return BLOCK_BUFFER_SIZE - 1 - movesplanned(); } + /** * Planner::get_next_free_block * - * - Get the next head index (passed by reference) - * - Wait for a space to open up in the planner - * - Return the head block + * - Get the next head indices (passed by reference) + * - Wait for the number of spaces to open up in the planner + * - Return the first head block */ - FORCE_INLINE static block_t* get_next_free_block(uint8_t &next_buffer_head) { + FORCE_INLINE static block_t* get_next_free_block(uint8_t &next_buffer_head, const uint8_t count=1) { + + // Wait until there are enough slots free + while (moves_free() < count) { idle(); } + + // Return the first available block next_buffer_head = next_block_index(block_buffer_head); - while (block_buffer_tail == next_buffer_head) idle(); // while (is_full) return &block_buffer[block_buffer_head]; } @@ -442,8 +477,30 @@ class Planner { * fr_mm_s - (target) speed of the move * extruder - target extruder * millimeters - the length of the movement, if known + * + * Returns true if movement was buffered, false otherwise */ - static void _buffer_steps(const int32_t (&target)[XYZE] + static bool _buffer_steps(const int32_t (&target)[XYZE] + #if HAS_POSITION_FLOAT + , const float (&target_float)[XYZE] + #endif + , float fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ); + + /** + * Planner::_populate_block + * + * Fills a new linear movement in the block (in terms of steps). + * + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known + * + * Returns true is movement is acceptable, false otherwise + */ + static bool _populate_block(block_t * const block, bool split_move, + const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT , const float (&target_float)[XYZE] #endif @@ -468,7 +525,7 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - static void buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0); + static bool buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0); static void _set_position_mm(const float &a, const float &b, const float &c, const float &e); @@ -485,11 +542,11 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - FORCE_INLINE static void buffer_line(ARG_X, ARG_Y, ARG_Z, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { + FORCE_INLINE static bool buffer_line(ARG_X, ARG_Y, ARG_Z, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { #if PLANNER_LEVELING && IS_CARTESIAN apply_leveling(rx, ry, rz); #endif - buffer_segment(rx, ry, rz, e, fr_mm_s, extruder, millimeters); + return buffer_segment(rx, ry, rz, e, fr_mm_s, extruder, millimeters); } /** @@ -502,7 +559,7 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - FORCE_INLINE static void buffer_line_kinematic(const float (&cart)[XYZE], const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { + FORCE_INLINE static bool buffer_line_kinematic(const float (&cart)[XYZE], const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { #if PLANNER_LEVELING float raw[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; apply_leveling(raw); @@ -511,9 +568,9 @@ class Planner { #endif #if IS_KINEMATIC inverse_kinematics(raw); - buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); + return buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); #else - buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); + return buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); #endif } @@ -538,72 +595,126 @@ class Planner { FORCE_INLINE static void set_e_position_mm(const float &e) { set_position_mm(E_AXIS, e); } /** - * Sync from the stepper positions. (e.g., after an interrupted move) + * Get an axis position according to stepper position(s) + * For CORE machines apply translation from ABC to XYZ. */ - static void sync_from_steppers(); + static float get_axis_position_mm(const AxisEnum axis); + + // SCARA AB axes are in degrees, not mm + #if IS_SCARA + FORCE_INLINE static float get_axis_position_degrees(const AxisEnum axis) { return get_axis_position_mm(axis); } + #endif + + // Called to force a quick stop of the machine (for example, when an emergency + // stop is required, or when endstops are hit) + static void quick_stop(); + + // Called when an endstop is triggered. Causes the machine to stop inmediately + static void endstop_triggered(const AxisEnum axis); + + // Triggered position of an axis in mm (not core-savvy) + static float triggered_position_mm(const AxisEnum axis); + + // Block until all buffered steps are executed / cleaned + static void synchronize(); + + // Wait for moves to finish and disable all steppers + static void finish_and_disable(); + + // Periodic tick to handle cleaning timeouts + // Called from the Temperature ISR at ~1kHz + static void tick() { + if (cleaning_buffer_counter) { + --cleaning_buffer_counter; + #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) + if (!cleaning_buffer_counter) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + #endif + } + } /** * Does the buffer have any blocks queued? */ FORCE_INLINE static bool has_blocks_queued() { return (block_buffer_head != block_buffer_tail); } - /** - * "Discard" the block and "release" the memory. - * Called when the current block is no longer needed. - */ - FORCE_INLINE static void discard_current_block() { - if (has_blocks_queued()) - block_buffer_tail = BLOCK_MOD(block_buffer_tail + 1); - } - - /** - * "Discard" the next block if it's continued. - * Called after an interrupted move to throw away the rest of the move. - */ - FORCE_INLINE static bool discard_continued_block() { - const bool discard = has_blocks_queued() && TEST(block_buffer[block_buffer_tail].flag, BLOCK_BIT_CONTINUED); - if (discard) discard_current_block(); - return discard; - } - /** * The current block. NULL if the buffer is empty. * This also marks the block as busy. * WARNING: Called from Stepper ISR context! */ static block_t* get_current_block() { - if (has_blocks_queued()) { + + // Get the number of moves in the planner queue so far + uint8_t nr_moves = movesplanned(); + + // If there are any moves queued ... + if (nr_moves) { + + // If there is still delay of delivery of blocks running, decrement it + if (delay_before_delivering) { + --delay_before_delivering; + // If the number of movements queued is less than 3, and there is still time + // to wait, do not deliver anything + if (nr_moves < 3 && delay_before_delivering) return NULL; + delay_before_delivering = 0; + } + + // If we are here, there is no excuse to deliver the block block_t * const block = &block_buffer[block_buffer_tail]; - // If the block has no trapezoid calculated, it's unsafe to execute. - if (movesplanned() > 1) { - const block_t * const next = &block_buffer[next_block_index(block_buffer_tail)]; - if (TEST(block->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) - return NULL; - } - else if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) - return NULL; + // No trapezoid calculated? Don't execute yet. + if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return NULL; #if ENABLED(ULTRA_LCD) block_buffer_runtime_us -= block->segment_time_us; // We can't be sure how long an active block will take, so don't count it. #endif + + // Mark the block as busy, so the planner does not attempt to replan it SBI(block->flag, BLOCK_BIT_BUSY); return block; } - else { - #if ENABLED(ULTRA_LCD) - clear_block_buffer_runtime(); // paranoia. Buffer is empty now - so reset accumulated time to zero. - #endif - return NULL; + + // The queue became empty + #if ENABLED(ULTRA_LCD) + clear_block_buffer_runtime(); // paranoia. Buffer is empty now - so reset accumulated time to zero. + #endif + + return NULL; + } + + /** + * "Discard" the block and "release" the memory. + * Called when the current block is no longer needed. + * NB: There MUST be a current block to call this function!! + */ + FORCE_INLINE static void discard_current_block() { + if (has_blocks_queued()) { // Discard non-empty buffer. + uint8_t block_index = next_block_index( block_buffer_tail ); + + // Push block_buffer_planned pointer, if encountered. + if (!has_blocks_queued()) block_buffer_planned = block_index; + + block_buffer_tail = block_index; } } #if ENABLED(ULTRA_LCD) static uint16_t block_buffer_runtime() { - CRITICAL_SECTION_START - millis_t bbru = block_buffer_runtime_us; - CRITICAL_SECTION_END + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + millis_t bbru = block_buffer_runtime_us; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + // To translate µs to ms a division by 1000 would be required. // We introduce 2.4% error here by dividing by 1024. // Doesn't matter because block_buffer_runtime_us is already too small an estimation. @@ -614,9 +725,19 @@ class Planner { } static void clear_block_buffer_runtime() { - CRITICAL_SECTION_START - block_buffer_runtime_us = 0; - CRITICAL_SECTION_END + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + block_buffer_runtime_us = 0; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif } #endif @@ -628,13 +749,21 @@ class Planner { static void autotemp_M104_M109(); #endif + #if ENABLED(JUNCTION_DEVIATION) + FORCE_INLINE static void recalculate_max_e_jerk_factor() { + #if ENABLED(LIN_ADVANCE) + max_e_jerk_factor = SQRT(SQRT(0.5) * junction_deviation_mm) * RECIPROCAL(1.0 - SQRT(0.5)); + #endif + } + #endif + private: /** * Get the index of the next / previous block in the ring buffer */ - static constexpr int8_t next_block_index(const int8_t block_index) { return BLOCK_MOD(block_index + 1); } - static constexpr int8_t prev_block_index(const int8_t block_index) { return BLOCK_MOD(block_index - 1); } + static constexpr uint8_t next_block_index(const uint8_t block_index) { return BLOCK_MOD(block_index + 1); } + static constexpr uint8_t prev_block_index(const uint8_t block_index) { return BLOCK_MOD(block_index - 1); } /** * Calculate the distance (not time) it takes to accelerate @@ -659,15 +788,15 @@ class Planner { } /** - * Calculate the maximum allowable speed at this point, in order - * to reach 'target_velocity' using 'acceleration' within a given + * Calculate the maximum allowable speed squared at this point, in order + * to reach 'target_velocity_sqr' using 'acceleration' within a given * 'distance'. */ - static float max_allowable_speed(const float &accel, const float &target_velocity, const float &distance) { - return SQRT(sq(target_velocity) - 2 * accel * distance); + static float max_allowable_speed_sqr(const float &accel, const float &target_velocity_sqr, const float &distance) { + return target_velocity_sqr - 2 * accel * distance; } - #if ENABLED(BEZIER_JERK_CONTROL) + #if ENABLED(S_CURVE_ACCELERATION) /** * Calculate the speed reached given initial speed, acceleration and distance */ @@ -679,7 +808,7 @@ class Planner { static void calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor); static void reverse_pass_kernel(block_t* const current, const block_t * const next); - static void forward_pass_kernel(const block_t * const previous, block_t* const current); + static void forward_pass_kernel(const block_t * const previous, block_t* const current, uint8_t block_index); static void reverse_pass(); static void forward_pass(); @@ -688,9 +817,32 @@ class Planner { static void recalculate(); + #if ENABLED(JUNCTION_DEVIATION) + + #if ENABLED(JUNCTION_DEVIATION_INCLUDE_E) + #define JD_AXES XYZE + #else + #define JD_AXES XYZ + #endif + + FORCE_INLINE static void normalize_junction_vector(float (&vector)[JD_AXES]) { + float magnitude_sq = 0.0; + for (uint8_t idx = 0; idx < JD_AXES; idx++) if (vector[idx]) magnitude_sq += sq(vector[idx]); + const float inv_magnitude = 1.0 / SQRT(magnitude_sq); + for (uint8_t idx = 0; idx < JD_AXES; idx++) vector[idx] *= inv_magnitude; + } + + FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, float (&unit_vec)[JD_AXES]) { + float limit_value = max_value; + for (uint8_t idx = 0; idx < JD_AXES; idx++) if (unit_vec[idx]) // Avoid divide by zero + NOMORE(limit_value, ABS(max_acceleration_mm_per_s2[idx] / unit_vec[idx])); + return limit_value; + } + + #endif // JUNCTION_DEVIATION }; -#define PLANNER_XY_FEEDRATE() (min(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS])) +#define PLANNER_XY_FEEDRATE() (MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS])) extern Planner planner; diff --git a/Marlin/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp similarity index 94% rename from Marlin/planner_bezier.cpp rename to Marlin/src/module/planner_bezier.cpp index d6dd35f1c9..caf2528895 100644 --- a/Marlin/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -27,22 +27,24 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(BEZIER_CURVE_SUPPORT) #include "planner.h" -#include "language.h" +#include "motion.h" #include "temperature.h" -#include "Marlin.h" + +#include "../Marlin.h" +#include "../core/language.h" +#include "../gcode/queue.h" // See the meaning in the documentation of cubic_b_spline(). #define MIN_STEP 0.002 #define MAX_STEP 0.1 #define SIGMA 0.1 -/* Compute the linear interpolation between to real numbers. -*/ +// Compute the linear interpolation between two real numbers. inline static float interp(float a, float b, float t) { return (1.0 - t) * a + t * b; } /** @@ -65,7 +67,7 @@ inline static float eval_bezier(float a, float b, float c, float d, float t) { * We approximate Euclidean distance with the sum of the coordinates * offset (so-called "norm 1"), which is quicker to compute. */ -inline static float dist1(float x1, float y1, float x2, float y2) { return FABS(x1 - x2) + FABS(y1 - y2); } +inline static float dist1(float x1, float y1, float x2, float y2) { return ABS(x1 - x2) + ABS(y1 - y2); } /** * The algorithm for computing the step is loosely based on the one in Kig @@ -188,12 +190,15 @@ void cubic_b_spline(const float position[NUM_AXIS], const float target[NUM_AXIS] bez_target[Z_AXIS] = interp(position[Z_AXIS], target[Z_AXIS], t); bez_target[E_AXIS] = interp(position[E_AXIS], target[E_AXIS], t); clamp_to_software_endstops(bez_target); + #if HAS_UBL_AND_CURVES float pos[XYZ] = { bez_target[X_AXIS], bez_target[Y_AXIS], bez_target[Z_AXIS] }; planner.apply_leveling(pos); - planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], bez_target[E_AXIS], fr_mm_s, active_extruder); + if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], bez_target[E_AXIS], fr_mm_s, active_extruder)) + break; #else - planner.buffer_line_kinematic(bez_target, fr_mm_s, extruder); + if (!planner.buffer_line_kinematic(bez_target, fr_mm_s, extruder)) + break; #endif } } diff --git a/Marlin/planner_bezier.h b/Marlin/src/module/planner_bezier.h similarity index 93% rename from Marlin/planner_bezier.h rename to Marlin/src/module/planner_bezier.h index d17e7c80a0..7e4ea23657 100644 --- a/Marlin/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -23,14 +23,14 @@ /** * planner_bezier.h * - * Compute and buffer movement commands for bezier curves + * Compute and buffer movement commands for Bézier curves * */ #ifndef PLANNER_BEZIER_H #define PLANNER_BEZIER_H -#include "Marlin.h" +#include "../inc/MarlinConfig.h" void cubic_b_spline( const float position[NUM_AXIS], // current position diff --git a/Marlin/printcounter.cpp b/Marlin/src/module/printcounter.cpp similarity index 94% rename from Marlin/printcounter.cpp rename to Marlin/src/module/printcounter.cpp index 25212cde4e..66c6f2fbc4 100644 --- a/Marlin/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -20,33 +20,26 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if DISABLED(PRINTCOUNTER) -#include "stopwatch.h" +#include "../libs/stopwatch.h" Stopwatch print_job_timer; // Global Print Job Timer instance #else // PRINTCOUNTER #include "printcounter.h" -#include "duration_t.h" -#include "Marlin.h" +#include "../Marlin.h" PrintCounter print_job_timer; // Global Print Job Timer instance -#if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) - // round up address to next page boundary (assuming 32 byte pages) - #define STATS_EEPROM_ADDRESS 0x40 -#else - #define STATS_EEPROM_ADDRESS 0x32 -#endif +printStatistics PrintCounter::data; const PrintCounter::promdress PrintCounter::address = STATS_EEPROM_ADDRESS; const uint16_t PrintCounter::updateInterval = 10; const uint16_t PrintCounter::saveInterval = 3600; -printStatistics PrintCounter::data; millis_t PrintCounter::lastDuration; bool PrintCounter::loaded = false; diff --git a/Marlin/printcounter.h b/Marlin/src/module/printcounter.h similarity index 93% rename from Marlin/printcounter.h rename to Marlin/src/module/printcounter.h index 299405a6b4..db6f74606f 100644 --- a/Marlin/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -23,13 +23,19 @@ #ifndef PRINTCOUNTER_H #define PRINTCOUNTER_H +#include "../libs/stopwatch.h" +#include "../libs/duration_t.h" +#include "../inc/MarlinConfig.h" + // Print debug messages with M111 S2 //#define DEBUG_PRINTCOUNTER -#include "macros.h" -#include "language.h" -#include "stopwatch.h" -#include +#if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) + // round up address to next page boundary (assuming 32 byte pages) + #define STATS_EEPROM_ADDRESS 0x40 +#else + #define STATS_EEPROM_ADDRESS 0x32 +#endif struct printStatistics { // 16 bytes (20 with real doubles) //const uint8_t magic; // Magic header, it will always be 0x16 @@ -44,7 +50,7 @@ class PrintCounter: public Stopwatch { private: typedef Stopwatch super; - #if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) + #if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) || defined(CPU_32_BIT) typedef uint32_t promdress; #else typedef uint16_t promdress; diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp new file mode 100644 index 0000000000..f3503cfad1 --- /dev/null +++ b/Marlin/src/module/probe.cpp @@ -0,0 +1,758 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * probe.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + +#include "probe.h" +#include "motion.h" +#include "temperature.h" +#include "endstops.h" + +#include "../gcode/gcode.h" +#include "../lcd/ultralcd.h" + +#include "../Marlin.h" + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(DELTA) + #include "../module/delta.h" +#endif + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "planner.h" +#endif + +float zprobe_zoffset; // Initialized by settings.load() + +#if HAS_Z_SERVO_PROBE + #include "../module/servo.h" + const int z_servo_angle[2] = Z_SERVO_ANGLES; +#endif + +#if ENABLED(Z_PROBE_SLED) + + #ifndef SLED_DOCKING_OFFSET + #define SLED_DOCKING_OFFSET 0 + #endif + + /** + * Method to dock/undock a sled designed by Charles Bell. + * + * stow[in] If false, move to MAX_X and engage the solenoid + * If true, move to MAX_X and release the solenoid + */ + static void dock_sled(bool stow) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("dock_sled(", stow); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + // Dock sled a bit closer to ensure proper capturing + do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET - ((stow) ? 1 : 0)); + + #if HAS_SOLENOID_1 && DISABLED(EXT_SOLENOID) + WRITE(SOL1_PIN, !stow); // switch solenoid + #endif + } + +#elif ENABLED(Z_PROBE_ALLEN_KEY) + + FORCE_INLINE void do_blocking_move_to(const float (&raw)[XYZ], const float &fr_mm_s) { + do_blocking_move_to(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], fr_mm_s); + } + + void run_deploy_moves_script() { + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE 0.0 + #endif + const float deploy_1[] = { Z_PROBE_ALLEN_KEY_DEPLOY_1_X, Z_PROBE_ALLEN_KEY_DEPLOY_1_Y, Z_PROBE_ALLEN_KEY_DEPLOY_1_Z }; + do_blocking_move_to(deploy_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE 0.0 + #endif + const float deploy_2[] = { Z_PROBE_ALLEN_KEY_DEPLOY_2_X, Z_PROBE_ALLEN_KEY_DEPLOY_2_Y, Z_PROBE_ALLEN_KEY_DEPLOY_2_Z }; + do_blocking_move_to(deploy_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE 0.0 + #endif + const float deploy_3[] = { Z_PROBE_ALLEN_KEY_DEPLOY_3_X, Z_PROBE_ALLEN_KEY_DEPLOY_3_Y, Z_PROBE_ALLEN_KEY_DEPLOY_3_Z }; + do_blocking_move_to(deploy_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE 0.0 + #endif + const float deploy_4[] = { Z_PROBE_ALLEN_KEY_DEPLOY_4_X, Z_PROBE_ALLEN_KEY_DEPLOY_4_Y, Z_PROBE_ALLEN_KEY_DEPLOY_4_Z }; + do_blocking_move_to(deploy_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE 0.0 + #endif + const float deploy_5[] = { Z_PROBE_ALLEN_KEY_DEPLOY_5_X, Z_PROBE_ALLEN_KEY_DEPLOY_5_Y, Z_PROBE_ALLEN_KEY_DEPLOY_5_Z }; + do_blocking_move_to(deploy_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE)); + #endif + } + + void run_stow_moves_script() { + #if defined(Z_PROBE_ALLEN_KEY_STOW_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_1_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_1_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Z + #define Z_PROBE_ALLEN_KEY_STOW_1_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE 0.0 + #endif + const float stow_1[] = { Z_PROBE_ALLEN_KEY_STOW_1_X, Z_PROBE_ALLEN_KEY_STOW_1_Y, Z_PROBE_ALLEN_KEY_STOW_1_Z }; + do_blocking_move_to(stow_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_STOW_2_X) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_2_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Z + #define Z_PROBE_ALLEN_KEY_STOW_2_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE 0.0 + #endif + const float stow_2[] = { Z_PROBE_ALLEN_KEY_STOW_2_X, Z_PROBE_ALLEN_KEY_STOW_2_Y, Z_PROBE_ALLEN_KEY_STOW_2_Z }; + do_blocking_move_to(stow_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_STOW_3_X) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_X + #define Z_PROBE_ALLEN_KEY_STOW_3_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_3_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE 0.0 + #endif + const float stow_3[] = { Z_PROBE_ALLEN_KEY_STOW_3_X, Z_PROBE_ALLEN_KEY_STOW_3_Y, Z_PROBE_ALLEN_KEY_STOW_3_Z }; + do_blocking_move_to(stow_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_STOW_4_X) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_X + #define Z_PROBE_ALLEN_KEY_STOW_4_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Y + #define Z_PROBE_ALLEN_KEY_STOW_4_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE 0.0 + #endif + const float stow_4[] = { Z_PROBE_ALLEN_KEY_STOW_4_X, Z_PROBE_ALLEN_KEY_STOW_4_Y, Z_PROBE_ALLEN_KEY_STOW_4_Z }; + do_blocking_move_to(stow_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE)); + #endif + #if defined(Z_PROBE_ALLEN_KEY_STOW_5_X) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_X + #define Z_PROBE_ALLEN_KEY_STOW_5_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Y + #define Z_PROBE_ALLEN_KEY_STOW_5_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Z + #define Z_PROBE_ALLEN_KEY_STOW_5_Z current_position[Z_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE 0.0 + #endif + const float stow_5[] = { Z_PROBE_ALLEN_KEY_STOW_5_X, Z_PROBE_ALLEN_KEY_STOW_5_Y, Z_PROBE_ALLEN_KEY_STOW_5_Z }; + do_blocking_move_to(stow_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE)); + #endif + } + +#endif // Z_PROBE_ALLEN_KEY + +#if ENABLED(PROBING_FANS_OFF) + + void fans_pause(const bool p) { + if (p != fans_paused) { + fans_paused = p; + if (p) + for (uint8_t x = 0; x < FAN_COUNT; x++) { + paused_fanSpeeds[x] = fanSpeeds[x]; + fanSpeeds[x] = 0; + } + else + for (uint8_t x = 0; x < FAN_COUNT; x++) + fanSpeeds[x] = paused_fanSpeeds[x]; + } + } + +#endif // PROBING_FANS_OFF + +#if QUIET_PROBING + void probing_pause(const bool p) { + #if ENABLED(PROBING_HEATERS_OFF) + thermalManager.pause(p); + #endif + #if ENABLED(PROBING_FANS_OFF) + fans_pause(p); + #endif + if (p) safe_delay( + #if DELAY_BEFORE_PROBING > 25 + DELAY_BEFORE_PROBING + #else + 25 + #endif + ); + } +#endif // QUIET_PROBING + +#if ENABLED(BLTOUCH) + + void bltouch_command(const int angle) { + MOVE_SERVO(Z_PROBE_SERVO_NR, angle); // Give the BL-Touch the command and wait + safe_delay(BLTOUCH_DELAY); + } + + bool set_bltouch_deployed(const bool deploy) { + if (deploy && TEST_BLTOUCH()) { // If BL-Touch says it's triggered + bltouch_command(BLTOUCH_RESET); // try to reset it. + bltouch_command(BLTOUCH_DEPLOY); // Also needs to deploy and stow to + bltouch_command(BLTOUCH_STOW); // clear the triggered condition. + safe_delay(1500); // Wait for internal self-test to complete. + // (Measured completion time was 0.65 seconds + // after reset, deploy, and stow sequence) + if (TEST_BLTOUCH()) { // If it still claims to be triggered... + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_STOP_BLTOUCH); + stop(); // punt! + return true; + } + } + + bltouch_command(deploy ? BLTOUCH_DEPLOY : BLTOUCH_STOW); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("set_bltouch_deployed(", deploy); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + return false; + } + +#endif // BLTOUCH + +/** + * Raise Z to a minimum height to make room for a probe to move + */ +inline void do_probe_raise(const float z_raise) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("do_probe_raise(", z_raise); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + float z_dest = z_raise; + if (zprobe_zoffset < 0) z_dest -= zprobe_zoffset; + + NOMORE(z_dest, Z_MAX_POS); + + if (z_dest > current_position[Z_AXIS]) + do_blocking_move_to_z(z_dest); +} + +// returns false for ok and true for failure +bool set_probe_deployed(const bool deploy) { + + // Can be extended to servo probes, if needed. + #if ENABLED(PROBE_IS_TRIGGERED_WHEN_STOWED_TEST) + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) + #else + #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) + #endif + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + DEBUG_POS("set_probe_deployed", current_position); + SERIAL_ECHOLNPAIR("deploy: ", deploy); + } + #endif + + if (endstops.z_probe_enabled == deploy) return false; + + // Make room for probe to deploy (or stow) + // Fix-mounted probe should only raise for deploy + #if ENABLED(FIX_MOUNTED_PROBE) + const bool deploy_stow_condition = deploy; + #else + constexpr bool deploy_stow_condition = true; + #endif + + // For beds that fall when Z is powered off only raise for trusted Z + #if ENABLED(UNKNOWN_Z_NO_RAISE) + const bool unknown_condition = TEST(axis_known_position, Z_AXIS); + #else + constexpr float unknown_condition = true; + #endif + + if (deploy_stow_condition && unknown_condition) + do_probe_raise(MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); + + #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) + #if ENABLED(Z_PROBE_SLED) + #define _AUE_ARGS true, false, false + #else + #define _AUE_ARGS + #endif + if (axis_unhomed_error(_AUE_ARGS)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_STOP_UNHOMED); + stop(); + return true; + } + #endif + + const float oldXpos = current_position[X_AXIS], + oldYpos = current_position[Y_AXIS]; + + #ifdef _TRIGGERED_WHEN_STOWED_TEST + + // If endstop is already false, the Z probe is deployed + if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // closed after the probe specific actions. + // Would a goto be less ugly? + //while (!_TRIGGERED_WHEN_STOWED_TEST) idle(); // would offer the opportunity + // for a triggered when stowed manual probe. + + if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early + // otherwise an Allen-Key probe can't be stowed. + #endif + + #if ENABLED(SOLENOID_PROBE) + + #if HAS_SOLENOID_1 + WRITE(SOL1_PIN, deploy); + #endif + + #elif ENABLED(Z_PROBE_SLED) + + dock_sled(!deploy); + + #elif HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH) + + MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[deploy ? 0 : 1]); + + #elif ENABLED(Z_PROBE_ALLEN_KEY) + + deploy ? run_deploy_moves_script() : run_stow_moves_script(); + + #endif + + #ifdef _TRIGGERED_WHEN_STOWED_TEST + } // _TRIGGERED_WHEN_STOWED_TEST == deploy + + if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // State hasn't changed? + + if (IsRunning()) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Z-Probe failed"); + LCD_ALERTMESSAGEPGM("Err: ZPROBE"); + } + stop(); + return true; + + } // _TRIGGERED_WHEN_STOWED_TEST == deploy + + #endif + + do_blocking_move_to(oldXpos, oldYpos, current_position[Z_AXIS]); // return to position before deploy + endstops.enable_z_probe(deploy); + return false; +} + +#ifdef Z_AFTER_PROBING + // After probing move to a preferred Z position + void move_z_after_probing() { + if (current_position[Z_AXIS] != Z_AFTER_PROBING) { + do_blocking_move_to_z(Z_AFTER_PROBING); + current_position[Z_AXIS] = Z_AFTER_PROBING; + } + } +#endif + +/** + * @brief Used by run_z_probe to do a single Z probe move. + * + * @param z Z destination + * @param fr_mm_s Feedrate in mm/s + * @return true to indicate an error + */ + +#if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + const char msg_wait_for_bed_heating[25] PROGMEM = "Wait for bed heating...\n"; +#endif + +static bool do_probe_move(const float z, const float fr_mm_s) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> do_probe_move", current_position); + #endif + + #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + if (thermalManager.isHeatingBed()) { + serialprintPGM(msg_wait_for_bed_heating); + LCD_MESSAGEPGM(MSG_BED_HEATING); + while (thermalManager.isHeatingBed()) safe_delay(200); + lcd_reset_status(); + } + #endif + + // Deploy BLTouch at the start of any probe + #if ENABLED(BLTOUCH) + if (set_bltouch_deployed(true)) return true; + #endif + + #if QUIET_PROBING + probing_pause(true); + #endif + + // Move down until probe triggered + do_blocking_move_to_z(z, fr_mm_s); + + // Check to see if the probe was triggered + const bool probe_triggered = TEST(endstops.trigger_state(), + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + Z_MIN + #else + Z_MIN_PROBE + #endif + ); + + #if QUIET_PROBING + probing_pause(false); + #endif + + // Retract BLTouch immediately after a probe if it was triggered + #if ENABLED(BLTOUCH) + if (probe_triggered && set_bltouch_deployed(false)) return true; + #endif + + // Clear endstop flags + endstops.hit_on_purpose(); + + // Get Z where the steppers were interrupted + set_current_from_steppers_for_axis(Z_AXIS); + + // Tell the planner where we actually are + SYNC_PLAN_POSITION_KINEMATIC(); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< do_probe_move", current_position); + #endif + + return !probe_triggered; +} + +/** + * @details Used by probe_pt to do a single Z probe at the current position. + * Leaves current_position[Z_AXIS] at the height where the probe triggered. + * + * @return The raw Z position where the probe was triggered + */ +static float run_z_probe() { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position); + #endif + + // Stop the probe before it goes too low to prevent damage. + // If Z isn't known then probe to -10mm. + const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0; + + // Double-probing does a fast probe followed by a slow probe + #if MULTIPLE_PROBING == 2 + + // Do a first probe at the fast speed + if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("FAST Probe fail!"); + DEBUG_POS("<<< run_z_probe", current_position); + } + #endif + return NAN; + } + + float first_probe_z = current_position[Z_AXIS]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("1st Probe Z:", first_probe_z); + #endif + + // move up to make clearance for the probe + do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + + #else + + // If the nozzle is well over the travel height then + // move down quickly before doing the slow probe + float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0; + if (zprobe_zoffset < 0) z -= zprobe_zoffset; + + if (current_position[Z_AXIS] > z) { + // If we don't make it to the z position (i.e. the probe triggered), move up to make clearance for the probe + if (!do_probe_move(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) + do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + } + #endif + + #if MULTIPLE_PROBING > 2 + float probes_total = 0; + for (uint8_t p = MULTIPLE_PROBING + 1; --p;) { + #endif + + // move down slowly to find bed + if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW))) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("SLOW Probe fail!"); + DEBUG_POS("<<< run_z_probe", current_position); + } + #endif + return NAN; + } + + #if MULTIPLE_PROBING > 2 + probes_total += current_position[Z_AXIS]; + if (p > 1) do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + } + #endif + + #if MULTIPLE_PROBING > 2 + + // Return the average value of all probes + const float measured_z = probes_total * (1.0 / (MULTIPLE_PROBING)); + + #elif MULTIPLE_PROBING == 2 + + const float z2 = current_position[Z_AXIS]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("2nd Probe Z:", z2); + SERIAL_ECHOLNPAIR(" Discrepancy:", first_probe_z - z2); + } + #endif + + // Return a weighted average of the fast and slow probes + const float measured_z = (z2 * 3.0 + first_probe_z * 2.0) * 0.2; + + #else + + // Return the single probe result + const float measured_z = current_position[Z_AXIS]; + + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< run_z_probe", current_position); + #endif + + return measured_z; +} + +/** + * - Move to the given XY + * - Deploy the probe, if not already deployed + * - Probe the bed, get the Z position + * - Depending on the 'stow' flag + * - Stow the probe, or + * - Raise to the BETWEEN height + * - Return the probed Z position + */ +float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> probe_pt(", LOGICAL_X_POSITION(rx)); + SERIAL_ECHOPAIR(", ", LOGICAL_Y_POSITION(ry)); + SERIAL_ECHOPAIR(", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none"); + SERIAL_ECHOPAIR(", ", int(verbose_level)); + SERIAL_ECHOPAIR(", ", probe_relative ? "probe" : "nozzle"); + SERIAL_ECHOLNPGM("_relative)"); + DEBUG_POS("", current_position); + } + #endif + + // TODO: Adapt for SCARA, where the offset rotates + float nx = rx, ny = ry; + if (probe_relative) { + if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe + nx -= (X_PROBE_OFFSET_FROM_EXTRUDER); // Get the nozzle position + ny -= (Y_PROBE_OFFSET_FROM_EXTRUDER); + } + else if (!position_is_reachable(nx, ny)) return NAN; // The given position is in terms of the nozzle + + const float nz = + #if ENABLED(DELTA) + // Move below clip height or xy move will be aborted by do_blocking_move_to + MIN(current_position[Z_AXIS], delta_clip_start_height) + #else + current_position[Z_AXIS] + #endif + ; + + const float old_feedrate_mm_s = feedrate_mm_s; + feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; + + // Move the probe to the starting XYZ + do_blocking_move_to(nx, ny, nz); + + float measured_z = NAN; + if (!DEPLOY_PROBE()) { + measured_z = run_z_probe() + zprobe_zoffset; + + const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; + if (big_raise || raise_after == PROBE_PT_RAISE) + do_blocking_move_to_z(current_position[Z_AXIS] + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + else if (raise_after == PROBE_PT_STOW) + if (STOW_PROBE()) measured_z = NAN; + } + + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM("Bed X: "); + SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 3); + SERIAL_PROTOCOLPGM(" Y: "); + SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 3); + SERIAL_PROTOCOLPGM(" Z: "); + SERIAL_PROTOCOL_F(measured_z, 3); + SERIAL_EOL(); + } + + feedrate_mm_s = old_feedrate_mm_s; + + if (isnan(measured_z)) { + LCD_MESSAGEPGM(MSG_ERR_PROBING_FAILED); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_PROBING_FAILED); + } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< probe_pt"); + #endif + + return measured_z; +} + +#if HAS_Z_SERVO_PROBE + + void servo_probe_init() { + /** + * Set position of Z Servo Endstop + * + * The servo might be deployed and positioned too low to stow + * when starting up the machine or rebooting the board. + * There's no way to know where the nozzle is positioned until + * homing has been done - no homing with z-probe without init! + * + */ + STOW_Z_SERVO(); + } + +#endif // HAS_Z_SERVO_PROBE + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h new file mode 100644 index 0000000000..3014a8966a --- /dev/null +++ b/Marlin/src/module/probe.h @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * probe.h - Move, deploy, enable, etc. + */ + +#ifndef PROBE_H +#define PROBE_H + +#include "../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + extern float zprobe_zoffset; + bool set_probe_deployed(const bool deploy); + #ifdef Z_AFTER_PROBING + void move_z_after_probing(); + #endif + enum ProbePtRaise : unsigned char { + PROBE_PT_NONE, // No raise or stow after run_z_probe + PROBE_PT_STOW, // Do a complete stow after run_z_probe + PROBE_PT_RAISE, // Raise to "between" clearance after run_z_probe + PROBE_PT_BIG_RAISE // Raise to big clearance after run_z_probe + }; + float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true); + #define DEPLOY_PROBE() set_probe_deployed(true) + #define STOW_PROBE() set_probe_deployed(false) + #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + extern const char msg_wait_for_bed_heating[25]; + #endif +#else + #define DEPLOY_PROBE() + #define STOW_PROBE() +#endif + +#if HAS_Z_SERVO_PROBE + extern const int z_servo_angle[2]; + void servo_probe_init(); +#endif + +#if QUIET_PROBING + void probing_pause(const bool p); +#endif + +#if ENABLED(PROBING_FANS_OFF) + void fans_pause(const bool p); +#endif + +#if ENABLED(BLTOUCH) + void bltouch_command(int angle); + bool set_bltouch_deployed(const bool deploy); + FORCE_INLINE void bltouch_init() { + // Make sure any BLTouch error condition is cleared + bltouch_command(BLTOUCH_RESET); + set_bltouch_deployed(true); + set_bltouch_deployed(false); + } +#endif + +#endif // PROBE_H diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp new file mode 100644 index 0000000000..222bf9cbe4 --- /dev/null +++ b/Marlin/src/module/scara.cpp @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * scara.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + +#include "scara.h" +#include "motion.h" +#include "planner.h" + +float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; + +void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position[Z_AXIS] = Z_HOME_POS; + else { + + /** + * SCARA homes XY at the same time + */ + float homeposition[XYZ]; + LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); + + // SERIAL_ECHOPAIR("homeposition X:", homeposition[X_AXIS]); + // SERIAL_ECHOLNPAIR(" Y:", homeposition[Y_AXIS]); + + /** + * Get Home position SCARA arm angles using inverse kinematics, + * and calculate homing offset using forward kinematics + */ + inverse_kinematics(homeposition); + forward_kinematics_SCARA(delta[A_AXIS], delta[B_AXIS]); + + // SERIAL_ECHOPAIR("Cartesian X:", cartes[X_AXIS]); + // SERIAL_ECHOLNPAIR(" Y:", cartes[Y_AXIS]); + + current_position[axis] = cartes[axis]; + + /** + * SCARA home positions are based on configuration since the actual + * limits are determined by the inverse kinematic transform. + */ + soft_endstop_min[axis] = base_min_pos(axis); // + (cartes[axis] - base_home_pos(axis)); + soft_endstop_max[axis] = base_max_pos(axis); // + (cartes[axis] - base_home_pos(axis)); + } +} + +/** + * Morgan SCARA Forward Kinematics. Results in cartes[]. + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ +void forward_kinematics_SCARA(const float &a, const float &b) { + + const float a_sin = sin(RADIANS(a)) * L1, + a_cos = cos(RADIANS(a)) * L1, + b_sin = sin(RADIANS(b)) * L2, + b_cos = cos(RADIANS(b)) * L2; + + cartes[X_AXIS] = a_cos + b_cos + SCARA_OFFSET_X; //theta + cartes[Y_AXIS] = a_sin + b_sin + SCARA_OFFSET_Y; //theta+phi + + /* + SERIAL_ECHOPAIR("SCARA FK Angle a=", a); + SERIAL_ECHOPAIR(" b=", b); + SERIAL_ECHOPAIR(" a_sin=", a_sin); + SERIAL_ECHOPAIR(" a_cos=", a_cos); + SERIAL_ECHOPAIR(" b_sin=", b_sin); + SERIAL_ECHOLNPAIR(" b_cos=", b_cos); + SERIAL_ECHOPAIR(" cartes[X_AXIS]=", cartes[X_AXIS]); + SERIAL_ECHOLNPAIR(" cartes[Y_AXIS]=", cartes[Y_AXIS]); + //*/ +} + +/** + * Morgan SCARA Inverse Kinematics. Results in delta[]. + * + * See http://forums.reprap.org/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ +void inverse_kinematics(const float raw[XYZ]) { + + static float C2, S2, SK1, SK2, THETA, PSI; + + float sx = raw[X_AXIS] - SCARA_OFFSET_X, // Translate SCARA to standard X Y + sy = raw[Y_AXIS] - SCARA_OFFSET_Y; // With scaling factor. + + if (L1 == L2) + C2 = HYPOT2(sx, sy) / L1_2_2 - 1; + else + C2 = (HYPOT2(sx, sy) - (L1_2 + L2_2)) / (2.0 * L1 * L2); + + S2 = SQRT(1 - sq(C2)); + + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; + + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; + + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(sx, sy); + + // Angle of Arm2 + PSI = ATAN2(S2, C2); + + delta[A_AXIS] = DEGREES(THETA); // theta is support arm angle + delta[B_AXIS] = DEGREES(THETA + PSI); // equal to sub arm angle (inverted motor) + delta[C_AXIS] = raw[Z_AXIS]; + + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOPAIR(" SCARA (x,y) ", sx); + SERIAL_ECHOPAIR(",", sy); + SERIAL_ECHOPAIR(" C2=", C2); + SERIAL_ECHOPAIR(" S2=", S2); + SERIAL_ECHOPAIR(" Theta=", THETA); + SERIAL_ECHOLNPAIR(" Phi=", PHI); + //*/ +} + +void scara_report_positions() { + SERIAL_PROTOCOLPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS)); + SERIAL_PROTOCOLLNPAIR(" Psi+Theta:", planner.get_axis_position_degrees(B_AXIS)); + SERIAL_EOL(); +} + +#endif // IS_SCARA diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h new file mode 100644 index 0000000000..501c46dc28 --- /dev/null +++ b/Marlin/src/module/scara.h @@ -0,0 +1,46 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * scara.h - SCARA-specific functions + */ + +#ifndef __SCARA_H__ +#define __SCARA_H__ + +#include "../core/macros.h" + +extern float delta_segments_per_second; + +// Float constants for SCARA calculations +float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + +void scara_set_axis_is_at_home(const AxisEnum axis); + +void inverse_kinematics(const float raw[XYZ]); +void forward_kinematics_SCARA(const float &a, const float &b); + +void scara_report_positions(); + +#endif // __SCARA_H__ diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp new file mode 100644 index 0000000000..a1f9633f78 --- /dev/null +++ b/Marlin/src/module/servo.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * module/servo.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "servo.h" + +HAL_SERVO_LIB servo[NUM_SERVOS]; + +void servo_init() { + #if NUM_SERVOS >= 1 && HAS_SERVO_0 + servo[0].attach(SERVO0_PIN); + servo[0].detach(); // Just set up the pin. We don't have a position yet. Don't move to a random position. + #endif + #if NUM_SERVOS >= 2 && HAS_SERVO_1 + servo[1].attach(SERVO1_PIN); + servo[1].detach(); + #endif + #if NUM_SERVOS >= 3 && HAS_SERVO_2 + servo[2].attach(SERVO2_PIN); + servo[2].detach(); + #endif + #if NUM_SERVOS >= 4 && HAS_SERVO_3 + servo[3].attach(SERVO3_PIN); + servo[3].detach(); + #endif +} + +#endif // HAS_SERVOS diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h new file mode 100644 index 0000000000..77d3f6eb87 --- /dev/null +++ b/Marlin/src/module/servo.h @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * module/servo.h + */ + +#ifndef _SERVO_H_ +#define _SERVO_H_ + +#include "../HAL/servo.h" + +extern HAL_SERVO_LIB servo[NUM_SERVOS]; +extern void servo_init(); + +#define MOVE_SERVO(I, P) servo[I].move(P) + +#include "../inc/MarlinConfig.h" + +#if HAS_Z_SERVO_PROBE + #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[0]) + #define STOW_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, z_servo_angle[1]) +#endif + +#endif // _SERVO_H_ diff --git a/Marlin/speed_lookuptable.h b/Marlin/src/module/speed_lookuptable.h similarity index 99% rename from Marlin/speed_lookuptable.h rename to Marlin/src/module/speed_lookuptable.h index 72e96e0f86..c251a7ffc1 100644 --- a/Marlin/speed_lookuptable.h +++ b/Marlin/src/module/speed_lookuptable.h @@ -23,8 +23,6 @@ #ifndef SPEED_LOOKUPTABLE_H #define SPEED_LOOKUPTABLE_H -#include "MarlinConfig.h" - #if F_CPU == 16000000 const uint16_t speed_lookuptable_fast[256][2] PROGMEM = { diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp new file mode 100644 index 0000000000..369cadfb54 --- /dev/null +++ b/Marlin/src/module/stepper.cpp @@ -0,0 +1,2575 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * stepper.cpp - A singleton object to execute motion plans using stepper motors + * Marlin Firmware + * + * Derived from Grbl + * Copyright (c) 2009-2011 Simen Svale Skogsrud + * + * Grbl 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 3 of the License, or + * (at your option) any later version. + * + * Grbl 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 Grbl. If not, see . + */ + +/** + * Timer calculations informed by the 'RepRap cartesian firmware' by Zack Smith + * and Philipp Tiefenbacher. + */ + +/** + * __________________________ + * /| |\ _________________ ^ + * / | | \ /| |\ | + * / | | \ / | | \ s + * / | | | | | \ p + * / | | | | | \ e + * +-----+------------------------+---+--+---------------+----+ e + * | BLOCK 1 | BLOCK 2 | d + * + * time -----> + * + * The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates + * first block->accelerate_until step_events_completed, then keeps going at constant speed until + * step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. + * The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. + */ + +/** + * Marlin uses the Bresenham algorithm. For a detailed explanation of theory and + * method see https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html + */ + +/** + * Jerk controlled movements planner added Apr 2018 by Eduardo José Tagle. + * Equations based on Synthethos TinyG2 sources, but the fixed-point + * implementation is new, as we are running the ISR with a variable period. + * Also implemented the Bézier velocity curve evaluation in ARM assembler, + * to avoid impacting ISR speed. + */ + +#include "stepper.h" + +#ifdef __AVR__ + #include "speed_lookuptable.h" +#endif + +#include "endstops.h" +#include "planner.h" +#include "motion.h" + +#include "../module/temperature.h" +#include "../lcd/ultralcd.h" +#include "../core/language.h" +#include "../gcode/queue.h" +#include "../sd/cardreader.h" +#include "../Marlin.h" +#include "../HAL/Delay.h" + +#if MB(ALLIGATOR) + #include "../feature/dac/dac_dac084s085.h" +#endif + +#if HAS_DIGIPOTSS + #include +#endif + +Stepper stepper; // Singleton + +// public: + +block_t* Stepper::current_block = NULL; // A pointer to the block currently being traced + +#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::homing_dual_axis = false; +#endif + +#if HAS_MOTOR_CURRENT_PWM + uint32_t Stepper::motor_current_setting[3]; // Initialized by settings.load() +#endif + +// private: + +uint8_t Stepper::last_direction_bits = 0, + Stepper::axis_did_move; + +bool Stepper::abort_current_block; + +#if DISABLED(MIXING_EXTRUDER) + uint8_t Stepper::last_moved_extruder = 0xFF; +#endif + +#if ENABLED(X_DUAL_ENDSTOPS) + bool Stepper::locked_X_motor = false, Stepper::locked_X2_motor = false; +#endif +#if ENABLED(Y_DUAL_ENDSTOPS) + bool Stepper::locked_Y_motor = false, Stepper::locked_Y2_motor = false; +#endif +#if ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false; +#endif + +uint32_t Stepper::acceleration_time, Stepper::deceleration_time; +uint8_t Stepper::steps_per_isr; + +#if DISABLED(ADAPTIVE_STEP_SMOOTHING) + constexpr +#endif + uint8_t Stepper::oversampling_factor; + +int32_t Stepper::delta_error[XYZE] = { 0 }; + +uint32_t Stepper::advance_dividend[XYZE] = { 0 }, + Stepper::advance_divisor = 0, + Stepper::step_events_completed = 0, // The number of step events executed in the current block + Stepper::accelerate_until, // The point from where we need to stop acceleration + Stepper::decelerate_after, // The point from where we need to start decelerating + Stepper::step_event_count; // The total event count for the current block + +#if ENABLED(MIXING_EXTRUDER) + int32_t Stepper::delta_error_m[MIXING_STEPPERS]; + uint32_t Stepper::advance_dividend_m[MIXING_STEPPERS], + Stepper::advance_divisor_m; +#else + int8_t Stepper::active_extruder; // Active extruder +#endif + +#if ENABLED(S_CURVE_ACCELERATION) + int32_t __attribute__((used)) Stepper::bezier_A __asm__("bezier_A"); // A coefficient in Bézier speed curve with alias for assembler + int32_t __attribute__((used)) Stepper::bezier_B __asm__("bezier_B"); // B coefficient in Bézier speed curve with alias for assembler + int32_t __attribute__((used)) Stepper::bezier_C __asm__("bezier_C"); // C coefficient in Bézier speed curve with alias for assembler + uint32_t __attribute__((used)) Stepper::bezier_F __asm__("bezier_F"); // F coefficient in Bézier speed curve with alias for assembler + uint32_t __attribute__((used)) Stepper::bezier_AV __asm__("bezier_AV"); // AV coefficient in Bézier speed curve with alias for assembler + #ifdef __AVR__ + bool __attribute__((used)) Stepper::A_negative __asm__("A_negative"); // If A coefficient was negative + #endif + bool Stepper::bezier_2nd_half; // =false If Bézier curve has been initialized or not +#endif + +uint32_t Stepper::nextMainISR = 0; + +#if ENABLED(LIN_ADVANCE) + + constexpr uint32_t LA_ADV_NEVER = 0xFFFFFFFF; + uint32_t Stepper::nextAdvanceISR = LA_ADV_NEVER, + Stepper::LA_isr_rate = LA_ADV_NEVER; + uint16_t Stepper::LA_current_adv_steps = 0, + Stepper::LA_final_adv_steps, + Stepper::LA_max_adv_steps; + + int8_t Stepper::LA_steps = 0; + + bool Stepper::LA_use_advance_lead; + +#endif // LIN_ADVANCE + +int32_t Stepper::ticks_nominal = -1; +#if DISABLED(S_CURVE_ACCELERATION) + uint32_t Stepper::acc_step_rate; // needed for deceleration start point +#endif + +volatile int32_t Stepper::endstops_trigsteps[XYZ]; + +volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; +int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; + +#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #define DUAL_ENDSTOP_APPLY_STEP(A,V) \ + if (homing_dual_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + } +#endif + +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) + #if ENABLED(X_DUAL_ENDSTOPS) + #define X_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(X,v) + #else + #define X_APPLY_STEP(v,Q) do{ X_STEP_WRITE(v); X2_STEP_WRITE(v); }while(0) + #endif +#elif ENABLED(DUAL_X_CARRIAGE) + #define X_APPLY_DIR(v,ALWAYS) \ + if (extruder_duplication_enabled || ALWAYS) { \ + X_DIR_WRITE(v); \ + X2_DIR_WRITE(v); \ + } \ + else { \ + if (movement_extruder()) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ + } + #define X_APPLY_STEP(v,ALWAYS) \ + if (extruder_duplication_enabled || ALWAYS) { \ + X_STEP_WRITE(v); \ + X2_STEP_WRITE(v); \ + } \ + else { \ + if (movement_extruder()) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ + } +#else + #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) + #define X_APPLY_STEP(v,Q) X_STEP_WRITE(v) +#endif + +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR); }while(0) + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Y,v) + #else + #define Y_APPLY_STEP(v,Q) do{ Y_STEP_WRITE(v); Y2_STEP_WRITE(v); }while(0) + #endif +#else + #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v) + #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) +#endif + +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) + #else + #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }while(0) + #endif +#else + #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) + #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v) +#endif + +#if DISABLED(MIXING_EXTRUDER) + #define E_APPLY_STEP(v,Q) E_STEP_WRITE(active_extruder, v) +#endif + +void Stepper::wake_up() { + // TCNT1 = 0; + ENABLE_STEPPER_DRIVER_INTERRUPT(); +} + +/** + * Set the stepper direction of each axis + * + * COREXY: X_AXIS=A_AXIS and Y_AXIS=B_AXIS + * COREXZ: X_AXIS=A_AXIS and Z_AXIS=C_AXIS + * COREYZ: Y_AXIS=B_AXIS and Z_AXIS=C_AXIS + */ +void Stepper::set_directions() { + + #define SET_STEP_DIR(A) \ + if (motor_direction(_AXIS(A))) { \ + A##_APPLY_DIR(INVERT_## A##_DIR, false); \ + count_direction[_AXIS(A)] = -1; \ + } \ + else { \ + A##_APPLY_DIR(!INVERT_## A##_DIR, false); \ + count_direction[_AXIS(A)] = 1; \ + } + + #if HAS_X_DIR + SET_STEP_DIR(X); // A + #endif + #if HAS_Y_DIR + SET_STEP_DIR(Y); // B + #endif + #if HAS_Z_DIR + SET_STEP_DIR(Z); // C + #endif + + #if DISABLED(LIN_ADVANCE) + #if ENABLED(MIXING_EXTRUDER) + if (motor_direction(E_AXIS)) { + MIXING_STEPPERS_LOOP(j) REV_E_DIR(j); + count_direction[E_AXIS] = -1; + } + else { + MIXING_STEPPERS_LOOP(j) NORM_E_DIR(j); + count_direction[E_AXIS] = 1; + } + #else + if (motor_direction(E_AXIS)) { + REV_E_DIR(active_extruder); + count_direction[E_AXIS] = -1; + } + else { + NORM_E_DIR(active_extruder); + count_direction[E_AXIS] = 1; + } + #endif + #endif // !LIN_ADVANCE +} + +#if ENABLED(S_CURVE_ACCELERATION) + /** + * This uses a quintic (fifth-degree) Bézier polynomial for the velocity curve, giving + * a "linear pop" velocity curve; with pop being the sixth derivative of position: + * velocity - 1st, acceleration - 2nd, jerk - 3rd, snap - 4th, crackle - 5th, pop - 6th + * + * The Bézier curve takes the form: + * + * V(t) = P_0 * B_0(t) + P_1 * B_1(t) + P_2 * B_2(t) + P_3 * B_3(t) + P_4 * B_4(t) + P_5 * B_5(t) + * + * Where 0 <= t <= 1, and V(t) is the velocity. P_0 through P_5 are the control points, and B_0(t) + * through B_5(t) are the Bernstein basis as follows: + * + * B_0(t) = (1-t)^5 = -t^5 + 5t^4 - 10t^3 + 10t^2 - 5t + 1 + * B_1(t) = 5(1-t)^4 * t = 5t^5 - 20t^4 + 30t^3 - 20t^2 + 5t + * B_2(t) = 10(1-t)^3 * t^2 = -10t^5 + 30t^4 - 30t^3 + 10t^2 + * B_3(t) = 10(1-t)^2 * t^3 = 10t^5 - 20t^4 + 10t^3 + * B_4(t) = 5(1-t) * t^4 = -5t^5 + 5t^4 + * B_5(t) = t^5 = t^5 + * ^ ^ ^ ^ ^ ^ + * | | | | | | + * A B C D E F + * + * Unfortunately, we cannot use forward-differencing to calculate each position through + * the curve, as Marlin uses variable timer periods. So, we require a formula of the form: + * + * V_f(t) = A*t^5 + B*t^4 + C*t^3 + D*t^2 + E*t + F + * + * Looking at the above B_0(t) through B_5(t) expanded forms, if we take the coefficients of t^5 + * through t of the Bézier form of V(t), we can determine that: + * + * A = -P_0 + 5*P_1 - 10*P_2 + 10*P_3 - 5*P_4 + P_5 + * B = 5*P_0 - 20*P_1 + 30*P_2 - 20*P_3 + 5*P_4 + * C = -10*P_0 + 30*P_1 - 30*P_2 + 10*P_3 + * D = 10*P_0 - 20*P_1 + 10*P_2 + * E = - 5*P_0 + 5*P_1 + * F = P_0 + * + * Now, since we will (currently) *always* want the initial acceleration and jerk values to be 0, + * We set P_i = P_0 = P_1 = P_2 (initial velocity), and P_t = P_3 = P_4 = P_5 (target velocity), + * which, after simplification, resolves to: + * + * A = - 6*P_i + 6*P_t = 6*(P_t - P_i) + * B = 15*P_i - 15*P_t = 15*(P_i - P_t) + * C = -10*P_i + 10*P_t = 10*(P_t - P_i) + * D = 0 + * E = 0 + * F = P_i + * + * As the t is evaluated in non uniform steps here, there is no other way rather than evaluating + * the Bézier curve at each point: + * + * V_f(t) = A*t^5 + B*t^4 + C*t^3 + F [0 <= t <= 1] + * + * Floating point arithmetic execution time cost is prohibitive, so we will transform the math to + * use fixed point values to be able to evaluate it in realtime. Assuming a maximum of 250000 steps + * per second (driver pulses should at least be 2µS hi/2µS lo), and allocating 2 bits to avoid + * overflows on the evaluation of the Bézier curve, means we can use + * + * t: unsigned Q0.32 (0 <= t < 1) |range 0 to 0xFFFFFFFF unsigned + * A: signed Q24.7 , |range = +/- 250000 * 6 * 128 = +/- 192000000 = 0x0B71B000 | 28 bits + sign + * B: signed Q24.7 , |range = +/- 250000 *15 * 128 = +/- 480000000 = 0x1C9C3800 | 29 bits + sign + * C: signed Q24.7 , |range = +/- 250000 *10 * 128 = +/- 320000000 = 0x1312D000 | 29 bits + sign + * F: signed Q24.7 , |range = +/- 250000 * 128 = 32000000 = 0x01E84800 | 25 bits + sign + * + * The trapezoid generator state contains the following information, that we will use to create and evaluate + * the Bézier curve: + * + * blk->step_event_count [TS] = The total count of steps for this movement. (=distance) + * blk->initial_rate [VI] = The initial steps per second (=velocity) + * blk->final_rate [VF] = The ending steps per second (=velocity) + * and the count of events completed (step_events_completed) [CS] (=distance until now) + * + * Note the abbreviations we use in the following formulae are between []s + * + * For Any 32bit CPU: + * + * At the start of each trapezoid, calculate the coefficients A,B,C,F and Advance [AV], as follows: + * + * A = 6*128*(VF - VI) = 768*(VF - VI) + * B = 15*128*(VI - VF) = 1920*(VI - VF) + * C = 10*128*(VF - VI) = 1280*(VF - VI) + * F = 128*VI = 128*VI + * AV = (1<<32)/TS ~= 0xFFFFFFFF / TS (To use ARM UDIV, that is 32 bits) (this is computed at the planner, to offload expensive calculations from the ISR) + * + * And for each point, evaluate the curve with the following sequence: + * + * void lsrs(uint32_t& d, uint32_t s, int cnt) { + * d = s >> cnt; + * } + * void lsls(uint32_t& d, uint32_t s, int cnt) { + * d = s << cnt; + * } + * void lsrs(int32_t& d, uint32_t s, int cnt) { + * d = uint32_t(s) >> cnt; + * } + * void lsls(int32_t& d, uint32_t s, int cnt) { + * d = uint32_t(s) << cnt; + * } + * void umull(uint32_t& rlo, uint32_t& rhi, uint32_t op1, uint32_t op2) { + * uint64_t res = uint64_t(op1) * op2; + * rlo = uint32_t(res & 0xFFFFFFFF); + * rhi = uint32_t((res >> 32) & 0xFFFFFFFF); + * } + * void smlal(int32_t& rlo, int32_t& rhi, int32_t op1, int32_t op2) { + * int64_t mul = int64_t(op1) * op2; + * int64_t s = int64_t(uint32_t(rlo) | ((uint64_t(uint32_t(rhi)) << 32U))); + * mul += s; + * rlo = int32_t(mul & 0xFFFFFFFF); + * rhi = int32_t((mul >> 32) & 0xFFFFFFFF); + * } + * int32_t _eval_bezier_curve_arm(uint32_t curr_step) { + * register uint32_t flo = 0; + * register uint32_t fhi = bezier_AV * curr_step; + * register uint32_t t = fhi; + * register int32_t alo = bezier_F; + * register int32_t ahi = 0; + * register int32_t A = bezier_A; + * register int32_t B = bezier_B; + * register int32_t C = bezier_C; + * + * lsrs(ahi, alo, 1); // a = F << 31 + * lsls(alo, alo, 31); // + * umull(flo, fhi, fhi, t); // f *= t + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // + * smlal(alo, ahi, flo, C); // a+=(f>>33)*C + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // + * smlal(alo, ahi, flo, B); // a+=(f>>33)*B + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // f>>=33; + * smlal(alo, ahi, flo, A); // a+=(f>>33)*A; + * lsrs(alo, ahi, 6); // a>>=38 + * + * return alo; + * } + * + * This is rewritten in ARM assembly for optimal performance (43 cycles to execute). + * + * For AVR, the precision of coefficients is scaled so the Bézier curve can be evaluated in real-time: + * Let's reduce precision as much as possible. After some experimentation we found that: + * + * Assume t and AV with 24 bits is enough + * A = 6*(VF - VI) + * B = 15*(VI - VF) + * C = 10*(VF - VI) + * F = VI + * AV = (1<<24)/TS (this is computed at the planner, to offload expensive calculations from the ISR) + * + * Instead of storing sign for each coefficient, we will store its absolute value, + * and flag the sign of the A coefficient, so we can save to store the sign bit. + * It always holds that sign(A) = - sign(B) = sign(C) + * + * So, the resulting range of the coefficients are: + * + * t: unsigned (0 <= t < 1) |range 0 to 0xFFFFFF unsigned + * A: signed Q24 , range = 250000 * 6 = 1500000 = 0x16E360 | 21 bits + * B: signed Q24 , range = 250000 *15 = 3750000 = 0x393870 | 22 bits + * C: signed Q24 , range = 250000 *10 = 2500000 = 0x1312D0 | 21 bits + * F: signed Q24 , range = 250000 = 250000 = 0x0ED090 | 20 bits + * + * And for each curve, estimate its coefficients with: + * + * void _calc_bezier_curve_coeffs(int32_t v0, int32_t v1, uint32_t av) { + * // Calculate the Bézier coefficients + * if (v1 < v0) { + * A_negative = true; + * bezier_A = 6 * (v0 - v1); + * bezier_B = 15 * (v0 - v1); + * bezier_C = 10 * (v0 - v1); + * } + * else { + * A_negative = false; + * bezier_A = 6 * (v1 - v0); + * bezier_B = 15 * (v1 - v0); + * bezier_C = 10 * (v1 - v0); + * } + * bezier_F = v0; + * } + * + * And for each point, evaluate the curve with the following sequence: + * + * // unsigned multiplication of 24 bits x 24bits, return upper 16 bits + * void umul24x24to16hi(uint16_t& r, uint24_t op1, uint24_t op2) { + * r = (uint64_t(op1) * op2) >> 8; + * } + * // unsigned multiplication of 16 bits x 16bits, return upper 16 bits + * void umul16x16to16hi(uint16_t& r, uint16_t op1, uint16_t op2) { + * r = (uint32_t(op1) * op2) >> 16; + * } + * // unsigned multiplication of 16 bits x 24bits, return upper 24 bits + * void umul16x24to24hi(uint24_t& r, uint16_t op1, uint24_t op2) { + * r = uint24_t((uint64_t(op1) * op2) >> 16); + * } + * + * int32_t _eval_bezier_curve(uint32_t curr_step) { + * // To save computing, the first step is always the initial speed + * if (!curr_step) + * return bezier_F; + * + * uint16_t t; + * umul24x24to16hi(t, bezier_AV, curr_step); // t: Range 0 - 1^16 = 16 bits + * uint16_t f = t; + * umul16x16to16hi(f, f, t); // Range 16 bits (unsigned) + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^3 (unsigned) + * uint24_t acc = bezier_F; // Range 20 bits (unsigned) + * if (A_negative) { + * uint24_t v; + * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * acc -= v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * acc += v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * acc -= v; + * } + * else { + * uint24_t v; + * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * acc += v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * acc -= v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * acc += v; + * } + * return acc; + * } + * These functions are translated to assembler for optimal performance. + * Coefficient calculation takes 70 cycles. Bezier point evaluation takes 150 cycles. + */ + + #ifdef __AVR__ + + // For AVR we use assembly to maximize speed + void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) { + + // Store advance + bezier_AV = av; + + // Calculate the rest of the coefficients + register uint8_t r2 = v0 & 0xFF; + register uint8_t r3 = (v0 >> 8) & 0xFF; + register uint8_t r12 = (v0 >> 16) & 0xFF; + register uint8_t r5 = v1 & 0xFF; + register uint8_t r6 = (v1 >> 8) & 0xFF; + register uint8_t r7 = (v1 >> 16) & 0xFF; + register uint8_t r4,r8,r9,r10,r11; + + __asm__ __volatile__( + /* Calculate the Bézier coefficients */ + /* %10:%1:%0 = v0*/ + /* %5:%4:%3 = v1*/ + /* %7:%6:%10 = temporary*/ + /* %9 = val (must be high register!)*/ + /* %10 (must be high register!)*/ + + /* Store initial velocity*/ + A("sts bezier_F, %0") + A("sts bezier_F+1, %1") + A("sts bezier_F+2, %10") /* bezier_F = %10:%1:%0 = v0 */ + + /* Get delta speed */ + A("ldi %2,-1") /* %2 = 0xFF, means A_negative = true */ + A("clr %8") /* %8 = 0 */ + A("sub %0,%3") + A("sbc %1,%4") + A("sbc %10,%5") /* v0 -= v1, C=1 if result is negative */ + A("brcc 1f") /* branch if result is positive (C=0), that means v0 >= v1 */ + + /* Result was negative, get the absolute value*/ + A("com %10") + A("com %1") + A("neg %0") + A("sbc %1,%2") + A("sbc %10,%2") /* %10:%1:%0 +1 -> %10:%1:%0 = -(v0 - v1) = (v1 - v0) */ + A("clr %2") /* %2 = 0, means A_negative = false */ + + /* Store negative flag*/ + L("1") + A("sts A_negative, %2") /* Store negative flag */ + + /* Compute coefficients A,B and C [20 cycles worst case]*/ + A("ldi %9,6") /* %9 = 6 */ + A("mul %0,%9") /* r1:r0 = 6*LO(v0-v1) */ + A("sts bezier_A, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:r0 = 6*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 6*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 6*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 6*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 6*HI(v0-v1) << 16 */ + A("sts bezier_A+1, %6") + A("sts bezier_A+2, %7") /* bezier_A = %7:%6:?? = 6*(v0-v1) [35 cycles worst] */ + + A("ldi %9,15") /* %9 = 15 */ + A("mul %0,%9") /* r1:r0 = 5*LO(v0-v1) */ + A("sts bezier_B, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:?? = 5*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 5*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 5*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 5*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 5*HI(v0-v1) << 16 */ + A("sts bezier_B+1, %6") + A("sts bezier_B+2, %7") /* bezier_B = %7:%6:?? = 5*(v0-v1) [50 cycles worst] */ + + A("ldi %9,10") /* %9 = 10 */ + A("mul %0,%9") /* r1:r0 = 10*LO(v0-v1) */ + A("sts bezier_C, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:?? = 10*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 10*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 10*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 10*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 10*HI(v0-v1) << 16 */ + A("sts bezier_C+1, %6") + " sts bezier_C+2, %7" /* bezier_C = %7:%6:?? = 10*(v0-v1) [65 cycles worst] */ + : "+r" (r2), + "+d" (r3), + "=r" (r4), + "+r" (r5), + "+r" (r6), + "+r" (r7), + "=r" (r8), + "=r" (r9), + "=r" (r10), + "=d" (r11), + "+r" (r12) + : + : "r0", "r1", "cc", "memory" + ); + } + + FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { + + // If dealing with the first step, save expensive computing and return the initial speed + if (!curr_step) + return bezier_F; + + register uint8_t r0 = 0; /* Zero register */ + register uint8_t r2 = (curr_step) & 0xFF; + register uint8_t r3 = (curr_step >> 8) & 0xFF; + register uint8_t r4 = (curr_step >> 16) & 0xFF; + register uint8_t r1,r5,r6,r7,r8,r9,r10,r11; /* Temporary registers */ + + __asm__ __volatile( + /* umul24x24to16hi(t, bezier_AV, curr_step); t: Range 0 - 1^16 = 16 bits*/ + A("lds %9,bezier_AV") /* %9 = LO(AV)*/ + A("mul %9,%2") /* r1:r0 = LO(bezier_AV)*LO(curr_step)*/ + A("mov %7,r1") /* %7 = LO(bezier_AV)*LO(curr_step) >> 8*/ + A("clr %8") /* %8:%7 = LO(bezier_AV)*LO(curr_step) >> 8*/ + A("lds %10,bezier_AV+1") /* %10 = MI(AV)*/ + A("mul %10,%2") /* r1:r0 = MI(bezier_AV)*LO(curr_step)*/ + A("add %7,r0") + A("adc %8,r1") /* %8:%7 += MI(bezier_AV)*LO(curr_step)*/ + A("lds r1,bezier_AV+2") /* r11 = HI(AV)*/ + A("mul r1,%2") /* r1:r0 = HI(bezier_AV)*LO(curr_step)*/ + A("add %8,r0") /* %8:%7 += HI(bezier_AV)*LO(curr_step) << 8*/ + A("mul %9,%3") /* r1:r0 = LO(bezier_AV)*MI(curr_step)*/ + A("add %7,r0") + A("adc %8,r1") /* %8:%7 += LO(bezier_AV)*MI(curr_step)*/ + A("mul %10,%3") /* r1:r0 = MI(bezier_AV)*MI(curr_step)*/ + A("add %8,r0") /* %8:%7 += LO(bezier_AV)*MI(curr_step) << 8*/ + A("mul %9,%4") /* r1:r0 = LO(bezier_AV)*HI(curr_step)*/ + A("add %8,r0") /* %8:%7 += LO(bezier_AV)*HI(curr_step) << 8*/ + /* %8:%7 = t*/ + + /* uint16_t f = t;*/ + A("mov %5,%7") /* %6:%5 = f*/ + A("mov %6,%8") + /* %6:%5 = f*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits (unsigned) [17] */ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %9,r1") /* store MIL(LO(f) * LO(t)) in %9, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %9,r0") /* %9 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %9,r0") /* %9 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t)) */ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 = */ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + /* [15 +17*2] = [49]*/ + + /* %4:%3:%2 will be acc from now on*/ + + /* uint24_t acc = bezier_F; / Range 20 bits (unsigned)*/ + A("clr %9") /* "decimal place we get for free"*/ + A("lds %2,bezier_F") + A("lds %3,bezier_F+1") + A("lds %4,bezier_F+2") /* %4:%3:%2 = acc*/ + + /* if (A_negative) {*/ + A("lds r0,A_negative") + A("or r0,%0") /* Is flag signalling negative? */ + A("brne 3f") /* If yes, Skip next instruction if A was negative*/ + A("rjmp 1f") /* Otherwise, jump */ + + /* uint24_t v; */ + /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29] */ + /* acc -= v; */ + L("3") + A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_C) * LO(f))*/ + A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * LO(f)*/ + A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_C) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_B) * LO(f))*/ + A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * LO(f)*/ + A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_B) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ + /* acc -= v; */ + A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_A) * LO(f))*/ + A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * LO(f)*/ + A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_A) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 16*/ + A("jmp 2f") /* Done!*/ + + L("1") + + /* uint24_t v; */ + /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_C) * LO(f))*/ + A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * LO(f)*/ + A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_C) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ + /* acc -= v;*/ + A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_B) * LO(f))*/ + A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * LO(f)*/ + A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_B) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_A) * LO(f))*/ + A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * LO(f)*/ + A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_A) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 16*/ + L("2") + " clr __zero_reg__" /* C runtime expects r1 = __zero_reg__ = 0 */ + : "+r"(r0), + "+r"(r1), + "+r"(r2), + "+r"(r3), + "+r"(r4), + "+r"(r5), + "+r"(r6), + "+r"(r7), + "+r"(r8), + "+r"(r9), + "+r"(r10), + "+r"(r11) + : + :"cc","r0","r1" + ); + return (r2 | (uint16_t(r3) << 8)) | (uint32_t(r4) << 16); + } + + #else + + // For all the other 32bit CPUs + FORCE_INLINE void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) { + // Calculate the Bézier coefficients + bezier_A = 768 * (v1 - v0); + bezier_B = 1920 * (v0 - v1); + bezier_C = 1280 * (v1 - v0); + bezier_F = 128 * v0; + bezier_AV = av; + } + + FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { + #if defined(__ARM__) || defined(__thumb__) + + // For ARM Cortex M3/M4 CPUs, we have the optimized assembler version, that takes 43 cycles to execute + register uint32_t flo = 0; + register uint32_t fhi = bezier_AV * curr_step; + register uint32_t t = fhi; + register int32_t alo = bezier_F; + register int32_t ahi = 0; + register int32_t A = bezier_A; + register int32_t B = bezier_B; + register int32_t C = bezier_C; + + __asm__ __volatile__( + ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax + A("lsrs %[ahi],%[alo],#1") // a = F << 31 1 cycles + A("lsls %[alo],%[alo],#31") // 1 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f *= t 5 cycles [fhi:flo=64bits] + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[C]") // a+=(f>>33)*C; 5 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[B]") // a+=(f>>33)*B; 5 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // f>>=33; 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[A]") // a+=(f>>33)*A; 5 cycles + A("lsrs %[alo],%[ahi],#6") // a>>=38 1 cycles + : [alo]"+r"( alo ) , + [flo]"+r"( flo ) , + [fhi]"+r"( fhi ) , + [ahi]"+r"( ahi ) , + [A]"+r"( A ) , // <== Note: Even if A, B, C, and t registers are INPUT ONLY + [B]"+r"( B ) , // GCC does bad optimizations on the code if we list them as + [C]"+r"( C ) , // such, breaking this function. So, to avoid that problem, + [t]"+r"( t ) // we list all registers as input-outputs. + : + : "cc" + ); + return alo; + + #else + + // For non ARM targets, we provide a fallback implementation. Really doubt it + // will be useful, unless the processor is fast and 32bit + + uint32_t t = bezier_AV * curr_step; // t: Range 0 - 1^32 = 32 bits + uint64_t f = t; + f *= t; // Range 32*2 = 64 bits (unsigned) + f >>= 32; // Range 32 bits (unsigned) + f *= t; // Range 32*2 = 64 bits (unsigned) + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + int64_t acc = (int64_t) bezier_F << 31; // Range 63 bits (signed) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_C; // Range 29bits + 31 = 60bits (plus sign) + f *= t; // Range 32*2 = 64 bits + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_B; // Range 29bits + 31 = 60bits (plus sign) + f *= t; // Range 32*2 = 64 bits + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_A; // Range 28bits + 31 = 59bits (plus sign) + acc >>= (31 + 7); // Range 24bits (plus sign) + return (int32_t) acc; + + #endif + } + #endif +#endif // S_CURVE_ACCELERATION + +/** + * Stepper Driver Interrupt + * + * Directly pulses the stepper motors at high frequency. + */ + +HAL_STEP_TIMER_ISR { + HAL_timer_isr_prologue(STEP_TIMER_NUM); + + Stepper::isr(); + + HAL_timer_isr_epilogue(STEP_TIMER_NUM); +} + +#ifdef CPU_32_BIT + #define STEP_MULTIPLY(A,B) MultiU32X24toH32(A, B) +#else + #define STEP_MULTIPLY(A,B) MultiU24X32toH16(A, B) +#endif + +void Stepper::isr() { + #ifndef __AVR__ + // Disable interrupts, to avoid ISR preemption while we reprogram the period + // (AVR enters the ISR with global interrupts disabled, so no need to do it here) + DISABLE_ISRS(); + #endif + + // Program timer compare for the maximum period, so it does NOT + // flag an interrupt while this ISR is running - So changes from small + // periods to big periods are respected and the timer does not reset to 0 + HAL_timer_set_compare(STEP_TIMER_NUM, HAL_TIMER_TYPE_MAX); + + // Count of ticks for the next ISR + hal_timer_t next_isr_ticks = 0; + + // Limit the amount of iterations + uint8_t max_loops = 10; + + // We need this variable here to be able to use it in the following loop + hal_timer_t min_ticks; + do { + // Enable ISRs to reduce USART processing latency + ENABLE_ISRS(); + + // Run main stepping pulse phase ISR if we have to + if (!nextMainISR) Stepper::stepper_pulse_phase_isr(); + + #if ENABLED(LIN_ADVANCE) + // Run linear advance stepper ISR if we have to + if (!nextAdvanceISR) nextAdvanceISR = Stepper::advance_isr(); + #endif + + // ^== Time critical. NOTHING besides pulse generation should be above here!!! + + // Run main stepping block processing ISR if we have to + if (!nextMainISR) nextMainISR = Stepper::stepper_block_phase_isr(); + + uint32_t interval = + #if ENABLED(LIN_ADVANCE) + MIN(nextAdvanceISR, nextMainISR) // Nearest time interval + #else + nextMainISR // Remaining stepper ISR time + #endif + ; + + // Limit the value to the maximum possible value of the timer + NOMORE(interval, HAL_TIMER_TYPE_MAX); + + // Compute the time remaining for the main isr + nextMainISR -= interval; + + #if ENABLED(LIN_ADVANCE) + // Compute the time remaining for the advance isr + if (nextAdvanceISR != LA_ADV_NEVER) nextAdvanceISR -= interval; + #endif + + /** + * This needs to avoid a race-condition caused by interleaving + * of interrupts required by both the LA and Stepper algorithms. + * + * Assume the following tick times for stepper pulses: + * Stepper ISR (S): 1 1000 2000 3000 4000 + * Linear Adv. (E): 10 1010 2010 3010 4010 + * + * The current algorithm tries to interleave them, giving: + * 1:S 10:E 1000:S 1010:E 2000:S 2010:E 3000:S 3010:E 4000:S 4010:E + * + * Ideal timing would yield these delta periods: + * 1:S 9:E 990:S 10:E 990:S 10:E 990:S 10:E 990:S 10:E + * + * But, since each event must fire an ISR with a minimum duration, the + * minimum delta might be 900, so deltas under 900 get rounded up: + * 900:S d900:E d990:S d900:E d990:S d900:E d990:S d900:E d990:S d900:E + * + * It works, but divides the speed of all motors by half, leading to a sudden + * reduction to 1/2 speed! Such jumps in speed lead to lost steps (not even + * accounting for double/quad stepping, which makes it even worse). + */ + + // Compute the tick count for the next ISR + next_isr_ticks += interval; + + /** + * The following section must be done with global interrupts disabled. + * We want nothing to interrupt it, as that could mess the calculations + * we do for the next value to program in the period register of the + * stepper timer and lead to skipped ISRs (if the value we happen to program + * is less than the current count due to something preempting between the + * read and the write of the new period value). + */ + DISABLE_ISRS(); + + /** + * Get the current tick value + margin + * Assuming at least 6µs between calls to this ISR... + * On AVR the ISR epilogue+prologue is estimated at 100 instructions - Give 8µs as margin + * On ARM the ISR epilogue+prologue is estimated at 20 instructions - Give 1µs as margin + */ + min_ticks = HAL_timer_get_count(STEP_TIMER_NUM) + hal_timer_t( + #ifdef __AVR__ + 8 + #else + 1 + #endif + * (STEPPER_TIMER_TICKS_PER_US) + ); + + /** + * NB: If for some reason the stepper monopolizes the MPU, eventually the + * timer will wrap around (and so will 'next_isr_ticks'). So, limit the + * loop to 10 iterations. Beyond that, there's no way to ensure correct pulse + * timing, since the MCU isn't fast enough. + */ + if (!--max_loops) next_isr_ticks = min_ticks; + + // Advance pulses if not enough time to wait for the next ISR + } while (next_isr_ticks < min_ticks); + + // Now 'next_isr_ticks' contains the period to the next Stepper ISR - And we are + // sure that the time has not arrived yet - Warrantied by the scheduler + + // Set the next ISR to fire at the proper time + HAL_timer_set_compare(STEP_TIMER_NUM, hal_timer_t(next_isr_ticks)); + + // Don't forget to finally reenable interrupts + ENABLE_ISRS(); +} + +/** + * This phase of the ISR should ONLY create the pulses for the steppers. + * This prevents jitter caused by the interval between the start of the + * interrupt and the start of the pulses. DON'T add any logic ahead of the + * call to this method that might cause variation in the timing. The aim + * is to keep pulse timing as regular as possible. + */ +void Stepper::stepper_pulse_phase_isr() { + + // If we must abort the current block, do so! + if (abort_current_block) { + abort_current_block = false; + if (current_block) { + axis_did_move = 0; + current_block = NULL; + planner.discard_current_block(); + } + } + + // If there is no current block, do nothing + if (!current_block) return; + + // Count of pending loops and events for this iteration + const uint32_t pending_events = step_event_count - step_events_completed; + uint8_t events_to_do = MIN(pending_events, steps_per_isr); + + // Just update the value we will get at the end of the loop + step_events_completed += events_to_do; + + // Get the timer count and estimate the end of the pulse + hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS); + + const hal_timer_t added_step_ticks = ADDED_STEP_TICKS; + + // Take multiple steps per interrupt (For high speed moves) + do { + + #define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP + #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN + + // Start an active pulse, if Bresenham says so, and update position + #define PULSE_START(AXIS) do{ \ + delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \ + if (delta_error[_AXIS(AXIS)] >= 0) { \ + _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), 0); \ + count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \ + } \ + }while(0) + + // Stop an active pulse, if any, and adjust error term + #define PULSE_STOP(AXIS) do { \ + if (delta_error[_AXIS(AXIS)] >= 0) { \ + delta_error[_AXIS(AXIS)] -= advance_divisor; \ + _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), 0); \ + } \ + }while(0) + + // Pulse start + #if HAS_X_STEP + PULSE_START(X); + #endif + #if HAS_Y_STEP + PULSE_START(Y); + #endif + #if HAS_Z_STEP + PULSE_START(Z); + #endif + + // Pulse E/Mixing extruders + #if ENABLED(LIN_ADVANCE) + // Tick the E axis, correct error term and update position + delta_error[E_AXIS] += advance_dividend[E_AXIS]; + if (delta_error[E_AXIS] >= 0) { + count_position[E_AXIS] += count_direction[E_AXIS]; + delta_error[E_AXIS] -= advance_divisor; + + // Don't step E here - But remember the number of steps to perform + motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; + } + #else // !LIN_ADVANCE - use linear interpolation for E also + #if ENABLED(MIXING_EXTRUDER) + + // Tick the E axis + delta_error[E_AXIS] += advance_dividend[E_AXIS]; + if (delta_error[E_AXIS] >= 0) { + count_position[E_AXIS] += count_direction[E_AXIS]; + delta_error[E_AXIS] -= advance_divisor; + } + + // Tick the counters used for this mix in proper proportion + MIXING_STEPPERS_LOOP(j) { + // Step mixing steppers (proportionally) + delta_error_m[j] += advance_dividend_m[j]; + // Step when the counter goes over zero + if (delta_error_m[j] >= 0) E_STEP_WRITE(j, !INVERT_E_STEP_PIN); + } + + #else // !MIXING_EXTRUDER + PULSE_START(E); + #endif + #endif // !LIN_ADVANCE + + #if MINIMUM_STEPPER_PULSE + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #endif + + // Add the delay needed to ensure the maximum driver rate is enforced + if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks); + + // Pulse stop + #if HAS_X_STEP + PULSE_STOP(X); + #endif + #if HAS_Y_STEP + PULSE_STOP(Y); + #endif + #if HAS_Z_STEP + PULSE_STOP(Z); + #endif + + #if DISABLED(LIN_ADVANCE) + #if ENABLED(MIXING_EXTRUDER) + MIXING_STEPPERS_LOOP(j) { + if (delta_error_m[j] >= 0) { + delta_error_m[j] -= advance_divisor_m; + E_STEP_WRITE(j, INVERT_E_STEP_PIN); + } + } + #else // !MIXING_EXTRUDER + PULSE_STOP(E); + #endif + #endif // !LIN_ADVANCE + + // Decrement the count of pending pulses to do + --events_to_do; + + // For minimum pulse time wait after stopping pulses also + if (events_to_do) { + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #if MINIMUM_STEPPER_PULSE + // Add to the value, the time that the pulse must be active (to be used on the next loop) + pulse_end += hal_timer_t(MIN_PULSE_TICKS); + #endif + } + + } while (events_to_do); +} + +// This is the last half of the stepper interrupt: This one processes and +// properly schedules blocks from the planner. This is executed after creating +// the step pulses, so it is not time critical, as pulses are already done. + +uint32_t Stepper::stepper_block_phase_isr() { + + // If no queued movements, just wait 1ms for the next move + uint32_t interval = (STEPPER_TIMER_RATE / 1000); + + // If there is a current block + if (current_block) { + + // If current block is finished, reset pointer + if (step_events_completed >= step_event_count) { + axis_did_move = 0; + current_block = NULL; + planner.discard_current_block(); + } + else { + // Step events not completed yet... + + // Are we in acceleration phase ? + if (step_events_completed <= accelerate_until) { // Calculate new timer value + + #if ENABLED(S_CURVE_ACCELERATION) + // Get the next speed to use (Jerk limited!) + uint32_t acc_step_rate = + acceleration_time < current_block->acceleration_time + ? _eval_bezier_curve(acceleration_time) + : current_block->cruise_rate; + #else + acc_step_rate = STEP_MULTIPLY(acceleration_time, current_block->acceleration_rate) + current_block->initial_rate; + NOMORE(acc_step_rate, current_block->nominal_rate); + #endif + + // acc_step_rate is in steps/second + + // step_rate to timer interval and steps per stepper isr + interval = calc_timer_interval(acc_step_rate, oversampling_factor, &steps_per_isr); + acceleration_time += interval; + + #if ENABLED(LIN_ADVANCE) + if (LA_use_advance_lead) { + // Wake up eISR on first acceleration loop and fire ISR if final adv_rate is reached + if (step_events_completed == steps_per_isr || (LA_steps && LA_isr_rate != current_block->advance_speed)) { + nextAdvanceISR = 0; + LA_isr_rate = current_block->advance_speed; + } + } + else { + LA_isr_rate = LA_ADV_NEVER; + if (LA_steps) nextAdvanceISR = 0; + } + #endif // LIN_ADVANCE + } + // Are we in Deceleration phase ? + else if (step_events_completed > decelerate_after) { + uint32_t step_rate; + + #if ENABLED(S_CURVE_ACCELERATION) + // If this is the 1st time we process the 2nd half of the trapezoid... + if (!bezier_2nd_half) { + // Initialize the Bézier speed curve + _calc_bezier_curve_coeffs(current_block->cruise_rate, current_block->final_rate, current_block->deceleration_time_inverse); + bezier_2nd_half = true; + // The first point starts at cruise rate. Just save evaluation of the Bézier curve + step_rate = current_block->cruise_rate; + } + else { + // Calculate the next speed to use + step_rate = deceleration_time < current_block->deceleration_time + ? _eval_bezier_curve(deceleration_time) + : current_block->final_rate; + } + #else + + // Using the old trapezoidal control + step_rate = STEP_MULTIPLY(deceleration_time, current_block->acceleration_rate); + if (step_rate < acc_step_rate) { // Still decelerating? + step_rate = acc_step_rate - step_rate; + NOLESS(step_rate, current_block->final_rate); + } + else + step_rate = current_block->final_rate; + #endif + + // step_rate is in steps/second + + // step_rate to timer interval and steps per stepper isr + interval = calc_timer_interval(step_rate, oversampling_factor, &steps_per_isr); + deceleration_time += interval; + + #if ENABLED(LIN_ADVANCE) + if (LA_use_advance_lead) { + if (step_events_completed <= decelerate_after + steps_per_isr || + (LA_steps && LA_isr_rate != current_block->advance_speed) + ) { + nextAdvanceISR = 0; // Wake up eISR on first deceleration loop + LA_isr_rate = current_block->advance_speed; + } + } + else { + LA_isr_rate = LA_ADV_NEVER; + if (LA_steps) nextAdvanceISR = 0; + } + #endif // LIN_ADVANCE + } + // We must be in cruise phase otherwise + else { + + #if ENABLED(LIN_ADVANCE) + // If there are any esteps, fire the next advance_isr "now" + if (LA_steps && LA_isr_rate != current_block->advance_speed) nextAdvanceISR = 0; + #endif + + // Calculate the ticks_nominal for this nominal speed, if not done yet + if (ticks_nominal < 0) { + // step_rate to timer interval and loops for the nominal speed + ticks_nominal = calc_timer_interval(current_block->nominal_rate, oversampling_factor, &steps_per_isr); + } + + // The timer interval is just the nominal value for the nominal speed + interval = ticks_nominal; + } + } + } + + // If there is no current block at this point, attempt to pop one from the buffer + // and prepare its movement + if (!current_block) { + + // Anything in the buffer? + if ((current_block = planner.get_current_block())) { + + // Sync block? Sync the stepper counts and return + while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { + _set_position( + current_block->position[A_AXIS], current_block->position[B_AXIS], + current_block->position[C_AXIS], current_block->position[E_AXIS] + ); + planner.discard_current_block(); + + // Try to get a new block + if (!(current_block = planner.get_current_block())) + return interval; // No more queued movements! + } + + // Flag all moving axes for proper endstop handling + + #if IS_CORE + // Define conditions for checking endstops + #define S_(N) current_block->steps[CORE_AXIS_##N] + #define D_(N) TEST(current_block->direction_bits, CORE_AXIS_##N) + #endif + + #if CORE_IS_XY || CORE_IS_XZ + /** + * Head direction in -X axis for CoreXY and CoreXZ bots. + * + * If steps differ, both axes are moving. + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z, handled below) + * If DeltaA == DeltaB, the movement is only in the 1st axis (X) + */ + #if ENABLED(COREXY) || ENABLED(COREXZ) + #define X_CMP == + #else + #define X_CMP != + #endif + #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) X_CMP D_(2)) ) + #else + #define X_MOVE_TEST !!current_block->steps[A_AXIS] + #endif + + #if CORE_IS_XY || CORE_IS_YZ + /** + * Head direction in -Y axis for CoreXY / CoreYZ bots. + * + * If steps differ, both axes are moving + * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y) + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z) + */ + #if ENABLED(COREYX) || ENABLED(COREYZ) + #define Y_CMP == + #else + #define Y_CMP != + #endif + #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Y_CMP D_(2)) ) + #else + #define Y_MOVE_TEST !!current_block->steps[B_AXIS] + #endif + + #if CORE_IS_XZ || CORE_IS_YZ + /** + * Head direction in -Z axis for CoreXZ or CoreYZ bots. + * + * If steps differ, both axes are moving + * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y, already handled above) + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Z) + */ + #if ENABLED(COREZX) || ENABLED(COREZY) + #define Z_CMP == + #else + #define Z_CMP != + #endif + #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Z_CMP D_(2)) ) + #else + #define Z_MOVE_TEST !!current_block->steps[C_AXIS] + #endif + + uint8_t axis_bits = 0; + if (X_MOVE_TEST) SBI(axis_bits, A_AXIS); + if (Y_MOVE_TEST) SBI(axis_bits, B_AXIS); + if (Z_MOVE_TEST) SBI(axis_bits, C_AXIS); + //if (!!current_block->steps[E_AXIS]) SBI(axis_bits, E_AXIS); + //if (!!current_block->steps[A_AXIS]) SBI(axis_bits, X_HEAD); + //if (!!current_block->steps[B_AXIS]) SBI(axis_bits, Y_HEAD); + //if (!!current_block->steps[C_AXIS]) SBI(axis_bits, Z_HEAD); + axis_did_move = axis_bits; + + // No acceleration / deceleration time elapsed so far + acceleration_time = deceleration_time = 0; + + uint8_t oversampling = 0; // Assume we won't use it + #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + // At this point, we must decide if we can use Stepper movement axis smoothing. + uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) + while (max_rate < MIN_STEP_ISR_FREQUENCY) { + max_rate <<= 1; + if (max_rate >= MAX_STEP_ISR_FREQUENCY_1X) break; + ++oversampling; + } + oversampling_factor = oversampling; + #endif + + // Based on the oversampling factor, do the calculations + step_event_count = current_block->step_event_count << oversampling; + + // Initialize Bresenham delta errors to 1/2 + delta_error[X_AXIS] = delta_error[Y_AXIS] = delta_error[Z_AXIS] = delta_error[E_AXIS] = -int32_t(step_event_count); + + // Calculate Bresenham dividends + advance_dividend[X_AXIS] = current_block->steps[X_AXIS] << 1; + advance_dividend[Y_AXIS] = current_block->steps[Y_AXIS] << 1; + advance_dividend[Z_AXIS] = current_block->steps[Z_AXIS] << 1; + advance_dividend[E_AXIS] = current_block->steps[E_AXIS] << 1; + + // Calculate Bresenham divisor + advance_divisor = step_event_count << 1; + + // No step events completed so far + step_events_completed = 0; + + // Compute the acceleration and deceleration points + accelerate_until = current_block->accelerate_until << oversampling; + decelerate_after = current_block->decelerate_after << oversampling; + + #if ENABLED(MIXING_EXTRUDER) + const uint32_t e_steps = ( + #if ENABLED(LIN_ADVANCE) + current_block->steps[E_AXIS] + #else + step_event_count + #endif + ); + MIXING_STEPPERS_LOOP(i) { + delta_error_m[i] = -int32_t(e_steps); + advance_dividend_m[i] = current_block->mix_steps[i] << 1; + } + advance_divisor_m = e_steps << 1; + #else + active_extruder = current_block->active_extruder; + #endif + + // Initialize the trapezoid generator from the current block. + #if ENABLED(LIN_ADVANCE) + #if DISABLED(MIXING_EXTRUDER) && E_STEPPERS > 1 + // If the now active extruder wasn't in use during the last move, its pressure is most likely gone. + if (active_extruder != last_moved_extruder) LA_current_adv_steps = 0; + #endif + + if ((LA_use_advance_lead = current_block->use_advance_lead)) { + LA_final_adv_steps = current_block->final_adv_steps; + LA_max_adv_steps = current_block->max_adv_steps; + } + #endif + + if (current_block->direction_bits != last_direction_bits + #if DISABLED(MIXING_EXTRUDER) + || active_extruder != last_moved_extruder + #endif + ) { + last_direction_bits = current_block->direction_bits; + #if DISABLED(MIXING_EXTRUDER) + last_moved_extruder = active_extruder; + #endif + set_directions(); + } + + // At this point, we must ensure the movement about to execute isn't + // trying to force the head against a limit switch. If using interrupt- + // driven change detection, and already against a limit then no call to + // the endstop_triggered method will be done and the movement will be + // done against the endstop. So, check the limits here: If the movement + // is against the limits, the block will be marked as to be killed, and + // on the next call to this ISR, will be discarded. + endstops.check_possible_change(); + + #if ENABLED(Z_LATE_ENABLE) + // If delayed Z enable, enable it now. This option will severely interfere with + // timing between pulses when chaining motion between blocks, and it could lead + // to lost steps in both X and Y axis, so avoid using it unless strictly necessary!! + if (current_block->steps[Z_AXIS]) enable_Z(); + #endif + + // Mark the time_nominal as not calculated yet + ticks_nominal = -1; + + #if DISABLED(S_CURVE_ACCELERATION) + // Set as deceleration point the initial rate of the block + acc_step_rate = current_block->initial_rate; + #endif + + #if ENABLED(S_CURVE_ACCELERATION) + // Initialize the Bézier speed curve + _calc_bezier_curve_coeffs(current_block->initial_rate, current_block->cruise_rate, current_block->acceleration_time_inverse); + // We haven't started the 2nd half of the trapezoid + bezier_2nd_half = false; + #endif + + // Calculate the initial timer interval + interval = calc_timer_interval(current_block->initial_rate, oversampling_factor, &steps_per_isr); + } + } + + // Return the interval to wait + return interval; +} + +#if ENABLED(LIN_ADVANCE) + + // Timer interrupt for E. LA_steps is set in the main routine + uint32_t Stepper::advance_isr() { + uint32_t interval; + + if (LA_use_advance_lead) { + if (step_events_completed > decelerate_after && LA_current_adv_steps > LA_final_adv_steps) { + LA_steps--; + LA_current_adv_steps--; + interval = LA_isr_rate; + } + else if (step_events_completed < decelerate_after && LA_current_adv_steps < LA_max_adv_steps) { + //step_events_completed <= (uint32_t)accelerate_until) { + LA_steps++; + LA_current_adv_steps++; + interval = LA_isr_rate; + } + else + interval = LA_isr_rate = LA_ADV_NEVER; + } + else + interval = LA_ADV_NEVER; + + #if ENABLED(MIXING_EXTRUDER) + if (LA_steps >= 0) + MIXING_STEPPERS_LOOP(j) NORM_E_DIR(j); + else + MIXING_STEPPERS_LOOP(j) REV_E_DIR(j); + #else + if (LA_steps >= 0) + NORM_E_DIR(active_extruder); + else + REV_E_DIR(active_extruder); + #endif + + // Get the timer count and estimate the end of the pulse + hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS); + + const hal_timer_t added_step_ticks = ADDED_STEP_TICKS; + + // Step E stepper if we have steps + while (LA_steps) { + + // Set the STEP pulse ON + #if ENABLED(MIXING_EXTRUDER) + MIXING_STEPPERS_LOOP(j) { + // Step mixing steppers (proportionally) + delta_error_m[j] += advance_dividend_m[j]; + // Step when the counter goes over zero + if (delta_error_m[j] >= 0) E_STEP_WRITE(j, !INVERT_E_STEP_PIN); + } + #else + E_STEP_WRITE(active_extruder, !INVERT_E_STEP_PIN); + #endif + + // Enforce a minimum duration for STEP pulse ON + #if MINIMUM_STEPPER_PULSE + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #endif + + // Add the delay needed to ensure the maximum driver rate is enforced + if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks); + + LA_steps < 0 ? ++LA_steps : --LA_steps; + + // Set the STEP pulse OFF + #if ENABLED(MIXING_EXTRUDER) + MIXING_STEPPERS_LOOP(j) { + if (delta_error_m[j] >= 0) { + delta_error_m[j] -= advance_divisor_m; + E_STEP_WRITE(j, INVERT_E_STEP_PIN); + } + } + #else + E_STEP_WRITE(active_extruder, INVERT_E_STEP_PIN); + #endif + + // For minimum pulse time wait before looping + // Just wait for the requested pulse duration + if (LA_steps) { + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #if MINIMUM_STEPPER_PULSE + // Add to the value, the time that the pulse must be active (to be used on the next loop) + pulse_end += hal_timer_t(MIN_PULSE_TICKS); + #endif + } + } // LA_steps + + return interval; + } +#endif // LIN_ADVANCE + +void Stepper::init() { + + // Init Digipot Motor Current + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + digipot_init(); + #endif + + #if MB(ALLIGATOR) + const float motor_current[] = MOTOR_CURRENT; + unsigned int digipot_motor = 0; + for (uint8_t i = 0; i < 3 + EXTRUDERS; i++) { + digipot_motor = 255 * (motor_current[i] / 2.5); + dac084s085::setValue(i, digipot_motor); + } + #endif//MB(ALLIGATOR) + + // Init Microstepping Pins + #if HAS_MICROSTEPS + microstep_init(); + #endif + + // Init Dir Pins + #if HAS_X_DIR + X_DIR_INIT; + #endif + #if HAS_X2_DIR + X2_DIR_INIT; + #endif + #if HAS_Y_DIR + Y_DIR_INIT; + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_DIR + Y2_DIR_INIT; + #endif + #endif + #if HAS_Z_DIR + Z_DIR_INIT; + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_DIR + Z2_DIR_INIT; + #endif + #endif + #if HAS_E0_DIR + E0_DIR_INIT; + #endif + #if HAS_E1_DIR + E1_DIR_INIT; + #endif + #if HAS_E2_DIR + E2_DIR_INIT; + #endif + #if HAS_E3_DIR + E3_DIR_INIT; + #endif + #if HAS_E4_DIR + E4_DIR_INIT; + #endif + + // Init Enable Pins - steppers default to disabled. + #if HAS_X_ENABLE + X_ENABLE_INIT; + if (!X_ENABLE_ON) X_ENABLE_WRITE(HIGH); + #if (ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)) && HAS_X2_ENABLE + X2_ENABLE_INIT; + if (!X_ENABLE_ON) X2_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_Y_ENABLE + Y_ENABLE_INIT; + if (!Y_ENABLE_ON) Y_ENABLE_WRITE(HIGH); + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_ENABLE + Y2_ENABLE_INIT; + if (!Y_ENABLE_ON) Y2_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_Z_ENABLE + Z_ENABLE_INIT; + if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_ENABLE + Z2_ENABLE_INIT; + if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_E0_ENABLE + E0_ENABLE_INIT; + if (!E_ENABLE_ON) E0_ENABLE_WRITE(HIGH); + #endif + #if HAS_E1_ENABLE + E1_ENABLE_INIT; + if (!E_ENABLE_ON) E1_ENABLE_WRITE(HIGH); + #endif + #if HAS_E2_ENABLE + E2_ENABLE_INIT; + if (!E_ENABLE_ON) E2_ENABLE_WRITE(HIGH); + #endif + #if HAS_E3_ENABLE + E3_ENABLE_INIT; + if (!E_ENABLE_ON) E3_ENABLE_WRITE(HIGH); + #endif + #if HAS_E4_ENABLE + E4_ENABLE_INIT; + if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH); + #endif + + #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT + #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) + #define _DISABLE(AXIS) disable_## AXIS() + + #define AXIS_INIT(AXIS, PIN) \ + _STEP_INIT(AXIS); \ + _WRITE_STEP(AXIS, _INVERT_STEP_PIN(PIN)); \ + _DISABLE(AXIS) + + #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) + + // Init Step Pins + #if HAS_X_STEP + #if ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE) + X2_STEP_INIT; + X2_STEP_WRITE(INVERT_X_STEP_PIN); + #endif + AXIS_INIT(X, X); + #endif + + #if HAS_Y_STEP + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + Y2_STEP_INIT; + Y2_STEP_WRITE(INVERT_Y_STEP_PIN); + #endif + AXIS_INIT(Y, Y); + #endif + + #if HAS_Z_STEP + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) + Z2_STEP_INIT; + Z2_STEP_WRITE(INVERT_Z_STEP_PIN); + #endif + AXIS_INIT(Z, Z); + #endif + + #if E_STEPPERS > 0 && HAS_E0_STEP + E_AXIS_INIT(0); + #endif + #if E_STEPPERS > 1 && HAS_E1_STEP + E_AXIS_INIT(1); + #endif + #if E_STEPPERS > 2 && HAS_E2_STEP + E_AXIS_INIT(2); + #endif + #if E_STEPPERS > 3 && HAS_E3_STEP + E_AXIS_INIT(3); + #endif + #if E_STEPPERS > 4 && HAS_E4_STEP + E_AXIS_INIT(4); + #endif + + // Init Stepper ISR to 122 Hz for quick starting + HAL_timer_start(STEP_TIMER_NUM, 122); + + ENABLE_STEPPER_DRIVER_INTERRUPT(); + + endstops.enable(true); // Start with endstops active. After homing they can be disabled + sei(); + + set_directions(); // Init directions to last_direction_bits = 0 +} + +/** + * Set the stepper positions directly in steps + * + * The input is based on the typical per-axis XYZ steps. + * For CORE machines XYZ needs to be translated to ABC. + * + * This allows get_axis_position_mm to correctly + * derive the current XYZ position later on. + */ +void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { + #if CORE_IS_XY + // corexy positioning + // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html + count_position[A_AXIS] = a + b; + count_position[B_AXIS] = CORESIGN(a - b); + count_position[Z_AXIS] = c; + #elif CORE_IS_XZ + // corexz planning + count_position[A_AXIS] = a + c; + count_position[Y_AXIS] = b; + count_position[C_AXIS] = CORESIGN(a - c); + #elif CORE_IS_YZ + // coreyz planning + count_position[X_AXIS] = a; + count_position[B_AXIS] = b + c; + count_position[C_AXIS] = CORESIGN(b - c); + #else + // default non-h-bot planning + count_position[X_AXIS] = a; + count_position[Y_AXIS] = b; + count_position[Z_AXIS] = c; + #endif + count_position[E_AXIS] = e; +} + +/** + * Get a stepper's position in steps. + */ +int32_t Stepper::position(const AxisEnum axis) { + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + const int32_t v = count_position[axis]; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + return v; +} + +// Signal endstops were triggered - This function can be called from +// an ISR context (Temperature, Stepper or limits ISR), so we must +// be very careful here. If the interrupt being preempted was the +// Stepper ISR (this CAN happen with the endstop limits ISR) then +// when the stepper ISR resumes, we must be very sure that the movement +// is properly cancelled +void Stepper::endstop_triggered(const AxisEnum axis) { + + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + #if IS_CORE + + endstops_trigsteps[axis] = 0.5f * ( + axis == CORE_AXIS_2 ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) + : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] + ); + + #else // !COREXY && !COREXZ && !COREYZ + + endstops_trigsteps[axis] = count_position[axis]; + + #endif // !COREXY && !COREXZ && !COREYZ + + // Discard the rest of the move if there is a current block + quick_stop(); + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); +} + +int32_t Stepper::triggered_position(const AxisEnum axis) { + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + const int32_t v = endstops_trigsteps[axis]; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + return v; +} + +void Stepper::report_positions() { + + // Protect the access to the position. + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + const int32_t xpos = count_position[X_AXIS], + ypos = count_position[Y_AXIS], + zpos = count_position[Z_AXIS]; + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + + #if CORE_IS_XY || CORE_IS_XZ || IS_DELTA || IS_SCARA + SERIAL_PROTOCOLPGM(MSG_COUNT_A); + #else + SERIAL_PROTOCOLPGM(MSG_COUNT_X); + #endif + SERIAL_PROTOCOL(xpos); + + #if CORE_IS_XY || CORE_IS_YZ || IS_DELTA || IS_SCARA + SERIAL_PROTOCOLPGM(" B:"); + #else + SERIAL_PROTOCOLPGM(" Y:"); + #endif + SERIAL_PROTOCOL(ypos); + + #if CORE_IS_XZ || CORE_IS_YZ || IS_DELTA + SERIAL_PROTOCOLPGM(" C:"); + #else + SERIAL_PROTOCOLPGM(" Z:"); + #endif + SERIAL_PROTOCOL(zpos); + + SERIAL_EOL(); +} + +#if ENABLED(BABYSTEPPING) + + #if MINIMUM_STEPPER_PULSE + #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND) + #else + #define STEP_PULSE_CYCLES 0 + #endif + + #if ENABLED(DELTA) + #define CYCLES_EATEN_BABYSTEP (2 * 15) + #else + #define CYCLES_EATEN_BABYSTEP 0 + #endif + #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP)) + + #define _ENABLE(AXIS) enable_## AXIS() + #define _READ_DIR(AXIS) AXIS ##_DIR_READ + #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR + #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) + + #if EXTRA_CYCLES_BABYSTEP > 20 + #define _SAVE_START const hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM) + #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } + #else + #define _SAVE_START NOOP + #if EXTRA_CYCLES_BABYSTEP > 0 + #define _PULSE_WAIT DELAY_NS(EXTRA_CYCLES_BABYSTEP * NANOSECONDS_PER_CYCLE) + #elif STEP_PULSE_CYCLES > 0 + #define _PULSE_WAIT NOOP + #elif ENABLED(DELTA) + #define _PULSE_WAIT DELAY_US(2); + #else + #define _PULSE_WAIT DELAY_US(4); + #endif + #endif + + #define BABYSTEP_AXIS(AXIS, INVERT, DIR) { \ + const uint8_t old_dir = _READ_DIR(AXIS); \ + _ENABLE(AXIS); \ + _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INVERT); \ + DELAY_NS(400); /* DRV8825 */ \ + _SAVE_START; \ + _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), true); \ + _PULSE_WAIT; \ + _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), true); \ + _APPLY_DIR(AXIS, old_dir); \ + } + + // MUST ONLY BE CALLED BY AN ISR, + // No other ISR should ever interrupt this! + void Stepper::babystep(const AxisEnum axis, const bool direction) { + cli(); + + switch (axis) { + + #if ENABLED(BABYSTEP_XY) + + case X_AXIS: + #if CORE_IS_XY + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Y, false, direction); + #elif CORE_IS_XZ + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Z, false, direction); + #else + BABYSTEP_AXIS(X, false, direction); + #endif + break; + + case Y_AXIS: + #if CORE_IS_XY + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Y, false, direction^(CORESIGN(1)<0)); + #elif CORE_IS_YZ + BABYSTEP_AXIS(Y, false, direction); + BABYSTEP_AXIS(Z, false, direction^(CORESIGN(1)<0)); + #else + BABYSTEP_AXIS(Y, false, direction); + #endif + break; + + #endif + + case Z_AXIS: { + + #if CORE_IS_XZ + BABYSTEP_AXIS(X, BABYSTEP_INVERT_Z, direction); + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); + + #elif CORE_IS_YZ + BABYSTEP_AXIS(Y, BABYSTEP_INVERT_Z, direction); + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); + + #elif DISABLED(DELTA) + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction); + + #else // DELTA + + const bool z_direction = direction ^ BABYSTEP_INVERT_Z; + + enable_X(); + enable_Y(); + enable_Z(); + + const uint8_t old_x_dir_pin = X_DIR_READ, + old_y_dir_pin = Y_DIR_READ, + old_z_dir_pin = Z_DIR_READ; + + X_DIR_WRITE(INVERT_X_DIR ^ z_direction); + Y_DIR_WRITE(INVERT_Y_DIR ^ z_direction); + Z_DIR_WRITE(INVERT_Z_DIR ^ z_direction); + + DELAY_NS(400); // DRV8825 + + _SAVE_START; + + X_STEP_WRITE(!INVERT_X_STEP_PIN); + Y_STEP_WRITE(!INVERT_Y_STEP_PIN); + Z_STEP_WRITE(!INVERT_Z_STEP_PIN); + + _PULSE_WAIT; + + X_STEP_WRITE(INVERT_X_STEP_PIN); + Y_STEP_WRITE(INVERT_Y_STEP_PIN); + Z_STEP_WRITE(INVERT_Z_STEP_PIN); + + // Restore direction bits + X_DIR_WRITE(old_x_dir_pin); + Y_DIR_WRITE(old_y_dir_pin); + Z_DIR_WRITE(old_z_dir_pin); + + #endif + + } break; + + default: break; + } + sei(); + } + +#endif // BABYSTEPPING + +/** + * Software-controlled Stepper Motor Current + */ + +#if HAS_DIGIPOTSS + + // From Arduino DigitalPotControl example + void Stepper::digitalPotWrite(const int16_t address, const int16_t value) { + WRITE(DIGIPOTSS_PIN, LOW); // Take the SS pin low to select the chip + SPI.transfer(address); // Send the address and value via SPI + SPI.transfer(value); + WRITE(DIGIPOTSS_PIN, HIGH); // Take the SS pin high to de-select the chip + //delay(10); + } + +#endif // HAS_DIGIPOTSS + +#if HAS_MOTOR_CURRENT_PWM + + void Stepper::refresh_motor_power() { + for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) { + switch (i) { + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + case 0: + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + case 1: + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + case 2: + #endif + digipot_current(i, motor_current_setting[i]); + default: break; + } + } + } + +#endif // HAS_MOTOR_CURRENT_PWM + +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + + void Stepper::digipot_current(const uint8_t driver, const int current) { + + #if HAS_DIGIPOTSS + + const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; + digitalPotWrite(digipot_ch[driver], current); + + #elif HAS_MOTOR_CURRENT_PWM + + if (WITHIN(driver, 0, 2)) + motor_current_setting[driver] = current; // update motor_current_setting + + #define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) + switch (driver) { + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + case 0: _WRITE_CURRENT_PWM(XY); break; + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + case 1: _WRITE_CURRENT_PWM(Z); break; + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + case 2: _WRITE_CURRENT_PWM(E); break; + #endif + } + #endif + } + + void Stepper::digipot_init() { + + #if HAS_DIGIPOTSS + + static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; + + SPI.begin(); + SET_OUTPUT(DIGIPOTSS_PIN); + + for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { + //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); + digipot_current(i, digipot_motor_current[i]); + } + + #elif HAS_MOTOR_CURRENT_PWM + + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN); + #endif + + refresh_motor_power(); + + // Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) + SET_CS5(PRESCALER_1); + + #endif + } + +#endif + +#if HAS_MICROSTEPS + + /** + * Software-controlled Microstepping + */ + + void Stepper::microstep_init() { + SET_OUTPUT(X_MS1_PIN); + SET_OUTPUT(X_MS2_PIN); + #if HAS_Y_MICROSTEPS + SET_OUTPUT(Y_MS1_PIN); + SET_OUTPUT(Y_MS2_PIN); + #endif + #if HAS_Z_MICROSTEPS + SET_OUTPUT(Z_MS1_PIN); + SET_OUTPUT(Z_MS2_PIN); + #endif + #if HAS_E0_MICROSTEPS + SET_OUTPUT(E0_MS1_PIN); + SET_OUTPUT(E0_MS2_PIN); + #endif + #if HAS_E1_MICROSTEPS + SET_OUTPUT(E1_MS1_PIN); + SET_OUTPUT(E1_MS2_PIN); + #endif + #if HAS_E2_MICROSTEPS + SET_OUTPUT(E2_MS1_PIN); + SET_OUTPUT(E2_MS2_PIN); + #endif + #if HAS_E3_MICROSTEPS + SET_OUTPUT(E3_MS1_PIN); + SET_OUTPUT(E3_MS2_PIN); + #endif + #if HAS_E4_MICROSTEPS + SET_OUTPUT(E4_MS1_PIN); + SET_OUTPUT(E4_MS2_PIN); + #endif + static const uint8_t microstep_modes[] = MICROSTEP_MODES; + for (uint16_t i = 0; i < COUNT(microstep_modes); i++) + microstep_mode(i, microstep_modes[i]); + } + + void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2) { + if (ms1 >= 0) switch (driver) { + case 0: WRITE(X_MS1_PIN, ms1); break; + #if HAS_Y_MICROSTEPS + case 1: WRITE(Y_MS1_PIN, ms1); break; + #endif + #if HAS_Z_MICROSTEPS + case 2: WRITE(Z_MS1_PIN, ms1); break; + #endif + #if HAS_E0_MICROSTEPS + case 3: WRITE(E0_MS1_PIN, ms1); break; + #endif + #if HAS_E1_MICROSTEPS + case 4: WRITE(E1_MS1_PIN, ms1); break; + #endif + #if HAS_E2_MICROSTEPS + case 5: WRITE(E2_MS1_PIN, ms1); break; + #endif + #if HAS_E3_MICROSTEPS + case 6: WRITE(E3_MS1_PIN, ms1); break; + #endif + #if HAS_E4_MICROSTEPS + case 7: WRITE(E4_MS1_PIN, ms1); break; + #endif + } + if (ms2 >= 0) switch (driver) { + case 0: WRITE(X_MS2_PIN, ms2); break; + #if HAS_Y_MICROSTEPS + case 1: WRITE(Y_MS2_PIN, ms2); break; + #endif + #if HAS_Z_MICROSTEPS + case 2: WRITE(Z_MS2_PIN, ms2); break; + #endif + #if HAS_E0_MICROSTEPS + case 3: WRITE(E0_MS2_PIN, ms2); break; + #endif + #if HAS_E1_MICROSTEPS + case 4: WRITE(E1_MS2_PIN, ms2); break; + #endif + #if HAS_E2_MICROSTEPS + case 5: WRITE(E2_MS2_PIN, ms2); break; + #endif + #if HAS_E3_MICROSTEPS + case 6: WRITE(E3_MS2_PIN, ms2); break; + #endif + #if HAS_E4_MICROSTEPS + case 7: WRITE(E4_MS2_PIN, ms2); break; + #endif + } + } + + void Stepper::microstep_mode(const uint8_t driver, const uint8_t stepping_mode) { + switch (stepping_mode) { + case 1: microstep_ms(driver, MICROSTEP1); break; + #if ENABLED(HEROIC_STEPPER_DRIVERS) + case 128: microstep_ms(driver, MICROSTEP128); break; + #else + case 2: microstep_ms(driver, MICROSTEP2); break; + case 4: microstep_ms(driver, MICROSTEP4); break; + #endif + case 8: microstep_ms(driver, MICROSTEP8); break; + case 16: microstep_ms(driver, MICROSTEP16); break; + #if MB(ALLIGATOR) + case 32: microstep_ms(driver, MICROSTEP32); break; + #endif + default: SERIAL_ERROR_START(); SERIAL_ERRORLNPGM("Microsteps unavailable"); break; + } + } + + void Stepper::microstep_readings() { + SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); + SERIAL_PROTOCOLPGM("X: "); + SERIAL_PROTOCOL(READ(X_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(X_MS2_PIN)); + #if HAS_Y_MICROSTEPS + SERIAL_PROTOCOLPGM("Y: "); + SERIAL_PROTOCOL(READ(Y_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(Y_MS2_PIN)); + #endif + #if HAS_Z_MICROSTEPS + SERIAL_PROTOCOLPGM("Z: "); + SERIAL_PROTOCOL(READ(Z_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(Z_MS2_PIN)); + #endif + #if HAS_E0_MICROSTEPS + SERIAL_PROTOCOLPGM("E0: "); + SERIAL_PROTOCOL(READ(E0_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E0_MS2_PIN)); + #endif + #if HAS_E1_MICROSTEPS + SERIAL_PROTOCOLPGM("E1: "); + SERIAL_PROTOCOL(READ(E1_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E1_MS2_PIN)); + #endif + #if HAS_E2_MICROSTEPS + SERIAL_PROTOCOLPGM("E2: "); + SERIAL_PROTOCOL(READ(E2_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E2_MS2_PIN)); + #endif + #if HAS_E3_MICROSTEPS + SERIAL_PROTOCOLPGM("E3: "); + SERIAL_PROTOCOL(READ(E3_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E3_MS2_PIN)); + #endif + #if HAS_E4_MICROSTEPS + SERIAL_PROTOCOLPGM("E4: "); + SERIAL_PROTOCOL(READ(E4_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E4_MS2_PIN)); + #endif + } + +#endif // HAS_MICROSTEPS diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h new file mode 100644 index 0000000000..eff7a5e3e1 --- /dev/null +++ b/Marlin/src/module/stepper.h @@ -0,0 +1,522 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors + * Derived from Grbl + * + * Copyright (c) 2009-2011 Simen Svale Skogsrud + * + * Grbl 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 3 of the License, or + * (at your option) any later version. + * + * Grbl 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 Grbl. If not, see . + */ + +#ifndef STEPPER_H +#define STEPPER_H + +#include "../inc/MarlinConfig.h" + +// Disable multiple steps per ISR +//#define DISABLE_MULTI_STEPPING + +// +// Estimate the amount of time the Stepper ISR will take to execute +// + +#ifndef MINIMUM_STEPPER_PULSE + #define MINIMUM_STEPPER_PULSE 0 +#endif + +#ifndef MAXIMUM_STEPPER_RATE + #if MINIMUM_STEPPER_PULSE + #define MAXIMUM_STEPPER_RATE (1000000UL / (2UL * (MINIMUM_STEPPER_PULSE))) + #else + #define MAXIMUM_STEPPER_RATE 500000UL + #endif +#endif + +#ifdef CPU_32_BIT + + // The base ISR takes 792 cycles + #define ISR_BASE_CYCLES 792UL + + // Linear advance base time is 64 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 64UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 40 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #define ISR_S_CURVE_CYCLES 40UL + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 4UL + + // And each stepper takes 16 cycles + #define ISR_STEPPER_CYCLES 16UL + +#else + + // The base ISR takes 752 cycles + #define ISR_BASE_CYCLES 752UL + + // Linear advance base time is 32 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 32UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 160 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #define ISR_S_CURVE_CYCLES 160UL + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 32UL + + // And each stepper takes 88 cycles + #define ISR_STEPPER_CYCLES 88UL + +#endif + +// Add time for each stepper +#ifdef HAS_X_STEP + #define ISR_X_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_X_STEPPER_CYCLES 0UL +#endif +#ifdef HAS_Y_STEP + #define ISR_Y_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_Y_STEPPER_CYCLES 0UL +#endif +#ifdef HAS_Z_STEP + #define ISR_Z_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_Z_STEPPER_CYCLES 0UL +#endif + +// E is always interpolated, even for mixing extruders +#define ISR_E_STEPPER_CYCLES ISR_STEPPER_CYCLES + +// If linear advance is disabled, then the loop also handles them +#if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER) + #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) +#else + #define ISR_MIXING_STEPPER_CYCLES 0UL +#endif + +// And the total minimum loop time, not including the base +#define MIN_ISR_LOOP_CYCLES (ISR_X_STEPPER_CYCLES + ISR_Y_STEPPER_CYCLES + ISR_Z_STEPPER_CYCLES + ISR_E_STEPPER_CYCLES + ISR_MIXING_STEPPER_CYCLES) + +// Calculate the minimum MPU cycles needed per pulse to enforce, limited to the max stepper rate +#define _MIN_STEPPER_PULSE_CYCLES(N) max((F_CPU) / (MAXIMUM_STEPPER_RATE), ((F_CPU) / 500000UL) * (N)) +#if MINIMUM_STEPPER_PULSE + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(MINIMUM_STEPPER_PULSE) +#else + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1) +#endif + +#define MIN_PULSE_TICKS ((PULSE_TIMER_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE)) +#define ADDED_STEP_TICKS ((MIN_STEPPER_PULSE_CYCLES) / (PULSE_TIMER_PRESCALE) - MIN_PULSE_TICKS) + +// But the user could be enforcing a minimum time, so the loop time is +#define ISR_LOOP_CYCLES (ISR_LOOP_BASE_CYCLES + max(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LOOP_CYCLES)) + +// If linear advance is enabled, then it is handled separately +#if ENABLED(LIN_ADVANCE) + + // Estimate the minimum LA loop time + #if ENABLED(MIXING_EXTRUDER) + #define MIN_ISR_LA_LOOP_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) + #else + #define MIN_ISR_LA_LOOP_CYCLES ISR_STEPPER_CYCLES + #endif + + // And the real loop time + #define ISR_LA_LOOP_CYCLES max(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) + +#else + #define ISR_LA_LOOP_CYCLES 0UL +#endif + +// Now estimate the total ISR execution time in cycles given a step per ISR multiplier +#define ISR_EXECUTION_CYCLES(R) (((ISR_BASE_CYCLES + ISR_S_CURVE_CYCLES + (ISR_LOOP_CYCLES) * (R) + ISR_LA_BASE_CYCLES + ISR_LA_LOOP_CYCLES)) / (R)) + +// The maximum allowable stepping frequency when doing x128-x1 stepping (in Hz) +#define MAX_STEP_ISR_FREQUENCY_128X ((F_CPU) / ISR_EXECUTION_CYCLES(128)) +#define MAX_STEP_ISR_FREQUENCY_64X ((F_CPU) / ISR_EXECUTION_CYCLES(64)) +#define MAX_STEP_ISR_FREQUENCY_32X ((F_CPU) / ISR_EXECUTION_CYCLES(32)) +#define MAX_STEP_ISR_FREQUENCY_16X ((F_CPU) / ISR_EXECUTION_CYCLES(16)) +#define MAX_STEP_ISR_FREQUENCY_8X ((F_CPU) / ISR_EXECUTION_CYCLES(8)) +#define MAX_STEP_ISR_FREQUENCY_4X ((F_CPU) / ISR_EXECUTION_CYCLES(4)) +#define MAX_STEP_ISR_FREQUENCY_2X ((F_CPU) / ISR_EXECUTION_CYCLES(2)) +#define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(1)) + +// The minimum allowable frequency for step smoothing will be 1/10 of the maximum nominal frequency (in Hz) +#define MIN_STEP_ISR_FREQUENCY MAX_STEP_ISR_FREQUENCY_1X + +// +// Stepper class definition +// + +#include "stepper_indirection.h" + +#ifdef __AVR__ + #include "speed_lookuptable.h" +#endif + +#include "../module/planner.h" +#include "../core/language.h" + +class Stepper { + + public: + + static block_t* current_block; // A pointer to the block currently being traced + + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + static bool homing_dual_axis; + #endif + + #if HAS_MOTOR_CURRENT_PWM + #ifndef PWM_MOTOR_CURRENT + #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT + #endif + static uint32_t motor_current_setting[3]; + #endif + + private: + + static uint8_t last_direction_bits, // The next stepping-bits to be output + axis_did_move; // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner + + static bool abort_current_block; // Signals to the stepper that current block should be aborted + + #if DISABLED(MIXING_EXTRUDER) + static uint8_t last_moved_extruder; // Last-moved extruder, as set when the last movement was fetched from planner + #endif + + #if ENABLED(X_DUAL_ENDSTOPS) + static bool locked_X_motor, locked_X2_motor; + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + static bool locked_Y_motor, locked_Y2_motor; + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + static bool locked_Z_motor, locked_Z2_motor; + #endif + + static uint32_t acceleration_time, deceleration_time; // time measured in Stepper Timer ticks + static uint8_t steps_per_isr; // Count of steps to perform per Stepper ISR call + + #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + static uint8_t oversampling_factor; // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis + #else + static constexpr uint8_t oversampling_factor = 0; + #endif + + // Delta error variables for the Bresenham line tracer + static int32_t delta_error[XYZE]; + static uint32_t advance_dividend[XYZE], + advance_divisor, + step_events_completed, // The number of step events executed in the current block + accelerate_until, // The point from where we need to stop acceleration + decelerate_after, // The point from where we need to start decelerating + step_event_count; // The total event count for the current block + + // Mixing extruder mix delta_errors for bresenham tracing + #if ENABLED(MIXING_EXTRUDER) + static int32_t delta_error_m[MIXING_STEPPERS]; + static uint32_t advance_dividend_m[MIXING_STEPPERS], + advance_divisor_m; + #define MIXING_STEPPERS_LOOP(VAR) \ + for (uint8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) + #else + static int8_t active_extruder; // Active extruder + #endif + + #if ENABLED(S_CURVE_ACCELERATION) + static int32_t bezier_A, // A coefficient in Bézier speed curve + bezier_B, // B coefficient in Bézier speed curve + bezier_C; // C coefficient in Bézier speed curve + static uint32_t bezier_F, // F coefficient in Bézier speed curve + bezier_AV; // AV coefficient in Bézier speed curve + #ifdef __AVR__ + static bool A_negative; // If A coefficient was negative + #endif + static bool bezier_2nd_half; // If Bézier curve has been initialized or not + #endif + + static uint32_t nextMainISR; // time remaining for the next Step ISR + #if ENABLED(LIN_ADVANCE) + static uint32_t nextAdvanceISR, LA_isr_rate; + static uint16_t LA_current_adv_steps, LA_final_adv_steps, LA_max_adv_steps; // Copy from current executed block. Needed because current_block is set to NULL "too early". + static int8_t LA_steps; + static bool LA_use_advance_lead; + #endif // LIN_ADVANCE + + static int32_t ticks_nominal; + #if DISABLED(S_CURVE_ACCELERATION) + static uint32_t acc_step_rate; // needed for deceleration start point + #endif + + static volatile int32_t endstops_trigsteps[XYZ]; + + // + // Positions of stepper motors, in step units + // + static volatile int32_t count_position[NUM_AXIS]; + + // + // Current direction of stepper motors (+1 or -1) + // + static int8_t count_direction[NUM_AXIS]; + + public: + + // + // Constructor / initializer + // + Stepper() { }; + + // Initialize stepper hardware + static void init(); + + // Interrupt Service Routines + + // The ISR scheduler + static void isr(); + + // The stepper pulse phase ISR + static void stepper_pulse_phase_isr(); + + // The stepper block processing phase ISR + static uint32_t stepper_block_phase_isr(); + + #if ENABLED(LIN_ADVANCE) + // The Linear advance stepper ISR + static uint32_t advance_isr(); + #endif + + // Get the position of a stepper, in steps + static int32_t position(const AxisEnum axis); + + // Report the positions of the steppers, in steps + static void report_positions(); + + // The stepper subsystem goes to sleep when it runs out of things to execute. Call this + // to notify the subsystem that it is time to go to work. + static void wake_up(); + + // Quickly stop all steppers + FORCE_INLINE static void quick_stop() { abort_current_block = true; } + + // The direction of a single motor + FORCE_INLINE static bool motor_direction(const AxisEnum axis) { return TEST(last_direction_bits, axis); } + + // The last movement direction was not null on the specified axis. Note that motor direction is not necessarily the same. + FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return TEST(axis_did_move, axis); } + + // The extruder associated to the last movement + FORCE_INLINE static uint8_t movement_extruder() { + return + #if ENABLED(MIXING_EXTRUDER) + 0 + #else + last_moved_extruder + #endif + ; + } + + // Handle a triggered endstop + static void endstop_triggered(const AxisEnum axis); + + // Triggered position of an axis in steps + static int32_t triggered_position(const AxisEnum axis); + + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + static void digitalPotWrite(const int16_t address, const int16_t value); + static void digipot_current(const uint8_t driver, const int16_t current); + #endif + + #if HAS_MICROSTEPS + static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2); + static void microstep_mode(const uint8_t driver, const uint8_t stepping); + static void microstep_readings(); + #endif + + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + FORCE_INLINE static void set_homing_dual_axis(const bool state) { homing_dual_axis = state; } + #endif + #if ENABLED(X_DUAL_ENDSTOPS) + FORCE_INLINE static void set_x_lock(const bool state) { locked_X_motor = state; } + FORCE_INLINE static void set_x2_lock(const bool state) { locked_X2_motor = state; } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } + FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + FORCE_INLINE static void set_z_lock(const bool state) { locked_Z_motor = state; } + FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } + #endif + + #if ENABLED(BABYSTEPPING) + static void babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention + #endif + + #if HAS_MOTOR_CURRENT_PWM + static void refresh_motor_power(); + #endif + + // Set the current position in steps + inline static void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { + planner.synchronize(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + _set_position(a, b, c, e); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + } + + inline static void set_position(const AxisEnum a, const int32_t &v) { + planner.synchronize(); + + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + count_position[a] = v; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + } + + private: + + // Set the current position in steps + static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); + + // Set direction bits for all steppers + static void set_directions(); + + FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t scale, uint8_t* loops) { + uint32_t timer; + + // Scale the frequency, as requested by the caller + step_rate <<= scale; + + uint8_t multistep = 1; + #if DISABLED(DISABLE_MULTI_STEPPING) + + // The stepping frequency limits for each multistepping rate + static const uint32_t limit[] PROGMEM = { + ( MAX_STEP_ISR_FREQUENCY_1X ), + ( MAX_STEP_ISR_FREQUENCY_2X >> 1), + ( MAX_STEP_ISR_FREQUENCY_4X >> 2), + ( MAX_STEP_ISR_FREQUENCY_8X >> 3), + ( MAX_STEP_ISR_FREQUENCY_16X >> 4), + ( MAX_STEP_ISR_FREQUENCY_32X >> 5), + ( MAX_STEP_ISR_FREQUENCY_64X >> 6), + (MAX_STEP_ISR_FREQUENCY_128X >> 7) + }; + + // Select the proper multistepping + uint8_t idx = 0; + while (idx < 7 && step_rate > (uint32_t)pgm_read_dword(&limit[idx])) { + step_rate >>= 1; + multistep <<= 1; + ++idx; + }; + #else + NOMORE(step_rate, uint32_t(MAX_STEP_ISR_FREQUENCY_1X)); + #endif + *loops = multistep; + + #ifdef CPU_32_BIT + // In case of high-performance processor, it is able to calculate in real-time + timer = uint32_t(STEPPER_TIMER_RATE) / step_rate; + #else + constexpr uint32_t min_step_rate = F_CPU / 500000U; + NOLESS(step_rate, min_step_rate); + step_rate -= min_step_rate; // Correct for minimal speed + if (step_rate >= (8 * 256)) { // higher step rate + const uint8_t tmp_step_rate = (step_rate & 0x00FF); + const uint16_t table_address = (uint16_t)&speed_lookuptable_fast[(uint8_t)(step_rate >> 8)][0], + gain = (uint16_t)pgm_read_word_near(table_address + 2); + timer = MultiU16X8toH16(tmp_step_rate, gain); + timer = (uint16_t)pgm_read_word_near(table_address) - timer; + } + else { // lower step rates + uint16_t table_address = (uint16_t)&speed_lookuptable_slow[0][0]; + table_address += ((step_rate) >> 1) & 0xFFFC; + timer = (uint16_t)pgm_read_word_near(table_address) + - (((uint16_t)pgm_read_word_near(table_address + 2) * (uint8_t)(step_rate & 0x0007)) >> 3); + } + // (there is no need to limit the timer value here. All limits have been + // applied above, and AVR is able to keep up at 30khz Stepping ISR rate) + #endif + + return timer; + } + + #if ENABLED(S_CURVE_ACCELERATION) + static void _calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av); + static int32_t _eval_bezier_curve(const uint32_t curr_step); + #endif + + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + static void digipot_init(); + #endif + + #if HAS_MICROSTEPS + static void microstep_init(); + #endif + +}; + +extern Stepper stepper; + +#endif // STEPPER_H diff --git a/Marlin/stepper_indirection.cpp b/Marlin/src/module/stepper_indirection.cpp similarity index 98% rename from Marlin/stepper_indirection.cpp rename to Marlin/src/module/stepper_indirection.cpp index b5898cded1..e1ac4a54ad 100644 --- a/Marlin/stepper_indirection.cpp +++ b/Marlin/src/module/stepper_indirection.cpp @@ -33,14 +33,19 @@ #include "stepper_indirection.h" -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" // // TMC26X Driver objects and inits // #if ENABLED(HAVE_TMC26X) #include - #include + + #ifdef STM32F7 + #include "../HAL/HAL_STM32F7/TMC2660.h" + #else + #include + #endif #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR) @@ -128,7 +133,7 @@ #include #include #include "planner.h" - #include "enum.h" + #include "../core/enum.h" #if TMC2130STEPPER_VERSION < 0x020201 #error "Update TMC2130Stepper library to 2.2.1 or newer." @@ -179,6 +184,10 @@ // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609) // https://www.trinamic.com/products/integrated-circuits/details/tmc2130/ void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) { + #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD) + UNUSED(thrs); + UNUSED(spmm); + #endif st.begin(); st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER); st.microsteps(microsteps); @@ -196,12 +205,7 @@ st.stealthChop(1); #if ENABLED(HYBRID_THRESHOLD) st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm)); - #else - UNUSED(thrs); - UNUSED(spmm); #endif - #elif ENABLED(SENSORLESS_HOMING) - st.coolstep_min_speed(1024UL * 1024UL - 1UL); #endif st.GSTAT(); // Clear GSTAT } @@ -271,7 +275,6 @@ #endif #endif } - #endif // HAVE_TMC2130 // @@ -279,7 +282,6 @@ // #if ENABLED(HAVE_TMC2208) - #undef HardwareSerial_h // undo Marlin trickery #include #include #include @@ -481,7 +483,6 @@ { constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); } #endif } - #endif // HAVE_TMC2208 void restore_stepper_drivers() { @@ -525,9 +526,11 @@ void reset_stepper_drivers() { tmc26x_init_to_defaults(); #endif #if ENABLED(HAVE_TMC2130) + delay(100); tmc2130_init_to_defaults(); #endif #if ENABLED(HAVE_TMC2208) + delay(100); tmc2208_init_to_defaults(); #endif #ifdef TMC_ADV diff --git a/Marlin/stepper_indirection.h b/Marlin/src/module/stepper_indirection.h similarity index 68% rename from Marlin/stepper_indirection.h rename to Marlin/src/module/stepper_indirection.h index 472b0884bf..7b80a459bf 100644 --- a/Marlin/stepper_indirection.h +++ b/Marlin/src/module/stepper_indirection.h @@ -44,12 +44,16 @@ #ifndef STEPPER_INDIRECTION_H #define STEPPER_INDIRECTION_H -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" // TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI #if ENABLED(HAVE_TMC26X) #include - #include + #ifdef STM32F7 + #include "../HAL/HAL_STM32F7/TMC2660.h" + #else + #include + #endif void tmc26x_init_to_defaults(); #endif @@ -446,69 +450,54 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset /** * Extruder indirection for the single E axis */ -#if ENABLED(SWITCHING_EXTRUDER) - #if EXTRUDERS == 2 - #define E_STEP_WRITE(v) E0_STEP_WRITE(v) - #define NORM_E_DIR() do{ E0_DIR_WRITE(current_block->active_extruder ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE(current_block->active_extruder ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) - #elif EXTRUDERS > 4 - #define E_STEP_WRITE(v) do{ if (current_block->active_extruder < 2) { E0_STEP_WRITE(v); } else if (current_block->active_extruder < 4) { E1_STEP_WRITE(v); } else { E2_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) - #define REV_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(INVERT_E2_DIR); } }while(0) +#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index + #if EXTRUDERS > 4 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) + #elif EXTRUDERS > 3 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) #elif EXTRUDERS > 2 - #define E_STEP_WRITE(v) do{ if (current_block->active_extruder < 2) { E0_STEP_WRITE(v); } else if (current_block->active_extruder < 4) { E1_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(INVERT_E1_DIR); } }while(0) - #define REV_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #else + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) #endif -#elif ENABLED(MK2_MULTIPLEXER) // Even-numbered steppers are reversed - #define E_STEP_WRITE(v) E0_STEP_WRITE(v) - #define NORM_E_DIR() do{ E0_DIR_WRITE(TEST(current_block->active_extruder, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE(TEST(current_block->active_extruder, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) -#elif EXTRUDERS > 4 - #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); break; case 4: E4_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0) - #define REV_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(INVERT_E4_DIR); } }while(0) -#elif EXTRUDERS > 3 - #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0) - #define REV_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(INVERT_E3_DIR); } }while(0) -#elif EXTRUDERS > 2 - #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) - #define REV_E_DIR() do{ switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(INVERT_E2_DIR); } }while(0) -#elif EXTRUDERS > 1 +#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) +#elif E_STEPPERS > 4 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); } }while(0) +#elif E_STEPPERS > 3 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); } }while(0) +#elif E_STEPPERS > 2 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) +#elif E_STEPPERS > 1 #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - #define E_STEP_WRITE(v) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(v); E1_STEP_WRITE(v); } else if (current_block->active_extruder == 0) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (current_block->active_extruder == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) - #define REV_E_DIR() do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(INVERT_E0_DIR); E1_DIR_WRITE(INVERT_E1_DIR); } else if (current_block->active_extruder == 0) { E0_DIR_WRITE(INVERT_E0_DIR); } else { E1_DIR_WRITE(INVERT_E1_DIR); } }while(0) + #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } else if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) #else - #define E_STEP_WRITE(v) do{ if (current_block->active_extruder == 0) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ if (current_block->active_extruder == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) - #define REV_E_DIR() do{ if (current_block->active_extruder == 0) { E0_DIR_WRITE(INVERT_E0_DIR); } else { E1_DIR_WRITE(INVERT_E1_DIR); } }while(0) - #endif -#elif ENABLED(MIXING_EXTRUDER) - #define E_STEP_WRITE(v) NOOP /* not used for mixing extruders! */ - #if MIXING_STEPPERS > 4 - #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); break; case 4: E4_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); E3_DIR_WRITE(!INVERT_E3_DIR); E4_DIR_WRITE(!INVERT_E4_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); E3_DIR_WRITE( INVERT_E3_DIR); E4_DIR_WRITE( INVERT_E4_DIR); }while(0) - #elif MIXING_STEPPERS > 3 - #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); E3_DIR_WRITE(!INVERT_E3_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); E3_DIR_WRITE( INVERT_E3_DIR); }while(0) - #elif MIXING_STEPPERS > 2 - #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); }while(0) - #else - #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); } }while(0) - #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); }while(0) - #define REV_E_DIR() do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); }while(0) + #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) #endif #else - #define E_STEP_WRITE(v) E0_STEP_WRITE(v) - #define NORM_E_DIR() E0_DIR_WRITE(!INVERT_E0_DIR) - #define REV_E_DIR() E0_DIR_WRITE(INVERT_E0_DIR) + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) + #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) #endif #endif // STEPPER_INDIRECTION_H diff --git a/Marlin/temperature.cpp b/Marlin/src/module/temperature.cpp similarity index 83% rename from Marlin/temperature.cpp rename to Marlin/src/module/temperature.cpp index cd6fc054aa..925032a9ec 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -24,40 +24,41 @@ * temperature.cpp - temperature control */ -#include "Marlin.h" #include "temperature.h" -#include "thermistortables.h" -#include "ultralcd.h" +#include "endstops.h" + +#include "../Marlin.h" +#include "../lcd/ultralcd.h" #include "planner.h" -#include "language.h" -#include "printcounter.h" +#include "../core/language.h" +#include "../HAL/Delay.h" #if ENABLED(HEATER_0_USES_MAX6675) - #include "MarlinSPI.h" + #include "../libs/private_spi.h" #endif -#if ENABLED(BABYSTEPPING) +#if ENABLED(BABYSTEPPING) || ENABLED(PID_EXTRUSION_SCALING) #include "stepper.h" #endif -#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - #include "endstops.h" -#endif +#include "printcounter.h" -#if ENABLED(USE_WATCHDOG) - #include "watchdog.h" +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #include "../feature/filwidth.h" #endif #if ENABLED(EMERGENCY_PARSER) - #include "emergency_parser.h" + #include "../feature/emergency_parser.h" #endif -#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - static void* heater_ttbl_map[2] = { (void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE }; - static uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; -#else - static void* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS((void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE, (void*)HEATER_2_TEMPTABLE, (void*)HEATER_3_TEMPTABLE, (void*)HEATER_4_TEMPTABLE); - static uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN, HEATER_2_TEMPTABLE_LEN, HEATER_3_TEMPTABLE_LEN, HEATER_4_TEMPTABLE_LEN); +#if HOTEND_USES_THERMISTOR + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + static void* heater_ttbl_map[2] = { (void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE }; + static constexpr uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; + #else + static void* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS((void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE, (void*)HEATER_2_TEMPTABLE, (void*)HEATER_3_TEMPTABLE, (void*)HEATER_4_TEMPTABLE); + static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN, HEATER_2_TEMPTABLE_LEN, HEATER_3_TEMPTABLE_LEN, HEATER_4_TEMPTABLE_LEN); + #endif #endif Temperature thermalManager; @@ -161,6 +162,12 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 }, int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; #endif +// private: + +#if EARLY_WATCHDOG + bool Temperature::inited = false; +#endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) uint16_t Temperature::redundant_temperature_raw = 0; float Temperature::redundant_temperature = 0.0; @@ -235,6 +242,10 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS]; uint8_t Temperature::ADCKey_count = 0; #endif +#if ENABLED(PID_EXTRUSION_SCALING) + int16_t Temperature::lpq_len; // Initialized in configuration_store +#endif + #if HAS_PID_HEATING /** @@ -571,7 +582,11 @@ int Temperature::getHeaterPower(const int heater) { uint8_t fanDone = 0; for (uint8_t f = 0; f < COUNT(fanPin); f++) { - pin_t pin = pgm_read_byte(&fanPin[f]); + #ifdef ARDUINO + pin_t pin = pgm_read_byte(&fanPin[f]); + #else + pin_t pin = fanPin[f]; + #endif const uint8_t bit = pgm_read_byte(&fanBit[f]); if (pin >= 0 && !TEST(fanDone, bit)) { uint8_t newFanSpeed = TEST(fanState, bit) ? EXTRUDER_AUTO_FAN_SPEED : 0; @@ -664,14 +679,14 @@ float Temperature::get_pid_output(const int8_t e) { #if ENABLED(PID_EXTRUSION_SCALING) cTerm[HOTEND_INDEX] = 0; if (_HOTEND_TEST) { - long e_position = stepper.position(E_AXIS); + const long e_position = stepper.position(E_AXIS); if (e_position > last_e_position) { lpq[lpq_ptr] = e_position - last_e_position; last_e_position = e_position; } - else { + else lpq[lpq_ptr] = 0; - } + if (++lpq_ptr >= lpq_len) lpq_ptr = 0; cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX); pid_output += cTerm[HOTEND_INDEX]; @@ -772,6 +787,14 @@ float Temperature::get_pid_output(const int8_t e) { */ void Temperature::manage_heater() { + #if EARLY_WATCHDOG + // If thermal manager is still not running, make sure to at least reset the watchdog! + if (!inited) { + watchdog_reset(); + return; + } + #endif + #if ENABLED(PROBING_HEATERS_OFF) && ENABLED(BED_LIMIT_SWITCHING) static bool last_pause_state; #endif @@ -785,8 +808,8 @@ void Temperature::manage_heater() { updateTemperaturesFromRawValues(); // also resets the watchdog #if ENABLED(HEATER_0_USES_MAX6675) - if (current_temperature[0] > min(HEATER_0_MAXTEMP, MAX6675_TMAX - 1.0)) max_temp_error(0); - if (current_temperature[0] < max(HEATER_0_MINTEMP, MAX6675_TMIN + .01)) min_temp_error(0); + if (current_temperature[0] > MIN(HEATER_0_MAXTEMP, MAX6675_TMAX - 1.0)) max_temp_error(0); + if (current_temperature[0] < MAX(HEATER_0_MINTEMP, MAX6675_TMIN + .01)) min_temp_error(0); #endif #if WATCH_HOTENDS || WATCH_THE_BED || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER @@ -819,7 +842,7 @@ void Temperature::manage_heater() { #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) // Make sure measured temperatures are close together - if (FABS(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) + if (ABS(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) _temp_error(0, PSTR(MSG_REDUNDANCY), PSTR(MSG_ERR_REDUNDANT_TEMP)); #endif @@ -911,7 +934,29 @@ void Temperature::manage_heater() { #endif // HAS_HEATED_BED } -#define PGM_RD_W(x) (short)pgm_read_word(&x) +#define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) +#define TEMP_AD8495(RAW) ((RAW) * 6.6 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET) + +/** + * Bisect search for the range of the 'raw' value, then interpolate + * proportionally between the under and over values. + */ +#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ + uint8_t l = 0, r = LEN, m; \ + for (;;) { \ + m = (l + r) >> 1; \ + if (m == l || m == r) return (short)pgm_read_word(&TBL[LEN-1][1]); \ + short v00 = pgm_read_word(&TBL[m-1][0]), \ + v10 = pgm_read_word(&TBL[m-0][0]); \ + if (raw < v00) r = m; \ + else if (raw > v10) l = m; \ + else { \ + const short v01 = (short)pgm_read_word(&TBL[m-1][1]), \ + v11 = (short)pgm_read_word(&TBL[m-0][1]); \ + return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ + } \ + } \ +}while(0) // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. @@ -929,68 +974,73 @@ float Temperature::analog2temp(const int raw, const uint8_t e) { return 0.0; } - #if ENABLED(HEATER_0_USES_MAX6675) - if (e == 0) return 0.25 * raw; - #endif - - // Thermistor with conversion table? - if (heater_ttbl_map[e] != NULL) { - short(*tt)[][2] = (short(*)[][2])(heater_ttbl_map[e]); - for (uint8_t i = 1; i < heater_ttbllen_map[e]; i++) { - const short entry10 = PGM_RD_W((*tt)[i][0]); - if (entry10 > raw) { - const short entry00 = PGM_RD_W((*tt)[i - 1][0]), - entry01 = PGM_RD_W((*tt)[i - 1][1]), - entry11 = PGM_RD_W((*tt)[i][1]); - return entry01 + (raw - entry00) * float(entry11 - entry01) / float(entry10 - entry00); - } - } - return PGM_RD_W((*tt)[heater_ttbllen_map[e] - 1][1]); // Overflow: Return last value in the table + switch (e) { + case 0: + #if ENABLED(HEATER_0_USES_MAX6675) + return raw * 0.25; + #elif ENABLED(HEATER_0_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_0_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 1: + #if ENABLED(HEATER_1_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_1_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 2: + #if ENABLED(HEATER_2_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_2_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 3: + #if ENABLED(HEATER_3_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_3_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 4: + #if ENABLED(HEATER_4_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_4_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + default: break; } - // Thermocouple with amplifier ADC interface - return (raw * - #if HEATER_USES_AD8495 - 660.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET - #elif HEATER_USES_AD595 - 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET - #else - 0 - #endif - ); + #if HOTEND_USES_THERMISTOR + // Thermistor with conversion table? + const short(*tt)[][2] = (short(*)[][2])(heater_ttbl_map[e]); + SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); + #endif + + return 0; } #if HAS_HEATED_BED // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. float Temperature::analog2tempBed(const int raw) { - #if ENABLED(BED_USES_THERMISTOR) - - // Thermistor with conversion table - for (uint8_t i = 1; i < BEDTEMPTABLE_LEN; i++) { - const short entry10 = PGM_RD_W(BEDTEMPTABLE[i][0]); - if (entry10 > raw) { - const short entry00 = PGM_RD_W(BEDTEMPTABLE[i - 1][0]), - entry01 = PGM_RD_W(BEDTEMPTABLE[i - 1][1]), - entry11 = PGM_RD_W(BEDTEMPTABLE[i][1]); - return entry01 + (raw - entry00) * float(entry11 - entry01) / float(entry10 - entry00); - } - } - return PGM_RD_W(BEDTEMPTABLE[BEDTEMPTABLE_LEN - 1][1]); // Overflow: Return last value in the table - + #if ENABLED(HEATER_BED_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(BEDTEMPTABLE, BEDTEMPTABLE_LEN); + #elif ENABLED(HEATER_BED_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_BED_USES_AD8495) + return TEMP_AD8495(raw); #else - - // Thermocouple with amplifier ADC interface - return (raw * - #if ENABLED(CHAMBER_USES_AD595) - 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET - #elif ENABLED(CHAMBER_USES_AD8495) - 660.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET - #else - 0 - #endif - ); - + return 0; #endif } #endif // HAS_HEATED_BED @@ -999,33 +1049,14 @@ float Temperature::analog2temp(const int raw, const uint8_t e) { // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. float Temperature::analog2tempChamber(const int raw) { - #if ENABLED(CHAMBER_USES_THERMISTOR) - - // Thermistor with conversion table - for (uint8_t i = 1; i < CHAMBERTEMPTABLE_LEN; i++) { - const short entry10 = PGM_RD_W(CHAMBERTEMPTABLE[i][0]); - if (entry10 > raw) { - const short entry00 = PGM_RD_W(CHAMBERTEMPTABLE[i - 1][0]), - entry01 = PGM_RD_W(CHAMBERTEMPTABLE[i - 1][1]), - entry11 = PGM_RD_W(CHAMBERTEMPTABLE[i][1]); - return entry01 + (raw - entry00) * float(entry11 - entry01) / float(entry10 - entry00); - } - } - return PGM_RD_W(CHAMBERTEMPTABLE[CHAMBERTEMPTABLE_LEN - 1][1]); // Overflow: Return last value in the table - + #if ENABLED(HEATER_CHAMBER_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(CHAMBERTEMPTABLE, CHAMBERTEMPTABLE_LEN); + #elif ENABLED(HEATER_CHAMBER_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_CHAMBER_USES_AD8495) + return TEMP_AD8495(raw); #else - - // Thermocouple with amplifier ADC interface - return (raw * - #if ENABLED(BED_USES_AD595) - 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET - #elif ENABLED(BED_USES_AD8495) - 660.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET - #else - 0 - #endif - ); - + return 0; #endif } #endif // HAS_TEMP_CHAMBER @@ -1040,8 +1071,7 @@ void Temperature::updateTemperaturesFromRawValues() { #if ENABLED(HEATER_0_USES_MAX6675) current_temperature_raw[0] = read_max6675(); #endif - HOTEND_LOOP() - current_temperature[e] = Temperature::analog2temp(current_temperature_raw[e], e); + HOTEND_LOOP() current_temperature[e] = Temperature::analog2temp(current_temperature_raw[e], e); #if HAS_HEATED_BED current_temperature_bed = Temperature::analog2tempBed(current_temperature_bed_raw); #endif @@ -1060,9 +1090,7 @@ void Temperature::updateTemperaturesFromRawValues() { watchdog_reset(); #endif - CRITICAL_SECTION_START; temp_meas_ready = false; - CRITICAL_SECTION_END; } @@ -1082,7 +1110,7 @@ void Temperature::updateTemperaturesFromRawValues() { * a return value of 1. */ int8_t Temperature::widthFil_to_size_ratio() { - if (FABS(filament_width_nominal - filament_width_meas) <= FILWIDTH_ERROR_MARGIN) + if (ABS(filament_width_nominal - filament_width_meas) <= FILWIDTH_ERROR_MARGIN) return int(100.0 * filament_width_nominal / filament_width_meas) - 100; return 0; } @@ -1096,7 +1124,7 @@ void Temperature::updateTemperaturesFromRawValues() { #ifndef MAX6675_DO_PIN #define MAX6675_DO_PIN MISO_PIN #endif - SPI max6675_spi; + SPIclass max6675_spi; #endif /** @@ -1105,7 +1133,15 @@ void Temperature::updateTemperaturesFromRawValues() { */ void Temperature::init() { - #if MB(RUMBA) && (TEMP_SENSOR_0 == -1 || TEMP_SENSOR_1 == -1 || TEMP_SENSOR_2 == -1 || TEMP_SENSOR_BED == -1 || TEMP_SENSOR_CHAMBER == -1) + #if EARLY_WATCHDOG + // Flag that the thermalManager should be running + if (inited) return; + inited = true; + #endif + + #if MB(RUMBA) && ( \ + ENABLED(HEATER_0_USES_AD595) || ENABLED(HEATER_1_USES_AD595) || ENABLED(HEATER_2_USES_AD595) || ENABLED(HEATER_3_USES_AD595) || ENABLED(HEATER_4_USES_AD595) || ENABLED(HEATER_BED_USES_AD595) || ENABLED(HEATER_CHAMBER_USES_AD595) \ + || ENABLED(HEATER_0_USES_AD8495) || ENABLED(HEATER_1_USES_AD8495) || ENABLED(HEATER_2_USES_AD8495) || ENABLED(HEATER_3_USES_AD8495) || ENABLED(HEATER_4_USES_AD8495) || ENABLED(HEATER_BED_USES_AD8495) || ENABLED(HEATER_CHAMBER_USES_AD8495)) // Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector MCUCR = _BV(JTD); MCUCR = _BV(JTD); @@ -1119,22 +1155,22 @@ void Temperature::init() { #endif #if HAS_HEATER_0 - SET_OUTPUT(HEATER_0_PIN); + OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); #endif #if HAS_HEATER_1 - SET_OUTPUT(HEATER_1_PIN); + OUT_WRITE(HEATER_1_PIN, HEATER_1_INVERTING); #endif #if HAS_HEATER_2 - SET_OUTPUT(HEATER_2_PIN); + OUT_WRITE(HEATER_2_PIN, HEATER_2_INVERTING); #endif #if HAS_HEATER_3 - SET_OUTPUT(HEATER_3_PIN); + OUT_WRITE(HEATER_3_PIN, HEATER_3_INVERTING); #endif #if HAS_HEATER_4 - SET_OUTPUT(HEATER_3_PIN); + OUT_WRITE(HEATER_3_PIN, HEATER_4_INVERTING); #endif #if HAS_HEATED_BED - SET_OUTPUT(HEATER_BED_PIN); + OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); #endif #if HAS_FAN0 @@ -1171,43 +1207,36 @@ void Temperature::init() { #endif // HEATER_0_USES_MAX6675 - #ifdef DIDR2 - #define ANALOG_SELECT(pin) do{ if (pin < 8) SBI(DIDR0, pin); else SBI(DIDR2, pin & 0x07); }while(0) - #else - #define ANALOG_SELECT(pin) do{ SBI(DIDR0, pin); }while(0) - #endif + HAL_adc_init(); - // Set analog inputs - ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07; - DIDR0 = 0; - #ifdef DIDR2 - DIDR2 = 0; - #endif #if HAS_TEMP_ADC_0 - ANALOG_SELECT(TEMP_0_PIN); + HAL_ANALOG_SELECT(TEMP_0_PIN); #endif #if HAS_TEMP_ADC_1 - ANALOG_SELECT(TEMP_1_PIN); + HAL_ANALOG_SELECT(TEMP_1_PIN); #endif #if HAS_TEMP_ADC_2 - ANALOG_SELECT(TEMP_2_PIN); + HAL_ANALOG_SELECT(TEMP_2_PIN); #endif #if HAS_TEMP_ADC_3 - ANALOG_SELECT(TEMP_3_PIN); + HAL_ANALOG_SELECT(TEMP_3_PIN); #endif #if HAS_TEMP_ADC_4 - ANALOG_SELECT(TEMP_4_PIN); + HAL_ANALOG_SELECT(TEMP_4_PIN); #endif #if HAS_HEATED_BED - ANALOG_SELECT(TEMP_BED_PIN); + HAL_ANALOG_SELECT(TEMP_BED_PIN); #endif #if HAS_TEMP_CHAMBER - ANALOG_SELECT(TEMP_CHAMBER_PIN); + HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) - ANALOG_SELECT(FILWIDTH_PIN); + HAL_ANALOG_SELECT(FILWIDTH_PIN); #endif + HAL_timer_start(TEMP_TIMER_NUM, TEMP_TIMER_FREQUENCY); + ENABLE_TEMPERATURE_INTERRUPT(); + #if HAS_AUTO_FAN_0 #if E0_AUTO_FAN_PIN == FAN1_PIN SET_OUTPUT(E0_AUTO_FAN_PIN); @@ -1269,11 +1298,6 @@ void Temperature::init() { #endif #endif - // Use timer0 for temperature measurement - // Interleave temperature interrupt with millies interrupt - OCR0B = 128; - ENABLE_TEMPERATURE_INTERRUPT(); - // Wait for temperature measurement to settle delay(250); @@ -1362,38 +1386,40 @@ void Temperature::init() { #if ENABLED(FAST_PWM_FAN) void Temperature::setPwmFrequency(const pin_t pin, int val) { - val &= 0x07; - switch (digitalPinToTimer(pin)) { - #ifdef TCCR0A - #if !AVR_AT90USB1286_FAMILY - case TIMER0A: + #if defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM) + val &= 0x07; + switch (digitalPinToTimer(pin)) { + #ifdef TCCR0A + #if !AVR_AT90USB1286_FAMILY + case TIMER0A: + #endif + case TIMER0B: //_SET_CS(0, val); + break; #endif - case TIMER0B: //_SET_CS(0, val); - break; - #endif - #ifdef TCCR1A - case TIMER1A: case TIMER1B: //_SET_CS(1, val); - break; - #endif - #if defined(TCCR2) || defined(TCCR2A) - #ifdef TCCR2 - case TIMER2: + #ifdef TCCR1A + case TIMER1A: case TIMER1B: //_SET_CS(1, val); + break; #endif - #ifdef TCCR2A - case TIMER2A: case TIMER2B: + #if defined(TCCR2) || defined(TCCR2A) + #ifdef TCCR2 + case TIMER2: + #endif + #ifdef TCCR2A + case TIMER2A: case TIMER2B: + #endif + _SET_CS(2, val); break; #endif - _SET_CS(2, val); break; - #endif - #ifdef TCCR3A - case TIMER3A: case TIMER3B: case TIMER3C: _SET_CS(3, val); break; - #endif - #ifdef TCCR4A - case TIMER4A: case TIMER4B: case TIMER4C: _SET_CS(4, val); break; - #endif - #ifdef TCCR5A - case TIMER5A: case TIMER5B: case TIMER5C: _SET_CS(5, val); break; - #endif - } + #ifdef TCCR3A + case TIMER3A: case TIMER3B: case TIMER3C: _SET_CS(3, val); break; + #endif + #ifdef TCCR4A + case TIMER4A: case TIMER4B: case TIMER4C: _SET_CS(4, val); break; + #endif + #ifdef TCCR5A + case TIMER5A: case TIMER5B: case TIMER5C: _SET_CS(5, val); break; + #endif + } + #endif } #endif // FAST_PWM_FAN @@ -1589,12 +1615,12 @@ void Temperature::disable_all_heaters() { uint32_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 7 #define MAX6675_DISCARD_BITS 18 - #define MAX6675_SPEED_BITS (_BV(SPR1)) // clock ÷ 64 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 #else uint16_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 4 #define MAX6675_DISCARD_BITS 3 - #define MAX6675_SPEED_BITS (_BV(SPR0)) // clock ÷ 16 + #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 #endif int Temperature::read_max6675() { @@ -1607,23 +1633,17 @@ void Temperature::disable_all_heaters() { next_max6675_ms = ms + MAX6675_HEAT_INTERVAL; - CBI( - #ifdef PRR - PRR - #elif defined(PRR0) - PRR0 - #endif - , PRSPI); - SPCR = _BV(MSTR) | _BV(SPE) | MAX6675_SPEED_BITS; + spiBegin(); + spiInit(MAX6675_SPEED_BITS); WRITE(MAX6675_SS, 0); // enable TT_MAX6675 - DELAY_100NS; // Ensure 100ns delay + DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value max6675_temp = 0; for (uint8_t i = sizeof(max6675_temp); i--;) { - max6675_temp |= max6675_spi.receive(); + max6675_temp |= spiRec(); if (i > 0) max6675_temp <<= 8; // shift left if not the last byte } @@ -1690,91 +1710,10 @@ void Temperature::set_current_temp_raw() { temp_meas_ready = true; } -#if ENABLED(PINS_DEBUGGING) - /** - * monitors endstops & Z probe for changes - * - * If a change is detected then the LED is toggled and - * a message is sent out the serial port - * - * Yes, we could miss a rapid back & forth change but - * that won't matter because this is all manual. - * - */ - void endstop_monitor() { - static uint16_t old_endstop_bits_local = 0; - static uint8_t local_LED_status = 0; - uint16_t current_endstop_bits_local = 0; - #if HAS_X_MIN - if (READ(X_MIN_PIN)) SBI(current_endstop_bits_local, X_MIN); - #endif - #if HAS_X_MAX - if (READ(X_MAX_PIN)) SBI(current_endstop_bits_local, X_MAX); - #endif - #if HAS_Y_MIN - if (READ(Y_MIN_PIN)) SBI(current_endstop_bits_local, Y_MIN); - #endif - #if HAS_Y_MAX - if (READ(Y_MAX_PIN)) SBI(current_endstop_bits_local, Y_MAX); - #endif - #if HAS_Z_MIN - if (READ(Z_MIN_PIN)) SBI(current_endstop_bits_local, Z_MIN); - #endif - #if HAS_Z_MAX - if (READ(Z_MAX_PIN)) SBI(current_endstop_bits_local, Z_MAX); - #endif - #if HAS_Z_MIN_PROBE_PIN - if (READ(Z_MIN_PROBE_PIN)) SBI(current_endstop_bits_local, Z_MIN_PROBE); - #endif - #if HAS_Z2_MIN - if (READ(Z2_MIN_PIN)) SBI(current_endstop_bits_local, Z2_MIN); - #endif - #if HAS_Z2_MAX - if (READ(Z2_MAX_PIN)) SBI(current_endstop_bits_local, Z2_MAX); - #endif - - uint16_t endstop_change = current_endstop_bits_local ^ old_endstop_bits_local; - - if (endstop_change) { - #if HAS_X_MIN - if (TEST(endstop_change, X_MIN)) SERIAL_PROTOCOLPAIR(" X_MIN:", !!TEST(current_endstop_bits_local, X_MIN)); - #endif - #if HAS_X_MAX - if (TEST(endstop_change, X_MAX)) SERIAL_PROTOCOLPAIR(" X_MAX:", !!TEST(current_endstop_bits_local, X_MAX)); - #endif - #if HAS_Y_MIN - if (TEST(endstop_change, Y_MIN)) SERIAL_PROTOCOLPAIR(" Y_MIN:", !!TEST(current_endstop_bits_local, Y_MIN)); - #endif - #if HAS_Y_MAX - if (TEST(endstop_change, Y_MAX)) SERIAL_PROTOCOLPAIR(" Y_MAX:", !!TEST(current_endstop_bits_local, Y_MAX)); - #endif - #if HAS_Z_MIN - if (TEST(endstop_change, Z_MIN)) SERIAL_PROTOCOLPAIR(" Z_MIN:", !!TEST(current_endstop_bits_local, Z_MIN)); - #endif - #if HAS_Z_MAX - if (TEST(endstop_change, Z_MAX)) SERIAL_PROTOCOLPAIR(" Z_MAX:", !!TEST(current_endstop_bits_local, Z_MAX)); - #endif - #if HAS_Z_MIN_PROBE_PIN - if (TEST(endstop_change, Z_MIN_PROBE)) SERIAL_PROTOCOLPAIR(" PROBE:", !!TEST(current_endstop_bits_local, Z_MIN_PROBE)); - #endif - #if HAS_Z2_MIN - if (TEST(endstop_change, Z2_MIN)) SERIAL_PROTOCOLPAIR(" Z2_MIN:", !!TEST(current_endstop_bits_local, Z2_MIN)); - #endif - #if HAS_Z2_MAX - if (TEST(endstop_change, Z2_MAX)) SERIAL_PROTOCOLPAIR(" Z2_MAX:", !!TEST(current_endstop_bits_local, Z2_MAX)); - #endif - SERIAL_PROTOCOLPGM("\n\n"); - analogWrite(LED_PIN, local_LED_status); - local_LED_status ^= 255; - old_endstop_bits_local = current_endstop_bits_local; - } - } -#endif // PINS_DEBUGGING - /** * Timer 0 is shared with millies so don't change the prescaler. * - * This ISR uses the compare method so it runs at the base + * On AVR this ISR uses the compare method so it runs at the base * frequency (16 MHz / 64 / 256 = 976.5625 Hz), but at the TCNT0 set * in OCR0B above (128 or halfway between OVFs). * @@ -1784,24 +1723,14 @@ void Temperature::set_current_temp_raw() { * - Step the babysteps value for each axis towards 0 * - For PINS_DEBUGGING, monitor and report endstop pins * - For ENDSTOP_INTERRUPTS_FEATURE check endstops if flagged + * - Call planner.tick to count down its "ignore" time */ -ISR(TIMER0_COMPB_vect) { - /** - * AVR has no hardware interrupt preemption, so emulate priorization - * and preemption of this ISR by all others by disabling the timer - * interrupt generation capability and reenabling global interrupts. - * Any interrupt can then interrupt this handler and preempt it. - * This ISR becomes the lowest priority one so the UART, Endstops - * and Stepper ISRs can all preempt it. - */ - DISABLE_TEMPERATURE_INTERRUPT(); - sei(); +HAL_TEMP_TIMER_ISR { + HAL_timer_isr_prologue(TEMP_TIMER_NUM); Temperature::isr(); - // Disable global interrupts and reenable this ISR - cli(); - ENABLE_TEMPERATURE_INTERRUPT(); + HAL_timer_isr_epilogue(TEMP_TIMER_NUM); } void Temperature::isr() { @@ -2099,13 +2028,6 @@ void Temperature::isr() { * This gives each ADC 0.9765ms to charge up. */ - #define SET_ADMUX_ADCSRA(pin) ADMUX = _BV(REFS0) | (pin & 0x07); SBI(ADCSRA, ADSC) - #ifdef MUX5 - #define START_ADC(pin) if (pin > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) - #else - #define START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) - #endif - switch (adc_sensor_state) { case SensorsReady: { @@ -2125,86 +2047,86 @@ void Temperature::isr() { #if HAS_TEMP_ADC_0 case PrepareTemp_0: - START_ADC(TEMP_0_PIN); + HAL_START_ADC(TEMP_0_PIN); break; case MeasureTemp_0: - raw_temp_value[0] += ADC; + raw_temp_value[0] += HAL_READ_ADC; break; #endif #if HAS_HEATED_BED case PrepareTemp_BED: - START_ADC(TEMP_BED_PIN); + HAL_START_ADC(TEMP_BED_PIN); break; case MeasureTemp_BED: - raw_temp_bed_value += ADC; + raw_temp_bed_value += HAL_READ_ADC; break; #endif #if HAS_TEMP_CHAMBER case PrepareTemp_CHAMBER: - START_ADC(TEMP_CHAMBER_PIN); + HAL_START_ADC(TEMP_CHAMBER_PIN); break; case MeasureTemp_CHAMBER: - raw_temp_chamber_value += ADC; + raw_temp_chamber_value += HAL_READ_ADC; break; #endif #if HAS_TEMP_ADC_1 case PrepareTemp_1: - START_ADC(TEMP_1_PIN); + HAL_START_ADC(TEMP_1_PIN); break; case MeasureTemp_1: - raw_temp_value[1] += ADC; + raw_temp_value[1] += HAL_READ_ADC; break; #endif #if HAS_TEMP_ADC_2 case PrepareTemp_2: - START_ADC(TEMP_2_PIN); + HAL_START_ADC(TEMP_2_PIN); break; case MeasureTemp_2: - raw_temp_value[2] += ADC; + raw_temp_value[2] += HAL_READ_ADC; break; #endif #if HAS_TEMP_ADC_3 case PrepareTemp_3: - START_ADC(TEMP_3_PIN); + HAL_START_ADC(TEMP_3_PIN); break; case MeasureTemp_3: - raw_temp_value[3] += ADC; + raw_temp_value[3] += HAL_READ_ADC; break; #endif #if HAS_TEMP_ADC_4 case PrepareTemp_4: - START_ADC(TEMP_4_PIN); + HAL_START_ADC(TEMP_4_PIN); break; case MeasureTemp_4: - raw_temp_value[4] += ADC; + raw_temp_value[4] += HAL_READ_ADC; break; #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) case Prepare_FILWIDTH: - START_ADC(FILWIDTH_PIN); + HAL_START_ADC(FILWIDTH_PIN); break; case Measure_FILWIDTH: - if (ADC > 102) { // Make sure ADC is reading > 0.5 volts, otherwise don't read. + if (HAL_READ_ADC > 102) { // Make sure ADC is reading > 0.5 volts, otherwise don't read. raw_filwidth_value -= (raw_filwidth_value >> 7); // Subtract 1/128th of the raw_filwidth_value - raw_filwidth_value += ((unsigned long)ADC << 7); // Add new ADC reading, scaled by 128 + raw_filwidth_value += ((unsigned long)HAL_READ_ADC << 7); // Add new ADC reading, scaled by 128 } break; #endif #if ENABLED(ADC_KEYPAD) case Prepare_ADC_KEY: - START_ADC(ADC_KEYPAD_PIN); + HAL_START_ADC(ADC_KEYPAD_PIN); break; case Measure_ADC_KEY: if (ADCKey_count < 16) { - raw_ADCKey_value = ADC; + raw_ADCKey_value = HAL_READ_ADC; if (raw_ADCKey_value > 900) { //ADC Key release ADCKey_count = 0; @@ -2322,42 +2244,32 @@ void Temperature::isr() { } #endif // BABYSTEPPING - #if ENABLED(PINS_DEBUGGING) - extern bool endstop_monitor_flag; - // run the endstop monitor at 15Hz - static uint8_t endstop_monitor_count = 16; // offset this check from the others - if (endstop_monitor_flag) { - endstop_monitor_count += _BV(1); // 15 Hz - endstop_monitor_count &= 0x7F; - if (!endstop_monitor_count) endstop_monitor(); // report changes in endstop status - } - #endif + // Poll endstops state, if required + endstops.poll(); - #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - - extern volatile uint8_t e_hit; - - if (e_hit && ENDSTOPS_ENABLED) { - endstops.update(); // call endstop update routine - e_hit--; - } - #endif + // Periodically call the planner timer + planner.tick(); } #if HAS_TEMP_SENSOR - void print_heater_state(const float &c, const float &t, + #include "../gcode/gcode.h" + + static void print_heater_state(const float &c, const float &t #if ENABLED(SHOW_TEMP_ADC_VALUES) - const float r, + , const float r #endif - const int8_t e=-3 + #if NUM_SERIAL > 1 + , const int8_t port=-1 + #endif + , const int8_t e=-3 ) { #if !(HAS_HEATED_BED && HAS_TEMP_HOTEND && HAS_TEMP_CHAMBER) && HOTENDS <= 1 UNUSED(e); #endif - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOLCHAR( + SERIAL_PROTOCOLCHAR_P(port, ' '); + SERIAL_PROTOCOLCHAR_P(port, #if HAS_TEMP_CHAMBER && HAS_HEATED_BED && HAS_TEMP_HOTEND e == -2 ? 'C' : e == -1 ? 'B' : 'T' #elif HAS_HEATED_BED && HAS_TEMP_HOTEND @@ -2369,25 +2281,30 @@ void Temperature::isr() { #endif ); #if HOTENDS > 1 - if (e >= 0) SERIAL_PROTOCOLCHAR('0' + e); + if (e >= 0) SERIAL_PROTOCOLCHAR_P(port, '0' + e); #endif - SERIAL_PROTOCOLCHAR(':'); - SERIAL_PROTOCOL(c); - SERIAL_PROTOCOLPAIR(" /" , t); + SERIAL_PROTOCOLCHAR_P(port, ':'); + SERIAL_PROTOCOL_P(port, c); + SERIAL_PROTOCOLPAIR_P(port, " /" , t); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_PROTOCOLPAIR(" (", r / OVERSAMPLENR); - SERIAL_PROTOCOLCHAR(')'); + SERIAL_PROTOCOLPAIR_P(port, " (", r / OVERSAMPLENR); + SERIAL_PROTOCOLCHAR_P(port, ')'); #endif delay(2); } - extern uint8_t target_extruder; - - void Temperature::print_heaterstates() { + void Temperature::print_heaterstates( + #if NUM_SERIAL > 1 + const int8_t port + #endif + ) { #if HAS_TEMP_HOTEND - print_heater_state(degHotend(target_extruder), degTargetHotend(target_extruder) + print_heater_state(degHotend(gcode.target_extruder), degTargetHotend(gcode.target_extruder) #if ENABLED(SHOW_TEMP_ADC_VALUES) - , rawHotendTemp(target_extruder) + , rawHotendTemp(gcode.target_extruder) + #endif + #if NUM_SERIAL > 1 + , port #endif ); #endif @@ -2396,6 +2313,9 @@ void Temperature::isr() { #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawBedTemp() #endif + #if NUM_SERIAL > 1 + , port + #endif , -1 // BED ); #endif @@ -2412,20 +2332,23 @@ void Temperature::isr() { #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawHotendTemp(e) #endif + #if NUM_SERIAL > 1 + , port + #endif , e ); #endif - SERIAL_PROTOCOLPGM(" @:"); - SERIAL_PROTOCOL(getHeaterPower(target_extruder)); + SERIAL_PROTOCOLPGM_P(port, " @:"); + SERIAL_PROTOCOL_P(port, getHeaterPower(gcode.target_extruder)); #if HAS_HEATED_BED - SERIAL_PROTOCOLPGM(" B@:"); - SERIAL_PROTOCOL(getHeaterPower(-1)); + SERIAL_PROTOCOLPGM_P(port, " B@:"); + SERIAL_PROTOCOL_P(port, getHeaterPower(-1)); #endif #if HOTENDS > 1 HOTEND_LOOP() { - SERIAL_PROTOCOLPAIR(" @", e); - SERIAL_PROTOCOLCHAR(':'); - SERIAL_PROTOCOL(getHeaterPower(e)); + SERIAL_PROTOCOLPAIR_P(port, " @", e); + SERIAL_PROTOCOLCHAR_P(port, ':'); + SERIAL_PROTOCOL_P(port, getHeaterPower(e)); } #endif } diff --git a/Marlin/temperature.h b/Marlin/src/module/temperature.h similarity index 95% rename from Marlin/temperature.h rename to Marlin/src/module/temperature.h index 27358bac68..bc9aa9a766 100644 --- a/Marlin/temperature.h +++ b/Marlin/src/module/temperature.h @@ -27,34 +27,25 @@ #ifndef TEMPERATURE_H #define TEMPERATURE_H -#include "thermistortables.h" +#include "thermistor/thermistors.h" +#include "../inc/MarlinConfig.h" -#include "MarlinConfig.h" - -#if ENABLED(AUTO_POWER_CONTROL) - #include "power.h" +#if ENABLED(BABYSTEPPING) + extern uint8_t axis_known_position; #endif -#if ENABLED(PID_EXTRUSION_SCALING) - #include "stepper.h" +#if ENABLED(AUTO_POWER_CONTROL) + #include "../feature/power.h" #endif #ifndef SOFT_PWM_SCALE #define SOFT_PWM_SCALE 0 #endif -#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) -#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) -#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) - -#define HOTEND_LOOP() for (int8_t e = 0; e < HOTENDS; e++) - #if HOTENDS == 1 #define HOTEND_INDEX 0 - #define EXTRUDER_IDX 0 #else #define HOTEND_INDEX e - #define EXTRUDER_IDX active_extruder #endif /** @@ -106,11 +97,11 @@ enum ADCSensorState : char { // get all oversampled sensor readings #define MIN_ADC_ISR_LOOPS 10 -#define ACTUAL_ADC_SAMPLES max(int(MIN_ADC_ISR_LOOPS), int(SensorsReady)) +#define ACTUAL_ADC_SAMPLES MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady)) #if HAS_PID_HEATING #define PID_K2 (1.0-PID_K1) - #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (F_CPU / 64.0 / 256.0)) + #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / TEMP_TIMER_FREQUENCY) // Apply the scale factors to the PID values #define scalePID_i(i) ( (i) * PID_dT ) @@ -123,6 +114,8 @@ class Temperature { public: + static volatile bool in_temp_isr; + static float current_temperature[HOTENDS]; static int16_t current_temperature_raw[HOTENDS], target_temperature[HOTENDS]; @@ -198,6 +191,10 @@ class Temperature { private: + #if EARLY_WATCHDOG + static bool inited; // If temperature controller is running + #endif + static volatile bool temp_meas_ready; static uint16_t raw_temp_value[MAX_EXTRUDERS]; @@ -304,6 +301,10 @@ class Temperature { static uint8_t ADCKey_count; #endif + #if ENABLED(PID_EXTRUSION_SCALING) + static int16_t lpq_len; + #endif + /** * Instance Methods */ @@ -445,7 +446,7 @@ class Temperature { #endif target_temperature_bed = #ifdef BED_MAXTEMP - min(celsius, BED_MAXTEMP) + MIN(celsius, BED_MAXTEMP) #else celsius #endif @@ -468,7 +469,7 @@ class Temperature { #endif FORCE_INLINE static bool wait_for_heating(const uint8_t e) { - return degTargetHotend(e) > TEMP_HYSTERESIS && abs(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; + return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; } /** @@ -503,7 +504,7 @@ class Temperature { #if ENABLED(BABYSTEPPING) static void babystep_axis(const AxisEnum axis, const int16_t distance) { - if (axis_known_position[axis]) { + if (TEST(axis_known_position, axis)) { #if IS_CORE #if ENABLED(BABYSTEP_XY) switch (axis) { @@ -587,7 +588,11 @@ class Temperature { #endif // HEATER_IDLE_HANDLER #if HAS_TEMP_SENSOR - static void print_heaterstates(); + static void print_heaterstates( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); #if ENABLED(AUTO_REPORT_TEMPERATURES) static uint8_t auto_report_temp_interval; static millis_t next_temp_report_ms; diff --git a/Marlin/thermistortable_1.h b/Marlin/src/module/thermistor/thermistor_1.h similarity index 100% rename from Marlin/thermistortable_1.h rename to Marlin/src/module/thermistor/thermistor_1.h diff --git a/Marlin/thermistortable_10.h b/Marlin/src/module/thermistor/thermistor_10.h similarity index 100% rename from Marlin/thermistortable_10.h rename to Marlin/src/module/thermistor/thermistor_10.h diff --git a/Marlin/thermistortable_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h similarity index 100% rename from Marlin/thermistortable_1010.h rename to Marlin/src/module/thermistor/thermistor_1010.h diff --git a/Marlin/thermistortable_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h similarity index 100% rename from Marlin/thermistortable_1047.h rename to Marlin/src/module/thermistor/thermistor_1047.h diff --git a/Marlin/thermistortable_11.h b/Marlin/src/module/thermistor/thermistor_11.h similarity index 100% rename from Marlin/thermistortable_11.h rename to Marlin/src/module/thermistor/thermistor_11.h diff --git a/Marlin/thermistortable_110.h b/Marlin/src/module/thermistor/thermistor_110.h similarity index 100% rename from Marlin/thermistortable_110.h rename to Marlin/src/module/thermistor/thermistor_110.h diff --git a/Marlin/thermistortable_12.h b/Marlin/src/module/thermistor/thermistor_12.h similarity index 100% rename from Marlin/thermistortable_12.h rename to Marlin/src/module/thermistor/thermistor_12.h diff --git a/Marlin/thermistortable_13.h b/Marlin/src/module/thermistor/thermistor_13.h similarity index 100% rename from Marlin/thermistortable_13.h rename to Marlin/src/module/thermistor/thermistor_13.h diff --git a/Marlin/thermistortable_147.h b/Marlin/src/module/thermistor/thermistor_147.h similarity index 100% rename from Marlin/thermistortable_147.h rename to Marlin/src/module/thermistor/thermistor_147.h diff --git a/Marlin/thermistortable_15.h b/Marlin/src/module/thermistor/thermistor_15.h similarity index 100% rename from Marlin/thermistortable_15.h rename to Marlin/src/module/thermistor/thermistor_15.h diff --git a/Marlin/thermistortable_2.h b/Marlin/src/module/thermistor/thermistor_2.h similarity index 100% rename from Marlin/thermistortable_2.h rename to Marlin/src/module/thermistor/thermistor_2.h diff --git a/Marlin/thermistortable_20.h b/Marlin/src/module/thermistor/thermistor_20.h similarity index 100% rename from Marlin/thermistortable_20.h rename to Marlin/src/module/thermistor/thermistor_20.h diff --git a/Marlin/thermistortable_3.h b/Marlin/src/module/thermistor/thermistor_3.h similarity index 100% rename from Marlin/thermistortable_3.h rename to Marlin/src/module/thermistor/thermistor_3.h diff --git a/Marlin/thermistortable_4.h b/Marlin/src/module/thermistor/thermistor_4.h similarity index 100% rename from Marlin/thermistortable_4.h rename to Marlin/src/module/thermistor/thermistor_4.h diff --git a/Marlin/thermistortable_5.h b/Marlin/src/module/thermistor/thermistor_5.h similarity index 97% rename from Marlin/thermistortable_5.h rename to Marlin/src/module/thermistor/thermistor_5.h index 7f654b1e63..676fbbd460 100644 --- a/Marlin/thermistortable_5.h +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -22,7 +22,7 @@ // R25 = 100 kOhm, beta25 = 4267 K, 4.7 kOhm pull-up // 100k ParCan thermistor (104GT-2) -// ATC Semitec 104GT-2 (Used in ParCan) +// ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan) // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance const short temptable_5[][2] PROGMEM = { diff --git a/Marlin/thermistortable_51.h b/Marlin/src/module/thermistor/thermistor_51.h similarity index 100% rename from Marlin/thermistortable_51.h rename to Marlin/src/module/thermistor/thermistor_51.h diff --git a/Marlin/thermistortable_52.h b/Marlin/src/module/thermistor/thermistor_52.h similarity index 100% rename from Marlin/thermistortable_52.h rename to Marlin/src/module/thermistor/thermistor_52.h diff --git a/Marlin/thermistortable_55.h b/Marlin/src/module/thermistor/thermistor_55.h similarity index 100% rename from Marlin/thermistortable_55.h rename to Marlin/src/module/thermistor/thermistor_55.h diff --git a/Marlin/thermistortable_6.h b/Marlin/src/module/thermistor/thermistor_6.h similarity index 100% rename from Marlin/thermistortable_6.h rename to Marlin/src/module/thermistor/thermistor_6.h diff --git a/Marlin/thermistortable_60.h b/Marlin/src/module/thermistor/thermistor_60.h similarity index 100% rename from Marlin/thermistortable_60.h rename to Marlin/src/module/thermistor/thermistor_60.h diff --git a/Marlin/thermistortable_66.h b/Marlin/src/module/thermistor/thermistor_66.h similarity index 97% rename from Marlin/thermistortable_66.h rename to Marlin/src/module/thermistor/thermistor_66.h index 7fb9a2d20c..197029082c 100644 --- a/Marlin/thermistortable_66.h +++ b/Marlin/src/module/thermistor/thermistor_66.h @@ -47,6 +47,6 @@ const short temptable_66[][2] PROGMEM = { { OV(1006.6), 80 }, { OV(1015.8), 60 }, { OV(1021.3), 30 }, - { OV(1023) - 1, 25}, - { OV( 1023), 20} + { OV( 1023) - 1, 25 }, + { OV( 1023), 20 } }; diff --git a/Marlin/thermistortable_7.h b/Marlin/src/module/thermistor/thermistor_7.h similarity index 100% rename from Marlin/thermistortable_7.h rename to Marlin/src/module/thermistor/thermistor_7.h diff --git a/Marlin/src/module/thermistor/thermistor_70.h b/Marlin/src/module/thermistor/thermistor_70.h new file mode 100644 index 0000000000..2f9434e300 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_70.h @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// Stock BQ Hephestos 2 100k thermistor. +// Created on 29/12/2017 with an ambient temperature of 20C. +// ANENG AN8009 DMM with a K-type probe used for measurements. + +// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, bqh2 stock thermistor +const short temptable_70[][2] PROGMEM = { + { OV( 18), 270 }, + { OV( 27), 248 }, + { OV( 34), 234 }, + { OV( 45), 220 }, + { OV( 61), 205 }, + { OV( 86), 188 }, + { OV( 123), 172 }, + { OV( 420), 110 }, + { OV( 590), 90 }, + { OV( 845), 56 }, + { OV( 970), 25 }, + { OV( 986), 20 }, + { OV( 994), 15 }, + { OV(1000), 10 }, + { OV(1005), 5 }, + { OV(1009), 0 } // safety +}; diff --git a/Marlin/thermistortable_71.h b/Marlin/src/module/thermistor/thermistor_71.h similarity index 100% rename from Marlin/thermistortable_71.h rename to Marlin/src/module/thermistor/thermistor_71.h diff --git a/Marlin/src/module/thermistor/thermistor_75.h b/Marlin/src/module/thermistor/thermistor_75.h new file mode 100644 index 0000000000..5d9350a9ce --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_75.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, +// Generic Silicon Heat Pad with NTC 100K thermistor +// +// Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor It is used for various +// wattage and voltage heat pads. This table is correct if this part is used. It has been +// optimized to provide good granularity around the 60 C. and 110 C. which corrisponds to bed temperatures +// for PLA and ABS. If you are printing higher temperature filament such as nylon you can uncomment +// the higher earlier entries in the table to give better accuracy. But for speed reasons, if these +// temperatures are not going to be used, it is better to leave them commented out. + +const short temptable_75[][2] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + { (short) ( 111.06 * OVERSAMPLENR ), 200 }, // v=0.542 r=571.747 res=0.501 degC/count +// { (short) ( 174.87 * OVERSAMPLENR ), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no +// { (short) ( 191.64 * OVERSAMPLENR ), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so +// { (short) ( 209.99 * OVERSAMPLENR ), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful +// { (short) ( 230.02 * OVERSAMPLENR ), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner. +// { (short) ( 251.80 * OVERSAMPLENR ), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count + { (short) ( 275.43 * OVERSAMPLENR ), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count +// { (short) ( 300.92 * OVERSAMPLENR ), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun + { (short) ( 328.32 * OVERSAMPLENR ), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count + { (short) ( 388.65 * OVERSAMPLENR ), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count + { (short) ( 421.39 * OVERSAMPLENR ), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count + { (short) ( 455.65 * OVERSAMPLENR ), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count + { (short) ( 491.17 * OVERSAMPLENR ), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count + { (short) ( 527.68 * OVERSAMPLENR ), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count + { (short) ( 564.81 * OVERSAMPLENR ), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count + { (short) ( 602.19 * OVERSAMPLENR ), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count + { (short) ( 676.03 * OVERSAMPLENR ), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count + { (short) ( 745.85 * OVERSAMPLENR ), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count + { (short) ( 778.31 * OVERSAMPLENR ), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count + { (short) ( 808.75 * OVERSAMPLENR ), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count + { (short) ( 836.94 * OVERSAMPLENR ), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count + { (short) ( 862.74 * OVERSAMPLENR ), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count + { (short) ( 886.08 * OVERSAMPLENR ), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count + { (short) ( 906.97 * OVERSAMPLENR ), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count + { (short) ( 941.65 * OVERSAMPLENR ), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count + { (short) ( 967.76 * OVERSAMPLENR ), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count + { (short) ( 978.03 * OVERSAMPLENR ), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count + { (short) ( 981.68 * OVERSAMPLENR ), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count + { (short) ( 983.41 * OVERSAMPLENR ), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count + { (short) ( 985.08 * OVERSAMPLENR ), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count + { (short) ( 986.70 * OVERSAMPLENR ), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count + { (short) ( 993.94 * OVERSAMPLENR ), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count + { (short) ( 999.96 * OVERSAMPLENR ), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count + { (short) (1008.95 * OVERSAMPLENR ), 0 } // v=4.926 r=314997.575 res=1.418 degC/count +}; + + diff --git a/Marlin/thermistortable_8.h b/Marlin/src/module/thermistor/thermistor_8.h similarity index 100% rename from Marlin/thermistortable_8.h rename to Marlin/src/module/thermistor/thermistor_8.h diff --git a/Marlin/thermistortable_9.h b/Marlin/src/module/thermistor/thermistor_9.h similarity index 100% rename from Marlin/thermistortable_9.h rename to Marlin/src/module/thermistor/thermistor_9.h diff --git a/Marlin/thermistortable_998.h b/Marlin/src/module/thermistor/thermistor_998.h similarity index 100% rename from Marlin/thermistortable_998.h rename to Marlin/src/module/thermistor/thermistor_998.h diff --git a/Marlin/thermistortable_999.h b/Marlin/src/module/thermistor/thermistor_999.h similarity index 100% rename from Marlin/thermistortable_999.h rename to Marlin/src/module/thermistor/thermistor_999.h diff --git a/Marlin/thermistortables.h b/Marlin/src/module/thermistor/thermistors.h similarity index 58% rename from Marlin/thermistortables.h rename to Marlin/src/module/thermistor/thermistors.h index 737fca816d..d6f9e22025 100644 --- a/Marlin/thermistortables.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -20,14 +20,13 @@ * */ -#ifndef THERMISTORTABLES_H_ -#define THERMISTORTABLES_H_ +#ifndef THERMISTORS_H_ +#define THERMISTORS_H_ -#include "Marlin.h" -#include "macros.h" +#include "../../inc/MarlinConfig.h" #define OVERSAMPLENR 16 -#define OV(N) int16_t((N)*(OVERSAMPLENR)) +#define OV(N) int16_t((N) * (OVERSAMPLENR)) #define ANY_THERMISTOR_IS(n) (THERMISTORHEATER_0 == n || THERMISTORHEATER_1 == n || THERMISTORHEATER_2 == n || THERMISTORHEATER_3 == n || THERMISTORHEATER_4 == n || THERMISTORBED == n || THERMISTORCHAMBER == n) @@ -41,98 +40,98 @@ #define PtAdVal(T,R0,Rup) (short)(1024/(Rup/PtRt(T,R0)+1)) #define PtLine(T,R0,Rup) { OV(PtAdVal(T,R0,Rup)), T }, -#if ANY_THERMISTOR_IS(1) // 100k bed thermistor - #include "thermistortable_1.h" +#if ANY_THERMISTOR_IS(1) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "EPCOS" + #include "thermistor_1.h" #endif -#if ANY_THERMISTOR_IS(2) // 200k bed thermistor - #include "thermistortable_2.h" +#if ANY_THERMISTOR_IS(2) // 4338 K, R25 = 200 kOhm, Pull-up = 4.7 kOhm, "ATC Semitec 204GT-2" + #include "thermistor_2.h" #endif -#if ANY_THERMISTOR_IS(3) // mendel-parts - #include "thermistortable_3.h" +#if ANY_THERMISTOR_IS(3) // beta25 = 4120 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Mendel-parts" + #include "thermistor_3.h" #endif -#if ANY_THERMISTOR_IS(4) // 10k thermistor - #include "thermistortable_4.h" +#if ANY_THERMISTOR_IS(4) // beta25 = 3950 K, R25 = 10 kOhm, Pull-up = 4.7 kOhm, "Generic" + #include "thermistor_4.h" #endif -#if ANY_THERMISTOR_IS(5) // 100k ParCan thermistor (104GT-2) - #include "thermistortable_5.h" +#if ANY_THERMISTOR_IS(5) // beta25 = 4267 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "ParCan, ATC 104GT-2" + #include "thermistor_5.h" #endif -#if ANY_THERMISTOR_IS(6) // 100k Epcos thermistor - #include "thermistortable_6.h" +#if ANY_THERMISTOR_IS(6) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 8.2 kOhm, "EPCOS ?" + #include "thermistor_6.h" #endif -#if ANY_THERMISTOR_IS(7) // 100k Honeywell 135-104LAG-J01 - #include "thermistortable_7.h" +#if ANY_THERMISTOR_IS(7) // beta25 = 3974 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Honeywell 135-104LAG-J01" + #include "thermistor_7.h" #endif -#if ANY_THERMISTOR_IS(71) // 100k Honeywell 135-104LAF-J01 - #include "thermistortable_71.h" +#if ANY_THERMISTOR_IS(71) // beta25 = 3974 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Honeywell 135-104LAF-J01" + #include "thermistor_71.h" #endif -#if ANY_THERMISTOR_IS(8) // 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) - #include "thermistortable_8.h" +#if ANY_THERMISTOR_IS(8) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 10 kOhm, "Vishay E3104FHT" + #include "thermistor_8.h" #endif -#if ANY_THERMISTOR_IS(9) // 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) - #include "thermistortable_9.h" +#if ANY_THERMISTOR_IS(9) // beta25 = 3960 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "GE Sensing AL03006-58.2K-97-G1" + #include "thermistor_9.h" #endif -#if ANY_THERMISTOR_IS(10) // 100k RS thermistor 198-961 (4.7k pullup) - #include "thermistortable_10.h" +#if ANY_THERMISTOR_IS(10) // beta25 = 3960 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "RS 198-961" + #include "thermistor_10.h" #endif -#if ANY_THERMISTOR_IS(11) // QU-BD silicone bed QWG-104F-3950 thermistor - #include "thermistortable_11.h" +#if ANY_THERMISTOR_IS(11) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "QU-BD silicone bed, QWG-104F-3950" + #include "thermistor_11.h" #endif -#if ANY_THERMISTOR_IS(13) // Hisens thermistor B25/50 =3950 +/-1% - #include "thermistortable_13.h" +#if ANY_THERMISTOR_IS(13) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Hisens" + #include "thermistor_13.h" #endif #if ANY_THERMISTOR_IS(15) // JGAurora A5 thermistor calibration - #include "thermistortable_15.h" + #include "thermistor_15.h" #endif #if ANY_THERMISTOR_IS(20) // PT100 with INA826 amp on Ultimaker v2.0 electronics - #include "thermistortable_20.h" + #include "thermistor_20.h" #endif -#if ANY_THERMISTOR_IS(51) // 100k EPCOS (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) - #include "thermistortable_51.h" +#if ANY_THERMISTOR_IS(51) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "EPCOS" + #include "thermistor_51.h" #endif -#if ANY_THERMISTOR_IS(52) // 200k ATC Semitec 204GT-2 (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) - #include "thermistortable_52.h" +#if ANY_THERMISTOR_IS(52) // beta25 = 4338 K, R25 = 200 kOhm, Pull-up = 1 kOhm, "ATC Semitec 204GT-2" + #include "thermistor_52.h" #endif -#if ANY_THERMISTOR_IS(55) // 100k ATC Semitec 104GT-2 (Used on ParCan) (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) - #include "thermistortable_55.h" +#if ANY_THERMISTOR_IS(55) // beta25 = 4267 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "ATC Semitec 104GT-2 (Used on ParCan)" + #include "thermistor_55.h" #endif -#if ANY_THERMISTOR_IS(60) // Maker's Tool Works Kapton Bed Thermistor - #include "thermistortable_60.h" +#if ANY_THERMISTOR_IS(60) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Maker's Tool Works Kapton Bed" + #include "thermistor_60.h" #endif -#if ANY_THERMISTOR_IS(66) // DyzeDesign 500°C Thermistor - #include "thermistortable_66.h" +#if ANY_THERMISTOR_IS(66) // beta25 = 4500 K, R25 = 2.5 MOhm, Pull-up = 4.7 kOhm, "DyzeDesign 500 °C Thermistor" + #include "thermistor_66.h" #endif -#if ANY_THERMISTOR_IS(12) // 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) - #include "thermistortable_12.h" +#if ANY_THERMISTOR_IS(12) // beta25 = 4700 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Personal calibration for Makibox hot bed" + #include "thermistor_12.h" #endif -#if ANY_THERMISTOR_IS(70) // bqh2 stock thermistor - #include "thermistortable_70.h" +#if ANY_THERMISTOR_IS(70) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Hephestos 2, bqh2 stock thermistor" + #include "thermistor_70.h" #endif -#if ANY_THERMISTOR_IS(75) // Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor - #include "thermistortable_75.h" +#if ANY_THERMISTOR_IS(75) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "MGB18-104F39050L32 thermistor" + #include "thermistor_75.h" #endif #if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup - #include "thermistortable_110.h" + #include "thermistor_110.h" #endif #if ANY_THERMISTOR_IS(147) // Pt100 with 4k7 pullup - #include "thermistortable_147.h" + #include "thermistor_147.h" #endif #if ANY_THERMISTOR_IS(1010) // Pt1000 with 1k0 pullup - #include "thermistortable_1010.h" + #include "thermistor_1010.h" #endif #if ANY_THERMISTOR_IS(1047) // Pt1000 with 4k7 pullup - #include "thermistortable_1047.h" + #include "thermistor_1047.h" #endif #if ANY_THERMISTOR_IS(998) // User-defined table 1 - #include "thermistortable_998.h" + #include "thermistor_998.h" #endif #if ANY_THERMISTOR_IS(999) // User-defined table 2 - #include "thermistortable_999.h" + #include "thermistor_999.h" #endif #define _TT_NAME(_N) temptable_ ## _N #define TT_NAME(_N) _TT_NAME(_N) -#ifdef THERMISTORHEATER_0 +#if THERMISTORHEATER_0 #define HEATER_0_TEMPTABLE TT_NAME(THERMISTORHEATER_0) #define HEATER_0_TEMPTABLE_LEN COUNT(HEATER_0_TEMPTABLE) #elif defined(HEATER_0_USES_THERMISTOR) @@ -142,7 +141,7 @@ #define HEATER_0_TEMPTABLE_LEN 0 #endif -#ifdef THERMISTORHEATER_1 +#if THERMISTORHEATER_1 #define HEATER_1_TEMPTABLE TT_NAME(THERMISTORHEATER_1) #define HEATER_1_TEMPTABLE_LEN COUNT(HEATER_1_TEMPTABLE) #elif defined(HEATER_1_USES_THERMISTOR) @@ -152,7 +151,7 @@ #define HEATER_1_TEMPTABLE_LEN 0 #endif -#ifdef THERMISTORHEATER_2 +#if THERMISTORHEATER_2 #define HEATER_2_TEMPTABLE TT_NAME(THERMISTORHEATER_2) #define HEATER_2_TEMPTABLE_LEN COUNT(HEATER_2_TEMPTABLE) #elif defined(HEATER_2_USES_THERMISTOR) @@ -162,7 +161,7 @@ #define HEATER_2_TEMPTABLE_LEN 0 #endif -#ifdef THERMISTORHEATER_3 +#if THERMISTORHEATER_3 #define HEATER_3_TEMPTABLE TT_NAME(THERMISTORHEATER_3) #define HEATER_3_TEMPTABLE_LEN COUNT(HEATER_3_TEMPTABLE) #elif defined(HEATER_3_USES_THERMISTOR) @@ -172,7 +171,7 @@ #define HEATER_3_TEMPTABLE_LEN 0 #endif -#ifdef THERMISTORHEATER_4 +#if THERMISTORHEATER_4 #define HEATER_4_TEMPTABLE TT_NAME(THERMISTORHEATER_4) #define HEATER_4_TEMPTABLE_LEN COUNT(HEATER_4_TEMPTABLE) #elif defined(HEATER_4_USES_THERMISTOR) @@ -185,21 +184,26 @@ #ifdef THERMISTORBED #define BEDTEMPTABLE TT_NAME(THERMISTORBED) #define BEDTEMPTABLE_LEN COUNT(BEDTEMPTABLE) +#elif defined(HEATER_BED_USES_THERMISTOR) + #error "No bed thermistor table specified" #else - #ifdef BED_USES_THERMISTOR - #error "No bed thermistor table specified" - #endif + #define BEDTEMPTABLE_LEN 0 #endif #ifdef THERMISTORCHAMBER #define CHAMBERTEMPTABLE TT_NAME(THERMISTORCHAMBER) #define CHAMBERTEMPTABLE_LEN COUNT(CHAMBERTEMPTABLE) +#elif defined(HEATER_CHAMBER_USES_THERMISTOR) + #error "No chamber thermistor table specified" #else - #ifdef CHAMBER_USES_THERMISTOR - #error "No chamber thermistor table specified" - #endif + #define CHAMBERTEMPTABLE_LEN 0 #endif +// The SCAN_THERMISTOR_TABLE macro needs alteration? +static_assert(HEATER_0_TEMPTABLE_LEN < 128 && HEATER_1_TEMPTABLE_LEN < 128 && HEATER_2_TEMPTABLE_LEN < 128 && HEATER_3_TEMPTABLE_LEN < 128 && HEATER_4_TEMPTABLE_LEN < 128 && BEDTEMPTABLE_LEN < 128 && CHAMBERTEMPTABLE_LEN < 128, + "Temperature conversion tables over 127 entries need special consideration." +); + // Set the high and low raw values for the heaters // For thermistors the highest temperature results in the lowest ADC value // For thermocouples the highest temperature results in the highest ADC value @@ -249,7 +253,7 @@ #endif #endif #ifndef HEATER_BED_RAW_HI_TEMP - #ifdef BED_USES_THERMISTOR + #ifdef HEATER_BED_USES_THERMISTOR #define HEATER_BED_RAW_HI_TEMP 0 #define HEATER_BED_RAW_LO_TEMP 16383 #else @@ -258,7 +262,7 @@ #endif #endif #ifndef HEATER_CHAMBER_RAW_HI_TEMP - #ifdef CHAMBER_USES_THERMISTOR + #ifdef HEATER_CHAMBER_USES_THERMISTOR #define HEATER_CHAMBER_RAW_HI_TEMP 0 #define HEATER_CHAMBER_RAW_LO_TEMP 16383 #else @@ -267,4 +271,4 @@ #endif #endif -#endif // THERMISTORTABLES_H_ +#endif // THERMISTORS_H_ diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp new file mode 100644 index 0000000000..d013c2c7a1 --- /dev/null +++ b/Marlin/src/module/tool_change.cpp @@ -0,0 +1,508 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#include "tool_change.h" + +#include "motion.h" +#include "planner.h" + +#include "../Marlin.h" + +#include "../inc/MarlinConfig.h" + +#if ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0 + #include "../gcode/gcode.h" // for dwell() +#endif + +#if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) + #include "../module/servo.h" +#endif + +#if ENABLED(EXT_SOLENOID) && !ENABLED(PARKING_EXTRUDER) + #include "../feature/solenoid.h" +#endif + +#if ENABLED(MK2_MULTIPLEXER) + #include "../feature/snmm.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_FANMUX + #include "../feature/fanmux.h" +#endif + +#if DO_SWITCH_EXTRUDER + + #if EXTRUDERS > 3 + #define REQ_ANGLES 4 + #define _SERVO_NR (e < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR) + #else + #define REQ_ANGLES 2 + #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR + #endif + + void move_extruder_servo(const uint8_t e) { + constexpr int16_t angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES; + static_assert(COUNT(angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles."); + planner.synchronize(); + #if EXTRUDERS & 1 + if (e < EXTRUDERS - 1) + #endif + { + MOVE_SERVO(_SERVO_NR, angles[e]); + safe_delay(500); + } + } + +#endif // DO_SWITCH_EXTRUDER + +#if ENABLED(SWITCHING_NOZZLE) + + void move_nozzle_servo(const uint8_t e) { + const int16_t angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES; + planner.synchronize(); + MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]); + safe_delay(500); + } + +#endif // SWITCHING_NOZZLE + +#if ENABLED(PARKING_EXTRUDER) + + void pe_magnet_init() { + for (uint8_t n = 0; n <= 1; ++n) + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_magnet(n); + #else + pe_deactivate_magnet(n); + #endif + } + + void pe_set_magnet(const uint8_t extruder_num, const uint8_t state) { + switch (extruder_num) { + case 1: OUT_WRITE(SOL1_PIN, state); break; + default: OUT_WRITE(SOL0_PIN, state); break; + } + #if PARKING_EXTRUDER_SOLENOIDS_DELAY > 0 + gcode.dwell(PARKING_EXTRUDER_SOLENOIDS_DELAY); + #endif + } + + inline void parking_extruder_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { + if (!no_move) { + + const float parkingposx[] = PARKING_EXTRUDER_PARKING_X, + midpos = (parkingposx[0] + parkingposx[1]) * 0.5 + hotend_offset[X_AXIS][active_extruder], + grabpos = parkingposx[tmp_extruder] + hotend_offset[X_AXIS][active_extruder] + + (tmp_extruder == 0 ? -(PARKING_EXTRUDER_GRAB_DISTANCE) : PARKING_EXTRUDER_GRAB_DISTANCE); + /** + * Steps: + * 1. Raise Z-Axis to give enough clearance + * 2. Move to park position of old extruder + * 3. Disengage magnetic field, wait for delay + * 4. Move near new extruder + * 5. Engage magnetic field for new extruder + * 6. Move to parking incl. offset of new extruder + * 7. Lower Z-Axis + */ + + // STEP 1 + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("Starting Autopark"); + if (DEBUGGING(LEVELING)) DEBUG_POS("current position:", current_position); + #endif + current_position[Z_AXIS] += PARKING_EXTRUDER_SECURITY_RAISE; + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("(1) Raise Z-Axis "); + if (DEBUGGING(LEVELING)) DEBUG_POS("Moving to Raised Z-Position", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.synchronize(); + + // STEP 2 + current_position[X_AXIS] = parkingposx[active_extruder] + hotend_offset[X_AXIS][active_extruder]; + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPAIR("(2) Park extruder ", active_extruder); + if (DEBUGGING(LEVELING)) DEBUG_POS("Moving ParkPos", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + + // STEP 3 + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("(3) Disengage magnet "); + #endif + pe_deactivate_magnet(active_extruder); + + // STEP 4 + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("(4) Move to position near new extruder"); + #endif + current_position[X_AXIS] += (active_extruder == 0 ? 10 : -10); // move 10mm away from parked extruder + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Moving away from parked extruder", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + + // STEP 5 + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("(5) Engage magnetic field"); + #endif + + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_magnet(active_extruder); //just save power for inverted magnets + #endif + pe_activate_magnet(tmp_extruder); + + // STEP 6 + current_position[X_AXIS] = grabpos + (tmp_extruder == 0 ? (+10) : (-10)); + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + current_position[X_AXIS] = grabpos; + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPAIR("(6) Unpark extruder ", tmp_extruder); + if (DEBUGGING(LEVELING)) DEBUG_POS("Move UnparkPos", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder); + planner.synchronize(); + + // Step 7 + current_position[X_AXIS] = midpos - hotend_offset[X_AXIS][tmp_extruder]; + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("(7) Move midway between hotends"); + if (DEBUGGING(LEVELING)) DEBUG_POS("Move midway to new extruder", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("Autopark done."); + #endif + } + else { // nomove == true + // Only engage magnetic field for new extruder + pe_activate_magnet(tmp_extruder); + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_magnet(active_extruder); // Just save power for inverted magnets + #endif + } + current_position[Z_AXIS] += hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Applying Z-offset", current_position); + #endif + } + +#endif // PARKING_EXTRUDER + +inline void invalid_extruder_error(const uint8_t e) { + SERIAL_ECHO_START(); + SERIAL_CHAR('T'); + SERIAL_ECHO_F(e, DEC); + SERIAL_CHAR(' '); + SERIAL_ECHOLNPGM(MSG_INVALID_EXTRUDER); +} + +#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + + inline void mixing_tool_change(const uint8_t tmp_extruder) { + if (tmp_extruder >= MIXING_VIRTUAL_TOOLS) + return invalid_extruder_error(tmp_extruder); + + // T0-Tnnn: Switch virtual tool by changing the mix + for (uint8_t j = 0; j < MIXING_STEPPERS; j++) + mixing_factor[j] = mixing_virtual_tool_mix[tmp_extruder][j]; + } + +#endif // MIXING_EXTRUDER && MIXING_VIRTUAL_TOOLS > 1 + +#if ENABLED(DUAL_X_CARRIAGE) + + inline void dualx_tool_change(const uint8_t tmp_extruder, bool &no_move) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("Dual X Carriage Mode "); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: SERIAL_ECHOLNPGM("DXC_FULL_CONTROL_MODE"); break; + case DXC_AUTO_PARK_MODE: SERIAL_ECHOLNPGM("DXC_AUTO_PARK_MODE"); break; + case DXC_DUPLICATION_MODE: SERIAL_ECHOLNPGM("DXC_DUPLICATION_MODE"); break; + } + } + #endif + + const float xhome = x_home_pos(active_extruder); + if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE + && IsRunning() + && (delayed_move_time || current_position[X_AXIS] != xhome) + ) { + float raised_z = current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT; + #if ENABLED(MAX_SOFTWARE_ENDSTOPS) + NOMORE(raised_z, soft_endstop_max[Z_AXIS]); + #endif + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("Raise to ", raised_z); + SERIAL_ECHOLNPAIR("MoveX to ", xhome); + SERIAL_ECHOLNPAIR("Lower to ", current_position[Z_AXIS]); + } + #endif + // Park old head: 1) raise 2) move to park position 3) lower + for (uint8_t i = 0; i < 3; i++) + planner.buffer_line( + i == 0 ? current_position[X_AXIS] : xhome, + current_position[Y_AXIS], + i == 2 ? current_position[Z_AXIS] : raised_z, + current_position[E_AXIS], + planner.max_feedrate_mm_s[i == 1 ? X_AXIS : Z_AXIS], + active_extruder + ); + planner.synchronize(); + } + + // Apply Y & Z extruder offset (X offset is used as home pos with Dual X) + current_position[Y_AXIS] -= hotend_offset[Y_AXIS][active_extruder] - hotend_offset[Y_AXIS][tmp_extruder]; + current_position[Z_AXIS] -= hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; + + // Activate the new extruder ahead of calling set_axis_is_at_home! + active_extruder = tmp_extruder; + + // This function resets the max/min values - the current position may be overwritten below. + set_axis_is_at_home(X_AXIS); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("New Extruder", current_position); + #endif + + // Only when auto-parking are carriages safe to move + if (dual_x_carriage_mode != DXC_AUTO_PARK_MODE) no_move = true; + + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + // New current position is the position of the activated extruder + current_position[X_AXIS] = inactive_extruder_x_pos; + // Save the inactive extruder's position (from the old current_position) + inactive_extruder_x_pos = destination[X_AXIS]; + break; + case DXC_AUTO_PARK_MODE: + // record raised toolhead position for use by unpark + COPY(raised_parked_position, current_position); + raised_parked_position[Z_AXIS] += TOOLCHANGE_UNPARK_ZLIFT; + #if ENABLED(MAX_SOFTWARE_ENDSTOPS) + NOMORE(raised_parked_position[Z_AXIS], soft_endstop_max[Z_AXIS]); + #endif + active_extruder_parked = true; + delayed_move_time = 0; + break; + case DXC_DUPLICATION_MODE: + // If the new extruder is the left one, set it "parked" + // This triggers the second extruder to move into the duplication position + active_extruder_parked = (active_extruder == 0); + current_position[X_AXIS] = active_extruder_parked ? inactive_extruder_x_pos : destination[X_AXIS] + duplicate_extruder_x_offset; + inactive_extruder_x_pos = destination[X_AXIS]; + extruder_duplication_enabled = false; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("Set inactive_extruder_x_pos=", inactive_extruder_x_pos); + SERIAL_ECHOLNPGM("Clear extruder_duplication_enabled"); + } + #endif + break; + } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); + DEBUG_POS("New extruder (parked)", current_position); + } + #endif + + // No extra case for HAS_ABL in DUAL_X_CARRIAGE. Does that mean they don't work together? + } + +#endif // DUAL_X_CARRIAGE + +/** + * Perform a tool-change, which may result in moving the + * previous tool out of the way and the new tool into place. + */ +void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + + mixing_tool_change(tmp_extruder); + + #else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 + + if (tmp_extruder >= EXTRUDERS) + return invalid_extruder_error(tmp_extruder); + + #if HOTENDS > 1 + + const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s; + + feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; + + if (tmp_extruder != active_extruder) { + if (!no_move && axis_unhomed_error()) { + no_move = true; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("No move on toolchange"); + #endif + } + + // Save current position to destination, for use later + set_destination_from_current(); + + #if HAS_LEVELING + // Set current position to the physical position + const bool leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + + dualx_tool_change(tmp_extruder, no_move); // Can modify no_move + + #else // !DUAL_X_CARRIAGE + + #if ENABLED(PARKING_EXTRUDER) // Dual Parking extruder + parking_extruder_tool_change(tmp_extruder, no_move); + #endif + + #if ENABLED(SWITCHING_NOZZLE) + // Always raise by at least 1 to avoid workpiece + const float zdiff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; + current_position[Z_AXIS] += (zdiff > 0.0 ? zdiff : 0.0) + 1; + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + move_nozzle_servo(tmp_extruder); + #endif + + const float xdiff = hotend_offset[X_AXIS][tmp_extruder] - hotend_offset[X_AXIS][active_extruder], + ydiff = hotend_offset[Y_AXIS][tmp_extruder] - hotend_offset[Y_AXIS][active_extruder]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Offset Tool XY by { ", xdiff); + SERIAL_ECHOPAIR(", ", ydiff); + SERIAL_ECHOLNPGM(" }"); + } + #endif + + // The newly-selected extruder XY is actually at... + current_position[X_AXIS] += xdiff; + current_position[Y_AXIS] += ydiff; + + // Set the new active extruder + active_extruder = tmp_extruder; + + #endif // !DUAL_X_CARRIAGE + + #if HAS_LEVELING + // Restore leveling to re-establish the logical position + set_bed_leveling_enabled(leveling_was_active); + #endif + + #if ENABLED(SWITCHING_NOZZLE) + // The newly-selected extruder Z is actually at... + current_position[Z_AXIS] -= zdiff; + #endif + + // Tell the planner the new "current position" + SYNC_PLAN_POSITION_KINEMATIC(); + + #if ENABLED(DELTA) + //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function + const bool safe_to_move = current_position[Z_AXIS] < delta_clip_start_height - 1; + #else + constexpr bool safe_to_move = true; + #endif + + // Raise, move, and lower again + if (safe_to_move && !no_move && IsRunning()) { + #if DISABLED(SWITCHING_NOZZLE) + // Do a small lift to avoid the workpiece in the move back (below) + current_position[Z_AXIS] += 1.0; + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + #endif + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); + #endif + // Move back to the original (or tweaked) position + do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]); + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder_parked = false; + #endif + } + #if ENABLED(SWITCHING_NOZZLE) + else { + // Move back down. (Including when the new tool is higher.) + do_blocking_move_to_z(destination[Z_AXIS], planner.max_feedrate_mm_s[Z_AXIS]); + } + #endif + } // (tmp_extruder != active_extruder) + + planner.synchronize(); + + #if ENABLED(EXT_SOLENOID) && !ENABLED(PARKING_EXTRUDER) + disable_all_solenoids(); + enable_solenoid_on_active_extruder(); + #endif + + feedrate_mm_s = old_feedrate_mm_s; + + #else // HOTENDS <= 1 + + UNUSED(fr_mm_s); + UNUSED(no_move); + + #if ENABLED(MK2_MULTIPLEXER) + if (tmp_extruder >= E_STEPPERS) + return invalid_extruder_error(tmp_extruder); + + select_multiplexed_stepper(tmp_extruder); + #endif + + // Set the new active extruder + active_extruder = tmp_extruder; + + #endif // HOTENDS <= 1 + + #if DO_SWITCH_EXTRUDER + planner.synchronize(); + move_extruder_servo(active_extruder); + #endif + + #if HAS_FANMUX + fanmux_switch(active_extruder); + #endif + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder); + + #endif // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 +} diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h new file mode 100644 index 0000000000..53da00d178 --- /dev/null +++ b/Marlin/src/module/tool_change.h @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef TOOL_CHANGE_H +#define TOOL_CHANGE_H + +#include "../inc/MarlinConfig.h" + +#if DO_SWITCH_EXTRUDER + void move_extruder_servo(const uint8_t e); +#endif + +#if ENABLED(SWITCHING_NOZZLE) + void move_nozzle_servo(const uint8_t e); +#endif + +#if ENABLED(PARKING_EXTRUDER) + + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + #define PE_MAGNET_ON_STATE !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #else + #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #endif + + void pe_set_magnet(const uint8_t extruder_num, const uint8_t state); + + inline void pe_activate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, PE_MAGNET_ON_STATE); } + inline void pe_deactivate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, !PE_MAGNET_ON_STATE); } + + void pe_magnet_init(); + +#endif // PARKING_EXTRUDER + +/** + * Perform a tool-change, which may result in moving the + * previous tool out of the way and the new tool into place. + */ +void tool_change(const uint8_t tmp_extruder, const float fr_mm_s=0.0, bool no_move=false); + +#endif // TOOL_CHANGE_H diff --git a/Marlin/pins.h b/Marlin/src/pins/pins.h similarity index 76% rename from Marlin/pins.h rename to Marlin/src/pins/pins.h index 0d1a2380d7..2635fb3f59 100644 --- a/Marlin/pins.h +++ b/Marlin/src/pins/pins.h @@ -35,15 +35,17 @@ #ifndef __PINS_H__ #define __PINS_H__ -#if MB(RAMPS_13_EFB) || MB(RAMPS_14_EFB) || MB(RAMPS_PLUS_EFB) +#include "../inc/MarlinConfig.h" + +#if MB(RAMPS_13_EFB) || MB(RAMPS_14_EFB) || MB(RAMPS_PLUS_EFB) || MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_SMART_EFB) || MB(RAMPS_DUO_EFB) || MB(RAMPS4DUE_EFB) #define IS_RAMPS_EFB -#elif MB(RAMPS_13_EEB) || MB(RAMPS_14_EEB) || MB(RAMPS_PLUS_EEB) +#elif MB(RAMPS_13_EEB) || MB(RAMPS_14_EEB) || MB(RAMPS_PLUS_EEB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_DUO_EEB) || MB(RAMPS4DUE_EEB) #define IS_RAMPS_EEB -#elif MB(RAMPS_13_EFF) || MB(RAMPS_14_EFF) || MB(RAMPS_PLUS_EFF) +#elif MB(RAMPS_13_EFF) || MB(RAMPS_14_EFF) || MB(RAMPS_PLUS_EFF) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_SMART_EFF) || MB(RAMPS_DUO_EFF) || MB(RAMPS4DUE_EFF) #define IS_RAMPS_EFF -#elif MB(RAMPS_13_EEF) || MB(RAMPS_14_EEF) || MB(RAMPS_PLUS_EEF) +#elif MB(RAMPS_13_EEF) || MB(RAMPS_14_EEF) || MB(RAMPS_PLUS_EEF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_DUO_EEF) || MB(RAMPS4DUE_EEF) #define IS_RAMPS_EEF -#elif MB(RAMPS_13_SF) || MB(RAMPS_14_SF) || MB(RAMPS_PLUS_SF) +#elif MB(RAMPS_13_SF) || MB(RAMPS_14_SF) || MB(RAMPS_PLUS_SF) || MB(RAMPS_14_RE_ARM_SF) || MB(RAMPS_SMART_SF) || MB(RAMPS_DUO_SF) || MB(RAMPS4DUE_SF) #define IS_RAMPS_SF #endif @@ -248,22 +250,136 @@ // #elif MB(TEENSYLU) - #include "pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:teensy20 + #include "pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90USB1286_CDC #elif MB(PRINTRBOARD) - #include "pins_PRINTRBOARD.h" // AT90USB1286 env:teensy20 + #include "pins_PRINTRBOARD.h" // AT90USB1286 env:at90USB1286_DFU #elif MB(PRINTRBOARD_REVF) - #include "pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:teensy20 + #include "pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90USB1286_DFU #elif MB(BRAINWAVE) - #include "pins_BRAINWAVE.h" // AT90USB646 env:teensy20 + #include "pins_BRAINWAVE.h" // AT90USB646 env:at90USB1286_CDC #elif MB(BRAINWAVE_PRO) - #include "pins_BRAINWAVE_PRO.h" // AT90USB1286 env:teensy20 + #include "pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90USB1286_CDC #elif MB(SAV_MKI) - #include "pins_SAV_MKI.h" // AT90USB1286 env:teensy20 + #include "pins_SAV_MKI.h" // AT90USB1286 env:at90USB1286_CDC #elif MB(TEENSY2) #include "pins_TEENSY2.h" // AT90USB1286 env:teensy20 #elif MB(5DPRINT) - #include "pins_5DPRINT.h" // AT90USB1286 env:teensy20 + #include "pins_5DPRINT.h" // AT90USB1286 ?env:at90USB1286_DFU +// +// LPC1768 ARM Cortex M3 +// + +#elif MB(RAMPS_14_RE_ARM_EFB) + #include "pins_RAMPS_RE_ARM.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(RAMPS_14_RE_ARM_EEB) + #include "pins_RAMPS_RE_ARM.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(RAMPS_14_RE_ARM_EFF) + #include "pins_RAMPS_RE_ARM.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(RAMPS_14_RE_ARM_EEF) + #include "pins_RAMPS_RE_ARM.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(RAMPS_14_RE_ARM_SF) + #include "pins_RAMPS_RE_ARM.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(MKS_SBASE) + #include "pins_MKS_SBASE.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(AZSMZ_MINI) + #include "pins_AZSMZ_MINI.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(AZTEEG_X5_GT) + #include "pins_AZTEEG_X5_GT.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(BIQU_BQ111_A4) + #include "pins_BIQU_BQ111_A4.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(SELENA_COMPACT) + #include "pins_SELENA_COMPACT.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(COHESION3D_REMIX) + #include "pins_COHESION3D_REMIX.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload +#elif MB(COHESION3D_MINI) + #include "pins_COHESION3D_MINI.h" // LPC176x env:LPC1768 env:LPC1768_debug_and_upload + +// +// Other 32-bit Boards +// + +#elif MB(DUE3DOM) + #include "pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(DUE3DOM_MINI) + #include "pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RADDS) + #include "pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RURAMPS4D) + #include "pins_RURAMPS4D.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_FD_V1) + #include "pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_FD_V2) + #include "pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EFB) + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EEB) + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EFF) + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EEF) + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_SF) + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EFB) + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EEB) + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EFF) + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EEF) + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_SF) + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EFB) + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EEB) + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EFF) + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EEF) + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_SF) + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(ULTRATRONICS_PRO) + #include "pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(ARCHIM2) + #include "pins_ARCHIM2.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(ALLIGATOR) + #include "pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug + +// +// STM32 ARM Cortex-M3 +// + +#elif MB(STM32F1R) + #include "pins_STM32F1R.h" // STM32F1 env:STM32F1 +#elif MB(STM3R_MINI) + #include "pins_STM3R_MINI.h" // STM32F1 env:STM32F1 +#elif MB(MALYAN_M200) + #include "pins_MALYAN_M200.h" // STM32F1 env:malyanm200 +#elif MB(CHITU3D) + #include "pins_CHITU3D.h" // STM32F1 env:STM32F1 +#elif MB(GTM32_PRO_VB) + #include "pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F1 + +// +// STM32 ARM Cortex-M4F +// + +#elif MB(TEENSY35_36) + #include "pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 +#elif MB(BEAST) + #include "pins_BEAST.h" // STM32F4 env:STM32F4 +#elif MB(STM32F4) + #include "pins_STM32F4.h" // STM32F4 env:STM32F4 + +// +// ARM Cortex M7 +// + +#elif MB(THE_BORG) + #include "pins_THE_BORG.h" // STM32F7 env:STM32F7 #else #error "Unknown MOTHERBOARD value set in Configuration.h" @@ -566,10 +682,7 @@ #endif // EXTRUDERS > 2 #endif // EXTRUDERS > 1 -// Marlin needs to account for pins that equal -1 -#define marlinAnalogInputToDigitalPin(p) ((p) == -1 ? -1 : analogInputToDigitalPin(p)) - -#define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, marlinAnalogInputToDigitalPin(TEMP_0_PIN), +#define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN), #define _H1_PINS #define _H2_PINS #define _H3_PINS @@ -577,16 +690,16 @@ #if HOTENDS > 1 #undef _H1_PINS - #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, marlinAnalogInputToDigitalPin(TEMP_1_PIN), + #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN), #if HOTENDS > 2 #undef _H2_PINS - #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, marlinAnalogInputToDigitalPin(TEMP_2_PIN), + #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN), #if HOTENDS > 3 #undef _H3_PINS - #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, marlinAnalogInputToDigitalPin(TEMP_3_PIN), + #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN), #if HOTENDS > 4 #undef _H4_PINS - #define _H4_PINS HEATER_4_PIN, marlinAnalogInputToDigitalPin(TEMP_4_PIN), + #define _H4_PINS HEATER_4_PIN, analogInputToDigitalPin(TEMP_4_PIN), #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -607,7 +720,7 @@ #endif // MIXING_STEPPERS > 2 #endif // MIXING_STEPPERS > 1 -#define BED_PINS HEATER_BED_PIN, marlinAnalogInputToDigitalPin(TEMP_BED_PIN), +#define BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN), // // Assign endstop pins for boards with only 3 connectors @@ -776,7 +889,11 @@ #endif #endif -#define SENSITIVE_PINS { 0, 1, \ +#ifndef HAL_SENSITIVE_PINS + #define HAL_SENSITIVE_PINS +#endif + +#define SENSITIVE_PINS { \ X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, X_MS1_PIN, X_MS2_PIN, X_CS_PIN, \ Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \ Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \ @@ -784,51 +901,13 @@ _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS BED_PINS \ _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS \ _X2_PINS _Y2_PINS _Z2_PINS \ + HAL_SENSITIVE_PINS \ } #define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - */ -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) - #define AVR_SCK_PIN 13 - #define AVR_MISO_PIN 12 - #define AVR_MOSI_PIN 11 - #define AVR_SS_PIN 10 -#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) - #define AVR_SCK_PIN 7 - #define AVR_MISO_PIN 6 - #define AVR_MOSI_PIN 5 - #define AVR_SS_PIN 4 -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - #define AVR_SCK_PIN 52 - #define AVR_MISO_PIN 50 - #define AVR_MOSI_PIN 51 - #define AVR_SS_PIN 53 -#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) - #define AVR_SCK_PIN 21 - #define AVR_MISO_PIN 23 - #define AVR_MOSI_PIN 22 - #define AVR_SS_PIN 20 -#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) - #define AVR_SCK_PIN 10 - #define AVR_MISO_PIN 12 - #define AVR_MOSI_PIN 11 - #define AVR_SS_PIN 16 -#endif +// Note: default SPI pins are defined in the HAL -#ifndef SCK_PIN - #define SCK_PIN AVR_SCK_PIN -#endif -#ifndef MISO_PIN - #define MISO_PIN AVR_MISO_PIN -#endif -#ifndef MOSI_PIN - #define MOSI_PIN AVR_MOSI_PIN -#endif -#ifndef SS_PIN - #define SS_PIN AVR_SS_PIN -#endif +#include HAL_PATH(../HAL, spi_pins.h) #endif // __PINS_H__ diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h new file mode 100644 index 0000000000..2ec747cd44 --- /dev/null +++ b/Marlin/src/pins/pinsDebug.h @@ -0,0 +1,232 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#define MAX_NAME_LENGTH 39 // one place to specify the format of all the sources of names + // "-" left justify, "39" minimum width of name, pad with blanks + +/** + * This routine minimizes RAM usage by creating a FLASH resident array to + * store the pin names, pin numbers and analog/digital flag. + * + * Creating the array in FLASH is a two pass process. The first pass puts the + * name strings into FLASH. The second pass actually creates the array. + * + * Both passes use the same pin list. The list contains two macro names. The + * actual macro definitions are changed depending on which pass is being done. + * + */ + +// first pass - put the name strings into FLASH + +#define _ADD_PIN_2(PIN_NAME, ENTRY_NAME) static const char ENTRY_NAME[] PROGMEM = { PIN_NAME }; +#define _ADD_PIN(PIN_NAME, COUNTER) _ADD_PIN_2(PIN_NAME, entry_NAME_##COUNTER) +#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) +#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) + +#include "pinsDebug_list.h" +#line 47 + +// manually add pins that have names that are macros which don't play well with these macros +#if SERIAL_PORT == 0 && (AVR_ATmega2560_FAMILY || AVR_ATmega1284_FAMILY || defined(ARDUINO_ARCH_SAM)) + static const char RXD_NAME[] PROGMEM = { "RXD" }; + static const char TXD_NAME[] PROGMEM = { "TXD" }; +#endif + +///////////////////////////////////////////////////////////////////////////// + +// second pass - create the array + +#undef _ADD_PIN_2 +#undef _ADD_PIN +#undef REPORT_NAME_DIGITAL +#undef REPORT_NAME_ANALOG + +#define _ADD_PIN_2(ENTRY_NAME, NAME, IS_DIGITAL) { ENTRY_NAME, NAME, IS_DIGITAL }, +#define _ADD_PIN(NAME, COUNTER, IS_DIGITAL) _ADD_PIN_2(entry_NAME_##COUNTER, NAME, IS_DIGITAL) +#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(NAME, COUNTER, true) +#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(analogInputToDigitalPin(NAME), COUNTER, false) + + +typedef struct { + const char * const name; + pin_t pin; + bool is_digital; +} PinInfo; + +const PinInfo pin_array[] PROGMEM = { + + /** + * [pin name] [pin number] [is digital or analog] 1 = digital, 0 = analog + * Each entry takes up 6 bytes in FLASH: + * 2 byte pointer to location of the name string + * 2 bytes containing the pin number + * analog pin numbers were convereted to digital when the array was created + * 2 bytes containing the digital/analog bool flag + */ + + // manually add pins ... + #if SERIAL_PORT == 0 + #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + { RXD_NAME, 0, true }, + { TXD_NAME, 1, true }, + #elif AVR_ATmega1284_FAMILY + { RXD_NAME, 8, true }, + { TXD_NAME, 9, true }, + #endif + #endif + + #include "pinsDebug_list.h" + #line 99 + +}; + + +#include HAL_PATH(../HAL, pinsDebug.h) // get the correct support file for this CPU + + +static void print_input_or_output(const bool isout) { + serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); +} + +// pretty report with PWM info +inline void report_pin_state_extended(pin_t pin, bool ignore, bool extended = false, const char *start_string = "") { + char buffer[MAX_NAME_LENGTH + 1]; // for the sprintf statements + bool found = false, multi_name_pin = false; + + for (uint8_t x = 0; x < COUNT(pin_array); x++) { // scan entire array and report all instances of this pin + if (GET_ARRAY_PIN(x) == pin) { + if (found) multi_name_pin = true; + found = true; + if (!multi_name_pin) { // report digitial and analog pin number only on the first time through + sprintf_P(buffer, PSTR("%sPIN: "), start_string); // digital pin number + SERIAL_ECHO(buffer); + PRINT_PIN(pin); + PRINT_PORT(pin); + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else SERIAL_ECHO_SP(8); // add padding if not an analog pin + } + else { + SERIAL_CHAR('.'); + SERIAL_ECHO_SP(MULTI_NAME_PAD + strlen(start_string)); // add padding if not the first instance found + } + PRINT_ARRAY_NAME(x); + if (extended) { + if (pin_is_protected(pin) && !ignore) + SERIAL_ECHOPGM("protected "); + else { + #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO + if (pin == 46 || pin == 47) { + if (pin == 46) { + print_input_or_output(GET_OUTPUT(46)); + SERIAL_PROTOCOL(READ(46)); + } + else if (pin == 47) { + print_input_or_output(GET_OUTPUT(47)); + SERIAL_PROTOCOL(READ(47)); + } + } + else + #endif + { + if (!GET_ARRAY_IS_DIGITAL(x)) { + sprintf_P(buffer, PSTR("Analog in = %5ld"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + } + else { + if (!GET_PINMODE(pin)) { + //pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this + // because this could interfere with inductive/capacitive + // sensors (high impedance voltage divider) and with PT100 amplifier + print_input_or_output(false); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + else if (pwm_status(pin)) { + // do nothing + } + else { + print_input_or_output(true); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + } + if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report + } + } + } + SERIAL_EOL(); + } // end of IF + } // end of for loop + + if (!found) { + sprintf_P(buffer, PSTR("%sPIN: "), start_string); + SERIAL_ECHO(buffer); + PRINT_PIN(pin); + PRINT_PORT(pin); + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else + SERIAL_ECHO_SP(8); // add padding if not an analog pin + SERIAL_ECHOPGM(""); + if (extended) { + #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO + if (pin == 46 || pin == 47) { + SERIAL_PROTOCOL_SP(12); + if (pin == 46) { + print_input_or_output(GET_OUTPUT(46)); + SERIAL_PROTOCOL(READ(46)); + } + else { + print_input_or_output(GET_OUTPUT(47)); + SERIAL_PROTOCOL(READ(47)); + } + } + else + #endif + { + if (GET_PINMODE(pin)) { + SERIAL_PROTOCOL_SP(MAX_NAME_LENGTH - 16); + print_input_or_output(true); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + else { + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" Analog in = %5ld"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + SERIAL_ECHOPGM(" "); + } + else + SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); // add padding if not an analog pin + + print_input_or_output(false); + SERIAL_PROTOCOL(digitalRead_mod(pin)); + } + //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin + if (extended) pwm_details(pin); // report PWM capabilities only if doing an extended report + } + } + SERIAL_EOL(); + } +} diff --git a/Marlin/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h similarity index 100% rename from Marlin/pinsDebug_list.h rename to Marlin/src/pins/pinsDebug_list.h diff --git a/Marlin/pins_3DRAG.h b/Marlin/src/pins/pins_3DRAG.h similarity index 100% rename from Marlin/pins_3DRAG.h rename to Marlin/src/pins/pins_3DRAG.h diff --git a/Marlin/pins_5DPRINT.h b/Marlin/src/pins/pins_5DPRINT.h old mode 100755 new mode 100644 similarity index 98% rename from Marlin/pins_5DPRINT.h rename to Marlin/src/pins/pins_5DPRINT.h index 0e8b5f6019..415cc23bce --- a/Marlin/pins_5DPRINT.h +++ b/Marlin/src/pins/pins_5DPRINT.h @@ -132,7 +132,9 @@ #define HEATER_0_PIN 15 // C5 #define HEATER_BED_PIN 14 // C4 -#define FAN_PIN 16 // C6 PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif // // Misc. Functions diff --git a/Marlin/src/pins/pins_ALLIGATOR_R2.h b/Marlin/src/pins/pins_ALLIGATOR_R2.h new file mode 100644 index 0000000000..1bfbcdf224 --- /dev/null +++ b/Marlin/src/pins/pins_ALLIGATOR_R2.h @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Alligator Board R2 + * http://www.3dartists.org/ + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Alligator Board R2" + +// +// Servos +// +#define SERVO0_PIN 36 +#define SERVO1_PIN 40 +#define SERVO2_PIN 41 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 33 // PC1 +#define X_MAX_PIN 34 // PC2 +#define Y_MIN_PIN 35 // PC3 +#define Y_MAX_PIN 37 // PC5 +#define Z_MIN_PIN 38 // PC6 +#define Z_MAX_PIN 39 // PC7 + +// +// Steppers +// +#define X_STEP_PIN 96 // PB24 +#define X_DIR_PIN 2 // PB25 +#define X_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Y_STEP_PIN 94 // PB22 +#define Y_DIR_PIN 95 // PB23 +#define Y_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Z_STEP_PIN 98 // PC27 +#define Z_DIR_PIN 3 // PC28 +#define Z_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E0_STEP_PIN 5 // PC25 +#define E0_DIR_PIN 4 // PC26 +#define E0_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E1_STEP_PIN 28 // PD3 on piggy +#define E1_DIR_PIN 27 // PD2 on piggy +#define E1_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E2_STEP_PIN 11 // PD7 on piggy +#define E2_DIR_PIN 29 // PD6 on piggy +#define E2_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E3_STEP_PIN 30 // PD9 on piggy +#define E3_DIR_PIN 12 // PD8 on piggy +#define E3_ENABLE_PIN 24 // PA15, motor RESET pin + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 99 // PC10 +#define Y_MS1_PIN 10 // PC29 +#define Z_MS1_PIN 44 // PC19 +#define E0_MS1_PIN 45 // PC18 + +//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input (PA24) +#define TEMP_1_PIN 2 // Analog Input (PA23 on piggy) +#define TEMP_2_PIN 3 // Analog Input (PA22 on piggy) +#define TEMP_3_PIN 4 // Analog Input (PA6 on piggy) +#define TEMP_BED_PIN 0 // Analog Input (PA16) + +// +// Heaters / Fans +// +// Note that on the Due pin A0 on the board is channel 2 on the ARM chip +#define HEATER_0_PIN 68 // PA1 +#define HEATER_1_PIN 8 // PC22 on piggy +#define HEATER_2_PIN 9 // PC21 on piggy +#define HEATER_3_PIN 97 // PC20 on piggy +#define HEATER_BED_PIN 69 // PA0 + +#ifndef FAN_PIN + #define FAN_PIN 92 // PA5 +#endif +#define FAN1_PIN 31 // PA7 + +// +// Misc. Functions +// +#define SDSS 77 // PA28 +#define SD_DETECT_PIN 87 // PA29 +#define LED_RED_PIN 40 // PC8 +#define LED_GREEN_PIN 41 // PC9 + +#define EXP_VOLTAGE_LEVEL_PIN 65 + +#define SPI_CHAN_DAC 1 + +#define DAC0_SYNC 53 // PB14 +#define DAC1_SYNC 6 // PC24 + +// 64K SPI EEPROM +#define SPI_EEPROM +#define SPI_CHAN_EEPROM1 2 +#define SPI_EEPROM1_CS 25 // PD0 + +// 2K SPI EEPROM +#define SPI_EEPROM2_CS 26 // PD1 + +// FLASH SPI +// 32Mb +#define SPI_FLASH_CS 23 // PA14 + +// +// LCD / Controller +// +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 18 + #define LCD_PINS_ENABLE 15 + #define LCD_PINS_D4 19 + #define BEEPER_PIN 64 + + #define BTN_EN1 14 + #define BTN_EN2 16 + #define BTN_ENC 17 + + #if UI_VOLTAGE_LEVEL != 1 + #undef UI_VOLTAGE_LEVEL + #define UI_VOLTAGE_LEVEL 1 + #endif + +#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER diff --git a/Marlin/pins_ANET_10.h b/Marlin/src/pins/pins_ANET_10.h similarity index 95% rename from Marlin/pins_ANET_10.h rename to Marlin/src/pins/pins_ANET_10.h index d7c113d355..bdd277e35c 100644 --- a/Marlin/pins_ANET_10.h +++ b/Marlin/src/pins/pins_ANET_10.h @@ -89,7 +89,7 @@ */ #ifndef __AVR_ATmega1284P__ - #error "Oops! Make sure you have 'Anet V1.0', 'Anet V1.0 (Optiboot)' or 'Sanguino' selected from the 'Tools -> Boards' menu." + #error "Oops! Make sure you have 'Anet V1.0', 'Anet V1.0 (Optiboot)' or 'Sanguino' selected in the 'Tools -> Boards' menu and ATmega1284P selected in 'Tools -> Processor' menu." #endif #ifndef BOARD_NAME @@ -133,7 +133,10 @@ // #define HEATER_0_PIN 13 // (extruder) #define HEATER_BED_PIN 12 // (bed) -#define FAN_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 4 +#endif // // Misc. Functions @@ -153,7 +156,7 @@ #if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) #define LCD_SDSS 28 #if ENABLED(ADC_KEYPAD) - #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + #define SERVO0_PIN 27 // free for BLTouch/3D-Touch #define LCD_PINS_RS 28 #define LCD_PINS_ENABLE 29 #define LCD_PINS_D4 10 @@ -168,7 +171,7 @@ // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 - #define SERVO0_PIN 29 // free for BLTouch/3D-Touch + #define SERVO0_PIN 29 // free for BLTouch/3D-Touch #define BEEPER_PIN 17 #define LCD_PINS_RS 27 #define LCD_PINS_ENABLE 28 @@ -177,13 +180,13 @@ #define BTN_EN2 10 #define BTN_ENC 16 #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_0_NOP + #define ST7920_DELAY_1 DELAY_NS(0) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_1_NOP + #define ST7920_DELAY_2 DELAY_NS(63) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_2_NOP + #define ST7920_DELAY_3 DELAY_NS(125) #endif #define STD_ENCODER_PULSES_PER_STEP 4 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 @@ -201,7 +204,7 @@ * published by oderwat on Thingiverse at https://www.thingiverse.com/thing:2103748. * * Using that adapter requires changing the pin definition as follows: - * #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + * #define SERVO0_PIN 27 // free for BLTouch/3D-Touch * #define BEEPER_PIN 28 * #define LCD_PINS_RS 30 * #define LCD_PINS_ENABLE 29 diff --git a/Marlin/src/pins/pins_ARCHIM2.h b/Marlin/src/pins/pins_ARCHIM2.h new file mode 100644 index 0000000000..ea9348cef0 --- /dev/null +++ b/Marlin/src/pins/pins_ARCHIM2.h @@ -0,0 +1,187 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * ARCHIM2 pin assignment (pins_ARCHIM2.h) + * + * The Archim2 board requires Arduino Archim addons installed. + * Add the following URL to Arduino IDE's Additional Board Manager URLs: + * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json + * In the Arduino IDE Board Manager search for Archim and install the package. + * Change your target board to "Archim". + * + * Further information is provided by UltiMachine + * https://github.com/ultimachine/Archim/wiki/Archim-v2.0 + * https://github.com/ultimachine/Archim/wiki + * + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Archim' selected from the 'Tools -> Boards' menu." +#endif + +// +// Items marked * have been altered from Archim v1.0 +// + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 59 // PA4 X_DIAG +#define Y_DIAG_PIN 48 // PC15 Y_DIAG +#define Z_DIAG_PIN 36 // PC4 Z_DIAG +#define E0_DIAG_PIN 78 // PB23 E1_DIAG +#define E1_DIAG_PIN 25 // PD0 E2_DIAG + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. + +#if DISABLED(SENSORLESS_HOMING) + #define X_MIN_PIN 14 // PD4 MIN ES1 + #define X_MAX_PIN 32 // PD10 MAX ES1 + #define Y_MIN_PIN 29 // PD6 MIN ES2 + #define Y_MAX_PIN 15 // PD5 MAX ES2 +#else + #if X_HOME_DIR == -1 + #define X_MIN_PIN X_DIAG_PIN + #define X_MAX_PIN 32 + #else + #define X_MIN_PIN 14 + #define X_MAX_PIN X_DIAG_PIN + #endif + + #if Y_HOME_DIR == -1 + #define Y_MIN_PIN Y_DIAG_PIN + #define Y_MAX_PIN 15 + #else + #define Y_MIN_PIN 29 + #define Y_MAX_PIN Y_DIAG_PIN + #endif +#endif + + #define Z_MIN_PIN 31 // PA7 MIN ES3 + #define Z_MAX_PIN 30 // PD9 MAX ES3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 38 // PC6 X-STEP * +#define X_DIR_PIN 37 // PC5 X-DIR * +#define X_ENABLE_PIN 41 // PC9 EN1 +#ifndef X_CS_PIN + #define X_CS_PIN 39 // PC7 X_nCS +#endif + +#define Y_STEP_PIN 51 // PC12 Y-STEP * +#define Y_DIR_PIN 92 // PC11 Y-DIR -AddOns * +#define Y_ENABLE_PIN 49 // PC14 Y-EN * +#ifndef Y_CS_PIN + #define Y_CS_PIN 50 // PC13 Y_nCS +#endif + +#define Z_STEP_PIN 46 // PC17 Z-STEP * +#define Z_DIR_PIN 47 // PC16 Z-DIR * +#define Z_ENABLE_PIN 44 // PC19 Z-END * +#ifndef Z_CS_PIN + #define Z_CS_PIN 45 // PC18 Z_nCS +#endif + +#define E0_STEP_PIN 107 // PB10 E1-STEP -AddOns * +#define E0_DIR_PIN 96 // PC10 E1-DIR -AddOns * +#define E0_ENABLE_PIN 105 // PB22 E1-EN -AddOns * +#ifndef E0_CS_PIN + #define E0_CS_PIN 104 // PC20 E1_nCS -AddOns * +#endif + +#define E1_STEP_PIN 22 // PB26 E2_STEP * +#define E1_DIR_PIN 97 // PB24 E2_DIR -AddOns * +#define E1_ENABLE_PIN 18 // PA11 E2-EN +#ifndef E1_CS_PIN + #define E1_CS_PIN 19 // PA10 E2_nCS +#endif + +// +// Software SPI pins for TMC2130 stepper drivers. +// Required for the Archim2 board. +// +#if ENABLED(TMC_USE_SW_SPI) + #define TMC_SW_MOSI 28 // PD3 + #define TMC_SW_MISO 26 // PD1 + #define TMC_SW_SCK 27 // PD2 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * +#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * +#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * +#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * + +// +// Heaters / Fans +// +#ifndef FAN_PIN + #define FAN_PIN 4 // D4 PC26 FET_PWM1 +#endif +#define FAN1_PIN 5 // D5 PC25 FET_PWM2 + +#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 +#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 +#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 +#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM + +// +// Misc. Functions +// +#define SDSS 87 // D87 PA29 CS + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if ENABLED(ULTRA_LCD) + #if ENABLED(NEWPANEL) + #define BEEPER_PIN 23 // D24 PA15_CTS1 + #define LCD_PINS_RS 17 // D17 PA12_RXD1 + #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 + #define LCD_PINS_D4 69 // D69 PA0_CANTX0 + #define LCD_PINS_D5 54 // D54 PA16_SCK1 + #define LCD_PINS_D6 68 // D68 PA1_CANRX0 + #define LCD_PINS_D7 34 // D34 PC2_PWML0 + + #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 + + // Buttons on AUX-2 + #define BTN_EN1 60 // D60 PA3_TIOB1 + #define BTN_EN2 13 // D13 PB27_TIOB0 + #define BTN_ENC 16 // D16 PA13_TXD1 // the click + #endif // NEWPANEL +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_AZSMZ_MINI.h b/Marlin/src/pins/pins_AZSMZ_MINI.h new file mode 100644 index 0000000000..6d4971b954 --- /dev/null +++ b/Marlin/src/pins/pins_AZSMZ_MINI.h @@ -0,0 +1,142 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * AZSMZ MINI pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "AZSMZ MINI" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define Y_MIN_PIN P1_26 +#define Z_MIN_PIN P1_28 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (TH1) +#define TEMP_BED_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + +// +// Heaters / Fans +// +// EFB +#define HEATER_0_PIN P2_04 +#define HEATER_BED_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P2_07 +#endif +#define FAN1_PIN P0_26 + +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN P1_30 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P1_22 + #define BTN_EN1 P4_28 + #define BTN_EN2 P1_27 + #define BTN_ENC P3_26 + #define LCD_SDSS P0_16 + #define SD_DETECT_PIN P3_25 +#endif + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 DIO4 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 DIO26 E0_STEP_PIN + * PWM1.2 DIO11 SERVO0_PIN + * PWM1.2 DIO54 X_STEP_PIN + * PWM1.3 DIO6 SERVO1_PIN J5-1 + * PWM1.3 DIO60 Y_STEP_PIN + * PWM1.4 DIO53 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 DIO46 Z_STEP_PIN + * PWM1.5 DIO3 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 DIO9 RAMPS_D9_PIN + * PWM1.6 DIO14 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 DIO10 RAMPS_D10_PIN + */ + + /** + * Special pins + * D37 - not 5V tolerant + * D49 - not 5V tolerant + * D57 - open collector + * D58 - open collector + */ diff --git a/Marlin/pins_AZTEEG_X1.h b/Marlin/src/pins/pins_AZTEEG_X1.h similarity index 100% rename from Marlin/pins_AZTEEG_X1.h rename to Marlin/src/pins/pins_AZTEEG_X1.h diff --git a/Marlin/pins_AZTEEG_X3.h b/Marlin/src/pins/pins_AZTEEG_X3.h similarity index 100% rename from Marlin/pins_AZTEEG_X3.h rename to Marlin/src/pins/pins_AZTEEG_X3.h diff --git a/Marlin/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/pins_AZTEEG_X3_PRO.h similarity index 97% rename from Marlin/pins_AZTEEG_X3_PRO.h rename to Marlin/src/pins/pins_AZTEEG_X3_PRO.h index 1010320679..fa17120651 100644 --- a/Marlin/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/pins_AZTEEG_X3_PRO.h @@ -24,22 +24,29 @@ * AZTEEG_X3_PRO (Arduino Mega) pin assignments */ +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + #if HOTENDS > 5 || E_STEPPERS > 5 #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." #endif -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) - #define CASE_LIGHT_PIN 44 // Define before RAMPS pins include -#endif - #define BOARD_NAME "Azteeg X3 Pro" -#include "pins_RAMPS.h" - -#ifndef __AVR_ATmega2560__ - #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +// +// RAMPS pins overrides +// +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #define CASE_LIGHT_PIN 44 #endif +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif + +#include "pins_RAMPS.h" + // DIGIPOT slave addresses #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) @@ -116,9 +123,6 @@ #define HEATER_6_PIN 6 #define HEATER_7_PIN 11 -#undef FAN_PIN -#define FAN_PIN 6 // Part Cooling System - #ifndef CONTROLLER_FAN_PIN #define CONTROLLER_FAN_PIN 4 // Pin used for the fan to cool motherboard (-1 to disable) #endif diff --git a/Marlin/src/pins/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/pins_AZTEEG_X5_GT.h new file mode 100644 index 0000000000..a0e9cd5c7d --- /dev/null +++ b/Marlin/src/pins/pins_AZTEEG_X5_GT.h @@ -0,0 +1,116 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Azteeg X5 GT pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Azteeg X5 GT" + #define DEFAULT_WEBSITE_URL "https://www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm" +#endif + +// +// Limit Switches +// + +#define X_MIN_PIN P1_24 +#define X_MAX_PIN P1_27 +#define Y_MIN_PIN P1_25 +#define Y_MAX_PIN P1_28 +#define Z_MIN_PIN P1_26 +#define Z_MAX_PIN P1_29 + + +// +// Steppers +// +#define X_STEP_PIN P2_01 +#define X_DIR_PIN P0_11 +#define X_ENABLE_PIN P0_10 + +#define Y_STEP_PIN P2_02 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P0_19 + +#define Z_STEP_PIN P2_03 +#define Z_DIR_PIN P0_22 +#define Z_ENABLE_PIN P0_21 + +#define E0_STEP_PIN P2_00 +#define E0_DIR_PIN P0_05 +#define E0_ENABLE_PIN P0_04 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_07 +#define HEATER_0_PIN P2_04 +#define HEATER_1_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P0_26 +#endif +#define FAN1_PIN P1_22 + +// +// Display +// + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN P1_31 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P0_16 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P2_11 + + #define SD_DETECT_PIN P1_18 + #define SDSS P1_21 + + #define STAT_LED_RED_PIN P1_19 + #define STAT_LED_BLUE_PIN P1_20 +#endif + +// +// Servo +// +#define SERVO0_PIN P1_23 diff --git a/Marlin/pins_BAM_DICE_DUE.h b/Marlin/src/pins/pins_BAM_DICE_DUE.h similarity index 100% rename from Marlin/pins_BAM_DICE_DUE.h rename to Marlin/src/pins/pins_BAM_DICE_DUE.h diff --git a/Marlin/src/pins/pins_BEAST.h b/Marlin/src/pins/pins_BEAST.h new file mode 100644 index 0000000000..28fb8539a2 --- /dev/null +++ b/Marlin/src/pins/pins_BEAST.h @@ -0,0 +1,291 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Marlin for STM32" + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Steppers +// +#define X_STEP_PIN PE0 +#define X_DIR_PIN PE1 +#define X_ENABLE_PIN PC0 +#define X_MIN_PIN PD5 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PC1 +#define Y_MIN_PIN PD6 +#define Y_MAX_PIN + +#define Z_STEP_PIN PE4 +#define Z_DIR_PIN PE5 +#define Z_ENABLE_PIN PC2 +#define Z_MIN_PIN PD7 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PE6 +#define E0_DIR_PIN PE7 +#define E0_ENABLE_PIN PC3 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PE8 +#define E1_DIR_PIN PE9 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE10 +#define E2_DIR_PIN PE11 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDPOWER -1 +#define SDSS PA15 +#define LED_PIN PB2 + +#define PS_ON_PIN -1 +#define KILL_PIN -1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +#define HEATER_1_PIN PD13 +#define HEATER_2_PIN PD14 + +#define HEATER_BED_PIN PB9 // BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PB10 +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN PA2 // ANALOG NUMBERING +#define TEMP_2_PIN PA3 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD + +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 + diff --git a/Marlin/src/pins/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/pins_BIQU_BQ111_A4.h new file mode 100644 index 0000000000..23522b1354 --- /dev/null +++ b/Marlin/src/pins/pins_BIQU_BQ111_A4.h @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * BIQU BQ111-A4 + * + * Applies to the following boards: + * + * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) + * + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "BIQU BQ111-A4" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + + +// +// Steppers +// +#define X_STEP_PIN P2_0 +#define X_DIR_PIN P0_5 +#define X_ENABLE_PIN P0_4 + +#define Y_STEP_PIN P2_1 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_2 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_3 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (T0) +#define TEMP_BED_PIN 1 // A1 (T1) + + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_7 +#define HEATER_BED_PIN P2_5 +#ifndef FAN_PIN + #define FAN_PIN P2_4 +#endif + +// +// Unused +// +//#define PIN_P2_10 P2_10 // IBOOT-1 +//#define PIN_P0_27 P0_27 // Onboard SD Detect + +/** + * LCD / Controller + * + * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, + * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. + * + * A remote SD card is not supported as the pins routed to EXP2 are the same as used + * for the onboard SD card, and a chip select signal is not provided for the remote + * SD card. + */ +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P1_31 // EXP1-1 + + #define BTN_EN1 P3_26 // EXP2-3 + #define BTN_EN2 P3_25 // EXP2-5 + #define BTN_ENC P1_30 // EXP1-2 + + #define SD_DETECT_PIN P0_27 // EXP2-7 + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 + #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && !ENABLED(DOGLCD) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" + #endif + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used" + #endif + +#endif // ULTRA_LCD + + +/** + * SD Card Reader + * + * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. + * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. + */ +#if ENABLED(SDSUPPORT) + + #define SCK_PIN P0_15 // EXP1-5 + #define MISO_PIN P0_16 // EXP1-4 + #define MOSI_PIN P0_18 // EXP1-3 + #define SS_PIN P1_30 // EXP1-2 + #define SDSS SS_PIN + +#endif // SDSUPPORT + + +/** + * PWMS + * + * There are 6 PWMS. Each PWM can be assigned to one of two pins. + * + * PWM1.1 P0_18 LCD_PINS_ENABLE + * PWM1.1 P2_0 X_STEP_PIN + * PWM1.2 P1_20 + * PWM1.2 P2_1 Y_STEP_PIN + * PWM1.3 P1_21 + * PWM1.3 P2_2 Z_STEP_PIN + * PWM1.4 P1_23 + * PWM1.4 P2_3 E0_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN + * PWM1.5 P2_4 FAN_PIN + * PWM1.6 P1_26 Y_MIN_PIN + * PWM1.6 P2_5 HEATER_BED_PIN + */ diff --git a/Marlin/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/pins_BQ_ZUM_MEGA_3D.h similarity index 100% rename from Marlin/pins_BQ_ZUM_MEGA_3D.h rename to Marlin/src/pins/pins_BQ_ZUM_MEGA_3D.h diff --git a/Marlin/pins_BRAINWAVE.h b/Marlin/src/pins/pins_BRAINWAVE.h similarity index 98% rename from Marlin/pins_BRAINWAVE.h rename to Marlin/src/pins/pins_BRAINWAVE.h index 932619769b..a43c6be95c 100644 --- a/Marlin/pins_BRAINWAVE.h +++ b/Marlin/src/pins/pins_BRAINWAVE.h @@ -115,7 +115,9 @@ #define HEATER_0_PIN 32 // A4 Extruder #define HEATER_BED_PIN 18 // E6 Bed -#define FAN_PIN 31 // A3 Fan +#ifndef FAN_PIN + #define FAN_PIN 31 // A3 Fan +#endif // // Misc. Functions diff --git a/Marlin/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/pins_BRAINWAVE_PRO.h similarity index 98% rename from Marlin/pins_BRAINWAVE_PRO.h rename to Marlin/src/pins/pins_BRAINWAVE_PRO.h index 872d868e10..49c8ab6b59 100644 --- a/Marlin/pins_BRAINWAVE_PRO.h +++ b/Marlin/src/pins/pins_BRAINWAVE_PRO.h @@ -125,7 +125,9 @@ // #define HEATER_0_PIN 27 // B7 #define HEATER_BED_PIN 26 // B6 Bed -#define FAN_PIN 16 // C6 Fan, PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 Fan, PWM3A +#endif // // Misc. Functions diff --git a/Marlin/pins_CHEAPTRONIC.h b/Marlin/src/pins/pins_CHEAPTRONIC.h similarity index 95% rename from Marlin/pins_CHEAPTRONIC.h rename to Marlin/src/pins/pins_CHEAPTRONIC.h index 6d1e45d870..e8f2c5f67e 100644 --- a/Marlin/pins_CHEAPTRONIC.h +++ b/Marlin/src/pins/pins_CHEAPTRONIC.h @@ -69,8 +69,8 @@ // // Heaters / Fans // -#define HEATER_0_PIN 19 // EXTRUDER 1 -#define HEATER_1_PIN 23 // EXTRUDER 2 +#define HEATER_0_PIN 19 // EXTRUDER 1 +#define HEATER_1_PIN 23 // EXTRUDER 2 #define HEATER_BED_PIN 22 // diff --git a/Marlin/pins_CHEAPTRONICv2.h b/Marlin/src/pins/pins_CHEAPTRONICv2.h similarity index 95% rename from Marlin/pins_CHEAPTRONICv2.h rename to Marlin/src/pins/pins_CHEAPTRONICv2.h index e6840abeb2..eea57d23ec 100644 --- a/Marlin/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/pins_CHEAPTRONICv2.h @@ -31,6 +31,7 @@ #endif #define BOARD_NAME "Cheaptronic v2.0" + // // Limit Switches // @@ -80,10 +81,32 @@ // // Heaters / Fans // -#define HEATER_0_PIN 6 -#define HEATER_1_PIN 7 -#define HEATER_2_PIN 8 -#define HEATER_BED_PIN 9 +#define HEATER_0_PIN 6 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 8 +#define HEATER_BED_PIN 9 +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif +#define FAN2_PIN 58 // additional fan or light control output + +// +// Other board specific pins +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 37 // board input labeled as F-DET +#endif +#define Z_MIN_PROBE_PIN 36 // additional external board input labeled as E-SENS (should be used for Z-probe) +#define LED_PIN 13 +#define SPINDLE_ENABLE_PIN 4 // additional PWM pin 1 at JP1 connector - should be used for laser control too +#define EXT_2 5 // additional PWM pin 2 at JP1 connector +#define EXT_3 2 // additional PWM pin 3 at JP1 connector +#define PS_ON_PIN 45 +#define KILL_PIN 46 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 11 // shared with TEMP_3 analog input +#endif // // LCD @@ -105,23 +128,3 @@ #define BTN_EN1 11 #define BTN_EN2 12 #define BTN_ENC 43 - -// -// Other board specific pins -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 37 // board input labeled as F-DET -#endif -#define Z_MIN_PROBE_PIN 36 // additional external board input labeled as E-SENS (should be used for Z-probe) -#define LED_PIN 13 -#define SPINDLE_ENABLE_PIN 4 // additional PWM pin 1 at JP1 connector - should be used for laser control too -#define EXT_2 5 // additional PWM pin 2 at JP1 connector -#define EXT_3 2 // additional PWM pin 3 at JP1 connector -#define FAN_PIN 3 -#define FAN2_PIN 58 // additional fan or light control output -#define PS_ON_PIN 45 -#define KILL_PIN 46 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 11 // shared with TEMP_3 analog input -#endif diff --git a/Marlin/src/pins/pins_CHITU3D.h b/Marlin/src/pins/pins_CHITU3D.h new file mode 100644 index 0000000000..bfa92357ef --- /dev/null +++ b/Marlin/src/pins/pins_CHITU3D.h @@ -0,0 +1,289 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 2017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Chitu3d Marlin" + +// Enable I2C_EEPROM for testing +//#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Steppers +// +#define X_STEP_PIN PE5 +#define X_DIR_PIN PE6 +#define X_ENABLE_PIN PC13 +#define X_MIN_PIN PG10 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PE4 +#define Y_MIN_PIN PA12 +#define Y_MAX_PIN + +#define Z_STEP_PIN PB9 +#define Z_DIR_PIN PE0 +#define Z_ENABLE_PIN PE1 +#define Z_MIN_PIN PA14 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB5 +#define E0_ENABLE_PIN PB8 + + + +#define E1_STEP_PIN -1 +#define E1_DIR_PIN -1 +#define E1_ENABLE_PIN -1 + +#define E2_STEP_PIN -1 +#define E2_DIR_PIN -1 +#define E2_ENABLE_PIN -1 + +// +// Misc. Functions +// +#define SDPOWER -1 +#define SDSS -1 +#define LED_PIN -1 +#define CASE_LIGHT_PIN 8 + +#define PS_ON_PIN -1 +#define KILL_PIN PD6 // LED strip 24v + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // HOT-END +#define HEATER_1_PIN -1 +#define HEATER_2_PIN -1 + +#define HEATER_BED_PIN PG11 // HOT-BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PG14 // MAIN BOARD FAN +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN -1 // ANALOG NUMBERING +#define TEMP_2_PIN -1 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD + +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 + diff --git a/Marlin/pins_CNCONTROLS_11.h b/Marlin/src/pins/pins_CNCONTROLS_11.h similarity index 96% rename from Marlin/pins_CNCONTROLS_11.h rename to Marlin/src/pins/pins_CNCONTROLS_11.h index 8535288ece..0a32d04a18 100644 --- a/Marlin/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/pins_CNCONTROLS_11.h @@ -65,7 +65,9 @@ #define HEATER_3_PIN 46 #define HEATER_BED_PIN 2 -//#define FAN_PIN 7 // common PWM pin for all tools +#ifndef FAN_PIN + //#define FAN_PIN 7 // common PWM pin for all tools +#endif #define ORIG_E0_AUTO_FAN_PIN 7 #define ORIG_E1_AUTO_FAN_PIN 7 diff --git a/Marlin/pins_CNCONTROLS_12.h b/Marlin/src/pins/pins_CNCONTROLS_12.h similarity index 95% rename from Marlin/pins_CNCONTROLS_12.h rename to Marlin/src/pins/pins_CNCONTROLS_12.h index 9a849916f0..f073b19c96 100644 --- a/Marlin/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/pins_CNCONTROLS_12.h @@ -65,7 +65,9 @@ #define HEATER_3_PIN 3 #define HEATER_BED_PIN 24 -#define FAN_PIN 5 // 5 is PWMtool3 -> 7 is common PWM pin for all tools +#ifndef FAN_PIN + #define FAN_PIN 5 // 5 is PWMtool3 -> 7 is common PWM pin for all tools +#endif #define ORIG_E0_AUTO_FAN_PIN 7 #define ORIG_E1_AUTO_FAN_PIN 7 @@ -124,4 +126,4 @@ //#define UI2 37 #define STAT_LED_BLUE_PIN -1 -#define STAT_LED_RED_PIN 10 // TOOL_0_PWM_PIN +#define STAT_LED_RED_PIN 10 // TOOL_0_PWM_PIN diff --git a/Marlin/src/pins/pins_COHESION3D_MINI.h b/Marlin/src/pins/pins_COHESION3D_MINI.h new file mode 100644 index 0000000000..ea568b266f --- /dev/null +++ b/Marlin/src/pins/pins_COHESION3D_MINI.h @@ -0,0 +1,174 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Cohesion3D Mini pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Cohesion3D Mini" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // P0_23 +#define TEMP_BED_PIN 1 // P0_24 + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN P2_04 // FET 4 + +#define ORIG_E0_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E1_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E2_AUTO_FAN_PIN AUTO_FAN_PIN + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #undef HEATER_0_PIN + #define SPINDLE_LASER_ENABLE_PIN P2_07 // FET 1 + #undef HEATER_BED_PIN + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #undef FAN_PIN + #define SPINDLE_DIR_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support reading +// G-code files from the onboard SD card. +// +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P0_27 // EXP2-7 - open drain + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not currently supported by the Cohesion3D boards" + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/pins_COHESION3D_REMIX.h b/Marlin/src/pins/pins_COHESION3D_REMIX.h new file mode 100644 index 0000000000..77346914fb --- /dev/null +++ b/Marlin/src/pins/pins_COHESION3D_REMIX.h @@ -0,0 +1,196 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Cohesion3D ReMix pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Cohesion3D ReMix" +#endif + +// +// Servos +// +#define SERVO0_PIN P2_04 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 +#define E1_CS_PIN P1_01 // Ethernet Expansion - Pin 14 + +#define E2_STEP_PIN P1_20 +#define E2_DIR_PIN P1_19 +#define E2_ENABLE_PIN P1_21 +#define E2_CS_PIN P1_18 // FET 6 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // P0_23 +#define TEMP_BED_PIN 1 // P0_24 +#define TEMP_1_PIN 2 // P0_25 +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILWIDTH_PIN 3 // P0_26 +#else + #define TEMP_2_PIN 3 // P0_26 +#endif + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#define HEATER_1_PIN P1_23 // FET 2 +#define HEATER_2_PIN P1_22 // FET 3 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// Auto fans +// +#if HOTENDS == 3 + #define AUTO_FAN_PIN P1_18 // FET 6 +#else + #define AUTO_FAN_PIN P1_22 // FET 3 +#endif +#define ORIG_E0_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E1_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E2_AUTO_FAN_PIN AUTO_FAN_PIN + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #undef HEATER_0_PIN + #define SPINDLE_LASER_ENABLE_PIN P2_07 // FET 1 + #undef HEATER_BED_PIN + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #undef FAN_PIN + #define SPINDLE_DIR_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support reading +// G-code files from the onboard SD card. +// +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P1_31 // EXP1-1 + #define SD_DETECT_PIN P0_27 // EXP2-7 + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not currently supported by the Cohesion3D boards" + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/pins_DUE3DOM.h b/Marlin/src/pins/pins_DUE3DOM.h new file mode 100644 index 0000000000..76cc39c9ca --- /dev/null +++ b/Marlin/src/pins/pins_DUE3DOM.h @@ -0,0 +1,170 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * DUE3DOM pin assignments + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "DUE3DOM" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 13 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN 36 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN 32 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 3 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 61 // Z1 STP +#define Z_DIR_PIN 60 // Z1 DIR +#define Z_ENABLE_PIN 15 // Z1 ENA + +#define E0_STEP_PIN 64 // Z2 STP +#define E0_DIR_PIN 63 // Z2 DIR +#define E0_ENABLE_PIN 62 // Z2 ENA + +#define E1_STEP_PIN 51 // E1 STP +#define E1_DIR_PIN 53 // E1 DIR +#define E1_ENABLE_PIN 65 // E1 ENA + +#define E2_STEP_PIN 24 // E2 STP +#define E2_DIR_PIN 23 // E2 DIR +#define E2_ENABLE_PIN 49 // E2 ENA + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (HOTEND1 thermistor) +#define TEMP_2_PIN 5 // Analog Input (unused) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS -1 +#else + #define MAX6675_SS -1 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 7 // HOTEND0 MOSFET +#define HEATER_1_PIN 8 // HOTEND1 MOSFET +#define HEATER_BED_PIN 39 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 9 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 12 // FAN3 header on board - EXTRUDER0 FAN + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + #endif // SPARK_FULL_GRAPHICS +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_DUE3DOM_MINI.h b/Marlin/src/pins/pins_DUE3DOM_MINI.h new file mode 100644 index 0000000000..bf525d3059 --- /dev/null +++ b/Marlin/src/pins/pins_DUE3DOM_MINI.h @@ -0,0 +1,173 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * DUE3DOM MINI pin assignments + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "DUE3DOM MINI" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 8 // 4-pin header FAN0 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN -1 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 64 +#define Z_DIR_PIN 63 +#define Z_ENABLE_PIN 15 + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (unused) +#define TEMP_2_PIN 5 // Analog Input (OnBoard thermistor beta 3950) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 53 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // HOTEND0 MOSFET +#define HEATER_BED_PIN 7 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 12 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 9 // FAN3 header on board - EXTRUDER0 FAN +//#define FAN3_PIN 8 // FAN0 4-pin header on board + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + + #elif ENABLED(MINIPANEL) + #define BTN_EN1 52 + #define BTN_EN2 50 + #define BTN_ENC 48 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + #define BEEPER_PIN 41 + #define DOGLCD_A0 46 + #define DOGLCD_CS 45 + + #endif // SPARK_FULL_GRAPHICS +#endif // ULTRA_LCD diff --git a/Marlin/pins_EINSY_RAMBO.h b/Marlin/src/pins/pins_EINSY_RAMBO.h similarity index 98% rename from Marlin/pins_EINSY_RAMBO.h rename to Marlin/src/pins/pins_EINSY_RAMBO.h index b86e1530ac..b3c1d1caa0 100644 --- a/Marlin/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/pins_EINSY_RAMBO.h @@ -117,7 +117,9 @@ #define HEATER_0_PIN 3 #define HEATER_BED_PIN 4 -#define FAN_PIN 8 +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif #define FAN1_PIN 6 // diff --git a/Marlin/pins_EINSY_RETRO.h b/Marlin/src/pins/pins_EINSY_RETRO.h similarity index 98% rename from Marlin/pins_EINSY_RETRO.h rename to Marlin/src/pins/pins_EINSY_RETRO.h index 4b46427f30..df4f1c20be 100644 --- a/Marlin/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/pins_EINSY_RETRO.h @@ -134,7 +134,9 @@ #define HEATER_0_PIN 3 #define HEATER_BED_PIN 4 -#define FAN_PIN 8 +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif #define FAN1_PIN 6 // diff --git a/Marlin/pins_ELEFU_3.h b/Marlin/src/pins/pins_ELEFU_3.h similarity index 98% rename from Marlin/pins_ELEFU_3.h rename to Marlin/src/pins/pins_ELEFU_3.h index 12631a901f..79a4bce712 100644 --- a/Marlin/pins_ELEFU_3.h +++ b/Marlin/src/pins/pins_ELEFU_3.h @@ -90,7 +90,9 @@ #define HEATER_2_PIN 17 // 12V PWM3 #define HEATER_BED_PIN 44 // DOUBLE 12V PWM -#define FAN_PIN 16 // 5V PWM +#ifndef FAN_PIN + #define FAN_PIN 16 // 5V PWM +#endif // // Misc. Functions diff --git a/Marlin/pins_FELIX2.h b/Marlin/src/pins/pins_FELIX2.h similarity index 100% rename from Marlin/pins_FELIX2.h rename to Marlin/src/pins/pins_FELIX2.h diff --git a/Marlin/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/pins_GEN3_MONOLITHIC.h similarity index 92% rename from Marlin/pins_GEN3_MONOLITHIC.h rename to Marlin/src/pins/pins_GEN3_MONOLITHIC.h index dae4046fd2..5d64e94290 100644 --- a/Marlin/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/pins_GEN3_MONOLITHIC.h @@ -68,11 +68,11 @@ // #define X_STEP_PIN 15 #define X_DIR_PIN 18 -#define X_ENABLE_PIN 24 // actually uses Y_enable_pin +#define X_ENABLE_PIN 24 // actually uses Y_enable_pin #define Y_STEP_PIN 23 #define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 // shared with X_enable_pin +#define Y_ENABLE_PIN 24 // shared with X_enable_pin #define Z_STEP_PIN 27 #define Z_DIR_PIN 28 @@ -95,7 +95,6 @@ // // Misc. Functions // -#define PS_ON_PIN 14 // Alex, does this work on the card? +#define PS_ON_PIN 14 // Alex, does this work on the card? // Alex extras from Gen3+ - diff --git a/Marlin/pins_GEN3_PLUS.h b/Marlin/src/pins/pins_GEN3_PLUS.h similarity index 100% rename from Marlin/pins_GEN3_PLUS.h rename to Marlin/src/pins/pins_GEN3_PLUS.h diff --git a/Marlin/pins_GEN6.h b/Marlin/src/pins/pins_GEN6.h similarity index 100% rename from Marlin/pins_GEN6.h rename to Marlin/src/pins/pins_GEN6.h diff --git a/Marlin/pins_GEN6_DELUXE.h b/Marlin/src/pins/pins_GEN6_DELUXE.h similarity index 100% rename from Marlin/pins_GEN6_DELUXE.h rename to Marlin/src/pins/pins_GEN6_DELUXE.h diff --git a/Marlin/pins_GEN7_12.h b/Marlin/src/pins/pins_GEN7_12.h similarity index 97% rename from Marlin/pins_GEN7_12.h rename to Marlin/src/pins/pins_GEN7_12.h index 3bc38d7ee7..1afaae9abc 100644 --- a/Marlin/pins_GEN7_12.h +++ b/Marlin/src/pins/pins_GEN7_12.h @@ -112,8 +112,8 @@ #define HEATER_0_PIN 4 #define HEATER_BED_PIN 3 -#if GEN7_VERSION < 13 // Gen7 v1.3 removed the fan pin - #define FAN_PIN 31 +#if !defined(FAN_PIN) && GEN7_VERSION < 13 // Gen7 v1.3 removed the fan pin + #define FAN_PIN 31 #endif // diff --git a/Marlin/pins_GEN7_13.h b/Marlin/src/pins/pins_GEN7_13.h similarity index 100% rename from Marlin/pins_GEN7_13.h rename to Marlin/src/pins/pins_GEN7_13.h diff --git a/Marlin/pins_GEN7_14.h b/Marlin/src/pins/pins_GEN7_14.h similarity index 100% rename from Marlin/pins_GEN7_14.h rename to Marlin/src/pins/pins_GEN7_14.h diff --git a/Marlin/pins_GEN7_CUSTOM.h b/Marlin/src/pins/pins_GEN7_CUSTOM.h similarity index 100% rename from Marlin/pins_GEN7_CUSTOM.h rename to Marlin/src/pins/pins_GEN7_CUSTOM.h diff --git a/Marlin/pins_GT2560_REV_A.h b/Marlin/src/pins/pins_GT2560_REV_A.h similarity index 98% rename from Marlin/pins_GT2560_REV_A.h rename to Marlin/src/pins/pins_GT2560_REV_A.h index 73b32bb40c..63f166ab32 100644 --- a/Marlin/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/pins_GT2560_REV_A.h @@ -81,7 +81,9 @@ #define HEATER_0_PIN 2 #define HEATER_1_PIN 3 #define HEATER_BED_PIN 4 -#define FAN_PIN 7 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif // // Misc. Functions diff --git a/Marlin/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/pins_GT2560_REV_A_PLUS.h similarity index 100% rename from Marlin/pins_GT2560_REV_A_PLUS.h rename to Marlin/src/pins/pins_GT2560_REV_A_PLUS.h diff --git a/Marlin/src/pins/pins_GTM32_PRO_VB.h b/Marlin/src/pins/pins_GTM32_PRO_VB.h new file mode 100644 index 0000000000..41f45f54b3 --- /dev/null +++ b/Marlin/src/pins/pins_GTM32_PRO_VB.h @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __STM32F1__ + #error "Oops! Make sure you have an STM32F1 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 24.05.2018 Axel "chepo" Sepúlveda Marlin for (stm32f103vet6) sch of board https://github.com/chepo92/Smartto/blob/master/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#define DEFAULT_MACHINE_NAME "STM32F103VET6" +#define BOARD_NAME "GTM32 Pro VB" + +// Ignore temp readings during development. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define X_MIN_PIN PE5 +#define X_MAX_PIN PE4 +#define Y_MIN_PIN PE3 +#define Y_MAX_PIN PE2 +#define Z_MIN_PIN PE1 +#define Z_MAX_PIN PE0 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 // core conflict? + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 // core conflict? + +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC0 +#define TEMP_0_PIN PC1 +#define TEMP_1_PIN PC2 +#define TEMP_2_PIN PC3 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB4 // EXTRUDER 1 +#define HEATER_1_PIN PB5 // EXTRUDER 2 +#define HEATER_2_PIN PB0 // EXTRUDER 3 +#define HEATER_BED_PIN PB1 // BED + +#ifndef FAN_PIN + #define FAN_PIN PB7 // (Sprinter config) +#endif +#define FAN1_PIN PB8 +#define FAN2_PIN PB9 + +// +// Misc. Functions +// +#define LED_PIN PD12 diff --git a/Marlin/pins_K8200.h b/Marlin/src/pins/pins_K8200.h similarity index 100% rename from Marlin/pins_K8200.h rename to Marlin/src/pins/pins_K8200.h diff --git a/Marlin/pins_K8400.h b/Marlin/src/pins/pins_K8400.h similarity index 100% rename from Marlin/pins_K8400.h rename to Marlin/src/pins/pins_K8400.h diff --git a/Marlin/pins_LEAPFROG.h b/Marlin/src/pins/pins_LEAPFROG.h similarity index 79% rename from Marlin/pins_LEAPFROG.h rename to Marlin/src/pins/pins_LEAPFROG.h index a7fffa5325..9a31520e8a 100644 --- a/Marlin/pins_LEAPFROG.h +++ b/Marlin/src/pins/pins_LEAPFROG.h @@ -47,21 +47,21 @@ #define X_DIR_PIN 63 #define X_ENABLE_PIN 29 -#define Y_STEP_PIN 14 // A6 -#define Y_DIR_PIN 15 // A0 +#define Y_STEP_PIN 14 // A6 +#define Y_DIR_PIN 15 // A0 #define Y_ENABLE_PIN 39 -#define Z_STEP_PIN 31 // A2 -#define Z_DIR_PIN 32 // A6 -#define Z_ENABLE_PIN 30 // A1 +#define Z_STEP_PIN 31 // A2 +#define Z_DIR_PIN 32 // A6 +#define Z_ENABLE_PIN 30 // A1 -#define E0_STEP_PIN 34 // 34 -#define E0_DIR_PIN 35 // 35 -#define E0_ENABLE_PIN 33 // 33 +#define E0_STEP_PIN 34 // 34 +#define E0_DIR_PIN 35 // 35 +#define E0_ENABLE_PIN 33 // 33 -#define E1_STEP_PIN 37 // 37 -#define E1_DIR_PIN 40 // 40 -#define E1_ENABLE_PIN 36 // 36 +#define E1_STEP_PIN 37 // 37 +#define E1_DIR_PIN 40 // 40 +#define E1_ENABLE_PIN 36 // 36 // // Temperature Sensors @@ -74,9 +74,9 @@ // Heaters / Fans // #define HEATER_0_PIN 9 -#define HEATER_1_PIN 8 // 12 -#define HEATER_2_PIN 11 // 13 -#define HEATER_BED_PIN 10 // 14/15 +#define HEATER_1_PIN 8 // 12 +#define HEATER_2_PIN 11 // 13 +#define HEATER_BED_PIN 10 // 14/15 #define FAN_PIN 7 diff --git a/Marlin/pins_MAKEBOARD_MINI.h b/Marlin/src/pins/pins_MAKEBOARD_MINI.h similarity index 100% rename from Marlin/pins_MAKEBOARD_MINI.h rename to Marlin/src/pins/pins_MAKEBOARD_MINI.h diff --git a/Marlin/src/pins/pins_MALYAN_M200.h b/Marlin/src/pins/pins_MALYAN_M200.h new file mode 100644 index 0000000000..c9887fa71f --- /dev/null +++ b/Marlin/src/pins/pins_MALYAN_M200.h @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MALYAN M200 pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! You must be compiling for STM32." +#endif + +#define BOARD_NAME "MALYANM200" + +// Enable EEPROM Emulation for this board +// This setting should probably be in configuration.h +// but it is literally the only board which uses it. +#define FLASH_EEPROM_EMULATION + +#define SDSS SS_PIN + +// +// Limit Switches +// +#define X_MIN_PIN PB4 +#define Y_MIN_PIN PA15 +#define Z_MIN_PIN PB5 + +// +// Steppers +// +// X & Y enable are the same +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB15 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PB12 +#define Y_DIR_PIN PB13 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB2 +#define Z_ENABLE_PIN PB11 + +#define E0_STEP_PIN PB0 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PB1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) +#define TEMP_BED_PIN PA1 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB6 // HOTEND0 MOSFET +#define HEATER_BED_PIN PB7 // BED MOSFET + +// FAN_PIN is commented out here because the M200 example +// Configuration_adv.h does NOT override E0_AUTO_FAN_PIN. +#ifndef FAN_PIN + //#define FAN_PIN PB8 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN PB3 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN -1 // FAN3 header on board - EXTRUDER0 FAN + +// This board has only the controller fan and the extruder fan +// If someone hacks to put a direct power fan on the controller, PB3 could +// be used as a separate print cooling fan. +#define ORIG_E0_AUTO_FAN_PIN PB8 + diff --git a/Marlin/pins_MEGACONTROLLER.h b/Marlin/src/pins/pins_MEGACONTROLLER.h similarity index 89% rename from Marlin/pins_MEGACONTROLLER.h rename to Marlin/src/pins/pins_MEGACONTROLLER.h index b2631901be..709dc413be 100644 --- a/Marlin/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/pins_MEGACONTROLLER.h @@ -62,17 +62,17 @@ // // Steppers // -#define X_STEP_PIN 62 // A8 -#define X_DIR_PIN 63 // A9 -#define X_ENABLE_PIN 61 // A7 +#define X_STEP_PIN 62 // A8 +#define X_DIR_PIN 63 // A9 +#define X_ENABLE_PIN 61 // A7 -#define Y_STEP_PIN 65 // A11 -#define Y_DIR_PIN 66 // A12 -#define Y_ENABLE_PIN 64 // A10 +#define Y_STEP_PIN 65 // A11 +#define Y_DIR_PIN 66 // A12 +#define Y_ENABLE_PIN 64 // A10 -#define Z_STEP_PIN 68 // A14 -#define Z_DIR_PIN 69 // A15 -#define Z_ENABLE_PIN 67 // A13 +#define Z_STEP_PIN 68 // A14 +#define Z_DIR_PIN 69 // A15 +#define Z_ENABLE_PIN 67 // A13 #define E0_STEP_PIN 23 #define E0_DIR_PIN 24 @@ -112,7 +112,9 @@ #define HEATER_1_PIN 34 #define HEATER_BED_PIN 28 -#define FAN_PIN 39 +#ifndef FAN_PIN + #define FAN_PIN 39 +#endif #define FAN1_PIN 35 #define FAN2_PIN 36 diff --git a/Marlin/pins_MEGATRONICS.h b/Marlin/src/pins/pins_MEGATRONICS.h similarity index 91% rename from Marlin/pins_MEGATRONICS.h rename to Marlin/src/pins/pins_MEGATRONICS.h index acf1da0160..8b608eff88 100644 --- a/Marlin/pins_MEGATRONICS.h +++ b/Marlin/src/pins/pins_MEGATRONICS.h @@ -53,13 +53,13 @@ #define X_DIR_PIN 28 #define X_ENABLE_PIN 24 -#define Y_STEP_PIN 60 // A6 -#define Y_DIR_PIN 61 // A7 +#define Y_STEP_PIN 60 // A6 +#define Y_DIR_PIN 61 // A7 #define Y_ENABLE_PIN 22 -#define Z_STEP_PIN 54 // A0 -#define Z_DIR_PIN 55 // A1 -#define Z_ENABLE_PIN 56 // A2 +#define Z_STEP_PIN 54 // A0 +#define Z_DIR_PIN 55 // A1 +#define Z_ENABLE_PIN 56 // A2 #define E0_STEP_PIN 31 #define E0_DIR_PIN 32 @@ -87,7 +87,9 @@ #define HEATER_1_PIN 8 #define HEATER_BED_PIN 10 -#define FAN_PIN 7 // IO pin. Buffer needed +#ifndef FAN_PIN + #define FAN_PIN 7 // IO pin. Buffer needed +#endif // // Misc. Functions diff --git a/Marlin/pins_MEGATRONICS_2.h b/Marlin/src/pins/pins_MEGATRONICS_2.h similarity index 98% rename from Marlin/pins_MEGATRONICS_2.h rename to Marlin/src/pins/pins_MEGATRONICS_2.h index 2ae436674b..9bd8b4506d 100644 --- a/Marlin/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/pins_MEGATRONICS_2.h @@ -101,7 +101,9 @@ #define HEATER_1_PIN 8 #define HEATER_BED_PIN 10 -#define FAN_PIN 7 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif #define FAN1_PIN 6 // diff --git a/Marlin/pins_MEGATRONICS_3.h b/Marlin/src/pins/pins_MEGATRONICS_3.h similarity index 98% rename from Marlin/pins_MEGATRONICS_3.h rename to Marlin/src/pins/pins_MEGATRONICS_3.h index c638b27865..119c63a585 100644 --- a/Marlin/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/pins_MEGATRONICS_3.h @@ -118,7 +118,9 @@ #define HEATER_2_PIN 8 #define HEATER_BED_PIN 10 -#define FAN_PIN 6 +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif #define FAN1_PIN 7 // diff --git a/Marlin/pins_MELZI.h b/Marlin/src/pins/pins_MELZI.h similarity index 100% rename from Marlin/pins_MELZI.h rename to Marlin/src/pins/pins_MELZI.h diff --git a/Marlin/pins_MELZI_CREALITY.h b/Marlin/src/pins/pins_MELZI_CREALITY.h similarity index 97% rename from Marlin/pins_MELZI_CREALITY.h rename to Marlin/src/pins/pins_MELZI_CREALITY.h index b42075b76d..8bfd3b860a 100644 --- a/Marlin/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/pins_MELZI_CREALITY.h @@ -55,13 +55,13 @@ // Alter timing for graphical display #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_2_NOP + #define ST7920_DELAY_1 DELAY_NS(125) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_2_NOP + #define ST7920_DELAY_2 DELAY_NS(125) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_2_NOP + #define ST7920_DELAY_3 DELAY_NS(125) #endif #if ENABLED(MINIPANEL) diff --git a/Marlin/pins_MELZI_MAKR3D.h b/Marlin/src/pins/pins_MELZI_MAKR3D.h similarity index 100% rename from Marlin/pins_MELZI_MAKR3D.h rename to Marlin/src/pins/pins_MELZI_MAKR3D.h diff --git a/Marlin/pins_MELZI_MALYAN.h b/Marlin/src/pins/pins_MELZI_MALYAN.h similarity index 92% rename from Marlin/pins_MELZI_MALYAN.h rename to Marlin/src/pins/pins_MELZI_MALYAN.h index 3888b537d1..a81526f065 100644 --- a/Marlin/pins_MELZI_MALYAN.h +++ b/Marlin/src/pins/pins_MELZI_MALYAN.h @@ -44,11 +44,11 @@ // Alter timing for graphical display #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_2_NOP + #define ST7920_DELAY_1 DELAY_NS(125) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_2_NOP + #define ST7920_DELAY_2 DELAY_NS(125) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_2_NOP + #define ST7920_DELAY_3 DELAY_NS(125) #endif diff --git a/Marlin/pins_MELZI_TRONXY.h b/Marlin/src/pins/pins_MELZI_TRONXY.h similarity index 93% rename from Marlin/pins_MELZI_TRONXY.h rename to Marlin/src/pins/pins_MELZI_TRONXY.h index 7c66c50c60..0da7934302 100644 --- a/Marlin/pins_MELZI_TRONXY.h +++ b/Marlin/src/pins/pins_MELZI_TRONXY.h @@ -51,11 +51,11 @@ #define BTN_ENC 26 #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_0_NOP + #define ST7920_DELAY_1 DELAY_NS(0) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_2_NOP + #define ST7920_DELAY_2 DELAY_NS(125) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_0_NOP + #define ST7920_DELAY_3 DELAY_NS(0) #endif diff --git a/Marlin/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/pins_MIGHTYBOARD_REVE.h similarity index 77% rename from Marlin/pins_MIGHTYBOARD_REVE.h rename to Marlin/src/pins/pins_MIGHTYBOARD_REVE.h index 9a2fb539b2..989533d53e 100644 --- a/Marlin/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/pins_MIGHTYBOARD_REVE.h @@ -134,14 +134,14 @@ // 2 E4 CS2 // 78 E2 SCK // -#define THERMO_SCK_PIN 78 // E2 -#define THERMO_DO_PIN 3 // E5 -#define THERMO_CS1 5 // E3 -#define THERMO_CS2 2 // E4 +#define THERMO_SCK_PIN 78 // E2 +#define THERMO_DO_PIN 3 // E5 +#define THERMO_CS1 5 // E3 +#define THERMO_CS2 2 // E4 -#define MAX6675_SS THERMO_CS1 -#define MAX6675_SCK_PIN THERMO_SCK_PIN -#define MAX6675_DO_PIN THERMO_DO_PIN +#define MAX6675_SS THERMO_CS1 +#define MAX6675_SCK_PIN THERMO_SCK_PIN +#define MAX6675_DO_PIN THERMO_DO_PIN // // Augmentation for auto-assigning plugs // @@ -149,10 +149,10 @@ // 2 extruders or 1 extruder and a heated bed. // With no heated bed, an additional 24V fan is possible. // -#define MOSFET_A_PIN 6 // H3 -#define MOSFET_B_PIN 11 // B5 - Rev A of this file had this pin assigned to 9 -#define MOSFET_C_PIN 45 // L4 -#define MOSFET_D_PIN 44 // L5 +#define MOSFET_A_PIN 6 // H3 +#define MOSFET_B_PIN 11 // B5 - Rev A of this file had this pin assigned to 9 +#define MOSFET_C_PIN 45 // L4 +#define MOSFET_D_PIN 44 // L5 #if HOTENDS > 1 #if TEMP_SENSOR_BED @@ -172,23 +172,24 @@ #define HEATER_0_PIN MOSFET_A_PIN #if ENABLED(IS_EFB) // Hotend, Fan, Bed - #define FAN_PIN MOSFET_B_PIN - #define HEATER_BED_PIN MOSFET_C_PIN + #define HEATER_BED_PIN MOSFET_C_PIN #elif ENABLED(IS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN MOSFET_B_PIN - #define FAN_PIN MOSFET_C_PIN + #define HEATER_1_PIN MOSFET_B_PIN #elif ENABLED(IS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN MOSFET_B_PIN - #define HEATER_BED_PIN MOSFET_C_PIN + #define HEATER_1_PIN MOSFET_B_PIN + #define HEATER_BED_PIN MOSFET_C_PIN #elif ENABLED(IS_EFF) // Hotend, Fan, Fan - #define FAN_PIN MOSFET_B_PIN - #define FAN1_PIN MOSFET_C_PIN -#elif ENABLED(IS_SF) // Spindle, Fan - #define FAN_PIN MOSFET_C_PIN + #define FAN1_PIN MOSFET_C_PIN #endif #ifndef FAN_PIN - #define FAN_PIN MOSFET_D_PIN + #if ENABLED(IS_EFB) || ENABLED(IS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN MOSFET_B_PIN + #elif ENABLED(IS_EEF) || ENABLED(IS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN MOSFET_C_PIN + #else + #define FAN_PIN MOSFET_D_PIN + #endif #endif // @@ -200,37 +201,37 @@ // // Misc. Functions // -#define LED_PIN 13 // B7 -#define CUTOFF_RESET_PIN 16 // H1 -#define CUTOFF_TEST_PIN 17 // H0 -#define CASE_LIGHT_PIN 44 // L5 MUST BE HARDWARE PWM +#define LED_PIN 13 // B7 +#define CUTOFF_RESET_PIN 16 // H1 +#define CUTOFF_TEST_PIN 17 // H0 +#define CASE_LIGHT_PIN 44 // L5 MUST BE HARDWARE PWM // // LCD / Controller // #ifdef REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - #define LCD_PINS_RS 33 // C4: LCD-STROBE - #define LCD_PINS_ENABLE 72 // J2: LEFT - #define LCD_PINS_D4 35 // C2: LCD-CLK - #define LCD_PINS_D5 32 // C5: RLED - #define LCD_PINS_D6 34 // C3: LCD-DATA - #define LCD_PINS_D7 31 // C6: GLED + #define LCD_PINS_RS 33 // C4: LCD-STROBE + #define LCD_PINS_ENABLE 72 // J2: LEFT + #define LCD_PINS_D4 35 // C2: LCD-CLK + #define LCD_PINS_D5 32 // C5: RLED + #define LCD_PINS_D6 34 // C3: LCD-DATA + #define LCD_PINS_D7 31 // C6: GLED - #define BTN_EN2 75 // J4, UP - #define BTN_EN1 73 // J3, DOWN + #define BTN_EN2 75 // J4, UP + #define BTN_EN1 73 // J3, DOWN //STOP button connected as KILL_PIN - #define KILL_PIN 14 // J1, RIGHT + #define KILL_PIN 14 // J1, RIGHT //KILL - not connected - #define BEEPER_PIN 8 // H5, SD_WP + #define BEEPER_PIN 8 // H5, SD_WP - #define BTN_CENTER 15 // J0 - #define BTN_ENC BTN_CENTER + #define BTN_CENTER 15 // J0 + #define BTN_ENC BTN_CENTER //on board leds - #define STAT_LED_RED_LED SERVO0_PIN // C1 (1280-EX1, DEBUG2) - #define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3) + #define STAT_LED_RED_LED SERVO0_PIN // C1 (1280-EX1, DEBUG2) + #define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3) #else // Replicator uses a 3-wire SR controller with HD44780 @@ -238,18 +239,18 @@ // #define SAV_3DLCD - #define SR_DATA_PIN 34 // C3 - #define SR_CLK_PIN 35 // C2 - #define SR_STROBE_PIN 33 // C4 + #define SR_DATA_PIN 34 // C3 + #define SR_CLK_PIN 35 // C2 + #define SR_STROBE_PIN 33 // C4 - #define BTN_UP 75 // J4 - #define BTN_DOWN 73 // J3 - #define BTN_LEFT 72 // J2 - #define BTN_RIGHT 14 // J1 - #define BTN_CENTER 15 // J0 - #define BTN_ENC BTN_CENTER + #define BTN_UP 75 // J4 + #define BTN_DOWN 73 // J3 + #define BTN_LEFT 72 // J2 + #define BTN_RIGHT 14 // J1 + #define BTN_CENTER 15 // J0 + #define BTN_ENC BTN_CENTER - #define BEEPER_PIN 4 // G5 + #define BEEPER_PIN 4 // G5 #define STAT_LED_RED_PIN 32 // C5 #define STAT_LED_BLUE_PIN 31 // C6 (Actually green) @@ -259,8 +260,8 @@ // // SD Card // -#define SDSS 53 // B0 -#define SD_DETECT_PIN 9 // H6 +#define SDSS 53 // B0 +#define SD_DETECT_PIN 9 // H6 #define MAX_PIN THERMO_SCK_PIN @@ -272,8 +273,6 @@ #define SPINDLE_DIR_PIN 67 // K5 - - // Check if all pins are defined in mega/pins_arduino.h #include static_assert(NUM_DIGITAL_PINS > MAX_PIN, "add missing pins to [arduino dir]/hardware/arduino/avr/variants/mega/pins_arduino.h based on fastio.h" diff --git a/Marlin/pins_MINIRAMBO.h b/Marlin/src/pins/pins_MINIRAMBO.h similarity index 98% rename from Marlin/pins_MINIRAMBO.h rename to Marlin/src/pins/pins_MINIRAMBO.h index 609c0c867c..89335ea8d4 100644 --- a/Marlin/pins_MINIRAMBO.h +++ b/Marlin/src/pins/pins_MINIRAMBO.h @@ -106,7 +106,9 @@ #endif #define HEATER_BED_PIN 4 -#define FAN_PIN 8 +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif #define FAN1_PIN 6 // diff --git a/Marlin/pins_MINITRONICS.h b/Marlin/src/pins/pins_MINITRONICS.h similarity index 88% rename from Marlin/pins_MINITRONICS.h rename to Marlin/src/pins/pins_MINITRONICS.h index fe2c9e0b54..f5fdac21d2 100644 --- a/Marlin/pins_MINITRONICS.h +++ b/Marlin/src/pins/pins_MINITRONICS.h @@ -57,13 +57,13 @@ #define X_DIR_PIN 47 #define X_ENABLE_PIN 49 -#define Y_STEP_PIN 39 // A6 -#define Y_DIR_PIN 40 // A0 +#define Y_STEP_PIN 39 // A6 +#define Y_DIR_PIN 40 // A0 #define Y_ENABLE_PIN 38 -#define Z_STEP_PIN 42 // A2 -#define Z_DIR_PIN 43 // A6 -#define Z_ENABLE_PIN 41 // A1 +#define Z_STEP_PIN 42 // A2 +#define Z_DIR_PIN 43 // A6 +#define Z_ENABLE_PIN 41 // A1 #define E0_STEP_PIN 45 #define E0_DIR_PIN 44 @@ -83,11 +83,13 @@ // // Heaters / Fans // -#define HEATER_0_PIN 7 // EXTRUDER 1 -#define HEATER_1_PIN 8 // EXTRUDER 2 -#define HEATER_BED_PIN 3 // BED +#define HEATER_0_PIN 7 // EXTRUDER 1 +#define HEATER_1_PIN 8 // EXTRUDER 2 +#define HEATER_BED_PIN 3 // BED -#define FAN_PIN 9 +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif // // Misc. Functions @@ -122,7 +124,7 @@ #define BTN_EN2 -1 #define BTN_ENC -1 - #define SD_DETECT_PIN -1 // Minitronics doesn't use this + #define SD_DETECT_PIN -1 // Minitronics doesn't use this #endif // diff --git a/Marlin/pins_MKS_BASE.h b/Marlin/src/pins/pins_MKS_BASE.h similarity index 100% rename from Marlin/pins_MKS_BASE.h rename to Marlin/src/pins/pins_MKS_BASE.h diff --git a/Marlin/pins_MKS_BASE_15.h b/Marlin/src/pins/pins_MKS_BASE_15.h similarity index 100% rename from Marlin/pins_MKS_BASE_15.h rename to Marlin/src/pins/pins_MKS_BASE_15.h diff --git a/Marlin/pins_MKS_BASE_HEROIC.h b/Marlin/src/pins/pins_MKS_BASE_HEROIC.h similarity index 100% rename from Marlin/pins_MKS_BASE_HEROIC.h rename to Marlin/src/pins/pins_MKS_BASE_HEROIC.h diff --git a/Marlin/pins_MKS_GEN_13.h b/Marlin/src/pins/pins_MKS_GEN_13.h similarity index 99% rename from Marlin/pins_MKS_GEN_13.h rename to Marlin/src/pins/pins_MKS_GEN_13.h index 70228e2f1f..e0e916b878 100644 --- a/Marlin/pins_MKS_GEN_13.h +++ b/Marlin/src/pins/pins_MKS_GEN_13.h @@ -33,7 +33,7 @@ #error "MKS GEN 1.3/1.4 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_NAME "MKS GEN > v1.3" +#define BOARD_NAME "MKS GEN >= v1.3" // // Heaters / Fans diff --git a/Marlin/pins_MKS_GEN_L.h b/Marlin/src/pins/pins_MKS_GEN_L.h similarity index 100% rename from Marlin/pins_MKS_GEN_L.h rename to Marlin/src/pins/pins_MKS_GEN_L.h diff --git a/Marlin/src/pins/pins_MKS_SBASE.h b/Marlin/src/pins/pins_MKS_SBASE.h new file mode 100644 index 0000000000..bb6c1cea38 --- /dev/null +++ b/Marlin/src/pins/pins_MKS_SBASE.h @@ -0,0 +1,232 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * MKS SBASE pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "MKS SBASE" + #define DEFAULT_WEBSITE_URL "https://github.com/makerbase-mks/MKS-SBASE" +#endif + +// unused +/* +#define PIN_P0_27 P0_27 +#define PIN_P0_28 P0_28 +*/ + +// +// Servo pin +// +#define SERVO0_PIN P1_23 // J8-3 (low jitter) +#define SERVO1_PIN P2_12 // J8-4 +#define SERVO2_PIN P2_11 // J8-5 +#define SERVO3_PIN P4_28 // J8-6 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // The original Mks Sbase DIO19 has a 10k pullup to 3.3V or 5V, 1K series, so when using a Zprobe we must use DIO41 (J8 P1.22) +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) +#define TEMP_2_PIN 3 // A3 (TH4) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif + +// +// Connector J7 +// + +// 5V +// NC +// GND +#define PIN_P0_17 P0_17 +#define PIN_P0_16 P0_16 +#define PIN_P0_14 P0_14 + + +// +// Connector J8 +// + +// GND +#define PIN_P1_22 P1_22 +#define PIN_P1_23 P1_23 +#define PIN_P2_12 P2_12 +#define PIN_P2_11 P2_11 +#define PIN_P4_28 P4_28 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// +#if ENABLED(MK2_MULTIPLEXER) + #define E_MUX0_PIN P1_23 // J8-3 + #define E_MUX1_PIN P2_12 // J8-4 + #define E_MUX2_PIN P2_11 // J8-5 +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN P0_25 +#define LPC_SOFTWARE_SPI // MKS_SBASE needs a software SPI because the + // selected pins are not on a hardware SPI controller + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if ENABLED(ULTRA_LCD) + #define BEEPER_PIN P1_31 // EXP1.1 + #define BTN_ENC P1_30 // EXP1.2 + #define BTN_EN1 P3_26 // EXP2.5 + #define BTN_EN2 P3_25 // EXP2.3 + #define LCD_PINS_RS P0_16 // EXP1.4 + #define LCD_SDSS P0_28 // EXP2.4 + #define LCD_PINS_ENABLE P0_18 // EXP1.3 + #define LCD_PINS_D4 P0_15 // EXP1.5 +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#ifndef ULTIPANEL + #define ENET_MDIO P1_17 // J12-4 + #define ENET_RX_ER P1_14 // J12-6 + #define ENET_RXD1 P1_10 // J12-8 +#endif +#define ENET_MOC P1_16 // J12-3 +#define REF_CLK P1_15 // J12-5 +#define ENET_RXD0 P1_09 // J12-7 +#define ENET_CRS P1_08 // J12-9 +#define ENET_TX_EN P1_04 // J12-10 +#define ENET_TXD0 P1_00 // J12-11 +#define ENET_TXD1 P1_01 // J12-12 + +// A custom cable is needed. See the README file in the +// Marlin\src\config\examples\Mks\Sbase directory + +#define SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) +#define MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) +#define MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.5) +#define SS_PIN P0_28 +#define SDSS P0_06 + +/** + * P0.27 is on EXP2 and the on-board SD card's socket. That means it can't be + * used as the SD_DETECT for the LCD's SD card. + * + * The best solution is to use the custom cable to connect the LCD's SD_DETECT + * to a pin NOT on EXP2. + * + * If you can't find a pin to use for the LCD's SD_DETECT then comment out + * SD_DETECT_PIN entirely and remove that wire from the the custom cable. + */ +#define SD_DETECT_PIN P2_11 // J8-5 (moved from EXP2 P0.27) + + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 P1_18 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 P2_00 E0_STEP_PIN + * PWM1.2 P1_20 SERVO0_PIN + * PWM1.2 P2_01 X_STEP_PIN + * PWM1.3 P1_21 SERVO1_PIN J5-1 + * PWM1.3 P2_02 Y_STEP_PIN + * PWM1.4 P1_23 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 P2_03 Z_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 P2_04 RAMPS_D9_PIN + * PWM1.6 P1_26 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 P2_05 RAMPS_D10_PIN + */ + + /** + * Special pins + * P1_30 - not 5V tolerant + * P1_31 - not 5V tolerant + * P0_27 - open collector + * P0_28 - open collector + * + */ diff --git a/Marlin/pins_OMCA.h b/Marlin/src/pins/pins_OMCA.h similarity index 90% rename from Marlin/pins_OMCA.h rename to Marlin/src/pins/pins_OMCA.h index 8715efcd44..6ee6fabe6b 100644 --- a/Marlin/pins_OMCA.h +++ b/Marlin/src/pins/pins_OMCA.h @@ -108,13 +108,13 @@ #define E0_DIR_PIN 21 #define E0_ENABLE_PIN 10 -#define E1_STEP_PIN -1 // 21 -#define E1_DIR_PIN -1 // 20 -#define E1_ENABLE_PIN -1 // 19 +#define E1_STEP_PIN -1 // 21 +#define E1_DIR_PIN -1 // 20 +#define E1_ENABLE_PIN -1 // 19 -#define E2_STEP_PIN -1 // 21 -#define E2_DIR_PIN -1 // 20 -#define E2_ENABLE_PIN -1 // 18 +#define E2_STEP_PIN -1 // 21 +#define E2_DIR_PIN -1 // 20 +#define E2_ENABLE_PIN -1 // 18 // // Temperature Sensors @@ -126,10 +126,12 @@ // // Heaters / Fans // -#define HEATER_0_PIN 3 // DONE PWM on RIGHT connector +#define HEATER_0_PIN 3 // DONE PWM on RIGHT connector #define HEATER_BED_PIN 4 -#define FAN_PIN 14 // PWM on MIDDLE connector +#ifndef FAN_PIN + #define FAN_PIN 14 // PWM on MIDDLE connector +#endif // // Misc. Functions @@ -145,4 +147,4 @@ #define __GS 18 #define __GD 13 -#define UNUSED_PWM 14 // PWM on LEFT connector +#define UNUSED_PWM 14 // PWM on LEFT connector diff --git a/Marlin/pins_OMCA_A.h b/Marlin/src/pins/pins_OMCA_A.h similarity index 94% rename from Marlin/pins_OMCA_A.h rename to Marlin/src/pins/pins_OMCA_A.h index 3686973c95..777c80b22f 100644 --- a/Marlin/pins_OMCA_A.h +++ b/Marlin/src/pins/pins_OMCA_A.h @@ -107,12 +107,12 @@ #define E0_DIR_PIN 27 #define E0_ENABLE_PIN 24 -#define E1_STEP_PIN -1 // 19 -#define E1_DIR_PIN -1 // 18 +#define E1_STEP_PIN -1 // 19 +#define E1_DIR_PIN -1 // 18 #define E1_ENABLE_PIN 24 -#define E2_STEP_PIN -1 // 17 -#define E2_DIR_PIN -1 // 16 +#define E2_STEP_PIN -1 // 17 +#define E2_DIR_PIN -1 // 16 #define E2_ENABLE_PIN 24 // @@ -125,7 +125,9 @@ // #define HEATER_0_PIN 4 -#define FAN_PIN 3 +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif // // Misc. Functions diff --git a/Marlin/pins_PRINTRBOARD.h b/Marlin/src/pins/pins_PRINTRBOARD.h similarity index 93% rename from Marlin/pins_PRINTRBOARD.h rename to Marlin/src/pins/pins_PRINTRBOARD.h index a8197af9a4..42632d174a 100644 --- a/Marlin/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/pins_PRINTRBOARD.h @@ -74,11 +74,7 @@ // Limit Switches // #define X_STOP_PIN 47 // E3 -#if ENABLED(SDSUPPORT) - #define Y_STOP_PIN 37 // E5 - Move Ystop to Estop socket -#else - #define Y_STOP_PIN 20 // B0 SS - Ystop in Ystop socket -#endif +#define Y_STOP_PIN 20 // B0 SS #define Z_STOP_PIN 36 // E4 // @@ -114,13 +110,14 @@ #define HEATER_2_PIN 45 // F7 #define HEATER_BED_PIN 14 // C4 PWM3C - -#define FAN_PIN 16 // C6 PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif // // Misc. Functions // -#define SDSS 20 // B0 SS +#define SDSS 26 // B6 SDCS #define FILWIDTH_PIN 2 // Analog Input // @@ -146,16 +143,18 @@ #define BTN_EN2 3 // D3 RX1 JP2-7 #define BTN_ENC 45 // F7 TDI JP2-12 + #undef SDSS #define SDSS 43 // F5 TMS JP2-8 - #define STAT_LED_RED_PIN 12 // C2 JP11-14 - #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 + #define STAT_LED_RED_PIN 12 // C2 JP11-14 + #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 #elif ENABLED(LCD_I2C_PANELOLU2) #define BTN_EN1 3 // D3 RX1 JP2-7 #define BTN_EN2 2 // D2 TX1 JP2-5 #define BTN_ENC 41 // F3 JP2-4 + #undef SDSS #define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2 #else diff --git a/Marlin/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/pins_PRINTRBOARD_REVF.h similarity index 98% rename from Marlin/pins_PRINTRBOARD_REVF.h rename to Marlin/src/pins/pins_PRINTRBOARD_REVF.h index bf3a023c4d..8239a91586 100644 --- a/Marlin/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/pins_PRINTRBOARD_REVF.h @@ -190,7 +190,9 @@ #endif #endif -#define FAN_PIN 16 // C6 PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif // // LCD / Controller @@ -244,13 +246,13 @@ // increase delays #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_5_NOP + #define ST7920_DELAY_1 DELAY_NS(313) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_5_NOP + #define ST7920_DELAY_2 DELAY_NS(313) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_5_NOP + #define ST7920_DELAY_3 DELAY_NS(313) #endif #else diff --git a/Marlin/src/pins/pins_RADDS.h b/Marlin/src/pins/pins_RADDS.h new file mode 100644 index 0000000000..68132604c7 --- /dev/null +++ b/Marlin/src/pins/pins_RADDS.h @@ -0,0 +1,230 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * RADDS + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "RADDS" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 39 +#define SERVO3_PIN 40 + +// +// Limit Switches +// +#define X_MIN_PIN 28 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 30 +#define Y_MAX_PIN 36 +#define Z_MIN_PIN 32 +#define Z_MAX_PIN 38 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 38 +#endif + +// +// Steppers +// +#define X_STEP_PIN 24 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 26 +#ifndef X_CS_PIN + #define X_CS_PIN 25 +#endif + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 22 +#ifndef Y_CS_PIN + #define Y_CS_PIN 27 +#endif + +#define Z_STEP_PIN 2 +#define Z_DIR_PIN 3 +#define Z_ENABLE_PIN 15 +#ifndef Z_CS_PIN + #define Z_CS_PIN 29 +#endif + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 +#ifndef E0_CS_PIN + #define E0_CS_PIN 31 +#endif + +#define E1_STEP_PIN 64 +#define E1_DIR_PIN 63 +#define E1_ENABLE_PIN 65 +#ifndef E1_CS_PIN + #define E1_CS_PIN 33 +#endif + +#define E2_STEP_PIN 51 +#define E2_DIR_PIN 53 +#define E2_ENABLE_PIN 49 +#ifndef E2_CS_PIN + #define E2_CS_PIN 35 +#endif + +// For Extension Board V2 +// http://doku.radds.org/dokumentation/extension-board +//#define E3_STEP_PIN 35 +//#define E3_DIR_PIN 33 +//#define E3_ENABLE_PIN 37 +//#ifndef E3_CS_PIN +// #define E3_CS_PIN 6 +//#endif + +//#define Z2_STEP_PIN 29 +//#define Z2_DIR_PIN 27 +//#define Z2_ENABLE_PIN 31 +//#ifndef Z2_CS_PIN +// #define Z2_CS_PIN 39 +//#endif + +// Microstepping pins - Mapping not from fastio.h (?) +//#define E3_MS1_PIN 67 +//#define E3_MS2_PIN 68 +//#define E3_MS3_PIN 69 +//#define Z2_MS1_PIN 67 // shared with E3_MS1_PIN +//#define Z2_MS2_PIN 68 // shared with E3_MS2_PIN +//#define Z2_MS3_PIN 69 // shared with E3_MS3_PIN + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_2_PIN 2 // Analog Input +#define TEMP_3_PIN 3 // Analog Input +#define TEMP_4_PIN 5 // dummy so will compile when PINS_DEBUGGING is enabled +#define TEMP_BED_PIN 4 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 // SERVO3_PIN + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 39 // SERVO2_PIN +#endif + +// I2C EEPROM with 8K of space +#define I2C_EEPROM +#define E2END 0x1FFF + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(RADDS_DISPLAY) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 46 + #define LCD_PINS_ENABLE 47 + #define LCD_PINS_D4 44 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #endif // SPARK_FULL_GRAPHICS + +#endif // ULTRA_LCD diff --git a/Marlin/pins_RAMBO.h b/Marlin/src/pins/pins_RAMBO.h similarity index 99% rename from Marlin/pins_RAMBO.h rename to Marlin/src/pins/pins_RAMBO.h index bcc1b4f62d..f2ea3d33bd 100644 --- a/Marlin/pins_RAMBO.h +++ b/Marlin/src/pins/pins_RAMBO.h @@ -127,7 +127,9 @@ #define HEATER_2_PIN 6 #define HEATER_BED_PIN 3 -#define FAN_PIN 8 +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif #define FAN1_PIN 6 #define FAN2_PIN 2 diff --git a/Marlin/pins_RAMPS.h b/Marlin/src/pins/pins_RAMPS.h similarity index 89% rename from Marlin/pins_RAMPS.h rename to Marlin/src/pins/pins_RAMPS.h index e886a616f6..a85f3b6049 100644 --- a/Marlin/pins_RAMPS.h +++ b/Marlin/src/pins/pins_RAMPS.h @@ -44,8 +44,16 @@ * 7 | 11 */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) - #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#if ENABLED(TARGET_LPC1768) + #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." +#elif defined(__STM32F1__) + #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." +#endif + +#if DISABLED(IS_RAMPS_SMART) && DISABLED(IS_RAMPS_DUO) && DISABLED(IS_RAMPS4DUE) && DISABLED(TARGET_LPC1768) + #if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." + #endif #endif #ifndef BOARD_NAME @@ -223,46 +231,48 @@ // Heaters / Fans // #ifndef MOSFET_D_PIN - #define MOSFET_D_PIN -1 + #define MOSFET_D_PIN -1 #endif #ifndef RAMPS_D8_PIN - #define RAMPS_D8_PIN 8 + #define RAMPS_D8_PIN 8 #endif #ifndef RAMPS_D9_PIN - #define RAMPS_D9_PIN 9 + #define RAMPS_D9_PIN 9 #endif #ifndef RAMPS_D10_PIN - #define RAMPS_D10_PIN 10 + #define RAMPS_D10_PIN 10 #endif -#define HEATER_0_PIN RAMPS_D10_PIN +#define HEATER_0_PIN RAMPS_D10_PIN #if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed - #define FAN_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN #elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN RAMPS_D9_PIN - #define FAN_PIN RAMPS_D8_PIN + #define HEATER_1_PIN RAMPS_D9_PIN #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN #elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan - #define FAN_PIN RAMPS_D9_PIN - #define FAN1_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_SF) // Spindle, Fan - #define FAN_PIN RAMPS_D8_PIN -#else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") - #define FAN_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN #if HOTENDS == 1 - #define FAN1_PIN MOSFET_D_PIN + #define FAN1_PIN MOSFET_D_PIN #else - #define HEATER_1_PIN MOSFET_D_PIN + #define HEATER_1_PIN MOSFET_D_PIN #endif #endif #ifndef FAN_PIN - #define FAN_PIN 4 // IO pin. Buffer needed + #if ENABLED(IS_RAMPS_EFB) || ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif ENABLED(IS_RAMPS_EEF) || ENABLED(IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN 4 // IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif #endif // @@ -536,6 +546,10 @@ #define ADC_KEYPAD_PIN 12 + #elif ENABLED(AZSMZ_12864) + + // Pins only defined for RAMPS_SMART currently + #else // Beeper on AUX-4 diff --git a/Marlin/src/pins/pins_RAMPS4DUE.h b/Marlin/src/pins/pins_RAMPS4DUE.h new file mode 100644 index 0000000000..5f4cbc4810 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS4DUE.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Arduino Mega or Due with RAMPS4DUE pin assignments + * + * Applies to the following boards: + * + * RAMPS4DUE_EFB (Hotend, Fan, Bed) + * RAMPS4DUE_EEB (Hotend0, Hotend1, Bed) + * RAMPS4DUE_EFF (Hotend, Fan0, Fan1) + * RAMPS4DUE_EEF (Hotend0, Hotend1, Fan) + * RAMPS4DUE_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS4DUE + * A13 | A9/D63 (shares the same pin with AUX2_4PIN) + * A14 | A10/D64 (shares the same pin with AUX2_5PIN) + * A15 | NC + */ + +#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Due' or 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS4DUE" +#endif + +#define IS_RAMPS4DUE +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN -1 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 10 // Analog Input diff --git a/Marlin/pins_RAMPS_13.h b/Marlin/src/pins/pins_RAMPS_13.h similarity index 100% rename from Marlin/pins_RAMPS_13.h rename to Marlin/src/pins/pins_RAMPS_13.h diff --git a/Marlin/src/pins/pins_RAMPS_DUO.h b/Marlin/src/pins/pins_RAMPS_DUO.h new file mode 100644 index 0000000000..f0c0e74da2 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_DUO.h @@ -0,0 +1,132 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Arduino Mega or Due with RAMPS Duo pin assignments + * + * Applies to the following boards: + * + * RAMPS_DUO_EFB (Hotend, Fan, Bed) + * RAMPS_DUO_EEB (Hotend0, Hotend1, Bed) + * RAMPS_DUO_EFF (Hotend, Fan0, Fan1) + * RAMPS_DUO_EEF (Hotend0, Hotend1, Fan) + * RAMPS_DUO_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS_DUO + * A9/D63 | A12/D66 + * A10/D64 | A13/D67 + * A11/D65 | A14/D68 + * A12/D66 | A15/D69 + * A13 | A9 + * A14 | A10 + * A15 | A11 + */ + +#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Due' or 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS Duo" +#endif + +#define IS_RAMPS_DUO +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 11 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 10 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 69 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 69 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #undef LCD_PINS_D4 + #define LCD_PINS_D4 68 + + #undef LCD_PINS_D5 + #define LCD_PINS_D5 69 + + #undef LCD_PINS_D7 + #define LCD_PINS_D7 67 + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #undef BTN_EN1 + #define BTN_EN1 67 + + #undef BTN_ENC + #define BTN_ENC 66 + + #elif ENABLED(MINIPANEL) + + #undef DOGLCD_CS + #define DOGLCD_CS 69 + + #undef LCD_BACKLIGHT_PIN + #define LCD_BACKLIGHT_PIN 68 // backlight LED on A14/D68 + + #undef KILL_PIN + #define KILL_PIN 67 + + #undef BTN_EN2 + #define BTN_EN2 66 + + #else + + #if ENABLED(REPRAPWORLD_KEYPAD) + #undef BTN_EN1 + #define BTN_EN1 67 // encoder + + #undef BTN_ENC + #define BTN_ENC 66 // enter button + #elif ENABLED(PANEL_ONE) + #undef BTN_EN2 + #define BTN_EN2 66 // AUX2 PIN 4 + #endif + #endif + + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/pins_RAMPS_ENDER_4.h old mode 100755 new mode 100644 similarity index 100% rename from Marlin/pins_RAMPS_ENDER_4.h rename to Marlin/src/pins/pins_RAMPS_ENDER_4.h diff --git a/Marlin/src/pins/pins_RAMPS_FD_V1.h b/Marlin/src/pins/pins_RAMPS_FD_V1.h new file mode 100644 index 0000000000..d8cdeb54f9 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_FD_V1.h @@ -0,0 +1,210 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * RAMPS-FD + * + * No EEPROM + * Use 4k7 thermistor tables + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS-FD" +#endif + +#define INVERTED_HEATER_PINS +#define INVERTED_BED_PINS +#define INVERTED_FAN_PINS + +// +// Servos +// +#define SERVO0_PIN 7 +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 24 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 26 +#define Z_MAX_PIN 34 + +// +// Steppers +// +#define X_STEP_PIN 63 +#define X_DIR_PIN 62 +#define X_ENABLE_PIN 48 +#ifndef X_CS_PIN + #define X_CS_PIN 68 +#endif + +#define Y_STEP_PIN 65 +#define Y_DIR_PIN 64 +#define Y_ENABLE_PIN 46 +#ifndef Y_CS_PIN + #define Y_CS_PIN 60 +#endif + +#define Z_STEP_PIN 67 +#define Z_DIR_PIN 66 +#define Z_ENABLE_PIN 44 +#ifndef Z_CS_PIN + #define Z_CS_PIN 58 +#endif + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 42 +#ifndef E0_CS_PIN + #define E0_CS_PIN 67 +#endif + +#define E1_STEP_PIN 43 +#define E1_DIR_PIN 41 +#define E1_ENABLE_PIN 39 +#ifndef E1_CS_PIN + #define E1_CS_PIN 61 +#endif + +#define E2_STEP_PIN 32 +#define E2_DIR_PIN 47 +#define E2_ENABLE_PIN 45 +#ifndef E2_CS_PIN + #define E2_CS_PIN 59 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_3_PIN -1 // fewer compiler warnings +#define TEMP_4_PIN -1 // fewer compiler warnings +#define TEMP_BED_PIN 0 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 10 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 8 + +#ifndef FAN_PIN + #define FAN_PIN 12 +#endif +#define CONTROLLER_FAN_PIN -1 + +// +// Misc. Functions +// +#define SDSS 4 +#define LED_PIN 13 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + // ramps-fd lcd adaptor + + #define BEEPER_PIN 37 + #define BTN_EN1 33 + #define BTN_EN2 31 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + + #if ENABLED(NEWPANEL) + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #endif + + #if ENABLED(MINIPANEL) + #define DOGLCD_CS 25 + #define DOGLCD_A0 27 + #endif + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define DOGLCD_A0 16 + #define KILL_PIN 51 + #define STAT_LED_BLUE_PIN 29 + #define STAT_LED_RED_PIN 23 + #define DOGLCD_CS 17 + #define DOGLCD_SCK 76 //SCK_PIN - required so that the DUE hardware SPI will be used + #define DOGLCD_MOSI 75 //MOSI_PIN - required so that the DUE hardware SPI will be used + #define DOGLCD_MISO 74 //MISO_PIN + #endif + + +#endif // ULTRA_LCD + +#if ENABLED(HAVE_TMC2208) + /** + * TMC2208 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if HOTENDS < 3 + #define SPINDLE_LASER_ENABLE_PIN 45 // Use E2 ENA + #define SPINDLE_LASER_PWM_PIN 12 // MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN 47 // Use E2 DIR + #endif +#endif diff --git a/Marlin/language_pl.h b/Marlin/src/pins/pins_RAMPS_FD_V2.h similarity index 69% rename from Marlin/language_pl.h rename to Marlin/src/pins/pins_RAMPS_FD_V2.h index 3bc792714b..f33546e637 100644 --- a/Marlin/language_pl.h +++ b/Marlin/src/pins/pins_RAMPS_FD_V2.h @@ -21,25 +21,26 @@ */ /** - * Polish - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html + * RAMPS-FD v2 * + * EEPROM supported + * Use 1k thermistor tables */ -#ifndef LANGUAGE_PL_H -#define LANGUAGE_PL_H -#define MAPPER_C3C4C5_PL -#define DISPLAY_CHARSET_ISO10646_PL +#define BOARD_NAME "RAMPS-FD v2" -/** - * One version with accented characters and one without - */ -#if ENABLED(DOGLCD) - #include "language_pl-DOGM.h" -#else - #include "language_pl-HD44780.h" +#include "pins_RAMPS_FD_V1.h" + +#undef INVERTED_HEATER_PINS +#undef INVERTED_BED_PINS +#undef INVERTED_FAN_PINS + +#define I2C_EEPROM + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 #endif -#endif // LANGUAGE_PL_H +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif diff --git a/Marlin/pins_RAMPS_OLD.h b/Marlin/src/pins/pins_RAMPS_OLD.h similarity index 96% rename from Marlin/pins_RAMPS_OLD.h rename to Marlin/src/pins/pins_RAMPS_OLD.h index 951e3b000b..da047e2b0a 100644 --- a/Marlin/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/pins_RAMPS_OLD.h @@ -88,11 +88,15 @@ #if ENABLED(RAMPS_V_1_0) #define HEATER_0_PIN 12 #define HEATER_BED_PIN -1 - #define FAN_PIN 11 + #ifndef FAN_PIN + #define FAN_PIN 11 + #endif #else // RAMPS_V_1_1 or RAMPS_V_1_2 #define HEATER_0_PIN 10 #define HEATER_BED_PIN 8 - #define FAN_PIN 9 + #ifndef FAN_PIN + #define FAN_PIN 9 + #endif #endif // diff --git a/Marlin/pins_RAMPS_PLUS.h b/Marlin/src/pins/pins_RAMPS_PLUS.h similarity index 100% rename from Marlin/pins_RAMPS_PLUS.h rename to Marlin/src/pins/pins_RAMPS_PLUS.h diff --git a/Marlin/src/pins/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/pins_RAMPS_RE_ARM.h new file mode 100644 index 0000000000..6f41d4c96c --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_RE_ARM.h @@ -0,0 +1,412 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Re-ARM with RAMPS v1.4 pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + */ + +// numbers in parenthesis () are the mega2560 equivalent pin numbers + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Re-ARM RAMPS 1.4" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_20 // (11) +#define SERVO1_PIN P1_21 // ( 6) also on J5-1 +#define SERVO2_PIN P1_19 // ( 5) +#define SERVO3_PIN P1_18 // ( 4) 5V output + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // ( 3) 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // ( 2) 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // (14) 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // (15) 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_29 // (18) 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_28 // (19) 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_01 // (54) +#define X_DIR_PIN P0_11 // (55) +#define X_ENABLE_PIN P0_10 // (38) +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 // ETH +#endif + +#define Y_STEP_PIN P2_02 // (60) +#define Y_DIR_PIN P0_20 // (61) +#define Y_ENABLE_PIN P0_19 // (56) +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_04 // ETH +#endif + +#define Z_STEP_PIN P2_03 // (46) +#define Z_DIR_PIN P0_22 // (48) +#define Z_ENABLE_PIN P0_21 // (62) +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_10 // ETH +#endif + +#define E0_STEP_PIN P2_00 // (26) +#define E0_DIR_PIN P0_05 // (28) +#define E0_ENABLE_PIN P0_04 // (24) +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_14 // ETH +#endif + +#define E1_STEP_PIN P2_08 // (36) +#define E1_DIR_PIN P2_13 // (34) +#define E1_ENABLE_PIN P4_29 // (30) +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +//#define E2_STEP_PIN P2_08 // (36) +//#define E2_DIR_PIN P2_13 // (34) +//#define E2_ENABLE_PIN P4_29 // (30) +//#ifndef E2_CS_PIN +// #define E2_CS_PIN -1 +//#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #define TMC_SW_MOSI P1_00 // ETH + #define TMC_SW_MISO P1_08 // ETH + #define TMC_SW_SCK P1_09 // ETH +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (T0) - (67) - TEMP_0_PIN +#define TEMP_BED_PIN 1 // A1 (T1) - (68) - TEMP_BED_PIN +#define TEMP_1_PIN 2 // A2 (T2) - (69) - TEMP_1_PIN +#define TEMP_2_PIN 3 // A3 - (63) - J5-3 & AUX-2 +#define TEMP_3_PIN 4 // A4 - (37) - BUZZER_PIN +//#define TEMP_4_PIN 5 // A5 - (49) - SD_DETECT_PIN +//#define ?? 6 // A6 - ( 0) - RXD0 - J4-4 & AUX-1 +#define FILWIDTH_PIN 7 // A7 - ( 1) - TXD0 - J4-5 & AUX-1 + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN P2_07 // (8) +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN P2_04 // (9) +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN P2_05 // (10) +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #if ENABLED(IS_RAMPS_EFB) || ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif ENABLED(IS_RAMPS_EEF) || ENABLED(IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN P1_18 // (4) IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif +#endif + +// +// Misc. Functions +// +#define LED_PIN P4_28 // (13) +#define SDSS P1_23 // (53) + +// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P1_18 // (4) +#endif + +#define PS_ON_PIN P2_12 // (12) + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN) + #if !defined(NUM_SERVOS) || NUM_SERVOS < 4 // try to use servo connector + #define CASE_LIGHT_PIN P1_18 // (4) MUST BE HARDWARE PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if !defined(NUM_SERVOS) || NUM_SERVOS == 1 // must use servo connector + #undef SERVO1 + #undef SERVO2 + #undef SERVO3 + #define SPINDLE_LASER_ENABLE_PIN P1_21 // (6) Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN P1_18 // (4) MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN P1_19 // (5) + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define E_MUX0_PIN P0_03 // ( 0) Z_CS_PIN + #define E_MUX1_PIN P0_02 // ( 1) E0_CS_PIN +#endif +#define E_MUX2_PIN P0_26 // (63) E1_CS_PIN + +/** + * LCD / Controller + * + * All controllers can use J3 and J5 on the Re-ARM board. Custom cabling will be required. + */ + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P1_30 // (37) not 5V tolerant + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + #define LCD_BACKLIGHT_PIN P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers + #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 + + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 + + #ifdef ULTIPANEL + #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO + #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER + #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + #endif + + #if ENABLED(NEWPANEL) + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #endif + #else + //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + #endif + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + // #define LCD_SCREEN_ROT_180 + + #undef BEEPER_PIN + #define BEEPER_PIN P1_30 // (37) may change if cable changes + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + + #undef DOGLCD_CS + #define DOGLCD_CS P0_16 // (16) + #undef LCD_BACKLIGHT_PIN //P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers + #undef LCD_PINS_ENABLE //P0_18 // (51) (MOSI) J3-10 & AUX-3 + #undef LCD_PINS_D4 //P0_15 // (52) (SCK) J3-9 & AUX-3 + + #undef LCD_PINS_D5 //P2_06 // (59) J3-8 & AUX-2 + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #undef LCD_PINS_D6 //P0_26 // (63) J5-3 & AUX-2 + #undef LCD_PINS_D7 //P1_21 // ( 6) (SERVO1) J5-1 & SERVO connector + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes + #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + #endif + + //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 - sometimes called SDSS + + #if ENABLED(MINIPANEL) + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#ifndef ULTIPANEL + #define ENET_MDIO P1_17 // (71) J12-4 + #define ENET_RX_ER P1_14 // (73) J12-6 + #define ENET_RXD1 P1_10 // (75) J12-8 +#endif +#define ENET_MOC P1_16 // (70) J12-3 +#define REF_CLK P1_15 // (72) J12-5 +#define ENET_RXD0 P1_09 // (74) J12-7 +#define ENET_CRS P1_08 // (76) J12-9 +#define ENET_TX_EN P1_04 // (77) J12-10 +#define ENET_TXD0 P1_00 // (78) J12-11 +#define ENET_TXD1 P1_01 // (79) J12-12 + +/** + * Fast PWMS + * + * The LPC1768's hardware PWM controller has 6 channels. Each channel + * can be setup to either control a dedicated pin directly or to generate + * an interrupt. The direct method's duty cycle is accurate to within a + * a microsecond. The interrupt method's average duty cycle has the + * the same accuracy but the individual cycles can vary because of higher + * priority interrupts. + * + * All Fast PWMs have a 50Hz rate. + * + * The following pins/signals use the direct method. All other pins use the + * the interrupt method. Note that SERVO2_PIN and RAMPS_D8_PIN use the + * interrupt method. + * P1_20 (11) SERVO0_PIN + * P1_21 ( 6) SERVO1_PIN J5-1 + * P0_18 ( 4) SERVO3_PIN 5V output + * *P2_04 ( 9) RAMPS_D9_PIN + * *P2_05 (10) RAMPS_D10_PIN + * + * * - If used as a heater driver then a Fast PWM is NOT assigned. If used as + * a fan driver then enabling FAST_PWM_FAN assigns a Fast PWM to it. + */ + + /** + * special pins + * P1_30 (37) - not 5V tolerant + * P1_31 (49) - not 5V tolerant + * P0_27 (57) - open collector + * P0_28 (58) - open collector + * + */ + +/** + * The following mega2560 pins are NOT available in a Re-ARM system + * 7 + * 17 + * 22 + * 23 + * 25 + * 27 + * 29 + * 32 + * 39 + * 40 + * 42 + * 43 + * 44 + * 45 + * 47 + * 64 + * 65 + * 66 + */ diff --git a/Marlin/src/pins/pins_RAMPS_SMART.h b/Marlin/src/pins/pins_RAMPS_SMART.h new file mode 100644 index 0000000000..6de539cd3f --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_SMART.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Arduino Due with RAMPS-SMART pin assignments + * + * Applies to the following boards: + * + * RAMPS_SMART_EFB (Hotend, Fan, Bed) + * RAMPS_SMART_EEB (Hotend0, Hotend1, Bed) + * RAMPS_SMART_EFF (Hotend, Fan0, Fan1) + * RAMPS_SMART_EEF (Hotend0, Hotend1, Fan) + * RAMPS_SMART_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS-SMART + * NONE | D16 (Additional AUX-3 pin(AUX3_2PIN), shares the same pin with AUX4_18PIN) + * NONE | D17 (Additional AUX-3 pin(AUX3_1PIN), shares the same pin with AUX4_17PIN) + * D0 | NONE + * D1 | NONE + * A3/D57 | NONE + * A4/D58 | NONE + * A5/D59 | A3/D57 + * A9/D63 | A4/D58 + * A10/D64 | A5/D59 + * A11/D65 | D66 + * A12/D66 | D67 + * A13 | A9 + * A14 | A10 + * A15 | A11 + * + * + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER works fine connected to AUX-4 with + * Smart Adapter, but requires removing the AUX3 pin header on the adapter to fit. + * To use the SD card reader, wire its pins to AUX-3 (and use Software SPI). + * + * To use Hardware SPI for SD, the SDSS pin must be set to 52 instead of 53. + * Hardware SPI also requires additional wiring because the board doesn't pass + * the 6-pin SPI header from the DUE board. + * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS-SMART" +#endif + +#define IS_RAMPS_SMART +#include "pins_RAMPS.h" + +// I2C EEPROM with 4K of space +#define I2C_EEPROM +#define E2END 0xFFF + +#define RESET_PIN 42 // Resets the board if the jumper is attached + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 10 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 11 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #undef MAX6675_SS + #define MAX6675_SS 67 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #undef MAX6675_SS + #define MAX6675_SS 67 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// LCD / Controller +// +// Support for AZSMZ 12864 LCD with SD Card 3D printer smart controller control panel +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN 66 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 65 + #define DOGLCD_A0 59 + #define DOGLCD_CS 44 + #define BTN_EN1 58 + #define BTN_EN2 40 + #define BTN_ENC 67 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 66 + #define SD_DETECT_PIN 49 // Pin 49 for display sd interface, 72 for easy adapter board + #define KILL_PIN 42 +#endif diff --git a/Marlin/pins_RIGIDBOARD.h b/Marlin/src/pins/pins_RIGIDBOARD.h similarity index 85% rename from Marlin/pins_RIGIDBOARD.h rename to Marlin/src/pins/pins_RIGIDBOARD.h index 5bd06e40eb..e985963505 100644 --- a/Marlin/pins_RIGIDBOARD.h +++ b/Marlin/src/pins/pins_RIGIDBOARD.h @@ -36,8 +36,8 @@ // // MOSFET changes // -#define RAMPS_D10_PIN 9 // EXTRUDER 1 -#define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN +#define RAMPS_D10_PIN 9 // EXTRUDER 1 +#define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN #include "pins_RAMPS.h" @@ -74,9 +74,9 @@ // SPI for Max6675 or Max31855 Thermocouple #undef MAX6675_SS #if DISABLED(SDSUPPORT) - #define MAX6675_SS 53 // Don't use pin 53 if there is even the remote possibility of using Display/SD card + #define MAX6675_SS 53 // Don't use pin 53 if there is even the remote possibility of using Display/SD card #else - #define MAX6675_SS 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present + #define MAX6675_SS 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present #endif // @@ -85,8 +85,9 @@ #undef HEATER_BED_PIN #define HEATER_BED_PIN 10 -#undef FAN_PIN -#define FAN_PIN 8 // Same as RAMPS_13_EEF +#ifndef FAN_PIN + #define FAN_PIN 8 // Same as RAMPS_13_EEF +#endif // // Misc. Functions diff --git a/Marlin/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/pins_RIGIDBOARD_V2.h similarity index 78% rename from Marlin/pins_RIGIDBOARD_V2.h rename to Marlin/src/pins/pins_RIGIDBOARD_V2.h index dfac7051d5..2075892ab8 100644 --- a/Marlin/pins_RIGIDBOARD_V2.h +++ b/Marlin/src/pins/pins_RIGIDBOARD_V2.h @@ -39,12 +39,12 @@ // Channels available for DAC, For Rigidboard there are 4 #define DAC_STEPPER_ORDER { 0, 1, 2, 3 } -#define DAC_STEPPER_SENSE 0.05 // sense resistors on rigidboard stepper chips are .05 value +#define DAC_STEPPER_SENSE 0.05 // sense resistors on rigidboard stepper chips are .05 value #define DAC_STEPPER_ADDRESS 0 -#define DAC_STEPPER_MAX 4096 // was 5000 but max allowable value is actually 4096 -#define DAC_STEPPER_VREF 1 // internal Vref, gain 2x = 4.096V -#define DAC_STEPPER_GAIN 1 // value of 1 here sets gain of 2 -#define DAC_DISABLE_PIN 42 // set low to enable DAC +#define DAC_STEPPER_MAX 4096 // was 5000 but max allowable value is actually 4096 +#define DAC_STEPPER_VREF 1 // internal Vref, gain 2x = 4.096V +#define DAC_STEPPER_GAIN 1 // value of 1 here sets gain of 2 +#define DAC_DISABLE_PIN 42 // set low to enable DAC #define DAC_OR_ADDRESS 0x01 #ifndef DAC_MOTOR_CURRENT_DEFAULT diff --git a/Marlin/src/pins/pins_RUMBA.h b/Marlin/src/pins/pins_RUMBA.h new file mode 100644 index 0000000000..ddd802bef6 --- /dev/null +++ b/Marlin/src/pins/pins_RUMBA.h @@ -0,0 +1,327 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * RUMBA pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if E_STEPPERS > 3 || HOTENDS > 3 + #error "RUMBA supports up to 3 hotends / E-steppers. Comment this line to keep going." +#endif + +#define DEFAULT_MACHINE_NAME "Rumba" +#define BOARD_NAME "Rumba" +//#endif + +#define LARGE_FLASH true + +// +// Servos +// +#ifdef IS_RAMPS_13 + #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI +#else + #define SERVO0_PIN 11 +#endif +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +#define SLED_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#define X_CS_PIN 53 + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#define Y_CS_PIN 49 + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#define Z_CS_PIN 40 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#define E0_CS_PIN 42 + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#define E1_CS_PIN 44 + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 3 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +//#define HEATER_2_PIN 6 +//#define HEATER_3_PIN 8 +#define HEATER_BED_PIN 58 + +#define LED4_PIN 8 +#define LASER_PIN -1 + +#define FAN_PIN 9 +#if(!ENABLED(FilamentSensor)) + #define FAN1_PIN 4 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +//#define FIL_RUNOUT_PIN 4 +//#define FIL_RUNOUT_PIN 42 + +#define PS_ON_PIN 12 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + #else + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + #elif ENABLED(LCD_I2C_PANELOLU2) + #define BTN_EN1 47 // reverse if the encoder turns the wrong way. + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + #elif ENABLED(LCD_I2C_VIKI) + #define BTN_EN1 22 // reverse if the encoder turns the wrong way. + #define BTN_EN2 7 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf + // tells about 40/42. + // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 // reverse if the encoder turns the wrong way. + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + #elif ENABLED(MINIPANEL) + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 // encoder + #define BTN_EN2 59 // encoder + #define BTN_ENC 63 // enter button + #define SHIFT_OUT 40 // shift register + #define SHIFT_CLK 44 // shift register + #define SHIFT_LD 42 // shift register + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 // the click + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD + + diff --git a/Marlin/src/pins/pins_RURAMPS4D.h b/Marlin/src/pins/pins_RURAMPS4D.h new file mode 100644 index 0000000000..4f4ad0977e --- /dev/null +++ b/Marlin/src/pins/pins_RURAMPS4D.h @@ -0,0 +1,253 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + * Ported sys0724 & Vynt + */ + +/** + * Arduino Mega? or Due with RuRAMPS4DUE pin assignments + * + * Applies to the following boards: + * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) + * + * Differences between + * RADDS | RuRAMPS4DUE + * | + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RuRAMPS4Due" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 45 +#define X_MAX_PIN 39 +#define Y_MIN_PIN 46 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 47 +#define Z_MAX_PIN 43 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 43 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 // Support Extension Board +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 38 + +#define Y_STEP_PIN 32 // Support Extension Board +#define Y_DIR_PIN 35 +#define Y_ENABLE_PIN 34 + +#define Z_STEP_PIN 30 // Support Extension Board +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 33 + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 31 + +#define E1_STEP_PIN 22 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 + +#define E2_STEP_PIN 25 +#define E2_DIR_PIN 23 +#define E2_ENABLE_PIN 27 + +#define E3_STEP_PIN 15 // Only For Extension Board +#define E3_DIR_PIN 14 +#define E3_ENABLE_PIN 61 + +//#define X_CS_PIN -1 +//#define Y_CS_PIN -1 +//#define Z_CS_PIN -1 +//#define E0_CS_PIN -1 +//#define E1_CS_PIN -1 +//#define E2_CS_PIN -1 +//#define E3_CS_PIN -1 + +// For Future: Microstepping pins - Mapping not from fastio.h (?) +//#define E3_MS1_PIN ? +//#define E3_MS2_PIN ? +//#define E3_MS3_PIN ? +//#define Z2_MS1_PIN ? // shared with E3_MS1_PIN +//#define Z2_MS2_PIN ? // shared with E3_MS2_PIN +//#define Z2_MS3_PIN ? // shared with E3_MS3_PIN + +#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PROBE_PIN 49 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN Y_MIN_PIN + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED H1 + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 +#define CONTROLLER_FAN_PIN -1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // ANALOG A0 +#define TEMP_1_PIN 1 // ANALOG A1 +#define TEMP_2_PIN 2 // ANALOG A2 +#define TEMP_3_PIN 3 // ANALOG A2 +#define TEMP_BED_PIN 4 // ANALOG A3 +//Thermocouple Use Analog Pins +#if ENABLED(VER_WITH_THERMOCOUPLE) // If Nead, define is in Configuration.h + #define TEMP_4_PIN 5 // A5 + #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) +#endif + +// SPI for Max6675 or Max31855 Thermocouple +//#if DISABLED(SDSUPPORT) +// #define MAX6675_SS 53 +//#else +// #define MAX6675_SS 49 +//#endif + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 3 +#define SERVO2_PIN -1 +#define SERVO3_PIN -1 + +// +// Misc. Functions +// +#define SDSS 4 // 4,10,52 if using HW SPI. +#define LED_PIN -1 // 13 - HEATER_0_PIN +#define PS_ON_PIN -1 // 65 + +// MKS TFT / Nextion Use internal USART-1 +#define TFT_LCD_MODULE_COM 1 +#define TFT_LCD_MODULE_BAUDRATE 115600 + +// ESP WiFi Use internal USART-2 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115600 +#define ESP_WIFI_MODULE_RESET_PIN -1 +#define PIGGY_GPIO_PIN -1 + +// +// EEPROM +// +#define E2END 0x7FFF // 32Kb (24lc256) +#define I2C_EEPROM // EEPROM on I2C-0 +//#define EEPROM_SD // EEPROM on SDCARD +//#define SPI_EEPROM // EEPROM on SPI-0 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? +// 2K EEPROM +//#define SPI_EEPROM2_CS ? +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(RADDS_DISPLAY) || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define LCD_PINS_RS 63 + #define LCD_PINS_ENABLE 64 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define BEEPER_PIN 62 + + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + + #define SD_DETECT_PIN 51 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 52 + #define LCD_PINS_ENABLE 53 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define BEEPER_PIN 62 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #define SD_DETECT_PIN 51 + #endif + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #define BEEPER_PIN 62 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 51 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + //http://doku.radds.org/dokumentation/other-electronics/sparklcd/ + #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D." + //#define LCD_PINS_D4 29//? + //#define LCD_PINS_ENABLE 27//? + //#define LCD_PINS_RS 25//? + //#define BTN_EN1 35//? + //#define BTN_EN2 33//? + //#define BTN_ENC 37//? + + #endif // SPARK_FULL_GRAPHICS + +#endif // ULTRA_LCD diff --git a/Marlin/pins_SAINSMART_2IN1.h b/Marlin/src/pins/pins_SAINSMART_2IN1.h similarity index 100% rename from Marlin/pins_SAINSMART_2IN1.h rename to Marlin/src/pins/pins_SAINSMART_2IN1.h diff --git a/Marlin/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/pins_SANGUINOLOLU_11.h similarity index 97% rename from Marlin/pins_SANGUINOLOLU_11.h rename to Marlin/src/pins/pins_SANGUINOLOLU_11.h index c27eab1c8a..0d9af5b5a8 100644 --- a/Marlin/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/pins_SANGUINOLOLU_11.h @@ -100,7 +100,7 @@ #define Z_ENABLE_PIN 26 #define E0_ENABLE_PIN 14 - #if ENABLED(LCD_I2C_PANELOLU2) + #if !defined(FAN_PIN) && ENABLED(LCD_I2C_PANELOLU2) #define FAN_PIN 4 // Uses Transistor1 (PWM) on Panelolu2's Sanguino Adapter Board to drive the fan #endif @@ -114,7 +114,7 @@ #endif -#if MB(AZTEEG_X1) || MB(STB_11) || ENABLED(IS_MELZI) +#if !defined(FAN_PIN) && (MB(AZTEEG_X1) || MB(STB_11) || ENABLED(IS_MELZI)) #define FAN_PIN 4 // Works for Panelolu2 too #endif @@ -239,13 +239,13 @@ #define BTN_EN2 30 #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_0_NOP + #define ST7920_DELAY_1 DELAY_NS(0) #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_3_NOP + #define ST7920_DELAY_2 DELAY_NS(188) #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_0_NOP + #define ST7920_DELAY_3 DELAY_NS(0) #endif #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards diff --git a/Marlin/pins_SANGUINOLOLU_12.h b/Marlin/src/pins/pins_SANGUINOLOLU_12.h similarity index 100% rename from Marlin/pins_SANGUINOLOLU_12.h rename to Marlin/src/pins/pins_SANGUINOLOLU_12.h diff --git a/Marlin/pins_SAV_MKI.h b/Marlin/src/pins/pins_SAV_MKI.h similarity index 98% rename from Marlin/pins_SAV_MKI.h rename to Marlin/src/pins/pins_SAV_MKI.h index 1241ee083f..8945594495 100644 --- a/Marlin/pins_SAV_MKI.h +++ b/Marlin/src/pins/pins_SAV_MKI.h @@ -114,7 +114,9 @@ #define HEATER_0_PIN 15 // C5 PWM3B - Extruder #define HEATER_BED_PIN 14 // C4 PWM3C - Bed -#define FAN_PIN 16 // C6 PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif // // Misc. Functions diff --git a/Marlin/pins_SCOOVO_X9H.h b/Marlin/src/pins/pins_SCOOVO_X9H.h similarity index 96% rename from Marlin/pins_SCOOVO_X9H.h rename to Marlin/src/pins/pins_SCOOVO_X9H.h index c0852bf310..ea6685def4 100644 --- a/Marlin/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/pins_SCOOVO_X9H.h @@ -91,7 +91,7 @@ #define E1_MS2_PIN 64 #define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping +#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping // // Temperature Sensors @@ -106,7 +106,9 @@ #define HEATER_1_PIN 7 #define HEATER_BED_PIN 3 -#define FAN_PIN 8 +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif #define FAN1_PIN 6 #define FAN2_PIN 2 diff --git a/Marlin/src/pins/pins_SELENA_COMPACT.h b/Marlin/src/pins/pins_SELENA_COMPACT.h new file mode 100644 index 0000000000..5ea2d3bf54 --- /dev/null +++ b/Marlin/src/pins/pins_SELENA_COMPACT.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Selena Compact pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Selena Compact" + #define DEFAULT_WEBSITE_URL "https://github.com/Ales2-k/Selena" +#endif + +// +// Limit Switches +// + +#define X_MIN_PIN P1_28 +#define X_MAX_PIN P1_25 +#define Y_MIN_PIN P2_11 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN P1_27 +#define Z_MAX_PIN -1 +#define Z_PROBE P1_22 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_05 +#define HEATER_BED2_PIN P2_04 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P1_24 +#endif +#define FAN1_PIN P1_26 + +// +// Display +// + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define LCD_PINS_RS P0_16 + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + #define LCD_PINS_D5 P1_00 + #define LCD_PINS_D6 P1_01 + #define LCD_PINS_D7 P1_04 + #define BEEPER_PIN P1_31 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P1_30 + + #define SD_DETECT_PIN -1 +#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// Servo +// +#define SERVO0_PIN P1_23 diff --git a/Marlin/pins_SETHI.h b/Marlin/src/pins/pins_SETHI.h similarity index 95% rename from Marlin/pins_SETHI.h rename to Marlin/src/pins/pins_SETHI.h index 293373a6d7..801560e5e3 100644 --- a/Marlin/pins_SETHI.h +++ b/Marlin/src/pins/pins_SETHI.h @@ -98,12 +98,13 @@ #define HEATER_0_PIN 4 #define HEATER_BED_PIN 3 - -#if GEN7_VERSION >= 13 - // Gen7 v1.3 removed the fan pin - #define FAN_PIN -1 -#else - #define FAN_PIN 31 +#ifndef FAN_PIN + #if GEN7_VERSION >= 13 + // Gen7 v1.3 removed the fan pin + #define FAN_PIN -1 + #else + #define FAN_PIN 31 + #endif #endif // diff --git a/Marlin/pins_SILVER_GATE.h b/Marlin/src/pins/pins_SILVER_GATE.h similarity index 97% rename from Marlin/pins_SILVER_GATE.h rename to Marlin/src/pins/pins_SILVER_GATE.h index ca96a427c1..005c4c6eca 100644 --- a/Marlin/pins_SILVER_GATE.h +++ b/Marlin/src/pins/pins_SILVER_GATE.h @@ -56,7 +56,9 @@ #define FIL_RUNOUT_PIN 34 // X_MAX unless overridden #endif -#define FAN_PIN 5 +#ifndef FAN_PIN + #define FAN_PIN 5 +#endif #define HEATER_0_PIN 7 diff --git a/Marlin/pins_STB_11.h b/Marlin/src/pins/pins_STB_11.h similarity index 100% rename from Marlin/pins_STB_11.h rename to Marlin/src/pins/pins_STB_11.h diff --git a/Marlin/src/pins/pins_STM32F1R.h b/Marlin/src/pins/pins_STM32F1R.h new file mode 100644 index 0000000000..f827a7ef9b --- /dev/null +++ b/Marlin/src/pins/pins_STM32F1R.h @@ -0,0 +1,264 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#ifndef __STM32F1__ + #error "Oops! Make sure you have an STM32F1 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Marlin for STM32" + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 +#define X_STOP_PIN PB3 +#define Y_STOP_PIN PB4 +#define Z_STOP_PIN PB5 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PC1 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PC3 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PC4 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PA8 + +#define E0_STEP_PIN PC6 +#define E0_DIR_PIN PC7 +#define E0_ENABLE_PIN PA8 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PC8 +#define E1_DIR_PIN PC9 +#define E1_ENABLE_PIN PA8 + +#define E2_STEP_PIN PC10 +#define E2_DIR_PIN PC11 +#define E2_ENABLE_PIN PA8 + +// +// Misc. Functions +// +#define SDSS PA4 +#define LED_PIN PD2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXTRUDER 1 +#define HEATER_1_PIN PB1 + +#define HEATER_BED_PIN PA3 // BED + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN PA2 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_STM32F4.h b/Marlin/src/pins/pins_STM32F4.h new file mode 100644 index 0000000000..22c8389635 --- /dev/null +++ b/Marlin/src/pins/pins_STM32F4.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if !defined(STM32F4) && !defined(STM32F4xx) + #error "Oops! Make sure you have an STM32F4 board selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "STM32F407VET6" +#define BOARD_NAME "STM32F4 Board" + +//#define I2C_EEPROM + +#define E2END 0xFFF // EEPROM end address (4kB) + +// Ignore temp readings during develpment. +//#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +#if E_STEPPERS > 2 || HOTENDS > 2 + #error "STM32F4 supports up to 2 hotends / E-steppers." +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE0 +#define X_MAX_PIN -1 +#define Y_MIN_PIN PE1 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN PE14 +#define Z_MAX_PIN -1 + +// +// Z Probe (when not Z_MIN_PIN) +// + +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PA4 +//#endif + +// +// Steppers +// + +#define X_STEP_PIN PD3 +#define X_DIR_PIN PD2 +#define X_ENABLE_PIN PD0 +//#ifndef X_CS_PIN +// #define X_CS_PIN PD1 +//#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE10 +#define Y_ENABLE_PIN PE13 +//#ifndef Y_CS_PIN +// #define Y_CS_PIN PE12 +//#endif + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD7 +#define Z_ENABLE_PIN PD4 +//#ifndef Z_CS_PIN +// #define Z_CS_PIN PD5 +//#endif + +#define E0_STEP_PIN PB5 +#define E0_DIR_PIN PB6 +#define E0_ENABLE_PIN PB3 +//#ifndef E0_CS_PIN +// #define E0_CS_PIN PB4 +//#endif + +#define E1_STEP_PIN PE4 +#define E1_DIR_PIN PE2 +#define E1_ENABLE_PIN PE3 +//#ifndef E1_CS_PIN +// #define E1_CS_PIN PE5 +//#endif + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_BED_PIN PC2 // Analog Input + +// +// Heaters / Fans +// + +#define HEATER_0_PIN PA1 +#define HEATER_1_PIN PA2 +#define HEATER_BED_PIN PA0 + +#ifndef FAN_PIN + #define FAN_PIN PC6 +#endif +#define FAN1_PIN PC7 +#define FAN2_PIN PC8 + +#define ORIG_E0_AUTO_FAN_PIN FAN1_PIN // Use this by NOT overriding E0_AUTO_FAN_PIN + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// + +//#define E_MUX0_PIN PG3 +//#define E_MUX1_PIN PG4 + +// +// Servos +// + +//#define SERVO0_PIN PE13 +//#define SERVO1_PIN PE14 + + +#define SDSS PE7 +#define SS_PIN PE7 +#define LED_PIN PB7 //Alive +#define PS_ON_PIN PA10 +#define KILL_PIN PA8 +#define PWR_LOSS PA4 //Power loss / nAC_FAULT + +// +// LCD / Controller +// + +#define SD_DETECT_PIN PA15 +#define BEEPER_PIN PC9 +#define LCD_PINS_RS PE9 +#define LCD_PINS_ENABLE PE8 +#define LCD_PINS_D4 PB12 +#define LCD_PINS_D5 PB13 +#define LCD_PINS_D6 PB14 +#define LCD_PINS_D7 PB15 +#define BTN_EN1 PC4 +#define BTN_EN2 PC5 +#define BTN_ENC PC3 + +// +// Filament runout +// + +#define FIL_RUNOUT_PIN PA3 + +// +// ST7920 Delays +// +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(96) +#endif + +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(48) +#endif + +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(715) +#endif diff --git a/Marlin/src/pins/pins_STM3R_MINI.h b/Marlin/src/pins/pins_STM3R_MINI.h new file mode 100644 index 0000000000..2ffb09e2d5 --- /dev/null +++ b/Marlin/src/pins/pins_STM3R_MINI.h @@ -0,0 +1,280 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM3R Mini" +#define BOARD_NAME "Marlin for STM32" + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 +#define X_STOP_PIN PD0 +#define Y_STOP_PIN PD1 +#define Z_STOP_PIN PD4 + +// +// Steppers +// +#define X_STEP_PIN PE1 +#define X_DIR_PIN PE0 +#define X_ENABLE_PIN PC0 + +#define Y_STEP_PIN PE3 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PC1 + +#define Z_STEP_PIN PE5 +#define Z_DIR_PIN PE4 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PE7 +#define E0_DIR_PIN PE6 +#define E0_ENABLE_PIN PC3 + +#define E1_STEP_PIN PE9 +#define E1_DIR_PIN PE8 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE11 +#define E2_DIR_PIN PE10 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDSS PA15 +#define LED_PIN PB2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +//#define HEATER_1_PIN PD13 + +#define HEATER_BED_PIN PB9 // BED +//#define HEATER_BED2_PIN -1 // BED2 +//#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PD14 +#endif +#define FAN1_PIN PD13 + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 +#define TEMP_0_PIN PA1 +#define TEMP_1_PIN PA2 +#define TEMP_2_PIN PA3 + +// Laser control +#if ENABLED(SPINDLE_LASER_ENABLE) + #define SPINDLE_LASER_PWM_PIN PB8 + #define SPINDLE_LASER_ENABLE_PIN PD5 +#endif + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/pins_TEENSY2.h b/Marlin/src/pins/pins_TEENSY2.h similarity index 98% rename from Marlin/pins_TEENSY2.h rename to Marlin/src/pins/pins_TEENSY2.h index 16fcd46f10..736be6f73e 100644 --- a/Marlin/pins_TEENSY2.h +++ b/Marlin/src/pins/pins_TEENSY2.h @@ -149,7 +149,9 @@ // #define HEATER_0_PIN 15 // C5 PWM3B Extruder #define HEATER_BED_PIN 14 // C4 PWM3C -#define FAN_PIN 16 // C6 PWM3A Fan +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A Fan +#endif // // Misc. Functions diff --git a/Marlin/src/pins/pins_TEENSY35_36.h b/Marlin/src/pins/pins_TEENSY35_36.h new file mode 100644 index 0000000000..e196401c41 --- /dev/null +++ b/Marlin/src/pins/pins_TEENSY35_36.h @@ -0,0 +1,152 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/**************************************************************************************** +* Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 3.5 or Teensy 3.6 selected in Arduino IDE! +* http://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if !IS_32BIT_TEENSY + #error "Oops! Make sure you have 'Teensy 3.5' or 'Teensy 3.6' selected from the 'Tools -> Boards' menu." +#endif + +#if IS_TEENSY35 + #define BOARD_NAME "Teensy3.5" +#elif IS_TEENSY36 + #define BOARD_NAME "Teensy3.6" +#endif + +#define AT90USB 1286 // Disable MarlinSerial etc. +#define USBCON //1286 // Disable MarlinSerial etc. +/* + + teemuatlut plan for Teensy3.5 and Teensy3.6: + USB + GND |-----#####-----| VIN 5V + X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND + X_DIR_PIN MISO1 TX1 1 | | 3.3V + Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM + Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM + Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 + Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN + X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN + Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN + Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN + CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN + CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN + X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN + Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN + 3.3V | | GND + Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 +AUX2 25 | 41 * * 52 | A21 DAC0 +AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS +AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 +AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 +D10 CONTROLLERFAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM +D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN +D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN + SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN + + Interior pins: + LCD_PINS_RS 40 * * 53 SCK2 + LCD_PINS_ENABLE 41 * * 52 MOSI2 + LCD_PINS_D4 42 * * 51 MISO2 + LCD_PINS_D5 CS2 43 * * 50 A24 + LCD_PINS_D6 MOSI2 44 * * 49 A23 + LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC + BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 + GND * * 3.3V + +*/ + +// +// Limit Switches +// +#define X_STOP_PIN 24 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 22 +#define X_DIR_PIN 21 +#define X_ENABLE_PIN 39 + +#define Y_STEP_PIN 19 +#define Y_DIR_PIN 18 +#define Y_ENABLE_PIN 20 + +#define Z_STEP_PIN 38 +#define Z_DIR_PIN 37 +#define Z_ENABLE_PIN 17 + +#define E0_STEP_PIN 31 +#define E0_DIR_PIN 30 +#define E0_ENABLE_PIN 32 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 35 + +#define HEATER_0_PIN 30 +#define HEATER_1_PIN 36 +#define HEATER_BED_PIN 31 +#ifndef FAN_PIN + #define FAN_PIN 2 +#endif + +#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 0 +#define TEMP_BED_PIN 1 // Bed / Analog pin numbering + +#define SDSS 39 // 8 +#define LED_PIN 13 +#define PS_ON_PIN 1 +#define ALARM_PIN -1 + +#define FILWIDTH_PIN 6 +#define SOL1_PIN 28 + +#if 0 +// Pretty sure this is obsolete! +// Please use Marlin 1.1.x pins files as reference for new pins files. +#ifndef SDSUPPORT + // these are defined in the SD library if building with SD support + #define SCK_PIN 13 + #define MISO_PIN 12 + #define MOSI_PIN 11 +#endif +#endif + +#ifdef ULTRA_LCD + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 41 + #define LCD_PINS_D4 42 + #define LCD_PINS_D5 43 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 45 + #define BTN_EN1 46 + #define BTN_EN2 47 + #define BTN_ENC 48 +#endif diff --git a/Marlin/pins_TEENSYLU.h b/Marlin/src/pins/pins_TEENSYLU.h old mode 100755 new mode 100644 similarity index 98% rename from Marlin/pins_TEENSYLU.h rename to Marlin/src/pins/pins_TEENSYLU.h index 33f78b2305..e733b98287 --- a/Marlin/pins_TEENSYLU.h +++ b/Marlin/src/pins/pins_TEENSYLU.h @@ -127,7 +127,9 @@ #define HEATER_0_PIN 15 // C5 PWM3B - Extruder #define HEATER_BED_PIN 14 // C4 PWM3C -#define FAN_PIN 16 // C6 PWM3A +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif // // Misc. Functions diff --git a/Marlin/src/pins/pins_THE_BORG.h b/Marlin/src/pins/pins_THE_BORG.h new file mode 100644 index 0000000000..8a762fba21 --- /dev/null +++ b/Marlin/src/pins/pins_THE_BORG.h @@ -0,0 +1,186 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +#if !defined(STM32F7) + #error "Oops! Make sure you have an STM32F7 board selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "The-Borge" +#define BOARD_NAME "The-Borge" + +#define E2END 0xFFF // EEPROM end address + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +#if E_STEPPERS > 3 || HOTENDS > 3 + #error "The-Borg supports up to 3 hotends / E-steppers." +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE9 +#define X_MAX_PIN PE10 +#define Y_MIN_PIN PE7 +#define Y_MAX_PIN PE8 +#define Z_MIN_PIN PF15 +#define Z_MAX_PIN PG0 +#define E_MIN_PIN PE2 +#define E_MAX_PIN PE3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PA4 +#endif + +// +// Steppers +// +#define STEPPER_ENABLE_PIN PE0 + +#define X_STEP_PIN PC6 // 96, 39 in Arduino +#define X_DIR_PIN PC7 +#define X_ENABLE_PIN PC8 + + +#define Y_STEP_PIN PD9 +#define Y_DIR_PIN PD10 +#define Y_ENABLE_PIN PD11 + +#define Z_STEP_PIN PE15 +#define Z_DIR_PIN PG1 +#define Z_ENABLE_PIN PD8 + + +#define E0_STEP_PIN PB1 +#define E0_DIR_PIN PB2 +#define E0_ENABLE_PIN PE11 + + +#define E1_STEP_PIN PC4 +#define E1_DIR_PIN PC5 +#define E1_ENABLE_PIN PB0 + + +#define E2_STEP_PIN PC13 +#define E2_DIR_PIN PC14 +#define E2_ENABLE_PIN PC15 + +#define Z2_STEP_PIN PC13 +#define Z2_DIR_PIN PC14 +#define Z2_ENABLE_PIN PC15 + + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 + +#define SPI6_SCK_PIN PG13 +#define SPI6_MISO_PIN PG12 +#define SPI6_MOSI_PIN PG14 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC3 // Analog Input +#define TEMP_1_PIN PC2 // Analog Input +#define TEMP_2_PIN PC1 // Analog Input +#define TEMP_3_PIN PC0 // Analog Input + +#define TEMP_BED_PIN PF10 // Analog Input + +#define TEMP_5_PIN PE12 // Analog Input, Probe temp + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD15 +#define HEATER_1_PIN PD14 +#define HEATER_BED_PIN PF6 + +#ifndef FAN_PIN + #define FAN_PIN PD13 +#endif +#define FAN1_PIN PA0 +#define FAN2_PIN PA1 + +#define ORIG_E0_AUTO_FAN_PIN PA1 // Use this by NOT overriding E0_AUTO_FAN_PIN + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// + +#define E_MUX0_PIN PG3 +#define E_MUX1_PIN PG4 + +// +// Servos +// + +#define SERVO0_PIN PE13 +#define SERVO1_PIN PE14 + + +#define SDSS PA8 +#define SS_PIN PA8 +#define LED_PIN PA2 // Alive +#define PS_ON_PIN PA3 +#define KILL_PIN -1 //PD5 // EXP2-10 +#define PWR_LOSS PG5 // Power loss / nAC_FAULT + +// +// MAX7219_DEBUG +// +#define MAX7219_CLK_PIN PG10 // EXP1-1 +#define MAX7219_DIN_PIN PD7 // EXP1-3 +#define MAX7219_LOAD_PIN PD1 // EXP1-5 + +// +// LCD / Controller +// +//#define SD_DETECT_PIN -1 //PB6) // EXP2-4 +#define BEEPER_PIN PG10 // EXP1-1 +#define LCD_PINS_RS PG9 // EXP1-4 +#define LCD_PINS_ENABLE PD7 // EXP1-3 +#define LCD_PINS_D4 PD1 // EXP1-5 +#define LCD_PINS_D5 PF0 // EXP1-6 +#define LCD_PINS_D6 PD3 // EXP1-7 +#define LCD_PINS_D7 PD4 // EXP1-8 +#define BTN_EN1 PD6 // EXP2-5 +#define BTN_EN2 PD0 // EXP2-3 +#define BTN_ENC PG11 // EXP1-2 diff --git a/Marlin/pins_TRIGORILLA_13.h b/Marlin/src/pins/pins_TRIGORILLA_13.h similarity index 92% rename from Marlin/pins_TRIGORILLA_13.h rename to Marlin/src/pins/pins_TRIGORILLA_13.h index e876da4671..0907eaf286 100644 --- a/Marlin/pins_TRIGORILLA_13.h +++ b/Marlin/src/pins/pins_TRIGORILLA_13.h @@ -29,8 +29,9 @@ #endif #define IS_RAMPS_EFB -#define RAMPS_D9_PIN 44 -#define ORIG_E0_AUTO_FAN_PIN RAMPS_D9_PIN +#define RAMPS_D9_PIN 44 +#define FAN2_PIN 9 +#define ORIG_E0_AUTO_FAN_PIN 9 #include "pins_RAMPS_13.h" diff --git a/Marlin/pins_TRIGORILLA_14.h b/Marlin/src/pins/pins_TRIGORILLA_14.h similarity index 94% rename from Marlin/pins_TRIGORILLA_14.h rename to Marlin/src/pins/pins_TRIGORILLA_14.h index 3903e1dba5..f1deb8fb07 100644 --- a/Marlin/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/pins_TRIGORILLA_14.h @@ -30,9 +30,10 @@ #define IS_RAMPS_EFB -#include "pins_RAMPS_13.h" +#define FAN2_PIN 44 +#define ORIG_E0_AUTO_FAN_PIN 44 -#define FAN2_PIN 44 +#include "pins_RAMPS_13.h" #undef E1_STEP_PIN #undef E1_DIR_PIN diff --git a/Marlin/pins_ULTIMAIN_2.h b/Marlin/src/pins/pins_ULTIMAIN_2.h similarity index 98% rename from Marlin/pins_ULTIMAIN_2.h rename to Marlin/src/pins/pins_ULTIMAIN_2.h index c52b20c3e3..ea7a8325c0 100644 --- a/Marlin/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/pins_ULTIMAIN_2.h @@ -93,7 +93,9 @@ #define HEATER_1_PIN 3 #define HEATER_BED_PIN 4 -#define FAN_PIN 7 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif // // Misc. Functions diff --git a/Marlin/pins_ULTIMAKER.h b/Marlin/src/pins/pins_ULTIMAKER.h similarity index 98% rename from Marlin/pins_ULTIMAKER.h rename to Marlin/src/pins/pins_ULTIMAKER.h index 0d1a65431f..4b6488aede 100644 --- a/Marlin/pins_ULTIMAKER.h +++ b/Marlin/src/pins/pins_ULTIMAKER.h @@ -99,7 +99,9 @@ #define HEATER_1_PIN 3 #define HEATER_BED_PIN 4 -#define FAN_PIN 7 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif // // Misc. Functions diff --git a/Marlin/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/pins_ULTIMAKER_OLD.h similarity index 100% rename from Marlin/pins_ULTIMAKER_OLD.h rename to Marlin/src/pins/pins_ULTIMAKER_OLD.h diff --git a/Marlin/src/pins/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/pins_ULTRATRONICS_PRO.h new file mode 100644 index 0000000000..42bdd7f645 --- /dev/null +++ b/Marlin/src/pins/pins_ULTRATRONICS_PRO.h @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * ReprapWorld ULTRATRONICS v1.0 + */ + +#define KNOWN_BOARD +#define BOARD_NAME "Ultratronics v1.0" + +#ifndef ARDUINO_ARCH_SAM + #error Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu. +#endif + +// +// Servos +// +#if NUM_SERVOS > 0 + #define SERVO0_PIN 11 + #if NUM_SERVOS > 1 + #define SERVO1_PIN 12 + #endif +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 31 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 12 +#define Y_MAX_PIN 11 +#define Z_MIN_PIN 29 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 35 +#define X_DIR_PIN 34 +#define X_ENABLE_PIN 37 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 +#define Y_ENABLE_PIN 33 + +#define Z_STEP_PIN 25 +#define Z_DIR_PIN 26 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 47 +#define E0_DIR_PIN 46 +#define E0_ENABLE_PIN 48 + +#define E1_STEP_PIN 44 +#define E1_DIR_PIN 36 +#define E1_ENABLE_PIN 45 + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 41 +#define E2_ENABLE_PIN 43 + +#define E3_STEP_PIN 39 +#define E3_DIR_PIN 38 +#define E3_ENABLE_PIN 40 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_3_PIN 4 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 8 +#define HEATER_2_PIN 7 +#define HEATER_3_PIN 9 +#define HEATER_BED_PIN 2 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif +#define FAN2_PIN 5 + +// +// Misc. Functions +// +#define SDSS 59 +#define SD_DETECT_PIN 60 +#define LED_PIN 13 +#define PS_ON_PIN 32 + +// +// SPI Buses +// + +#define DAC0_SYNC 53 // PB14 +#define SPI_CHAN_DAC 1 + +#define SPI_CHAN_EEPROM1 -1 +#define SPI_EEPROM1_CS -1 +#define SPI_EEPROM2_CS -1 +#define SPI_FLASH_CS -1 + +// SPI for Max6675 or Max31855 Thermocouple +#define MAX6675_SS 65 +#define MAX31855_SS0 65 +#define MAX31855_SS1 52 +#define MAX31855_SS2 50 +#define MAX31855_SS3 51 + +#define ENC424_SS 61 + +// +// LCD / Controller +// + +#define BEEPER_PIN 27 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS A8 // CS chip select / SS chip slave select + #define LCD_PINS_ENABLE MOSI // SID (MOSI) + #define LCD_PINS_D4 SCK // SCK (CLK) clock + + #define BTN_EN1 20 + #define BTN_EN2 21 + #define BTN_ENC 64 + +#endif // REPRAPWORLD_GRAPHICAL_LCD diff --git a/Marlin/pins_ZRIB_V20.h b/Marlin/src/pins/pins_ZRIB_V20.h similarity index 100% rename from Marlin/pins_ZRIB_V20.h rename to Marlin/src/pins/pins_ZRIB_V20.h diff --git a/Marlin/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp similarity index 70% rename from Marlin/Sd2Card.cpp rename to Marlin/src/sd/Sd2Card.cpp index ab3fc2f370..b52e4fa16d 100644 --- a/Marlin/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -23,165 +23,103 @@ /** * Arduino Sd2Card Library * Copyright (C) 2009 by William Greiman + * Updated with backports of the latest SdFat library from the same author * * This file is part of the Arduino Sd2Card Library */ -#include "MarlinConfig.h" + +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) +/* Enable FAST CRC computations - You can trade speed for FLASH space if + * needed by disabling the following define */ +#define FAST_CRC 1 + #include "Sd2Card.h" -#if ENABLED(USE_WATCHDOG) - #include "watchdog.h" -#endif +#include "../Marlin.h" -#if DISABLED(SOFTWARE_SPI) - // functions for hardware SPI +#if ENABLED(SD_CHECK_AND_RETRY) + static bool crcSupported = true; - // make sure SPCR rate is in expected bits - #if (SPR0 != 0 || SPR1 != 1) - #error "unexpected SPCR bits" + #ifdef FAST_CRC + static const uint8_t crctab7[] PROGMEM = { + 0x00,0x09,0x12,0x1B,0x24,0x2D,0x36,0x3F,0x48,0x41,0x5A,0x53,0x6C,0x65,0x7E,0x77, + 0x19,0x10,0x0B,0x02,0x3D,0x34,0x2F,0x26,0x51,0x58,0x43,0x4A,0x75,0x7C,0x67,0x6E, + 0x32,0x3B,0x20,0x29,0x16,0x1F,0x04,0x0D,0x7A,0x73,0x68,0x61,0x5E,0x57,0x4C,0x45, + 0x2B,0x22,0x39,0x30,0x0F,0x06,0x1D,0x14,0x63,0x6A,0x71,0x78,0x47,0x4E,0x55,0x5C, + 0x64,0x6D,0x76,0x7F,0x40,0x49,0x52,0x5B,0x2C,0x25,0x3E,0x37,0x08,0x01,0x1A,0x13, + 0x7D,0x74,0x6F,0x66,0x59,0x50,0x4B,0x42,0x35,0x3C,0x27,0x2E,0x11,0x18,0x03,0x0A, + 0x56,0x5F,0x44,0x4D,0x72,0x7B,0x60,0x69,0x1E,0x17,0x0C,0x05,0x3A,0x33,0x28,0x21, + 0x4F,0x46,0x5D,0x54,0x6B,0x62,0x79,0x70,0x07,0x0E,0x15,0x1C,0x23,0x2A,0x31,0x38, + 0x41,0x48,0x53,0x5A,0x65,0x6C,0x77,0x7E,0x09,0x00,0x1B,0x12,0x2D,0x24,0x3F,0x36, + 0x58,0x51,0x4A,0x43,0x7C,0x75,0x6E,0x67,0x10,0x19,0x02,0x0B,0x34,0x3D,0x26,0x2F, + 0x73,0x7A,0x61,0x68,0x57,0x5E,0x45,0x4C,0x3B,0x32,0x29,0x20,0x1F,0x16,0x0D,0x04, + 0x6A,0x63,0x78,0x71,0x4E,0x47,0x5C,0x55,0x22,0x2B,0x30,0x39,0x06,0x0F,0x14,0x1D, + 0x25,0x2C,0x37,0x3E,0x01,0x08,0x13,0x1A,0x6D,0x64,0x7F,0x76,0x49,0x40,0x5B,0x52, + 0x3C,0x35,0x2E,0x27,0x18,0x11,0x0A,0x03,0x74,0x7D,0x66,0x6F,0x50,0x59,0x42,0x4B, + 0x17,0x1E,0x05,0x0C,0x33,0x3A,0x21,0x28,0x5F,0x56,0x4D,0x44,0x7B,0x72,0x69,0x60, + 0x0E,0x07,0x1C,0x15,0x2A,0x23,0x38,0x31,0x46,0x4F,0x54,0x5D,0x62,0x6B,0x70,0x79 + }; + + static uint8_t CRC7(const uint8_t* data, uint8_t n) { + uint8_t crc = 0; + while ( n > 0 ) { + crc = pgm_read_byte(&crctab7[ (crc << 1) ^ *data++ ]); + n--; + } + return (crc << 1) | 1; + } + #else + static uint8_t CRC7(const uint8_t* data, uint8_t n) { + uint8_t crc = 0; + for (uint8_t i = 0; i < n; i++) { + uint8_t d = data[i]; + d ^= crc << 1; + if (d & 0x80) d ^= 9; + crc = d ^ (crc & 0x78) ^ (crc << 4) ^ ((crc >> 3) & 15); + crc &= 0x7F; + } + crc = (crc << 1) ^ (crc << 4) ^ (crc & 0x70) ^ ((crc >> 3) & 0x0F); + return crc | 1; + } #endif - /** - * Initialize hardware SPI - * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] - */ - static void spiInit(uint8_t spiRate) { - // See avr processor documentation - SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); - SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); - } - - /** SPI receive a byte */ - static uint8_t spiRec() { - SPDR = 0xFF; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - return SPDR; - } - - /** SPI read data - only one call so force inline */ - static inline __attribute__((always_inline)) - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (nbyte-- == 0) return; - SPDR = 0xFF; - for (uint16_t i = 0; i < nbyte; i++) { - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - buf[i] = SPDR; - SPDR = 0xFF; - } - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - buf[nbyte] = SPDR; - } - - /** SPI send a byte */ - static void spiSend(uint8_t b) { - SPDR = b; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - } - - /** SPI send block - only one call so force inline */ - static inline __attribute__((always_inline)) - void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPDR = token; - for (uint16_t i = 0; i < 512; i += 2) { - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - SPDR = buf[i]; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - SPDR = buf[i + 1]; - } - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - } - //------------------------------------------------------------------------------ -#else // SOFTWARE_SPI - //------------------------------------------------------------------------------ - - /** nop to tune soft SPI timing */ - #define nop asm volatile ("nop\n\t") - - /** Soft SPI receive byte */ - static uint8_t spiRec() { - uint8_t data = 0; - // no interrupts during byte receive - about 8 us - cli(); - // output pin high - like sending 0xFF - WRITE(SPI_MOSI_PIN, HIGH); - - for (uint8_t i = 0; i < 8; i++) { - WRITE(SPI_SCK_PIN, HIGH); - - // adjust so SCK is nice - nop; - nop; - - data <<= 1; - - if (READ(SPI_MISO_PIN)) data |= 1; - - WRITE(SPI_SCK_PIN, LOW); - } - // enable interrupts - sei(); - return data; - } - - /** Soft SPI read data */ - static void spiRead(uint8_t* buf, uint16_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) - buf[i] = spiRec(); - } - - /** Soft SPI send byte */ - static void spiSend(uint8_t data) { - // no interrupts during byte send - about 8 us - cli(); - for (uint8_t i = 0; i < 8; i++) { - WRITE(SPI_SCK_PIN, LOW); - - WRITE(SPI_MOSI_PIN, data & 0x80); - - data <<= 1; - - WRITE(SPI_SCK_PIN, HIGH); - } - // hold SCK high for a few ns - nop; - nop; - nop; - nop; - - WRITE(SPI_SCK_PIN, LOW); - // enable interrupts - sei(); - } - - /** Soft SPI send block */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { - spiSend(token); - for (uint16_t i = 0; i < 512; i++) - spiSend(buf[i]); - } -#endif // SOFTWARE_SPI +#endif // send command and return error code. Return zero for OK uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { // select card - chipSelectLow(); + chipSelect(); // wait up to 300 ms if busy - waitNotBusy(300); + waitNotBusy( SD_WRITE_TIMEOUT ); + uint8_t *pa = (uint8_t *)(&arg); + +#if ENABLED(SD_CHECK_AND_RETRY) + + // form message + uint8_t d[6] = {(uint8_t) (cmd | 0x40), pa[3], pa[2], pa[1], pa[0] }; + + // add crc + d[5] = CRC7(d, 5); + + // send message + for (uint8_t k = 0; k < 6; k++ ) + spiSend( d[k] ); + +#else // send command spiSend(cmd | 0x40); // send argument - for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); + for( int8_t i = 3; i >= 0; i-- ) + spiSend( pa[i] ); - // send CRC - uint8_t crc = 0xFF; - if (cmd == CMD0) crc = 0x95; // correct crc for CMD0 with arg 0 - if (cmd == CMD8) crc = 0x87; // correct crc for CMD8 with arg 0x1AA - spiSend(crc); + // send CRC - correct for CMD0 with arg zero or CMD8 with arg 0X1AA + spiSend( cmd == CMD0 ? 0X95 : 0X87 ); +#endif // skip stuff byte for stop read if (cmd == CMD12) spiRec(); @@ -219,14 +157,15 @@ uint32_t Sd2Card::cardSize() { } } -void Sd2Card::chipSelectHigh() { +void Sd2Card::chipDeselect() { digitalWrite(chipSelectPin_, HIGH); + + // insure MISO goes high impedance + spiSend( 0xFF ); } -void Sd2Card::chipSelectLow() { - #if DISABLED(SOFTWARE_SPI) - spiInit(spiRate_); - #endif // SOFTWARE_SPI +void Sd2Card::chipSelect() { + spiInit(spiRate_); digitalWrite(chipSelectPin_, LOW); } @@ -270,10 +209,10 @@ bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { error(SD_CARD_ERROR_ERASE_TIMEOUT); goto FAIL; } - chipSelectHigh(); + chipDeselect(); return true; FAIL: - chipSelectHigh(); + chipDeselect(); return false; } @@ -310,51 +249,67 @@ bool Sd2Card::init(uint8_t sckRateID, pin_t chipSelectPin) { watchdog_reset(); #endif - // set pin modes - pinMode(chipSelectPin_, OUTPUT); - chipSelectHigh(); - SET_INPUT(SPI_MISO_PIN); - SET_OUTPUT(SPI_MOSI_PIN); - SET_OUTPUT(SPI_SCK_PIN); + // Set pin modes + digitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first + pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye + spiBegin(); - #if DISABLED(SOFTWARE_SPI) - // SS must be in output mode even it is not chip select - SET_OUTPUT(SS_PIN); - // set SS high - may be chip select for another SPI device - #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); - #endif // SET_SPI_SS_HIGH - // set SCK rate for initialization commands - spiRate_ = SPI_SD_INIT_RATE; - spiInit(spiRate_); - #endif // SOFTWARE_SPI + // Set SCK rate for initialization commands + spiRate_ = SPI_SD_INIT_RATE; + spiInit(spiRate_); - // must supply min of 74 clock cycles with CS high. + // Must supply min of 74 clock cycles with CS high. for (uint8_t i = 0; i < 10; i++) spiSend(0xFF); - // command to go idle in SPI mode + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + + // Command to go idle in SPI mode while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { error(SD_CARD_ERROR_CMD0); goto FAIL; } } + + #if ENABLED(SD_CHECK_AND_RETRY) + crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); + #endif + + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + // check SD version - if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { - type(SD_CARD_TYPE_SD1); - } - else { - // only need last byte of r7 response + for (;;) { + if (cardCommand(CMD8, 0x1AA) == (R1_ILLEGAL_COMMAND | R1_IDLE_STATE)) { + type(SD_CARD_TYPE_SD1); + break; + } + + // Get the last byte of r7 response for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); - if (status_ != 0xAA) { + if (status_ == 0xAA) { + type(SD_CARD_TYPE_SD2); + break; + } + + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { error(SD_CARD_ERROR_CMD8); goto FAIL; } - type(SD_CARD_TYPE_SD2); } + + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + // initialize card and send host supports SDHC if SD2 arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; - while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { // check for timeout if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { @@ -372,17 +327,12 @@ bool Sd2Card::init(uint8_t sckRateID, pin_t chipSelectPin) { // discard rest of ocr - contains allowed voltage range for (uint8_t i = 0; i < 3; i++) spiRec(); } - chipSelectHigh(); + chipDeselect(); - #if DISABLED(SOFTWARE_SPI) - return setSckRate(sckRateID); - #else // SOFTWARE_SPI - UNUSED(sckRateID); - return true; - #endif // SOFTWARE_SPI + return setSckRate(sckRateID); FAIL: - chipSelectHigh(); + chipDeselect(); return false; } @@ -405,7 +355,7 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { else if (readData(dst, 512)) return true; - chipSelectHigh(); + chipDeselect(); if (!--retryCnt) break; cardCommand(CMD12, 0); // Try sending a stop command, ignore the result. @@ -415,7 +365,7 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { #else if (cardCommand(CMD17, blockNumber)) { error(SD_CARD_ERROR_CMD17); - chipSelectHigh(); + chipDeselect(); return false; } else @@ -431,12 +381,13 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { * \return true for success, false for failure. */ bool Sd2Card::readData(uint8_t* dst) { - chipSelectLow(); + chipSelect(); return readData(dst, 512); } #if ENABLED(SD_CHECK_AND_RETRY) - static const uint16_t crctab[] PROGMEM = { + #ifdef FAST_CRC + static const uint16_t crctab16[] PROGMEM = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, @@ -470,19 +421,36 @@ bool Sd2Card::readData(uint8_t* dst) { 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; + // faster CRC-CCITT + // uses the x^16,x^12,x^5,x^1 polynomial. static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { - crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8); + crc = pgm_read_word(&crctab16[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8); } return crc; } + #else + // slower CRC-CCITT + // uses the x^16,x^12,x^5,x^1 polynomial. + static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + uint16_t crc = 0; + for (size_t i = 0; i < n; i++) { + crc = (uint8_t)(crc >> 8) | (crc << 8); + crc ^= data[i]; + crc ^= (uint8_t)(crc & 0xFF) >> 4; + crc ^= crc << 12; + crc ^= (crc & 0xFF) << 5; + } + return crc; + } + #endif #endif // SD_CHECK_AND_RETRY bool Sd2Card::readData(uint8_t* dst, uint16_t count) { // wait for start block token uint16_t t0 = millis(); - while ((status_ = spiRec()) == 0XFF) { + while ((status_ = spiRec()) == 0xFF) { if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto FAIL; @@ -497,11 +465,9 @@ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { #if ENABLED(SD_CHECK_AND_RETRY) { - uint16_t calcCrc = CRC_CCITT(dst, count); - uint16_t recvCrc = spiRec() << 8; - recvCrc |= spiRec(); - if (calcCrc != recvCrc) { - error(SD_CARD_ERROR_CRC); + uint16_t recvCrc = (spiRec() << 8) | spiRec(); + if (crcSupported && recvCrc != CRC_CCITT(dst, count)) { + error(SD_CARD_ERROR_READ_CRC); goto FAIL; } } @@ -510,14 +476,10 @@ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { spiRec(); spiRec(); #endif - chipSelectHigh(); - // Send an additional dummy byte, required by Toshiba Flash Air SD Card - spiSend(0XFF); + chipDeselect(); return true; FAIL: - chipSelectHigh(); - // Send an additional dummy byte, required by Toshiba Flash Air SD Card - spiSend(0XFF); + chipDeselect(); return false; } @@ -526,7 +488,7 @@ bool Sd2Card::readRegister(uint8_t cmd, void* buf) { uint8_t* dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); - chipSelectHigh(); + chipDeselect(); return false; } return readData(dst, 16); @@ -546,10 +508,10 @@ bool Sd2Card::readStart(uint32_t blockNumber) { if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; if (cardCommand(CMD18, blockNumber)) { error(SD_CARD_ERROR_CMD18); - chipSelectHigh(); + chipDeselect(); return false; } - chipSelectHigh(); + chipDeselect(); return true; } @@ -559,13 +521,13 @@ bool Sd2Card::readStart(uint32_t blockNumber) { * \return true for success, false for failure. */ bool Sd2Card::readStop() { - chipSelectLow(); + chipSelect(); if (cardCommand(CMD12, 0)) { error(SD_CARD_ERROR_CMD12); - chipSelectHigh(); + chipDeselect(); return false; } - chipSelectHigh(); + chipDeselect(); return true; } @@ -593,7 +555,7 @@ bool Sd2Card::setSckRate(uint8_t sckRateID) { // wait for card to go not busy bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { uint16_t t0 = millis(); - while (spiRec() != 0XFF) + while (spiRec() != 0xFF) if (((uint16_t)millis() - t0) >= timeoutMillis) return false; return true; @@ -625,10 +587,10 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { error(SD_CARD_ERROR_WRITE_PROGRAMMING); goto FAIL; } - chipSelectHigh(); + chipDeselect(); return true; FAIL: - chipSelectHigh(); + chipDeselect(); return false; } @@ -638,28 +600,33 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { * \return true for success, false for failure. */ bool Sd2Card::writeData(const uint8_t* src) { - chipSelectLow(); + chipSelect(); // wait for previous write to finish if (!waitNotBusy(SD_WRITE_TIMEOUT) || !writeData(WRITE_MULTIPLE_TOKEN, src)) { error(SD_CARD_ERROR_WRITE_MULTIPLE); - chipSelectHigh(); + chipDeselect(); return false; } - chipSelectHigh(); + chipDeselect(); return true; } // send one block of data for write block or write multiple blocks bool Sd2Card::writeData(uint8_t token, const uint8_t* src) { - spiSendBlock(token, src); - spiSend(0xFF); // dummy crc - spiSend(0xFF); // dummy crc +#if ENABLED(SD_CHECK_AND_RETRY) + uint16_t crc = CRC_CCITT( src, 512 ); +#else // ENABLED(SD_CHECK_AND_RETRY) + uint16_t crc = 0xFFFF; +#endif // ENABLED(SD_CHECK_AND_RETRY) + spiSendBlock( token, src ); + spiSend( crc >> 8 ); + spiSend( crc & 0XFF ); status_ = spiRec(); if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { error(SD_CARD_ERROR_WRITE); - chipSelectHigh(); + chipDeselect(); return false; } return true; @@ -688,10 +655,10 @@ bool Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { error(SD_CARD_ERROR_CMD25); goto FAIL; } - chipSelectHigh(); + chipDeselect(); return true; FAIL: - chipSelectHigh(); + chipDeselect(); return false; } @@ -701,15 +668,15 @@ bool Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { * \return true for success, false for failure. */ bool Sd2Card::writeStop() { - chipSelectLow(); + chipSelect(); if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL; spiSend(STOP_TRAN_TOKEN); if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL; - chipSelectHigh(); + chipDeselect(); return true; FAIL: error(SD_CARD_ERROR_STOP_TRAN); - chipSelectHigh(); + chipDeselect(); return false; } diff --git a/Marlin/Sd2Card.h b/Marlin/src/sd/Sd2Card.h similarity index 81% rename from Marlin/Sd2Card.h rename to Marlin/src/sd/Sd2Card.h index c831f23cd4..0df9c0ba64 100644 --- a/Marlin/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -34,15 +34,11 @@ #ifndef _SD2CARD_H_ #define _SD2CARD_H_ + #include "SdFatConfig.h" #include "SdInfo.h" -// SPI speed is F_CPU/2^(1 + index), 0 <= index <= 6 -uint8_t const SPI_FULL_SPEED = 0, // Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). - SPI_HALF_SPEED = 1, // Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). - SPI_QUARTER_SPEED = 2, // Set SCK rate to F_CPU/8. See Sd2Card::setSckRate(). - SPI_EIGHTH_SPEED = 3, // Set SCK rate to F_CPU/16. See Sd2Card::setSckRate(). - SPI_SIXTEENTH_SPEED = 4; // Set SCK rate to F_CPU/32. See Sd2Card::setSckRate(). +#include uint16_t const SD_INIT_TIMEOUT = 2000, // init timeout ms SD_ERASE_TIMEOUT = 10000, // erase timeout ms @@ -50,21 +46,21 @@ uint16_t const SD_INIT_TIMEOUT = 2000, // init timeout ms SD_WRITE_TIMEOUT = 600; // write time out ms // SD card errors -uint8_t const SD_CARD_ERROR_CMD0 = 0X1, // timeout error for command CMD0 (initialize card in SPI mode) - SD_CARD_ERROR_CMD8 = 0X2, // CMD8 was not accepted - not a valid SD card - SD_CARD_ERROR_CMD12 = 0X3, // card returned an error response for CMD12 (write stop) - SD_CARD_ERROR_CMD17 = 0X4, // card returned an error response for CMD17 (read block) - SD_CARD_ERROR_CMD18 = 0X5, // card returned an error response for CMD18 (read multiple block) - SD_CARD_ERROR_CMD24 = 0X6, // card returned an error response for CMD24 (write block) - SD_CARD_ERROR_CMD25 = 0X7, // WRITE_MULTIPLE_BLOCKS command failed - SD_CARD_ERROR_CMD58 = 0X8, // card returned an error response for CMD58 (read OCR) - SD_CARD_ERROR_ACMD23 = 0X9, // SET_WR_BLK_ERASE_COUNT failed - SD_CARD_ERROR_ACMD41 = 0XA, // ACMD41 initialization process timeout - SD_CARD_ERROR_BAD_CSD = 0XB, // card returned a bad CSR version field - SD_CARD_ERROR_ERASE = 0XC, // erase block group command failed - SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD, // card not capable of single block erase - SD_CARD_ERROR_ERASE_TIMEOUT = 0XE, // Erase sequence timed out - SD_CARD_ERROR_READ = 0XF, // card returned an error token instead of read data +uint8_t const SD_CARD_ERROR_CMD0 = 0x01, // timeout error for command CMD0 (initialize card in SPI mode) + SD_CARD_ERROR_CMD8 = 0x02, // CMD8 was not accepted - not a valid SD card + SD_CARD_ERROR_CMD12 = 0x03, // card returned an error response for CMD12 (write stop) + SD_CARD_ERROR_CMD17 = 0x04, // card returned an error response for CMD17 (read block) + SD_CARD_ERROR_CMD18 = 0x05, // card returned an error response for CMD18 (read multiple block) + SD_CARD_ERROR_CMD24 = 0x06, // card returned an error response for CMD24 (write block) + SD_CARD_ERROR_CMD25 = 0x07, // WRITE_MULTIPLE_BLOCKS command failed + SD_CARD_ERROR_CMD58 = 0x08, // card returned an error response for CMD58 (read OCR) + SD_CARD_ERROR_ACMD23 = 0x09, // SET_WR_BLK_ERASE_COUNT failed + SD_CARD_ERROR_ACMD41 = 0x0A, // ACMD41 initialization process timeout + SD_CARD_ERROR_BAD_CSD = 0x0B, // card returned a bad CSR version field + SD_CARD_ERROR_ERASE = 0x0C, // erase block group command failed + SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0x0D, // card not capable of single block erase + SD_CARD_ERROR_ERASE_TIMEOUT = 0x0E, // Erase sequence timed out + SD_CARD_ERROR_READ = 0x0F, // card returned an error token instead of read data SD_CARD_ERROR_READ_REG = 0x10, // read CID or CSD failed SD_CARD_ERROR_READ_TIMEOUT = 0x11, // timeout while waiting for start of read data SD_CARD_ERROR_STOP_TRAN = 0x12, // card did not accept STOP_TRAN_TOKEN @@ -75,7 +71,8 @@ uint8_t const SD_CARD_ERROR_CMD0 = 0X1, // timeout error for com SD_CARD_ERROR_WRITE_TIMEOUT = 0x17, // timeout occurred during write programming SD_CARD_ERROR_SCK_RATE = 0x18, // incorrect rate selected SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // init() not called - SD_CARD_ERROR_CRC = 0x20; // crc check error + // 0x1A is unused now, it was: card returned an error for CMD59 (CRC_ON_OFF) + SD_CARD_ERROR_READ_CRC = 0x1B; // invalid read CRC // card types uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD card @@ -89,9 +86,13 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 #define SOFTWARE_SPI #elif USE_SOFTWARE_SPI #define SOFTWARE_SPI -#endif - +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ // SPI pin definitions - do not edit here - change in SdFatConfig.h +// +#define SD_CHIP_SELECT_PIN SS_PIN + +#if 0 #if DISABLED(SOFTWARE_SPI) // hardware pin defs #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. @@ -106,6 +107,8 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 #define SPI_SCK_PIN SOFT_SPI_SCK_PIN // SPI Clock pin #endif // SOFTWARE_SPI +#endif + /** * \class Sd2Card * \brief Raw access to SD and SDHC flash memory cards. @@ -194,8 +197,8 @@ class Sd2Card { bool readData(uint8_t* dst, uint16_t count); bool readRegister(uint8_t cmd, void* buf); - void chipSelectHigh(); - void chipSelectLow(); + void chipDeselect(); + void chipSelect(); void type(uint8_t value) { type_ = value; } bool waitNotBusy(uint16_t timeoutMillis); bool writeData(uint8_t token, const uint8_t* src); diff --git a/Marlin/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp similarity index 99% rename from Marlin/SdBaseFile.cpp rename to Marlin/src/sd/SdBaseFile.cpp index 3460b24d3f..63e0740f62 100644 --- a/Marlin/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -27,13 +27,13 @@ * This file is part of the Arduino Sd2Card Library */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) #include "SdBaseFile.h" -#include "Marlin.h" +#include "../Marlin.h" SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory // callback function for date/time @@ -368,7 +368,7 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { // print size if requested if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) { SERIAL_CHAR(' '); - SERIAL_PROTOCOL(dir.fileSize); + SERIAL_ECHO(dir.fileSize); } SERIAL_EOL(); return DIR_IS_FILE(&dir) ? 1 : 2; @@ -601,7 +601,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t ofla // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { - index = 0XF & (dirFile->curPosition_ >> 5); + index = 0xF & (dirFile->curPosition_ >> 5); p = dirFile->readDirCache(); if (!p) return false; @@ -705,7 +705,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { return false; } // open cached entry - return openCachedEntry(index & 0XF, oflag); + return openCachedEntry(index & 0xF, oflag); } // open a cached directory entry. Assumes vol_ is initialized @@ -775,7 +775,7 @@ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { vol_ = dirFile->vol_; while (1) { - index = 0XF & (dirFile->curPosition_ >> 5); + index = 0xF & (dirFile->curPosition_ >> 5); // read entry into cache p = dirFile->readDirCache(); @@ -902,11 +902,10 @@ int SdBaseFile::peek() { return c; } - // print uint8_t with width 2 -static void print2u(uint8_t v) { +static void print2u(const uint8_t v) { if (v < 10) SERIAL_CHAR('0'); - SERIAL_PRINT(v, DEC); + SERIAL_ECHO_F(v, DEC); } /** @@ -927,7 +926,7 @@ static void print2u(uint8_t v) { * \param[in] fatDate The date field from a directory entry. */ void SdBaseFile::printFatDate(uint16_t fatDate) { - SERIAL_PROTOCOL(FAT_YEAR(fatDate)); + SERIAL_ECHO(FAT_YEAR(fatDate)); SERIAL_CHAR('-'); print2u(FAT_MONTH(fatDate)); SERIAL_CHAR('-'); @@ -959,7 +958,7 @@ void SdBaseFile::printFatTime(uint16_t fatTime) { bool SdBaseFile::printName() { char name[FILENAME_LENGTH]; if (!getFilename(name)) return false; - SERIAL_PROTOCOL(name); + SERIAL_ECHO(name); return true; } @@ -1104,7 +1103,7 @@ dir_t* SdBaseFile::readDirCache() { if (!isDir()) return 0; // index of entry in cache - i = (curPosition_ >> 5) & 0XF; + i = (curPosition_ >> 5) & 0xF; // use read to locate and cache block if (read() < 0) return 0; @@ -1726,8 +1725,4 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { return -1; } -#if ALLOW_DEPRECATED_FUNCTIONS - void (*SdBaseFile::oldDateTime_)(uint16_t &date, uint16_t &time) = 0; -#endif - #endif // SDSUPPORT diff --git a/Marlin/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h similarity index 76% rename from Marlin/SdBaseFile.h rename to Marlin/src/sd/SdBaseFile.h index 425c65f9b2..d8139d20c0 100644 --- a/Marlin/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -34,9 +34,12 @@ #ifndef _SDBASEFILE_H_ #define _SDBASEFILE_H_ + #include "SdFatConfig.h" #include "SdVolume.h" +#include + /** * \struct filepos_t * \brief internal type for istream @@ -383,119 +386,6 @@ class SdBaseFile { bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); dir_t* readDirCache(); - -// Deprecated functions -#if ALLOW_DEPRECATED_FUNCTIONS - public: - - /** - * \deprecated Use: - * bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); - * \param[out] bgnBlock the first block address for the file. - * \param[out] endBlock the last block address for the file. - * \return true for success or false for failure. - */ - bool contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { - return contiguousRange(&bgnBlock, &endBlock); - } - - /** - * \deprecated Use: - * bool createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) - * \param[in] dirFile The directory where the file will be created. - * \param[in] path A path with a valid DOS 8.3 file name. - * \param[in] size The desired file size. - * \return true for success or false for failure. - */ - bool createContiguous(SdBaseFile& dirFile, const char* path, uint32_t size) { - return createContiguous(&dirFile, path, size); - } - - /** - * \deprecated Use: - * static void dateTimeCallback( - * void (*dateTime)(uint16_t* date, uint16_t* time)); - * \param[in] dateTime The user's call back function. - */ - static void dateTimeCallback( - void (*dateTime)(uint16_t &date, uint16_t &time)) { - oldDateTime_ = dateTime; - dateTime_ = dateTime ? oldToNew : 0; - } - - /** - * \deprecated Use: - * bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); - * \param[in] dirFile An open SdFat instance for the directory containing the - * file to be opened. - * \param[in] path A path with a valid 8.3 DOS name for the file. - * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive - * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. - * \return true for success or false for failure. - */ - bool open(SdBaseFile& dirFile, const char* path, uint8_t oflag) { - return open(&dirFile, path, oflag); - } - - /** - * \deprecated Do not use in new apps - * \param[in] dirFile An open SdFat instance for the directory containing the - * file to be opened. - * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. - * \return true for success or false for failure. - */ - bool open(SdBaseFile& dirFile, const char* path) { - return open(dirFile, path, O_RDWR); - } - - /** - * \deprecated Use: - * bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); - * \param[in] dirFile An open SdFat instance for the directory. - * \param[in] index The \a index of the directory entry for the file to be - * opened. The value for \a index is (directory file position)/32. - * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive - * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. - * \return true for success or false for failure. - */ - bool open(SdBaseFile& dirFile, uint16_t index, uint8_t oflag) { - return open(&dirFile, index, oflag); - } - - /** - * \deprecated Use: bool openRoot(SdVolume* vol); - * \param[in] vol The FAT volume containing the root directory to be opened. - * \return true for success or false for failure. - */ - bool openRoot(SdVolume& vol) { return openRoot(&vol); } - - /** - * \deprecated Use: int8_t readDir(dir_t* dir); - * \param[out] dir The dir_t struct that will receive the data. - * \return bytes read for success zero for eof or -1 for failure. - */ - int8_t readDir(dir_t& dir, char* longFilename) { - return readDir(&dir, longFilename); - } - - /** - * \deprecated Use: - * static uint8_t remove(SdBaseFile* dirFile, const char* path); - * \param[in] dirFile The directory that contains the file. - * \param[in] path The name of the file to be removed. - * \return true for success or false for failure. - */ - static bool remove(SdBaseFile& dirFile, const char* path) { return remove(&dirFile, path); } - - private: - static void (*oldDateTime_)(uint16_t &date, uint16_t &time); - static void oldToNew(uint16_t * const date, uint16_t * const time) { - uint16_t d, t; - oldDateTime_(d, t); - *date = d; - *time = t; - } -#endif // ALLOW_DEPRECATED_FUNCTIONS }; #endif // _SDBASEFILE_H_ diff --git a/Marlin/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h similarity index 96% rename from Marlin/SdFatConfig.h rename to Marlin/src/sd/SdFatConfig.h index 606a66f171..d2c769a014 100644 --- a/Marlin/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -31,7 +31,8 @@ #ifndef _SDFATCONFIG_H_ #define _SDFATCONFIG_H_ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" + /** * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. @@ -61,11 +62,6 @@ */ #define ENDL_CALLS_FLUSH 0 -/** - * Allow use of deprecated functions if ALLOW_DEPRECATED_FUNCTIONS is nonzero - */ -#define ALLOW_DEPRECATED_FUNCTIONS 1 - /** * Allow FAT12 volumes if FAT12_SUPPORT is nonzero. * FAT12 has not been well tested. diff --git a/Marlin/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h similarity index 99% rename from Marlin/SdFatStructs.h rename to Marlin/src/sd/SdFatStructs.h index 7257f3617a..7b84b1ad0c 100644 --- a/Marlin/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -34,6 +34,8 @@ #ifndef SDFATSTRUCTS_H #define SDFATSTRUCTS_H +#include + #define PACKED __attribute__((__packed__)) /** diff --git a/Marlin/src/sd/SdFatUtil.cpp b/Marlin/src/sd/SdFatUtil.cpp new file mode 100644 index 0000000000..1110d1dc9c --- /dev/null +++ b/Marlin/src/sd/SdFatUtil.cpp @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ + +/** + * Arduino SdFat Library + * Copyright (C) 2008 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "SdFatUtil.h" + +/** + * Amount of free RAM + * \return The number of free bytes. + */ +#ifdef __arm__ + + extern "C" char* sbrk(int incr); + int SdFatUtil::FreeRam() { + char top; + return &top - reinterpret_cast(sbrk(0)); + } + +#else + + extern char* __brkval; + extern char __bss_end; + int SdFatUtil::FreeRam() { + char top; + return __brkval ? &top - __brkval : &top - &__bss_end; + } + +#endif + +#endif // SDSUPPORT diff --git a/Marlin/SdFatUtil.h b/Marlin/src/sd/SdFatUtil.h similarity index 78% rename from Marlin/SdFatUtil.h rename to Marlin/src/sd/SdFatUtil.h index 793ba2f078..1deb1eb8f3 100644 --- a/Marlin/SdFatUtil.h +++ b/Marlin/src/sd/SdFatUtil.h @@ -29,21 +29,15 @@ #ifndef _SDFATUTIL_H_ #define _SDFATUTIL_H_ +#include + /** * \file * \brief Useful utility functions. */ -/** Store and print a string in flash memory.*/ -#define PgmPrint(x) SerialPrint_P(PSTR(x)) -/** Store and print a string in flash memory followed by a CR/LF.*/ -#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) namespace SdFatUtil { int FreeRam(); - void print_P(PGM_P str); - void println_P(PGM_P str); - void SerialPrint_P(PGM_P str); - void SerialPrintln_P(PGM_P str); } using namespace SdFatUtil; // NOLINT diff --git a/Marlin/SdFile.cpp b/Marlin/src/sd/SdFile.cpp similarity index 98% rename from Marlin/SdFile.cpp rename to Marlin/src/sd/SdFile.cpp index 45d18e01b3..18b0324001 100644 --- a/Marlin/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -26,7 +26,8 @@ * * This file is part of the Arduino Sd2Card Library */ -#include "MarlinConfig.h" + +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) diff --git a/Marlin/SdFile.h b/Marlin/src/sd/SdFile.h similarity index 94% rename from Marlin/SdFile.h rename to Marlin/src/sd/SdFile.h index 36d6862d8d..dd250110a1 100644 --- a/Marlin/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -35,13 +35,15 @@ #define _SDFILE_H_ #include "SdBaseFile.h" -#include + +#include +#include /** * \class SdFile * \brief SdBaseFile with Print. */ -class SdFile : public SdBaseFile, public Print { +class SdFile : public SdBaseFile/*, public Print*/ { public: SdFile() {} SdFile(const char* name, uint8_t oflag); diff --git a/Marlin/SdInfo.h b/Marlin/src/sd/SdInfo.h similarity index 97% rename from Marlin/SdInfo.h rename to Marlin/src/sd/SdInfo.h index 9fe121f168..91cb35da9e 100644 --- a/Marlin/SdInfo.h +++ b/Marlin/src/sd/SdInfo.h @@ -54,12 +54,13 @@ uint8_t const CMD0 = 0x00, // GO_IDLE_STATE - init card in spi mode if CS low CMD24 = 0x18, // WRITE_BLOCK - write a single data block to the card CMD25 = 0x19, // WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION CMD32 = 0x20, // ERASE_WR_BLK_START - sets the address of the first block to be erased - CMD33 = 0x21, // ERASE_WR_BLK_END - sets the address of the last block of the continuous range to be erased*/ - CMD38 = 0x26, // ERASE - erase all previously selected blocks */ - CMD55 = 0x37, // APP_CMD - escape for application specific command */ - CMD58 = 0x3A, // READ_OCR - read the OCR register of a card */ - ACMD23 = 0x17, // SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be pre-erased before writing */ - ACMD41 = 0x29; // SD_SEND_OP_COMD - Sends host capacity support information and activates the card's initialization process */ + CMD33 = 0x21, // ERASE_WR_BLK_END - sets the address of the last block of the continuous range to be erased + CMD38 = 0x26, // ERASE - erase all previously selected blocks + CMD55 = 0x37, // APP_CMD - escape for application specific command + CMD58 = 0x3A, // READ_OCR - read the OCR register of a card + CMD59 = 0x3B, // CRC_ON_OFF - enable or disable CRC checking + ACMD23 = 0x17, // SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be pre-erased before writing + ACMD41 = 0x29; // SD_SEND_OP_COMD - Sends host capacity support information and activates the card's initialization process /** status for card in the ready state */ uint8_t const R1_READY_STATE = 0x00; diff --git a/Marlin/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp similarity index 98% rename from Marlin/SdVolume.cpp rename to Marlin/src/sd/SdVolume.cpp index bf8abc5797..a872eb19d8 100644 --- a/Marlin/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -26,12 +26,15 @@ * * This file is part of the Arduino Sd2Card Library */ -#include "MarlinConfig.h" + +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) #include "SdVolume.h" +#include "../Marlin.h" + #if !USE_MULTIPLE_CARDS // raw block cache uint32_t SdVolume::cacheBlockNumber_; // current block number @@ -204,7 +207,7 @@ bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { index &= 0x1FF; uint8_t tmp = value; if (cluster & 1) { - tmp = (cacheBuffer_.data[index] & 0XF) | tmp << 4; + tmp = (cacheBuffer_.data[index] & 0xF) | tmp << 4; } cacheBuffer_.data[index] = tmp; index++; diff --git a/Marlin/SdVolume.h b/Marlin/src/sd/SdVolume.h similarity index 92% rename from Marlin/SdVolume.h rename to Marlin/src/sd/SdVolume.h index 7cde194ebe..d67d98f8be 100644 --- a/Marlin/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -38,6 +38,8 @@ #include "Sd2Card.h" #include "SdFatStructs.h" +#include + //============================================================================== // SdVolume class /** @@ -188,24 +190,6 @@ class SdVolume { } bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst); } bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); } - - // Deprecated functions - #if ALLOW_DEPRECATED_FUNCTIONS - public: - /** - * \deprecated Use: bool SdVolume::init(Sd2Card* dev); - * \param[in] dev The SD card where the volume is located. - * \return true for success or false for failure. - */ - bool init(Sd2Card& dev) { return init(&dev); } - /** - * \deprecated Use: bool SdVolume::init(Sd2Card* dev, uint8_t vol); - * \param[in] dev The SD card where the volume is located. - * \param[in] part The partition to be used. - * \return true for success or false for failure. - */ - bool init(Sd2Card& dev, uint8_t part) { return init(&dev, part); } - #endif // ALLOW_DEPRECATED_FUNCTIONS }; #endif // _SDVOLUME_H_ diff --git a/Marlin/cardreader.cpp b/Marlin/src/sd/cardreader.cpp similarity index 82% rename from Marlin/cardreader.cpp rename to Marlin/src/sd/cardreader.cpp index 38c6d1001f..159086c82e 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -20,21 +20,29 @@ * */ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) #include "cardreader.h" -#include "ultralcd.h" -#include "stepper.h" -#include "language.h" -#include "printcounter.h" +#include "../Marlin.h" +#include "../lcd/ultralcd.h" +#include "../module/planner.h" +#include "../module/printcounter.h" +#include "../core/language.h" +#include "../gcode/queue.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "power_loss_recovery.h" + #include "../feature/power_loss_recovery.h" #endif +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" +#endif + +#include + #define LONGEST_FILENAME (longFilename[0] ? longFilename : filename) CardReader::CardReader() { @@ -83,30 +91,34 @@ char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters uint16_t nrFile_index; -void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) { +void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/ + #if NUM_SERIAL > 1 + , const int8_t port/*= -1*/ + #endif +) { dir_t p; uint8_t cnt = 0; // Read the next entry from a directory - while (parent.readDir(p, longFilename) > 0) { + while (parent.readDir(&p, longFilename) > 0) { // If the entry is a directory and the action is LS_SerialPrint if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) { // Get the short name for the item, which we know is a folder - char lfilename[FILENAME_LENGTH]; - createFilename(lfilename, p); + char dosFilename[FILENAME_LENGTH]; + createFilename(dosFilename, p); // Allocate enough stack space for the full path to a folder, trailing slash, and nul - bool prepend_is_empty = (prepend[0] == '\0'); - int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1; + const bool prepend_is_empty = (!prepend || prepend[0] == '\0'); + const int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(dosFilename) + 1 + 1; char path[len]; // Append the FOLDERNAME12/ to the passed string. // It contains the full path to the "parent" argument. // We now have the full path to the item in this folder. strcpy(path, prepend_is_empty ? "/" : prepend); // root slash if prepend is empty - strcat(path, lfilename); // FILENAME_LENGTH-1 characters maximum + strcat(path, dosFilename); // FILENAME_LENGTH-1 characters maximum strcat(path, "/"); // 1 character // Serial.print(path); @@ -114,14 +126,18 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m // Get a new directory object using the full path // and dive recursively into it. SdFile dir; - if (!dir.open(parent, lfilename, O_READ)) { + if (!dir.open(&parent, dosFilename, O_READ)) { if (lsAction == LS_SerialPrint) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_SD_CANT_OPEN_SUBDIR); - SERIAL_ECHOLN(lfilename); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, MSG_SD_CANT_OPEN_SUBDIR); + SERIAL_ECHOLN_P(port, dosFilename); } } - lsDive(path, dir); + lsDive(path, dir + #if NUM_SERIAL > 1 + , NULL, port + #endif + ); // close() is done automatically by destructor of SdFile } else { @@ -143,10 +159,10 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m case LS_SerialPrint: createFilename(filename, p); - if (prepend) SERIAL_PROTOCOL(prepend); - SERIAL_PROTOCOL(filename); - SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOLLN(p.fileSize); + if (prepend) SERIAL_PROTOCOL_P(port, prepend); + SERIAL_PROTOCOL_P(port, filename); + SERIAL_PROTOCOLCHAR_P(port, ' '); + SERIAL_PROTOCOLLN_P(port, p.fileSize); break; case LS_GetFilename: @@ -163,10 +179,18 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m } // while readDir } -void CardReader::ls() { +void CardReader::ls( + #if NUM_SERIAL > 1 + const int8_t port + #endif +) { lsAction = LS_SerialPrint; root.rewind(); - lsDive(NULL, root); + lsDive(NULL, root + #if NUM_SERIAL > 1 + , NULL, port + #endif + ); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) @@ -174,12 +198,16 @@ void CardReader::ls() { /** * Get a long pretty path based on a DOS 8.3 path */ - void CardReader::printLongPath(char *path) { + void CardReader::printLongPath(char *path + #if NUM_SERIAL > 1 + , const int8_t port/*= -1*/ + #endif + ) { lsAction = LS_GetFilename; int i, pathLen = strlen(path); - // SERIAL_ECHOPGM("Full Path: "); SERIAL_ECHOLN(path); + // SERIAL_ECHOPGM_P(port, "Full Path: "); SERIAL_ECHOLN_P(port, path); // Zero out slashes to make segments for (i = 0; i < pathLen; i++) if (path[i] == '/') path[i] = '\0'; @@ -197,28 +225,32 @@ void CardReader::ls() { // Go to the next segment while (path[++i]) { } - // SERIAL_ECHOPGM("Looking for segment: "); SERIAL_ECHOLN(segment); + // SERIAL_ECHOPGM_P(port, "Looking for segment: "); SERIAL_ECHOLN_P(port, segment); // Find the item, setting the long filename diveDir.rewind(); - lsDive(NULL, diveDir, segment); + lsDive(NULL, diveDir, segment + #if NUM_SERIAL > 1 + , port + #endif + ); // Print /LongNamePart to serial output - SERIAL_PROTOCOLCHAR('/'); - SERIAL_PROTOCOL(longFilename[0] ? longFilename : "???"); + SERIAL_PROTOCOLCHAR_P(port, '/'); + SERIAL_PROTOCOL_P(port, longFilename[0] ? longFilename : "???"); // If the filename was printed then that's it if (!filenameIsDir) break; - // SERIAL_ECHOPGM("Opening dir: "); SERIAL_ECHOLN(segment); + // SERIAL_ECHOPGM_P(port, "Opening dir: "); SERIAL_ECHOLN_P(port, segment); // Open the sub-item as the new dive parent SdFile dir; - if (!dir.open(diveDir, segment, O_READ)) { - SERIAL_EOL(); - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_SD_CANT_OPEN_SUBDIR); - SERIAL_ECHO(segment); + if (!dir.open(&diveDir, segment, O_READ)) { + SERIAL_EOL_P(port); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, MSG_SD_CANT_OPEN_SUBDIR); + SERIAL_ECHO_P(port, segment); break; } @@ -227,7 +259,7 @@ void CardReader::ls() { } // while i 1 + const int8_t port/*= -1*/ + #endif +) { if (file.isOpen()) { - char lfilename[FILENAME_LENGTH]; - file.getFilename(lfilename); - SERIAL_ECHO(lfilename); + char dosFilename[FILENAME_LENGTH]; + file.getFilename(dosFilename); + SERIAL_ECHO_P(port, dosFilename); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - getfilename(0, lfilename); + getfilename(0, dosFilename); if (longFilename[0]) { - SERIAL_ECHO(' '); - SERIAL_ECHO(longFilename); + SERIAL_ECHO_P(port, ' '); + SERIAL_ECHO_P(port, longFilename); } #endif } else - SERIAL_ECHOPGM("(no file)"); + SERIAL_ECHOPGM_P(port, "(no file)"); - SERIAL_EOL(); + SERIAL_EOL_P(port); } void CardReader::initsd() { @@ -262,16 +298,16 @@ void CardReader::initsd() { #define SPI_SPEED SPI_FULL_SPEED #endif - if (!card.init(SPI_SPEED, SDSS) + if (!sd2card.init(SPI_SPEED, SDSS) #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) - && !card.init(SPI_SPEED, LCD_SDSS) + && !sd2card.init(SPI_SPEED, LCD_SDSS) #endif ) { - //if (!card.init(SPI_HALF_SPEED,SDSS)) + //if (!sd2card.init(SPI_HALF_SPEED,SDSS)) SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(MSG_SD_INIT_FAIL); } - else if (!volume.init(&card)) { + else if (!volume.init(&sd2card)) { SERIAL_ERROR_START(); SERIAL_ERRORLNPGM(MSG_SD_VOL_INIT_FAIL); } @@ -287,17 +323,6 @@ void CardReader::initsd() { setroot(); } -void CardReader::setroot() { - /*if (!workDir.openRoot(&volume)) { - SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL); - }*/ - workDir = root; - curDir = &workDir; - #if ENABLED(SDCARD_SORT_ALPHA) - presort(); - #endif -} - void CardReader::release() { sdprinting = false; cardOK = false; @@ -335,9 +360,9 @@ void CardReader::stopSDPrint( #endif } -void CardReader::openLogFile(char* name) { +void CardReader::openLogFile(char * const path) { logging = true; - openFile(name, false); + openFile(path, false); } void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) { @@ -360,7 +385,7 @@ void CardReader::getAbsFilename(char *t) { *t = '\0'; } -void CardReader::openFile(char* name, const bool read, const bool subcall/*=false*/) { +void CardReader::openFile(char * const path, const bool read, const bool subcall/*=false*/) { if (!cardOK) return; @@ -380,7 +405,7 @@ void CardReader::openFile(char* name, const bool read, const bool subcall/*=fals filespos[file_subcall_ctr] = sdpos; SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", name); + SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", path); SERIAL_ECHOPAIR("\" parent:\"", proc_filenames[file_subcall_ctr]); SERIAL_ECHOLNPAIR("\" pos", sdpos); file_subcall_ctr++; @@ -401,48 +426,14 @@ void CardReader::openFile(char* name, const bool read, const bool subcall/*=fals SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); - SERIAL_ECHOLNPAIR(" file: ", name); + SERIAL_ECHOLNPAIR(" file: ", path); } stopSDPrint(); - SdFile myDir; - curDir = &root; - char *fname = name; - char *dirname_start, *dirname_end; - - if (name[0] == '/') { - dirname_start = &name[1]; - while (dirname_start != NULL) { - dirname_end = strchr(dirname_start, '/'); - //SERIAL_ECHOPGM("start:");SERIAL_ECHOLN((int)(dirname_start - name)); - //SERIAL_ECHOPGM("end :");SERIAL_ECHOLN((int)(dirname_end - name)); - if (dirname_end != NULL && dirname_end > dirname_start) { - char subdirname[FILENAME_LENGTH]; - strncpy(subdirname, dirname_start, dirname_end - dirname_start); - subdirname[dirname_end - dirname_start] = '\0'; - if (!myDir.open(curDir, subdirname, O_READ)) { - SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, subdirname); - SERIAL_PROTOCOLCHAR('.'); - return; - } - else { - //SERIAL_ECHOLNPGM("dive ok"); - } - - curDir = &myDir; - dirname_start = dirname_end + 1; - } - else { // the remainder after all /fsa/fdsa/ is the filename - fname = dirname_start; - //SERIAL_ECHOLNPGM("remainder"); - //SERIAL_ECHOLN(fname); - break; - } - } - } - else - curDir = &workDir; // Relative paths start in current directory + SdFile *curDir; + const char * const fname = diveToFile(curDir, path, false); + if (!fname) return; if (read) { if (file.open(curDir, fname, O_READ)) { @@ -472,7 +463,7 @@ void CardReader::openFile(char* name, const bool read, const bool subcall/*=fals } else { saving = true; - SERIAL_PROTOCOLLNPAIR(MSG_SD_WRITE_TO_FILE, name); + SERIAL_PROTOCOLLNPAIR(MSG_SD_WRITE_TO_FILE, path); lcd_setstatus(fname); } } @@ -483,40 +474,9 @@ void CardReader::removeFile(const char * const name) { stopSDPrint(); - SdFile myDir; - curDir = &root; - const char *fname = name; - - char *dirname_start, *dirname_end; - if (name[0] == '/') { - dirname_start = strchr(name, '/') + 1; - while (dirname_start != NULL) { - dirname_end = strchr(dirname_start, '/'); - //SERIAL_ECHOPGM("start:");SERIAL_ECHOLN((int)(dirname_start - name)); - //SERIAL_ECHOPGM("end :");SERIAL_ECHOLN((int)(dirname_end - name)); - if (dirname_end != NULL && dirname_end > dirname_start) { - char subdirname[FILENAME_LENGTH]; - strncpy(subdirname, dirname_start, dirname_end - dirname_start); - subdirname[dirname_end - dirname_start] = 0; - SERIAL_ECHOLN(subdirname); - if (!myDir.open(curDir, subdirname, O_READ)) { - SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, subdirname); - SERIAL_PROTOCOLCHAR('.'); - SERIAL_EOL(); - return; - } - - curDir = &myDir; - dirname_start = dirname_end + 1; - } - else { - fname = dirname_start; - break; - } - } - } - else // Relative paths are rooted in the current directory - curDir = &workDir; + SdFile *curDir; + const char * const fname = diveToFile(curDir, name, false); + if (!fname) return; if (file.remove(curDir, fname)) { SERIAL_PROTOCOLPGM("File deleted:"); @@ -533,15 +493,19 @@ void CardReader::removeFile(const char * const name) { } } -void CardReader::getStatus() { +void CardReader::getStatus( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif +) { if (cardOK && sdprinting) { - SERIAL_PROTOCOLPGM(MSG_SD_PRINTING_BYTE); - SERIAL_PROTOCOL(sdpos); - SERIAL_PROTOCOLCHAR('/'); - SERIAL_PROTOCOLLN(filesize); + SERIAL_PROTOCOLPGM_P(port, MSG_SD_PRINTING_BYTE); + SERIAL_PROTOCOL_P(port, sdpos); + SERIAL_PROTOCOLCHAR_P(port, '/'); + SERIAL_PROTOCOLLN_P(port, filesize); } else - SERIAL_PROTOCOLLNPGM(MSG_SD_NOT_PRINTING); + SERIAL_PROTOCOLLNPGM_P(port, MSG_SD_NOT_PRINTING); } void CardReader::write_command(char *buf) { @@ -582,7 +546,7 @@ void CardReader::checkautostart() { sprintf_P(autoname, PSTR("auto%i.g"), autostart_index); dir_t p; root.rewind(); - while (root.readDir(p, NULL) > 0) { + while (root.readDir(&p, NULL) > 0) { for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { openAndPrintFile(autoname); @@ -612,6 +576,7 @@ void CardReader::closefile(const bool store_location) { /** * Get the name of a file in the current directory by index + * with optional name to match. */ void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) { #if ENABLED(SDSORT_CACHE_NAMES) @@ -628,35 +593,59 @@ void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) { return; } #endif // SDSORT_CACHE_NAMES - curDir = &workDir; lsAction = LS_GetFilename; nrFile_index = nr; - curDir->rewind(); - lsDive(NULL, *curDir, match); + workDir.rewind(); + lsDive(NULL, workDir, match); } uint16_t CardReader::getnrfilenames() { - curDir = &workDir; lsAction = LS_Count; nrFiles = 0; - curDir->rewind(); - lsDive(NULL, *curDir); + workDir.rewind(); + lsDive(NULL, workDir); //SERIAL_ECHOLN(nrFiles); return nrFiles; } +/** + * Dive to the given file path, with optional echo. + * On exit set curDir and return the name part of the path. + * A NULL result indicates an unrecoverable error. + */ +const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, const bool echo) { + SdFile myDir; + if (path[0] != '/') { curDir = &workDir; return path; } + + curDir = &root; + const char *dirname_start = &path[1]; + while (dirname_start) { + char * const dirname_end = strchr(dirname_start, '/'); + if (dirname_end <= dirname_start) break; + const uint8_t len = dirname_end - dirname_start; + char dosSubdirname[len + 1]; + strncpy(dosSubdirname, dirname_start, len); + dosSubdirname[len] = 0; + + if (echo) SERIAL_ECHOLN(dosSubdirname); + + if (!myDir.open(curDir, dosSubdirname, O_READ)) { + SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, dosSubdirname); + SERIAL_PROTOCOLCHAR('.'); + SERIAL_EOL(); + return NULL; + } + curDir = &myDir; + dirname_start = dirname_end + 1; + } + return dirname_start; +} + void CardReader::chdir(const char * relpath) { SdFile newDir; - SdFile *parent = &root; + SdFile *parent = workDir.isOpen() ? &workDir : &root; - if (workDir.isOpen()) parent = &workDir; - - if (!newDir.open(*parent, relpath, O_READ)) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR); - SERIAL_ECHOLN(relpath); - } - else { + if (newDir.open(parent, relpath, O_READ)) { workDir = newDir; if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = workDir; @@ -664,6 +653,11 @@ void CardReader::chdir(const char * relpath) { presort(); #endif } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR); + SERIAL_ECHOLN(relpath); + } } int8_t CardReader::updir() { @@ -676,6 +670,16 @@ int8_t CardReader::updir() { return workDirDepth; } +void CardReader::setroot() { + /*if (!workDir.openRoot(&volume)) { + SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL); + }*/ + workDir = root; + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif +} + #if ENABLED(SDCARD_SORT_ALPHA) /** @@ -921,7 +925,7 @@ uint16_t CardReader::get_num_Files() { } void CardReader::printingHasFinished() { - stepper.synchronize(); + planner.synchronize(); file.close(); if (file_subcall_ctr > 0) { // Heading up to a parent file that called current as a procedure. file_subcall_ctr--; @@ -941,7 +945,7 @@ void CardReader::printingHasFinished() { #endif #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) - stepper.cleaning_buffer_counter = 1; // The command will fire from the Stepper ISR + planner.finish_and_disable(); #endif print_job_timer.stop(); if (print_job_timer.duration() > 60) @@ -961,12 +965,19 @@ void CardReader::printingHasFinished() { #if ENABLED(AUTO_REPORT_SD_STATUS) uint8_t CardReader::auto_report_sd_interval = 0; millis_t CardReader::next_sd_report_ms; + #if NUM_SERIAL > 1 + int8_t CardReader::serialport; + #endif void CardReader::auto_report_sd_status() { millis_t current_ms = millis(); if (auto_report_sd_interval && ELAPSED(current_ms, next_sd_report_ms)) { next_sd_report_ms = current_ms + 1000UL * auto_report_sd_interval; - getStatus(); + getStatus( + #if NUM_SERIAL > 1 + serialport + #endif + ); } } #endif // AUTO_REPORT_SD_STATUS diff --git a/Marlin/cardreader.h b/Marlin/src/sd/cardreader.h similarity index 86% rename from Marlin/cardreader.h rename to Marlin/src/sd/cardreader.h index c74a45048d..276b7b7b3d 100644 --- a/Marlin/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -23,7 +23,7 @@ #ifndef _CARDREADER_H_ #define _CARDREADER_H_ -#include "MarlinConfig.h" +#include "../inc/MarlinConfig.h" #if ENABLED(SDSUPPORT) @@ -32,8 +32,6 @@ #define MAX_DIR_DEPTH 10 // Maximum folder depth #include "SdFile.h" -#include "types.h" -#include "enum.h" class CardReader { public: @@ -45,8 +43,8 @@ public: void beginautostart(); void checkautostart(); - void openFile(char* name, const bool read, const bool subcall=false); - void openLogFile(char* name); + void openFile(char * const path, const bool read, const bool subcall=false); + void openLogFile(char * const path); void removeFile(const char * const name); void closefile(const bool store_location=false); void release(); @@ -57,12 +55,24 @@ public: const bool re_sort=false #endif ); - void getStatus(); + void getStatus( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); void printingHasFinished(); - void printFilename(); + void printFilename( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - void printLongPath(char *path); + void printLongPath(char *path + #if NUM_SERIAL > 1 + , const int8_t port = -1 + #endif + ); #endif void getfilename(uint16_t nr, const char* const match=NULL); @@ -70,11 +80,17 @@ public: void getAbsFilename(char *t); - void ls(); + void ls( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); void chdir(const char *relpath); int8_t updir(); void setroot(); + const char* diveToFile(SdFile*& curDir, const char * const path, const bool echo); + uint16_t get_num_Files(); #if ENABLED(SDCARD_SORT_ALPHA) @@ -105,21 +121,30 @@ public: FORCE_INLINE uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } FORCE_INLINE char* getWorkDirName() { workDir.getFilename(filename); return filename; } + Sd2Card& getSd2Card() { return sd2card; } + #if ENABLED(AUTO_REPORT_SD_STATUS) void auto_report_sd_status(void); - FORCE_INLINE void set_auto_report_interval(uint8_t v) { + FORCE_INLINE void set_auto_report_interval(uint8_t v + #if NUM_SERIAL > 1 + , int8_t port + #endif + ) { + #if NUM_SERIAL > 1 + serialport = port; + #endif NOMORE(v, 60); auto_report_sd_interval = v; next_sd_report_ms = millis() + 1000UL * v; } #endif +public: bool saving, logging, sdprinting, cardOK, filenameIsDir; char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH]; int autostart_index; - private: - SdFile root, *curDir, workDir, workDirParents[MAX_DIR_DEPTH]; + SdFile root, workDir, workDirParents[MAX_DIR_DEPTH]; uint8_t workDirDepth; // Sort files and folders alphabetically. @@ -172,7 +197,7 @@ private: #endif // SDCARD_SORT_ALPHA - Sd2Card card; + Sd2Card sd2card; SdVolume volume; SdFile file; @@ -190,7 +215,11 @@ private: LsAction lsAction; //stored for recursion. uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. char* diveDirName; - void lsDive(const char *prepend, SdFile parent, const char * const match=NULL); + void lsDive(const char *prepend, SdFile parent, const char * const match=NULL + #if NUM_SERIAL > 1 + , const int8_t port = -1 + #endif + ); #if ENABLED(SDCARD_SORT_ALPHA) void flush_presort(); @@ -199,6 +228,9 @@ private: #if ENABLED(AUTO_REPORT_SD_STATUS) static uint8_t auto_report_sd_interval; static millis_t next_sd_report_ms; + #if NUM_SERIAL > 1 + static int8_t serialport; + #endif #endif }; diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp deleted file mode 100644 index 1f03e3ccb3..0000000000 --- a/Marlin/stepper.cpp +++ /dev/null @@ -1,2467 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * stepper.cpp - A singleton object to execute motion plans using stepper motors - * Marlin Firmware - * - * Derived from Grbl - * Copyright (c) 2009-2011 Simen Svale Skogsrud - * - * Grbl 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 3 of the License, or - * (at your option) any later version. - * - * Grbl 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 Grbl. If not, see . - */ - -/** - * Timer calculations informed by the 'RepRap cartesian firmware' by Zack Smith - * and Philipp Tiefenbacher. - */ - -/** - * Jerk controlled movements planner added Apr 2018 by Eduardo José Tagle. - * Equations based on Synthethos TinyG2 sources, but the fixed-point - * implementation is new, as we are running the ISR with a variable period. - */ - -#include "Marlin.h" -#include "stepper.h" -#include "endstops.h" -#include "planner.h" -#include "temperature.h" -#include "ultralcd.h" -#include "language.h" -#include "cardreader.h" -#include "speed_lookuptable.h" - -#if HAS_DIGIPOTSS - #include -#endif - -Stepper stepper; // Singleton - -// public: - -block_t* Stepper::current_block = NULL; // A pointer to the block currently being traced - -#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - bool Stepper::abort_on_endstop_hit = false; -#endif - -#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - bool Stepper::performing_homing = false; -#endif - -#if HAS_MOTOR_CURRENT_PWM - uint32_t Stepper::motor_current_setting[3]; // Initialized by settings.load() -#endif - -// private: - -uint8_t Stepper::last_direction_bits = 0; // The next stepping-bits to be output -int16_t Stepper::cleaning_buffer_counter = 0; - -#if ENABLED(X_DUAL_ENDSTOPS) - bool Stepper::locked_x_motor = false, Stepper::locked_x2_motor = false; -#endif -#if ENABLED(Y_DUAL_ENDSTOPS) - bool Stepper::locked_y_motor = false, Stepper::locked_y2_motor = false; -#endif -#if ENABLED(Z_DUAL_ENDSTOPS) - bool Stepper::locked_z_motor = false, Stepper::locked_z2_motor = false; -#endif - -int32_t Stepper::counter_X = 0, - Stepper::counter_Y = 0, - Stepper::counter_Z = 0, - Stepper::counter_E = 0; - -volatile uint32_t Stepper::step_events_completed = 0; // The number of step events executed in the current block - -#if ENABLED(BEZIER_JERK_CONTROL) - int32_t __attribute__((used)) Stepper::bezier_A __asm__("bezier_A"); // A coefficient in Bézier speed curve with alias for assembler - int32_t __attribute__((used)) Stepper::bezier_B __asm__("bezier_B"); // B coefficient in Bézier speed curve with alias for assembler - int32_t __attribute__((used)) Stepper::bezier_C __asm__("bezier_C"); // C coefficient in Bézier speed curve with alias for assembler - uint32_t __attribute__((used)) Stepper::bezier_F __asm__("bezier_F"); // F coefficient in Bézier speed curve with alias for assembler - uint32_t __attribute__((used)) Stepper::bezier_AV __asm__("bezier_AV"); // AV coefficient in Bézier speed curve with alias for assembler - bool __attribute__((used)) Stepper::A_negative __asm__("A_negative"); // If A coefficient was negative - bool Stepper::bezier_2nd_half; // =false If Bézier curve has been initialized or not -#endif - -#if ENABLED(LIN_ADVANCE) - - uint32_t Stepper::LA_decelerate_after; - - constexpr uint16_t ADV_NEVER = 65535; - - uint16_t Stepper::nextMainISR = 0, - Stepper::nextAdvanceISR = ADV_NEVER, - Stepper::eISR_Rate = ADV_NEVER, - Stepper::current_adv_steps = 0, - Stepper::final_adv_steps, - Stepper::max_adv_steps; - - int8_t Stepper::e_steps = 0; - - #if E_STEPPERS > 1 - int8_t Stepper::LA_active_extruder; // Copy from current executed block. Needed because current_block is set to NULL "too early". - #else - constexpr int8_t Stepper::LA_active_extruder; - #endif - - bool Stepper::use_advance_lead; - -#endif // LIN_ADVANCE - -int32_t Stepper::acceleration_time, Stepper::deceleration_time; - -volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; -volatile signed char Stepper::count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; - -#if ENABLED(MIXING_EXTRUDER) - int32_t Stepper::counter_m[MIXING_STEPPERS]; -#endif - -uint8_t Stepper::step_loops, Stepper::step_loops_nominal; - -uint16_t Stepper::OCR1A_nominal; -#if DISABLED(BEZIER_JERK_CONTROL) - uint16_t Stepper::acc_step_rate; // needed for deceleration start point -#endif - -volatile int32_t Stepper::endstops_trigsteps[XYZ]; - -#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - #define LOCKED_X_MOTOR locked_x_motor - #define LOCKED_Y_MOTOR locked_y_motor - #define LOCKED_Z_MOTOR locked_z_motor - #define LOCKED_X2_MOTOR locked_x2_motor - #define LOCKED_Y2_MOTOR locked_y2_motor - #define LOCKED_Z2_MOTOR locked_z2_motor - #define DUAL_ENDSTOP_APPLY_STEP(AXIS,v) \ - if (performing_homing) { \ - if (AXIS##_HOME_DIR < 0) { \ - if (!(TEST(endstops.old_endstop_bits, AXIS##_MIN) && count_direction[AXIS##_AXIS] < 0) && !LOCKED_##AXIS##_MOTOR) AXIS##_STEP_WRITE(v); \ - if (!(TEST(endstops.old_endstop_bits, AXIS##2_MIN) && count_direction[AXIS##_AXIS] < 0) && !LOCKED_##AXIS##2_MOTOR) AXIS##2_STEP_WRITE(v); \ - } \ - else { \ - if (!(TEST(endstops.old_endstop_bits, AXIS##_MAX) && count_direction[AXIS##_AXIS] > 0) && !LOCKED_##AXIS##_MOTOR) AXIS##_STEP_WRITE(v); \ - if (!(TEST(endstops.old_endstop_bits, AXIS##2_MAX) && count_direction[AXIS##_AXIS] > 0) && !LOCKED_##AXIS##2_MOTOR) AXIS##2_STEP_WRITE(v); \ - } \ - } \ - else { \ - AXIS##_STEP_WRITE(v); \ - AXIS##2_STEP_WRITE(v); \ - } -#endif - -#if ENABLED(X_DUAL_STEPPER_DRIVERS) - #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) - #if ENABLED(X_DUAL_ENDSTOPS) - #define X_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(X,v) - #else - #define X_APPLY_STEP(v,Q) do{ X_STEP_WRITE(v); X2_STEP_WRITE(v); }while(0) - #endif -#elif ENABLED(DUAL_X_CARRIAGE) - #define X_APPLY_DIR(v,ALWAYS) \ - if (extruder_duplication_enabled || ALWAYS) { \ - X_DIR_WRITE(v); \ - X2_DIR_WRITE(v); \ - } \ - else { \ - if (current_block->active_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ - } - #define X_APPLY_STEP(v,ALWAYS) \ - if (extruder_duplication_enabled || ALWAYS) { \ - X_STEP_WRITE(v); \ - X2_STEP_WRITE(v); \ - } \ - else { \ - if (current_block->active_extruder) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ - } -#else - #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) - #define X_APPLY_STEP(v,Q) X_STEP_WRITE(v) -#endif - -#if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR); }while(0) - #if ENABLED(Y_DUAL_ENDSTOPS) - #define Y_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Y,v) - #else - #define Y_APPLY_STEP(v,Q) do{ Y_STEP_WRITE(v); Y2_STEP_WRITE(v); }while(0) - #endif -#else - #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v) - #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) -#endif - -#if ENABLED(Z_DUAL_STEPPER_DRIVERS) - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) - #if ENABLED(Z_DUAL_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) - #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }while(0) - #endif -#else - #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) - #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v) -#endif - -#if DISABLED(MIXING_EXTRUDER) - #define E_APPLY_STEP(v,Q) E_STEP_WRITE(v) -#endif - -// intRes = longIn1 * longIn2 >> 24 -// uses: -// r26 to store 0 -// r27 to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. -// note that the lower two bytes and the upper byte of the 48bit result are not calculated. -// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. -// B0 A0 are bits 24-39 and are the returned value -// C1 B1 A1 is longIn1 -// D2 C2 B2 A2 is longIn2 -// -#define MultiU24X32toH16(intRes, longIn1, longIn2) \ - asm volatile ( \ - A("clr r26") \ - A("mul %A1, %B2") \ - A("mov r27, r1") \ - A("mul %B1, %C2") \ - A("movw %A0, r0") \ - A("mul %C1, %C2") \ - A("add %B0, r0") \ - A("mul %C1, %B2") \ - A("add %A0, r0") \ - A("adc %B0, r1") \ - A("mul %A1, %C2") \ - A("add r27, r0") \ - A("adc %A0, r1") \ - A("adc %B0, r26") \ - A("mul %B1, %B2") \ - A("add r27, r0") \ - A("adc %A0, r1") \ - A("adc %B0, r26") \ - A("mul %C1, %A2") \ - A("add r27, r0") \ - A("adc %A0, r1") \ - A("adc %B0, r26") \ - A("mul %B1, %A2") \ - A("add r27, r1") \ - A("adc %A0, r26") \ - A("adc %B0, r26") \ - A("lsr r27") \ - A("adc %A0, r26") \ - A("adc %B0, r26") \ - A("mul %D2, %A1") \ - A("add %A0, r0") \ - A("adc %B0, r1") \ - A("mul %D2, %B1") \ - A("add %B0, r0") \ - A("clr r1") \ - : \ - "=&r" (intRes) \ - : \ - "d" (longIn1), \ - "d" (longIn2) \ - : \ - "r26" , "r27" \ - ) - -// Some useful constants - -/** - * __________________________ - * /| |\ _________________ ^ - * / | | \ /| |\ | - * / | | \ / | | \ s - * / | | | | | \ p - * / | | | | | \ e - * +-----+------------------------+---+--+---------------+----+ e - * | BLOCK 1 | BLOCK 2 | d - * - * time -----> - * - * The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates - * first block->accelerate_until step_events_completed, then keeps going at constant speed until - * step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. - * The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. - */ -void Stepper::wake_up() { - // TCNT1 = 0; - ENABLE_STEPPER_DRIVER_INTERRUPT(); -} - -/** - * Set the stepper direction of each axis - * - * COREXY: X_AXIS=A_AXIS and Y_AXIS=B_AXIS - * COREXZ: X_AXIS=A_AXIS and Z_AXIS=C_AXIS - * COREYZ: Y_AXIS=B_AXIS and Z_AXIS=C_AXIS - */ -void Stepper::set_directions() { - - #define SET_STEP_DIR(AXIS) \ - if (motor_direction(AXIS ##_AXIS)) { \ - AXIS ##_APPLY_DIR(INVERT_## AXIS ##_DIR, false); \ - count_direction[AXIS ##_AXIS] = -1; \ - } \ - else { \ - AXIS ##_APPLY_DIR(!INVERT_## AXIS ##_DIR, false); \ - count_direction[AXIS ##_AXIS] = 1; \ - } - - #if HAS_X_DIR - SET_STEP_DIR(X); // A - #endif - #if HAS_Y_DIR - SET_STEP_DIR(Y); // B - #endif - #if HAS_Z_DIR - SET_STEP_DIR(Z); // C - #endif - - #if DISABLED(LIN_ADVANCE) - if (motor_direction(E_AXIS)) { - REV_E_DIR(); - count_direction[E_AXIS] = -1; - } - else { - NORM_E_DIR(); - count_direction[E_AXIS] = 1; - } - #endif // !LIN_ADVANCE -} - -#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - extern volatile uint8_t e_hit; -#endif - -#if ENABLED(BEZIER_JERK_CONTROL) - /** - * We are using a quintic (fifth-degree) Bézier polynomial for the velocity curve. - * This gives us a "linear pop" velocity curve; with pop being the sixth derivative of position: - * velocity - 1st, acceleration - 2nd, jerk - 3rd, snap - 4th, crackle - 5th, pop - 6th - * - * The Bézier curve takes the form: - * - * V(t) = P_0 * B_0(t) + P_1 * B_1(t) + P_2 * B_2(t) + P_3 * B_3(t) + P_4 * B_4(t) + P_5 * B_5(t) - * - * Where 0 <= t <= 1, and V(t) is the velocity. P_0 through P_5 are the control points, and B_0(t) - * through B_5(t) are the Bernstein basis as follows: - * - * B_0(t) = (1-t)^5 = -t^5 + 5t^4 - 10t^3 + 10t^2 - 5t + 1 - * B_1(t) = 5(1-t)^4 * t = 5t^5 - 20t^4 + 30t^3 - 20t^2 + 5t - * B_2(t) = 10(1-t)^3 * t^2 = -10t^5 + 30t^4 - 30t^3 + 10t^2 - * B_3(t) = 10(1-t)^2 * t^3 = 10t^5 - 20t^4 + 10t^3 - * B_4(t) = 5(1-t) * t^4 = -5t^5 + 5t^4 - * B_5(t) = t^5 = t^5 - * ^ ^ ^ ^ ^ ^ - * | | | | | | - * A B C D E F - * - * Unfortunately, we cannot use forward-differencing to calculate each position through - * the curve, as Marlin uses variable timer periods. So, we require a formula of the form: - * - * V_f(t) = A*t^5 + B*t^4 + C*t^3 + D*t^2 + E*t + F - * - * Looking at the above B_0(t) through B_5(t) expanded forms, if we take the coefficients of t^5 - * through t of the Bézier form of V(t), we can determine that: - * - * A = -P_0 + 5*P_1 - 10*P_2 + 10*P_3 - 5*P_4 + P_5 - * B = 5*P_0 - 20*P_1 + 30*P_2 - 20*P_3 + 5*P_4 - * C = -10*P_0 + 30*P_1 - 30*P_2 + 10*P_3 - * D = 10*P_0 - 20*P_1 + 10*P_2 - * E = - 5*P_0 + 5*P_1 - * F = P_0 - * - * Now, since we will (currently) *always* want the initial acceleration and jerk values to be 0, - * We set P_i = P_0 = P_1 = P_2 (initial velocity), and P_t = P_3 = P_4 = P_5 (target velocity), - * which, after simplification, resolves to: - * - * A = - 6*P_i + 6*P_t = 6*(P_t - P_i) - * B = 15*P_i - 15*P_t = 15*(P_i - P_t) - * C = -10*P_i + 10*P_t = 10*(P_t - P_i) - * D = 0 - * E = 0 - * F = P_i - * - * As the t is evaluated in non uniform steps here, there is no other way rather than evaluating - * the Bézier curve at each point: - * - * V_f(t) = A*t^5 + B*t^4 + C*t^3 + F [0 <= t <= 1] - * - * Floating point arithmetic execution time cost is prohibitive, so we will transform the math to - * use fixed point values to be able to evaluate it in realtime. Assuming a maximum of 250000 steps - * per second (driver pulses should at least be 2uS hi/2uS lo), and allocating 2 bits to avoid - * overflows on the evaluation of the Bézier curve, means we can use - * - * t: unsigned Q0.32 (0 <= t < 1) |range 0 to 0xFFFFFFFF unsigned - * A: signed Q24.7 , |range = +/- 250000 * 6 * 128 = +/- 192000000 = 0x0B71B000 | 28 bits + sign - * B: signed Q24.7 , |range = +/- 250000 *15 * 128 = +/- 480000000 = 0x1C9C3800 | 29 bits + sign - * C: signed Q24.7 , |range = +/- 250000 *10 * 128 = +/- 320000000 = 0x1312D000 | 29 bits + sign - * F: signed Q24.7 , |range = +/- 250000 * 128 = 32000000 = 0x01E84800 | 25 bits + sign - * - * The trapezoid generator state contains the following information, that we will use to create and evaluate - * the Bézier curve: - * - * blk->step_event_count [TS] = The total count of steps for this movement. (=distance) - * blk->initial_rate [VI] = The initial steps per second (=velocity) - * blk->final_rate [VF] = The ending steps per second (=velocity) - * and the count of events completed (step_events_completed) [CS] (=distance until now) - * - * Note the abbreviations we use in the following formulae are between []s - * - * For Any 32bit CPU: - * - * At the start of each trapezoid, we calculate the coefficients A,B,C,F and Advance [AV], as follows: - * - * A = 6*128*(VF - VI) = 768*(VF - VI) - * B = 15*128*(VI - VF) = 1920*(VI - VF) - * C = 10*128*(VF - VI) = 1280*(VF - VI) - * F = 128*VI = 128*VI - * AV = (1<<32)/TS ~= 0xFFFFFFFF / TS (To use ARM UDIV, that is 32 bits) (this is computed at the planner, to offload expensive calculations from the ISR) - * - * And for each point, we will evaluate the curve with the following sequence: - * - * void lsrs(uint32_t& d, uint32_t s, int cnt) { - * d = s >> cnt; - * } - * void lsls(uint32_t& d, uint32_t s, int cnt) { - * d = s << cnt; - * } - * void lsrs(int32_t& d, uint32_t s, int cnt) { - * d = uint32_t(s) >> cnt; - * } - * void lsls(int32_t& d, uint32_t s, int cnt) { - * d = uint32_t(s) << cnt; - * } - * void umull(uint32_t& rlo, uint32_t& rhi, uint32_t op1, uint32_t op2) { - * uint64_t res = uint64_t(op1) * op2; - * rlo = uint32_t(res & 0xFFFFFFFF); - * rhi = uint32_t((res >> 32) & 0xFFFFFFFF); - * } - * void smlal(int32_t& rlo, int32_t& rhi, int32_t op1, int32_t op2) { - * int64_t mul = int64_t(op1) * op2; - * int64_t s = int64_t(uint32_t(rlo) | ((uint64_t(uint32_t(rhi)) << 32U))); - * mul += s; - * rlo = int32_t(mul & 0xFFFFFFFF); - * rhi = int32_t((mul >> 32) & 0xFFFFFFFF); - * } - * int32_t _eval_bezier_curve_arm(uint32_t curr_step) { - * register uint32_t flo = 0; - * register uint32_t fhi = bezier_AV * curr_step; - * register uint32_t t = fhi; - * register int32_t alo = bezier_F; - * register int32_t ahi = 0; - * register int32_t A = bezier_A; - * register int32_t B = bezier_B; - * register int32_t C = bezier_C; - * - * lsrs(ahi, alo, 1); // a = F << 31 - * lsls(alo, alo, 31); // - * umull(flo, fhi, fhi, t); // f *= t - * umull(flo, fhi, fhi, t); // f>>=32; f*=t - * lsrs(flo, fhi, 1); // - * smlal(alo, ahi, flo, C); // a+=(f>>33)*C - * umull(flo, fhi, fhi, t); // f>>=32; f*=t - * lsrs(flo, fhi, 1); // - * smlal(alo, ahi, flo, B); // a+=(f>>33)*B - * umull(flo, fhi, fhi, t); // f>>=32; f*=t - * lsrs(flo, fhi, 1); // f>>=33; - * smlal(alo, ahi, flo, A); // a+=(f>>33)*A; - * lsrs(alo, ahi, 6); // a>>=38 - * - * return alo; - * } - * - * This will be rewritten in ARM assembly to get peak performance and will take 43 cycles to execute - * - * For AVR, we scale precision of coefficients to make it possible to evaluate the Bézier curve in - * realtime: Let's reduce precision as much as possible. After some experimentation we found that: - * - * Assume t and AV with 24 bits is enough - * A = 6*(VF - VI) - * B = 15*(VI - VF) - * C = 10*(VF - VI) - * F = VI - * AV = (1<<24)/TS (this is computed at the planner, to offload expensive calculations from the ISR) - * - * Instead of storing sign for each coefficient, we will store its absolute value, - * and flag the sign of the A coefficient, so we can save to store the sign bit. - * It always holds that sign(A) = - sign(B) = sign(C) - * - * So, the resulting range of the coefficients are: - * - * t: unsigned (0 <= t < 1) |range 0 to 0xFFFFFF unsigned - * A: signed Q24 , range = 250000 * 6 = 1500000 = 0x16E360 | 21 bits - * B: signed Q24 , range = 250000 *15 = 3750000 = 0x393870 | 22 bits - * C: signed Q24 , range = 250000 *10 = 2500000 = 0x1312D0 | 21 bits - * F: signed Q24 , range = 250000 = 250000 = 0x0ED090 | 20 bits - * - * And for each curve, we estimate its coefficients with: - * - * void _calc_bezier_curve_coeffs(int32_t v0, int32_t v1, uint32_t av) { - * // Calculate the Bézier coefficients - * if (v1 < v0) { - * A_negative = true; - * bezier_A = 6 * (v0 - v1); - * bezier_B = 15 * (v0 - v1); - * bezier_C = 10 * (v0 - v1); - * } - * else { - * A_negative = false; - * bezier_A = 6 * (v1 - v0); - * bezier_B = 15 * (v1 - v0); - * bezier_C = 10 * (v1 - v0); - * } - * bezier_F = v0; - * } - * - * And for each point, we will evaluate the curve with the following sequence: - * - * // unsigned multiplication of 24 bits x 24bits, return upper 16 bits - * void umul24x24to16hi(uint16_t& r, uint24_t op1, uint24_t op2) { - * r = (uint64_t(op1) * op2) >> 8; - * } - * // unsigned multiplication of 16 bits x 16bits, return upper 16 bits - * void umul16x16to16hi(uint16_t& r, uint16_t op1, uint16_t op2) { - * r = (uint32_t(op1) * op2) >> 16; - * } - * // unsigned multiplication of 16 bits x 24bits, return upper 24 bits - * void umul16x24to24hi(uint24_t& r, uint16_t op1, uint24_t op2) { - * r = uint24_t((uint64_t(op1) * op2) >> 16); - * } - * - * int32_t _eval_bezier_curve(uint32_t curr_step) { - * // To save computing, the first step is always the initial speed - * if (!curr_step) - * return bezier_F; - * - * uint16_t t; - * umul24x24to16hi(t, bezier_AV, curr_step); // t: Range 0 - 1^16 = 16 bits - * uint16_t f = t; - * umul16x16to16hi(f, f, t); // Range 16 bits (unsigned) - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^3 (unsigned) - * uint24_t acc = bezier_F; // Range 20 bits (unsigned) - * if (A_negative) { - * uint24_t v; - * umul16x24to24hi(v, f, bezier_C); // Range 21bits - * acc -= v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) - * umul16x24to24hi(v, f, bezier_B); // Range 22bits - * acc += v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) - * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) - * acc -= v; - * } - * else { - * uint24_t v; - * umul16x24to24hi(v, f, bezier_C); // Range 21bits - * acc += v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) - * umul16x24to24hi(v, f, bezier_B); // Range 22bits - * acc -= v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) - * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) - * acc += v; - * } - * return acc; - * } - * Those functions will be translated into assembler to get peak performance. coefficient calculations takes 70 cycles, - * Bezier point evaluation takes 150 cycles - * - */ - - // For AVR we use assembly to maximize speed - void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) { - - // Store advance - bezier_AV = av; - - // Calculate the rest of the coefficients - register uint8_t r2 = v0 & 0xFF; - register uint8_t r3 = (v0 >> 8) & 0xFF; - register uint8_t r12 = (v0 >> 16) & 0xFF; - register uint8_t r5 = v1 & 0xFF; - register uint8_t r6 = (v1 >> 8) & 0xFF; - register uint8_t r7 = (v1 >> 16) & 0xFF; - register uint8_t r4,r8,r9,r10,r11; - - __asm__ __volatile__( - /* Calculate the Bézier coefficients */ - /* %10:%1:%0 = v0*/ - /* %5:%4:%3 = v1*/ - /* %7:%6:%10 = temporary*/ - /* %9 = val (must be high register!)*/ - /* %10 (must be high register!)*/ - - /* Store initial velocity*/ - A("sts bezier_F, %0") - A("sts bezier_F+1, %1") - A("sts bezier_F+2, %10") /* bezier_F = %10:%1:%0 = v0 */ - - /* Get delta speed */ - A("ldi %2,-1") /* %2 = 0xFF, means A_negative = true */ - A("clr %8") /* %8 = 0 */ - A("sub %0,%3") - A("sbc %1,%4") - A("sbc %10,%5") /* v0 -= v1, C=1 if result is negative */ - A("brcc 1f") /* branch if result is positive (C=0), that means v0 >= v1 */ - - /* Result was negative, get the absolute value*/ - A("com %10") - A("com %1") - A("neg %0") - A("sbc %1,%2") - A("sbc %10,%2") /* %10:%1:%0 +1 -> %10:%1:%0 = -(v0 - v1) = (v1 - v0) */ - A("clr %2") /* %2 = 0, means A_negative = false */ - - /* Store negative flag*/ - L("1") - A("sts A_negative, %2") /* Store negative flag */ - - /* Compute coefficients A,B and C [20 cycles worst case]*/ - A("ldi %9,6") /* %9 = 6 */ - A("mul %0,%9") /* r1:r0 = 6*LO(v0-v1) */ - A("sts bezier_A, r0") - A("mov %6,r1") - A("clr %7") /* %7:%6:r0 = 6*LO(v0-v1) */ - A("mul %1,%9") /* r1:r0 = 6*MI(v0-v1) */ - A("add %6,r0") - A("adc %7,r1") /* %7:%6:?? += 6*MI(v0-v1) << 8 */ - A("mul %10,%9") /* r1:r0 = 6*HI(v0-v1) */ - A("add %7,r0") /* %7:%6:?? += 6*HI(v0-v1) << 16 */ - A("sts bezier_A+1, %6") - A("sts bezier_A+2, %7") /* bezier_A = %7:%6:?? = 6*(v0-v1) [35 cycles worst] */ - - A("ldi %9,15") /* %9 = 15 */ - A("mul %0,%9") /* r1:r0 = 5*LO(v0-v1) */ - A("sts bezier_B, r0") - A("mov %6,r1") - A("clr %7") /* %7:%6:?? = 5*LO(v0-v1) */ - A("mul %1,%9") /* r1:r0 = 5*MI(v0-v1) */ - A("add %6,r0") - A("adc %7,r1") /* %7:%6:?? += 5*MI(v0-v1) << 8 */ - A("mul %10,%9") /* r1:r0 = 5*HI(v0-v1) */ - A("add %7,r0") /* %7:%6:?? += 5*HI(v0-v1) << 16 */ - A("sts bezier_B+1, %6") - A("sts bezier_B+2, %7") /* bezier_B = %7:%6:?? = 5*(v0-v1) [50 cycles worst] */ - - A("ldi %9,10") /* %9 = 10 */ - A("mul %0,%9") /* r1:r0 = 10*LO(v0-v1) */ - A("sts bezier_C, r0") - A("mov %6,r1") - A("clr %7") /* %7:%6:?? = 10*LO(v0-v1) */ - A("mul %1,%9") /* r1:r0 = 10*MI(v0-v1) */ - A("add %6,r0") - A("adc %7,r1") /* %7:%6:?? += 10*MI(v0-v1) << 8 */ - A("mul %10,%9") /* r1:r0 = 10*HI(v0-v1) */ - A("add %7,r0") /* %7:%6:?? += 10*HI(v0-v1) << 16 */ - A("sts bezier_C+1, %6") - " sts bezier_C+2, %7" /* bezier_C = %7:%6:?? = 10*(v0-v1) [65 cycles worst] */ - : "+r" (r2), - "+d" (r3), - "=r" (r4), - "+r" (r5), - "+r" (r6), - "+r" (r7), - "=r" (r8), - "=r" (r9), - "=r" (r10), - "=d" (r11), - "+r" (r12) - : - : "r0", "r1", "cc", "memory" - ); - } - - FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { - - // If dealing with the first step, save expensive computing and return the initial speed - if (!curr_step) - return bezier_F; - - register uint8_t r0 = 0; /* Zero register */ - register uint8_t r2 = (curr_step) & 0xFF; - register uint8_t r3 = (curr_step >> 8) & 0xFF; - register uint8_t r4 = (curr_step >> 16) & 0xFF; - register uint8_t r1,r5,r6,r7,r8,r9,r10,r11; /* Temporary registers */ - - __asm__ __volatile( - /* umul24x24to16hi(t, bezier_AV, curr_step); t: Range 0 - 1^16 = 16 bits*/ - A("lds %9,bezier_AV") /* %9 = LO(AV)*/ - A("mul %9,%2") /* r1:r0 = LO(bezier_AV)*LO(curr_step)*/ - A("mov %7,r1") /* %7 = LO(bezier_AV)*LO(curr_step) >> 8*/ - A("clr %8") /* %8:%7 = LO(bezier_AV)*LO(curr_step) >> 8*/ - A("lds %10,bezier_AV+1") /* %10 = MI(AV)*/ - A("mul %10,%2") /* r1:r0 = MI(bezier_AV)*LO(curr_step)*/ - A("add %7,r0") - A("adc %8,r1") /* %8:%7 += MI(bezier_AV)*LO(curr_step)*/ - A("lds r1,bezier_AV+2") /* r11 = HI(AV)*/ - A("mul r1,%2") /* r1:r0 = HI(bezier_AV)*LO(curr_step)*/ - A("add %8,r0") /* %8:%7 += HI(bezier_AV)*LO(curr_step) << 8*/ - A("mul %9,%3") /* r1:r0 = LO(bezier_AV)*MI(curr_step)*/ - A("add %7,r0") - A("adc %8,r1") /* %8:%7 += LO(bezier_AV)*MI(curr_step)*/ - A("mul %10,%3") /* r1:r0 = MI(bezier_AV)*MI(curr_step)*/ - A("add %8,r0") /* %8:%7 += LO(bezier_AV)*MI(curr_step) << 8*/ - A("mul %9,%4") /* r1:r0 = LO(bezier_AV)*HI(curr_step)*/ - A("add %8,r0") /* %8:%7 += LO(bezier_AV)*HI(curr_step) << 8*/ - /* %8:%7 = t*/ - - /* uint16_t f = t;*/ - A("mov %5,%7") /* %6:%5 = f*/ - A("mov %6,%8") - /* %6:%5 = f*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits (unsigned) [17] */ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %9,r1") /* store MIL(LO(f) * LO(t)) in %9, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %9,r0") /* %9 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %9,r0") /* %9 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t)) */ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 = */ - A("mov %6,%11") /* f = %10:%11*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 =*/ - A("mov %6,%11") /* f = %10:%11*/ - /* [15 +17*2] = [49]*/ - - /* %4:%3:%2 will be acc from now on*/ - - /* uint24_t acc = bezier_F; / Range 20 bits (unsigned)*/ - A("clr %9") /* "decimal place we get for free"*/ - A("lds %2,bezier_F") - A("lds %3,bezier_F+1") - A("lds %4,bezier_F+2") /* %4:%3:%2 = acc*/ - - /* if (A_negative) {*/ - A("lds r0,A_negative") - A("or r0,%0") /* Is flag signalling negative? */ - A("brne 3f") /* If yes, Skip next instruction if A was negative*/ - A("rjmp 1f") /* Otherwise, jump */ - - /* uint24_t v; */ - /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29] */ - /* acc -= v; */ - L("3") - A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ - A("sub %9,r1") - A("sbc %2,%0") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_C) * LO(f))*/ - A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * LO(f)*/ - A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_C) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ - A("sub %3,r0") - A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 16*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 =*/ - A("mov %6,%11") /* f = %10:%11*/ - - /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ - /* acc += v; */ - A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ - A("add %9,r1") - A("adc %2,%0") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_B) * LO(f))*/ - A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * LO(f)*/ - A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_B) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ - A("add %3,r0") - A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 16*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 =*/ - A("mov %6,%11") /* f = %10:%11*/ - - /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ - /* acc -= v; */ - A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ - A("sub %9,r1") - A("sbc %2,%0") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_A) * LO(f))*/ - A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * LO(f)*/ - A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_A) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ - A("sub %3,r0") - A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 16*/ - A("jmp 2f") /* Done!*/ - - L("1") - - /* uint24_t v; */ - /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29]*/ - /* acc += v; */ - A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ - A("add %9,r1") - A("adc %2,%0") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_C) * LO(f))*/ - A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * LO(f)*/ - A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_C) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ - A("add %3,r0") - A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 16*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 =*/ - A("mov %6,%11") /* f = %10:%11*/ - - /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ - /* acc -= v;*/ - A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ - A("sub %9,r1") - A("sbc %2,%0") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_B) * LO(f))*/ - A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * LO(f)*/ - A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ - A("sub %9,r0") - A("sbc %2,r1") - A("sbc %3,%0") - A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_B) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ - A("sub %2,r0") - A("sbc %3,r1") - A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ - A("sub %3,r0") - A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 16*/ - - /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ - A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ - A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ - A("clr %10") /* %10 = 0*/ - A("clr %11") /* %11 = 0*/ - A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ - A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ - A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ - A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ - A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ - A("adc %11,%0") /* %11 += carry*/ - A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ - A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ - A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ - A("mov %5,%10") /* %6:%5 =*/ - A("mov %6,%11") /* f = %10:%11*/ - - /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ - /* acc += v; */ - A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ - A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ - A("add %9,r1") - A("adc %2,%0") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_A) * LO(f))*/ - A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ - A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * LO(f)*/ - A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ - A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 8*/ - A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ - A("add %9,r0") - A("adc %2,r1") - A("adc %3,%0") - A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_A) * MI(f)*/ - A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ - A("add %2,r0") - A("adc %3,r1") - A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * MI(f) << 8*/ - A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ - A("add %3,r0") - A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 16*/ - L("2") - " clr __zero_reg__" /* C runtime expects r1 = __zero_reg__ = 0 */ - : "+r"(r0), - "+r"(r1), - "+r"(r2), - "+r"(r3), - "+r"(r4), - "+r"(r5), - "+r"(r6), - "+r"(r7), - "+r"(r8), - "+r"(r9), - "+r"(r10), - "+r"(r11) - : - :"cc","r0","r1" - ); - return (r2 | (uint16_t(r3) << 8)) | (uint32_t(r4) << 16); - } - -#endif // BEZIER_JERK_CONTROL - -/** - * Stepper Driver Interrupt - * - * Directly pulses the stepper motors at high frequency. - * Timer 1 runs at a base frequency of 2MHz, with this ISR using OCR1A compare mode. - * - * OCR1A Frequency - * 1 2 MHz - * 50 40 KHz - * 100 20 KHz - capped max rate - * 200 10 KHz - nominal max rate - * 2000 1 KHz - sleep rate - * 4000 500 Hz - init rate - */ -ISR(TIMER1_COMPA_vect) { - /** - * On AVR there is no hardware prioritization and preemption of - * interrupts, so this emulates it. The UART has first priority - * (otherwise, characters will be lost due to UART overflow). - * Then: Stepper, Endstops, Temperature, and -finally- all others. - * - * This ISR needs to run with as little preemption as possible, so - * the Temperature ISR is disabled here. Now only the UART, Endstops, - * and Arduino-defined interrupts can preempt. - */ - const bool temp_isr_was_enabled = TEMPERATURE_ISR_ENABLED(); - DISABLE_TEMPERATURE_INTERRUPT(); - DISABLE_STEPPER_DRIVER_INTERRUPT(); - sei(); - - #if ENABLED(LIN_ADVANCE) - Stepper::advance_isr_scheduler(); - #else - Stepper::isr(); - #endif - - // Disable global interrupts and reenable this ISR - cli(); - ENABLE_STEPPER_DRIVER_INTERRUPT(); - // Reenable the temperature ISR (if it was enabled) - if (temp_isr_was_enabled) ENABLE_TEMPERATURE_INTERRUPT(); -} - -void Stepper::isr() { - - uint16_t ocr_val; - - #define ENDSTOP_NOMINAL_OCR_VAL 3000 // Check endstops every 1.5ms to guarantee two stepper ISRs within 5ms for BLTouch - #define OCR_VAL_TOLERANCE 1000 // First max delay is 2.0ms, last min delay is 0.5ms, all others 1.5ms - - #define _SPLIT(L) (ocr_val = (uint16_t)L) - #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - - #define SPLIT(L) _SPLIT(L) - - #else // !ENDSTOP_INTERRUPTS_FEATURE : Sample endstops between stepping ISRs - - static uint32_t step_remaining = 0; - - #define SPLIT(L) do { \ - _SPLIT(L); \ - if (ENDSTOPS_ENABLED && L > ENDSTOP_NOMINAL_OCR_VAL) { \ - const uint16_t remainder = (uint16_t)L % (ENDSTOP_NOMINAL_OCR_VAL); \ - ocr_val = (remainder < OCR_VAL_TOLERANCE) ? ENDSTOP_NOMINAL_OCR_VAL + remainder : ENDSTOP_NOMINAL_OCR_VAL; \ - step_remaining = (uint16_t)L - ocr_val; \ - } \ - }while(0) - - if (step_remaining && ENDSTOPS_ENABLED) { // Just check endstops - not yet time for a step - endstops.update(); - - // Next ISR either for endstops or stepping - ocr_val = step_remaining <= ENDSTOP_NOMINAL_OCR_VAL ? step_remaining : ENDSTOP_NOMINAL_OCR_VAL; - step_remaining -= ocr_val; - _NEXT_ISR(ocr_val); - NOLESS(OCR1A, TCNT1 + 16); - return; - } - - #endif // !ENDSTOP_INTERRUPTS_FEATURE - - // - // When cleaning, discard the current block and run fast - // - if (cleaning_buffer_counter) { - if (cleaning_buffer_counter < 0) { // Count up for endstop hit - if (current_block) planner.discard_current_block(); // Discard the active block that led to the trigger - if (!planner.discard_continued_block()) // Discard next CONTINUED block - cleaning_buffer_counter = 0; // Keep discarding until non-CONTINUED - } - else { - planner.discard_current_block(); - --cleaning_buffer_counter; // Count down for abort print - #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) - if (!cleaning_buffer_counter) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); - #endif - } - current_block = NULL; // Prep to get a new block after cleaning - _NEXT_ISR(200); // Run at max speed - 10 KHz - return; - } - - // If there is no current block, attempt to pop one from the buffer - if (!current_block) { - - // Anything in the buffer? - if ((current_block = planner.get_current_block())) { - - // Sync block? Sync the stepper counts and return - while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { - _set_position( - current_block->steps[A_AXIS], current_block->steps[B_AXIS], - current_block->steps[C_AXIS], current_block->steps[E_AXIS] - ); - planner.discard_current_block(); - if (!(current_block = planner.get_current_block())) return; - } - - // Initialize the trapezoid generator from the current block. - static int8_t last_extruder = -1; - - #if ENABLED(LIN_ADVANCE) - #if E_STEPPERS > 1 - if (current_block->active_extruder != last_extruder) { - current_adv_steps = 0; // If the now active extruder wasn't in use during the last move, its pressure is most likely gone. - LA_active_extruder = current_block->active_extruder; - } - #endif - - if ((use_advance_lead = current_block->use_advance_lead)) { - LA_decelerate_after = current_block->decelerate_after; - final_adv_steps = current_block->final_adv_steps; - max_adv_steps = current_block->max_adv_steps; - } - #endif - - if (current_block->direction_bits != last_direction_bits || current_block->active_extruder != last_extruder) { - last_direction_bits = current_block->direction_bits; - last_extruder = current_block->active_extruder; - set_directions(); - } - - // No acceleration / deceleration time elapsed so far - acceleration_time = deceleration_time = 0; - - // No step events completed so far - step_events_completed = 0; - - // step_rate to timer interval - OCR1A_nominal = calc_timer_interval(current_block->nominal_rate); - - // make a note of the number of step loops required at nominal speed - step_loops_nominal = step_loops; - - #if DISABLED(BEZIER_JERK_CONTROL) - // Set as deceleration point the initial rate of the block - acc_step_rate = current_block->initial_rate; - #endif - - #if ENABLED(BEZIER_JERK_CONTROL) - // Initialize the Bézier speed curve - _calc_bezier_curve_coeffs(current_block->initial_rate, current_block->cruise_rate, current_block->acceleration_time_inverse); - - // We have not started the 2nd half of the trapezoid - bezier_2nd_half = false; - #endif - - // Initialize Bresenham counters to 1/2 the ceiling - counter_X = counter_Y = counter_Z = counter_E = -(current_block->step_event_count >> 1); - #if ENABLED(MIXING_EXTRUDER) - MIXING_STEPPERS_LOOP(i) - counter_m[i] = -(current_block->mix_event_count[i] >> 1); - #endif - - // No step events completed so far - step_events_completed = 0; - - #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - e_hit = 2; // Needed for the case an endstop is already triggered before the new move begins. - // No 'change' can be detected. - #endif - - #if ENABLED(Z_LATE_ENABLE) - // If delayed Z enable, postpone move for 1mS - if (current_block->steps[Z_AXIS] > 0) { - enable_Z(); - _NEXT_ISR(2000); // Run at slow speed - 1 KHz - return; - } - #endif - } - else { - _NEXT_ISR(2000); // Run at slow speed - 1 KHz - return; - } - } - - // Update endstops state, if enabled - #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - if (e_hit && ENDSTOPS_ENABLED) { - endstops.update(); - e_hit--; - } - #else - if (ENDSTOPS_ENABLED) endstops.update(); - #endif - - // Take multiple steps per interrupt (For high speed moves) - bool all_steps_done = false; - for (uint8_t i = step_loops; i--;) { - - #define _COUNTER(AXIS) counter_## AXIS - #define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP - #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN - - // Advance the Bresenham counter; start a pulse if the axis needs a step - #define PULSE_START(AXIS) do{ \ - _COUNTER(AXIS) += current_block->steps[_AXIS(AXIS)]; \ - if (_COUNTER(AXIS) > 0) { _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), 0); } \ - }while(0) - - // Advance the Bresenham counter; start a pulse if the axis needs a step - #define STEP_TICK(AXIS) do { \ - if (_COUNTER(AXIS) > 0) { \ - _COUNTER(AXIS) -= current_block->step_event_count; \ - count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \ - } \ - }while(0) - - // Stop an active pulse, if any - #define PULSE_STOP(AXIS) _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), 0) - - /** - * Estimate the number of cycles that the stepper logic already takes - * up between the start and stop of the X stepper pulse. - * - * Currently this uses very modest estimates of around 5 cycles. - * True values may be derived by careful testing. - * - * Once any delay is added, the cost of the delay code itself - * may be subtracted from this value to get a more accurate delay. - * Delays under 20 cycles (1.25µs) will be very accurate, using NOPs. - * Longer delays use a loop. The resolution is 8 cycles. - */ - #if HAS_X_STEP - #define _CYCLE_APPROX_1 5 - #else - #define _CYCLE_APPROX_1 0 - #endif - #if ENABLED(X_DUAL_STEPPER_DRIVERS) - #define _CYCLE_APPROX_2 _CYCLE_APPROX_1 + 4 - #else - #define _CYCLE_APPROX_2 _CYCLE_APPROX_1 - #endif - #if HAS_Y_STEP - #define _CYCLE_APPROX_3 _CYCLE_APPROX_2 + 5 - #else - #define _CYCLE_APPROX_3 _CYCLE_APPROX_2 - #endif - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #define _CYCLE_APPROX_4 _CYCLE_APPROX_3 + 4 - #else - #define _CYCLE_APPROX_4 _CYCLE_APPROX_3 - #endif - #if HAS_Z_STEP - #define _CYCLE_APPROX_5 _CYCLE_APPROX_4 + 5 - #else - #define _CYCLE_APPROX_5 _CYCLE_APPROX_4 - #endif - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) - #define _CYCLE_APPROX_6 _CYCLE_APPROX_5 + 4 - #else - #define _CYCLE_APPROX_6 _CYCLE_APPROX_5 - #endif - #if DISABLED(LIN_ADVANCE) - #if ENABLED(MIXING_EXTRUDER) - #define _CYCLE_APPROX_7 _CYCLE_APPROX_6 + (MIXING_STEPPERS) * 6 - #else - #define _CYCLE_APPROX_7 _CYCLE_APPROX_6 + 5 - #endif - #else - #define _CYCLE_APPROX_7 _CYCLE_APPROX_6 - #endif - - #define CYCLES_EATEN_XYZE _CYCLE_APPROX_7 - #define EXTRA_CYCLES_XYZE (STEP_PULSE_CYCLES - (CYCLES_EATEN_XYZE)) - - /** - * If a minimum pulse time was specified get the timer 0 value. - * - * On AVR the TCNT0 timer has an 8x prescaler, so it increments every 8 cycles. - * That's every 0.5µs on 16MHz and every 0.4µs on 20MHz. - * 20 counts of TCNT0 -by itself- is a good pulse delay. - * 10µs = 160 or 200 cycles. - */ - #if EXTRA_CYCLES_XYZE > 20 - uint32_t pulse_start = TCNT0; - #endif - - #if HAS_X_STEP - PULSE_START(X); - #endif - #if HAS_Y_STEP - PULSE_START(Y); - #endif - #if HAS_Z_STEP - PULSE_START(Z); - #endif - - #if ENABLED(LIN_ADVANCE) - counter_E += current_block->steps[E_AXIS]; - if (counter_E > 0) { - #if DISABLED(MIXING_EXTRUDER) - // Don't step E here for mixing extruder - motor_direction(E_AXIS) ? --e_steps : ++e_steps; - #endif - } - - #if ENABLED(MIXING_EXTRUDER) - // Step mixing steppers proportionally - const bool dir = motor_direction(E_AXIS); - MIXING_STEPPERS_LOOP(j) { - counter_m[j] += current_block->steps[E_AXIS]; - if (counter_m[j] > 0) { - counter_m[j] -= current_block->mix_event_count[j]; - dir ? --e_steps[j] : ++e_steps[j]; - } - } - #endif - - #else // !LIN_ADVANCE - use linear interpolation for E also - - #if ENABLED(MIXING_EXTRUDER) - // Keep updating the single E axis - counter_E += current_block->steps[E_AXIS]; - // Tick the counters used for this mix - MIXING_STEPPERS_LOOP(j) { - // Step mixing steppers (proportionally) - counter_m[j] += current_block->steps[E_AXIS]; - // Step when the counter goes over zero - if (counter_m[j] > 0) En_STEP_WRITE(j, !INVERT_E_STEP_PIN); - } - #else // !MIXING_EXTRUDER - PULSE_START(E); - #endif - #endif // !LIN_ADVANCE - - #if HAS_X_STEP - STEP_TICK(X); - #endif - #if HAS_Y_STEP - STEP_TICK(Y); - #endif - #if HAS_Z_STEP - STEP_TICK(Z); - #endif - - STEP_TICK(E); // Always tick the single E axis - - // For minimum pulse time wait before stopping pulses - #if EXTRA_CYCLES_XYZE > 20 - while (EXTRA_CYCLES_XYZE > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } - pulse_start = TCNT0; - #elif EXTRA_CYCLES_XYZE > 0 - DELAY_NOPS(EXTRA_CYCLES_XYZE); - #endif - - #if HAS_X_STEP - PULSE_STOP(X); - #endif - #if HAS_Y_STEP - PULSE_STOP(Y); - #endif - #if HAS_Z_STEP - PULSE_STOP(Z); - #endif - - #if DISABLED(LIN_ADVANCE) - #if ENABLED(MIXING_EXTRUDER) - MIXING_STEPPERS_LOOP(j) { - if (counter_m[j] > 0) { - counter_m[j] -= current_block->mix_event_count[j]; - En_STEP_WRITE(j, INVERT_E_STEP_PIN); - } - } - #else // !MIXING_EXTRUDER - PULSE_STOP(E); - #endif - #endif // !LIN_ADVANCE - - if (++step_events_completed >= current_block->step_event_count) { - all_steps_done = true; - break; - } - - // For minimum pulse time wait after stopping pulses also - #if EXTRA_CYCLES_XYZE > 20 - if (i) while (EXTRA_CYCLES_XYZE > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } - #elif EXTRA_CYCLES_XYZE > 0 - if (i) DELAY_NOPS(EXTRA_CYCLES_XYZE); - #endif - - } // steps_loop - - // Calculate new timer value - if (step_events_completed <= (uint32_t)current_block->accelerate_until) { - - #if ENABLED(BEZIER_JERK_CONTROL) - // Get the next speed to use (Jerk limited!) - uint16_t acc_step_rate = - acceleration_time < current_block->acceleration_time - ? _eval_bezier_curve(acceleration_time) - : current_block->cruise_rate; - #else - MultiU24X32toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); - acc_step_rate += current_block->initial_rate; - - // upper limit - NOMORE(acc_step_rate, current_block->nominal_rate); - #endif - - // step_rate to timer interval - const uint16_t interval = calc_timer_interval(acc_step_rate); - - SPLIT(interval); // split step into multiple ISRs if larger than ENDSTOP_NOMINAL_OCR_VAL - _NEXT_ISR(ocr_val); - - acceleration_time += interval; - - #if ENABLED(LIN_ADVANCE) - if (current_block->use_advance_lead) { - if (step_events_completed == step_loops || (e_steps && eISR_Rate != current_block->advance_speed)) { - nextAdvanceISR = 0; // Wake up eISR on first acceleration loop and fire ISR if final adv_rate is reached - eISR_Rate = current_block->advance_speed; - } - } - else { - eISR_Rate = ADV_NEVER; - if (e_steps) nextAdvanceISR = 0; - } - #endif // LIN_ADVANCE - } - else if (step_events_completed > (uint32_t)current_block->decelerate_after) { - uint16_t step_rate; - - #if ENABLED(BEZIER_JERK_CONTROL) - // If this is the 1st time we process the 2nd half of the trapezoid... - if (!bezier_2nd_half) { - - // Initialize the Bézier speed curve - _calc_bezier_curve_coeffs(current_block->cruise_rate, current_block->final_rate, current_block->deceleration_time_inverse); - bezier_2nd_half = true; - } - - // Calculate the next speed to use - step_rate = deceleration_time < current_block->deceleration_time - ? _eval_bezier_curve(deceleration_time) - : current_block->final_rate; - #else - - // Using the old trapezoidal control - MultiU24X32toH16(step_rate, deceleration_time, current_block->acceleration_rate); - - if (step_rate < acc_step_rate) { // Still decelerating? - step_rate = acc_step_rate - step_rate; - NOLESS(step_rate, current_block->final_rate); - } - else - step_rate = current_block->final_rate; - #endif - - // step_rate to timer interval - const uint16_t interval = calc_timer_interval(step_rate); - - SPLIT(interval); // split step into multiple ISRs if larger than ENDSTOP_NOMINAL_OCR_VAL - _NEXT_ISR(ocr_val); - - deceleration_time += interval; - - #if ENABLED(LIN_ADVANCE) - if (current_block->use_advance_lead) { - if (step_events_completed <= (uint32_t)current_block->decelerate_after + step_loops || (e_steps && eISR_Rate != current_block->advance_speed)) { - nextAdvanceISR = 0; // Wake up eISR on first deceleration loop - eISR_Rate = current_block->advance_speed; - } - } - else { - eISR_Rate = ADV_NEVER; - if (e_steps) nextAdvanceISR = 0; - } - #endif // LIN_ADVANCE - } - else { - - #if ENABLED(LIN_ADVANCE) - // If we have esteps to execute, fire the next advance_isr "now" - if (e_steps && eISR_Rate != current_block->advance_speed) nextAdvanceISR = 0; - #endif - - SPLIT(OCR1A_nominal); // split step into multiple ISRs if larger than ENDSTOP_NOMINAL_OCR_VAL - _NEXT_ISR(ocr_val); - - // ensure we're running at the correct step rate, even if we just came off an acceleration - step_loops = step_loops_nominal; - } - - #if DISABLED(LIN_ADVANCE) - NOLESS(OCR1A, TCNT1 + 16); - #endif - - // If current block is finished, reset pointer - if (all_steps_done) { - current_block = NULL; - planner.discard_current_block(); - } -} - -#if ENABLED(LIN_ADVANCE) - - #define CYCLES_EATEN_E (E_STEPPERS * 5) - #define EXTRA_CYCLES_E (STEP_PULSE_CYCLES - (CYCLES_EATEN_E)) - - // Timer interrupt for E. e_steps is set in the main routine; - - void Stepper::advance_isr() { - - #if ENABLED(MK2_MULTIPLEXER) // For SNMM even-numbered steppers are reversed - #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) E0_DIR_WRITE(e_steps < 0 ? !INVERT_E## INDEX ##_DIR ^ TEST(INDEX, 0) : INVERT_E## INDEX ##_DIR ^ TEST(INDEX, 0)); }while(0) - #elif ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) { if (e_steps < 0) REV_E_DIR(); else NORM_E_DIR(); } }while(0) - #else - #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) E## INDEX ##_DIR_WRITE(e_steps < 0 ? INVERT_E## INDEX ##_DIR : !INVERT_E## INDEX ##_DIR); }while(0) - #endif - - #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - #define START_E_PULSE(INDEX) do{ if (e_steps) E_STEP_WRITE(!INVERT_E_STEP_PIN); }while(0) - #define STOP_E_PULSE(INDEX) do{ if (e_steps) { E_STEP_WRITE(INVERT_E_STEP_PIN); e_steps < 0 ? ++e_steps : --e_steps; } }while(0) - #else - #define START_E_PULSE(INDEX) do{ if (e_steps) E## INDEX ##_STEP_WRITE(!INVERT_E_STEP_PIN); }while(0) - #define STOP_E_PULSE(INDEX) do { if (e_steps) { e_steps < 0 ? ++e_steps : --e_steps; E## INDEX ##_STEP_WRITE(INVERT_E_STEP_PIN); } }while(0) - #endif - - if (use_advance_lead) { - if (step_events_completed > LA_decelerate_after && current_adv_steps > final_adv_steps) { - e_steps--; - current_adv_steps--; - nextAdvanceISR = eISR_Rate; - } - else if (step_events_completed < LA_decelerate_after && current_adv_steps < max_adv_steps) { - //step_events_completed <= (uint32_t)current_block->accelerate_until) { - e_steps++; - current_adv_steps++; - nextAdvanceISR = eISR_Rate; - } - else { - nextAdvanceISR = ADV_NEVER; - eISR_Rate = ADV_NEVER; - } - } - else - nextAdvanceISR = ADV_NEVER; - - switch (LA_active_extruder) { - case 0: SET_E_STEP_DIR(0); break; - #if EXTRUDERS > 1 - case 1: SET_E_STEP_DIR(1); break; - #if EXTRUDERS > 2 - case 2: SET_E_STEP_DIR(2); break; - #if EXTRUDERS > 3 - case 3: SET_E_STEP_DIR(3); break; - #if EXTRUDERS > 4 - case 4: SET_E_STEP_DIR(4); break; - #endif // EXTRUDERS > 4 - #endif // EXTRUDERS > 3 - #endif // EXTRUDERS > 2 - #endif // EXTRUDERS > 1 - } - - // Step E stepper if we have steps - while (e_steps) { - - #if EXTRA_CYCLES_E > 20 - uint32_t pulse_start = TCNT0; - #endif - - switch (LA_active_extruder) { - case 0: START_E_PULSE(0); break; - #if EXTRUDERS > 1 - case 1: START_E_PULSE(1); break; - #if EXTRUDERS > 2 - case 2: START_E_PULSE(2); break; - #if EXTRUDERS > 3 - case 3: START_E_PULSE(3); break; - #if EXTRUDERS > 4 - case 4: START_E_PULSE(4); break; - #endif // EXTRUDERS > 4 - #endif // EXTRUDERS > 3 - #endif // EXTRUDERS > 2 - #endif // EXTRUDERS > 1 - } - - // For minimum pulse time wait before stopping pulses - #if EXTRA_CYCLES_E > 20 - while (EXTRA_CYCLES_E > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } - pulse_start = TCNT0; - #elif EXTRA_CYCLES_E > 0 - DELAY_NOPS(EXTRA_CYCLES_E); - #endif - - switch (LA_active_extruder) { - case 0: STOP_E_PULSE(0); break; - #if EXTRUDERS > 1 - case 1: STOP_E_PULSE(1); break; - #if EXTRUDERS > 2 - case 2: STOP_E_PULSE(2); break; - #if EXTRUDERS > 3 - case 3: STOP_E_PULSE(3); break; - #if EXTRUDERS > 4 - case 4: STOP_E_PULSE(4); break; - #endif // EXTRUDERS > 4 - #endif // EXTRUDERS > 3 - #endif // EXTRUDERS > 2 - #endif // EXTRUDERS > 1 - } - - // For minimum pulse time wait before looping - #if EXTRA_CYCLES_E > 20 - if (e_steps) while (EXTRA_CYCLES_E > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } - #elif EXTRA_CYCLES_E > 0 - if (e_steps) DELAY_NOPS(EXTRA_CYCLES_E); - #endif - - } // e_steps - } - - void Stepper::advance_isr_scheduler() { - - // Run main stepping ISR if flagged - if (!nextMainISR) isr(); - - // Run Advance stepping ISR if flagged - if (!nextAdvanceISR) advance_isr(); - - // Is the next advance ISR scheduled before the next main ISR? - if (nextAdvanceISR <= nextMainISR) { - // Set up the next interrupt - OCR1A = nextAdvanceISR; - // New interval for the next main ISR - if (nextMainISR) nextMainISR -= nextAdvanceISR; - // Will call Stepper::advance_isr on the next interrupt - nextAdvanceISR = 0; - } - else { - // The next main ISR comes first - OCR1A = nextMainISR; - // New interval for the next advance ISR, if any - if (nextAdvanceISR && nextAdvanceISR != ADV_NEVER) - nextAdvanceISR -= nextMainISR; - // Will call Stepper::isr on the next interrupt - nextMainISR = 0; - } - - // Don't run the ISR faster than possible - NOLESS(OCR1A, TCNT1 + 16); - } - -#endif // LIN_ADVANCE - -void Stepper::init() { - - // Init Digipot Motor Current - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - digipot_init(); - #endif - - // Init Microstepping Pins - #if HAS_MICROSTEPS - microstep_init(); - #endif - - // Init Dir Pins - #if HAS_X_DIR - X_DIR_INIT; - #endif - #if HAS_X2_DIR - X2_DIR_INIT; - #endif - #if HAS_Y_DIR - Y_DIR_INIT; - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_DIR - Y2_DIR_INIT; - #endif - #endif - #if HAS_Z_DIR - Z_DIR_INIT; - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_DIR - Z2_DIR_INIT; - #endif - #endif - #if HAS_E0_DIR - E0_DIR_INIT; - #endif - #if HAS_E1_DIR - E1_DIR_INIT; - #endif - #if HAS_E2_DIR - E2_DIR_INIT; - #endif - #if HAS_E3_DIR - E3_DIR_INIT; - #endif - #if HAS_E4_DIR - E4_DIR_INIT; - #endif - - // Init Enable Pins - steppers default to disabled. - #if HAS_X_ENABLE - X_ENABLE_INIT; - if (!X_ENABLE_ON) X_ENABLE_WRITE(HIGH); - #if (ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)) && HAS_X2_ENABLE - X2_ENABLE_INIT; - if (!X_ENABLE_ON) X2_ENABLE_WRITE(HIGH); - #endif - #endif - #if HAS_Y_ENABLE - Y_ENABLE_INIT; - if (!Y_ENABLE_ON) Y_ENABLE_WRITE(HIGH); - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_ENABLE - Y2_ENABLE_INIT; - if (!Y_ENABLE_ON) Y2_ENABLE_WRITE(HIGH); - #endif - #endif - #if HAS_Z_ENABLE - Z_ENABLE_INIT; - if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_ENABLE - Z2_ENABLE_INIT; - if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); - #endif - #endif - #if HAS_E0_ENABLE - E0_ENABLE_INIT; - if (!E_ENABLE_ON) E0_ENABLE_WRITE(HIGH); - #endif - #if HAS_E1_ENABLE - E1_ENABLE_INIT; - if (!E_ENABLE_ON) E1_ENABLE_WRITE(HIGH); - #endif - #if HAS_E2_ENABLE - E2_ENABLE_INIT; - if (!E_ENABLE_ON) E2_ENABLE_WRITE(HIGH); - #endif - #if HAS_E3_ENABLE - E3_ENABLE_INIT; - if (!E_ENABLE_ON) E3_ENABLE_WRITE(HIGH); - #endif - #if HAS_E4_ENABLE - E4_ENABLE_INIT; - if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH); - #endif - - // Init endstops and pullups - endstops.init(); - - #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT - #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) - #define _DISABLE(AXIS) disable_## AXIS() - - #define AXIS_INIT(AXIS, PIN) \ - _STEP_INIT(AXIS); \ - _WRITE_STEP(AXIS, _INVERT_STEP_PIN(PIN)); \ - _DISABLE(AXIS) - - #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) - - // Init Step Pins - #if HAS_X_STEP - #if ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE) - X2_STEP_INIT; - X2_STEP_WRITE(INVERT_X_STEP_PIN); - #endif - AXIS_INIT(X, X); - #endif - - #if HAS_Y_STEP - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - Y2_STEP_INIT; - Y2_STEP_WRITE(INVERT_Y_STEP_PIN); - #endif - AXIS_INIT(Y, Y); - #endif - - #if HAS_Z_STEP - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) - Z2_STEP_INIT; - Z2_STEP_WRITE(INVERT_Z_STEP_PIN); - #endif - AXIS_INIT(Z, Z); - #endif - - #if HAS_E0_STEP - E_AXIS_INIT(0); - #endif - #if HAS_E1_STEP - E_AXIS_INIT(1); - #endif - #if HAS_E2_STEP - E_AXIS_INIT(2); - #endif - #if HAS_E3_STEP - E_AXIS_INIT(3); - #endif - #if HAS_E4_STEP - E_AXIS_INIT(4); - #endif - - // waveform generation = 0100 = CTC - SET_WGM(1, CTC_OCRnA); - - // output mode = 00 (disconnected) - SET_COMA(1, NORMAL); - - // Set the timer pre-scaler - // Generally we use a divider of 8, resulting in a 2MHz timer - // frequency on a 16MHz MCU. If you are going to change this, be - // sure to regenerate speed_lookuptable.h with - // create_speed_lookuptable.py - SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler - - // Init Stepper ISR to 122 Hz for quick starting - OCR1A = 0x4000; - TCNT1 = 0; - - ENABLE_STEPPER_DRIVER_INTERRUPT(); - - endstops.enable(true); // Start with endstops active. After homing they can be disabled - sei(); - - set_directions(); // Init directions to last_direction_bits = 0 -} - - -/** - * Block until all buffered steps are executed / cleaned - */ -void Stepper::synchronize() { while (planner.has_blocks_queued() || cleaning_buffer_counter) idle(); } - -/** - * Set the stepper positions directly in steps - * - * The input is based on the typical per-axis XYZ steps. - * For CORE machines XYZ needs to be translated to ABC. - * - * This allows get_axis_position_mm to correctly - * derive the current XYZ position later on. - */ -void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { - #if CORE_IS_XY - // corexy positioning - // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html - count_position[A_AXIS] = a + b; - count_position[B_AXIS] = CORESIGN(a - b); - count_position[Z_AXIS] = c; - #elif CORE_IS_XZ - // corexz planning - count_position[A_AXIS] = a + c; - count_position[Y_AXIS] = b; - count_position[C_AXIS] = CORESIGN(a - c); - #elif CORE_IS_YZ - // coreyz planning - count_position[X_AXIS] = a; - count_position[B_AXIS] = b + c; - count_position[C_AXIS] = CORESIGN(b - c); - #else - // default non-h-bot planning - count_position[X_AXIS] = a; - count_position[Y_AXIS] = b; - count_position[Z_AXIS] = c; - #endif - count_position[E_AXIS] = e; -} - -/** - * Get a stepper's position in steps. - */ -int32_t Stepper::position(const AxisEnum axis) { - CRITICAL_SECTION_START; - const int32_t count_pos = count_position[axis]; - CRITICAL_SECTION_END; - return count_pos; -} - -/** - * Get an axis position according to stepper position(s) - * For CORE machines apply translation from ABC to XYZ. - */ -float Stepper::get_axis_position_mm(const AxisEnum axis) { - float axis_steps; - #if IS_CORE - // Requesting one of the "core" axes? - if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { - CRITICAL_SECTION_START; - // ((a1+a2)+(a1-a2))/2 -> (a1+a2+a1-a2)/2 -> (a1+a1)/2 -> a1 - // ((a1+a2)-(a1-a2))/2 -> (a1+a2-a1+a2)/2 -> (a2+a2)/2 -> a2 - axis_steps = 0.5f * ( - axis == CORE_AXIS_2 ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) - : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] - ); - CRITICAL_SECTION_END; - } - else - axis_steps = position(axis); - #else - axis_steps = position(axis); - #endif - return axis_steps * planner.steps_to_mm[axis]; -} - -void Stepper::finish_and_disable() { - synchronize(); - disable_all_steppers(); -} - -void Stepper::quick_stop() { - DISABLE_STEPPER_DRIVER_INTERRUPT(); - kill_current_block(); - current_block = NULL; - cleaning_buffer_counter = 5000; - planner.clear_block_buffer(); - ENABLE_STEPPER_DRIVER_INTERRUPT(); - #if ENABLED(ULTRA_LCD) - planner.clear_block_buffer_runtime(); - #endif -} - -void Stepper::endstop_triggered(const AxisEnum axis) { - - #if IS_CORE - - endstops_trigsteps[axis] = 0.5f * ( - axis == CORE_AXIS_2 ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) - : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] - ); - - #else // !COREXY && !COREXZ && !COREYZ - - endstops_trigsteps[axis] = count_position[axis]; - - #endif // !COREXY && !COREXZ && !COREYZ - - kill_current_block(); - cleaning_buffer_counter = -1; // Discard the rest of the move -} - -void Stepper::report_positions() { - CRITICAL_SECTION_START; - const int32_t xpos = count_position[X_AXIS], - ypos = count_position[Y_AXIS], - zpos = count_position[Z_AXIS]; - CRITICAL_SECTION_END; - - #if CORE_IS_XY || CORE_IS_XZ || IS_DELTA || IS_SCARA - SERIAL_PROTOCOLPGM(MSG_COUNT_A); - #else - SERIAL_PROTOCOLPGM(MSG_COUNT_X); - #endif - SERIAL_PROTOCOL(xpos); - - #if CORE_IS_XY || CORE_IS_YZ || IS_DELTA || IS_SCARA - SERIAL_PROTOCOLPGM(" B:"); - #else - SERIAL_PROTOCOLPGM(" Y:"); - #endif - SERIAL_PROTOCOL(ypos); - - #if CORE_IS_XZ || CORE_IS_YZ || IS_DELTA - SERIAL_PROTOCOLPGM(" C:"); - #else - SERIAL_PROTOCOLPGM(" Z:"); - #endif - SERIAL_PROTOCOL(zpos); - - SERIAL_EOL(); -} - -#if ENABLED(BABYSTEPPING) - - #if ENABLED(DELTA) - #define CYCLES_EATEN_BABYSTEP (2 * 15) - #else - #define CYCLES_EATEN_BABYSTEP 0 - #endif - #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP)) - - #define _ENABLE(AXIS) enable_## AXIS() - #define _READ_DIR(AXIS) AXIS ##_DIR_READ - #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR - #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) - - #if EXTRA_CYCLES_BABYSTEP > 20 - #define _SAVE_START const uint32_t pulse_start = TCNT0 - #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } - #else - #define _SAVE_START NOOP - #if EXTRA_CYCLES_BABYSTEP > 0 - #define _PULSE_WAIT DELAY_NOPS(EXTRA_CYCLES_BABYSTEP) - #elif STEP_PULSE_CYCLES > 0 - #define _PULSE_WAIT NOOP - #elif ENABLED(DELTA) - #define _PULSE_WAIT delayMicroseconds(2); - #else - #define _PULSE_WAIT delayMicroseconds(4); - #endif - #endif - - #define BABYSTEP_AXIS(AXIS, INVERT, DIR) { \ - const uint8_t old_dir = _READ_DIR(AXIS); \ - _ENABLE(AXIS); \ - _SAVE_START; \ - _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INVERT); \ - _PULSE_WAIT; \ - _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), true); \ - _PULSE_WAIT; \ - _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), true); \ - _APPLY_DIR(AXIS, old_dir); \ - } - - // MUST ONLY BE CALLED BY AN ISR, - // No other ISR should ever interrupt this! - void Stepper::babystep(const AxisEnum axis, const bool direction) { - cli(); - - switch (axis) { - - #if ENABLED(BABYSTEP_XY) - - case X_AXIS: - #if CORE_IS_XY - BABYSTEP_AXIS(X, false, direction); - BABYSTEP_AXIS(Y, false, direction); - #elif CORE_IS_XZ - BABYSTEP_AXIS(X, false, direction); - BABYSTEP_AXIS(Z, false, direction); - #else - BABYSTEP_AXIS(X, false, direction); - #endif - break; - - case Y_AXIS: - #if CORE_IS_XY - BABYSTEP_AXIS(X, false, direction); - BABYSTEP_AXIS(Y, false, direction^(CORESIGN(1)<0)); - #elif CORE_IS_YZ - BABYSTEP_AXIS(Y, false, direction); - BABYSTEP_AXIS(Z, false, direction^(CORESIGN(1)<0)); - #else - BABYSTEP_AXIS(Y, false, direction); - #endif - break; - - #endif - - case Z_AXIS: { - - #if CORE_IS_XZ - BABYSTEP_AXIS(X, BABYSTEP_INVERT_Z, direction); - BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); - - #elif CORE_IS_YZ - BABYSTEP_AXIS(Y, BABYSTEP_INVERT_Z, direction); - BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); - - #elif DISABLED(DELTA) - BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction); - - #else // DELTA - - const bool z_direction = direction ^ BABYSTEP_INVERT_Z; - - enable_X(); - enable_Y(); - enable_Z(); - - const uint8_t old_x_dir_pin = X_DIR_READ, - old_y_dir_pin = Y_DIR_READ, - old_z_dir_pin = Z_DIR_READ; - - X_DIR_WRITE(INVERT_X_DIR ^ z_direction); - Y_DIR_WRITE(INVERT_Y_DIR ^ z_direction); - Z_DIR_WRITE(INVERT_Z_DIR ^ z_direction); - - _SAVE_START; - - X_STEP_WRITE(!INVERT_X_STEP_PIN); - Y_STEP_WRITE(!INVERT_Y_STEP_PIN); - Z_STEP_WRITE(!INVERT_Z_STEP_PIN); - - _PULSE_WAIT; - - X_STEP_WRITE(INVERT_X_STEP_PIN); - Y_STEP_WRITE(INVERT_Y_STEP_PIN); - Z_STEP_WRITE(INVERT_Z_STEP_PIN); - - // Restore direction bits - X_DIR_WRITE(old_x_dir_pin); - Y_DIR_WRITE(old_y_dir_pin); - Z_DIR_WRITE(old_z_dir_pin); - - #endif - - } break; - - default: break; - } - sei(); - } - -#endif // BABYSTEPPING - -/** - * Software-controlled Stepper Motor Current - */ - -#if HAS_DIGIPOTSS - - // From Arduino DigitalPotControl example - void Stepper::digitalPotWrite(const int16_t address, const int16_t value) { - WRITE(DIGIPOTSS_PIN, LOW); // Take the SS pin low to select the chip - SPI.transfer(address); // Send the address and value via SPI - SPI.transfer(value); - WRITE(DIGIPOTSS_PIN, HIGH); // Take the SS pin high to de-select the chip - //delay(10); - } - -#endif // HAS_DIGIPOTSS - -#if HAS_MOTOR_CURRENT_PWM - - void Stepper::refresh_motor_power() { - for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) { - switch (i) { - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - case 0: - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - case 1: - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - case 2: - #endif - digipot_current(i, motor_current_setting[i]); - default: break; - } - } - } - -#endif // HAS_MOTOR_CURRENT_PWM - -#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - - void Stepper::digipot_current(const uint8_t driver, const int current) { - - #if HAS_DIGIPOTSS - - const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; - digitalPotWrite(digipot_ch[driver], current); - - #elif HAS_MOTOR_CURRENT_PWM - - if (WITHIN(driver, 0, 2)) - motor_current_setting[driver] = current; // update motor_current_setting - - #define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) - switch (driver) { - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - case 0: _WRITE_CURRENT_PWM(XY); break; - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - case 1: _WRITE_CURRENT_PWM(Z); break; - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - case 2: _WRITE_CURRENT_PWM(E); break; - #endif - } - #endif - } - - void Stepper::digipot_init() { - - #if HAS_DIGIPOTSS - - static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; - - SPI.begin(); - SET_OUTPUT(DIGIPOTSS_PIN); - - for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { - //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); - digipot_current(i, digipot_motor_current[i]); - } - - #elif HAS_MOTOR_CURRENT_PWM - - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN); - #endif - - refresh_motor_power(); - - // Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) - SET_CS5(PRESCALER_1); - - #endif - } - -#endif - -#if HAS_MICROSTEPS - - /** - * Software-controlled Microstepping - */ - - void Stepper::microstep_init() { - SET_OUTPUT(X_MS1_PIN); - SET_OUTPUT(X_MS2_PIN); - #if HAS_Y_MICROSTEPS - SET_OUTPUT(Y_MS1_PIN); - SET_OUTPUT(Y_MS2_PIN); - #endif - #if HAS_Z_MICROSTEPS - SET_OUTPUT(Z_MS1_PIN); - SET_OUTPUT(Z_MS2_PIN); - #endif - #if HAS_E0_MICROSTEPS - SET_OUTPUT(E0_MS1_PIN); - SET_OUTPUT(E0_MS2_PIN); - #endif - #if HAS_E1_MICROSTEPS - SET_OUTPUT(E1_MS1_PIN); - SET_OUTPUT(E1_MS2_PIN); - #endif - #if HAS_E2_MICROSTEPS - SET_OUTPUT(E2_MS1_PIN); - SET_OUTPUT(E2_MS2_PIN); - #endif - #if HAS_E3_MICROSTEPS - SET_OUTPUT(E3_MS1_PIN); - SET_OUTPUT(E3_MS2_PIN); - #endif - #if HAS_E4_MICROSTEPS - SET_OUTPUT(E4_MS1_PIN); - SET_OUTPUT(E4_MS2_PIN); - #endif - static const uint8_t microstep_modes[] = MICROSTEP_MODES; - for (uint16_t i = 0; i < COUNT(microstep_modes); i++) - microstep_mode(i, microstep_modes[i]); - } - - void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2) { - if (ms1 >= 0) switch (driver) { - case 0: WRITE(X_MS1_PIN, ms1); break; - #if HAS_Y_MICROSTEPS - case 1: WRITE(Y_MS1_PIN, ms1); break; - #endif - #if HAS_Z_MICROSTEPS - case 2: WRITE(Z_MS1_PIN, ms1); break; - #endif - #if HAS_E0_MICROSTEPS - case 3: WRITE(E0_MS1_PIN, ms1); break; - #endif - #if HAS_E1_MICROSTEPS - case 4: WRITE(E1_MS1_PIN, ms1); break; - #endif - #if HAS_E2_MICROSTEPS - case 5: WRITE(E2_MS1_PIN, ms1); break; - #endif - #if HAS_E3_MICROSTEPS - case 6: WRITE(E3_MS1_PIN, ms1); break; - #endif - #if HAS_E4_MICROSTEPS - case 7: WRITE(E4_MS1_PIN, ms1); break; - #endif - } - if (ms2 >= 0) switch (driver) { - case 0: WRITE(X_MS2_PIN, ms2); break; - #if HAS_Y_MICROSTEPS - case 1: WRITE(Y_MS2_PIN, ms2); break; - #endif - #if HAS_Z_MICROSTEPS - case 2: WRITE(Z_MS2_PIN, ms2); break; - #endif - #if HAS_E0_MICROSTEPS - case 3: WRITE(E0_MS2_PIN, ms2); break; - #endif - #if HAS_E1_MICROSTEPS - case 4: WRITE(E1_MS2_PIN, ms2); break; - #endif - #if HAS_E2_MICROSTEPS - case 5: WRITE(E2_MS2_PIN, ms2); break; - #endif - #if HAS_E3_MICROSTEPS - case 6: WRITE(E3_MS2_PIN, ms2); break; - #endif - #if HAS_E4_MICROSTEPS - case 7: WRITE(E4_MS2_PIN, ms2); break; - #endif - } - } - - void Stepper::microstep_mode(const uint8_t driver, const uint8_t stepping_mode) { - switch (stepping_mode) { - case 1: microstep_ms(driver, MICROSTEP1); break; - #if ENABLED(HEROIC_STEPPER_DRIVERS) - case 128: microstep_ms(driver, MICROSTEP128); break; - #else - case 2: microstep_ms(driver, MICROSTEP2); break; - case 4: microstep_ms(driver, MICROSTEP4); break; - #endif - case 8: microstep_ms(driver, MICROSTEP8); break; - case 16: microstep_ms(driver, MICROSTEP16); break; - default: SERIAL_ERROR_START(); SERIAL_ERRORLNPGM("Microsteps unavailable"); break; - } - } - - void Stepper::microstep_readings() { - SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); - SERIAL_PROTOCOLPGM("X: "); - SERIAL_PROTOCOL(READ(X_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(X_MS2_PIN)); - #if HAS_Y_MICROSTEPS - SERIAL_PROTOCOLPGM("Y: "); - SERIAL_PROTOCOL(READ(Y_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(Y_MS2_PIN)); - #endif - #if HAS_Z_MICROSTEPS - SERIAL_PROTOCOLPGM("Z: "); - SERIAL_PROTOCOL(READ(Z_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(Z_MS2_PIN)); - #endif - #if HAS_E0_MICROSTEPS - SERIAL_PROTOCOLPGM("E0: "); - SERIAL_PROTOCOL(READ(E0_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(E0_MS2_PIN)); - #endif - #if HAS_E1_MICROSTEPS - SERIAL_PROTOCOLPGM("E1: "); - SERIAL_PROTOCOL(READ(E1_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(E1_MS2_PIN)); - #endif - #if HAS_E2_MICROSTEPS - SERIAL_PROTOCOLPGM("E2: "); - SERIAL_PROTOCOL(READ(E2_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(E2_MS2_PIN)); - #endif - #if HAS_E3_MICROSTEPS - SERIAL_PROTOCOLPGM("E3: "); - SERIAL_PROTOCOL(READ(E3_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(E3_MS2_PIN)); - #endif - #if HAS_E4_MICROSTEPS - SERIAL_PROTOCOLPGM("E4: "); - SERIAL_PROTOCOL(READ(E4_MS1_PIN)); - SERIAL_PROTOCOLLN(READ(E4_MS2_PIN)); - #endif - } - -#endif // HAS_MICROSTEPS diff --git a/Marlin/stepper.h b/Marlin/stepper.h deleted file mode 100644 index 087b8593e4..0000000000 --- a/Marlin/stepper.h +++ /dev/null @@ -1,401 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - * stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors - * Derived from Grbl - * - * Copyright (c) 2009-2011 Simen Svale Skogsrud - * - * Grbl 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 3 of the License, or - * (at your option) any later version. - * - * Grbl 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 Grbl. If not, see . - */ - -#ifndef STEPPER_H -#define STEPPER_H - -#include "planner.h" -#include "speed_lookuptable.h" -#include "stepper_indirection.h" -#include "language.h" -#include "types.h" - -class Stepper; -extern Stepper stepper; - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) -#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) -#define HAL_STEPPER_TIMER_RATE ((F_CPU) * 0.125) - -// intRes = intIn1 * intIn2 >> 16 -// uses: -// r26 to store 0 -// r27 to store the byte 1 of the 24 bit result -#define MultiU16X8toH16(intRes, charIn1, intIn2) \ - asm volatile ( \ - A("clr r26") \ - A("mul %A1, %B2") \ - A("movw %A0, r0") \ - A("mul %A1, %A2") \ - A("add %A0, r1") \ - A("adc %B0, r26") \ - A("lsr r0") \ - A("adc %A0, r26") \ - A("adc %B0, r26") \ - A("clr r1") \ - : \ - "=&r" (intRes) \ - : \ - "d" (charIn1), \ - "d" (intIn2) \ - : \ - "r26" \ - ) - -class Stepper { - - public: - - static block_t* current_block; // A pointer to the block currently being traced - - #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - static bool abort_on_endstop_hit; - #endif - - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - static bool performing_homing; - #endif - - #if HAS_MOTOR_CURRENT_PWM - #ifndef PWM_MOTOR_CURRENT - #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT - #endif - static uint32_t motor_current_setting[3]; - #endif - - static int16_t cleaning_buffer_counter; - - private: - - static uint8_t last_direction_bits; // The next stepping-bits to be output - - #if ENABLED(X_DUAL_ENDSTOPS) - static bool locked_x_motor, locked_x2_motor; - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - static bool locked_y_motor, locked_y2_motor; - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - static bool locked_z_motor, locked_z2_motor; - #endif - - // Counter variables for the Bresenham line tracer - static int32_t counter_X, counter_Y, counter_Z, counter_E; - static volatile uint32_t step_events_completed; // The number of step events executed in the current block - - #if ENABLED(BEZIER_JERK_CONTROL) - static int32_t bezier_A, // A coefficient in Bézier speed curve - bezier_B, // B coefficient in Bézier speed curve - bezier_C; // C coefficient in Bézier speed curve - static uint32_t bezier_F, // F coefficient in Bézier speed curve - bezier_AV; // AV coefficient in Bézier speed curve - static bool A_negative, // If A coefficient was negative - bezier_2nd_half; // If Bézier curve has been initialized or not - #endif - - #if ENABLED(LIN_ADVANCE) - - static uint32_t LA_decelerate_after; // Copy from current executed block. Needed because current_block is set to NULL "too early". - static uint16_t nextMainISR, nextAdvanceISR, eISR_Rate, current_adv_steps, - final_adv_steps, max_adv_steps; // Copy from current executed block. Needed because current_block is set to NULL "too early". - #define _NEXT_ISR(T) nextMainISR = T - static int8_t e_steps; - static bool use_advance_lead; - #if E_STEPPERS > 1 - static int8_t LA_active_extruder; // Copy from current executed block. Needed because current_block is set to NULL "too early". - #else - static constexpr int8_t LA_active_extruder = 0; - #endif - - #else // !LIN_ADVANCE - - #define _NEXT_ISR(T) OCR1A = T - - #endif // !LIN_ADVANCE - - static int32_t acceleration_time, deceleration_time; - static uint8_t step_loops, step_loops_nominal; - - static uint16_t OCR1A_nominal; - #if DISABLED(BEZIER_JERK_CONTROL) - static uint16_t acc_step_rate; // needed for deceleration start point - #endif - - static volatile int32_t endstops_trigsteps[XYZ]; - static volatile int32_t endstops_stepsTotal, endstops_stepsDone; - - // - // Positions of stepper motors, in step units - // - static volatile int32_t count_position[NUM_AXIS]; - - // - // Current direction of stepper motors (+1 or -1) - // - static volatile signed char count_direction[NUM_AXIS]; - - // - // Mixing extruder mix counters - // - #if ENABLED(MIXING_EXTRUDER) - static int32_t counter_m[MIXING_STEPPERS]; - #define MIXING_STEPPERS_LOOP(VAR) \ - for (uint8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) \ - if (current_block->mix_event_count[VAR]) - #endif - - public: - - // - // Constructor / initializer - // - Stepper() { }; - - // - // Initialize stepper hardware - // - static void init(); - - // - // Interrupt Service Routines - // - - static void isr(); - - #if ENABLED(LIN_ADVANCE) - static void advance_isr(); - static void advance_isr_scheduler(); - #endif - - // - // Block until all buffered steps are executed - // - static void synchronize(); - - // - // Set the current position in steps - // - static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); - - FORCE_INLINE static void _set_position(const AxisEnum a, const int32_t &v) { count_position[a] = v; } - - FORCE_INLINE static void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { - synchronize(); - CRITICAL_SECTION_START; - _set_position(a, b, c, e); - CRITICAL_SECTION_END; - } - - static void set_position(const AxisEnum a, const int32_t &v) { - synchronize(); - CRITICAL_SECTION_START; - count_position[a] = v; - CRITICAL_SECTION_END; - } - - FORCE_INLINE static void _set_e_position(const int32_t &e) { count_position[E_AXIS] = e; } - - static void set_e_position(const int32_t &e) { - synchronize(); - CRITICAL_SECTION_START; - count_position[E_AXIS] = e; - CRITICAL_SECTION_END; - } - - // - // Set direction bits for all steppers - // - static void set_directions(); - - // - // Get the position of a stepper, in steps - // - static int32_t position(const AxisEnum axis); - - // - // Report the positions of the steppers, in steps - // - static void report_positions(); - - // - // Get the position (mm) of an axis based on stepper position(s) - // - static float get_axis_position_mm(const AxisEnum axis); - - // - // SCARA AB axes are in degrees, not mm - // - #if IS_SCARA - FORCE_INLINE static float get_axis_position_degrees(const AxisEnum axis) { return get_axis_position_mm(axis); } - #endif - - // - // The stepper subsystem goes to sleep when it runs out of things to execute. Call this - // to notify the subsystem that it is time to go to work. - // - static void wake_up(); - - // - // Wait for moves to finish and disable all steppers - // - static void finish_and_disable(); - - // - // Quickly stop all steppers and clear the blocks queue - // - static void quick_stop(); - - // - // The direction of a single motor - // - FORCE_INLINE static bool motor_direction(const AxisEnum axis) { return TEST(last_direction_bits, axis); } - - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - static void digitalPotWrite(const int16_t address, const int16_t value); - static void digipot_current(const uint8_t driver, const int16_t current); - #endif - - #if HAS_MICROSTEPS - static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2); - static void microstep_mode(const uint8_t driver, const uint8_t stepping); - static void microstep_readings(); - #endif - - #if ENABLED(X_DUAL_ENDSTOPS) - FORCE_INLINE static void set_homing_flag_x(const bool state) { performing_homing = state; } - FORCE_INLINE static void set_x_lock(const bool state) { locked_x_motor = state; } - FORCE_INLINE static void set_x2_lock(const bool state) { locked_x2_motor = state; } - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - FORCE_INLINE static void set_homing_flag_y(const bool state) { performing_homing = state; } - FORCE_INLINE static void set_y_lock(const bool state) { locked_y_motor = state; } - FORCE_INLINE static void set_y2_lock(const bool state) { locked_y2_motor = state; } - #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - FORCE_INLINE static void set_homing_flag_z(const bool state) { performing_homing = state; } - FORCE_INLINE static void set_z_lock(const bool state) { locked_z_motor = state; } - FORCE_INLINE static void set_z2_lock(const bool state) { locked_z2_motor = state; } - #endif - - #if ENABLED(BABYSTEPPING) - static void babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention - #endif - - static inline void kill_current_block() { - step_events_completed = current_block->step_event_count; - } - - // - // Handle a triggered endstop - // - static void endstop_triggered(const AxisEnum axis); - - // - // Triggered position of an axis in mm (not core-savvy) - // - FORCE_INLINE static float triggered_position_mm(const AxisEnum axis) { - return endstops_trigsteps[axis] * planner.steps_to_mm[axis]; - } - - #if HAS_MOTOR_CURRENT_PWM - static void refresh_motor_power(); - #endif - - private: - - FORCE_INLINE static uint16_t calc_timer_interval(uint16_t step_rate) { - uint16_t timer; - - NOMORE(step_rate, MAX_STEP_FREQUENCY); - - if (step_rate > 20000) { // If steprate > 20kHz >> step 4 times - step_rate >>= 2; - step_loops = 4; - } - else if (step_rate > 10000) { // If steprate > 10kHz >> step 2 times - step_rate >>= 1; - step_loops = 2; - } - else { - step_loops = 1; - } - - NOLESS(step_rate, F_CPU / 500000); - step_rate -= F_CPU / 500000; // Correct for minimal speed - if (step_rate >= (8 * 256)) { // higher step rate - unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate >> 8)][0]; - unsigned char tmp_step_rate = (step_rate & 0x00FF); - unsigned short gain = (unsigned short)pgm_read_word_near(table_address + 2); - MultiU16X8toH16(timer, tmp_step_rate, gain); - timer = (unsigned short)pgm_read_word_near(table_address) - timer; - } - else { // lower step rates - unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; - table_address += ((step_rate) >> 1) & 0xFFFC; - timer = (unsigned short)pgm_read_word_near(table_address); - timer -= (((unsigned short)pgm_read_word_near(table_address + 2) * (unsigned char)(step_rate & 0x0007)) >> 3); - } - if (timer < 100) { // (20kHz - this should never happen) - timer = 100; - SERIAL_PROTOCOL(MSG_STEPPER_TOO_HIGH); - SERIAL_PROTOCOLLN(step_rate); - } - return timer; - } - - #if ENABLED(BEZIER_JERK_CONTROL) - static void _calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av); - static int32_t _eval_bezier_curve(const uint32_t curr_step); - #endif - - #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - static void digipot_init(); - #endif - - #if HAS_MICROSTEPS - static void microstep_init(); - #endif - -}; - -#endif // STEPPER_H diff --git a/Marlin/stepper_dac.cpp b/Marlin/stepper_dac.cpp deleted file mode 100644 index 2013d20302..0000000000 --- a/Marlin/stepper_dac.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -/** - stepper_dac.cpp - To set stepper current via DAC - - Part of Marlin - - Copyright (c) 2016 MarlinFirmware - - Marlin 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 3 of the License, or - (at your option) any later version. - - Marlin 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 Marlin. If not, see . -*/ - -#include "Marlin.h" - -#if ENABLED(DAC_STEPPER_CURRENT) - - #include "stepper_dac.h" - - bool dac_present = false; - const uint8_t dac_order[NUM_AXIS] = DAC_STEPPER_ORDER; - uint8_t dac_channel_pct[XYZE] = DAC_MOTOR_CURRENT_DEFAULT; - - int dac_init() { - #if PIN_EXISTS(DAC_DISABLE) - OUT_WRITE(DAC_DISABLE_PIN, LOW); // set pin low to enable DAC - #endif - - mcp4728_init(); - - if (mcp4728_simpleCommand(RESET)) return -1; - - dac_present = true; - - mcp4728_setVref_all(DAC_STEPPER_VREF); - mcp4728_setGain_all(DAC_STEPPER_GAIN); - - if (mcp4728_getDrvPct(0) < 1 || mcp4728_getDrvPct(1) < 1 || mcp4728_getDrvPct(2) < 1 || mcp4728_getDrvPct(3) < 1 ) { - mcp4728_setDrvPct(dac_channel_pct); - mcp4728_eepromWrite(); - } - - return 0; - } - - void dac_current_percent(uint8_t channel, float val) { - if (!dac_present) return; - - NOMORE(val, 100); - - mcp4728_analogWrite(dac_order[channel], val * 0.01 * (DAC_STEPPER_MAX)); - mcp4728_simpleCommand(UPDATE); - } - - void dac_current_raw(uint8_t channel, uint16_t val) { - if (!dac_present) return; - - NOMORE(val, DAC_STEPPER_MAX); - - mcp4728_analogWrite(dac_order[channel], val); - mcp4728_simpleCommand(UPDATE); - } - - static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) * (1.0 / (DAC_STEPPER_MAX)); } - static float dac_amps(int8_t n) { return mcp4728_getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * (1.0 / (DAC_STEPPER_SENSE)); } - - uint8_t dac_current_get_percent(const AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } - void dac_current_set_percents(const uint8_t pct[XYZE]) { - LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; - mcp4728_setDrvPct(dac_channel_pct); - } - - void dac_print_values() { - if (!dac_present) return; - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPGM("Stepper current values in % (Amps):"); - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" X:", dac_perc(X_AXIS)); - SERIAL_ECHOPAIR(" (", dac_amps(X_AXIS)); - SERIAL_ECHOPAIR(") Y:", dac_perc(Y_AXIS)); - SERIAL_ECHOPAIR(" (", dac_amps(Y_AXIS)); - SERIAL_ECHOPAIR(") Z:", dac_perc(Z_AXIS)); - SERIAL_ECHOPAIR(" (", dac_amps(Z_AXIS)); - SERIAL_ECHOPAIR(") E:", dac_perc(E_AXIS)); - SERIAL_ECHOPAIR(" (", dac_amps(E_AXIS)); - SERIAL_ECHOLNPGM(")"); - } - - void dac_commit_eeprom() { - if (!dac_present) return; - mcp4728_eepromWrite(); - } - -#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/thermistortable_70.h b/Marlin/thermistortable_70.h deleted file mode 100644 index fd7838b809..0000000000 --- a/Marlin/thermistortable_70.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, bqh2 stock thermistor -const short temptable_70[][2] PROGMEM = { - { OV( 22), 300 }, - { OV( 24), 295 }, - { OV( 25), 290 }, - { OV( 27), 285 }, - { OV( 29), 280 }, - { OV( 32), 275 }, - { OV( 34), 270 }, - { OV( 37), 265 }, - { OV( 40), 260 }, - { OV( 43), 255 }, - { OV( 46), 250 }, - { OV( 50), 245 }, - { OV( 54), 240 }, - { OV( 59), 235 }, - { OV( 64), 230 }, - { OV( 70), 225 }, - { OV( 76), 220 }, - { OV( 83), 215 }, - { OV( 90), 210 }, - { OV( 99), 205 }, - { OV( 108), 200 }, - { OV( 118), 195 }, - { OV( 129), 190 }, - { OV( 141), 185 }, - { OV( 154), 180 }, - { OV( 169), 175 }, - { OV( 185), 170 }, - { OV( 203), 165 }, - { OV( 222), 160 }, - { OV( 243), 155 }, - { OV( 266), 150 }, - { OV( 290), 145 }, - { OV( 317), 140 }, - { OV( 346), 135 }, - { OV( 376), 130 }, - { OV( 408), 125 }, - { OV( 442), 120 }, - { OV( 477), 115 }, - { OV( 513), 110 }, - { OV( 551), 105 }, - { OV( 588), 100 }, - { OV( 626), 95 }, - { OV( 663), 90 }, - { OV( 699), 85 }, - { OV( 735), 80 }, - { OV( 768), 75 }, - { OV( 800), 70 }, - { OV( 829), 65 }, - { OV( 856), 60 }, - { OV( 881), 55 }, - { OV( 903), 50 }, - { OV( 922), 45 }, - { OV( 939), 40 }, - { OV( 954), 35 }, - { OV( 966), 30 }, - { OV( 977), 25 }, - { OV( 986), 20 }, - { OV( 994), 15 }, - { OV(1000), 10 }, - { OV(1005), 5 }, - { OV(1009), 0 } // safety -}; diff --git a/Marlin/thermistortable_75.h b/Marlin/thermistortable_75.h deleted file mode 100644 index dda764949f..0000000000 --- a/Marlin/thermistortable_75.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, -// Generic Silicon Heat Pad with NTC 100K thermistor -// -// Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor It is used for various -// wattage and voltage heat pads. This table is correct if this part is used. It has been -// optimized to provide good granularity around the 60 C. and 110 C. which corrisponds to bed temperatures -// for PLA and ABS. If you are printing higher temperature filament such as nylon you can uncomment -// the higher earlier entries in the table to give better accuracy. But for speed reasons, if these -// temperatures are not going to be used, it is better to leave them commented out. - -const short temptable_75[][2] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor - { OV( 111.06), 200 }, // v=0.542 r=571.747 res=0.501 degC/count -// { OV( 174.87), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no -// { OV( 191.64), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so -// { OV( 209.99), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful -// { OV( 230.02), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner. -// { OV( 251.80), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count - { OV( 275.43), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count -// { OV( 300.92), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun - { OV( 328.32), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count - { OV( 388.65), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count - { OV( 421.39), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count - { OV( 455.65), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count - { OV( 491.17), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count - { OV( 527.68), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count - { OV( 564.81), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count - { OV( 602.19), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count - { OV( 676.03), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count - { OV( 745.85), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count - { OV( 778.31), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count - { OV( 808.75), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count - { OV( 836.94), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count - { OV( 862.74), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count - { OV( 886.08), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count - { OV( 906.97), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count - { OV( 941.65), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count - { OV( 967.76), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count - { OV( 978.03), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count - { OV( 981.68), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count - { OV( 983.41), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count - { OV( 985.08), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count - { OV( 986.70), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count - { OV( 993.94), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count - { OV( 999.96), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count - { OV(1008.95), 0 } // v=4.926 r=314997.575 res=1.418 degC/count -}; - - diff --git a/Marlin/ubl_motion.cpp b/Marlin/ubl_motion.cpp deleted file mode 100644 index 24a3b7dc46..0000000000 --- a/Marlin/ubl_motion.cpp +++ /dev/null @@ -1,577 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ -#include "MarlinConfig.h" - -#if ENABLED(AUTO_BED_LEVELING_UBL) - - #include "Marlin.h" - #include "ubl.h" - #include "planner.h" - #include "stepper.h" - #include - #include - - #if AVR_AT90USB1286_FAMILY // Teensyduino & Printrboard IDE extensions have compile errors without this - inline void set_current_from_destination() { COPY(current_position, destination); } - #else - extern void set_current_from_destination(); - #endif - - #if !UBL_SEGMENTED - - void unified_bed_leveling::line_to_destination_cartesian(const float &feed_rate, const uint8_t extruder) { - /** - * Much of the nozzle movement will be within the same cell. So we will do as little computation - * as possible to determine if this is the case. If this move is within the same cell, we will - * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave - */ - #if ENABLED(SKEW_CORRECTION) - // For skew correction just adjust the destination point and we're done - float start[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }, - end[XYZE] = { destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS] }; - planner.skew(start[X_AXIS], start[Y_AXIS], start[Z_AXIS]); - planner.skew(end[X_AXIS], end[Y_AXIS], end[Z_AXIS]); - #else - const float (&start)[XYZE] = current_position, - (&end)[XYZE] = destination; - #endif - - const int cell_start_xi = get_cell_index_x(start[X_AXIS]), - cell_start_yi = get_cell_index_y(start[Y_AXIS]), - cell_dest_xi = get_cell_index_x(end[X_AXIS]), - cell_dest_yi = get_cell_index_y(end[Y_AXIS]); - - if (g26_debug_flag) { - SERIAL_ECHOPAIR(" ubl.line_to_destination_cartesian(xe=", destination[X_AXIS]); - SERIAL_ECHOPAIR(", ye=", destination[Y_AXIS]); - SERIAL_ECHOPAIR(", ze=", destination[Z_AXIS]); - SERIAL_ECHOPAIR(", ee=", destination[E_AXIS]); - SERIAL_CHAR(')'); - SERIAL_EOL(); - debug_current_and_destination(PSTR("Start of ubl.line_to_destination_cartesian()")); - } - - // A move within the same cell needs no splitting - if (cell_start_xi == cell_dest_xi && cell_start_yi == cell_dest_yi) { - - // For a move off the bed, use a constant Z raise - if (!WITHIN(cell_dest_xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cell_dest_yi, 0, GRID_MAX_POINTS_Y - 1)) { - - // Note: There is no Z Correction in this case. We are off the grid and don't know what - // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH - // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. - - const float z_raise = 0.0 - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - + UBL_Z_RAISE_WHEN_OFF_MESH - #endif - ; - planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + z_raise, end[E_AXIS], feed_rate, extruder); - set_current_from_destination(); - - if (g26_debug_flag) - debug_current_and_destination(PSTR("out of bounds in ubl.line_to_destination_cartesian()")); - - return; - } - - FINAL_MOVE: - - // The distance is always MESH_X_DIST so multiply by the constant reciprocal. - const float xratio = (end[X_AXIS] - mesh_index_to_xpos(cell_dest_xi)) * (1.0 / (MESH_X_DIST)); - - float z1 = z_values[cell_dest_xi ][cell_dest_yi ] + xratio * - (z_values[cell_dest_xi + 1][cell_dest_yi ] - z_values[cell_dest_xi][cell_dest_yi ]), - z2 = z_values[cell_dest_xi ][cell_dest_yi + 1] + xratio * - (z_values[cell_dest_xi + 1][cell_dest_yi + 1] - z_values[cell_dest_xi][cell_dest_yi + 1]); - - if (cell_dest_xi >= GRID_MAX_POINTS_X - 1) z1 = z2 = 0.0; - - // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. - const float yratio = (end[Y_AXIS] - mesh_index_to_ypos(cell_dest_yi)) * (1.0 / (MESH_Y_DIST)), - z0 = cell_dest_yi < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end[Z_AXIS]) : 0.0; - - // Undefined parts of the Mesh in z_values[][] are NAN. - // Replace NAN corrections with 0.0 to prevent NAN propagation. - planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + (isnan(z0) ? 0.0 : z0), end[E_AXIS], feed_rate, extruder); - - if (g26_debug_flag) - debug_current_and_destination(PSTR("FINAL_MOVE in ubl.line_to_destination_cartesian()")); - - set_current_from_destination(); - return; - } - - /** - * Past this point the move is known to cross one or more mesh lines. Check for the most common - * case - crossing only one X or Y line - after details are worked out to reduce computation. - */ - - const float dx = end[X_AXIS] - start[X_AXIS], - dy = end[Y_AXIS] - start[Y_AXIS]; - - const int left_flag = dx < 0.0 ? 1 : 0, - down_flag = dy < 0.0 ? 1 : 0; - - const float adx = left_flag ? -dx : dx, - ady = down_flag ? -dy : dy; - - const int dxi = cell_start_xi == cell_dest_xi ? 0 : left_flag ? -1 : 1, - dyi = cell_start_yi == cell_dest_yi ? 0 : down_flag ? -1 : 1; - - /** - * Compute the extruder scaling factor for each partial move, checking for - * zero-length moves that would result in an infinite scaling factor. - * A float divide is required for this, but then it just multiplies. - * Also select a scaling factor based on the larger of the X and Y - * components. The larger of the two is used to preserve precision. - */ - - const bool use_x_dist = adx > ady; - - float on_axis_distance = use_x_dist ? dx : dy, - e_position = end[E_AXIS] - start[E_AXIS], - z_position = end[Z_AXIS] - start[Z_AXIS]; - - const float e_normalized_dist = e_position / on_axis_distance, - z_normalized_dist = z_position / on_axis_distance; - - int current_xi = cell_start_xi, - current_yi = cell_start_yi; - - const float m = dy / dx, - c = start[Y_AXIS] - m * start[X_AXIS]; - - const bool inf_normalized_flag = (isinf(e_normalized_dist) != 0), - inf_m_flag = (isinf(m) != 0); - - /** - * Handle vertical lines that stay within one column. - * These need not be perfectly vertical. - */ - if (dxi == 0) { // Vertical line? - current_yi += down_flag; // Line going down? Just go to the bottom. - while (current_yi != cell_dest_yi + down_flag) { - current_yi += dyi; - const float next_mesh_line_y = mesh_index_to_ypos(current_yi); - - /** - * Skip the calculations for an infinite slope. - * For others the next X is the same so this can continue. - * Calculate X at the next Y mesh line. - */ - const float rx = inf_m_flag ? start[X_AXIS] : (next_mesh_line_y - c) / m; - - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi, current_yi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); - - // Undefined parts of the Mesh in z_values[][] are NAN. - // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; - - const float ry = mesh_index_to_ypos(current_yi); - - /** - * Without this check, it's possible to generate a zero length move, as in the case where - * the line is heading down, starting exactly on a mesh line boundary. Since this is rare - * it might be fine to remove this check and let planner.buffer_segment() filter it out. - */ - if (ry != start[Y_AXIS]) { - if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; - } - else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; - } - - planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder); - } //else printf("FIRST MOVE PRUNED "); - } - - if (g26_debug_flag) - debug_current_and_destination(PSTR("vertical move done in ubl.line_to_destination_cartesian()")); - - // At the final destination? Usually not, but when on a Y Mesh Line it's completed. - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) - goto FINAL_MOVE; - - set_current_from_destination(); - return; - } - - /** - * Handle horizontal lines that stay within one row. - * These need not be perfectly horizontal. - */ - if (dyi == 0) { // Horizontal line? - current_xi += left_flag; // Heading left? Just go to the left edge of the cell for the first move. - while (current_xi != cell_dest_xi + left_flag) { - current_xi += dxi; - const float next_mesh_line_x = mesh_index_to_xpos(current_xi), - ry = m * next_mesh_line_x + c; // Calculate Y at the next X mesh line - - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi, current_yi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); - - // Undefined parts of the Mesh in z_values[][] are NAN. - // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; - - const float rx = mesh_index_to_xpos(current_xi); - - /** - * Without this check, it's possible to generate a zero length move, as in the case where - * the line is heading left, starting exactly on a mesh line boundary. Since this is rare - * it might be fine to remove this check and let planner.buffer_segment() filter it out. - */ - if (rx != start[X_AXIS]) { - if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; - } - else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; - } - - planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder); - } //else printf("FIRST MOVE PRUNED "); - } - - if (g26_debug_flag) - debug_current_and_destination(PSTR("horizontal move done in ubl.line_to_destination_cartesian()")); - - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) - goto FINAL_MOVE; - - set_current_from_destination(); - return; - } - - /** - * - * Handle the generic case of a line crossing both X and Y Mesh lines. - * - */ - - int xi_cnt = cell_start_xi - cell_dest_xi, - yi_cnt = cell_start_yi - cell_dest_yi; - - if (xi_cnt < 0) xi_cnt = -xi_cnt; - if (yi_cnt < 0) yi_cnt = -yi_cnt; - - current_xi += left_flag; - current_yi += down_flag; - - while (xi_cnt || yi_cnt) { - - const float next_mesh_line_x = mesh_index_to_xpos(current_xi + dxi), - next_mesh_line_y = mesh_index_to_ypos(current_yi + dyi), - ry = m * next_mesh_line_x + c, // Calculate Y at the next X mesh line - rx = (next_mesh_line_y - c) / m; // Calculate X at the next Y mesh line - // (No need to worry about m being zero. - // If that was the case, it was already detected - // as a vertical line move above.) - - if (left_flag == (rx > next_mesh_line_x)) { // Check if we hit the Y line first - // Yes! Crossing a Y Mesh Line next - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi - left_flag, current_yi + dyi) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); - - // Undefined parts of the Mesh in z_values[][] are NAN. - // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; - - if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start[X_AXIS] : next_mesh_line_y - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; - } - else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; - } - planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, feed_rate, extruder); - current_yi += dyi; - yi_cnt--; - } - else { - // Yes! Crossing a X Mesh Line next - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi + dxi, current_yi - down_flag) - * planner.fade_scaling_factor_for_z(end[Z_AXIS]); - - // Undefined parts of the Mesh in z_values[][] are NAN. - // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (isnan(z0)) z0 = 0.0; - - if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? next_mesh_line_x - start[X_AXIS] : ry - start[Y_AXIS]; - e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; - z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; - } - else { - e_position = end[E_AXIS]; - z_position = end[Z_AXIS]; - } - - planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, feed_rate, extruder); - current_xi += dxi; - xi_cnt--; - } - - if (xi_cnt < 0 || yi_cnt < 0) break; // Too far! Exit the loop and go to FINAL_MOVE - } - - if (g26_debug_flag) - debug_current_and_destination(PSTR("generic move done in ubl.line_to_destination_cartesian()")); - - if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) - goto FINAL_MOVE; - - set_current_from_destination(); - } - - #else // UBL_SEGMENTED - - #if IS_SCARA // scale the feed rate from mm/s to degrees/s - static float scara_feed_factor, scara_oldA, scara_oldB; - #endif - - // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic, - // so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first. - - inline void _O2 ubl_buffer_segment_raw(const float (&in_raw)[XYZE], const float &fr) { - - #if ENABLED(SKEW_CORRECTION) - float raw[XYZE] = { in_raw[X_AXIS], in_raw[Y_AXIS], in_raw[Z_AXIS], in_raw[E_AXIS] }; - planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); - #else - const float (&raw)[XYZE] = in_raw; - #endif - - #if ENABLED(DELTA) // apply delta inverse_kinematics - - DELTA_IK(raw); - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], fr, active_extruder); - - #elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw) - - inverse_kinematics(raw); // this writes delta[ABC] from raw[XYZE] - // should move the feedrate scaling to scara inverse_kinematics - - const float adiff = FABS(delta[A_AXIS] - scara_oldA), - bdiff = FABS(delta[B_AXIS] - scara_oldB); - scara_oldA = delta[A_AXIS]; - scara_oldB = delta[B_AXIS]; - float s_feedrate = max(adiff, bdiff) * scara_feed_factor; - - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], s_feedrate, active_extruder); - - #else // CARTESIAN - - planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], in_raw[E_AXIS], fr, active_extruder); - - #endif - } - - #if IS_SCARA - #define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm - #elif ENABLED(DELTA) - #define DELTA_SEGMENT_MIN_LENGTH 0.10 // mm (still subject to DELTA_SEGMENTS_PER_SECOND) - #else // CARTESIAN - #ifdef LEVELED_SEGMENT_LENGTH - #define DELTA_SEGMENT_MIN_LENGTH LEVELED_SEGMENT_LENGTH - #else - #define DELTA_SEGMENT_MIN_LENGTH 1.00 // mm (similar to G2/G3 arc segmentation) - #endif - #endif - - /** - * Prepare a segmented linear move for DELTA/SCARA/CARTESIAN with UBL and FADE semantics. - * This calls planner.buffer_segment multiple times for small incremental moves. - * Returns true if did NOT move, false if moved (requires current_position update). - */ - - bool _O2 unified_bed_leveling::prepare_segmented_line_to(const float (&rtarget)[XYZE], const float &feedrate) { - - if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) // fail if moving outside reachable boundary - return true; // did not move, so current_position still accurate - - const float total[XYZE] = { - rtarget[X_AXIS] - current_position[X_AXIS], - rtarget[Y_AXIS] - current_position[Y_AXIS], - rtarget[Z_AXIS] - current_position[Z_AXIS], - rtarget[E_AXIS] - current_position[E_AXIS] - }; - - const float cartesian_xy_mm = HYPOT(total[X_AXIS], total[Y_AXIS]); // total horizontal xy distance - - #if IS_KINEMATIC - const float seconds = cartesian_xy_mm / feedrate; // seconds to move xy distance at requested rate - uint16_t segments = lroundf(delta_segments_per_second * seconds), // preferred number of segments for distance @ feedrate - seglimit = lroundf(cartesian_xy_mm * (1.0 / (DELTA_SEGMENT_MIN_LENGTH))); // number of segments at minimum segment length - NOMORE(segments, seglimit); // limit to minimum segment length (fewer segments) - #else - uint16_t segments = lroundf(cartesian_xy_mm * (1.0 / (DELTA_SEGMENT_MIN_LENGTH))); // cartesian fixed segment length - #endif - - NOLESS(segments, 1); // must have at least one segment - const float inv_segments = 1.0 / segments; // divide once, multiply thereafter - - #if IS_SCARA // scale the feed rate from mm/s to degrees/s - scara_feed_factor = cartesian_xy_mm * inv_segments * feedrate; - scara_oldA = stepper.get_axis_position_degrees(A_AXIS); - scara_oldB = stepper.get_axis_position_degrees(B_AXIS); - #endif - - const float diff[XYZE] = { - total[X_AXIS] * inv_segments, - total[Y_AXIS] * inv_segments, - total[Z_AXIS] * inv_segments, - total[E_AXIS] * inv_segments - }; - - // Note that E segment distance could vary slightly as z mesh height - // changes for each segment, but small enough to ignore. - - float raw[XYZE] = { - current_position[X_AXIS], - current_position[Y_AXIS], - current_position[Z_AXIS], - current_position[E_AXIS] - }; - - // Only compute leveling per segment if ubl active and target below z_fade_height. - if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling - while (--segments) { - LOOP_XYZE(i) raw[i] += diff[i]; - ubl_buffer_segment_raw(raw, feedrate); - } - ubl_buffer_segment_raw(rtarget, feedrate); - return false; // moved but did not set_current_from_destination(); - } - - // Otherwise perform per-segment leveling - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = planner.fade_scaling_factor_for_z(rtarget[Z_AXIS]); - #endif - - // increment to first segment destination - LOOP_XYZE(i) raw[i] += diff[i]; - - for (;;) { // for each mesh cell encountered during the move - - // Compute mesh cell invariants that remain constant for all segments within cell. - // Note for cell index, if point is outside the mesh grid (in MESH_INSET perimeter) - // the bilinear interpolation from the adjacent cell within the mesh will still work. - // Inner loop will exit each time (because out of cell bounds) but will come back - // in top of loop and again re-find same adjacent cell and use it, just less efficient - // for mesh inset area. - - int8_t cell_xi = (raw[X_AXIS] - (MESH_MIN_X)) * (1.0 / (MESH_X_DIST)), - cell_yi = (raw[Y_AXIS] - (MESH_MIN_Y)) * (1.0 / (MESH_Y_DIST)); - - cell_xi = constrain(cell_xi, 0, (GRID_MAX_POINTS_X) - 1); - cell_yi = constrain(cell_yi, 0, (GRID_MAX_POINTS_Y) - 1); - - const float x0 = mesh_index_to_xpos(cell_xi), // 64 byte table lookup avoids mul+add - y0 = mesh_index_to_ypos(cell_yi); - - float z_x0y0 = z_values[cell_xi ][cell_yi ], // z at lower left corner - z_x1y0 = z_values[cell_xi+1][cell_yi ], // z at upper left corner - z_x0y1 = z_values[cell_xi ][cell_yi+1], // z at lower right corner - z_x1y1 = z_values[cell_xi+1][cell_yi+1]; // z at upper right corner - - if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) - if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points - if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, - if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points - - float cx = raw[X_AXIS] - x0, // cell-relative x and y - cy = raw[Y_AXIS] - y0; - - const float z_xmy0 = (z_x1y0 - z_x0y0) * (1.0 / (MESH_X_DIST)), // z slope per x along y0 (lower left to lower right) - z_xmy1 = (z_x1y1 - z_x0y1) * (1.0 / (MESH_X_DIST)); // z slope per x along y1 (upper left to upper right) - - float z_cxy0 = z_x0y0 + z_xmy0 * cx; // z height along y0 at cx (changes for each cx in cell) - - const float z_cxy1 = z_x0y1 + z_xmy1 * cx, // z height along y1 at cx - z_cxyd = z_cxy1 - z_cxy0; // z height difference along cx from y0 to y1 - - float z_cxym = z_cxyd * (1.0 / (MESH_Y_DIST)); // z slope per y along cx from y0 to y1 (changes for each cx in cell) - - // float z_cxcy = z_cxy0 + z_cxym * cy; // interpolated mesh z height along cx at cy (do inside the segment loop) - - // As subsequent segments step through this cell, the z_cxy0 intercept will change - // and the z_cxym slope will change, both as a function of cx within the cell, and - // each change by a constant for fixed segment lengths. - - const float z_sxy0 = z_xmy0 * diff[X_AXIS], // per-segment adjustment to z_cxy0 - z_sxym = (z_xmy1 - z_xmy0) * (1.0 / (MESH_Y_DIST)) * diff[X_AXIS]; // per-segment adjustment to z_cxym - - for (;;) { // for all segments within this mesh cell - - if (--segments == 0) // if this is last segment, use rtarget for exact - COPY(raw, rtarget); - - const float z_cxcy = (z_cxy0 + z_cxym * cy) // interpolated mesh z height along cx at cy - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - * fade_scaling_factor // apply fade factor to interpolated mesh height - #endif - ; - - const float z = raw[Z_AXIS]; - raw[Z_AXIS] += z_cxcy; - ubl_buffer_segment_raw(raw, feedrate); - raw[Z_AXIS] = z; - - if (segments == 0) // done with last segment - return false; // did not set_current_from_destination() - - LOOP_XYZE(i) raw[i] += diff[i]; - - cx += diff[X_AXIS]; - cy += diff[Y_AXIS]; - - if (!WITHIN(cx, 0, MESH_X_DIST) || !WITHIN(cy, 0, MESH_Y_DIST)) // done within this cell, break to next - break; - - // Next segment still within same mesh cell, adjust the per-segment - // slope and intercept to compute next z height. - - z_cxy0 += z_sxy0; // adjust z_cxy0 by per-segment z_sxy0 - z_cxym += z_sxym; // adjust z_cxym by per-segment z_sxym - - } // segment loop - } // cell loop - - return false; // caller will update current_position - } - - #endif // UBL_SEGMENTED - -#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/ultralcd_st7565_u8glib_VIKI.h b/Marlin/ultralcd_st7565_u8glib_VIKI.h deleted file mode 100644 index 7f589e2ecf..0000000000 --- a/Marlin/ultralcd_st7565_u8glib_VIKI.h +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#ifndef ULCDST7565_H -#define ULCDST7565_H - -#include - -#define ST7565_CLK_PIN DOGLCD_SCK -#define ST7565_DAT_PIN DOGLCD_MOSI -#define ST7565_CS_PIN DOGLCD_CS -#define ST7565_A0_PIN DOGLCD_A0 - -#define LCD_PIXEL_WIDTH 128 -#define LCD_PIXEL_HEIGHT 64 -#define PAGE_HEIGHT 8 - -//set optimization so ARDUINO optimizes this file -#pragma GCC optimize (3) - -// If you want you can define your own set of delays in Configuration.h -//#define ST7565_DELAY_1 DELAY_0_NOP -//#define ST7565_DELAY_2 DELAY_0_NOP -//#define ST7565_DELAY_3 DELAY_0_NOP - -/* -#define ST7565_DELAY_1 u8g_10MicroDelay() -#define ST7565_DELAY_2 u8g_10MicroDelay() -#define ST7565_DELAY_3 u8g_10MicroDelay() -*/ - -#if F_CPU >= 20000000 - #define CPU_ST7565_DELAY_1 DELAY_0_NOP - #define CPU_ST7565_DELAY_2 DELAY_0_NOP - #define CPU_ST7565_DELAY_3 DELAY_1_NOP -#elif MB(3DRAG) || MB(K8200) || MB(K8400) - #define CPU_ST7565_DELAY_1 DELAY_0_NOP - #define CPU_ST7565_DELAY_2 DELAY_3_NOP - #define CPU_ST7565_DELAY_3 DELAY_0_NOP -#elif MB(MINIRAMBO) - #define CPU_ST7565_DELAY_1 DELAY_0_NOP - #define CPU_ST7565_DELAY_2 DELAY_4_NOP - #define CPU_ST7565_DELAY_3 DELAY_0_NOP -#elif MB(RAMBO) - #define CPU_ST7565_DELAY_1 DELAY_0_NOP - #define CPU_ST7565_DELAY_2 DELAY_0_NOP - #define CPU_ST7565_DELAY_3 DELAY_0_NOP -#elif F_CPU == 16000000 - #define CPU_ST7565_DELAY_1 DELAY_0_NOP - #define CPU_ST7565_DELAY_2 DELAY_0_NOP - #define CPU_ST7565_DELAY_3 DELAY_1_NOP -#else - #error "No valid condition for delays in 'ultralcd_st7565_u8glib_VIKI.h'" -#endif - -#ifndef ST7565_DELAY_1 - #define ST7565_DELAY_1 CPU_ST7565_DELAY_1 -#endif -#ifndef ST7565_DELAY_2 - #define ST7565_DELAY_2 CPU_ST7565_DELAY_2 -#endif -#ifndef ST7565_DELAY_3 - #define ST7565_DELAY_3 CPU_ST7565_DELAY_3 -#endif - -// On Viki2 the LCD and the SD card share a single SPI -#define HARDWARE_SPI ((DOGLCD_SCK == SCK_PIN) && (DOGLCD_MOSI == MOSI_PIN)) - -#if HARDWARE_SPI // using the hardware SPI - - #define ST7565_WRITE_BYTE(a) { SPDR = a; while (!TEST(SPSR, SPIF)); U8G_DELAY(); } - #define ST7560_WriteSequence(count, pointer) { uint8_t *ptr = pointer; for (uint8_t i = 0; i < count; i++) {SPDR = *ptr++; while (!TEST(SPSR, SPIF));} DELAY_10US; } - -#else // !HARDWARE_SPI - - #define ST7565_SND_BIT \ - WRITE(ST7565_CLK_PIN, LOW); ST7565_DELAY_1; \ - WRITE(ST7565_DAT_PIN, val & 0x80); ST7565_DELAY_2; \ - WRITE(ST7565_CLK_PIN, HIGH); ST7565_DELAY_3; \ - WRITE(ST7565_CLK_PIN, LOW);\ - val <<= 1 - - static void ST7565_SWSPI_SND_8BIT(uint8_t val) { - ST7565_SND_BIT; // 1 - ST7565_SND_BIT; // 2 - ST7565_SND_BIT; // 3 - ST7565_SND_BIT; // 4 - ST7565_SND_BIT; // 5 - ST7565_SND_BIT; // 6 - ST7565_SND_BIT; // 7 - ST7565_SND_BIT; // 8 - } - - #define ST7565_WRITE_BYTE(a) { ST7565_SWSPI_SND_8BIT((uint8_t)a); U8G_DELAY(); } - #define ST7560_WriteSequence(count, pointer) { uint8_t *ptr = pointer; for (uint8_t i = 0; i < count; i++) { ST7565_SWSPI_SND_8BIT(*ptr++); } DELAY_10US; } - -#endif // !HARDWARE_SPI - -#if defined(DOGM_SPI_DELAY_US) && DOGM_SPI_DELAY_US > 0 - #define U8G_DELAY() delayMicroseconds(DOGM_SPI_DELAY_US) -#else - #define U8G_DELAY() u8g_10MicroDelay() -#endif - -#define ST7565_CS() { WRITE(ST7565_CS_PIN,1); U8G_DELAY(); } -#define ST7565_NCS() { WRITE(ST7565_CS_PIN,0); } -#define ST7565_A0() { WRITE(ST7565_A0_PIN,1); U8G_DELAY(); } -#define ST7565_NA0() { WRITE(ST7565_A0_PIN,0); } - -uint8_t u8g_dev_st7565_64128n_2x_VIKI_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { - - case U8G_DEV_MSG_INIT: { - - OUT_WRITE(ST7565_CS_PIN, LOW); - OUT_WRITE(ST7565_DAT_PIN, LOW); - OUT_WRITE(ST7565_CLK_PIN, LOW); - - #if HARDWARE_SPI - OUT_WRITE(SDSS, 1); // must be set to an output first or else will never go into master mode - SPCR = 0x50; // enable SPI in master mode at fast speed - SPSR = 1; // kick it up to 2x speed mode - #endif - - OUT_WRITE(ST7565_A0_PIN, LOW); - - ST7565_CS(); /* disable chip */ - ST7565_NA0(); /* instruction mode */ - ST7565_NCS(); /* enable chip */ - - ST7565_WRITE_BYTE(0x0A2); /* 0x0A2: LCD bias 1/9 (according to Displaytech 64128N datasheet) */ - ST7565_WRITE_BYTE(0x0A0); /* Normal ADC Select (according to Displaytech 64128N datasheet) */ - - ST7565_WRITE_BYTE(0x0C8); /* common output mode: set scan direction normal operation/SHL Select; 0x0C0 --> SHL = 0; normal; 0x0C8 --> SHL = 1 */ - ST7565_WRITE_BYTE(0x040); /* Display start line for Displaytech 64128N */ - - ST7565_WRITE_BYTE(0x028 | 0x04); /* power control: turn on voltage converter */ - //U8G_ESC_DLY(50); /* delay 50 ms - hangs after a reset if used */ - - ST7565_WRITE_BYTE(0x028 | 0x06); /* power control: turn on voltage regulator */ - //U8G_ESC_DLY(50); /* delay 50 ms - hangs after a reset if used */ - - ST7565_WRITE_BYTE(0x028 | 0x07); /* power control: turn on voltage follower */ - //U8G_ESC_DLY(50); /* delay 50 ms - hangs after a reset if used */ - - ST7565_WRITE_BYTE(0x010); /* Set V0 voltage resistor ratio. Setting for controlling brightness of Displaytech 64128N */ - - ST7565_WRITE_BYTE(0x0A6); /* display normal, bit val 0: LCD pixel off. */ - - ST7565_WRITE_BYTE(0x081); /* set contrast */ - ST7565_WRITE_BYTE(0x01E); /* Contrast value. Setting for controlling brightness of Displaytech 64128N */ - - ST7565_WRITE_BYTE(0x0AF); /* display on */ - - U8G_ESC_DLY(100); /* delay 100 ms */ - ST7565_WRITE_BYTE(0x0A5); /* display all points; ST7565 */ - U8G_ESC_DLY(100); /* delay 100 ms */ - U8G_ESC_DLY(100); /* delay 100 ms */ - ST7565_WRITE_BYTE(0x0A4); /* normal display */ - ST7565_CS(); /* disable chip */ - } /* end of sequence */ - break; - - case U8G_DEV_MSG_STOP: break; - - case U8G_DEV_MSG_PAGE_NEXT: { - u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - ST7565_CS(); /* disable chip */ - ST7565_NA0(); /* instruction mode */ - ST7565_NCS(); /* enable chip */ - ST7565_WRITE_BYTE(0x010); /* set upper 4 bit of the col adr to 0x10 */ - ST7565_WRITE_BYTE(0x000); /* set lower 4 bit of the col adr to 0x00. Changed for DisplayTech 64128N */ - /* end of sequence */ - ST7565_WRITE_BYTE(0x0B0 | (2*pb->p.page));; /* select current page (ST7565R) */ - ST7565_A0(); /* data mode */ - ST7560_WriteSequence( (uint8_t) pb->width, (uint8_t *)pb->buf); - ST7565_CS(); /* disable chip */ - ST7565_NA0(); /* instruction mode */ - ST7565_NCS(); /* enable chip */ - ST7565_WRITE_BYTE(0x010); /* set upper 4 bit of the col adr to 0x10 */ - ST7565_WRITE_BYTE(0x000); /* set lower 4 bit of the col adr to 0x00. Changed for DisplayTech 64128N */ - /* end of sequence */ - ST7565_WRITE_BYTE(0x0B0 | (2*pb->p.page+1)); /* select current page (ST7565R) */ - ST7565_A0(); /* data mode */ - ST7560_WriteSequence( (uint8_t) pb->width, (uint8_t *)(pb->buf)+pb->width); - ST7565_CS(); /* disable chip */ - } - break; - - case U8G_DEV_MSG_CONTRAST: - ST7565_NCS(); - ST7565_NA0(); /* instruction mode */ - ST7565_WRITE_BYTE(0x081); - ST7565_WRITE_BYTE((*(uint8_t *)arg) >> 2); - ST7565_CS(); /* disable chip */ - return 1; - - case U8G_DEV_MSG_SLEEP_ON: - ST7565_NA0(); /* instruction mode */ - ST7565_NCS(); /* enable chip */ - ST7565_WRITE_BYTE(0x0AC); /* static indicator off */ - ST7565_WRITE_BYTE(0x000); /* indicator register set (not sure if this is required) */ - ST7565_WRITE_BYTE(0x0AE); /* display off */ - ST7565_WRITE_BYTE(0x0A5); /* all points on */ - ST7565_CS(); /* disable chip , bugfix 12 nov 2014 */ - /* end of sequence */ - return 1; - - case U8G_DEV_MSG_SLEEP_OFF: - ST7565_NA0(); /* instruction mode */ - ST7565_NCS(); /* enable chip */ - ST7565_WRITE_BYTE(0x0A4); /* all points off */ - ST7565_WRITE_BYTE(0x0AF); /* display on */ - U8G_ESC_DLY(50); /* delay 50 ms */ - ST7565_CS(); /* disable chip , bugfix 12 nov 2014 */ - /* end of sequence */ - return 1; - } - return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); -} - -uint8_t u8g_dev_st7565_64128n_2x_VIKI_buf[LCD_PIXEL_WIDTH*2] U8G_NOCOMMON; -u8g_pb_t u8g_dev_st7565_64128n_2x_VIKI_pb = {{16, LCD_PIXEL_HEIGHT, 0, 0, 0}, LCD_PIXEL_WIDTH, u8g_dev_st7565_64128n_2x_VIKI_buf}; -u8g_dev_t u8g_dev_st7565_64128n_2x_VIKI_sw_spi = {u8g_dev_st7565_64128n_2x_VIKI_fn, &u8g_dev_st7565_64128n_2x_VIKI_pb, &u8g_com_null_fn}; - -class U8GLIB_ST7565_64128n_2x_VIKI : public U8GLIB { - public: - U8GLIB_ST7565_64128n_2x_VIKI(uint8_t dummy) - : U8GLIB(&u8g_dev_st7565_64128n_2x_VIKI_sw_spi) - { } - U8GLIB_ST7565_64128n_2x_VIKI(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7565_64128n_2x_VIKI_sw_spi) - { } -}; - -#pragma GCC reset_options - -#endif // ULCDST7565_H diff --git a/Marlin/utf_mapper.h b/Marlin/utf_mapper.h deleted file mode 100644 index c49e6fc4e7..0000000000 --- a/Marlin/utf_mapper.h +++ /dev/null @@ -1,671 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * 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 3 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, see . - * - */ - -#ifndef UTF_MAPPER_H -#define UTF_MAPPER_H - -#include "language.h" - -#if ENABLED(DOGLCD) - #define HARDWARE_CHAR_OUT(C) u8g.print((char)(C)) -#else - #define HARDWARE_CHAR_OUT(C) lcd.write((char)(C)) -#endif - -#if DISABLED(SIMULATE_ROMFONT) && ENABLED(DOGLCD) - #if ENABLED(DISPLAY_CHARSET_ISO10646_1) \ - || ENABLED(DISPLAY_CHARSET_ISO10646_5) \ - || ENABLED(DISPLAY_CHARSET_ISO10646_KANA) \ - || ENABLED(DISPLAY_CHARSET_ISO10646_GREEK) \ - || ENABLED(DISPLAY_CHARSET_ISO10646_TR) - #define MAPPER_ONE_TO_ONE - #endif -#else // SIMULATE_ROMFONT || !DOGLCD - #if DISPLAY_CHARSET_HD44780 == JAPANESE - #if ENABLED(MAPPER_C2C3) - const PROGMEM uint8_t utf_recode[] = - { // 0 1 2 3 4 5 6 7 8 9 a b c d e f This is fair for symbols - 0x20,0x3F,0xEC,0xED,0x3F,0x5C,0x7C,0x3F,0x22,0x63,0x61,0x7F,0x3F,0x3F,0x52,0xB0, // c2a - //' ' ¢ £ ­ l " c a « R - 0xDF,0x3F,0x32,0x33,0x27,0xE4,0xF1,0xA5,0x2C,0x31,0xDF,0x7E,0x3F,0x3F,0x3F,0x3F, // c2b but relatively bad for letters. - // ° 2 3 ` N p . , 1 ° » - 0x3F,0x3F,0x3F,0x3F,0xE1,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, // c38 - // ä - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0xEF,0x78,0x3F,0x3F,0x3F,0x3F,0xF5,0x3F,0x3F,0xE2, // c39 missing characters display as '?' - // ö x ü ß - 0x3F,0x3F,0x3F,0x3F,0xE1,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, // c3a - // ä - 0x3F,0xEE,0x3F,0x3F,0x3F,0x3F,0xEF,0xFD,0x3F,0x3F,0x3F,0x3F,0xF5,0x3F,0x3F,0x3F // c3b - // n ö ÷ ü - }; - #elif ENABLED(MAPPER_E382E383) - const PROGMEM uint8_t utf_recode[] = - { // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x3D,0xB1,0xB1,0xA8,0xB2,0xA9,0xB3,0xAA,0xB4,0xAB,0xB5,0xB6,0xB6,0xB7,0xB7,0xB8, // e382a Please test and correct - // = ã‚¢ ã‚¢ ã‚£ イ ã‚¥ ウ ã‚§ エ ã‚© オ ガ ガ ã‚­ ã‚­ ク - 0xB8,0xB9,0xB9,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBD,0xBD,0xBE,0xBE,0xBF,0xBF,0xC0, // e382b - // ク ケ ケ コ コ サ サ ã‚· ã‚· ス ス ã‚» ã‚» ソ ソ ã‚¿ - 0xC0,0xC1,0xC1,0xC2,0xC2,0xC2,0xC3,0xC3,0xC4,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, // e3838 - // ã‚¿ ムムッ ッ ッ テ テ ト ト ナ ニ ヌ ムノ ム- 0xCA,0xCA,0xCB,0xCB,0xCB,0xCC,0xCC,0xCC,0xCD,0xCD,0xCD,0xCE,0xCE,0xCE,0xCF,0xD0, // e3839 - // ムムヒ ヒ ヒ フ フ フ ヘ ヘ ヘ ホ ホ ホ マ ミ - 0xD1,0xD2,0xD3,0xD4,0xD4,0xD5,0xD5,0xAE,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC, // e383a - // ム メ モ ャ ャ ユ ユ ョ ヨ ラ リ ル レ ロ ワ ワ - 0xEC,0xA7,0xA6,0xDD,0xCC,0x3F,0x3F,0x3F,0x3F,0x3F,0xA6,0xA5,0xB0,0xA4,0xA4,0x3F // e383b - // ヰ ヱ ヲ ン フ ? ? ? ? ? ヲ ・ ー ヽ ヽ ? - }; - #elif ENABLED(MAPPER_D0D1) - #error "Cyrillic on a JAPANESE display makes no sense. There are no matching symbols." - #endif - - #elif DISPLAY_CHARSET_HD44780 == WESTERN - #if ENABLED(MAPPER_C2C3) - const PROGMEM uint8_t utf_recode[] = - { // 0 1 2 3 4 5 6 7 8 9 a b c d e f This is relative complete. - 0x20,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0x22,0xA9,0xAA,0xAB,0x3F,0x3F,0xAE,0x3F, // c2a ¡¢£¤¥¦§¨©ª«¬­®¯ - //' ' ¡ ¢ £ ¤ Â¥ ¦ § " © ª « ? ? ® ? - 0xB0,0xB1,0xB2,0xB3,0x27,0xB5,0xB6,0xB7,0x2C,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, // c2b °±²³´µ¶·¸¹º»¼½¾¿ - // ° ± ³ ² ? µ ¶ · , ¹ º » ¼ ½ ¾ ¿ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, // c38 ÀÃÃÄÅÆÇÈÉÊËÌÃÃŽÃ - // À à Â Ã Ä Ã… Æ Ç È É Ê Ë ÃŒ à Î à - 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, // c39 ÃÑÓÔÕÖרÙÚÛÜÃÞß - // à Ñ Ã’ Ó Ô Õ Ö × Ø Ù Ú Û Ü à Þ ß - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, // c3a àáãäåæçèéêëìíîï - // à á â ã ä Ã¥ æ ç è é ê ë ì í î ï - 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF // c3b ðñóôõö÷øùúûüýþÿ - // ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ - }; - #elif ENABLED(MAPPER_D0D1) - #define MAPPER_D0D1_MOD - const PROGMEM uint8_t utf_recode[] = - {//0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x41,0x80,0x42,0x92,0x81,0x45,0x82,0x83,0x84,0x85,0x4B,0x86,0x4D,0x48,0x4F,0x87, // d0a - // A Б B Г Д E Ж З И Й K Л M H O П - 0x50,0x43,0x54,0x88,0xD8,0x58,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x62,0x8F,0xAC,0xAD, // d0b - // P C T У Ф X Ч ч Ш Щ Ъ Ы b Э Ю Я - 0x61,0x36,0x42,0x92,0x81,0x65,0x82,0xB3,0x84,0x85,0x6B,0x86,0x4D,0x48,0x6F,0x87, // d18 - // a 6 B Г Д e Ж ³ И Й k Л M H o П - 0x70,0x63,0x54,0x79,0xD8,0x78,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x62,0x8F,0xAC,0xAD // d19 - // p c T y Ф x Ч ч Ш Щ Ъ Ы b Э Ю Я - }; - #elif ENABLED(MAPPER_E382E383) - #error "Katakana on a WESTERN display makes no sense. There are no matching symbols." - #endif - - #elif DISPLAY_CHARSET_HD44780 == CYRILLIC - #if ENABLED(MAPPER_D0D1) - #define MAPPER_D0D1_MOD - // it is a Russian alphabet translation - // except 0401 --> 0xA2 = Ð, 0451 --> 0xB5 = Ñ‘ - const PROGMEM uint8_t utf_recode[] = - { 0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4, // unicode U+0400 to U+047f - // A Б->Ð B Г Д E Ж З // 0 Ѐ РЂ Ѓ Є Ð… І Ї - 0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8, // Ј Љ Њ Ћ ÐŒ Ð ÐŽ Ð - // И Й K Л M H O П // 1 РБ Ð’ Г Д Е Ж З - 0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB, // И Й К Л М РО П - // P C T У Ф X Ч ч // 2 Р С Т У Ф Ð¥ Г Ч - 0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1, // Ш Щ Ъ Ы Ь Э Ю Я - // Ш Щ Ъ Ы b Э Ю Я // 3 а б в г д е ж з - 0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7, // и й к л м н о п - // a б->Ñ‘ в г д e ж з // 4 Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч - 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE, // ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ - // и й к л м н o п // 5 Ñ Ñ‘ Ñ’ Ñ“ Ñ” Ñ• Ñ– Ñ— - 0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0, // ј Ñ™ Ñš Ñ› Ñœ Ñ Ñž ÑŸ - // p c Ñ‚ y Ñ„ x ц ч // 6 Ñ  Ñ¡ Ñ¢ Ñ£ Ѥ Ñ¥ Ѧ ѧ - 0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7 // Ѫ Ñ© Ѫ Ñ« Ѭ Ñ­ Ñ® ѯ - // ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ // 7 Ѱ ѱ Ѳ ѳ Ñ´ ѵ Ѷ Ñ· - }; // Ñ» ѹ Ѻ Ñ» Ѽ ѽ Ѿ Ñ¿ - #elif ENABLED(MAPPER_C2C3) - #error "Western languages on a CYRILLIC display makes no sense. There are no matching symbols." - #elif ENABLED(MAPPER_E382E383) - #error "Katakana on a CYRILLIC display makes no sense. There are no matching symbols." - #endif - #else - #error "Something went wrong in the setting of DISPLAY_CHARSET_HD44780" - #endif // DISPLAY_CHARSET_HD44780 -#endif // SIMULATE_ROMFONT - -#define PRINTABLE(C) (((C) & 0xC0u) != 0x80u) - -#if ENABLED(MAPPER_C2C3) - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_c2 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d >= 0xC0u && !seen_c2) { - utf_hi_char = d - 0xC2u; - seen_c2 = true; - return 0; - } - else if (seen_c2) { - d &= 0x3Fu; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0x80u + (utf_hi_char << 6) + d); - #endif - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_c2 = false; - return 1; - } - -#elif ENABLED(MAPPER_C2C3_TR) - - // the C2C3-mapper extended for the 6 altered symbols from C4 and C5 range. - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_c2 = false, - seen_c4 = false, - seen_c5 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d == 0xC4u) { seen_c4 = true; return 0; } - else if (d == 0xC5u) { seen_c5 = true; return 0; } - else if (d >= 0xC0u && !seen_c2) { - utf_hi_char = d - 0xC2u; - seen_c2 = true; - return 0; - } - else if (seen_c4) { - switch(d) { - case 0x9Eu: d = 0xD0u; break; - case 0x9Fu: d = 0xF0u; break; - case 0xB0u: d = 0xDDu; break; - case 0xB1u: d = 0xFDu; break; - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c5) { - switch(d) { - case 0x9Eu: d = 0xDEu; break; - case 0x9Fu: d = 0xFEu; break; - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c2) { - d &= 0x3Fu; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0x80u + (utf_hi_char << 6) + d); - #endif - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_c2 = seen_c4 = seen_c5 = false; - return 1; - } - -#elif ENABLED(MAPPER_CECF) - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_ce = false; - uint8_t d = c; - if (d >= 0x80) { // UTF-8 handling - if (d >= 0xC0 && !seen_ce) { - utf_hi_char = d - 0xCE; - seen_ce = true; - return 0; - } - else if (seen_ce) { - d &= 0x3F; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d); - #endif - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_ce = false; - return 1; - } - -#elif ENABLED(MAPPER_CECF) - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_ce = false; - uint8_t d = c; - if (d >= 0x80) { // UTF-8 handling - if (d >= 0xC0 && !seen_ce) { - utf_hi_char = d - 0xCE; - seen_ce = true; - return 0; - } - else if (seen_ce) { - d &= 0x3F; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d); - #endif - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_ce = false; - return 1; - } - -#elif ENABLED(MAPPER_D0D1_MOD) - - char charset_mapper(const char c) { - // it is a Russian alphabet translation - // except 0401 --> 0xA2 = Ð, 0451 --> 0xB5 = Ñ‘ - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_d5 = false; - uint8_t d = c; - if (d >= 0x80) { // UTF-8 handling - if (d >= 0xD0 && !seen_d5) { - utf_hi_char = d - 0xD0; - seen_d5 = true; - return 0; - } - else if (seen_d5) { - d &= 0x3F; - if (!utf_hi_char && d == 1) { - HARDWARE_CHAR_OUT(0xA2); // Ð - } - else if (utf_hi_char == 1 && d == 0x11) { - HARDWARE_CHAR_OUT(0xB5); // Ñ‘ - } - else { - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x10)); - } - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_d5 = false; - return 1; - } - -#elif ENABLED(MAPPER_D0D1) - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_d5 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d >= 0xD0u && !seen_d5) { - utf_hi_char = d - 0xD0u; - seen_d5 = true; - return 0; - } - else if (seen_d5) { - d &= 0x3Fu; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0xA0u + (utf_hi_char << 6) + d); - #endif - } - else { - HARDWARE_CHAR_OUT('?'); - } - } - else { - HARDWARE_CHAR_OUT(c); - } - seen_d5 = false; - return 1; - } - -#elif ENABLED(MAPPER_E382E383) - - char charset_mapper(const char c) { - static uint8_t utf_hi_char; // UTF-8 high part - static bool seen_e3 = false, - seen_82_83 = false; - uint8_t d = c; - if (d >= 0x80) { // UTF-8 handling - if (d == 0xE3 && !seen_e3) { - seen_e3 = true; - return 0; // eat 0xE3 - } - else if (d >= 0x82 && seen_e3 && !seen_82_83) { - utf_hi_char = d - 0x82; - seen_82_83 = true; - return 0; - } - else if (seen_e3 && seen_82_83) { - d &= 0x3F; - #ifndef MAPPER_ONE_TO_ONE - HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20)); - #else - HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d); - #endif - } - else - HARDWARE_CHAR_OUT('?'); - } - else - HARDWARE_CHAR_OUT(c); - - seen_e3 = false; - seen_82_83 = false; - return 1; - } - -#elif ENABLED(MAPPER_C3C4C5_PL) - - /** - * Ä„ C4 84 = 80 - * Ä… C4 85 = 81 - * Ć C4 86 = 82 - * ć C4 87 = 83 - * Ę C4 98 = 84 - * Ä™ C4 99 = 85 - * Å C5 81 = 86 - * Å‚ C5 82 = 87 - * Ń C5 83 = 88 - * Å„ C5 84 = 89 - * Ó C3 93 = 8A - * ó C3 B3 = 8B - * Åš C5 9A = 8C - * Å› C5 9B = 8D - * Ź C5 B9 = 8E - * ź C5 BA = 8F - * Å» C5 BB = 90 - * ż C5 BC = 91 - */ - - char charset_mapper(const char c) { - static bool seen_c3 = false, - seen_c4 = false, - seen_c5 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d == 0xC4u) { seen_c4 = true; return 0; } - else if (d == 0xC5u) { seen_c5 = true; return 0; } - else if (d == 0xC3u) { seen_c3 = true; return 0; } - else if (seen_c4) { - switch(d) { - case 0x84u ... 0x87u: d -= 4; break; //Ä„ - ć - case 0x98u ... 0x99u: d -= 20; break; //Ę i Ä™ - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c5) { - switch(d) { - case 0x81u ... 0x84u: d += 5; break; //Å - Å„ - case 0x9Au ... 0x9Bu: d -= 0x0Eu; break; //Åš i Å› - case 0xB9u ... 0xBCu: d -= 0x2Bu; break; //Ź - ż - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c3) { - switch(d) { - case 0x93u: d = 0x8Au; break; //Ó - case 0xB3u: d = 0x8Bu; break; //ó - d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - - } - else - HARDWARE_CHAR_OUT(c); - - seen_c3 = seen_c4 = seen_c5 = false; - return 1; - } - -#elif ENABLED(MAPPER_C3C4C5_CZ) - - /** - * à C3 81 = 80 - * É C3 89 = 81 - * à C3 8D = 82 - * Ó C3 93 = 83 - * Ú C3 9A = 84 - * à C3 9D = 85 - * á C3 A1 = 86 - * é C3 A9 = 87 - * í C3 AD = 88 - * ó C3 B3 = 89 - * ú C3 BA = 8A - * ý C3 BD = 8B - * ÄŒ C4 8C = 8C - * Ä C4 8D = 8D - * ÄŽ C4 8E = 8E - * Ä C4 8F = 8F - * Äš C4 9A = 90 - * Ä› C4 9B = 91 - * Ň C5 87 = 92 - * ň C5 88 = 93 - * Ř C5 98 = 94 - * Å™ C5 99 = 95 - * Å  C5 A0 = 96 - * Å¡ C5 A1 = 97 - * Ť C5 A4 = 98 - * Å¥ C5 A5 = 99 - * Å® C5 AE = 9A - * ů C5 AF = 9B - * Ž C5 BD = 9C - * ž C5 BE = 9D - */ - - char charset_mapper(const char c) { - static bool seen_c3 = false, - seen_c4 = false, - seen_c5 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d == 0xC4u) { seen_c4 = true; return 0; } - else if (d == 0xC5u) { seen_c5 = true; return 0; } - else if (d == 0xC3u) { seen_c3 = true; return 0; } - else if (seen_c4) { - switch(d) { - case 0x8Cu ... 0x8Fu: break; // ÄŒÄÄŽÄ Mapping 1:1 - case 0x9Au ... 0x9Bu: d -= 10; break; // Ěě - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c5) { - switch(d) { - case 0x87u ... 0x88u: d += 0x0Bu; break; // Ňň - case 0x98u ... 0x99u: d -= 0x04u; break; // Řř - case 0xA0u ... 0xA1u: d -= 0x0Au; break; // Å Å¡ - case 0xA4u ... 0xA5u: d -= 0x0Cu; break; // Ťť - case 0xAEu ... 0xAFu: d -= 0x14u; break; // Ůů - case 0xBDu ... 0xBEu: d -= 0x21u; break; // Žž - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c3) { - switch(d) { - case 0x81u: d = 0x80u; break; // à - case 0x89u: d = 0x81u; break; // É - case 0x8Du: d = 0x82u; break; // à - case 0x93u: d = 0x83u; break; // Ó - case 0x9Au: d = 0x84u; break; // Ú - case 0x9Du: d = 0x85u; break; // à - case 0xA1u: d = 0x86u; break; // á - case 0xA9u: d = 0x87u; break; // é - case 0xADu: d = 0x88u; break; // í - case 0xB3u: d = 0x89u; break; // ó - case 0xBAu: d = 0x8Au; break; // ú - case 0xBDu: d = 0x8Bu; break; // ý - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - - } - else - HARDWARE_CHAR_OUT(c); - - seen_c3 = seen_c4 = seen_c5 = false; - return 1; - } - -#elif ENABLED(MAPPER_C3C4C5_SK) - - /** - * à C3 81 = 80 - * Ä C3 84 = 81 - * É C3 89 = 82 - * à C3 8D = 83 - * Ó C3 93 = 84 - * Ô C3 94 = 85 - * Ú C3 9A = 86 - * à C3 9D = 87 - * á C3 A1 = 88 - * ä C3 A4 = 89 - * é C3 A9 = 8A - * í C3 AD = 8B - * ó C3 B3 = 8C - * ô C3 B4 = 8D - * ú C3 BA = 8E - * ý C3 BD = 8F - * ÄŒ C4 8C = 90 - * Ä C4 8D = 91 - * ÄŽ C4 8E = 92 - * Ä C4 8F = 93 - * Ĺ C4 B9 = 94 - * ĺ C4 BA = 95 - * Ľ C4 BD = 96 - * ľ C4 BE = 97 - * Ň C5 87 = 98 - * ň C5 88 = 99 - * Å” C5 94 = 9A - * Å• C5 95 = 9B - * Å  C5 A0 = 9C - * Å¡ C5 A1 = 9D - * Ť C5 A4 = 9E - * Å¥ C5 A5 = 9F - * Ž C5 BD = A0 - * ž C5 BE = A1 - */ - - char charset_mapper(const char c) { - static bool seen_c3 = false, - seen_c4 = false, - seen_c5 = false; - uint8_t d = c; - if (d >= 0x80u) { // UTF-8 handling - if (d == 0xC4u) { seen_c4 = true; return 0; } - else if (d == 0xC5u) { seen_c5 = true; return 0; } - else if (d == 0xC3u) { seen_c3 = true; return 0; } - else if (seen_c4) { - switch(d) { - case 0x8Cu ... 0x8Fu: d += 0x04u; break; // ÄŒÄÄŽÄ - case 0xB9u ... 0xBAu: d -= 0x25u; break; // Ĺĺ - case 0xBDu ... 0xBEu: d -= 0x27u; break; // Ľľ - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c5) { - switch(d) { - case 0x87u ... 0x88u: d += 0x11u; break; // Ňň - case 0x94u ... 0x95u: d += 0x06u; break; // Ŕŕ - case 0xA0u ... 0xA1u: d -= 0x04u; break; // Å Å¡ - case 0xA4u ... 0xA5u: d -= 0x06u; break; // Ťť - case 0xBDu ... 0xBEu: d -= 0x1Du; break; // Žž - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - else if (seen_c3) { - switch(d) { - case 0x81u: d = 0x80u; break; // à - case 0x84u: d = 0x81u; break; // Ä - case 0x89u: d = 0x82u; break; // É - case 0x8Du: d = 0x83u; break; // à - case 0x93u: d = 0x84u; break; // Ó - case 0x94u: d = 0x85u; break; // Ô - case 0x9Au: d = 0x86u; break; // Ú - case 0x9Du: d = 0x87u; break; // à - case 0xA1u: d = 0x88u; break; // á - case 0xA4u: d = 0x89u; break; // ä - case 0xA9u: d = 0x8Au; break; // é - case 0xADu: d = 0x8Bu; break; // í - case 0xB3u: d = 0x8Cu; break; // ó - case 0xB4u: d = 0x8Du; break; // ô - case 0xBAu: d = 0x8Eu; break; // ú - case 0xBDu: d = 0x8Fu; break; // ý - default: d = '?'; - } - HARDWARE_CHAR_OUT(d); - } - - } - else - HARDWARE_CHAR_OUT(c); - - seen_c3 = seen_c4 = seen_c5 = false; - return 1; - } - -#else - - #define MAPPER_NON - - #undef PRINTABLE - #define PRINTABLE(C) true - - char charset_mapper(const char c) { - HARDWARE_CHAR_OUT(c); - return 1; - } - -#endif // code mappers - -#endif // UTF_MAPPER_H diff --git a/README.md b/README.md index 8a11867308..c1267a1ba6 100644 --- a/README.md +++ b/README.md @@ -8,75 +8,63 @@ Additional documentation can be found at the [Marlin Home Page](http://marlinfw.org/). Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by! -## Bugfix Branch +## Marlin 2.0 Bugfix Branch __Not for production use. Use with caution!__ -This branch is used to accumulate patches to the latest 1.1.x release version. Periodically this branch will form the basis for the next minor 1.1.x release. +Marlin 2.0 takes this popular RepRap firmware to the next level with support for much faster 32-bit processor boards. -Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). (The latest tagged release of Marlin is version 1.1.7.) +This branch is for patches to the latest 2.0.x release version. Periodically this branch will form the basis for the next minor 2.0.x release. -## Recent Changes -- Internally always use native machine space -- Initial UBL LCD Menu -- New optimized G-code parser singleton -- Initial `M3`/`M4`/`M5` Spindle and Laser support -- Added `M421 Q` to offset a mesh point -- Refinements to `G26` and `G33` -- Added `M80 S` to query the power state -- "Cancel Print" now shuts off heaters -- Added `EXTRAPOLATE_BEYOND_GRID` option for mesh-based leveling +Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). + +## Building Marlin 2.0 + +To build Marlin 2.0 you'll need [Arduino IDE 1.9](https://www.arduino.cc/en/main/software) or [PlatformIO](http://docs.platformio.org/en/latest/ide.html#platformio-ide). We've posted detailed instructions on how to [build Marlin 2.0 for ARM](http://marlinfw.org/docs/basics/install_arm.html). + +## Hardware Abstraction Layer (HAL) + +Marlin 2.0 adds a new abstraction layer so that Marlin can build and run on 32-bit boards while still retaining full 8-bit AVR compatibility. In this way, features can be enhanced for more powerful platforms while still supporting AVR, whereas splitting up the code would make it harder to maintain and keep everything in sync. + +### Current HALs + + name|processor|speed|flash|sram|logic|fpu + ----|---------|-----|-----|----|-----|--- + [Arduino AVR](https://www.arduino.cc/)|ATmega, ATTiny, etc.|16-20MHz|64-256k|2-8k|5V|no + [Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|[AT90USB1286](http://www.microchip.com/wwwproducts/en/AT90USB1286)|16MHz|128k|8k|5V|no + [Due](https://www.arduino.cc/en/Guide/ArduinoDue), [RAMPS-FD](http://www.reprap.org/wiki/RAMPS-FD), etc.|[SAM3X8E ARM-Cortex M3](http://www.microchip.com/wwwproducts/en/ATsam3x8e)|84MHz|512k|64+32k|3.3V|no + [Re-ARM](https://www.kickstarter.com/projects/1245051645/re-arm-for-ramps-simple-32-bit-upgrade)|[LPC1768 ARM-Cortex M3](http://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|100MHz|512k|32+16+16k|3.3-5V|no + [MKS SBASE](http://forums.reprap.org/read.php?13,499322)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no + [Azteeg X5 GT](https://www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm)|LPC1769 ARM-Cortex M3|120MHz|512k|32+16+16k|3.3-5V|no + [Selena Compact](https://github.com/Ales2-k/Selena)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no + [Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|ARM-Cortex M4|120MHz|512k|192k|3.3-5V|yes + [Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|ARM-Cortex M4|180MHz|1M|256k|3.3V|yes + +### HALs in Development + + name|processor|speed|flash|sram|logic|fpu + ----|---------|-----|-----|----|-----|--- + [STEVAL-3DP001V1](http://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](http://www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes + [Smoothieboard](http://reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no ## Submitting Patches -Proposed patches should be submitted as a Pull Request against this branch ([bugfix-1.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-1.1.x)). +Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch. -- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 1.1.x life-cycle. We've opted for a simplified branch structure while we work on the maintainability and encapsulation of code modules. Version 2.0 and beyond should improve on separation of bug fixes and cutting-edge development. -- Follow the proper coding style to gain points with the maintainers. See our [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) page for more information. -- Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues). The "naive" question is often the one we forget to ask. +- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.0.x life-cycle. +- Follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. +- Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues). ### [RepRap.org Wiki Page](http://reprap.org/wiki/Marlin) ## Credits The current Marlin dev team consists of: - - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - -Notable contributors include: - - Alberto Cotronei [[@MagoKimbra](https://github.com/MagoKimbra)] - - Andreas Hardtung [[@AnHardt](https://github.com/AnHardt)] - - Bernhard Kubicek [[@bkubicek](https://github.com/bkubicek)] - - Bob Cousins [[@bobc](https://github.com/bobc)] - - Chris Palmer [[@nophead](https://github.com/nophead)] - - David Braam [[@daid](https://github.com/daid)] - - Edward Patel [[@epatel](https://github.com/epatel)] - - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - - Ernesto Martinez [[@emartinez167](https://github.com/emartinez167)] - - F. Malpartida [[@fmalpartida](https://github.com/fmalpartida)] - - Jochen Groppe [[@CONSULitAS](https://github.com/CONSULitAS)] - - João Brazio [[@jbrazio](https://github.com/jbrazio)] - - Kai [[@Kaibob2](https://github.com/Kaibob2)] - - Luc Van Daele[[@LVD-AC](https://github.com/LVD-AC)] - - Nico Tonnhofer [[@Wurstnase](https://github.com/Wurstnase)] - - Petr Zahradnik [[@clexpert](https://github.com/clexpert)] - - Thomas Moore [[@tcm0116](https://github.com/tcm0116)] - - [[@alexxy](https://github.com/alexxy)] - - [[@android444](https://github.com/android444)] - - [[@benlye](https://github.com/benlye)] - - [[@bgort](https://github.com/bgort)] - - [[@Grogyan](https://github.com/Grogyan)] - - [[@marcio-ao](https://github.com/marcio-ao)] - - [[@maverikou](https://github.com/maverikou)] - - [[@oysteinkrog](https://github.com/oysteinkrog)] - - [[@p3p](https://github.com/p3p)] - - [[@paclema](https://github.com/paclema)] - - [[@paulusjacobus](https://github.com/paulusjacobus)] - - [[@psavva](https://github.com/psavva)] - - [[@Tannoo](https://github.com/Tannoo)] - - [[@teemuatlut](https://github.com/teemuatlut)] - - ...and many others + - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - English + - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - English + - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - English + - Chris Pepper [[@p3p](https://github.com/p3p)] - English + - João Brazio [[@jbrazio](https://github.com/jbrazio)] - Portuguese, English ## License diff --git a/buildroot/bin/build_marlin_pio b/buildroot/bin/build_marlin_pio new file mode 100644 index 0000000000..b3c113c2f6 --- /dev/null +++ b/buildroot/bin/build_marlin_pio @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +platformio run --project-dir $@ --silent diff --git a/buildroot/bin/build_marlin_teensy35 b/buildroot/bin/build_marlin_teensy35 new file mode 100644 index 0000000000..ed6e95cd23 --- /dev/null +++ b/buildroot/bin/build_marlin_teensy35 @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +arduino --verify --board teensy:avr:teensy35:usb=serial,speed=120,opt=o1std,keys=en-us Marlin/Marlin.ino diff --git a/buildroot/bin/opt_disable b/buildroot/bin/opt_disable index 35ad1aad4a..c219f36170 100755 --- a/buildroot/bin/opt_disable +++ b/buildroot/bin/opt_disable @@ -1,5 +1,7 @@ #!/usr/bin/env bash +SED=$(which gsed || which sed) + for opt in "$@" ; do - eval "sed -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration.h" + eval "${SED} -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration.h" done diff --git a/buildroot/bin/opt_disable_adv b/buildroot/bin/opt_disable_adv index 80d83183e5..bbb7ca5ae5 100755 --- a/buildroot/bin/opt_disable_adv +++ b/buildroot/bin/opt_disable_adv @@ -1,5 +1,7 @@ #!/usr/bin/env bash +SED=$(which gsed || which sed) + for opt in "$@" ; do - eval "sed -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration_adv.h" + eval "${SED} -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration_adv.h" done diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index 7b119fa15f..7be02ed9b4 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -1,5 +1,7 @@ #!/usr/bin/env bash +SED=$(which gsed || which sed) + for opt in "$@" ; do - eval "sed -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration.h" + eval "${SED} -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration.h" done diff --git a/buildroot/bin/opt_enable_adv b/buildroot/bin/opt_enable_adv index a34e56f12c..73a9d95415 100755 --- a/buildroot/bin/opt_enable_adv +++ b/buildroot/bin/opt_enable_adv @@ -1,5 +1,7 @@ #!/usr/bin/env bash +SED=$(which gsed || which sed) + for opt in "$@" ; do - eval "sed -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration_adv.h" + eval "${SED} -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration_adv.h" done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index cf8c0d850c..c1de22f5e9 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -1,3 +1,5 @@ #!/usr/bin/env bash -eval "sed -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration.h" +SED=$(which gsed || which sed) + +eval "${SED} -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration.h" diff --git a/buildroot/bin/opt_set_adv b/buildroot/bin/opt_set_adv index 54076a0bca..4c72c4a831 100755 --- a/buildroot/bin/opt_set_adv +++ b/buildroot/bin/opt_set_adv @@ -1,3 +1,5 @@ #!/usr/bin/env bash -eval "sed -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration_adv.h" +SED=$(which gsed || which sed) + +eval "${SED} -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration_adv.h" diff --git a/buildroot/bin/pins_set b/buildroot/bin/pins_set index ae6549fb3d..639995e24c 100755 --- a/buildroot/bin/pins_set +++ b/buildroot/bin/pins_set @@ -1,3 +1,5 @@ #!/usr/bin/env bash -eval "sed -i 's/\(#define \b${2}\b\).*$/\1 ${3}/g' Marlin/pins_${1}.h" +SED=$(which gsed || which sed) + +eval "${SED} -i 's/\(#define \b${2}\b\).*$/\1 ${3}/g' Marlin/src/pins/pins_${1}.h" diff --git a/buildroot/bin/restore_configs b/buildroot/bin/restore_configs index 73240bd438..a77961a287 100755 --- a/buildroot/bin/restore_configs +++ b/buildroot/bin/restore_configs @@ -1,9 +1,9 @@ #!/usr/bin/env bash -cp Marlin/Configuration.h.backup Marlin/Configuration.h -cp Marlin/Configuration_adv.h.backup Marlin/Configuration_adv.h -cp Marlin/pins_RAMPS.h.backup Marlin/pins_RAMPS.h +cp Marlin/src/config/default/Configuration.h Marlin/Configuration.h +cp Marlin/src/config/default/Configuration_adv.h Marlin/Configuration_adv.h +cp Marlin/src/pins/pins_RAMPS.h.backup Marlin/src/pins/pins_RAMPS.h -if [ -f Marlin/_Bootscreen.h ]; then - rm Marlin/_Bootscreen.h +if [ -f Marlin/src/config/_Bootscreen.h ]; then + rm Marlin/src/config/_Bootscreen.h fi diff --git a/buildroot/bin/update_defaults b/buildroot/bin/update_defaults new file mode 100644 index 0000000000..6100e1050f --- /dev/null +++ b/buildroot/bin/update_defaults @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cp Marlin/Configuration.h Marlin/src/config/default/Configuration.h +cp Marlin/Configuration_adv.h Marlin/src/config/default/Configuration_adv.h diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 21031ee121..405f36b2a9 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -2,8 +2,8 @@ restore_configs -cp Marlin/example_configurations/"$@"/Configuration* Marlin/ +cp Marlin/src/config/examples/"$@"/Configuration* Marlin/ -if [ -f "Marlin/example_configurations/$@/_Bootscreen.h" ]; then - cp "Marlin/example_configurations/$@/_Bootscreen.h" Marlin/ +if [ -f "Marlin/src/config/examples/$@/_Bootscreen.h" ]; then + cp "Marlin/src/config/examples/$@/_Bootscreen.h" Marlin/src/config/ fi diff --git a/buildroot/etc/udev/rules.d/99-platformio-udev.rules b/buildroot/etc/udev/rules.d/99-platformio-udev.rules new file mode 100644 index 0000000000..6daaf922bf --- /dev/null +++ b/buildroot/etc/udev/rules.d/99-platformio-udev.rules @@ -0,0 +1,207 @@ +# Copyright (c) 2014-present PlatformIO +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##################################################################################### +# +# INSTALLATION +# +# Please visit > http://docs.platformio.org/en/latest/faq.html#platformio-udev-rules +# +##################################################################################### + +# +# Boards +# + +# CP210X USB UART +SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666" + +# FT232R USB UART +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0666" + +# Prolific Technology, Inc. PL2303 Serial Port +SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666" + +# QinHeng Electronics HL-340 USB-Serial adapter +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666" + +# Arduino boards +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][02]*", MODE:="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666" + +# Arduino SAM-BA +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{MTP_NO_PROBE}="1" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666" + +# Digistump boards +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1" + +# STM32 discovery boards, with onboard st/linkv2 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374?", MODE:="0666" + +# USBtiny +SUBSYSTEMS=="usb", ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE="0666" + +# USBasp V2.0 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666" + +# Teensy boards +ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", ENV{MTP_NO_PROBE}="1" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", MODE:="0666" + +#TI Stellaris Launchpad +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666" + +#TI MSP430 Launchpad +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0666" + + +# +# Debuggers +# + +# Black Magic Probe +SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic GDB Server" +SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic UART Port" + +# opendous and estick +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT232/FT245 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT2232 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT4232 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT232H VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# DISTORTEC JTAG-lock-pick Tiny 2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TUMPA, TUMPA Lite +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# XDS100v2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE) +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca0", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca1", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris Evaluation Board FTDI (several) +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) Board +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# egnite Turtelizer 2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Section5 ICEbear +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Amontec JTAGkey and JTAGkey-tiny +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI ICDI +ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v1 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v2 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v2-1 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hilscher NXHX Boards +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hitex STR9-comStick +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002c", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hitex STM32-PerformanceStick +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002d", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Altera USB Blaster +ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Amontec JTAGkey-HiSpeed +ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# SEGGER J-Link +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0102", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0103", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0104", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0107", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0108", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1010", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1011", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1012", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1013", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1014", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1016", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1017", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1018", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Raisonance RLink +ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Debug Board for Neo1973 +ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-TINY +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-JTAG-EW +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="001e", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-TINY-H +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-H +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# USBprog with OpenOCD firmware +ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board +ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Marvell Sheevaplug +ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Keil Software, Inc. ULink +ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2710", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# CMSIS-DAP compatible adapters +ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess" diff --git a/buildroot/share/PlatformIO/boards/at90USB1286.json b/buildroot/share/PlatformIO/boards/at90USB1286.json new file mode 100644 index 0000000000..f8d82d1233 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/at90USB1286.json @@ -0,0 +1,20 @@ +{ + "build": { + "core": "teensy", + "extra_flags": "-DTEENSY2PP", + "f_cpu": "16000000L", + "mcu": "at90usb1286" + }, + "frameworks": [ + "arduino" + ], + "name": "at90USB1286.json", + "upload": { + "maximum_ram_size": 8192, + "maximum_size": 122880, + "require_upload_port": true, + "protocol": "" + }, + "url": "https://github.com/MarlinFirmware/Marlin", + "vendor": "various" +} diff --git a/buildroot/share/atom/auto_build.py b/buildroot/share/atom/auto_build.py index 765ebb5e1e..6268f27343 100644 --- a/buildroot/share/atom/auto_build.py +++ b/buildroot/share/atom/auto_build.py @@ -23,6 +23,8 @@ ####################################### # +# Revision: 2.0.1 +# # Description: script to automate PlatformIO builds # CLI: python auto_build.py build_option # build_option (required) @@ -69,6 +71,13 @@ import sys import os +pwd = os.getcwd() # make sure we're executing from the correct directory level +pwd = pwd.replace('\\', '/') +if 0 <= pwd.find('buildroot/share/atom'): + pwd = pwd[ : pwd.find('buildroot/share/atom')] + os.chdir(pwd) +print 'pwd: ', pwd + num_args = len(sys.argv) if num_args > 1: build_type = str(sys.argv[1]) @@ -89,6 +98,14 @@ else: print "This script only runs under python 2" exit() +import platform +current_OS = platform.system() + +#globals +target_env = '' +board_name = '' + + ######### # Python 2 error messages: # Can't find a usable init.tcl in the following directories ... @@ -101,10 +118,6 @@ else: # reboot ######### -#globals -target_env = '' -board_name = '' - ########################################################################################## @@ -191,28 +204,251 @@ def get_answer(board_name, cpu_label_txt, cpu_a_txt, cpu_b_txt): # end - get answer +# +# move custom board definitions from project folder to PlatformIO +# +def resolve_path(path): + import os -def env_name_check(argument): - name_check = { - 'teensy35' : True, - 'teensy20' : True, - 'STM32F4' : True, - 'STM32F1' : True, - 'sanguino_atmega644p' : True, - 'sanguino_atmega1284p' : True, - 'rambo' : True, - 'melzi_optiboot' : True, - 'melzi' : True, - 'megaatmega2560' : True, - 'megaatmega1280' : True, - 'malyanm200' : True, - 'LPC1768' : True, - 'DUE_debug' : True, - 'DUE_USB' : True, - 'DUE' : True - } + # turn the selection into a partial path - return name_check.get(argument, False) + if 0 <= path.find('"'): + path = path[ path.find('"') : ] + if 0 <= path.find(', line '): + path = path.replace(', line ', ':') + path = path.replace('"', '') + + #get line and column numbers + line_num = 1 + column_num = 1 + line_start = path.find(':', 2) # use 2 here so don't eat Windows full path + column_start = path.find(':', line_start + 1) + if column_start == -1: + column_start = len(path) + column_end = path.find(':', column_start + 1) + if column_end == -1: + column_end = len(path) + if 0 <= line_start: + line_num = path[ line_start + 1 : column_start] + if line_num == '': + line_num = 1 + if not(column_start == column_end): + column_num = path[ column_start + 1 : column_end] + if column_num == '': + column_num = 0 + + index_end = path.find(',') + if 0 <= index_end: + path = path[ : index_end] # delete comma and anything after + index_end = path.find(':', 2) + if 0 <= index_end: + path = path[ : path.find(':', 2)] # delete the line number and anything after + + path = path.replace('\\','/') + + if 1 == path.find(':') and current_OS == 'Windows': + return path, line_num, column_num # found a full path - no need for further processing + elif 0 == path.find('/') and (current_OS == 'Linux' or current_OS == 'Darwin'): + return path, line_num, column_num # found a full path - no need for further processing + + else: + + # resolve as many '../' as we can + while 0 <= path.find('../'): + end = path.find('../') - 1 + start = path.find('/') + while 0 <= path.find('/',start) and end > path.find('/',start): + start = path.find('/',start) + 1 + path = path[0:start] + path[end + 4: ] + + # this is an alternative to the above - it just deletes the '../' section + # start_temp = path.find('../') + # while 0 <= path.find('../',start_temp): + # start = path.find('../',start_temp) + # start_temp = start + 1 + # if 0 <= start: + # path = path[start + 2 : ] + + + start = path.find('/') + if not(0 == start): # make sure path starts with '/' + while 0 == path.find(' '): # eat any spaces at the beginning + path = path[ 1 : ] + path = '/' + path + + if current_OS == 'Windows': + search_path = path.replace('/', '\\') # os.walk uses '\' in Windows + else: + search_path = path + + start_path = os.path.abspath('') + + # search project directory for the selection + found = False + full_path = '' + for root, directories, filenames in os.walk(start_path): + for filename in filenames: + if 0 <= root.find('.git'): # don't bother looking in this directory + break + full_path = os.path.join(root,filename) + if 0 <= full_path.find(search_path): + found = True + break + if found: + break + + return full_path, line_num, column_num + +# end - resolve_path + + +# +# Opens the file in the preferred editor at the line & column number +# If the preferred editor isn't already running then it tries the next. +# If none are open then the system default is used. +# +# Editor order: +# 1. Notepad++ (Windows only) +# 2. Sublime Text +# 3. Atom +# 4. System default (opens at line 1, column 1 only) +# +def open_file(path): + import subprocess + file_path, line_num, column_num = resolve_path(path) + + if file_path == '' : + return + + if current_OS == 'Windows': + + editor_note = subprocess.check_output('wmic process where "name=' + "'notepad++.exe'" + '" get ExecutablePath') + editor_sublime = subprocess.check_output('wmic process where "name=' + "'sublime_text.exe'" + '" get ExecutablePath') + editor_atom = subprocess.check_output('wmic process where "name=' + "'atom.exe'" + '" get ExecutablePath') + + if 0 <= editor_note.find('notepad++.exe'): + start = editor_note.find('\n') + 1 + end = editor_note.find('\n',start + 5) -4 + editor_note = editor_note[ start : end] + command = file_path , ' -n' + str(line_num) , ' -c' + str(column_num) + subprocess.Popen([editor_note, command]) + + elif 0 <= editor_sublime.find('sublime_text.exe'): + start = editor_sublime.find('\n') + 1 + end = editor_sublime.find('\n',start + 5) -4 + editor_sublime = editor_sublime[ start : end] + command = file_path + ':' + line_num + ':' + column_num + subprocess.Popen([editor_sublime, command]) + + elif 0 <= editor_atom.find('atom.exe'): + start = editor_atom.find('\n') + 1 + end = editor_atom.find('\n',start + 5) -4 + editor_atom = editor_atom[ start : end] + command = file_path + ':' + str(line_num) + ':' + str(column_num) + subprocess.Popen([editor_atom, command]) + + else: + os.startfile(resolve_path(path)) # open file with default app + + elif current_OS == 'Linux': + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[ : index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps ax -o cmd', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_linux(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + return True, path + return False , '' + + (success_sublime, editor_path_sublime) = find_editor_linux('sublime_text',temp) + (success_atom, editor_path_atom) = find_editor_linux('atom',temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('xdg-open ' + file_path ) + + elif current_OS == 'Darwin': # MAC + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[ : index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps axwww -o command', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_mac(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + if 0 <= path.find('-psn'): + path = path[ : path.find('-psn') - 1 ] + return True, path + return False , '' + + (success_sublime, editor_path_sublime) = find_editor_mac('Sublime',temp) + (success_atom, editor_path_atom) = find_editor_mac('Atom',temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('open ' + file_path ) +# end - open_file + + +# +# move custom board definitions from project folder to PlatformIO +# +def copy_boards_dir(): + + temp = os.environ + for key in temp: + if 0 <= os.environ[key].find('.platformio'): + part = os.environ[key].split(';') + for part2 in part: + if 0 <= part2.find('.platformio'): + path = part2 + break + + PIO_path = path[ : path.find('.platformio') + 11] + +# import sys +# import subprocess +# pio_subprocess = subprocess.Popen(['platformio', 'run', '-t', 'envdump'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +# +# # stream output from subprocess and split it into lines +# for line in iter(pio_subprocess.stdout.readline, ''): +# if 0 <= line.find('PIOHOME_DIR'): +# start = line.find(':') + 3 +# end = line.find(',') - 1 +# PIO_path = line[start:end] + + + PIO_path = PIO_path.replace("\\", "/") + PIO_path = PIO_path.replace("//", "/") + '/boards' + + board_path = 'buildroot/share/PlatformIO/boards' + + from distutils.dir_util import copy_tree + copy_tree(board_path, PIO_path) + +# end copy_boards_dir # gets the last build environment @@ -223,14 +459,16 @@ def get_build_last(): date_last = 0.0 DIR__pioenvs = os.listdir('.pioenvs') for name in DIR__pioenvs: - if env_name_check(name): - DIR_temp = os.listdir('.pioenvs/' + name) - for names_temp in DIR_temp: - if 0 == names_temp.find('firmware.'): - date_temp = os.path.getmtime('.pioenvs/' + name + '/' + names_temp) - if date_temp > date_last: - date_last = date_temp - env_last = name + if 0 <= name.find('.') or 0 <= name.find('-'): # skip files in listing + continue + DIR_temp = os.listdir('.pioenvs/' + name) + for names_temp in DIR_temp: + + if 0 == names_temp.find('firmware.'): + date_temp = os.path.getmtime('.pioenvs/' + name + '/' + names_temp) + if date_temp > date_last: + date_last = date_temp + env_last = name return env_last @@ -296,6 +534,10 @@ def get_starting_env(board_name_full, version): with open(path, 'r') as myfile: pins_h = myfile.read() + env_A = '' + env_B = '' + env_C = '' + board_name = board_name_full[ 6 : ] # only use the part after "BOARD_" since we're searching the pins.h file pins_h = pins_h.split('\n') environment = '' @@ -350,10 +592,10 @@ def get_env(board_name, ver_Marlin): raise SystemExit(0) # quit if unable to find board - CPU_question = ( ('1280', '2560', "1280 or 2560 CPU?"), ('644', '1284', "644 or 1284 CPU?") ) + CPU_question = ( ('1280', '2560', " 1280 or 2560 CPU? "), ('644', '1284', " 644 or 1284 CPU? ") ) if 0 < board_name.find('MELZI') : - get_answer(board_name, "Which flavor of Melzi?", "Melzi (Optiboot bootloader)", "Melzi ") + get_answer(' ' + board_name + ' ', " Which flavor of Melzi? ", "Melzi (Optiboot bootloader)", "Melzi ") if 1 == get_answer_val: target_env = 'melzi_optiboot' else: @@ -371,7 +613,7 @@ def get_env(board_name, ver_Marlin): for item in CPU_question: if CPU_A == item[0]: - get_answer(board_name, item[2], item[0], item[1]) + get_answer(' ' + board_name + ' ', item[2], item[0], item[1]) if 2 == get_answer_val: target_env = env_B else: @@ -388,7 +630,7 @@ def get_env(board_name, ver_Marlin): if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'DUE_debug'): target_env = 'DUE_debug' elif env_B == 'DUE_USB': - get_answer(board_name, "DUE: need download port", "USB (native USB) port", "Programming port ") + get_answer(' ' + board_name + ' ', " DUE: need download port ", "USB (native USB) port", "Programming port ") if 1 == get_answer_val: target_env = 'DUE_USB' else: @@ -408,6 +650,7 @@ def get_env(board_name, ver_Marlin): # puts screen text into queue so that the parent thread can fetch the data from this thread import Queue IO_queue = Queue.Queue() +PIO_queue = Queue.Queue() def write_to_screen_queue(text, format_tag = 'normal'): double_in = [text, format_tag] IO_queue.put(double_in, block = False) @@ -431,6 +674,7 @@ standard = True prev_line_COM = False next_line_warning = False warning_continue = False +line_counter = 0 def line_print(line_input): @@ -441,6 +685,7 @@ def line_print(line_input): global prev_line_COM global next_line_warning global warning_continue + global line_counter @@ -490,12 +735,19 @@ def line_print(line_input): write_to_screen_queue(text[found_right : ] + '\n') break if did_something == False: - write_to_screen_queue(text + '\n') + r_loc = text.find('\r') + 1 + if r_loc > 0 and r_loc < len(text): # need to split this line + text = text.split('\r') + for line in text: + write_to_screen_queue(line + '\n') + else: + write_to_screen_queue(text + '\n') # end - write_to_screen_with_replace # scan the line + line_counter = line_counter + 1 max_search = len(line_input) if max_search > 3 : max_search = 3 @@ -510,7 +762,14 @@ def line_print(line_input): prev_line_COM = False prev_line_COM = False warning_continue = True - if beginning == 'War' or \ + if 0 < line_input.find('Thank you') or 0 < line_input.find('SUMMARY') : + warning = False #standard line found + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + elif beginning == 'War' or \ beginning == '#er' or \ beginning == 'In ' or \ (beginning != 'Com' and prev_line_COM == True and not(beginning == 'Arc' or beginning == 'Lin' or beginning == 'Ind') or \ @@ -539,11 +798,6 @@ def line_print(line_input): error = True standard = False prev_line_COM = False - - elif beginning == 'fro' and warning == True : # start of warning /error block - warning_FROM = True - prev_line_COM = False - warning_continue = True elif 0 < line_input.find(': error:') or \ 0 < line_input.find(': fatal error:'): # start of warning /error block warning = False # error found @@ -552,9 +806,14 @@ def line_print(line_input): standard = False prev_line_COM = False warning_continue = True + elif beginning == 'fro' and warning == True or \ + beginning == '.pi' : # start of warning /error block + warning_FROM = True + prev_line_COM = False + warning_continue = True elif warning_continue == True: warning = True - warning_FROM = False # keep the warning status going until find a standard line + warning_FROM = False # keep the warning status going until find a standard line or an error error = False standard = False prev_line_COM = False @@ -608,6 +867,7 @@ def run_PIO(dummy): import subprocess import sys + print 'starting platformio' if build_type == 'build': @@ -664,7 +924,7 @@ def run_PIO(dummy): # stream output from subprocess and split it into lines for line in iter(pio_subprocess.stdout.readline, ''): - line_print(line.replace('\n', '')) + line_print(line.replace('\n', '')) # append info used to run PlatformIO @@ -696,10 +956,16 @@ import tkFileDialog class output_window(Text): - + # based on Super Text global continue_updates continue_updates = True + global search_position + search_position = '' # start with invalid search position + + global error_found + error_found = False # are there any errors? + def __init__(self): @@ -713,7 +979,9 @@ class output_window(Text): Text.__init__(self, self.frame, borderwidth=3, relief="sunken") self.config(tabs=(400,)) # configure Text widget tab stops self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'word', undo = 'True') - self.config(height = 24, width = 120) +# self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'none', undo = 'True') + self.config(height = 24, width = 100) + self.config(insertbackground = 'pale green') # keyboard insertion point self.pack(side='left', fill='both', expand=True) self.tag_config('normal', foreground = 'white') @@ -721,8 +989,12 @@ class output_window(Text): self.tag_config('error', foreground = 'red') self.tag_config('highlight_green', foreground = 'green') self.tag_config('highlight_blue', foreground = 'cyan') + self.tag_config('error_highlight_inactive', background = 'dim gray') + self.tag_config('error_highlight_active', background = 'light grey') -# self.bind('', self.select_all) # the event happens but the action doesn't + self.bind_class("Text","", self.select_all) # required in windows, works in others + self.bind_all("", self.scroll_errors) + self.bind_class("", self.rebuild) # scrollbar @@ -730,18 +1002,50 @@ class output_window(Text): self.config(yscrollcommand=scrb.set) scrb.pack(side='right', fill='y') +# self.scrb_Y = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) +# self.scrb_Y.config(yscrollcommand=self.scrb_Y.set) +# self.scrb_Y.pack(side='right', fill='y') +# +# self.scrb_X = tk.Scrollbar(self.frame, orient='horizontal', command=self.xview) +# self.scrb_X.config(xscrollcommand=self.scrb_X.set) +# self.scrb_X.pack(side='bottom', fill='x') + +# scrb_X = tk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.xview) # tk.HORIZONTAL now have a horizsontal scroll bar BUT... shrinks it to a postage stamp and hides far right behind the vertical scroll bar +# self.config(xscrollcommand=scrb_X.set) +# scrb_X.pack(side='bottom', fill='x') +# +# scrb= tk.Scrollbar(self, orient='vertical', command=self.yview) +# self.config(yscrollcommand=scrb.set) +# scrb.pack(side='right', fill='y') + +# self.config(height = 240, width = 1000) # didn't get the size baCK TO NORMAL +# self.pack(side='left', fill='both', expand=True) # didn't get the size baCK TO NORMAL + # pop-up menu self.popup = tk.Menu(self, tearoff=0) - self.popup.add_command(label='Cut', command=self._cut) + self.popup.add_command(label='Copy', command=self._copy) self.popup.add_command(label='Paste', command=self._paste) self.popup.add_separator() + self.popup.add_command(label='Cut', command=self._cut) + self.popup.add_separator() self.popup.add_command(label='Select All', command=self._select_all) self.popup.add_command(label='Clear All', command=self._clear_all) self.popup.add_separator() self.popup.add_command(label='Save As', command=self._file_save_as) - self.bind('', self._show_popup) + self.popup.add_separator() + # self.popup.add_command(label='Repeat Build(CTL-shift-r)', command=self._rebuild) + self.popup.add_command(label='Repeat Build', command=self._rebuild) + self.popup.add_separator() + self.popup.add_command(label='Scroll Errors (CTL-shift-e)', command=self._scroll_errors) + self.popup.add_separator() + self.popup.add_command(label='Open File at Cursor', command=self._open_selected_file) + + if current_OS == 'Darwin': # MAC + self.bind('', self._show_popup) # macOS only + else: + self.bind('', self._show_popup) # Windows & Linux # threading & subprocess section @@ -761,18 +1065,17 @@ class output_window(Text): def check_thread(self): # wait for user to kill the window global continue_updates if continue_updates == True: - self.root.after(20, self.check_thread) + self.root.after(10, self.check_thread) def update(self): global continue_updates if continue_updates == True: - self.root.after(20, self.update)#method is called every 50ms + self.root.after(10, self.update)#method is called every 50ms temp_text = ['0','0'] if IO_queue.empty(): if not(self.secondary_thread.is_alive()): continue_updates = False # queue is exhausted and thread is dead so no need for further updates - self.tag_add('sel', '1.0', 'end') else: try: temp_text = IO_queue.get(block = False) @@ -785,6 +1088,74 @@ class output_window(Text): # text editing section + + def _scroll_errors(self): + global search_position + global error_found + if search_position == '': # first time so highlight all errors + countVar = tk.IntVar() + search_position = '1.0' + search_count = 0 + while not(search_position == '') and search_count < 100: + search_position = self.search("error", search_position, stopindex="end", count=countVar, nocase=1) + search_count = search_count + 1 + if not(search_position == ''): + error_found = True + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_inactive", search_position, end_pos) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + else: + break + + if error_found: + if search_position == '': + search_position = self.search("error", '1.0', stopindex="end", nocase=1) # new search + else: # remove active highlight + end_pos = '{}+{}c'.format(search_position, 5) + start_pos = '{}+{}c'.format(search_position, -1) + self.tag_remove("error_highlight_active", start_pos, end_pos) + search_position = self.search("error", search_position, stopindex="end", nocase=1) # finds first occurrence AGAIN on the first time through + if search_position == "": # wrap around + search_position = self.search("error", '1.0', stopindex="end", nocase=1) + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_active", search_position, end_pos) # add active highlight + self.see(search_position) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + + def scroll_errors(self, event): + self._scroll_errors() + + + def _rebuild(self): + #global board_name + #global Marlin_ver + #global target_env + #board_name, Marlin_ver = get_board_name() + #target_env = get_env(board_name, Marlin_ver) + self.start_thread() + + def rebuild(self, event): + print "event happened" + self._rebuild() + + + def _open_selected_file(self): + current_line = self.index('insert') + line_start = current_line[ : current_line.find('.')] + '.0' + line_end = current_line[ : current_line.find('.')] + '.200' + self.mark_set("path_start", line_start) + self.mark_set("path_end", line_end) + path = self.get("path_start", "path_end") + from_loc = path.find('from ') + colon_loc = path.find(': ') + if 0 <= from_loc and ((colon_loc == -1) or (from_loc < colon_loc)) : + path = path [ from_loc + 5 : ] + if 0 <= colon_loc: + path = path [ : colon_loc ] + if 0 <= path.find('\\') or 0 <= path.find('/'): # make sure it really contains a path + open_file(path) + + def _file_save_as(self): self.filename = tkFileDialog.asksaveasfilename(defaultextension = '.txt') f = open(self.filename, 'w') @@ -833,7 +1204,7 @@ class output_window(Text): pass def cut(self, event): - _cut(self) + self._cut() def _copy(self): @@ -845,7 +1216,7 @@ class output_window(Text): pass def copy(self, event): - _copy(self) + self._copy() def _paste(self): @@ -867,40 +1238,7 @@ class output_window(Text): if isok: self.delete('1.0', 'end') - def _place_cursor(self): # theme: terminal - '''check the position of the cursor against the last known position - every 15ms and update the cursorblock tag as needed''' - current_index = self.index('insert') - - if self.cursor != current_index: - self.cursor = current_index - self.tag_delete('cursorblock') - - start = self.index('insert') - end = self.index('insert+1c') - - if start[0] != end[0]: - self.insert(start, ' ') - end = self.index('insert') - - self.tag_add('cursorblock', start, end) - self.mark_set('insert', self.cursor) - - self.after(15, self._place_cursor) - - def _blink_cursor(self): # theme: terminal - '''alternate the background color of the cursorblock tagged text - every 600 milliseconds''' - - if self.switch == self.fg: - self.switch = self.bg - else: - self.switch = self.fg - - self.tag_config('cursorblock', background=self.switch) - - self.after(600, self._blink_cursor) # end - output_window @@ -922,7 +1260,14 @@ def main(): target_env = get_env(board_name, Marlin_ver) + os.environ["BUILD_TYPE"] = build_type # let sub processes know what is happening + os.environ["TARGET_ENV"] = target_env + os.environ["BOARD_NAME"] = board_name + auto_build = output_window() + if 0 <= target_env.find('USB1286'): + copy_boards_dir() # copy custom boards over to PlatformIO if using custom board + # causes 3-5 second delay in main window appearing auto_build.start_thread() # executes the "run_PIO" function auto_build.root.mainloop() diff --git a/buildroot/share/atom/avrdude.conf b/buildroot/share/atom/avrdude.conf new file mode 100644 index 0000000000..1194847f77 --- /dev/null +++ b/buildroot/share/atom/avrdude.conf @@ -0,0 +1,15478 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "lpt1"; +default_serial = "com1"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port (download on http://electropol.free.fr) +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/avrdude_5.10_linux b/buildroot/share/atom/avrdude_5.10_linux new file mode 100644 index 0000000000..0b7f3fda43 Binary files /dev/null and b/buildroot/share/atom/avrdude_5.10_linux differ diff --git a/buildroot/share/atom/avrdude_5.10_macOS b/buildroot/share/atom/avrdude_5.10_macOS new file mode 100644 index 0000000000..dbcfc997e4 Binary files /dev/null and b/buildroot/share/atom/avrdude_5.10_macOS differ diff --git a/buildroot/share/atom/avrdude_linux.conf b/buildroot/share/atom/avrdude_linux.conf new file mode 100644 index 0000000000..46e7ace34b --- /dev/null +++ b/buildroot/share/atom/avrdude_linux.conf @@ -0,0 +1,15478 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "/dev/parport0"; +default_serial = "/dev/ttyS0"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port (download on http://electropol.free.fr) +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/avrdude_macOS.conf b/buildroot/share/atom/avrdude_macOS.conf new file mode 100644 index 0000000000..d933567452 --- /dev/null +++ b/buildroot/share/atom/avrdude_macOS.conf @@ -0,0 +1,15272 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "unknown"; +default_serial = "unknown"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/create_custom_upload_command_CDC.py b/buildroot/share/atom/create_custom_upload_command_CDC.py new file mode 100644 index 0000000000..2fea2d5b53 --- /dev/null +++ b/buildroot/share/atom/create_custom_upload_command_CDC.py @@ -0,0 +1,141 @@ +# +# Builds custom upload command +# 1) Run platformio as a subprocess to find a COM port +# 2) Build the upload command +# 3) Exit and let upload tool do the work +# +# This script runs between completion of the library/dependencies installation and compilation. +# +# Will continue on if a COM port isn't found so that the compilation can be done. +# + +import subprocess +import os +import sys +from SCons.Script import DefaultEnvironment +import platform +current_OS = platform.system() + +env = DefaultEnvironment() + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') + + +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + com_first = '' + com_last = '' + com_CDC = '' + description_first = '' + description_last = '' + description_CDC = '' + + # + # grab the first com port that pops up unless we find one we know for sure + # is a CDC device + # + def get_com_port(com_search_text, descr_search_text, start): + + global com_first + global com_last + global com_CDC + global description_first + global description_last + global description_CDC + + + print '\nLooking for Serial Port\n' + + # stream output from subprocess and split it into lines + pio_subprocess = subprocess.Popen(['platformio', 'device', 'list'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + looking_for_description = False + for line in iter(pio_subprocess.stdout.readline, ''): + if 0 <= line.find(com_search_text): + looking_for_description = True + com_last = line.replace('\n', '') + if com_first == '': + com_first = com_last + if 0 <= line.find(descr_search_text) and looking_for_description: + looking_for_description = False + description_last = line[ start : ] + if description_first == '': + description_first = description_last + if 0 <= description_last.find('CDC'): + com_CDC = com_last + description_CDC = description_last + + if com_CDC == '' and not(com_first == ''): + com_CDC = com_first + description_CDC = description_first + elif com_CDC == '': + com_CDC = 'COM_PORT_NOT_FOUND' + + while 0 <= com_CDC.find('\n'): + com_CDC = com_CDC.replace('\n', '') + while 0 <= com_CDC.find('\r'): + com_CDC = com_CDC.replace('\r', '') + + if com_CDC == 'COM_PORT_NOT_FOUND': + print com_CDC, '\n' + else: + print 'FOUND: ' ,com_CDC + print 'DESCRIPTION: ', description_CDC , '\n' + + if current_OS == 'Windows': + + get_com_port('COM', 'Hardware ID:', 13) + + # avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + avrdude_conf_path = 'buildroot\\share\\atom\\avrdude.conf' + + avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' + + # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + source_path = '.pioenvs\\' + env.get("PIOENV") + '\\firmware.hex' + + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + + + if current_OS == 'Darwin': # MAC + + get_com_port('usbmodem', 'Description:', 13) + +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_macOS.conf' + + + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_macOS' + +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' + + +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + print 'upload_string: ', upload_string + + + + if current_OS == 'Linux': + + get_com_port('/dev/tty', 'Description:', 13) + +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_linux.conf' + + + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_linux' +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' + +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + + + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + ) diff --git a/buildroot/share/atom/create_custom_upload_command_DFU.py b/buildroot/share/atom/create_custom_upload_command_DFU.py new file mode 100644 index 0000000000..9082699bf4 --- /dev/null +++ b/buildroot/share/atom/create_custom_upload_command_DFU.py @@ -0,0 +1,42 @@ +# +# Builds custom upload command +# 1) Run platformio as a subprocess to find a COM port +# 2) Build the upload command +# 3) Exit and let upload tool do the work +# +# This script runs between completion of the library/dependencies installation and compilation. +# +# Will continue on if a COM port isn't found so that the compilation can be done. +# + +import os +import sys +from SCons.Script import DefaultEnvironment +import platform +current_OS = platform.system() + +env = DefaultEnvironment() + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + + if current_OS == 'Windows': + avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + + source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + + upload_string = 'avrdude -p usb1286 -c flip1 -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + + else: + source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + + upload_string = 'avrdude -p usb1286 -c flip1 -U flash:w:' + source_path + ':i' + + + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + ) diff --git a/buildroot/share/cmake/CMakeLists.txt b/buildroot/share/cmake/CMakeLists.txt index 54cef29cc4..1308f8bf97 100644 --- a/buildroot/share/cmake/CMakeLists.txt +++ b/buildroot/share/cmake/CMakeLists.txt @@ -93,11 +93,11 @@ setup_motherboard(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/../../../Marlin) #====================================================================# # Setup all source files # -# Incude Marlin.ino to compile libs not included in *.cpp files # +# Include Marlin.ino to compile libs not included in *.cpp files # #====================================================================# -file(GLOB SOURCES "../../../Marlin/*.cpp") -set(${PROJECT_NAME}_SRCS "${SOURCES};../../../Marlin/Marlin.ino") +file(GLOB SOURCES "../../../src/*.cpp") +set(${PROJECT_NAME}_SRCS "${SOURCES};../../../src/Marlin.ino") #====================================================================# # Define the port for uploading code to the Arduino # diff --git a/buildroot/share/fonts/HD44780_C.fon b/buildroot/share/fonts/HD44780_C.fon deleted file mode 100644 index bb9ca2a500..0000000000 Binary files a/buildroot/share/fonts/HD44780_C.fon and /dev/null differ diff --git a/buildroot/share/fonts/HD44780_J.fon b/buildroot/share/fonts/HD44780_J.fon deleted file mode 100644 index f687747853..0000000000 Binary files a/buildroot/share/fonts/HD44780_J.fon and /dev/null differ diff --git a/buildroot/share/fonts/HD44780_W.fon b/buildroot/share/fonts/HD44780_W.fon deleted file mode 100644 index e478dbb087..0000000000 Binary files a/buildroot/share/fonts/HD44780_W.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646-1-tr.fon b/buildroot/share/fonts/ISO10646-1-tr.fon deleted file mode 100644 index f6f6cdec7e..0000000000 Binary files a/buildroot/share/fonts/ISO10646-1-tr.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646-1.fon b/buildroot/share/fonts/ISO10646-1.fon deleted file mode 100644 index d3b409ed2d..0000000000 Binary files a/buildroot/share/fonts/ISO10646-1.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646-4_Greek.fon b/buildroot/share/fonts/ISO10646-4_Greek.fon deleted file mode 100644 index a6b905fefb..0000000000 Binary files a/buildroot/share/fonts/ISO10646-4_Greek.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646-5_Cyrillic.fon b/buildroot/share/fonts/ISO10646-5_Cyrillic.fon deleted file mode 100644 index f52970cbc7..0000000000 Binary files a/buildroot/share/fonts/ISO10646-5_Cyrillic.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646_CN.fon b/buildroot/share/fonts/ISO10646_CN.fon deleted file mode 100644 index 6c77eeccd8..0000000000 Binary files a/buildroot/share/fonts/ISO10646_CN.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646_CZ.fon b/buildroot/share/fonts/ISO10646_CZ.fon deleted file mode 100644 index 5208f92fdb..0000000000 Binary files a/buildroot/share/fonts/ISO10646_CZ.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646_Kana.fon b/buildroot/share/fonts/ISO10646_Kana.fon deleted file mode 100644 index 995de04108..0000000000 Binary files a/buildroot/share/fonts/ISO10646_Kana.fon and /dev/null differ diff --git a/buildroot/share/fonts/ISO10646_SK.fon b/buildroot/share/fonts/ISO10646_SK.fon deleted file mode 100644 index 76bfcc9e17..0000000000 Binary files a/buildroot/share/fonts/ISO10646_SK.fon and /dev/null differ diff --git a/buildroot/share/fonts/Marlin_symbols.fon b/buildroot/share/fonts/Marlin_symbols.fon deleted file mode 100644 index 667ffd323a..0000000000 Binary files a/buildroot/share/fonts/Marlin_symbols.fon and /dev/null differ diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh new file mode 100644 index 0000000000..cc0e3f27b8 --- /dev/null +++ b/buildroot/share/fonts/genallfont.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash + +##################################################################### +# genallfont.sh for Marlin +# +# This script generates font data for language headers +# +# Copyright 2015-2018 Yunhui Fu +# License: GPL/BSD +##################################################################### +my_getpath() { + local PARAM_DN="$1" + shift + #readlink -f + local DN="${PARAM_DN}" + local FN= + if [ ! -d "${DN}" ]; then + FN=$(basename "${DN}") + DN=$(dirname "${DN}") + fi + cd "${DN}" > /dev/null 2>&1 + DN=$(pwd) + cd - > /dev/null 2>&1 + echo -n "${DN}" + [[ -z "$FN" ]] || echo -n "/${FN}" +} +#DN_EXEC=`echo "$0" | ${EXEC_AWK} -F/ '{b=$1; for (i=2; i < NF; i ++) {b=b "/" $(i)}; print b}'` +DN_EXEC=$(dirname $(my_getpath "$0") ) + +EXEC_WXGGEN="${DN_EXEC}/uxggenpages.sh" + +EXEC_BDF2U8G=`which bdf2u8g` +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${DN_EXEC}/bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${PWD}/bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || { EOL=$'\n' ; echo "ERR: Can't find bdf2u8g!${EOL}See uxggenpages.md for bdf2u8g build instructions." >&2 ; exit 1; } + +#FN_FONT="${1:-}" +FN_FONT="${DN_EXEC}/marlin-6x12-3.bdf" +[ "$1" = "" ] || FN_FONT="$1" + +DN_FONT0=`dirname ${FN_FONT}` +DN_FONT="$(my_getpath ${DN_FONT0})" +FN_FONT="$(my_getpath "${DN_FONT}")/"`basename ${FN_FONT}` +[ -z "${FN_FONT}" ] && FN_FONT=${DN_DATA}/../${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT=${DN_EXEC}/${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/wenquanyi/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/X11/misc/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/misc/${FN_FONT_BASE}.bdf" +#echo "genallfont.sh: FN_FONT=${FN_FONT}" + +DN_WORK=./tmp1 + +(cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) + +LANGS_DEFAULT="an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test" + +for LANG in ${MARLIN_LANGS:=$LANGS_DEFAULT} ; do + echo "Generating Marlin language data for '${LANG}'" >&2 + rm -rf ${DN_WORK}/ + mkdir -p ${DN_WORK} + cp Configuration.h ${DN_WORK}/ + cp src/lcd/language/language_${LANG}.h ${DN_WORK}/ + cd ${DN_WORK}/ + ${EXEC_WXGGEN} "${FN_FONT}" + sed -i fontutf8-data.h -e 's|fonts//|fonts/|g' -e 's|fonts//|fonts/|g' -e 's|[/0-9a-zA-Z_\-]*buildroot/share/fonts|buildroot/share/fonts|' 2>/dev/null + cd ../ + mv ${DN_WORK}/fontutf8-data.h src/lcd/dogm/language_data_${LANG}.h + rm -rf ${DN_WORK}/ +done + +# +# Generate default ASCII font (char range 0-255): +# Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h +# +#if [ "${MARLIN_LANGS}" == "${LANGS_DEFAULT}" ]; then +if [ 1 = 1 ]; then + rm -rf ${DN_WORK}/ + mkdir -p ${DN_WORK} + cd ${DN_WORK}/ + ${EXEC_BDF2U8G} -b 1 -e 127 ${FN_FONT} ISO10646_1_5x7 tmp1.h >/dev/null + ${EXEC_BDF2U8G} -b 1 -e 255 ${FN_FONT} ISO10646_1_5x7 tmp2.h >/dev/null + TMP1=$(cat tmp1.h) ; rm tmp1.h + TMP2=$(cat tmp2.h) ; rm tmp2.h + + cat <../src/lcd/dogm/dogm_font_data_ISO10646_1.h +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * 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 3 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, see . + * + */ +#include + +#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +$TMP1 +#else + // extended (original) font (symbols 1 - 255) + +$TMP2 + +#endif +EOF + + rmdir ../${DN_WORK} + cd - >/dev/null +fi diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c new file mode 100644 index 0000000000..c18ecd9fa8 --- /dev/null +++ b/buildroot/share/fonts/genpages.c @@ -0,0 +1,207 @@ +/** + * @file genpages.c + * @brief generate required font page files + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright Yunhui Fu (2015) + */ + +#include +#include /* uint8_t */ +#include /* size_t */ +#include +#include +#include "getline.h" + +wchar_t get_val_utf82uni(uint8_t *pstart) { + size_t cntleft; + wchar_t retval = 0; + + if (0 == (0x80 & *pstart)) return *pstart; + + if (((*pstart & 0xE0) ^ 0xC0) == 0) { + cntleft = 1; + retval = *pstart & ~0xE0; + } + else if (((*pstart & 0xF0) ^ 0xE0) == 0) { + cntleft = 2; + retval = *pstart & ~0xF0; + } + else if (((*pstart & 0xF8) ^ 0xF0) == 0) { + cntleft = 3; + retval = *pstart & ~0xF8; + } + else if (((*pstart & 0xFC) ^ 0xF8) == 0) { + cntleft = 4; + retval = *pstart & ~0xFC; + } + else if (((*pstart & 0xFE) ^ 0xFC) == 0) { + cntleft = 5; + retval = *pstart & ~0xFE; + } + else { + /* encoding error */ + cntleft = 0; + retval = 0; + } + pstart++; + for (; cntleft > 0; cntleft --) { + retval <<= 6; + retval |= *pstart & 0x3F; + pstart++; + } + return retval; +} + +/** + * @brief è½¬æ¢ UTF-8 ç¼–ç çš„一个字符为本地的 Unicode 字符(wchar_t) + * + * @param pstart : 存储 UTF-8 字符的指针 + * @param pval : 需è¦è¿”回的 Unicode å­—ç¬¦å­˜æ”¾åœ°å€æŒ‡é’ˆ + * + * @return æˆåŠŸè¿”å›žä¸‹ä¸ª UTF-8 字符的ä½ç½® + * + * è½¬æ¢ UTF-8 ç¼–ç çš„一个字符为本地的 Unicode 字符(wchar_t) + */ +uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { + uint32_t val = 0; + uint8_t *p = pstart; + /*size_t maxlen = strlen(pstart);*/ + + assert(NULL != pstart); + + if (0 == (0x80 & *p)) { + val = (size_t)*p; + p++; + } + else if (0xC0 == (0xE0 & *p)) { + val = *p & 0x1F; + val <<= 6; + p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xE0 == (0xF0 & *p)) { + val = *p & 0x0F; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xF0 == (0xF8 & *p)) { + val = *p & 0x07; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xF8 == (0xFC & *p)) { + val = *p & 0x03; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xFC == (0xFE & *p)) { + val = *p & 0x01; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0x80 == (0xC0 & *p)) { + /* error? */ + for (; 0x80 == (0xC0 & *p); p++); + } + else { + /* error */ + for (; ((0xFE & *p) > 0xFC); p++); + } + /* + if (val == 0) { + p = NULL; + */ + /* + } + else if (pstart + maxlen < p) { + p = pstart; + if (pval) *pval = 0; + } + */ + + if (pval) *pval = val; + + return p; +} + +void usage(char* progname) { + fprintf(stderr, "Usage: %s\n", progname); + fprintf(stderr, " read data from stdin\n"); +} + +void utf8_parse(const char* msg, unsigned int len) { + uint8_t *pend = NULL; + uint8_t *p; + uint8_t *pre; + wchar_t val; + int page; + + pend = (uint8_t *)msg + len; + for (pre = (uint8_t *)msg; pre < pend;) { + val = 0; + p = get_utf8_value(pre, &val); + if (NULL == p) break; + page = val / 128; + if (val >= 256) { + fprintf(stdout, "%d %d ", page, (val % 128)); + for (; pre < p; pre++) fprintf(stdout, "%c", *pre); + fprintf(stdout, "\n"); + } + pre = p; + } +} + +int load_file(FILE *fp) { + char * buffer = NULL; + size_t szbuf = 0; + + szbuf = 10000; + buffer = (char*)malloc(szbuf); + if (NULL == buffer) return -1; + //pos = ftell (fp); + while (getline( &buffer, &szbuf, fp ) > 0) + utf8_parse((const char*)buffer, (unsigned int)strlen ((char *)buffer)); + + free(buffer); + return 0; +} + +int main(int argc, char * argv[]) { + if (argc > 1) { + usage(argv[0]); + exit(1); + } + load_file(stdin); +} diff --git a/buildroot/share/fonts/get-bdf2u8g.sh b/buildroot/share/fonts/get-bdf2u8g.sh new file mode 100644 index 0000000000..e7dca2bef4 --- /dev/null +++ b/buildroot/share/fonts/get-bdf2u8g.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +##################################################################### +# get-bdf2u8g.sh for Marlin +# +# This script downloads, patches, and builds bdf2u8g +# License: CC-SA +# +# Execute from within buildroot/share/fonts +# +##################################################################### + +HERE=$(pwd) + +[[ $HERE =~ 'buildroot/share/fonts'$ ]] || { echo "Change to buildroot/share/fonts to run $(basename $0)" ; exit 1; } + +# Download u8glib +curl -LJO https://github.com/olikraus/u8glib/archive/master.zip +unzip u8glib-master.zip >/dev/null 2>&1 + +# Patch and build bdf2u8g +cd u8glib-master/tools/font/bdf2u8g +patch -p0 <../../../../u8glib-bdf2u8g.patch bdf2u8g.c >/dev/null 2>&1 +make >/dev/null 2>&1 +mv bdf2u8g ../../../../ + +# Clean up +cd - +rm -rf u8glib-master* + +cd "$HERE" diff --git a/buildroot/share/fonts/getline.c b/buildroot/share/fonts/getline.c new file mode 100644 index 0000000000..4974e9332b --- /dev/null +++ b/buildroot/share/fonts/getline.c @@ -0,0 +1,126 @@ +/** + * getline.c --- Based on... + * + * getdelim.c --- Implementation of replacement getdelim function. + * Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005 Free + * Software Foundation, 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, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/* Ported from glibc by Simon Josefsson. */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#if !HAVE_GETLINE + +//#include "getdelim.h" +#include +#include +#include +#include + +#ifndef SIZE_MAX + #define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX + #define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif +#if !HAVE_FLOCKFILE + #undef flockfile + #define flockfile(x) ((void)0) +#endif +#if !HAVE_FUNLOCKFILE + #undef funlockfile + #define funlockfile(x) ((void)0) +#endif + +/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). *LINEPTR is a pointer returned from malloc (or + NULL), pointing to *N characters of space. It is realloc'ed as + necessary. Returns the number of characters read (not including + the null terminator), or -1 on error or EOF. */ + +ssize_t +getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { + ssize_t result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) { + errno = EINVAL; + return -1; + } + + flockfile (fp); + + if (*lineptr == NULL || *n == 0) { + *n = 120; + *lineptr = (char *) malloc(*n); + if (*lineptr == NULL) { + result = -1; + goto unlock_return; + } + } + + for (;;) { + int i; + + i = getc(fp); + if (i == EOF) { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) { + size_t needed_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) { + result = -1; + goto unlock_return; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) { + result = -1; + goto unlock_return; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == delimiter) break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? (int) cur_len : (int) result; + + unlock_return: + funlockfile(fp); + return result; +} + +#endif diff --git a/buildroot/share/fonts/getline.h b/buildroot/share/fonts/getline.h new file mode 100644 index 0000000000..180a218dc7 --- /dev/null +++ b/buildroot/share/fonts/getline.h @@ -0,0 +1,14 @@ + +#ifndef MYGETLINE_H +#define MYGETLINE_H 1 + +//#include "config.h" + +#if !HAVE_GETLINE + #include + ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp); + #define getline(lineptr, n, stream) getdelim (lineptr, n, '\n', stream) +#endif + +#endif // MYGETLINE_H + diff --git a/buildroot/share/fonts/make_fonts.bat b/buildroot/share/fonts/make_fonts.bat deleted file mode 100644 index fffd90a669..0000000000 --- a/buildroot/share/fonts/make_fonts.bat +++ /dev/null @@ -1,10 +0,0 @@ -.\bdf2u8g.exe -b 1 -e 9 Marlin_symbols.bdf Marlin_symbols dogm_font_data_Marlin_symbols.h -.\bdf2u8g.exe -b 16 -e 255 HD44780_W.bdf HD44780_W_5x7 dogm_font_data_HD44780_W.h -.\bdf2u8g.exe -b 32 -e 255 HD44780_C.bdf HD44780_C_5x7 dogm_font_data_HD44780_C.h -.\bdf2u8g.exe -b 32 -e 255 HD44780_J.bdf HD44780_J_5x7 dogm_font_data_HD44780_J.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646-1.bdf ISO10646_1_5x7 dogm_font_data_ISO10646_1.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646-1-tr.bdf ISO10646_1_tr_5x7 dogm_font_data_ISO10646_1-tr.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646_5_Cyrillic.bdf ISO10646_5_Cyrillic_5x7 dogm_font_data_ISO10646_5_Cyrillic.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646_Kana.bdf ISO10646_Kana_5x7 dogm_font_data_ISO10646_Kana.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646_CN.bdf ISO10646_CN dogm_font_data_ISO10646_CN.h -.\bdf2u8g.exe -b 32 -e 255 ISO10646_4_Greek.bdf ISO10646_Greek_5x7 dogm_font_data_ISO10646_Greek.h diff --git a/buildroot/share/fonts/marlin-6x12-1.bdf b/buildroot/share/fonts/marlin-6x12-1.bdf new file mode 100644 index 0000000000..11609c13d8 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-1.bdf @@ -0,0 +1,64286 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, some chars were tweak for display on LCD screen, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COPYRIGHT "Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 4539 + +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +80 +C0 +B0 +A8 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR + +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR + +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 5 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/marlin-6x12-2.bdf b/buildroot/share/fonts/marlin-6x12-2.bdf new file mode 100644 index 0000000000..9a612e3fb4 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-2.bdf @@ -0,0 +1,65513 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, added with jp-kana data; some chars were tweak for display on LCD screen, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COPYRIGHT "Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 4635 + +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +80 +C0 +B0 +A8 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 - +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 5 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR + + + +STARTCHAR u30A0 +ENCODING 12448 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR u30A1 +ENCODING 12449 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +10 +60 +40 +ENDCHAR +STARTCHAR u30A2 +ENCODING 12450 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +28 +30 +20 +40 +ENDCHAR +STARTCHAR u30A3 +ENCODING 12451 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +20 +40 +C0 +40 +ENDCHAR +STARTCHAR u30A4 +ENCODING 12452 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR u30A5 +ENCODING 12453 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +90 +20 +ENDCHAR +STARTCHAR u30A6 +ENCODING 12454 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30A7 +ENCODING 12455 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR u30A8 +ENCODING 12456 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30A9 +ENCODING 12457 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +60 +A0 +ENDCHAR +STARTCHAR u30AA +ENCODING 12458 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +30 +50 +90 +10 +ENDCHAR +STARTCHAR u30AB +ENCODING 12459 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AC +ENCODING 12460 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AD +ENCODING 12461 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AE +ENCODING 12462 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AF +ENCODING 12463 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B0 +ENCODING 12464 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B1 +ENCODING 12465 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30B2 +ENCODING 12466 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30BB3 +ENCODING 12467 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30B4 +ENCODING 12468 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30BB5 +ENCODING 12469 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B6 +ENCODING 12470 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B7 +ENCODING 12471 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B8 +ENCODING 12472 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B9 +ENCODING 12473 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BA +ENCODING 12474 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BB +ENCODING 12475 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BC +ENCODING 12476 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BD +ENCODING 12477 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BE +ENCODING 12478 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BF +ENCODING 12479 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C0 +ENCODING 12480 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C1 +ENCODING 12481 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C2 +ENCODING 12482 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C3 +ENCODING 12483 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR u30C4 +ENCODING 12484 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C5 +ENCODING 12485 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C6 +ENCODING 12486 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C7 +ENCODING 12487 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C8 +ENCODING 12488 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30C9 +ENCODING 12489 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +50 +00 +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30CA +ENCODING 12490 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CB +ENCODING 12491 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR u30CC +ENCODING 12492 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +D0 +ENDCHAR +STARTCHAR u30CD +ENCODING 12493 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +10 +20 +70 +A8 +ENDCHAR +STARTCHAR u30CE +ENCODING 12494 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CF +ENCODING 12495 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D0 +ENCODING 12496 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D1 +ENCODING 12497 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D2 +ENCODING 12498 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D3 +ENCODING 12499 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D4 +ENCODING 12500 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +98 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D5 +ENCODING 12501 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D6 +ENCODING 12502 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D7 +ENCODING 12503 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D8 +ENCODING 12504 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30D9 +ENCODING 12505 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +00 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DA +ENCODING 12506 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +18 +18 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DB +ENCODING 12507 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DC +ENCODING 12508 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DD +ENCODING 12509 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DE +ENCODING 12510 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +10 +ENDCHAR +STARTCHAR u30DF +ENCODING 12511 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +00 +E0 +00 +F0 +ENDCHAR +STARTCHAR u30E0 +ENCODING 12512 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +88 +F8 +08 +ENDCHAR +STARTCHAR u30E1 +ENCODING 12513 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +28 +10 +28 +C0 +ENDCHAR +STARTCHAR u30E2 +ENCODING 12514 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +F8 +40 +38 +ENDCHAR +STARTCHAR u30E3 +ENCODING 12515 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +40 +F8 +50 +40 +ENDCHAR +STARTCHAR u30E4 +ENCODING 12516 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +40 +ENDCHAR +STARTCHAR u30E5 +ENCODING 12517 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +60 +20 +20 +F0 +ENDCHAR +STARTCHAR u30E6 +ENCODING 12518 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR u30E7 +ENCODING 12519 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR u30E8 +ENCODING 12520 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR u30E9 +ENCODING 12521 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +08 +10 +20 +ENDCHAR +STARTCHAR u30EA +ENCODING 12522 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +90 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR u30EB +ENCODING 12523 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +A0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR u30EC +ENCODING 12524 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +80 +80 +90 +A0 +C0 +ENDCHAR +STARTCHAR u30ED +ENCODING 12525 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR u30EE +ENCODING 12526 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +90 +10 +20 +ENDCHAR +STARTCHAR u30EF +ENCODING 12527 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F0 +ENCODING 12528 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F1 +ENCODING 12529 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30F2 +ENCODING 12530 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30F3 +ENCODING 12531 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR u30F4 +ENCODING 12532 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F5 +ENCODING 12533 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +50 +A0 +ENDCHAR +STARTCHAR u30F6 +ENCODING 12534 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +20 +40 +ENDCHAR +STARTCHAR u30F7 +ENCODING 12535 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F8 +ENCODING 12536 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F9 +ENCODING 12537 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30FA +ENCODING 12538 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30FB +ENCODING 12539 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR u30FC +ENCODING 12540 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR u30FD +ENCODING 12541 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FE +ENCODING 12542 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FF +ENCODING 12543 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR + + +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf new file mode 100644 index 0000000000..0dc909c5f4 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-3.bdf @@ -0,0 +1,586750 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, added jp-kana data, the other missing char data were from wqy-bitmapsong-bdf-1.0.0-RC1; some chars were tweak for display on LCD screen, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COPYRIGHT "Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 33727 + +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +80 +C0 +B0 +A8 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR + +STARTCHAR U_1100 +ENCODING 4352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_1101 +ENCODING 4353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +FBE0 +0820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR U_1102 +ENCODING 4354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +8000 +8000 +8000 +8000 +FF80 +ENDCHAR +STARTCHAR U_1103 +ENCODING 4355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 0 6 +BITMAP +FFC0 +4000 +4000 +7FC0 +ENDCHAR +STARTCHAR U_1104 +ENCODING 4356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +FBE0 +4200 +4200 +5A00 +63E0 +ENDCHAR +STARTCHAR U_1105 +ENCODING 4357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +FF80 +4000 +7F80 +ENDCHAR +STARTCHAR U_1106 +ENCODING 4358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +FFE0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_1107 +ENCODING 4359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8080 +FF80 +8080 +FF80 +ENDCHAR +STARTCHAR U_1108 +ENCODING 4360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +8A20 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_1109 +ENCODING 4361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_110A +ENCODING 4362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +1100 +1100 +2A80 +4440 +8840 +ENDCHAR +STARTCHAR U_110B +ENCODING 4363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +7F00 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_110C +ENCODING 4364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 1 5 +BITMAP +FF80 +0100 +0600 +1980 +E040 +ENDCHAR +STARTCHAR U_110D +ENCODING 4365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +7FC0 +1100 +2A80 +4440 +8800 +ENDCHAR +STARTCHAR U_110E +ENCODING 4366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +3F80 +0000 +FFE0 +0200 +0D80 +F040 +ENDCHAR +STARTCHAR U_110F +ENCODING 4367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_1110 +ENCODING 4368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +FFC0 +4000 +7F80 +4000 +7FC0 +ENDCHAR +STARTCHAR U_1111 +ENCODING 4369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +FF80 +2200 +2200 +FF80 +ENDCHAR +STARTCHAR U_1112 +ENCODING 4370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 2 +BITMAP +3F00 +0000 +FFC0 +0000 +3F00 +4080 +4080 +3F00 +ENDCHAR +STARTCHAR U_1113 +ENCODING 4371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8F80 +8080 +8080 +F080 +ENDCHAR +STARTCHAR U_1114 +ENCODING 4372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8400 +8400 +B400 +C780 +ENDCHAR +STARTCHAR U_112C +ENCODING 4396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +9480 +9480 +F780 +9480 +F780 +0000 +3E00 +6300 +4100 +6300 +3E00 +ENDCHAR +STARTCHAR U_112D +ENCODING 4397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 2 +BITMAP +13E0 +1020 +1020 +1020 +2820 +4420 +8220 +ENDCHAR +STARTCHAR U_1133 +ENCODING 4403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +4AE0 +4A20 +4E20 +AA20 +AA20 +AE20 +ENDCHAR +STARTCHAR U_1134 +ENCODING 4404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 2 +BITMAP +4440 +4440 +4440 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_1135 +ENCODING 4405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +21C0 +2220 +2220 +5220 +5220 +89C0 +ENDCHAR +STARTCHAR U_113B +ENCODING 4411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +21C0 +2000 +23E0 +5140 +5220 +89C0 +ENDCHAR + +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 5 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR + + +STARTCHAR U_2E80 +ENCODING 11904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 7 2 1 +BITMAP +60 +18 +04 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR U_2E81 +ENCODING 11905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +3E00 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_2E82 +ENCODING 11906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 2 +BITMAP +FF80 +0080 +0080 +0100 +0100 +ENDCHAR +STARTCHAR U_2E83 +ENCODING 11907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +82 +82 +7E +ENDCHAR +STARTCHAR U_2E84 +ENCODING 11908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF00 +0100 +0100 +0100 +0100 +0100 +0120 +00A0 +00A0 +0060 +ENDCHAR +STARTCHAR U_2E85 +ENCODING 11909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +10 +10 +10 +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_2E86 +ENCODING 11910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +3F +21 +21 +21 +21 +21 +21 +41 +41 +87 +ENDCHAR +STARTCHAR U_2E87 +ENCODING 11911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +2080 +2080 +2080 +20A0 +40A0 +4060 +8020 +ENDCHAR +STARTCHAR U_2E88 +ENCODING 11912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 1 4 +BITMAP +10 +10 +3F +22 +44 +80 +ENDCHAR +STARTCHAR U_2E89 +ENCODING 11913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 4 -1 +BITMAP +10 +10 +90 +90 +90 +90 +90 +90 +90 +10 +30 +ENDCHAR +STARTCHAR U_2E8A +ENCODING 11914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_2E8B +ENCODING 11915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 2 -1 +BITMAP +FE00 +8200 +8200 +8E00 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2E8C +ENCODING 11916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +0800 +8880 +4900 +0800 +ENDCHAR +STARTCHAR U_2E8D +ENCODING 11917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +0080 +9080 +4900 +4A00 +ENDCHAR +STARTCHAR U_2E8E +ENCODING 11918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +FFE0 +1200 +1200 +1200 +1200 +2200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E8F +ENCODING 11919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +40C0 +8040 +1200 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E90 +ENCODING 11920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +0A00 +0A00 +0A00 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_2E91 +ENCODING 11921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4040 +8040 +1E00 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E92 +ENCODING 11922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 -1 +BITMAP +FE00 +8200 +8200 +FE00 +8000 +8000 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2E93 +ENCODING 11923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2100 +4200 +FC00 +0800 +1000 +2200 +4100 +FF80 +0080 +ENDCHAR +STARTCHAR U_2E94 +ENCODING 11924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +1F00 +2100 +2100 +2100 +7E00 +0200 +0200 +FF80 +ENDCHAR +STARTCHAR U_2E95 +ENCODING 11925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +FFC0 +0040 +0040 +0040 +7FC0 +0040 +0040 +0040 +FFC0 +0040 +ENDCHAR +STARTCHAR U_2E96 +ENCODING 11926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +10 +58 +54 +90 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_2E97 +ENCODING 11927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 6 1 -1 +BITMAP +0800 +4A80 +4940 +8940 +0800 +1800 +ENDCHAR +STARTCHAR U_2E98 +ENCODING 11928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +20 +F8 +20 +20 +38 +E0 +20 +20 +20 +60 +ENDCHAR +STARTCHAR U_2E99 +ENCODING 11929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +3FC0 +2100 +6100 +9200 +1200 +0C00 +0C00 +1200 +E1C0 +ENDCHAR +STARTCHAR U_2E9C +ENCODING 11932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +8080 +BE80 +8080 +BE80 +ENDCHAR +STARTCHAR U_2E9D +ENCODING 11933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 2 -1 +BITMAP +FC +84 +84 +FC +84 +84 +FC +84 +84 +84 +8C +ENDCHAR +STARTCHAR U_2E9F +ENCODING 11935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +2080 +FFE0 +2880 +2480 +2080 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_2EA0 +ENCODING 11936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF00 +8100 +8100 +FF00 +8400 +FF80 +8400 +8200 +A140 +C080 +ENDCHAR +STARTCHAR U_2EA4 +ENCODING 11940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 1 6 +BITMAP +03C0 +FC80 +4880 +2500 +ENDCHAR +STARTCHAR U_2EA5 +ENCODING 11941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 6 1 4 +BITMAP +0780 +7900 +4900 +4900 +8880 +8040 +ENDCHAR +STARTCHAR U_2EA7 +ENCODING 11943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +2400 +7FC0 +8400 +7FE0 +ENDCHAR +STARTCHAR U_2EAA +ENCODING 11946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 0 0 +BITMAP +F8 +10 +20 +A0 +B0 +A0 +A0 +B0 +C0 +ENDCHAR +STARTCHAR U_2EAC +ENCODING 11948 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 11 0 0 +BITMAP +7C +00 +FC +10 +54 +54 +54 +54 +54 +94 +10 +ENDCHAR +STARTCHAR U_2EAE +ENCODING 11950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +4100 +4100 +7DE0 +5140 +4940 +8A20 +ENDCHAR +STARTCHAR U_2EB0 +ENCODING 11952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 5 +BITMAP +FFE0 +B1A0 +8E20 +B1A0 +ENDCHAR +STARTCHAR U_2EB5 +ENCODING 11957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +9480 +9480 +9480 +9480 +9480 +9480 +9480 +8080 +ENDCHAR +STARTCHAR U_2EB6 +ENCODING 11958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +1080 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_2EB7 +ENCODING 11959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +2200 +1400 +1400 +7F00 +0800 +3E00 +0800 +FF80 +ENDCHAR +STARTCHAR U_2EB8 +ENCODING 11960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +F1E0 +1100 +1100 +FFF0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2EBB +ENCODING 11963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2EBC +ENCODING 11964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +3F +21 +29 +25 +21 +23 +25 +59 +41 +83 +ENDCHAR +STARTCHAR U_2EBD +ENCODING 11965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +2780 +C080 +8080 +8080 +F780 +8080 +8080 +8080 +F780 +8080 +ENDCHAR +STARTCHAR U_2EBF +ENCODING 11967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +2080 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_2EC4 +ENCODING 11972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +5240 +52C0 +6340 +4040 +7FC0 +ENDCHAR +STARTCHAR U_2EC7 +ENCODING 11975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +3F00 +4100 +7F80 +C880 +5480 +6A80 +4880 +5480 +6280 +4180 +ENDCHAR +STARTCHAR U_2ECA +ENCODING 11978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +7C +44 +44 +7C +10 +5C +50 +50 +50 +5C +E0 +ENDCHAR +STARTCHAR U_2ECD +ENCODING 11981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +8000 +4000 +0000 +E000 +2000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_2ECE +ENCODING 11982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +0000 +E000 +2000 +4000 +E000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_2ECF +ENCODING 11983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 7 -1 +BITMAP +F0 +90 +A0 +C0 +A0 +90 +90 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR U_2ED6 +ENCODING 11990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +90 +A0 +C0 +A0 +90 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR U_2ED7 +ENCODING 11991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9520 +64C0 +ENDCHAR +STARTCHAR U_2ED8 +ENCODING 11992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_2ED9 +ENCODING 11993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +0800 +0800 +FFC0 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_2EE3 +ENCODING 12003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_2EF1 +ENCODING 12017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4080 +7BC0 +2AC0 +FB40 +2AC0 +FB40 +2BC0 +EA20 +07C0 +ENDCHAR +STARTCHAR U_2F00 +ENCODING 12032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 2 0 4 +BITMAP +0040 +FFE0 +ENDCHAR +STARTCHAR U_2F01 +ENCODING 12033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 11 6 -1 +BITMAP +80 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F02 +ENCODING 12034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_2F03 +ENCODING 12035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR U_2F04 +ENCODING 12036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FE00 +0200 +0400 +0800 +1000 +2000 +4000 +8080 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2F05 +ENCODING 12037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 10 4 0 +BITMAP +10 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR U_2F06 +ENCODING 12038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0100 +7F80 +0000 +0000 +0000 +0000 +0000 +0080 +FFC0 +ENDCHAR +STARTCHAR U_2F07 +ENCODING 12039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +0800 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR U_2F08 +ENCODING 12040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0A00 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F09 +ENCODING 12041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_2F0A +ENCODING 12042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0400 +0400 +0400 +0400 +0A00 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F0B +ENCODING 12043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0300 +0100 +1100 +1100 +1100 +1100 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F0C +ENCODING 12044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8240 +8180 +ENDCHAR +STARTCHAR U_2F0D +ENCODING 12045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 3 +BITMAP +4020 +7FE0 +8040 +8040 +ENDCHAR +STARTCHAR U_2F0E +ENCODING 12046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +08 +10 +10 +20 +20 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR U_2F0F +ENCODING 12047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_2F10 +ENCODING 12048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F11 +ENCODING 12049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0840 +0840 +0840 +0840 +1040 +1040 +2040 +4240 +8180 +ENDCHAR +STARTCHAR U_2F12 +ENCODING 12050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_2F13 +ENCODING 12051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0040 +0240 +0180 +ENDCHAR +STARTCHAR U_2F14 +ENCODING 12052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +10C0 +1080 +1100 +1200 +1400 +1800 +F020 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_2F15 +ENCODING 12053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8100 +FF80 +8000 +8000 +8000 +8000 +8000 +8000 +8080 +FFC0 +8000 +ENDCHAR +STARTCHAR U_2F16 +ENCODING 12054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +0040 +FFE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4040 +7FE0 +ENDCHAR +STARTCHAR U_2F17 +ENCODING 12055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F18 +ENCODING 12056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +98 +8C +84 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F19 +ENCODING 12057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +A8 +90 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F1A +ENCODING 12058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_2F1B +ENCODING 12059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1080 +2040 +4FE0 +F020 +4000 +ENDCHAR +STARTCHAR U_2F1C +ENCODING 12060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0100 +7F80 +2100 +2100 +1200 +1200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F1D +ENCODING 12061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F1E +ENCODING 12062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F1F +ENCODING 12063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0480 +7FC0 +0400 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_2F20 +ENCODING 12064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +0480 +7FC0 +ENDCHAR +STARTCHAR U_2F21 +ENCODING 12065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0800 +1F80 +3080 +4900 +0600 +0900 +F0E0 +ENDCHAR +STARTCHAR U_2F22 +ENCODING 12066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +2800 +1F80 +1080 +1100 +2900 +4600 +0200 +0500 +18E0 +E040 +ENDCHAR +STARTCHAR U_2F23 +ENCODING 12067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0840 +0FE0 +1040 +2880 +4480 +0500 +0100 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_2F24 +ENCODING 12068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_2F25 +ENCODING 12069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FFC0 +1200 +2200 +2200 +1400 +0E00 +1100 +6080 +ENDCHAR +STARTCHAR U_2F26 +ENCODING 12070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0400 +FFC0 +0400 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F27 +ENCODING 12071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 3 +BITMAP +0400 +0200 +7FE0 +4020 +8040 +ENDCHAR +STARTCHAR U_2F28 +ENCODING 12072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +0200 +FFC0 +0200 +2200 +1200 +0200 +1200 +0E00 +0400 +ENDCHAR +STARTCHAR U_2F29 +ENCODING 12073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +2480 +4440 +4440 +8420 +A420 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F2A +ENCODING 12074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +0800 +0A00 +0A00 +0A00 +0A00 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_2F2B +ENCODING 12075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +2020 +2020 +3FE0 +2020 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F2C +ENCODING 12076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +7FC0 +4440 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_2F2D +ENCODING 12077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F2E +ENCODING 12078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_2F2F +ENCODING 12079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0080 +7FC0 +0400 +0400 +0400 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_2F30 +ENCODING 12080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0080 +0080 +0080 +7F80 +4080 +4000 +4000 +4040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_2F31 +ENCODING 12081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +8880 +8880 +8B80 +0800 +0800 +ENDCHAR +STARTCHAR U_2F32 +ENCODING 12082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F33 +ENCODING 12083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +1300 +2200 +7E00 +4400 +0800 +1100 +2180 +FE80 +4080 +ENDCHAR +STARTCHAR U_2F34 +ENCODING 12084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +2200 +3FE0 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F35 +ENCODING 12085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +1000 +2000 +2000 +7800 +0800 +8800 +5000 +3000 +2800 +C7E0 +ENDCHAR +STARTCHAR U_2F36 +ENCODING 12086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +FFE0 +1080 +1080 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F37 +ENCODING 12087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +04E0 +1F00 +E400 +0400 +0220 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_2F38 +ENCODING 12088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +FE +02 +02 +7E +40 +80 +FF +01 +01 +12 +0C +ENDCHAR +STARTCHAR U_2F39 +ENCODING 12089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +0080 +0080 +0080 +7F80 +0080 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_2F3A +ENCODING 12090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +30 +20 +40 +98 +10 +20 +4C +88 +10 +20 +C0 +ENDCHAR +STARTCHAR U_2F3B +ENCODING 12091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +10 +10 +20 +48 +88 +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR U_2F3C +ENCODING 12092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +0900 +0800 +0840 +4820 +4820 +4880 +8880 +08C0 +0780 +ENDCHAR +STARTCHAR U_2F3D +ENCODING 12093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +0840 +0FE0 +F800 +0880 +0900 +0620 +0A20 +31A0 +C060 +ENDCHAR +STARTCHAR U_2F3E +ENCODING 12094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +00C0 +3F00 +2000 +3FC0 +2040 +2040 +3FC0 +2040 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F3F +ENCODING 12095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +3FC0 +0400 +0400 +FFE0 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F40 +ENCODING 12096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +FFE0 +0400 +3F80 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_2F41 +ENCODING 12097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +0FC0 +0800 +7F80 +2100 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F42 +ENCODING 12098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +FFE0 +2080 +2080 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_2F43 +ENCODING 12099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +1A00 +0A00 +4200 +3200 +1200 +03C0 +FE00 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_2F44 +ENCODING 12100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3E00 +2000 +2040 +3FE0 +2100 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_2F45 +ENCODING 12101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +FFE0 +0800 +0840 +0FE0 +0840 +1040 +2440 +4380 +8100 +ENDCHAR +STARTCHAR U_2F46 +ENCODING 12102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_2F47 +ENCODING 12103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8100 +FF80 +8100 +8100 +8100 +FF00 +8100 +8100 +8100 +FF00 +8100 +ENDCHAR +STARTCHAR U_2F48 +ENCODING 12104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +FFC0 +8080 +8080 +8080 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F49 +ENCODING 12105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2040 +2040 +3FC0 +2040 +2240 +41C0 +8080 +ENDCHAR +STARTCHAR U_2F4A +ENCODING 12106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +FFE0 +0400 +0400 +1500 +1500 +2480 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_2F4B +ENCODING 12107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +8880 +0800 +0800 +0C00 +1200 +2100 +C0C0 +ENDCHAR +STARTCHAR U_2F4C +ENCODING 12108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +27C0 +2400 +2400 +2400 +2400 +2440 +FFE0 +ENDCHAR +STARTCHAR U_2F4D +ENCODING 12109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0880 +0FC0 +1080 +1080 +2900 +C500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_2F4E +ENCODING 12110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3E00 +2200 +2200 +23C0 +C000 +3F80 +1100 +0A00 +0400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_2F4F +ENCODING 12111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +2480 +2480 +7FE0 +0880 +1080 +2300 +ENDCHAR +STARTCHAR U_2F50 +ENCODING 12112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2240 +2280 +3B00 +2200 +2200 +2200 +3A20 +E220 +41E0 +ENDCHAR +STARTCHAR U_2F51 +ENCODING 12113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0580 +7E00 +0400 +04E0 +FF00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_2F52 +ENCODING 12114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +4200 +4200 +7FE0 +4200 +4200 +4200 +5920 +E0A0 +4060 +ENDCHAR +STARTCHAR U_2F53 +ENCODING 12115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5F80 +8000 +7F80 +0080 +00A0 +00A0 +0060 +0020 +ENDCHAR +STARTCHAR U_2F54 +ENCODING 12116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +04C0 +FC80 +1700 +1600 +1500 +2500 +5480 +8C60 +0820 +ENDCHAR +STARTCHAR U_2F55 +ENCODING 12117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2460 +2440 +2480 +4500 +0A00 +0900 +1080 +2060 +C020 +ENDCHAR +STARTCHAR U_2F56 +ENCODING 12118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +3F80 +2480 +2480 +2480 +2480 +2480 +2480 +2480 +4440 +8020 +ENDCHAR +STARTCHAR U_2F57 +ENCODING 12119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2040 +4020 +80A0 +1080 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_2F58 +ENCODING 12120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +6100 +1A00 +0600 +1900 +E280 +2200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F59 +ENCODING 12121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +11 +11 +11 +1F +01 +FF +11 +11 +11 +21 +C1 +ENDCHAR +STARTCHAR U_2F5A +ENCODING 12122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +3FE0 +2000 +2000 +3F00 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_2F5B +ENCODING 12123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0200 +2200 +4200 +FFC0 +0600 +0A00 +1200 +2200 +5E00 +8400 +ENDCHAR +STARTCHAR U_2F5C +ENCODING 12124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4480 +7FC0 +8400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F5D +ENCODING 12125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0400 +0600 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_2F5E +ENCODING 12126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0880 +1100 +3E00 +0400 +0880 +1340 +7C40 +ENDCHAR +STARTCHAR U_2F5F +ENCODING 12127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +3F80 +0400 +0500 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2F60 +ENCODING 12128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3F00 +2500 +2500 +2500 +2480 +2480 +2440 +2540 +47A0 +8CA0 +ENDCHAR +STARTCHAR U_2F61 +ENCODING 12129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +1000 +1F00 +1100 +2900 +2500 +2500 +2120 +FD20 +40E0 +ENDCHAR +STARTCHAR U_2F62 +ENCODING 12130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2100 +FFC0 +2100 +2100 +2100 +3F00 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F63 +ENCODING 12131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2200 +3FE0 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_2F64 +ENCODING 12132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +2220 +3FE0 +2220 +2220 +3FE0 +2220 +2220 +42E0 +8040 +ENDCHAR +STARTCHAR U_2F65 +ENCODING 12133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F66 +ENCODING 12134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0220 +0240 +0200 +1200 +13E0 +1200 +1200 +2A00 +4600 +83E0 +ENDCHAR +STARTCHAR U_2F67 +ENCODING 12135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +3000 +5000 +9000 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F68 +ENCODING 12136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +FC80 +4B20 +3140 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_2F69 +ENCODING 12137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +30 +20 +FF +81 +81 +FF +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F6A +ENCODING 12138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +3FE0 +2240 +2200 +3F80 +2880 +2880 +2500 +4300 +9CE0 +ENDCHAR +STARTCHAR U_2F6B +ENCODING 12139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +7FC0 +5280 +5280 +5280 +5280 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_2F6C +ENCODING 12140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +FF +81 +81 +FF +81 +81 +FF +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F6D +ENCODING 12141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0100 +1A00 +0400 +FFC0 +0C80 +1500 +2400 +4400 +9C00 +0800 +ENDCHAR +STARTCHAR U_2F6E +ENCODING 12142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3F80 +4400 +0400 +FFC0 +0400 +0C00 +1200 +21C0 +C080 +ENDCHAR +STARTCHAR U_2F6F +ENCODING 12143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0400 +0800 +1000 +3FC0 +5040 +9040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_2F70 +ENCODING 12144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +3FC0 +0000 +0000 +7FE0 +0200 +1280 +2240 +4220 +8E20 +0400 +ENDCHAR +STARTCHAR U_2F71 +ENCODING 12145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +1800 +1000 +FF80 +9080 +9080 +A480 +AE80 +F280 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_2F72 +ENCODING 12146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_2F73 +ENCODING 12147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +8040 +9240 +1200 +1200 +2100 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_2F74 +ENCODING 12148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +7FC0 +0000 +2080 +2080 +1100 +1100 +1200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_2F75 +ENCODING 12149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2200 +3BE0 +5480 +9080 +1080 +1080 +1080 +1380 +1100 +ENDCHAR +STARTCHAR U_2F76 +ENCODING 12150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +44C0 +3480 +1500 +FFE0 +0400 +0E00 +1500 +24C0 +4460 +8420 +ENDCHAR +STARTCHAR U_2F77 +ENCODING 12151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +2200 +7C00 +1100 +FE80 +4480 +2500 +2480 +4440 +8440 +ENDCHAR +STARTCHAR U_2F78 +ENCODING 12152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2400 +4400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_2F79 +ENCODING 12153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9140 +D540 +A240 +9240 +AD40 +C540 +8840 +8040 +81C0 +ENDCHAR +STARTCHAR U_2F7A +ENCODING 12154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_2F7B +ENCODING 12155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +EB20 +4920 +0820 +79E0 +1040 +ENDCHAR +STARTCHAR U_2F7C +ENCODING 12156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +7E80 +0900 +FFC0 +0800 +1180 +3600 +D840 +1040 +0FC0 +ENDCHAR +STARTCHAR U_2F7D +ENCODING 12157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +7FE0 +4920 +4920 +4920 +4920 +4920 +4920 +40E0 +ENDCHAR +STARTCHAR U_2F7E +ENCODING 12158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +1500 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_2F7F +ENCODING 12159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2100 +2100 +3F00 +2100 +3F00 +2100 +21C0 +FF00 +0100 +0100 +ENDCHAR +STARTCHAR U_2F80 +ENCODING 12160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2F81 +ENCODING 12161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +8C40 +9340 +E840 +8C40 +9240 +E140 +8040 +80C0 +ENDCHAR +STARTCHAR U_2F82 +ENCODING 12162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +8200 +FF00 +8800 +8800 +FF00 +8100 +8100 +FF00 +8800 +8900 +FF80 +ENDCHAR +STARTCHAR U_2F83 +ENCODING 12163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +30 +20 +FF +81 +FF +81 +81 +FF +81 +FF +81 +ENDCHAR +STARTCHAR U_2F84 +ENCODING 12164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0800 +1080 +7F60 +2420 +0400 +3FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2F85 +ENCODING 12165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E3C0 +8040 +8040 +8040 +FBC0 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F86 +ENCODING 12166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +7E00 +0400 +FFC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_2F87 +ENCODING 12167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +3BE0 +4880 +4A80 +BA80 +0FE0 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F88 +ENCODING 12168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1480 +1280 +FFE0 +1480 +1280 +2280 +4080 +8380 +ENDCHAR +STARTCHAR U_2F89 +ENCODING 12169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +4820 +4440 +4280 +4100 +5880 +E060 +ENDCHAR +STARTCHAR U_2F8A +ENCODING 12170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +2200 +7FC0 +A440 +2440 +3FC0 +2040 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_2F8B +ENCODING 12171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +FBE0 +AAA0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F8C +ENCODING 12172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +7FE0 +4040 +4400 +44C0 +7F00 +4420 +4420 +83E0 +ENDCHAR +STARTCHAR U_2F8D +ENCODING 12173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +4440 +0480 +07C0 +FC20 +6020 +ENDCHAR +STARTCHAR U_2F8E +ENCODING 12174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0C00 +0800 +3F80 +2A80 +2A80 +2A80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_2F8F +ENCODING 12175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2480 +2380 +2100 +ENDCHAR +STARTCHAR U_2F90 +ENCODING 12176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0240 +FFE0 +0400 +0A40 +1280 +3100 +5100 +94C0 +1860 +3020 +ENDCHAR +STARTCHAR U_2F91 +ENCODING 12177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +1200 +1200 +FFC0 +9240 +9240 +9E40 +9240 +8040 +8040 +8040 +ENDCHAR +STARTCHAR U_2F92 +ENCODING 12178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2A80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_2F93 +ENCODING 12179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FE0 +A220 +3FE0 +2220 +3FE0 +2220 +42E0 +8040 +ENDCHAR +STARTCHAR U_2F94 +ENCODING 12180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0000 +3F00 +0000 +3F00 +0000 +3F00 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F95 +ENCODING 12181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +2100 +4880 +8C40 +1200 +2100 +FFC0 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F96 +ENCODING 12182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_2F97 +ENCODING 12183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1880 +6500 +0A00 +1300 +6680 +0A40 +7220 +0C00 +ENDCHAR +STARTCHAR U_2F98 +ENCODING 12184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +0E +30 +CB +2C +36 +CA +36 +CA +32 +C2 +0C +ENDCHAR +STARTCHAR U_2F99 +ENCODING 12185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_2F9A +ENCODING 12186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0900 +2940 +2940 +4920 +1720 +6200 +ENDCHAR +STARTCHAR U_2F9B +ENCODING 12187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0400 +2400 +27C0 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_2F9C +ENCODING 12188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1040 +1040 +1FC0 +0200 +1200 +13E0 +1200 +2A00 +4600 +81E0 +ENDCHAR +STARTCHAR U_2F9D +ENCODING 12189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +3F00 +2100 +3F00 +2140 +3F80 +2100 +FF00 +0900 +3100 +C700 +ENDCHAR +STARTCHAR U_2F9E +ENCODING 12190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2F9F +ENCODING 12191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +1900 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2FA0 +ENCODING 12192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A20 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_2FA1 +ENCODING 12193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +3980 +0600 +3980 +0600 +3A00 +1200 +13C0 +2A00 +4600 +81E0 +ENDCHAR +STARTCHAR U_2FA2 +ENCODING 12194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +0000 +FF80 +8880 +8880 +FF80 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_2FA3 +ENCODING 12195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7FC0 +4A40 +53C0 +6040 +7FC0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_2FA4 +ENCODING 12196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C40 +2480 +1500 +7FE0 +0400 +0E00 +1500 +24C0 +4460 +8420 +ENDCHAR +STARTCHAR U_2FA5 +ENCODING 12197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4480 +4480 +7F80 +4480 +7F80 +4480 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_2FA6 +ENCODING 12198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +20E0 +DF40 +0400 +7FC0 +2480 +1480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_2FA7 +ENCODING 12199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F00 +2000 +FFC0 +2440 +2280 +2900 +30C0 +ENDCHAR +STARTCHAR U_2FA8 +ENCODING 12200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_2FA9 +ENCODING 12201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4000 +7FC0 +4040 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2FAA +ENCODING 12202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +7FE0 +0480 +7F80 +2640 +1D80 +1480 +E460 +4C20 +ENDCHAR +STARTCHAR U_2FAB +ENCODING 12203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +3FE0 +2200 +7FC0 +A200 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_2FAC +ENCODING 12204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +5540 +4CC0 +6640 +5540 +4440 +44C0 +ENDCHAR +STARTCHAR U_2FAD +ENCODING 12205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +3F80 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_2FAE +ENCODING 12206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +F1E0 +1100 +1100 +71C0 +1100 +1100 +F1E0 +1100 +1100 +ENDCHAR +STARTCHAR U_2FAF +ENCODING 12207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +FFE0 +9120 +9F20 +9120 +9F20 +9120 +FFE0 +8020 +ENDCHAR +STARTCHAR U_2FB0 +ENCODING 12208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2FB1 +ENCODING 12209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F00 +1100 +FFC0 +2080 +3F80 +0400 +FF80 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_2FB2 +ENCODING 12210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +1100 +71C0 +1100 +1100 +F1E0 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_2FB3 +ENCODING 12211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_2FB4 +ENCODING 12212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4040 +7FC0 +4040 +7FC0 +4040 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_2FB5 +ENCODING 12213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2140 +2E40 +2440 +3F40 +3540 +3F40 +2540 +2760 +5CA0 +8820 +ENDCHAR +STARTCHAR U_2FB6 +ENCODING 12214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +0140 +1580 +6540 +24A0 +FF60 +2540 +2580 +2540 +44A0 +8460 +ENDCHAR +STARTCHAR U_2FB7 +ENCODING 12215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2480 +FFE0 +2080 +3F80 +2080 +3FC0 +2480 +2300 +38E0 +ENDCHAR +STARTCHAR U_2FB8 +ENCODING 12216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0400 +7FC0 +4040 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_2FB9 +ENCODING 12217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_2FBA +ENCODING 12218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_2FBB +ENCODING 12219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2780 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_2FBC +ENCODING 12220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +1F80 +0000 +7FE0 +4020 +4F20 +4920 +4F20 +40E0 +ENDCHAR +STARTCHAR U_2FBD +ENCODING 12221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4080 +7D00 +4020 +7C40 +4080 +FF00 +2820 +4840 +F480 +0300 +ENDCHAR +STARTCHAR U_2FBE +ENCODING 12222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8020 +8020 +8020 +8020 +80E0 +8040 +ENDCHAR +STARTCHAR U_2FBF +ENCODING 12223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +AA80 +D480 +AD80 +BA80 +C480 +FF80 +4000 +4E00 +7080 +4080 +3F80 +ENDCHAR +STARTCHAR U_2FC0 +ENCODING 12224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0000 +3F00 +2100 +3F00 +0000 +FF80 +9480 +BE80 +8880 +8980 +ENDCHAR +STARTCHAR U_2FC1 +ENCODING 12225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3FC0 +2440 +3FC0 +2440 +3FC0 +0480 +0D40 +17C0 +2420 +C3E0 +ENDCHAR +STARTCHAR U_2FC2 +ENCODING 12226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_2FC3 +ENCODING 12227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_2FC4 +ENCODING 12228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0FC0 +0800 +FFC0 +A8C0 +9540 +AA40 +94C0 +8A40 +9540 +A2C0 +FFC0 +ENDCHAR +STARTCHAR U_2FC5 +ENCODING 12229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_2FC6 +ENCODING 12230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +9520 +2880 +CF60 +3100 +4E00 +0500 +78C0 +ENDCHAR +STARTCHAR U_2FC7 +ENCODING 12231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5100 +5100 +7FE0 +5100 +5B40 +7540 +5540 +5560 +9100 +ENDCHAR +STARTCHAR U_2FC8 +ENCODING 12232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0000 +FFE0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_2FC9 +ENCODING 12233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +1500 +2480 +CE60 +1500 +74E0 +0F00 +3480 +CC60 +ENDCHAR +STARTCHAR U_2FCA +ENCODING 12234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +64C0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_2FCB +ENCODING 12235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +2440 +7FE0 +A440 +2640 +2D40 +34C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_2FCC +ENCODING 12236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +F3C0 +1200 +F3C0 +9240 +F3C0 +9240 +F3C0 +1220 +0FE0 +ENDCHAR +STARTCHAR U_2FCD +ENCODING 12237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +5140 +5F40 +5140 +5F40 +5140 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_2FCE +ENCODING 12238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +23E0 +F880 +07E0 +FA40 +8A40 +F980 +5180 +2240 +FC20 +ENDCHAR +STARTCHAR U_2FCF +ENCODING 12239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F780 +8080 +FF80 +0000 +CD00 +AB00 +CD40 +AAC0 +EE40 +ENDCHAR +STARTCHAR U_2FD0 +ENCODING 12240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +7FC0 +4440 +4440 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_2FD1 +ENCODING 12241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +95A0 +3F80 +2080 +3F80 +2080 +C080 +ENDCHAR +STARTCHAR U_2FD2 +ENCODING 12242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5140 +6AC0 +4440 +7FC0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_2FD3 +ENCODING 12243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +45E0 +2820 +FFE0 +4500 +7DE0 +4500 +7DE0 +4520 +4DE0 +ENDCHAR +STARTCHAR U_2FD4 +ENCODING 12244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_2FD5 +ENCODING 12245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +0000 +EEE0 +AAA0 +FFE0 +9120 +FFE0 +9120 +9160 +ENDCHAR +STARTCHAR U_2FF0 +ENCODING 12272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8420 +0000 +8420 +0000 +8420 +0000 +8420 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF1 +ENCODING 12273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +0000 +8020 +2A80 +8020 +0000 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF2 +ENCODING 12274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9120 +0000 +9120 +9120 +0000 +9120 +9120 +0000 +9120 +DB60 +ENDCHAR +STARTCHAR U_2FF3 +ENCODING 12275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +2A80 +8020 +0000 +8020 +2A80 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF4 +ENCODING 12276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1500 +8020 +1100 +8020 +1500 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF5 +ENCODING 12277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1500 +8020 +1100 +8020 +1100 +8020 +1100 +AAA0 +ENDCHAR +STARTCHAR U_2FF6 +ENCODING 12278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9120 +0000 +9120 +9120 +0000 +9120 +9B20 +0000 +8020 +DB60 +ENDCHAR +STARTCHAR U_2FF7 +ENCODING 12279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1A80 +8020 +1000 +8020 +1A80 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF8 +ENCODING 12280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1540 +8020 +1000 +8020 +1000 +8020 +1000 +AAA0 +ENDCHAR +STARTCHAR U_2FF9 +ENCODING 12281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +8020 +0000 +DB20 +8120 +0000 +8120 +8120 +0000 +8120 +DB60 +ENDCHAR +STARTCHAR U_2FFA +ENCODING 12282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9020 +0000 +9020 +9020 +0000 +9020 +9B60 +0000 +8020 +DB60 +ENDCHAR +STARTCHAR U_2FFB +ENCODING 12283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB00 +8100 +0000 +9B60 +9120 +0000 +9120 +DB20 +0000 +1020 +1B60 +ENDCHAR +STARTCHAR U_3000 +ENCODING 12288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 1 10 -1 +BITMAP +00 +ENDCHAR +STARTCHAR U_3001 +ENCODING 12289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 3 0 0 +BITMAP +80 +60 +20 +ENDCHAR +STARTCHAR U_3002 +ENCODING 12290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 4 3 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR U_3003 +ENCODING 12291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 4 4 3 +BITMAP +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR U_3004 +ENCODING 12292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1800 +2100 +4580 +8740 +8540 +9C40 +A440 +5080 +2900 +1200 +ENDCHAR +STARTCHAR U_3005 +ENCODING 12293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +1000 +1000 +1F80 +2080 +4080 +8100 +1200 +0C00 +0400 +0400 +ENDCHAR +STARTCHAR U_3006 +ENCODING 12294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 1 +BITMAP +0100 +0080 +3100 +4A00 +8400 +8A00 +9000 +A000 +C000 +ENDCHAR +STARTCHAR U_3007 +ENCODING 12295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR U_3008 +ENCODING 12296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 8 -1 +BITMAP +20 +20 +40 +40 +80 +80 +80 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR U_3009 +ENCODING 12297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 2 -1 +BITMAP +80 +80 +40 +40 +20 +20 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_300A +ENCODING 12298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 10 5 -1 +BITMAP +24 +24 +48 +48 +90 +90 +48 +48 +24 +24 +ENDCHAR +STARTCHAR U_300B +ENCODING 12299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 10 0 -1 +BITMAP +90 +90 +48 +48 +24 +24 +48 +48 +90 +90 +ENDCHAR +STARTCHAR U_300C +ENCODING 12300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 8 7 2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_300D +ENCODING 12301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 8 1 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR U_300E +ENCODING 12302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 6 1 +BITMAP +F8 +88 +B8 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR U_300F +ENCODING 12303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 1 -1 +BITMAP +38 +28 +28 +28 +28 +28 +E8 +88 +F8 +ENDCHAR +STARTCHAR U_3010 +ENCODING 12304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +F0 +E0 +C0 +C0 +80 +80 +80 +C0 +C0 +E0 +F0 +ENDCHAR +STARTCHAR U_3011 +ENCODING 12305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +F0 +70 +30 +30 +10 +10 +10 +30 +30 +70 +F0 +ENDCHAR +STARTCHAR U_3012 +ENCODING 12306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +FFC0 +0000 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3013 +ENCODING 12307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +0000 +0000 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR U_3014 +ENCODING 12308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 7 -1 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR U_3015 +ENCODING 12309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 2 -1 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR U_3016 +ENCODING 12310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 6 -1 +BITMAP +F8 +90 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +90 +F8 +ENDCHAR +STARTCHAR U_3017 +ENCODING 12311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 1 -1 +BITMAP +F8 +48 +28 +28 +28 +28 +28 +28 +28 +48 +F8 +ENDCHAR +STARTCHAR U_3018 +ENCODING 12312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +30 +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +30 +ENDCHAR +STARTCHAR U_3019 +ENCODING 12313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +C0 +70 +50 +50 +50 +50 +50 +50 +50 +70 +C0 +ENDCHAR +STARTCHAR U_301A +ENCODING 12314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F0 +ENDCHAR +STARTCHAR U_301B +ENCODING 12315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +50 +50 +50 +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR U_301C +ENCODING 12316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 3 +BITMAP +03C0 +8420 +7800 +ENDCHAR +STARTCHAR U_301D +ENCODING 12317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 2 8 8 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR U_301E +ENCODING 12318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 2 1 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR U_301F +ENCODING 12319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 3 0 -1 +BITMAP +48 +90 +90 +ENDCHAR +STARTCHAR U_3020 +ENCODING 12320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +7FC0 +0400 +D560 +AEA0 +9120 +4E40 +2080 +1F00 +ENDCHAR +STARTCHAR U_3021 +ENCODING 12321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 11 0 -1 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3022 +ENCODING 12322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 12 3 -1 +BITMAP +0C +08 +88 +88 +88 +88 +88 +88 +88 +08 +08 +08 +ENDCHAR +STARTCHAR U_3023 +ENCODING 12323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +0080 +8080 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +8080 +0080 +ENDCHAR +STARTCHAR U_3024 +ENCODING 12324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +41 +22 +12 +0C +04 +0A +11 +21 +C0 +ENDCHAR +STARTCHAR U_3025 +ENCODING 12325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +22 +42 +C4 +28 +38 +44 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_3026 +ENCODING 12326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 3 1 5 +BITMAP +0800 +0400 +FFC0 +ENDCHAR +STARTCHAR U_3027 +ENCODING 12327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 2 +BITMAP +0800 +0800 +0800 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_3028 +ENCODING 12328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0800 +0800 +FFC0 +0000 +0000 +7F80 +0000 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR U_3029 +ENCODING 12329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +20 +20 +7F +42 +A2 +14 +0C +0C +12 +22 +C0 +ENDCHAR +STARTCHAR U_3030 +ENCODING 12336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 3 +BITMAP +6180 +9240 +0C20 +ENDCHAR +STARTCHAR U_3031 +ENCODING 12337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +18 +20 +40 +80 +80 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR U_3032 +ENCODING 12338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 0 -1 +BITMAP +10 +18 +22 +41 +84 +82 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR U_3033 +ENCODING 12339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +18 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_3034 +ENCODING 12340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 0 -1 +BITMAP +10 +1A +11 +24 +22 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_3035 +ENCODING 12341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +80 +40 +20 +20 +10 +10 +08 +08 +04 +04 +04 +ENDCHAR +STARTCHAR U_3036 +ENCODING 12342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +7FC0 +BFA0 +8020 +BFA0 +BFA0 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_3037 +ENCODING 12343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A20 +8A20 +5140 +5140 +2080 +2080 +2080 +5140 +5140 +8A20 +8A20 +ENDCHAR +STARTCHAR U_3038 +ENCODING 12344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3039 +ENCODING 12345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +FFE0 +1100 +1100 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_303A +ENCODING 12346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2480 +2480 +FFE0 +2480 +2480 +2480 +4480 +4480 +8480 +ENDCHAR +STARTCHAR U_303E +ENCODING 12350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +99A0 +2600 +8120 +3F80 +8420 +3F80 +9020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_3041 +ENCODING 12353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +20 +10 +54 +38 +12 +3C +56 +92 +AA +44 +ENDCHAR +STARTCHAR U_3042 +ENCODING 12354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1600 +F800 +2400 +3E00 +2500 +6880 +A880 +9080 +A100 +4600 +ENDCHAR +STARTCHAR U_3043 +ENCODING 12355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 5 2 0 +BITMAP +40 +48 +84 +A4 +40 +ENDCHAR +STARTCHAR U_3044 +ENCODING 12356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 0 +BITMAP +8000 +4300 +4080 +4040 +4840 +50C0 +3040 +1000 +ENDCHAR +STARTCHAR U_3045 +ENCODING 12357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 7 2 -1 +BITMAP +40 +30 +70 +88 +08 +10 +20 +ENDCHAR +STARTCHAR U_3046 +ENCODING 12358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 12 2 -1 +BITMAP +20 +18 +00 +3C +C2 +02 +02 +02 +04 +04 +08 +10 +ENDCHAR +STARTCHAR U_3047 +ENCODING 12359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 1 -1 +BITMAP +20 +10 +7C +08 +30 +48 +8E +ENDCHAR +STARTCHAR U_3048 +ENCODING 12360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0C00 +0000 +4E00 +3200 +0400 +0800 +1800 +2400 +4400 +8380 +ENDCHAR +STARTCHAR U_3049 +ENCODING 12361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +20 +34 +E2 +38 +64 +A4 +48 +ENDCHAR +STARTCHAR U_304A +ENCODING 12362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1500 +78C0 +1040 +1700 +1880 +7040 +D240 +3180 +1000 +ENDCHAR +STARTCHAR U_304B +ENCODING 12363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +2000 +1100 +9C80 +7240 +1240 +12C0 +2200 +2200 +4A00 +4400 +ENDCHAR +STARTCHAR U_304C +ENCODING 12364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00A0 +20A0 +1100 +9C80 +7240 +1240 +12C0 +2200 +2200 +4A00 +4400 +ENDCHAR +STARTCHAR U_304D +ENCODING 12365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +10 +1C +F0 +0E +F8 +04 +3A +46 +80 +40 +3C +ENDCHAR +STARTCHAR U_304E +ENCODING 12366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +15 +1D +F0 +0E +F8 +04 +3A +46 +80 +40 +3C +ENDCHAR +STARTCHAR U_304F +ENCODING 12367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 2 -1 +BITMAP +10 +08 +10 +20 +40 +80 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_3050 +ENCODING 12368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +08 +15 +25 +40 +80 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_3051 +ENCODING 12369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +8100 +41C0 +5F00 +8100 +8100 +8100 +8100 +6200 +4200 +0400 +ENDCHAR +STARTCHAR U_3052 +ENCODING 12370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +04A0 +82A0 +41C0 +5F00 +8100 +8100 +8100 +8100 +6200 +4200 +0400 +ENDCHAR +STARTCHAR U_3053 +ENCODING 12371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +40 +3E +04 +00 +00 +80 +80 +41 +3E +ENDCHAR +STARTCHAR U_3054 +ENCODING 12372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +4280 +3E80 +0400 +0000 +0000 +8000 +8000 +4100 +3E00 +ENDCHAR +STARTCHAR U_3055 +ENCODING 12373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +10 +8E +78 +04 +04 +7A +86 +80 +60 +1C +ENDCHAR +STARTCHAR U_3056 +ENCODING 12374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2280 +1280 +8E00 +7800 +0400 +0400 +7A00 +8600 +8000 +6000 +1C00 +ENDCHAR +STARTCHAR U_3057 +ENCODING 12375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +41 +26 +18 +ENDCHAR +STARTCHAR U_3058 +ENCODING 12376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +80 +45 +45 +40 +40 +40 +40 +41 +26 +18 +ENDCHAR +STARTCHAR U_3059 +ENCODING 12377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 12 0 -1 +BITMAP +0400 +0200 +83C0 +7E00 +0A00 +1600 +1200 +0E00 +0200 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_305A +ENCODING 12378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +04A0 +02A0 +83C0 +7E00 +0A00 +1600 +1200 +0E00 +0200 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_305B +ENCODING 12379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0200 +2100 +11E0 +9700 +7900 +1100 +1300 +1000 +0800 +0780 +ENDCHAR +STARTCHAR U_305C +ENCODING 12380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0250 +2150 +11E0 +9700 +7900 +1100 +1300 +1000 +0800 +0780 +ENDCHAR +STARTCHAR U_305D +ENCODING 12381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +4E00 +3400 +0800 +1380 +FC00 +0800 +1000 +1000 +0800 +0600 +ENDCHAR +STARTCHAR U_305E +ENCODING 12382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +4D40 +3540 +0800 +1380 +FC00 +0800 +1000 +1000 +0800 +0600 +ENDCHAR +STARTCHAR U_305F +ENCODING 12383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1000 +1C00 +E000 +2700 +2180 +4200 +4000 +4800 +8800 +8780 +ENDCHAR +STARTCHAR U_3060 +ENCODING 12384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +1140 +1D40 +E000 +2700 +2180 +4200 +4000 +4800 +8800 +8780 +ENDCHAR +STARTCHAR U_3061 +ENCODING 12385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +8A00 +7C00 +1000 +1700 +1880 +2080 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_3062 +ENCODING 12386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +1140 +8A80 +5400 +3800 +1700 +3880 +2080 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_3063 +ENCODING 12387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 5 2 -1 +BITMAP +38 +C4 +04 +08 +30 +ENDCHAR +STARTCHAR U_3064 +ENCODING 12388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 7 0 1 +BITMAP +0F00 +B080 +4040 +0040 +0080 +0300 +0C00 +ENDCHAR +STARTCHAR U_3065 +ENCODING 12389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +00A0 +0FA0 +B080 +4040 +0040 +0080 +0300 +0C00 +ENDCHAR +STARTCHAR U_3066 +ENCODING 12390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +8380 +7C00 +0400 +0800 +1000 +1000 +1000 +0800 +0700 +ENDCHAR +STARTCHAR U_3067 +ENCODING 12391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +8380 +7C00 +0540 +0940 +1000 +1000 +1000 +0800 +0700 +ENDCHAR +STARTCHAR U_3068 +ENCODING 12392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +40 +20 +26 +28 +30 +40 +80 +40 +3E +ENDCHAR +STARTCHAR U_3069 +ENCODING 12393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +4280 +2280 +2600 +2800 +3000 +4000 +8000 +4000 +3E00 +ENDCHAR +STARTCHAR U_306A +ENCODING 12394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1400 +FB00 +2180 +2200 +4200 +4200 +9E00 +2300 +2280 +1C00 +ENDCHAR +STARTCHAR U_306B +ENCODING 12395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +8000 +4700 +5980 +8200 +8000 +8000 +8800 +A800 +C780 +4000 +ENDCHAR +STARTCHAR U_306C +ENCODING 12396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +0400 +4F00 +5480 +6440 +6840 +A840 +9340 +A480 +4380 +ENDCHAR +STARTCHAR U_306D +ENCODING 12397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1000 +9B80 +7440 +1840 +3040 +3040 +51C0 +B260 +1180 +ENDCHAR +STARTCHAR U_306E +ENCODING 12398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +1C00 +2A00 +4900 +8880 +9080 +9080 +A100 +4200 +0C00 +ENDCHAR +STARTCHAR U_306F +ENCODING 12399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +8100 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3070 +ENCODING 12400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +02A0 +81A0 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3071 +ENCODING 12401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +02C0 +8120 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3072 +ENCODING 12402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0200 +1200 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3073 +ENCODING 12403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +02A0 +12A0 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3074 +ENCODING 12404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00C0 +0320 +12C0 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3075 +ENCODING 12405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +1000 +0E00 +0400 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3076 +ENCODING 12406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +1140 +0F40 +0400 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3077 +ENCODING 12407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +10C0 +0F20 +04C0 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3078 +ENCODING 12408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +1800 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_3079 +ENCODING 12409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0140 +0140 +1800 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_307A +ENCODING 12410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +00C0 +0120 +18C0 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_307B +ENCODING 12411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +91C0 +4F00 +4140 +8F80 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307C +ENCODING 12412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00A0 +91A0 +4F00 +4140 +8F80 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307D +ENCODING 12413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00C0 +9120 +4FC0 +4100 +8FC0 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307E +ENCODING 12414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +8F +78 +08 +8E +78 +08 +78 +8E +89 +70 +ENDCHAR +STARTCHAR U_307F +ENCODING 12415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4400 +3C00 +0800 +0800 +0900 +3E80 +5180 +9140 +A100 +4200 +0400 +ENDCHAR +STARTCHAR U_3080 +ENCODING 12416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +9C00 +7180 +1040 +7000 +9000 +9000 +A100 +6080 +2080 +1F00 +ENDCHAR +STARTCHAR U_3081 +ENCODING 12417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +4E00 +5500 +6480 +4840 +A840 +9040 +9080 +6100 +0600 +ENDCHAR +STARTCHAR U_3082 +ENCODING 12418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +20 +10 +70 +1C +28 +E2 +39 +21 +21 +12 +0C +ENDCHAR +STARTCHAR U_3083 +ENCODING 12419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 -1 +BITMAP +28 +2E +F5 +21 +16 +10 +10 +ENDCHAR +STARTCHAR U_3084 +ENCODING 12420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3700 +2000 +13C0 +9C20 +7020 +09C0 +0800 +0800 +0400 +0400 +ENDCHAR +STARTCHAR U_3085 +ENCODING 12421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 3 -1 +BITMAP +10 +9C +B2 +D2 +9C +10 +20 +ENDCHAR +STARTCHAR U_3086 +ENCODING 12422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8200 +4780 +4A40 +5220 +6220 +6A40 +4780 +4200 +0400 +0800 +ENDCHAR +STARTCHAR U_3087 +ENCODING 12423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +10 +1C +10 +10 +78 +96 +60 +ENDCHAR +STARTCHAR U_3088 +ENCODING 12424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +0980 +0E00 +0800 +0800 +0800 +7800 +8E00 +8980 +7000 +ENDCHAR +STARTCHAR U_3089 +ENCODING 12425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +18 +40 +80 +80 +BC +C2 +82 +02 +0C +70 +ENDCHAR +STARTCHAR U_308A +ENCODING 12426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +88 +54 +52 +62 +62 +42 +42 +04 +04 +08 +10 +ENDCHAR +STARTCHAR U_308B +ENCODING 12427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +4E +34 +08 +10 +3E +61 +81 +19 +26 +1C +ENDCHAR +STARTCHAR U_308C +ENCODING 12428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1300 +3480 +D880 +1080 +1080 +3080 +5080 +B060 +1000 +ENDCHAR +STARTCHAR U_308D +ENCODING 12429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +4E +34 +08 +10 +3E +61 +81 +01 +06 +18 +ENDCHAR +STARTCHAR U_308E +ENCODING 12430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 -1 +BITMAP +40 +30 +EE +31 +61 +A2 +24 +ENDCHAR +STARTCHAR U_308F +ENCODING 12431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1000 +9B80 +7C40 +1020 +1020 +3020 +5040 +B180 +1000 +ENDCHAR +STARTCHAR U_3090 +ENCODING 12432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +4E00 +3400 +0400 +1F00 +2880 +4840 +9040 +9640 +6980 +4700 +ENDCHAR +STARTCHAR U_3091 +ENCODING 12433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +1F00 +0400 +1F00 +2080 +4C80 +1300 +0C00 +0000 +5980 +8640 +ENDCHAR +STARTCHAR U_3092 +ENCODING 12434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +9E00 +7000 +2180 +7200 +8C00 +1400 +2400 +2000 +1F00 +ENDCHAR +STARTCHAR U_3093 +ENCODING 12435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1000 +0800 +0800 +1000 +1000 +3800 +2400 +4440 +4480 +8300 +ENDCHAR +STARTCHAR U_3094 +ENCODING 12436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +0C80 +0040 +1D00 +E280 +0200 +0200 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_3099 +ENCODING 12441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 3 0 7 +BITMAP +20 +90 +40 +ENDCHAR +STARTCHAR U_309B +ENCODING 12443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 3 0 6 +BITMAP +20 +90 +40 +ENDCHAR +STARTCHAR U_309C +ENCODING 12444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 3 0 6 +BITMAP +40 +A0 +40 +ENDCHAR + + +STARTCHAR u30A0 +ENCODING 12448 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR u30A1 +ENCODING 12449 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +10 +60 +40 +ENDCHAR +STARTCHAR u30A2 +ENCODING 12450 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +28 +30 +20 +40 +ENDCHAR +STARTCHAR u30A3 +ENCODING 12451 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +20 +40 +C0 +40 +ENDCHAR +STARTCHAR u30A4 +ENCODING 12452 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR u30A5 +ENCODING 12453 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +90 +20 +ENDCHAR +STARTCHAR u30A6 +ENCODING 12454 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30A7 +ENCODING 12455 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR u30A8 +ENCODING 12456 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30A9 +ENCODING 12457 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +60 +A0 +ENDCHAR +STARTCHAR u30AA +ENCODING 12458 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +30 +50 +90 +10 +ENDCHAR +STARTCHAR u30AB +ENCODING 12459 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AC +ENCODING 12460 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AD +ENCODING 12461 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AE +ENCODING 12462 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AF +ENCODING 12463 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B0 +ENCODING 12464 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B1 +ENCODING 12465 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30B2 +ENCODING 12466 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30BB3 +ENCODING 12467 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30B4 +ENCODING 12468 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30BB5 +ENCODING 12469 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B6 +ENCODING 12470 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B7 +ENCODING 12471 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B8 +ENCODING 12472 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B9 +ENCODING 12473 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BA +ENCODING 12474 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BB +ENCODING 12475 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BC +ENCODING 12476 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BD +ENCODING 12477 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BE +ENCODING 12478 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BF +ENCODING 12479 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C0 +ENCODING 12480 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C1 +ENCODING 12481 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C2 +ENCODING 12482 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C3 +ENCODING 12483 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR u30C4 +ENCODING 12484 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C5 +ENCODING 12485 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C6 +ENCODING 12486 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C7 +ENCODING 12487 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C8 +ENCODING 12488 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30C9 +ENCODING 12489 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +50 +00 +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30CA +ENCODING 12490 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CB +ENCODING 12491 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR u30CC +ENCODING 12492 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +D0 +ENDCHAR +STARTCHAR u30CD +ENCODING 12493 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +10 +20 +70 +A8 +ENDCHAR +STARTCHAR u30CE +ENCODING 12494 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CF +ENCODING 12495 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D0 +ENCODING 12496 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D1 +ENCODING 12497 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D2 +ENCODING 12498 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D3 +ENCODING 12499 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D4 +ENCODING 12500 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +98 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D5 +ENCODING 12501 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D6 +ENCODING 12502 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D7 +ENCODING 12503 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D8 +ENCODING 12504 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30D9 +ENCODING 12505 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +00 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DA +ENCODING 12506 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +18 +18 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DB +ENCODING 12507 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DC +ENCODING 12508 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DD +ENCODING 12509 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DE +ENCODING 12510 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +10 +ENDCHAR +STARTCHAR u30DF +ENCODING 12511 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +00 +E0 +00 +F0 +ENDCHAR +STARTCHAR u30E0 +ENCODING 12512 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +88 +F8 +08 +ENDCHAR +STARTCHAR u30E1 +ENCODING 12513 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +28 +10 +28 +C0 +ENDCHAR +STARTCHAR u30E2 +ENCODING 12514 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +F8 +40 +38 +ENDCHAR +STARTCHAR u30E3 +ENCODING 12515 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +40 +F8 +50 +40 +ENDCHAR +STARTCHAR u30E4 +ENCODING 12516 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +40 +ENDCHAR +STARTCHAR u30E5 +ENCODING 12517 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +60 +20 +20 +F0 +ENDCHAR +STARTCHAR u30E6 +ENCODING 12518 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR u30E7 +ENCODING 12519 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR u30E8 +ENCODING 12520 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR u30E9 +ENCODING 12521 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +08 +10 +20 +ENDCHAR +STARTCHAR u30EA +ENCODING 12522 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +90 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR u30EB +ENCODING 12523 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +A0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR u30EC +ENCODING 12524 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +80 +80 +90 +A0 +C0 +ENDCHAR +STARTCHAR u30ED +ENCODING 12525 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR u30EE +ENCODING 12526 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +90 +10 +20 +ENDCHAR +STARTCHAR u30EF +ENCODING 12527 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F0 +ENCODING 12528 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F1 +ENCODING 12529 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30F2 +ENCODING 12530 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30F3 +ENCODING 12531 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR u30F4 +ENCODING 12532 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F5 +ENCODING 12533 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +50 +A0 +ENDCHAR +STARTCHAR u30F6 +ENCODING 12534 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +20 +40 +ENDCHAR +STARTCHAR u30F7 +ENCODING 12535 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F8 +ENCODING 12536 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F9 +ENCODING 12537 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30FA +ENCODING 12538 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30FB +ENCODING 12539 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR u30FC +ENCODING 12540 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR u30FD +ENCODING 12541 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FE +ENCODING 12542 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FF +ENCODING 12543 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR + + +STARTCHAR U_3105 +ENCODING 12549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +20 +20 +4F +F1 +01 +02 +02 +24 +1C +18 +ENDCHAR +STARTCHAR U_3106 +ENCODING 12550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0800 +1380 +3D00 +0200 +1400 +0E00 +1100 +20C0 +C040 +ENDCHAR +STARTCHAR U_3107 +ENCODING 12551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0300 +FF80 +4100 +4100 +4100 +4100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3108 +ENCODING 12552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 1 +BITMAP +FF +80 +80 +80 +80 +80 +7F +ENDCHAR +STARTCHAR U_3109 +ENCODING 12553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2000 +2000 +4000 +7F80 +9080 +1080 +2080 +2100 +4100 +8A00 +0400 +ENDCHAR +STARTCHAR U_310A +ENCODING 12554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +0400 +FFC0 +0800 +1000 +1200 +2100 +7E80 +2080 +ENDCHAR +STARTCHAR U_310B +ENCODING 12555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +FC +08 +08 +1E +02 +04 +04 +28 +10 +ENDCHAR +STARTCHAR U_310C +ENCODING 12556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +48 +48 +7F +11 +11 +21 +22 +4A +84 +ENDCHAR +STARTCHAR U_310D +ENCODING 12557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +11 +22 +22 +44 +88 +88 +44 +22 +11 +ENDCHAR +STARTCHAR U_310E +ENCODING 12558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +FFC0 +0800 +1000 +1F80 +0100 +0100 +0100 +0A00 +0600 +ENDCHAR +STARTCHAR U_310F +ENCODING 12559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +01C0 +1E00 +1000 +1000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_3110 +ENCODING 12560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +0C +04 +C4 +44 +44 +4C +74 +C4 +04 +04 +04 +ENDCHAR +STARTCHAR U_3111 +ENCODING 12561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +06 +0C +10 +60 +C0 +60 +10 +0C +06 +02 +ENDCHAR +STARTCHAR U_3112 +ENCODING 12562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3113 +ENCODING 12563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0800 +0800 +4900 +4900 +4900 +7F00 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_3114 +ENCODING 12564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +02 +04 +0A +32 +04 +0C +34 +C4 +04 +04 +ENDCHAR +STARTCHAR U_3115 +ENCODING 12565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +7F80 +0100 +0300 +3C00 +2000 +4000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_3116 +ENCODING 12566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +FE +82 +82 +B2 +8A +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_3117 +ENCODING 12567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +03 +FD +11 +11 +11 +11 +12 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_3118 +ENCODING 12568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0800 +FFC0 +0800 +0800 +1700 +0900 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_3119 +ENCODING 12569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0400 +0400 +0800 +1000 +1000 +2000 +4100 +FF80 +0080 +ENDCHAR +STARTCHAR U_311A +ENCODING 12570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +82 +44 +28 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_311B +ENCODING 12571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +1F +E8 +08 +08 +78 +80 +81 +7E +ENDCHAR +STARTCHAR U_311C +ENCODING 12572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +07C0 +FC00 +0400 +3C00 +4000 +4000 +2080 +1F00 +ENDCHAR +STARTCHAR U_311D +ENCODING 12573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 1 0 +BITMAP +2000 +1100 +1100 +13E0 +FE00 +1200 +1200 +1000 +0F00 +ENDCHAR +STARTCHAR U_311E +ENCODING 12574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +FF +48 +48 +FF +11 +22 +42 +44 +84 +ENDCHAR +STARTCHAR U_311F +ENCODING 12575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 2 0 +BITMAP +1800 +E800 +0800 +0800 +0400 +0400 +0200 +0180 +ENDCHAR +STARTCHAR U_3120 +ENCODING 12576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +08 +10 +11 +22 +44 +F8 +14 +22 +FD +01 +ENDCHAR +STARTCHAR U_3121 +ENCODING 12577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0200 +7F00 +0200 +2400 +1C00 +0C00 +1200 +6100 +8080 +ENDCHAR +STARTCHAR U_3122 +ENCODING 12578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +7E +42 +44 +BF +C1 +02 +02 +04 +ENDCHAR +STARTCHAR U_3123 +ENCODING 12579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +2000 +2000 +4000 +4000 +7F80 +8080 +0100 +0100 +0200 +ENDCHAR +STARTCHAR U_3124 +ENCODING 12580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +0800 +7F80 +0C00 +1400 +1400 +2400 +4400 +83C0 +ENDCHAR +STARTCHAR U_3125 +ENCODING 12581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 1 1 +BITMAP +0400 +0400 +0800 +0800 +1000 +2000 +4000 +FFC0 +ENDCHAR +STARTCHAR U_3126 +ENCODING 12582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0400 +2600 +2400 +2400 +2400 +2400 +2400 +2400 +4400 +83C0 +ENDCHAR +STARTCHAR U_3127 +ENCODING 12583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3128 +ENCODING 12584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +02 +03 +42 +24 +14 +08 +14 +22 +41 +81 +ENDCHAR +STARTCHAR U_3129 +ENCODING 12585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +C3 +41 +41 +41 +41 +81 +81 +FF +41 +ENDCHAR +STARTCHAR U_312A +ENCODING 12586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +0880 +1080 +1080 +1080 +2080 +4700 +ENDCHAR +STARTCHAR U_312B +ENCODING 12587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +1200 +1200 +1200 +1200 +1200 +1200 +2200 +4200 +81E0 +ENDCHAR +STARTCHAR U_312C +ENCODING 12588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_312D +ENCODING 12589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4440 +4440 +0400 +0400 +ENDCHAR +STARTCHAR U_3131 +ENCODING 12593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 0 0 +BITMAP +FF80 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_3132 +ENCODING 12594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 0 +BITMAP +F780 +1080 +1080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_3133 +ENCODING 12595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 0 +BITMAP +F100 +1100 +1100 +1280 +1280 +1440 +1820 +ENDCHAR +STARTCHAR U_3134 +ENCODING 12596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 0 1 +BITMAP +80 +80 +80 +80 +80 +FF +ENDCHAR +STARTCHAR U_3135 +ENCODING 12597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +8100 +8100 +8100 +8100 +8380 +8280 +86C0 +8440 +9440 +E820 +ENDCHAR +STARTCHAR U_3137 +ENCODING 12599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 5 0 2 +BITMAP +FE +80 +80 +80 +FE +ENDCHAR +STARTCHAR U_3139 +ENCODING 12601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +FE +02 +02 +FE +80 +80 +FE +ENDCHAR +STARTCHAR U_313A +ENCODING 12602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +FBE0 +0820 +0820 +7820 +4020 +4020 +4020 +7E20 +0020 +ENDCHAR +STARTCHAR U_313B +ENCODING 12603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +F1C0 +0A20 +0A20 +7220 +8220 +8220 +79C0 +ENDCHAR +STARTCHAR U_313C +ENCODING 12604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +0A20 +0A20 +0A20 +FBE0 +8220 +8220 +8220 +8220 +9A20 +E3E0 +ENDCHAR +STARTCHAR U_313D +ENCODING 12605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +0880 +0880 +0880 +0880 +F880 +8140 +8140 +8140 +9A20 +E420 +ENDCHAR +STARTCHAR U_3141 +ENCODING 12609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 1 +BITMAP +FE +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR U_3142 +ENCODING 12610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +82 +82 +82 +FE +82 +82 +FE +ENDCHAR +STARTCHAR U_3143 +ENCODING 12611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 -1 +BITMAP +8A20 +8A20 +8A20 +FBE0 +8A20 +8A20 +8A20 +71C0 +ENDCHAR +STARTCHAR U_3144 +ENCODING 12612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +8880 +8880 +F880 +8880 +8940 +7220 +ENDCHAR +STARTCHAR U_3145 +ENCODING 12613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0400 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3147 +ENCODING 12615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +3F80 +4040 +8020 +8020 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_3148 +ENCODING 12616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_314C +ENCODING 12620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 1 +BITMAP +FFC0 +8000 +8000 +FFC0 +8000 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_3151 +ENCODING 12625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 9 0 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3152 +ENCODING 12626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 9 0 0 +BITMAP +90 +90 +F0 +90 +F0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR U_3154 +ENCODING 12628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 0 0 +BITMAP +22 +22 +22 +E2 +22 +22 +22 +22 +22 +ENDCHAR +STARTCHAR U_3155 +ENCODING 12629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 9 0 0 +BITMAP +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_3158 +ENCODING 12632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 0 0 +BITMAP +02 +02 +03 +02 +02 +22 +22 +FE +02 +ENDCHAR +STARTCHAR U_315B +ENCODING 12635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 3 0 0 +BITMAP +1400 +1400 +FF80 +ENDCHAR +STARTCHAR U_3162 +ENCODING 12642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 0 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_3179 +ENCODING 12665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +9480 +F780 +9480 +6300 +0800 +7F00 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_317A +ENCODING 12666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +13E0 +1020 +1020 +1020 +2820 +4420 +8220 +ENDCHAR +STARTCHAR U_317D +ENCODING 12669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 7 1 1 +BITMAP +2440 +2440 +27C0 +2440 +2440 +5440 +8B80 +ENDCHAR +STARTCHAR U_317F +ENCODING 12671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 0 +BITMAP +0800 +1400 +2200 +2200 +4100 +8080 +FF80 +ENDCHAR +STARTCHAR U_3180 +ENCODING 12672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +2080 +2080 +71C0 +8A20 +8A20 +8A20 +8A20 +71C0 +ENDCHAR +STARTCHAR U_3181 +ENCODING 12673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +0800 +0800 +1C00 +6300 +8080 +8080 +6300 +1C00 +ENDCHAR +STARTCHAR U_318C +ENCODING 12684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 0 +BITMAP +0080 +0080 +0080 +0280 +FC80 +4880 +4880 +4880 +8880 +ENDCHAR +STARTCHAR U_318D +ENCODING 12685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 2 0 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_318E +ENCODING 12686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 9 0 0 +BITMAP +04 +04 +04 +C4 +C4 +04 +04 +04 +04 +ENDCHAR +STARTCHAR U_3192 +ENCODING 12690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 1 0 7 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_3193 +ENCODING 12691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 4 0 5 +BITMAP +7E +00 +00 +FF +ENDCHAR +STARTCHAR U_3194 +ENCODING 12692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 5 0 4 +BITMAP +7E +00 +3C +00 +FF +ENDCHAR +STARTCHAR U_3195 +ENCODING 12693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 5 0 4 +BITMAP +FE +AA +CE +82 +FE +ENDCHAR +STARTCHAR U_3196 +ENCODING 12694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +10 +10 +1C +10 +10 +FE +ENDCHAR +STARTCHAR U_3197 +ENCODING 12695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 7 0 3 +BITMAP +20 +20 +FC +A4 +FC +20 +20 +ENDCHAR +STARTCHAR U_3198 +ENCODING 12696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FE +10 +18 +14 +10 +10 +ENDCHAR +STARTCHAR U_3199 +ENCODING 12697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 3 +BITMAP +FE +92 +FE +92 +FE +10 +10 +ENDCHAR +STARTCHAR U_319A +ENCODING 12698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FC +18 +20 +40 +82 +7E +ENDCHAR +STARTCHAR U_319B +ENCODING 12699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +7C +10 +FE +92 +AA +86 +ENDCHAR +STARTCHAR U_319C +ENCODING 12700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FE +10 +10 +10 +10 +30 +ENDCHAR +STARTCHAR U_319D +ENCODING 12701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +7C +10 +FE +10 +28 +C6 +ENDCHAR +STARTCHAR U_319E +ENCODING 12702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 0 3 +BITMAP +44 +54 +FF +55 +56 +71 +9F +ENDCHAR +STARTCHAR U_319F +ENCODING 12703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 0 4 +BITMAP +10 +10 +10 +28 +44 +83 +ENDCHAR +STARTCHAR U_31C0 +ENCODING 12736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 3 1 3 +BITMAP +03 +1C +E0 +ENDCHAR +STARTCHAR U_31C1 +ENCODING 12737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_31C2 +ENCODING 12738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +05 +02 +ENDCHAR +STARTCHAR U_31C3 +ENCODING 12739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 2 +BITMAP +8000 +4000 +2040 +1840 +07C0 +ENDCHAR +STARTCHAR U_31C4 +ENCODING 12740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR U_31C5 +ENCODING 12741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +1E +ENDCHAR +STARTCHAR U_31C6 +ENCODING 12742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +05 +02 +ENDCHAR +STARTCHAR U_31C7 +ENCODING 12743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +02 +02 +02 +04 +04 +08 +08 +10 +20 +ENDCHAR +STARTCHAR U_31C8 +ENCODING 12744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 0 -1 +BITMAP +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0880 +0880 +0780 +ENDCHAR +STARTCHAR U_31C9 +ENCODING 12745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8000 +8000 +8000 +8000 +8000 +FF80 +0080 +0080 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U_31CA +ENCODING 12746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 8 1 0 +BITMAP +F0 +10 +10 +10 +10 +14 +18 +10 +ENDCHAR +STARTCHAR U_31CB +ENCODING 12747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +FE +04 +08 +0F +01 +01 +02 +02 +04 +18 +ENDCHAR +STARTCHAR U_31CC +ENCODING 12748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 10 3 -1 +BITMAP +F8 +08 +10 +20 +10 +08 +08 +08 +08 +30 +ENDCHAR +STARTCHAR U_31CD +ENCODING 12749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 6 1 2 +BITMAP +F800 +0800 +0800 +0800 +0800 +0780 +ENDCHAR +STARTCHAR U_31CE +ENCODING 12750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +F8 +08 +08 +08 +0F +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR U_31CF +ENCODING 12751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +07 +02 +ENDCHAR +STARTCHAR U_31D0 +ENCODING 12752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 1 1 5 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_31D1 +ENCODING 12753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_31D2 +ENCODING 12754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 1 2 +BITMAP +01 +01 +02 +04 +08 +10 +E0 +ENDCHAR +STARTCHAR U_31D3 +ENCODING 12755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_31D4 +ENCODING 12756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 5 3 3 +BITMAP +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR U_31D5 +ENCODING 12757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 1 +BITMAP +FE +02 +02 +02 +02 +02 +02 +ENDCHAR +STARTCHAR U_31D6 +ENCODING 12758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 4 +BITMAP +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR U_31D7 +ENCODING 12759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR U_31D8 +ENCODING 12760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 1 1 +BITMAP +01 +01 +01 +01 +01 +01 +01 +FF +ENDCHAR +STARTCHAR U_31D9 +ENCODING 12761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 10 4 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR U_31DA +ENCODING 12762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_31DB +ENCODING 12763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 9 3 0 +BITMAP +10 +10 +20 +40 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR U_31DC +ENCODING 12764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 1 2 +BITMAP +0800 +0800 +1000 +1000 +2000 +4000 +FF80 +ENDCHAR +STARTCHAR U_31DD +ENCODING 12765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +2000 +2000 +5000 +9000 +0800 +0400 +0200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_31DE +ENCODING 12766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +80 +80 +80 +80 +FE +02 +02 +02 +02 +ENDCHAR +STARTCHAR U_31DF +ENCODING 12767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +84 +84 +7C +ENDCHAR +STARTCHAR U_31E0 +ENCODING 12768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF80 +0100 +0200 +0400 +0800 +1000 +2000 +4020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_31E1 +ENCODING 12769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +0100 +0200 +07C0 +0040 +0040 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_31E2 +ENCODING 12770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0080 +0080 +0100 +0100 +0200 +0400 +8800 +5000 +2000 +ENDCHAR +STARTCHAR U_31E3 +ENCODING 12771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 1 1 +BITMAP +7F00 +8080 +8080 +8080 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_3200 +ENCODING 12800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +BFA0 +80A0 +80A0 +80A0 +80A0 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3202 +ENCODING 12802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +4100 +8080 +BE80 +A080 +A080 +BE80 +8080 +8080 +4100 +ENDCHAR +STARTCHAR U_3214 +ENCODING 12820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4940 +8920 +8920 +99A0 +9520 +A520 +A520 +C320 +8140 +4080 +ENDCHAR +STARTCHAR U_3216 +ENCODING 12822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4120 +BD20 +91A0 +9120 +A920 +A920 +C520 +8120 +4140 +2080 +ENDCHAR +STARTCHAR U_321A +ENCODING 12826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +40C0 +BEA0 +94A0 +94E0 +94A0 +94A0 +94A0 +BEC0 +4040 +4040 +ENDCHAR +STARTCHAR U_321B +ENCODING 12827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +9920 +8120 +BD20 +81A0 +9920 +A520 +9920 +4040 +2080 +ENDCHAR +STARTCHAR U_3220 +ENCODING 12832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +8020 +8020 +BFA0 +8020 +8020 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3221 +ENCODING 12833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +9F20 +8020 +8020 +8020 +BFA0 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3222 +ENCODING 12834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +BFA0 +8020 +8020 +9F20 +8020 +8020 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3223 +ENCODING 12835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +BFA0 +AAA0 +AAA0 +AAA0 +B3A0 +A0A0 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3224 +ENCODING 12836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +9F20 +8420 +8420 +9F20 +8520 +8920 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3225 +ENCODING 12837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8420 +BFA0 +8020 +8A20 +8A20 +9120 +A0A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3226 +ENCODING 12838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4840 +8820 +89A0 +BE20 +8820 +8820 +88A0 +87A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3227 +ENCODING 12839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +8220 +8220 +9220 +9220 +9120 +9120 +A0A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3228 +ENCODING 12840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4840 +8820 +BE20 +8A20 +8A20 +8A20 +92A0 +A3A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3229 +ENCODING 12841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8420 +8420 +8420 +BFA0 +8420 +8420 +8420 +4440 +2080 +ENDCHAR +STARTCHAR U_322D +ENCODING 12845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +8420 +BFA0 +8E20 +9520 +A4A0 +C460 +8420 +4440 +4040 +ENDCHAR +STARTCHAR U_322E +ENCODING 12846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4A40 +9120 +A0A0 +DF60 +8420 +BFA0 +A4A0 +9520 +7FC0 +2080 +ENDCHAR +STARTCHAR U_3243 +ENCODING 12867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +5FC0 +8420 +8920 +9FA0 +8420 +9FA0 +8420 +8420 +5FC0 +4040 +ENDCHAR +STARTCHAR U_32A3 +ENCODING 12963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +7FC0 +8420 +8420 +97A0 +9420 +9420 +7FC0 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A4 +ENCODING 12964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4440 +8420 +8720 +8420 +8420 +BFA0 +4040 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A5 +ENCODING 12965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2480 +4440 +BFA0 +A4A0 +A4A0 +BFA0 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A6 +ENCODING 12966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4040 +BFA0 +8420 +8620 +8520 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A7 +ENCODING 12967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4840 +BF20 +9020 +9F20 +A420 +C420 +5F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A8 +ENCODING 12968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4840 +BF20 +9020 +9F20 +B120 +D120 +5F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_32D0 +ENCODING 13008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +BFA0 +80A0 +84A0 +8720 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D1 +ENCODING 13009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +81A0 +8620 +8C20 +B420 +8420 +8420 +8420 +4440 +3F80 +ENDCHAR +STARTCHAR U_32D2 +ENCODING 13010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +BFA0 +A0A0 +A0A0 +8120 +8120 +8220 +4440 +3F80 +ENDCHAR +STARTCHAR U_32D3 +ENCODING 13011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8420 +8420 +8420 +8420 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32D4 +ENCODING 13012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8120 +BFE0 +8320 +8D20 +9120 +A120 +8520 +4340 +3F80 +ENDCHAR +STARTCHAR U_32D5 +ENCODING 13013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +BFA0 +88A0 +88A0 +90A0 +90A0 +A520 +4240 +3F80 +ENDCHAR +STARTCHAR U_32D6 +ENCODING 13014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8B20 +9C20 +8420 +87A0 +BC20 +8220 +8220 +4240 +3F80 +ENDCHAR +STARTCHAR U_32D7 +ENCODING 13015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8F20 +9120 +9120 +A220 +8220 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D8 +ENCODING 13016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8820 +9FA0 +9220 +A220 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D9 +ENCODING 13017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8120 +8120 +8120 +8120 +9F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DA +ENCODING 13018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9120 +9120 +BFA0 +9120 +8120 +8220 +8C20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DB +ENCODING 13019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9820 +8020 +B820 +80A0 +8120 +8620 +9820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DC +ENCODING 13020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8220 +8420 +8A20 +9120 +A0A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DD +ENCODING 13021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +97A0 +F920 +9120 +9020 +9020 +8F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DE +ENCODING 13022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +A0A0 +90A0 +9120 +8120 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DF +ENCODING 13023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8F20 +8920 +9920 +AA20 +8620 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E0 +ENCODING 13024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8320 +9E20 +8420 +BFA0 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E1 +ENCODING 13025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +A4A0 +94A0 +90A0 +8120 +8120 +8220 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E2 +ENCODING 13026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8020 +BFA0 +8220 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E3 +ENCODING 13027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +8820 +8C20 +8B20 +8820 +8820 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E4 +ENCODING 13028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +BFA0 +8420 +8420 +8820 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E5 +ENCODING 13029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8020 +8020 +8020 +BFA0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E6 +ENCODING 13030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8120 +9A20 +8620 +8920 +9020 +6040 +3F80 +ENDCHAR +STARTCHAR U_32E7 +ENCODING 13031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +9F20 +8120 +8220 +8620 +9D20 +A4A0 +4440 +3F80 +ENDCHAR +STARTCHAR U_32E8 +ENCODING 13032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +8220 +8420 +8420 +8820 +9020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E9 +ENCODING 13033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +8920 +8920 +9920 +90A0 +A0A0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EA +ENCODING 13034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +9320 +9C20 +9020 +9020 +9020 +8F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EB +ENCODING 13035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +80A0 +80A0 +8120 +8220 +8420 +4840 +3F80 +ENDCHAR +STARTCHAR U_32EC +ENCODING 13036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +8020 +8C20 +9220 +A120 +80E0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32ED +ENCODING 13037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +BFA0 +8420 +9520 +9520 +A4A0 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EE +ENCODING 13038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +8120 +9220 +8C20 +8420 +8220 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EF +ENCODING 13039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9C20 +8320 +9820 +8620 +8020 +9820 +8720 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F0 +ENCODING 13040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +8820 +8A20 +9120 +A720 +B8A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F1 +ENCODING 13041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +9420 +8C20 +8A20 +9020 +A020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F2 +ENCODING 13042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8420 +8420 +BFA0 +8420 +8420 +83A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F3 +ENCODING 13043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +93A0 +9CA0 +F120 +8A20 +8820 +8420 +4440 +3F80 +ENDCHAR +STARTCHAR U_32F4 +ENCODING 13044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9E20 +8220 +8220 +8220 +8220 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F5 +ENCODING 13045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8120 +9F20 +8120 +8120 +9F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F6 +ENCODING 13046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8020 +BFA0 +80A0 +80A0 +8120 +8620 +4840 +3F80 +ENDCHAR +STARTCHAR U_32F7 +ENCODING 13047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9120 +9120 +9120 +8120 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F8 +ENCODING 13048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +9420 +94A0 +9520 +A620 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F9 +ENCODING 13049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +8820 +8820 +88A0 +8920 +8A20 +8C20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FA +ENCODING 13050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +9120 +9120 +9120 +9F20 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FB +ENCODING 13051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +A0A0 +A120 +8120 +8220 +8420 +4840 +3F80 +ENDCHAR +STARTCHAR U_32FC +ENCODING 13052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +9F20 +9220 +9220 +BFA0 +8220 +4240 +3F80 +ENDCHAR +STARTCHAR U_32FD +ENCODING 13053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9FA0 +80A0 +8720 +8420 +8420 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FE +ENCODING 13054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +BFA0 +80A0 +9FA0 +8120 +8220 +8420 +9820 +4040 +3F80 +ENDCHAR +STARTCHAR U_3300 +ENCODING 13056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +2A80 +3440 +2440 +4820 +8000 +0100 +0180 +F940 +0120 +0100 +ENDCHAR +STARTCHAR U_3322 +ENCODING 13090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F920 +4820 +4040 +3B80 +0000 +7800 +1000 +FC00 +1000 +6000 +ENDCHAR +STARTCHAR U_337B +ENCODING 13179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2080 +AFE0 +7480 +2780 +FD80 +25A0 +2560 +2A40 +28C0 +3320 +ENDCHAR +STARTCHAR U_337C +ENCODING 13180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2E00 +EAE0 +AAA0 +A7A0 +FAA0 +ABA0 +AEA0 +EAE0 +3AA0 +2A00 +ENDCHAR +STARTCHAR U_337D +ENCODING 13181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +FA80 +2280 +22E0 +2280 +2280 +5280 +5280 +8FE0 +ENDCHAR +STARTCHAR U_337E +ENCODING 13182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3A40 +E940 +AC40 +BAA0 +E9E0 +B800 +A9E0 +EAA0 +AAA0 +4AE0 +ENDCHAR +STARTCHAR U_337F +ENCODING 13183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +FFE0 +6940 +D940 +6DC0 +4B20 +2240 +5740 +AAE0 +5740 +7AE0 +ENDCHAR +STARTCHAR U_338E +ENCODING 13198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 8 0 -1 +BITMAP +28D0 +D520 +5520 +5520 +54C0 +5520 +5520 +00C0 +ENDCHAR +STARTCHAR U_338F +ENCODING 13199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +C000 +4000 +4000 +59A0 +5240 +6240 +6240 +5180 +5240 +DA40 +03C0 +ENDCHAR +STARTCHAR U_339C +ENCODING 13212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 8 0 0 +BITMAP +AAA0 +5550 +5550 +5550 +5550 +5550 +5550 +5550 +ENDCHAR +STARTCHAR U_339D +ENCODING 13213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 1 0 +BITMAP +3540 +4AA0 +8AA0 +82A0 +82A0 +82A0 +4AA0 +32A0 +ENDCHAR +STARTCHAR U_339E +ENCODING 13214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +C000 +4000 +4540 +5AA0 +52A0 +62A0 +62A0 +52A0 +52A0 +DAA0 +ENDCHAR +STARTCHAR U_33A1 +ENCODING 13217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +0020 +0040 +B6E0 +4900 +4900 +4900 +4900 +4900 +4900 +ENDCHAR +STARTCHAR U_33C4 +ENCODING 13252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 1 0 +BITMAP +30C0 +4920 +8200 +8200 +8200 +4920 +30C0 +ENDCHAR +STARTCHAR U_33CE +ENCODING 13262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 10 0 0 +BITMAP +8C10 +9630 +9550 +A550 +C550 +A490 +A490 +9490 +9490 +8C90 +ENDCHAR +STARTCHAR U_33D1 +ENCODING 13265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +C000 +4000 +4000 +4B00 +4480 +4480 +4480 +4480 +4480 +ECC0 +ENDCHAR +STARTCHAR U_33D2 +ENCODING 13266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 11 0 -1 +BITMAP +C000 +4000 +4000 +48D0 +5520 +5520 +5520 +54C0 +5520 +E920 +00C0 +ENDCHAR +STARTCHAR U_33D5 +ENCODING 13269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0060 +0120 +0020 +A920 +5520 +5520 +5520 +5520 +5520 +5520 +ENDCHAR +STARTCHAR U_33E0 +ENCODING 13280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +47C0 +C440 +4440 +4440 +47C0 +4440 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_33E1 +ENCODING 13281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +0A20 +0BE0 +3220 +4220 +8220 +83E0 +FA20 +ENDCHAR +STARTCHAR U_33E2 +ENCODING 13282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +0A20 +33E0 +0A20 +0A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E3 +ENCODING 13283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +13E0 +1220 +3220 +3220 +53E0 +5220 +9220 +FA20 +13E0 +1220 +ENDCHAR +STARTCHAR U_33E4 +ENCODING 13284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8220 +8220 +8220 +F3E0 +8A20 +0A20 +0A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E5 +ENCODING 13285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8220 +F3E0 +8A20 +8A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E6 +ENCODING 13286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8A20 +0A20 +1220 +13E0 +1220 +2220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_33E7 +ENCODING 13287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8A20 +73E0 +8A20 +8A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E8 +ENCODING 13288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8A20 +8BE0 +7A20 +0A20 +0A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E9 +ENCODING 13289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4CE0 +D2A0 +52A0 +52A0 +52E0 +52A0 +52A0 +52A0 +52E0 +4CA0 +ENDCHAR +STARTCHAR U_33EA +ENCODING 13290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D920 +4920 +4920 +49E0 +4920 +4920 +4920 +49E0 +4920 +ENDCHAR +STARTCHAR U_33EB +ENCODING 13291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +4520 +45E0 +4920 +4920 +5120 +51E0 +5D20 +ENDCHAR +STARTCHAR U_33EC +ENCODING 13292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +4520 +49E0 +4520 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33ED +ENCODING 13293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +C4A0 +4CA0 +4CA0 +54E0 +54A0 +54A0 +5EA0 +44E0 +44A0 +ENDCHAR +STARTCHAR U_33EE +ENCODING 13294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +5DE0 +D120 +5120 +5920 +55E0 +4520 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33EF +ENCODING 13295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5120 +59E0 +5520 +5520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F0 +ENCODING 13296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +5EE0 +D2A0 +42A0 +44A0 +44E0 +44A0 +44A0 +48A0 +48E0 +48A0 +ENDCHAR +STARTCHAR U_33F1 +ENCODING 13297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5520 +49E0 +5520 +5520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F2 +ENCODING 13298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5520 +55E0 +4D20 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F3 +ENCODING 13299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +2AE0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F4 +ENCODING 13300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +45E0 +AD20 +A520 +2520 +45E0 +4520 +4520 +8520 +85E0 +E520 +ENDCHAR +STARTCHAR U_33F5 +ENCODING 13301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +22A0 +22E0 +44A0 +44A0 +88A0 +88E0 +EEA0 +ENDCHAR +STARTCHAR U_33F6 +ENCODING 13302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +22A0 +24E0 +42A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F7 +ENCODING 13303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +42E0 +A2A0 +A6A0 +26A0 +2AE0 +4AA0 +4AA0 +8EA0 +82E0 +E2A0 +ENDCHAR +STARTCHAR U_33F8 +ENCODING 13304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4EE0 +A8A0 +A8A0 +2CA0 +2AE0 +42A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F9 +ENCODING 13305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +28A0 +2CE0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FA +ENCODING 13306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4EE0 +AAA0 +A2A0 +22A0 +24E0 +44A0 +44A0 +84A0 +84E0 +E4A0 +ENDCHAR +STARTCHAR U_33FB +ENCODING 13307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +24E0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FC +ENCODING 13308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +2AE0 +46A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FD +ENCODING 13309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +4AE0 +2AA0 +2AA0 +AAA0 +AAE0 +44A0 +ENDCHAR +STARTCHAR U_33FE +ENCODING 13310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +62E0 +96A0 +92A0 +12A0 +22E0 +12A0 +12A0 +92A0 +92E0 +62A0 +ENDCHAR +STARTCHAR U_3400 +ENCODING 13312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +1100 +1100 +1100 +1100 +F1E0 +1100 +1100 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3401 +ENCODING 13313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4A40 +5140 +6140 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_3402 +ENCODING 13314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +7C00 +0420 +23E0 +2100 +FBE0 +2100 +2920 +3120 +20E0 +ENDCHAR +STARTCHAR U_3403 +ENCODING 13315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +4040 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3404 +ENCODING 13316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +4400 +4400 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3405 +ENCODING 13317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +0100 +4100 +2200 +1200 +0C00 +0400 +0A00 +1100 +2080 +C080 +ENDCHAR +STARTCHAR U_3406 +ENCODING 13318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +3F00 +2000 +3F00 +2100 +3F00 +2100 +3F00 +2000 +3F80 +4080 +8300 +ENDCHAR +STARTCHAR U_3407 +ENCODING 13319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F00 +1120 +2120 +C0E0 +7F00 +0200 +3C40 +4040 +3FC0 +ENDCHAR +STARTCHAR U_3408 +ENCODING 13320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +3180 +C060 +7F80 +0100 +0E00 +3040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_3409 +ENCODING 13321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0200 +0200 +0A00 +0400 +7FC0 +0300 +1C20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340A +ENCODING 13322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3F80 +0000 +7FC0 +0180 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340B +ENCODING 13323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0000 +7FC0 +0180 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340C +ENCODING 13324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FC0 +4400 +8400 +27C0 +3C40 +E440 +2580 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340D +ENCODING 13325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +1C00 +E880 +4480 +2500 +FF80 +0100 +0E00 +7040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_340E +ENCODING 13326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +C060 +3F80 +0300 +1C20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340F +ENCODING 13327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +FFE0 +0000 +7FC0 +0100 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3410 +ENCODING 13328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +4A40 +3180 +CA60 +0000 +7F80 +0600 +1800 +2040 +1FC0 +ENDCHAR +STARTCHAR U_3411 +ENCODING 13329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +5100 +0E00 +F5E0 +0A00 +0400 +7FC0 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3412 +ENCODING 13330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1040 +2080 +FFC0 +2040 +3FC0 +0000 +7FC0 +0C00 +3020 +1FE0 +ENDCHAR +STARTCHAR U_3413 +ENCODING 13331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0080 +3C80 +2480 +3C80 +0080 +FFE0 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3414 +ENCODING 13332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +0000 +3E00 +2200 +3E00 +0000 +FE00 +0800 +1080 +1F80 +ENDCHAR +STARTCHAR U_3415 +ENCODING 13333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FF80 +0600 +0840 +1FC0 +ENDCHAR +STARTCHAR U_3416 +ENCODING 13334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FD00 +1100 +7D00 +0100 +7D00 +4500 +4520 +4520 +7CE0 +ENDCHAR +STARTCHAR U_3417 +ENCODING 13335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +1F80 +0500 +FFE0 +1900 +6A40 +8FC0 +0000 +3FA0 +0C20 +7FE0 +ENDCHAR +STARTCHAR U_3418 +ENCODING 13336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +0D00 +1480 +6440 +1F00 +0200 +0C00 +3020 +3FE0 +ENDCHAR +STARTCHAR U_3419 +ENCODING 13337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2080 +3F80 +1100 +FFE0 +0000 +3FC0 +0180 +0E00 +7020 +3FE0 +ENDCHAR +STARTCHAR U_341A +ENCODING 13338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +FFE0 +1100 +7FC0 +0200 +1C20 +6020 +3FE0 +ENDCHAR +STARTCHAR U_341B +ENCODING 13339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2FE0 +E400 +2BC0 +2240 +23C0 +7FC0 +0300 +0C00 +3040 +3FC0 +ENDCHAR +STARTCHAR U_341C +ENCODING 13340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2100 +FBC0 +2140 +A940 +7140 +2140 +7140 +AA40 +2240 +6460 +ENDCHAR +STARTCHAR U_341D +ENCODING 13341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7E0 +2820 +F720 +2520 +6760 +3F80 +0300 +1C00 +6040 +7FC0 +ENDCHAR +STARTCHAR U_341E +ENCODING 13342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +FFE0 +2080 +5F40 +8220 +0C40 +1FC0 +ENDCHAR +STARTCHAR U_341F +ENCODING 13343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +F3C0 +1200 +7380 +1200 +F3C0 +0000 +7F80 +0C20 +3020 +1FE0 +ENDCHAR +STARTCHAR U_3420 +ENCODING 13344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +5480 +FC80 +0880 +7C80 +10A0 +10E0 +3F00 +0600 +1840 +3FC0 +ENDCHAR +STARTCHAR U_3421 +ENCODING 13345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +FFE0 +5AA0 +5AA0 +5100 +57C0 +5100 +5280 +5460 +8FE0 +ENDCHAR +STARTCHAR U_3422 +ENCODING 13346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8FC0 +4080 +2FE0 +C100 +4200 +7F80 +0C20 +3020 +7FE0 +ENDCHAR +STARTCHAR U_3423 +ENCODING 13347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4780 +4820 +9FE0 +ENDCHAR +STARTCHAR U_3424 +ENCODING 13348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5440 +57C0 +5440 +5FE0 +5280 +5440 +9FE0 +ENDCHAR +STARTCHAR U_3425 +ENCODING 13349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +AE80 +5BE0 +EEA0 +4AA0 +FF40 +0000 +7F80 +0C20 +1020 +3FE0 +ENDCHAR +STARTCHAR U_3426 +ENCODING 13350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +4A40 +FFE0 +2480 +C460 +3F80 +0600 +1820 +3FE0 +ENDCHAR +STARTCHAR U_3427 +ENCODING 13351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1A00 +0A00 +0200 +FFE0 +0640 +0A00 +1200 +2200 +CA00 +0400 +ENDCHAR +STARTCHAR U_3428 +ENCODING 13352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1040 +5140 +6180 +FBE0 +28A0 +2080 +2080 +2080 +2080 +6180 +ENDCHAR +STARTCHAR U_3429 +ENCODING 13353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5140 +FBE0 +5140 +5140 +5140 +FBE0 +5140 +5140 +5140 +9640 +ENDCHAR +STARTCHAR U_342A +ENCODING 13354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_342B +ENCODING 13355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +5140 +4A40 +4440 +4A40 +5140 +4040 +7FC0 +ENDCHAR +STARTCHAR U_342C +ENCODING 13356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1000 +2080 +7FC0 +0020 +2480 +2480 +2480 +44A0 +84E0 +ENDCHAR +STARTCHAR U_342D +ENCODING 13357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +7FC0 +4040 +5F40 +5140 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_342E +ENCODING 13358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +BFA0 +0A00 +3F80 +0A00 +7FC0 +3480 +D300 +19E0 +ENDCHAR +STARTCHAR U_342F +ENCODING 13359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +4040 +7FC0 +0400 +7FC0 +1500 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3430 +ENCODING 13360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2420 +2420 +6420 +A420 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3431 +ENCODING 13361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1400 +2300 +48E0 +9200 +2480 +0900 +3200 +0400 +7800 +ENDCHAR +STARTCHAR U_3432 +ENCODING 13362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6FE0 +A100 +2100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3433 +ENCODING 13363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2280 +2280 +6280 +A280 +2480 +24A0 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_3434 +ENCODING 13364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2420 +6420 +AA40 +2140 +2080 +2080 +2100 +2600 +ENDCHAR +STARTCHAR U_3435 +ENCODING 13365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +17C0 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2300 +0100 +ENDCHAR +STARTCHAR U_3436 +ENCODING 13366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +6440 +A7C0 +2400 +2400 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_3437 +ENCODING 13367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1040 +2440 +6440 +A440 +27E0 +2020 +2FA0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_3438 +ENCODING 13368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +6920 +A940 +2100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3439 +ENCODING 13369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17E0 +2400 +6BC0 +A000 +2F80 +2080 +2080 +2080 +20A0 +2060 +ENDCHAR +STARTCHAR U_343A +ENCODING 13370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4880 +D880 +4880 +4880 +4880 +4940 +4940 +4A20 +4A20 +ENDCHAR +STARTCHAR U_343B +ENCODING 13371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6FE0 +A920 +2920 +2920 +2AA0 +2C60 +2820 +2860 +ENDCHAR +STARTCHAR U_343C +ENCODING 13372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1640 +2240 +6240 +AFE0 +2240 +2240 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_343D +ENCODING 13373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +66C0 +A540 +2540 +26C0 +2440 +2440 +2840 +3020 +ENDCHAR +STARTCHAR U_343E +ENCODING 13374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1000 +2000 +6FE0 +A280 +2280 +2280 +2280 +24A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_343F +ENCODING 13375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +6100 +A7C0 +2100 +2100 +2FE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_3440 +ENCODING 13376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4200 +5FE0 +C200 +4500 +4500 +4480 +4880 +4A40 +5120 +ENDCHAR +STARTCHAR U_3441 +ENCODING 13377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2920 +6920 +AFE0 +2100 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3442 +ENCODING 13378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +6100 +AFE0 +2920 +2920 +2AA0 +2C60 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3443 +ENCODING 13379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +29E0 +6AA0 +AEA0 +22A0 +24A0 +28A0 +2BA0 +2D20 +2260 +ENDCHAR +STARTCHAR U_3444 +ENCODING 13380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4A40 +C940 +5FE0 +4840 +4A40 +5140 +5FE0 +4040 +40C0 +ENDCHAR +STARTCHAR U_3445 +ENCODING 13381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +6900 +B100 +2100 +21C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3446 +ENCODING 13382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +2440 +67C0 +A280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_3447 +ENCODING 13383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +6080 +AFE0 +2020 +2020 +27E0 +2020 +2020 +2FE0 +ENDCHAR +STARTCHAR U_3448 +ENCODING 13384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6200 +A400 +2500 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3449 +ENCODING 13385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +6FC0 +AA40 +2BC0 +2CC0 +2AC0 +2940 +2940 +2A40 +3420 +ENDCHAR +STARTCHAR U_344A +ENCODING 13386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +6280 +A280 +2AC0 +2AA0 +32A0 +2280 +2480 +2480 +2980 +ENDCHAR +STARTCHAR U_344B +ENCODING 13387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2280 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_344C +ENCODING 13388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +6BE0 +A880 +2880 +2BE0 +2880 +2880 +2BE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_344D +ENCODING 13389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FC0 +A100 +3FE0 +2380 +2540 +2520 +2920 +2100 +ENDCHAR +STARTCHAR U_344E +ENCODING 13390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +1540 +2A80 +6540 +A540 +2000 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_344F +ENCODING 13391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2820 +6080 +AFE0 +2080 +2480 +2280 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_3450 +ENCODING 13392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21C0 +6100 +A100 +2FE0 +2100 +2540 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3451 +ENCODING 13393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1400 +2FE0 +6820 +AFE0 +2820 +2820 +2FE0 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3452 +ENCODING 13394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0400 +3F80 +2480 +3F80 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3453 +ENCODING 13395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +6440 +AFA0 +2200 +2FE0 +2200 +25C0 +2540 +2880 +3360 +ENDCHAR +STARTCHAR U_3454 +ENCODING 13396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +6FE0 +A820 +2920 +2920 +2920 +2920 +2240 +2C20 +ENDCHAR +STARTCHAR U_3455 +ENCODING 13397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +1540 +2540 +67C0 +A200 +27C0 +2840 +2240 +2180 +2100 +2E00 +ENDCHAR +STARTCHAR U_3456 +ENCODING 13398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2880 +7BE0 +AAA0 +2AA0 +2AA0 +2BE0 +2880 +2880 +2880 +ENDCHAR +STARTCHAR U_3457 +ENCODING 13399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2440 +67C0 +A440 +27C0 +2440 +27E0 +2CC0 +2340 +2CC0 +ENDCHAR +STARTCHAR U_3458 +ENCODING 13400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +1080 +2FE0 +6080 +AAA0 +2AA0 +3FC0 +2A80 +2AC0 +3160 +2220 +ENDCHAR +STARTCHAR U_3459 +ENCODING 13401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2A00 +6E80 +AA80 +2E80 +2A80 +2A80 +2E80 +3A80 +22A0 +22E0 +ENDCHAR +STARTCHAR U_345A +ENCODING 13402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +CAA0 +5EA0 +4AC0 +4AA0 +5EA0 +4AA0 +4AE0 +5280 +6680 +ENDCHAR +STARTCHAR U_345B +ENCODING 13403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FE0 +A920 +2920 +2FE0 +2380 +2540 +2540 +2920 +ENDCHAR +STARTCHAR U_345C +ENCODING 13404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1460 +1580 +2F00 +65E0 +A540 +2740 +2D40 +2540 +2540 +2540 +2E40 +ENDCHAR +STARTCHAR U_345D +ENCODING 13405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +27E0 +2100 +6FE0 +A000 +2240 +2FE0 +2240 +2240 +2C40 +ENDCHAR +STARTCHAR U_345E +ENCODING 13406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +2100 +2280 +6C60 +A240 +2FE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_345F +ENCODING 13407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1600 +2400 +67C0 +A480 +2480 +2480 +2FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_3460 +ENCODING 13408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1BE0 +2AA0 +6A40 +AAA0 +2320 +2000 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3461 +ENCODING 13409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +6AA0 +AEA0 +2AA0 +2EA0 +28E0 +2CA0 +2A80 +2E80 +2880 +ENDCHAR +STARTCHAR U_3462 +ENCODING 13410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14E0 +24A0 +7FA0 +A4A0 +24A0 +3FA0 +24E0 +28A0 +2A80 +2B80 +2C80 +ENDCHAR +STARTCHAR U_3463 +ENCODING 13411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2480 +7FE0 +A480 +2D80 +2FC0 +2DA0 +36A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_3464 +ENCODING 13412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2240 +6000 +AFE0 +2920 +2920 +2FE0 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3465 +ENCODING 13413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +27C0 +6440 +A7C0 +2800 +2FE0 +34A0 +24A0 +2920 +2260 +ENDCHAR +STARTCHAR U_3466 +ENCODING 13414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2E00 +6800 +AFE0 +2820 +2FE0 +2940 +2FE0 +2900 +2A80 +3460 +ENDCHAR +STARTCHAR U_3467 +ENCODING 13415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +4380 +CD60 +4100 +47C0 +4080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3468 +ENCODING 13416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +67C0 +A400 +27C0 +2900 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_3469 +ENCODING 13417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +4FE0 +4200 +C7C0 +4440 +4A40 +4180 +4300 +5C00 +ENDCHAR +STARTCHAR U_346A +ENCODING 13418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +6380 +A440 +3C60 +27C0 +2440 +27C0 +2440 +2840 +ENDCHAR +STARTCHAR U_346B +ENCODING 13419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1300 +1480 +2A60 +6100 +A780 +2080 +2360 +2900 +2A20 +21C0 +ENDCHAR +STARTCHAR U_346C +ENCODING 13420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4BE0 +FC80 +5480 +55E0 +5520 +4920 +5520 +5520 +61E0 +ENDCHAR +STARTCHAR U_346D +ENCODING 13421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +6540 +A7C0 +2000 +2FE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_346E +ENCODING 13422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2100 +6FE0 +A100 +27C0 +2540 +27C0 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_346F +ENCODING 13423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1200 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +27C0 +2240 +2420 +ENDCHAR +STARTCHAR U_3470 +ENCODING 13424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4440 +4F80 +C080 +5FE0 +4440 +5B80 +4540 +5940 +4320 +ENDCHAR +STARTCHAR U_3471 +ENCODING 13425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +2100 +5FE0 +4540 +DB00 +4100 +5FE0 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_3472 +ENCODING 13426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FE0 +AAA0 +2FE0 +2920 +2FE0 +2920 +2920 +2960 +ENDCHAR +STARTCHAR U_3473 +ENCODING 13427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5AA0 +CFA0 +4260 +4400 +4FE0 +5AA0 +4FA0 +4220 +4C60 +ENDCHAR +STARTCHAR U_3474 +ENCODING 13428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2FC0 +4080 +DFE0 +5220 +4FC0 +4A40 +5FC0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_3475 +ENCODING 13429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +2400 +3500 +6DE0 +A680 +2C80 +37E0 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_3476 +ENCODING 13430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5000 +CFC0 +4000 +7FC0 +5540 +4440 +5FC0 +4440 +5560 +ENDCHAR +STARTCHAR U_3477 +ENCODING 13431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3280 +5EE0 +C080 +5EE0 +5200 +5E80 +52E0 +5E80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3478 +ENCODING 13432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +67C0 +A440 +3FE0 +2040 +2F40 +2940 +2F40 +20C0 +ENDCHAR +STARTCHAR U_3479 +ENCODING 13433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E0E0 +3F80 +4440 +7FC0 +4440 +7FC0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_347A +ENCODING 13434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +5880 +CFE0 +4880 +4FE0 +5FC0 +4880 +49E0 +5020 +60C0 +ENDCHAR +STARTCHAR U_347B +ENCODING 13435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A20 +4480 +D560 +43C0 +4C00 +4100 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_347C +ENCODING 13436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2360 +5FA0 +D540 +55A0 +5F00 +55E0 +55A0 +5FA0 +40A0 +40E0 +ENDCHAR +STARTCHAR U_347D +ENCODING 13437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +6820 +A7C0 +2440 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_347E +ENCODING 13438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2DE0 +5240 +C980 +5E00 +4100 +5FE0 +4000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_347F +ENCODING 13439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +2540 +4FE0 +C920 +4FE0 +4920 +4FE0 +4100 +4FE0 +4540 +ENDCHAR +STARTCHAR U_3480 +ENCODING 13440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +6FE0 +A920 +2FE0 +2920 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3481 +ENCODING 13441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +6FE0 +A920 +2FE0 +2AA0 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3482 +ENCODING 13442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1EE0 +2440 +6120 +AFE0 +2140 +2FE0 +2640 +2BC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_3483 +ENCODING 13443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4100 +DE80 +4080 +5E80 +5280 +5E80 +5280 +5EA0 +7340 +ENDCHAR +STARTCHAR U_3484 +ENCODING 13444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +28A0 +4E80 +CBE0 +5680 +6D40 +4A20 +5420 +4000 +4D40 +52A0 +ENDCHAR +STARTCHAR U_3485 +ENCODING 13445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +6DC0 +A340 +2E40 +2180 +2E00 +22A0 +2640 +2B20 +ENDCHAR +STARTCHAR U_3486 +ENCODING 13446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +3CE0 +4FC0 +C840 +4FC0 +5EE0 +4220 +5BA0 +4220 +4AA0 +5760 +ENDCHAR +STARTCHAR U_3487 +ENCODING 13447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5540 +D540 +7FE0 +5540 +5540 +7FE0 +4000 +5540 +62A0 +ENDCHAR +STARTCHAR U_3488 +ENCODING 13448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +2480 +7FE0 +D540 +5F40 +5540 +5D40 +5480 +7F40 +4540 +4620 +ENDCHAR +STARTCHAR U_3489 +ENCODING 13449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +5FE0 +D020 +47C0 +4440 +47C0 +4100 +5FE0 +4100 +4940 +ENDCHAR +STARTCHAR U_348A +ENCODING 13450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2AA0 +5BA0 +CAA0 +4AA0 +5560 +4440 +5660 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_348B +ENCODING 13451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +3F80 +4A80 +CEE0 +4AA0 +4EA0 +4AA0 +5FA0 +40A0 +4AA0 +5120 +ENDCHAR +STARTCHAR U_348C +ENCODING 13452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3540 +4EE0 +C440 +4AA0 +5FE0 +5020 +4780 +4480 +44A0 +58E0 +ENDCHAR +STARTCHAR U_348D +ENCODING 13453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4FC0 +C880 +5320 +5FE0 +4480 +4D00 +4240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_348E +ENCODING 13454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2200 +5FC0 +C500 +4880 +5DE0 +4500 +5DC0 +4500 +5DC0 +4500 +ENDCHAR +STARTCHAR U_348F +ENCODING 13455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +54A0 +CFC0 +4480 +5FE0 +4480 +5FE0 +4B40 +5020 +4780 +ENDCHAR +STARTCHAR U_3490 +ENCODING 13456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +5540 +C800 +4FE0 +5020 +4F20 +4920 +4F20 +4920 +4F60 +ENDCHAR +STARTCHAR U_3491 +ENCODING 13457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +3140 +5A40 +D7E0 +5A40 +57E0 +5240 +57E0 +5A40 +5BE0 +5FE0 +ENDCHAR +STARTCHAR U_3492 +ENCODING 13458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +46C0 +DFE0 +4440 +4FE0 +4100 +47C0 +4100 +5FE0 +4940 +ENDCHAR +STARTCHAR U_3493 +ENCODING 13459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +4080 +DBE0 +4940 +4BE0 +5080 +4BE0 +4880 +4880 +57E0 +ENDCHAR +STARTCHAR U_3494 +ENCODING 13460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FE0 +C400 +4FE0 +5220 +4FA0 +4AA0 +4FA0 +4260 +5FE0 +ENDCHAR +STARTCHAR U_3495 +ENCODING 13461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4940 +CBE0 +5540 +49E0 +4940 +55E0 +4D40 +45E0 +5900 +ENDCHAR +STARTCHAR U_3496 +ENCODING 13462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +CFC0 +4A40 +4FC0 +4A40 +5FE0 +52A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3497 +ENCODING 13463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4480 +C780 +4480 +5FE0 +57A0 +4200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_3498 +ENCODING 13464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +34A0 +5EA0 +D240 +5E40 +54A0 +5F20 +4100 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_3499 +ENCODING 13465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BE0 +5220 +D7E0 +4A20 +4BE0 +5480 +4BE0 +42A0 +56A0 +5080 +ENDCHAR +STARTCHAR U_349A +ENCODING 13466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5FE0 +C100 +5FE0 +4040 +5FE0 +4040 +4FC0 +5520 +67A0 +ENDCHAR +STARTCHAR U_349B +ENCODING 13467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4AA0 +C660 +4AA0 +4900 +5FE0 +4900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_349C +ENCODING 13468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E60 +2BA0 +4E60 +CBA0 +4CE0 +4AA0 +4AA0 +5FE0 +4000 +4840 +5020 +ENDCHAR +STARTCHAR U_349D +ENCODING 13469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3DC0 +4500 +DFC0 +5540 +5FC0 +4280 +5FE0 +5940 +55A0 +62C0 +ENDCHAR +STARTCHAR U_349E +ENCODING 13470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +4500 +DFE0 +4900 +4FE0 +4900 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_349F +ENCODING 13471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4900 +CFC0 +4900 +4FE0 +5520 +5560 +4E40 +5980 +4C60 +ENDCHAR +STARTCHAR U_34A0 +ENCODING 13472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +16E0 +24A0 +2F40 +7AA0 +A6C0 +2A80 +3EE0 +2280 +2EE0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_34A1 +ENCODING 13473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2C80 +22E0 +6E40 +6080 +AEE0 +3440 +2EC0 +2560 +2A40 +2EC0 +ENDCHAR +STARTCHAR U_34A2 +ENCODING 13474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2700 +2A80 +5FC0 +7560 +DFC0 +4000 +5FC0 +5540 +5FC0 +5540 +50C0 +ENDCHAR +STARTCHAR U_34A3 +ENCODING 13475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +5540 +D7E0 +5D40 +55E0 +5540 +55E0 +5280 +5620 +6BC0 +ENDCHAR +STARTCHAR U_34A4 +ENCODING 13476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2880 +4F80 +7FE0 +C080 +7FE0 +5540 +5DC0 +5540 +7FE0 +4440 +ENDCHAR +STARTCHAR U_34A5 +ENCODING 13477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AA0 +7FE0 +6AA0 +FFE0 +6AA0 +7FE0 +5FC0 +5040 +5FC0 +4880 +7FE0 +ENDCHAR +STARTCHAR U_34A6 +ENCODING 13478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +4A80 +4F80 +CA80 +7FE0 +6AA0 +7FE0 +6AA0 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_34A7 +ENCODING 13479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5D40 +4B00 +D5E0 +5D40 +49E0 +5D40 +55E0 +5540 +5DE0 +5500 +ENDCHAR +STARTCHAR U_34A8 +ENCODING 13480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A60 +57A0 +5DE0 +D6A0 +5DE0 +4680 +5FE0 +4D40 +5720 +4440 +47C0 +ENDCHAR +STARTCHAR U_34A9 +ENCODING 13481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +5FE0 +4540 +DA80 +4540 +5FE0 +5540 +5FE0 +4440 +5EE0 +ENDCHAR +STARTCHAR U_34AA +ENCODING 13482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +1980 +6060 +FBC0 +4200 +7BC0 +2000 +B7E0 +A140 +BAA0 +C580 +ENDCHAR +STARTCHAR U_34AB +ENCODING 13483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3FC0 +2000 +3F80 +2000 +FFE0 +1200 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_34AC +ENCODING 13484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +0080 +0080 +FBE0 +5080 +5080 +53E0 +5000 +8820 +87E0 +ENDCHAR +STARTCHAR U_34AD +ENCODING 13485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8A20 +8A20 +FBE0 +5140 +5140 +5140 +5A40 +9240 +8460 +ENDCHAR +STARTCHAR U_34AE +ENCODING 13486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03C0 +7100 +06A0 +F9C0 +5280 +55E0 +52A0 +5180 +8820 +87E0 +ENDCHAR +STARTCHAR U_34AF +ENCODING 13487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +B440 +6FE0 +2540 +FFE0 +5540 +5FE0 +5900 +57C0 +8100 +ENDCHAR +STARTCHAR U_34B0 +ENCODING 13488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +0400 +0A00 +1100 +2080 +C060 +3F80 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_34B1 +ENCODING 13489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +1100 +2480 +CF60 +1100 +6D00 +0200 +0C00 +7000 +ENDCHAR +STARTCHAR U_34B2 +ENCODING 13490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +3180 +C060 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_34B3 +ENCODING 13491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +C620 +A520 +A520 +D6A0 +CE60 +8420 +84A0 +8040 +ENDCHAR +STARTCHAR U_34B4 +ENCODING 13492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0600 +1900 +60C0 +8420 +2480 +2480 +3F80 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_34B5 +ENCODING 13493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +7F80 +4080 +7F80 +4080 +7F80 +0000 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_34B6 +ENCODING 13494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1100 +1100 +2080 +C860 +1000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_34B7 +ENCODING 13495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2A80 +3280 +2080 +FFE0 +0000 +1100 +60C0 +ENDCHAR +STARTCHAR U_34B8 +ENCODING 13496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0400 +0840 +7480 +0B00 +7280 +0640 +FA20 +0600 +ENDCHAR +STARTCHAR U_34B9 +ENCODING 13497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +8A20 +AAA0 +AAA0 +AAA0 +FFE0 +5140 +8A20 +ENDCHAR +STARTCHAR U_34BA +ENCODING 13498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +8A20 +FFE0 +8420 +A420 +AA20 +B120 +A020 +BFA0 +8060 +ENDCHAR +STARTCHAR U_34BB +ENCODING 13499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8080 +BE80 +8080 +7F00 +4100 +7F00 +4100 +7F00 +2240 +C3C0 +ENDCHAR +STARTCHAR U_34BC +ENCODING 13500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +7FC0 +6640 +5540 +6EC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_34BD +ENCODING 13501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +1500 +3F80 +0800 +7FC0 +2080 +DF60 +1140 +1FC0 +ENDCHAR +STARTCHAR U_34BE +ENCODING 13502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +2400 +F7E0 +4A80 +77E0 +52A0 +52A0 +5200 +B1E0 +ENDCHAR +STARTCHAR U_34BF +ENCODING 13503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +2180 +FBE0 +DE80 +ABE0 +FA80 +ABE0 +FA80 +8BE0 +ENDCHAR +STARTCHAR U_34C0 +ENCODING 13504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +8440 +0400 +0600 +0500 +0480 +0480 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_34C1 +ENCODING 13505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 3 +BITMAP +7FE0 +4040 +9100 +1080 +2040 +4040 +ENDCHAR +STARTCHAR U_34C2 +ENCODING 13506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +B920 +07E0 +F940 +5240 +5440 +5280 +5100 +56E0 +8FE0 +ENDCHAR +STARTCHAR U_34C3 +ENCODING 13507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9020 +78C0 +0700 +7900 +0100 +79C0 +0700 +7900 +4920 +78E0 +ENDCHAR +STARTCHAR U_34C4 +ENCODING 13508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4BE0 +FAA0 +4AA0 +9480 +FC80 +20C0 +DCC0 +3140 +4940 +F660 +ENDCHAR +STARTCHAR U_34C5 +ENCODING 13509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FE0 +2100 +2100 +0100 +0100 +2100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_34C6 +ENCODING 13510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2500 +0880 +3060 +0480 +4500 +4600 +C400 +4420 +47E0 +ENDCHAR +STARTCHAR U_34C7 +ENCODING 13511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +8F00 +4200 +0200 +1FE0 +0200 +2200 +4500 +4480 +8840 +1020 +ENDCHAR +STARTCHAR U_34C8 +ENCODING 13512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FE0 +4200 +0200 +0400 +0FC0 +1440 +4440 +4440 +87C0 +0400 +ENDCHAR +STARTCHAR U_34C9 +ENCODING 13513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +8F00 +4200 +0200 +1FE0 +0200 +2FC0 +4840 +4840 +8FC0 +0800 +ENDCHAR +STARTCHAR U_34CA +ENCODING 13514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0820 +0BA0 +0AA0 +2AA0 +CAA0 +4BA0 +4820 +4860 +ENDCHAR +STARTCHAR U_34CB +ENCODING 13515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4480 +2FC0 +2480 +0480 +0480 +3FE0 +C000 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_34CC +ENCODING 13516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +2500 +0880 +3060 +0F80 +2200 +CF80 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_34CD +ENCODING 13517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +2400 +2480 +08C0 +0F40 +2500 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_34CE +ENCODING 13518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4040 +2FE0 +2040 +1FE0 +1020 +2FC0 +C440 +4280 +4100 +4EE0 +ENDCHAR +STARTCHAR U_34CF +ENCODING 13519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +54A0 +1860 +1020 +57A0 +54A0 +D4A0 +57A0 +5020 +5060 +ENDCHAR +STARTCHAR U_34D0 +ENCODING 13520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +2100 +2FE0 +0440 +0440 +2960 +C100 +47C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_34D1 +ENCODING 13521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +2100 +2FE0 +0440 +0FE0 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_34D2 +ENCODING 13522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +22E0 +1F00 +E220 +41E0 +0400 +1B00 +E4E0 +2480 +4540 +0C80 +ENDCHAR +STARTCHAR U_34D3 +ENCODING 13523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2100 +2FE0 +0AA0 +0FE0 +2920 +CFE0 +4920 +4920 +4960 +ENDCHAR +STARTCHAR U_34D4 +ENCODING 13524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4E40 +2BE0 +2E40 +0A40 +0F40 +2AC0 +DE40 +4640 +4A40 +56C0 +ENDCHAR +STARTCHAR U_34D5 +ENCODING 13525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +2880 +2F80 +0AA0 +0FA0 +2A40 +CA40 +4D40 +50E0 +5320 +ENDCHAR +STARTCHAR U_34D6 +ENCODING 13526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5240 +5FC0 +1240 +1FC0 +0A80 +3FE0 +CA80 +5FC0 +4200 +5FC0 +ENDCHAR +STARTCHAR U_34D7 +ENCODING 13527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +5EA0 +44A0 +1EA0 +0520 +1E60 +44A0 +CF00 +4240 +5FA0 +4A80 +ENDCHAR +STARTCHAR U_34D8 +ENCODING 13528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5F40 +4840 +77C0 +5540 +7E40 +5F40 +4440 +5F40 +8460 +BFA0 +ENDCHAR +STARTCHAR U_34D9 +ENCODING 13529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +8420 +BFA0 +9120 +8A20 +8A20 +8420 +8A20 +9120 +A0A0 +FFE0 +ENDCHAR +STARTCHAR U_34DA +ENCODING 13530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7C20 +1120 +1120 +1120 +1120 +1520 +1920 +F020 +40A0 +0040 +ENDCHAR +STARTCHAR U_34DB +ENCODING 13531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03E0 +7D20 +1120 +1120 +1120 +1520 +F920 +4220 +04A0 +1840 +ENDCHAR +STARTCHAR U_34DC +ENCODING 13532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4920 +9120 +E120 +2120 +4120 +8920 +F620 +04A0 +1840 +ENDCHAR +STARTCHAR U_34DD +ENCODING 13533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2920 +7D20 +2920 +2920 +2920 +7D20 +2920 +2820 +48A0 +8840 +ENDCHAR +STARTCHAR U_34DE +ENCODING 13534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3920 +E120 +2120 +3920 +E120 +2120 +3920 +E220 +24A0 +2840 +ENDCHAR +STARTCHAR U_34DF +ENCODING 13535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +4AA0 +48A0 +7EA0 +62A0 +54A0 +48A0 +5420 +A220 +8060 +ENDCHAR +STARTCHAR U_34E0 +ENCODING 13536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2020 +3D20 +2120 +2120 +2120 +FD20 +8520 +8420 +FCE0 +8440 +ENDCHAR +STARTCHAR U_34E1 +ENCODING 13537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6020 +4020 +7EA0 +90A0 +10A0 +FEA0 +10A0 +92A0 +9220 +92E0 +FE40 +ENDCHAR +STARTCHAR U_34E2 +ENCODING 13538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4020 +7EA0 +C4A0 +24A0 +18A0 +66A0 +82A0 +7C20 +44E0 +7C40 +ENDCHAR +STARTCHAR U_34E3 +ENCODING 13539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +2920 +4520 +8320 +7D20 +0120 +7D20 +4420 +44E0 +7C20 +ENDCHAR +STARTCHAR U_34E4 +ENCODING 13540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +10A0 +FEA0 +10A0 +7CA0 +00A0 +7CA0 +4420 +44E0 +7C20 +ENDCHAR +STARTCHAR U_34E5 +ENCODING 13541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2420 +AD20 +7120 +2120 +FD20 +0520 +FD20 +0420 +FDE0 +0040 +ENDCHAR +STARTCHAR U_34E6 +ENCODING 13542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +1020 +2120 +4120 +FD20 +8520 +8520 +FD20 +8420 +85E0 +FC40 +ENDCHAR +STARTCHAR U_34E7 +ENCODING 13543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +52A0 +88A0 +7CA0 +08A0 +10A0 +7C20 +44A0 +7C40 +ENDCHAR +STARTCHAR U_34E8 +ENCODING 13544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +FEA0 +10A0 +54A0 +54A0 +BAA0 +92A0 +2820 +44E0 +8440 +ENDCHAR +STARTCHAR U_34E9 +ENCODING 13545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3C20 +48A0 +90A0 +7EA0 +52A0 +7EA0 +52A0 +7EA0 +5220 +9660 +ENDCHAR +STARTCHAR U_34EA +ENCODING 13546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +8920 +F920 +8920 +F920 +8120 +A120 +9120 +EA20 +8C60 +ENDCHAR +STARTCHAR U_34EB +ENCODING 13547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +28A0 +44A0 +82A0 +7CA0 +28A0 +FEA0 +28A0 +2820 +4860 +ENDCHAR +STARTCHAR U_34EC +ENCODING 13548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +5420 +FEA0 +10A0 +FEA0 +28A0 +44A0 +FEA0 +24A0 +2420 +CC60 +ENDCHAR +STARTCHAR U_34ED +ENCODING 13549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +7CA0 +44A0 +7CA0 +20A0 +7EA0 +D2A0 +6AA0 +7A20 +0660 +ENDCHAR +STARTCHAR U_34EE +ENCODING 13550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +9220 +BAA0 +92A0 +FEA0 +82A0 +BAA0 +AAA0 +BA20 +8220 +8660 +ENDCHAR +STARTCHAR U_34EF +ENCODING 13551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2A20 +5420 +A8A0 +54A0 +2AA0 +FEA0 +92A0 +FEA0 +9220 +FE60 +ENDCHAR +STARTCHAR U_34F0 +ENCODING 13552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +1020 +7CA0 +54A0 +D6A0 +FEA0 +D6A0 +D6A0 +FE20 +8220 +FE60 +ENDCHAR +STARTCHAR U_34F1 +ENCODING 13553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +C6A0 +78A0 +02A0 +E2A0 +AAA0 +EAA0 +AA20 +E220 +A660 +ENDCHAR +STARTCHAR U_34F2 +ENCODING 13554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +7020 +40A0 +7EA0 +42A0 +7EA0 +40A0 +7EA0 +6A20 +7E20 +AA60 +ENDCHAR +STARTCHAR U_34F3 +ENCODING 13555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +7CA0 +44A0 +7CA0 +00A0 +FEA0 +10A0 +5C20 +5020 +BE60 +ENDCHAR +STARTCHAR U_34F4 +ENCODING 13556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +2020 +FEA0 +AAA0 +AAA0 +AAA0 +10A0 +FEA0 +1020 +28A0 +C640 +ENDCHAR +STARTCHAR U_34F5 +ENCODING 13557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AA20 +EEA0 +00A0 +7CA0 +00A0 +FEA0 +20A0 +3C20 +0420 +3860 +ENDCHAR +STARTCHAR U_34F6 +ENCODING 13558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E20 +EA20 +4AA0 +EAA0 +4AA0 +F6A0 +50A0 +FEA0 +2820 +4420 +8260 +ENDCHAR +STARTCHAR U_34F7 +ENCODING 13559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7C20 +44A0 +7CA0 +44A0 +7CA0 +10A0 +FEA0 +1020 +5420 +9260 +ENDCHAR +STARTCHAR U_34F8 +ENCODING 13560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AA20 +AAA0 +EEA0 +28A0 +EEA0 +82A0 +EEA0 +2820 +2820 +FE60 +ENDCHAR +STARTCHAR U_34F9 +ENCODING 13561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F20 +4820 +6AA0 +5CA0 +48A0 +76A0 +48A0 +6AA0 +5C20 +4820 +B660 +ENDCHAR +STARTCHAR U_34FA +ENCODING 13562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +0820 +7EA0 +4AA0 +7CA0 +48A0 +7EA0 +54A0 +5420 +4820 +B660 +ENDCHAR +STARTCHAR U_34FB +ENCODING 13563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AA20 +AAA0 +FEA0 +00A0 +FEA0 +10A0 +5CA0 +5020 +5E20 +F060 +ENDCHAR +STARTCHAR U_34FC +ENCODING 13564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FF20 +38A0 +54A0 +92A0 +28A0 +C6A0 +92A0 +5420 +9220 +3060 +ENDCHAR +STARTCHAR U_34FD +ENCODING 13565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +FE20 +10A0 +FEA0 +82A0 +7CA0 +00A0 +FEA0 +1020 +5420 +9260 +ENDCHAR +STARTCHAR U_34FE +ENCODING 13566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +6AA0 +5CA0 +6AA0 +48A0 +5CA0 +6820 +BEA0 +8840 +ENDCHAR +STARTCHAR U_34FF +ENCODING 13567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +0820 +FFA0 +1CA0 +2AA0 +D5A0 +2AA0 +6BA0 +9C20 +2AA0 +1860 +ENDCHAR +STARTCHAR U_3500 +ENCODING 13568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +2220 +3EA0 +08A0 +FFA0 +3EA0 +22A0 +3EA0 +0820 +2AA0 +5960 +ENDCHAR +STARTCHAR U_3501 +ENCODING 13569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A6A0 +4320 +BD20 +00A0 +7EA0 +42A0 +7EA0 +4220 +24A0 +FF40 +ENDCHAR +STARTCHAR U_3502 +ENCODING 13570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +FEA0 +54A0 +92A0 +54A0 +64A0 +BEA0 +54A0 +5F20 +8460 +ENDCHAR +STARTCHAR U_3503 +ENCODING 13571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +9120 +F7E0 +4520 +97E0 +F400 +AFE0 +0000 +FFE0 +0820 +7060 +ENDCHAR +STARTCHAR U_3504 +ENCODING 13572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2820 +FEA0 +AAA0 +FEA0 +10A0 +54A0 +FEA0 +10A0 +5420 +9260 +ENDCHAR +STARTCHAR U_3505 +ENCODING 13573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +1420 +FEA0 +14A0 +7EA0 +52A0 +7EA0 +5220 +7620 +B260 +ENDCHAR +STARTCHAR U_3506 +ENCODING 13574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +EE20 +AAA0 +EEA0 +55A0 +AAA0 +7CA0 +44A0 +7C20 +44A0 +7C40 +ENDCHAR +STARTCHAR U_3507 +ENCODING 13575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA20 +2CA0 +ABA0 +44A0 +EEA0 +2AA0 +F1A0 +8EA0 +EA20 +24A0 +6B40 +ENDCHAR +STARTCHAR U_3508 +ENCODING 13576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FE20 +28A0 +00A0 +28A0 +EEA0 +28A0 +EEA0 +2820 +EE20 +2860 +ENDCHAR +STARTCHAR U_3509 +ENCODING 13577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +5CA0 +6AA0 +7EA0 +48A0 +7E20 +AA20 +BEA0 +A240 +ENDCHAR +STARTCHAR U_350A +ENCODING 13578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +00A0 +FEA0 +BAA0 +82A0 +FEA0 +44A0 +7C20 +4420 +FE60 +ENDCHAR +STARTCHAR U_350B +ENCODING 13579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F420 +A720 +F420 +98A0 +F0A0 +A7A0 +F0A0 +00A0 +7F20 +5520 +FFE0 +ENDCHAR +STARTCHAR U_350C +ENCODING 13580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +A220 +EAA0 +A4A0 +EAA0 +30A0 +06A0 +F820 +5420 +BAA0 +1060 +ENDCHAR +STARTCHAR U_350D +ENCODING 13581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7720 +AAA0 +7EA0 +5AA0 +5AA0 +7EA0 +2420 +FE20 +24A0 +4440 +ENDCHAR +STARTCHAR U_350E +ENCODING 13582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +4140 +FBE0 +8880 +FBE0 +8880 +F880 +7FE0 +0820 +7060 +ENDCHAR +STARTCHAR U_350F +ENCODING 13583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +2020 +7EA0 +A2A0 +3EA0 +00A0 +FFA0 +44A0 +FF20 +5520 +7760 +ENDCHAR +STARTCHAR U_3510 +ENCODING 13584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7BA0 +A520 +FEA0 +28A0 +EEA0 +28A0 +EEA0 +2820 +EE20 +FE60 +ENDCHAR +STARTCHAR U_3511 +ENCODING 13585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +5100 +8080 +FBE0 +8940 +FBE0 +8880 +FFE0 +1020 +E060 +ENDCHAR +STARTCHAR U_3512 +ENCODING 13586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +FE20 +48A0 +FEA0 +48A0 +7EA0 +48A0 +FEA0 +BA20 +EE20 +BA60 +ENDCHAR +STARTCHAR U_3513 +ENCODING 13587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +F080 +13E0 +10A0 +FCA0 +10A0 +10A0 +10A0 +10A0 +1120 +1660 +ENDCHAR +STARTCHAR U_3514 +ENCODING 13588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +4520 +8DE0 +0000 +3F80 +4040 +4040 +3F80 +ENDCHAR +STARTCHAR U_3515 +ENCODING 13589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +83E0 +7D20 +0120 +F920 +0920 +0920 +0A20 +0A20 +0460 +ENDCHAR +STARTCHAR U_3516 +ENCODING 13590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +2520 +CDE0 +0000 +7FC0 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_3517 +ENCODING 13591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +FE80 +2BE0 +FEA0 +A8A0 +FEA0 +2AA0 +2AA0 +2EA0 +4960 +ENDCHAR +STARTCHAR U_3518 +ENCODING 13592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +A900 +AFE0 +F920 +2120 +A920 +A920 +AA20 +FAA0 +8C40 +ENDCHAR +STARTCHAR U_3519 +ENCODING 13593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4880 +FC80 +4BE0 +48A0 +48A0 +FCA0 +4920 +4920 +4920 +8A60 +ENDCHAR +STARTCHAR U_351A +ENCODING 13594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0840 +3040 +5080 +1480 +FBE0 +1120 +7920 +4A40 +3A40 +24C0 +ENDCHAR +STARTCHAR U_351B +ENCODING 13595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +0400 +FFE0 +0420 +0820 +F0C0 +ENDCHAR +STARTCHAR U_351C +ENCODING 13596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E500 +5500 +2BE0 +7D20 +0920 +1120 +1D20 +F220 +1220 +34C0 +ENDCHAR +STARTCHAR U_351D +ENCODING 13597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +1080 +11E0 +FEA0 +92A0 +DAA0 +B6A0 +DAA0 +92A0 +9320 +9640 +ENDCHAR +STARTCHAR U_351E +ENCODING 13598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E080 +11E0 +FEA0 +10A0 +54A0 +D6A0 +54A0 +D6A0 +1120 +1140 +ENDCHAR +STARTCHAR U_351F +ENCODING 13599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FC0 +9140 +7FC0 +1140 +FE60 +0400 +FFE0 +0420 +1820 +E060 +ENDCHAR +STARTCHAR U_3520 +ENCODING 13600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +FC80 +87E0 +FCA0 +40A0 +7CA0 +9520 +AD20 +F520 +0A40 +ENDCHAR +STARTCHAR U_3521 +ENCODING 13601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FE80 +ABE0 +92A0 +FEA0 +00A0 +88A0 +ED20 +8920 +A920 +CE60 +ENDCHAR +STARTCHAR U_3522 +ENCODING 13602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +9440 +63E0 +62A0 +F3E0 +0A00 +ABE0 +0400 +FFE0 +1020 +60C0 +ENDCHAR +STARTCHAR U_3523 +ENCODING 13603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5480 +7DE0 +54A0 +7CA0 +00A0 +FEA0 +AAA0 +FEA0 +AAA0 +FF60 +ENDCHAR +STARTCHAR U_3524 +ENCODING 13604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +8280 +7DE0 +54A0 +FEA0 +54A0 +D6A0 +7CA0 +5520 +7E60 +ENDCHAR +STARTCHAR U_3525 +ENCODING 13605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FE80 +49E0 +AEA0 +E8A0 +A6A0 +E8A0 +AEA0 +E8A0 +A760 +ENDCHAR +STARTCHAR U_3526 +ENCODING 13606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +2080 +FBE0 +20A0 +FCA0 +50A0 +FD20 +6920 +5120 +6A60 +ENDCHAR +STARTCHAR U_3527 +ENCODING 13607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +2080 +FE80 +A5E0 +F8A0 +A0A0 +BCA0 +A4A0 +BCA0 +A520 +7E60 +ENDCHAR +STARTCHAR U_3528 +ENCODING 13608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +3BA0 +0A20 +7BE0 +0020 +1F20 +1120 +1F20 +1120 +2360 +ENDCHAR +STARTCHAR U_3529 +ENCODING 13609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4420 +BFA0 +0420 +7FA0 +1220 +7FA0 +54A0 +FFA0 +0060 +ENDCHAR +STARTCHAR U_352A +ENCODING 13610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8F20 +0820 +7FA0 +55A0 +4AA0 +6DA0 +52A0 +7FE0 +ENDCHAR +STARTCHAR U_352B +ENCODING 13611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +0800 +1420 +14C0 +2700 +2400 +4420 +83E0 +ENDCHAR +STARTCHAR U_352C +ENCODING 13612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7E00 +4020 +3FE0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_352D +ENCODING 13613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +8440 +87C0 +F440 +87C0 +8000 +9FE0 +8100 +A5C0 +C500 +1BE0 +ENDCHAR +STARTCHAR U_352E +ENCODING 13614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FA60 +5540 +FF40 +A860 +FF00 +2540 +FF60 +2540 +5740 +8560 +ENDCHAR +STARTCHAR U_352F +ENCODING 13615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +9F80 +9080 +A060 +DF80 +9080 +9080 +9F80 +8000 +FFE0 +ENDCHAR +STARTCHAR U_3530 +ENCODING 13616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +9100 +9D00 +A580 +D540 +8920 +9100 +A100 +C100 +FFE0 +ENDCHAR +STARTCHAR U_3531 +ENCODING 13617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A00 +B2C0 +A240 +BAC0 +A240 +BFC0 +8200 +8D80 +B040 +FFE0 +ENDCHAR +STARTCHAR U_3532 +ENCODING 13618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +A900 +D3C0 +B940 +A940 +B940 +A140 +A960 +B200 +FFE0 +ENDCHAR +STARTCHAR U_3533 +ENCODING 13619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9000 +AB80 +D280 +BA80 +AA80 +BA80 +A2A0 +AAA0 +B460 +FFE0 +ENDCHAR +STARTCHAR U_3534 +ENCODING 13620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +BF80 +A480 +BF80 +8A00 +BF80 +8A00 +BFC0 +9080 +FFE0 +ENDCHAR +STARTCHAR U_3535 +ENCODING 13621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A540 +BDC0 +A100 +BDC0 +8900 +9F80 +8900 +BFC0 +9080 +FFE0 +ENDCHAR +STARTCHAR U_3536 +ENCODING 13622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +FDC0 +AB40 +FC80 +AB60 +B9C0 +9140 +FDC0 +9220 +FFE0 +ENDCHAR +STARTCHAR U_3537 +ENCODING 13623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BFC0 +8400 +BFC0 +A440 +AA40 +B140 +A0C0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_3538 +ENCODING 13624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8040 +BF80 +A200 +AFC0 +AA40 +AF80 +AA00 +ABA0 +D4A0 +FFE0 +ENDCHAR +STARTCHAR U_3539 +ENCODING 13625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F120 +2120 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_353A +ENCODING 13626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2480 +2080 +FBE0 +2080 +2080 +2020 +1FE0 +ENDCHAR +STARTCHAR U_353B +ENCODING 13627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0400 +1D80 +E460 +0400 +0000 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_353C +ENCODING 13628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F7E0 +2C80 +37E0 +E480 +27E0 +2480 +67E0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_353D +ENCODING 13629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +0800 +FFE0 +8020 +9F20 +9120 +9F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_353E +ENCODING 13630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +8100 +8100 +8100 +8500 +8200 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_353F +ENCODING 13631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +2080 +2080 +2080 +2080 +2080 +2780 +3880 +0080 +0080 +ENDCHAR +STARTCHAR U_3540 +ENCODING 13632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +0000 +FF00 +8100 +8240 +7FC0 +ENDCHAR +STARTCHAR U_3541 +ENCODING 13633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4920 +3120 +CD20 +2120 +FD20 +2120 +5120 +5160 +A500 +7D00 +ENDCHAR +STARTCHAR U_3542 +ENCODING 13634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +58C0 +6020 +4400 +4200 +5FC0 +4080 +4100 +8200 +ENDCHAR +STARTCHAR U_3543 +ENCODING 13635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4480 +4480 +5FE0 +4480 +4480 +4480 +4880 +9080 +ENDCHAR +STARTCHAR U_3544 +ENCODING 13636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4400 +4880 +5F00 +4200 +4400 +4840 +93E0 +9C20 +ENDCHAR +STARTCHAR U_3545 +ENCODING 13637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5240 +5240 +5FC0 +5240 +5FC0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_3546 +ENCODING 13638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4200 +7FE0 +4200 +4200 +5FC0 +5040 +5040 +5040 +9FC0 +ENDCHAR +STARTCHAR U_3547 +ENCODING 13639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +5FC0 +4000 +4880 +4880 +4880 +4500 +4500 +BFE0 +ENDCHAR +STARTCHAR U_3548 +ENCODING 13640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +7FE0 +4400 +4A40 +7A80 +4900 +4900 +4880 +8C60 +ENDCHAR +STARTCHAR U_3549 +ENCODING 13641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7060 +4F80 +4000 +5FC0 +5040 +9040 +9FC0 +ENDCHAR +STARTCHAR U_354A +ENCODING 13642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4240 +7FE0 +4200 +5FE0 +5220 +5FE0 +5220 +5FE0 +5220 +9260 +ENDCHAR +STARTCHAR U_354B +ENCODING 13643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7060 +4F80 +4200 +5FC0 +4200 +8A80 +BFE0 +ENDCHAR +STARTCHAR U_354C +ENCODING 13644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +4080 +7FE0 +4880 +8180 +ENDCHAR +STARTCHAR U_354D +ENCODING 13645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4000 +4A00 +5100 +77C0 +5100 +57C0 +5100 +57C0 +5100 +97C0 +ENDCHAR +STARTCHAR U_354E +ENCODING 13646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4F80 +4200 +5FC0 +4480 +4FC0 +4000 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_354F +ENCODING 13647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5C40 +4140 +5C40 +5540 +5C40 +41E0 +5440 +4840 +9C40 +ENDCHAR +STARTCHAR U_3550 +ENCODING 13648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +59C0 +5040 +5DC0 +5000 +5FE0 +4020 +5520 +6AA0 +8060 +ENDCHAR +STARTCHAR U_3551 +ENCODING 13649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4840 +5C40 +49E0 +5C40 +5540 +5C40 +5440 +48C0 +9C40 +ENDCHAR +STARTCHAR U_3552 +ENCODING 13650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +5FC0 +4200 +5FC0 +4920 +5FC0 +4940 +5C80 +48A0 +9940 +ENDCHAR +STARTCHAR U_3553 +ENCODING 13651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5240 +5540 +5FC0 +4200 +7FE0 +5540 +6220 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_3554 +ENCODING 13652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5FE0 +56A0 +5FE0 +5400 +5FE0 +7620 +5D40 +55A0 +A640 +ENDCHAR +STARTCHAR U_3555 +ENCODING 13653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +2200 +4100 +FF80 +0840 +1000 +2200 +4100 +FF80 +0040 +ENDCHAR +STARTCHAR U_3556 +ENCODING 13654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1200 +3F00 +1080 +2940 +7BE0 +0400 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_3557 +ENCODING 13655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +FE00 +1080 +7C80 +1100 +FD40 +1240 +3FE0 +4420 +9800 +27E0 +ENDCHAR +STARTCHAR U_3558 +ENCODING 13656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +2080 +5140 +FBE0 +0400 +1B00 +2480 +CE60 +1500 +2C80 +ENDCHAR +STARTCHAR U_3559 +ENCODING 13657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51C0 +FA40 +5080 +9BE0 +22A0 +7BE0 +D080 +21C0 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_355A +ENCODING 13658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +2840 +2480 +9480 +4900 +4600 +0600 +0900 +3080 +C060 +ENDCHAR +STARTCHAR U_355B +ENCODING 13659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0080 +3100 +0E00 +3180 +C040 +7F80 +2080 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_355C +ENCODING 13660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +8880 +FF80 +0800 +FF80 +4100 +2200 +1C00 +E380 +ENDCHAR +STARTCHAR U_355D +ENCODING 13661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4040 +7FC0 +0000 +7F80 +2080 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_355E +ENCODING 13662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E00 +42E0 +7EA0 +48A0 +48A0 +7EA0 +6AA0 +AA40 +2A40 +2EA0 +0920 +ENDCHAR +STARTCHAR U_355F +ENCODING 13663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1E00 +11E0 +FEA0 +AAA0 +AAA0 +FEA0 +AA40 +AA40 +AAA0 +8720 +ENDCHAR +STARTCHAR U_3560 +ENCODING 13664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +4FE0 +3900 +0FE0 +0900 +2FE0 +4900 +BFE0 +2080 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_3561 +ENCODING 13665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +23E0 +FD20 +8520 +7920 +30C0 +48C0 +78C0 +B540 +4920 +7A20 +ENDCHAR +STARTCHAR U_3562 +ENCODING 13666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2020 +FD20 +8520 +7940 +4940 +7880 +4880 +7880 +4940 +8620 +ENDCHAR +STARTCHAR U_3563 +ENCODING 13667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0900 +1080 +2080 +4040 +BFA0 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3564 +ENCODING 13668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F200 +9F80 +9280 +9280 +9280 +9280 +F280 +04A0 +18E0 +ENDCHAR +STARTCHAR U_3565 +ENCODING 13669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +9100 +9100 +9100 +9280 +F280 +0440 +1820 +ENDCHAR +STARTCHAR U_3566 +ENCODING 13670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +0400 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3567 +ENCODING 13671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +97E0 +9400 +9400 +9400 +F400 +0400 +0800 +3000 +ENDCHAR +STARTCHAR U_3568 +ENCODING 13672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0480 +F480 +9480 +9680 +9580 +9480 +9480 +F480 +08A0 +1060 +ENDCHAR +STARTCHAR U_3569 +ENCODING 13673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +9100 +9100 +97C0 +9100 +9100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_356A +ENCODING 13674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +EFE0 +A920 +A920 +A100 +A280 +E280 +02A0 +0CA0 +3060 +ENDCHAR +STARTCHAR U_356B +ENCODING 13675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F400 +9400 +97C0 +9440 +9440 +F440 +0440 +0940 +1080 +ENDCHAR +STARTCHAR U_356C +ENCODING 13676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0280 +F240 +9440 +9420 +9920 +9100 +9280 +F240 +04A0 +0720 +ENDCHAR +STARTCHAR U_356D +ENCODING 13677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0300 +ED00 +A100 +A100 +AFE0 +A100 +A280 +E480 +0840 +1020 +ENDCHAR +STARTCHAR U_356E +ENCODING 13678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0440 +E820 +A440 +A440 +A280 +A280 +A100 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_356F +ENCODING 13679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +9480 +A280 +FF80 +A280 +A280 +BE80 +8280 +8180 +ENDCHAR +STARTCHAR U_3570 +ENCODING 13680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1E00 +E200 +A380 +BE00 +A200 +A3C0 +FE00 +A220 +0220 +01E0 +ENDCHAR +STARTCHAR U_3571 +ENCODING 13681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F240 +9FE0 +9200 +9200 +9280 +9280 +9280 +F280 +04A0 +1860 +ENDCHAR +STARTCHAR U_3572 +ENCODING 13682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9FE0 +9100 +9380 +9380 +9540 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_3573 +ENCODING 13683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +08A0 +EAA0 +AAA0 +AAA0 +A920 +A920 +EAA0 +0C60 +0FE0 +0020 +ENDCHAR +STARTCHAR U_3574 +ENCODING 13684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1020 +E780 +A480 +A480 +A480 +A480 +A480 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_3575 +ENCODING 13685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0100 +F100 +9100 +9100 +97C0 +9100 +F100 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3576 +ENCODING 13686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E200 +A200 +A200 +AFC0 +A240 +A240 +E440 +8440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_3577 +ENCODING 13687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +F7E0 +9420 +9420 +97E0 +9420 +9420 +F420 +07E0 +0420 +ENDCHAR +STARTCHAR U_3578 +ENCODING 13688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +E000 +BFE0 +A000 +A840 +A840 +E480 +A480 +0000 +3FE0 +ENDCHAR +STARTCHAR U_3579 +ENCODING 13689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F240 +9FE0 +9200 +9240 +9240 +9540 +9480 +F480 +0940 +1220 +ENDCHAR +STARTCHAR U_357A +ENCODING 13690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0000 +FFE0 +1000 +2000 +3F80 +0080 +0300 +ENDCHAR +STARTCHAR U_357B +ENCODING 13691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0400 +1D80 +E440 +0400 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_357C +ENCODING 13692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +B2A0 +A120 +A920 +AAA0 +E820 +AFA0 +0020 +0060 +ENDCHAR +STARTCHAR U_357D +ENCODING 13693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +0840 +EC40 +AA40 +AA40 +A840 +AA40 +EC80 +0940 +0220 +0C20 +ENDCHAR +STARTCHAR U_357E +ENCODING 13694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +C460 +0400 +0000 +7A20 +4BC0 +4A00 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_357F +ENCODING 13695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +0E00 +3580 +C460 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3580 +ENCODING 13696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +F140 +9FE0 +9140 +97C0 +9100 +F7C0 +9100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_3581 +ENCODING 13697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +0180 +E240 +A420 +A100 +AFE0 +A200 +E480 +8900 +1240 +07E0 +ENDCHAR +STARTCHAR U_3582 +ENCODING 13698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +AFE0 +A920 +AFE0 +A140 +E080 +A1A0 +0260 +0C20 +ENDCHAR +STARTCHAR U_3583 +ENCODING 13699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A800 +A800 +AFE0 +A800 +ABE0 +EA20 +AA20 +0A20 +13E0 +ENDCHAR +STARTCHAR U_3584 +ENCODING 13700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +E920 +A920 +A920 +BDA0 +AB60 +A920 +E920 +A920 +1120 +2020 +ENDCHAR +STARTCHAR U_3585 +ENCODING 13701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +0080 +EFE0 +A880 +A8A0 +AEA0 +A8C0 +E880 +90A0 +1160 +2220 +ENDCHAR +STARTCHAR U_3586 +ENCODING 13702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0280 +EFE0 +AAA0 +AAA0 +AAA0 +AFE0 +AAA0 +EAA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_3587 +ENCODING 13703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0200 +E400 +AFE0 +AAA0 +AAA0 +AAA0 +AAA0 +EAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3588 +ENCODING 13704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3E80 +0500 +FFE0 +1900 +2E20 +C7E0 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3589 +ENCODING 13705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A280 +A440 +A920 +A100 +A500 +E5C0 +A500 +0500 +1FE0 +ENDCHAR +STARTCHAR U_358A +ENCODING 13706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +A7C0 +A040 +AFC0 +A080 +AFE0 +E480 +A280 +0080 +0180 +ENDCHAR +STARTCHAR U_358B +ENCODING 13707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +D160 +1100 +2100 +4100 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_358C +ENCODING 13708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +6F80 +A280 +24A0 +28E0 +0000 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_358D +ENCODING 13709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +4900 +21E0 +FF00 +0100 +0100 +7A40 +4B80 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_358E +ENCODING 13710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4B80 +4A20 +79E0 +0400 +0A00 +3180 +D160 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_358F +ENCODING 13711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0440 +F7C0 +9440 +97C0 +9000 +9100 +97C0 +F100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3590 +ENCODING 13712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3F80 +0480 +FFE0 +0480 +3F80 +0800 +3000 +ENDCHAR +STARTCHAR U_3591 +ENCODING 13713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +00A0 +EFE0 +A080 +AAA0 +AAA0 +BFC0 +EAC0 +0AA0 +1160 +0620 +ENDCHAR +STARTCHAR U_3592 +ENCODING 13714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A120 +AFE0 +A900 +AFE0 +E320 +0520 +09A0 +1140 +ENDCHAR +STARTCHAR U_3593 +ENCODING 13715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +0680 +E900 +A280 +A540 +AFE0 +B100 +E380 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_3594 +ENCODING 13716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E200 +AFC0 +A480 +A840 +B7E0 +A480 +E480 +A480 +0780 +0480 +ENDCHAR +STARTCHAR U_3595 +ENCODING 13717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A440 +A280 +AFE0 +A100 +E100 +A7C0 +0100 +0100 +ENDCHAR +STARTCHAR U_3596 +ENCODING 13718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3597 +ENCODING 13719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +AFE0 +A100 +A280 +A440 +BBA0 +E000 +A7C0 +0040 +0180 +ENDCHAR +STARTCHAR U_3598 +ENCODING 13720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0800 +EFC0 +A800 +AFE0 +AA80 +AAA0 +EAC0 +AA80 +0B40 +1220 +ENDCHAR +STARTCHAR U_3599 +ENCODING 13721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +1000 +7DE0 +1520 +2520 +4DE0 +8000 +7A40 +4A80 +4B20 +7BE0 +ENDCHAR +STARTCHAR U_359A +ENCODING 13722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +27E0 +6480 +A280 +2080 +2180 +7A40 +4A80 +4B00 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_359B +ENCODING 13723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +1000 +7F00 +4100 +7F00 +0000 +F480 +9700 +9440 +F7C0 +ENDCHAR +STARTCHAR U_359C +ENCODING 13724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +0000 +7F00 +4100 +7F00 +0000 +F480 +9700 +9440 +F7C0 +ENDCHAR +STARTCHAR U_359D +ENCODING 13725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +0E00 +3580 +C460 +7A00 +4A80 +4B20 +7BE0 +ENDCHAR +STARTCHAR U_359E +ENCODING 13726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0780 +0480 +E480 +A780 +A200 +AFC0 +AA40 +EB40 +8CC0 +0840 +08C0 +ENDCHAR +STARTCHAR U_359F +ENCODING 13727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0300 +EC20 +A920 +A4C0 +AFE0 +B020 +E7C0 +A480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_35A0 +ENCODING 13728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A440 +ABA0 +A000 +AFE0 +E100 +8540 +0920 +1320 +ENDCHAR +STARTCHAR U_35A1 +ENCODING 13729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +E480 +A8E0 +B920 +A9A0 +AA40 +ED40 +A880 +0940 +0A20 +ENDCHAR +STARTCHAR U_35A2 +ENCODING 13730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA80 +AA80 +AB80 +AAA0 +AEC0 +EA80 +AB80 +0EA0 +14E0 +ENDCHAR +STARTCHAR U_35A3 +ENCODING 13731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A440 +A280 +AFE0 +A000 +E7C0 +A440 +0440 +07C0 +ENDCHAR +STARTCHAR U_35A4 +ENCODING 13732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +07C0 +E080 +A920 +AD60 +ABA0 +A920 +EBA0 +AD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35A5 +ENCODING 13733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FE0 +E8A0 +AF20 +A920 +AFE0 +A920 +EBA0 +AD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35A6 +ENCODING 13734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A540 +A7C0 +A540 +E7C0 +A100 +0540 +0920 +ENDCHAR +STARTCHAR U_35A7 +ENCODING 13735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0900 +EFE0 +A880 +AC60 +A000 +AFC0 +E840 +AFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_35A8 +ENCODING 13736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E040 +A7C0 +A040 +AFE0 +A100 +AD60 +E180 +A540 +0920 +0300 +ENDCHAR +STARTCHAR U_35A9 +ENCODING 13737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +AAA0 +AEA0 +AAA0 +AEA0 +EAA0 +AA40 +0E40 +12A0 +0320 +ENDCHAR +STARTCHAR U_35AA +ENCODING 13738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +E0A0 +BFE0 +A080 +AEA0 +AAA0 +AEC0 +E080 +A6A0 +1960 +0220 +ENDCHAR +STARTCHAR U_35AB +ENCODING 13739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +E100 +AFE0 +A440 +A920 +A3C0 +E640 +A980 +0340 +0C20 +ENDCHAR +STARTCHAR U_35AC +ENCODING 13740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E820 +AEE0 +A820 +AFE0 +A000 +EFE0 +A440 +0280 +0380 +0C60 +ENDCHAR +STARTCHAR U_35AD +ENCODING 13741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FC0 +E200 +A200 +BFE0 +A500 +AAC0 +F220 +8B40 +12A0 +0600 +ENDCHAR +STARTCHAR U_35AE +ENCODING 13742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0300 +E480 +A840 +B7A0 +A000 +AFE0 +EAA0 +AFE0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_35AF +ENCODING 13743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +FF80 +A280 +BE80 +8180 +0400 +F580 +9600 +9480 +F780 +ENDCHAR +STARTCHAR U_35B0 +ENCODING 13744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FA40 +8A80 +8B00 +FA40 +8BC0 +0000 +FFC0 +8040 +BF40 +9240 +9EC0 +ENDCHAR +STARTCHAR U_35B1 +ENCODING 13745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +27C0 +EA40 +2580 +2300 +2CE0 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35B2 +ENCODING 13746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +4920 +C920 +31E0 +CC00 +0160 +FD80 +8500 +8520 +FCE0 +ENDCHAR +STARTCHAR U_35B3 +ENCODING 13747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +8240 +4440 +2280 +4180 +8E40 +7D60 +4580 +4520 +7CE0 +ENDCHAR +STARTCHAR U_35B4 +ENCODING 13748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A800 +AFE0 +B2A0 +A2A0 +E4A0 +1920 +0220 +0C60 +ENDCHAR +STARTCHAR U_35B5 +ENCODING 13749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A840 +AFC0 +E840 +1FE0 +0480 +0840 +ENDCHAR +STARTCHAR U_35B6 +ENCODING 13750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +AAA0 +AEE0 +A820 +AFE0 +E100 +87C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_35B7 +ENCODING 13751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +9FE0 +F100 +95C0 +0500 +0BE0 +ENDCHAR +STARTCHAR U_35B8 +ENCODING 13752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +AFE0 +A920 +AFC0 +A900 +ABC0 +AA00 +EFE0 +0A00 +13C0 +ENDCHAR +STARTCHAR U_35B9 +ENCODING 13753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E880 +B040 +AFA0 +A480 +A480 +A980 +FFC0 +1540 +1540 +3FE0 +ENDCHAR +STARTCHAR U_35BA +ENCODING 13754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +A7C0 +EC60 +17E0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35BB +ENCODING 13755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +BFE0 +A320 +A500 +AB00 +A100 +FFE0 +0380 +0540 +1920 +ENDCHAR +STARTCHAR U_35BC +ENCODING 13756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +A7C0 +A440 +A7C0 +A100 +AFE0 +E380 +0540 +1920 +ENDCHAR +STARTCHAR U_35BD +ENCODING 13757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +97E0 +9420 +97E0 +9420 +97E0 +9420 +F7E0 +0240 +0420 +ENDCHAR +STARTCHAR U_35BE +ENCODING 13758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +1100 +FFE0 +0400 +4440 +4440 +7FC0 +0800 +3000 +ENDCHAR +STARTCHAR U_35BF +ENCODING 13759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +AAA0 +AEA0 +AAC0 +AEA0 +AAA0 +ABA0 +EEE0 +1280 +0280 +ENDCHAR +STARTCHAR U_35C0 +ENCODING 13760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +EDA0 +AB60 +AFA0 +AB60 +ADA0 +EFE0 +A920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_35C1 +ENCODING 13761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +A000 +A7C0 +A000 +AFE0 +A200 +E7C0 +0040 +01C0 +ENDCHAR +STARTCHAR U_35C2 +ENCODING 13762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0540 +E5A0 +A920 +A3C0 +A640 +BBC0 +E240 +A3C0 +0240 +03C0 +ENDCHAR +STARTCHAR U_35C3 +ENCODING 13763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0840 +EFC0 +A900 +AFE0 +A880 +AFC0 +A840 +EFC0 +A840 +0FC0 +ENDCHAR +STARTCHAR U_35C4 +ENCODING 13764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A200 +A100 +AFE0 +A200 +E3C0 +A440 +0440 +0980 +ENDCHAR +STARTCHAR U_35C5 +ENCODING 13765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +E4A0 +AEA0 +A4A0 +A4E0 +AEA0 +AAA0 +AAE0 +EEA0 +0120 +0260 +ENDCHAR +STARTCHAR U_35C6 +ENCODING 13766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +A7C0 +A100 +AFE0 +A920 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_35C7 +ENCODING 13767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EA20 +AA20 +AEE0 +A800 +AEE0 +A8A0 +AE40 +E840 +08A0 +0920 +ENDCHAR +STARTCHAR U_35C8 +ENCODING 13768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0280 +EFE0 +A920 +AFE0 +A920 +AFE0 +E920 +AFE0 +0220 +0C40 +ENDCHAR +STARTCHAR U_35C9 +ENCODING 13769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +20A0 +F920 +2F20 +F960 +2600 +1980 +FFE0 +1080 +1F80 +ENDCHAR +STARTCHAR U_35CA +ENCODING 13770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +F780 +0000 +F780 +9480 +9480 +F780 +9480 +ENDCHAR +STARTCHAR U_35CB +ENCODING 13771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E480 +AFE0 +AA00 +ABE0 +AA80 +AC80 +EBE0 +0880 +1140 +2620 +ENDCHAR +STARTCHAR U_35CC +ENCODING 13772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A7C0 +A280 +A440 +A7E0 +A100 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_35CD +ENCODING 13773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A100 +AFE0 +A380 +A540 +BFE0 +A440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35CE +ENCODING 13774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1EE0 +EAA0 +AAA0 +B6E0 +A100 +BFE0 +A380 +E540 +1920 +0100 +ENDCHAR +STARTCHAR U_35CF +ENCODING 13775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A300 +A540 +A920 +A100 +AFE0 +A100 +E5C0 +0500 +1FE0 +ENDCHAR +STARTCHAR U_35D0 +ENCODING 13776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFE0 +A480 +AA40 +B120 +E000 +AFC0 +0A40 +0940 +1FE0 +ENDCHAR +STARTCHAR U_35D1 +ENCODING 13777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1BE0 +E880 +A9C0 +BC80 +A9C0 +EC80 +9BE0 +0880 +0880 +1080 +ENDCHAR +STARTCHAR U_35D2 +ENCODING 13778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E000 +AFC0 +A840 +AFC0 +E220 +A540 +0C80 +1540 +0620 +ENDCHAR +STARTCHAR U_35D3 +ENCODING 13779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +EBC0 +A240 +BBC0 +AA00 +ABE0 +EA20 +ABE0 +0C00 +13E0 +ENDCHAR +STARTCHAR U_35D4 +ENCODING 13780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F100 +97E0 +9520 +97C0 +9520 +97E0 +F540 +9540 +0480 +0B60 +ENDCHAR +STARTCHAR U_35D5 +ENCODING 13781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +A7C0 +A280 +AFE0 +A540 +E7C0 +A540 +0FE0 +0440 +ENDCHAR +STARTCHAR U_35D6 +ENCODING 13782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0300 +EC20 +A540 +A000 +ACE0 +A820 +AEE0 +E820 +AFE0 +0820 +ENDCHAR +STARTCHAR U_35D7 +ENCODING 13783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +97C0 +F540 +47C0 +F200 +5500 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_35D8 +ENCODING 13784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +EFE0 +A540 +A7C0 +A540 +A7C0 +E540 +BFE0 +0440 +0240 +00C0 +ENDCHAR +STARTCHAR U_35D9 +ENCODING 13785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +EAA0 +A3E0 +A120 +A400 +E7E0 +AAA0 +13E0 +0120 +0640 +ENDCHAR +STARTCHAR U_35DA +ENCODING 13786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A100 +EFE0 +A300 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_35DB +ENCODING 13787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +07E0 +EA40 +B000 +A1C0 +A700 +E100 +AFE0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_35DC +ENCODING 13788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E240 +A680 +A140 +A640 +AFE0 +E920 +AFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35DD +ENCODING 13789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A100 +A7C0 +A100 +E100 +AFE0 +0000 +0AA0 +0AA0 +ENDCHAR +STARTCHAR U_35DE +ENCODING 13790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +3E40 +11E0 +F140 +BDE0 +B5A0 +F5A0 +BDA0 +1140 +2240 +04A0 +ENDCHAR +STARTCHAR U_35DF +ENCODING 13791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8200 +5FC0 +0200 +CF80 +2200 +DFC0 +4480 +F500 +9600 +F440 +97C0 +ENDCHAR +STARTCHAR U_35E0 +ENCODING 13792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4BE0 +9220 +D3E0 +3220 +C800 +0260 +FA80 +8B20 +FBE0 +ENDCHAR +STARTCHAR U_35E1 +ENCODING 13793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +FFC0 +1200 +2F00 +6500 +A580 +2880 +3180 +7A40 +4A80 +7BC0 +ENDCHAR +STARTCHAR U_35E2 +ENCODING 13794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +0880 +FE80 +A9E0 +BEA0 +AAA0 +BEA0 +EAA0 +BEA0 +0920 +3E60 +ENDCHAR +STARTCHAR U_35E3 +ENCODING 13795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EFE0 +A540 +AB60 +A000 +AFE0 +A920 +E7C0 +A540 +05C0 +0100 +ENDCHAR +STARTCHAR U_35E4 +ENCODING 13796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4900 +4D40 +4940 +7E80 +ACA0 +5B60 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35E5 +ENCODING 13797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0EE0 +E0A0 +AEA0 +AAC0 +AEC0 +A0A0 +EEA0 +02E0 +1F80 +0480 +ENDCHAR +STARTCHAR U_35E6 +ENCODING 13798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +2AE0 +EAA0 +BAA0 +AAA0 +BAA0 +ABA0 +EEE0 +3980 +0980 +0A80 +ENDCHAR +STARTCHAR U_35E7 +ENCODING 13799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AAA0 +A440 +A7C0 +A240 +A7E0 +A100 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_35E8 +ENCODING 13800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A140 +BE60 +D1C0 +FD40 +A880 +FD60 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35E9 +ENCODING 13801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E220 +AAA0 +A660 +AAA0 +A100 +AFE0 +E820 +AFE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_35EA +ENCODING 13802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EBC0 +AA80 +BFA0 +A460 +AF80 +A240 +EFE0 +A100 +0940 +1320 +ENDCHAR +STARTCHAR U_35EB +ENCODING 13803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +AAA0 +B640 +AC40 +ABA0 +B000 +AFE0 +E100 +0940 +1320 +ENDCHAR +STARTCHAR U_35EC +ENCODING 13804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +3F80 +0800 +1F00 +6600 +1900 +67C0 +1900 +3E00 +ENDCHAR +STARTCHAR U_35ED +ENCODING 13805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF00 +A540 +A380 +AFE0 +A540 +A920 +A000 +E540 +1560 +17C0 +ENDCHAR +STARTCHAR U_35EE +ENCODING 13806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9500 +77C0 +2540 +77E0 +D540 +57C0 +5500 +7A80 +0C60 +ENDCHAR +STARTCHAR U_35EF +ENCODING 13807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7F80 +0500 +FFE0 +3080 +DF80 +1080 +1FA0 +7DC0 +4520 +7CE0 +ENDCHAR +STARTCHAR U_35F0 +ENCODING 13808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +0940 +F6A0 +A800 +B880 +AA80 +AAE0 +AA80 +EA80 +0B80 +0C60 +ENDCHAR +STARTCHAR U_35F1 +ENCODING 13809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0BE0 +F900 +ABC0 +A900 +ABC0 +A100 +AFE0 +E380 +0540 +0920 +ENDCHAR +STARTCHAR U_35F2 +ENCODING 13810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +E140 +AFE0 +A140 +AFE0 +A540 +A7C0 +E540 +A7C0 +0FE0 +ENDCHAR +STARTCHAR U_35F3 +ENCODING 13811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0EE0 +F540 +A100 +A280 +A440 +BBA0 +E000 +A7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35F4 +ENCODING 13812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AEE0 +ABA0 +AAA0 +EBA0 +AAA0 +0BA0 +0EE0 +ENDCHAR +STARTCHAR U_35F5 +ENCODING 13813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1D00 +EBE0 +A8A0 +B480 +A080 +A880 +BD40 +E940 +A920 +1620 +ENDCHAR +STARTCHAR U_35F6 +ENCODING 13814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EC0 +0B60 +E4C0 +A820 +BEE0 +A2A0 +AF20 +E8E0 +AEA0 +0240 +06A0 +ENDCHAR +STARTCHAR U_35F7 +ENCODING 13815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FE0 +EAA0 +A7C0 +A280 +A7C0 +A280 +FFE0 +A540 +0540 +0EE0 +ENDCHAR +STARTCHAR U_35F8 +ENCODING 13816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EAE0 +B700 +AAE0 +AA40 +BF40 +AA40 +AB40 +EF40 +A840 +08C0 +ENDCHAR +STARTCHAR U_35F9 +ENCODING 13817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0BE0 +F880 +ABE0 +A880 +ABE0 +A880 +EBE0 +AA40 +1560 +13C0 +ENDCHAR +STARTCHAR U_35FA +ENCODING 13818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +AFE0 +A280 +A440 +BAA0 +AEE0 +E280 +AEE0 +0280 +0EE0 +ENDCHAR +STARTCHAR U_35FB +ENCODING 13819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +0920 +E1E0 +BDA0 +ABE0 +AAA0 +AAA0 +EAE0 +BA20 +0C20 +03E0 +ENDCHAR +STARTCHAR U_35FC +ENCODING 13820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +06C0 +EFE0 +A280 +AFE0 +A100 +A7C0 +E100 +AFE0 +0380 +0D60 +ENDCHAR +STARTCHAR U_35FD +ENCODING 13821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5EE0 +F2A0 +5EC0 +F2A0 +3EE0 +5480 +9A80 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_35FE +ENCODING 13822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15C0 +FF40 +B540 +BD40 +A960 +BFC0 +AB40 +FF40 +A940 +1D40 +0960 +ENDCHAR +STARTCHAR U_35FF +ENCODING 13823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AFE0 +A8A0 +ABA0 +EAA0 +ABA0 +08A0 +09E0 +ENDCHAR +STARTCHAR U_3600 +ENCODING 13824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0EE0 +E820 +AEE0 +A820 +AEE0 +A540 +EFE0 +0540 +0540 +0920 +ENDCHAR +STARTCHAR U_3601 +ENCODING 13825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A100 +A7C0 +A100 +AFE0 +E280 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_3602 +ENCODING 13826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E440 +AAA0 +A440 +A9A0 +AEC0 +E100 +1420 +24A0 +0780 +ENDCHAR +STARTCHAR U_3603 +ENCODING 13827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E200 +BFE0 +A200 +A7C0 +AC40 +F7C0 +A520 +0CA0 +0BC0 +ENDCHAR +STARTCHAR U_3604 +ENCODING 13828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +EAA0 +BEA0 +ABE0 +AC80 +BBE0 +A900 +E9E0 +0920 +0A20 +0CC0 +ENDCHAR +STARTCHAR U_3605 +ENCODING 13829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6AE0 +1100 +EEE0 +A440 +BF40 +A440 +EE40 +2440 +2640 +38C0 +ENDCHAR +STARTCHAR U_3606 +ENCODING 13830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E100 +A7C0 +A440 +AFE0 +AAA0 +A440 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3607 +ENCODING 13831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +1DC0 +0880 +F540 +BFE0 +A220 +AFC0 +E200 +0A80 +0A40 +1240 +ENDCHAR +STARTCHAR U_3608 +ENCODING 13832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +EE40 +A880 +A7E0 +A8A0 +AE80 +B4E0 +EE80 +0580 +0A80 +1460 +ENDCHAR +STARTCHAR U_3609 +ENCODING 13833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1EE0 +E540 +BDE0 +A520 +BD20 +A520 +FD20 +2160 +2920 +3500 +ENDCHAR +STARTCHAR U_360A +ENCODING 13834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0200 +FFE0 +AAA0 +AFC0 +A000 +AFC0 +E000 +0FC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_360B +ENCODING 13835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFA0 +A940 +AFA0 +AAA0 +AFE0 +E540 +0540 +07C0 +0820 +ENDCHAR +STARTCHAR U_360C +ENCODING 13836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +0820 +FF20 +AAA0 +BEA0 +A0A0 +BFA0 +ECA0 +3520 +2E20 +5560 +ENDCHAR +STARTCHAR U_360D +ENCODING 13837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0E60 +F540 +A7E0 +AA40 +BF40 +AA60 +EF40 +0AC0 +0F40 +0820 +ENDCHAR +STARTCHAR U_360E +ENCODING 13838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +1020 +EEA0 +A2E0 +BF20 +AAA0 +AE60 +EA60 +3EA0 +2320 +2260 +ENDCHAR +STARTCHAR U_360F +ENCODING 13839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +C480 +1FE0 +C400 +4FC0 +4940 +4FC0 +7000 +8FE0 +3A40 +2AA0 +3BE0 +ENDCHAR +STARTCHAR U_3610 +ENCODING 13840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +0AE0 +EFA0 +AA00 +AFA0 +AAA0 +AF40 +E140 +0D40 +32A0 +04A0 +ENDCHAR +STARTCHAR U_3611 +ENCODING 13841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1DE0 +E8A0 +BDE0 +AAA0 +A1E0 +BC80 +EAA0 +1DC0 +2AA0 +1980 +ENDCHAR +STARTCHAR U_3612 +ENCODING 13842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +E380 +2080 +FFE0 +72A0 +ABE0 +2080 +FFE0 +8A40 +8AA0 +FBE0 +ENDCHAR +STARTCHAR U_3613 +ENCODING 13843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +A920 +AFE0 +AD60 +AFE0 +E920 +0BA0 +0D20 +0960 +ENDCHAR +STARTCHAR U_3614 +ENCODING 13844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +0AA0 +E7C0 +A280 +A7C0 +AD60 +B6C0 +E540 +0280 +0C60 +ENDCHAR +STARTCHAR U_3615 +ENCODING 13845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +AE80 +AAE0 +AE80 +EAE0 +0E80 +0FC0 +0A40 +1FE0 +ENDCHAR +STARTCHAR U_3616 +ENCODING 13846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1FE0 +F280 +ADE0 +BF60 +B5A0 +BB60 +B5A0 +FBE0 +14C0 +2920 +ENDCHAR +STARTCHAR U_3617 +ENCODING 13847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AEE0 +AAA0 +A7E0 +EC80 +17E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3618 +ENCODING 13848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E80 +F1E0 +2E40 +50A0 +FFE0 +4A40 +AAA0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3619 +ENCODING 13849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DC0 +1540 +FFE0 +A480 +BEE0 +AB20 +AEA0 +EAA0 +2E40 +5A40 +42A0 +ENDCHAR +STARTCHAR U_361A +ENCODING 13850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +2520 +FDE0 +A520 +BEA0 +ABE0 +AE60 +EB60 +3EA0 +2360 +2020 +ENDCHAR +STARTCHAR U_361B +ENCODING 13851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +1860 +EFC0 +A840 +AFE0 +AAA0 +BFE0 +AA80 +EEE0 +0A80 +16E0 +ENDCHAR +STARTCHAR U_361C +ENCODING 13852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +A540 +FFE0 +A140 +FFE0 +AB40 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_361D +ENCODING 13853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BF20 +8120 +9120 +8A20 +8420 +8B20 +B120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_361E +ENCODING 13854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +BFA0 +84A0 +88A0 +88A0 +92A0 +A120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_361F +ENCODING 13855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8920 +8920 +BFE0 +8920 +8920 +8920 +9120 +A120 +FFE0 +ENDCHAR +STARTCHAR U_3620 +ENCODING 13856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8820 +8520 +9120 +B220 +D4A0 +9960 +9160 +EF20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_3621 +ENCODING 13857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +A4A0 +BFA0 +A4A0 +BFA0 +8420 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_3622 +ENCODING 13858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +A4A0 +9520 +BFA0 +8A20 +8A20 +8A20 +92A0 +A1A0 +FFE0 +ENDCHAR +STARTCHAR U_3623 +ENCODING 13859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9F20 +8020 +9F20 +9120 +9F20 +9120 +9F20 +9320 +FFE0 +ENDCHAR +STARTCHAR U_3624 +ENCODING 13860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +D560 +BDE0 +D060 +BFE0 +9060 +BDE0 +D560 +E560 +FFE0 +ENDCHAR +STARTCHAR U_3625 +ENCODING 13861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +BDA0 +EAA0 +D120 +A2A0 +FD60 +93A0 +FDA0 +9360 +D520 +FFE0 +ENDCHAR +STARTCHAR U_3626 +ENCODING 13862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +27E0 +F920 +2120 +2120 +2920 +3220 +C220 +04A0 +0840 +ENDCHAR +STARTCHAR U_3627 +ENCODING 13863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +2280 +F100 +2FE0 +2120 +2100 +2100 +3100 +C500 +0300 +ENDCHAR +STARTCHAR U_3628 +ENCODING 13864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4100 +4FE0 +E920 +4920 +4AA0 +6A60 +4C60 +8820 +0820 +0860 +ENDCHAR +STARTCHAR U_3629 +ENCODING 13865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4880 +4880 +E880 +4EE0 +4880 +4880 +6880 +CA80 +0CA0 +08E0 +ENDCHAR +STARTCHAR U_362A +ENCODING 13866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +21C0 +F700 +2100 +21E0 +2700 +3100 +C120 +00E0 +ENDCHAR +STARTCHAR U_362B +ENCODING 13867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +F280 +2280 +2FE0 +2280 +3280 +E280 +0480 +0880 +ENDCHAR +STARTCHAR U_362C +ENCODING 13868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4400 +4FE0 +E820 +5220 +4220 +44A0 +4FA0 +6020 +80A0 +0040 +ENDCHAR +STARTCHAR U_362D +ENCODING 13869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +2420 +F920 +2E20 +2220 +2420 +3420 +E920 +0F20 +0060 +ENDCHAR +STARTCHAR U_362E +ENCODING 13870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F440 +27C0 +2500 +2500 +2480 +3480 +C840 +1020 +ENDCHAR +STARTCHAR U_362F +ENCODING 13871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +F500 +2900 +27E0 +2120 +3220 +E220 +04A0 +1840 +ENDCHAR +STARTCHAR U_3630 +ENCODING 13872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2280 +F080 +2480 +2280 +20E0 +2780 +3080 +C080 +0080 +ENDCHAR +STARTCHAR U_3631 +ENCODING 13873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F540 +2540 +27C0 +2540 +3540 +CFE0 +0440 +04C0 +ENDCHAR +STARTCHAR U_3632 +ENCODING 13874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4840 +EFC0 +4A00 +4F80 +4A80 +4A80 +6AA0 +D4A0 +2860 +ENDCHAR +STARTCHAR U_3633 +ENCODING 13875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A60 +FB80 +0A00 +0A20 +3A20 +C9E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3634 +ENCODING 13876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7480 +5480 +5480 +7540 +5620 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3635 +ENCODING 13877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +5FE0 +E500 +4900 +5FE0 +6920 +4920 +6920 +C960 +0100 +ENDCHAR +STARTCHAR U_3636 +ENCODING 13878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3BE0 +4880 +AA80 +13E0 +2080 +C480 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3637 +ENCODING 13879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +F000 +2440 +2440 +2280 +2280 +3100 +C280 +0C60 +ENDCHAR +STARTCHAR U_3638 +ENCODING 13880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +7A40 +8B80 +5220 +2220 +C1E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3639 +ENCODING 13881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1120 +5D40 +5180 +5120 +5D20 +E0E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_363A +ENCODING 13882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4280 +44E0 +E580 +4CA0 +54A0 +44C0 +44C0 +64A0 +C560 +0620 +ENDCHAR +STARTCHAR U_363B +ENCODING 13883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +F920 +2FE0 +2920 +2920 +2AA0 +3AA0 +CC60 +0FE0 +ENDCHAR +STARTCHAR U_363C +ENCODING 13884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +F140 +2FE0 +2100 +23E0 +2600 +2BE0 +3020 +C020 +00C0 +ENDCHAR +STARTCHAR U_363D +ENCODING 13885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +1100 +1120 +7CA0 +10C0 +14A0 +F960 +4220 +ENDCHAR +STARTCHAR U_363E +ENCODING 13886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +F7C0 +2100 +2100 +2FE0 +2100 +3100 +C100 +0300 +ENDCHAR +STARTCHAR U_363F +ENCODING 13887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2440 +27C0 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_3640 +ENCODING 13888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4AA0 +E280 +4C60 +4200 +47C0 +4240 +6240 +8440 +0860 +ENDCHAR +STARTCHAR U_3641 +ENCODING 13889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47E0 +4800 +F7C0 +4540 +5FE0 +4640 +4940 +6FE0 +C140 +0080 +ENDCHAR +STARTCHAR U_3642 +ENCODING 13890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +4440 +4820 +F7C0 +4440 +4440 +57C0 +6280 +C480 +84A0 +18E0 +ENDCHAR +STARTCHAR U_3643 +ENCODING 13891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +4700 +4400 +E7C0 +4480 +4480 +4480 +6FE0 +C280 +8440 +0820 +ENDCHAR +STARTCHAR U_3644 +ENCODING 13892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4EE0 +4880 +EA80 +4CE0 +4100 +4100 +47C0 +6100 +8100 +0FE0 +ENDCHAR +STARTCHAR U_3645 +ENCODING 13893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4F80 +4880 +4880 +EF80 +4200 +5FC0 +4200 +6A80 +4A40 +9240 +0200 +ENDCHAR +STARTCHAR U_3646 +ENCODING 13894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2820 +F100 +2FE0 +2100 +2200 +3280 +C480 +0920 +13E0 +ENDCHAR +STARTCHAR U_3647 +ENCODING 13895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FB20 +24C0 +2380 +2B80 +34C0 +C1C0 +02A0 +0C80 +0100 +ENDCHAR +STARTCHAR U_3648 +ENCODING 13896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +41C0 +4100 +4FE0 +E920 +4F80 +4900 +48C0 +6A80 +92A0 +1460 +ENDCHAR +STARTCHAR U_3649 +ENCODING 13897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +4500 +5FC0 +5540 +5FC0 +F540 +5540 +7FE0 +4880 +6840 +D040 +ENDCHAR +STARTCHAR U_364A +ENCODING 13898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4400 +4780 +E400 +4780 +4400 +5FE0 +4A40 +6980 +8A80 +0C60 +ENDCHAR +STARTCHAR U_364B +ENCODING 13899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +4480 +4FC0 +E480 +4780 +4480 +4780 +6480 +DFE0 +0480 +0840 +ENDCHAR +STARTCHAR U_364C +ENCODING 13900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +47C0 +4140 +EFE0 +4140 +47C0 +4540 +4540 +67C0 +8540 +0940 +ENDCHAR +STARTCHAR U_364D +ENCODING 13901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +4220 +4B40 +E480 +5B60 +4000 +5FE0 +5320 +6AA0 +8440 +1BA0 +ENDCHAR +STARTCHAR U_364E +ENCODING 13902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +5FE0 +F080 +5E80 +5480 +5FA0 +55A0 +5AC0 +7480 +DB60 +2220 +ENDCHAR +STARTCHAR U_364F +ENCODING 13903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47E0 +5800 +E7C0 +4440 +47C0 +4440 +47C0 +6E40 +8180 +0E60 +ENDCHAR +STARTCHAR U_3650 +ENCODING 13904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4920 +4FE0 +E000 +4FE0 +4200 +4FE0 +6AA0 +8AA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3651 +ENCODING 13905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +3F80 +2480 +7FC0 +4440 +5B40 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3652 +ENCODING 13906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A940 +A880 +FFE0 +A8A0 +AAC0 +F980 +0480 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3653 +ENCODING 13907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +2080 +FBC0 +3080 +E5E0 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3654 +ENCODING 13908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4780 +4280 +EFC0 +4480 +4780 +4100 +6780 +8500 +1FE0 +0100 +ENDCHAR +STARTCHAR U_3655 +ENCODING 13909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4920 +4FE0 +E920 +4FE0 +4000 +47C0 +6640 +85C0 +0740 +08C0 +ENDCHAR +STARTCHAR U_3656 +ENCODING 13910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +4E00 +4200 +EFC0 +4A40 +4FC0 +4200 +7FE0 +9220 +13A0 +1460 +ENDCHAR +STARTCHAR U_3657 +ENCODING 13911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4540 +47C0 +E540 +47C0 +4000 +4FE0 +6500 +8540 +0480 +0660 +ENDCHAR +STARTCHAR U_3658 +ENCODING 13912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4280 +4FE0 +EAA0 +4FE0 +4200 +4FE0 +6280 +8480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_3659 +ENCODING 13913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8240 +5FE0 +0480 +C540 +0A80 +2A40 +D1E0 +8400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_365A +ENCODING 13914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +4FE0 +4100 +E7C0 +4100 +4FE0 +4100 +67C0 +8900 +1FE0 +0100 +ENDCHAR +STARTCHAR U_365B +ENCODING 13915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +4FE0 +4100 +EFE0 +4920 +4FE0 +4920 +6040 +8FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_365C +ENCODING 13916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +FF80 +2200 +3E00 +0000 +FFC0 +A440 +88C0 +3E00 +0800 +FFC0 +ENDCHAR +STARTCHAR U_365D +ENCODING 13917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FC0 +4440 +FFE0 +4AA0 +57E0 +4440 +67C0 +8440 +07C0 +0440 +ENDCHAR +STARTCHAR U_365E +ENCODING 13918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0200 +4F80 +4880 +EF80 +4880 +4F80 +4200 +6FC0 +8200 +0A80 +1240 +ENDCHAR +STARTCHAR U_365F +ENCODING 13919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4EE0 +4AA0 +EEA0 +4AE0 +4EA0 +48E0 +6AA0 +8AA0 +0CA0 +0960 +ENDCHAR +STARTCHAR U_3660 +ENCODING 13920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A140 +BA20 +D1C0 +FD40 +A880 +FF60 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3661 +ENCODING 13921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4940 +F540 +49C0 +5AA0 +4800 +4A80 +6AE0 +4A80 +8B80 +0C60 +ENDCHAR +STARTCHAR U_3662 +ENCODING 13922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0500 +0F80 +4500 +E200 +5FC0 +7240 +9740 +1AC0 +12C0 +0200 +ENDCHAR +STARTCHAR U_3663 +ENCODING 13923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +4500 +45C0 +ED00 +51C0 +5100 +5FE0 +6520 +C5C0 +1540 +0DA0 +ENDCHAR +STARTCHAR U_3664 +ENCODING 13924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +4100 +4FE0 +E940 +4BE0 +48C0 +4BA0 +4AC0 +6FE0 +8880 +1380 +ENDCHAR +STARTCHAR U_3665 +ENCODING 13925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +EFE0 +4440 +47C0 +4300 +4520 +6CC0 +9640 +0420 +ENDCHAR +STARTCHAR U_3666 +ENCODING 13926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5180 +FA80 +2180 +FFE0 +7080 +AC80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3667 +ENCODING 13927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2280 +2EE0 +FAA0 +2EE0 +2280 +27C0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_3668 +ENCODING 13928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +4940 +5DE0 +EB40 +5FE0 +4140 +5FE0 +4900 +6940 +CCA0 +1360 +ENDCHAR +STARTCHAR U_3669 +ENCODING 13929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4AA0 +E440 +4FE0 +4440 +47C0 +4440 +67C0 +8540 +0B20 +ENDCHAR +STARTCHAR U_366A +ENCODING 13930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4100 +EFE0 +4820 +47C0 +4440 +47C0 +6440 +8280 +0FE0 +ENDCHAR +STARTCHAR U_366B +ENCODING 13931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +5FE0 +4900 +EFE0 +4900 +4FE0 +4900 +5FE0 +6380 +8540 +0920 +ENDCHAR +STARTCHAR U_366C +ENCODING 13932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +FFE0 +5480 +BA80 +1080 +3940 +D620 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_366D +ENCODING 13933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +5540 +52E0 +FFA0 +5240 +5AC0 +5FC0 +5240 +7440 +94A0 +2920 +ENDCHAR +STARTCHAR U_366E +ENCODING 13934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4EE0 +5540 +E100 +4280 +4440 +5BA0 +4000 +67C0 +8440 +07C0 +ENDCHAR +STARTCHAR U_366F +ENCODING 13935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +23C0 +DB40 +7140 +22E0 +7FC0 +0000 +FFE0 +1100 +3F80 +ENDCHAR +STARTCHAR U_3670 +ENCODING 13936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73E0 +9120 +FA60 +AA80 +FBC0 +AC80 +FBE0 +8C80 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3671 +ENCODING 13937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5100 +FFE0 +4580 +77E0 +1540 +6B60 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3672 +ENCODING 13938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +5FE0 +4480 +EB40 +5DE0 +4540 +4BE0 +5D40 +65E0 +8940 +11E0 +ENDCHAR +STARTCHAR U_3673 +ENCODING 13939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +5FE0 +5080 +F7A0 +50A0 +5740 +55A0 +6740 +5440 +9AA0 +27A0 +ENDCHAR +STARTCHAR U_3674 +ENCODING 13940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4480 +EFE0 +4A40 +4FE0 +4800 +4BC0 +4800 +6BC0 +8A40 +13C0 +ENDCHAR +STARTCHAR U_3675 +ENCODING 13941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4280 +EFE0 +4AA0 +4BA0 +4860 +4920 +67C0 +C100 +1FE0 +ENDCHAR +STARTCHAR U_3676 +ENCODING 13942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +2480 +1500 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3677 +ENCODING 13943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +4820 +4FE0 +4440 +4EE0 +4440 +6EE0 +8540 +0AA0 +ENDCHAR +STARTCHAR U_3678 +ENCODING 13944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +4B60 +5940 +EBE0 +4940 +4BE0 +4880 +69C0 +8880 +0BE0 +0940 +ENDCHAR +STARTCHAR U_3679 +ENCODING 13945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5CE0 +4480 +EFE0 +4AA0 +5FE0 +5220 +65C0 +4A80 +8100 +0E00 +ENDCHAR +STARTCHAR U_367A +ENCODING 13946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +5100 +57C0 +F540 +5FE0 +5440 +57C0 +7440 +57C0 +9280 +1FE0 +ENDCHAR +STARTCHAR U_367B +ENCODING 13947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F540 +57C0 +5540 +57C0 +5540 +7BA0 +57C0 +9100 +2FE0 +ENDCHAR +STARTCHAR U_367C +ENCODING 13948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4540 +47C0 +E540 +47C0 +4000 +4FE0 +6AA0 +4FE0 +8AA0 +0FE0 +ENDCHAR +STARTCHAR U_367D +ENCODING 13949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4200 +5FE0 +4A40 +FEE0 +56A0 +5EE0 +56A0 +7FE0 +C280 +1C60 +ENDCHAR +STARTCHAR U_367E +ENCODING 13950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +4540 +46C0 +E540 +46C0 +4FE0 +5120 +6FC0 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_367F +ENCODING 13951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +5FE0 +4100 +EFC0 +4100 +5FE0 +4540 +7FE0 +4EA0 +9540 +0EA0 +ENDCHAR +STARTCHAR U_3680 +ENCODING 13952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +4460 +5FE0 +F640 +5F40 +5040 +5FC0 +5560 +7740 +95C0 +2F20 +ENDCHAR +STARTCHAR U_3681 +ENCODING 13953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +71C0 +2080 +FBE0 +5140 +FBE0 +5140 +FFE0 +5140 +5940 +9260 +ENDCHAR +STARTCHAR U_3682 +ENCODING 13954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4540 +EFE0 +4D60 +47C0 +4540 +6FE0 +8540 +0C80 +0660 +ENDCHAR +STARTCHAR U_3683 +ENCODING 13955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +1F00 +0000 +FFE0 +AAA0 +2E80 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3684 +ENCODING 13956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +A4A0 +3F80 +2480 +7FC0 +2740 +3400 +CFE0 +ENDCHAR +STARTCHAR U_3685 +ENCODING 13957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +7100 +0E00 +1100 +EEE0 +1400 +3F80 +4400 +1F00 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3686 +ENCODING 13958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +6900 +0600 +FDE0 +ENDCHAR +STARTCHAR U_3687 +ENCODING 13959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +4640 +5940 +7FC0 +1080 +2840 +DFA0 +3080 +4900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_3688 +ENCODING 13960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +4480 +C880 +2BE0 +1080 +1080 +2080 +4080 +8080 +0080 +ENDCHAR +STARTCHAR U_3689 +ENCODING 13961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +10E0 +2820 +DF60 +2A00 +0400 +0A00 +3780 +0C80 +0300 +3E00 +ENDCHAR +STARTCHAR U_368A +ENCODING 13962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +C880 +3100 +2240 +5180 +B920 +4A40 +B480 +2140 +C620 +ENDCHAR +STARTCHAR U_368B +ENCODING 13963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +9BA0 +6920 +4FE0 +C820 +7BA0 +9AA0 +6BA0 +4820 +9060 +ENDCHAR +STARTCHAR U_368C +ENCODING 13964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +57C0 +2540 +47C0 +A100 +7FE0 +D300 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_368D +ENCODING 13965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +D540 +2FE0 +4440 +C7C0 +7440 +D7C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_368E +ENCODING 13966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0840 +FFE0 +1200 +2100 +4080 +8060 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_368F +ENCODING 13967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1100 +2080 +4040 +9120 +1100 +FFE0 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_3690 +ENCODING 13968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +C460 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3691 +ENCODING 13969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +3F80 +0400 +0800 +FFE0 +1200 +2180 +C060 +ENDCHAR +STARTCHAR U_3692 +ENCODING 13970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +4500 +2480 +5540 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3693 +ENCODING 13971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +C460 +0400 +FFE0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_3694 +ENCODING 13972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +CA60 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3695 +ENCODING 13973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +6AC0 +BFA0 +0A80 +3F80 +2A00 +3FC0 +1240 +2280 +ENDCHAR +STARTCHAR U_3696 +ENCODING 13974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4040 +7FC0 +4040 +7FC0 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3697 +ENCODING 13975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +3180 +5F40 +9120 +1F00 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3698 +ENCODING 13976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FBE0 +2080 +FBE0 +2080 +2140 +5140 +4A20 +8420 +ENDCHAR +STARTCHAR U_3699 +ENCODING 13977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +2A20 +4A20 +9BE0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_369A +ENCODING 13978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +2480 +CF60 +3200 +0C00 +3000 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_369B +ENCODING 13979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +20E0 +DE00 +1080 +1F80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_369C +ENCODING 13980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2280 +C360 +FFE0 +4A80 +7A80 +0100 +3AA0 +C460 +ENDCHAR +STARTCHAR U_369D +ENCODING 13981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2280 +D760 +2200 +6FC0 +A200 +2780 +2200 +2FC0 +ENDCHAR +STARTCHAR U_369E +ENCODING 13982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +D160 +7BC0 +1100 +3B80 +3540 +5140 +1100 +ENDCHAR +STARTCHAR U_369F +ENCODING 13983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7F80 +A080 +3F80 +2220 +31E0 +0400 +FFE0 +1100 +60E0 +ENDCHAR +STARTCHAR U_36A0 +ENCODING 13984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +60C0 +9120 +7FC0 +0400 +3F80 +0400 +FFE0 +8920 +ENDCHAR +STARTCHAR U_36A1 +ENCODING 13985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5140 +8A20 +FFE0 +0820 +EBA0 +AAA0 +EBA0 +0820 +1860 +ENDCHAR +STARTCHAR U_36A2 +ENCODING 13986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +2100 +6FE0 +A240 +2480 +2280 +2100 +22C0 +2C20 +ENDCHAR +STARTCHAR U_36A3 +ENCODING 13987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +7180 +0400 +FFE0 +0900 +1A00 +0700 +78E0 +ENDCHAR +STARTCHAR U_36A4 +ENCODING 13988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2100 +F9E0 +4B00 +5100 +9100 +5080 +20A0 +5060 +8820 +ENDCHAR +STARTCHAR U_36A5 +ENCODING 13989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2080 +F880 +4880 +57E0 +9080 +5080 +2080 +5080 +8980 +ENDCHAR +STARTCHAR U_36A6 +ENCODING 13990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2140 +F940 +4940 +5140 +9140 +5140 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_36A7 +ENCODING 13991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +23E0 +FA00 +4A00 +5200 +9200 +5200 +2200 +5400 +8400 +ENDCHAR +STARTCHAR U_36A8 +ENCODING 13992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2280 +FA80 +4A80 +5780 +9280 +52A0 +22A0 +5260 +8A20 +ENDCHAR +STARTCHAR U_36A9 +ENCODING 13993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4FE0 +5240 +9240 +57E0 +2240 +5240 +8AC0 +ENDCHAR +STARTCHAR U_36AA +ENCODING 13994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2100 +F9E0 +4F00 +5100 +91E0 +5700 +2120 +5120 +89E0 +ENDCHAR +STARTCHAR U_36AB +ENCODING 13995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +2440 +F480 +55E0 +5420 +9640 +5540 +2480 +5940 +8A20 +ENDCHAR +STARTCHAR U_36AC +ENCODING 13996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FA20 +4D20 +50A0 +9020 +50A0 +2320 +5020 +88E0 +ENDCHAR +STARTCHAR U_36AD +ENCODING 13997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2100 +FFE0 +4900 +5180 +9280 +5280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36AE +ENCODING 13998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2420 +F800 +4BC0 +5240 +9240 +5240 +2240 +5440 +8860 +ENDCHAR +STARTCHAR U_36AF +ENCODING 13999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +24C0 +FEC0 +4D40 +5540 +96C0 +5440 +2460 +5420 +8820 +ENDCHAR +STARTCHAR U_36B0 +ENCODING 14000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +F900 +4B40 +5320 +9520 +5900 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_36B1 +ENCODING 14001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2300 +2200 +FA00 +4BE0 +5280 +9280 +5280 +2280 +5280 +87E0 +ENDCHAR +STARTCHAR U_36B2 +ENCODING 14002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +F9E0 +4900 +5100 +97E0 +5420 +2420 +5420 +87E0 +ENDCHAR +STARTCHAR U_36B3 +ENCODING 14003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2780 +FAE0 +4AA0 +52A0 +92A0 +52A0 +24E0 +5480 +8980 +ENDCHAR +STARTCHAR U_36B4 +ENCODING 14004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F900 +4A80 +57E0 +9AA0 +52A0 +22E0 +5080 +8880 +ENDCHAR +STARTCHAR U_36B5 +ENCODING 14005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +23E0 +FE40 +4980 +5240 +9420 +5180 +2040 +5300 +8880 +ENDCHAR +STARTCHAR U_36B6 +ENCODING 14006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +4A00 +5200 +93E0 +5220 +2220 +53E0 +8A20 +ENDCHAR +STARTCHAR U_36B7 +ENCODING 14007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +4920 +5100 +9540 +5920 +2120 +5100 +8B00 +ENDCHAR +STARTCHAR U_36B8 +ENCODING 14008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2020 +FBA0 +4820 +53A0 +92A0 +52A0 +23A0 +5020 +8860 +ENDCHAR +STARTCHAR U_36B9 +ENCODING 14009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2AA0 +FAA0 +4AA0 +52A0 +96A0 +5AE0 +2280 +5480 +8880 +ENDCHAR +STARTCHAR U_36BA +ENCODING 14010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2280 +FAE0 +4C20 +57A0 +9140 +5100 +27C0 +5100 +8B00 +ENDCHAR +STARTCHAR U_36BB +ENCODING 14011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +0800 +FF80 +1200 +3C00 +0E00 +F180 +ENDCHAR +STARTCHAR U_36BC +ENCODING 14012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +22A0 +FAA0 +4AA0 +53E0 +92A0 +52A0 +22A0 +53E0 +8A20 +ENDCHAR +STARTCHAR U_36BD +ENCODING 14013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +23E0 +3820 +E1A0 +0440 +FFE0 +0900 +1E00 +0700 +78E0 +ENDCHAR +STARTCHAR U_36BE +ENCODING 14014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +FC40 +4C40 +57C0 +9280 +5280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36BF +ENCODING 14015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +F420 +5BA0 +52A0 +93A0 +5220 +22C0 +5220 +8BE0 +ENDCHAR +STARTCHAR U_36C0 +ENCODING 14016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2120 +FA20 +4C40 +53E0 +9020 +53E0 +2020 +5020 +8BE0 +ENDCHAR +STARTCHAR U_36C1 +ENCODING 14017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +FD40 +4B80 +5100 +9FE0 +5100 +2100 +5100 +8100 +ENDCHAR +STARTCHAR U_36C2 +ENCODING 14018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2400 +FDE0 +4D20 +55A0 +9520 +55E0 +2500 +5520 +89E0 +ENDCHAR +STARTCHAR U_36C3 +ENCODING 14019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +10A0 +7CA0 +1120 +7E60 +1400 +FFE0 +1900 +0700 +78E0 +ENDCHAR +STARTCHAR U_36C4 +ENCODING 14020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F900 +4920 +52C0 +9680 +5A40 +2240 +5320 +8A20 +ENDCHAR +STARTCHAR U_36C5 +ENCODING 14021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +2240 +FBC0 +4A40 +53C0 +9240 +5260 +27C0 +5040 +8040 +ENDCHAR +STARTCHAR U_36C6 +ENCODING 14022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +22E0 +FA20 +4C20 +5540 +9100 +5FE0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_36C7 +ENCODING 14023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC00 +4C80 +5480 +97E0 +5480 +2480 +5480 +8BE0 +ENDCHAR +STARTCHAR U_36C8 +ENCODING 14024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2120 +F940 +4FE0 +5100 +97C0 +5A00 +23E0 +5020 +89C0 +ENDCHAR +STARTCHAR U_36C9 +ENCODING 14025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4280 +F280 +AFE0 +AAA0 +AAA0 +6CE0 +4820 +6820 +8FE0 +ENDCHAR +STARTCHAR U_36CA +ENCODING 14026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4A40 +5520 +9100 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_36CB +ENCODING 14027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +4920 +5100 +9540 +55A0 +2940 +5100 +8B00 +ENDCHAR +STARTCHAR U_36CC +ENCODING 14028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +2240 +FBE0 +48A0 +5280 +93E0 +5480 +27E0 +5080 +8880 +ENDCHAR +STARTCHAR U_36CD +ENCODING 14029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F900 +4D40 +5540 +93A0 +5100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_36CE +ENCODING 14030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4BC0 +5000 +97E0 +5420 +2420 +57E0 +8420 +ENDCHAR +STARTCHAR U_36CF +ENCODING 14031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +F900 +4D40 +5380 +9380 +5540 +2120 +5100 +8B00 +ENDCHAR +STARTCHAR U_36D0 +ENCODING 14032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +F540 +57C0 +5540 +97C0 +6500 +2200 +5580 +8860 +ENDCHAR +STARTCHAR U_36D1 +ENCODING 14033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1DE0 +5120 +FCC0 +2540 +F920 +0400 +FFE0 +1100 +0F00 +78E0 +ENDCHAR +STARTCHAR U_36D2 +ENCODING 14034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +F000 +57C0 +5440 +5440 +97C0 +6000 +2440 +5280 +8FE0 +ENDCHAR +STARTCHAR U_36D3 +ENCODING 14035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +4180 +4660 +F100 +57E0 +5280 +97E0 +6AA0 +22E0 +5080 +8080 +ENDCHAR +STARTCHAR U_36D4 +ENCODING 14036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47C0 +4C40 +F380 +5D60 +5380 +9100 +67C0 +2100 +57E0 +8100 +ENDCHAR +STARTCHAR U_36D5 +ENCODING 14037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +4440 +F7C0 +5000 +57C0 +9540 +67C0 +2400 +5420 +83E0 +ENDCHAR +STARTCHAR U_36D6 +ENCODING 14038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4240 +47C0 +F2A0 +5440 +5A20 +93C0 +6640 +2240 +5180 +8660 +ENDCHAR +STARTCHAR U_36D7 +ENCODING 14039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +4540 +F540 +5BA0 +5BA0 +9100 +67C0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_36D8 +ENCODING 14040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4100 +F7E0 +5820 +53C0 +9080 +67E0 +2100 +5100 +8300 +ENDCHAR +STARTCHAR U_36D9 +ENCODING 14041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +4FE0 +F440 +5280 +5FE0 +9100 +67C0 +2100 +5100 +8100 +ENDCHAR +STARTCHAR U_36DA +ENCODING 14042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4040 +4380 +F080 +57E0 +5520 +97E0 +5520 +27E0 +5520 +8560 +ENDCHAR +STARTCHAR U_36DB +ENCODING 14043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +4240 +FBC0 +5240 +53C0 +9260 +57C0 +20C0 +5140 +86C0 +ENDCHAR +STARTCHAR U_36DC +ENCODING 14044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43E0 +D640 +5140 +5080 +4760 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_36DD +ENCODING 14045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FBC0 +4A40 +53C0 +9240 +53C0 +2000 +5240 +8420 +ENDCHAR +STARTCHAR U_36DE +ENCODING 14046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +F100 +57E0 +5000 +9240 +67E0 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_36DF +ENCODING 14047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +F900 +4FC0 +5540 +9540 +57E0 +2100 +5280 +8460 +ENDCHAR +STARTCHAR U_36E0 +ENCODING 14048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +45E0 +E820 +4BA0 +AAA0 +ABA0 +AAA0 +AAA0 +4BA0 +4820 +A860 +ENDCHAR +STARTCHAR U_36E1 +ENCODING 14049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +4FE0 +F820 +5780 +9000 +9FC0 +6500 +2520 +5520 +89E0 +ENDCHAR +STARTCHAR U_36E2 +ENCODING 14050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +27E0 +FB80 +4D40 +5120 +97C0 +5240 +2260 +5420 +88C0 +ENDCHAR +STARTCHAR U_36E3 +ENCODING 14051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F000 +57C0 +5440 +9540 +6540 +2540 +5280 +8460 +ENDCHAR +STARTCHAR U_36E4 +ENCODING 14052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +FEE0 +AAA0 +AAA0 +AAA0 +AEE0 +AAA0 +4AA0 +6AA0 +9AA0 +ENDCHAR +STARTCHAR U_36E5 +ENCODING 14053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +4FC0 +F340 +5520 +5900 +97E0 +6420 +27E0 +5420 +8FE0 +ENDCHAR +STARTCHAR U_36E6 +ENCODING 14054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +4FE0 +F480 +55C0 +55A0 +96A0 +66A0 +2480 +5480 +8480 +ENDCHAR +STARTCHAR U_36E7 +ENCODING 14055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +4540 +F7C0 +5000 +57E0 +9200 +67C0 +2A40 +5240 +83C0 +ENDCHAR +STARTCHAR U_36E8 +ENCODING 14056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +47C0 +F100 +57C0 +5100 +9FE0 +6280 +22A0 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36E9 +ENCODING 14057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4240 +F7C0 +5020 +57C0 +9440 +67C0 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_36EA +ENCODING 14058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4280 +F560 +5FC0 +5540 +97C0 +6540 +27C0 +5120 +81E0 +ENDCHAR +STARTCHAR U_36EB +ENCODING 14059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F440 +57C0 +5200 +97E0 +5AA0 +24A0 +5120 +8240 +ENDCHAR +STARTCHAR U_36EC +ENCODING 14060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +F7E0 +4A80 +5440 +9920 +5100 +27C0 +5100 +87E0 +ENDCHAR +STARTCHAR U_36ED +ENCODING 14061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +47C0 +F280 +5FE0 +5000 +97C0 +5440 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_36EE +ENCODING 14062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4920 +F7C0 +5100 +56C0 +9820 +67C0 +3440 +4380 +8C60 +ENDCHAR +STARTCHAR U_36EF +ENCODING 14063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +E4E0 +7EA0 +AAA0 +AAA0 +BEA0 +54A0 +5500 +5420 +A3E0 +ENDCHAR +STARTCHAR U_36F0 +ENCODING 14064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F480 +57E0 +5440 +97E0 +6440 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_36F1 +ENCODING 14065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +4FC0 +5000 +97E0 +5520 +2540 +5480 +8660 +ENDCHAR +STARTCHAR U_36F2 +ENCODING 14066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +FC40 +57C0 +5440 +97C0 +5440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_36F3 +ENCODING 14067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +FFE0 +8420 +7FC0 +4440 +FFE0 +3100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_36F4 +ENCODING 14068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4540 +4280 +FD40 +52A0 +57E0 +96A0 +6520 +26A0 +5460 +8FE0 +ENDCHAR +STARTCHAR U_36F5 +ENCODING 14069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4F80 +4A20 +F540 +5100 +57C0 +9540 +67C0 +2540 +5FE0 +8540 +ENDCHAR +STARTCHAR U_36F6 +ENCODING 14070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +47E0 +FC00 +57E0 +5480 +96A0 +65C0 +2480 +5140 +8E20 +ENDCHAR +STARTCHAR U_36F7 +ENCODING 14071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +3980 +56A0 +94E0 +0800 +FFE0 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_36F8 +ENCODING 14072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +47E0 +F900 +4FC0 +5000 +97C0 +6440 +27C0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_36F9 +ENCODING 14073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4BE0 +4880 +EBE0 +5AA0 +ABE0 +AAA0 +ABE0 +4A80 +4900 +AAE0 +ENDCHAR +STARTCHAR U_36FA +ENCODING 14074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +5000 +97C0 +6440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_36FB +ENCODING 14075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F280 +5540 +5BA0 +9100 +A7E0 +6100 +23C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_36FC +ENCODING 14076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +4100 +F7E0 +5100 +5360 +9520 +6560 +2720 +5520 +87E0 +ENDCHAR +STARTCHAR U_36FD +ENCODING 14077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +5540 +9380 +A100 +AFE0 +6380 +2540 +5920 +8100 +ENDCHAR +STARTCHAR U_36FE +ENCODING 14078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +4FE0 +E880 +AF80 +A880 +AEA0 +AA40 +4EC0 +A940 +9620 +ENDCHAR +STARTCHAR U_36FF +ENCODING 14079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4540 +4FE0 +F540 +5FE0 +5920 +97C0 +5540 +2540 +5100 +8900 +ENDCHAR +STARTCHAR U_3700 +ENCODING 14080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +44E0 +5FA0 +E4A0 +AEE0 +ADA0 +B5A0 +A4E0 +44A0 +64A0 +84E0 +ENDCHAR +STARTCHAR U_3701 +ENCODING 14081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2380 +F540 +5FE0 +5440 +97C0 +6440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_3702 +ENCODING 14082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +73E0 +2040 +FA40 +2140 +7140 +2440 +FFE0 +1100 +0F00 +7C80 +ENDCHAR +STARTCHAR U_3703 +ENCODING 14083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +5480 +FFE0 +5400 +55C0 +9400 +95C0 +6400 +25C0 +5540 +85C0 +ENDCHAR +STARTCHAR U_3704 +ENCODING 14084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +44C0 +5740 +F540 +57C0 +5540 +97C0 +E540 +25C0 +5740 +8820 +ENDCHAR +STARTCHAR U_3705 +ENCODING 14085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F100 +5680 +5300 +9640 +97C0 +5540 +27C0 +5540 +87C0 +ENDCHAR +STARTCHAR U_3706 +ENCODING 14086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +51C0 +EBE0 +7C80 +A9C0 +A9C0 +AAA0 +6CA0 +2880 +5680 +81E0 +ENDCHAR +STARTCHAR U_3707 +ENCODING 14087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57C0 +F100 +5FE0 +5100 +57C0 +9100 +5FE0 +2240 +5D60 +87C0 +ENDCHAR +STARTCHAR U_3708 +ENCODING 14088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +1240 +F9C0 +3EA0 +53C0 +9140 +3640 +FFE0 +0900 +0F00 +7880 +ENDCHAR +STARTCHAR U_3709 +ENCODING 14089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4540 +52A0 +F7E0 +5420 +57E0 +9520 +67E0 +2400 +5420 +87E0 +ENDCHAR +STARTCHAR U_370A +ENCODING 14090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +57E0 +F540 +57E0 +5540 +97E0 +5540 +2560 +5540 +89A0 +ENDCHAR +STARTCHAR U_370B +ENCODING 14091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +5FE0 +E280 +A440 +A820 +B020 +6FE0 +2AA0 +5AA0 +9FE0 +ENDCHAR +STARTCHAR U_370C +ENCODING 14092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +0400 +FBC0 +AA40 +FA40 +5140 +3180 +DE60 +ENDCHAR +STARTCHAR U_370D +ENCODING 14093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E900 +6FC0 +A940 +AFE0 +A940 +AFC0 +6A40 +6A40 +93C0 +ENDCHAR +STARTCHAR U_370E +ENCODING 14094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5520 +F2C0 +5100 +5780 +5240 +97E0 +5100 +27E0 +5240 +8420 +ENDCHAR +STARTCHAR U_370F +ENCODING 14095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +5240 +F7E0 +5420 +57E0 +5420 +97E0 +5420 +27E0 +5240 +8420 +ENDCHAR +STARTCHAR U_3710 +ENCODING 14096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +57C0 +F000 +57C0 +5000 +57C0 +5440 +27C0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_3711 +ENCODING 14097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +8540 +57C0 +2540 +C7C0 +4D40 +FFE0 +1100 +1F00 +70C0 +ENDCHAR +STARTCHAR U_3712 +ENCODING 14098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +4420 +5660 +F420 +5660 +5240 +97E0 +5240 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_3713 +ENCODING 14099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5EE0 +F540 +5100 +5280 +5440 +9BA0 +5000 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_3714 +ENCODING 14100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +5280 +FFE0 +5000 +57C0 +9440 +57C0 +2280 +52A0 +8C60 +ENDCHAR +STARTCHAR U_3715 +ENCODING 14101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +F2A0 +6BE0 +BEA0 +ABE0 +A880 +6BE0 +2880 +5680 +81E0 +ENDCHAR +STARTCHAR U_3716 +ENCODING 14102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +5FE0 +4AA0 +FFE0 +AAA0 +AFE0 +A440 +67C0 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_3717 +ENCODING 14103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4AA0 +FFE0 +A200 +A500 +AAE0 +7D00 +26C0 +5300 +8C00 +ENDCHAR +STARTCHAR U_3718 +ENCODING 14104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +6AA0 +AFC0 +AA40 +ABC0 +6A40 +2BC0 +5A40 +97E0 +ENDCHAR +STARTCHAR U_3719 +ENCODING 14105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +EA80 +6FE0 +AAA0 +AFE0 +AA40 +AB60 +6A40 +5AC0 +9360 +ENDCHAR +STARTCHAR U_371A +ENCODING 14106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +65E0 +A480 +ADE0 +A520 +65E0 +2520 +55E0 +8520 +ENDCHAR +STARTCHAR U_371B +ENCODING 14107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4440 +FF40 +5540 +5F40 +9540 +5F40 +24A0 +5FA0 +8520 +ENDCHAR +STARTCHAR U_371C +ENCODING 14108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E5A0 +6EA0 +A8A0 +BE40 +A840 +6E40 +2AA0 +5AA0 +9520 +ENDCHAR +STARTCHAR U_371D +ENCODING 14109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +5D60 +F7C0 +5080 +5FE0 +9280 +6FE0 +2AA0 +5D60 +8FE0 +ENDCHAR +STARTCHAR U_371E +ENCODING 14110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +FBE0 +AA80 +FA80 +AC80 +FFE0 +2900 +1E00 +7180 +ENDCHAR +STARTCHAR U_371F +ENCODING 14111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D00 +4500 +FFE0 +5540 +5D40 +5540 +9C80 +5480 +3D40 +5540 +8620 +ENDCHAR +STARTCHAR U_3720 +ENCODING 14112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +FFE0 +5480 +57E0 +5C80 +97E0 +6480 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_3721 +ENCODING 14113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4940 +F6A0 +A800 +B880 +A880 +AAE0 +4A80 +6B80 +5A80 +8C60 +ENDCHAR +STARTCHAR U_3722 +ENCODING 14114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +6FE0 +A540 +A7C0 +A540 +6FE0 +2240 +5180 +8E40 +ENDCHAR +STARTCHAR U_3723 +ENCODING 14115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EC0 +F2A0 +ABE0 +B480 +AC80 +A940 +5220 +6000 +5540 +92A0 +ENDCHAR +STARTCHAR U_3724 +ENCODING 14116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EFE0 +AAA0 +AFE0 +A440 +A7C0 +6540 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_3725 +ENCODING 14117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FFE0 +5440 +57C0 +5440 +97C0 +6440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_3726 +ENCODING 14118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +EFE0 +6040 +AFE0 +A4A0 +AEE0 +6080 +5FE0 +4480 +8180 +ENDCHAR +STARTCHAR U_3727 +ENCODING 14119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4D40 +FA60 +6FC0 +AA40 +AAC0 +AFC0 +6A40 +2A40 +5AA0 +9520 +ENDCHAR +STARTCHAR U_3728 +ENCODING 14120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +6AA0 +A9C0 +AEA0 +AA80 +4FE0 +6880 +5FE0 +9080 +ENDCHAR +STARTCHAR U_3729 +ENCODING 14121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +EB60 +6DA0 +AB20 +AFE0 +ABA0 +6540 +2FE0 +5300 +8CE0 +ENDCHAR +STARTCHAR U_372A +ENCODING 14122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FD80 +4900 +FDE0 +1140 +FE40 +5440 +FFE0 +0900 +1200 +7F80 +ENDCHAR +STARTCHAR U_372B +ENCODING 14123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +5A80 +EFE0 +B8A0 +AFA0 +B040 +D540 +5540 +7540 +95A0 +98A0 +ENDCHAR +STARTCHAR U_372C +ENCODING 14124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +EFE0 +AAA0 +AFE0 +A800 +ABE0 +6800 +2BE0 +5A20 +93E0 +ENDCHAR +STARTCHAR U_372D +ENCODING 14125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +FFE0 +B020 +A7C0 +A440 +AFE0 +6920 +2FE0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_372E +ENCODING 14126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4A40 +FFE0 +6900 +AF00 +AAE0 +AF00 +6000 +3FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_372F +ENCODING 14127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EFA0 +68E0 +AF80 +AA80 +AAA0 +4FE0 +6000 +5D40 +92A0 +ENDCHAR +STARTCHAR U_3730 +ENCODING 14128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +4BC0 +FEE0 +67A0 +AAC0 +BFE0 +A100 +7FE0 +2380 +5540 +9920 +ENDCHAR +STARTCHAR U_3731 +ENCODING 14129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4880 +EFE0 +6AA0 +B7E0 +A440 +A7C0 +6440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_3732 +ENCODING 14130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +5400 +F7C0 +5440 +5FE0 +AAA0 +6FA0 +2AE0 +5FA0 +92A0 +ENDCHAR +STARTCHAR U_3733 +ENCODING 14131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +EAA0 +6FE0 +A920 +A7C0 +A920 +6240 +2D80 +5480 +8E60 +ENDCHAR +STARTCHAR U_3734 +ENCODING 14132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4EE0 +E280 +6FE0 +AAA0 +AFE0 +A820 +67C0 +2540 +56C0 +87C0 +ENDCHAR +STARTCHAR U_3735 +ENCODING 14133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +E480 +67C0 +A480 +A7C0 +A480 +77E0 +2AA0 +5DC0 +8660 +ENDCHAR +STARTCHAR U_3736 +ENCODING 14134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +45E0 +EC20 +77E0 +A5A0 +A6E0 +A500 +6FE0 +3520 +57C0 +8CE0 +ENDCHAR +STARTCHAR U_3737 +ENCODING 14135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +2540 +EFE0 +8B60 +EDA0 +2B60 +6DA0 +0880 +FFE0 +1100 +7FC0 +ENDCHAR +STARTCHAR U_3738 +ENCODING 14136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +4080 +FBE0 +8940 +F3E0 +8880 +FFE0 +1080 +1F00 +E0C0 +ENDCHAR +STARTCHAR U_3739 +ENCODING 14137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EEE0 +6AA0 +AEE0 +A480 +AFE0 +7480 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_373A +ENCODING 14138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5FE0 +4440 +FFE0 +6CC0 +B7E0 +A440 +67C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_373B +ENCODING 14139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +53C0 +ECA0 +6BC0 +BC40 +ABE0 +B6A0 +6BC0 +2540 +54A0 +8BE0 +ENDCHAR +STARTCHAR U_373C +ENCODING 14140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +E7C0 +A540 +AFE0 +AAA0 +AFE0 +6AA0 +2380 +5280 +8FE0 +ENDCHAR +STARTCHAR U_373D +ENCODING 14141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +4480 +2240 +3F80 +0200 +0440 +FFE0 +0400 +0400 +1C00 +0400 +ENDCHAR +STARTCHAR U_373E +ENCODING 14142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1300 +2480 +2840 +34A0 +6480 +A480 +2480 +2480 +A480 +4880 +ENDCHAR +STARTCHAR U_373F +ENCODING 14143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2080 +4300 +4100 +6FE0 +C140 +4100 +4100 +4100 +C500 +4300 +ENDCHAR +STARTCHAR U_3740 +ENCODING 14144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6840 +5880 +4880 +FFE0 +6880 +5880 +4880 +FC80 +0980 +1880 +ENDCHAR +STARTCHAR U_3741 +ENCODING 14145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5120 +9F20 +1120 +1F20 +00C0 +3F00 +0240 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_3742 +ENCODING 14146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +2580 +5F00 +45E0 +7540 +C740 +4D40 +5540 +4540 +4540 +CA40 +ENDCHAR +STARTCHAR U_3743 +ENCODING 14147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23C0 +2480 +2FE0 +3520 +E520 +27E0 +2180 +2280 +A2A0 +6CE0 +ENDCHAR +STARTCHAR U_3744 +ENCODING 14148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4BE0 +7880 +02A0 +FAA0 +13E0 +38A0 +E080 +20A0 +60E0 +ENDCHAR +STARTCHAR U_3745 +ENCODING 14149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA20 +8C00 +73C0 +0040 +7280 +3900 +E280 +2460 +ENDCHAR +STARTCHAR U_3746 +ENCODING 14150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +27C0 +3440 +E7C0 +2440 +2280 +2FE0 +A440 +67C0 +ENDCHAR +STARTCHAR U_3747 +ENCODING 14151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +0000 +7BC0 +4A40 +7BC0 +0000 +7BC0 +1880 +F3E0 +3180 +ENDCHAR +STARTCHAR U_3748 +ENCODING 14152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5EA0 +E1C0 +5EA0 +F1E0 +4E80 +FBE0 +2E40 +FBE0 +2040 +60C0 +ENDCHAR +STARTCHAR U_3749 +ENCODING 14153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0800 +0400 +FFE0 +8020 +8020 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR U_374A +ENCODING 14154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +3F80 +1100 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_374B +ENCODING 14155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +4040 +BF00 +0200 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_374C +ENCODING 14156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0F80 +1100 +2200 +0600 +0900 +3080 +C060 +ENDCHAR +STARTCHAR U_374D +ENCODING 14157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9040 +1F00 +1000 +3F80 +0080 +FFE0 +0080 +0680 +0100 +ENDCHAR +STARTCHAR U_374E +ENCODING 14158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4220 +7FE0 +8840 +0400 +3F80 +0100 +0600 +1800 +6C00 +03E0 +ENDCHAR +STARTCHAR U_374F +ENCODING 14159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +4040 +8480 +0A00 +1100 +2980 +C960 +0900 +1100 +2100 +ENDCHAR +STARTCHAR U_3750 +ENCODING 14160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8A40 +1100 +2480 +C460 +0800 +1080 +27C0 +7840 +ENDCHAR +STARTCHAR U_3751 +ENCODING 14161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8820 +0400 +FFE0 +0800 +0FC0 +0840 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_3752 +ENCODING 14162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8020 +0400 +7FC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3753 +ENCODING 14163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0E00 +3180 +C060 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3754 +ENCODING 14164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0400 +FFC0 +8840 +0400 +FFC0 +1200 +6180 +1E00 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_3755 +ENCODING 14165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +FFC0 +9040 +0800 +6280 +9E40 +0000 +7F80 +2100 +1E00 +E1C0 +ENDCHAR +STARTCHAR U_3756 +ENCODING 14166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +0F80 +3900 +0600 +7C00 +0780 +3880 +0500 +7E00 +ENDCHAR +STARTCHAR U_3757 +ENCODING 14167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +2080 +3F80 +2080 +3F80 +2480 +2700 +38C0 +ENDCHAR +STARTCHAR U_3758 +ENCODING 14168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3759 +ENCODING 14169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +3FC0 +0400 +3F80 +0400 +7FC0 +0000 +FFE0 +2080 +ENDCHAR +STARTCHAR U_375A +ENCODING 14170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +7080 +1700 +2500 +35C0 +5500 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_375B +ENCODING 14171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9040 +2FC0 +4200 +9FC0 +5240 +5540 +58C0 +5040 +5FC0 +ENDCHAR +STARTCHAR U_375C +ENCODING 14172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A140 +7FC0 +2100 +FFE0 +0000 +7FC0 +4640 +5840 +7FC0 +ENDCHAR +STARTCHAR U_375D +ENCODING 14173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +2080 +FBE0 +2080 +71C0 +AAC0 +24A0 +2080 +2080 +ENDCHAR +STARTCHAR U_375E +ENCODING 14174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +0A00 +7BC0 +4040 +4040 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_375F +ENCODING 14175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +BFA0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +0A20 +F3E0 +ENDCHAR +STARTCHAR U_3760 +ENCODING 14176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +0400 +7FC0 +1100 +ENDCHAR +STARTCHAR U_3761 +ENCODING 14177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7E00 +25E0 +3D20 +2520 +3D40 +2480 +7D40 +0620 +ENDCHAR +STARTCHAR U_3762 +ENCODING 14178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +3F80 +0400 +3F80 +2480 +3F80 +4540 +4F40 +4040 +ENDCHAR +STARTCHAR U_3763 +ENCODING 14179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +7BC0 +2140 +FA40 +24C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3764 +ENCODING 14180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5120 +FFE0 +1100 +7FC0 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_3765 +ENCODING 14181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8020 +5920 +5540 +7FE0 +1100 +F380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_3766 +ENCODING 14182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9220 +1FC0 +7200 +1F80 +1200 +7FE0 +0980 +1040 +60C0 +ENDCHAR +STARTCHAR U_3767 +ENCODING 14183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +0E00 +3580 +5540 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3768 +ENCODING 14184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +FFE0 +2080 +3F80 +2240 +E980 +30E0 +ENDCHAR +STARTCHAR U_3769 +ENCODING 14185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +7FC0 +4480 +7FE0 +4480 +7F80 +5480 +4D00 +B4C0 +ENDCHAR +STARTCHAR U_376A +ENCODING 14186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7900 +27C0 +F940 +5340 +F9C0 +2140 +FA60 +2C20 +ENDCHAR +STARTCHAR U_376B +ENCODING 14187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +77C0 +5A40 +7580 +57E0 +5900 +67C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_376C +ENCODING 14188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +A5E0 +7880 +2080 +7BE0 +2080 +FC80 +4940 +4A40 +7C20 +ENDCHAR +STARTCHAR U_376D +ENCODING 14189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +27C0 +24C0 +B540 +A7C0 +B900 +27C0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_376E +ENCODING 14190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +A800 +FFC0 +AA40 +FA40 +0180 +F980 +7240 +AC20 +ENDCHAR +STARTCHAR U_376F +ENCODING 14191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +FFE0 +5140 +BFA0 +2A80 +2E80 +2180 +ENDCHAR +STARTCHAR U_3770 +ENCODING 14192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +3F80 +2480 +FFE0 +A4A0 +5F40 +0400 +0F80 +3180 +ENDCHAR +STARTCHAR U_3771 +ENCODING 14193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +82A0 +5FC0 +5280 +7FE0 +1AA0 +7FE0 +5340 +5080 +9F00 +ENDCHAR +STARTCHAR U_3772 +ENCODING 14194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +82A0 +57C0 +5540 +77E0 +19A0 +F280 +5FE0 +9540 +1100 +ENDCHAR +STARTCHAR U_3773 +ENCODING 14195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +2540 +24A0 +44A0 +8400 +1400 +0800 +ENDCHAR +STARTCHAR U_3774 +ENCODING 14196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7040 +07E0 +0040 +FA40 +5140 +5040 +5140 +5080 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3775 +ENCODING 14197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2880 +3F80 +0000 +3F80 +0100 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_3776 +ENCODING 14198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0A20 +1220 +E1E0 +0100 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_3777 +ENCODING 14199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +7FC0 +2540 +FA60 +0520 +FFE0 +2100 +1300 +ENDCHAR +STARTCHAR U_3778 +ENCODING 14200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2580 +D460 +3F80 +2080 +3F80 +2080 +3F80 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_3779 +ENCODING 14201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +C740 +0E20 +F200 +1F80 +6480 +3F80 +0B00 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_377A +ENCODING 14202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5080 +FDC0 +55A0 +FEA0 +54A0 +FCC0 +5880 +D500 +5600 +ENDCHAR +STARTCHAR U_377B +ENCODING 14203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5080 +F9C0 +AAA0 +FCA0 +2080 +F8C0 +2080 +3900 +E600 +ENDCHAR +STARTCHAR U_377C +ENCODING 14204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43C0 +F880 +5080 +57E0 +5080 +5080 +5280 +5100 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377D +ENCODING 14205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +F880 +57A0 +51C0 +52C0 +5CA0 +5080 +5180 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377E +ENCODING 14206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +FBE0 +5100 +51E0 +5240 +5240 +55E0 +5000 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377F +ENCODING 14207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +FD40 +5500 +57C0 +5640 +5580 +5A80 +5460 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3780 +ENCODING 14208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +4FE0 +FA80 +52A0 +55C0 +5480 +5940 +5620 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3781 +ENCODING 14209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +FC40 +57C0 +5400 +57C0 +5440 +53C0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3782 +ENCODING 14210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4640 +FD40 +5280 +57E0 +5240 +5240 +5180 +5660 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3783 +ENCODING 14211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +4920 +8500 +27E0 +3140 +4940 +8540 +7940 +4A40 +4A40 +7C60 +ENDCHAR +STARTCHAR U_3784 +ENCODING 14212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4540 +FFE0 +5540 +57C0 +5540 +57C0 +5100 +90E0 +8FC0 +ENDCHAR +STARTCHAR U_3785 +ENCODING 14213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +FFC0 +5540 +57C0 +5100 +5FE0 +5540 +5920 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3786 +ENCODING 14214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +4280 +FC40 +57E0 +5040 +5740 +5540 +5740 +90A0 +8FE0 +ENDCHAR +STARTCHAR U_3787 +ENCODING 14215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +FFC0 +5540 +5FE0 +5540 +5580 +5480 +5660 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3788 +ENCODING 14216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +FC20 +57E0 +5400 +57E0 +5AA0 +5FE0 +52A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3789 +ENCODING 14217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +F900 +53C0 +5100 +57E0 +5280 +5480 +5BE0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_378A +ENCODING 14218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +F900 +AFE0 +F940 +0140 +7140 +0140 +F940 +7240 +AA40 +2460 +ENDCHAR +STARTCHAR U_378B +ENCODING 14219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +7FC0 +5040 +4880 +4500 +4200 +8D80 +F060 +ENDCHAR +STARTCHAR U_378C +ENCODING 14220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F80 +4100 +7FE0 +4200 +4200 +8200 +8600 +ENDCHAR +STARTCHAR U_378D +ENCODING 14221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4400 +4400 +5F80 +4480 +4C80 +4480 +8AA0 +B060 +ENDCHAR +STARTCHAR U_378E +ENCODING 14222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +5240 +5FC0 +5000 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_378F +ENCODING 14223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +4200 +5F80 +4080 +4300 +8C00 +B3E0 +ENDCHAR +STARTCHAR U_3790 +ENCODING 14224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4800 +4400 +7FC0 +4000 +5080 +4880 +4900 +BFE0 +ENDCHAR +STARTCHAR U_3791 +ENCODING 14225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +4200 +5AE0 +4200 +5AE0 +4200 +8220 +81E0 +ENDCHAR +STARTCHAR U_3792 +ENCODING 14226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4400 +5FC0 +5040 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_3793 +ENCODING 14227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5000 +5FC0 +5020 +4FE0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_3794 +ENCODING 14228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4400 +4F80 +5500 +46E0 +5B20 +4540 +8180 +9E00 +ENDCHAR +STARTCHAR U_3795 +ENCODING 14229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4880 +5FC0 +68A0 +4F80 +4880 +4F80 +8880 +8980 +ENDCHAR +STARTCHAR U_3796 +ENCODING 14230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4200 +7FE0 +4200 +5FC0 +5240 +57C0 +8A80 +B260 +ENDCHAR +STARTCHAR U_3797 +ENCODING 14231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4280 +4240 +7FE0 +5220 +4B40 +4A80 +B260 +8600 +ENDCHAR +STARTCHAR U_3798 +ENCODING 14232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FE0 +4600 +5B20 +4DC0 +5B40 +8520 +9A00 +ENDCHAR +STARTCHAR U_3799 +ENCODING 14233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4200 +4F80 +4200 +5FC0 +4220 +5BE0 +8A80 +B640 +ENDCHAR +STARTCHAR U_379A +ENCODING 14234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F80 +4200 +7FE0 +5240 +5AC0 +5240 +9FC0 +ENDCHAR +STARTCHAR U_379B +ENCODING 14235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4A00 +73C0 +4A20 +71E0 +5240 +53C0 +5240 +93C0 +ENDCHAR +STARTCHAR U_379C +ENCODING 14236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4B80 +5100 +6FE0 +5540 +7FE0 +5240 +9180 +9660 +ENDCHAR +STARTCHAR U_379D +ENCODING 14237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4D00 +48A0 +7E40 +AAA0 +BFC0 +2040 +3FC0 +2000 +4000 +ENDCHAR +STARTCHAR U_379E +ENCODING 14238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4A80 +72C0 +4D20 +7100 +55C0 +5500 +9700 +98E0 +ENDCHAR +STARTCHAR U_379F +ENCODING 14239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4880 +7FE0 +4500 +5FC0 +5540 +7FE0 +4880 +B060 +ENDCHAR +STARTCHAR U_37A0 +ENCODING 14240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4200 +7FE0 +54A0 +4FC0 +7960 +4FC0 +8A80 +B260 +ENDCHAR +STARTCHAR U_37A1 +ENCODING 14241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4880 +7DE0 +4880 +7DE0 +4A20 +5D40 +A880 +8C60 +ENDCHAR +STARTCHAR U_37A2 +ENCODING 14242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +4440 +7FC0 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_37A3 +ENCODING 14243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1800 +E000 +1900 +60C0 +9FA0 +0880 +3080 +C300 +ENDCHAR +STARTCHAR U_37A4 +ENCODING 14244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +0400 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_37A5 +ENCODING 14245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +0800 +0400 +0A00 +1200 +2180 +C060 +ENDCHAR +STARTCHAR U_37A6 +ENCODING 14246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +2280 +AA80 +AA80 +AA80 +AA80 +BAA0 +EAA0 +04A0 +1860 +ENDCHAR +STARTCHAR U_37A7 +ENCODING 14247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +0880 +11E0 +1020 +2020 +C0C0 +ENDCHAR +STARTCHAR U_37A8 +ENCODING 14248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +2080 +A900 +A900 +AFE0 +A900 +B900 +E900 +0100 +0300 +ENDCHAR +STARTCHAR U_37A9 +ENCODING 14249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +1F00 +1100 +1D00 +1320 +2120 +C0E0 +ENDCHAR +STARTCHAR U_37AA +ENCODING 14250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +0000 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37AB +ENCODING 14251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0800 +0400 +7FC0 +0300 +0C00 +7000 +9FE0 +ENDCHAR +STARTCHAR U_37AC +ENCODING 14252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +4440 +7FC0 +0000 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_37AD +ENCODING 14253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +1100 +2080 +C060 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37AE +ENCODING 14254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0800 +0800 +17C0 +2080 +CD00 +0200 +0180 +ENDCHAR +STARTCHAR U_37AF +ENCODING 14255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +0040 +FFC0 +8000 +8020 +7FE0 +0000 +0400 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_37B0 +ENCODING 14256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21E0 +AA80 +AC80 +A880 +ABE0 +B880 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B1 +ENCODING 14257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +8420 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_37B2 +ENCODING 14258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +ABE0 +AAA0 +AAA0 +AAA0 +BBE0 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B3 +ENCODING 14259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2280 +A880 +AC80 +AA80 +A8E0 +BF80 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B4 +ENCODING 14260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +AA80 +AA80 +ABE0 +AA80 +AA80 +AA80 +FAA0 +0360 +0220 +ENDCHAR +STARTCHAR U_37B5 +ENCODING 14261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +8420 +FFE0 +0800 +0400 +FFE0 +1100 +0E00 +1300 +E0E0 +ENDCHAR +STARTCHAR U_37B6 +ENCODING 14262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +AA40 +AA40 +AA80 +AA80 +B900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_37B7 +ENCODING 14263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +1800 +6000 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_37B8 +ENCODING 14264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +FFE0 +0C00 +3700 +C4C0 +0420 +0400 +ENDCHAR +STARTCHAR U_37B9 +ENCODING 14265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +2040 +AF40 +A940 +A940 +AF40 +B840 +E840 +0040 +00C0 +ENDCHAR +STARTCHAR U_37BA +ENCODING 14266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +2000 +3FC0 +4400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_37BB +ENCODING 14267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +3F80 +2080 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_37BC +ENCODING 14268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0200 +0420 +F640 +0D80 +3480 +C460 +0C00 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37BD +ENCODING 14269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +A900 +A920 +A960 +A940 +B940 +E880 +8CA0 +0960 +ENDCHAR +STARTCHAR U_37BE +ENCODING 14270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +ABE0 +AA00 +AA80 +AAA0 +BAC0 +EC80 +04A0 +08E0 +ENDCHAR +STARTCHAR U_37BF +ENCODING 14271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +0400 +7FC0 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_37C0 +ENCODING 14272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +E4E0 +0000 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37C1 +ENCODING 14273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +2200 +AAE0 +AA40 +AA40 +ABE0 +BA40 +EA40 +0440 +0440 +ENDCHAR +STARTCHAR U_37C2 +ENCODING 14274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +22C0 +AA40 +AFE0 +AA40 +AAC0 +BA40 +EBE0 +0040 +00C0 +ENDCHAR +STARTCHAR U_37C3 +ENCODING 14275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +23A0 +A820 +ABA0 +AAA0 +AAA0 +AAA0 +FBA0 +0020 +00E0 +ENDCHAR +STARTCHAR U_37C4 +ENCODING 14276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +A100 +AFC0 +A900 +A900 +AFE0 +F900 +0100 +0100 +ENDCHAR +STARTCHAR U_37C5 +ENCODING 14277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +A920 +AAA0 +A820 +AFE0 +AA80 +BA80 +EAA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_37C6 +ENCODING 14278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +26C0 +AB80 +AAA0 +AA60 +A900 +AFE0 +F900 +0100 +0100 +ENDCHAR +STARTCHAR U_37C7 +ENCODING 14279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2540 +AD40 +ABA0 +ABA0 +A900 +AFC0 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_37C8 +ENCODING 14280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +A7E0 +A900 +AD40 +AB80 +A980 +BB40 +E520 +0920 +0300 +ENDCHAR +STARTCHAR U_37C9 +ENCODING 14281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AA20 +A880 +AA80 +ABE0 +AC80 +BBE0 +C880 +0080 +0080 +ENDCHAR +STARTCHAR U_37CA +ENCODING 14282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +24A0 +AA40 +A800 +ABC0 +A880 +AFE0 +F900 +0100 +0300 +ENDCHAR +STARTCHAR U_37CB +ENCODING 14283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +A440 +A440 +AFC0 +AA80 +BA80 +EAA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_37CC +ENCODING 14284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +AA00 +AFA0 +AA40 +AAA0 +AA40 +BAA0 +ED40 +05A0 +08E0 +ENDCHAR +STARTCHAR U_37CD +ENCODING 14285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +23E0 +AA20 +ABE0 +AA20 +ABE0 +BA80 +EAA0 +0240 +0320 +ENDCHAR +STARTCHAR U_37CE +ENCODING 14286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +2920 +A4A0 +AA40 +A900 +AFE0 +B940 +EA40 +0180 +0660 +ENDCHAR +STARTCHAR U_37CF +ENCODING 14287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +AD20 +A880 +ABE0 +A840 +BBE0 +EA20 +0220 +03E0 +ENDCHAR +STARTCHAR U_37D0 +ENCODING 14288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +A900 +A880 +AFE0 +AA00 +BA00 +EA00 +0200 +03E0 +ENDCHAR +STARTCHAR U_37D1 +ENCODING 14289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +A7E0 +AC20 +ABC0 +A840 +BFE0 +E880 +0080 +0180 +ENDCHAR +STARTCHAR U_37D2 +ENCODING 14290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +1480 +1280 +FFE0 +2000 +5F80 +9080 +1F80 +ENDCHAR +STARTCHAR U_37D3 +ENCODING 14291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +A660 +A100 +AFE0 +AA80 +AFE0 +BAA0 +EAA0 +02A0 +0080 +ENDCHAR +STARTCHAR U_37D4 +ENCODING 14292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +0A00 +3180 +4440 +9F20 +0200 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_37D5 +ENCODING 14293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0280 +F980 +8C80 +8A80 +88E0 +8F80 +F880 +0080 +ENDCHAR +STARTCHAR U_37D6 +ENCODING 14294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +0400 +3F80 +0400 +FFE0 +0900 +3F80 +1100 +ENDCHAR +STARTCHAR U_37D7 +ENCODING 14295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2500 +B5A0 +CE60 +FFE0 +94A0 +D6A0 +A520 +8420 +FFE0 +8020 +ENDCHAR +STARTCHAR U_37D8 +ENCODING 14296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0820 +2920 +2BA0 +A920 +ABA0 +A820 +ABA0 +AAA0 +FBA0 +1060 +ENDCHAR +STARTCHAR U_37D9 +ENCODING 14297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +A240 +AFE0 +A800 +AFE0 +BC20 +EFE0 +0420 +07E0 +ENDCHAR +STARTCHAR U_37DA +ENCODING 14298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +73E0 +6940 +A880 +2360 +0400 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_37DB +ENCODING 14299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +3F80 +0000 +2240 +F7E0 +3240 +63C0 +A240 +2240 +63C0 +ENDCHAR +STARTCHAR U_37DC +ENCODING 14300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +0400 +EFC0 +2880 +F200 +8A80 +EA40 +3240 +C600 +ENDCHAR +STARTCHAR U_37DD +ENCODING 14301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2220 +AA40 +A940 +AFE0 +A800 +BBE0 +EA20 +0220 +03E0 +ENDCHAR +STARTCHAR U_37DE +ENCODING 14302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +AA40 +A980 +AEE0 +A800 +AA80 +BFE0 +EA40 +0180 +06E0 +ENDCHAR +STARTCHAR U_37DF +ENCODING 14303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +1100 +FFE0 +3180 +5F40 +9520 +1200 +1FC0 +ENDCHAR +STARTCHAR U_37E0 +ENCODING 14304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +AC60 +AFE0 +A920 +AD60 +AD60 +AFE0 +F820 +0860 +0820 +ENDCHAR +STARTCHAR U_37E1 +ENCODING 14305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +1500 +3F80 +0400 +7FC0 +0A00 +1F80 +6A40 +88A0 +0F80 +ENDCHAR +STARTCHAR U_37E2 +ENCODING 14306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +3F80 +0A00 +FFE0 +0080 +1E80 +1280 +1E80 +0100 +ENDCHAR +STARTCHAR U_37E3 +ENCODING 14307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2540 +2F40 +A540 +AF20 +AEA0 +A480 +AD00 +FD40 +07A0 +0400 +ENDCHAR +STARTCHAR U_37E4 +ENCODING 14308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0100 +1F00 +0100 +FFE0 +0400 +4480 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_37E5 +ENCODING 14309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0A00 +3F80 +0400 +FFE0 +0A00 +3580 +DE60 +0B20 +3C00 +ENDCHAR +STARTCHAR U_37E6 +ENCODING 14310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_37E7 +ENCODING 14311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7BC0 +4A40 +4A40 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_37E8 +ENCODING 14312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +AFE0 +A000 +AFE0 +A900 +AFE0 +BAA0 +EAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_37E9 +ENCODING 14313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +8BE0 +FA40 +9680 +F900 +9680 +C860 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37EA +ENCODING 14314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AAA0 +ABE0 +A800 +AFE0 +BB00 +CAA0 +0240 +0320 +ENDCHAR +STARTCHAR U_37EB +ENCODING 14315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +A7E0 +AC20 +AFE0 +A900 +BD20 +EBC0 +0540 +0920 +ENDCHAR +STARTCHAR U_37EC +ENCODING 14316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +FF80 +0000 +EB80 +8880 +EB80 +8880 +FF80 +6300 +3C00 +E780 +ENDCHAR +STARTCHAR U_37ED +ENCODING 14317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +0220 +23E0 +2240 +ABE0 +AA40 +ABE0 +AA20 +FBE0 +0220 +03E0 +ENDCHAR +STARTCHAR U_37EE +ENCODING 14318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +A7E0 +A5A0 +AA40 +A940 +AFE0 +B900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_37EF +ENCODING 14319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +7FE0 +88A0 +3300 +4E00 +1100 +3F80 +5140 +1F00 +ENDCHAR +STARTCHAR U_37F0 +ENCODING 14320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A7C0 +AC40 +AFC0 +AC40 +AFC0 +A900 +FFE0 +0440 +0820 +ENDCHAR +STARTCHAR U_37F1 +ENCODING 14321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +A7E0 +A900 +AFE0 +A900 +A900 +AFE0 +F800 +0540 +0AA0 +ENDCHAR +STARTCHAR U_37F2 +ENCODING 14322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +A880 +FAC0 +14A0 +2180 +ENDCHAR +STARTCHAR U_37F3 +ENCODING 14323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +AAA0 +AAA0 +AFE0 +A900 +AFE0 +FB80 +0540 +0920 +ENDCHAR +STARTCHAR U_37F4 +ENCODING 14324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +A520 +AFE0 +AD20 +AFE0 +AA80 +BAE0 +E280 +04A0 +1860 +ENDCHAR +STARTCHAR U_37F5 +ENCODING 14325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +4A40 +7FC0 +0000 +7FC0 +1700 +1400 +FFE0 +ENDCHAR +STARTCHAR U_37F6 +ENCODING 14326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +4400 +5FC0 +5FC0 +5040 +5FC0 +8A80 +B660 +ENDCHAR +STARTCHAR U_37F7 +ENCODING 14327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A440 +A900 +AA80 +AC40 +ABA0 +B800 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_37F8 +ENCODING 14328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +AFC0 +AC40 +AFC0 +A900 +BFE0 +E140 +0FE0 +0100 +ENDCHAR +STARTCHAR U_37F9 +ENCODING 14329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +2B60 +2AA0 +AEA0 +AAA0 +AEA0 +AAA0 +BAA0 +CFE0 +1A80 +0280 +ENDCHAR +STARTCHAR U_37FA +ENCODING 14330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2480 +FFE0 +2480 +3F80 +7FC0 +5540 +FFE0 +0E00 +3B80 +ENDCHAR +STARTCHAR U_37FB +ENCODING 14331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +1100 +FDE0 +9540 +FD40 +1240 +FE40 +1400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37FC +ENCODING 14332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2100 +F900 +21E0 +7240 +2540 +F980 +3880 +4940 +9620 +ENDCHAR +STARTCHAR U_37FD +ENCODING 14333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +AAA0 +AFE0 +A800 +ABC0 +B800 +E7E0 +0540 +0B20 +ENDCHAR +STARTCHAR U_37FE +ENCODING 14334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A940 +AFE0 +A940 +AFC0 +AD40 +AFC0 +FD40 +17C0 +1540 +ENDCHAR +STARTCHAR U_37FF +ENCODING 14335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +A440 +A920 +AFE0 +AA80 +AC60 +BA40 +EFE0 +0240 +0440 +ENDCHAR +STARTCHAR U_3800 +ENCODING 14336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +AA20 +4440 +7FC0 +ENDCHAR +STARTCHAR U_3801 +ENCODING 14337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +D780 +D440 +DEE0 +D7A0 +DB60 +D580 +F660 +0180 +0E00 +ENDCHAR +STARTCHAR U_3802 +ENCODING 14338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +A500 +AFE0 +A520 +BF40 +A940 +AF40 +FA80 +0B40 +1620 +ENDCHAR +STARTCHAR U_3803 +ENCODING 14339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +AA80 +AFE0 +A920 +ABA0 +A920 +FBA0 +0AA0 +0BA0 +ENDCHAR +STARTCHAR U_3804 +ENCODING 14340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +FBE0 +28A0 +FBE0 +1540 +3F80 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3805 +ENCODING 14341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2400 +27E0 +4FC0 +B7C0 +6440 +A7E0 +2C80 +2300 +2EE0 +ENDCHAR +STARTCHAR U_3806 +ENCODING 14342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +DEE0 +D7C0 +D540 +D7C0 +D540 +D7C0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_3807 +ENCODING 14343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2000 +FD20 +0100 +FFE0 +8900 +F980 +2280 +7280 +ACE0 +ENDCHAR +STARTCHAR U_3808 +ENCODING 14344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AEE0 +ABA0 +A920 +ABA0 +F920 +0BA0 +0860 +ENDCHAR +STARTCHAR U_3809 +ENCODING 14345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +BFE0 +AFE0 +A920 +AFE0 +A900 +FFC0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_380A +ENCODING 14346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +A900 +AFE0 +A900 +A8E0 +A940 +FB60 +1140 +17E0 +ENDCHAR +STARTCHAR U_380B +ENCODING 14347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +4A40 +7FC0 +0000 +FFE0 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_380C +ENCODING 14348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4900 +FD00 +4BE0 +7CA0 +7880 +4880 +FD40 +4940 +8620 +ENDCHAR +STARTCHAR U_380D +ENCODING 14349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1200 +3FC0 +6200 +BFC0 +3FC0 +2600 +FFE0 +1580 +E460 +ENDCHAR +STARTCHAR U_380E +ENCODING 14350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2880 +AFE0 +A880 +AFE0 +A900 +BFE0 +E100 +0540 +0920 +ENDCHAR +STARTCHAR U_380F +ENCODING 14351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A440 +AFE0 +A540 +AFE0 +A540 +AFE0 +F900 +07C0 +0100 +ENDCHAR +STARTCHAR U_3810 +ENCODING 14352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0180 +3E00 +0440 +FFE0 +2A80 +7FC0 +AAA0 +2E80 +2180 +ENDCHAR +STARTCHAR U_3811 +ENCODING 14353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FC0 +4A40 +FFE0 +0A00 +7BC0 +0A00 +FBE0 +1200 +ENDCHAR +STARTCHAR U_3812 +ENCODING 14354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2520 +2FA0 +AAA0 +ADA0 +AFA0 +A8A0 +BFA0 +E720 +8AA0 +1260 +ENDCHAR +STARTCHAR U_3813 +ENCODING 14355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2A40 +AFE0 +A820 +ABC0 +A920 +BAC0 +EDA0 +82A0 +0580 +ENDCHAR +STARTCHAR U_3814 +ENCODING 14356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +3F80 +0100 +3BC0 +2A80 +5FE0 +9100 +2BC0 +3900 +0100 +ENDCHAR +STARTCHAR U_3815 +ENCODING 14357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +0400 +EF80 +AA80 +AF80 +AA80 +AF80 +E540 +8980 +91C0 +ENDCHAR +STARTCHAR U_3816 +ENCODING 14358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +0400 +3F80 +1240 +FFE0 +1940 +71A0 +3660 +ENDCHAR +STARTCHAR U_3817 +ENCODING 14359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2B60 +ADA0 +AFE0 +ABA0 +AD60 +B100 +EFE0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3818 +ENCODING 14360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4860 +8E20 +E8E0 +8E20 +E6E0 +8A20 +FFE0 +3180 +C060 +ENDCHAR +STARTCHAR U_3819 +ENCODING 14361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2A40 +AFE0 +A820 +ABC0 +A920 +BB40 +EDC0 +82A0 +0580 +ENDCHAR +STARTCHAR U_381A +ENCODING 14362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +3B40 +2A40 +BFE0 +AA40 +BF40 +A4C0 +BE40 +E440 +8640 +18C0 +ENDCHAR +STARTCHAR U_381B +ENCODING 14363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +2A80 +AFE0 +AA80 +ABE0 +AA80 +BBE0 +EA40 +8180 +0E60 +ENDCHAR +STARTCHAR U_381C +ENCODING 14364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2C40 +2880 +AFE0 +A8A0 +AC80 +A8E0 +FF80 +8880 +0D80 +1260 +ENDCHAR +STARTCHAR U_381D +ENCODING 14365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2A40 +AFE0 +AA40 +ADA0 +AA40 +BBC0 +EA40 +83C0 +0420 +ENDCHAR +STARTCHAR U_381E +ENCODING 14366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +55E0 +BFA0 +5540 +CE40 +44A0 +5F20 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_381F +ENCODING 14367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +22E0 +2720 +2A60 +AFA0 +AAE0 +A900 +BA80 +ED60 +8380 +0540 +ENDCHAR +STARTCHAR U_3820 +ENCODING 14368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2100 +2FE0 +A940 +AFE0 +AAA0 +ABE0 +AAA0 +FFE0 +8AA0 +1FE0 +ENDCHAR +STARTCHAR U_3821 +ENCODING 14369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2280 +ABC0 +AA80 +ABE0 +AAA0 +FF40 +8640 +0A80 +0360 +ENDCHAR +STARTCHAR U_3822 +ENCODING 14370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2480 +3F80 +2480 +3F80 +1540 +FFE0 +2240 +E980 +3060 +ENDCHAR +STARTCHAR U_3823 +ENCODING 14371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2920 +2A40 +AFE0 +AAC0 +AF60 +AA40 +A900 +F5C0 +9500 +2FE0 +ENDCHAR +STARTCHAR U_3824 +ENCODING 14372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2AA0 +AEE0 +AA80 +AFE0 +AA80 +FFE0 +8540 +0C80 +0660 +ENDCHAR +STARTCHAR U_3825 +ENCODING 14373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2540 +27C0 +A540 +AFE0 +AAA0 +AFE0 +A900 +FBC0 +8900 +07E0 +ENDCHAR +STARTCHAR U_3826 +ENCODING 14374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +2FE0 +2AA0 +2FE0 +A800 +AFE0 +AA40 +ABC0 +FA40 +8180 +07E0 +ENDCHAR +STARTCHAR U_3827 +ENCODING 14375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +AFE0 +AB40 +AEE0 +AA80 +FEE0 +8A80 +0EE0 +1280 +ENDCHAR +STARTCHAR U_3828 +ENCODING 14376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +2EE0 +2540 +AFE0 +AAA0 +AFE0 +AD20 +ABE0 +FEA0 +8A20 +0D60 +ENDCHAR +STARTCHAR U_3829 +ENCODING 14377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4400 +4A00 +7180 +4000 +7FC0 +2480 +2480 +2480 +4480 +8460 +ENDCHAR +STARTCHAR U_382A +ENCODING 14378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0400 +0400 +0400 +0780 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_382B +ENCODING 14379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +2AC0 +3240 +C460 +3F80 +0400 +FFE0 +0A00 +71C0 +ENDCHAR +STARTCHAR U_382C +ENCODING 14380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +3A20 +E3E0 +0400 +3F80 +0400 +FFE0 +0900 +1080 +6060 +ENDCHAR +STARTCHAR U_382D +ENCODING 14381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +2080 +3880 +E3E0 +0000 +FBE0 +2080 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_382E +ENCODING 14382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +29E0 +FE80 +2880 +AA80 +6C80 +FE80 +4480 +7C80 +4480 +7FE0 +ENDCHAR +STARTCHAR U_382F +ENCODING 14383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +0100 +8100 +FF00 +8000 +8000 +FF80 +8080 +8080 +FF80 +8000 +ENDCHAR +STARTCHAR U_3830 +ENCODING 14384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +FBC0 +2A40 +4A40 +9BC0 +0000 +7F00 +0100 +7F00 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3831 +ENCODING 14385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +2040 +7FE0 +1100 +1F00 +1100 +FFE0 +1100 +2080 +ENDCHAR +STARTCHAR U_3832 +ENCODING 14386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA60 +AA80 +AB00 +AA00 +AA00 +AA20 +BA20 +2220 +21E0 +ENDCHAR +STARTCHAR U_3833 +ENCODING 14387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +1B00 +E0E0 +0400 +3FC0 +2440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_3834 +ENCODING 14388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +A920 +AB20 +AD20 +A920 +A920 +BA20 +22A0 +2440 +ENDCHAR +STARTCHAR U_3835 +ENCODING 14389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0400 +7FC0 +4440 +4440 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3836 +ENCODING 14390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +FB80 +AA80 +AA80 +AA80 +AA80 +AAA0 +BAA0 +24A0 +2860 +ENDCHAR +STARTCHAR U_3837 +ENCODING 14391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA80 +AAE0 +AA20 +AA20 +AA40 +AB40 +BA80 +2540 +2A20 +ENDCHAR +STARTCHAR U_3838 +ENCODING 14392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +A900 +A900 +AFE0 +A900 +A900 +BA80 +2440 +2820 +ENDCHAR +STARTCHAR U_3839 +ENCODING 14393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +AC40 +A820 +AA80 +AA80 +AA80 +BA80 +2280 +2480 +ENDCHAR +STARTCHAR U_383A +ENCODING 14394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F8C0 +AAA0 +AAA0 +AC80 +A8A0 +A840 +B880 +2300 +2C00 +ENDCHAR +STARTCHAR U_383B +ENCODING 14395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +3FC0 +0500 +FFE0 +1400 +3FC0 +E440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_383C +ENCODING 14396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2300 +FA00 +AA00 +ABE0 +AA40 +AA40 +AA40 +BA40 +2440 +2840 +ENDCHAR +STARTCHAR U_383D +ENCODING 14397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +AA80 +A900 +AA80 +AC60 +A900 +B880 +2300 +2080 +ENDCHAR +STARTCHAR U_383E +ENCODING 14398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3A40 +4AC0 +B220 +15E0 +2400 +FFC0 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_383F +ENCODING 14399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5AC0 +5300 +5A20 +E5E0 +0400 +3FC0 +2440 +2440 +25C0 +0400 +ENDCHAR +STARTCHAR U_3840 +ENCODING 14400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1480 +1500 +FFE0 +8420 +9520 +94A0 +A460 +C420 +8420 +8060 +ENDCHAR +STARTCHAR U_3841 +ENCODING 14401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F980 +AA40 +ADA0 +A800 +ABC0 +B900 +ABC0 +2040 +20C0 +ENDCHAR +STARTCHAR U_3842 +ENCODING 14402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +4120 +7D20 +C920 +3120 +2420 +C460 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3843 +ENCODING 14403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FAA0 +AB00 +ABE0 +A800 +AAA0 +AAA0 +BAA0 +22A0 +2420 +ENDCHAR +STARTCHAR U_3844 +ENCODING 14404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +A820 +ABA0 +AAA0 +ABA0 +AAA0 +BBA0 +20A0 +2040 +ENDCHAR +STARTCHAR U_3845 +ENCODING 14405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +FB20 +A8C0 +A880 +AB40 +A8E0 +BB20 +A8C0 +2080 +2700 +ENDCHAR +STARTCHAR U_3846 +ENCODING 14406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +AA00 +ABE0 +A800 +AAA0 +BAA0 +AAA0 +22A0 +2420 +ENDCHAR +STARTCHAR U_3847 +ENCODING 14407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +FA80 +AE80 +AA80 +AE80 +AA80 +BA80 +AEA0 +32A0 +2260 +ENDCHAR +STARTCHAR U_3848 +ENCODING 14408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +FC80 +ABE0 +AAA0 +AAA0 +ABE0 +B940 +A940 +2240 +2460 +ENDCHAR +STARTCHAR U_3849 +ENCODING 14409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2240 +FBE0 +AE40 +A8A0 +A920 +AEC0 +BA40 +AAA0 +23E0 +2D20 +ENDCHAR +STARTCHAR U_384A +ENCODING 14410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +AC80 +A800 +AB40 +ACE0 +B420 +26E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_384B +ENCODING 14411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +F940 +AAA0 +AFE0 +AAA0 +ABE0 +BAA0 +ABE0 +2080 +20E0 +ENDCHAR +STARTCHAR U_384C +ENCODING 14412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +A7E0 +FC20 +ABE0 +AA20 +BBE0 +AA20 +23E0 +2220 +2260 +ENDCHAR +STARTCHAR U_384D +ENCODING 14413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F80 +2680 +3880 +3F80 +0400 +FFE0 +2480 +DF60 +1500 +1500 +ENDCHAR +STARTCHAR U_384E +ENCODING 14414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F900 +AFE0 +AA80 +AAC0 +AD20 +BA80 +AB40 +2080 +2700 +ENDCHAR +STARTCHAR U_384F +ENCODING 14415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +ABA0 +A800 +AE20 +AAA0 +BEA0 +AAA0 +2E20 +3260 +ENDCHAR +STARTCHAR U_3850 +ENCODING 14416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +A800 +AE20 +AAA0 +AEA0 +BAA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_3851 +ENCODING 14417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +E4A0 +22A0 +FAC0 +3080 +6940 +A620 +0400 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_3852 +ENCODING 14418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F880 +AFE0 +A900 +ABC0 +AAC0 +AB40 +BAC0 +2B40 +33C0 +ENDCHAR +STARTCHAR U_3853 +ENCODING 14419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +A900 +AFC0 +A940 +AFC0 +A940 +BFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3854 +ENCODING 14420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +11E0 +FF20 +1540 +3080 +D360 +0400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3855 +ENCODING 14421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A540 +F900 +AFC0 +A940 +A940 +BFE0 +A900 +2280 +2C60 +ENDCHAR +STARTCHAR U_3856 +ENCODING 14422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FFE0 +A880 +ABE0 +AAA0 +ABE0 +BAA0 +ABE0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3857 +ENCODING 14423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2F00 +F9C0 +A900 +AFE0 +A940 +AFE0 +AA80 +2A80 +32A0 +2460 +ENDCHAR +STARTCHAR U_3858 +ENCODING 14424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +AFE0 +BA80 +26C0 +2AA0 +ENDCHAR +STARTCHAR U_3859 +ENCODING 14425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +A920 +AAA0 +AFE0 +A880 +AEE0 +B880 +2AA0 +2CE0 +ENDCHAR +STARTCHAR U_385A +ENCODING 14426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F940 +ABE0 +A940 +AFE0 +AAA0 +ABE0 +BAA0 +27E0 +2220 +ENDCHAR +STARTCHAR U_385B +ENCODING 14427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +A880 +AB40 +AA20 +ABE0 +A800 +BD40 +2540 +2D60 +ENDCHAR +STARTCHAR U_385C +ENCODING 14428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2760 +FDA0 +AAC0 +AE40 +ABA0 +A800 +AFE0 +BA80 +22C0 +25A0 +ENDCHAR +STARTCHAR U_385D +ENCODING 14429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +25A0 +FA40 +A8A0 +AFE0 +AA40 +AAE0 +AA40 +BAE0 +2240 +25E0 +ENDCHAR +STARTCHAR U_385E +ENCODING 14430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +FAA0 +AFE0 +AAA0 +ABE0 +AAA0 +BFE0 +A920 +21C0 +2620 +ENDCHAR +STARTCHAR U_385F +ENCODING 14431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +BFE0 +24C0 +2740 +27C0 +ENDCHAR +STARTCHAR U_3860 +ENCODING 14432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +25A0 +FAC0 +AA40 +AFE0 +A800 +ABC0 +AA40 +BBC0 +2240 +27E0 +ENDCHAR +STARTCHAR U_3861 +ENCODING 14433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FF20 +A820 +AFE0 +A920 +AFA0 +B960 +2E20 +3320 +2C60 +ENDCHAR +STARTCHAR U_3862 +ENCODING 14434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +AFE0 +B900 +A9C0 +2240 +24C0 +ENDCHAR +STARTCHAR U_3863 +ENCODING 14435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD00 +49E0 +FC20 +85E0 +2100 +FDE0 +A500 +A5E0 +AD00 +21E0 +ENDCHAR +STARTCHAR U_3864 +ENCODING 14436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +AA80 +AFE0 +A900 +AFC0 +A900 +BFE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3865 +ENCODING 14437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FBE0 +A880 +ABE0 +A840 +AFE0 +A840 +BBC0 +2540 +2BA0 +ENDCHAR +STARTCHAR U_3866 +ENCODING 14438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFC0 +AB20 +ADC0 +AB40 +AEC0 +BB40 +23C0 +2420 +ENDCHAR +STARTCHAR U_3867 +ENCODING 14439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AC40 +AB80 +AD60 +ABC0 +AE60 +BBC0 +2240 +27E0 +ENDCHAR +STARTCHAR U_3868 +ENCODING 14440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2560 +FAC0 +AFE0 +AA80 +AAC0 +AE80 +AAC0 +BEA0 +22C0 +2720 +ENDCHAR +STARTCHAR U_3869 +ENCODING 14441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +EEE0 +4040 +AEA0 +E0E0 +5F40 +AAA0 +FFE0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_386A +ENCODING 14442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +A820 +AFE0 +AAA0 +AEA0 +BBC0 +AE60 +2980 +3660 +ENDCHAR +STARTCHAR U_386B +ENCODING 14443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2440 +27C0 +4440 +D7E0 +5520 +2920 +26A0 +5460 +F7A0 +4060 +ENDCHAR +STARTCHAR U_386C +ENCODING 14444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +54A0 +E5C0 +54A0 +F5E0 +0480 +FFE0 +4240 +7A80 +49A0 +9E60 +ENDCHAR +STARTCHAR U_386D +ENCODING 14445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +A940 +B9C0 +9080 +A940 +FFE0 +9080 +A940 +9080 +A940 +FFE0 +ENDCHAR +STARTCHAR U_386E +ENCODING 14446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FEE0 +5500 +FEE0 +1400 +7EE0 +4820 +6840 +5A80 +4D20 +B4E0 +ENDCHAR +STARTCHAR U_386F +ENCODING 14447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4080 +4F00 +4200 +4200 +5FC0 +4200 +4200 +4220 +83E0 +ENDCHAR +STARTCHAR U_3870 +ENCODING 14448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +4200 +7FE0 +4200 +4200 +4200 +8600 +ENDCHAR +STARTCHAR U_3871 +ENCODING 14449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4400 +4780 +4880 +4900 +5100 +4280 +4480 +9860 +ENDCHAR +STARTCHAR U_3872 +ENCODING 14450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4280 +4240 +5FE0 +4200 +4240 +4280 +4100 +42A0 +8C60 +ENDCHAR +STARTCHAR U_3873 +ENCODING 14451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5200 +5200 +5FC0 +5100 +5120 +54A0 +9860 +ENDCHAR +STARTCHAR U_3874 +ENCODING 14452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +4200 +5FC0 +4000 +4880 +4480 +4500 +4000 +BFE0 +ENDCHAR +STARTCHAR U_3875 +ENCODING 14453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +4880 +7760 +4000 +4FC0 +4080 +4300 +8100 +ENDCHAR +STARTCHAR U_3876 +ENCODING 14454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4FC0 +4840 +4840 +4FC0 +4000 +4480 +4440 +8840 +ENDCHAR +STARTCHAR U_3877 +ENCODING 14455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +5FC0 +4200 +4700 +4A80 +5240 +6FA0 +8200 +ENDCHAR +STARTCHAR U_3878 +ENCODING 14456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +4400 +4FE0 +5200 +43C0 +4200 +43C0 +4200 +8200 +ENDCHAR +STARTCHAR U_3879 +ENCODING 14457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4F80 +4880 +4F80 +4880 +4F80 +4880 +4880 +BFE0 +ENDCHAR +STARTCHAR U_387A +ENCODING 14458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5040 +5FC0 +4000 +BFE0 +ENDCHAR +STARTCHAR U_387B +ENCODING 14459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +59E0 +5520 +5520 +5520 +5DA0 +5560 +4500 +8900 +ENDCHAR +STARTCHAR U_387C +ENCODING 14460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +5240 +5FC0 +5240 +5FC0 +4280 +4320 +9DE0 +ENDCHAR +STARTCHAR U_387D +ENCODING 14461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +4240 +7FE0 +4240 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_387E +ENCODING 14462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +5240 +9580 +98E0 +ENDCHAR +STARTCHAR U_387F +ENCODING 14463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5040 +4880 +7FE0 +4200 +5240 +5FC0 +4200 +4400 +9800 +ENDCHAR +STARTCHAR U_3880 +ENCODING 14464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +7FE0 +4200 +5FC0 +5240 +52C0 +4700 +4A80 +B260 +ENDCHAR +STARTCHAR U_3881 +ENCODING 14465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +27C0 +2C40 +2380 +2E00 +21E0 +4E20 +41C0 +8F00 +ENDCHAR +STARTCHAR U_3882 +ENCODING 14466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +2400 +2FC0 +2840 +2FC0 +2800 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3883 +ENCODING 14467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2400 +2FC0 +2840 +2FC0 +2840 +2FC0 +4A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3884 +ENCODING 14468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4000 +4F80 +4880 +4F80 +4880 +4500 +BFE0 +ENDCHAR +STARTCHAR U_3885 +ENCODING 14469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +5FC0 +4200 +5FC0 +4880 +7FE0 +9080 +ENDCHAR +STARTCHAR U_3886 +ENCODING 14470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_3887 +ENCODING 14471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FE0 +2000 +27C0 +2000 +27C0 +4440 +4440 +87C0 +ENDCHAR +STARTCHAR U_3888 +ENCODING 14472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +4880 +5BE0 +6880 +4BE0 +4880 +4BE0 +4880 +8BE0 +ENDCHAR +STARTCHAR U_3889 +ENCODING 14473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5860 +4B80 +7C80 +4BE0 +5C80 +6A80 +48A0 +88E0 +ENDCHAR +STARTCHAR U_388A +ENCODING 14474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FE0 +2280 +2440 +2FE0 +2540 +4740 +4040 +80C0 +ENDCHAR +STARTCHAR U_388B +ENCODING 14475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +25E0 +2A40 +3980 +2B40 +28E0 +4B20 +48C0 +8B00 +ENDCHAR +STARTCHAR U_388C +ENCODING 14476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +5440 +59C0 +5540 +55C0 +5C40 +50C0 +9040 +ENDCHAR +STARTCHAR U_388D +ENCODING 14477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +5DC0 +4A80 +4200 +4F80 +4A80 +7FE0 +4480 +9840 +ENDCHAR +STARTCHAR U_388E +ENCODING 14478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2FE0 +2100 +2FE0 +2500 +2920 +4D60 +4920 +8FE0 +ENDCHAR +STARTCHAR U_388F +ENCODING 14479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +58C0 +6760 +5C40 +5540 +5D40 +5440 +ACC0 +ENDCHAR +STARTCHAR U_3890 +ENCODING 14480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +4F80 +4880 +4B80 +4A80 +5FE0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_3891 +ENCODING 14481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +5100 +5FC0 +5100 +5FE0 +4100 +BFE0 +8100 +ENDCHAR +STARTCHAR U_3892 +ENCODING 14482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +52A0 +5FC0 +5580 +5680 +5580 +9680 +AFE0 +ENDCHAR +STARTCHAR U_3893 +ENCODING 14483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +4500 +7FE0 +4880 +4F80 +4880 +BFE0 +8200 +ENDCHAR +STARTCHAR U_3894 +ENCODING 14484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A40 +5240 +6340 +4CA0 +5000 +7280 +52E0 +5380 +94E0 +ENDCHAR +STARTCHAR U_3895 +ENCODING 14485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +52E0 +7E40 +4AE0 +5240 +7EE0 +4A40 +5240 +A2E0 +ENDCHAR +STARTCHAR U_3896 +ENCODING 14486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5FC0 +4A80 +7FE0 +4700 +5AC0 +6FA0 +8A80 +8F80 +ENDCHAR +STARTCHAR U_3897 +ENCODING 14487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4400 +7FE0 +5540 +7FE0 +5540 +9740 +90C0 +ENDCHAR +STARTCHAR U_3898 +ENCODING 14488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4500 +5FC0 +4540 +7FE0 +4540 +9FC0 +92A0 +ENDCHAR +STARTCHAR U_3899 +ENCODING 14489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5480 +7E80 +55E0 +7EA0 +6AA0 +7EA0 +48A0 +4D20 +BA60 +ENDCHAR +STARTCHAR U_389A +ENCODING 14490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FE0 +5220 +5FC0 +5540 +57C0 +5540 +AFC0 +A440 +ENDCHAR +STARTCHAR U_389B +ENCODING 14491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +4500 +4880 +7760 +5DC0 +5540 +5DC0 +8880 +B560 +ENDCHAR +STARTCHAR U_389C +ENCODING 14492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +5FC0 +4A40 +A8A0 +A7A0 +ENDCHAR +STARTCHAR U_389D +ENCODING 14493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9C40 +A580 +BE80 +EBE0 +BE80 +AA80 +BFC0 +AAA0 +D580 +ENDCHAR +STARTCHAR U_389E +ENCODING 14494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +6940 +58C0 +6940 +5FC0 +5240 +7FE0 +4880 +BFE0 +9040 +ENDCHAR +STARTCHAR U_389F +ENCODING 14495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2100 +4100 +F5C0 +1500 +1500 +9500 +6FE0 +2000 +DFE0 +ENDCHAR +STARTCHAR U_38A0 +ENCODING 14496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +2BA0 +4AA0 +8AA0 +EBA0 +2AA0 +A820 +4860 +6000 +9FE0 +ENDCHAR +STARTCHAR U_38A1 +ENCODING 14497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7AA0 +09C0 +7E40 +4BE0 +8940 +10C0 +1080 +FFE0 +1080 +6080 +ENDCHAR +STARTCHAR U_38A2 +ENCODING 14498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5500 +FFE0 +8240 +BB40 +AA80 +BB60 +2100 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_38A3 +ENCODING 14499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF00 +29E0 +7F40 +8540 +7480 +5540 +7E20 +1080 +FFE0 +1080 +2080 +ENDCHAR +STARTCHAR U_38A4 +ENCODING 14500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +1100 +FFE0 +2100 +3D00 +2500 +2480 +44A0 +8C60 +ENDCHAR +STARTCHAR U_38A5 +ENCODING 14501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +82A0 +FE80 +83E0 +BA80 +AA80 +AA80 +AA80 +BA80 +8260 +8620 +ENDCHAR +STARTCHAR U_38A6 +ENCODING 14502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +0920 +E900 +ABE0 +FD00 +0900 +E900 +A880 +E8A0 +0860 +1820 +ENDCHAR +STARTCHAR U_38A7 +ENCODING 14503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0080 +0080 +3F80 +2000 +4000 +7FC0 +0040 +FE40 +0040 +0780 +ENDCHAR +STARTCHAR U_38A8 +ENCODING 14504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +1100 +F100 +8FE0 +8100 +F100 +1100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_38A9 +ENCODING 14505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +13E0 +F420 +8020 +8220 +F120 +1120 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_38AA +ENCODING 14506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1000 +1000 +F7E0 +8200 +8200 +F3C0 +1040 +1040 +5140 +2080 +ENDCHAR +STARTCHAR U_38AB +ENCODING 14507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +1080 +F080 +84A0 +84A0 +F4A0 +14A0 +14A0 +54A0 +27E0 +ENDCHAR +STARTCHAR U_38AC +ENCODING 14508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1FE0 +7100 +8100 +8240 +F240 +1280 +1480 +1920 +63E0 +ENDCHAR +STARTCHAR U_38AD +ENCODING 14509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +11C0 +F100 +8100 +87C0 +F440 +1440 +1280 +5100 +26E0 +ENDCHAR +STARTCHAR U_38AE +ENCODING 14510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +1400 +1FE0 +F500 +8500 +8FE0 +F520 +1540 +1400 +5420 +23E0 +ENDCHAR +STARTCHAR U_38AF +ENCODING 14511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1420 +1420 +77E0 +8480 +8480 +F7E0 +1480 +14A0 +5660 +2420 +ENDCHAR +STARTCHAR U_38B0 +ENCODING 14512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +2FE0 +2920 +E900 +8FC0 +EC40 +2A80 +2900 +AA80 +5460 +ENDCHAR +STARTCHAR U_38B1 +ENCODING 14513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1200 +F440 +8FE0 +8120 +F100 +1540 +1520 +5B20 +2100 +ENDCHAR +STARTCHAR U_38B2 +ENCODING 14514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0840 +7BC0 +4200 +7BC0 +0840 +18C0 +FFE0 +0000 +1100 +2080 +ENDCHAR +STARTCHAR U_38B3 +ENCODING 14515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +17E0 +7400 +48C0 +7700 +1520 +14C0 +1480 +5440 +2620 +ENDCHAR +STARTCHAR U_38B4 +ENCODING 14516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0080 +7F80 +8000 +FFC0 +4640 +6A40 +5640 +6A40 +7E40 +0180 +ENDCHAR +STARTCHAR U_38B5 +ENCODING 14517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1280 +F440 +8BA0 +8000 +F7C0 +1440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_38B6 +ENCODING 14518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +1200 +F7C0 +8440 +8440 +F7C0 +1440 +1440 +97C0 +6440 +ENDCHAR +STARTCHAR U_38B7 +ENCODING 14519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +14A0 +14A0 +F7E0 +8100 +81E0 +F220 +1520 +10C0 +5080 +2700 +ENDCHAR +STARTCHAR U_38B8 +ENCODING 14520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +4900 +D9E0 +9240 +D840 +4940 +4940 +4940 +4880 +6940 +9620 +ENDCHAR +STARTCHAR U_38B9 +ENCODING 14521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +1440 +7280 +4FE0 +7100 +1FE0 +1100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_38BA +ENCODING 14522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +F440 +8FE0 +F200 +1FE0 +1240 +1740 +1080 +A140 +4620 +ENDCHAR +STARTCHAR U_38BB +ENCODING 14523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +1700 +7100 +4FE0 +7340 +1D20 +1280 +1FE0 +1280 +5180 +2660 +ENDCHAR +STARTCHAR U_38BC +ENCODING 14524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +1340 +F7E0 +8520 +F520 +17A0 +1560 +1520 +5520 +2540 +ENDCHAR +STARTCHAR U_38BD +ENCODING 14525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0E0 +3F20 +2A20 +EEE0 +8A80 +8E80 +EAE0 +2E20 +3A20 +A2A0 +4240 +ENDCHAR +STARTCHAR U_38BE +ENCODING 14526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +2FE0 +EAA0 +8AA0 +8FE0 +E100 +27C0 +2100 +2100 +6FE0 +ENDCHAR +STARTCHAR U_38BF +ENCODING 14527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EB80 +2880 +2FE0 +EA00 +9BC0 +8D00 +E900 +2FE0 +2900 +2A80 +CC60 +ENDCHAR +STARTCHAR U_38C0 +ENCODING 14528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +1100 +F7C0 +8540 +86C0 +F540 +1640 +1FE0 +1440 +6820 +ENDCHAR +STARTCHAR U_38C1 +ENCODING 14529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +1280 +7FE0 +4400 +77C0 +1D40 +17C0 +1540 +57C0 +2540 +ENDCHAR +STARTCHAR U_38C2 +ENCODING 14530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +27C0 +E440 +87C0 +E000 +2FE0 +2C60 +2AA0 +2FE0 +A920 +4920 +ENDCHAR +STARTCHAR U_38C3 +ENCODING 14531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +3F20 +EAE0 +9F80 +E1E0 +2E20 +2A20 +2E20 +2A20 +AEA0 +5240 +ENDCHAR +STARTCHAR U_38C4 +ENCODING 14532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E9E0 +25C0 +E920 +83E0 +ED00 +25E0 +2100 +2FE0 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_38C5 +ENCODING 14533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +3540 +3FE0 +E440 +8D40 +92A0 +EFC0 +2840 +2FC0 +2840 +CFC0 +ENDCHAR +STARTCHAR U_38C6 +ENCODING 14534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +2FE0 +ED60 +8BA0 +8000 +EFE0 +2100 +27C0 +2100 +CFE0 +ENDCHAR +STARTCHAR U_38C7 +ENCODING 14535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +1080 +FFE0 +2A00 +D200 +3FC0 +D240 +1240 +12C0 +0200 +ENDCHAR +STARTCHAR U_38C8 +ENCODING 14536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +4A40 +FFE0 +5140 +A680 +4100 +A280 +FBE0 +AAA0 +BAE0 +2080 +ENDCHAR +STARTCHAR U_38C9 +ENCODING 14537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FC40 +1080 +1120 +1040 +1080 +1100 +1420 +3840 +C080 +0300 +ENDCHAR +STARTCHAR U_38CA +ENCODING 14538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0F80 +1900 +2600 +0900 +32E0 +CD00 +0200 +1C80 +0300 +1C00 +ENDCHAR +STARTCHAR U_38CB +ENCODING 14539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FE40 +4480 +5500 +4440 +FE80 +4520 +4420 +4440 +4480 +8300 +ENDCHAR +STARTCHAR U_38CC +ENCODING 14540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2080 +3900 +2240 +2040 +2080 +F920 +8A20 +8840 +8880 +FB00 +ENDCHAR +STARTCHAR U_38CD +ENCODING 14541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2040 +4080 +8520 +FC40 +0080 +FD20 +8420 +8440 +8480 +FD00 +ENDCHAR +STARTCHAR U_38CE +ENCODING 14542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +6080 +3F80 +2080 +3F80 +2580 +DC40 +0320 +3C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_38CF +ENCODING 14543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +2480 +FE00 +4420 +7CC0 +4500 +7C20 +1040 +FC80 +1300 +ENDCHAR +STARTCHAR U_38D0 +ENCODING 14544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FC80 +8500 +FC00 +8440 +FC80 +1100 +D420 +5840 +5480 +B100 +ENDCHAR +STARTCHAR U_38D1 +ENCODING 14545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +8880 +BE00 +8A20 +FF40 +AA80 +BE00 +AA20 +BE40 +AB80 +ENDCHAR +STARTCHAR U_38D2 +ENCODING 14546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +FE20 +D640 +BB80 +FE20 +0040 +7D80 +4420 +7C40 +4580 +7E00 +ENDCHAR +STARTCHAR U_38D3 +ENCODING 14547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3820 +2740 +7D80 +CA00 +3120 +CB40 +2C80 +FF00 +2C20 +4A40 +8980 +ENDCHAR +STARTCHAR U_38D4 +ENCODING 14548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +4080 +9080 +2080 +6080 +A080 +2080 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_38D5 +ENCODING 14549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9200 +2FE0 +6200 +A200 +2200 +2500 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_38D6 +ENCODING 14550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +C100 +1FE0 +2100 +E100 +2280 +2280 +2640 +2940 +3020 +ENDCHAR +STARTCHAR U_38D7 +ENCODING 14551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +47E0 +9420 +2420 +67E0 +A400 +2400 +2400 +2800 +3000 +ENDCHAR +STARTCHAR U_38D8 +ENCODING 14552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +9420 +2820 +67A0 +A4A0 +24A0 +27A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_38D9 +ENCODING 14553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9920 +2920 +6920 +AFE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_38DA +ENCODING 14554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +9BA0 +2820 +6BA0 +AAA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_38DB +ENCODING 14555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +9440 +2820 +67C0 +A000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_38DC +ENCODING 14556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +5F20 +8A20 +2AA0 +4AA0 +DFA0 +4AA0 +4AA0 +4A20 +4A20 +5260 +ENDCHAR +STARTCHAR U_38DD +ENCODING 14557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +4120 +9FE0 +2100 +6500 +BF40 +2540 +2480 +24A0 +2960 +3220 +ENDCHAR +STARTCHAR U_38DE +ENCODING 14558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4440 +9A20 +2440 +6FE0 +A000 +2480 +2480 +2480 +24A0 +28E0 +ENDCHAR +STARTCHAR U_38DF +ENCODING 14559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9FE0 +2100 +6100 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_38E0 +ENCODING 14560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43C0 +9440 +2280 +5100 +D280 +5C60 +5100 +5280 +4100 +4080 +ENDCHAR +STARTCHAR U_38E1 +ENCODING 14561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4880 +9880 +2BE0 +4AA0 +CAA0 +4BE0 +4880 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_38E2 +ENCODING 14562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47E0 +9120 +27E0 +6500 +A7E0 +2120 +2320 +2560 +2900 +ENDCHAR +STARTCHAR U_38E3 +ENCODING 14563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9540 +2540 +6BA0 +A100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_38E4 +ENCODING 14564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +4140 +90A0 +2760 +6000 +A140 +27E0 +2140 +20A0 +2760 +ENDCHAR +STARTCHAR U_38E5 +ENCODING 14565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4880 +9FE0 +2880 +4BC0 +C840 +4FE0 +4A40 +4940 +4840 +48C0 +ENDCHAR +STARTCHAR U_38E6 +ENCODING 14566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +9380 +2540 +6920 +A200 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_38E7 +ENCODING 14567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4A80 +9C80 +2A80 +5E80 +D280 +5E80 +5280 +5E80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_38E8 +ENCODING 14568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +4840 +8BE0 +3E40 +4A40 +D240 +53E0 +4D20 +4520 +4BE0 +5120 +ENDCHAR +STARTCHAR U_38E9 +ENCODING 14569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +9FE0 +2480 +6E80 +ADC0 +36A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_38EA +ENCODING 14570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +4E20 +9540 +27C0 +6200 +AFE0 +2200 +23C0 +2640 +2980 +3660 +ENDCHAR +STARTCHAR U_38EB +ENCODING 14571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4100 +9FE0 +2100 +67C0 +A540 +27C0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_38EC +ENCODING 14572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +43C0 +9000 +27E0 +6240 +A3C0 +2260 +23C0 +2640 +2040 +ENDCHAR +STARTCHAR U_38ED +ENCODING 14573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +4920 +8AA0 +2FE0 +4480 +C880 +5460 +47C0 +4C80 +4300 +5CE0 +ENDCHAR +STARTCHAR U_38EE +ENCODING 14574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4FE0 +1200 +2FE0 +6AA0 +ABA0 +2920 +2FE0 +2920 +2960 +ENDCHAR +STARTCHAR U_38EF +ENCODING 14575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4840 +9FC0 +2920 +4D40 +CBC0 +4A40 +4BC0 +4A40 +53C0 +6440 +ENDCHAR +STARTCHAR U_38F0 +ENCODING 14576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2920 +4540 +8FE0 +2380 +4540 +C920 +4200 +5540 +54A0 +57A0 +ENDCHAR +STARTCHAR U_38F1 +ENCODING 14577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +8FE0 +2440 +47C0 +C440 +47C0 +4440 +47C0 +4820 +ENDCHAR +STARTCHAR U_38F2 +ENCODING 14578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +9EE0 +2140 +5D40 +C140 +5C80 +5480 +5D40 +4220 +ENDCHAR +STARTCHAR U_38F3 +ENCODING 14579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +4FC0 +9A80 +2A80 +5FC0 +CA80 +7FE0 +4000 +5540 +5520 +ENDCHAR +STARTCHAR U_38F4 +ENCODING 14580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4480 +9FE0 +2100 +4FC0 +C940 +4FC0 +4940 +4FC0 +5020 +ENDCHAR +STARTCHAR U_38F5 +ENCODING 14581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4880 +83E0 +3D40 +4BE0 +C880 +4BE0 +4880 +5480 +63E0 +ENDCHAR +STARTCHAR U_38F6 +ENCODING 14582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4440 +8540 +2440 +47C0 +C000 +47C0 +47C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_38F7 +ENCODING 14583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +8280 +2BA0 +4000 +C7C0 +4540 +5FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_38F8 +ENCODING 14584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C40 +2D40 +5EC0 +8CE0 +3F40 +5840 +CEE0 +5440 +6EE0 +5500 +6CE0 +ENDCHAR +STARTCHAR U_38F9 +ENCODING 14585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5540 +9FE0 +3540 +55E0 +D540 +55E0 +5280 +5660 +6BA0 +ENDCHAR +STARTCHAR U_38FA +ENCODING 14586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1000 +1000 +5480 +9240 +9240 +1000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U_38FB +ENCODING 14587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +1900 +0600 +0700 +0880 +3060 +4420 +1300 +5040 +5120 +8F20 +ENDCHAR +STARTCHAR U_38FC +ENCODING 14588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2220 +2220 +7220 +A620 +2320 +22A0 +2220 +2220 +24A0 +2860 +ENDCHAR +STARTCHAR U_38FD +ENCODING 14589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0880 +FFE0 +1100 +3600 +1B00 +60C0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_38FE +ENCODING 14590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A540 +B540 +A440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_38FF +ENCODING 14591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +A3E0 +B420 +A420 +AA20 +2120 +2120 +2020 +2240 +2180 +ENDCHAR +STARTCHAR U_3900 +ENCODING 14592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C00 +4200 +4500 +58C0 +4000 +7FE0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3901 +ENCODING 14593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0A00 +1100 +E0E0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3902 +ENCODING 14594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +1840 +1580 +2200 +4DE0 +0000 +56A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3903 +ENCODING 14595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +A200 +B200 +ABE0 +A220 +2220 +2420 +24A0 +2840 +ENDCHAR +STARTCHAR U_3904 +ENCODING 14596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AFE0 +A920 +2920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_3905 +ENCODING 14597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +4400 +7FC0 +0A00 +3220 +C3E0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3906 +ENCODING 14598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +A400 +B7E0 +AE20 +A620 +2540 +2540 +2480 +2540 +2A20 +ENDCHAR +STARTCHAR U_3907 +ENCODING 14599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +2100 +A100 +B100 +AFE0 +A100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3908 +ENCODING 14600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +A080 +B280 +A280 +AA20 +2A20 +2A20 +2A00 +2240 +21C0 +ENDCHAR +STARTCHAR U_3909 +ENCODING 14601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +A080 +B480 +A480 +AFE0 +2280 +2280 +2480 +2A80 +2100 +ENDCHAR +STARTCHAR U_390A +ENCODING 14602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +A180 +B240 +A420 +A000 +2420 +2240 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_390B +ENCODING 14603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +A280 +B440 +A820 +A7C0 +2240 +2240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_390C +ENCODING 14604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +A7E0 +B240 +AA40 +A240 +23C0 +2240 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_390D +ENCODING 14605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F900 +23E0 +2020 +3820 +C0E0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_390E +ENCODING 14606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +2520 +49E0 +9000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_390F +ENCODING 14607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A420 +BA40 +A980 +A240 +2C20 +2180 +2040 +2180 +2040 +ENDCHAR +STARTCHAR U_3910 +ENCODING 14608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +0000 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3911 +ENCODING 14609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AA00 +A400 +2FC0 +3440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3912 +ENCODING 14610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AA80 +A540 +2920 +37C0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_3913 +ENCODING 14611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +A100 +B380 +A540 +2920 +3100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_3914 +ENCODING 14612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +A240 +B5E0 +AC40 +B540 +2540 +2540 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_3915 +ENCODING 14613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2920 +B920 +AFE0 +A100 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3916 +ENCODING 14614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B820 +A000 +A7C0 +2100 +2100 +2100 +2500 +2300 +ENDCHAR +STARTCHAR U_3917 +ENCODING 14615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +1F00 +0400 +7FC0 +1100 +E4E0 +0400 +2540 +0C00 +ENDCHAR +STARTCHAR U_3918 +ENCODING 14616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +B240 +A480 +AFE0 +A020 +2020 +27E0 +2020 +2020 +2FE0 +ENDCHAR +STARTCHAR U_3919 +ENCODING 14617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7E40 +4240 +7E40 +4040 +7FC0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_391A +ENCODING 14618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25C0 +A800 +B400 +A7E0 +A880 +3880 +2880 +2880 +2880 +2980 +ENDCHAR +STARTCHAR U_391B +ENCODING 14619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2240 +B380 +A480 +AC80 +B480 +27E0 +2480 +2480 +2480 +25C0 +ENDCHAR +STARTCHAR U_391C +ENCODING 14620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B880 +ACA0 +AAA0 +2AC0 +2880 +2980 +2AA0 +3460 +ENDCHAR +STARTCHAR U_391D +ENCODING 14621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B200 +A440 +AFE0 +22A0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_391E +ENCODING 14622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +BFE0 +A820 +A8E0 +A700 +2100 +2FE0 +2100 +2120 +20E0 +ENDCHAR +STARTCHAR U_391F +ENCODING 14623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +7FC0 +4A40 +7FC0 +4A40 +7FC0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3920 +ENCODING 14624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2020 +3920 +4920 +A920 +1120 +6060 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_3921 +ENCODING 14625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +A4A0 +BEA0 +AAA0 +AAA0 +36A0 +22A0 +2420 +3820 +2060 +ENDCHAR +STARTCHAR U_3922 +ENCODING 14626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B200 +A3C0 +A640 +2BC0 +2240 +23C0 +2240 +22C0 +ENDCHAR +STARTCHAR U_3923 +ENCODING 14627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +1100 +FFE0 +1100 +6100 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3924 +ENCODING 14628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +BFE0 +A920 +AFE0 +A920 +2FE0 +2900 +2500 +2200 +2DE0 +ENDCHAR +STARTCHAR U_3925 +ENCODING 14629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +A200 +A440 +A780 +2120 +2640 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_3926 +ENCODING 14630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AFE0 +A920 +2FE0 +2900 +2500 +2200 +2DE0 +ENDCHAR +STARTCHAR U_3927 +ENCODING 14631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +B400 +AFE0 +AC00 +A400 +25E0 +2520 +2520 +2520 +29E0 +ENDCHAR +STARTCHAR U_3928 +ENCODING 14632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +B240 +AFE0 +AA40 +A240 +27E0 +2000 +2240 +2240 +2420 +ENDCHAR +STARTCHAR U_3929 +ENCODING 14633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +A080 +1F00 +60C0 +BFA0 +2080 +3F80 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392A +ENCODING 14634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2000 +7BC0 +8A40 +52C0 +2220 +C3E0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392B +ENCODING 14635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +3F80 +E080 +3C80 +2780 +2080 +0420 +52A0 +8F80 +ENDCHAR +STARTCHAR U_392C +ENCODING 14636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +A100 +A100 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_392D +ENCODING 14637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +B100 +A100 +AFE0 +A280 +2440 +2AA0 +2280 +2280 +2480 +ENDCHAR +STARTCHAR U_392E +ENCODING 14638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +3100 +E100 +27C0 +E100 +2FE0 +C000 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392F +ENCODING 14639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +BAA0 +AC60 +A820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3930 +ENCODING 14640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +23E0 +6600 +ABC0 +2200 +23C0 +2200 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3931 +ENCODING 14641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +B7C0 +AC40 +AC40 +A7C0 +2000 +2440 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_3932 +ENCODING 14642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +8A20 +1100 +E0E0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3933 +ENCODING 14643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2380 +7540 +A920 +2100 +27C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3934 +ENCODING 14644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A500 +B540 +A740 +A540 +2740 +2540 +2760 +2D60 +2100 +ENDCHAR +STARTCHAR U_3935 +ENCODING 14645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +11E0 +2240 +3540 +E080 +2140 +6620 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_3936 +ENCODING 14646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +A220 +B240 +A2A0 +A340 +25A0 +2540 +2980 +2B20 +30E0 +ENDCHAR +STARTCHAR U_3937 +ENCODING 14647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +ABA0 +A000 +A7C0 +2080 +2100 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3938 +ENCODING 14648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +A100 +AFE0 +A280 +2AC0 +2AA0 +32A0 +2480 +2980 +ENDCHAR +STARTCHAR U_3939 +ENCODING 14649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +B100 +AFE0 +A100 +A920 +2540 +2540 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_393A +ENCODING 14650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B400 +A400 +A7E0 +2000 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_393B +ENCODING 14651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +C220 +AAA0 +9A20 +BAE0 +CA00 +1200 +E440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_393C +ENCODING 14652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +AE80 +B5E0 +A4A0 +AEA0 +24A0 +28A0 +2AA0 +3EA0 +2160 +ENDCHAR +STARTCHAR U_393D +ENCODING 14653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B7C0 +A100 +AFE0 +2240 +27E0 +2840 +3240 +20C0 +ENDCHAR +STARTCHAR U_393E +ENCODING 14654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A280 +B440 +A100 +A100 +2FE0 +2380 +2540 +2540 +2920 +ENDCHAR +STARTCHAR U_393F +ENCODING 14655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +B540 +AFE0 +A540 +27C0 +2540 +27C0 +2120 +21E0 +ENDCHAR +STARTCHAR U_3940 +ENCODING 14656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +AC40 +A440 +27C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_3941 +ENCODING 14657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +BFC0 +AA40 +BFC0 +8000 +FFE0 +4840 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_3942 +ENCODING 14658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +7440 +A7C0 +2000 +2FE0 +2040 +2FE0 +2440 +20C0 +ENDCHAR +STARTCHAR U_3943 +ENCODING 14659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +7AA0 +AEE0 +2820 +2820 +2820 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3944 +ENCODING 14660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +7FE0 +6440 +AA20 +27C0 +2A40 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_3945 +ENCODING 14661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +7FE0 +A820 +27C0 +2240 +2240 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_3946 +ENCODING 14662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +3140 +6FE0 +A140 +27C0 +2920 +25C0 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3947 +ENCODING 14663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +71A0 +A660 +2240 +2FE0 +2240 +2280 +2320 +2CE0 +ENDCHAR +STARTCHAR U_3948 +ENCODING 14664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +A880 +ABE0 +AA20 +BA20 +ABE0 +2620 +5240 +50A0 +9FA0 +ENDCHAR +STARTCHAR U_3949 +ENCODING 14665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +7240 +AFE0 +2000 +27E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_394A +ENCODING 14666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +7EE0 +AAA0 +2AA0 +2EE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_394B +ENCODING 14667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +C200 +4540 +5C80 +4540 +4620 +0800 +5540 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_394C +ENCODING 14668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2A20 +7AA0 +A720 +2FE0 +2220 +2720 +2AA0 +3260 +20C0 +ENDCHAR +STARTCHAR U_394D +ENCODING 14669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2FE0 +7440 +A7C0 +2440 +27C0 +2440 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_394E +ENCODING 14670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD20 +2120 +7120 +6A20 +AC40 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_394F +ENCODING 14671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +7AA0 +AFE0 +2AA0 +2AA0 +3FE0 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_3950 +ENCODING 14672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +0000 +7BC0 +4A40 +7AC0 +0600 +5240 +50A0 +9FA0 +ENDCHAR +STARTCHAR U_3951 +ENCODING 14673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +3F80 +2480 +2980 +3280 +FFE0 +8820 +6440 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_3952 +ENCODING 14674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2F20 +2540 +7000 +A100 +2FE0 +2100 +2380 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_3953 +ENCODING 14675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +7440 +AFE0 +2040 +2740 +2540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_3954 +ENCODING 14676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +7FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_3955 +ENCODING 14677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +0A00 +71C0 +4440 +2A80 +1100 +E4E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_3956 +ENCODING 14678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4A40 +6A20 +5D20 +4940 +FE20 +4BE0 +4940 +4AA0 +8E60 +99C0 +ENDCHAR +STARTCHAR U_3957 +ENCODING 14679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +7440 +A7C0 +2100 +2FE0 +2280 +2280 +2100 +2EE0 +ENDCHAR +STARTCHAR U_3958 +ENCODING 14680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +2EA0 +74A0 +A4A0 +2EA0 +25A0 +28A0 +2AA0 +2EA0 +2160 +ENDCHAR +STARTCHAR U_3959 +ENCODING 14681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +7920 +AFE0 +2920 +2100 +2240 +2920 +2C60 +33C0 +ENDCHAR +STARTCHAR U_395A +ENCODING 14682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2960 +2920 +6D60 +B920 +2FE0 +2920 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_395B +ENCODING 14683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +2700 +71E0 +AF20 +29A0 +2F40 +2940 +21A0 +2200 +2FE0 +ENDCHAR +STARTCHAR U_395C +ENCODING 14684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +27E0 +74A0 +A7E0 +2000 +27E0 +2520 +24E0 +2720 +2860 +ENDCHAR +STARTCHAR U_395D +ENCODING 14685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +22A0 +22A0 +7EE0 +A8A0 +28E0 +2EA0 +22A0 +23E0 +2220 +2C20 +ENDCHAR +STARTCHAR U_395E +ENCODING 14686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +7100 +A320 +2DC0 +2280 +2DC0 +22A0 +2C80 +2300 +ENDCHAR +STARTCHAR U_395F +ENCODING 14687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2440 +2780 +7100 +AFE0 +2200 +2340 +2D80 +22C0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_3960 +ENCODING 14688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +35C0 +A700 +A9E0 +A000 +27C0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_3961 +ENCODING 14689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +37E0 +AE00 +A7C0 +AA00 +33E0 +2100 +2FE0 +2340 +2D20 +ENDCHAR +STARTCHAR U_3962 +ENCODING 14690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +3280 +AFE0 +AAA0 +AAA0 +2C60 +2820 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3963 +ENCODING 14691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2480 +5F40 +8420 +7FC0 +0400 +7FC0 +0800 +5540 +9F20 +ENDCHAR +STARTCHAR U_3964 +ENCODING 14692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2940 +FEA0 +35C0 +5040 +B080 +1100 +0440 +5220 +90A0 +8F80 +ENDCHAR +STARTCHAR U_3965 +ENCODING 14693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +7540 +6FC0 +A100 +2FE0 +2920 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3966 +ENCODING 14694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +7FC0 +5480 +5680 +6940 +7FC0 +0400 +5240 +90A0 +8F80 +ENDCHAR +STARTCHAR U_3967 +ENCODING 14695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +3FE0 +A820 +AFE0 +A820 +2FE0 +2820 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_3968 +ENCODING 14696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFC0 +5100 +9FE0 +5100 +27C0 +5100 +8FE0 +5440 +92A0 +1F80 +ENDCHAR +STARTCHAR U_3969 +ENCODING 14697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FA0 +3240 +AA80 +BFE0 +A200 +27C0 +2C40 +37C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_396A +ENCODING 14698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +2FE0 +7300 +AD80 +A960 +2200 +2FE0 +2480 +2300 +2DC0 +ENDCHAR +STARTCHAR U_396B +ENCODING 14699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2000 +B7C0 +AC40 +A7C0 +2FE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_396C +ENCODING 14700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +7280 +6FE0 +B120 +2FE0 +2200 +23C0 +2440 +28C0 +ENDCHAR +STARTCHAR U_396D +ENCODING 14701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3100 +6FC0 +A200 +BFE0 +2540 +2D60 +3380 +2540 +2300 +ENDCHAR +STARTCHAR U_396E +ENCODING 14702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +2920 +B7E0 +A120 +AA20 +2FE0 +2920 +37E0 +2120 +2660 +ENDCHAR +STARTCHAR U_396F +ENCODING 14703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4880 +2500 +7FC0 +0040 +7FE0 +0040 +7FC0 +0440 +52A0 +9F80 +ENDCHAR +STARTCHAR U_3970 +ENCODING 14704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2560 +2920 +2D60 +7920 +AFE0 +2100 +2FC0 +2440 +2280 +2300 +3CE0 +ENDCHAR +STARTCHAR U_3971 +ENCODING 14705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +2F60 +7940 +AF60 +2940 +2F60 +2940 +2940 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_3972 +ENCODING 14706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +3F80 +2480 +FFE0 +2080 +C460 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_3973 +ENCODING 14707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2BC0 +7A40 +ABC0 +2A40 +2BC0 +2880 +2AC0 +2CA0 +3180 +ENDCHAR +STARTCHAR U_3974 +ENCODING 14708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +5D40 +57E0 +F500 +D540 +57E0 +5400 +5540 +5540 +5540 +6A60 +ENDCHAR +STARTCHAR U_3975 +ENCODING 14709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +7920 +AB60 +2DA0 +2AE0 +2CA0 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_3976 +ENCODING 14710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +7FC0 +1100 +FFE0 +5440 +B2A0 +4F20 +ENDCHAR +STARTCHAR U_3977 +ENCODING 14711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +4200 +7FE0 +5240 +6DA0 +4880 +7460 +4A40 +98A0 +A7A0 +ENDCHAR +STARTCHAR U_3978 +ENCODING 14712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +9540 +F7C0 +A540 +A7C0 +F200 +A540 +A520 +AA60 +DBC0 +ENDCHAR +STARTCHAR U_3979 +ENCODING 14713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +7240 +2420 +FBC0 +2140 +7140 +AA40 +24C0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_397A +ENCODING 14714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +7FE0 +A240 +2460 +27A0 +2000 +2FE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_397B +ENCODING 14715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FE0 +4100 +5D20 +4940 +7E80 +AD60 +CA20 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_397C +ENCODING 14716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +25C0 +7500 +AFE0 +2400 +27C0 +2400 +27E0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_397D +ENCODING 14717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +77C0 +A100 +2FE0 +2440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_397E +ENCODING 14718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2FE0 +7A40 +AFE0 +2A00 +2FC0 +2A40 +2BC0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_397F +ENCODING 14719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +7540 +2140 +FC80 +4940 +9A20 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_3980 +ENCODING 14720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +57C0 +4A80 +6380 +DA80 +CD60 +53C0 +4900 +4BC0 +4D00 +53E0 +ENDCHAR +STARTCHAR U_3981 +ENCODING 14721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +D240 +5FC0 +5240 +7FE0 +4200 +BFE0 +1440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_3982 +ENCODING 14722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +3F80 +4440 +44C0 +0400 +5440 +9220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3983 +ENCODING 14723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +3140 +6AA0 +AFE0 +AA80 +2BE0 +2C80 +2BE0 +2880 +37E0 +ENDCHAR +STARTCHAR U_3984 +ENCODING 14724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5980 +6EE0 +4880 +4200 +5940 +A8A0 +AFA0 +ENDCHAR +STARTCHAR U_3985 +ENCODING 14725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +3280 +6B80 +AD60 +A920 +27C0 +2540 +2540 +2540 +2100 +ENDCHAR +STARTCHAR U_3986 +ENCODING 14726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +6200 +DFE0 +D200 +5FE0 +5200 +5FE0 +5540 +6FE0 +6300 +ENDCHAR +STARTCHAR U_3987 +ENCODING 14727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3A80 +6FE0 +AAA0 +AFE0 +2A80 +2FE0 +2A80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_3988 +ENCODING 14728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +A100 +B7C0 +A100 +2FE0 +2000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3989 +ENCODING 14729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3100 +AFE0 +A820 +A7C0 +2440 +27C0 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_398A +ENCODING 14730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +3440 +AFE0 +A540 +AFE0 +2540 +2FE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_398B +ENCODING 14731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +3440 +A920 +A7C0 +A100 +2FE0 +2640 +2BC0 +3240 +23C0 +ENDCHAR +STARTCHAR U_398C +ENCODING 14732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFC0 +4500 +FFE0 +4100 +5140 +75C0 +1240 +D0A0 +1F80 +ENDCHAR +STARTCHAR U_398D +ENCODING 14733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B440 +A280 +AFE0 +2100 +2920 +2FE0 +2100 +2E00 +ENDCHAR +STARTCHAR U_398E +ENCODING 14734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +3240 +AFE0 +A240 +BFE0 +2FC0 +2A40 +2FC0 +2A40 +3FE0 +ENDCHAR +STARTCHAR U_398F +ENCODING 14735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +3EE0 +A880 +A660 +A480 +3FE0 +2480 +3FE0 +2480 +2840 +ENDCHAR +STARTCHAR U_3990 +ENCODING 14736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +7080 +AE80 +2080 +2E80 +2A80 +2E80 +2A80 +2E60 +3120 +ENDCHAR +STARTCHAR U_3991 +ENCODING 14737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +22E0 +BFA0 +AAA0 +AEA0 +2AA0 +2E40 +2A40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_3992 +ENCODING 14738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +B100 +AFE0 +A000 +27C0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3993 +ENCODING 14739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +2BE0 +B680 +AA80 +2480 +2940 +3220 +2000 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_3994 +ENCODING 14740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A8A0 +FBE0 +8880 +F880 +8940 +FA20 +8C20 +6540 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_3995 +ENCODING 14741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B20 +AAC0 +BD20 +AAC0 +2B40 +2DE0 +2A40 +28E0 +2840 +29E0 +ENDCHAR +STARTCHAR U_3996 +ENCODING 14742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +6AA0 +BEE0 +2820 +2920 +2E60 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3997 +ENCODING 14743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +77C0 +AAA0 +27C0 +2000 +2FE0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3998 +ENCODING 14744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F9E0 +AB40 +FD40 +4140 +FC80 +4940 +9A20 +5440 +9120 +8FA0 +ENDCHAR +STARTCHAR U_3999 +ENCODING 14745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +7540 +AFE0 +2920 +2BA0 +2A60 +2540 +2CA0 +37A0 +ENDCHAR +STARTCHAR U_399A +ENCODING 14746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +F1E0 +A8A0 +A4A0 +5540 +F9E0 +4940 +FAE0 +4640 +4040 +8040 +ENDCHAR +STARTCHAR U_399B +ENCODING 14747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +69C0 +4E40 +68C0 +4E40 +6AC0 +5240 +FFE0 +4440 +B220 +50A0 +4F80 +ENDCHAR +STARTCHAR U_399C +ENCODING 14748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2280 +B480 +AFE0 +A480 +27C0 +2480 +2FE0 +2440 +2380 +3C60 +ENDCHAR +STARTCHAR U_399D +ENCODING 14749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EBE0 +5220 +F3E0 +1A20 +EBE0 +0940 +7660 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_399E +ENCODING 14750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0440 +7FE0 +5280 +7580 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_399F +ENCODING 14751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +D540 +37C0 +D540 +37C0 +D100 +17E0 +6840 +A420 +A0A0 +9F80 +ENDCHAR +STARTCHAR U_39A0 +ENCODING 14752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +2DA0 +A520 +BFE0 +A520 +2FA0 +2260 +2720 +2260 +2FA0 +ENDCHAR +STARTCHAR U_39A1 +ENCODING 14753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +4BC0 +46A0 +6BC0 +EAA0 +EFE0 +C100 +4FE0 +4380 +4D60 +4100 +ENDCHAR +STARTCHAR U_39A2 +ENCODING 14754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +3540 +6000 +BEE0 +2AA0 +2EA0 +2AA0 +2EE0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_39A3 +ENCODING 14755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +9F60 +4900 +9E60 +4B40 +54C0 +5F40 +4400 +1440 +52A0 +4F00 +ENDCHAR +STARTCHAR U_39A4 +ENCODING 14756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2540 +F900 +8A80 +FA40 +5460 +F900 +54A0 +2660 +E9A0 +ENDCHAR +STARTCHAR U_39A5 +ENCODING 14757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A920 +B7C0 +A100 +AFE0 +2540 +27C0 +2200 +2D60 +2BC0 +ENDCHAR +STARTCHAR U_39A6 +ENCODING 14758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2AA0 +2BA0 +2AA0 +2CE0 +2820 +ENDCHAR +STARTCHAR U_39A7 +ENCODING 14759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +2A40 +B7E0 +A540 +A9A0 +2000 +27C0 +2540 +2640 +27C0 +ENDCHAR +STARTCHAR U_39A8 +ENCODING 14760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AAA0 +BEE0 +A920 +2FE0 +2D60 +2FA0 +2BA0 +2D60 +2820 +ENDCHAR +STARTCHAR U_39A9 +ENCODING 14761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFC0 +BA80 +ABE0 +AA20 +2DE0 +2820 +2BC0 +2AA0 +2DC0 +ENDCHAR +STARTCHAR U_39AA +ENCODING 14762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A440 +BBC0 +AAA0 +2BA0 +2000 +2FC0 +2440 +2380 +2C60 +ENDCHAR +STARTCHAR U_39AB +ENCODING 14763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2FE0 +2280 +AFE0 +B540 +AFE0 +2440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_39AC +ENCODING 14764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +B540 +ABE0 +AD40 +2BE0 +2F40 +25E0 +2B40 +29E0 +ENDCHAR +STARTCHAR U_39AD +ENCODING 14765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +BBA0 +A540 +AFE0 +AAA0 +2FE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_39AE +ENCODING 14766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FC0 +0400 +7FC0 +0400 +FFE0 +0240 +0380 +06A0 +7860 +ENDCHAR +STARTCHAR U_39AF +ENCODING 14767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +2200 +4200 +9220 +F940 +0180 +F9A0 +0660 +3820 +ENDCHAR +STARTCHAR U_39B0 +ENCODING 14768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +2920 +5500 +FFE0 +0100 +0140 +0140 +00A0 +01A0 +0260 +0420 +ENDCHAR +STARTCHAR U_39B1 +ENCODING 14769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7120 +0100 +FFE0 +0100 +2140 +2140 +7180 +2320 +34A0 +4060 +ENDCHAR +STARTCHAR U_39B2 +ENCODING 14770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +1100 +FFE0 +2100 +3D40 +2480 +44A0 +5960 +8620 +ENDCHAR +STARTCHAR U_39B3 +ENCODING 14771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +0100 +1140 +7D40 +1140 +1CA0 +7160 +0220 +ENDCHAR +STARTCHAR U_39B4 +ENCODING 14772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +2100 +3920 +C920 +3140 +CD80 +79A0 +4A60 +7C20 +ENDCHAR +STARTCHAR U_39B5 +ENCODING 14773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5120 +7D00 +93E0 +1100 +FD20 +3940 +5480 +54A0 +9160 +9620 +ENDCHAR +STARTCHAR U_39B6 +ENCODING 14774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +F920 +5140 +B940 +2180 +F8A0 +2160 +FA20 +ENDCHAR +STARTCHAR U_39B7 +ENCODING 14775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1140 +6120 +FFE0 +A900 +F920 +A940 +F880 +A8A0 +A960 +9A20 +ENDCHAR +STARTCHAR U_39B8 +ENCODING 14776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3940 +2120 +FFE0 +8900 +F920 +8940 +F940 +20A0 +F960 +2220 +ENDCHAR +STARTCHAR U_39B9 +ENCODING 14777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4940 +7920 +4BE0 +FD00 +2100 +7D20 +9540 +6C80 +15A0 +6E60 +ENDCHAR +STARTCHAR U_39BA +ENCODING 14778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8140 +FD20 +B7E0 +A900 +B520 +AB20 +FD40 +08A0 +4960 +1A20 +ENDCHAR +STARTCHAR U_39BB +ENCODING 14779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2540 +B520 +27E0 +6D00 +2120 +FD20 +8540 +FCA0 +8560 +FE20 +ENDCHAR +STARTCHAR U_39BC +ENCODING 14780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2900 +5520 +DF20 +4540 +6CA0 +4560 +7E20 +ENDCHAR +STARTCHAR U_39BD +ENCODING 14781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8A0 +27E0 +4080 +FB80 +4AA0 +7BA0 +49C0 +7EA0 +4960 +5A20 +ENDCHAR +STARTCHAR U_39BE +ENCODING 14782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +4040 +7FC0 +5200 +53C0 +5E40 +7280 +5020 +9FE0 +ENDCHAR +STARTCHAR U_39BF +ENCODING 14783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7FC0 +4040 +7FC0 +4200 +5FC0 +4200 +4A40 +5220 +A220 +ENDCHAR +STARTCHAR U_39C0 +ENCODING 14784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2F80 +2480 +26E0 +4940 +4880 +9360 +ENDCHAR +STARTCHAR U_39C1 +ENCODING 14785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2100 +27C0 +2100 +2FE0 +4200 +4440 +8FE0 +ENDCHAR +STARTCHAR U_39C2 +ENCODING 14786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2020 +3FE0 +2000 +2FE0 +2920 +4FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_39C3 +ENCODING 14787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2420 +2420 +F420 +2420 +3420 +65E0 +A620 +2020 +A020 +4020 +ENDCHAR +STARTCHAR U_39C4 +ENCODING 14788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2420 +2420 +F420 +2420 +3420 +6420 +A420 +2420 +A420 +47E0 +ENDCHAR +STARTCHAR U_39C5 +ENCODING 14789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +F120 +2120 +3120 +6120 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_39C6 +ENCODING 14790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +EFE0 +4920 +4920 +6920 +4920 +C9A0 +4960 +4100 +C100 +ENDCHAR +STARTCHAR U_39C7 +ENCODING 14791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +E820 +4820 +4820 +6BA0 +4820 +C820 +4820 +48A0 +C840 +ENDCHAR +STARTCHAR U_39C8 +ENCODING 14792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F020 +27E0 +2400 +3400 +67E0 +A020 +2020 +A0A0 +4040 +ENDCHAR +STARTCHAR U_39C9 +ENCODING 14793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +E800 +5780 +4000 +6F80 +4080 +C080 +40A0 +40A0 +C060 +ENDCHAR +STARTCHAR U_39CA +ENCODING 14794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +EFE0 +4100 +4FE0 +6920 +4920 +C920 +4960 +4920 +C100 +ENDCHAR +STARTCHAR U_39CB +ENCODING 14795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4120 +E100 +4FE0 +4100 +6100 +4280 +C280 +4440 +4820 +D020 +ENDCHAR +STARTCHAR U_39CC +ENCODING 14796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +21E0 +2F00 +3100 +61E0 +AF00 +2120 +A120 +41E0 +ENDCHAR +STARTCHAR U_39CD +ENCODING 14797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4200 +4200 +63E0 +4220 +C420 +4420 +48A0 +D040 +ENDCHAR +STARTCHAR U_39CE +ENCODING 14798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +E080 +4880 +4FE0 +6280 +4280 +C480 +4880 +5280 +C100 +ENDCHAR +STARTCHAR U_39CF +ENCODING 14799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +E820 +4C60 +4AA0 +6920 +4AA0 +CCA0 +4820 +48A0 +C840 +ENDCHAR +STARTCHAR U_39D0 +ENCODING 14800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4EE0 +E2A0 +4AA0 +4AA0 +6AA0 +44A0 +C440 +4AA0 +4920 +D220 +ENDCHAR +STARTCHAR U_39D1 +ENCODING 14801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F100 +2FE0 +2120 +31A0 +6160 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_39D2 +ENCODING 14802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2000 +3280 +6280 +A280 +2440 +A440 +4820 +ENDCHAR +STARTCHAR U_39D3 +ENCODING 14803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4F00 +EA80 +4A80 +4A80 +6A80 +4A80 +CA40 +4AA0 +4BA0 +D2A0 +ENDCHAR +STARTCHAR U_39D4 +ENCODING 14804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4120 +EFE0 +4900 +4940 +6940 +4940 +C880 +48A0 +4960 +D220 +ENDCHAR +STARTCHAR U_39D5 +ENCODING 14805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +44E0 +EAA0 +4AA0 +4AA0 +6AA0 +4EA0 +CAE0 +4280 +4480 +C880 +ENDCHAR +STARTCHAR U_39D6 +ENCODING 14806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +4FE0 +4800 +6BC0 +4840 +C880 +4920 +4A20 +D1E0 +ENDCHAR +STARTCHAR U_39D7 +ENCODING 14807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +E280 +4AA0 +4BA0 +6AC0 +4A80 +CA80 +4AA0 +4BA0 +DC60 +ENDCHAR +STARTCHAR U_39D8 +ENCODING 14808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5100 +5D20 +E0E0 +1F00 +0400 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39D9 +ENCODING 14809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +40A0 +E220 +4240 +4A40 +6A80 +5340 +C220 +4600 +4A40 +D1C0 +ENDCHAR +STARTCHAR U_39DA +ENCODING 14810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5FE0 +E400 +4400 +4780 +6480 +4680 +C580 +44A0 +47A0 +C860 +ENDCHAR +STARTCHAR U_39DB +ENCODING 14811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +5480 +5840 +1F00 +0400 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_39DC +ENCODING 14812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +F880 +2BE0 +2AA0 +3AA0 +6AE0 +AAA0 +2880 +A880 +4FE0 +ENDCHAR +STARTCHAR U_39DD +ENCODING 14813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7DE0 +2520 +49E0 +1F00 +0400 +3F80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_39DE +ENCODING 14814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E00 +E200 +5FE0 +4200 +63E0 +4220 +C540 +4480 +4940 +D220 +ENDCHAR +STARTCHAR U_39DF +ENCODING 14815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4500 +E100 +4900 +4500 +6100 +4500 +C900 +5900 +4900 +C9E0 +ENDCHAR +STARTCHAR U_39E0 +ENCODING 14816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F440 +2FE0 +2020 +3100 +6540 +A520 +2920 +A100 +4300 +ENDCHAR +STARTCHAR U_39E1 +ENCODING 14817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4100 +4240 +6C80 +4720 +C240 +4C80 +4140 +CE20 +ENDCHAR +STARTCHAR U_39E2 +ENCODING 14818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F920 +2920 +2FE0 +3920 +6920 +AAA0 +2C60 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39E3 +ENCODING 14819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4900 +EFE0 +5100 +4100 +5FE0 +6380 +C540 +4920 +5120 +C100 +ENDCHAR +STARTCHAR U_39E4 +ENCODING 14820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F200 +2440 +3FE0 +6280 +A280 +2280 +A4A0 +4860 +ENDCHAR +STARTCHAR U_39E5 +ENCODING 14821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +2100 +3FE0 +6280 +A280 +22A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_39E6 +ENCODING 14822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +F7E0 +2820 +27A0 +34A0 +67A0 +A4A0 +27A0 +A0A0 +4040 +ENDCHAR +STARTCHAR U_39E7 +ENCODING 14823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4200 +4440 +6FE0 +4000 +C540 +4540 +4540 +C960 +ENDCHAR +STARTCHAR U_39E8 +ENCODING 14824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +E800 +4800 +4FE0 +6800 +4BC0 +CA40 +4A40 +4A40 +D3C0 +ENDCHAR +STARTCHAR U_39E9 +ENCODING 14825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5040 +FFC0 +5240 +5FC0 +7AC0 +5AC0 +DAC0 +5240 +5260 +E220 +ENDCHAR +STARTCHAR U_39EA +ENCODING 14826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +E480 +4FE0 +4800 +6BC0 +4A40 +CAC0 +4A00 +4A20 +D1E0 +ENDCHAR +STARTCHAR U_39EB +ENCODING 14827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2FE0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +A820 +4860 +ENDCHAR +STARTCHAR U_39EC +ENCODING 14828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +4440 +4540 +7540 +C860 +1F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39ED +ENCODING 14829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +2120 +2140 +3920 +E1E0 +1F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39EE +ENCODING 14830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +F8E0 +2820 +2820 +3820 +6EE0 +A820 +2820 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39EF +ENCODING 14831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F120 +2140 +2FE0 +3100 +6240 +AE80 +2320 +A220 +41E0 +ENDCHAR +STARTCHAR U_39F0 +ENCODING 14832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +E800 +4900 +4900 +6FE0 +4100 +C540 +4920 +5520 +C200 +ENDCHAR +STARTCHAR U_39F1 +ENCODING 14833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +5080 +8BE0 +0080 +FBE0 +0080 +F880 +8880 +8880 +F980 +ENDCHAR +STARTCHAR U_39F2 +ENCODING 14834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4820 +4100 +6FE0 +4380 +C540 +4920 +5120 +C100 +ENDCHAR +STARTCHAR U_39F3 +ENCODING 14835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +EC60 +47C0 +E240 +44C0 +DF00 +0400 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39F4 +ENCODING 14836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42C0 +4CA0 +E480 +4FE0 +4480 +64A0 +46A0 +CCC0 +5480 +45A0 +CC60 +ENDCHAR +STARTCHAR U_39F5 +ENCODING 14837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +F100 +2340 +3520 +2920 +6100 +AFE0 +2820 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39F6 +ENCODING 14838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +2440 +37C0 +6460 +AFC0 +20C0 +A340 +4CC0 +ENDCHAR +STARTCHAR U_39F7 +ENCODING 14839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F100 +2FE0 +2280 +3440 +6FE0 +A440 +2440 +A440 +47C0 +ENDCHAR +STARTCHAR U_39F8 +ENCODING 14840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +37C0 +6000 +A7C0 +2080 +A100 +4300 +ENDCHAR +STARTCHAR U_39F9 +ENCODING 14841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +EFC0 +4840 +4FC0 +6000 +5FE0 +C080 +5FE0 +4880 +C580 +ENDCHAR +STARTCHAR U_39FA +ENCODING 14842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5D20 +E5C0 +4940 +5520 +4200 +6FC0 +C840 +4FC0 +4840 +CFC0 +ENDCHAR +STARTCHAR U_39FB +ENCODING 14843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2D20 +21C0 +3680 +6EC0 +A3A0 +2FA0 +A080 +4300 +ENDCHAR +STARTCHAR U_39FC +ENCODING 14844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +3100 +2FE0 +6180 +A2A0 +26C0 +AA40 +4320 +ENDCHAR +STARTCHAR U_39FD +ENCODING 14845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3BA0 +6AA0 +AAA0 +2BA0 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39FE +ENCODING 14846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +EAA0 +42A0 +4520 +6560 +4000 +C240 +5520 +5440 +C3C0 +ENDCHAR +STARTCHAR U_39FF +ENCODING 14847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +EAA0 +5120 +4000 +6100 +4500 +C5E0 +4500 +4B00 +D1E0 +ENDCHAR +STARTCHAR U_3A00 +ENCODING 14848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2100 +F7E0 +2100 +27C0 +3140 +6FE0 +A140 +27C0 +A380 +4540 +ENDCHAR +STARTCHAR U_3A01 +ENCODING 14849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +37C0 +6440 +A7C0 +2440 +A440 +4FE0 +ENDCHAR +STARTCHAR U_3A02 +ENCODING 14850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2540 +37C0 +6540 +A7C0 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_3A03 +ENCODING 14851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +2000 +37C0 +6040 +AFE0 +2080 +A280 +4100 +ENDCHAR +STARTCHAR U_3A04 +ENCODING 14852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FBA0 +2920 +2FE0 +3820 +6BA0 +AAA0 +2BA0 +A820 +5060 +ENDCHAR +STARTCHAR U_3A05 +ENCODING 14853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +2100 +2FE0 +3920 +6AA0 +AA60 +2C60 +A820 +4860 +ENDCHAR +STARTCHAR U_3A06 +ENCODING 14854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +EEE0 +4440 +4440 +6CC0 +CEE0 +5560 +5540 +4440 +C440 +ENDCHAR +STARTCHAR U_3A07 +ENCODING 14855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4F80 +AA80 +4D00 +0A00 +D500 +3E00 +0800 +3E00 +FF80 +0800 +1800 +ENDCHAR +STARTCHAR U_3A08 +ENCODING 14856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2100 +2EE0 +3000 +6440 +A7C0 +2440 +A7C0 +4840 +ENDCHAR +STARTCHAR U_3A09 +ENCODING 14857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2480 +27E0 +3640 +67E0 +A420 +27E0 +A420 +47E0 +ENDCHAR +STARTCHAR U_3A0A +ENCODING 14858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F200 +23E0 +2480 +33E0 +6000 +A3E0 +22A0 +A260 +42A0 +ENDCHAR +STARTCHAR U_3A0B +ENCODING 14859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27E0 +F140 +2FE0 +2100 +3200 +67E0 +AA20 +23E0 +A220 +43E0 +ENDCHAR +STARTCHAR U_3A0C +ENCODING 14860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F9C0 +7140 +F940 +8A60 +7000 +23E0 +7220 +2140 +F880 +6360 +ENDCHAR +STARTCHAR U_3A0D +ENCODING 14861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +77E0 +2040 +FA40 +20C0 +F700 +0200 +1F80 +0200 +3FC0 +0600 +ENDCHAR +STARTCHAR U_3A0E +ENCODING 14862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +2AA0 +3860 +6100 +AFE0 +2100 +A280 +4C60 +ENDCHAR +STARTCHAR U_3A0F +ENCODING 14863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +F7E0 +2200 +2FE0 +3280 +62A0 +A5C0 +2480 +A540 +4A20 +ENDCHAR +STARTCHAR U_3A10 +ENCODING 14864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4A20 +EA20 +53E0 +5080 +73E0 +5080 +D1C0 +52A0 +56A0 +D080 +ENDCHAR +STARTCHAR U_3A11 +ENCODING 14865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +4920 +EAA0 +4FE0 +4440 +6A20 +43C0 +C440 +4A80 +4100 +CEE0 +ENDCHAR +STARTCHAR U_3A12 +ENCODING 14866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E440 +4920 +47C0 +6100 +4FE0 +C100 +47C0 +4100 +CFE0 +ENDCHAR +STARTCHAR U_3A13 +ENCODING 14867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EAA0 +4440 +4940 +6500 +47C0 +C900 +4FE0 +4100 +C100 +ENDCHAR +STARTCHAR U_3A14 +ENCODING 14868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +EFE0 +4880 +4E80 +68A0 +4EA0 +CAC0 +4E80 +51A0 +D260 +ENDCHAR +STARTCHAR U_3A15 +ENCODING 14869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +4840 +E860 +4FA0 +4AA0 +6920 +52A0 +C400 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_3A16 +ENCODING 14870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +4900 +E9E0 +5120 +5EA0 +6AA0 +48A0 +DC40 +48A0 +4D20 +D220 +ENDCHAR +STARTCHAR U_3A17 +ENCODING 14871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +E7C0 +4040 +4FE0 +6040 +47C0 +C100 +49E0 +4900 +D7E0 +ENDCHAR +STARTCHAR U_3A18 +ENCODING 14872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +E540 +4BA0 +47C0 +6C40 +57C0 +C440 +47C0 +4440 +C7C0 +ENDCHAR +STARTCHAR U_3A19 +ENCODING 14873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F300 +2640 +2380 +3220 +67E0 +A100 +2FE0 +A100 +4EE0 +ENDCHAR +STARTCHAR U_3A1A +ENCODING 14874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +27E0 +3820 +27A0 +64A0 +A7A0 +24A0 +A7A0 +4040 +ENDCHAR +STARTCHAR U_3A1B +ENCODING 14875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EEE0 +4AA0 +4EE0 +6820 +4920 +C920 +4AA0 +4CA0 +C860 +ENDCHAR +STARTCHAR U_3A1C +ENCODING 14876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +4A20 +4FC0 +6A00 +4BE0 +C900 +4EE0 +4900 +D6E0 +ENDCHAR +STARTCHAR U_3A1D +ENCODING 14877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +4AA0 +49C0 +6BE0 +4A20 +CBE0 +4A20 +4BE0 +D260 +ENDCHAR +STARTCHAR U_3A1E +ENCODING 14878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E7C0 +4FE0 +4200 +64C0 +4300 +C440 +4FE0 +4540 +C920 +ENDCHAR +STARTCHAR U_3A1F +ENCODING 14879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +EFE0 +4000 +4FE0 +6000 +47C0 +C440 +47C0 +4280 +CFE0 +ENDCHAR +STARTCHAR U_3A20 +ENCODING 14880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F7C0 +2440 +27C0 +3440 +67C0 +A100 +2FE0 +A440 +4820 +ENDCHAR +STARTCHAR U_3A21 +ENCODING 14881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2920 +2E20 +3960 +6EA0 +A9E0 +2EA0 +A920 +4FE0 +ENDCHAR +STARTCHAR U_3A22 +ENCODING 14882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +52C0 +FF80 +40A0 +5EE0 +7200 +5EA0 +D2C0 +5E80 +52A0 +D2E0 +ENDCHAR +STARTCHAR U_3A23 +ENCODING 14883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2540 +FA20 +27C0 +3040 +6EE0 +AAA0 +2660 +AAA0 +4440 +ENDCHAR +STARTCHAR U_3A24 +ENCODING 14884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4940 +E9E0 +4A40 +4EE0 +6A40 +4AE0 +CA40 +4AE0 +4800 +CFE0 +ENDCHAR +STARTCHAR U_3A25 +ENCODING 14885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4880 +EBE0 +56A0 +4AA0 +6AA0 +56A0 +DB60 +4220 +4620 +DA60 +ENDCHAR +STARTCHAR U_3A26 +ENCODING 14886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4BE0 +F880 +4BE0 +4880 +6BE0 +4000 +C7C0 +4440 +4380 +CC60 +ENDCHAR +STARTCHAR U_3A27 +ENCODING 14887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +F7E0 +2100 +2FE0 +3280 +67C0 +BD60 +27C0 +A540 +47C0 +ENDCHAR +STARTCHAR U_3A28 +ENCODING 14888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +E8A0 +4AA0 +4D60 +6000 +4FE0 +C920 +4FE0 +4920 +CFE0 +ENDCHAR +STARTCHAR U_3A29 +ENCODING 14889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E800 +4F20 +49C0 +6A40 +4AE0 +CB40 +4DE0 +4A00 +D5E0 +ENDCHAR +STARTCHAR U_3A2A +ENCODING 14890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +E7C0 +4440 +47C0 +6920 +4540 +CFE0 +4280 +42A0 +CC60 +ENDCHAR +STARTCHAR U_3A2B +ENCODING 14891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +5500 +F5E0 +5680 +5440 +4400 +6000 +DFC0 +5540 +5540 +BFE0 +ENDCHAR +STARTCHAR U_3A2C +ENCODING 14892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +27C0 +3120 +62C0 +A680 +2A60 +4300 +ENDCHAR +STARTCHAR U_3A2D +ENCODING 14893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +4FE0 +4A40 +6BC0 +4BE0 +CAA0 +4BE0 +4A00 +D3E0 +ENDCHAR +STARTCHAR U_3A2E +ENCODING 14894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4560 +4BA0 +EAA0 +4BA0 +4AA0 +6BA0 +4C60 +C280 +4280 +42A0 +CC60 +ENDCHAR +STARTCHAR U_3A2F +ENCODING 14895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5FA0 +EEA0 +4AC0 +4EA0 +60A0 +4EA0 +C2C0 +5F80 +4480 +CC80 +ENDCHAR +STARTCHAR U_3A30 +ENCODING 14896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2640 +2CA0 +37C0 +6300 +A540 +2CC0 +B580 +4660 +ENDCHAR +STARTCHAR U_3A31 +ENCODING 14897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +E940 +4580 +4E00 +6100 +CFE0 +4000 +4FE0 +C440 +47C0 +ENDCHAR +STARTCHAR U_3A32 +ENCODING 14898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +2100 +2FE0 +2920 +37C0 +6100 +A380 +2540 +6920 +ENDCHAR +STARTCHAR U_3A33 +ENCODING 14899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2280 +3FE0 +6040 +A740 +2540 +2740 +60C0 +ENDCHAR +STARTCHAR U_3A34 +ENCODING 14900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +5E80 +E9E0 +5E00 +52E0 +7E40 +D280 +5E80 +4900 +DF20 +48C0 +ENDCHAR +STARTCHAR U_3A35 +ENCODING 14901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +EA00 +4EA0 +4AA0 +6EA0 +D260 +4000 +4FE0 +C220 +5CC0 +ENDCHAR +STARTCHAR U_3A36 +ENCODING 14902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +2400 +37C0 +6400 +A7E0 +2020 +2AA0 +6060 +ENDCHAR +STARTCHAR U_3A37 +ENCODING 14903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +27E0 +3D20 +67E0 +A100 +2FE0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_3A38 +ENCODING 14904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA20 +4480 +5520 +C640 +5BC0 +4100 +4920 +4920 +CFE0 +ENDCHAR +STARTCHAR U_3A39 +ENCODING 14905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +F440 +4EE0 +4440 +6EE0 +CFC0 +4040 +5FE0 +4040 +CFC0 +ENDCHAR +STARTCHAR U_3A3A +ENCODING 14906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +3100 +6FE0 +A920 +2BA0 +2D60 +A920 +6860 +ENDCHAR +STARTCHAR U_3A3B +ENCODING 14907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +AA00 +FBE0 +AA80 +FC80 +2F80 +0400 +7FE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_3A3C +ENCODING 14908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0780 +FC80 +AB00 +FCC0 +AA80 +FB80 +1E00 +0400 +FFC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3A3D +ENCODING 14909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +4020 +EE20 +4AA0 +4EA0 +60A0 +DFA0 +5520 +5F20 +5520 +DF60 +ENDCHAR +STARTCHAR U_3A3E +ENCODING 14910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4BA0 +E7C0 +4100 +4FE0 +6200 +CF20 +4140 +4F80 +4340 +CD20 +ENDCHAR +STARTCHAR U_3A3F +ENCODING 14911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2080 +F7E0 +24A0 +37C0 +6480 +A5E0 +26A0 +25A0 +A500 +6AE0 +ENDCHAR +STARTCHAR U_3A40 +ENCODING 14912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +4900 +4FC0 +6900 +CBE0 +4D60 +4AA0 +4920 +D2C0 +ENDCHAR +STARTCHAR U_3A41 +ENCODING 14913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +2A20 +2480 +3FE0 +E480 +27E0 +2480 +E7E0 +ENDCHAR +STARTCHAR U_3A42 +ENCODING 14914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4E40 +52C0 +E440 +5FC0 +5540 +7F60 +D5C0 +5F40 +5540 +E340 +ENDCHAR +STARTCHAR U_3A43 +ENCODING 14915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3280 +E540 +28A0 +2300 +6080 +ENDCHAR +STARTCHAR U_3A44 +ENCODING 14916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27C0 +F000 +27C0 +2540 +37C0 +6540 +A7C0 +2000 +AD40 +57A0 +ENDCHAR +STARTCHAR U_3A45 +ENCODING 14917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2EE0 +FAA0 +2EE0 +2280 +3FE0 +E920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_3A46 +ENCODING 14918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +48A0 +FE80 +41E0 +5C80 +5480 +7C80 +C880 +5D40 +CA40 +5C60 +ENDCHAR +STARTCHAR U_3A47 +ENCODING 14919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +3140 +2FE0 +6540 +A7C0 +2540 +A540 +4FE0 +ENDCHAR +STARTCHAR U_3A48 +ENCODING 14920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +27C0 +3140 +67E0 +A240 +27C0 +AA40 +53C0 +ENDCHAR +STARTCHAR U_3A49 +ENCODING 14921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F7C0 +2820 +27C0 +3440 +6FE0 +AAA0 +2660 +BBA0 +4660 +ENDCHAR +STARTCHAR U_3A4A +ENCODING 14922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2F80 +F540 +2FE0 +2AA0 +2FE0 +3040 +EFE0 +2040 +2240 +60C0 +ENDCHAR +STARTCHAR U_3A4B +ENCODING 14923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +2140 +37C0 +6BA0 +AD60 +2BA0 +AD60 +53A0 +ENDCHAR +STARTCHAR U_3A4C +ENCODING 14924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F2A0 +2FE0 +2A80 +3FE0 +6460 +A7C0 +2440 +A7C0 +4C60 +ENDCHAR +STARTCHAR U_3A4D +ENCODING 14925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +2100 +2FE0 +3100 +67C0 +A540 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_3A4E +ENCODING 14926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EC0 +2AA0 +FE80 +2BE0 +2E80 +3080 +6E80 +AA80 +2EC0 +AB20 +4A20 +ENDCHAR +STARTCHAR U_3A4F +ENCODING 14927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +2100 +37C0 +E100 +2FE0 +2540 +6AA0 +ENDCHAR +STARTCHAR U_3A50 +ENCODING 14928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F540 +2100 +2FE0 +3100 +67C0 +A080 +2FE0 +A480 +4180 +ENDCHAR +STARTCHAR U_3A51 +ENCODING 14929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2280 +2440 +3EE0 +6280 +AEE0 +2280 +AEE0 +4280 +ENDCHAR +STARTCHAR U_3A52 +ENCODING 14930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +2AA0 +37C0 +6000 +AFE0 +2540 +A520 +4920 +ENDCHAR +STARTCHAR U_3A53 +ENCODING 14931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DDE0 +AA80 +77E0 +2200 +DFC0 +0200 +FFE0 +0200 +0C00 +ENDCHAR +STARTCHAR U_3A54 +ENCODING 14932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5140 +FF40 +5520 +5FE0 +5540 +7540 +DFC0 +5540 +54A0 +E920 +ENDCHAR +STARTCHAR U_3A55 +ENCODING 14933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +27C0 +3100 +66C0 +A920 +27C0 +A280 +4100 +ENDCHAR +STARTCHAR U_3A56 +ENCODING 14934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7C0 +2540 +2FE0 +3100 +67C0 +A540 +27C0 +A540 +4FE0 +ENDCHAR +STARTCHAR U_3A57 +ENCODING 14935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F480 +2FE0 +2480 +37E0 +E480 +2FC0 +2240 +A420 +58E0 +ENDCHAR +STARTCHAR U_3A58 +ENCODING 14936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F100 +27C0 +3100 +2FE0 +6540 +BFE0 +24A0 +2E40 +64A0 +ENDCHAR +STARTCHAR U_3A59 +ENCODING 14937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3440 +E920 +27C0 +2100 +6FE0 +ENDCHAR +STARTCHAR U_3A5A +ENCODING 14938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2820 +37C0 +6220 +AD40 +2280 +AD60 +4200 +ENDCHAR +STARTCHAR U_3A5B +ENCODING 14939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FFE0 +5560 +57A0 +7560 +DFA0 +54A0 +52A0 +5120 +DFE0 +ENDCHAR +STARTCHAR U_3A5C +ENCODING 14940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5480 +FEE0 +5300 +5E00 +54E0 +7F00 +C000 +5FC0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_3A5D +ENCODING 14941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2820 +37C0 +6240 +AD80 +2340 +ACA0 +4300 +ENDCHAR +STARTCHAR U_3A5E +ENCODING 14942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +27E0 +F240 +2DA0 +2000 +3FE0 +6920 +A7C0 +2100 +A540 +4920 +ENDCHAR +STARTCHAR U_3A5F +ENCODING 14943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3540 +EFE0 +2100 +2540 +6B20 +ENDCHAR +STARTCHAR U_3A60 +ENCODING 14944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FA80 +2FE0 +2AA0 +3FE0 +6A40 +AB60 +2A40 +A920 +5540 +ENDCHAR +STARTCHAR U_3A61 +ENCODING 14945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F200 +27C0 +2240 +33C0 +6EE0 +A880 +2EE0 +AAA0 +4EE0 +ENDCHAR +STARTCHAR U_3A62 +ENCODING 14946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F280 +2FE0 +2AA0 +3FE0 +6120 +AFE0 +2940 +ACA0 +5360 +ENDCHAR +STARTCHAR U_3A63 +ENCODING 14947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2660 +FAA0 +2FE0 +2920 +37C0 +6540 +A7C0 +2540 +AFE0 +4100 +ENDCHAR +STARTCHAR U_3A64 +ENCODING 14948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +E480 +5FE0 +5540 +5F40 +7540 +DE80 +4A80 +5340 +EF40 +ENDCHAR +STARTCHAR U_3A65 +ENCODING 14949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4EA0 +E480 +5FE0 +4A80 +6BA0 +DAA0 +4B40 +5A40 +4FA0 +D920 +ENDCHAR +STARTCHAR U_3A66 +ENCODING 14950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +47E0 +E900 +5FC0 +4900 +6FE0 +4900 +DFE0 +54A0 +5AE0 +D320 +ENDCHAR +STARTCHAR U_3A67 +ENCODING 14951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +EFC0 +4480 +5FE0 +6480 +DFE0 +4D40 +53A0 +5540 +CB20 +ENDCHAR +STARTCHAR U_3A68 +ENCODING 14952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +E440 +4EE0 +4440 +6FC0 +D040 +4FC0 +4500 +5460 +D7C0 +ENDCHAR +STARTCHAR U_3A69 +ENCODING 14953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4E40 +E8E0 +4EA0 +40E0 +64A0 +D5E0 +4EA0 +55E0 +4440 +CCA0 +ENDCHAR +STARTCHAR U_3A6A +ENCODING 14954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +E9E0 +4B20 +5DE0 +4520 +69E0 +DF20 +41E0 +54C0 +EB20 +ENDCHAR +STARTCHAR U_3A6B +ENCODING 14955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +4880 +EFE0 +4AA0 +47C0 +6440 +C7C0 +4440 +47C0 +4280 +CC40 +ENDCHAR +STARTCHAR U_3A6C +ENCODING 14956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4640 +4440 +FFE0 +5440 +5F40 +5460 +77C0 +D540 +5DC0 +5560 +EFC0 +ENDCHAR +STARTCHAR U_3A6D +ENCODING 14957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D60 +4AA0 +ED60 +4AA0 +5FE0 +5020 +67C0 +C080 +4FE0 +4100 +C700 +ENDCHAR +STARTCHAR U_3A6E +ENCODING 14958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B60 +5220 +FB60 +5520 +7FE0 +4540 +6BA0 +D100 +4FC0 +4100 +C300 +ENDCHAR +STARTCHAR U_3A6F +ENCODING 14959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +51E0 +FF40 +5480 +5F60 +4200 +6700 +C240 +4FC0 +4A80 +D640 +ENDCHAR +STARTCHAR U_3A70 +ENCODING 14960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F380 +2280 +2FE0 +2AA0 +6EE0 +A100 +2FE0 +A540 +4920 +ENDCHAR +STARTCHAR U_3A71 +ENCODING 14961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2AA0 +2FE0 +3A20 +6EE0 +AA20 +2EA0 +AA20 +4D60 +ENDCHAR +STARTCHAR U_3A72 +ENCODING 14962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F6C0 +2AA0 +2EE0 +3480 +6FE0 +B480 +27E0 +A480 +47E0 +ENDCHAR +STARTCHAR U_3A73 +ENCODING 14963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +5FE0 +EA80 +4FE0 +4A80 +5FE0 +6000 +CFC0 +4440 +4380 +DC60 +ENDCHAR +STARTCHAR U_3A74 +ENCODING 14964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3500 +6FE0 +B900 +2FE0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_3A75 +ENCODING 14965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +4460 +FF40 +54E0 +5D40 +5740 +7540 +D7A0 +5AA0 +DFA0 +6AA0 +ENDCHAR +STARTCHAR U_3A76 +ENCODING 14966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F540 +5FE0 +4A40 +7220 +DFE0 +5B60 +56A0 +DB60 +56A0 +ENDCHAR +STARTCHAR U_3A77 +ENCODING 14967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F4A0 +4FC0 +4480 +7FE0 +CD40 +57A0 +4500 +C7E0 +4AA0 +ENDCHAR +STARTCHAR U_3A78 +ENCODING 14968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +2FE0 +3DA0 +6B60 +AFE0 +2AA0 +A500 +4FE0 +ENDCHAR +STARTCHAR U_3A79 +ENCODING 14969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4F80 +4A80 +EF80 +4A80 +5FC0 +7540 +DFC0 +5540 +4700 +C500 +5FC0 +ENDCHAR +STARTCHAR U_3A7A +ENCODING 14970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +93E0 +9080 +FC80 +93E0 +9220 +9140 +9140 +9480 +D940 +9620 +ENDCHAR +STARTCHAR U_3A7B +ENCODING 14971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7080 +A7E0 +7880 +8080 +BBE0 +AA20 +B940 +A080 +A940 +B220 +ENDCHAR +STARTCHAR U_3A7C +ENCODING 14972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +6100 +47C0 +A240 +7A40 +8A80 +5100 +2280 +CC60 +ENDCHAR +STARTCHAR U_3A7D +ENCODING 14973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FA40 +AE40 +FA80 +2280 +7180 +6900 +A280 +2C60 +ENDCHAR +STARTCHAR U_3A7E +ENCODING 14974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E080 +2080 +FDE0 +A880 +FC80 +ABE0 +2220 +F940 +2080 +FB60 +ENDCHAR +STARTCHAR U_3A7F +ENCODING 14975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7A00 +83E0 +0240 +FA40 +1540 +2140 +4080 +8940 +FA20 +ENDCHAR +STARTCHAR U_3A80 +ENCODING 14976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +23E0 +2240 +FA40 +2540 +2140 +2080 +2080 +A140 +4620 +ENDCHAR +STARTCHAR U_3A81 +ENCODING 14977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +28E0 +4480 +A3E0 +1220 +F940 +0940 +1080 +1140 +2620 +ENDCHAR +STARTCHAR U_3A82 +ENCODING 14978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +80E0 +7880 +0080 +F3E0 +1220 +1140 +1480 +1540 +0E20 +ENDCHAR +STARTCHAR U_3A83 +ENCODING 14979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +08E0 +E880 +A880 +ABE0 +AA20 +E940 +0880 +0940 +1A20 +ENDCHAR +STARTCHAR U_3A84 +ENCODING 14980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FD00 +55E0 +FD40 +D340 +FD40 +5540 +5480 +5C80 +5140 +9220 +ENDCHAR +STARTCHAR U_3A85 +ENCODING 14981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +7FE0 +4520 +58A0 +4720 +0400 +3F80 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_3A86 +ENCODING 14982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F080 +90E0 +9080 +FBE0 +9220 +9140 +9140 +B480 +CD40 +B620 +ENDCHAR +STARTCHAR U_3A87 +ENCODING 14983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +7DE0 +9240 +1140 +FD40 +2940 +2880 +2A80 +4D40 +8A20 +ENDCHAR +STARTCHAR U_3A88 +ENCODING 14984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +70E0 +2080 +F880 +23E0 +2220 +F940 +2080 +3940 +C220 +ENDCHAR +STARTCHAR U_3A89 +ENCODING 14985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +8A40 +0540 +F940 +0140 +F880 +8880 +8940 +FA20 +ENDCHAR +STARTCHAR U_3A8A +ENCODING 14986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2880 +FCE0 +2880 +F880 +23E0 +7A20 +C940 +4880 +4940 +7A20 +ENDCHAR +STARTCHAR U_3A8B +ENCODING 14987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +F8E0 +8880 +F880 +03E0 +FA20 +2140 +F880 +2140 +2220 +ENDCHAR +STARTCHAR U_3A8C +ENCODING 14988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +20E0 +F880 +A880 +FBE0 +AA20 +F940 +A880 +A940 +BA20 +ENDCHAR +STARTCHAR U_3A8D +ENCODING 14989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +21E0 +FE40 +8540 +7940 +0940 +1C80 +7080 +1140 +3220 +ENDCHAR +STARTCHAR U_3A8E +ENCODING 14990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +11E0 +5640 +5540 +BB40 +1140 +2880 +2880 +4540 +8620 +ENDCHAR +STARTCHAR U_3A8F +ENCODING 14991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F880 +A8E0 +F880 +A880 +FBE0 +4220 +A140 +F880 +2140 +2220 +ENDCHAR +STARTCHAR U_3A90 +ENCODING 14992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +84E0 +FC80 +9880 +97E0 +FE20 +9140 +9080 +A940 +C620 +ENDCHAR +STARTCHAR U_3A91 +ENCODING 14993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +50E0 +AC80 +F880 +ABE0 +FA20 +A940 +F880 +2140 +3A20 +ENDCHAR +STARTCHAR U_3A92 +ENCODING 14994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +9C80 +84E0 +CC80 +8480 +FFE0 +5220 +5140 +5080 +5540 +9A20 +ENDCHAR +STARTCHAR U_3A93 +ENCODING 14995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E080 +20E0 +FC80 +2080 +6BE0 +EA20 +6D40 +E880 +6D40 +2220 +ENDCHAR +STARTCHAR U_3A94 +ENCODING 14996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +FCE0 +4880 +6C80 +DBE0 +6A20 +4940 +4880 +4940 +4A20 +ENDCHAR +STARTCHAR U_3A95 +ENCODING 14997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +20E0 +F880 +8880 +FBE0 +8A20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_3A96 +ENCODING 14998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +48E0 +7880 +0880 +FFE0 +1220 +5540 +3880 +5540 +3220 +ENDCHAR +STARTCHAR U_3A97 +ENCODING 14999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FCE0 +4880 +3080 +FFE0 +0220 +7940 +4880 +4940 +7A20 +ENDCHAR +STARTCHAR U_3A98 +ENCODING 15000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +29E0 +4640 +B940 +1140 +7D40 +5540 +7C80 +2940 +4620 +ENDCHAR +STARTCHAR U_3A99 +ENCODING 15001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +F9E0 +AA40 +F940 +2140 +F940 +2140 +7140 +A880 +2360 +ENDCHAR +STARTCHAR U_3A9A +ENCODING 15002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +51E0 +5240 +F940 +0140 +F940 +8940 +F940 +8880 +FB60 +ENDCHAR +STARTCHAR U_3A9B +ENCODING 15003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +48E0 +7880 +4880 +7BE0 +4A20 +FD40 +5080 +6940 +7E20 +ENDCHAR +STARTCHAR U_3A9C +ENCODING 15004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +9280 +92E0 +FE80 +0080 +FFE0 +2220 +FF20 +AAC0 +AAC0 +83A0 +ENDCHAR +STARTCHAR U_3A9D +ENCODING 15005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +FE80 +D680 +BBE0 +9220 +FF40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_3A9E +ENCODING 15006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +A4E0 +9480 +0080 +FFE0 +8620 +E540 +9C80 +8540 +FE20 +ENDCHAR +STARTCHAR U_3A9F +ENCODING 15007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +01E0 +FA40 +8D40 +F940 +0140 +F940 +C880 +B940 +FE20 +ENDCHAR +STARTCHAR U_3AA0 +ENCODING 15008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +50E0 +FC80 +5480 +FFE0 +5520 +FD40 +5880 +D540 +5220 +ENDCHAR +STARTCHAR U_3AA1 +ENCODING 15009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +92E0 +7C80 +1080 +7FE0 +1220 +7D40 +4480 +4540 +7E20 +ENDCHAR +STARTCHAR U_3AA2 +ENCODING 15010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +9280 +D6E0 +9280 +D680 +11E0 +7E20 +4540 +2880 +1140 +EE20 +ENDCHAR +STARTCHAR U_3AA3 +ENCODING 15011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +44E0 +7D20 +0320 +FF20 +8340 +BAC0 +AA80 +BB40 +8220 +ENDCHAR +STARTCHAR U_3AA4 +ENCODING 15012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9280 +FE80 +92E0 +FEA0 +5520 +FEA0 +54A0 +FEC0 +10C0 +1320 +ENDCHAR +STARTCHAR U_3AA5 +ENCODING 15013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +20E0 +FC80 +A480 +9BE0 +BE20 +A540 +BC80 +A540 +FE20 +ENDCHAR +STARTCHAR U_3AA6 +ENCODING 15014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +85E0 +7A40 +F940 +A940 +F940 +A880 +F880 +5140 +8A20 +ENDCHAR +STARTCHAR U_3AA7 +ENCODING 15015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +7CE0 +8280 +7FE0 +4520 +FD20 +B540 +6C80 +B540 +6E20 +ENDCHAR +STARTCHAR U_3AA8 +ENCODING 15016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3080 +FEE0 +1080 +7C80 +57E0 +FE20 +0220 +7940 +4880 +7B60 +ENDCHAR +STARTCHAR U_3AA9 +ENCODING 15017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +28E0 +FC80 +2880 +FBE0 +FA20 +AA20 +F940 +E880 +BB60 +ENDCHAR +STARTCHAR U_3AAA +ENCODING 15018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2080 +F8E0 +5080 +8880 +DBE0 +5220 +DA20 +5140 +D880 +5360 +ENDCHAR +STARTCHAR U_3AAB +ENCODING 15019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FCE0 +8480 +7880 +4BE0 +B620 +7A20 +ED40 +5880 +7B60 +ENDCHAR +STARTCHAR U_3AAC +ENCODING 15020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B480 +6CE0 +B480 +2080 +53E0 +7E20 +D220 +7D40 +5080 +7F60 +ENDCHAR +STARTCHAR U_3AAD +ENCODING 15021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FCE0 +A480 +B880 +BBE0 +AA20 +BA20 +FD40 +D480 +FF60 +ENDCHAR +STARTCHAR U_3AAE +ENCODING 15022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +1080 +FCE0 +D480 +B880 +57E0 +0220 +AA20 +A940 +A880 +AB60 +ENDCHAR +STARTCHAR U_3AAF +ENCODING 15023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +1100 +0E00 +F1E0 +0400 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_3AB0 +ENCODING 15024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +1F00 +E0E0 +2480 +1500 +FFE0 +2480 +4440 +ENDCHAR +STARTCHAR U_3AB1 +ENCODING 15025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F480 +1D00 +57C0 +6540 +2540 +57E0 +5100 +8280 +0440 +ENDCHAR +STARTCHAR U_3AB2 +ENCODING 15026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +4200 +2200 +07E0 +FA00 +0200 +7FC0 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_3AB3 +ENCODING 15027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +4A00 +2200 +03E0 +FE00 +0200 +3FC0 +4020 +4020 +3FC0 +ENDCHAR +STARTCHAR U_3AB4 +ENCODING 15028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7280 +0180 +0480 +FA80 +5080 +57E0 +5080 +5480 +5880 +9080 +ENDCHAR +STARTCHAR U_3AB5 +ENCODING 15029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AA80 +7180 +2480 +FA80 +2080 +27E0 +F880 +2080 +2080 +4080 +ENDCHAR +STARTCHAR U_3AB6 +ENCODING 15030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +2180 +4480 +FA80 +8880 +8FE0 +F880 +8880 +8880 +F880 +ENDCHAR +STARTCHAR U_3AB7 +ENCODING 15031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +0240 +F940 +8840 +8A40 +F940 +00E0 +8B40 +5040 +3840 +C040 +ENDCHAR +STARTCHAR U_3AB8 +ENCODING 15032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +FD40 +48C0 +7A40 +4940 +7840 +4BE0 +FC40 +0040 +4840 +8440 +ENDCHAR +STARTCHAR U_3AB9 +ENCODING 15033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7D40 +D6C0 +7D40 +54C0 +7C40 +13E0 +FC40 +2440 +3840 +CC40 +ENDCHAR +STARTCHAR U_3ABA +ENCODING 15034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FD40 +20C0 +FC40 +B540 +FCC0 +B460 +FFC0 +2040 +5040 +8840 +ENDCHAR +STARTCHAR U_3ABB +ENCODING 15035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +8E80 +6A60 +8480 +6E60 +4A40 +AEA0 +4900 +2500 +FFE0 +0100 +ENDCHAR +STARTCHAR U_3ABC +ENCODING 15036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +0B80 +0A00 +EBE0 +AA40 +AA40 +AA40 +EA40 +0A40 +0A40 +3440 +ENDCHAR +STARTCHAR U_3ABD +ENCODING 15037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +F0E0 +9300 +9200 +F3E0 +9240 +9240 +F240 +0440 +0840 +ENDCHAR +STARTCHAR U_3ABE +ENCODING 15038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3B80 +4A00 +AA00 +13E0 +2A40 +C240 +7A40 +4A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_3ABF +ENCODING 15039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AB80 +AA00 +FA00 +23E0 +4240 +AA40 +AA40 +FA40 +2240 +C440 +ENDCHAR +STARTCHAR U_3AC0 +ENCODING 15040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4980 +7900 +49E0 +7940 +0140 +FD40 +8540 +FD40 +8540 +FE40 +ENDCHAR +STARTCHAR U_3AC1 +ENCODING 15041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A460 +C980 +A500 +C900 +FDE0 +8140 +FD40 +A940 +AD40 +C140 +FA40 +ENDCHAR +STARTCHAR U_3AC2 +ENCODING 15042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +8100 +A900 +FDE0 +A940 +A940 +B940 +8140 +5540 +9640 +ENDCHAR +STARTCHAR U_3AC3 +ENCODING 15043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +2080 +2080 +3880 +2940 +2940 +4A40 +5A20 +8420 +ENDCHAR +STARTCHAR U_3AC4 +ENCODING 15044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +2000 +3FC0 +4840 +BF40 +1040 +1E40 +2240 +46C0 +ENDCHAR +STARTCHAR U_3AC5 +ENCODING 15045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +45E0 +7800 +4BE0 +4940 +4940 +4940 +5940 +8240 +ENDCHAR +STARTCHAR U_3AC6 +ENCODING 15046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4140 +4220 +7C80 +4880 +49C0 +4AA0 +4AA0 +4880 +9980 +ENDCHAR +STARTCHAR U_3AC7 +ENCODING 15047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +7C80 +4840 +4980 +9840 +0000 +7FC0 +0040 +0040 +ENDCHAR +STARTCHAR U_3AC8 +ENCODING 15048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +7880 +4840 +9880 +0040 +3F80 +4040 +4040 +3F80 +ENDCHAR +STARTCHAR U_3AC9 +ENCODING 15049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +F480 +47E0 +7400 +55C0 +5540 +5540 +55C0 +9520 +B9E0 +ENDCHAR +STARTCHAR U_3ACA +ENCODING 15050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F400 +4800 +4FE0 +7040 +5740 +5540 +5540 +5740 +B0C0 +ENDCHAR +STARTCHAR U_3ACB +ENCODING 15051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F400 +4900 +47C0 +7540 +57C0 +5540 +5FE0 +9440 +B4C0 +ENDCHAR +STARTCHAR U_3ACC +ENCODING 15052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +4400 +77E0 +5080 +5080 +52E0 +5280 +9280 +B7E0 +ENDCHAR +STARTCHAR U_3ACD +ENCODING 15053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +F7E0 +4940 +4280 +75E0 +5D20 +55A0 +5540 +9440 +B5A0 +ENDCHAR +STARTCHAR U_3ACE +ENCODING 15054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +F400 +4FE0 +4920 +77C0 +5540 +57C0 +5540 +9FE0 +B100 +ENDCHAR +STARTCHAR U_3ACF +ENCODING 15055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F800 +4FE0 +4280 +7FE0 +5AA0 +5FE0 +5240 +9180 +B760 +ENDCHAR +STARTCHAR U_3AD0 +ENCODING 15056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +8100 +FF00 +8100 +FF00 +0000 +8E00 +F080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_3AD1 +ENCODING 15057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +8BE0 +8920 +F920 +8920 +8920 +8920 +F920 +8AA0 +0440 +ENDCHAR +STARTCHAR U_3AD2 +ENCODING 15058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +1080 +FFE0 +1080 +1080 +6080 +ENDCHAR +STARTCHAR U_3AD3 +ENCODING 15059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F900 +8BE0 +8C00 +8BC0 +F880 +8900 +8A00 +8C00 +FC20 +03C0 +ENDCHAR +STARTCHAR U_3AD4 +ENCODING 15060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +0400 +07C0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3AD5 +ENCODING 15061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FFE0 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_3AD6 +ENCODING 15062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AD7 +ENCODING 15063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +7FC0 +0000 +7F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3AD8 +ENCODING 15064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0C00 +1400 +2500 +4480 +8440 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AD9 +ENCODING 15065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +F100 +9FE0 +9100 +9100 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_3ADA +ENCODING 15066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +8920 +1120 +22A0 +C460 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3ADB +ENCODING 15067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +F280 +9280 +9280 +9480 +F4A0 +08E0 +ENDCHAR +STARTCHAR U_3ADC +ENCODING 15068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +F440 +9440 +9440 +97C0 +F000 +0FE0 +ENDCHAR +STARTCHAR U_3ADD +ENCODING 15069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A900 +A900 +AFE0 +E900 +A900 +A900 +A880 +EEA0 +0960 +ENDCHAR +STARTCHAR U_3ADE +ENCODING 15070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +9540 +97C0 +9100 +F7C0 +9440 +9280 +9100 +F280 +0C60 +ENDCHAR +STARTCHAR U_3ADF +ENCODING 15071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +9440 +F860 +9000 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_3AE0 +ENCODING 15072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9100 +97C0 +F100 +9FE0 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_3AE1 +ENCODING 15073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +5C40 +4740 +7FC0 +1000 +3F00 +5300 +0C00 +1A00 +E5C0 +0C00 +ENDCHAR +STARTCHAR U_3AE2 +ENCODING 15074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +FFE0 +9100 +9200 +9440 +FFE0 +0420 +ENDCHAR +STARTCHAR U_3AE3 +ENCODING 15075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +FF80 +8880 +FF80 +8880 +FF80 +0840 +0FC0 +ENDCHAR +STARTCHAR U_3AE4 +ENCODING 15076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5C40 +4740 +7FC0 +0C00 +1E20 +0240 +7B80 +0A80 +1240 +E620 +ENDCHAR +STARTCHAR U_3AE5 +ENCODING 15077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +91E0 +9220 +9540 +F080 +9100 +93E0 +9620 +FA20 +03E0 +ENDCHAR +STARTCHAR U_3AE6 +ENCODING 15078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27C0 +4C40 +D280 +5100 +5EE0 +57C0 +5440 +57C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3AE7 +ENCODING 15079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +3C80 +2780 +3F80 +0400 +1500 +7FC0 +0400 +1500 +2480 +C440 +ENDCHAR +STARTCHAR U_3AE8 +ENCODING 15080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9920 +9100 +FFE0 +9240 +9240 +9140 +F180 +0660 +ENDCHAR +STARTCHAR U_3AE9 +ENCODING 15081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2480 +FBE0 +2080 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3AEA +ENCODING 15082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +0800 +3F80 +1000 +FFE0 +48C0 +AEA0 +2B80 +2880 +2F80 +ENDCHAR +STARTCHAR U_3AEB +ENCODING 15083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +3F80 +0000 +7FC0 +0A00 +4A40 +2A80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_3AEC +ENCODING 15084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9820 +97A0 +F4A0 +97A0 +94A0 +97A0 +F4A0 +0060 +ENDCHAR +STARTCHAR U_3AED +ENCODING 15085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4900 +7F00 +0800 +FF80 +0200 +7F80 +2200 +1600 +ENDCHAR +STARTCHAR U_3AEE +ENCODING 15086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +5DE0 +5100 +5D20 +F1E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AEF +ENCODING 15087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +4040 +7FC0 +4040 +FFE0 +1100 +61E0 +ENDCHAR +STARTCHAR U_3AF0 +ENCODING 15088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +9420 +97E0 +9420 +F7E0 +9500 +9520 +94C0 +F480 +0660 +ENDCHAR +STARTCHAR U_3AF1 +ENCODING 15089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +3F80 +0400 +7FC0 +0400 +FFE0 +0900 +5140 +A320 +ENDCHAR +STARTCHAR U_3AF2 +ENCODING 15090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +97E0 +9820 +F7C0 +9080 +9FE0 +9100 +F100 +0300 +ENDCHAR +STARTCHAR U_3AF3 +ENCODING 15091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5C00 +4380 +7FC0 +4A40 +4980 +4CC0 +5FC0 +5640 +9340 +9FC0 +ENDCHAR +STARTCHAR U_3AF4 +ENCODING 15092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9100 +F3C0 +9440 +9BE0 +9080 +F080 +0180 +ENDCHAR +STARTCHAR U_3AF5 +ENCODING 15093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +9EE0 +F280 +96E0 +9A80 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_3AF6 +ENCODING 15094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +9FE0 +9040 +97E0 +F920 +97C0 +9540 +9540 +F540 +0100 +ENDCHAR +STARTCHAR U_3AF7 +ENCODING 15095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1500 +1500 +FFE0 +1100 +3F80 +DD60 +1700 +1F00 +ENDCHAR +STARTCHAR U_3AF8 +ENCODING 15096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9140 +F7C0 +9100 +95C0 +9500 +F700 +09E0 +ENDCHAR +STARTCHAR U_3AF9 +ENCODING 15097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +3040 +4380 +7A00 +4BE0 +7A40 +4240 +4240 +8440 +ENDCHAR +STARTCHAR U_3AFA +ENCODING 15098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6180 +9A60 +2080 +6180 +9A60 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AFB +ENCODING 15099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9820 +97C0 +F000 +9FE0 +9AA0 +9FE0 +FAA0 +0AA0 +ENDCHAR +STARTCHAR U_3AFC +ENCODING 15100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A20 +EFA0 +B220 +A760 +A260 +EFA0 +AAA0 +AAA0 +AAA0 +EBA0 +0260 +ENDCHAR +STARTCHAR U_3AFD +ENCODING 15101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +9480 +9700 +9100 +FFE0 +9940 +9780 +9580 +F940 +0320 +ENDCHAR +STARTCHAR U_3AFE +ENCODING 15102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9540 +9FE0 +F820 +9BA0 +9AA0 +9BA0 +FAA0 +0860 +ENDCHAR +STARTCHAR U_3AFF +ENCODING 15103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F280 +9440 +9FE0 +9480 +F7E0 +9480 +97E0 +9480 +F7E0 +0400 +ENDCHAR +STARTCHAR U_3B00 +ENCODING 15104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +9240 +F3C0 +9000 +93C0 +9080 +F7E0 +9080 +0180 +ENDCHAR +STARTCHAR U_3B01 +ENCODING 15105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +7FC0 +8500 +4F80 +B040 +2FA0 +C880 +4F80 +ENDCHAR +STARTCHAR U_3B02 +ENCODING 15106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +AFE0 +E100 +BFE0 +B120 +F160 +11E0 +1E20 +1060 +ENDCHAR +STARTCHAR U_3B03 +ENCODING 15107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FF80 +FF80 +4100 +FF80 +0000 +FF80 +FF80 +4900 +3600 +6300 +8080 +ENDCHAR +STARTCHAR U_3B04 +ENCODING 15108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0000 +7FE0 +4200 +5F80 +4200 +7FE0 +A940 +9320 +ENDCHAR +STARTCHAR U_3B05 +ENCODING 15109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +4940 +7FC0 +0400 +FFE0 +0800 +0F80 +1080 +6380 +ENDCHAR +STARTCHAR U_3B06 +ENCODING 15110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A900 +EFC0 +A880 +AC40 +EFC0 +A840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_3B07 +ENCODING 15111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +9480 +97C0 +F540 +9540 +9FE0 +9100 +F280 +0440 +0820 +ENDCHAR +STARTCHAR U_3B08 +ENCODING 15112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +E880 +AF80 +A880 +EF80 +A000 +BFC0 +B540 +F540 +1540 +3FE0 +ENDCHAR +STARTCHAR U_3B09 +ENCODING 15113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +AAA0 +EAA0 +AAA0 +A100 +AFE0 +E100 +0280 +0C60 +ENDCHAR +STARTCHAR U_3B0A +ENCODING 15114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +7FC0 +1500 +7FC0 +0800 +FFE0 +1480 +2300 +5CE0 +ENDCHAR +STARTCHAR U_3B0B +ENCODING 15115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5C0 +A840 +AFE0 +B900 +EBE0 +AC80 +ABE0 +E940 +0A40 +0C20 +ENDCHAR +STARTCHAR U_3B0C +ENCODING 15116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +1500 +6CC0 +ENDCHAR +STARTCHAR U_3B0D +ENCODING 15117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0FE0 +E100 +AFE0 +A920 +EFE0 +A920 +A040 +EFE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_3B0E +ENCODING 15118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2100 +5280 +AD40 +7BC0 +6B40 +9120 +ENDCHAR +STARTCHAR U_3B0F +ENCODING 15119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +EFE0 +A000 +A7C0 +E440 +A7C0 +A000 +AFE0 +EAA0 +AFE0 +0920 +ENDCHAR +STARTCHAR U_3B10 +ENCODING 15120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AAA0 +A6C0 +AFE0 +E000 +A7C0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_3B11 +ENCODING 15121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1FE0 +EAA0 +AEA0 +A0C0 +EEA0 +A2A0 +A4A0 +BEE0 +E480 +0C80 +ENDCHAR +STARTCHAR U_3B12 +ENCODING 15122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A400 +A140 +EFA0 +A280 +A440 +AAA0 +E280 +AFE0 +0480 +ENDCHAR +STARTCHAR U_3B13 +ENCODING 15123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +EFE0 +A000 +A380 +A000 +EFE0 +A540 +0920 +ENDCHAR +STARTCHAR U_3B14 +ENCODING 15124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +AAA0 +E100 +A680 +A960 +A280 +E140 +A080 +0300 +ENDCHAR +STARTCHAR U_3B15 +ENCODING 15125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +E5E0 +BE40 +A440 +E4E0 +AE40 +AC40 +B5E0 +E440 +A440 +0440 +ENDCHAR +STARTCHAR U_3B16 +ENCODING 15126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EEE0 +AAA0 +AEA0 +E940 +A840 +B1A0 +A220 +EFC0 +A840 +0FC0 +ENDCHAR +STARTCHAR U_3B17 +ENCODING 15127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08C0 +0EA0 +EA80 +BBE0 +B680 +EC80 +A940 +B140 +E220 +1540 +22A0 +ENDCHAR +STARTCHAR U_3B18 +ENCODING 15128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A140 +AFE0 +E140 +AFC0 +A520 +AFE0 +E920 +AD60 +15A0 +ENDCHAR +STARTCHAR U_3B19 +ENCODING 15129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EFC0 +AAC0 +A780 +E480 +A7C0 +A440 +A7E0 +E960 +AAA0 +1460 +ENDCHAR +STARTCHAR U_3B1A +ENCODING 15130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +A940 +BF40 +A140 +EF40 +AA80 +AE80 +AA80 +EF40 +1220 +ENDCHAR +STARTCHAR U_3B1B +ENCODING 15131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E6C0 +ABA0 +A000 +E7C0 +A440 +A380 +AEE0 +E220 +AAA0 +0660 +ENDCHAR +STARTCHAR U_3B1C +ENCODING 15132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5140 +FBE0 +2080 +7BC0 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3B1D +ENCODING 15133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E280 +AFE0 +A920 +EBA0 +A920 +AFE0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_3B1E +ENCODING 15134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +EFE0 +A440 +A7C0 +E440 +A7E0 +AD20 +B6A0 +E420 +A7A0 +0040 +ENDCHAR +STARTCHAR U_3B1F +ENCODING 15135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +7FE0 +A920 +2BA0 +4920 +9FE0 +2A40 +CBC0 +0A40 +33C0 +ENDCHAR +STARTCHAR U_3B20 +ENCODING 15136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +B5A0 +AEA0 +E240 +BF40 +A2A0 +AF20 +E000 +AAA0 +12A0 +ENDCHAR +STARTCHAR U_3B21 +ENCODING 15137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +AFE0 +B120 +E7C0 +A100 +A6C0 +B920 +E7C0 +0080 +0300 +ENDCHAR +STARTCHAR U_3B22 +ENCODING 15138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A100 +A7C0 +E100 +BFE0 +A540 +AFE0 +E4A0 +AE40 +04A0 +ENDCHAR +STARTCHAR U_3B23 +ENCODING 15139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FB40 +AA40 +BFE0 +EA40 +BF40 +A4C0 +AE40 +E440 +A740 +18C0 +ENDCHAR +STARTCHAR U_3B24 +ENCODING 15140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +AA40 +AFC0 +E480 +AFC0 +A920 +BFE0 +E000 +1540 +2520 +ENDCHAR +STARTCHAR U_3B25 +ENCODING 15141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +4440 +7FC0 +4440 +FFE0 +5540 +BFA0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3B26 +ENCODING 15142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EEE0 +A280 +A7E0 +EC80 +A7C0 +A480 +AFE0 +E480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_3B27 +ENCODING 15143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +4440 +7FC0 +4440 +FFE0 +4A40 +BF20 +2480 +CC60 +ENDCHAR +STARTCHAR U_3B28 +ENCODING 15144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +A440 +A440 +FFE0 +AAA0 +AAA0 +BBA0 +EAA0 +0AA0 +1760 +ENDCHAR +STARTCHAR U_3B29 +ENCODING 15145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +AFE0 +A440 +EFC0 +A040 +AFE0 +A040 +EFC0 +1520 +13C0 +ENDCHAR +STARTCHAR U_3B2A +ENCODING 15146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +5540 +7FC0 +0400 +FFE0 +9120 +3E00 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3B2B +ENCODING 15147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A80 +EEE0 +2A80 +EEE0 +5140 +BFA0 +2480 +2880 +3F80 +ENDCHAR +STARTCHAR U_3B2C +ENCODING 15148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +EEE0 +A480 +AFE0 +B480 +E7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3B2D +ENCODING 15149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AFE0 +AAA0 +EFE0 +AA20 +AFE0 +AA20 +EEA0 +0A20 +0D60 +ENDCHAR +STARTCHAR U_3B2E +ENCODING 15150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +5280 +FBE0 +5640 +FBE0 +AA40 +FBE0 +2240 +DBE0 +ENDCHAR +STARTCHAR U_3B2F +ENCODING 15151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A400 +A7E0 +E440 +AFE0 +AAA0 +AFA0 +EAE0 +0FA0 +1520 +ENDCHAR +STARTCHAR U_3B30 +ENCODING 15152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_3B31 +ENCODING 15153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A280 +FBE0 +2480 +FBE0 +5140 +9A60 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3B32 +ENCODING 15154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +2140 +FBE0 +A940 +FA20 +AC00 +FBE0 +22A0 +A7E0 +6000 +9FE0 +ENDCHAR +STARTCHAR U_3B33 +ENCODING 15155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57C0 +5500 +7900 +5100 +5FE0 +7100 +5100 +5100 +5100 +B100 +ENDCHAR +STARTCHAR U_3B34 +ENCODING 15156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5280 +77E0 +5280 +5280 +7FE0 +5280 +5240 +5460 +B820 +ENDCHAR +STARTCHAR U_3B35 +ENCODING 15157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5100 +5FE0 +7280 +5440 +5CA0 +7280 +5100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_3B36 +ENCODING 15158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +53E0 +7480 +5880 +57E0 +7000 +53E0 +5220 +5220 +B3E0 +ENDCHAR +STARTCHAR U_3B37 +ENCODING 15159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5520 +77E0 +5520 +55A0 +7760 +5520 +5520 +57E0 +B420 +ENDCHAR +STARTCHAR U_3B38 +ENCODING 15160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +57E0 +5240 +7000 +52C0 +5380 +76E0 +5A80 +5280 +52A0 +B260 +ENDCHAR +STARTCHAR U_3B39 +ENCODING 15161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5740 +5280 +77C0 +5140 +57E0 +7140 +57C0 +5100 +5500 +B300 +ENDCHAR +STARTCHAR U_3B3A +ENCODING 15162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5380 +57C0 +7100 +5FE0 +5280 +7540 +5FE0 +5540 +5540 +B100 +ENDCHAR +STARTCHAR U_3B3B +ENCODING 15163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +57E0 +5240 +7100 +57E0 +5200 +73E0 +5080 +52C0 +52C0 +B4A0 +ENDCHAR +STARTCHAR U_3B3C +ENCODING 15164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +4200 +F7E0 +5AA0 +73E0 +5200 +77E0 +5A40 +5180 +B660 +ENDCHAR +STARTCHAR U_3B3D +ENCODING 15165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +57E0 +7520 +57E0 +5000 +7FE0 +5200 +57C0 +5040 +B180 +ENDCHAR +STARTCHAR U_3B3E +ENCODING 15166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +9140 +FA60 +91C0 +A940 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_3B3F +ENCODING 15167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +AAE0 +EFA0 +A0A0 +AEA0 +E240 +A440 +BF40 +A4A0 +AD20 +ENDCHAR +STARTCHAR U_3B40 +ENCODING 15168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5D40 +7220 +57C0 +5100 +7540 +5540 +5BA0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_3B41 +ENCODING 15169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FA40 +2280 +62E0 +7220 +A220 +2220 +2420 +2940 +2080 +ENDCHAR +STARTCHAR U_3B42 +ENCODING 15170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +F900 +2100 +7580 +6560 +A920 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_3B43 +ENCODING 15171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2100 +FA00 +2460 +6240 +7180 +A100 +A200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_3B44 +ENCODING 15172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F80 +F280 +2280 +6280 +7780 +A280 +2280 +2280 +22A0 +2240 +ENDCHAR +STARTCHAR U_3B45 +ENCODING 15173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +F7C0 +2000 +6000 +7000 +A7C0 +2000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_3B46 +ENCODING 15174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0900 +13C0 +2020 +4440 +FFE0 +0400 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B47 +ENCODING 15175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2240 +64E0 +7720 +A280 +2280 +22A0 +24A0 +2840 +ENDCHAR +STARTCHAR U_3B48 +ENCODING 15176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2140 +6140 +77E0 +A100 +2180 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_3B49 +ENCODING 15177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +0400 +FFE0 +0E00 +1500 +2480 +4460 +0400 +ENDCHAR +STARTCHAR U_3B4A +ENCODING 15178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +FA20 +23E0 +6200 +7200 +A3E0 +2220 +2220 +2420 +2820 +ENDCHAR +STARTCHAR U_3B4B +ENCODING 15179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20E0 +FB80 +2080 +63E0 +7080 +A080 +27E0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3B4C +ENCODING 15180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +F480 +27E0 +6480 +7880 +A7E0 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3B4D +ENCODING 15181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3100 +01E0 +1700 +6100 +44E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B4E +ENCODING 15182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FE60 +25A0 +64A0 +75A0 +A660 +2420 +2420 +24A0 +2440 +ENDCHAR +STARTCHAR U_3B4F +ENCODING 15183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F900 +23C0 +6100 +77E0 +A120 +2120 +2120 +2140 +2100 +ENDCHAR +STARTCHAR U_3B50 +ENCODING 15184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1500 +3FC0 +C420 +1F00 +0E00 +1500 +2480 +4460 +ENDCHAR +STARTCHAR U_3B51 +ENCODING 15185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2100 +6100 +77E0 +A100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_3B52 +ENCODING 15186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +67C0 +7400 +AFE0 +A420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_3B53 +ENCODING 15187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FA40 +27E0 +6020 +7240 +A7E0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_3B54 +ENCODING 15188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FCA0 +22C0 +7180 +6FE0 +A080 +A080 +2080 +2280 +2180 +ENDCHAR +STARTCHAR U_3B55 +ENCODING 15189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +6100 +7FE0 +A100 +2200 +2240 +25E0 +2620 +ENDCHAR +STARTCHAR U_3B56 +ENCODING 15190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +F4A0 +2C80 +67E0 +7480 +A480 +2480 +24A0 +2440 +2440 +ENDCHAR +STARTCHAR U_3B57 +ENCODING 15191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0E00 +1500 +2480 +C460 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_3B58 +ENCODING 15192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F280 +2440 +6820 +77C0 +A000 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_3B59 +ENCODING 15193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +6FE0 +7080 +AFE0 +2080 +2680 +2080 +2180 +ENDCHAR +STARTCHAR U_3B5A +ENCODING 15194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2840 +6780 +7520 +A540 +2580 +2480 +2480 +2660 +ENDCHAR +STARTCHAR U_3B5B +ENCODING 15195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +F8E0 +2B00 +6A80 +7AA0 +AAC0 +2A80 +2A40 +2A40 +3320 +ENDCHAR +STARTCHAR U_3B5C +ENCODING 15196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +7500 +7520 +AEA0 +24C0 +2480 +29A0 +2260 +ENDCHAR +STARTCHAR U_3B5D +ENCODING 15197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +3180 +6B40 +AD20 +0800 +7F00 +0900 +1100 +2120 +C1E0 +ENDCHAR +STARTCHAR U_3B5E +ENCODING 15198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +F560 +2980 +6200 +7500 +AFE0 +A120 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_3B5F +ENCODING 15199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1100 +64C0 +FFE0 +0400 +1580 +E460 +0400 +ENDCHAR +STARTCHAR U_3B60 +ENCODING 15200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +6100 +77E0 +A280 +2280 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_3B61 +ENCODING 15201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F7E0 +2420 +6660 +75A0 +A5A0 +2660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3B62 +ENCODING 15202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +EA20 +4AA0 +6AA0 +DFA0 +CAA0 +4A20 +5A20 +5260 +5220 +ENDCHAR +STARTCHAR U_3B63 +ENCODING 15203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +F820 +2BA0 +6AA0 +7AA0 +AAA0 +2BA0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3B64 +ENCODING 15204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F7C0 +2540 +6540 +7480 +A7E0 +2020 +2FA0 +2020 +2060 +ENDCHAR +STARTCHAR U_3B65 +ENCODING 15205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F440 +2880 +67E0 +7420 +A520 +2520 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_3B66 +ENCODING 15206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +60C0 +7300 +A100 +2FE0 +2100 +2120 +21E0 +ENDCHAR +STARTCHAR U_3B67 +ENCODING 15207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +FFE0 +2480 +4180 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3B68 +ENCODING 15208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2AC0 +6FA0 +72A0 +A6A0 +26E0 +2A80 +3280 +2680 +ENDCHAR +STARTCHAR U_3B69 +ENCODING 15209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F540 +2280 +6040 +77E0 +A040 +2240 +2140 +2040 +20C0 +ENDCHAR +STARTCHAR U_3B6A +ENCODING 15210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +2FE0 +F100 +2FE0 +7920 +6FE0 +A920 +AFE0 +2920 +2960 +ENDCHAR +STARTCHAR U_3B6B +ENCODING 15211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F540 +2540 +6BA0 +7100 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3B6C +ENCODING 15212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FA20 +2540 +6980 +7280 +ACC0 +29A0 +22A0 +2C80 +2300 +ENDCHAR +STARTCHAR U_3B6D +ENCODING 15213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2A20 +FAA0 +2EA0 +78A0 +7EA0 +AAA0 +2AA0 +2AA0 +2A20 +3660 +ENDCHAR +STARTCHAR U_3B6E +ENCODING 15214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +2000 +67E0 +7200 +A3E0 +2620 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_3B6F +ENCODING 15215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A80 +FA80 +4E80 +4A80 +EE80 +CA80 +4AA0 +4EA0 +5AA0 +42E0 +ENDCHAR +STARTCHAR U_3B70 +ENCODING 15216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5100 +FDE0 +0400 +FFE0 +0400 +7FC0 +4E40 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3B71 +ENCODING 15217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +F7E0 +26A0 +67E0 +76A0 +A7E0 +2480 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_3B72 +ENCODING 15218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +F440 +2920 +6180 +7240 +A420 +2BC0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_3B73 +ENCODING 15219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23A0 +F940 +27E0 +6100 +7200 +A7E0 +2880 +27E0 +2080 +2180 +ENDCHAR +STARTCHAR U_3B74 +ENCODING 15220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2160 +25A0 +F540 +25A0 +6100 +7080 +A080 +23E0 +2080 +2080 +27E0 +ENDCHAR +STARTCHAR U_3B75 +ENCODING 15221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +FA00 +27E0 +6820 +7FA0 +AAA0 +2FA0 +2AA0 +2FA0 +2060 +ENDCHAR +STARTCHAR U_3B76 +ENCODING 15222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +6FE0 +7100 +A3E0 +2220 +2440 +2840 +3180 +ENDCHAR +STARTCHAR U_3B77 +ENCODING 15223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7100 +A7E0 +2120 +2220 +2440 +28C0 +ENDCHAR +STARTCHAR U_3B78 +ENCODING 15224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FA40 +2480 +6FE0 +7920 +A920 +2FE0 +2280 +2480 +28E0 +ENDCHAR +STARTCHAR U_3B79 +ENCODING 15225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2680 +FBE0 +2240 +7E80 +6900 +AFC0 +2240 +2280 +2520 +39E0 +ENDCHAR +STARTCHAR U_3B7A +ENCODING 15226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2540 +6FE0 +7540 +A7C0 +2540 +27C0 +2120 +21E0 +ENDCHAR +STARTCHAR U_3B7B +ENCODING 15227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FB80 +2100 +6FE0 +7820 +ABA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3B7C +ENCODING 15228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2120 +FD40 +2380 +6540 +7920 +AFE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3B7D +ENCODING 15229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2840 +6B80 +7A40 +ABE0 +2A40 +2BE0 +2820 +33E0 +ENDCHAR +STARTCHAR U_3B7E +ENCODING 15230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2800 +6AA0 +7AA0 +ABE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_3B7F +ENCODING 15231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2240 +63C0 +7100 +A6E0 +24A0 +24A0 +26E0 +2080 +ENDCHAR +STARTCHAR U_3B80 +ENCODING 15232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2080 +F900 +2540 +6BA0 +B920 +ABA0 +AD60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3B81 +ENCODING 15233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2380 +FD40 +27E0 +6200 +77E0 +AA20 +33A0 +2220 +23A0 +2660 +ENDCHAR +STARTCHAR U_3B82 +ENCODING 15234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1100 +2480 +7FC0 +8420 +1480 +6460 +ENDCHAR +STARTCHAR U_3B83 +ENCODING 15235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +F100 +2FE0 +6540 +7920 +A200 +3FE0 +2440 +2380 +2C40 +ENDCHAR +STARTCHAR U_3B84 +ENCODING 15236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +FFE0 +2200 +6FE0 +7220 +AFA0 +2220 +23A0 +24A0 +2960 +ENDCHAR +STARTCHAR U_3B85 +ENCODING 15237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1480 +E660 +3FE0 +2200 +7FE0 +A200 +3FE0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_3B86 +ENCODING 15238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C60 +6280 +77C0 +A100 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_3B87 +ENCODING 15239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2100 +6280 +7460 +A900 +23A0 +25A0 +2100 +2300 +ENDCHAR +STARTCHAR U_3B88 +ENCODING 15240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +6280 +77C0 +A820 +27C0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3B89 +ENCODING 15241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2480 +F7E0 +2C80 +66A0 +75C0 +A7E0 +2480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_3B8A +ENCODING 15242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +F5E0 +2E80 +6580 +75C0 +A6A0 +2480 +2480 +2480 +2C80 +ENDCHAR +STARTCHAR U_3B8B +ENCODING 15243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2F60 +F4A0 +2EA0 +6AE0 +7EA0 +AAA0 +AEA0 +2AC0 +2A80 +2A80 +ENDCHAR +STARTCHAR U_3B8C +ENCODING 15244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA00 +2400 +6FE0 +7AA0 +ABA0 +2AA0 +2BA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_3B8D +ENCODING 15245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7940 +4940 +7840 +4440 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B8E +ENCODING 15246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F180 +2340 +7520 +6900 +A100 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3B8F +ENCODING 15247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F380 +2540 +6920 +77E0 +A000 +2FE0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3B90 +ENCODING 15248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2340 +F560 +2180 +63E0 +7620 +ABE0 +2220 +23E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_3B91 +ENCODING 15249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F100 +2FE0 +2100 +7500 +6960 +A920 +2D60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3B92 +ENCODING 15250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7FE0 +A100 +2FE0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3B93 +ENCODING 15251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +F480 +2CE0 +66A0 +74E0 +A520 +25C0 +2540 +2480 +25E0 +ENDCHAR +STARTCHAR U_3B94 +ENCODING 15252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +F8E0 +2380 +63E0 +72A0 +A3E0 +2080 +23E0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3B95 +ENCODING 15253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +6AA0 +7AE0 +A100 +2FE0 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_3B96 +ENCODING 15254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F9C0 +2080 +63E0 +72A0 +A3E0 +2080 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_3B97 +ENCODING 15255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +2940 +12A0 +FDC0 +5440 +B080 +1500 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3B98 +ENCODING 15256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +22E0 +F500 +2EA0 +76A0 +6CA0 +ACA0 +B440 +24A0 +24A0 +2920 +ENDCHAR +STARTCHAR U_3B99 +ENCODING 15257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +F7E0 +2000 +73C0 +6000 +AFE0 +A100 +23E0 +2020 +20C0 +ENDCHAR +STARTCHAR U_3B9A +ENCODING 15258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +3F80 +2480 +2A80 +3F80 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3B9B +ENCODING 15259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F540 +27C0 +7000 +6FE0 +A100 +A5E0 +2500 +2700 +29E0 +ENDCHAR +STARTCHAR U_3B9C +ENCODING 15260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +F940 +2D40 +6FE0 +7940 +AF40 +ADE0 +2900 +2800 +2FE0 +ENDCHAR +STARTCHAR U_3B9D +ENCODING 15261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4AA0 +E9A0 +54C0 +64C0 +CAA0 +D1A0 +6EE0 +4AA0 +4A80 +4E80 +ENDCHAR +STARTCHAR U_3B9E +ENCODING 15262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2DE0 +F220 +2080 +6D80 +7240 +A420 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3B9F +ENCODING 15263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5E80 +E9E0 +4880 +E9C0 +CEC0 +5AA0 +4AA0 +4A80 +4E80 +4880 +ENDCHAR +STARTCHAR U_3BA0 +ENCODING 15264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +6920 +7100 +AFE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_3BA1 +ENCODING 15265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +73C0 +23C0 +5200 +8BE0 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3BA2 +ENCODING 15266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2440 +F7E0 +2D00 +65E0 +7680 +A480 +27E0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_3BA3 +ENCODING 15267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8A40 +FA80 +8BE0 +F980 +92A0 +ECE0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BA4 +ENCODING 15268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A4A0 +4A40 +3F80 +60C0 +BFA0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BA5 +ENCODING 15269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2200 +6FE0 +7440 +AFE0 +3540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3BA6 +ENCODING 15270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +6920 +7280 +A140 +27A0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3BA7 +ENCODING 15271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +6240 +73E0 +A200 +23E0 +2020 +2560 +22A0 +ENDCHAR +STARTCHAR U_3BA8 +ENCODING 15272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7440 +AA20 +27C0 +2A80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_3BA9 +ENCODING 15273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +6240 +73C0 +A240 +23C0 +2940 +2AA0 +33C0 +ENDCHAR +STARTCHAR U_3BAA +ENCODING 15274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +4940 +E9C0 +5D40 +6240 +C460 +C200 +5FE0 +4700 +4A80 +5240 +ENDCHAR +STARTCHAR U_3BAB +ENCODING 15275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +67C0 +7100 +A7C0 +2100 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BAC +ENCODING 15276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2540 +FAA0 +27C0 +6000 +76E0 +AAA0 +2660 +2660 +3BA0 +2660 +ENDCHAR +STARTCHAR U_3BAD +ENCODING 15277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +F100 +2FE0 +6AA0 +7920 +AFE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3BAE +ENCODING 15278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +F7A0 +22A0 +6760 +7100 +A7C0 +2100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_3BAF +ENCODING 15279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2A20 +6F60 +7AA0 +ADA0 +2AE0 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_3BB0 +ENCODING 15280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +FFC0 +2540 +6540 +77C0 +A000 +2480 +26C0 +24A0 +2640 +ENDCHAR +STARTCHAR U_3BB1 +ENCODING 15281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2500 +67C0 +7900 +AFE0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_3BB2 +ENCODING 15282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +FD20 +27A0 +6260 +7400 +A7E0 +2D20 +27A0 +2120 +2260 +ENDCHAR +STARTCHAR U_3BB3 +ENCODING 15283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EA0 +FAE0 +2A40 +6E40 +7A40 +AAE0 +2E40 +2A40 +2AA0 +22A0 +ENDCHAR +STARTCHAR U_3BB4 +ENCODING 15284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2520 +FF60 +2520 +67E0 +7100 +A7E0 +2220 +2140 +2080 +2760 +ENDCHAR +STARTCHAR U_3BB5 +ENCODING 15285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +FE00 +24E0 +64A0 +76E0 +AAA0 +2AE0 +2AA0 +2AA0 +36A0 +ENDCHAR +STARTCHAR U_3BB6 +ENCODING 15286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +22E0 +FFA0 +22A0 +6AE0 +7AA0 +AFE0 +22A0 +22A0 +2520 +2960 +ENDCHAR +STARTCHAR U_3BB7 +ENCODING 15287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F900 +22A0 +64E0 +7200 +A7E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_3BB8 +ENCODING 15288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2940 +F7E0 +2080 +6C80 +77E0 +A480 +2540 +2520 +2A00 +31E0 +ENDCHAR +STARTCHAR U_3BB9 +ENCODING 15289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2240 +F560 +2FA0 +6220 +72A0 +A720 +2240 +2340 +2CA0 +2920 +ENDCHAR +STARTCHAR U_3BBA +ENCODING 15290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0E00 +1500 +3F80 +C460 +0000 +EEE0 +AAA0 +EEE0 +ENDCHAR +STARTCHAR U_3BBB +ENCODING 15291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FA80 +2100 +6280 +7540 +A7E0 +2540 +27C0 +2140 +2FE0 +ENDCHAR +STARTCHAR U_3BBC +ENCODING 15292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +6400 +7760 +A5A0 +2760 +29A0 +2B60 +2920 +ENDCHAR +STARTCHAR U_3BBD +ENCODING 15293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +2740 +6540 +7FA0 +A500 +27E0 +2520 +2B40 +29A0 +ENDCHAR +STARTCHAR U_3BBE +ENCODING 15294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4BC0 +7A40 +43C0 +5240 +6CC0 +0400 +7FC0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3BBF +ENCODING 15295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7100 +A540 +2FE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_3BC0 +ENCODING 15296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F1E0 +2E00 +69E0 +7EA0 +AA80 +2AE0 +2A80 +2B80 +3460 +ENDCHAR +STARTCHAR U_3BC1 +ENCODING 15297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +5480 +F7E0 +5400 +5940 +F7E0 +5400 +55C0 +5D40 +5140 +51C0 +ENDCHAR +STARTCHAR U_3BC2 +ENCODING 15298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +2FE0 +F6C0 +2BA0 +7000 +6FE0 +A920 +27C0 +2540 +2540 +2100 +ENDCHAR +STARTCHAR U_3BC3 +ENCODING 15299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FB80 +2540 +6920 +7280 +AD60 +2540 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_3BC4 +ENCODING 15300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +01C0 +7E00 +7FC0 +5280 +5F80 +5020 +9FE0 +ENDCHAR +STARTCHAR U_3BC5 +ENCODING 15301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +F900 +2BE0 +6AA0 +7BE0 +AAA0 +2BE0 +2A80 +2FE0 +3080 +ENDCHAR +STARTCHAR U_3BC6 +ENCODING 15302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FA40 +2180 +67E0 +7540 +A5E0 +2540 +27E0 +2440 +2BE0 +ENDCHAR +STARTCHAR U_3BC7 +ENCODING 15303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F280 +2EE0 +6280 +76E0 +AA80 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3BC8 +ENCODING 15304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4880 +E3E0 +5880 +CBE0 +EAA0 +5BE0 +4980 +4AC0 +5480 +4FE0 +ENDCHAR +STARTCHAR U_3BC9 +ENCODING 15305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2940 +6BE0 +7840 +AB80 +2AA0 +2FE0 +2880 +3180 +ENDCHAR +STARTCHAR U_3BCA +ENCODING 15306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F5C0 +2500 +2FE0 +7200 +A3C0 +2400 +27E0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_3BCB +ENCODING 15307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +F100 +87C0 +7C40 +07C0 +F440 +27C0 +FC40 +27C0 +7440 +A820 +ENDCHAR +STARTCHAR U_3BCC +ENCODING 15308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2880 +F4C0 +2160 +2EC0 +6540 +76E0 +A540 +24C0 +3E00 +21E0 +ENDCHAR +STARTCHAR U_3BCD +ENCODING 15309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB20 +2EA0 +2340 +62A0 +7FE0 +AA20 +2AA0 +32A0 +2240 +ENDCHAR +STARTCHAR U_3BCE +ENCODING 15310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +FFE0 +2080 +6E80 +71C0 +AFA0 +2080 +2E80 +2A80 +2E80 +ENDCHAR +STARTCHAR U_3BCF +ENCODING 15311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1260 +FDC0 +5540 +7C80 +8360 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BD0 +ENCODING 15312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +C7E0 +AB40 +E2C0 +82C0 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3BD1 +ENCODING 15313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +4500 +E5E0 +5D00 +51E0 +7100 +DFE0 +4540 +4540 +4520 +59A0 +ENDCHAR +STARTCHAR U_3BD2 +ENCODING 15314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +27C0 +6440 +77C0 +A440 +27C0 +27C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_3BD3 +ENCODING 15315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F560 +2BC0 +6240 +73C0 +A000 +2EE0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_3BD4 +ENCODING 15316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +7FC0 +2480 +7FC0 +2480 +FBC0 +24A0 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BD5 +ENCODING 15317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +2F80 +FA80 +2EE0 +6AA0 +7EA0 +AAA0 +3FA0 +2AA0 +3120 +2220 +ENDCHAR +STARTCHAR U_3BD6 +ENCODING 15318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2FE0 +7AA0 +6FE0 +A000 +3FE0 +2440 +2D60 +27C0 +ENDCHAR +STARTCHAR U_3BD7 +ENCODING 15319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +FAA0 +2EE0 +6820 +7920 +AFE0 +2920 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_3BD8 +ENCODING 15320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5D00 +E9E0 +5D20 +E280 +DC80 +4080 +5D80 +4940 +5D20 +4A00 +ENDCHAR +STARTCHAR U_3BD9 +ENCODING 15321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +F4E0 +2F20 +60A0 +7EA0 +AAA0 +2E40 +2A40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_3BDA +ENCODING 15322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +F540 +2300 +6480 +7860 +A780 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BDB +ENCODING 15323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +6000 +7FE0 +AAA0 +2440 +26C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_3BDC +ENCODING 15324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +6FE0 +7440 +AAA0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3BDD +ENCODING 15325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +52E0 +F3A0 +5EA0 +4440 +E4A0 +D700 +54E0 +54A0 +5EA0 +50E0 +ENDCHAR +STARTCHAR U_3BDE +ENCODING 15326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FAE0 +2E00 +64E0 +7AA0 +AEE0 +20A0 +2AE0 +2AA0 +28A0 +ENDCHAR +STARTCHAR U_3BDF +ENCODING 15327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +3F80 +0500 +0900 +FFE0 +2480 +1500 +6CC0 +ENDCHAR +STARTCHAR U_3BE0 +ENCODING 15328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F940 +2280 +6FE0 +7AA0 +A140 +26E0 +2900 +2FE0 +2100 +ENDCHAR +STARTCHAR U_3BE1 +ENCODING 15329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +E400 +4BE0 +F020 +47A0 +A4A0 +47A0 +E460 +4400 +E420 +47E0 +ENDCHAR +STARTCHAR U_3BE2 +ENCODING 15330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +F7E0 +2480 +67E0 +7280 +A7C0 +2280 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_3BE3 +ENCODING 15331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +F240 +2280 +77E0 +6A40 +A4C0 +2900 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3BE4 +ENCODING 15332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2080 +AAA0 +FBE0 +AAA0 +2080 +71C0 +AAA0 +2480 +ENDCHAR +STARTCHAR U_3BE5 +ENCODING 15333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +71C0 +AAA0 +ENDCHAR +STARTCHAR U_3BE6 +ENCODING 15334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +67C0 +7440 +AFE0 +2540 +2BA0 +2540 +2920 +ENDCHAR +STARTCHAR U_3BE7 +ENCODING 15335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2F20 +6440 +77E0 +AD20 +2D20 +29E0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_3BE8 +ENCODING 15336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7FE0 +A540 +2380 +2FE0 +2380 +2D60 +ENDCHAR +STARTCHAR U_3BE9 +ENCODING 15337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +53E0 +2080 +DBE0 +A8A0 +53E0 +AA80 +23E0 +F8A0 +7140 +AA20 +ENDCHAR +STARTCHAR U_3BEA +ENCODING 15338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2D60 +67C0 +7340 +A520 +2BC0 +2040 +2180 +2080 +ENDCHAR +STARTCHAR U_3BEB +ENCODING 15339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2A20 +6FC0 +7A00 +AFE0 +2900 +2EA0 +29C0 +36A0 +ENDCHAR +STARTCHAR U_3BEC +ENCODING 15340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +0200 +EFC0 +26A0 +4B40 +9FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_3BED +ENCODING 15341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2940 +6FE0 +7AA0 +AFE0 +2AA0 +2BE0 +2920 +3640 +ENDCHAR +STARTCHAR U_3BEE +ENCODING 15342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2400 +6BE0 +7220 +AFA0 +2AA0 +2FA0 +23A0 +2CC0 +ENDCHAR +STARTCHAR U_3BEF +ENCODING 15343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2C40 +F380 +2D60 +67C0 +7500 +A7C0 +2540 +2540 +27C0 +2820 +ENDCHAR +STARTCHAR U_3BF0 +ENCODING 15344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +6FE0 +7440 +A7C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_3BF1 +ENCODING 15345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +A420 +7FE0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3BF2 +ENCODING 15346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +6AA0 +77C0 +A000 +2FE0 +2100 +2540 +2B20 +ENDCHAR +STARTCHAR U_3BF3 +ENCODING 15347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +2BA0 +6EA0 +72A0 +AE40 +2A40 +2E40 +22A0 +2D20 +ENDCHAR +STARTCHAR U_3BF4 +ENCODING 15348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +6AA0 +7540 +A280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BF5 +ENCODING 15349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2280 +F7C0 +2100 +7FE0 +6540 +A7C0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3BF6 +ENCODING 15350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2D60 +FAA0 +2FE0 +6440 +7A20 +A7C0 +2C40 +2280 +2380 +2C60 +ENDCHAR +STARTCHAR U_3BF7 +ENCODING 15351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2940 +FFE0 +2940 +6BE0 +7880 +A9C0 +A880 +2BE0 +2940 +2A20 +ENDCHAR +STARTCHAR U_3BF8 +ENCODING 15352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +2140 +67C0 +7100 +AFE0 +3540 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3BF9 +ENCODING 15353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +4A20 +FFE0 +5520 +5F20 +E0A0 +CE60 +4020 +5F20 +4E20 +5560 +ENDCHAR +STARTCHAR U_3BFA +ENCODING 15354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FD00 +8880 +FBE0 +A2A0 +FBE0 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_3BFB +ENCODING 15355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +94A0 +6B00 +3280 +0C40 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_3BFC +ENCODING 15356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +F440 +2100 +27C0 +7100 +6FE0 +A440 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3BFD +ENCODING 15357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F020 +4FC0 +4940 +EFC0 +CA40 +4BC0 +4A40 +4BC0 +5420 +ENDCHAR +STARTCHAR U_3BFE +ENCODING 15358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +23E0 +F140 +2BE0 +7EA0 +6BE0 +AAA0 +2BE0 +2940 +3D40 +23E0 +ENDCHAR +STARTCHAR U_3BFF +ENCODING 15359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +27E0 +6520 +77E0 +AD40 +A7C0 +2540 +27E0 +2520 +ENDCHAR +STARTCHAR U_3C00 +ENCODING 15360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F560 +3EA0 +2560 +6280 +B540 +2960 +2580 +2940 +3320 +ENDCHAR +STARTCHAR U_3C01 +ENCODING 15361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +2640 +63C0 +7000 +AFE0 +2440 +2EE0 +3BA0 +2EE0 +ENDCHAR +STARTCHAR U_3C02 +ENCODING 15362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FBA0 +2540 +6FE0 +7380 +AFE0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3C03 +ENCODING 15363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4FC0 +FAA0 +4FE0 +4A40 +64A0 +DFE0 +5540 +55E0 +5760 +44C0 +ENDCHAR +STARTCHAR U_3C04 +ENCODING 15364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2AE0 +FB80 +2EC0 +6AA0 +7F60 +AAA0 +2BE0 +2EA0 +2460 +2BA0 +ENDCHAR +STARTCHAR U_3C05 +ENCODING 15365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +57E0 +E940 +43E0 +7AA0 +EBE0 +CAA0 +4BE0 +4B60 +5AA0 +67E0 +ENDCHAR +STARTCHAR U_3C06 +ENCODING 15366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +8A20 +7BC0 +0A00 +7BC0 +0E00 +FFE0 +3580 +ENDCHAR +STARTCHAR U_3C07 +ENCODING 15367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4FA0 +F4E0 +5F80 +6A80 +5BA0 +CAC0 +5B80 +4AA0 +4FA0 +5860 +ENDCHAR +STARTCHAR U_3C08 +ENCODING 15368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +BFE0 +1240 +DFC0 +5240 +7FE0 +C200 +BFE0 +ENDCHAR +STARTCHAR U_3C09 +ENCODING 15369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5FE0 +E880 +53E0 +5C80 +EBE0 +DD40 +4AA0 +4FE0 +59C0 +42A0 +ENDCHAR +STARTCHAR U_3C0A +ENCODING 15370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5DA0 +EAC0 +5E80 +4D40 +F6A0 +C9A0 +5EC0 +4880 +4D40 +5220 +ENDCHAR +STARTCHAR U_3C0B +ENCODING 15371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +F7E0 +5520 +5FE0 +E520 +D5E0 +5720 +65E0 +48C0 +7120 +ENDCHAR +STARTCHAR U_3C0C +ENCODING 15372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +FFE0 +5AA0 +4700 +EAC0 +C500 +4FC0 +5500 +47C0 +47E0 +ENDCHAR +STARTCHAR U_3C0D +ENCODING 15373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +53C0 +FC40 +5380 +7240 +53C0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3C0E +ENCODING 15374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F480 +2FE0 +6480 +77E0 +A480 +27E0 +2EE0 +2BA0 +2820 +ENDCHAR +STARTCHAR U_3C0F +ENCODING 15375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +F920 +27E0 +6240 +73C0 +A7E0 +2420 +25A0 +25A0 +2460 +ENDCHAR +STARTCHAR U_3C10 +ENCODING 15376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +5DE0 +F480 +5AE0 +7540 +D5E0 +D6A0 +5AE0 +52A0 +5200 +55E0 +ENDCHAR +STARTCHAR U_3C11 +ENCODING 15377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +54A0 +E380 +4A40 +6920 +D6C0 +4100 +4FE0 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_3C12 +ENCODING 15378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C60 +4AA0 +4D60 +FAA0 +4FE0 +6820 +D7C0 +4080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3C13 +ENCODING 15379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +54E0 +5A80 +F540 +5E20 +6FC0 +CA40 +C940 +4FC0 +4480 +4840 +ENDCHAR +STARTCHAR U_3C14 +ENCODING 15380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +7760 +58C0 +F740 +5040 +DF40 +E5A0 +4F00 +4500 +4200 +5DC0 +ENDCHAR +STARTCHAR U_3C15 +ENCODING 15381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4F80 +4200 +EF80 +4540 +DFC0 +E500 +5D40 +4880 +4540 +5E20 +ENDCHAR +STARTCHAR U_3C16 +ENCODING 15382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +54E0 +5A80 +F560 +5E00 +E000 +CF80 +4880 +4A80 +4520 +59E0 +ENDCHAR +STARTCHAR U_3C17 +ENCODING 15383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +FAA0 +2F40 +6AA0 +77C0 +A440 +27C0 +2540 +2780 +28E0 +ENDCHAR +STARTCHAR U_3C18 +ENCODING 15384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +FFE0 +2AA0 +6FC0 +77A0 +AAE0 +2340 +2FE0 +2240 +2440 +ENDCHAR +STARTCHAR U_3C19 +ENCODING 15385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +5540 +FFE0 +5540 +5F40 +EBE0 +DF40 +49E0 +7F40 +5540 +63E0 +ENDCHAR +STARTCHAR U_3C1A +ENCODING 15386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F40 +EBE0 +5540 +DF40 +E5E0 +DF40 +55E0 +5740 +5D40 +53E0 +ENDCHAR +STARTCHAR U_3C1B +ENCODING 15387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2AA0 +7FC0 +6AA0 +AFE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3C1C +ENCODING 15388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2E40 +F4E0 +2EA0 +6AE0 +7EA0 +AAE0 +2AA0 +3FE0 +2AA0 +3120 +ENDCHAR +STARTCHAR U_3C1D +ENCODING 15389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +8BE0 +8D20 +F900 +8100 +8100 +8900 +B280 +C440 +1820 +ENDCHAR +STARTCHAR U_3C1E +ENCODING 15390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +AD20 +A940 +A900 +A900 +A900 +FA80 +8440 +1820 +ENDCHAR +STARTCHAR U_3C1F +ENCODING 15391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +41E0 +BAA0 +0280 +F880 +0880 +0880 +0940 +0D40 +0620 +ENDCHAR +STARTCHAR U_3C20 +ENCODING 15392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2A00 +FBE0 +02A0 +7480 +5080 +5080 +5480 +5940 +5220 +8420 +ENDCHAR +STARTCHAR U_3C21 +ENCODING 15393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +8D20 +5100 +5100 +5100 +5100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_3C22 +ENCODING 15394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +5200 +53E0 +5520 +F900 +5100 +5100 +5100 +5180 +5240 +9C20 +ENDCHAR +STARTCHAR U_3C23 +ENCODING 15395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +2A00 +ABE0 +AAA0 +BE80 +A880 +A880 +BA80 +EC80 +8940 +0220 +ENDCHAR +STARTCHAR U_3C24 +ENCODING 15396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FE00 +0BE0 +ED20 +A900 +A900 +A900 +E900 +0980 +0A40 +1C20 +ENDCHAR +STARTCHAR U_3C25 +ENCODING 15397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +AA00 +ABE0 +FD20 +A900 +A900 +A900 +B900 +8180 +FA40 +0420 +ENDCHAR +STARTCHAR U_3C26 +ENCODING 15398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2520 +2140 +F900 +2100 +5100 +8980 +FA40 +0420 +ENDCHAR +STARTCHAR U_3C27 +ENCODING 15399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +53E0 +8D20 +F900 +0100 +F900 +8900 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C28 +ENCODING 15400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +8BE0 +8D20 +F900 +8900 +0100 +5100 +4980 +8A40 +8420 +ENDCHAR +STARTCHAR U_3C29 +ENCODING 15401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AD20 +A900 +F900 +A100 +3100 +3980 +CA40 +0420 +ENDCHAR +STARTCHAR U_3C2A +ENCODING 15402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2520 +F900 +2100 +F900 +2100 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_3C2B +ENCODING 15403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +79E0 +92A0 +1080 +FC80 +2880 +2880 +2940 +4A20 +8C20 +ENDCHAR +STARTCHAR U_3C2C +ENCODING 15404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +86A0 +7480 +5480 +7480 +5480 +7540 +0220 +1C20 +ENDCHAR +STARTCHAR U_3C2D +ENCODING 15405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +51E0 +8AA0 +7480 +0080 +F880 +4080 +7940 +0940 +3620 +ENDCHAR +STARTCHAR U_3C2E +ENCODING 15406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4100 +7DE0 +42A0 +7E80 +5480 +5680 +5480 +5480 +9340 +1A20 +ENDCHAR +STARTCHAR U_3C2F +ENCODING 15407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0100 +7BE0 +4AA0 +4C80 +7880 +8480 +4880 +1D40 +E140 +0620 +ENDCHAR +STARTCHAR U_3C30 +ENCODING 15408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +12A0 +5480 +5480 +BA80 +1080 +2940 +4540 +8220 +ENDCHAR +STARTCHAR U_3C31 +ENCODING 15409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +2200 +FBE0 +2520 +F900 +A900 +F900 +A900 +F980 +2240 +2C20 +ENDCHAR +STARTCHAR U_3C32 +ENCODING 15410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +0900 +FDE0 +0AA0 +EC80 +A880 +A880 +EC80 +2880 +D940 +2620 +ENDCHAR +STARTCHAR U_3C33 +ENCODING 15411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +53E0 +DAA0 +8C80 +8880 +D880 +5080 +5C80 +E140 +0620 +ENDCHAR +STARTCHAR U_3C34 +ENCODING 15412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +8D20 +5100 +F900 +0100 +F900 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C35 +ENCODING 15413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +53E0 +5520 +A900 +2100 +2100 +F900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3C36 +ENCODING 15414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7500 +95E0 +6AA0 +6080 +9E80 +0080 +7C80 +4480 +4540 +7E20 +ENDCHAR +STARTCHAR U_3C37 +ENCODING 15415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +4BE0 +4CA0 +6880 +A880 +EC80 +2880 +2940 +4940 +8E20 +ENDCHAR +STARTCHAR U_3C38 +ENCODING 15416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7520 +2140 +F900 +A900 +F900 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_3C39 +ENCODING 15417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +0900 +FDE0 +8AA0 +E880 +8880 +E880 +AD40 +E940 +9620 +E420 +ENDCHAR +STARTCHAR U_3C3A +ENCODING 15418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +A500 +A5E0 +EEA0 +8080 +FC80 +9480 +F480 +8940 +9540 +9620 +ENDCHAR +STARTCHAR U_3C3B +ENCODING 15419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FAA0 +0480 +F880 +8880 +F880 +9140 +7940 +C620 +ENDCHAR +STARTCHAR U_3C3C +ENCODING 15420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +9100 +FDE0 +92A0 +D480 +BA80 +9080 +A880 +C540 +FE20 +0420 +ENDCHAR +STARTCHAR U_3C3D +ENCODING 15421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A900 +BBE0 +ACA0 +B880 +A880 +FC80 +A880 +9080 +A940 +FE20 +ENDCHAR +STARTCHAR U_3C3E +ENCODING 15422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F900 +89E0 +FAA0 +8C80 +F880 +2080 +FC80 +5140 +4A20 +9C20 +ENDCHAR +STARTCHAR U_3C3F +ENCODING 15423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +53E0 +F4A0 +2080 +4880 +F880 +2080 +F940 +5220 +8C20 +ENDCHAR +STARTCHAR U_3C40 +ENCODING 15424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F900 +A9E0 +EA20 +5A80 +8080 +F880 +A940 +E940 +4A40 +9C20 +ENDCHAR +STARTCHAR U_3C41 +ENCODING 15425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +ABE0 +AAA0 +FC80 +2080 +A880 +A880 +A940 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C42 +ENCODING 15426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +5100 +7DE0 +56A0 +7C80 +5480 +7C80 +5540 +B940 +B620 +ENDCHAR +STARTCHAR U_3C43 +ENCODING 15427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +6900 +9500 +79E0 +12A0 +FC80 +4880 +FC80 +CD40 +B540 +FE20 +ENDCHAR +STARTCHAR U_3C44 +ENCODING 15428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5500 +7DE0 +56A0 +7C80 +1080 +7C80 +1080 +FD40 +5520 +AA20 +ENDCHAR +STARTCHAR U_3C45 +ENCODING 15429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +FEA0 +8480 +FC80 +4880 +7880 +4940 +3140 +FE20 +ENDCHAR +STARTCHAR U_3C46 +ENCODING 15430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +7FE0 +5520 +7E80 +4080 +7E80 +5480 +5D40 +9540 +BE20 +ENDCHAR +STARTCHAR U_3C47 +ENCODING 15431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +BB20 +FE80 +4480 +7480 +5480 +7540 +4540 +7E20 +ENDCHAR +STARTCHAR U_3C48 +ENCODING 15432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FD00 +29E0 +7D20 +AA80 +7C80 +0080 +FE80 +5540 +9340 +3220 +ENDCHAR +STARTCHAR U_3C49 +ENCODING 15433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +2900 +FDE0 +2A20 +FE80 +1080 +7C80 +1080 +FD40 +5540 +9220 +ENDCHAR +STARTCHAR U_3C4A +ENCODING 15434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2100 +F9E0 +AAA0 +FC80 +A880 +5480 +7880 +C940 +3240 +CC20 +ENDCHAR +STARTCHAR U_3C4B +ENCODING 15435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +1100 +FDE0 +D6A0 +3880 +5480 +FC80 +4880 +7D40 +4940 +7E20 +ENDCHAR +STARTCHAR U_3C4C +ENCODING 15436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +79E0 +4AA0 +FC80 +0880 +FC80 +5480 +5540 +FD40 +2A20 +ENDCHAR +STARTCHAR U_3C4D +ENCODING 15437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +4A80 +9CE0 +E720 +5D40 +4240 +BC40 +E740 +1C40 +B5A0 +9D20 +ENDCHAR +STARTCHAR U_3C4E +ENCODING 15438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FFE0 +5520 +F280 +5C80 +D480 +7C80 +5540 +7D40 +AA20 +ENDCHAR +STARTCHAR U_3C4F +ENCODING 15439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0000 +FFE0 +0400 +0400 +2780 +2400 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_3C50 +ENCODING 15440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7C40 +0040 +FFE0 +0000 +1000 +5E00 +5000 +5E00 +F000 +4000 +ENDCHAR +STARTCHAR U_3C51 +ENCODING 15441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2780 +2400 +FFE0 +0800 +1F80 +6880 +0500 +0600 +1800 +E000 +ENDCHAR +STARTCHAR U_3C52 +ENCODING 15442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47C0 +4400 +FFE0 +0000 +7FC0 +0080 +3C80 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_3C53 +ENCODING 15443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +1280 +5440 +5920 +5080 +57C0 +5040 +FA80 +4100 +0100 +ENDCHAR +STARTCHAR U_3C54 +ENCODING 15444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +5FE0 +5200 +FDE0 +1000 +1F80 +6900 +0600 +0C00 +F000 +ENDCHAR +STARTCHAR U_3C55 +ENCODING 15445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +23C0 +B040 +AFE0 +A920 +A7C0 +B540 +E540 +85C0 +0100 +ENDCHAR +STARTCHAR U_3C56 +ENCODING 15446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +2FE0 +2440 +A440 +BAA0 +A100 +AFE0 +B100 +C100 +0100 +ENDCHAR +STARTCHAR U_3C57 +ENCODING 15447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2540 +BEC0 +A540 +A640 +A7C0 +B940 +EFE0 +8280 +0C60 +ENDCHAR +STARTCHAR U_3C58 +ENCODING 15448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52C0 +5EA0 +53E0 +5E80 +5340 +5E20 +6200 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_3C59 +ENCODING 15449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4100 +7A00 +CBE0 +B020 +1020 +2020 +4020 +83C0 +0080 +ENDCHAR +STARTCHAR U_3C5A +ENCODING 15450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +2220 +3BE0 +4A20 +CA20 +33E0 +1220 +2220 +C420 +0860 +ENDCHAR +STARTCHAR U_3C5B +ENCODING 15451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +2200 +7BC0 +4A40 +CE40 +3180 +2080 +4100 +8200 +0400 +ENDCHAR +STARTCHAR U_3C5C +ENCODING 15452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +4080 +7880 +4A80 +CAE0 +3280 +1280 +2280 +C780 +08E0 +ENDCHAR +STARTCHAR U_3C5D +ENCODING 15453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +4880 +6BE0 +A8A0 +ACA0 +68A0 +28A0 +4920 +4D20 +8AC0 +ENDCHAR +STARTCHAR U_3C5E +ENCODING 15454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +4FE0 +7000 +9440 +5440 +2240 +2280 +4280 +8000 +0FE0 +ENDCHAR +STARTCHAR U_3C5F +ENCODING 15455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +22A0 +3A80 +4A80 +6BE0 +92A0 +12A0 +2240 +C4A0 +0520 +ENDCHAR +STARTCHAR U_3C60 +ENCODING 15456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2080 +7BE0 +4880 +4880 +ABE0 +1220 +2220 +4220 +83E0 +ENDCHAR +STARTCHAR U_3C61 +ENCODING 15457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +25C0 +3900 +4900 +AFE0 +1180 +2280 +4480 +88A0 +00E0 +ENDCHAR +STARTCHAR U_3C62 +ENCODING 15458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +47C0 +7440 +57C0 +D440 +37C0 +2520 +44C0 +8440 +0620 +ENDCHAR +STARTCHAR U_3C63 +ENCODING 15459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +FFA0 +42A0 +7A40 +4A40 +CFE0 +3240 +1640 +2180 +4140 +8620 +ENDCHAR +STARTCHAR U_3C64 +ENCODING 15460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +4580 +4F00 +7500 +55E0 +D740 +3D40 +2540 +2540 +4540 +8640 +ENDCHAR +STARTCHAR U_3C65 +ENCODING 15461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +47C0 +7240 +9520 +D3C0 +2640 +2180 +4180 +8660 +ENDCHAR +STARTCHAR U_3C66 +ENCODING 15462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +4280 +7440 +9FE0 +D040 +2740 +2540 +4740 +80C0 +ENDCHAR +STARTCHAR U_3C67 +ENCODING 15463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4820 +4000 +76E0 +9AA0 +DAE0 +2680 +2280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_3C68 +ENCODING 15464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4820 +77C0 +9100 +D5C0 +2500 +2500 +4700 +88E0 +ENDCHAR +STARTCHAR U_3C69 +ENCODING 15465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4100 +4FE0 +7520 +9B40 +D500 +2FE0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_3C6A +ENCODING 15466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +47C0 +4480 +77E0 +9440 +D7E0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3C6B +ENCODING 15467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4100 +47E0 +7560 +97A0 +D7E0 +3100 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_3C6C +ENCODING 15468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FD40 +47C0 +4540 +77C0 +9000 +DFE0 +2540 +2480 +4540 +8620 +ENDCHAR +STARTCHAR U_3C6D +ENCODING 15469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F4A0 +44A0 +4700 +74E0 +9720 +D4A0 +2740 +2C40 +44A0 +8520 +ENDCHAR +STARTCHAR U_3C6E +ENCODING 15470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +47C0 +7100 +97E0 +D540 +2540 +2540 +4280 +8C60 +ENDCHAR +STARTCHAR U_3C6F +ENCODING 15471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +47C0 +4000 +7FE0 +9000 +D7C0 +2440 +27C0 +4280 +8FE0 +ENDCHAR +STARTCHAR U_3C70 +ENCODING 15472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4920 +47C0 +7440 +9280 +DFE0 +2100 +27C0 +4100 +8100 +ENDCHAR +STARTCHAR U_3C71 +ENCODING 15473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FC00 +47C0 +4540 +77C0 +9540 +D7C0 +22A0 +22E0 +4480 +8860 +ENDCHAR +STARTCHAR U_3C72 +ENCODING 15474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2280 +7C40 +4820 +D7C0 +3540 +2540 +4540 +8FE0 +ENDCHAR +STARTCHAR U_3C73 +ENCODING 15475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +3F80 +2480 +FFE0 +2080 +DF60 +0800 +3F00 +0500 +7E00 +ENDCHAR +STARTCHAR U_3C74 +ENCODING 15476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +43C0 +7100 +9FE0 +D240 +23C0 +2240 +43C0 +8C20 +ENDCHAR +STARTCHAR U_3C75 +ENCODING 15477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4540 +4FE0 +7440 +97C0 +D440 +27C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_3C76 +ENCODING 15478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FF20 +4240 +4780 +7000 +9720 +55C0 +2700 +2880 +4520 +8FC0 +ENDCHAR +STARTCHAR U_3C77 +ENCODING 15479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4480 +47E0 +7480 +97E0 +D480 +27E0 +2180 +42C0 +8CA0 +ENDCHAR +STARTCHAR U_3C78 +ENCODING 15480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F740 +45E0 +45A0 +7740 +94E0 +D740 +2540 +25E0 +4740 +8840 +ENDCHAR +STARTCHAR U_3C79 +ENCODING 15481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4480 +4760 +7540 +97E0 +D540 +37E0 +2480 +26E0 +4A80 +8BE0 +ENDCHAR +STARTCHAR U_3C7A +ENCODING 15482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F900 +47E0 +7540 +57E0 +D540 +B7C0 +2540 +27C0 +4D40 +8FE0 +ENDCHAR +STARTCHAR U_3C7B +ENCODING 15483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4400 +43E0 +7440 +97C0 +D540 +27C0 +2540 +47C0 +8960 +ENDCHAR +STARTCHAR U_3C7C +ENCODING 15484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +9480 +9480 +9860 +F780 +8480 +9480 +A300 +C480 +1860 +ENDCHAR +STARTCHAR U_3C7D +ENCODING 15485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +AA40 +AC60 +2BC0 +5240 +5240 +5580 +9A40 +9420 +ENDCHAR +STARTCHAR U_3C7E +ENCODING 15486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +2240 +4C20 +F3C0 +2A40 +5240 +B180 +4980 +8660 +ENDCHAR +STARTCHAR U_3C7F +ENCODING 15487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +7240 +0240 +FDE0 +8A40 +FA40 +8980 +8980 +9E60 +ENDCHAR +STARTCHAR U_3C80 +ENCODING 15488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4140 +7940 +4260 +7C00 +53E0 +5D40 +5880 +5540 +5A40 +9420 +ENDCHAR +STARTCHAR U_3C81 +ENCODING 15489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +1140 +7D40 +8660 +4800 +87E0 +FA20 +2140 +2080 +3940 +C220 +ENDCHAR +STARTCHAR U_3C82 +ENCODING 15490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +7240 +FA40 +8C20 +EBC0 +AA40 +AA40 +E980 +8A40 +9C20 +ENDCHAR +STARTCHAR U_3C83 +ENCODING 15491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +2240 +FA40 +AA40 +CC20 +FBC0 +4240 +7180 +4240 +7C20 +ENDCHAR +STARTCHAR U_3C84 +ENCODING 15492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +FA40 +8C20 +FBC0 +2240 +FA40 +2180 +3A40 +C420 +ENDCHAR +STARTCHAR U_3C85 +ENCODING 15493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +A540 +F940 +2620 +F9C0 +2140 +F940 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_3C86 +ENCODING 15494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4180 +8E60 +3580 +C260 +1F80 +0900 +0600 +ENDCHAR +STARTCHAR U_3C87 +ENCODING 15495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4E80 +B160 +0E00 +1900 +E6E0 +0800 +0600 +ENDCHAR +STARTCHAR U_3C88 +ENCODING 15496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4080 +8360 +7F80 +1080 +7F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3C89 +ENCODING 15497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDC0 +2140 +FD40 +8660 +FFC0 +D540 +BD40 +F480 +5D40 +9220 +ENDCHAR +STARTCHAR U_3C8A +ENCODING 15498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2140 +FD40 +8540 +7A20 +B5C0 +4940 +FD40 +5880 +6940 +7E20 +ENDCHAR +STARTCHAR U_3C8B +ENCODING 15499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A040 +3FC0 +2200 +3E60 +2380 +2E20 +31E0 +ENDCHAR +STARTCHAR U_3C8C +ENCODING 15500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E780 +2280 +3A80 +E2C0 +2240 +3C40 +E440 +29A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C8D +ENCODING 15501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +21C0 +2700 +F9E0 +4F00 +4920 +30E0 +4C00 +83E0 +ENDCHAR +STARTCHAR U_3C8E +ENCODING 15502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E700 +2100 +39C0 +E700 +2100 +39E0 +E700 +2900 +3120 +20E0 +ENDCHAR +STARTCHAR U_3C8F +ENCODING 15503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5100 +51C0 +7F00 +4100 +79E0 +4F00 +4900 +8920 +88E0 +ENDCHAR +STARTCHAR U_3C90 +ENCODING 15504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +A280 +3440 +6920 +A7C0 +3040 +6080 +A100 +2020 +3FE0 +ENDCHAR +STARTCHAR U_3C91 +ENCODING 15505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +A740 +3380 +6580 +A540 +3920 +6100 +A300 +2020 +3FE0 +ENDCHAR +STARTCHAR U_3C92 +ENCODING 15506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +7900 +4900 +8FC0 +6900 +5900 +5FC0 +6900 +0920 +39E0 +ENDCHAR +STARTCHAR U_3C93 +ENCODING 15507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E0A0 +27E0 +3C80 +E6A0 +25A0 +3CC0 +E540 +2A20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C94 +ENCODING 15508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +8900 +51E0 +0700 +F900 +21E0 +FF00 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_3C95 +ENCODING 15509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C60 +E780 +A480 +58E0 +0B80 +FC80 +88E0 +4B80 +0880 +08A0 +18E0 +ENDCHAR +STARTCHAR U_3C96 +ENCODING 15510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8E0 +7380 +2080 +F8E0 +8B80 +F880 +88E0 +FB80 +8880 +88A0 +98E0 +ENDCHAR +STARTCHAR U_3C97 +ENCODING 15511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CE0 +E780 +A880 +F8E0 +1780 +2080 +38E0 +E780 +2080 +20A0 +60E0 +ENDCHAR +STARTCHAR U_3C98 +ENCODING 15512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +4B80 +4880 +78E0 +4B80 +7880 +48E0 +4B80 +7880 +48A0 +84E0 +ENDCHAR +STARTCHAR U_3C99 +ENCODING 15513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +EFE0 +2200 +3440 +EFE0 +2540 +3540 +E540 +2960 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C9A +ENCODING 15514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +4B40 +1520 +E180 +5E00 +0400 +7F80 +0400 +FFC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_3C9B +ENCODING 15515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9120 +7DE0 +2800 +5F80 +0400 +7FC0 +0400 +FFE0 +0420 +07E0 +ENDCHAR +STARTCHAR U_3C9C +ENCODING 15516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB00 +7100 +21E0 +5700 +A900 +A9E0 +7700 +2100 +5120 +88E0 +ENDCHAR +STARTCHAR U_3C9D +ENCODING 15517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E500 +27C0 +3D00 +E7C0 +2500 +37C0 +E500 +27E0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C9E +ENCODING 15518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +1380 +FC80 +4BE0 +4880 +B480 +13E0 +FC80 +1080 +10A0 +10E0 +ENDCHAR +STARTCHAR U_3C9F +ENCODING 15519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +FF80 +2880 +10E0 +7F80 +5480 +54E0 +FF80 +2880 +44A0 +80E0 +ENDCHAR +STARTCHAR U_3CA0 +ENCODING 15520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +5760 +3C00 +07C0 +7C00 +07C0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_3CA1 +ENCODING 15521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FF80 +3880 +D4E0 +7B80 +0080 +FCE0 +1380 +5880 +94A0 +30E0 +ENDCHAR +STARTCHAR U_3CA2 +ENCODING 15522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +4280 +7EE0 +4180 +4080 +7EE0 +6B80 +FE80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_3CA3 +ENCODING 15523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +60C0 +BB80 +A880 +F8E0 +AB80 +F880 +20E0 +FB80 +4880 +30A0 +CCE0 +ENDCHAR +STARTCHAR U_3CA4 +ENCODING 15524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +1380 +FC80 +48E0 +FF80 +4880 +78E0 +5780 +D880 +48A0 +64E0 +ENDCHAR +STARTCHAR U_3CA5 +ENCODING 15525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +5480 +7EE0 +5580 +7C80 +50E0 +7F80 +6480 +BCA0 +A4E0 +ENDCHAR +STARTCHAR U_3CA6 +ENCODING 15526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +4CE0 +F700 +9100 +F1C0 +9700 +F1C0 +4700 +F120 +41E0 +ENDCHAR +STARTCHAR U_3CA7 +ENCODING 15527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +C540 +4280 +7380 +CD60 +4540 +77C0 +C120 +4FE0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_3CA8 +ENCODING 15528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +FF80 +4880 +FCE0 +4B80 +7880 +48E0 +7B80 +4880 +FCA0 +08E0 +ENDCHAR +STARTCHAR U_3CA9 +ENCODING 15529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +3440 +EFE0 +2AA0 +3660 +EBA0 +2660 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3CAA +ENCODING 15530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E8C0 +B780 +5880 +48E0 +B780 +0080 +78E0 +4B80 +7880 +48A0 +FCE0 +ENDCHAR +STARTCHAR U_3CAB +ENCODING 15531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CCC0 +4B80 +FC80 +48E0 +FF80 +2080 +78E0 +2380 +FC80 +48A0 +84E0 +ENDCHAR +STARTCHAR U_3CAC +ENCODING 15532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +7F80 +D080 +7CE0 +5380 +7C80 +50E0 +7F80 +4080 +A4A0 +A4E0 +ENDCHAR +STARTCHAR U_3CAD +ENCODING 15533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9460 +5580 +5880 +28E0 +4580 +8280 +54E0 +EF80 +4480 +AEA0 +92E0 +ENDCHAR +STARTCHAR U_3CAE +ENCODING 15534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FE0 +CAA0 +4380 +7C60 +C7C0 +4000 +77C0 +C440 +47C0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_3CAF +ENCODING 15535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A980 +EC80 +B0E0 +E180 +AC80 +F0E0 +0180 +FE80 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_3CB0 +ENCODING 15536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FE80 +9280 +4CE0 +FB80 +AA80 +FEE0 +0180 +FE80 +10A0 +3060 +ENDCHAR +STARTCHAR U_3CB1 +ENCODING 15537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EA80 +2540 +2FC0 +F940 +2A40 +2FC0 +FA80 +2FA0 +2A60 +1FC0 +ENDCHAR +STARTCHAR U_3CB2 +ENCODING 15538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5480 +FE80 +ABE0 +FE80 +8280 +7DE0 +4480 +7C80 +44A0 +FEE0 +ENDCHAR +STARTCHAR U_3CB3 +ENCODING 15539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +F280 +93E0 +9280 +FC80 +97E0 +9080 +9080 +F140 +8A20 +6C20 +ENDCHAR +STARTCHAR U_3CB4 +ENCODING 15540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0000 +7F80 +0880 +7E80 +4A80 +7E60 +0820 +ENDCHAR +STARTCHAR U_3CB5 +ENCODING 15541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +BF80 +0000 +7F80 +2A80 +1C80 +3E80 +22A0 +3EA0 +2660 +ENDCHAR +STARTCHAR U_3CB6 +ENCODING 15542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +FF80 +2080 +3C80 +2080 +FE80 +AA80 +D6A0 +AA60 +FE20 +ENDCHAR +STARTCHAR U_3CB7 +ENCODING 15543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +BFC0 +5540 +7F40 +2A40 +3E40 +2A40 +FFC0 +0860 +0820 +ENDCHAR +STARTCHAR U_3CB8 +ENCODING 15544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +0040 +8080 +4100 +1200 +2400 +C800 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_3CB9 +ENCODING 15545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +8480 +4480 +1480 +2480 +C480 +4480 +48A0 +1060 +ENDCHAR +STARTCHAR U_3CBA +ENCODING 15546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +0200 +8200 +43E0 +0E00 +1200 +2200 +C200 +4220 +41E0 +ENDCHAR +STARTCHAR U_3CBB +ENCODING 15547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2240 +7A40 +CB80 +4B00 +4A80 +5280 +5240 +6220 +4600 +ENDCHAR +STARTCHAR U_3CBC +ENCODING 15548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2440 +0440 +8440 +4280 +1280 +2100 +C100 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_3CBD +ENCODING 15549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +0220 +8220 +4220 +1A20 +2620 +C220 +4420 +4820 +10C0 +ENDCHAR +STARTCHAR U_3CBE +ENCODING 15550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +0440 +F480 +1700 +2500 +4480 +8460 +1C00 +ENDCHAR +STARTCHAR U_3CBF +ENCODING 15551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0800 +8800 +4800 +1800 +2800 +C800 +4800 +4800 +1000 +ENDCHAR +STARTCHAR U_3CC0 +ENCODING 15552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2280 +0240 +8FE0 +4200 +1240 +2280 +C100 +4320 +44A0 +4840 +ENDCHAR +STARTCHAR U_3CC1 +ENCODING 15553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0900 +8900 +4900 +0900 +2980 +CA80 +5240 +5440 +6820 +ENDCHAR +STARTCHAR U_3CC2 +ENCODING 15554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +0280 +8240 +4440 +0920 +2100 +C200 +4240 +44C0 +4720 +ENDCHAR +STARTCHAR U_3CC3 +ENCODING 15555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0FC0 +8280 +44A0 +0940 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CC4 +ENCODING 15556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2440 +07C0 +8A40 +5280 +0200 +2500 +C480 +4880 +4840 +5020 +ENDCHAR +STARTCHAR U_3CC5 +ENCODING 15557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0100 +8200 +4340 +1520 +2920 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CC6 +ENCODING 15558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +0280 +8080 +4480 +1280 +20E0 +CF80 +4080 +4080 +4080 +ENDCHAR +STARTCHAR U_3CC7 +ENCODING 15559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2480 +0440 +8820 +5480 +0480 +2300 +C100 +4280 +4480 +5860 +ENDCHAR +STARTCHAR U_3CC8 +ENCODING 15560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +1FE0 +8200 +4A80 +0A80 +2A80 +AA80 +4AA0 +52E0 +4200 +ENDCHAR +STARTCHAR U_3CC9 +ENCODING 15561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +0420 +87E0 +4420 +1420 +27E0 +A420 +4420 +48A0 +5060 +ENDCHAR +STARTCHAR U_3CCA +ENCODING 15562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +8880 +5480 +1480 +2300 +A100 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_3CCB +ENCODING 15563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +0800 +8800 +4FE0 +0880 +2880 +A880 +4880 +4880 +7FE0 +ENDCHAR +STARTCHAR U_3CCC +ENCODING 15564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0920 +8FE0 +4920 +1920 +2FE0 +A100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CCD +ENCODING 15565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +1FE0 +8500 +4FC0 +1940 +2940 +A940 +49C0 +4100 +4100 +ENDCHAR +STARTCHAR U_3CCE +ENCODING 15566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2400 +0840 +9FE0 +4480 +1480 +3FE0 +A480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_3CCF +ENCODING 15567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8920 +4920 +0FE0 +2900 +A500 +4300 +4680 +5860 +ENDCHAR +STARTCHAR U_3CD0 +ENCODING 15568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0480 +9F80 +4480 +1480 +2E80 +CD80 +5480 +44A0 +04E0 +ENDCHAR +STARTCHAR U_3CD1 +ENCODING 15569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +2FC0 +1540 +9540 +5540 +1540 +3540 +D540 +5540 +5FE0 +ENDCHAR +STARTCHAR U_3CD2 +ENCODING 15570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8280 +4280 +1440 +2920 +C100 +4200 +4440 +07A0 +ENDCHAR +STARTCHAR U_3CD3 +ENCODING 15571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +8FE0 +4200 +1400 +27C0 +CC40 +5440 +4440 +07C0 +ENDCHAR +STARTCHAR U_3CD4 +ENCODING 15572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +0E40 +83E0 +4A40 +1B40 +26C0 +C440 +4A40 +5040 +00C0 +ENDCHAR +STARTCHAR U_3CD5 +ENCODING 15573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0280 +8FE0 +4000 +1000 +27C0 +C000 +4000 +4000 +0FE0 +ENDCHAR +STARTCHAR U_3CD6 +ENCODING 15574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8100 +4200 +0520 +3D40 +2480 +C480 +4540 +4620 +ENDCHAR +STARTCHAR U_3CD7 +ENCODING 15575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2520 +04C0 +8280 +4100 +0280 +2D60 +2100 +C7C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_3CD8 +ENCODING 15576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8100 +4240 +17A0 +2200 +C280 +4280 +44A0 +08E0 +ENDCHAR +STARTCHAR U_3CD9 +ENCODING 15577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +0440 +8FA0 +4000 +17C0 +2440 +C7C0 +4440 +47C0 +0840 +ENDCHAR +STARTCHAR U_3CDA +ENCODING 15578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +8880 +4880 +1AA0 +29A0 +C8C0 +4880 +5160 +2620 +ENDCHAR +STARTCHAR U_3CDB +ENCODING 15579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +0960 +8920 +4D60 +1920 +2FE0 +C100 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_3CDC +ENCODING 15580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0480 +8FE0 +5480 +0480 +25C0 +26A0 +C480 +4480 +4480 +ENDCHAR +STARTCHAR U_3CDD +ENCODING 15581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25E0 +0880 +B880 +4880 +0FE0 +2880 +C880 +4880 +4880 +0BE0 +ENDCHAR +STARTCHAR U_3CDE +ENCODING 15582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0880 +9BE0 +4AA0 +0AA0 +2BE0 +2880 +C880 +4880 +4880 +ENDCHAR +STARTCHAR U_3CDF +ENCODING 15583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1100 +FFE0 +1100 +2480 +D560 +0E00 +3500 +4CC0 +ENDCHAR +STARTCHAR U_3CE0 +ENCODING 15584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +03E0 +9C80 +4480 +1480 +2480 +C540 +4620 +4A00 +11E0 +ENDCHAR +STARTCHAR U_3CE1 +ENCODING 15585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2840 +0440 +81E0 +5C40 +1540 +24C0 +C440 +44C0 +4A00 +11E0 +ENDCHAR +STARTCHAR U_3CE2 +ENCODING 15586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +8FE0 +4100 +1280 +2C60 +C280 +4280 +4480 +0880 +ENDCHAR +STARTCHAR U_3CE3 +ENCODING 15587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +8120 +4140 +1FE0 +2100 +C640 +4B80 +4220 +01C0 +ENDCHAR +STARTCHAR U_3CE4 +ENCODING 15588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2A80 +0680 +8280 +4FE0 +1280 +22C0 +CBA0 +5280 +4280 +0280 +ENDCHAR +STARTCHAR U_3CE5 +ENCODING 15589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +07C0 +8100 +47C0 +1000 +2280 +CFE0 +4280 +4280 +0480 +ENDCHAR +STARTCHAR U_3CE6 +ENCODING 15590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +1FE0 +8A80 +4A80 +1FA0 +2AA0 +2AC0 +D2C0 +4160 +4620 +ENDCHAR +STARTCHAR U_3CE7 +ENCODING 15591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2A80 +0A80 +8E80 +4A80 +0A80 +2E80 +2A80 +CEA0 +5AA0 +4260 +ENDCHAR +STARTCHAR U_3CE8 +ENCODING 15592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +0520 +8000 +4FE0 +1200 +23C0 +C640 +4980 +4100 +0E00 +ENDCHAR +STARTCHAR U_3CE9 +ENCODING 15593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +3E40 +0B40 +8AC0 +4A40 +0BE0 +2E40 +3A40 +C240 +4440 +44C0 +ENDCHAR +STARTCHAR U_3CEA +ENCODING 15594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0300 +8580 +5940 +0120 +2100 +27C0 +C440 +4440 +47C0 +ENDCHAR +STARTCHAR U_3CEB +ENCODING 15595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7640 +1580 +2480 +CC60 +1000 +2380 +2080 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3CEC +ENCODING 15596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0800 +87E0 +4120 +0140 +2500 +25E0 +C500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_3CED +ENCODING 15597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +87C0 +4100 +1FE0 +2100 +C380 +4540 +5920 +0100 +ENDCHAR +STARTCHAR U_3CEE +ENCODING 15598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3020 +1020 +9FE0 +5000 +1100 +3F20 +D3C0 +5540 +5920 +2300 +ENDCHAR +STARTCHAR U_3CEF +ENCODING 15599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8280 +4FE0 +1100 +2100 +CFE0 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_3CF0 +ENCODING 15600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0200 +8440 +47E0 +0240 +2240 +AFE0 +4240 +4240 +4440 +ENDCHAR +STARTCHAR U_3CF1 +ENCODING 15601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0AA0 +8CA0 +4AE0 +0AA0 +2AA0 +AAA0 +4CE0 +48A0 +4800 +ENDCHAR +STARTCHAR U_3CF2 +ENCODING 15602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2900 +0100 +A7E0 +5100 +0100 +2980 +2A80 +D240 +5540 +5820 +ENDCHAR +STARTCHAR U_3CF3 +ENCODING 15603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8100 +47C0 +1440 +27C0 +A280 +4280 +44A0 +48E0 +ENDCHAR +STARTCHAR U_3CF4 +ENCODING 15604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2540 +14A0 +9520 +4640 +1BC0 +2100 +A7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_3CF5 +ENCODING 15605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2700 +0100 +9FE0 +4540 +0920 +2780 +A080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3CF6 +ENCODING 15606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +3980 +1680 +8880 +5E80 +0280 +2780 +BC80 +44A0 +44A0 +4CE0 +ENDCHAR +STARTCHAR U_3CF7 +ENCODING 15607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +0AA0 +92A0 +4D20 +0240 +2FE0 +A820 +4FE0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_3CF8 +ENCODING 15608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0FE0 +8480 +4280 +14A0 +2CC0 +2780 +C480 +44A0 +44E0 +ENDCHAR +STARTCHAR U_3CF9 +ENCODING 15609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25E0 +0440 +9F40 +4440 +0DE0 +2E40 +3540 +C440 +4440 +45E0 +ENDCHAR +STARTCHAR U_3CFA +ENCODING 15610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +1EE0 +8500 +44E0 +0720 +3C40 +25E0 +C440 +4440 +4CC0 +ENDCHAR +STARTCHAR U_3CFB +ENCODING 15611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +27C0 +0280 +8280 +4FE0 +0000 +27C0 +A440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3CFC +ENCODING 15612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +4A40 +7980 +01A0 +FA60 +0440 +7680 +1580 +E460 +0C00 +ENDCHAR +STARTCHAR U_3CFD +ENCODING 15613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2500 +05E0 +9E80 +5080 +1080 +3DC0 +A6A0 +44A0 +4480 +5980 +ENDCHAR +STARTCHAR U_3CFE +ENCODING 15614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +47C0 +0100 +2FE0 +A280 +4280 +44A0 +4860 +ENDCHAR +STARTCHAR U_3CFF +ENCODING 15615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0200 +8440 +47C0 +1100 +2FE0 +2380 +C540 +4920 +4100 +ENDCHAR +STARTCHAR U_3D00 +ENCODING 15616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4440 +2EE0 +0000 +87C0 +4100 +17C0 +2080 +C100 +4600 +49E0 +ENDCHAR +STARTCHAR U_3D01 +ENCODING 15617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +8480 +4840 +14A0 +2FC0 +C480 +4FC0 +4480 +0880 +ENDCHAR +STARTCHAR U_3D02 +ENCODING 15618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +1BE0 +8AA0 +4AA0 +0BE0 +2AA0 +CFE0 +5A20 +4220 +0260 +ENDCHAR +STARTCHAR U_3D03 +ENCODING 15619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2800 +0FE0 +8820 +4FE0 +1880 +2FA0 +CAC0 +4AA0 +54A0 +2980 +ENDCHAR +STARTCHAR U_3D04 +ENCODING 15620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0AA0 +8CE0 +4820 +1BA0 +2AA0 +CBA0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_3D05 +ENCODING 15621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7700 +1500 +2480 +C860 +7FC0 +4A40 +71C0 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_3D06 +ENCODING 15622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +1FE0 +8040 +4FE0 +0920 +27C0 +C540 +4540 +4540 +0100 +ENDCHAR +STARTCHAR U_3D07 +ENCODING 15623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +24A0 +F6C0 +6D80 +76C0 +ADA0 +B6A0 +24A0 +2480 +6D80 +ENDCHAR +STARTCHAR U_3D08 +ENCODING 15624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2400 +07C0 +8480 +4480 +1FE0 +2100 +C920 +4920 +4920 +0FE0 +ENDCHAR +STARTCHAR U_3D09 +ENCODING 15625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +0BC0 +8440 +4280 +1520 +2AE0 +C000 +4FC0 +4000 +1FE0 +ENDCHAR +STARTCHAR U_3D0A +ENCODING 15626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5120 +2AA0 +1FA0 +84A0 +55A0 +15A0 +3FA0 +C4A0 +4820 +4820 +1060 +ENDCHAR +STARTCHAR U_3D0B +ENCODING 15627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +0280 +9FE0 +4280 +0F80 +2A40 +CB40 +4EC0 +4A40 +1240 +ENDCHAR +STARTCHAR U_3D0C +ENCODING 15628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +4880 +2880 +09C0 +BE80 +5480 +15C0 +2940 +C940 +5540 +22C0 +ENDCHAR +STARTCHAR U_3D0D +ENCODING 15629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2080 +0120 +9BA0 +4540 +0BC0 +2920 +D3A0 +6120 +4500 +0200 +ENDCHAR +STARTCHAR U_3D0E +ENCODING 15630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4100 +2FE0 +0280 +8440 +4BA0 +0000 +27C0 +C100 +4540 +4920 +ENDCHAR +STARTCHAR U_3D0F +ENCODING 15631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8AA0 +44C0 +1000 +27C0 +C100 +47C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_3D10 +ENCODING 15632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +1C80 +94E0 +5EA0 +16A0 +3FE0 +D420 +5C20 +4020 +40C0 +ENDCHAR +STARTCHAR U_3D11 +ENCODING 15633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0800 +8A40 +4FE0 +1AA0 +2AA0 +CBE0 +4880 +5100 +2200 +ENDCHAR +STARTCHAR U_3D12 +ENCODING 15634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +86C0 +4AA0 +1280 +2480 +CFE0 +4480 +4480 +0880 +ENDCHAR +STARTCHAR U_3D13 +ENCODING 15635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0920 +8FE0 +4920 +1920 +2FE0 +C000 +4A40 +58A0 +2700 +ENDCHAR +STARTCHAR U_3D14 +ENCODING 15636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +0880 +87C0 +4040 +1FE0 +2040 +C7C0 +4000 +4D40 +17A0 +ENDCHAR +STARTCHAR U_3D15 +ENCODING 15637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +81C0 +4E00 +1100 +2FE0 +C100 +4380 +4540 +0920 +ENDCHAR +STARTCHAR U_3D16 +ENCODING 15638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +87C0 +4000 +17C0 +2440 +C7C0 +4100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_3D17 +ENCODING 15639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +8AA0 +4FE0 +1440 +2FE0 +C440 +4280 +4100 +06C0 +ENDCHAR +STARTCHAR U_3D18 +ENCODING 15640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8820 +4FE0 +17C0 +2440 +C7C0 +47C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_3D19 +ENCODING 15641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +8100 +4500 +1960 +2920 +C920 +4D60 +4920 +0FE0 +ENDCHAR +STARTCHAR U_3D1A +ENCODING 15642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +43A0 +14A0 +21C0 +C6A0 +41A0 +4680 +0300 +ENDCHAR +STARTCHAR U_3D1B +ENCODING 15643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2480 +0AE0 +9FA0 +44A0 +15A0 +2EA0 +C4A0 +4440 +46A0 +0920 +ENDCHAR +STARTCHAR U_3D1C +ENCODING 15644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +9FC0 +5000 +1FC0 +9040 +5FC0 +1000 +3FC0 +DB40 +5FC0 +6B40 +2B40 +ENDCHAR +STARTCHAR U_3D1D +ENCODING 15645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +10A0 +FEA0 +3820 +5660 +9980 +3460 +C580 +3F00 +1480 +6460 +ENDCHAR +STARTCHAR U_3D1E +ENCODING 15646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2620 +1940 +8480 +4BE0 +1A20 +2A20 +CBE0 +4A20 +4A20 +0BE0 +ENDCHAR +STARTCHAR U_3D1F +ENCODING 15647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BE0 +8AA0 +4BE0 +1800 +2BC0 +C840 +57E0 +5080 +2180 +ENDCHAR +STARTCHAR U_3D20 +ENCODING 15648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +4080 +2100 +9120 +5DE0 +1560 +35A0 +5D60 +D320 +5120 +1FE0 +ENDCHAR +STARTCHAR U_3D21 +ENCODING 15649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +8FE0 +4380 +1560 +2FC0 +C440 +47C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_3D22 +ENCODING 15650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A480 +5480 +0880 +ABE0 +5AA0 +0AA0 +4BE0 +5880 +A880 +A880 +A880 +ENDCHAR +STARTCHAR U_3D23 +ENCODING 15651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +2880 +83E0 +50A0 +53E0 +2A80 +ABE0 +50A0 +5140 +5620 +ENDCHAR +STARTCHAR U_3D24 +ENCODING 15652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2440 +0400 +9FE0 +4440 +0E40 +2DE0 +3440 +C440 +4440 +47E0 +ENDCHAR +STARTCHAR U_3D25 +ENCODING 15653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +25C0 +2480 +85E0 +5520 +55E0 +1520 +B5E0 +5720 +5D20 +4160 +ENDCHAR +STARTCHAR U_3D26 +ENCODING 15654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +1FE0 +9020 +4780 +1480 +2780 +A000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_3D27 +ENCODING 15655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +17C0 +8440 +47C0 +0440 +17C0 +2440 +A7C0 +42A0 +4A60 +49C0 +ENDCHAR +STARTCHAR U_3D28 +ENCODING 15656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +2AC0 +2A00 +8FE0 +4A80 +0BE0 +2E80 +AA80 +4AC0 +5320 +5620 +ENDCHAR +STARTCHAR U_3D29 +ENCODING 15657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +0520 +87C0 +4440 +1FE0 +2920 +AFE0 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_3D2A +ENCODING 15658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0540 +86C0 +4540 +1640 +27C0 +2100 +CFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_3D2B +ENCODING 15659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2AA0 +1FA0 +8AC0 +5EA0 +08A0 +2EA0 +2AA0 +DAE0 +4E80 +4A80 +ENDCHAR +STARTCHAR U_3D2C +ENCODING 15660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2E40 +0A40 +8FE0 +4A40 +0F40 +2AC0 +BE40 +4A40 +5240 +46C0 +ENDCHAR +STARTCHAR U_3D2D +ENCODING 15661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +8440 +4FE0 +1440 +27C0 +2440 +C7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3D2E +ENCODING 15662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8AA0 +4BE0 +1A20 +2BE0 +2A20 +CBE0 +5220 +5260 +ENDCHAR +STARTCHAR U_3D2F +ENCODING 15663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2A80 +0AE0 +8E80 +4A60 +0A00 +2EE0 +2AA0 +CAE0 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3D30 +ENCODING 15664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3280 +1EE0 +8080 +5EA0 +12E0 +3E80 +32E0 +DE80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3D31 +ENCODING 15665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +5120 +5FE0 +2920 +2540 +C280 +4440 +5820 +ENDCHAR +STARTCHAR U_3D32 +ENCODING 15666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +3D00 +17E0 +9520 +57C0 +1500 +34C0 +3400 +D5C0 +5540 +6A60 +ENDCHAR +STARTCHAR U_3D33 +ENCODING 15667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2920 +0BE0 +9D40 +4960 +0940 +2960 +2940 +CD60 +52C0 +4D60 +ENDCHAR +STARTCHAR U_3D34 +ENCODING 15668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2AA0 +0CC0 +8940 +4A20 +1FE0 +2880 +4AA0 +CD40 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_3D35 +ENCODING 15669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2540 +14A0 +9520 +4640 +1BC0 +2000 +2FE0 +CAA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_3D36 +ENCODING 15670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0A20 +8480 +4FE0 +1480 +27C0 +A480 +47C0 +4480 +47E0 +ENDCHAR +STARTCHAR U_3D37 +ENCODING 15671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3E80 +1480 +9FE0 +54A0 +1C80 +3540 +3540 +DD40 +4540 +4660 +ENDCHAR +STARTCHAR U_3D38 +ENCODING 15672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +1920 +2920 +2AA0 +CC60 +4820 +4860 +ENDCHAR +STARTCHAR U_3D39 +ENCODING 15673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +09C0 +8480 +43E0 +1C80 +25C0 +26A0 +C480 +4680 +59E0 +ENDCHAR +STARTCHAR U_3D3A +ENCODING 15674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2900 +0FE0 +A100 +5540 +0540 +2BA0 +A900 +5280 +5440 +5820 +ENDCHAR +STARTCHAR U_3D3B +ENCODING 15675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +3E40 +0040 +9FE0 +5240 +1340 +3EC0 +3240 +CC40 +5E40 +40C0 +ENDCHAR +STARTCHAR U_3D3C +ENCODING 15676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +1020 +87C0 +4900 +1BC0 +2A40 +2BC0 +CA40 +4A40 +4BC0 +ENDCHAR +STARTCHAR U_3D3D +ENCODING 15677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2F40 +0580 +9FE0 +4540 +1920 +2200 +2540 +CC20 +5440 +53C0 +ENDCHAR +STARTCHAR U_3D3E +ENCODING 15678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2E80 +0480 +9FE0 +5120 +0EA0 +24A0 +2740 +DC40 +44A0 +4D20 +ENDCHAR +STARTCHAR U_3D3F +ENCODING 15679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +3D00 +0BC0 +8A40 +4BC0 +0A40 +2BC0 +2A40 +CBC0 +5A40 +4420 +ENDCHAR +STARTCHAR U_3D40 +ENCODING 15680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +00E0 +9F00 +48E0 +0F40 +2A40 +2BE0 +CA40 +52C0 +5720 +ENDCHAR +STARTCHAR U_3D41 +ENCODING 15681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +2480 +8100 +4FE0 +0440 +2FE0 +2540 +C540 +4540 +4960 +ENDCHAR +STARTCHAR U_3D42 +ENCODING 15682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2A40 +8A40 +4FE0 +0A40 +2A40 +2BC0 +C800 +5540 +5AA0 +ENDCHAR +STARTCHAR U_3D43 +ENCODING 15683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2880 +0BE0 +BE20 +6A80 +2AA0 +3EC0 +2880 +CA80 +4EA0 +7AE0 +ENDCHAR +STARTCHAR U_3D44 +ENCODING 15684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +3FE0 +8A80 +4E80 +00A0 +2EA0 +A440 +5F40 +4AE0 +5320 +ENDCHAR +STARTCHAR U_3D45 +ENCODING 15685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2640 +1920 +87C0 +4080 +17C0 +2440 +27C0 +C440 +47C0 +4820 +ENDCHAR +STARTCHAR U_3D46 +ENCODING 15686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +3D40 +15E0 +9640 +5440 +1FE0 +3400 +35E0 +D520 +5D20 +41E0 +ENDCHAR +STARTCHAR U_3D47 +ENCODING 15687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46A0 +2CA0 +04A0 +8FE0 +44A0 +04A0 +2EE0 +2AA0 +CAA0 +4EA0 +4AE0 +ENDCHAR +STARTCHAR U_3D48 +ENCODING 15688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +2A40 +0240 +AFE0 +5540 +0540 +2DE0 +AAA0 +52A0 +55A0 +58E0 +ENDCHAR +STARTCHAR U_3D49 +ENCODING 15689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +2A80 +0280 +A7E0 +5280 +06C0 +2BC0 +2AA0 +D280 +5280 +5280 +ENDCHAR +STARTCHAR U_3D4A +ENCODING 15690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8440 +5FE0 +0A00 +2FE0 +2AA0 +CEA0 +5A40 +43A0 +ENDCHAR +STARTCHAR U_3D4B +ENCODING 15691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +8440 +47C0 +5440 +27C0 +2440 +C7C0 +4440 +4820 +ENDCHAR +STARTCHAR U_3D4C +ENCODING 15692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2A40 +13E0 +8640 +5AE0 +0AA0 +2AE0 +AAA0 +4AE0 +4AA0 +4CE0 +ENDCHAR +STARTCHAR U_3D4D +ENCODING 15693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +8AA0 +4EE0 +1920 +2920 +2A60 +CEA0 +49A0 +4860 +ENDCHAR +STARTCHAR U_3D4E +ENCODING 15694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +8AA0 +4EE0 +4BA0 +2AA0 +2BA0 +CAA0 +4BA0 +4CE0 +ENDCHAR +STARTCHAR U_3D4F +ENCODING 15695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +2480 +8100 +4FE0 +1440 +2AA0 +2100 +CFE0 +4100 +4100 +ENDCHAR +STARTCHAR U_3D50 +ENCODING 15696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3A00 +1480 +9FE0 +5560 +1540 +3F40 +3440 +D440 +54A0 +6920 +ENDCHAR +STARTCHAR U_3D51 +ENCODING 15697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3EE0 +0AA0 +8AE0 +5200 +07C0 +2440 +A7C0 +4440 +47C0 +5820 +ENDCHAR +STARTCHAR U_3D52 +ENCODING 15698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +22A0 +8FE0 +4A80 +4FE0 +24A0 +2FC0 +C540 +47C0 +5820 +ENDCHAR +STARTCHAR U_3D53 +ENCODING 15699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8780 +4580 +0680 +3FE0 +A200 +4BC0 +4E00 +51E0 +ENDCHAR +STARTCHAR U_3D54 +ENCODING 15700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8D60 +47C0 +0140 +2FE0 +2640 +DBC0 +4240 +43C0 +ENDCHAR +STARTCHAR U_3D55 +ENCODING 15701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FC0 +0900 +9240 +5FE0 +0300 +2480 +3A60 +CB40 +52A0 +4600 +ENDCHAR +STARTCHAR U_3D56 +ENCODING 15702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3EE0 +0AA0 +92E0 +4480 +0FC0 +2440 +3FE0 +C540 +5920 +4300 +ENDCHAR +STARTCHAR U_3D57 +ENCODING 15703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +67E0 +1480 +07C0 +1480 +E7E0 +4AA0 +0AE0 +0440 +F680 +2580 +CC60 +ENDCHAR +STARTCHAR U_3D58 +ENCODING 15704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +EF20 +73C0 +AD40 +6320 +0000 +2120 +EFC0 +7340 +AD20 +6300 +ENDCHAR +STARTCHAR U_3D59 +ENCODING 15705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4440 +17C0 +2280 +2FE0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_3D5A +ENCODING 15706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2AA0 +0380 +8C60 +4380 +0440 +2BA0 +A100 +47C0 +4540 +4FE0 +ENDCHAR +STARTCHAR U_3D5B +ENCODING 15707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0100 +87C0 +4100 +1FE0 +2540 +2FE0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_3D5C +ENCODING 15708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2FE0 +0200 +A7E0 +5420 +0560 +25E0 +2CA0 +D7E0 +54A0 +5460 +ENDCHAR +STARTCHAR U_3D5D +ENCODING 15709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0520 +8CC0 +5640 +1420 +2FE0 +AAA0 +4EE0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_3D5E +ENCODING 15710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2480 +1EA0 +85C0 +4E80 +1540 +2620 +A140 +4520 +5440 +53C0 +ENDCHAR +STARTCHAR U_3D5F +ENCODING 15711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +7580 +5FE0 +10A0 +AEA0 +61A0 +2E40 +6A40 +AA40 +B3A0 +A120 +ENDCHAR +STARTCHAR U_3D60 +ENCODING 15712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +4FC0 +1840 +2FC0 +CD40 +57C0 +5920 +2FE0 +ENDCHAR +STARTCHAR U_3D61 +ENCODING 15713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2200 +1FE0 +9AA0 +4780 +0A40 +27C0 +AD40 +5740 +44A0 +43E0 +ENDCHAR +STARTCHAR U_3D62 +ENCODING 15714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +9560 +4380 +0540 +27C0 +2540 +C7C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_3D63 +ENCODING 15715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +3280 +1E80 +93E0 +5EA0 +1080 +3E80 +2A80 +F680 +5B40 +4420 +ENDCHAR +STARTCHAR U_3D64 +ENCODING 15716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0660 +8AA0 +4100 +1FE0 +2540 +2BA0 +C100 +4280 +4C60 +ENDCHAR +STARTCHAR U_3D65 +ENCODING 15717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +14A0 +86C0 +5520 +1640 +3BC0 +2000 +CFE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_3D66 +ENCODING 15718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +37E0 +0940 +8BE0 +4520 +1DE0 +2920 +A9E0 +4920 +4E00 +51E0 +ENDCHAR +STARTCHAR U_3D67 +ENCODING 15719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +87C0 +4540 +0640 +27E0 +2CA0 +D560 +47A0 +40C0 +ENDCHAR +STARTCHAR U_3D68 +ENCODING 15720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +7A40 +47E0 +7880 +CFE0 +7880 +04C0 +7700 +1580 +EC60 +ENDCHAR +STARTCHAR U_3D69 +ENCODING 15721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8A80 +5FE0 +0A80 +2FC0 +2100 +DFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_3D6A +ENCODING 15722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0100 +87C0 +4100 +0FE0 +2100 +2DE0 +C2A0 +4CC0 +4320 +ENDCHAR +STARTCHAR U_3D6B +ENCODING 15723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2080 +0FE0 +8140 +4FE0 +0240 +26C0 +27C0 +C540 +4640 +47C0 +ENDCHAR +STARTCHAR U_3D6C +ENCODING 15724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1560 +9DA0 +56A0 +5520 +1EE0 +3400 +D5E0 +56A0 +6BE0 +ENDCHAR +STARTCHAR U_3D6D +ENCODING 15725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0140 +8FE0 +4640 +0BC0 +2240 +23C0 +C040 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_3D6E +ENCODING 15726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0480 +8FC0 +54A0 +0780 +2100 +2FC0 +C940 +5FE0 +4100 +ENDCHAR +STARTCHAR U_3D6F +ENCODING 15727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8A40 +4F40 +0940 +2F40 +2940 +CFC0 +5AA0 +6920 +ENDCHAR +STARTCHAR U_3D70 +ENCODING 15728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +3440 +1FC0 +9440 +5FC0 +1140 +1540 +3FE0 +C880 +5040 +6020 +ENDCHAR +STARTCHAR U_3D71 +ENCODING 15729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2A40 +1F40 +95E0 +5F40 +0140 +2EC0 +2040 +DF40 +4E40 +55C0 +ENDCHAR +STARTCHAR U_3D72 +ENCODING 15730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3FE0 +0AA0 +9FE0 +4AA0 +1FE0 +2840 +2FE0 +D540 +47E0 +5840 +ENDCHAR +STARTCHAR U_3D73 +ENCODING 15731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2B60 +86C0 +4B40 +5DE0 +2680 +A100 +4640 +4180 +4E00 +ENDCHAR +STARTCHAR U_3D74 +ENCODING 15732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +2FE0 +8880 +7F80 +4AA0 +3FA0 +2940 +AF40 +5AE0 +5720 +ENDCHAR +STARTCHAR U_3D75 +ENCODING 15733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +2AE0 +0EA0 +8A40 +5EA0 +03A0 +2D00 +A360 +4D80 +4340 +4D20 +ENDCHAR +STARTCHAR U_3D76 +ENCODING 15734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +2EA0 +0480 +9FE0 +4A80 +1F80 +2AA0 +AFA0 +4AC0 +4FE0 +4320 +ENDCHAR +STARTCHAR U_3D77 +ENCODING 15735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2440 +F3E0 +9120 +68C0 +F5E0 +2240 +F3E0 +2C40 +4440 +8440 +ENDCHAR +STARTCHAR U_3D78 +ENCODING 15736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +9BA0 +4000 +07C0 +2540 +AFE0 +4AA0 +4FE0 +4AA0 +ENDCHAR +STARTCHAR U_3D79 +ENCODING 15737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2BE0 +0940 +8BE0 +6A60 +2AA0 +2BE0 +BE80 +63E0 +4140 +4620 +ENDCHAR +STARTCHAR U_3D7A +ENCODING 15738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +3540 +2200 +8FC0 +4940 +4FC0 +2940 +AFC0 +4500 +5FE0 +4100 +ENDCHAR +STARTCHAR U_3D7B +ENCODING 15739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +B980 +6AE0 +2AA0 +3BE0 +AAA0 +6BE0 +3880 +6BE0 +A920 +A8C0 +DF20 +ENDCHAR +STARTCHAR U_3D7C +ENCODING 15740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0440 +86C0 +4440 +07C0 +2400 +2FE0 +D2A0 +4AA0 +4840 +ENDCHAR +STARTCHAR U_3D7D +ENCODING 15741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +8540 +47C0 +0000 +2FE0 +2AA0 +CFE0 +4AA0 +4FE0 +ENDCHAR +STARTCHAR U_3D7E +ENCODING 15742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +04E0 +8EA0 +44E0 +1FA0 +2AA0 +2EE0 +CA40 +4EC0 +4B60 +ENDCHAR +STARTCHAR U_3D7F +ENCODING 15743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0540 +8640 +47C0 +0440 +2EE0 +2AA0 +CEE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_3D80 +ENCODING 15744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +35A0 +1760 +95A0 +5E60 +1480 +1F40 +34A0 +D740 +5480 +6F00 +ENDCHAR +STARTCHAR U_3D81 +ENCODING 15745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46E0 +3880 +2BE0 +9D40 +45E0 +1F40 +2560 +B500 +4DE0 +46A0 +4D20 +ENDCHAR +STARTCHAR U_3D82 +ENCODING 15746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +2FE0 +0140 +A7E0 +5080 +03E0 +2AA0 +ABE0 +52A0 +53E0 +5420 +ENDCHAR +STARTCHAR U_3D83 +ENCODING 15747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +2C00 +07E0 +AD40 +5540 +0FE0 +2540 +AFE0 +5000 +56A0 +5AA0 +ENDCHAR +STARTCHAR U_3D84 +ENCODING 15748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +3520 +1DE0 +9520 +5FE0 +12A0 +1DA0 +36A0 +D4A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3D85 +ENCODING 15749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +2AC0 +0D40 +8AC0 +5FE0 +1020 +2780 +2100 +CFC0 +4100 +4300 +ENDCHAR +STARTCHAR U_3D86 +ENCODING 15750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3DE0 +00A0 +9CC0 +43E0 +1C80 +21E0 +3F20 +D5E0 +5520 +5DE0 +ENDCHAR +STARTCHAR U_3D87 +ENCODING 15751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2BE0 +0940 +BFE0 +4880 +1BE0 +1EA0 +2BE0 +CAA0 +4BE0 +4C20 +ENDCHAR +STARTCHAR U_3D88 +ENCODING 15752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2BA0 +06C0 +8540 +4FE0 +0920 +27C0 +2540 +C7C0 +4120 +4FE0 +ENDCHAR +STARTCHAR U_3D89 +ENCODING 15753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +3BC0 +1540 +8BC0 +5D40 +0BC0 +3F00 +29E0 +DE20 +4DA0 +5240 +ENDCHAR +STARTCHAR U_3D8A +ENCODING 15754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +3E40 +14E0 +94A0 +5EE0 +12A0 +1EE0 +34A0 +D4E0 +5EA0 +4120 +ENDCHAR +STARTCHAR U_3D8B +ENCODING 15755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +3B40 +0AC0 +BFE0 +4A40 +36E0 +0D40 +B540 +4DE0 +5480 +4860 +ENDCHAR +STARTCHAR U_3D8C +ENCODING 15756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +3680 +17E0 +9D40 +56A0 +1FE0 +1540 +3560 +DF60 +4540 +4640 +ENDCHAR +STARTCHAR U_3D8D +ENCODING 15757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +2EA0 +0A40 +9FE0 +5540 +5FE0 +1540 +3FE0 +C040 +5540 +5540 +ENDCHAR +STARTCHAR U_3D8E +ENCODING 15758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +32A0 +0BE0 +8800 +47E0 +3A20 +0BE0 +2AA0 +CF40 +5A20 +67E0 +ENDCHAR +STARTCHAR U_3D8F +ENCODING 15759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +36A0 +17E0 +9880 +55E0 +1420 +17E0 +3820 +D3E0 +56A0 +59E0 +ENDCHAR +STARTCHAR U_3D90 +ENCODING 15760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9FE0 +5540 +15E0 +9F40 +55E0 +1540 +55E0 +9200 +AD40 +2BA0 +ENDCHAR +STARTCHAR U_3D91 +ENCODING 15761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2A80 +31E0 +8F20 +4040 +5F40 +1540 +BF40 +4A40 +4AA0 +5520 +ENDCHAR +STARTCHAR U_3D92 +ENCODING 15762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +32A0 +1EE0 +92A0 +5FE0 +1520 +37A0 +B520 +57A0 +52A0 +5560 +ENDCHAR +STARTCHAR U_3D93 +ENCODING 15763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +04A0 +AFE0 +6A80 +3FA0 +0960 +BF40 +6A40 +57A0 +5120 +ENDCHAR +STARTCHAR U_3D94 +ENCODING 15764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1FC0 +8000 +7FE0 +2AA0 +3FE0 +A200 +5FE0 +4480 +7860 +ENDCHAR +STARTCHAR U_3D95 +ENCODING 15765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +9EE0 +52A0 +1FE0 +34A0 +B7A0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3D96 +ENCODING 15766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1320 +B4C0 +5520 +17E0 +12A0 +B3E0 +5080 +57E0 +52A0 +ENDCHAR +STARTCHAR U_3D97 +ENCODING 15767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +A7E0 +7D40 +57E0 +7DC0 +0AA0 +3F80 +2480 +7FC0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3D98 +ENCODING 15768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +8FE0 +4280 +0FE0 +2AA0 +AFE0 +4540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_3D99 +ENCODING 15769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA00 +5B40 +0AC0 +1FE0 +A440 +5BE0 +0640 +BBE0 +5600 +5B00 +54E0 +ENDCHAR +STARTCHAR U_3D9A +ENCODING 15770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2500 +1FE0 +9520 +5FE0 +0AA0 +3FE0 +AAA0 +55E0 +5EA0 +4560 +ENDCHAR +STARTCHAR U_3D9B +ENCODING 15771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +4BE0 +3C00 +9360 +55A0 +1F60 +14A0 +B7E0 +5540 +5A20 +6420 +ENDCHAR +STARTCHAR U_3D9C +ENCODING 15772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFA0 +64A0 +3FA0 +B2A0 +7FA0 +2AA0 +2AA0 +BFA0 +6AA0 +4A20 +5460 +ENDCHAR +STARTCHAR U_3D9D +ENCODING 15773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2FE0 +0A80 +AFE0 +5A80 +0BE0 +0A80 +AFE0 +5520 +5460 +5BC0 +ENDCHAR +STARTCHAR U_3D9E +ENCODING 15774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +1FE0 +8AA0 +4EE0 +4480 +2FC0 +A480 +5FE0 +4C80 +5660 +ENDCHAR +STARTCHAR U_3D9F +ENCODING 15775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +0FE0 +8AA0 +4FE0 +1AA0 +2FE0 +A280 +47C0 +4920 +4300 +ENDCHAR +STARTCHAR U_3DA0 +ENCODING 15776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3560 +1FE0 +9440 +5EE0 +1440 +3FE0 +D6A0 +6BE0 +4240 +0C40 +ENDCHAR +STARTCHAR U_3DA1 +ENCODING 15777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2D80 +3680 +2480 +2A80 +51A0 +4060 +8020 +ENDCHAR +STARTCHAR U_3DA2 +ENCODING 15778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +0A00 +1100 +E8E0 +0800 +7F00 +0900 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_3DA3 +ENCODING 15779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +0400 +FFE0 +0400 +0400 +2480 +1500 +0A00 +1180 +E060 +ENDCHAR +STARTCHAR U_3DA4 +ENCODING 15780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +A9E0 +AA20 +B320 +24C0 +2040 +5080 +4900 +8200 +0C00 +ENDCHAR +STARTCHAR U_3DA5 +ENCODING 15781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +A900 +B100 +2FE0 +2100 +5100 +4900 +8100 +0100 +ENDCHAR +STARTCHAR U_3DA6 +ENCODING 15782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A980 +A880 +B7E0 +20A0 +2080 +3080 +4880 +8080 +0180 +ENDCHAR +STARTCHAR U_3DA7 +ENCODING 15783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +AD20 +B520 +A520 +26A0 +5460 +4C20 +8420 +0460 +ENDCHAR +STARTCHAR U_3DA8 +ENCODING 15784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7FC0 +0400 +0D00 +1480 +E460 +0400 +0400 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_3DA9 +ENCODING 15785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +AD20 +B100 +2100 +2100 +5280 +4A80 +84A0 +18E0 +ENDCHAR +STARTCHAR U_3DAA +ENCODING 15786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0C00 +3580 +C460 +0400 +0400 +2480 +2500 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAB +ENCODING 15787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4480 +2F00 +30C0 +C020 +2480 +2480 +2B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAC +ENCODING 15788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +A900 +A900 +37C0 +2100 +5380 +4D40 +8920 +0100 +ENDCHAR +STARTCHAR U_3DAD +ENCODING 15789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2480 +A9E0 +BAA0 +26A0 +28A0 +5AA0 +4EA0 +8120 +0660 +ENDCHAR +STARTCHAR U_3DAE +ENCODING 15790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +0400 +2440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAF +ENCODING 15791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2600 +28E0 +2AA0 +AAA0 +BAA0 +AAA0 +2AA0 +2EE0 +5A80 +8A80 +0480 +ENDCHAR +STARTCHAR U_3DB0 +ENCODING 15792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1240 +1240 +57E0 +5A40 +9240 +13C0 +2A40 +2A40 +4240 +83C0 +ENDCHAR +STARTCHAR U_3DB1 +ENCODING 15793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +2900 +B7E0 +A100 +2100 +2380 +3540 +4BA0 +4100 +8100 +ENDCHAR +STARTCHAR U_3DB2 +ENCODING 15794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +2D20 +B7E0 +A520 +A7E0 +2520 +2520 +5520 +8D20 +8460 +ENDCHAR +STARTCHAR U_3DB3 +ENCODING 15795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +FFE0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DB4 +ENCODING 15796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +AF20 +A8C0 +B180 +2600 +21E0 +5320 +48C0 +8180 +0E00 +ENDCHAR +STARTCHAR U_3DB5 +ENCODING 15797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +2700 +6100 +A100 +2FE0 +2100 +2100 +27C0 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_3DB6 +ENCODING 15798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +AA20 +B200 +A520 +2D40 +2480 +5480 +8D40 +0620 +ENDCHAR +STARTCHAR U_3DB7 +ENCODING 15799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +A820 +B7A0 +A4A0 +27A0 +54A0 +4FA0 +8020 +00C0 +ENDCHAR +STARTCHAR U_3DB8 +ENCODING 15800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +AA40 +B240 +24C0 +2880 +5FE0 +4AA0 +8AA0 +1760 +ENDCHAR +STARTCHAR U_3DB9 +ENCODING 15801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +6900 +BFE0 +2100 +2F20 +23C0 +5540 +9920 +0300 +ENDCHAR +STARTCHAR U_3DBA +ENCODING 15802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +AFE0 +AA40 +A420 +2BE0 +5240 +4A40 +83C0 +0240 +ENDCHAR +STARTCHAR U_3DBB +ENCODING 15803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +3100 +1F00 +E4E0 +3F80 +0400 +1F00 +0400 +7FC0 +9520 +9120 +ENDCHAR +STARTCHAR U_3DBC +ENCODING 15804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +AFC0 +B400 +A7C0 +2900 +2100 +5FE0 +4A80 +8440 +0820 +ENDCHAR +STARTCHAR U_3DBD +ENCODING 15805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AC40 +B7C0 +A100 +2FE0 +2920 +5AA0 +4C60 +8820 +0860 +ENDCHAR +STARTCHAR U_3DBE +ENCODING 15806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +FFE0 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DBF +ENCODING 15807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +AFE0 +B820 +A7C0 +2080 +57E0 +4900 +8100 +0300 +ENDCHAR +STARTCHAR U_3DC0 +ENCODING 15808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5540 +3B80 +2A80 +4440 +7F80 +0880 +FF80 +0880 +08A0 +0860 +ENDCHAR +STARTCHAR U_3DC1 +ENCODING 15809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +2180 +AFE0 +B520 +A7E0 +2520 +57E0 +4D20 +8520 +0560 +ENDCHAR +STARTCHAR U_3DC2 +ENCODING 15810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +A3E0 +F920 +8940 +F880 +A140 +FE20 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DC3 +ENCODING 15811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +1B00 +E0E0 +1F80 +1000 +1F80 +1000 +FFE0 +1280 +19C0 +ENDCHAR +STARTCHAR U_3DC4 +ENCODING 15812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +A7C0 +AD40 +B7C0 +2100 +2FE0 +5380 +4D40 +8920 +0100 +ENDCHAR +STARTCHAR U_3DC5 +ENCODING 15813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +5BC0 +6A40 +5980 +6980 +FE60 +0800 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DC6 +ENCODING 15814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +AFC0 +B400 +A7E0 +2420 +57E0 +4100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DC7 +ENCODING 15815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +CFE0 +3200 +2280 +E2A0 +3BC0 +CA80 +3480 +2540 +CA20 +ENDCHAR +STARTCHAR U_3DC8 +ENCODING 15816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +A920 +B7C0 +A540 +27C0 +5540 +4FC0 +8120 +00E0 +ENDCHAR +STARTCHAR U_3DC9 +ENCODING 15817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7C40 +43E0 +5C40 +4140 +7EC0 +6A40 +5C40 +9440 +E2C0 +ENDCHAR +STARTCHAR U_3DCA +ENCODING 15818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FFE0 +1100 +3B80 +5540 +9920 +1100 +1240 +8920 +8920 +ENDCHAR +STARTCHAR U_3DCB +ENCODING 15819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +21C0 +A940 +AA20 +B480 +2480 +52A0 +49C0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DCC +ENCODING 15820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +ABC0 +B040 +2FE0 +2920 +27C0 +5540 +4D40 +85C0 +0100 +ENDCHAR +STARTCHAR U_3DCD +ENCODING 15821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +AFE0 +B000 +AFE0 +2AA0 +2FE0 +5AA0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_3DCE +ENCODING 15822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +AC40 +B7C0 +A200 +27E0 +5920 +4AA0 +87E0 +0040 +ENDCHAR +STARTCHAR U_3DCF +ENCODING 15823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13C0 +FC80 +37E0 +5880 +9480 +0000 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DD0 +ENCODING 15824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2C60 +2820 +BEE0 +6820 +2FE0 +2100 +2FE0 +5100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3DD1 +ENCODING 15825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4A80 +3F80 +CA60 +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3DD2 +ENCODING 15826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +AD40 +B7C0 +A100 +2FE0 +5960 +49E0 +8F20 +0860 +ENDCHAR +STARTCHAR U_3DD3 +ENCODING 15827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +AAA0 +AFA0 +B2E0 +2540 +5120 +4AA0 +8A20 +09E0 +ENDCHAR +STARTCHAR U_3DD4 +ENCODING 15828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +AD20 +AAC0 +B000 +25E0 +2520 +55E0 +4D20 +8520 +05E0 +ENDCHAR +STARTCHAR U_3DD5 +ENCODING 15829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +FEA0 +29C0 +FE80 +AA80 +CE80 +8280 +FF40 +8340 +FE20 +ENDCHAR +STARTCHAR U_3DD6 +ENCODING 15830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8920 +F920 +8A20 +FC40 +2000 +ABE0 +B220 +5220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_3DD7 +ENCODING 15831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5D20 +51E0 +5D00 +5520 +9DE0 +2440 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DD8 +ENCODING 15832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2000 +AFE0 +B420 +A7E0 +2100 +57E0 +4B80 +8540 +0920 +ENDCHAR +STARTCHAR U_3DD9 +ENCODING 15833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +B000 +AE20 +2AA0 +2EA0 +5AA0 +4EA0 +8A20 +0A60 +ENDCHAR +STARTCHAR U_3DDA +ENCODING 15834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2000 +ABC0 +B240 +A7E0 +2420 +53C0 +4880 +8080 +0180 +ENDCHAR +STARTCHAR U_3DDB +ENCODING 15835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +27C0 +6100 +AFE0 +2380 +2540 +2920 +0000 +4A40 +8920 +ENDCHAR +STARTCHAR U_3DDC +ENCODING 15836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AAC0 +B2A0 +A580 +2100 +57E0 +4980 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DDD +ENCODING 15837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +B440 +6920 +2140 +2120 +2FE0 +5280 +4440 +9820 +ENDCHAR +STARTCHAR U_3DDE +ENCODING 15838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +25C0 +AD40 +B5C0 +A540 +25C0 +5440 +4FE0 +8480 +0980 +ENDCHAR +STARTCHAR U_3DDF +ENCODING 15839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2900 +25E0 +B120 +6DE0 +2500 +29E0 +2520 +25E0 +5600 +89E0 +ENDCHAR +STARTCHAR U_3DE0 +ENCODING 15840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1F00 +1100 +64C0 +1F00 +F0E0 +2080 +3BC0 +EA80 +13E0 +E080 +ENDCHAR +STARTCHAR U_3DE1 +ENCODING 15841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9440 +F7C0 +9400 +F7E0 +4440 +2E80 +3180 +C060 +ENDCHAR +STARTCHAR U_3DE2 +ENCODING 15842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +0800 +3F80 +1000 +FFE0 +4400 +BFC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DE3 +ENCODING 15843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +A100 +B7C0 +A100 +2FE0 +2500 +5FC0 +5100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DE4 +ENCODING 15844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FC20 +8BC0 +7240 +2240 +A980 +7180 +5240 +8C20 +ENDCHAR +STARTCHAR U_3DE5 +ENCODING 15845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +A840 +7080 +50A0 +8FC0 +0180 +AAC0 +AAA0 +74A0 +5880 +8FE0 +ENDCHAR +STARTCHAR U_3DE6 +ENCODING 15846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +4CA0 +7AA0 +4AC0 +7880 +4940 +FA20 +0C20 +5240 +4920 +C920 +ENDCHAR +STARTCHAR U_3DE7 +ENCODING 15847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +ABE0 +BA20 +ABE0 +2A20 +2BE0 +5880 +4AC0 +8CA0 +1180 +ENDCHAR +STARTCHAR U_3DE8 +ENCODING 15848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +2440 +A380 +BD60 +A7C0 +2100 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_3DE9 +ENCODING 15849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +5420 +5EE0 +5280 +5E80 +54A0 +9EE0 +4440 +2E80 +3180 +C060 +ENDCHAR +STARTCHAR U_3DEA +ENCODING 15850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +AC80 +B7E0 +A480 +27E0 +2480 +27C0 +5260 +4A20 +8C60 +ENDCHAR +STARTCHAR U_3DEB +ENCODING 15851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2460 +FBC0 +AA40 +F980 +8660 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DEC +ENCODING 15852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +AFC0 +B4C0 +A540 +27C0 +2100 +5FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_3DED +ENCODING 15853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2C40 +F380 +2D60 +27C0 +F100 +0FE0 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DEE +ENCODING 15854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2AA0 +2FE0 +5540 +4E40 +87C0 +ENDCHAR +STARTCHAR U_3DEF +ENCODING 15855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +57E0 +8A00 +27E0 +2540 +FBA0 +2100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_3DF0 +ENCODING 15856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAC0 +B940 +AFC0 +2100 +2FE0 +2A20 +5AA0 +4FA0 +88A0 +ENDCHAR +STARTCHAR U_3DF1 +ENCODING 15857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +FBE0 +4880 +7FE0 +4900 +7A20 +4BE0 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_3DF2 +ENCODING 15858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2280 +AF80 +B2E0 +AFA0 +2AA0 +2FA0 +2AA0 +5FA0 +42A0 +8F60 +ENDCHAR +STARTCHAR U_3DF3 +ENCODING 15859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A80 +57E0 +7C80 +57C0 +5480 +57E0 +5240 +4A80 +8500 +38E0 +ENDCHAR +STARTCHAR U_3DF4 +ENCODING 15860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4CC0 +7B80 +4880 +7FE0 +5DC0 +6AA0 +4200 +9240 +8D80 +38E0 +ENDCHAR +STARTCHAR U_3DF5 +ENCODING 15861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +AD40 +B7C0 +A100 +27C0 +5100 +4FE0 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_3DF6 +ENCODING 15862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2FE0 +6480 +BFE0 +2540 +2FC0 +3540 +27C0 +2540 +4920 +8920 +ENDCHAR +STARTCHAR U_3DF7 +ENCODING 15863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +A880 +BEE0 +A240 +2FE0 +3240 +4FE0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DF8 +ENCODING 15864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2640 +AFE0 +B540 +AFE0 +2540 +5FE0 +5100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DF9 +ENCODING 15865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +A9C0 +B100 +A7C0 +2440 +57C0 +5440 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DFA +ENCODING 15866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +99E0 +8B40 +DD40 +8880 +FB60 +0400 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DFB +ENCODING 15867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +AD40 +B540 +AFE0 +2540 +5FE0 +5000 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_3DFC +ENCODING 15868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2E80 +EAE0 +2A80 +EEE0 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DFD +ENCODING 15869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2100 +AFC0 +B100 +AFE0 +2540 +5FE0 +5440 +87C0 +0440 +ENDCHAR +STARTCHAR U_3DFE +ENCODING 15870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +27E0 +AD40 +B580 +A760 +2580 +56A0 +4DC0 +8AA0 +0980 +ENDCHAR +STARTCHAR U_3DFF +ENCODING 15871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC40 +BBA0 +A000 +2EE0 +2AA0 +5EE0 +5440 +8AC0 +1120 +ENDCHAR +STARTCHAR U_3E00 +ENCODING 15872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +BAA0 +ABA0 +2860 +5100 +4FC0 +8100 +0FE0 +ENDCHAR +STARTCHAR U_3E01 +ENCODING 15873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +2280 +2FE0 +AA80 +B7E0 +A100 +27C0 +5100 +4FE0 +8540 +0920 +ENDCHAR +STARTCHAR U_3E02 +ENCODING 15874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0240 +ED80 +2360 +3D00 +C7E0 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E03 +ENCODING 15875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5480 +7CE0 +5480 +7C80 +11E0 +7D20 +1120 +FDE0 +5240 +8920 +ENDCHAR +STARTCHAR U_3E04 +ENCODING 15876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +B540 +A920 +2440 +57C0 +4C40 +87C0 +0840 +ENDCHAR +STARTCHAR U_3E05 +ENCODING 15877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +AA40 +BEE0 +AAA0 +2EA0 +2AA0 +5EA0 +48E0 +8A80 +0E80 +ENDCHAR +STARTCHAR U_3E06 +ENCODING 15878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27C0 +A900 +BFE0 +A440 +27C0 +2280 +5EE0 +5280 +8EE0 +0280 +ENDCHAR +STARTCHAR U_3E07 +ENCODING 15879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +2440 +AFE0 +B440 +AAA0 +27C0 +5540 +4D40 +87C0 +0820 +ENDCHAR +STARTCHAR U_3E08 +ENCODING 15880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7FE0 +5280 +7FE0 +4400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E09 +ENCODING 15881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +BFA0 +6AC0 +3F80 +2480 +5F40 +8420 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E0A +ENCODING 15882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22E0 +2F40 +AAE0 +BFA0 +AAE0 +2FA0 +52E0 +57A0 +8AE0 +0320 +ENDCHAR +STARTCHAR U_3E0B +ENCODING 15883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3FA0 +EAC0 +57E0 +21C0 +C6A0 +23E0 +AAA0 +73E0 +52A0 +8BE0 +ENDCHAR +STARTCHAR U_3E0C +ENCODING 15884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +AD60 +B380 +A500 +27E0 +5480 +4FC0 +8480 +07E0 +ENDCHAR +STARTCHAR U_3E0D +ENCODING 15885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2260 +2F40 +BAE0 +AF40 +AA40 +2F60 +5940 +4F40 +95A0 +1F20 +ENDCHAR +STARTCHAR U_3E0E +ENCODING 15886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +ABC0 +B240 +AFE0 +2540 +27C0 +5540 +4FE0 +8140 +0140 +ENDCHAR +STARTCHAR U_3E0F +ENCODING 15887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5AC0 +6DA0 +4500 +7DE0 +5240 +8F80 +B8E0 +ENDCHAR +STARTCHAR U_3E10 +ENCODING 15888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FD40 +2BE0 +7D40 +55E0 +7D40 +11E0 +FD40 +49E0 +5240 +8920 +ENDCHAR +STARTCHAR U_3E11 +ENCODING 15889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5140 +7FC0 +5540 +FFE0 +9120 +7FC0 +3B80 +5540 +3B80 +E0E0 +ENDCHAR +STARTCHAR U_3E12 +ENCODING 15890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7880 +2480 +1500 +03C0 +3C00 +0400 +FFE0 +0400 +0400 +3FC0 +ENDCHAR +STARTCHAR U_3E13 +ENCODING 15891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0F80 +F100 +8900 +4A00 +0000 +FF80 +8080 +FF80 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_3E14 +ENCODING 15892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +2500 +FFE0 +0800 +1F80 +3480 +D980 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_3E15 +ENCODING 15893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D40 +77E0 +5540 +55E0 +5540 +57E0 +5540 +5480 +5760 +9200 +91E0 +ENDCHAR +STARTCHAR U_3E16 +ENCODING 15894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +4BC0 +4640 +8640 +4BC0 +4A40 +33C0 +3240 +3240 +4A40 +87E0 +ENDCHAR +STARTCHAR U_3E17 +ENCODING 15895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1B00 +E0E0 +3F80 +2080 +3F80 +2A80 +2E80 +2180 +ENDCHAR +STARTCHAR U_3E18 +ENCODING 15896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1100 +E0E0 +3F80 +2A80 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_3E19 +ENCODING 15897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1100 +E4E0 +1F80 +0500 +FFE0 +1980 +6A80 +0F80 +ENDCHAR +STARTCHAR U_3E1A +ENCODING 15898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CB20 +30C0 +30C0 +4920 +8A20 +0000 +CA20 +3140 +3080 +4940 +8E20 +ENDCHAR +STARTCHAR U_3E1B +ENCODING 15899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +4BE0 +4920 +7920 +0A20 +FC40 +4BE0 +4A20 +4A20 +8BE0 +0A20 +ENDCHAR +STARTCHAR U_3E1C +ENCODING 15900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5080 +57E0 +55A0 +7240 +1420 +F3C0 +5080 +5080 +9080 +97E0 +ENDCHAR +STARTCHAR U_3E1D +ENCODING 15901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5100 +53E0 +7CA0 +4080 +7880 +4880 +4940 +8A20 +8C20 +ENDCHAR +STARTCHAR U_3E1E +ENCODING 15902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +5280 +7FE0 +4200 +7BC0 +4A40 +4A40 +8A40 +8C40 +ENDCHAR +STARTCHAR U_3E1F +ENCODING 15903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5260 +5380 +5220 +7DE0 +4000 +7BE0 +4A20 +4BE0 +8A20 +8BE0 +ENDCHAR +STARTCHAR U_3E20 +ENCODING 15904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5280 +5AA0 +76C0 +4280 +46C0 +7AA0 +5280 +5280 +54A0 +9860 +ENDCHAR +STARTCHAR U_3E21 +ENCODING 15905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5500 +57C0 +5500 +7900 +47E0 +7100 +5380 +5540 +9920 +9100 +ENDCHAR +STARTCHAR U_3E22 +ENCODING 15906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +53E0 +5140 +7BE0 +4100 +43E0 +7EA0 +4BE0 +4AA0 +8BE0 +82A0 +ENDCHAR +STARTCHAR U_3E23 +ENCODING 15907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1360 +5140 +57E0 +5140 +7BE0 +4080 +7BC0 +4880 +4FE0 +49C0 +86A0 +ENDCHAR +STARTCHAR U_3E24 +ENCODING 15908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4A40 +EAE0 +AAA0 +4F40 +E8E0 +4E40 +EAE0 +4A40 +4A40 +9240 +ENDCHAR +STARTCHAR U_3E25 +ENCODING 15909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +5280 +57E0 +5220 +7BE0 +4280 +73E0 +56A0 +53E0 +5140 +96E0 +ENDCHAR +STARTCHAR U_3E26 +ENCODING 15910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2400 +4400 +FFE0 +0400 +4400 +3400 +0E00 +05E0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3E27 +ENCODING 15911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1440 +57C0 +9440 +FC40 +37C0 +3520 +54C0 +9480 +1440 +3620 +ENDCHAR +STARTCHAR U_3E28 +ENCODING 15912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +5220 +5220 +7E20 +9220 +12E0 +1F20 +F020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U_3E29 +ENCODING 15913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +53E0 +5080 +7880 +9080 +1FE0 +F080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_3E2A +ENCODING 15914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +5220 +52A0 +7AA0 +92A0 +12A0 +3AA0 +D2A0 +12A0 +1420 +1820 +ENDCHAR +STARTCHAR U_3E2B +ENCODING 15915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A400 +FC00 +A7E0 +2480 +3C80 +E480 +2480 +2880 +2880 +ENDCHAR +STARTCHAR U_3E2C +ENCODING 15916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +F100 +A7C0 +2540 +3540 +E540 +25C0 +2100 +2100 +ENDCHAR +STARTCHAR U_3E2D +ENCODING 15917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A540 +FD40 +A540 +27C0 +3C00 +E400 +2400 +2420 +23E0 +ENDCHAR +STARTCHAR U_3E2E +ENCODING 15918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +A240 +FC40 +A420 +23C0 +3940 +E140 +2140 +2240 +24C0 +ENDCHAR +STARTCHAR U_3E2F +ENCODING 15919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +A280 +FC80 +A280 +20E0 +3F80 +E080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3E30 +ENCODING 15920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5080 +7BE0 +9420 +1200 +1A20 +7240 +9380 +1200 +1220 +13E0 +ENDCHAR +STARTCHAR U_3E31 +ENCODING 15921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +53E0 +7E80 +92E0 +1FA0 +F2A0 +12E0 +1280 +1220 +11E0 +ENDCHAR +STARTCHAR U_3E32 +ENCODING 15922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +A7E0 +F900 +A1C0 +2100 +3900 +E1E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_3E33 +ENCODING 15923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A440 +FA20 +A100 +2000 +3FC0 +E040 +2280 +2100 +2100 +ENDCHAR +STARTCHAR U_3E34 +ENCODING 15924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1000 +3F80 +D080 +1F80 +2400 +3F80 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E35 +ENCODING 15925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +A7E0 +F880 +A080 +23E0 +3800 +E3E0 +2220 +2220 +23E0 +ENDCHAR +STARTCHAR U_3E36 +ENCODING 15926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +A420 +FD20 +A7E0 +2520 +3DA0 +E660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3E37 +ENCODING 15927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +7120 +2120 +FA40 +2400 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E38 +ENCODING 15928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A400 +FC00 +A7E0 +2400 +3DE0 +E520 +2520 +2520 +29E0 +ENDCHAR +STARTCHAR U_3E39 +ENCODING 15929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +A720 +FD20 +A2C0 +2040 +3FE0 +E240 +2140 +2140 +2040 +20C0 +ENDCHAR +STARTCHAR U_3E3A +ENCODING 15930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +9540 +4960 +2180 +CE00 +4400 +7FC0 +8400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E3B +ENCODING 15931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +A3E0 +FA00 +A3C0 +2480 +3880 +E7E0 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_3E3C +ENCODING 15932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2640 +A180 +FE60 +A080 +27E0 +3880 +E3C0 +2080 +27E0 +2080 +ENDCHAR +STARTCHAR U_3E3D +ENCODING 15933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A440 +FFC0 +A440 +27C0 +3C40 +E440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_3E3E +ENCODING 15934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A120 +FB20 +A520 +2220 +3CC0 +E200 +2140 +2520 +2C40 +2BC0 +ENDCHAR +STARTCHAR U_3E3F +ENCODING 15935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A080 +FBC0 +A000 +3FE0 +E420 +23C0 +2240 +2240 +2460 +ENDCHAR +STARTCHAR U_3E40 +ENCODING 15936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +53E0 +7880 +93E0 +1420 +13C0 +1880 +37E0 +5080 +1280 +1180 +ENDCHAR +STARTCHAR U_3E41 +ENCODING 15937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +57E0 +7800 +D3C0 +1240 +1BC0 +3080 +51C0 +12A0 +1480 +1180 +ENDCHAR +STARTCHAR U_3E42 +ENCODING 15938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +E980 +9240 +FC20 +2400 +3F80 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E43 +ENCODING 15939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E44 +ENCODING 15940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +A7C0 +FD40 +A7C0 +2820 +37C0 +E440 +2B80 +2280 +2C60 +ENDCHAR +STARTCHAR U_3E45 +ENCODING 15941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7E0 +FAA0 +AEA0 +23A0 +3D60 +E240 +2120 +2AA0 +2A40 +29C0 +ENDCHAR +STARTCHAR U_3E46 +ENCODING 15942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A920 +FFC0 +A100 +27C0 +3D40 +E7C0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3E47 +ENCODING 15943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +FC40 +A7C0 +3C00 +E7E0 +2D20 +26A0 +27A0 +20C0 +ENDCHAR +STARTCHAR U_3E48 +ENCODING 15944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +79E0 +1340 +FD40 +5880 +9760 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E49 +ENCODING 15945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +A5E0 +FD20 +A5E0 +2520 +3DE0 +E480 +25C0 +2AA0 +2980 +ENDCHAR +STARTCHAR U_3E4A +ENCODING 15946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +F920 +AA80 +27E0 +3C80 +E7C0 +2480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_3E4B +ENCODING 15947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +25E0 +A920 +FAC0 +AB20 +3A40 +EBA0 +2A40 +29A0 +2840 +2980 +ENDCHAR +STARTCHAR U_3E4C +ENCODING 15948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A240 +FFE0 +A400 +3D40 +E7E0 +2440 +25E0 +2440 +2BE0 +ENDCHAR +STARTCHAR U_3E4D +ENCODING 15949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +FFE0 +A920 +2FE0 +3920 +EBA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3E4E +ENCODING 15950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A540 +FFC0 +A540 +27C0 +3A80 +E7C0 +2480 +2FC0 +2940 +3320 +ENDCHAR +STARTCHAR U_3E4F +ENCODING 15951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +A7E0 +FA40 +A3C0 +24A0 +3CA0 +E7E0 +2080 +27C0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3E50 +ENCODING 15952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3480 +CB60 +3100 +E5C0 +2700 +24E0 +4400 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E51 +ENCODING 15953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +AFE0 +F080 +AE80 +2080 +3F80 +EA80 +2E40 +2A40 +2E60 +3120 +ENDCHAR +STARTCHAR U_3E52 +ENCODING 15954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +A280 +FFE0 +A280 +27C0 +3900 +E7C0 +2100 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_3E53 +ENCODING 15955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +FFE0 +A240 +3FE0 +E240 +2FE0 +2280 +22A0 +2C60 +ENDCHAR +STARTCHAR U_3E54 +ENCODING 15956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A540 +F7C0 +A540 +2FE0 +3000 +E7C0 +2540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_3E55 +ENCODING 15957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +0200 +FFC0 +5540 +57C0 +9820 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E56 +ENCODING 15958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A100 +FFE0 +A440 +3FA0 +E320 +2CC0 +23C0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_3E57 +ENCODING 15959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +F7E0 +A120 +3FE0 +E040 +2FE0 +2A40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_3E58 +ENCODING 15960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +FBA0 +A540 +3FE0 +E200 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_3E59 +ENCODING 15961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +A7C0 +F540 +A920 +2FE0 +3820 +E7C0 +2540 +26C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3E5A +ENCODING 15962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +27C0 +A540 +F920 +AFE0 +3820 +E380 +2280 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3E5B +ENCODING 15963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +FBE0 +AAA0 +2FE0 +3A80 +EFE0 +2A40 +3660 +2180 +2660 +ENDCHAR +STARTCHAR U_3E5C +ENCODING 15964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2940 +2520 +FFE0 +2100 +2100 +2100 +5280 +4A80 +8440 +9820 +ENDCHAR +STARTCHAR U_3E5D +ENCODING 15965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5680 +2480 +6480 +9480 +37E0 +5480 +9480 +1480 +6560 +2620 +ENDCHAR +STARTCHAR U_3E5E +ENCODING 15966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5600 +2400 +6400 +97E0 +3480 +5480 +9480 +1480 +6880 +2880 +ENDCHAR +STARTCHAR U_3E5F +ENCODING 15967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +6140 +9140 +3140 +5FE0 +9100 +1280 +6440 +3820 +ENDCHAR +STARTCHAR U_3E60 +ENCODING 15968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2FE0 +2100 +5540 +9540 +37C0 +5540 +9100 +5120 +20E0 +ENDCHAR +STARTCHAR U_3E61 +ENCODING 15969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +2100 +5200 +9440 +3280 +5100 +9240 +5420 +27E0 +ENDCHAR +STARTCHAR U_3E62 +ENCODING 15970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A800 +4800 +7EE0 +AAA0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +CAE0 +5600 +ENDCHAR +STARTCHAR U_3E63 +ENCODING 15971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +57C0 +2440 +2A80 +5100 +9280 +3D60 +5080 +9200 +5100 +2080 +ENDCHAR +STARTCHAR U_3E64 +ENCODING 15972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +2100 +5100 +9FE0 +3100 +5200 +9280 +6440 +27C0 +ENDCHAR +STARTCHAR U_3E65 +ENCODING 15973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +2100 +5100 +9100 +37C0 +5100 +9100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_3E66 +ENCODING 15974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +57E0 +2120 +5120 +9220 +3460 +5000 +97E0 +1420 +5420 +27E0 +ENDCHAR +STARTCHAR U_3E67 +ENCODING 15975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +6540 +9540 +3540 +5FE0 +9100 +1280 +6440 +3820 +ENDCHAR +STARTCHAR U_3E68 +ENCODING 15976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2100 +67E0 +9520 +3520 +57E0 +9520 +1520 +67E0 +2420 +ENDCHAR +STARTCHAR U_3E69 +ENCODING 15977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +2280 +6380 +9C60 +3100 +5100 +97C0 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_3E6A +ENCODING 15978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AEE0 +6AA0 +4AA0 +AAA0 +2AA0 +7FE0 +6AA0 +AAA0 +2AA0 +AAA0 +5760 +ENDCHAR +STARTCHAR U_3E6B +ENCODING 15979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2100 +67C0 +9140 +37C0 +5500 +97E0 +1120 +62C0 +2C60 +ENDCHAR +STARTCHAR U_3E6C +ENCODING 15980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5080 +27E0 +5080 +97E0 +34A0 +57E0 +9280 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_3E6D +ENCODING 15981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +5540 +97C0 +3540 +57C0 +9140 +1180 +52A0 +2C60 +ENDCHAR +STARTCHAR U_3E6E +ENCODING 15982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2200 +57C0 +9440 +3440 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_3E6F +ENCODING 15983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5280 +2480 +5DE0 +9480 +3480 +55C0 +96A0 +1480 +6480 +2480 +ENDCHAR +STARTCHAR U_3E70 +ENCODING 15984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5540 +2540 +6100 +9FE0 +3280 +5280 +9280 +1280 +64A0 +4860 +ENDCHAR +STARTCHAR U_3E71 +ENCODING 15985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +2440 +67C0 +9100 +3500 +55C0 +9500 +1500 +6F00 +30E0 +ENDCHAR +STARTCHAR U_3E72 +ENCODING 15986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +57C0 +2240 +6FE0 +9100 +37C0 +5880 +97E0 +1080 +6080 +2180 +ENDCHAR +STARTCHAR U_3E73 +ENCODING 15987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +27C0 +6140 +9240 +37E0 +5000 +97C0 +1440 +67C0 +2440 +ENDCHAR +STARTCHAR U_3E74 +ENCODING 15988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +27C0 +6540 +97C0 +3540 +57C0 +9500 +1300 +6280 +4C60 +ENDCHAR +STARTCHAR U_3E75 +ENCODING 15989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +52A0 +2540 +6540 +92A0 +3000 +57E0 +9080 +1080 +6080 +47E0 +ENDCHAR +STARTCHAR U_3E76 +ENCODING 15990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A000 +6060 +3DC0 +6440 +A840 +3DE0 +6440 +A440 +37E0 +AC00 +53E0 +ENDCHAR +STARTCHAR U_3E77 +ENCODING 15991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CC80 +30C0 +CCA0 +23E0 +FC80 +5080 +FC80 +5480 +5540 +5940 +1620 +ENDCHAR +STARTCHAR U_3E78 +ENCODING 15992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +57C0 +2440 +67C0 +9440 +37C0 +5280 +9280 +1280 +64A0 +2860 +ENDCHAR +STARTCHAR U_3E79 +ENCODING 15993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2500 +67C0 +9540 +37E0 +5540 +97C0 +1500 +5A80 +3460 +ENDCHAR +STARTCHAR U_3E7A +ENCODING 15994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5120 +2F40 +6380 +9540 +1920 +37C0 +5440 +97C0 +5440 +27C0 +ENDCHAR +STARTCHAR U_3E7B +ENCODING 15995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5700 +2100 +2FE0 +5540 +9920 +3240 +57E0 +9240 +5180 +2660 +ENDCHAR +STARTCHAR U_3E7C +ENCODING 15996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +5400 +27E0 +6920 +9560 +37E0 +5320 +95A0 +1960 +5120 +20C0 +ENDCHAR +STARTCHAR U_3E7D +ENCODING 15997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9140 +57E0 +2140 +61A0 +9660 +3100 +5140 +97E0 +1140 +51A0 +2660 +ENDCHAR +STARTCHAR U_3E7E +ENCODING 15998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5740 +2560 +6D40 +9240 +35C0 +5860 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_3E7F +ENCODING 15999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +53C0 +2200 +67C0 +9440 +37C0 +5440 +97C0 +1100 +5FE0 +2100 +ENDCHAR +STARTCHAR U_3E80 +ENCODING 16000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +57E0 +2AA0 +6AA0 +92A0 +3540 +5200 +9120 +1520 +6C40 +2BC0 +ENDCHAR +STARTCHAR U_3E81 +ENCODING 16001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92A0 +5540 +2540 +62A0 +92A0 +3400 +57E0 +9560 +14A0 +5560 +27E0 +ENDCHAR +STARTCHAR U_3E82 +ENCODING 16002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +50A0 +27E0 +6480 +9780 +34A0 +57A0 +94C0 +1780 +68E0 +4B20 +ENDCHAR +STARTCHAR U_3E83 +ENCODING 16003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5FE0 +2280 +6400 +97E0 +3820 +57A0 +94A0 +17A0 +5020 +20C0 +ENDCHAR +STARTCHAR U_3E84 +ENCODING 16004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A300 +6480 +2840 +77A0 +A000 +2E20 +6AA0 +AEA0 +2AA0 +AE20 +4A60 +ENDCHAR +STARTCHAR U_3E85 +ENCODING 16005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5380 +2480 +6FE0 +9500 +35C0 +5680 +97E0 +1480 +6940 +2E20 +ENDCHAR +STARTCHAR U_3E86 +ENCODING 16006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5240 +2EE0 +6440 +96A0 +3520 +57C0 +9540 +1540 +6280 +2C60 +ENDCHAR +STARTCHAR U_3E87 +ENCODING 16007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5EC0 +34A0 +5480 +9FE0 +3280 +5E80 +9480 +1540 +7F40 +2220 +ENDCHAR +STARTCHAR U_3E88 +ENCODING 16008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5540 +27C0 +6100 +9FE0 +3100 +57C0 +9540 +17C0 +6120 +4FE0 +ENDCHAR +STARTCHAR U_3E89 +ENCODING 16009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +FA40 +8C20 +73C0 +2A40 +FA40 +2180 +5180 +8E60 +ENDCHAR +STARTCHAR U_3E8A +ENCODING 16010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5280 +2FE0 +6100 +97C0 +3100 +5FE0 +9240 +1520 +6C40 +4BC0 +ENDCHAR +STARTCHAR U_3E8B +ENCODING 16011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5440 +29A0 +6240 +97C0 +1000 +3FE0 +55A0 +9360 +5DA0 +2360 +ENDCHAR +STARTCHAR U_3E8C +ENCODING 16012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +57E0 +2280 +67E0 +92A0 +3FE0 +52A0 +97E0 +16C0 +5AA0 +2280 +ENDCHAR +STARTCHAR U_3E8D +ENCODING 16013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2820 +6780 +9400 +37C0 +5480 +9480 +1FE0 +6440 +2820 +ENDCHAR +STARTCHAR U_3E8E +ENCODING 16014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2540 +67E0 +9540 +37C0 +5540 +97C0 +1540 +AFC0 +4940 +ENDCHAR +STARTCHAR U_3E8F +ENCODING 16015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57C0 +2540 +6FE0 +9540 +37C0 +5540 +9FE0 +1440 +6380 +2C60 +ENDCHAR +STARTCHAR U_3E90 +ENCODING 16016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +6A80 +4540 +A7C0 +2540 +67C0 +A540 +27C0 +A100 +CFE0 +8540 +ENDCHAR +STARTCHAR U_3E91 +ENCODING 16017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +57E0 +2520 +5EE0 +9380 +34C0 +5B20 +9080 +1340 +6080 +2700 +ENDCHAR +STARTCHAR U_3E92 +ENCODING 16018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +55A0 +2360 +6DA0 +9100 +3280 +5D60 +9280 +1340 +A080 +4700 +ENDCHAR +STARTCHAR U_3E93 +ENCODING 16019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2100 +67C0 +9100 +3FE0 +5440 +97C0 +1440 +A7C0 +4820 +ENDCHAR +STARTCHAR U_3E94 +ENCODING 16020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +5540 +2380 +6480 +97C0 +3440 +57E0 +94A0 +16A0 +6A20 +4840 +ENDCHAR +STARTCHAR U_3E95 +ENCODING 16021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90E0 +5F40 +2540 +6FE0 +9540 +3920 +57C0 +9540 +17C0 +6540 +27C0 +ENDCHAR +STARTCHAR U_3E96 +ENCODING 16022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A680 +6280 +5FE0 +AAA0 +2EA0 +6AA0 +AE40 +2A40 +3FA0 +A2A0 +4320 +ENDCHAR +STARTCHAR U_3E97 +ENCODING 16023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2FE0 +6540 +97C0 +3540 +57C0 +9100 +1FE0 +5100 +2100 +ENDCHAR +STARTCHAR U_3E98 +ENCODING 16024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +57E0 +2C80 +27C0 +5480 +97C0 +3480 +57E0 +9000 +5AA0 +2AA0 +ENDCHAR +STARTCHAR U_3E99 +ENCODING 16025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2820 +67C0 +9540 +3FE0 +5540 +97C0 +1540 +66C0 +4C60 +ENDCHAR +STARTCHAR U_3E9A +ENCODING 16026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +53E0 +2880 +63E0 +BD40 +2BE0 +6880 +ABE0 +2880 +AC80 +53E0 +ENDCHAR +STARTCHAR U_3E9B +ENCODING 16027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5480 +27C0 +6480 +97E0 +3AA0 +50C0 +9240 +1FE0 +5240 +2440 +ENDCHAR +STARTCHAR U_3E9C +ENCODING 16028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +5FE0 +2AA0 +6FE0 +AAA0 +2FC0 +6800 +AFE0 +2AA0 +AA40 +5320 +ENDCHAR +STARTCHAR U_3E9D +ENCODING 16029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F40 +5A40 +2F60 +6940 +AFA0 +2A20 +6F00 +A000 +2FE0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_3E9E +ENCODING 16030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5660 +2BA0 +6E60 +ABA0 +2CE0 +6AA0 +BFE0 +2440 +A820 +5020 +ENDCHAR +STARTCHAR U_3E9F +ENCODING 16031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +55A0 +2360 +65A0 +9520 +3C80 +57E0 +9480 +17E0 +5480 +27E0 +ENDCHAR +STARTCHAR U_3EA0 +ENCODING 16032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +34A0 +6860 +A600 +3CE0 +6BC0 +AAA0 +2AA0 +AEE0 +42A0 +ENDCHAR +STARTCHAR U_3EA1 +ENCODING 16033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +54A0 +27C0 +6540 +97E0 +3540 +57E0 +9440 +1560 +6940 +2BE0 +ENDCHAR +STARTCHAR U_3EA2 +ENCODING 16034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +2FE0 +6D60 +9780 +3540 +5FE0 +9480 +17C0 +5480 +27E0 +ENDCHAR +STARTCHAR U_3EA3 +ENCODING 16035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +96C0 +54A0 +3E80 +55E0 +9E80 +30A0 +5EA0 +92C0 +1E80 +6B60 +3E20 +ENDCHAR +STARTCHAR U_3EA4 +ENCODING 16036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +3FE0 +6A80 +BB80 +2AA0 +7BA0 +AAA0 +3BC0 +AA60 +5FA0 +ENDCHAR +STARTCHAR U_3EA5 +ENCODING 16037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9380 +5480 +27C0 +6440 +97C0 +34A0 +5FE0 +9540 +17C0 +62A0 +4CE0 +ENDCHAR +STARTCHAR U_3EA6 +ENCODING 16038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9D40 +5540 +36A0 +7FE0 +9540 +3EA0 +57E0 +9540 +1F60 +B540 +4640 +ENDCHAR +STARTCHAR U_3EA7 +ENCODING 16039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2FE0 +5200 +97C0 +3540 +5FE0 +9440 +1EE0 +6AA0 +4EE0 +ENDCHAR +STARTCHAR U_3EA8 +ENCODING 16040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2100 +2100 +2200 +F200 +2200 +2400 +3C40 +E4E0 +0720 +ENDCHAR +STARTCHAR U_3EA9 +ENCODING 16041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +1220 +1220 +1220 +7A20 +1260 +12A0 +1320 +1C20 +E020 +0020 +ENDCHAR +STARTCHAR U_3EAA +ENCODING 16042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2100 +2100 +2180 +F940 +2120 +2100 +3900 +E100 +0100 +ENDCHAR +STARTCHAR U_3EAB +ENCODING 16043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FC20 +1020 +1120 +1120 +7D20 +1120 +1120 +1C20 +E020 +0060 +ENDCHAR +STARTCHAR U_3EAC +ENCODING 16044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +4480 +4480 +4680 +F580 +4480 +44A0 +74A0 +C8A0 +10E0 +ENDCHAR +STARTCHAR U_3EAD +ENCODING 16045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2040 +2080 +2080 +F880 +27E0 +2080 +2080 +3880 +E080 +0180 +ENDCHAR +STARTCHAR U_3EAE +ENCODING 16046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2000 +2000 +27E0 +F100 +2200 +23C0 +2040 +3840 +E040 +0180 +ENDCHAR +STARTCHAR U_3EAF +ENCODING 16047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3EB0 +ENCODING 16048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +2080 +23E0 +22A0 +72A0 +22A0 +2AA0 +32A0 +C080 +0080 +ENDCHAR +STARTCHAR U_3EB1 +ENCODING 16049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4480 +C5C0 +4840 +4B40 +5080 +7FC0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EB2 +ENCODING 16050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F240 +4240 +4240 +F240 +4FC0 +4240 +5240 +6240 +8240 +0FE0 +ENDCHAR +STARTCHAR U_3EB3 +ENCODING 16051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +41E0 +4100 +F100 +47C0 +4440 +5280 +6100 +82C0 +0C20 +ENDCHAR +STARTCHAR U_3EB4 +ENCODING 16052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0140 +F900 +27E0 +2100 +F900 +2100 +2280 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_3EB5 +ENCODING 16053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F7E0 +4420 +4940 +F100 +4100 +4280 +7280 +C440 +1820 +ENDCHAR +STARTCHAR U_3EB6 +ENCODING 16054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0280 +F180 +4480 +4280 +F080 +47E0 +4080 +7080 +C080 +0080 +ENDCHAR +STARTCHAR U_3EB7 +ENCODING 16055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +F7E0 +4100 +4100 +F380 +4540 +4920 +7100 +C100 +0100 +ENDCHAR +STARTCHAR U_3EB8 +ENCODING 16056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +2480 +E680 +2580 +24A0 +2860 +7FC0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EB9 +ENCODING 16057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA40 +2420 +27E0 +FA40 +2240 +27E0 +2240 +3A40 +C240 +0440 +ENDCHAR +STARTCHAR U_3EBA +ENCODING 16058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +4420 +47E0 +F420 +4420 +47E0 +4420 +7420 +C7E0 +0420 +ENDCHAR +STARTCHAR U_3EBB +ENCODING 16059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +4FE0 +4100 +47E0 +F520 +4520 +4520 +7520 +C560 +0100 +ENDCHAR +STARTCHAR U_3EBC +ENCODING 16060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F120 +4140 +4100 +4500 +F5C0 +4500 +4500 +7700 +C980 +1060 +ENDCHAR +STARTCHAR U_3EBD +ENCODING 16061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +4100 +4300 +4580 +F940 +4120 +4100 +7100 +C000 +0FE0 +ENDCHAR +STARTCHAR U_3EBE +ENCODING 16062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4820 +4BA0 +4AA0 +FAA0 +4BA0 +4820 +7820 +C820 +0860 +ENDCHAR +STARTCHAR U_3EBF +ENCODING 16063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F900 +4900 +4BC0 +4A40 +FA40 +4A40 +4BC0 +7900 +C900 +0FE0 +ENDCHAR +STARTCHAR U_3EC0 +ENCODING 16064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F7C0 +4540 +47C0 +F540 +47C0 +4100 +7500 +C200 +0DE0 +ENDCHAR +STARTCHAR U_3EC1 +ENCODING 16065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2820 +2BA0 +FAA0 +2AA0 +2AA0 +2BA0 +3820 +C820 +0FE0 +ENDCHAR +STARTCHAR U_3EC2 +ENCODING 16066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +F240 +27E0 +2240 +F240 +2FE0 +2240 +2240 +3240 +C440 +0840 +ENDCHAR +STARTCHAR U_3EC3 +ENCODING 16067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FC0 +7FC0 +4A40 +7FC0 +0000 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EC4 +ENCODING 16068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +2000 +27E0 +F080 +2280 +22E0 +2280 +3680 +C580 +0860 +ENDCHAR +STARTCHAR U_3EC5 +ENCODING 16069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F300 +4480 +4860 +F780 +4000 +4FC0 +7200 +C480 +0F40 +ENDCHAR +STARTCHAR U_3EC6 +ENCODING 16070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0240 +F420 +27E0 +2000 +F7E0 +2420 +27E0 +3420 +C7E0 +0460 +ENDCHAR +STARTCHAR U_3EC7 +ENCODING 16071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2280 +2C60 +F7C0 +2100 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_3EC8 +ENCODING 16072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +2400 +27E0 +2400 +F400 +25E0 +2520 +3520 +C520 +09E0 +ENDCHAR +STARTCHAR U_3EC9 +ENCODING 16073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +25C0 +2500 +2FE0 +F100 +2520 +2540 +3180 +C100 +0E00 +ENDCHAR +STARTCHAR U_3ECA +ENCODING 16074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +2480 +2FE0 +2920 +F920 +2FE0 +2300 +3300 +C520 +19E0 +ENDCHAR +STARTCHAR U_3ECB +ENCODING 16075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2100 +2FE0 +F920 +2FE0 +2300 +3580 +C940 +1120 +ENDCHAR +STARTCHAR U_3ECC +ENCODING 16076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +2FE0 +F100 +2100 +2FE0 +2100 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_3ECD +ENCODING 16077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2000 +F7C0 +2100 +2FE0 +2100 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_3ECE +ENCODING 16078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +2480 +75C0 +2480 +35C0 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3ECF +ENCODING 16079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +27C0 +2040 +F7C0 +2100 +2520 +2940 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_3ED0 +ENCODING 16080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +27E0 +2280 +F440 +2A20 +23C0 +2440 +3280 +C100 +0EE0 +ENDCHAR +STARTCHAR U_3ED1 +ENCODING 16081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2380 +F540 +2920 +27C0 +2080 +3FE0 +C100 +0300 +ENDCHAR +STARTCHAR U_3ED2 +ENCODING 16082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F8A0 +2B20 +2920 +FFE0 +2920 +2BA0 +2D60 +3920 +CFE0 +0820 +ENDCHAR +STARTCHAR U_3ED3 +ENCODING 16083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +4AA0 +4EA0 +EAA0 +4E40 +4A40 +4A40 +6E40 +D2A0 +0320 +ENDCHAR +STARTCHAR U_3ED4 +ENCODING 16084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2100 +F540 +2FE0 +2540 +2100 +3FE0 +C100 +07C0 +ENDCHAR +STARTCHAR U_3ED5 +ENCODING 16085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2480 +F6A0 +26A0 +27E0 +2480 +36A0 +C6A0 +0BE0 +ENDCHAR +STARTCHAR U_3ED6 +ENCODING 16086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2140 +2FE0 +F140 +27C0 +2100 +2540 +3380 +C540 +0B20 +ENDCHAR +STARTCHAR U_3ED7 +ENCODING 16087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +71C0 +F1E0 +1100 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3ED8 +ENCODING 16088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_3ED9 +ENCODING 16089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27E0 +F000 +27C0 +2440 +27C0 +3440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_3EDA +ENCODING 16090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2AA0 +2EE0 +FAA0 +2AA0 +2EE0 +2AA0 +3AA0 +CAA0 +1320 +ENDCHAR +STARTCHAR U_3EDB +ENCODING 16091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2400 +27E0 +2AA0 +34A0 +C920 +02C0 +ENDCHAR +STARTCHAR U_3EDC +ENCODING 16092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +24C0 +2B20 +F100 +2100 +25C0 +2500 +3500 +CB00 +10E0 +ENDCHAR +STARTCHAR U_3EDD +ENCODING 16093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FFA0 +2260 +2FE0 +FAE0 +2AE0 +2FE0 +2260 +3760 +CAA0 +1260 +ENDCHAR +STARTCHAR U_3EDE +ENCODING 16094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2420 +27E0 +F400 +27E0 +25A0 +25A0 +37E0 +CDA0 +1420 +ENDCHAR +STARTCHAR U_3EDF +ENCODING 16095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2200 +25C0 +F880 +27E0 +2240 +23C0 +3240 +C3C0 +0240 +ENDCHAR +STARTCHAR U_3EE0 +ENCODING 16096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +03E0 +FA20 +2140 +22A0 +F8C0 +23E0 +2080 +F940 +0220 +0420 +ENDCHAR +STARTCHAR U_3EE1 +ENCODING 16097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +0FE0 +E540 +45C0 +4400 +E7E0 +4100 +4FE0 +6100 +8540 +0920 +ENDCHAR +STARTCHAR U_3EE2 +ENCODING 16098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0EE0 +E500 +4500 +4680 +EBE0 +4AA0 +4AA0 +EA80 +12A0 +06E0 +ENDCHAR +STARTCHAR U_3EE3 +ENCODING 16099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +23C0 +F240 +23C0 +2240 +2FE0 +3540 +C620 +07E0 +ENDCHAR +STARTCHAR U_3EE4 +ENCODING 16100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +2100 +F3E0 +2420 +2BA0 +22A0 +33A0 +C0A0 +0040 +ENDCHAR +STARTCHAR U_3EE5 +ENCODING 16101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2280 +FFE0 +2AA0 +2CE0 +2820 +3FE0 +C820 +0FE0 +ENDCHAR +STARTCHAR U_3EE6 +ENCODING 16102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2920 +FFE0 +2100 +2FE0 +29A0 +39E0 +CF20 +0860 +ENDCHAR +STARTCHAR U_3EE7 +ENCODING 16103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F740 +25E0 +2D40 +F3E0 +2640 +2140 +2FE0 +3380 +C540 +0920 +ENDCHAR +STARTCHAR U_3EE8 +ENCODING 16104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +FD40 +8A80 +F940 +A220 +FFC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EE9 +ENCODING 16105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E500 +5FE0 +4500 +EFC0 +4540 +5FE0 +4540 +6FC0 +8D80 +1560 +ENDCHAR +STARTCHAR U_3EEA +ENCODING 16106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F7E0 +2C80 +27E0 +F7E0 +2480 +2FE0 +2280 +32E0 +C420 +0860 +ENDCHAR +STARTCHAR U_3EEB +ENCODING 16107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +4FE0 +4920 +EFE0 +4540 +5FE0 +4540 +6FE0 +87C0 +0100 +ENDCHAR +STARTCHAR U_3EEC +ENCODING 16108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2BA0 +F540 +27C0 +2FE0 +2200 +37C0 +C040 +01C0 +ENDCHAR +STARTCHAR U_3EED +ENCODING 16109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4100 +4AA0 +E540 +4AA0 +47C0 +4100 +6FE0 +8100 +0100 +ENDCHAR +STARTCHAR U_3EEE +ENCODING 16110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFE0 +4920 +56C0 +EA40 +47A0 +5800 +4FE0 +6500 +8940 +1120 +ENDCHAR +STARTCHAR U_3EEF +ENCODING 16111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +5FE0 +5420 +FFC0 +5400 +53C0 +5540 +7FE0 +9100 +2300 +ENDCHAR +STARTCHAR U_3EF0 +ENCODING 16112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +4440 +4EE0 +E440 +4CE0 +4780 +4040 +6FE0 +C040 +07C0 +ENDCHAR +STARTCHAR U_3EF1 +ENCODING 16113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E9C0 +4340 +5CC0 +E920 +4A80 +4BE0 +4880 +6BE0 +8C80 +13E0 +ENDCHAR +STARTCHAR U_3EF2 +ENCODING 16114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +4D60 +47C0 +E100 +47C0 +4540 +4FE0 +6480 +8380 +0E40 +ENDCHAR +STARTCHAR U_3EF3 +ENCODING 16115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +4480 +4E20 +E4A0 +5EA0 +44A0 +4EA0 +6D20 +9420 +0460 +ENDCHAR +STARTCHAR U_3EF4 +ENCODING 16116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +47C0 +4440 +4FE0 +EAA0 +4FE0 +47C0 +6440 +8380 +0C60 +ENDCHAR +STARTCHAR U_3EF5 +ENCODING 16117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +4FE0 +4840 +EFE0 +4880 +4FE0 +4A40 +6FE0 +8A40 +16C0 +ENDCHAR +STARTCHAR U_3EF6 +ENCODING 16118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +F540 +4FE0 +4240 +FFE0 +4240 +4FC0 +7200 +CFE0 +0200 +ENDCHAR +STARTCHAR U_3EF7 +ENCODING 16119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +5FE0 +56A0 +F6A0 +56A0 +45C0 +6EA0 +95A0 +0480 +ENDCHAR +STARTCHAR U_3EF8 +ENCODING 16120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +1540 +F540 +5FE0 +4CC0 +F560 +4FC0 +4840 +7FC0 +C840 +0FC0 +ENDCHAR +STARTCHAR U_3EF9 +ENCODING 16121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +3A80 +6DC0 +BAA0 +0100 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EFA +ENCODING 16122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +4200 +5FC0 +4280 +BFE0 +ENDCHAR +STARTCHAR U_3EFB +ENCODING 16123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1F80 +E080 +4EE0 +4BA0 +EEA0 +42A0 +4440 +7F40 +C4A0 +0D20 +ENDCHAR +STARTCHAR U_3EFC +ENCODING 16124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +4AA0 +4FE0 +E440 +47C0 +4440 +6FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_3EFD +ENCODING 16125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +E900 +5FC0 +4900 +EFE0 +4000 +4EE0 +EBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_3EFE +ENCODING 16126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1280 +7FE0 +2BC0 +1280 +FFE0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EFF +ENCODING 16127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +4400 +4FE0 +F220 +4FA0 +4AA0 +EFA0 +02A0 +0FE0 +ENDCHAR +STARTCHAR U_3F00 +ENCODING 16128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0BC0 +E100 +47E0 +5A80 +EFE0 +4900 +4FC0 +6900 +D500 +23E0 +ENDCHAR +STARTCHAR U_3F01 +ENCODING 16129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2100 +27C0 +2100 +F7E0 +22A0 +2FE0 +32A0 +CF40 +04A0 +ENDCHAR +STARTCHAR U_3F02 +ENCODING 16130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +36C0 +4440 +77C0 +4540 +FFE0 +8020 +3F80 +0400 +1F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3F03 +ENCODING 16131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +22A0 +27E0 +26A0 +F520 +27E0 +2540 +37C0 +E560 +07A0 +ENDCHAR +STARTCHAR U_3F04 +ENCODING 16132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +2FE0 +2140 +FFE0 +2A80 +2FA0 +3AC0 +CFE0 +0120 +ENDCHAR +STARTCHAR U_3F05 +ENCODING 16133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A40 +2FE0 +2A40 +FFE0 +2AA0 +2BE0 +3AA0 +CBE0 +1420 +ENDCHAR +STARTCHAR U_3F06 +ENCODING 16134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F7C0 +2540 +2920 +2FE0 +F820 +27C0 +2100 +37C0 +C140 +0FE0 +ENDCHAR +STARTCHAR U_3F07 +ENCODING 16135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +F7E0 +2280 +2FE0 +2480 +F7E0 +2480 +27E0 +3660 +C5A0 +0420 +ENDCHAR +STARTCHAR U_3F08 +ENCODING 16136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FE0 +2540 +29E0 +FF40 +25E0 +2940 +3FE0 +D540 +15E0 +ENDCHAR +STARTCHAR U_3F09 +ENCODING 16137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7880 +5BE0 +56A0 +5480 +5480 +55A0 +56E0 +6A00 +B900 +80E0 +ENDCHAR +STARTCHAR U_3F0A +ENCODING 16138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +AD40 +AD40 +FD40 +A540 +2EC0 +3BA0 +1020 +ENDCHAR +STARTCHAR U_3F0B +ENCODING 16139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4740 +FD40 +4540 +4540 +F540 +9540 +9540 +96C0 +F7A0 +9820 +ENDCHAR +STARTCHAR U_3F0C +ENCODING 16140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +A740 +B540 +B540 +B540 +AD40 +AD40 +A540 +D6A0 +FBA0 +8820 +ENDCHAR +STARTCHAR U_3F0D +ENCODING 16141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +FF40 +2540 +7540 +2540 +FD40 +2540 +7540 +6EA0 +ABA0 +2820 +ENDCHAR +STARTCHAR U_3F0E +ENCODING 16142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +7480 +57E0 +5540 +5760 +5540 +5480 +5540 +6E20 +BB00 +80E0 +ENDCHAR +STARTCHAR U_3F0F +ENCODING 16143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38E0 +CF40 +B540 +5540 +5540 +FD40 +5540 +D540 +36A0 +4BA0 +8820 +ENDCHAR +STARTCHAR U_3F10 +ENCODING 16144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +8D40 +FD40 +8540 +8540 +FD40 +A940 +FAA0 +ABA0 +A820 +ENDCHAR +STARTCHAR U_3F11 +ENCODING 16145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FF40 +1540 +FD40 +D540 +BD40 +FD40 +3540 +5EA0 +97A0 +1820 +ENDCHAR +STARTCHAR U_3F12 +ENCODING 16146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DC0 +7540 +55C0 +5540 +57E0 +5500 +55E0 +56A0 +6D20 +BB40 +80E0 +ENDCHAR +STARTCHAR U_3F13 +ENCODING 16147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +AFE0 +AA80 +AFE0 +AAA0 +AFE0 +AAA0 +A7E0 +D6C0 +FAA0 +8280 +ENDCHAR +STARTCHAR U_3F14 +ENCODING 16148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9740 +F540 +9540 +F540 +0540 +FD40 +A940 +AAA0 +FBA0 +0820 +ENDCHAR +STARTCHAR U_3F15 +ENCODING 16149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +A7C0 +FD40 +8D40 +7540 +5540 +FD40 +AA40 +FAA0 +ABA0 +F820 +ENDCHAR +STARTCHAR U_3F16 +ENCODING 16150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3B80 +F480 +AFE0 +AB40 +ADA0 +AA80 +AFE0 +AAA0 +DFE0 +F2A0 +8FE0 +ENDCHAR +STARTCHAR U_3F17 +ENCODING 16151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA00 +2200 +23C0 +2240 +2340 +24C0 +2440 +2440 +2540 +6660 +ENDCHAR +STARTCHAR U_3F18 +ENCODING 16152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +2100 +A9C0 +A940 +A940 +AB40 +AAC0 +FA40 +8A40 +0360 +ENDCHAR +STARTCHAR U_3F19 +ENCODING 16153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2100 +F900 +A9C0 +A940 +A940 +AAC0 +BA40 +2240 +2360 +ENDCHAR +STARTCHAR U_3F1A +ENCODING 16154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +2100 +F900 +01C0 +7140 +5140 +52C0 +5240 +9A40 +9360 +ENDCHAR +STARTCHAR U_3F1B +ENCODING 16155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +4900 +49C0 +4940 +FD40 +4940 +4AC0 +4A40 +8A40 +8B60 +ENDCHAR +STARTCHAR U_3F1C +ENCODING 16156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +1100 +3F80 +D060 +1E00 +2A00 +2640 +31C0 +ENDCHAR +STARTCHAR U_3F1D +ENCODING 16157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +CA40 +32A0 +E3E0 +0000 +FFE0 +1000 +1F00 +1500 +2340 +30C0 +ENDCHAR +STARTCHAR U_3F1E +ENCODING 16158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +A900 +7100 +21C0 +FA40 +2340 +22C0 +2240 +2240 +2360 +ENDCHAR +STARTCHAR U_3F1F +ENCODING 16159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +F200 +9200 +93C0 +F240 +9340 +94C0 +9440 +F540 +0660 +ENDCHAR +STARTCHAR U_3F20 +ENCODING 16160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +8900 +41C0 +7940 +4340 +42C0 +5A40 +6240 +0360 +ENDCHAR +STARTCHAR U_3F21 +ENCODING 16161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +57E0 +7900 +9100 +11C0 +FD40 +3340 +3AC0 +5640 +9240 +1360 +ENDCHAR +STARTCHAR U_3F22 +ENCODING 16162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +9100 +91C0 +B940 +A940 +BAC0 +9240 +9240 +FA40 +0360 +ENDCHAR +STARTCHAR U_3F23 +ENCODING 16163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +F9C0 +8940 +8940 +FAC0 +8A40 +8A40 +FAC0 +0360 +ENDCHAR +STARTCHAR U_3F24 +ENCODING 16164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +1120 +7920 +1240 +FFE0 +0800 +1F00 +1500 +2320 +38E0 +ENDCHAR +STARTCHAR U_3F25 +ENCODING 16165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +7900 +2900 +FDC0 +4140 +FB40 +22C0 +7A40 +0A40 +3360 +ENDCHAR +STARTCHAR U_3F26 +ENCODING 16166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2340 +3AC0 +E460 +0800 +FFE0 +0800 +1F00 +1500 +2320 +30E0 +ENDCHAR +STARTCHAR U_3F27 +ENCODING 16167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +2100 +F9C0 +A940 +F940 +AB40 +FAC0 +AA40 +AA40 +9B60 +ENDCHAR +STARTCHAR U_3F28 +ENCODING 16168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57C0 +AA00 +F200 +1380 +2280 +F680 +9580 +9480 +F4A0 +9660 +ENDCHAR +STARTCHAR U_3F29 +ENCODING 16169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +17E0 +1100 +FD00 +91C0 +9540 +EEC0 +AA40 +AA40 +D740 +A260 +ENDCHAR +STARTCHAR U_3F2A +ENCODING 16170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +69C0 +6940 +B740 +22C0 +3240 +4AC0 +8360 +ENDCHAR +STARTCHAR U_3F2B +ENCODING 16171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +F900 +A9C0 +F940 +2140 +FAC0 +7240 +6A40 +A2C0 +2360 +ENDCHAR +STARTCHAR U_3F2C +ENCODING 16172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +2100 +F900 +51C0 +7140 +2340 +FAC0 +2240 +22C0 +2360 +ENDCHAR +STARTCHAR U_3F2D +ENCODING 16173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F900 +23E0 +3A20 +E3E0 +0000 +FFE0 +1000 +1F00 +2520 +32E0 +ENDCHAR +STARTCHAR U_3F2E +ENCODING 16174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +29C0 +FD40 +2B40 +FAC0 +5240 +72C0 +CB60 +ENDCHAR +STARTCHAR U_3F2F +ENCODING 16175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +A9C0 +F940 +AB40 +FAC0 +7240 +AA40 +2360 +ENDCHAR +STARTCHAR U_3F30 +ENCODING 16176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +FA00 +AA00 +FBC0 +AA40 +FB40 +62C0 +A240 +FA40 +2360 +2620 +ENDCHAR +STARTCHAR U_3F31 +ENCODING 16177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +0A20 +FBE0 +0000 +FFE0 +A0A0 +5F40 +1000 +1F00 +2520 +32E0 +ENDCHAR +STARTCHAR U_3F32 +ENCODING 16178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2200 +FE00 +AB80 +AA80 +AA80 +2580 +FC80 +24A0 +55A0 +8E60 +ENDCHAR +STARTCHAR U_3F33 +ENCODING 16179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +6BE0 +B500 +2100 +F9C0 +4940 +7B40 +4AC0 +7A40 +4AC0 +7B60 +ENDCHAR +STARTCHAR U_3F34 +ENCODING 16180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A900 +F900 +A9C0 +F940 +2340 +FAC0 +AA40 +BA40 +EAC0 +8B60 +ENDCHAR +STARTCHAR U_3F35 +ENCODING 16181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BE0 +7900 +4900 +FDC0 +1340 +5AC0 +5240 +7360 +9C00 +83E0 +ENDCHAR +STARTCHAR U_3F36 +ENCODING 16182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +4500 +BB00 +01C0 +EB40 +AAC0 +EA40 +AA40 +E2C0 +A760 +ENDCHAR +STARTCHAR U_3F37 +ENCODING 16183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +A900 +F900 +01C0 +FD40 +4140 +FEC0 +AA40 +AAC0 +8360 +ENDCHAR +STARTCHAR U_3F38 +ENCODING 16184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +8500 +4900 +B5C0 +4940 +86C0 +7A40 +4A40 +4AC0 +7B60 +ENDCHAR +STARTCHAR U_3F39 +ENCODING 16185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +4900 +1100 +FDC0 +4140 +7DC0 +5540 +5540 +5540 +9760 +ENDCHAR +STARTCHAR U_3F3A +ENCODING 16186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +5100 +7D00 +55C0 +7F40 +55C0 +7D40 +6540 +BD40 +A760 +ENDCHAR +STARTCHAR U_3F3B +ENCODING 16187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3280 +CD60 +3500 +E5E0 +2700 +28E0 +FFC0 +1000 +1F00 +2520 +30E0 +ENDCHAR +STARTCHAR U_3F3C +ENCODING 16188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +F900 +A9C0 +FA40 +0340 +72C0 +0240 +FA40 +72C0 +AB60 +ENDCHAR +STARTCHAR U_3F3D +ENCODING 16189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +FD00 +B500 +59C0 +B540 +5AC0 +B640 +2A40 +46C0 +8360 +ENDCHAR +STARTCHAR U_3F3E +ENCODING 16190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +5500 +7D00 +55C0 +7D40 +4940 +6AC0 +BE40 +AA40 +BF60 +ENDCHAR +STARTCHAR U_3F3F +ENCODING 16191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +8900 +5100 +FDC0 +A940 +FAC0 +AA40 +FA40 +22C0 +FB60 +ENDCHAR +STARTCHAR U_3F40 +ENCODING 16192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +2900 +FD00 +ADC0 +D540 +FEC0 +1240 +FE40 +2A40 +C760 +ENDCHAR +STARTCHAR U_3F41 +ENCODING 16193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4CC0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4800 +4F80 +94A0 +9AE0 +ENDCHAR +STARTCHAR U_3F42 +ENCODING 16194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +4BE0 +B500 +01C0 +7940 +4940 +FDC0 +B540 +6D40 +B520 +6DA0 +ENDCHAR +STARTCHAR U_3F43 +ENCODING 16195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +ABE0 +F900 +7100 +A9C0 +AB40 +FAC0 +AA40 +FA40 +AAE0 +FB20 +ENDCHAR +STARTCHAR U_3F44 +ENCODING 16196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +FD00 +59E0 +6940 +FD40 +4A40 +FFE0 +2000 +3F00 +4940 +64C0 +ENDCHAR +STARTCHAR U_3F45 +ENCODING 16197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBE0 +B500 +5900 +85C0 +FD40 +0140 +7AC0 +4A40 +7A40 +4AC0 +FF60 +ENDCHAR +STARTCHAR U_3F46 +ENCODING 16198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A400 +6BE0 +F900 +89C0 +7140 +5140 +FAC0 +AA40 +FA40 +AAE0 +FB20 +ENDCHAR +STARTCHAR U_3F47 +ENCODING 16199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +2480 +3B80 +2480 +FFE0 +8020 +7F80 +1000 +1F00 +2540 +32C0 +ENDCHAR +STARTCHAR U_3F48 +ENCODING 16200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +59E0 +6040 +7BE0 +9140 +FD60 +4AC0 +FFE0 +1000 +3F80 +24A0 +72E0 +ENDCHAR +STARTCHAR U_3F49 +ENCODING 16201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9480 +EBE0 +92A0 +FBE0 +0000 +FFE0 +1000 +1F80 +24A0 +32E0 +ENDCHAR +STARTCHAR U_3F4A +ENCODING 16202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +FFE0 +5500 +7DC0 +AB40 +B940 +01C0 +7D40 +2540 +1960 +E7A0 +ENDCHAR +STARTCHAR U_3F4B +ENCODING 16203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +4480 +FFE0 +4440 +FFE0 +AAA0 +7FC0 +1000 +1F00 +2940 +35C0 +ENDCHAR +STARTCHAR U_3F4C +ENCODING 16204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +1100 +FF00 +D5C0 +7F40 +AB40 +FDC0 +5540 +7D40 +5560 +7DA0 +ENDCHAR +STARTCHAR U_3F4D +ENCODING 16205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +4900 +FD00 +49C0 +4940 +7AC0 +4A40 +4A40 +7AA0 +4B20 +ENDCHAR +STARTCHAR U_3F4E +ENCODING 16206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4BE0 +7AA0 +4A80 +7880 +4940 +FD40 +B140 +C940 +FE60 +ENDCHAR +STARTCHAR U_3F4F +ENCODING 16207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +9280 +47C0 +1820 +E7C0 +4440 +47C0 +1100 +FFE0 +1500 +1F00 +ENDCHAR +STARTCHAR U_3F50 +ENCODING 16208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +57E0 +FA80 +57E0 +52A0 +7FE0 +52A0 +57E0 +5280 +76C0 +5AA0 +ENDCHAR +STARTCHAR U_3F51 +ENCODING 16209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5280 +FFC0 +5540 +57C0 +5280 +7380 +5280 +5FE0 +5100 +7100 +ENDCHAR +STARTCHAR U_3F52 +ENCODING 16210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AA80 +FFE0 +AC80 +F880 +23E0 +F880 +2880 +2880 +4880 +93E0 +ENDCHAR +STARTCHAR U_3F53 +ENCODING 16211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3F80 +4400 +BF80 +0400 +FFE0 +5280 +7BE0 +9480 +1080 +FBE0 +ENDCHAR +STARTCHAR U_3F54 +ENCODING 16212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +D880 +5280 +FBE0 +2280 +65C0 +9080 +5880 +B3E0 +5800 +27E0 +ENDCHAR +STARTCHAR U_3F55 +ENCODING 16213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +2480 +3F80 +0000 +FF80 +2080 +3FE0 +0020 +00E0 +ENDCHAR +STARTCHAR U_3F56 +ENCODING 16214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +ABE0 +A920 +F920 +AA20 +AA20 +FA20 +0540 +0880 +ENDCHAR +STARTCHAR U_3F57 +ENCODING 16215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +A900 +A900 +F900 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_3F58 +ENCODING 16216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +A800 +AB80 +FA80 +AA80 +AA80 +FA80 +04A0 +18C0 +ENDCHAR +STARTCHAR U_3F59 +ENCODING 16217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FA40 +AC20 +AFE0 +FA80 +AA80 +AA80 +FA80 +04A0 +18E0 +ENDCHAR +STARTCHAR U_3F5A +ENCODING 16218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2400 +7FC0 +8400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3F5B +ENCODING 16219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FBE0 +AC20 +A820 +FBA0 +AAA0 +ABA0 +F820 +0020 +00C0 +ENDCHAR +STARTCHAR U_3F5C +ENCODING 16220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +8A40 +52A0 +23E0 +C000 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_3F5D +ENCODING 16221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FC40 +2140 +3940 +4940 +B140 +20C0 +FF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F5E +ENCODING 16222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +F780 +0000 +7F00 +4900 +7F00 +4900 +7F00 +ENDCHAR +STARTCHAR U_3F5F +ENCODING 16223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0700 +FAA0 +AAA0 +A940 +F840 +AFE0 +A840 +F940 +0040 +00C0 +ENDCHAR +STARTCHAR U_3F60 +ENCODING 16224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +A940 +AD40 +FBA0 +A900 +A900 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_3F61 +ENCODING 16225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +03E0 +FAA0 +ABE0 +AAA0 +FBE0 +A940 +AA40 +FBE0 +0040 +0040 +ENDCHAR +STARTCHAR U_3F62 +ENCODING 16226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +07E0 +F940 +AAA0 +AFE0 +FAA0 +ABE0 +AAA0 +FBE0 +0080 +00E0 +ENDCHAR +STARTCHAR U_3F63 +ENCODING 16227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +00A0 +FFE0 +A880 +AE80 +FAA0 +AAA0 +AEC0 +F8A0 +0F60 +0220 +ENDCHAR +STARTCHAR U_3F64 +ENCODING 16228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +F920 +AD60 +ABA0 +FFE0 +A920 +ABA0 +FD60 +0120 +00C0 +ENDCHAR +STARTCHAR U_3F65 +ENCODING 16229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +AFE0 +A9A0 +FA80 +AD80 +A880 +ABE0 +F880 +02C0 +04A0 +ENDCHAR +STARTCHAR U_3F66 +ENCODING 16230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3B80 +2A80 +C440 +7FE0 +8020 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F67 +ENCODING 16231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +FA40 +AA40 +AC80 +FDA0 +AAE0 +AA40 +FE80 +05A0 +06E0 +ENDCHAR +STARTCHAR U_3F68 +ENCODING 16232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +F900 +AFC0 +A900 +FFE0 +AA00 +ABE0 +FC80 +0480 +0BE0 +ENDCHAR +STARTCHAR U_3F69 +ENCODING 16233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0240 +FBC0 +AA40 +ADA0 +FF60 +A940 +AEA0 +FB40 +0080 +0700 +ENDCHAR +STARTCHAR U_3F6A +ENCODING 16234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0FE0 +F920 +ABA0 +A920 +FFE0 +AA40 +ABC0 +FA40 +0240 +03C0 +ENDCHAR +STARTCHAR U_3F6B +ENCODING 16235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5280 +F7E0 +5A80 +62E0 +BF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F6C +ENCODING 16236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0000 +F3C0 +9240 +F3C0 +0000 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_3F6D +ENCODING 16237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +AFE0 +A920 +FBC0 +A900 +AFE0 +F100 +8FE0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3F6E +ENCODING 16238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +A4A0 +FFE0 +A4A0 +7FC0 +4400 +BF80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3F6F +ENCODING 16239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +07E0 +FA80 +AFE0 +AA80 +FBE0 +AA80 +AFE0 +FAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_3F70 +ENCODING 16240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7DE0 +5460 +5440 +7D40 +5560 +5540 +7D40 +5540 +55C0 +BE60 +ENDCHAR +STARTCHAR U_3F71 +ENCODING 16241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6440 +2440 +2440 +6440 +A5C0 +2640 +4040 +8040 +ENDCHAR +STARTCHAR U_3F72 +ENCODING 16242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2200 +2400 +6FE0 +A020 +2020 +4140 +8080 +ENDCHAR +STARTCHAR U_3F73 +ENCODING 16243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2100 +2100 +6FE0 +A100 +2100 +4500 +8300 +ENDCHAR +STARTCHAR U_3F74 +ENCODING 16244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A080 +6080 +3FE0 +2080 +6480 +A500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_3F75 +ENCODING 16245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6200 +2200 +2200 +6FC0 +A200 +2200 +4200 +9FE0 +ENDCHAR +STARTCHAR U_3F76 +ENCODING 16246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2040 +2040 +6FC0 +A800 +2820 +4820 +87E0 +ENDCHAR +STARTCHAR U_3F77 +ENCODING 16247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +3D20 +25A0 +65C0 +A940 +3140 +4520 +8300 +ENDCHAR +STARTCHAR U_3F78 +ENCODING 16248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2A20 +6200 +A300 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_3F79 +ENCODING 16249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +2E00 +2800 +6FC0 +AC40 +2A80 +5100 +A6C0 +ENDCHAR +STARTCHAR U_3F7A +ENCODING 16250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2480 +24E0 +6620 +A540 +2880 +5140 +A620 +ENDCHAR +STARTCHAR U_3F7B +ENCODING 16251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2100 +6FE0 +A440 +2280 +4100 +8EE0 +ENDCHAR +STARTCHAR U_3F7C +ENCODING 16252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F40 +2140 +2F40 +6840 +AF40 +2140 +4540 +8240 +ENDCHAR +STARTCHAR U_3F7D +ENCODING 16253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2100 +6100 +A7C0 +2440 +4440 +87C0 +ENDCHAR +STARTCHAR U_3F7E +ENCODING 16254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2920 +2920 +6FE0 +A100 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_3F7F +ENCODING 16255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +2E80 +2A80 +6A80 +AA40 +2B40 +52A0 +A320 +ENDCHAR +STARTCHAR U_3F80 +ENCODING 16256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +27C0 +2100 +6FE0 +A100 +2240 +44E0 +8F20 +ENDCHAR +STARTCHAR U_3F81 +ENCODING 16257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +6120 +2100 +2FE0 +6100 +A380 +2540 +4920 +9120 +ENDCHAR +STARTCHAR U_3F82 +ENCODING 16258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A200 +6400 +2840 +2FE0 +6020 +AFC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F83 +ENCODING 16259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6100 +2FE0 +2820 +6480 +A500 +2600 +4440 +83C0 +ENDCHAR +STARTCHAR U_3F84 +ENCODING 16260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2920 +6920 +AFE0 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_3F85 +ENCODING 16261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +61C0 +2F00 +2900 +6FE0 +A320 +2520 +4960 +9100 +ENDCHAR +STARTCHAR U_3F86 +ENCODING 16262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +27C0 +2540 +67C0 +A540 +2FE0 +4440 +84C0 +ENDCHAR +STARTCHAR U_3F87 +ENCODING 16263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +2FC0 +6840 +AFC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F88 +ENCODING 16264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6440 +2440 +2BE0 +7840 +AA40 +2940 +4840 +88C0 +ENDCHAR +STARTCHAR U_3F89 +ENCODING 16265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2C60 +2380 +6000 +A7C0 +2040 +4380 +8080 +ENDCHAR +STARTCHAR U_3F8A +ENCODING 16266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2FE0 +6920 +A960 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_3F8B +ENCODING 16267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6480 +2480 +2BE0 +7880 +A9C0 +2AA0 +4AA0 +8880 +ENDCHAR +STARTCHAR U_3F8C +ENCODING 16268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +67C0 +2900 +2100 +6FE0 +A280 +2280 +44A0 +9860 +ENDCHAR +STARTCHAR U_3F8D +ENCODING 16269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2100 +2200 +6FE0 +AAA0 +2AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_3F8E +ENCODING 16270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2AA0 +2AA0 +6AA0 +ABA0 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F8F +ENCODING 16271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +67C0 +2100 +2FE0 +6000 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3F90 +ENCODING 16272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7E20 +28A0 +2EA0 +72A0 +AAA0 +24A0 +4820 +9060 +ENDCHAR +STARTCHAR U_3F91 +ENCODING 16273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6480 +2840 +77A0 +A000 +2FC0 +4840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F92 +ENCODING 16274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6AE0 +3FA0 +6AA0 +AAA0 +3AA0 +44A0 +4AE0 +9200 +ENDCHAR +STARTCHAR U_3F93 +ENCODING 16275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFC0 +6840 +2FC0 +2000 +6FC0 +A840 +2E40 +49C0 +8840 +ENDCHAR +STARTCHAR U_3F94 +ENCODING 16276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +67C0 +A000 +2FE0 +4820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F95 +ENCODING 16277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +6280 +AFE0 +2100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_3F96 +ENCODING 16278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFE0 +6920 +2FE0 +2920 +6FE0 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3F97 +ENCODING 16279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FC0 +2840 +6FC0 +A840 +2FC0 +4A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3F98 +ENCODING 16280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2920 +6FE0 +A920 +2FE0 +4500 +4200 +8DE0 +ENDCHAR +STARTCHAR U_3F99 +ENCODING 16281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AC40 +6380 +2C40 +6200 +AFE0 +2500 +4FC0 +5540 +8100 +ENDCHAR +STARTCHAR U_3F9A +ENCODING 16282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +66E0 +3480 +36A0 +78E0 +A000 +27C0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_3F9B +ENCODING 16283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +67C0 +2040 +27C0 +6FE0 +ABA0 +2280 +4100 +8EE0 +ENDCHAR +STARTCHAR U_3F9C +ENCODING 16284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2540 +6540 +ABA0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_3F9D +ENCODING 16285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +27C0 +2540 +67C0 +A540 +27C0 +4FE0 +8100 +ENDCHAR +STARTCHAR U_3F9E +ENCODING 16286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2280 +2FE0 +6AA0 +AC60 +2BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F9F +ENCODING 16287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +65C0 +2500 +2FE0 +6100 +A520 +2940 +4180 +8E00 +ENDCHAR +STARTCHAR U_3FA0 +ENCODING 16288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6BC0 +2480 +2C80 +65C0 +AC80 +2480 +4480 +89C0 +ENDCHAR +STARTCHAR U_3FA1 +ENCODING 16289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +64E0 +2EA0 +64A0 +BFA0 +24A0 +4AE0 +5F80 +8080 +ENDCHAR +STARTCHAR U_3FA2 +ENCODING 16290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2520 +6940 +B5A0 +2300 +4580 +4940 +9120 +ENDCHAR +STARTCHAR U_3FA3 +ENCODING 16291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7DC0 +2000 +2F80 +6200 +BFC0 +3240 +4A80 +9FC0 +ENDCHAR +STARTCHAR U_3FA4 +ENCODING 16292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +2280 +6C60 +A7C0 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3FA5 +ENCODING 16293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6700 +24E0 +7FA0 +A4A0 +2EA0 +55A0 +4440 +8CA0 +ENDCHAR +STARTCHAR U_3FA6 +ENCODING 16294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +2280 +6FE0 +A000 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3FA7 +ENCODING 16295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFE0 +6920 +2FE0 +2920 +6FE0 +A100 +2FE0 +4380 +8D60 +ENDCHAR +STARTCHAR U_3FA8 +ENCODING 16296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2EE0 +6000 +AFE0 +2540 +4740 +80C0 +ENDCHAR +STARTCHAR U_3FA9 +ENCODING 16297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A0C0 +6F00 +2200 +7FE0 +AA80 +3AE0 +4A80 +5A80 +8A60 +ENDCHAR +STARTCHAR U_3FAA +ENCODING 16298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6AC0 +3320 +2FC0 +7840 +AF40 +2BC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3FAB +ENCODING 16299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +2FE0 +6800 +AFE0 +2AA0 +5FE0 +AAA0 +ENDCHAR +STARTCHAR U_3FAC +ENCODING 16300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6EE0 +2880 +2EE0 +6400 +AFE0 +2B20 +49A0 +8FE0 +ENDCHAR +STARTCHAR U_3FAD +ENCODING 16301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7C80 +2AA0 +3EA0 +69C0 +BC80 +3B40 +4940 +8A20 +ENDCHAR +STARTCHAR U_3FAE +ENCODING 16302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A7C0 +6440 +27C0 +2440 +6FE0 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3FAF +ENCODING 16303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2A80 +2F80 +6A80 +BFE0 +2A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3FB0 +ENCODING 16304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +64E0 +3FA0 +64E0 +A4A0 +3EE0 +52A0 +52A0 +9F60 +ENDCHAR +STARTCHAR U_3FB1 +ENCODING 16305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7EA0 +2AC0 +6440 +BFE0 +2480 +2FC0 +44A0 +98E0 +ENDCHAR +STARTCHAR U_3FB2 +ENCODING 16306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A500 +7FE0 +2540 +3F40 +6540 +BE80 +2880 +4F40 +B220 +ENDCHAR +STARTCHAR U_3FB3 +ENCODING 16307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7BE0 +24A0 +2880 +7360 +A480 +3FE0 +4480 +9F40 +ENDCHAR +STARTCHAR U_3FB4 +ENCODING 16308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A80 +7240 +AFA0 +2880 +4F80 +4880 +BFE0 +ENDCHAR +STARTCHAR U_3FB5 +ENCODING 16309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +3FE0 +A440 +7E40 +21E0 +6E40 +A040 +2E40 +4A40 +8E40 +ENDCHAR +STARTCHAR U_3FB6 +ENCODING 16310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6B80 +2A80 +3FE0 +68A0 +AF80 +2880 +4F80 +8880 +ENDCHAR +STARTCHAR U_3FB7 +ENCODING 16311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFC0 +5100 +57E0 +D540 +57E0 +5540 +5540 +AA60 +ENDCHAR +STARTCHAR U_3FB8 +ENCODING 16312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +AFE0 +6000 +27C0 +6440 +AFE0 +2AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_3FB9 +ENCODING 16313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2280 +ABE0 +6A80 +3F60 +6100 +BFE0 +2580 +4940 +9120 +ENDCHAR +STARTCHAR U_3FBA +ENCODING 16314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2900 +AFC0 +6900 +2FC0 +6900 +AFE0 +2520 +5520 +90C0 +ENDCHAR +STARTCHAR U_3FBB +ENCODING 16315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4080 +5D40 +D620 +59C0 +5480 +D7E0 +5C80 +52C0 +95A0 +ENDCHAR +STARTCHAR U_3FBC +ENCODING 16316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2240 +ABC0 +7E40 +2BC0 +6AA0 +AA40 +2B20 +5C00 +83E0 +ENDCHAR +STARTCHAR U_3FBD +ENCODING 16317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2080 +B100 +6BC0 +3E40 +6BE0 +AA20 +2BE0 +5C00 +A3E0 +ENDCHAR +STARTCHAR U_3FBE +ENCODING 16318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +BFE0 +6540 +3FE0 +6540 +AFC0 +2500 +4D40 +9520 +ENDCHAR +STARTCHAR U_3FBF +ENCODING 16319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6EE0 +2AA0 +6EC0 +AAA0 +2EA0 +28A0 +4AE0 +8D80 +ENDCHAR +STARTCHAR U_3FC0 +ENCODING 16320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4100 +F9E0 +5540 +5540 +7DE0 +D540 +5140 +5A40 +B5E0 +ENDCHAR +STARTCHAR U_3FC1 +ENCODING 16321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2940 +2A40 +7FE0 +A940 +37A0 +4100 +8100 +ENDCHAR +STARTCHAR U_3FC2 +ENCODING 16322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +55E0 +DF40 +4140 +5F40 +C940 +5C80 +4940 +9E20 +ENDCHAR +STARTCHAR U_3FC3 +ENCODING 16323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +D540 +7FE0 +5540 +6FA0 +D240 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_3FC4 +ENCODING 16324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +D540 +5E20 +55C0 +DF40 +5540 +5A80 +9F60 +ENDCHAR +STARTCHAR U_3FC5 +ENCODING 16325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AAE0 +7680 +2BE0 +7880 +AAE0 +2A80 +4B80 +8C60 +ENDCHAR +STARTCHAR U_3FC6 +ENCODING 16326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2100 +7FE0 +A940 +3FE0 +2540 +5880 +8C60 +ENDCHAR +STARTCHAR U_3FC7 +ENCODING 16327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6660 +3AA0 +2220 +67C0 +A440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3FC8 +ENCODING 16328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7140 +2FE0 +2940 +73E0 +AD40 +25E0 +4940 +91E0 +ENDCHAR +STARTCHAR U_3FC9 +ENCODING 16329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6F80 +2A80 +7FE0 +A880 +2F80 +2880 +4F80 +9040 +ENDCHAR +STARTCHAR U_3FCA +ENCODING 16330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DFE0 +5540 +6660 +4000 +CFC0 +4940 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_3FCB +ENCODING 16331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FE0 +2920 +6FE0 +A100 +3FE0 +2100 +4540 +9920 +ENDCHAR +STARTCHAR U_3FCC +ENCODING 16332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2C60 +6380 +AEE0 +2AA0 +2EE0 +4440 +9BA0 +ENDCHAR +STARTCHAR U_3FCD +ENCODING 16333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7FE0 +24A0 +3F20 +6A40 +BFE0 +2A40 +7FE0 +AA40 +ENDCHAR +STARTCHAR U_3FCE +ENCODING 16334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2540 +3FE0 +6440 +A7C0 +2440 +47C0 +9820 +ENDCHAR +STARTCHAR U_3FCF +ENCODING 16335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2480 +3F80 +6900 +B7C0 +2100 +4FC0 +8100 +ENDCHAR +STARTCHAR U_3FD0 +ENCODING 16336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5EE0 +C5A0 +7E40 +44A0 +D7A0 +5440 +5C80 +A3E0 +ENDCHAR +STARTCHAR U_3FD1 +ENCODING 16337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6660 +3BA0 +2480 +6BE0 +B880 +2BE0 +4880 +8BE0 +ENDCHAR +STARTCHAR U_3FD2 +ENCODING 16338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2100 +2FE0 +6240 +BFE0 +2A40 +4F40 +80C0 +ENDCHAR +STARTCHAR U_3FD3 +ENCODING 16339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A40 +37A0 +6CC0 +B7A0 +2AC0 +4F00 +91E0 +ENDCHAR +STARTCHAR U_3FD4 +ENCODING 16340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +67C0 +2540 +6FE0 +AAA0 +2FE0 +2AA0 +4FE0 +8820 +ENDCHAR +STARTCHAR U_3FD5 +ENCODING 16341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2B20 +6DA0 +A8A0 +2DA0 +28A0 +4FA0 +8860 +ENDCHAR +STARTCHAR U_3FD6 +ENCODING 16342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2940 +6E80 +ABE0 +2AA0 +2FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_3FD7 +ENCODING 16343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2440 +7FE0 +A4A0 +2EE0 +35A0 +4AE0 +9B20 +ENDCHAR +STARTCHAR U_3FD8 +ENCODING 16344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +6AA0 +DDC0 +5540 +6220 +7FE0 +C8A0 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_3FD9 +ENCODING 16345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +7FE0 +2AA0 +3FE0 +6200 +BFE0 +2480 +4840 +B020 +ENDCHAR +STARTCHAR U_3FDA +ENCODING 16346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DFC0 +5100 +7E80 +53E0 +FE80 +53E0 +6A80 +ABE0 +ENDCHAR +STARTCHAR U_3FDB +ENCODING 16347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2AA0 +6FE0 +AAA0 +2FE0 +2AA0 +4AC0 +9360 +ENDCHAR +STARTCHAR U_3FDC +ENCODING 16348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6FC0 +2A40 +6FC0 +AA80 +3FE0 +5540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_3FDD +ENCODING 16349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +2000 +7F80 +4080 +7F80 +4080 +7F80 +2000 +4080 +80C0 +7F40 +ENDCHAR +STARTCHAR U_3FDE +ENCODING 16350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +4700 +F100 +91E0 +9700 +F100 +91E0 +9F00 +F100 +9120 +00E0 +ENDCHAR +STARTCHAR U_3FDF +ENCODING 16351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4100 +F7E0 +9420 +9420 +F7E0 +9420 +9420 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_3FE0 +ENCODING 16352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4920 +F540 +9380 +9FE0 +F280 +9280 +9280 +F2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_3FE1 +ENCODING 16353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +4A40 +2B80 +4A40 +1220 +E1E0 +ENDCHAR +STARTCHAR U_3FE2 +ENCODING 16354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +F780 +9480 +F780 +9480 +F780 +0C80 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_3FE3 +ENCODING 16355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +F7C0 +9440 +97C0 +F400 +97E0 +9D20 +F6A0 +07A0 +0060 +ENDCHAR +STARTCHAR U_3FE4 +ENCODING 16356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +F100 +97C0 +9200 +FFE0 +9640 +9BE0 +F240 +03C0 +0240 +ENDCHAR +STARTCHAR U_3FE5 +ENCODING 16357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +F920 +9280 +97E0 +FC80 +97E0 +9480 +F7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3FE6 +ENCODING 16358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2260 +FDC0 +AA40 +F980 +9260 +BF80 +2480 +2880 +3F80 +ENDCHAR +STARTCHAR U_3FE7 +ENCODING 16359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +8100 +FFE0 +A120 +AFC0 +E040 +BFE0 +AA40 +EF40 +00C0 +ENDCHAR +STARTCHAR U_3FE8 +ENCODING 16360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +8920 +EEC0 +AA40 +AFE0 +EA40 +AFE0 +AA40 +EAE0 +1280 +17E0 +ENDCHAR +STARTCHAR U_3FE9 +ENCODING 16361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +4FE0 +8AA0 +F7C0 +9540 +97C0 +F100 +97C0 +9100 +FFE0 +0AA0 +ENDCHAR +STARTCHAR U_3FEA +ENCODING 16362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +A940 +A140 +FB40 +89C0 +B140 +9240 +AA40 +C460 +ENDCHAR +STARTCHAR U_3FEB +ENCODING 16363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +4220 +79E0 +0400 +7FC0 +4440 +5F80 +4880 +4700 +B8E0 +ENDCHAR +STARTCHAR U_3FEC +ENCODING 16364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +AAA0 +A2A0 +FBE0 +8A00 +D200 +A200 +B200 +CA20 +81E0 +ENDCHAR +STARTCHAR U_3FED +ENCODING 16365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +43E0 +7EA0 +5280 +53E0 +5AA0 +56A0 +5240 +92A0 +1520 +ENDCHAR +STARTCHAR U_3FEE +ENCODING 16366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AA80 +ABE0 +FEA0 +22A0 +5240 +4AA0 +8520 +ENDCHAR +STARTCHAR U_3FEF +ENCODING 16367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E0E0 +3F80 +2080 +3F80 +0400 +7FC0 +4440 +5F80 +4900 +BFE0 +ENDCHAR +STARTCHAR U_3FF0 +ENCODING 16368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +52A0 +8A80 +53E0 +2220 +2240 +5340 +4A80 +8AC0 +0520 +ENDCHAR +STARTCHAR U_3FF1 +ENCODING 16369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FB00 +23E0 +7280 +2480 +1FC0 +1440 +1F00 +1500 +1200 +2D80 +ENDCHAR +STARTCHAR U_3FF2 +ENCODING 16370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +52A0 +8A80 +FBE0 +0B20 +EAA0 +AA40 +EAA0 +1D00 +ENDCHAR +STARTCHAR U_3FF3 +ENCODING 16371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +FD40 +AAA0 +A2A0 +F800 +8BE0 +D2A0 +A3E0 +B2A0 +CBE0 +ENDCHAR +STARTCHAR U_3FF4 +ENCODING 16372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +52A0 +FA80 +53E0 +7220 +52A0 +7240 +FAA0 +1500 +ENDCHAR +STARTCHAR U_3FF5 +ENCODING 16373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +A5A0 +F5A0 +95A0 +D100 +A7E0 +B100 +CA80 +8460 +ENDCHAR +STARTCHAR U_3FF6 +ENCODING 16374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +53E0 +FEA0 +A680 +FBE0 +2220 +7B40 +4A80 +8B40 +1C20 +ENDCHAR +STARTCHAR U_3FF7 +ENCODING 16375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +23E0 +FAA0 +2280 +FBE0 +2220 +7B40 +9280 +1540 +7A20 +ENDCHAR +STARTCHAR U_3FF8 +ENCODING 16376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FB40 +AA40 +A7E0 +A520 +FFE0 +8800 +ABC0 +9140 +A880 +CB60 +ENDCHAR +STARTCHAR U_3FF9 +ENCODING 16377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +A880 +A3E0 +FD40 +97E0 +D480 +A7E0 +A480 +D480 +8BE0 +ENDCHAR +STARTCHAR U_3FFA +ENCODING 16378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +FBE0 +8AA0 +FA80 +5280 +FBE0 +5220 +AAA0 +7240 +72A0 +AD20 +ENDCHAR +STARTCHAR U_3FFB +ENCODING 16379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFC +ENCODING 16380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +1100 +FFE0 +1100 +1100 +2100 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFD +ENCODING 16381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +8820 +1F80 +0080 +0500 +0200 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFE +ENCODING 16382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +0400 +0C00 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFF +ENCODING 16383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0440 +2700 +3400 +4FE0 +8000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4000 +ENCODING 16384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8540 +5480 +2420 +C3E0 +4000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4001 +ENCODING 16385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1F00 +3100 +DF00 +1100 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4002 +ENCODING 16386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +BFC0 +1100 +0E00 +1100 +FFE0 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4003 +ENCODING 16387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +7580 +0E00 +7500 +0CE0 +7400 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4004 +ENCODING 16388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4A40 +1680 +5540 +8F40 +1000 +7F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4005 +ENCODING 16389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F100 +17C0 +2900 +6100 +AFE0 +2000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4006 +ENCODING 16390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +1480 +6B00 +1080 +FFE0 +2A80 +2A80 +FFC0 +ENDCHAR +STARTCHAR U_4007 +ENCODING 16391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7C0 +2900 +F7C0 +9100 +9540 +F7C0 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4008 +ENCODING 16392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +FA80 +8BE0 +F980 +92A0 +F460 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4009 +ENCODING 16393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +FFE0 +2A80 +DF60 +1100 +1D00 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400A +ENCODING 16394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +5AA0 +2500 +DAE0 +4500 +5FC0 +1540 +1540 +7FE0 +ENDCHAR +STARTCHAR U_400B +ENCODING 16395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2500 +F9E0 +2100 +27E0 +3EA0 +C560 +3FE0 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400C +ENCODING 16396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0400 +7FC0 +2480 +5540 +3F80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400D +ENCODING 16397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFC0 +5480 +FB00 +74E0 +5780 +FF80 +28C0 +3F80 +2A80 +FFC0 +ENDCHAR +STARTCHAR U_400E +ENCODING 16398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +9200 +F400 +9400 +F7C0 +9040 +9040 +F040 +9280 +0100 +ENDCHAR +STARTCHAR U_400F +ENCODING 16399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +5E20 +9220 +1E20 +1220 +1E20 +1220 +1EA0 +0040 +ENDCHAR +STARTCHAR U_4010 +ENCODING 16400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +F840 +8B80 +8800 +F820 +8840 +FB80 +8800 +8820 +F840 +0380 +ENDCHAR +STARTCHAR U_4011 +ENCODING 16401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EFC0 +A240 +E940 +A480 +A280 +E100 +A280 +A480 +E840 +1020 +ENDCHAR +STARTCHAR U_4012 +ENCODING 16402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9100 +F100 +9FE0 +F100 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_4013 +ENCODING 16403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +9200 +9F80 +F280 +9A80 +F680 +92A0 +95A0 +F4A0 +0860 +ENDCHAR +STARTCHAR U_4014 +ENCODING 16404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9520 +F520 +9920 +F120 +9220 +9220 +F4A0 +0840 +ENDCHAR +STARTCHAR U_4015 +ENCODING 16405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0720 +F120 +9720 +9420 +F420 +9720 +F120 +9120 +9120 +F520 +0220 +ENDCHAR +STARTCHAR U_4016 +ENCODING 16406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +FFE0 +9100 +F280 +9280 +9440 +F440 +0820 +ENDCHAR +STARTCHAR U_4017 +ENCODING 16407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97C0 +F240 +9240 +9FE0 +F200 +9500 +F500 +0880 +1060 +ENDCHAR +STARTCHAR U_4018 +ENCODING 16408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +9280 +9280 +FFE0 +9280 +F280 +9280 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_4019 +ENCODING 16409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +F4A0 +94A0 +9EA0 +F4A0 +94A0 +F4A0 +96A0 +94A0 +F120 +0260 +ENDCHAR +STARTCHAR U_401A +ENCODING 16410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +6900 +5500 +7F00 +2000 +C780 +9480 +9480 +D580 +2400 +C400 +ENDCHAR +STARTCHAR U_401B +ENCODING 16411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +9AA0 +F2A0 +94A0 +F920 +9120 +9220 +F4A0 +0040 +ENDCHAR +STARTCHAR U_401C +ENCODING 16412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +2000 +3F80 +4A80 +9280 +2480 +4900 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_401D +ENCODING 16413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9520 +95C0 +F700 +9500 +F500 +9500 +9520 +F720 +04E0 +ENDCHAR +STARTCHAR U_401E +ENCODING 16414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F480 +9280 +9880 +F480 +9480 +F0E0 +9380 +9C80 +F080 +0080 +ENDCHAR +STARTCHAR U_401F +ENCODING 16415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97E0 +92A0 +F7E0 +9680 +F7E0 +92A0 +94E0 +F480 +0880 +ENDCHAR +STARTCHAR U_4020 +ENCODING 16416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +F7E0 +9420 +9420 +F7E0 +9420 +9420 +F7E0 +0420 +ENDCHAR +STARTCHAR U_4021 +ENCODING 16417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +91E0 +F100 +9100 +97E0 +F420 +9420 +9420 +F7E0 +0420 +ENDCHAR +STARTCHAR U_4022 +ENCODING 16418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97C0 +9A00 +F200 +9FC0 +F200 +9200 +9500 +F480 +0860 +ENDCHAR +STARTCHAR U_4023 +ENCODING 16419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F140 +9240 +F280 +9680 +F6C0 +9B20 +9260 +F240 +05C0 +1800 +ENDCHAR +STARTCHAR U_4024 +ENCODING 16420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3D00 +2540 +D520 +0920 +3100 +DF80 +1280 +1980 +1480 +1F80 +ENDCHAR +STARTCHAR U_4025 +ENCODING 16421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0700 +F400 +9500 +F500 +97E0 +F140 +9540 +F520 +0920 +0300 +ENDCHAR +STARTCHAR U_4026 +ENCODING 16422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9100 +FFE0 +9100 +9100 +F7C0 +9440 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_4027 +ENCODING 16423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97C0 +F280 +9280 +FFE0 +9000 +9280 +F280 +9240 +0440 +ENDCHAR +STARTCHAR U_4028 +ENCODING 16424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +F100 +9FE0 +9100 +F100 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_4029 +ENCODING 16425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9840 +F480 +9300 +9CE0 +F000 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_402A +ENCODING 16426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5C0 +A800 +F400 +A7E0 +E880 +B880 +A880 +E880 +0A80 +0900 +ENDCHAR +STARTCHAR U_402B +ENCODING 16427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +F280 +9440 +FBA0 +9000 +97C0 +F440 +0440 +07C0 +ENDCHAR +STARTCHAR U_402C +ENCODING 16428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F280 +9440 +F820 +97C0 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_402D +ENCODING 16429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9200 +F480 +9740 +F240 +9480 +F900 +1280 +0460 +ENDCHAR +STARTCHAR U_402E +ENCODING 16430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +A800 +E800 +AFC0 +E000 +AA80 +EAA0 +0AA0 +1260 +ENDCHAR +STARTCHAR U_402F +ENCODING 16431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +F140 +9FE0 +F100 +97C0 +F540 +97C0 +9540 +F7C0 +0540 +04C0 +ENDCHAR +STARTCHAR U_4030 +ENCODING 16432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9920 +F280 +9440 +F820 +97C0 +9440 +F440 +97C0 +ENDCHAR +STARTCHAR U_4031 +ENCODING 16433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7C0 +AC40 +E380 +AD60 +A7C0 +E100 +A7C0 +A100 +EFE0 +0100 +ENDCHAR +STARTCHAR U_4032 +ENCODING 16434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A800 +E7C0 +A540 +BFE0 +EA40 +A940 +AFE0 +E040 +00C0 +ENDCHAR +STARTCHAR U_4033 +ENCODING 16435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +E540 +A7C0 +E100 +A380 +A540 +E920 +0100 +ENDCHAR +STARTCHAR U_4034 +ENCODING 16436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AA80 +AA80 +E540 +A000 +A7C0 +E100 +A100 +A100 +EFE0 +ENDCHAR +STARTCHAR U_4035 +ENCODING 16437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +AFC0 +A840 +E400 +AFE0 +A100 +EFE0 +A100 +A280 +EC60 +ENDCHAR +STARTCHAR U_4036 +ENCODING 16438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +E100 +AFC0 +A840 +EFC0 +A840 +AFC0 +EA00 +AAC0 +A900 +E900 +0CC0 +ENDCHAR +STARTCHAR U_4037 +ENCODING 16439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +AE80 +A5E0 +E4A0 +BFA0 +A4A0 +EAA0 +BFA0 +A120 +E260 +ENDCHAR +STARTCHAR U_4038 +ENCODING 16440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +7240 +A240 +6440 +3F80 +3480 +2A80 +2580 +3F80 +ENDCHAR +STARTCHAR U_4039 +ENCODING 16441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AA80 +EA80 +B740 +A200 +E200 +A500 +A880 +F060 +ENDCHAR +STARTCHAR U_403A +ENCODING 16442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +2B40 +6880 +A940 +2220 +3FC0 +3240 +2940 +24C0 +3FC0 +ENDCHAR +STARTCHAR U_403B +ENCODING 16443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +A7C0 +E540 +BFE0 +A400 +EFE0 +A040 +A280 +E100 +ENDCHAR +STARTCHAR U_403C +ENCODING 16444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AF80 +E800 +AFE0 +AA80 +EAA0 +AAC0 +AA80 +EA40 +1320 +ENDCHAR +STARTCHAR U_403D +ENCODING 16445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EDC0 +A440 +E440 +A860 +A540 +E540 +B540 +A9E0 +E800 +17E0 +ENDCHAR +STARTCHAR U_403E +ENCODING 16446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2140 +7880 +A940 +3A20 +0000 +3FC0 +3240 +2940 +24C0 +3FC0 +ENDCHAR +STARTCHAR U_403F +ENCODING 16447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E460 +AF80 +E500 +A5E0 +A540 +E740 +BD40 +A540 +E540 +0E40 +ENDCHAR +STARTCHAR U_4040 +ENCODING 16448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +10C0 +7B00 +1200 +3BE0 +D280 +3480 +ENDCHAR +STARTCHAR U_4041 +ENCODING 16449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A000 +A7C0 +E440 +A7C0 +E100 +A380 +A540 +E920 +0300 +ENDCHAR +STARTCHAR U_4042 +ENCODING 16450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A240 +F280 +9100 +F280 +A460 +FF80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_4043 +ENCODING 16451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +EFC0 +A200 +BFE0 +E200 +A540 +AC80 +F540 +0620 +ENDCHAR +STARTCHAR U_4044 +ENCODING 16452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +BFC0 +E500 +A200 +FFC0 +A200 +BFE0 +E200 +0200 +ENDCHAR +STARTCHAR U_4045 +ENCODING 16453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A080 +A100 +EFE0 +A100 +A300 +EFE0 +AAA0 +AAA0 +EAA0 +1FE0 +ENDCHAR +STARTCHAR U_4046 +ENCODING 16454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +BFC0 +A500 +FAC0 +AF80 +AA80 +EF80 +AA80 +AF80 +E220 +03E0 +ENDCHAR +STARTCHAR U_4047 +ENCODING 16455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5340 +3CA0 +5F80 +0000 +7FC0 +5240 +4940 +7FC0 +ENDCHAR +STARTCHAR U_4048 +ENCODING 16456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +4540 +7C80 +4160 +BF80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_4049 +ENCODING 16457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7FE0 +4940 +79A0 +42C0 +BF80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_404A +ENCODING 16458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A280 +A100 +E280 +AC60 +A7C0 +E7C0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_404B +ENCODING 16459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BFE0 +AA80 +EB80 +AFE0 +A100 +EFE0 +A380 +A540 +E920 +0100 +ENDCHAR +STARTCHAR U_404C +ENCODING 16460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +AFE0 +E920 +AFE0 +A440 +E7C0 +A440 +A7C0 +E440 +04C0 +ENDCHAR +STARTCHAR U_404D +ENCODING 16461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +EFE0 +A880 +EF80 +A8A0 +AEA0 +EAC0 +AE80 +A980 +EAA0 +1060 +ENDCHAR +STARTCHAR U_404E +ENCODING 16462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A000 +E7C0 +A440 +AFE0 +E820 +A7C0 +A100 +E100 +0300 +ENDCHAR +STARTCHAR U_404F +ENCODING 16463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A280 +AFE0 +EAA0 +AFE0 +A200 +EFE0 +A280 +A480 +E300 +0CC0 +ENDCHAR +STARTCHAR U_4050 +ENCODING 16464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A480 +E200 +AFC0 +AA40 +EA40 +BFE0 +A200 +E500 +18C0 +ENDCHAR +STARTCHAR U_4051 +ENCODING 16465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +AA40 +A940 +EFC0 +A000 +BFE0 +E400 +AFC0 +B540 +EA40 +0580 +ENDCHAR +STARTCHAR U_4052 +ENCODING 16466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +EFE0 +A440 +A7C0 +E440 +A7C0 +A440 +EFE0 +0040 +ENDCHAR +STARTCHAR U_4053 +ENCODING 16467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A920 +AAA0 +EFE0 +A440 +AA20 +E3C0 +A640 +AA80 +E100 +06C0 +ENDCHAR +STARTCHAR U_4054 +ENCODING 16468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +AEA0 +A540 +EFE0 +A200 +AFE0 +E200 +A3C0 +A540 +E480 +0B60 +ENDCHAR +STARTCHAR U_4055 +ENCODING 16469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A840 +AFC0 +E900 +AFC0 +A8A0 +EFE0 +A840 +AFC0 +E840 +0FC0 +ENDCHAR +STARTCHAR U_4056 +ENCODING 16470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E540 +A920 +A200 +EFE0 +A440 +A280 +E100 +06C0 +ENDCHAR +STARTCHAR U_4057 +ENCODING 16471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +AF80 +A000 +FFE0 +A000 +AF80 +E880 +AF80 +A500 +E200 +1FC0 +ENDCHAR +STARTCHAR U_4058 +ENCODING 16472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +BF20 +A540 +E280 +A800 +AFC0 +F100 +AFE0 +A100 +E920 +0FE0 +ENDCHAR +STARTCHAR U_4059 +ENCODING 16473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A540 +A4C0 +E7C0 +A100 +AFE0 +E920 +AFC0 +A280 +E100 +06C0 +ENDCHAR +STARTCHAR U_405A +ENCODING 16474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +97E0 +F420 +97E0 +9420 +F7E0 +9420 +97E0 +F240 +0C20 +ENDCHAR +STARTCHAR U_405B +ENCODING 16475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AF80 +AA80 +EF80 +AA80 +AF80 +E200 +A280 +A5C0 +E920 +11E0 +ENDCHAR +STARTCHAR U_405C +ENCODING 16476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E440 +A7C0 +A920 +E540 +AFE0 +A280 +E4A0 +08E0 +ENDCHAR +STARTCHAR U_405D +ENCODING 16477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +2080 +DB60 +0000 +FFE0 +90A0 +1F80 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_405E +ENCODING 16478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2940 +1080 +2940 +FFE0 +2880 +2F80 +2880 +2F80 +4880 +8F80 +ENDCHAR +STARTCHAR U_405F +ENCODING 16479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +A280 +AFC0 +E200 +AFC0 +A200 +EFC0 +A400 +AB80 +E900 +17E0 +ENDCHAR +STARTCHAR U_4060 +ENCODING 16480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +EFC0 +A500 +AFC0 +E540 +BFE0 +A540 +EFC0 +A500 +AD80 +F560 +ENDCHAR +STARTCHAR U_4061 +ENCODING 16481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +A920 +E920 +AAA0 +AC60 +E820 +0860 +ENDCHAR +STARTCHAR U_4062 +ENCODING 16482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E880 +BEE0 +A900 +EEE0 +AA40 +AB60 +EB40 +AB40 +B3C0 +EE60 +ENDCHAR +STARTCHAR U_4063 +ENCODING 16483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +E7C0 +A540 +A540 +EFE0 +A080 +AFE0 +E280 +0180 +ENDCHAR +STARTCHAR U_4064 +ENCODING 16484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +EFE0 +A920 +ABA0 +E920 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_4065 +ENCODING 16485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AA80 +AFC0 +EA80 +AFC0 +AA00 +EFC0 +AA40 +ABC0 +E800 +0FE0 +ENDCHAR +STARTCHAR U_4066 +ENCODING 16486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E180 +A100 +AFE0 +E900 +ABA0 +A920 +EBE0 +AA40 +ABC0 +EA40 +17E0 +ENDCHAR +STARTCHAR U_4067 +ENCODING 16487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0500 +EF80 +A200 +AF80 +EA80 +AF80 +EFC0 +A200 +BFC0 +E500 +0880 +ENDCHAR +STARTCHAR U_4068 +ENCODING 16488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EEE0 +A0A0 +EEA0 +AAC0 +AEA0 +EAA0 +A4A0 +AEA0 +E4E0 +0C80 +ENDCHAR +STARTCHAR U_4069 +ENCODING 16489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E780 +A900 +BFC0 +EA40 +AFC0 +EA40 +AFC0 +A000 +ED40 +12A0 +ENDCHAR +STARTCHAR U_406A +ENCODING 16490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +EEC0 +A480 +EE80 +AAE0 +AEA0 +EAA0 +AEA0 +A4A0 +EEA0 +0520 +ENDCHAR +STARTCHAR U_406B +ENCODING 16491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +AAC0 +AF40 +EFC0 +A200 +EFC0 +A200 +BFE0 +A000 +ED40 +12A0 +ENDCHAR +STARTCHAR U_406C +ENCODING 16492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +AD60 +ABA0 +EFE0 +A000 +E7C0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_406D +ENCODING 16493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFC0 +A200 +A500 +E880 +A660 +E440 +AEE0 +A440 +EAA0 +1120 +ENDCHAR +STARTCHAR U_406E +ENCODING 16494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F540 +AEE0 +E440 +AEE0 +B100 +EFC0 +A840 +AFC0 +E840 +0FC0 +ENDCHAR +STARTCHAR U_406F +ENCODING 16495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A7C0 +E820 +A7C0 +A440 +EFE0 +AAA0 +A660 +EAA0 +0660 +ENDCHAR +STARTCHAR U_4070 +ENCODING 16496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +BC80 +ABE0 +EA20 +ABE0 +AA20 +EFE0 +AA20 +B3E0 +E140 +0220 +ENDCHAR +STARTCHAR U_4071 +ENCODING 16497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A540 +EFE0 +A440 +BFE0 +E000 +BFE0 +A480 +E4A0 +18E0 +ENDCHAR +STARTCHAR U_4072 +ENCODING 16498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E440 +A7C0 +A440 +E7C0 +A440 +A7C0 +E280 +0C60 +ENDCHAR +STARTCHAR U_4073 +ENCODING 16499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +A480 +A200 +EFC0 +A480 +B860 +E480 +BFE0 +A480 +E880 +ENDCHAR +STARTCHAR U_4074 +ENCODING 16500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +E540 +A7C0 +A000 +E7C0 +A440 +A7C0 +E440 +1FE0 +ENDCHAR +STARTCHAR U_4075 +ENCODING 16501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +E000 +BFE0 +A840 +EFC0 +A500 +A540 +EC80 +1640 +ENDCHAR +STARTCHAR U_4076 +ENCODING 16502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AF20 +EAA0 +AEA0 +E4A0 +BE40 +AA40 +EAA0 +1720 +ENDCHAR +STARTCHAR U_4077 +ENCODING 16503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +4440 +6AC0 +4A40 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4078 +ENCODING 16504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EFE0 +A800 +AFC0 +E800 +AFE0 +AA80 +EAC0 +1360 +ENDCHAR +STARTCHAR U_4079 +ENCODING 16505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +AFE0 +AAA0 +EE40 +A9E0 +A840 +EE40 +ABE0 +AA40 +EE40 +1040 +ENDCHAR +STARTCHAR U_407A +ENCODING 16506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E280 +AFC0 +A280 +EFE0 +A100 +BFE0 +E100 +0100 +ENDCHAR +STARTCHAR U_407B +ENCODING 16507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA40 +AF40 +B580 +EF40 +B5A0 +BFE0 +E200 +BFC0 +A700 +EA80 +1240 +ENDCHAR +STARTCHAR U_407C +ENCODING 16508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +ED60 +ABA0 +AFE0 +E100 +A7C0 +E100 +AFE0 +A7C0 +E100 +0FE0 +ENDCHAR +STARTCHAR U_407D +ENCODING 16509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EA80 +A540 +AFE0 +EAA0 +AFE0 +AA40 +EB40 +AEC0 +AA40 +EF60 +ENDCHAR +STARTCHAR U_407E +ENCODING 16510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A480 +EFE0 +AAA0 +AFE0 +E140 +AFE0 +AD80 +EB20 +14E0 +ENDCHAR +STARTCHAR U_407F +ENCODING 16511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +54C0 +7CA0 +13E0 +7880 +1140 +FFA0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_4080 +ENCODING 16512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A200 +EFC0 +A4A0 +AE80 +E5E0 +BE80 +A4A0 +E2C0 +0D20 +ENDCHAR +STARTCHAR U_4081 +ENCODING 16513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9C40 +F7A0 +94E0 +97C0 +FD40 +97C0 +9340 +F520 +09E0 +ENDCHAR +STARTCHAR U_4082 +ENCODING 16514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +EFE0 +A480 +EFE0 +B480 +A7E0 +E480 +07E0 +ENDCHAR +STARTCHAR U_4083 +ENCODING 16515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +AFE0 +EAA0 +AFE0 +EE40 +AAE0 +AF40 +EAC0 +0F40 +ENDCHAR +STARTCHAR U_4084 +ENCODING 16516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +EBA0 +AEE0 +A5C0 +EC80 +A7E0 +A440 +E380 +0C60 +ENDCHAR +STARTCHAR U_4085 +ENCODING 16517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +EF80 +B4A0 +BFE0 +F540 +BA60 +EF80 +AA80 +AF80 +E240 +1FC0 +ENDCHAR +STARTCHAR U_4086 +ENCODING 16518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F200 +1200 +53C0 +2440 +F840 +2A40 +6140 +A040 +2040 +2140 +6080 +ENDCHAR +STARTCHAR U_4087 +ENCODING 16519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1140 +5140 +2140 +F940 +2BC0 +6140 +A140 +2240 +2240 +67E0 +ENDCHAR +STARTCHAR U_4088 +ENCODING 16520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5100 +27E0 +FD20 +2D20 +67E0 +A100 +2140 +21E0 +6620 +ENDCHAR +STARTCHAR U_4089 +ENCODING 16521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +13C0 +5440 +27E0 +FD00 +2DC0 +6680 +A7E0 +2480 +2540 +6620 +ENDCHAR +STARTCHAR U_408A +ENCODING 16522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +13C0 +5240 +27E0 +FAA0 +2BE0 +6140 +A680 +21C0 +26A0 +6180 +ENDCHAR +STARTCHAR U_408B +ENCODING 16523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F140 +2080 +F7E0 +92A0 +F580 +2080 +F7E0 +A1C0 +F2A0 +24A0 +ENDCHAR +STARTCHAR U_408C +ENCODING 16524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +17E0 +5240 +27E0 +FAA0 +2BE0 +62A0 +A3E0 +21C0 +2080 +67E0 +ENDCHAR +STARTCHAR U_408D +ENCODING 16525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1640 +5540 +27C0 +FA80 +2FE0 +6580 +AB60 +2380 +2D60 +6300 +ENDCHAR +STARTCHAR U_408E +ENCODING 16526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +1FE0 +5540 +2EE0 +F440 +6FE0 +6A40 +A940 +AFC0 +2480 +6840 +ENDCHAR +STARTCHAR U_408F +ENCODING 16527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7920 +A120 +2220 +FA60 +2400 +33E0 +4A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_4090 +ENCODING 16528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7520 +A520 +2520 +F7E0 +2100 +2520 +5520 +5520 +87E0 +ENDCHAR +STARTCHAR U_4091 +ENCODING 16529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +7C80 +A480 +27A0 +FCC0 +2480 +3480 +4D80 +46A0 +84E0 +ENDCHAR +STARTCHAR U_4092 +ENCODING 16530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7BE0 +A080 +2080 +FBE0 +2000 +33E0 +4A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_4093 +ENCODING 16531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7FC0 +A440 +27C0 +FC40 +27C0 +3280 +4A80 +44A0 +88E0 +ENDCHAR +STARTCHAR U_4094 +ENCODING 16532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7900 +A7E0 +2280 +FFC0 +2100 +37E0 +4900 +4900 +8100 +ENDCHAR +STARTCHAR U_4095 +ENCODING 16533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A7C0 +2080 +FFE0 +22C0 +35A0 +4AA0 +4D40 +82C0 +ENDCHAR +STARTCHAR U_4096 +ENCODING 16534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0900 +1080 +2040 +7F80 +A080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_4097 +ENCODING 16535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FE00 +2200 +2220 +4240 +7380 +5E00 +D220 +5220 +7220 +01E0 +ENDCHAR +STARTCHAR U_4098 +ENCODING 16536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFC0 +2440 +2540 +4280 +7280 +5100 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_4099 +ENCODING 16537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +2240 +2280 +4240 +7220 +5220 +D3A0 +5240 +7200 +0200 +ENDCHAR +STARTCHAR U_409A +ENCODING 16538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA40 +2180 +2180 +4640 +7440 +5240 +D180 +5180 +7640 +0420 +ENDCHAR +STARTCHAR U_409B +ENCODING 16539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +2280 +2100 +4FE0 +7140 +5100 +D100 +5100 +7100 +0300 +ENDCHAR +STARTCHAR U_409C +ENCODING 16540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +4100 +77C0 +5100 +DFE0 +5100 +7100 +0100 +ENDCHAR +STARTCHAR U_409D +ENCODING 16541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0180 +FD40 +21E0 +2700 +7940 +6940 +A880 +28A0 +39A0 +0660 +ENDCHAR +STARTCHAR U_409E +ENCODING 16542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +5F80 +0400 +FFE0 +0E00 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_409F +ENCODING 16543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +7BC0 +2A40 +2A40 +4BC0 +9000 +7FC0 +0800 +1F80 +2880 +4F80 +ENDCHAR +STARTCHAR U_40A0 +ENCODING 16544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23C0 +2500 +4100 +7FE0 +5100 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_40A1 +ENCODING 16545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +2200 +2200 +43C0 +7280 +5280 +D280 +5280 +7280 +0FE0 +ENDCHAR +STARTCHAR U_40A2 +ENCODING 16546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2440 +2A80 +4100 +7280 +5C40 +D320 +5080 +7600 +0180 +ENDCHAR +STARTCHAR U_40A3 +ENCODING 16547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F940 +2140 +2540 +45E0 +7540 +5540 +D540 +55C0 +7760 +0C60 +ENDCHAR +STARTCHAR U_40A4 +ENCODING 16548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F940 +2240 +23E0 +4640 +7A40 +5340 +D2C0 +5240 +7240 +02C0 +ENDCHAR +STARTCHAR U_40A5 +ENCODING 16549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2500 +4500 +77C0 +5500 +D500 +54A0 +76A0 +0460 +ENDCHAR +STARTCHAR U_40A6 +ENCODING 16550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +4920 +7600 +5180 +D600 +5040 +7180 +0E00 +ENDCHAR +STARTCHAR U_40A7 +ENCODING 16551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FC00 +27E0 +2820 +4100 +7540 +5540 +D920 +5120 +7100 +0300 +ENDCHAR +STARTCHAR U_40A8 +ENCODING 16552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2400 +2400 +47E0 +7480 +5480 +D580 +54C0 +74A0 +0880 +ENDCHAR +STARTCHAR U_40A9 +ENCODING 16553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2520 +2520 +47E0 +7520 +55A0 +D660 +5420 +7420 +07E0 +ENDCHAR +STARTCHAR U_40AA +ENCODING 16554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +2280 +2AA0 +46C0 +7280 +56C0 +DAA0 +5280 +74A0 +08E0 +ENDCHAR +STARTCHAR U_40AB +ENCODING 16555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03E0 +FE20 +1540 +2080 +7940 +6EA0 +ABC0 +3A80 +07E0 +0080 +ENDCHAR +STARTCHAR U_40AC +ENCODING 16556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +2480 +2680 +35A0 +C8E0 +1000 +FFE0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40AD +ENCODING 16557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +2280 +2440 +78A0 +6A80 +A900 +2900 +3A80 +0460 +ENDCHAR +STARTCHAR U_40AE +ENCODING 16558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +F920 +22A0 +FA40 +7FE0 +1000 +3FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_40AF +ENCODING 16559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2480 +4480 +77E0 +5480 +D480 +5480 +77E0 +0800 +ENDCHAR +STARTCHAR U_40B0 +ENCODING 16560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01A0 +0E20 +F2A0 +2FA0 +42A0 +72A0 +D7A0 +5AA0 +7220 +02A0 +0240 +ENDCHAR +STARTCHAR U_40B1 +ENCODING 16561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +2000 +27C0 +4440 +7440 +57C0 +D280 +52A0 +74A0 +08E0 +ENDCHAR +STARTCHAR U_40B2 +ENCODING 16562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7080 +23E0 +F8A0 +5120 +EA40 +7FE0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40B3 +ENCODING 16563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FD40 +2540 +2540 +7BA0 +5100 +D7C0 +5100 +7100 +0FE0 +ENDCHAR +STARTCHAR U_40B4 +ENCODING 16564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +2000 +47C0 +7000 +57C0 +D000 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40B5 +ENCODING 16565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2100 +2FE0 +4000 +77C0 +5440 +D540 +5100 +7280 +0460 +ENDCHAR +STARTCHAR U_40B6 +ENCODING 16566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0480 +FF80 +25E0 +24A0 +7FA0 +54A0 +DAA0 +5EA0 +7120 +0260 +ENDCHAR +STARTCHAR U_40B7 +ENCODING 16567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +0700 +F100 +2FE0 +4100 +F540 +5D60 +5540 +7D60 +0500 +0100 +ENDCHAR +STARTCHAR U_40B8 +ENCODING 16568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +F100 +2FE0 +2100 +7EA0 +5AC0 +DE80 +70A0 +0DA0 +0260 +ENDCHAR +STARTCHAR U_40B9 +ENCODING 16569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +23E0 +2540 +4280 +7300 +5D20 +D540 +5980 +7280 +0C60 +ENDCHAR +STARTCHAR U_40BA +ENCODING 16570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0540 +FFC0 +2540 +27C0 +7900 +6FE0 +AB80 +2D40 +3920 +0100 +ENDCHAR +STARTCHAR U_40BB +ENCODING 16571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC00 +27C0 +2400 +47C0 +7400 +5FE0 +D480 +54A0 +7540 +0620 +ENDCHAR +STARTCHAR U_40BC +ENCODING 16572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2540 +48A0 +77C0 +5080 +D240 +56A0 +7A40 +01C0 +ENDCHAR +STARTCHAR U_40BD +ENCODING 16573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +01E0 +F900 +27C0 +2440 +77C0 +5440 +D7C0 +5100 +7FE0 +0100 +ENDCHAR +STARTCHAR U_40BE +ENCODING 16574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +2540 +2540 +7BA0 +6900 +AB80 +2D40 +3920 +0100 +ENDCHAR +STARTCHAR U_40BF +ENCODING 16575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +2740 +2380 +4540 +7120 +57C0 +D440 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40C0 +ENCODING 16576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +4140 +FFE0 +5140 +5FE0 +7440 +0380 +0440 +ENDCHAR +STARTCHAR U_40C1 +ENCODING 16577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2280 +2EE0 +4820 +F820 +5EE0 +5280 +7280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_40C2 +ENCODING 16578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2420 +47E0 +F000 +5480 +57E0 +7480 +06A0 +0440 +ENDCHAR +STARTCHAR U_40C3 +ENCODING 16579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2920 +2FE0 +4920 +FFE0 +5A20 +5A20 +7BE0 +0820 +0860 +ENDCHAR +STARTCHAR U_40C4 +ENCODING 16580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F000 +27C0 +4440 +F7C0 +5100 +5540 +7920 +0100 +0300 +ENDCHAR +STARTCHAR U_40C5 +ENCODING 16581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F180 +27E0 +4520 +F7E0 +5520 +57E0 +5100 +77E0 +0100 +0100 +ENDCHAR +STARTCHAR U_40C6 +ENCODING 16582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +F240 +23C0 +4240 +F3C0 +5240 +5240 +7FE0 +0240 +0420 +ENDCHAR +STARTCHAR U_40C7 +ENCODING 16583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +07C0 +F440 +27C0 +4440 +F7C0 +5100 +5FE0 +7920 +0960 +0100 +ENDCHAR +STARTCHAR U_40C8 +ENCODING 16584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +07E0 +F480 +26A0 +4440 +F200 +57C0 +5440 +77C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_40C9 +ENCODING 16585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0440 +F7C0 +2480 +47E0 +F440 +57E0 +5440 +77C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_40CA +ENCODING 16586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +F440 +2000 +47C0 +F440 +57C0 +5440 +77C0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_40CB +ENCODING 16587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0280 +F440 +2BA0 +4000 +F720 +5560 +5760 +7560 +0720 +0560 +ENDCHAR +STARTCHAR U_40CC +ENCODING 16588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +4AA0 +FCE0 +5820 +5FE0 +7100 +07C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_40CD +ENCODING 16589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0300 +FFE0 +2200 +4520 +FAC0 +55C0 +5AA0 +74A0 +0A80 +0100 +ENDCHAR +STARTCHAR U_40CE +ENCODING 16590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F7E0 +2280 +4540 +FBA0 +5500 +5280 +7D40 +0280 +0300 +ENDCHAR +STARTCHAR U_40CF +ENCODING 16591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2FE0 +4820 +FFE0 +5500 +57E0 +7900 +0FE0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_40D0 +ENCODING 16592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +2AA0 +2540 +7140 +5FE0 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_40D1 +ENCODING 16593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +08A0 +FEA0 +4AA0 +4EA0 +EB00 +BEE0 +AAA0 +AEA0 +EA40 +16A0 +ENDCHAR +STARTCHAR U_40D2 +ENCODING 16594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F800 +23C0 +2240 +43C0 +7000 +57E0 +D6A0 +57E0 +7520 +0460 +ENDCHAR +STARTCHAR U_40D3 +ENCODING 16595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFC0 +2280 +27C0 +4100 +77C0 +5540 +D7C0 +5540 +7FE0 +0440 +ENDCHAR +STARTCHAR U_40D4 +ENCODING 16596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +23C0 +4240 +73C0 +5000 +D7E0 +5420 +7420 +07E0 +ENDCHAR +STARTCHAR U_40D5 +ENCODING 16597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +39C0 +5280 +2940 +FFE0 +8020 +7FC0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40D6 +ENCODING 16598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +27C0 +4440 +77E0 +5400 +D7E0 +5520 +7AA0 +00C0 +ENDCHAR +STARTCHAR U_40D7 +ENCODING 16599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +F220 +2E20 +22A0 +5FA0 +74A0 +5EA0 +D4A0 +5E20 +7520 +0C60 +ENDCHAR +STARTCHAR U_40D8 +ENCODING 16600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FA0 +2940 +4F40 +7AA0 +5F20 +D100 +57C0 +7100 +0FE0 +ENDCHAR +STARTCHAR U_40D9 +ENCODING 16601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27E0 +4560 +77E0 +5480 +D7E0 +5680 +7BA0 +0AE0 +ENDCHAR +STARTCHAR U_40DA +ENCODING 16602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F280 +2FE0 +2480 +4740 +75E0 +5540 +D5E0 +5540 +7540 +0AA0 +ENDCHAR +STARTCHAR U_40DB +ENCODING 16603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2480 +23E0 +4EA0 +77E0 +57E0 +D480 +57E0 +7480 +0BE0 +ENDCHAR +STARTCHAR U_40DC +ENCODING 16604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A140 +B940 +D220 +FDC0 +A940 +FC80 +0140 +FFC0 +3100 +5F00 +ENDCHAR +STARTCHAR U_40DD +ENCODING 16605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0780 +F2E0 +2FA0 +22A0 +73A0 +5D40 +D240 +5FA0 +72A0 +0720 +ENDCHAR +STARTCHAR U_40DE +ENCODING 16606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4940 +7B40 +21C0 +7260 +7FE0 +0800 +1F80 +6880 +0F80 +ENDCHAR +STARTCHAR U_40DF +ENCODING 16607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +1F80 +EAE0 +5FA0 +40A0 +EEA0 +AAA0 +AE40 +EA40 +0EA0 +0B20 +ENDCHAR +STARTCHAR U_40E0 +ENCODING 16608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F4E0 +4E80 +4500 +44E0 +7740 +D540 +5560 +5540 +75C0 +0A60 +ENDCHAR +STARTCHAR U_40E1 +ENCODING 16609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA40 +4FE0 +4240 +46C0 +7B60 +D7C0 +5440 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40E2 +ENCODING 16610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA80 +51E0 +4EA0 +4540 +7F40 +D540 +5E40 +5440 +76A0 +0D20 +ENDCHAR +STARTCHAR U_40E3 +ENCODING 16611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F300 +4F80 +4280 +43C0 +7440 +D7E0 +58A0 +52A0 +7A20 +08C0 +ENDCHAR +STARTCHAR U_40E4 +ENCODING 16612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4140 +4FE0 +4140 +F7C0 +5540 +57C0 +7540 +47C0 +0B40 +ENDCHAR +STARTCHAR U_40E5 +ENCODING 16613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4440 +4280 +4FE0 +F540 +57C0 +5540 +77C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_40E6 +ENCODING 16614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +4A40 +7D80 +D180 +3660 +FFE0 +1000 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_40E7 +ENCODING 16615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +ABA0 +D500 +B7E0 +8000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_40E8 +ENCODING 16616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +E520 +45E0 +5C80 +53E0 +F2A0 +5FE0 +5480 +54A0 +64E0 +1BA0 +ENDCHAR +STARTCHAR U_40E9 +ENCODING 16617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4AA0 +4FE0 +4AA0 +7FE0 +D400 +57E0 +56A0 +7A40 +0B20 +ENDCHAR +STARTCHAR U_40EA +ENCODING 16618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4440 +4740 +4540 +7540 +D7C0 +5240 +53C0 +7240 +0FE0 +ENDCHAR +STARTCHAR U_40EB +ENCODING 16619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +47E0 +4D40 +4720 +7480 +D7E0 +5400 +57E0 +7A20 +0BE0 +ENDCHAR +STARTCHAR U_40EC +ENCODING 16620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F7E0 +4200 +47E0 +4520 +77E0 +D520 +57E0 +5140 +72A0 +0CE0 +ENDCHAR +STARTCHAR U_40ED +ENCODING 16621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +F7E0 +4480 +47A0 +7560 +D740 +54A0 +5940 +7520 +4C60 +0BC0 +ENDCHAR +STARTCHAR U_40EE +ENCODING 16622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F3E0 +4880 +47E0 +4140 +FFE0 +5480 +57E0 +7480 +4700 +18E0 +ENDCHAR +STARTCHAR U_40EF +ENCODING 16623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBA0 +46C0 +4380 +76C0 +5BA0 +D100 +5FE0 +7380 +4540 +0920 +ENDCHAR +STARTCHAR U_40F0 +ENCODING 16624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +46E0 +4AA0 +7440 +DBA0 +5000 +5FE0 +7540 +0B20 +ENDCHAR +STARTCHAR U_40F1 +ENCODING 16625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FF60 +4240 +4FE0 +4540 +7DC0 +D560 +5DC0 +5740 +7CA0 +0720 +ENDCHAR +STARTCHAR U_40F2 +ENCODING 16626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FEE0 +4AA0 +4F20 +4AE0 +7EA0 +D2C0 +5520 +5FE0 +72A0 +0FE0 +ENDCHAR +STARTCHAR U_40F3 +ENCODING 16627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +42A0 +47E0 +44A0 +F560 +57E0 +5540 +57C0 +7560 +07A0 +ENDCHAR +STARTCHAR U_40F4 +ENCODING 16628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +FFE0 +40A0 +4FE0 +7080 +DFE0 +50A0 +5EE0 +7AA0 +0EE0 +ENDCHAR +STARTCHAR U_40F5 +ENCODING 16629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4280 +43C0 +4280 +F7E0 +5AA0 +5520 +5CC0 +7540 +0620 +ENDCHAR +STARTCHAR U_40F6 +ENCODING 16630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4000 +4FE0 +4AA0 +7FE0 +D540 +52A0 +5CC0 +7580 +0660 +ENDCHAR +STARTCHAR U_40F7 +ENCODING 16631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4400 +47C0 +7440 +D7C0 +52E0 +5FA0 +7AE0 +4FA0 +12A0 +ENDCHAR +STARTCHAR U_40F8 +ENCODING 16632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +F560 +4AC0 +4FE0 +4540 +7DC0 +D560 +5DC0 +5740 +7CA0 +0720 +ENDCHAR +STARTCHAR U_40F9 +ENCODING 16633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +4AA0 +4EE0 +4920 +FFE0 +5D60 +5FE0 +7BA0 +4D60 +0920 +ENDCHAR +STARTCHAR U_40FA +ENCODING 16634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +4540 +47E0 +4540 +77E0 +D540 +5760 +7540 +4760 +0940 +ENDCHAR +STARTCHAR U_40FB +ENCODING 16635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +4FE0 +4BA0 +4540 +7FE0 +D2A0 +5FE0 +7AA0 +4FE0 +02A0 +ENDCHAR +STARTCHAR U_40FC +ENCODING 16636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +F900 +0900 +1180 +3940 +D520 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_40FD +ENCODING 16637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +17E0 +2100 +77C0 +AC40 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_40FE +ENCODING 16638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +F480 +1480 +24E0 +7780 +AC80 +2480 +24A0 +25A0 +2660 +ENDCHAR +STARTCHAR U_40FF +ENCODING 16639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +17C0 +2100 +7100 +AFE0 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_4100 +ENCODING 16640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +1200 +2240 +7240 +AA80 +2100 +2100 +22A0 +2C40 +ENDCHAR +STARTCHAR U_4101 +ENCODING 16641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +F540 +1540 +2FE0 +7540 +AD40 +25C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_4102 +ENCODING 16642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1920 +2920 +7920 +AFE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4103 +ENCODING 16643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1540 +2540 +7540 +AFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4104 +ENCODING 16644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F920 +1FE0 +2920 +7920 +A920 +2AA0 +2A60 +2C20 +2FE0 +ENDCHAR +STARTCHAR U_4105 +ENCODING 16645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +3F80 +0800 +FFE0 +1080 +2F40 +C020 +3FC0 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4106 +ENCODING 16646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F100 +1100 +2FE0 +7100 +AFC0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4107 +ENCODING 16647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2000 +77C0 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4108 +ENCODING 16648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +1440 +2440 +77C0 +A800 +2440 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4109 +ENCODING 16649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +24A0 +F480 +1FE0 +2480 +74A0 +A6C0 +2C80 +34A0 +2560 +2C20 +ENDCHAR +STARTCHAR U_410A +ENCODING 16650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2100 +77C0 +AA00 +2520 +2C40 +2440 +23C0 +ENDCHAR +STARTCHAR U_410B +ENCODING 16651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +1540 +2920 +77E0 +AD40 +27C0 +2540 +27C0 +20E0 +ENDCHAR +STARTCHAR U_410C +ENCODING 16652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25A0 +F240 +13A0 +2520 +77E0 +ADA0 +25A0 +2240 +22A0 +2520 +ENDCHAR +STARTCHAR U_410D +ENCODING 16653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +F7C0 +1280 +2FE0 +7000 +AFC0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_410E +ENCODING 16654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +1280 +2FE0 +7040 +AF40 +2540 +2740 +2040 +2080 +ENDCHAR +STARTCHAR U_410F +ENCODING 16655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F440 +10C0 +2700 +7100 +AFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4110 +ENCODING 16656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +FA40 +AA40 +FBC0 +0240 +FA00 +2220 +7220 +A9E0 +2000 +ENDCHAR +STARTCHAR U_4111 +ENCODING 16657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +1500 +27C0 +74A0 +6A60 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4112 +ENCODING 16658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +1540 +28A0 +77C0 +A280 +2140 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_4113 +ENCODING 16659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +F7E0 +1420 +27E0 +7420 +AFE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4114 +ENCODING 16660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F100 +17C0 +2540 +7540 +AFE0 +2920 +29E0 +2B20 +2860 +ENDCHAR +STARTCHAR U_4115 +ENCODING 16661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2120 +F540 +1380 +2540 +7120 +AFC0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_4116 +ENCODING 16662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +1440 +2BA0 +5000 +AE20 +2AA0 +2EA0 +2AA0 +2E20 +2AE0 +ENDCHAR +STARTCHAR U_4117 +ENCODING 16663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4540 +2540 +F540 +17C0 +2440 +77C0 +A440 +27C0 +2540 +2540 +2940 +ENDCHAR +STARTCHAR U_4118 +ENCODING 16664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F7C0 +1280 +2FE0 +7220 +B7C0 +2200 +2380 +2480 +2980 +ENDCHAR +STARTCHAR U_4119 +ENCODING 16665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +17E0 +2440 +47C0 +E440 +57C0 +4100 +4FE0 +4280 +4440 +ENDCHAR +STARTCHAR U_411A +ENCODING 16666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1FE0 +2AA0 +7AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_411B +ENCODING 16667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +FD60 +27C0 +7100 +A7C0 +2540 +2FE0 +2280 +2100 +26C0 +ENDCHAR +STARTCHAR U_411C +ENCODING 16668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +F540 +16C0 +27C0 +7100 +AFE0 +2920 +29A0 +2EA0 +2860 +ENDCHAR +STARTCHAR U_411D +ENCODING 16669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +13C0 +2100 +77E0 +A280 +2C60 +26C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_411E +ENCODING 16670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2360 +F5A0 +1640 +2A40 +77A0 +A800 +27C0 +2100 +2540 +2B20 +ENDCHAR +STARTCHAR U_411F +ENCODING 16671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +3C00 +17C0 +F4A0 +1FE0 +0000 +3F80 +0000 +FFE0 +1480 +6C60 +ENDCHAR +STARTCHAR U_4120 +ENCODING 16672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2540 +2740 +7440 +A7C0 +2480 +2780 +2480 +2FE0 +ENDCHAR +STARTCHAR U_4121 +ENCODING 16673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2480 +FFE0 +2A40 +6FE0 +7800 +ABC0 +2800 +2BC0 +2A40 +33C0 +ENDCHAR +STARTCHAR U_4122 +ENCODING 16674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F480 +2360 +2EC0 +76A0 +AA80 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_4123 +ENCODING 16675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FE0 +6AA0 +7FE0 +A440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_4124 +ENCODING 16676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +2F60 +F2A0 +2FE0 +6AA0 +7FE0 +A2A0 +27E0 +26C0 +2AA0 +2320 +ENDCHAR +STARTCHAR U_4125 +ENCODING 16677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +2BA0 +2540 +7FE0 +AAA0 +2FE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_4126 +ENCODING 16678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +2040 +F880 +2080 +7080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4127 +ENCODING 16679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E240 +2240 +FA80 +22E0 +7220 +6A20 +A220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_4128 +ENCODING 16680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +E3E0 +2080 +F880 +27E0 +7080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4129 +ENCODING 16681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E280 +2240 +F200 +2FE0 +7200 +6A00 +A100 +2100 +2080 +2060 +ENDCHAR +STARTCHAR U_412A +ENCODING 16682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +23E0 +FA20 +2420 +7220 +6920 +A120 +2020 +2020 +20C0 +ENDCHAR +STARTCHAR U_412B +ENCODING 16683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +E7C0 +2040 +F840 +27C0 +7440 +6C00 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_412C +ENCODING 16684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E500 +2500 +F5C0 +2F40 +7540 +6540 +A5C0 +2500 +2420 +27E0 +ENDCHAR +STARTCHAR U_412D +ENCODING 16685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +F900 +27E0 +7100 +6900 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_412E +ENCODING 16686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E100 +27C0 +F900 +2100 +77E0 +6900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_412F +ENCODING 16687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +E7E0 +2240 +FA40 +2240 +7FE0 +6A40 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_4130 +ENCODING 16688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +2040 +FA40 +2240 +73E0 +68C0 +A140 +2140 +2240 +24C0 +ENDCHAR +STARTCHAR U_4131 +ENCODING 16689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6080 +27E0 +F900 +2100 +71E0 +6920 +A220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4132 +ENCODING 16690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +6100 +2100 +FFE0 +2520 +75A0 +6D60 +A620 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_4133 +ENCODING 16691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +2080 +FA80 +22E0 +7280 +6A80 +AA80 +2280 +2280 +27E0 +ENDCHAR +STARTCHAR U_4134 +ENCODING 16692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +2220 +FA20 +23E0 +7220 +6A20 +A3E0 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_4135 +ENCODING 16693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +3C00 +0400 +FFE0 +0D00 +3480 +C460 +3F80 +2400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4136 +ENCODING 16694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +67E0 +22A0 +FFE0 +2A80 +7FE0 +6AA0 +A2A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_4137 +ENCODING 16695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +67E0 +2100 +FA00 +23C0 +7640 +6A40 +B240 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4138 +ENCODING 16696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6100 +27E0 +FC20 +2420 +77E0 +6C20 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_4139 +ENCODING 16697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +3C00 +0400 +FFE0 +2480 +CA60 +3180 +DF60 +0400 +3F80 +0400 +ENDCHAR +STARTCHAR U_413A +ENCODING 16698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +67E0 +2100 +F7E0 +2120 +77E0 +6D00 +A7E0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_413B +ENCODING 16699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +6280 +2AA0 +F6C0 +2280 +7280 +6EC0 +AAA0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_413C +ENCODING 16700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +6080 +2080 +FBE0 +22A0 +72A0 +6AA0 +A360 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_413D +ENCODING 16701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6280 +2FE0 +FAA0 +2AA0 +7AA0 +6AE0 +AC20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_413E +ENCODING 16702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18A0 +67E0 +2080 +FA80 +22A0 +77A0 +6AC0 +A280 +24A0 +2560 +2A20 +ENDCHAR +STARTCHAR U_413F +ENCODING 16703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +67E0 +2520 +FFE0 +2520 +77E0 +6900 +A140 +20A0 +2360 +2C20 +ENDCHAR +STARTCHAR U_4140 +ENCODING 16704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3020 +EF20 +2420 +F4A0 +26A0 +7AA0 +6AA0 +A6A0 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_4141 +ENCODING 16705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +3F80 +1200 +6DC0 +0F00 +3400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4142 +ENCODING 16706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E200 +27C0 +FA40 +2180 +7240 +6C20 +A3C0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4143 +ENCODING 16707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +3AC0 +C460 +0300 +3C00 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4144 +ENCODING 16708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E200 +27C0 +FA40 +2240 +74C0 +6880 +BFE0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_4145 +ENCODING 16709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27C0 +F900 +2100 +77E0 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4146 +ENCODING 16710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E100 +29E0 +F620 +2080 +7280 +6C80 +A480 +2540 +2220 +2420 +ENDCHAR +STARTCHAR U_4147 +ENCODING 16711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_4148 +ENCODING 16712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7F80 +0400 +FFE0 +2080 +DF60 +0400 +7FC0 +0D00 +1480 +6440 +ENDCHAR +STARTCHAR U_4149 +ENCODING 16713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +2280 +FA80 +2280 +7AA0 +6EC0 +A280 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_414A +ENCODING 16714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7E0 +2400 +FCC0 +2780 +7480 +6FE0 +A480 +2480 +28A0 +28E0 +ENDCHAR +STARTCHAR U_414B +ENCODING 16715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E380 +2480 +FFC0 +2540 +7540 +6FC0 +A280 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_414C +ENCODING 16716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +E240 +23C0 +F800 +27E0 +7420 +6FE0 +A420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_414D +ENCODING 16717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +EE60 +22C0 +F240 +2440 +77E0 +6A40 +AA40 +26E0 +2500 +28E0 +ENDCHAR +STARTCHAR U_414E +ENCODING 16718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +FFE0 +2540 +7920 +6FC0 +A240 +2260 +2420 +28C0 +ENDCHAR +STARTCHAR U_414F +ENCODING 16719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC00 +25C0 +6700 +75C0 +AF00 +25C0 +2B20 +28E0 +ENDCHAR +STARTCHAR U_4150 +ENCODING 16720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC40 +27C0 +6440 +77C0 +AA80 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4151 +ENCODING 16721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18E0 +E720 +24A0 +FAC0 +2200 +77E0 +6A40 +A240 +2680 +21C0 +2E20 +ENDCHAR +STARTCHAR U_4152 +ENCODING 16722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E240 +27E0 +FA40 +2100 +67E0 +7200 +AA00 +2200 +2200 +23E0 +ENDCHAR +STARTCHAR U_4153 +ENCODING 16723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3400 +E5E0 +2EA0 +F2A0 +2EA0 +7AA0 +6A40 +AE40 +22A0 +22A0 +2720 +ENDCHAR +STARTCHAR U_4154 +ENCODING 16724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3AA0 +E2A0 +2540 +FD40 +22A0 +77E0 +ACA0 +A7E0 +24A0 +24A0 +27E0 +ENDCHAR +STARTCHAR U_4155 +ENCODING 16725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E420 +27E0 +FC80 +6480 +77E0 +AC80 +27E0 +2620 +2A20 +2BE0 +ENDCHAR +STARTCHAR U_4156 +ENCODING 16726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2280 +F540 +2FE0 +7540 +BFC0 +A540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_4157 +ENCODING 16727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +19C0 +E700 +2100 +FFE0 +2540 +7920 +6FE0 +A240 +2640 +2180 +2660 +ENDCHAR +STARTCHAR U_4158 +ENCODING 16728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27E0 +FD40 +2540 +7BA0 +6900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_4159 +ENCODING 16729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC40 +27C0 +7480 +6CE0 +A780 +2480 +25A0 +26E0 +ENDCHAR +STARTCHAR U_415A +ENCODING 16730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3920 +E540 +27E0 +F900 +2FE0 +7440 +6BE0 +A240 +22C0 +2220 +21E0 +ENDCHAR +STARTCHAR U_415B +ENCODING 16731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +27C0 +FC40 +27C0 +7000 +6FE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_415C +ENCODING 16732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +FFE0 +2540 +7FE0 +A540 +2540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_415D +ENCODING 16733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E100 +2FE0 +FAA0 +2440 +6820 +77C0 +A900 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_415E +ENCODING 16734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E540 +2640 +F7C0 +2000 +67C0 +7080 +AFE0 +2880 +2480 +2180 +ENDCHAR +STARTCHAR U_415F +ENCODING 16735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +E440 +27C0 +F100 +2FE0 +7280 +6D40 +AAA0 +2340 +2080 +2700 +ENDCHAR +STARTCHAR U_4160 +ENCODING 16736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +23C0 +FA40 +23C0 +7000 +AFE0 +2100 +25C0 +2700 +29E0 +ENDCHAR +STARTCHAR U_4161 +ENCODING 16737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E100 +27C0 +FC40 +27C0 +7440 +6FC0 +A440 +27C0 +2280 +2460 +ENDCHAR +STARTCHAR U_4162 +ENCODING 16738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2920 +FFE0 +2920 +6FE0 +B440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4163 +ENCODING 16739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +24C0 +F740 +27C0 +7000 +6FC0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4164 +ENCODING 16740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E100 +2140 +FFE0 +2100 +6D60 +7920 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4165 +ENCODING 16741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E440 +27C0 +F440 +27C0 +6200 +77E0 +AD20 +26A0 +27E0 +2040 +ENDCHAR +STARTCHAR U_4166 +ENCODING 16742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +E7E0 +2240 +F240 +2000 +77E0 +6D20 +A7E0 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_4167 +ENCODING 16743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2440 +F280 +2FE0 +7000 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4168 +ENCODING 16744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31C0 +E700 +2100 +FFE0 +2540 +6920 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4169 +ENCODING 16745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +F7C0 +2240 +7180 +6FE0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_416A +ENCODING 16746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2540 +F7C0 +2100 +6FE0 +7440 +A540 +2540 +26C0 +2C60 +ENDCHAR +STARTCHAR U_416B +ENCODING 16747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2000 +F7C0 +2440 +67C0 +7440 +A7C0 +2540 +2520 +2B20 +ENDCHAR +STARTCHAR U_416C +ENCODING 16748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E280 +2FE0 +F280 +2240 +7420 +6820 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_416D +ENCODING 16749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2440 +F280 +2FE0 +6920 +77C0 +A200 +23C0 +2440 +2980 +ENDCHAR +STARTCHAR U_416E +ENCODING 16750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E280 +27C0 +F820 +27C0 +6440 +77C0 +A440 +27C0 +2A40 +33C0 +ENDCHAR +STARTCHAR U_416F +ENCODING 16751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2940 +FFE0 +2940 +6BC0 +7900 +ABC0 +2A40 +2BC0 +3240 +ENDCHAR +STARTCHAR U_4170 +ENCODING 16752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E520 +27E0 +F5A0 +6660 +77E0 +6000 +A540 +2AA0 +2A40 +21C0 +ENDCHAR +STARTCHAR U_4171 +ENCODING 16753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E540 +27C0 +F000 +2FE0 +7000 +67C0 +A440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4172 +ENCODING 16754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2140 +F7E0 +2340 +7580 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4173 +ENCODING 16755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +64A0 +22A0 +F3E0 +2120 +77E0 +64A0 +AAA0 +23E0 +2120 +2660 +ENDCHAR +STARTCHAR U_4174 +ENCODING 16756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +FFE0 +2AA0 +6700 +7280 +AFC0 +2580 +2540 +2B40 +ENDCHAR +STARTCHAR U_4175 +ENCODING 16757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E280 +2FE0 +F100 +67C0 +7100 +6140 +AFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_4176 +ENCODING 16758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E800 +2FC0 +F800 +2FE0 +7AA0 +AAC0 +2A40 +2FE0 +3240 +20C0 +ENDCHAR +STARTCHAR U_4177 +ENCODING 16759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2540 +F280 +2440 +6BA0 +7100 +AFE0 +2540 +2520 +2B20 +ENDCHAR +STARTCHAR U_4178 +ENCODING 16760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2440 +F100 +2FE0 +6440 +7280 +AFE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_4179 +ENCODING 16761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2540 +FFE0 +2540 +77C0 +6540 +AFE0 +2480 +2380 +2C60 +ENDCHAR +STARTCHAR U_417A +ENCODING 16762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E280 +2FE0 +FAA0 +2FE0 +6000 +77C0 +A000 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_417B +ENCODING 16763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2280 +F920 +2AA0 +6FE0 +7100 +AFE0 +2960 +2FA0 +2860 +ENDCHAR +STARTCHAR U_417C +ENCODING 16764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E4C0 +2740 +FFE0 +2AA0 +6FE0 +7000 +A7C0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_417D +ENCODING 16765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +7C80 +4F60 +8400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_417E +ENCODING 16766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E540 +2FE0 +F6C0 +2B60 +6240 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_417F +ENCODING 16767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2440 +FFE0 +2540 +6FE0 +7540 +AFE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_4180 +ENCODING 16768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +ED60 +2BA0 +FFE0 +6100 +77C0 +A100 +2FE0 +2D40 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_4181 +ENCODING 16769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +EAA0 +2D60 +F7C0 +2100 +6FE0 +7440 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4182 +ENCODING 16770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2A40 +FFE0 +2A80 +7FE0 +6AA0 +AFE0 +2AC0 +2EA0 +3AA0 +ENDCHAR +STARTCHAR U_4183 +ENCODING 16771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +5FC0 +EA80 +2D80 +2A80 +FFE0 +0F00 +3400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4184 +ENCODING 16772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +EFE0 +2440 +F5C0 +2540 +65C0 +7440 +A7C0 +2580 +2680 +2FE0 +ENDCHAR +STARTCHAR U_4185 +ENCODING 16773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EDE0 +2280 +FD40 +2220 +77C0 +6540 +A6C0 +2540 +27C0 +2820 +ENDCHAR +STARTCHAR U_4186 +ENCODING 16774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3380 +E280 +2380 +FEE0 +2AA0 +6EE0 +7100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_4187 +ENCODING 16775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +EA40 +2F40 +F940 +2F40 +7940 +6FC0 +A840 +2FC0 +2AA0 +3520 +ENDCHAR +STARTCHAR U_4188 +ENCODING 16776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +C420 +57E0 +FEA0 +55C0 +F6A0 +D5E0 +5680 +5BE0 +6480 +43E0 +ENDCHAR +STARTCHAR U_4189 +ENCODING 16777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +EAA0 +2FE0 +F480 +2AE0 +7E80 +6A60 +AE80 +2AE0 +2E80 +3260 +ENDCHAR +STARTCHAR U_418A +ENCODING 16778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EEE0 +2280 +FFE0 +2540 +77C0 +A540 +27C0 +2280 +2FE0 +2440 +ENDCHAR +STARTCHAR U_418B +ENCODING 16779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3780 +E900 +2EE0 +FAA0 +2FE0 +72A0 +AAE0 +26A0 +2BE0 +2600 +29E0 +ENDCHAR +STARTCHAR U_418C +ENCODING 16780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EA0 +E5E0 +2E80 +F5A0 +2E60 +7500 +AFE0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_418D +ENCODING 16781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +34E0 +EF80 +2AE0 +FF20 +20E0 +6E80 +7AE0 +AE80 +2AE0 +2E80 +3260 +ENDCHAR +STARTCHAR U_418E +ENCODING 16782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +CAA0 +5580 +EFE0 +5A80 +EBA0 +DAA0 +4BC0 +5A40 +4FE0 +5920 +ENDCHAR +STARTCHAR U_418F +ENCODING 16783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EFE0 +2540 +FBA0 +2540 +77C0 +A540 +27C0 +2280 +2FE0 +2440 +ENDCHAR +STARTCHAR U_4190 +ENCODING 16784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2E80 +D560 +7FC0 +D560 +6DA0 +FBE0 +AAA0 +ENDCHAR +STARTCHAR U_4191 +ENCODING 16785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +8020 +7FE0 +0400 +0400 +0400 +1400 +0C00 +ENDCHAR +STARTCHAR U_4192 +ENCODING 16786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9140 +2900 +C8C0 +7F00 +0900 +2900 +1100 +2920 +C8E0 +ENDCHAR +STARTCHAR U_4193 +ENCODING 16787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2900 +C8C0 +1100 +3F80 +1280 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_4194 +ENCODING 16788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2500 +C4C0 +3F80 +2480 +3F80 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4195 +ENCODING 16789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +9140 +2900 +C8E0 +3F80 +0880 +FFE0 +1100 +2080 +C040 +ENDCHAR +STARTCHAR U_4196 +ENCODING 16790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2860 +C800 +3FC0 +1000 +1200 +2400 +4880 +9FC0 +ENDCHAR +STARTCHAR U_4197 +ENCODING 16791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20C0 +C000 +7A40 +4A40 +4A40 +7BC0 +4840 +0040 +ENDCHAR +STARTCHAR U_4198 +ENCODING 16792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +20E0 +FF80 +2480 +3F80 +2480 +3F80 +0400 +0400 +ENDCHAR +STARTCHAR U_4199 +ENCODING 16793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +C080 +7FC0 +0400 +2700 +2400 +2440 +FFE0 +ENDCHAR +STARTCHAR U_419A +ENCODING 16794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +40E0 +BF80 +2080 +2E80 +2080 +2E80 +2A80 +2E80 +ENDCHAR +STARTCHAR U_419B +ENCODING 16795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +A0A0 +4060 +8180 +F700 +9100 +9FE0 +F100 +9120 +01E0 +ENDCHAR +STARTCHAR U_419C +ENCODING 16796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +24E0 +C400 +3FC0 +1880 +6F80 +0880 +0F80 +1080 +ENDCHAR +STARTCHAR U_419D +ENCODING 16797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +C800 +1080 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_419E +ENCODING 16798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7FE0 +A680 +3880 +3F80 +2000 +3F80 +2040 +1FC0 +ENDCHAR +STARTCHAR U_419F +ENCODING 16799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +64C0 +0A00 +3180 +DF60 +0000 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_41A0 +ENCODING 16800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +FF80 +2400 +3F00 +2100 +3F00 +2480 +3FC0 +ENDCHAR +STARTCHAR U_41A1 +ENCODING 16801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4460 +BF80 +2680 +3880 +3FC0 +2480 +2B00 +30C0 +ENDCHAR +STARTCHAR U_41A2 +ENCODING 16802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6060 +2100 +F3C0 +2140 +37E0 +E140 +2220 +6420 +ENDCHAR +STARTCHAR U_41A3 +ENCODING 16803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +E040 +3F80 +2000 +3FC0 +2940 +4C80 +9860 +ENDCHAR +STARTCHAR U_41A4 +ENCODING 16804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +A4A0 +5F60 +9500 +1B00 +1500 +1B40 +7D80 +0700 +3900 +ENDCHAR +STARTCHAR U_41A5 +ENCODING 16805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +40C0 +FFC0 +0840 +7480 +0F00 +7500 +0C80 +7460 +ENDCHAR +STARTCHAR U_41A6 +ENCODING 16806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A120 +44C0 +A480 +1B00 +E0E0 +0400 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_41A7 +ENCODING 16807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +CF60 +1400 +7FC0 +1500 +2480 +FFE0 +0900 +7FC0 +ENDCHAR +STARTCHAR U_41A8 +ENCODING 16808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B2A0 +54C0 +9FA0 +0000 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41A9 +ENCODING 16809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B5A0 +5940 +9320 +1500 +1F00 +0400 +FFE0 +1900 +E0C0 +ENDCHAR +STARTCHAR U_41AA +ENCODING 16810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +2260 +FC00 +53C0 +5100 +5100 +57E0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_41AB +ENCODING 16811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5060 +BF80 +4A80 +1A80 +6E80 +29C0 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_41AC +ENCODING 16812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6EC0 +0A00 +1F00 +1500 +1B00 +1500 +1F00 +2080 +ENDCHAR +STARTCHAR U_41AD +ENCODING 16813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6040 +1000 +FFC0 +5480 +7FE0 +5480 +FE80 +1080 +ENDCHAR +STARTCHAR U_41AE +ENCODING 16814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +67E0 +4080 +2380 +C080 +2FE0 +2AA0 +C100 +4EC0 +ENDCHAR +STARTCHAR U_41AF +ENCODING 16815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +FFE0 +5140 +FBE0 +5140 +FFE0 +1100 +7EC0 +ENDCHAR +STARTCHAR U_41B0 +ENCODING 16816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6080 +7FE0 +4900 +4F00 +4000 +5DC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_41B1 +ENCODING 16817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +E0E0 +4100 +2540 +8280 +5560 +2540 +C280 +4C60 +ENDCHAR +STARTCHAR U_41B2 +ENCODING 16818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +C460 +3FC0 +2480 +3FC0 +2480 +3F80 +4D00 +B4C0 +ENDCHAR +STARTCHAR U_41B3 +ENCODING 16819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +4780 +2100 +F340 +2DC0 +22A0 +FD00 +03E0 +ENDCHAR +STARTCHAR U_41B4 +ENCODING 16820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AB20 +52C0 +9F00 +1500 +3F80 +2480 +3F80 +24A0 +1FE0 +ENDCHAR +STARTCHAR U_41B5 +ENCODING 16821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +CA60 +7FC0 +5540 +7FC0 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_41B6 +ENCODING 16822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +D4C0 +2200 +FFC0 +2200 +3FC0 +2200 +7FC0 +8920 +ENDCHAR +STARTCHAR U_41B7 +ENCODING 16823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6F60 +0200 +7F80 +1500 +7FE0 +59A0 +6F60 +4020 +ENDCHAR +STARTCHAR U_41B8 +ENCODING 16824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +5E80 +5140 +3F80 +D160 +1F00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_41B9 +ENCODING 16825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9920 +64C0 +1F00 +0A00 +7FC0 +1500 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_41BA +ENCODING 16826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +7FE0 +90A0 +6F60 +3480 +1500 +7FC0 +3580 +DF60 +1500 +1F00 +ENDCHAR +STARTCHAR U_41BB +ENCODING 16827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +70C0 +1100 +FDE0 +6B40 +5940 +6880 +F940 +0A20 +ENDCHAR +STARTCHAR U_41BC +ENCODING 16828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +67C0 +2440 +F5C0 +2540 +2FE0 +2AA0 +FAA0 +0FE0 +ENDCHAR +STARTCHAR U_41BD +ENCODING 16829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6EC0 +0800 +7FC0 +4900 +7FC0 +4C80 +7700 +9AC0 +ENDCHAR +STARTCHAR U_41BE +ENCODING 16830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +E260 +7BC0 +5400 +79C0 +4800 +7F80 +5280 +FFE0 +ENDCHAR +STARTCHAR U_41BF +ENCODING 16831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6260 +57C0 +7540 +16C0 +7540 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_41C0 +ENCODING 16832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +6080 +2BE0 +FD40 +29C0 +7D40 +55E0 +FF40 +1040 +ENDCHAR +STARTCHAR U_41C1 +ENCODING 16833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +70C0 +5140 +FFE0 +5480 +7DC0 +5480 +7FE0 +AA80 +ENDCHAR +STARTCHAR U_41C2 +ENCODING 16834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +2080 +1100 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_41C3 +ENCODING 16835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +43C0 +2240 +FA40 +0240 +8BC0 +4A40 +5200 +3A00 +C220 +01E0 +ENDCHAR +STARTCHAR U_41C4 +ENCODING 16836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2240 +FBE0 +0400 +9000 +53C0 +6080 +0100 +3A00 +C420 +03E0 +ENDCHAR +STARTCHAR U_41C5 +ENCODING 16837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2140 +F920 +07E0 +8900 +4900 +5140 +4180 +3900 +C2A0 +0C60 +ENDCHAR +STARTCHAR U_41C6 +ENCODING 16838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +4280 +2180 +FC80 +0280 +8A80 +57E0 +5080 +3880 +C080 +0080 +ENDCHAR +STARTCHAR U_41C7 +ENCODING 16839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +47E0 +2420 +FFE0 +0480 +9480 +57E0 +6480 +3C80 +C6A0 +0460 +ENDCHAR +STARTCHAR U_41C8 +ENCODING 16840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4240 +2280 +F900 +0280 +8960 +5100 +57C0 +3900 +C100 +0FE0 +ENDCHAR +STARTCHAR U_41C9 +ENCODING 16841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +47E0 +2100 +F900 +9200 +57C0 +6A40 +3240 +C240 +03C0 +0240 +ENDCHAR +STARTCHAR U_41CA +ENCODING 16842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4480 +27E0 +FC00 +0480 +9480 +5500 +6500 +3640 +CBE0 +1020 +ENDCHAR +STARTCHAR U_41CB +ENCODING 16843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +41C0 +2640 +F980 +0100 +96E0 +5120 +66C0 +3840 +C180 +0E00 +ENDCHAR +STARTCHAR U_41CC +ENCODING 16844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +44A0 +22A0 +FAC0 +07E0 +9420 +57E0 +6C20 +37E0 +C420 +0860 +ENDCHAR +STARTCHAR U_41CD +ENCODING 16845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +4220 +2220 +FBE0 +0080 +8A80 +4AE0 +5280 +3A80 +C380 +0CE0 +ENDCHAR +STARTCHAR U_41CE +ENCODING 16846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +43E0 +2140 +F940 +03E0 +9000 +53E0 +6220 +3BE0 +C220 +03E0 +ENDCHAR +STARTCHAR U_41CF +ENCODING 16847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2000 +FFC0 +9440 +57C0 +6000 +37C0 +C080 +0FE0 +0180 +ENDCHAR +STARTCHAR U_41D0 +ENCODING 16848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0140 +FFE0 +0140 +97C0 +5120 +63C0 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_41D1 +ENCODING 16849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +04A0 +FFE0 +04A0 +97E0 +5280 +6480 +3FE0 +C080 +0080 +ENDCHAR +STARTCHAR U_41D2 +ENCODING 16850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +B280 +D480 +FFE0 +A180 +F6E0 +0400 +7FC0 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41D3 +ENCODING 16851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +C100 +37C0 +C540 +3540 +CFC0 +0420 +7FC0 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41D4 +ENCODING 16852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +2080 +3F80 +E5C0 +BF40 +EBC0 +A540 +BE60 +ENDCHAR +STARTCHAR U_41D5 +ENCODING 16853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +FD60 +9380 +9540 +5FE0 +6200 +3FE0 +CAA0 +0AE0 +ENDCHAR +STARTCHAR U_41D6 +ENCODING 16854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5280 +8C40 +2000 +3FC0 +C840 +0840 +1040 +6280 +0100 +ENDCHAR +STARTCHAR U_41D7 +ENCODING 16855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5280 +8C40 +0200 +1100 +2480 +C860 +1100 +2380 +3C80 +ENDCHAR +STARTCHAR U_41D8 +ENCODING 16856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +FFE0 +1000 +1F00 +2100 +2100 +3E00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_41D9 +ENCODING 16857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +7C40 +0540 +7D40 +4140 +7D40 +0440 +38C0 +ENDCHAR +STARTCHAR U_41DA +ENCODING 16858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +1100 +2100 +E180 +2140 +2120 +2100 +2100 +ENDCHAR +STARTCHAR U_41DB +ENCODING 16859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +0400 +2400 +27C0 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_41DC +ENCODING 16860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +2000 +3FC0 +2440 +4480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41DD +ENCODING 16861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0900 +0880 +0BE0 +FC40 +0280 +0300 +0CA0 +F060 +ENDCHAR +STARTCHAR U_41DE +ENCODING 16862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +1100 +FFE0 +1100 +1F00 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_41DF +ENCODING 16863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +2100 +3FE0 +4520 +A920 +1120 +22A0 +C440 +ENDCHAR +STARTCHAR U_41E0 +ENCODING 16864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +0800 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41E1 +ENCODING 16865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +0C40 +0400 +FFE0 +8020 +7FC0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_41E2 +ENCODING 16866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_41E3 +ENCODING 16867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +0A00 +3580 +C460 +1500 +2480 +4440 +0C00 +ENDCHAR +STARTCHAR U_41E4 +ENCODING 16868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4440 +4A40 +7140 +40C0 +ENDCHAR +STARTCHAR U_41E5 +ENCODING 16869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +7FC0 +0400 +0400 +2780 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_41E6 +ENCODING 16870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +0400 +3F80 +2480 +2480 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_41E7 +ENCODING 16871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_41E8 +ENCODING 16872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +7080 +1F00 +E4E0 +1F80 +2400 +3F80 +0400 +ENDCHAR +STARTCHAR U_41E9 +ENCODING 16873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +2480 +3F80 +2480 +3F80 +0480 +0720 +7CE0 +ENDCHAR +STARTCHAR U_41EA +ENCODING 16874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +FFE0 +1100 +2080 +3F80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41EB +ENCODING 16875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +7FC0 +4400 +5F80 +5080 +5F80 +4400 +7FE0 +ENDCHAR +STARTCHAR U_41EC +ENCODING 16876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +2400 +3F80 +4400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_41ED +ENCODING 16877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +3F80 +0500 +FFE0 +1800 +EF80 +0840 +07C0 +ENDCHAR +STARTCHAR U_41EE +ENCODING 16878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +11C0 +2700 +E100 +2FE0 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_41EF +ENCODING 16879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +1080 +1F80 +1080 +1F80 +1080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_41F0 +ENCODING 16880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +1F80 +0100 +7640 +1580 +2480 +CC60 +0000 +FFE0 +ENDCHAR +STARTCHAR U_41F1 +ENCODING 16881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +7FC0 +4440 +4740 +5940 +4640 +4440 +5840 +7FC0 +ENDCHAR +STARTCHAR U_41F2 +ENCODING 16882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8440 +7FC0 +2480 +1500 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41F3 +ENCODING 16883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9680 +FFE0 +0400 +7FC0 +0400 +FFE0 +0580 +0E20 +F1E0 +ENDCHAR +STARTCHAR U_41F4 +ENCODING 16884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +3F80 +0A00 +7FC0 +4A40 +4A40 +73C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_41F5 +ENCODING 16885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +9600 +4400 +47E0 +1480 +E480 +4480 +4880 +ENDCHAR +STARTCHAR U_41F6 +ENCODING 16886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +1F00 +2100 +FFC0 +4440 +7FC0 +4440 +7FC0 +8440 +ENDCHAR +STARTCHAR U_41F7 +ENCODING 16887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +9600 +4400 +47E0 +1480 +E480 +4480 +4880 +ENDCHAR +STARTCHAR U_41F8 +ENCODING 16888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +3F80 +2080 +3F80 +0000 +3F80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41F9 +ENCODING 16889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +D240 +3F80 +0880 +FFE0 +0880 +3F80 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_41FA +ENCODING 16890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41FB +ENCODING 16891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +9280 +7FC0 +4040 +7FC0 +4400 +7FC0 +4400 +7FC0 +4420 +87E0 +ENDCHAR +STARTCHAR U_41FC +ENCODING 16892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +5140 +8A20 +3F80 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_41FD +ENCODING 16893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +2000 +27C0 +F400 +27E0 +3480 +E480 +2480 +E880 +ENDCHAR +STARTCHAR U_41FE +ENCODING 16894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_41FF +ENCODING 16895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +0400 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4200 +ENCODING 16896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +FE20 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AA20 +8260 +ENDCHAR +STARTCHAR U_4201 +ENCODING 16897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +0400 +0A00 +3F80 +C060 +3F80 +2A80 +3F80 +2A80 +ENDCHAR +STARTCHAR U_4202 +ENCODING 16898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +2080 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4203 +ENCODING 16899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +27C0 +9240 +4240 +5480 +2FC0 +E440 +4440 +47C0 +ENDCHAR +STARTCHAR U_4204 +ENCODING 16900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +3F80 +0100 +A660 +94A0 +8D20 +94A0 +A460 +FFE0 +ENDCHAR +STARTCHAR U_4205 +ENCODING 16901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +0240 +FFE0 +0200 +7920 +4940 +7980 +02A0 +FC60 +ENDCHAR +STARTCHAR U_4206 +ENCODING 16902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +3FC0 +2000 +3FC0 +2040 +3FC0 +2280 +3FE0 +4480 +B860 +ENDCHAR +STARTCHAR U_4207 +ENCODING 16903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +0F00 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4208 +ENCODING 16904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_4209 +ENCODING 16905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F80 +1100 +7FC0 +0900 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_420A +ENCODING 16906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3F80 +0400 +FFE0 +2880 +DF60 +2900 +0600 +79C0 +ENDCHAR +STARTCHAR U_420B +ENCODING 16907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +75C0 +1600 +2580 +DF60 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_420C +ENCODING 16908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2000 +17C0 +9440 +47C0 +5440 +27C0 +C440 +4FE0 +ENDCHAR +STARTCHAR U_420D +ENCODING 16909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +FFE0 +2000 +3FC0 +1680 +1880 +1580 +1680 +1F80 +ENDCHAR +STARTCHAR U_420E +ENCODING 16910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +2900 +7FC0 +2900 +3FC0 +0400 +FFE0 +2480 +4440 +ENDCHAR +STARTCHAR U_420F +ENCODING 16911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8400 +7FC0 +1100 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_4210 +ENCODING 16912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2400 +2FE0 +7480 +A6A0 +25C0 +2480 +2940 +2620 +ENDCHAR +STARTCHAR U_4211 +ENCODING 16913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1F00 +1100 +1700 +1500 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_4212 +ENCODING 16914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +5F40 +44C0 +ENDCHAR +STARTCHAR U_4213 +ENCODING 16915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F00 +2500 +2900 +3FC0 +6440 +AB40 +3FC0 +0080 +ENDCHAR +STARTCHAR U_4214 +ENCODING 16916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7BC0 +4840 +7BC0 +4000 +7FC0 +4240 +7980 +4660 +ENDCHAR +STARTCHAR U_4215 +ENCODING 16917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3F00 +2500 +2900 +FFE0 +2400 +3780 +4C00 +87E0 +ENDCHAR +STARTCHAR U_4216 +ENCODING 16918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +7C40 +1140 +FCC0 +1240 +3840 +57E0 +9040 +1040 +ENDCHAR +STARTCHAR U_4217 +ENCODING 16919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +1440 +2FE0 +6440 +AA20 +23C0 +2C40 +2380 +2C60 +ENDCHAR +STARTCHAR U_4218 +ENCODING 16920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +2080 +1100 +FFE0 +2080 +4920 +30C0 +4920 +79E0 +ENDCHAR +STARTCHAR U_4219 +ENCODING 16921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +2040 +4840 +F3E0 +2240 +4940 +F940 +A840 +A8C0 +ENDCHAR +STARTCHAR U_421A +ENCODING 16922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9500 +2080 +7FC0 +0000 +3F80 +2080 +7FC0 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_421B +ENCODING 16923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2040 +3DE0 +2120 +FEA0 +AA40 +FE40 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_421C +ENCODING 16924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2780 +4080 +DFE0 +4080 +5FE0 +54A0 +4300 +5CE0 +ENDCHAR +STARTCHAR U_421D +ENCODING 16925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2500 +DFE0 +1100 +1F00 +1100 +1F00 +1100 +ENDCHAR +STARTCHAR U_421E +ENCODING 16926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +FFE0 +2080 +3F80 +0000 +3F80 +2280 +2C80 +3F80 +ENDCHAR +STARTCHAR U_421F +ENCODING 16927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7C40 +4540 +7D40 +4540 +7D40 +4540 +7C40 +82C0 +ENDCHAR +STARTCHAR U_4220 +ENCODING 16928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +3FC0 +1480 +7FC0 +0800 +FFE0 +1480 +2300 +DCE0 +ENDCHAR +STARTCHAR U_4221 +ENCODING 16929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3FC0 +4940 +BA40 +2740 +0980 +A440 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_4222 +ENCODING 16930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +2080 +7FC0 +2080 +3F80 +0400 +FFE0 +2480 +C440 +ENDCHAR +STARTCHAR U_4223 +ENCODING 16931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +0100 +FBE0 +5240 +5E40 +5180 +5D80 +E240 +0C20 +ENDCHAR +STARTCHAR U_4224 +ENCODING 16932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +2240 +FA40 +27E0 +7240 +6BC0 +A240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4225 +ENCODING 16933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +3C80 +C880 +7FE0 +54A0 +7CA0 +5520 +7D20 +9660 +ENDCHAR +STARTCHAR U_4226 +ENCODING 16934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +AA80 +2480 +2A80 +3F80 +2880 +CF60 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_4227 +ENCODING 16935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2440 +7F80 +0880 +1FC0 +2040 +7FE0 +9520 +22C0 +ENDCHAR +STARTCHAR U_4228 +ENCODING 16936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +F7C0 +9440 +E7C0 +9440 +D7C0 +A540 +8480 +8660 +ENDCHAR +STARTCHAR U_4229 +ENCODING 16937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +1040 +2C20 +C2A0 +7CA0 +A2A0 +54A0 +5E20 +E060 +ENDCHAR +STARTCHAR U_422A +ENCODING 16938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +7FC0 +1100 +1F00 +0000 +7FC0 +4A40 +5F40 +44C0 +ENDCHAR +STARTCHAR U_422B +ENCODING 16939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +2540 +4880 +F3E0 +22A0 +4AA0 +FB60 +AA20 +AA60 +ENDCHAR +STARTCHAR U_422C +ENCODING 16940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +4280 +2240 +9FE0 +4A40 +1FC0 +2A40 +CFC0 +4A40 +ENDCHAR +STARTCHAR U_422D +ENCODING 16941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +CA80 +1000 +3F80 +2480 +3F80 +2480 +3F80 +1540 +E3E0 +ENDCHAR +STARTCHAR U_422E +ENCODING 16942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2200 +FBE0 +0420 +8BA0 +4AA0 +52A0 +3BA0 +C060 +ENDCHAR +STARTCHAR U_422F +ENCODING 16943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D480 +FFE0 +0800 +3F80 +2980 +3280 +FFE0 +2080 +4040 +ENDCHAR +STARTCHAR U_4230 +ENCODING 16944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB40 +77C0 +2440 +37C0 +6440 +A7C0 +2440 +64C0 +ENDCHAR +STARTCHAR U_4231 +ENCODING 16945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8B40 +7C80 +1500 +3B80 +2080 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4232 +ENCODING 16946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A840 +FB80 +6A80 +4C60 +FB80 +6A80 +4900 +96E0 +ENDCHAR +STARTCHAR U_4233 +ENCODING 16947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2480 +3F80 +0000 +7BC0 +4A40 +2940 +5AC0 +ENDCHAR +STARTCHAR U_4234 +ENCODING 16948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +8A80 +7FC0 +0A80 +7FE0 +0A80 +3F80 +1B00 +6AC0 +ENDCHAR +STARTCHAR U_4235 +ENCODING 16949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9540 +2A80 +5F40 +0000 +7FC0 +2A40 +1940 +6AC0 +ENDCHAR +STARTCHAR U_4236 +ENCODING 16950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +5140 +6EC0 +1100 +3F80 +5140 +1100 +1F00 +ENDCHAR +STARTCHAR U_4237 +ENCODING 16951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +2780 +FC80 +2300 +7480 +AFE0 +2480 +2780 +ENDCHAR +STARTCHAR U_4238 +ENCODING 16952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BC40 +4940 +FCC0 +5640 +7D40 +5440 +7FE0 +9440 +ENDCHAR +STARTCHAR U_4239 +ENCODING 16953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFE0 +2020 +4FC0 +1200 +37C0 +5540 +1540 +17C0 +ENDCHAR +STARTCHAR U_423A +ENCODING 16954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A440 +4380 +7480 +2B00 +5480 +6960 +0200 +A980 +ENDCHAR +STARTCHAR U_423B +ENCODING 16955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4AA0 +FFE0 +4880 +7BE0 +4AA0 +7BE0 +4AA0 +4BE0 +9AA0 +ENDCHAR +STARTCHAR U_423C +ENCODING 16956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +4A20 +92C0 +54A0 +8FA0 +1240 +7240 +1FC0 +ENDCHAR +STARTCHAR U_423D +ENCODING 16957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +0900 +3F80 +2480 +3F80 +1F00 +0400 +7FC0 +ENDCHAR +STARTCHAR U_423E +ENCODING 16958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB40 +77C0 +2440 +37C0 +6C40 +A7C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_423F +ENCODING 16959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +54A0 +1280 +1F80 +0400 +FFE0 +1100 +60C0 +ENDCHAR +STARTCHAR U_4240 +ENCODING 16960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFC0 +2900 +3FC0 +2900 +2F00 +4000 +5540 +A2A0 +ENDCHAR +STARTCHAR U_4241 +ENCODING 16961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FD60 +4A80 +7D60 +4900 +7BC0 +4C80 +FB00 +0880 +ENDCHAR +STARTCHAR U_4242 +ENCODING 16962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFC0 +2480 +3F80 +3F80 +0900 +3F80 +1500 +6CC0 +ENDCHAR +STARTCHAR U_4243 +ENCODING 16963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +95E0 +56A0 +52C0 +7740 +1040 +F7E0 +5240 +90C0 +ENDCHAR +STARTCHAR U_4244 +ENCODING 16964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +F7E0 +5100 +6FE0 +5640 +5BA0 +7480 +4300 +4CE0 +ENDCHAR +STARTCHAR U_4245 +ENCODING 16965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A40 +BC20 +1200 +7F80 +2A80 +7E80 +13A0 +FE60 +1420 +ENDCHAR +STARTCHAR U_4246 +ENCODING 16966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BF40 +2900 +2500 +3FC0 +2000 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_4247 +ENCODING 16967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A440 +7D40 +2540 +3D40 +2540 +FF40 +5440 +7EC0 +ENDCHAR +STARTCHAR U_4248 +ENCODING 16968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FD40 +2900 +FDE0 +4A40 +7D40 +4880 +7940 +4E20 +ENDCHAR +STARTCHAR U_4249 +ENCODING 16969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +B460 +49C0 +FF40 +5540 +7D40 +5540 +7D20 +95A0 +ENDCHAR +STARTCHAR U_424A +ENCODING 16970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +9F40 +0400 +FFE0 +2480 +7FC0 +A4A0 +7FC0 +0400 +ENDCHAR +STARTCHAR U_424B +ENCODING 16971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +AFC0 +2540 +F7C0 +55C0 +5640 +2BC0 +5A40 +93C0 +ENDCHAR +STARTCHAR U_424C +ENCODING 16972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FC40 +4A80 +57E0 +4900 +4EC0 +69A0 +52A0 +4580 +ENDCHAR +STARTCHAR U_424D +ENCODING 16973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFC0 +4A40 +7BC0 +4440 +4B40 +5AC0 +6640 +40C0 +ENDCHAR +STARTCHAR U_424E +ENCODING 16974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +9540 +FFE0 +9120 +1F00 +0400 +7FE0 +1480 +6460 +ENDCHAR +STARTCHAR U_424F +ENCODING 16975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +B460 +4BC0 +FD40 +5680 +7DE0 +5480 +7FE0 +9480 +ENDCHAR +STARTCHAR U_4250 +ENCODING 16976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FC80 +13E0 +7C80 +55E0 +7D20 +5520 +FF20 +11E0 +ENDCHAR +STARTCHAR U_4251 +ENCODING 16977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2000 +7FC0 +AA80 +3FC0 +2A80 +FFE0 +4A40 +8520 +ENDCHAR +STARTCHAR U_4252 +ENCODING 16978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +13C0 +7C80 +2500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +ENDCHAR +STARTCHAR U_4253 +ENCODING 16979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +27C0 +FD40 +27C0 +7540 +6FE0 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_4254 +ENCODING 16980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +F940 +27E0 +3940 +4880 +A940 +17E0 +2140 +C7E0 +ENDCHAR +STARTCHAR U_4255 +ENCODING 16981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FC0 +5540 +4E40 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4256 +ENCODING 16982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1140 +FE20 +5480 +7C40 +55E0 +FE20 +11C0 +1040 +ENDCHAR +STARTCHAR U_4257 +ENCODING 16983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +27C0 +F440 +2FE0 +2540 +36C0 +E540 +2FE0 +6040 +ENDCHAR +STARTCHAR U_4258 +ENCODING 16984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2100 +FFE0 +2820 +67C0 +7000 +AFE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_4259 +ENCODING 16985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +A480 +FFE0 +A4A0 +1500 +7FC0 +0000 +FFE0 +1100 +3F80 +ENDCHAR +STARTCHAR U_425A +ENCODING 16986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F80 +2A80 +FFE0 +9020 +1F00 +1900 +2540 +30C0 +ENDCHAR +STARTCHAR U_425B +ENCODING 16987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +5540 +4E40 +7FC0 +5540 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_425C +ENCODING 16988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +4280 +77E0 +AC80 +27C0 +FC80 +27C0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_425D +ENCODING 16989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FC0 +0400 +3F80 +4480 +FFE0 +2280 +F900 +46E0 +ENDCHAR +STARTCHAR U_425E +ENCODING 16990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FE0 +4100 +7F40 +5480 +9D60 +5240 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_425F +ENCODING 16991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2FE0 +F480 +27E0 +3C80 +E7E0 +2240 +2180 +6660 +ENDCHAR +STARTCHAR U_4260 +ENCODING 16992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +A480 +3500 +5FE0 +A140 +5F40 +C080 +4A80 +4B40 +5220 +ENDCHAR +STARTCHAR U_4261 +ENCODING 16993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FFE0 +2A80 +2E80 +2080 +3F80 +1300 +1500 +FFE0 +ENDCHAR +STARTCHAR U_4262 +ENCODING 16994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +2480 +5540 +FFE0 +2080 +2E80 +2A80 +3F80 +ENDCHAR +STARTCHAR U_4263 +ENCODING 16995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +39C0 +2040 +39C0 +2040 +3FE0 +5020 +9560 +2540 +ENDCHAR +STARTCHAR U_4264 +ENCODING 16996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +5500 +FDE0 +5740 +2940 +FF40 +4880 +3940 +C620 +ENDCHAR +STARTCHAR U_4265 +ENCODING 16997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +5FE0 +52A0 +FFE0 +5520 +7FE0 +CA40 +5AA0 +E7A0 +ENDCHAR +STARTCHAR U_4266 +ENCODING 16998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5FE0 +2AA0 +FFE0 +2480 +2FE0 +3480 +27C0 +F000 +0FE0 +ENDCHAR +STARTCHAR U_4267 +ENCODING 16999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +EE20 +AAA0 +D2A0 +7EA0 +10A0 +FEA0 +5420 +FE60 +ENDCHAR +STARTCHAR U_4268 +ENCODING 17000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7DC0 +2940 +FE20 +25C0 +D940 +3540 +D480 +2360 +ENDCHAR +STARTCHAR U_4269 +ENCODING 17001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2FE0 +FA80 +2B80 +7EE0 +AAA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_426A +ENCODING 17002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_426B +ENCODING 17003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7DE0 +12A0 +FCA0 +5560 +3B80 +E4E0 +1500 +64C0 +ENDCHAR +STARTCHAR U_426C +ENCODING 17004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +6940 +55E0 +7D40 +53E0 +5D40 +4480 +BB60 +ENDCHAR +STARTCHAR U_426D +ENCODING 17005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +2900 +7FC0 +4440 +4A40 +7FC0 +4480 +7780 +4460 +7720 +ENDCHAR +STARTCHAR U_426E +ENCODING 17006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FBE0 +AA60 +CAA0 +FFE0 +9220 +BFA0 +9220 +9FA0 +ENDCHAR +STARTCHAR U_426F +ENCODING 17007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +5140 +7880 +4EC0 +75A0 +1A80 +1F80 +6040 +ENDCHAR +STARTCHAR U_4270 +ENCODING 17008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +5540 +FE20 +A540 +3D40 +2480 +3D40 +C620 +ENDCHAR +STARTCHAR U_4271 +ENCODING 17009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9680 +2040 +EFE0 +3A40 +6BC0 +B800 +2EE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_4272 +ENCODING 17010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +EFE0 +2540 +EFE0 +8D60 +EBA0 +2D60 +2BA0 +CD60 +ENDCHAR +STARTCHAR U_4273 +ENCODING 17011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7220 +9140 +FBE0 +A880 +FBE0 +A880 +FBE0 +A880 +ENDCHAR +STARTCHAR U_4274 +ENCODING 17012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +FFE0 +4A40 +7FC0 +1100 +7FC0 +2480 +EB00 +30E0 +ENDCHAR +STARTCHAR U_4275 +ENCODING 17013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +3F80 +2480 +FFE0 +4A40 +9F20 +3580 +5F40 +1280 +39C0 +ENDCHAR +STARTCHAR U_4276 +ENCODING 17014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +D280 +7FC0 +5280 +7FE0 +5100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4277 +ENCODING 17015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +D680 +39C0 +2940 +7FE0 +4900 +7FE0 +5540 +5D40 +5680 +BD60 +ENDCHAR +STARTCHAR U_4278 +ENCODING 17016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +4440 +EEE0 +A0A0 +EEE0 +4040 +EEE0 +4A40 +8E40 +ENDCHAR +STARTCHAR U_4279 +ENCODING 17017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +9520 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_427A +ENCODING 17018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A800 +77C0 +2100 +F900 +2100 +7100 +6900 +A100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_427B +ENCODING 17019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF80 +7480 +2480 +FC80 +27E0 +7480 +6C80 +A4A0 +2660 +2420 +ENDCHAR +STARTCHAR U_427C +ENCODING 17020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF00 +7400 +2400 +FFE0 +2480 +7480 +6C80 +A480 +2480 +2880 +ENDCHAR +STARTCHAR U_427D +ENCODING 17021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +FBE0 +6080 +7080 +ABE0 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_427E +ENCODING 17022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +FA20 +09E0 +2480 +1500 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_427F +ENCODING 17023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB80 +72A0 +21C0 +F880 +27E0 +7080 +6880 +A080 +2280 +2100 +ENDCHAR +STARTCHAR U_4280 +ENCODING 17024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +F900 +2100 +77C0 +6C40 +A440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4281 +ENCODING 17025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AD00 +77C0 +2500 +F900 +2FE0 +7280 +6A80 +A280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4282 +ENCODING 17026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77E0 +2100 +FFC0 +2540 +7540 +6D40 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_4283 +ENCODING 17027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7440 +27C0 +FD40 +27C0 +7540 +6D40 +A540 +25C0 +2920 +ENDCHAR +STARTCHAR U_4284 +ENCODING 17028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2340 +3AC0 +E240 +24E0 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4285 +ENCODING 17029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73C0 +2440 +FA80 +2100 +73E0 +AE20 +2A20 +23E0 +2220 +ENDCHAR +STARTCHAR U_4286 +ENCODING 17030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63C0 +4040 +7BC0 +4040 +7FC0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4287 +ENCODING 17031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +A920 +77E0 +2100 +FFE0 +2520 +77E0 +6D20 +A7E0 +2520 +2560 +ENDCHAR +STARTCHAR U_4288 +ENCODING 17032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +AFE0 +7000 +27C0 +F540 +2FE0 +7540 +6D40 +A7E0 +2040 +2180 +ENDCHAR +STARTCHAR U_4289 +ENCODING 17033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2420 +F900 +27E0 +7100 +6B80 +A540 +2920 +2100 +ENDCHAR +STARTCHAR U_428A +ENCODING 17034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC20 +77E0 +2400 +FDE0 +2480 +77E0 +6C80 +A7E0 +2480 +28E0 +ENDCHAR +STARTCHAR U_428B +ENCODING 17035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AD40 +7540 +2740 +F9E0 +2740 +7540 +6D40 +A540 +29E0 +2100 +ENDCHAR +STARTCHAR U_428C +ENCODING 17036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7800 +2A80 +FA80 +2BE0 +6A80 +7A80 +AA80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_428D +ENCODING 17037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13E0 +FD20 +1120 +3A20 +D4C0 +1480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_428E +ENCODING 17038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +AB40 +77E0 +2100 +FFE0 +2240 +77E0 +6A40 +A2C0 +2220 +23E0 +ENDCHAR +STARTCHAR U_428F +ENCODING 17039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +F940 +2620 +7080 +6AA0 +A1C0 +2140 +2620 +ENDCHAR +STARTCHAR U_4290 +ENCODING 17040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFC0 +2480 +7480 +6FE0 +A480 +25A0 +2660 +ENDCHAR +STARTCHAR U_4291 +ENCODING 17041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A920 +7540 +2100 +FFE0 +2820 +6BA0 +7AA0 +ABA0 +2820 +2860 +ENDCHAR +STARTCHAR U_4292 +ENCODING 17042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA80 +77E0 +2C80 +F480 +27C0 +7480 +6FC0 +A480 +2480 +27E0 +ENDCHAR +STARTCHAR U_4293 +ENCODING 17043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +73C0 +2240 +FBC0 +2000 +77E0 +6900 +A5C0 +2700 +29E0 +ENDCHAR +STARTCHAR U_4294 +ENCODING 17044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2100 +FFC0 +2540 +7540 +6FE0 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_4295 +ENCODING 17045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A9E0 +7EA0 +23E0 +FCA0 +25E0 +7280 +6BE0 +AA80 +2480 +3BE0 +ENDCHAR +STARTCHAR U_4296 +ENCODING 17046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7FE0 +2200 +FFE0 +2AA0 +7FE0 +6920 +AFE0 +2920 +2960 +ENDCHAR +STARTCHAR U_4297 +ENCODING 17047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +7540 +2640 +FFC0 +2000 +77C0 +6900 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4298 +ENCODING 17048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7520 +27E0 +FD20 +27E0 +7240 +6BC0 +A240 +23C0 +2240 +ENDCHAR +STARTCHAR U_4299 +ENCODING 17049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2240 +47E0 +FA40 +4A40 +7E40 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_429A +ENCODING 17050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A900 +75E0 +2120 +FFE0 +2500 +75E0 +6D20 +A5E0 +3C00 +23E0 +ENDCHAR +STARTCHAR U_429B +ENCODING 17051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +AD40 +7540 +2B60 +FE00 +25C0 +7F40 +6540 +AE80 +3540 +2620 +ENDCHAR +STARTCHAR U_429C +ENCODING 17052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27C0 +F540 +2FE0 +7040 +6FE0 +A440 +2240 +20C0 +ENDCHAR +STARTCHAR U_429D +ENCODING 17053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +AF20 +7540 +2FE0 +F540 +2520 +7920 +6AC0 +A2A0 +2A20 +29C0 +ENDCHAR +STARTCHAR U_429E +ENCODING 17054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7440 +2280 +FFE0 +2920 +7FE0 +6920 +ABA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_429F +ENCODING 17055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AFE0 +7440 +27C0 +F900 +2FE0 +7920 +6D60 +ABA0 +2D60 +2820 +ENDCHAR +STARTCHAR U_42A0 +ENCODING 17056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FA80 +93E0 +B940 +CA60 +2480 +1500 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42A1 +ENCODING 17057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +ACC0 +7540 +2FE0 +FAA0 +2FE0 +7000 +6FC0 +A240 +2380 +2C60 +ENDCHAR +STARTCHAR U_42A2 +ENCODING 17058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +73C0 +1540 +F280 +5FE0 +9240 +24C0 +1500 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42A3 +ENCODING 17059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2FE0 +F800 +27C0 +7540 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42A4 +ENCODING 17060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AA80 +7FE0 +2AA0 +FFE0 +2440 +77C0 +A440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_42A5 +ENCODING 17061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFC0 +7140 +2FE0 +F140 +27C0 +7540 +6FC0 +A540 +27C0 +2940 +ENDCHAR +STARTCHAR U_42A6 +ENCODING 17062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +2FE0 +F820 +27C0 +7440 +67C0 +A440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_42A7 +ENCODING 17063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +72A0 +2FE0 +FA80 +2FE0 +74A0 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42A8 +ENCODING 17064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4000 +3FC0 +2080 +7FC0 +5540 +7F40 +5540 +7F40 +9560 +ENDCHAR +STARTCHAR U_42A9 +ENCODING 17065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AF20 +7540 +2FE0 +F540 +2920 +77C0 +6D40 +A7C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_42AA +ENCODING 17066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27C0 +FD40 +27C0 +7540 +6FE0 +A920 +2FE0 +2A20 +ENDCHAR +STARTCHAR U_42AB +ENCODING 17067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2280 +FEE0 +2280 +7EE0 +6280 +AEE0 +2280 +2480 +ENDCHAR +STARTCHAR U_42AC +ENCODING 17068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2540 +FFC0 +2540 +7FE0 +A540 +2920 +2480 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42AD +ENCODING 17069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27E0 +F820 +27C0 +7100 +6FE0 +AA40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_42AE +ENCODING 17070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ADA0 +7360 +25A0 +FB20 +2480 +77E0 +6C80 +A7E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_42AF +ENCODING 17071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7A80 +2FE0 +FA80 +2FE0 +7540 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42B0 +ENCODING 17072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A8A0 +75E0 +2EA0 +F1E0 +2E80 +71E0 +AEA0 +2AE0 +2EA0 +20E0 +ENDCHAR +STARTCHAR U_42B1 +ENCODING 17073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AD60 +7AC0 +2FE0 +F540 +2DC0 +7560 +6DC0 +A540 +2FE0 +2120 +ENDCHAR +STARTCHAR U_42B2 +ENCODING 17074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2BE0 +FF40 +AA80 +FFE0 +9680 +5BE0 +FE80 +33E0 +5E80 +95E0 +ENDCHAR +STARTCHAR U_42B3 +ENCODING 17075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AFE0 +7540 +27E0 +FD40 +27E0 +7540 +6F60 +A540 +2760 +2940 +ENDCHAR +STARTCHAR U_42B4 +ENCODING 17076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7540 +2100 +F280 +2FE0 +7540 +6D40 +A7C0 +2280 +2D60 +ENDCHAR +STARTCHAR U_42B5 +ENCODING 17077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9F80 +F280 +2280 +4280 +9280 +FA80 +AA80 +A4A0 +9860 +ENDCHAR +STARTCHAR U_42B6 +ENCODING 17078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9500 +F5E0 +2F20 +4520 +9540 +F500 +AC20 +A420 +83E0 +ENDCHAR +STARTCHAR U_42B7 +ENCODING 17079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4040 +9040 +FFE0 +2040 +40C0 +9140 +FA40 +AC40 +A840 +80C0 +ENDCHAR +STARTCHAR U_42B8 +ENCODING 17080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +4000 +9000 +FFE0 +2200 +4200 +97C0 +F840 +A840 +A080 +8300 +ENDCHAR +STARTCHAR U_42B9 +ENCODING 17081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +4700 +9100 +F100 +2FE0 +4100 +9100 +F900 +A900 +A100 +8100 +ENDCHAR +STARTCHAR U_42BA +ENCODING 17082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +9100 +F200 +23C0 +4440 +9440 +FB80 +A880 +A100 +8FE0 +ENDCHAR +STARTCHAR U_42BB +ENCODING 17083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4400 +97E0 +F520 +2940 +4100 +9100 +F900 +AA80 +A440 +9820 +ENDCHAR +STARTCHAR U_42BC +ENCODING 17084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4080 +9080 +F080 +2480 +44E0 +9480 +F480 +AC80 +A480 +8FE0 +ENDCHAR +STARTCHAR U_42BD +ENCODING 17085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97C0 +F140 +2140 +4FE0 +9100 +F180 +0A40 +AA20 +A420 +ENDCHAR +STARTCHAR U_42BE +ENCODING 17086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9100 +F7E0 +2100 +4380 +9380 +F540 +A920 +A900 +8100 +ENDCHAR +STARTCHAR U_42BF +ENCODING 17087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97E0 +F100 +2100 +47E0 +9100 +F900 +0A80 +A440 +A820 +ENDCHAR +STARTCHAR U_42C0 +ENCODING 17088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4480 +4900 +4640 +5FE0 +4200 +9AC0 +A620 +ENDCHAR +STARTCHAR U_42C1 +ENCODING 17089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9000 +6380 +2A80 +7A80 +8280 +2A80 +AAA0 +84E0 +ENDCHAR +STARTCHAR U_42C2 +ENCODING 17090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2640 +4180 +9340 +F420 +2000 +4240 +FA40 +0980 +A980 +A240 +8C20 +ENDCHAR +STARTCHAR U_42C3 +ENCODING 17091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4700 +9100 +F1E0 +4700 +9100 +F1E0 +0F00 +A900 +A120 +80E0 +ENDCHAR +STARTCHAR U_42C4 +ENCODING 17092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4420 +9420 +E660 +45A0 +95A0 +F660 +0C20 +AC20 +A420 +8460 +ENDCHAR +STARTCHAR U_42C5 +ENCODING 17093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9500 +F7C0 +4900 +9100 +FFE0 +0100 +A900 +A900 +8100 +ENDCHAR +STARTCHAR U_42C6 +ENCODING 17094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +97E0 +E420 +4420 +97E0 +F400 +0C00 +A400 +A400 +8800 +ENDCHAR +STARTCHAR U_42C7 +ENCODING 17095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9440 +F440 +47C0 +9500 +F500 +0C80 +A480 +A840 +8820 +ENDCHAR +STARTCHAR U_42C8 +ENCODING 17096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +FE40 +4980 +3640 +C920 +3F00 +1100 +3F80 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_42C9 +ENCODING 17097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +9FE0 +E820 +4000 +9280 +F280 +0A80 +A440 +A440 +8820 +ENDCHAR +STARTCHAR U_42CA +ENCODING 17098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +9100 +E100 +4100 +95E0 +F500 +0D00 +A500 +A500 +9FE0 +ENDCHAR +STARTCHAR U_42CB +ENCODING 17099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4420 +97E0 +E480 +4480 +97E0 +F480 +0C80 +A4A0 +A660 +8420 +ENDCHAR +STARTCHAR U_42CC +ENCODING 17100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4400 +9400 +E7C0 +4440 +9440 +F7C0 +0C00 +A400 +A400 +87E0 +ENDCHAR +STARTCHAR U_42CD +ENCODING 17101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +9040 +F040 +4740 +9540 +F540 +0F40 +A840 +A040 +80C0 +ENDCHAR +STARTCHAR U_42CE +ENCODING 17102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9440 +E440 +47C0 +9440 +F440 +0FC0 +A800 +A000 +8FE0 +ENDCHAR +STARTCHAR U_42CF +ENCODING 17103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +93E0 +F500 +4100 +91C0 +F900 +09E0 +A900 +A100 +8100 +ENDCHAR +STARTCHAR U_42D0 +ENCODING 17104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4100 +57E0 +E500 +2520 +44C0 +F480 +04A0 +ADA0 +A660 +ENDCHAR +STARTCHAR U_42D1 +ENCODING 17105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +5FE0 +E920 +2920 +4AA0 +FC60 +0820 +A820 +A8E0 +ENDCHAR +STARTCHAR U_42D2 +ENCODING 17106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +4180 +5080 +EFE0 +20A0 +4180 +F280 +0480 +A880 +A380 +ENDCHAR +STARTCHAR U_42D3 +ENCODING 17107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +5440 +E880 +27E0 +4020 +F7E0 +0020 +A820 +A7E0 +ENDCHAR +STARTCHAR U_42D4 +ENCODING 17108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4080 +5100 +E380 +2540 +4920 +F100 +0100 +A000 +AFE0 +ENDCHAR +STARTCHAR U_42D5 +ENCODING 17109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2100 +6FE0 +A100 +27C0 +0A00 +1480 +3FC0 +0400 +1500 +6CC0 +ENDCHAR +STARTCHAR U_42D6 +ENCODING 17110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4140 +57E0 +E140 +27C0 +4100 +F7C0 +0100 +AFE0 +A100 +ENDCHAR +STARTCHAR U_42D7 +ENCODING 17111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4480 +5480 +E7E0 +2420 +4420 +F7E0 +0480 +AC80 +A7E0 +ENDCHAR +STARTCHAR U_42D8 +ENCODING 17112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2780 +4100 +57C0 +E100 +2FE0 +4100 +F380 +0540 +A920 +A100 +ENDCHAR +STARTCHAR U_42D9 +ENCODING 17113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +4440 +57C0 +E440 +27C0 +4440 +F460 +0FC0 +A040 +A040 +ENDCHAR +STARTCHAR U_42DA +ENCODING 17114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4AA0 +5660 +E220 +2660 +4AA0 +F220 +0220 +A220 +AEE0 +ENDCHAR +STARTCHAR U_42DB +ENCODING 17115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +4380 +5100 +EFE0 +2100 +4380 +F540 +0120 +A900 +A100 +ENDCHAR +STARTCHAR U_42DC +ENCODING 17116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +8220 +F140 +9080 +F540 +8A20 +FE00 +0480 +3FC0 +1280 +2640 +ENDCHAR +STARTCHAR U_42DD +ENCODING 17117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2920 +4540 +5000 +E100 +2FE0 +4280 +F280 +0100 +AA80 +A440 +ENDCHAR +STARTCHAR U_42DE +ENCODING 17118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +5D60 +EAA0 +2AA0 +4D60 +F820 +0820 +A8A0 +A840 +ENDCHAR +STARTCHAR U_42DF +ENCODING 17119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +47C0 +5400 +E7E0 +2000 +4100 +FAA0 +06A0 +AA40 +A3C0 +ENDCHAR +STARTCHAR U_42E0 +ENCODING 17120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4100 +5FE0 +E920 +2FE0 +4920 +FFE0 +0920 +A920 +A960 +ENDCHAR +STARTCHAR U_42E1 +ENCODING 17121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5BA0 +E100 +27C0 +4100 +F380 +0540 +A920 +A300 +ENDCHAR +STARTCHAR U_42E2 +ENCODING 17122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +23E0 +FA40 +2440 +6E00 +1080 +7FC0 +0420 +1500 +2480 +ENDCHAR +STARTCHAR U_42E3 +ENCODING 17123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +8240 +7B80 +4900 +6FE0 +F880 +49C0 +6AA0 +7C80 +1180 +ENDCHAR +STARTCHAR U_42E4 +ENCODING 17124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FA20 +2520 +54A0 +20A0 +F820 +7020 +A940 +6080 +ENDCHAR +STARTCHAR U_42E5 +ENCODING 17125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +5540 +E540 +27C0 +4100 +F7C0 +0100 +A100 +AFE0 +ENDCHAR +STARTCHAR U_42E6 +ENCODING 17126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +4800 +57C0 +E540 +2FE0 +4440 +F540 +07E0 +A840 +A080 +ENDCHAR +STARTCHAR U_42E7 +ENCODING 17127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +4420 +57E0 +E480 +27E0 +4480 +F7E0 +0620 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_42E8 +ENCODING 17128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E280 +2FE0 +4000 +F7C0 +0440 +A440 +A7C0 +ENDCHAR +STARTCHAR U_42E9 +ENCODING 17129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26C0 +4440 +56C0 +E440 +2440 +47C0 +F280 +02A0 +A4A0 +A8E0 +ENDCHAR +STARTCHAR U_42EA +ENCODING 17130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E00 +2BE0 +4A40 +5A40 +EDC0 +2B40 +4B40 +FBC0 +0E40 +A840 +A8C0 +ENDCHAR +STARTCHAR U_42EB +ENCODING 17131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4880 +57C0 +E140 +2FE0 +4140 +F140 +07C0 +A100 +A300 +ENDCHAR +STARTCHAR U_42EC +ENCODING 17132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +5FE0 +E280 +2440 +4920 +F540 +09A0 +A140 +A300 +ENDCHAR +STARTCHAR U_42ED +ENCODING 17133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +57C0 +E000 +27C0 +4440 +F7C0 +0440 +A7C0 +A440 +ENDCHAR +STARTCHAR U_42EE +ENCODING 17134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5820 +E7C0 +2100 +47C0 +F100 +0540 +A380 +AFE0 +ENDCHAR +STARTCHAR U_42EF +ENCODING 17135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +47E0 +7100 +57C0 +7480 +8E60 +9080 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_42F0 +ENCODING 17136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +3580 +CE60 +0880 +3FC0 +1500 +2480 +ENDCHAR +STARTCHAR U_42F1 +ENCODING 17137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5540 +E540 +2BA0 +4100 +F380 +0540 +A920 +A100 +ENDCHAR +STARTCHAR U_42F2 +ENCODING 17138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5100 +EFE0 +2920 +4FE0 +F920 +0FE0 +A100 +A1E0 +ENDCHAR +STARTCHAR U_42F3 +ENCODING 17139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +4280 +56A0 +EAE0 +27C0 +4440 +F7C0 +0440 +A7C0 +A440 +ENDCHAR +STARTCHAR U_42F4 +ENCODING 17140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2140 +4080 +57E0 +E280 +2480 +4100 +F7E0 +0380 +A540 +A920 +ENDCHAR +STARTCHAR U_42F5 +ENCODING 17141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2200 +47E0 +FCA0 +0560 +A7A0 +A060 +ENDCHAR +STARTCHAR U_42F6 +ENCODING 17142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2FC0 +2200 +4FC0 +5840 +EFC0 +2840 +4FC0 +F840 +0FC0 +A480 +A840 +ENDCHAR +STARTCHAR U_42F7 +ENCODING 17143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13E0 +FD40 +5080 +9560 +0E00 +1080 +7FC0 +0420 +1500 +2480 +ENDCHAR +STARTCHAR U_42F8 +ENCODING 17144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +47E0 +5480 +E5E0 +2520 +45E0 +F520 +05E0 +A520 +A9E0 +ENDCHAR +STARTCHAR U_42F9 +ENCODING 17145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +43C0 +5240 +E3C0 +2000 +47E0 +F520 +07E0 +A520 +A7E0 +ENDCHAR +STARTCHAR U_42FA +ENCODING 17146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2C40 +4440 +4560 +FF40 +2C40 +5640 +F540 +0440 +A4A0 +A520 +ENDCHAR +STARTCHAR U_42FB +ENCODING 17147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +EC60 +2AA0 +4FE0 +F920 +0FE0 +A920 +A860 +ENDCHAR +STARTCHAR U_42FC +ENCODING 17148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2480 +45E0 +5420 +E7A0 +2920 +4AA0 +FFE0 +0AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_42FD +ENCODING 17149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2E40 +45E0 +5440 +EE40 +2540 +44C0 +FE40 +0440 +A640 +A8C0 +ENDCHAR +STARTCHAR U_42FE +ENCODING 17150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4440 +5BA0 +E480 +2D40 +42E0 +F520 +02C0 +A080 +A700 +ENDCHAR +STARTCHAR U_42FF +ENCODING 17151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +5540 +EFE0 +2500 +4520 +F4C0 +0480 +A540 +A620 +ENDCHAR +STARTCHAR U_4300 +ENCODING 17152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2C40 +4540 +54C0 +EE40 +2540 +4EC0 +F460 +05C0 +A440 +A440 +ENDCHAR +STARTCHAR U_4301 +ENCODING 17153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EBA0 +2820 +4100 +F7E0 +0240 +A180 +A640 +ENDCHAR +STARTCHAR U_4302 +ENCODING 17154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +47E0 +5400 +E7E0 +2500 +47E0 +F480 +07E0 +A880 +ABE0 +ENDCHAR +STARTCHAR U_4303 +ENCODING 17155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +3520 +4EA0 +54A0 +EEA0 +2AA0 +4EA0 +FAA0 +0E20 +AA20 +AAE0 +ENDCHAR +STARTCHAR U_4304 +ENCODING 17156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5AA0 +ED20 +29E0 +4100 +FFE0 +0440 +A380 +AC60 +ENDCHAR +STARTCHAR U_4305 +ENCODING 17157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +5BC0 +E940 +2FE0 +4940 +FBC0 +0A40 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_4306 +ENCODING 17158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4A40 +5FC0 +EA40 +2FC0 +4540 +F5A0 +05E0 +A920 +B0E0 +ENDCHAR +STARTCHAR U_4307 +ENCODING 17159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +57E0 +E920 +2280 +4700 +E240 +0FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_4308 +ENCODING 17160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2EE0 +4220 +EAA0 +0660 +AAA0 +A440 +ENDCHAR +STARTCHAR U_4309 +ENCODING 17161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4AA0 +5FE0 +E000 +2FE0 +4100 +F5E0 +0500 +A500 +AFE0 +ENDCHAR +STARTCHAR U_430A +ENCODING 17162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4A80 +5500 +E200 +2FC0 +4100 +EFE0 +0100 +A920 +AFE0 +ENDCHAR +STARTCHAR U_430B +ENCODING 17163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5100 +E280 +2440 +4BA0 +F000 +07C0 +A440 +A7C0 +ENDCHAR +STARTCHAR U_430C +ENCODING 17164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4660 +4AA0 +E220 +2440 +47E0 +F420 +07E0 +A420 +A7E0 +ENDCHAR +STARTCHAR U_430D +ENCODING 17165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +4440 +57C0 +EFE0 +2920 +4FE0 +F100 +0FE0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_430E +ENCODING 17166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7E0 +9A40 +9180 +F660 +0BC0 +1E40 +0BC0 +7FE0 +2480 +4440 +ENDCHAR +STARTCHAR U_430F +ENCODING 17167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +5480 +ED20 +27C0 +4800 +F100 +0920 +A920 +AFE0 +ENDCHAR +STARTCHAR U_4310 +ENCODING 17168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +4540 +5280 +E7C0 +2440 +47C0 +F440 +07C0 +A280 +ACE0 +ENDCHAR +STARTCHAR U_4311 +ENCODING 17169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FA0 +5940 +EF40 +2AE0 +4FA0 +F100 +07C0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_4312 +ENCODING 17170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4540 +57E0 +E540 +27E0 +4400 +F6A0 +07C0 +AA80 +ABE0 +ENDCHAR +STARTCHAR U_4313 +ENCODING 17171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +D540 +7E20 +57E0 +7D40 +0880 +1F60 +0800 +3F80 +1500 +2C80 +ENDCHAR +STARTCHAR U_4314 +ENCODING 17172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +5A40 +EBC0 +2800 +4FE0 +FDA0 +0FE0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_4315 +ENCODING 17173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5A40 +EA40 +2FE0 +4A40 +FAC0 +0F60 +AA40 +AA40 +ENDCHAR +STARTCHAR U_4316 +ENCODING 17174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +4FE0 +5480 +E7E0 +2480 +47E0 +F480 +0FE0 +A2C0 +A4A0 +ENDCHAR +STARTCHAR U_4317 +ENCODING 17175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +4FE0 +5540 +E540 +2FE0 +4540 +F540 +0FE0 +A000 +8AA0 +ENDCHAR +STARTCHAR U_4318 +ENCODING 17176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FD40 +A880 +FD40 +AE00 +1080 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_4319 +ENCODING 17177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5380 +EFE0 +2540 +47C0 +F540 +07C0 +A280 +AC60 +ENDCHAR +STARTCHAR U_431A +ENCODING 17178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EFE0 +2920 +4540 +FFE0 +0380 +A540 +A920 +ENDCHAR +STARTCHAR U_431B +ENCODING 17179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7900 +5240 +A380 +4100 +A7E0 +F880 +02C0 +F2A0 +94A0 +F180 +ENDCHAR +STARTCHAR U_431C +ENCODING 17180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +46C0 +5FE0 +E440 +2280 +4FE0 +F100 +0FE0 +A540 +A920 +ENDCHAR +STARTCHAR U_431D +ENCODING 17181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +57C0 +EAA0 +2280 +47C0 +F000 +0FE0 +A540 +A920 +ENDCHAR +STARTCHAR U_431E +ENCODING 17182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5BA0 +E000 +2EE0 +4AA0 +FEE0 +0440 +A440 +AAA0 +ENDCHAR +STARTCHAR U_431F +ENCODING 17183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2E40 +4BE0 +5AA0 +EE40 +29E0 +4E40 +FA40 +0BE0 +AE40 +A840 +ENDCHAR +STARTCHAR U_4320 +ENCODING 17184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7DE0 +52A0 +4A80 +B540 +BA20 +0C80 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_4321 +ENCODING 17185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +5FE0 +EAA0 +2FE0 +4440 +F7C0 +0440 +A280 +AFE0 +ENDCHAR +STARTCHAR U_4322 +ENCODING 17186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +5DA0 +EB60 +2280 +4540 +FBA0 +0080 +A300 +A080 +ENDCHAR +STARTCHAR U_4323 +ENCODING 17187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26E0 +4D40 +5320 +EFE0 +2820 +57C0 +F480 +07C0 +A440 +A7C0 +ENDCHAR +STARTCHAR U_4324 +ENCODING 17188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4920 +5FE0 +ED60 +2BA0 +4D60 +F920 +0D60 +ABA0 +AD60 +ENDCHAR +STARTCHAR U_4325 +ENCODING 17189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4FE0 +5100 +EFE0 +2040 +47C0 +F040 +07C0 +AA40 +ABA0 +ENDCHAR +STARTCHAR U_4326 +ENCODING 17190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +4360 +55A0 +EB20 +2480 +4FE0 +F480 +07E0 +A480 +A7E0 +ENDCHAR +STARTCHAR U_4327 +ENCODING 17191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +E020 +27C0 +4100 +FFE0 +0E40 +ABE0 +AE40 +ENDCHAR +STARTCHAR U_4328 +ENCODING 17192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +4440 +55E0 +EAA0 +3440 +4BA0 +F000 +0FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_4329 +ENCODING 17193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5FE0 +EAA0 +2FE0 +4140 +FFE0 +08A0 +AA40 +A8A0 +ENDCHAR +STARTCHAR U_432A +ENCODING 17194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +5AA0 +EEE0 +2BA0 +4AA0 +FB20 +0AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_432B +ENCODING 17195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +4F60 +5A40 +EFA0 +2000 +47C0 +F540 +07C0 +A280 +ACE0 +ENDCHAR +STARTCHAR U_432C +ENCODING 17196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +4A80 +54E0 +EE20 +2AE0 +4E80 +FAE0 +0E80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_432D +ENCODING 17197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5500 +EFE0 +2480 +47E0 +F480 +07E0 +A540 +AAA0 +ENDCHAR +STARTCHAR U_432E +ENCODING 17198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +5920 +EBA0 +2100 +42E0 +FFA0 +06E0 +ABA0 +AAE0 +ENDCHAR +STARTCHAR U_432F +ENCODING 17199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +57C0 +E540 +2280 +47E0 +FC80 +07E0 +A480 +A7E0 +ENDCHAR +STARTCHAR U_4330 +ENCODING 17200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4440 +57C0 +E440 +2FE0 +4540 +F7C0 +0540 +AFE0 +A140 +ENDCHAR +STARTCHAR U_4331 +ENCODING 17201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4400 +57C0 +E440 +2FE0 +4AA0 +FEA0 +0BE0 +AEA0 +ABA0 +ENDCHAR +STARTCHAR U_4332 +ENCODING 17202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5FE0 +E100 +2FE0 +4AA0 +FFE0 +0100 +AFE0 +AAA0 +ENDCHAR +STARTCHAR U_4333 +ENCODING 17203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5D60 +EBA0 +2D60 +4BA0 +F100 +07C0 +A140 +AFE0 +ENDCHAR +STARTCHAR U_4334 +ENCODING 17204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4400 +57C0 +E440 +2FE0 +4AA0 +FFA0 +0AE0 +AFA0 +AAA0 +ENDCHAR +STARTCHAR U_4335 +ENCODING 17205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +47E0 +5540 +E7E0 +26A0 +47E0 +F4A0 +07E0 +A8A0 +ABE0 +ENDCHAR +STARTCHAR U_4336 +ENCODING 17206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +4080 +57E0 +E180 +2180 +4280 +F280 +0480 +3480 +C980 +ENDCHAR +STARTCHAR U_4337 +ENCODING 17207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5920 +E920 +2920 +4FE0 +F920 +0920 +3920 +CFE0 +ENDCHAR +STARTCHAR U_4338 +ENCODING 17208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47C0 +5200 +E200 +2FE0 +4400 +F7C0 +0080 +3300 +C080 +ENDCHAR +STARTCHAR U_4339 +ENCODING 17209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +5BA0 +EAA0 +2AA0 +4BA0 +FAA0 +0820 +38A0 +C840 +ENDCHAR +STARTCHAR U_433A +ENCODING 17210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +4440 +57C0 +E440 +2440 +47C0 +F440 +04E0 +3F40 +C040 +ENDCHAR +STARTCHAR U_433B +ENCODING 17211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2220 +4220 +5320 +EAA0 +2660 +4AA0 +F320 +0220 +3220 +C660 +ENDCHAR +STARTCHAR U_433C +ENCODING 17212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47C0 +5440 +E440 +27C0 +4280 +F280 +02A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_433D +ENCODING 17213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +4A40 +5540 +E100 +2FE0 +4380 +F540 +0540 +A920 +A920 +ENDCHAR +STARTCHAR U_433E +ENCODING 17214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +E820 +2AA0 +4FE0 +F920 +0FE0 +3920 +C960 +ENDCHAR +STARTCHAR U_433F +ENCODING 17215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +43C0 +5240 +E3C0 +2000 +47E0 +F4A0 +07E0 +34A0 +C7E0 +ENDCHAR +STARTCHAR U_4340 +ENCODING 17216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2A80 +4AE0 +5A80 +EAC0 +2B20 +4200 +FFE0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_4341 +ENCODING 17217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2940 +47E0 +5080 +ED00 +26A0 +45C0 +F680 +05C0 +36A0 +CBE0 +ENDCHAR +STARTCHAR U_4342 +ENCODING 17218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7900 +A100 +2100 +FFE0 +2100 +A900 +B900 +C900 +0700 +ENDCHAR +STARTCHAR U_4343 +ENCODING 17219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FC40 +4880 +2500 +7FC0 +8400 +0400 +FFE0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4344 +ENCODING 17220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +78E0 +A080 +2080 +F880 +23E0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_4345 +ENCODING 17221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A80 +A240 +2520 +F880 +27E0 +A840 +BA80 +C900 +0080 +ENDCHAR +STARTCHAR U_4346 +ENCODING 17222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +A420 +2000 +FBC0 +2080 +A880 +B880 +C880 +0380 +ENDCHAR +STARTCHAR U_4347 +ENCODING 17223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4700 +7900 +A080 +27C0 +F840 +2080 +A880 +B900 +CB00 +04E0 +ENDCHAR +STARTCHAR U_4348 +ENCODING 17224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7900 +A540 +2380 +F900 +27E0 +A900 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_4349 +ENCODING 17225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7A20 +A220 +2220 +FBE0 +2000 +A940 +B940 +CA20 +0420 +ENDCHAR +STARTCHAR U_434A +ENCODING 17226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +A280 +2440 +FAA0 +2280 +A900 +B900 +CA80 +0440 +ENDCHAR +STARTCHAR U_434B +ENCODING 17227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +A7E0 +2540 +FD40 +27E0 +AD40 +BFE0 +C900 +03C0 +ENDCHAR +STARTCHAR U_434C +ENCODING 17228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +A240 +2180 +FFE0 +2000 +ABC0 +BA40 +CA40 +03C0 +ENDCHAR +STARTCHAR U_434D +ENCODING 17229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +77E0 +2240 +F980 +2180 +AA40 +FC20 +ENDCHAR +STARTCHAR U_434E +ENCODING 17230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +A7E0 +2540 +FFE0 +2560 +A7E0 +BD00 +C5E0 +0AA0 +ENDCHAR +STARTCHAR U_434F +ENCODING 17231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +9240 +9240 +9240 +9240 +FFC0 +8040 +8040 +8040 +8140 +8080 +ENDCHAR +STARTCHAR U_4350 +ENCODING 17232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +0000 +3F80 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4351 +ENCODING 17233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +AAA0 +9120 +AAA0 +8020 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4352 +ENCODING 17234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +0800 +FFC0 +1C00 +2A00 +4900 +88C0 +0800 +ENDCHAR +STARTCHAR U_4353 +ENCODING 17235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +7FC0 +0000 +7FC0 +1100 +2100 +7FE0 +0900 +3100 +C300 +ENDCHAR +STARTCHAR U_4354 +ENCODING 17236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +0800 +FFE0 +1000 +1200 +2400 +4980 +9E40 +ENDCHAR +STARTCHAR U_4355 +ENCODING 17237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +A480 +FF80 +0000 +FF80 +8800 +8800 +FFC0 +8400 +AA40 +C5C0 +ENDCHAR +STARTCHAR U_4356 +ENCODING 17238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +4000 +7F80 +8080 +3E80 +2280 +3EA0 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4357 +ENCODING 17239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +FFE0 +1000 +2100 +7E00 +0C00 +3080 +FFC0 +ENDCHAR +STARTCHAR U_4358 +ENCODING 17240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +5240 +7FC0 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4359 +ENCODING 17241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +4000 +7FC0 +A480 +2280 +FFE0 +4900 +7FC0 +0100 +ENDCHAR +STARTCHAR U_435A +ENCODING 17242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +7F80 +4080 +7F80 +4080 +7F80 +4A00 +67E0 +ENDCHAR +STARTCHAR U_435B +ENCODING 17243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8920 +FFE0 +0000 +FFE0 +8420 +BFA0 +8420 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_435C +ENCODING 17244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +2000 +7FC0 +C400 +7FC0 +4400 +7FC0 +4400 +7FE0 +ENDCHAR +STARTCHAR U_435D +ENCODING 17245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +FFE0 +0420 +F640 +2580 +5480 +8860 +FFE0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_435E +ENCODING 17246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +9120 +AAA0 +0280 +FFE0 +7A00 +4A40 +7980 +01A0 +FA60 +ENDCHAR +STARTCHAR U_435F +ENCODING 17247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0C00 +9240 +FFC0 +5080 +BF40 +4A20 +0E00 +3180 +ENDCHAR +STARTCHAR U_4360 +ENCODING 17248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +2A80 +2480 +7FC0 +4A40 +5F40 +4080 +ENDCHAR +STARTCHAR U_4361 +ENCODING 17249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +7FC0 +4900 +7FC0 +4940 +7FC0 +5120 +9DE0 +ENDCHAR +STARTCHAR U_4362 +ENCODING 17250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2000 +7FC0 +AA80 +7FC0 +2A80 +FFE0 +5240 +C920 +ENDCHAR +STARTCHAR U_4363 +ENCODING 17251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +9520 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4364 +ENCODING 17252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +5B40 +5540 +9520 +2080 +3F80 +4080 +ENDCHAR +STARTCHAR U_4365 +ENCODING 17253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_4366 +ENCODING 17254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +1080 +FDE0 +5740 +7DE0 +1140 +FDE0 +9540 +BDE0 +ENDCHAR +STARTCHAR U_4367 +ENCODING 17255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +F100 +A100 +A7C0 +3100 +6100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4368 +ENCODING 17256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +F7E0 +2100 +F7E0 +2520 +F520 +2520 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_4369 +ENCODING 17257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +FBE0 +2440 +7240 +2240 +FA40 +2180 +2180 +4240 +8420 +ENDCHAR +STARTCHAR U_436A +ENCODING 17258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +FFE0 +2100 +F100 +27C0 +F100 +2380 +2540 +4920 +9100 +ENDCHAR +STARTCHAR U_436B +ENCODING 17259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6080 +F7E0 +2420 +F200 +2240 +F280 +2300 +2220 +4220 +83E0 +ENDCHAR +STARTCHAR U_436C +ENCODING 17260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67C0 +F100 +2540 +F380 +2100 +FFE0 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_436D +ENCODING 17261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67C0 +F440 +2540 +F540 +2FE0 +F440 +2540 +27E0 +4040 +8080 +ENDCHAR +STARTCHAR U_436E +ENCODING 17262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +6280 +FAA0 +26C0 +F280 +2280 +F6C0 +2AA0 +2280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_436F +ENCODING 17263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +63C0 +F480 +2FE0 +F400 +25C0 +F540 +25C0 +2500 +4520 +89E0 +ENDCHAR +STARTCHAR U_4370 +ENCODING 17264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67E0 +F4A0 +24A0 +F7E0 +24A0 +F4A0 +2560 +2620 +47E0 +8420 +ENDCHAR +STARTCHAR U_4371 +ENCODING 17265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +F280 +2440 +FBA0 +2100 +FFE0 +2100 +2540 +4920 +8300 +ENDCHAR +STARTCHAR U_4372 +ENCODING 17266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +64C0 +F440 +26C0 +F440 +27C0 +F280 +2280 +22A0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_4373 +ENCODING 17267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +6EE0 +FAA0 +2440 +FAA0 +2000 +FEE0 +2AA0 +2440 +4440 +8AA0 +ENDCHAR +STARTCHAR U_4374 +ENCODING 17268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +6700 +F100 +2FE0 +F380 +2D60 +F100 +2FE0 +2240 +4180 +8660 +ENDCHAR +STARTCHAR U_4375 +ENCODING 17269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +63C0 +F480 +2FC0 +F140 +2FE0 +F140 +27C0 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_4376 +ENCODING 17270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6FE0 +F100 +27C0 +F540 +27C0 +F540 +27C0 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_4377 +ENCODING 17271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F240 +2FE0 +F440 +27C0 +F100 +2FE0 +2500 +4FE0 +8100 +ENDCHAR +STARTCHAR U_4378 +ENCODING 17272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9140 +6FE0 +F100 +27C0 +F540 +27C0 +F540 +2080 +2FE0 +4280 +8080 +ENDCHAR +STARTCHAR U_4379 +ENCODING 17273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F440 +27C0 +F440 +27C0 +F440 +2140 +2FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_437A +ENCODING 17274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F540 +27C0 +F100 +27C0 +F540 +27C0 +2100 +4AA0 +8BC0 +ENDCHAR +STARTCHAR U_437B +ENCODING 17275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +65A0 +F7E0 +2480 +F7E0 +2240 +F7E0 +2240 +2FE0 +4240 +8C20 +ENDCHAR +STARTCHAR U_437C +ENCODING 17276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +6FE0 +FA40 +2FE0 +F6C0 +2B60 +F7C0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_437D +ENCODING 17277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +6400 +F7E0 +2540 +F7E0 +2540 +F7E0 +2540 +24E0 +4680 +8BE0 +ENDCHAR +STARTCHAR U_437E +ENCODING 17278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5120 +5120 +55A0 +5360 +F920 +5360 +55A0 +5120 +55A0 +9240 +ENDCHAR +STARTCHAR U_437F +ENCODING 17279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +28A0 +1860 +69A0 +8A20 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4380 +ENCODING 17280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +28A0 +ABE0 +7A80 +2A80 +2AA0 +7AA0 +ABC0 +2AA0 +A960 +5A20 +ENDCHAR +STARTCHAR U_4381 +ENCODING 17281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +25A0 +2360 +2120 +FB60 +8DA0 +8920 +8DA0 +FA40 +ENDCHAR +STARTCHAR U_4382 +ENCODING 17282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2BE0 +AA20 +7FA0 +2AA0 +6BA0 +BA60 +2A00 +2A20 +AA20 +59E0 +ENDCHAR +STARTCHAR U_4383 +ENCODING 17283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7CA0 +56A0 +55E0 +7CA0 +55E0 +54A0 +FEA0 +44A0 +4DE0 +ENDCHAR +STARTCHAR U_4384 +ENCODING 17284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +5120 +55A0 +5360 +B120 +0360 +F5A0 +9120 +95A0 +F240 +ENDCHAR +STARTCHAR U_4385 +ENCODING 17285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +F120 +95A0 +9360 +9120 +F360 +95A0 +9120 +95A0 +F240 +ENDCHAR +STARTCHAR U_4386 +ENCODING 17286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +28A0 +D760 +0A00 +1980 +E460 +1F80 +0100 +0E00 +0100 +ENDCHAR +STARTCHAR U_4387 +ENCODING 17287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +2120 +7920 +4DA0 +6B60 +5920 +EB60 +6DA0 +5920 +8DA0 +9A40 +ENDCHAR +STARTCHAR U_4388 +ENCODING 17288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2880 +2BE0 +BAA0 +6BE0 +2AA0 +6BE0 +B8A0 +28C0 +A8A0 +5B60 +ENDCHAR +STARTCHAR U_4389 +ENCODING 17289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +28A0 +ABE0 +7A80 +2AA0 +2BA0 +7AC0 +AA80 +2AA0 +AD60 +5620 +ENDCHAR +STARTCHAR U_438A +ENCODING 17290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8920 +55A0 +2360 +5120 +8920 +7B60 +4DA0 +4920 +7B60 +ENDCHAR +STARTCHAR U_438B +ENCODING 17291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A7E0 +F920 +A5A0 +2360 +F920 +0120 +FB60 +8DA0 +8920 +FB60 +ENDCHAR +STARTCHAR U_438C +ENCODING 17292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2520 +B5E0 +6C40 +2440 +6D60 +B540 +25C0 +B540 +4A20 +ENDCHAR +STARTCHAR U_438D +ENCODING 17293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2BE0 +2880 +BBE0 +6AA0 +2BE0 +6AA0 +BBE0 +2AA0 +AAA0 +5A40 +ENDCHAR +STARTCHAR U_438E +ENCODING 17294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5540 +5540 +7740 +D540 +5740 +7540 +D5C0 +5740 +5D40 +A160 +ENDCHAR +STARTCHAR U_438F +ENCODING 17295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +68A0 +86A0 +79E0 +10A0 +21A0 +7AE0 +48A0 +4AA0 +7960 +ENDCHAR +STARTCHAR U_4390 +ENCODING 17296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F7E0 +2120 +F5A0 +9360 +F120 +9360 +F5A0 +2120 +F5A0 +2240 +ENDCHAR +STARTCHAR U_4391 +ENCODING 17297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2840 +ABC0 +7840 +2FE0 +2880 +7AA0 +A9C0 +2AC0 +ACA0 +5980 +ENDCHAR +STARTCHAR U_4392 +ENCODING 17298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2FE0 +A900 +79C0 +2EA0 +2860 +7940 +AFE0 +2940 +A9A0 +5E60 +ENDCHAR +STARTCHAR U_4393 +ENCODING 17299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2BA0 +A9C0 +7AC0 +2CA0 +2980 +7BE0 +AA20 +2BE0 +AA20 +5BE0 +ENDCHAR +STARTCHAR U_4394 +ENCODING 17300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2FE0 +A880 +7BE0 +2AA0 +2BE0 +7AA0 +A840 +2FE0 +A940 +5840 +ENDCHAR +STARTCHAR U_4395 +ENCODING 17301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5500 +2A80 +4440 +7FE0 +8020 +7BC0 +2940 +18C0 +6B40 +1840 +ENDCHAR +STARTCHAR U_4396 +ENCODING 17302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +F920 +ADA0 +FB60 +0120 +7B60 +4DA0 +7920 +4DA0 +7A40 +ENDCHAR +STARTCHAR U_4397 +ENCODING 17303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +23E0 +FCA0 +4AA0 +F5E0 +50A0 +FDA0 +86E0 +BCA0 +AEA0 +BD60 +ENDCHAR +STARTCHAR U_4398 +ENCODING 17304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2920 +FDA0 +2B60 +F920 +2360 +ADA0 +F920 +ADA0 +AA40 +ENDCHAR +STARTCHAR U_4399 +ENCODING 17305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +84A0 +7AA0 +29E0 +B0A0 +7DA0 +D6E0 +7CA0 +4AA0 +8560 +ENDCHAR +STARTCHAR U_439A +ENCODING 17306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +2FE0 +2A40 +AFE0 +7A40 +2FE0 +6920 +BFE0 +2A80 +AE20 +5BC0 +ENDCHAR +STARTCHAR U_439B +ENCODING 17307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3E80 +0900 +FFE0 +0C00 +3040 +DFC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_439C +ENCODING 17308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7BC0 +14A0 +FFE0 +1080 +6100 +BB60 +2180 +2D20 +31E0 +ENDCHAR +STARTCHAR U_439D +ENCODING 17309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3E80 +0900 +FFE0 +0800 +3040 +DFC0 +0000 +FBE0 +28A0 +DB60 +ENDCHAR +STARTCHAR U_439E +ENCODING 17310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3E80 +0500 +FFE0 +0900 +3F80 +D4C0 +1280 +7FC0 +0040 +0180 +ENDCHAR +STARTCHAR U_439F +ENCODING 17311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +F900 +5FE0 +5AA0 +9AA0 +AAA0 +6AA0 +5A20 +9AA0 +0840 +ENDCHAR +STARTCHAR U_43A0 +ENCODING 17312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4200 +FFE0 +5AA0 +5AA0 +DAA0 +7A20 +5840 +5020 +9FE0 +ENDCHAR +STARTCHAR U_43A1 +ENCODING 17313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +7FC0 +5240 +5240 +52C0 +4400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_43A2 +ENCODING 17314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2400 +7000 +27E0 +F840 +2080 +7100 +6A20 +A420 +23E0 +ENDCHAR +STARTCHAR U_43A3 +ENCODING 17315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FA40 +2540 +7540 +2440 +FC40 +2540 +7640 +6CA0 +A120 +2600 +ENDCHAR +STARTCHAR U_43A4 +ENCODING 17316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +7400 +27E0 +FC20 +27A0 +76A0 +6FA0 +A420 +2840 +ENDCHAR +STARTCHAR U_43A5 +ENCODING 17317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA40 +2420 +7180 +2240 +FC20 +23C0 +7240 +6A40 +A3C0 +2240 +ENDCHAR +STARTCHAR U_43A6 +ENCODING 17318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FAA0 +22A0 +74C0 +2120 +FA20 +2080 +72A0 +6AC0 +A120 +2620 +ENDCHAR +STARTCHAR U_43A7 +ENCODING 17319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +7240 +2180 +FFE0 +2000 +73C0 +6A40 +A240 +23C0 +ENDCHAR +STARTCHAR U_43A8 +ENCODING 17320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2280 +7540 +27E0 +FD40 +27C0 +7540 +6FC0 +A120 +21E0 +ENDCHAR +STARTCHAR U_43A9 +ENCODING 17321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FD40 +2A80 +7540 +22A0 +FFE0 +24A0 +77E0 +6CA0 +A7E0 +2420 +ENDCHAR +STARTCHAR U_43AA +ENCODING 17322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +7440 +27C0 +F880 +2FE0 +7480 +6A80 +A080 +2180 +ENDCHAR +STARTCHAR U_43AB +ENCODING 17323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FCA0 +2560 +77E0 +2240 +FD20 +23C0 +7240 +6D80 +A180 +2660 +ENDCHAR +STARTCHAR U_43AC +ENCODING 17324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +26A0 +F7E0 +2100 +FBC0 +2100 +77E0 +6900 +A240 +27A0 +ENDCHAR +STARTCHAR U_43AD +ENCODING 17325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F5E0 +2340 +7040 +27E0 +FA00 +22E0 +72A0 +6AE0 +A500 +28E0 +ENDCHAR +STARTCHAR U_43AE +ENCODING 17326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2140 +77E0 +24A0 +FFE0 +24A0 +75E0 +6D60 +A5E0 +2420 +ENDCHAR +STARTCHAR U_43AF +ENCODING 17327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +77E0 +2520 +FFE0 +2100 +77E0 +6900 +A240 +2420 +ENDCHAR +STARTCHAR U_43B0 +ENCODING 17328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +FFC0 +2A80 +7F80 +20E0 +FEA0 +2AA0 +7EA0 +6AA0 +AEA0 +2120 +ENDCHAR +STARTCHAR U_43B1 +ENCODING 17329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +2FE0 +7480 +2AE0 +FE80 +20E0 +7E80 +6AE0 +AE80 +2AE0 +ENDCHAR +STARTCHAR U_43B2 +ENCODING 17330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5040 +5080 +7080 +5100 +7100 +5200 +5A20 +7420 +D420 +13E0 +ENDCHAR +STARTCHAR U_43B3 +ENCODING 17331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4920 +4920 +79E0 +4920 +7920 +49E0 +4D20 +7920 +C920 +0A60 +ENDCHAR +STARTCHAR U_43B4 +ENCODING 17332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +5240 +77E0 +5240 +7240 +57E0 +7A40 +D240 +1240 +1440 +ENDCHAR +STARTCHAR U_43B5 +ENCODING 17333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F940 +5040 +7240 +5280 +76C0 +5AA0 +5320 +7A00 +D640 +19C0 +ENDCHAR +STARTCHAR U_43B6 +ENCODING 17334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +57E0 +74A0 +54A0 +77E0 +54A0 +5CA0 +77E0 +D080 +1080 +ENDCHAR +STARTCHAR U_43B7 +ENCODING 17335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +57C0 +7500 +5100 +7FE0 +5100 +5B80 +7540 +D920 +1100 +ENDCHAR +STARTCHAR U_43B8 +ENCODING 17336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5100 +57C0 +7240 +5240 +77E0 +5000 +7BC0 +D240 +1240 +13C0 +ENDCHAR +STARTCHAR U_43B9 +ENCODING 17337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1500 +FFC0 +1500 +2480 +FFE0 +1100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_43BA +ENCODING 17338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FA20 +5FA0 +72A0 +5FA0 +72A0 +5FA0 +5AA0 +7AA0 +D220 +1260 +ENDCHAR +STARTCHAR U_43BB +ENCODING 17339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +52A0 +53E0 +72A0 +53E0 +7220 +5BE0 +7360 +D3E0 +1220 +1460 +ENDCHAR +STARTCHAR U_43BC +ENCODING 17340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +53C0 +7040 +5FE0 +7100 +5D40 +7380 +D540 +1920 +1300 +ENDCHAR +STARTCHAR U_43BD +ENCODING 17341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5280 +53E0 +7240 +5320 +7000 +53E0 +5A20 +73E0 +D220 +13E0 +ENDCHAR +STARTCHAR U_43BE +ENCODING 17342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +5440 +7BA0 +5000 +77E0 +56A0 +5FE0 +76A0 +D6A0 +1460 +ENDCHAR +STARTCHAR U_43BF +ENCODING 17343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FC80 +5480 +75A0 +5FA0 +74C0 +5680 +5D80 +74C0 +D520 +1520 +ENDCHAR +STARTCHAR U_43C0 +ENCODING 17344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FA20 +5FA0 +72A0 +5FA0 +7AA0 +5FA0 +52A0 +7F20 +DAA0 +1260 +ENDCHAR +STARTCHAR U_43C1 +ENCODING 17345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +5FE0 +7920 +57C0 +7280 +5FE0 +5100 +7FC0 +D100 +1100 +ENDCHAR +STARTCHAR U_43C2 +ENCODING 17346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +FD60 +5520 +7760 +5520 +77E0 +5100 +57E0 +7A40 +D180 +1660 +ENDCHAR +STARTCHAR U_43C3 +ENCODING 17347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5420 +53C0 +7240 +53C0 +7240 +5BC0 +7080 +D7E0 +1240 +1420 +ENDCHAR +STARTCHAR U_43C4 +ENCODING 17348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5AA0 +7440 +5BA0 +7200 +57C0 +5900 +77C0 +D100 +17E0 +ENDCHAR +STARTCHAR U_43C5 +ENCODING 17349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +57E0 +55A0 +7A40 +5420 +7BC0 +5000 +5FE0 +7540 +D920 +1100 +ENDCHAR +STARTCHAR U_43C6 +ENCODING 17350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +5280 +7FE0 +5AA0 +7FE0 +5AA0 +5FE0 +7540 +D4C0 +17C0 +ENDCHAR +STARTCHAR U_43C7 +ENCODING 17351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +5FE0 +7AA0 +5FE0 +7000 +57C0 +5000 +7FE0 +D540 +1920 +ENDCHAR +STARTCHAR U_43C8 +ENCODING 17352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +5480 +77E0 +5240 +7480 +57E0 +5A40 +76C0 +DB60 +1240 +ENDCHAR +STARTCHAR U_43C9 +ENCODING 17353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5520 +57E0 +7240 +5480 +77E0 +5240 +57E0 +7000 +D540 +1AA0 +ENDCHAR +STARTCHAR U_43CA +ENCODING 17354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FAE0 +5F80 +75E0 +5F20 +70E0 +5780 +5DE0 +7780 +D5A0 +15E0 +ENDCHAR +STARTCHAR U_43CB +ENCODING 17355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +3F80 +2480 +E5E0 +4540 +CDC0 +5520 +75E0 +ENDCHAR +STARTCHAR U_43CC +ENCODING 17356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1200 +2100 +4080 +BFE0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_43CD +ENCODING 17357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1200 +2100 +FF80 +0080 +7F00 +4100 +5900 +4700 +5900 +4300 +ENDCHAR +STARTCHAR U_43CE +ENCODING 17358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +9480 +F480 +9680 +9580 +F580 +9480 +94A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_43CF +ENCODING 17359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4880 +4880 +7880 +4FE0 +4880 +7880 +4880 +4880 +AA80 +9100 +ENDCHAR +STARTCHAR U_43D0 +ENCODING 17360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4BC0 +7940 +4940 +4FE0 +7900 +4900 +4A80 +AA40 +9420 +ENDCHAR +STARTCHAR U_43D1 +ENCODING 17361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F80 +2900 +E600 +1800 +3FC0 +C440 +5B40 +4440 +5B40 +4040 +ENDCHAR +STARTCHAR U_43D2 +ENCODING 17362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A80 +4A80 +7BE0 +4A00 +4A00 +7BC0 +4A40 +4A40 +AA40 +9440 +ENDCHAR +STARTCHAR U_43D3 +ENCODING 17363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BC0 +6800 +5800 +4FE0 +5A80 +6A80 +4A80 +4AA0 +AAA0 +94E0 +ENDCHAR +STARTCHAR U_43D4 +ENCODING 17364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +4940 +7940 +4940 +4BC0 +7940 +4940 +4940 +A940 +97E0 +ENDCHAR +STARTCHAR U_43D5 +ENCODING 17365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4880 +7880 +4880 +4BE0 +7880 +4880 +4880 +A880 +93E0 +ENDCHAR +STARTCHAR U_43D6 +ENCODING 17366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BA0 +48A0 +48A0 +7BA0 +4A20 +4A20 +7BA0 +48A0 +48A0 +AAA0 +9120 +ENDCHAR +STARTCHAR U_43D7 +ENCODING 17367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BC0 +4C00 +7BC0 +4800 +4F80 +7880 +4880 +48A0 +A860 +9020 +ENDCHAR +STARTCHAR U_43D8 +ENCODING 17368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9540 +9540 +F540 +9540 +9540 +F540 +9560 +9600 +9400 +B7E0 +ENDCHAR +STARTCHAR U_43D9 +ENCODING 17369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FE0 +7D20 +4D20 +4900 +7980 +4A80 +4AA0 +AAA0 +94E0 +ENDCHAR +STARTCHAR U_43DA +ENCODING 17370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7B40 +4D20 +4D00 +7920 +4840 +4880 +A900 +9600 +ENDCHAR +STARTCHAR U_43DB +ENCODING 17371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +6A20 +5C20 +49A0 +5820 +6BE0 +4820 +4820 +A940 +9080 +ENDCHAR +STARTCHAR U_43DC +ENCODING 17372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +6A40 +5A80 +4AE0 +5A20 +6B20 +4AC0 +4A40 +AAA0 +9520 +ENDCHAR +STARTCHAR U_43DD +ENCODING 17373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4900 +7900 +4FE0 +4A00 +7BC0 +4840 +4A80 +A900 +9080 +ENDCHAR +STARTCHAR U_43DE +ENCODING 17374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6BC0 +5880 +4880 +5FE0 +6880 +49C0 +4AA0 +AAA0 +9480 +ENDCHAR +STARTCHAR U_43DF +ENCODING 17375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9080 +92A0 +F220 +9640 +9AA0 +FB20 +9200 +9620 +9A20 +B1E0 +ENDCHAR +STARTCHAR U_43E0 +ENCODING 17376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7000 +5440 +5440 +7240 +5280 +5080 +9100 +B7E0 +ENDCHAR +STARTCHAR U_43E1 +ENCODING 17377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +4800 +7800 +4FE0 +4880 +7980 +4AC0 +4CA0 +8880 +9980 +ENDCHAR +STARTCHAR U_43E2 +ENCODING 17378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5080 +57E0 +74A0 +5480 +57C0 +7540 +5540 +5480 +9540 +BA20 +ENDCHAR +STARTCHAR U_43E3 +ENCODING 17379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +4A40 +4A40 +7BC0 +4A40 +4A40 +8A40 +9FE0 +ENDCHAR +STARTCHAR U_43E4 +ENCODING 17380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4820 +4820 +7FE0 +4820 +4BA0 +7AA0 +4AA0 +4BA0 +8820 +9860 +ENDCHAR +STARTCHAR U_43E5 +ENCODING 17381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +57C0 +5540 +77C0 +5540 +7FE0 +5440 +5440 +9440 +B4C0 +ENDCHAR +STARTCHAR U_43E6 +ENCODING 17382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5700 +5100 +7FE0 +5100 +5100 +77C0 +5440 +5440 +97C0 +B440 +ENDCHAR +STARTCHAR U_43E7 +ENCODING 17383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +49C0 +4A40 +7D80 +4900 +7E80 +49E0 +4F20 +48C0 +8980 +9E00 +ENDCHAR +STARTCHAR U_43E8 +ENCODING 17384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4A20 +7A20 +4BE0 +4A00 +7BE0 +4A20 +4A20 +8BE0 +9A20 +ENDCHAR +STARTCHAR U_43E9 +ENCODING 17385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4980 +4A40 +7C20 +4BC0 +4800 +7BC0 +4A40 +4A40 +8BC0 +9A40 +ENDCHAR +STARTCHAR U_43EA +ENCODING 17386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +4A40 +7BC0 +4A40 +4BC0 +7A40 +4A40 +4FE0 +4840 +9840 +ENDCHAR +STARTCHAR U_43EB +ENCODING 17387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5480 +7FE0 +5480 +5580 +76C0 +54A0 +5480 +9480 +B480 +ENDCHAR +STARTCHAR U_43EC +ENCODING 17388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5280 +5440 +77C0 +5500 +57C0 +7900 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_43ED +ENCODING 17389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +57C0 +7900 +5100 +5FE0 +7100 +5380 +5540 +9920 +B100 +ENDCHAR +STARTCHAR U_43EE +ENCODING 17390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5FE0 +7120 +5220 +54C0 +7820 +56C0 +5000 +9280 +BC60 +ENDCHAR +STARTCHAR U_43EF +ENCODING 17391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5FE0 +7100 +5100 +57C0 +7100 +52A0 +5620 +5A40 +A9C0 +ENDCHAR +STARTCHAR U_43F0 +ENCODING 17392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5120 +5520 +7920 +52A0 +5C40 +7100 +52A0 +5620 +9A40 +A9C0 +ENDCHAR +STARTCHAR U_43F1 +ENCODING 17393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7400 +57E0 +5420 +77A0 +54A0 +57A0 +9420 +B8C0 +ENDCHAR +STARTCHAR U_43F2 +ENCODING 17394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +57C0 +7140 +57C0 +5500 +7FE0 +5320 +5520 +99C0 +B100 +ENDCHAR +STARTCHAR U_43F3 +ENCODING 17395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7420 +55C0 +5F00 +7500 +55E0 +5740 +7D40 +5540 +5540 +9540 +BA40 +ENDCHAR +STARTCHAR U_43F4 +ENCODING 17396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +54A0 +52C0 +77E0 +5420 +57E0 +7420 +57E0 +5420 +9420 +B460 +ENDCHAR +STARTCHAR U_43F5 +ENCODING 17397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5240 +5FE0 +72A0 +52C0 +52A0 +72C0 +52A0 +54C0 +97A0 +B8E0 +ENDCHAR +STARTCHAR U_43F6 +ENCODING 17398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +5480 +57E0 +7480 +55A0 +56E0 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_43F7 +ENCODING 17399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5000 +77C0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_43F8 +ENCODING 17400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +57C0 +7240 +5240 +5FE0 +7000 +53C0 +5240 +9240 +B3C0 +ENDCHAR +STARTCHAR U_43F9 +ENCODING 17401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5440 +77C0 +5280 +5280 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_43FA +ENCODING 17402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5C40 +5380 +7C60 +5100 +57C0 +7100 +57C0 +5100 +9FE0 +B100 +ENDCHAR +STARTCHAR U_43FB +ENCODING 17403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7100 +5100 +5FE0 +7100 +5200 +5240 +94E0 +B720 +ENDCHAR +STARTCHAR U_43FC +ENCODING 17404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A40 +4FE0 +7940 +49A0 +4E60 +7A40 +4FE0 +4940 +89A0 +9E60 +ENDCHAR +STARTCHAR U_43FD +ENCODING 17405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7440 +5280 +5FE0 +7000 +57C0 +5440 +9440 +B7C0 +ENDCHAR +STARTCHAR U_43FE +ENCODING 17406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5100 +7FC0 +5200 +5FE0 +7540 +5BA0 +5100 +9FC0 +B100 +ENDCHAR +STARTCHAR U_43FF +ENCODING 17407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7BE0 +4E40 +7980 +4260 +BF80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_4400 +ENCODING 17408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7440 +5FE0 +5040 +7740 +5540 +5740 +5040 +B0C0 +ENDCHAR +STARTCHAR U_4401 +ENCODING 17409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +72A0 +5DC0 +5280 +7FC0 +52A0 +5DA0 +5280 +9100 +ENDCHAR +STARTCHAR U_4402 +ENCODING 17410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5440 +7780 +5100 +5FE0 +7520 +53C0 +5540 +5920 +B300 +ENDCHAR +STARTCHAR U_4403 +ENCODING 17411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +54E0 +77A0 +54A0 +57E0 +74A0 +55A0 +56E0 +54A0 +97E0 +ENDCHAR +STARTCHAR U_4404 +ENCODING 17412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5240 +7480 +5300 +5460 +7420 +56E0 +5420 +5420 +B7E0 +ENDCHAR +STARTCHAR U_4405 +ENCODING 17413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7500 +55E0 +5680 +7480 +57E0 +5480 +5540 +9A20 +ENDCHAR +STARTCHAR U_4406 +ENCODING 17414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70E0 +5720 +5920 +7540 +5100 +5FE0 +7100 +5380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_4407 +ENCODING 17415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5AA0 +72A0 +52A0 +5540 +77E0 +5420 +57E0 +5420 +B7E0 +ENDCHAR +STARTCHAR U_4408 +ENCODING 17416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5440 +77C0 +5440 +57C0 +5440 +5440 +BFE0 +ENDCHAR +STARTCHAR U_4409 +ENCODING 17417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +5540 +5540 +72A0 +5000 +57E0 +7520 +57E0 +5520 +57E0 +9420 +ENDCHAR +STARTCHAR U_440A +ENCODING 17418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7420 +57E0 +5480 +7480 +57E0 +5480 +55A0 +B6E0 +ENDCHAR +STARTCHAR U_440B +ENCODING 17419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5240 +5420 +7900 +5240 +57E0 +7200 +5140 +5520 +5C40 +93C0 +ENDCHAR +STARTCHAR U_440C +ENCODING 17420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +3F80 +2A80 +3F80 +2A80 +FFE0 +5140 +9F20 +1100 +1F00 +2100 +ENDCHAR +STARTCHAR U_440D +ENCODING 17421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5000 +57C0 +7440 +57C0 +5440 +5280 +9FE0 +ENDCHAR +STARTCHAR U_440E +ENCODING 17422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5000 +7FE0 +5500 +55C0 +5700 +98E0 +ENDCHAR +STARTCHAR U_440F +ENCODING 17423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5200 +5FE0 +7440 +5FE0 +5540 +5640 +97C0 +ENDCHAR +STARTCHAR U_4410 +ENCODING 17424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7340 +5E40 +5340 +72E0 +5F40 +5240 +7740 +5AC0 +5240 +52A0 +9320 +ENDCHAR +STARTCHAR U_4411 +ENCODING 17425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5540 +75C0 +5400 +57E0 +7100 +5FE0 +5380 +5540 +B920 +ENDCHAR +STARTCHAR U_4412 +ENCODING 17426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7920 +53C0 +5E80 +7100 +5FC0 +5240 +5180 +9E00 +ENDCHAR +STARTCHAR U_4413 +ENCODING 17427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5200 +57C0 +7440 +57C0 +5440 +77C0 +5440 +57C0 +9440 +9820 +ENDCHAR +STARTCHAR U_4414 +ENCODING 17428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AFE0 +E820 +AFE0 +A800 +EFE0 +AAA0 +AFE0 +AAA0 +B2A0 +ENDCHAR +STARTCHAR U_4415 +ENCODING 17429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5FE0 +7440 +57C0 +5440 +77C0 +5440 +5FE0 +5040 +B040 +ENDCHAR +STARTCHAR U_4416 +ENCODING 17430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +56A0 +55C0 +77E0 +5480 +55C0 +56A0 +9880 +ENDCHAR +STARTCHAR U_4417 +ENCODING 17431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +5240 +7280 +5FE0 +5240 +77E0 +5C40 +57C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4418 +ENCODING 17432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5280 +57E0 +7200 +5FE0 +7200 +53E0 +5520 +54C0 +9B20 +ENDCHAR +STARTCHAR U_4419 +ENCODING 17433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +77C0 +5100 +57C0 +7540 +57C0 +5100 +5FE0 +9100 +ENDCHAR +STARTCHAR U_441A +ENCODING 17434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AAA0 +EEA0 +AAA0 +AEA0 +E8A0 +AAA0 +AEE0 +A980 +A080 +ENDCHAR +STARTCHAR U_441B +ENCODING 17435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5240 +77E0 +5A40 +53C0 +7240 +53C0 +5240 +5FE0 +9040 +ENDCHAR +STARTCHAR U_441C +ENCODING 17436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5440 +57C0 +7440 +57C0 +5440 +5FE0 +9440 +ENDCHAR +STARTCHAR U_441D +ENCODING 17437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +57C0 +7440 +57C0 +5440 +77C0 +5440 +57C0 +5440 +B820 +ENDCHAR +STARTCHAR U_441E +ENCODING 17438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5220 +56E0 +7880 +56E0 +5220 +7BA0 +5660 +5BA0 +5220 +BCC0 +ENDCHAR +STARTCHAR U_441F +ENCODING 17439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +77C0 +5280 +5FE0 +7540 +57C0 +5540 +5FE0 +B440 +ENDCHAR +STARTCHAR U_4420 +ENCODING 17440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +7100 +5FE0 +5400 +77C0 +5540 +5540 +5540 +B960 +ENDCHAR +STARTCHAR U_4421 +ENCODING 17441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +9520 +7FC0 +4A40 +75C0 +4A40 +71C0 +ENDCHAR +STARTCHAR U_4422 +ENCODING 17442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5AA0 +77A0 +5220 +5440 +77E0 +5AA0 +57A0 +5220 +BCC0 +ENDCHAR +STARTCHAR U_4423 +ENCODING 17443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7000 +57C0 +5540 +76C0 +5540 +5640 +57C0 +B820 +ENDCHAR +STARTCHAR U_4424 +ENCODING 17444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5100 +77C0 +5100 +5FE0 +7400 +57E0 +5480 +5880 +B7E0 +ENDCHAR +STARTCHAR U_4425 +ENCODING 17445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5440 +5A20 +7480 +57C0 +5000 +7EE0 +5AA0 +5660 +5AA0 +9660 +ENDCHAR +STARTCHAR U_4426 +ENCODING 17446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFC0 +A100 +FFE0 +A480 +AFC0 +E000 +AFE0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_4427 +ENCODING 17447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5000 +73C0 +5240 +57E0 +7420 +57A0 +54A0 +57A0 +B460 +ENDCHAR +STARTCHAR U_4428 +ENCODING 17448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE40 +1240 +7C60 +0000 +FFC0 +AA40 +3A40 +2980 +3A40 +4C20 +ENDCHAR +STARTCHAR U_4429 +ENCODING 17449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5540 +57C0 +7000 +5FE0 +5000 +77C0 +5440 +57C0 +5280 +9FE0 +ENDCHAR +STARTCHAR U_442A +ENCODING 17450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5C80 +77C0 +5480 +57E0 +7480 +57C0 +5260 +5420 +B8C0 +ENDCHAR +STARTCHAR U_442B +ENCODING 17451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A940 +B2A0 +E6A0 +A800 +B880 +EAE0 +AA80 +AA80 +AB80 +AC60 +ENDCHAR +STARTCHAR U_442C +ENCODING 17452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +A280 +EFE0 +AAA0 +AFE0 +EAA0 +AFE0 +A540 +A640 +A7C0 +ENDCHAR +STARTCHAR U_442D +ENCODING 17453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +BFE0 +AAA0 +FBA0 +A000 +BFE0 +E220 +AFC0 +AA40 +AAC0 +A200 +ENDCHAR +STARTCHAR U_442E +ENCODING 17454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +E280 +AFE0 +AA80 +EBC0 +AC80 +ABC0 +A880 +B7E0 +ENDCHAR +STARTCHAR U_442F +ENCODING 17455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7540 +57C0 +5280 +77C0 +5440 +5FE0 +5540 +B920 +ENDCHAR +STARTCHAR U_4430 +ENCODING 17456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +A4E0 +A9A0 +EA40 +BAA0 +ABE0 +EAA0 +AAE0 +AAA0 +A8E0 +A8A0 +ENDCHAR +STARTCHAR U_4431 +ENCODING 17457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +EFE0 +A920 +AFE0 +E920 +ABA0 +AAA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_4432 +ENCODING 17458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +5BA0 +7660 +5BA0 +5220 +77C0 +5440 +57C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4433 +ENCODING 17459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5480 +7FE0 +5520 +57E0 +7520 +57E0 +5000 +5AA0 +92A0 +ENDCHAR +STARTCHAR U_4434 +ENCODING 17460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA80 +FFE0 +9180 +AAA0 +CC60 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_4435 +ENCODING 17461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7380 +5000 +5FE0 +7540 +57C0 +5540 +57C0 +B820 +ENDCHAR +STARTCHAR U_4436 +ENCODING 17462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFE0 +EAA0 +B320 +A000 +EFC0 +A840 +AFC0 +A840 +AFC0 +ENDCHAR +STARTCHAR U_4437 +ENCODING 17463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7000 +57C0 +5540 +77C0 +5540 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_4438 +ENCODING 17464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5140 +5FE0 +7140 +57C0 +7540 +5FE0 +5540 +57C0 +5000 +BFE0 +ENDCHAR +STARTCHAR U_4439 +ENCODING 17465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFC0 +A240 +FFE0 +A240 +AFC0 +EAA0 +AFE0 +AA20 +AEE0 +B2A0 +ENDCHAR +STARTCHAR U_443A +ENCODING 17466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A440 +E7C0 +A440 +BFE0 +A100 +A100 +ENDCHAR +STARTCHAR U_443B +ENCODING 17467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5440 +57C0 +7100 +57C0 +5280 +5FE0 +9100 +ENDCHAR +STARTCHAR U_443C +ENCODING 17468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5EA0 +74A0 +5F60 +5480 +77C0 +5480 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_443D +ENCODING 17469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A440 +E7C0 +A000 +AFE0 +E920 +AD60 +ABA0 +AD60 +A920 +ENDCHAR +STARTCHAR U_443E +ENCODING 17470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E100 +AFE0 +A100 +EFE0 +A440 +AFE0 +A100 +A100 +ENDCHAR +STARTCHAR U_443F +ENCODING 17471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFE0 +AB60 +EDA0 +AFE0 +AB20 +ED60 +A100 +AFE0 +A440 +B820 +ENDCHAR +STARTCHAR U_4440 +ENCODING 17472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7740 +55E0 +7720 +54A0 +7740 +55E0 +5D40 +57E0 +B040 +9040 +ENDCHAR +STARTCHAR U_4441 +ENCODING 17473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +75C0 +4A40 +75C0 +4A40 +FFE0 +A0A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_4442 +ENCODING 17474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E600 +AAC0 +AB40 +EEC0 +AB40 +AFC0 +EB40 +AD40 +BFE0 +A480 +A840 +ENDCHAR +STARTCHAR U_4443 +ENCODING 17475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +77C0 +5280 +5FE0 +7BA0 +56C0 +7580 +5340 +5580 +5AC0 +9120 +ENDCHAR +STARTCHAR U_4444 +ENCODING 17476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7780 +5480 +5780 +7480 +5FC0 +7540 +5FE0 +5280 +5280 +9480 +ENDCHAR +STARTCHAR U_4445 +ENCODING 17477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +57C0 +5280 +77C0 +5540 +5FE0 +7920 +53C0 +5680 +5180 +9600 +ENDCHAR +STARTCHAR U_4446 +ENCODING 17478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +77C0 +5100 +57C0 +7FE0 +5280 +77C0 +5AA0 +53C0 +5280 +9760 +ENDCHAR +STARTCHAR U_4447 +ENCODING 17479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +7480 +57E0 +56C0 +7A40 +57C0 +7440 +57C0 +5440 +57C0 +9C60 +ENDCHAR +STARTCHAR U_4448 +ENCODING 17480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77A0 +5AC0 +57A0 +7AC0 +5FE0 +7100 +5FE0 +5380 +5560 +9920 +ENDCHAR +STARTCHAR U_4449 +ENCODING 17481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +5400 +57C0 +76C0 +5380 +76C0 +57C0 +57C0 +5540 +9AE0 +ENDCHAR +STARTCHAR U_444A +ENCODING 17482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +73C0 +5AC0 +57E0 +7140 +5DC0 +7540 +55C0 +57E0 +5540 +9BE0 +ENDCHAR +STARTCHAR U_444B +ENCODING 17483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +56C0 +56C0 +7280 +57C0 +7280 +5FE0 +5340 +5680 +9B60 +ENDCHAR +STARTCHAR U_444C +ENCODING 17484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E920 +AFE0 +A920 +EBA0 +AAA0 +A920 +ABA0 +AD60 +ENDCHAR +STARTCHAR U_444D +ENCODING 17485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +AAA0 +E200 +BFE0 +A480 +A300 +ACC0 +ENDCHAR +STARTCHAR U_444E +ENCODING 17486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +B580 +BFE0 +EA80 +BB80 +AA80 +FBA0 +AAA0 +BBA0 +AF40 +B0A0 +ENDCHAR +STARTCHAR U_444F +ENCODING 17487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5EE0 +56C0 +76C0 +5300 +57C0 +7D00 +57C0 +57C0 +5500 +97E0 +ENDCHAR +STARTCHAR U_4450 +ENCODING 17488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +A3E0 +A480 +F880 +8880 +89C0 +FAA0 +A4A0 +A080 +F980 +ENDCHAR +STARTCHAR U_4451 +ENCODING 17489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +F280 +AFE0 +A280 +F7C0 +9100 +97C0 +F100 +AFE0 +A280 +FC60 +ENDCHAR +STARTCHAR U_4452 +ENCODING 17490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +27E0 +4120 +9120 +FB20 +2520 +F920 +2120 +2A20 +3420 +C8C0 +ENDCHAR +STARTCHAR U_4453 +ENCODING 17491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1500 +FFE0 +9120 +3F80 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_4454 +ENCODING 17492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4080 +9FE0 +8880 +8BE0 +DAA0 +8AA0 +8AA0 +FAE0 +8880 +0080 +ENDCHAR +STARTCHAR U_4455 +ENCODING 17493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4040 +7BC0 +4040 +7FC0 +4440 +7FC0 +4440 +7FC0 +4460 +8420 +ENDCHAR +STARTCHAR U_4456 +ENCODING 17494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47E0 +9940 +8FE0 +8940 +DBC0 +8900 +8DC0 +8D00 +F780 +8860 +ENDCHAR +STARTCHAR U_4457 +ENCODING 17495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +4240 +9BC0 +8A40 +8FE0 +DA00 +8BE0 +8D60 +FAA0 +8520 +02C0 +ENDCHAR +STARTCHAR U_4458 +ENCODING 17496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +47E0 +9900 +8BC0 +8900 +DFE0 +8A00 +8BC0 +FC80 +8880 +07E0 +ENDCHAR +STARTCHAR U_4459 +ENCODING 17497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +E240 +2240 +27E0 +FA40 +2240 +27E0 +7A40 +4A40 +4A40 +7AC0 +ENDCHAR +STARTCHAR U_445A +ENCODING 17498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E220 +2220 +FBE0 +2220 +23E0 +7A20 +4A20 +4A20 +7A20 +4C60 +ENDCHAR +STARTCHAR U_445B +ENCODING 17499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +E3C0 +2240 +2240 +FA40 +23E0 +2240 +7A40 +4B40 +4A20 +79A0 +ENDCHAR +STARTCHAR U_445C +ENCODING 17500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EFE0 +2540 +25C0 +FC00 +27E0 +7880 +4FE0 +4980 +7AC0 +4CA0 +ENDCHAR +STARTCHAR U_445D +ENCODING 17501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +FFE0 +A0A0 +7BE0 +CA80 +37E0 +2080 +C080 +ENDCHAR +STARTCHAR U_445E +ENCODING 17502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5500 +4E00 +5580 +4A00 +7FC0 +2080 +7BE0 +AA80 +17E0 +E080 +ENDCHAR +STARTCHAR U_445F +ENCODING 17503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E5E0 +A960 +FDA0 +85E0 +6800 +BDE0 +E840 +3DE0 +4840 +8BE0 +ENDCHAR +STARTCHAR U_4460 +ENCODING 17504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4820 +7840 +4880 +FC80 +4880 +6880 +5880 +4880 +9B80 +ENDCHAR +STARTCHAR U_4461 +ENCODING 17505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FC0 +5440 +7540 +54C0 +F280 +5280 +7100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_4462 +ENCODING 17506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5280 +7280 +5280 +FA80 +5280 +7280 +52A0 +54A0 +98E0 +ENDCHAR +STARTCHAR U_4463 +ENCODING 17507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7880 +4B00 +7800 +4840 +FC80 +4B00 +6820 +5840 +4880 +9B00 +ENDCHAR +STARTCHAR U_4464 +ENCODING 17508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4A80 +7C40 +4BA0 +F800 +4FC0 +6840 +5840 +4880 +9900 +ENDCHAR +STARTCHAR U_4465 +ENCODING 17509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +5440 +7480 +57E0 +FD20 +5520 +7540 +5480 +5940 +9620 +ENDCHAR +STARTCHAR U_4466 +ENCODING 17510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +7400 +57E0 +7820 +57A0 +F4A0 +54A0 +77A0 +5020 +5020 +B0C0 +ENDCHAR +STARTCHAR U_4467 +ENCODING 17511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7440 +5C40 +77E0 +5440 +FD40 +54C0 +7440 +5440 +5440 +94C0 +ENDCHAR +STARTCHAR U_4468 +ENCODING 17512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +7400 +57E0 +7880 +5480 +FCE0 +57A0 +74A0 +5400 +5420 +93E0 +ENDCHAR +STARTCHAR U_4469 +ENCODING 17513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5100 +7FE0 +5100 +F100 +57C0 +7440 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_446A +ENCODING 17514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5280 +7440 +5820 +F7C0 +5000 +77C0 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_446B +ENCODING 17515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +7240 +57E0 +7240 +5240 +FA40 +57E0 +7240 +5240 +5240 +9440 +ENDCHAR +STARTCHAR U_446C +ENCODING 17516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7280 +5280 +7AA0 +56C0 +F280 +56C0 +7AA0 +5280 +54A0 +98E0 +ENDCHAR +STARTCHAR U_446D +ENCODING 17517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +72E0 +5040 +7840 +5440 +F040 +5240 +7240 +5C40 +5440 +95E0 +ENDCHAR +STARTCHAR U_446E +ENCODING 17518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7240 +5240 +7420 +5900 +F7E0 +5100 +7380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_446F +ENCODING 17519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +7280 +57C0 +7140 +57C0 +FD00 +57E0 +5120 +7320 +5D20 +B140 +ENDCHAR +STARTCHAR U_4470 +ENCODING 17520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7500 +55C0 +7500 +5FE0 +F100 +5500 +7540 +5980 +5300 +9C00 +ENDCHAR +STARTCHAR U_4471 +ENCODING 17521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +7000 +57E0 +F4A0 +54E0 +7AA0 +5180 +52A0 +9CE0 +ENDCHAR +STARTCHAR U_4472 +ENCODING 17522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +71C0 +5100 +77C0 +5440 +F7C0 +5440 +77C0 +5100 +5FE0 +9100 +ENDCHAR +STARTCHAR U_4473 +ENCODING 17523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7A80 +4C40 +7BA0 +4800 +FFE0 +4AA0 +6FE0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_4474 +ENCODING 17524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7240 +57E0 +7240 +53C0 +F240 +53C0 +7240 +5FE0 +5240 +9420 +ENDCHAR +STARTCHAR U_4475 +ENCODING 17525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7220 +52E0 +7220 +53E0 +FA20 +53E0 +7220 +53E0 +5220 +B460 +ENDCHAR +STARTCHAR U_4476 +ENCODING 17526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5100 +77C0 +5100 +FFE0 +5440 +77C0 +5440 +57C0 +9440 +ENDCHAR +STARTCHAR U_4477 +ENCODING 17527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +77E0 +5400 +FDE0 +5520 +75E0 +5520 +55E0 +9920 +ENDCHAR +STARTCHAR U_4478 +ENCODING 17528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +73C0 +5000 +F7E0 +5100 +7540 +5520 +5920 +9100 +ENDCHAR +STARTCHAR U_4479 +ENCODING 17529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5920 +7540 +5280 +F440 +5820 +77C0 +5240 +5180 +9E60 +ENDCHAR +STARTCHAR U_447A +ENCODING 17530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7440 +57C0 +7540 +57C0 +F540 +57C0 +7540 +55C0 +5660 +9820 +ENDCHAR +STARTCHAR U_447B +ENCODING 17531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7280 +50E0 +7F00 +54E0 +F740 +5540 +75E0 +5540 +5940 +93C0 +ENDCHAR +STARTCHAR U_447C +ENCODING 17532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +77E0 +5AA0 +77A0 +5220 +F440 +57E0 +7AA0 +57A0 +5220 +94C0 +ENDCHAR +STARTCHAR U_447D +ENCODING 17533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7440 +57C0 +7440 +57C0 +F000 +5FE0 +7120 +5DA0 +5360 +9DA0 +ENDCHAR +STARTCHAR U_447E +ENCODING 17534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5C80 +77C0 +5480 +F7C0 +5480 +77E0 +5440 +5380 +9C60 +ENDCHAR +STARTCHAR U_447F +ENCODING 17535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +73E0 +5480 +FDE0 +5520 +55E0 +7520 +5520 +95E0 +ENDCHAR +STARTCHAR U_4480 +ENCODING 17536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5540 +7A40 +57E0 +FC40 +5440 +7540 +54C0 +5440 +B4C0 +ENDCHAR +STARTCHAR U_4481 +ENCODING 17537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +7AA0 +5660 +7AA0 +5220 +F400 +57C0 +7440 +57C0 +5440 +B7C0 +ENDCHAR +STARTCHAR U_4482 +ENCODING 17538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7560 +55A0 +7560 +5740 +F1E0 +5720 +75A0 +5560 +9520 +9960 +ENDCHAR +STARTCHAR U_4483 +ENCODING 17539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7940 +55E0 +7240 +5FE0 +F400 +55E0 +7520 +55E0 +5C00 +93E0 +ENDCHAR +STARTCHAR U_4484 +ENCODING 17540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +5020 +77C0 +5280 +F280 +57C0 +7540 +57C0 +5540 +97C0 +ENDCHAR +STARTCHAR U_4485 +ENCODING 17541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5100 +7FE0 +5240 +F7E0 +5AC0 +7340 +52C0 +5340 +93C0 +ENDCHAR +STARTCHAR U_4486 +ENCODING 17542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7280 +5FE0 +74A0 +5FA0 +F4A0 +5740 +7540 +5740 +55A0 +9B20 +ENDCHAR +STARTCHAR U_4487 +ENCODING 17543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5020 +77E0 +5280 +FA80 +57C0 +7540 +57C0 +5540 +97C0 +ENDCHAR +STARTCHAR U_4488 +ENCODING 17544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5540 +7FE0 +5440 +F7C0 +5440 +77C0 +5440 +57C0 +9820 +ENDCHAR +STARTCHAR U_4489 +ENCODING 17545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +7FE0 +5540 +7FE0 +5540 +FFE0 +5440 +7FE0 +5540 +53E0 +9C40 +ENDCHAR +STARTCHAR U_448A +ENCODING 17546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +49E0 +8640 +FBE0 +22A0 +42A0 +7BE0 +0A00 +0A00 +5220 +21E0 +ENDCHAR +STARTCHAR U_448B +ENCODING 17547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +ABE0 +AAA0 +FEA0 +23E0 +3200 +4A20 +4220 +81E0 +ENDCHAR +STARTCHAR U_448C +ENCODING 17548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +85E0 +7A40 +4BE0 +7AA0 +4AA0 +7BE0 +2200 +FE20 +4A20 +85E0 +ENDCHAR +STARTCHAR U_448D +ENCODING 17549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +5640 +2080 +FFE0 +A2A0 +7BE0 +2200 +3A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_448E +ENCODING 17550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FDC0 +5240 +2880 +FFE0 +52A0 +8BE0 +5200 +FA20 +5220 +91E0 +ENDCHAR +STARTCHAR U_448F +ENCODING 17551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +51C0 +FA40 +AC80 +FBE0 +AAA0 +FBE0 +5200 +7220 +5220 +71E0 +ENDCHAR +STARTCHAR U_4490 +ENCODING 17552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +29E0 +FE40 +ABE0 +FEA0 +02A0 +FFE0 +AA00 +3A20 +2A20 +39E0 +ENDCHAR +STARTCHAR U_4491 +ENCODING 17553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +4040 +2040 +2080 +1080 +1100 +0000 +0040 +FFE0 +ENDCHAR +STARTCHAR U_4492 +ENCODING 17554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0040 +0240 +0C40 +3040 +C040 +0140 +0080 +ENDCHAR +STARTCHAR U_4493 +ENCODING 17555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FE0 +1000 +3F80 +0080 +0080 +0900 +0600 +ENDCHAR +STARTCHAR U_4494 +ENCODING 17556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1200 +1200 +1100 +2100 +2080 +4040 +8060 +ENDCHAR +STARTCHAR U_4495 +ENCODING 17557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0400 +2480 +2440 +4420 +8420 +0400 +1C00 +ENDCHAR +STARTCHAR U_4496 +ENCODING 17558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +0880 +7E80 +0880 +0880 +08A0 +0860 +ENDCHAR +STARTCHAR U_4497 +ENCODING 17559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +7FC0 +8000 +3F00 +0400 +1840 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4498 +ENCODING 17560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3F80 +6100 +9100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_4499 +ENCODING 17561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +2480 +0400 +0400 +0780 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_449A +ENCODING 17562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +0400 +2500 +2480 +4440 +8520 +0200 +1C00 +E000 +ENDCHAR +STARTCHAR U_449B +ENCODING 17563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +4000 +57C0 +F040 +2040 +4040 +5040 +F980 +ENDCHAR +STARTCHAR U_449C +ENCODING 17564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_449D +ENCODING 17565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3180 +0E00 +71C0 +1100 +1100 +0A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_449E +ENCODING 17566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +4440 +8400 +0A00 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_449F +ENCODING 17567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F80 +1480 +1280 +FFE0 +1080 +1080 +2080 +4380 +ENDCHAR +STARTCHAR U_44A0 +ENCODING 17568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0780 +7C00 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44A1 +ENCODING 17569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7C40 +0440 +7C40 +4040 +FC40 +0440 +3840 +ENDCHAR +STARTCHAR U_44A2 +ENCODING 17570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1BC0 +6240 +4240 +4A40 +72C0 +0200 +0200 +ENDCHAR +STARTCHAR U_44A3 +ENCODING 17571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2080 +7FC0 +2080 +FFE0 +2080 +2180 +ENDCHAR +STARTCHAR U_44A4 +ENCODING 17572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_44A5 +ENCODING 17573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +3F80 +2480 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_44A6 +ENCODING 17574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0200 +3F80 +0100 +0600 +1800 +67E0 +ENDCHAR +STARTCHAR U_44A7 +ENCODING 17575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_44A8 +ENCODING 17576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3F80 +4400 +0400 +FFE0 +0900 +1080 +E060 +ENDCHAR +STARTCHAR U_44A9 +ENCODING 17577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FBE0 +1080 +0380 +7C00 +0400 +FFE0 +1480 +2440 +C420 +0400 +ENDCHAR +STARTCHAR U_44AA +ENCODING 17578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_44AB +ENCODING 17579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1280 +2240 +63E0 +AE00 +2100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_44AC +ENCODING 17580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0000 +FFE0 +0400 +1480 +2440 +C420 +0C00 +ENDCHAR +STARTCHAR U_44AD +ENCODING 17581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +FFE0 +0100 +FFE0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_44AE +ENCODING 17582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +1F00 +1100 +1D00 +1320 +2120 +C0E0 +ENDCHAR +STARTCHAR U_44AF +ENCODING 17583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +7F00 +0900 +3900 +1520 +2120 +C0E0 +ENDCHAR +STARTCHAR U_44B0 +ENCODING 17584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +7FC0 +4000 +5FC0 +4200 +4F80 +4200 +5FC0 +4000 +7FC0 +ENDCHAR +STARTCHAR U_44B1 +ENCODING 17585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3F00 +0200 +F440 +1680 +2500 +4CE0 +8400 +7FC0 +ENDCHAR +STARTCHAR U_44B2 +ENCODING 17586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +20C0 +F700 +5100 +5100 +5FE0 +2100 +5120 +81E0 +ENDCHAR +STARTCHAR U_44B3 +ENCODING 17587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +1080 +11C0 +2440 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_44B4 +ENCODING 17588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +FFE0 +1000 +3F80 +D080 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_44B5 +ENCODING 17589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FBC0 +5040 +5080 +57E0 +2080 +5080 +8180 +ENDCHAR +STARTCHAR U_44B6 +ENCODING 17590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +7FC0 +4440 +7FC0 +4440 +7FC0 +0480 +0720 +F8E0 +ENDCHAR +STARTCHAR U_44B7 +ENCODING 17591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0380 +7C00 +0400 +FFE0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44B8 +ENCODING 17592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0800 +3F80 +2A80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_44B9 +ENCODING 17593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +07C0 +7C00 +0400 +7F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_44BA +ENCODING 17594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0800 +3300 +0C00 +1080 +7FC0 +2500 +2480 +4C40 +ENDCHAR +STARTCHAR U_44BB +ENCODING 17595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23E0 +2220 +AA20 +ABE0 +AA00 +AA20 +FA20 +01E0 +ENDCHAR +STARTCHAR U_44BC +ENCODING 17596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +0A00 +7FC0 +4A40 +7FC0 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_44BD +ENCODING 17597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +6AC0 +5140 +5140 +6AC0 +4040 +40C0 +ENDCHAR +STARTCHAR U_44BE +ENCODING 17598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +1000 +2480 +E300 +2200 +2980 +3060 +ENDCHAR +STARTCHAR U_44BF +ENCODING 17599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_44C0 +ENCODING 17600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44C1 +ENCODING 17601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +0100 +FFE0 +2100 +1100 +0600 +ENDCHAR +STARTCHAR U_44C2 +ENCODING 17602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44C3 +ENCODING 17603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +4440 +7FC0 +4000 +4020 +3FE0 +ENDCHAR +STARTCHAR U_44C4 +ENCODING 17604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +D0C0 +2700 +5400 +B7E0 +5480 +9480 +1480 +6880 +ENDCHAR +STARTCHAR U_44C5 +ENCODING 17605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +61C0 +1600 +C400 +27E0 +1480 +E480 +4880 +5080 +ENDCHAR +STARTCHAR U_44C6 +ENCODING 17606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +20C0 +F700 +2400 +37E0 +E480 +2480 +2480 +E880 +ENDCHAR +STARTCHAR U_44C7 +ENCODING 17607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +1100 +5140 +9120 +2300 +ENDCHAR +STARTCHAR U_44C8 +ENCODING 17608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2780 +5480 +A860 +6780 +A480 +2280 +2300 +2CE0 +ENDCHAR +STARTCHAR U_44C9 +ENCODING 17609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +2A40 +4AC0 +FE20 +2A20 +4B20 +8AC0 +1A00 +ENDCHAR +STARTCHAR U_44CA +ENCODING 17610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +7F80 +0880 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_44CB +ENCODING 17611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +67C0 +1480 +C480 +27E0 +1480 +E480 +46A0 +4460 +ENDCHAR +STARTCHAR U_44CC +ENCODING 17612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +3F80 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_44CD +ENCODING 17613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +0000 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44CE +ENCODING 17614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +27C0 +6840 +B240 +2140 +3140 +4840 +8180 +ENDCHAR +STARTCHAR U_44CF +ENCODING 17615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0D00 +3480 +C460 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44D0 +ENCODING 17616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +2480 +FFE0 +2480 +3F80 +24A0 +07E0 +ENDCHAR +STARTCHAR U_44D1 +ENCODING 17617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2480 +8480 +5FE0 +1480 +A480 +4480 +4880 +ENDCHAR +STARTCHAR U_44D2 +ENCODING 17618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +BF40 +2940 +3F40 +2940 +3F40 +0180 +ENDCHAR +STARTCHAR U_44D3 +ENCODING 17619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +3F80 +1100 +FFE0 +4900 +8900 +0300 +ENDCHAR +STARTCHAR U_44D4 +ENCODING 17620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0500 +FFE0 +0400 +1F80 +2100 +DFE0 +0200 +ENDCHAR +STARTCHAR U_44D5 +ENCODING 17621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2000 +FFE0 +2280 +22A0 +24E0 +5800 +8FE0 +ENDCHAR +STARTCHAR U_44D6 +ENCODING 17622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +90A0 +6440 +3F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_44D7 +ENCODING 17623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2880 +D160 +3F80 +1080 +0440 +52A0 +52A0 +8F80 +ENDCHAR +STARTCHAR U_44D8 +ENCODING 17624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1100 +3900 +CA80 +3440 +CFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44D9 +ENCODING 17625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0400 +FFE0 +1500 +75C0 +1500 +F4E0 +0400 +ENDCHAR +STARTCHAR U_44DA +ENCODING 17626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +5440 +A7C0 +6440 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_44DB +ENCODING 17627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +7FC0 +4200 +5240 +5FC0 +9240 +9FC0 +ENDCHAR +STARTCHAR U_44DC +ENCODING 17628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2900 +8900 +4FE0 +1900 +2AA0 +CEA0 +4960 +ENDCHAR +STARTCHAR U_44DD +ENCODING 17629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F00 +0200 +7FC0 +0400 +0400 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_44DE +ENCODING 17630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4000 +7F80 +4080 +7FC0 +4500 +DF00 +B0C0 +ENDCHAR +STARTCHAR U_44DF +ENCODING 17631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +7FC0 +4440 +5F40 +4440 +7FC0 +5140 +5F40 +80C0 +ENDCHAR +STARTCHAR U_44E0 +ENCODING 17632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1500 +7CC0 +1700 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44E1 +ENCODING 17633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +7DE0 +9120 +FD20 +1120 +2920 +45E0 +8000 +ENDCHAR +STARTCHAR U_44E2 +ENCODING 17634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +5F40 +5140 +5140 +7FC0 +ENDCHAR +STARTCHAR U_44E3 +ENCODING 17635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +5540 +5540 +6EC0 +4440 +41C0 +ENDCHAR +STARTCHAR U_44E4 +ENCODING 17636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4A40 +1240 +2480 +0A00 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_44E5 +ENCODING 17637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +F1E0 +1100 +7FC0 +1100 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44E6 +ENCODING 17638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +3F80 +2A80 +3F80 +2A80 +FFE0 +2080 +4040 +ENDCHAR +STARTCHAR U_44E7 +ENCODING 17639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0200 +77C0 +5540 +7480 +5F40 +0000 +FFE0 +ENDCHAR +STARTCHAR U_44E8 +ENCODING 17640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A020 +7F80 +0400 +7FC0 +0400 +2480 +3F80 +ENDCHAR +STARTCHAR U_44E9 +ENCODING 17641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +2100 +77C0 +6A40 +A280 +2180 +2E60 +ENDCHAR +STARTCHAR U_44EA +ENCODING 17642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FC0 +CA40 +1440 +6980 +ENDCHAR +STARTCHAR U_44EB +ENCODING 17643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +1100 +FFE0 +2480 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_44EC +ENCODING 17644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0780 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44ED +ENCODING 17645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4620 +38A0 +D4A0 +12A0 +FEA0 +38A0 +5420 +9260 +ENDCHAR +STARTCHAR U_44EE +ENCODING 17646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +2BE0 +1140 +FD40 +3540 +5080 +9140 +3620 +ENDCHAR +STARTCHAR U_44EF +ENCODING 17647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +7F80 +2480 +FFE0 +2480 +3FC0 +1100 +ENDCHAR +STARTCHAR U_44F0 +ENCODING 17648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0A00 +3F80 +2A80 +2A80 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_44F1 +ENCODING 17649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5DC0 +5100 +FCE0 +0400 +FFE0 +1480 +2440 +C420 +ENDCHAR +STARTCHAR U_44F2 +ENCODING 17650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +C860 +5780 +4480 +4480 +4780 +44A0 +5860 +ENDCHAR +STARTCHAR U_44F3 +ENCODING 17651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +D440 +27C0 +E440 +27C0 +2520 +24C0 +2660 +ENDCHAR +STARTCHAR U_44F4 +ENCODING 17652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +7FC0 +5240 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_44F5 +ENCODING 17653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_44F6 +ENCODING 17654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE20 +1120 +7D20 +5520 +7D20 +3920 +5420 +9260 +ENDCHAR +STARTCHAR U_44F7 +ENCODING 17655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6400 +19E0 +C400 +3BE0 +2840 +C840 +4840 +49C0 +ENDCHAR +STARTCHAR U_44F8 +ENCODING 17656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5000 +FBE0 +5080 +A880 +57E0 +F880 +5080 +A880 +ENDCHAR +STARTCHAR U_44F9 +ENCODING 17657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3980 +C460 +3F80 +2480 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_44FA +ENCODING 17658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_44FB +ENCODING 17659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7240 +07E0 +FA40 +5180 +5240 +8FE0 +ENDCHAR +STARTCHAR U_44FC +ENCODING 17660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4480 +5FE0 +E440 +A4A0 +A640 +6AA0 +4A40 +91E0 +ENDCHAR +STARTCHAR U_44FD +ENCODING 17661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FFC0 +0040 +F040 +07C0 +F400 +9420 +F3E0 +ENDCHAR +STARTCHAR U_44FE +ENCODING 17662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E540 +09A0 +E100 +1200 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_44FF +ENCODING 17663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0A00 +7FC0 +5140 +4A40 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4500 +ENCODING 17664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +17C0 +2100 +6FE0 +A540 +2B20 +2EE0 +2380 +2C60 +ENDCHAR +STARTCHAR U_4501 +ENCODING 17665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +1100 +6AC0 +7FC0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4502 +ENCODING 17666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +FFE0 +8420 +3F80 +1100 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_4503 +ENCODING 17667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +4000 +23C0 +FA40 +13C0 +3240 +6BC0 +A240 +27E0 +ENDCHAR +STARTCHAR U_4504 +ENCODING 17668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2880 +3FC0 +D100 +2E00 +FBC0 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4505 +ENCODING 17669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +7FC0 +3E80 +2280 +FFE0 +3E80 +2280 +3E80 +0180 +ENDCHAR +STARTCHAR U_4506 +ENCODING 17670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +D7C0 +2540 +D540 +37C0 +D100 +17C0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_4507 +ENCODING 17671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +4440 +7FC0 +0000 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4508 +ENCODING 17672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +1F00 +0400 +FFE0 +1100 +1F00 +1100 +1F00 +3180 +ENDCHAR +STARTCHAR U_4509 +ENCODING 17673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +1860 +E380 +2080 +FBE0 +30C0 +69A0 +AAA0 +2080 +ENDCHAR +STARTCHAR U_450A +ENCODING 17674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FA40 +27E0 +2240 +FA40 +27E0 +2A40 +3240 +C440 +ENDCHAR +STARTCHAR U_450B +ENCODING 17675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +4540 +F520 +4520 +9140 +F180 +5300 +AC00 +ENDCHAR +STARTCHAR U_450C +ENCODING 17676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0900 +3F80 +2480 +3F80 +1000 +FFE0 +4480 +BF60 +0400 +ENDCHAR +STARTCHAR U_450D +ENCODING 17677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +5540 +ENDCHAR +STARTCHAR U_450E +ENCODING 17678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2100 +F7C0 +2540 +27C0 +2540 +7920 +87E0 +ENDCHAR +STARTCHAR U_450F +ENCODING 17679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4500 +27C0 +F900 +2FE0 +2440 +27C0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4510 +ENCODING 17680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +1FE0 +8320 +5DE0 +1240 +AFE0 +4320 +5CE0 +ENDCHAR +STARTCHAR U_4511 +ENCODING 17681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3040 +CD40 +78C0 +1240 +FD60 +5BC0 +9440 +3040 +ENDCHAR +STARTCHAR U_4512 +ENCODING 17682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E100 +AFE0 +C440 +BFE0 +A000 +E7C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_4513 +ENCODING 17683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +0480 +7880 +07E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_4514 +ENCODING 17684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3FC0 +1100 +FFE0 +2480 +3F80 +1120 +E0E0 +ENDCHAR +STARTCHAR U_4515 +ENCODING 17685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +5100 +77C0 +5540 +77C0 +5540 +57C0 +9540 +ENDCHAR +STARTCHAR U_4516 +ENCODING 17686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9100 +AFC0 +9460 +DFC0 +A440 +8B80 +8C60 +ENDCHAR +STARTCHAR U_4517 +ENCODING 17687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2280 +F7C0 +2100 +77C0 +A100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4518 +ENCODING 17688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +7BC0 +A240 +FBC0 +2240 +ABC0 +AA40 +FFE0 +ENDCHAR +STARTCHAR U_4519 +ENCODING 17689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3200 +4BE0 +FC20 +1220 +7D20 +5420 +3820 +60C0 +ENDCHAR +STARTCHAR U_451A +ENCODING 17690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4000 +7FC0 +5280 +5FC0 +5280 +9F80 +9080 +ENDCHAR +STARTCHAR U_451B +ENCODING 17691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +4100 +7BC0 +4240 +43C0 +5A40 +63C0 +0420 +ENDCHAR +STARTCHAR U_451C +ENCODING 17692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F900 +57C0 +7540 +57C0 +7540 +5FE0 +F440 +14C0 +ENDCHAR +STARTCHAR U_451D +ENCODING 17693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +5FC0 +5220 +F9E0 +0F00 +0900 +3F80 +1500 +64C0 +ENDCHAR +STARTCHAR U_451E +ENCODING 17694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0A00 +5F40 +2A80 +5F40 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_451F +ENCODING 17695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +39C0 +E240 +2180 +FEE0 +2120 +72C0 +A880 +2700 +ENDCHAR +STARTCHAR U_4520 +ENCODING 17696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2540 +F380 +27C0 +7440 +6FC0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4521 +ENCODING 17697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +FF80 +2480 +3F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_4522 +ENCODING 17698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +1100 +7FC0 +0000 +FFE0 +1000 +3FC0 +0080 +ENDCHAR +STARTCHAR U_4523 +ENCODING 17699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +FD40 +5440 +3F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4524 +ENCODING 17700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +8200 +F7E0 +9420 +F7E0 +9420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_4525 +ENCODING 17701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0440 +FFE0 +0440 +7FC0 +5540 +7FC0 +A540 +ENDCHAR +STARTCHAR U_4526 +ENCODING 17702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2400 +FFE0 +2540 +7540 +AFE0 +2540 +2FE0 +2080 +ENDCHAR +STARTCHAR U_4527 +ENCODING 17703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +FF40 +5440 +9480 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_4528 +ENCODING 17704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +4FE0 +7480 +27C0 +4C80 +77C0 +2480 +C7E0 +ENDCHAR +STARTCHAR U_4529 +ENCODING 17705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +FE00 +23E0 +FE40 +AA40 +F980 +7180 +AA40 +2420 +ENDCHAR +STARTCHAR U_452A +ENCODING 17706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +5540 +2480 +5740 +2480 +DB60 +1100 +E0E0 +ENDCHAR +STARTCHAR U_452B +ENCODING 17707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1500 +57E0 +5D20 +5560 +5380 +5D40 +E920 +ENDCHAR +STARTCHAR U_452C +ENCODING 17708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_452D +ENCODING 17709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A4A0 +5160 +BF80 +2480 +3F80 +2480 +5E80 +ENDCHAR +STARTCHAR U_452E +ENCODING 17710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4900 +FFE0 +4A00 +7BE0 +4A40 +7A40 +4A40 +FE40 +4840 +ENDCHAR +STARTCHAR U_452F +ENCODING 17711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC80 +2880 +FFE0 +AC80 +C5E0 +BD20 +8520 +FDE0 +ENDCHAR +STARTCHAR U_4530 +ENCODING 17712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +2480 +FFE0 +8020 +7FC0 +1100 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_4531 +ENCODING 17713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +27C0 +F440 +2FE0 +3440 +E7C0 +2440 +2FE0 +6040 +ENDCHAR +STARTCHAR U_4532 +ENCODING 17714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4E80 +3180 +DF60 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4533 +ENCODING 17715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3140 +4920 +AFE0 +5180 +2240 +CC20 +4920 +8920 +ENDCHAR +STARTCHAR U_4534 +ENCODING 17716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +A7C0 +FD40 +A540 +FD40 +0080 +FC80 +5540 +9220 +ENDCHAR +STARTCHAR U_4535 +ENCODING 17717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +AAA0 +FBE0 +8420 +BFA0 +8E20 +B5A0 +8460 +ENDCHAR +STARTCHAR U_4536 +ENCODING 17718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F440 +27C0 +3440 +EFE0 +2540 +2780 +68E0 +ENDCHAR +STARTCHAR U_4537 +ENCODING 17719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +7FC0 +1100 +E4E0 +1F00 +0200 +0C00 +ENDCHAR +STARTCHAR U_4538 +ENCODING 17720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0480 +FFE0 +1100 +60C0 +2920 +FFE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_4539 +ENCODING 17721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7240 +57E0 +6120 +56C0 +5180 +76C0 +40A0 +4300 +ENDCHAR +STARTCHAR U_453A +ENCODING 17722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +5280 +67E0 +5A40 +53C0 +7240 +43C0 +4240 +ENDCHAR +STARTCHAR U_453B +ENCODING 17723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +1100 +FDE0 +4B40 +7D40 +1140 +FC80 +1140 +3620 +ENDCHAR +STARTCHAR U_453C +ENCODING 17724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +28A0 +6AA0 +5D60 +9280 +5AE0 +5280 +FFE0 +ENDCHAR +STARTCHAR U_453D +ENCODING 17725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2940 +8A40 +4FE0 +1920 +2AA0 +CFE0 +4040 +ENDCHAR +STARTCHAR U_453E +ENCODING 17726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +F940 +4A40 +6FE0 +D920 +4AA0 +4FE0 +C040 +ENDCHAR +STARTCHAR U_453F +ENCODING 17727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0A00 +3F80 +2A80 +3580 +FFE0 +1100 +0B00 +ENDCHAR +STARTCHAR U_4540 +ENCODING 17728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE00 +13E0 +7AA0 +0080 +FC80 +5880 +5540 +9220 +ENDCHAR +STARTCHAR U_4541 +ENCODING 17729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F1E0 +1100 +71C0 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4542 +ENCODING 17730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2FE0 +F440 +27C0 +2CA0 +2540 +7620 +8FE0 +ENDCHAR +STARTCHAR U_4543 +ENCODING 17731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F380 +9C60 +A7C0 +9500 +9480 +EFE0 +8480 +8FC0 +ENDCHAR +STARTCHAR U_4544 +ENCODING 17732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F00 +0440 +F580 +2480 +C460 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4545 +ENCODING 17733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +42C0 +5540 +F7C0 +5540 +97C0 +6440 +3380 +CC60 +ENDCHAR +STARTCHAR U_4546 +ENCODING 17734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +2440 +FFA0 +2A20 +7EA0 +AAA0 +2EA0 +2A60 +ENDCHAR +STARTCHAR U_4547 +ENCODING 17735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +4800 +5F80 +5280 +5F80 +5280 +5F80 +8940 +B1E0 +ENDCHAR +STARTCHAR U_4548 +ENCODING 17736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +5540 +5FE0 +7540 +47E0 +7100 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_4549 +ENCODING 17737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2A80 +7FC0 +0400 +FFE0 +1100 +7FC0 +0400 +ENDCHAR +STARTCHAR U_454A +ENCODING 17738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2A80 +2A80 +3F80 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_454B +ENCODING 17739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2940 +FFE0 +2940 +2FC0 +3A40 +CA40 +13C0 +ENDCHAR +STARTCHAR U_454C +ENCODING 17740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7480 +27E0 +FC80 +27C0 +7480 +6FC0 +A480 +27E0 +ENDCHAR +STARTCHAR U_454D +ENCODING 17741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +3480 +D300 +11C0 +7FC0 +5140 +7FC0 +4040 +ENDCHAR +STARTCHAR U_454E +ENCODING 17742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0FE0 +F280 +9280 +F7C0 +9540 +F7C0 +9540 +07C0 +ENDCHAR +STARTCHAR U_454F +ENCODING 17743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +0400 +7F80 +1540 +FFE0 +1140 +7980 +2660 +ENDCHAR +STARTCHAR U_4550 +ENCODING 17744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27E0 +FA40 +2240 +77E0 +AD20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_4551 +ENCODING 17745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +44A0 +A240 +47E0 +9240 +F240 +A980 +A660 +ENDCHAR +STARTCHAR U_4552 +ENCODING 17746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3FC0 +1100 +FFE0 +1540 +25C0 +4D40 +ENDCHAR +STARTCHAR U_4553 +ENCODING 17747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1480 +FFE0 +AAA0 +5100 +2EC0 +4000 +3F80 +1500 +2480 +ENDCHAR +STARTCHAR U_4554 +ENCODING 17748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2EE0 +D100 +2EE0 +C440 +5F40 +5540 +4E40 +5FC0 +ENDCHAR +STARTCHAR U_4555 +ENCODING 17749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2540 +8FE0 +4AA0 +1FE0 +A440 +4380 +4C60 +ENDCHAR +STARTCHAR U_4556 +ENCODING 17750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4480 +0BC0 +FD20 +4BE0 +4A80 +74A0 +8FE0 +ENDCHAR +STARTCHAR U_4557 +ENCODING 17751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +1F00 +1500 +1500 +3F80 +2480 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_4558 +ENCODING 17752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +37E0 +4900 +B7C0 +0240 +7BC0 +4A40 +33C0 +2420 +ENDCHAR +STARTCHAR U_4559 +ENCODING 17753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FD40 +2120 +FFE0 +5100 +FCA0 +50C0 +7F20 +ENDCHAR +STARTCHAR U_455A +ENCODING 17754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +7FC0 +4200 +5FC0 +5240 +7FE0 +4A80 +4F80 +5040 +7FE0 +ENDCHAR +STARTCHAR U_455B +ENCODING 17755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +0540 +7540 +0BA0 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_455C +ENCODING 17756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2540 +14C0 +7FC0 +2080 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_455D +ENCODING 17757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1040 +FFA0 +2940 +F7C0 +2540 +77C0 +A540 +2FE0 +2440 +ENDCHAR +STARTCHAR U_455E +ENCODING 17758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +AAA0 +F5E0 +9F20 +9520 +9FA0 +9520 +9BA0 +ENDCHAR +STARTCHAR U_455F +ENCODING 17759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +5FC0 +5140 +7FC0 +5540 +7DC0 +5140 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_4560 +ENCODING 17760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +6940 +5DC0 +6560 +5E00 +51C0 +5D40 +8480 +9B60 +ENDCHAR +STARTCHAR U_4561 +ENCODING 17761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +ENDCHAR +STARTCHAR U_4562 +ENCODING 17762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0240 +FFE0 +2100 +23C0 +7900 +CBE0 +7C80 +4BE0 +ENDCHAR +STARTCHAR U_4563 +ENCODING 17763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F540 +2540 +77E0 +A920 +3AA0 +2FE0 +2040 +ENDCHAR +STARTCHAR U_4564 +ENCODING 17764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EEE0 +AAA0 +FEC0 +54A0 +7CA0 +54A0 +FEC0 +1080 +ENDCHAR +STARTCHAR U_4565 +ENCODING 17765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +9520 +2480 +FFE0 +6EC0 +5540 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_4566 +ENCODING 17766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +FFE0 +4000 +7FE0 +4040 +3F80 +EAE0 +BFA0 +EAE0 +BD20 +ENDCHAR +STARTCHAR U_4567 +ENCODING 17767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +57E0 +FD40 +8220 +7D40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_4568 +ENCODING 17768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7540 +57C0 +5100 +7FE0 +5540 +7AA0 +57C0 +9920 +ENDCHAR +STARTCHAR U_4569 +ENCODING 17769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +FAA0 +2C60 +67C0 +7540 +AFC0 +2540 +2920 +ENDCHAR +STARTCHAR U_456A +ENCODING 17770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2AA0 +8FE0 +4440 +0FE0 +2100 +CFE0 +4100 +ENDCHAR +STARTCHAR U_456B +ENCODING 17771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +24E0 +BFA0 +AAE0 +FF80 +28E0 +D900 +0600 +79E0 +ENDCHAR +STARTCHAR U_456C +ENCODING 17772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1540 +7540 +4FE0 +7540 +17C0 +1540 +6FE0 +ENDCHAR +STARTCHAR U_456D +ENCODING 17773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +72A0 +21C0 +F940 +5220 +AAA0 +F9C0 +2140 +F620 +ENDCHAR +STARTCHAR U_456E +ENCODING 17774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +7400 +27E0 +FD20 +57E0 +FBA0 +2560 +F920 +20C0 +ENDCHAR +STARTCHAR U_456F +ENCODING 17775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FCE0 +5380 +FAC0 +AAC0 +FAA0 +02A0 +FD20 +ABE0 +ENDCHAR +STARTCHAR U_4570 +ENCODING 17776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +AD40 +77E0 +2380 +2D60 +57C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_4571 +ENCODING 17777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0100 +FBC0 +8A40 +FBC0 +8A40 +53C0 +FC20 +ENDCHAR +STARTCHAR U_4572 +ENCODING 17778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +5540 +5540 +5FC0 +4000 +7FE0 +8A80 +B240 +ENDCHAR +STARTCHAR U_4573 +ENCODING 17779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +2540 +EFE0 +8D60 +EBA0 +2D60 +2BA0 +C960 +ENDCHAR +STARTCHAR U_4574 +ENCODING 17780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A80 +27E0 +FC80 +27E0 +7480 +A7E0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_4575 +ENCODING 17781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +F7C0 +4540 +F7E0 +0400 +F7E0 +9520 +F540 +ENDCHAR +STARTCHAR U_4576 +ENCODING 17782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4280 +F7E0 +0A80 +F3E0 +0280 +F7E0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_4577 +ENCODING 17783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +4880 +7FE0 +5AC0 +6FA0 +4480 +5FC0 +9280 +A640 +ENDCHAR +STARTCHAR U_4578 +ENCODING 17784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F880 +ABE0 +F880 +23E0 +F800 +23E0 +FA20 +ABE0 +ENDCHAR +STARTCHAR U_4579 +ENCODING 17785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +FBE0 +5640 +ABE0 +2240 +FBE0 +7240 +ABE0 +ENDCHAR +STARTCHAR U_457A +ENCODING 17786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +FFE0 +0400 +7F80 +0400 +FFE0 +4940 +F880 +0B60 +ENDCHAR +STARTCHAR U_457B +ENCODING 17787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +5520 +9CE0 +ENDCHAR +STARTCHAR U_457C +ENCODING 17788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +57E0 +FA40 +ABE0 +FA40 +23E0 +FA40 +53E0 +ENDCHAR +STARTCHAR U_457D +ENCODING 17789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +9540 +F7E0 +2AA0 +BFA0 +A220 +FFE0 +8040 +ENDCHAR +STARTCHAR U_457E +ENCODING 17790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3B80 +2A80 +7FE0 +4900 +7DE0 +5740 +BC80 +8760 +ENDCHAR +STARTCHAR U_457F +ENCODING 17791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +52C0 +FB40 +ABE0 +FA00 +23E0 +F520 +5560 +ENDCHAR +STARTCHAR U_4580 +ENCODING 17792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +7BC0 +4A40 +FFE0 +2480 +2880 +7FC0 +AAA0 +3B80 +ENDCHAR +STARTCHAR U_4581 +ENCODING 17793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FFE0 +4940 +7FE0 +5540 +7DC0 +5540 +FDC0 +9520 +FEA0 +85C0 +ENDCHAR +STARTCHAR U_4582 +ENCODING 17794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +FFE0 +4A40 +EEE0 +A4A0 +3F80 +0400 +7FC0 +0C00 +ENDCHAR +STARTCHAR U_4583 +ENCODING 17795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1500 +FFE0 +1480 +6780 +5140 +FBE0 +2080 +FBE0 +69A0 +BAE0 +ENDCHAR +STARTCHAR U_4584 +ENCODING 17796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +FA80 +57E0 +FA80 +ABE0 +FA80 +4BE0 +9240 +8920 +ENDCHAR +STARTCHAR U_4585 +ENCODING 17797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +7FC0 +0400 +FFE0 +AAA0 +7FC0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_4586 +ENCODING 17798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +FFE0 +52A0 +FBE0 +A940 +DFE0 +89A0 +AB40 +F9A0 +ENDCHAR +STARTCHAR U_4587 +ENCODING 17799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2480 +FFE0 +75C0 +AEA0 +FFE0 +A8A0 +7B00 +48C0 +7300 +ENDCHAR +STARTCHAR U_4588 +ENCODING 17800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +44A0 +4500 +5FC0 +4000 +4980 +4E00 +8840 +87C0 +ENDCHAR +STARTCHAR U_4589 +ENCODING 17801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +0400 +7FE0 +44A0 +5FC0 +4000 +4FC0 +4100 +5FE0 +4100 +8300 +ENDCHAR +STARTCHAR U_458A +ENCODING 17802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1100 +97E0 +5540 +5580 +26E0 +2400 +55C0 +9540 +1940 +0A60 +ENDCHAR +STARTCHAR U_458B +ENCODING 17803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +1080 +7C80 +5480 +7C80 +4080 +5C80 +5540 +5540 +A620 +A420 +ENDCHAR +STARTCHAR U_458C +ENCODING 17804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C20 +1020 +7E20 +52A0 +7CA0 +50A0 +5CA0 +54A0 +5420 +A620 +A460 +ENDCHAR +STARTCHAR U_458D +ENCODING 17805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +7FE0 +4920 +7FC0 +4800 +4F80 +5880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_458E +ENCODING 17806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +AFE0 +AA20 +CFC0 +AA00 +ABC0 +AA80 +EA80 +92A0 +94E0 +ENDCHAR +STARTCHAR U_458F +ENCODING 17807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4920 +7FC0 +5000 +5FC0 +6A40 +5F40 +8AE0 +9480 +ENDCHAR +STARTCHAR U_4590 +ENCODING 17808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +61C0 +4100 +47E0 +7D40 +57E0 +5400 +5540 +5540 +9540 +9A60 +ENDCHAR +STARTCHAR U_4591 +ENCODING 17809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1DE0 +1120 +7F20 +51E0 +7D20 +5120 +5DE0 +5400 +5420 +A7E0 +ENDCHAR +STARTCHAR U_4592 +ENCODING 17810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +0800 +7FE0 +4920 +7F80 +4000 +7FC0 +5080 +5F80 +8900 +BFE0 +ENDCHAR +STARTCHAR U_4593 +ENCODING 17811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2080 +ABE0 +AAA0 +FBE0 +2280 +AAE0 +AA00 +AAA0 +FAA0 +8D20 +ENDCHAR +STARTCHAR U_4594 +ENCODING 17812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +27E0 +F520 +27E0 +F500 +24E0 +5540 +8D40 +F540 +0A60 +ENDCHAR +STARTCHAR U_4595 +ENCODING 17813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +11C0 +7D40 +55C0 +7D40 +5140 +5DC0 +4540 +57E0 +9420 +A3E0 +ENDCHAR +STARTCHAR U_4596 +ENCODING 17814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +13E0 +7EA0 +53E0 +7EA0 +53E0 +5C80 +4080 +54A0 +9420 +A7E0 +ENDCHAR +STARTCHAR U_4597 +ENCODING 17815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +0400 +7FE0 +4920 +7F80 +40A0 +5FE0 +5080 +5FA0 +5540 +A7A0 +ENDCHAR +STARTCHAR U_4598 +ENCODING 17816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +11C0 +7E40 +5480 +7FE0 +52A0 +5BE0 +4140 +5560 +9540 +A660 +ENDCHAR +STARTCHAR U_4599 +ENCODING 17817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +ED40 +9220 +FF80 +4400 +5FC0 +5540 +5F80 +5540 +A9C0 +ENDCHAR +STARTCHAR U_459A +ENCODING 17818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +13C0 +7E40 +53C0 +7E00 +53C0 +4E00 +5BE0 +54A0 +56A0 +A460 +ENDCHAR +STARTCHAR U_459B +ENCODING 17819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +27E0 +F900 +A7E0 +FD20 +A3C0 +9940 +ABC0 +AAA0 +ACA0 +47E0 +ENDCHAR +STARTCHAR U_459C +ENCODING 17820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2100 +7FE0 +52A0 +7FE0 +AA80 +5FE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_459D +ENCODING 17821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7C00 +0400 +7FC0 +4440 +4440 +7FC0 +4400 +0440 +07E0 +FC20 +ENDCHAR +STARTCHAR U_459E +ENCODING 17822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +F840 +AFE0 +A840 +FA40 +2140 +2940 +3840 +E840 +01C0 +ENDCHAR +STARTCHAR U_459F +ENCODING 17823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +1FC0 +0400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A0 +ENCODING 17824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FA40 +AB40 +AAC0 +FA40 +2240 +2A40 +3A40 +CC60 +ENDCHAR +STARTCHAR U_45A1 +ENCODING 17825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +2140 +F940 +A940 +AFC0 +FA40 +2240 +2240 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_45A2 +ENCODING 17826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FAC0 +AAA0 +AC80 +F8A0 +2040 +2080 +3900 +CE00 +ENDCHAR +STARTCHAR U_45A3 +ENCODING 17827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +AD40 +AD40 +FD40 +2540 +2540 +3D40 +E920 +0820 +ENDCHAR +STARTCHAR U_45A4 +ENCODING 17828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +B2C0 +2220 +C1E0 +0400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A5 +ENCODING 17829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0900 +0600 +FFE0 +1440 +6400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A6 +ENCODING 17830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +22A0 +FAA0 +ABE0 +A880 +FAA0 +22A0 +3AA0 +EBE0 +0220 +ENDCHAR +STARTCHAR U_45A7 +ENCODING 17831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +AA40 +AA40 +FBC0 +2000 +3800 +C800 +07E0 +ENDCHAR +STARTCHAR U_45A8 +ENCODING 17832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +A900 +A900 +FA00 +27E0 +2A20 +3A20 +EBE0 +0220 +ENDCHAR +STARTCHAR U_45A9 +ENCODING 17833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +20C0 +FA40 +AE40 +AAA0 +FAA0 +22A0 +2B00 +FA40 +0DC0 +ENDCHAR +STARTCHAR U_45AA +ENCODING 17834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5E60 +5380 +5E20 +E1E0 +0400 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45AB +ENCODING 17835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +A820 +ABC0 +F900 +2100 +2FE0 +3900 +E900 +0100 +ENDCHAR +STARTCHAR U_45AC +ENCODING 17836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FAA0 +ABE0 +AAA0 +FAA0 +23E0 +2880 +3880 +C880 +0080 +ENDCHAR +STARTCHAR U_45AD +ENCODING 17837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7F80 +0800 +FFE0 +2480 +FFE0 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45AE +ENCODING 17838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +AA20 +AA20 +FBA0 +22A0 +22A0 +3BA0 +CA20 +0260 +ENDCHAR +STARTCHAR U_45AF +ENCODING 17839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +2480 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45B0 +ENCODING 17840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2860 +FB80 +AA80 +AAA0 +FAC0 +2A80 +3A80 +CA40 +1320 +ENDCHAR +STARTCHAR U_45B1 +ENCODING 17841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2200 +FBE0 +AA80 +ABE0 +FA80 +2280 +3BE0 +CA00 +03E0 +ENDCHAR +STARTCHAR U_45B2 +ENCODING 17842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +ABA0 +AAA0 +FBA0 +22A0 +3BA0 +C820 +00C0 +ENDCHAR +STARTCHAR U_45B3 +ENCODING 17843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AC20 +A8C0 +FB00 +2100 +2FE0 +3900 +C920 +00E0 +ENDCHAR +STARTCHAR U_45B4 +ENCODING 17844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +AEC0 +AA80 +FAC0 +26A0 +2A80 +3AA0 +ECA0 +0460 +ENDCHAR +STARTCHAR U_45B5 +ENCODING 17845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FBE0 +AAA0 +AAA0 +FBE0 +2080 +28A0 +38E0 +CB20 +ENDCHAR +STARTCHAR U_45B6 +ENCODING 17846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +AB00 +ACA0 +F9C0 +2680 +29C0 +3EA0 +E880 +0300 +ENDCHAR +STARTCHAR U_45B7 +ENCODING 17847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2180 +F980 +AE60 +A900 +FFE0 +2280 +2FE0 +3AA0 +CAE0 +0080 +ENDCHAR +STARTCHAR U_45B8 +ENCODING 17848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +1240 +FFE0 +1540 +F980 +2660 +7F80 +4480 +7F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45B9 +ENCODING 17849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +26E0 +FA80 +A800 +AFC0 +F900 +2100 +2FE0 +3900 +C900 +0100 +ENDCHAR +STARTCHAR U_45BA +ENCODING 17850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4440 +D380 +5C60 +5100 +57C0 +5540 +57C0 +4140 +4FE0 +ENDCHAR +STARTCHAR U_45BB +ENCODING 17851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AA00 +AC40 +FFE0 +2540 +2D40 +3D40 +C540 +0960 +ENDCHAR +STARTCHAR U_45BC +ENCODING 17852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +22E0 +FAA0 +AFA0 +AAA0 +FFA0 +22A0 +2CA0 +3DE0 +C780 +0080 +ENDCHAR +STARTCHAR U_45BD +ENCODING 17853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +3920 +D520 +0C60 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45BE +ENCODING 17854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FC20 +ABC0 +A800 +FFE0 +2280 +3A80 +CAA0 +0460 +ENDCHAR +STARTCHAR U_45BF +ENCODING 17855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +23E0 +FCA0 +70A0 +AB20 +2440 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45C0 +ENCODING 17856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +AA40 +AE20 +FBC0 +2640 +3980 +C980 +0660 +ENDCHAR +STARTCHAR U_45C1 +ENCODING 17857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2280 +FC40 +AFE0 +A840 +FF40 +2540 +3F40 +C840 +00C0 +ENDCHAR +STARTCHAR U_45C2 +ENCODING 17858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2080 +FBE0 +AAA0 +AAC0 +FB60 +2200 +2AC0 +3B40 +CD40 +0660 +ENDCHAR +STARTCHAR U_45C3 +ENCODING 17859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +27E0 +F940 +A880 +AF60 +F940 +27E0 +3940 +C8A0 +0760 +ENDCHAR +STARTCHAR U_45C4 +ENCODING 17860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C60 +2280 +FB80 +AC60 +ABC0 +FC00 +27E0 +3C80 +C480 +0880 +ENDCHAR +STARTCHAR U_45C5 +ENCODING 17861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FBC0 +AA00 +ABC0 +FA00 +27E0 +2AA0 +3AC0 +CA40 +0320 +ENDCHAR +STARTCHAR U_45C6 +ENCODING 17862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FC20 +ABC0 +AA40 +FBC0 +2200 +3BE0 +CA20 +03E0 +ENDCHAR +STARTCHAR U_45C7 +ENCODING 17863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AD60 +ABA0 +FFE0 +2120 +2BA0 +3D60 +C920 +00C0 +ENDCHAR +STARTCHAR U_45C8 +ENCODING 17864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FA00 +A9C0 +AA40 +FBC0 +2240 +3BC0 +EA40 +03C0 +ENDCHAR +STARTCHAR U_45C9 +ENCODING 17865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +F800 +27E0 +2C20 +3FE0 +C420 +07E0 +ENDCHAR +STARTCHAR U_45CA +ENCODING 17866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +FAC0 +A880 +A940 +FE20 +2080 +2AA0 +3AC0 +E940 +0620 +ENDCHAR +STARTCHAR U_45CB +ENCODING 17867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +ABC0 +AA40 +FBC0 +2080 +2FE0 +39C0 +CEA0 +0080 +ENDCHAR +STARTCHAR U_45CC +ENCODING 17868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +FA80 +27E0 +2880 +3BC0 +C880 +07E0 +ENDCHAR +STARTCHAR U_45CD +ENCODING 17869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1200 +FFE0 +1480 +6F00 +14C0 +7F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45CE +ENCODING 17870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2280 +FFE0 +AAA0 +AFE0 +F900 +27C0 +3900 +C900 +0FE0 +ENDCHAR +STARTCHAR U_45CF +ENCODING 17871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +AD40 +AB80 +FA40 +2420 +2BC0 +3A40 +E980 +0660 +ENDCHAR +STARTCHAR U_45D0 +ENCODING 17872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +43E0 +7AA0 +89E0 +0400 +3F80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45D1 +ENCODING 17873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +F900 +A080 +27E0 +3A40 +E940 +07E0 +ENDCHAR +STARTCHAR U_45D2 +ENCODING 17874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27E0 +FA80 +AA80 +AAA0 +FEC0 +2280 +3A80 +EA80 +07E0 +ENDCHAR +STARTCHAR U_45D3 +ENCODING 17875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +AAA0 +AD20 +FAC0 +2100 +28A0 +3AA0 +EA40 +01C0 +ENDCHAR +STARTCHAR U_45D4 +ENCODING 17876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2240 +FFE0 +AA80 +AAE0 +FB40 +2240 +2BE0 +3A40 +EAC0 +0320 +ENDCHAR +STARTCHAR U_45D5 +ENCODING 17877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +7BC0 +CA40 +35E0 +FF80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45D6 +ENCODING 17878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +F940 +AFE0 +A920 +FFC0 +2540 +3D40 +E5C0 +0100 +ENDCHAR +STARTCHAR U_45D7 +ENCODING 17879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +2540 +F800 +AFE0 +A940 +F940 +2FE0 +3940 +EA40 +0240 +ENDCHAR +STARTCHAR U_45D8 +ENCODING 17880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFE0 +A900 +AA40 +FBC0 +2000 +3FC0 +E540 +0FE0 +ENDCHAR +STARTCHAR U_45D9 +ENCODING 17881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +7FC0 +1100 +F5E0 +3F80 +64C0 +BFA0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45DA +ENCODING 17882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +27E0 +FAA0 +ABE0 +AAA0 +FBE0 +22A0 +27E0 +3940 +C840 +00C0 +ENDCHAR +STARTCHAR U_45DB +ENCODING 17883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +25E0 +28A0 +FA40 +ABA0 +AAE0 +FAA0 +2AE0 +3AA0 +E8E0 +08A0 +ENDCHAR +STARTCHAR U_45DC +ENCODING 17884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2260 +2360 +FAA0 +AB60 +A800 +FBE0 +2AA0 +3BE0 +EAA0 +03E0 +ENDCHAR +STARTCHAR U_45DD +ENCODING 17885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +03E0 +FEA0 +33E0 +5AA0 +95E0 +3F80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45DE +ENCODING 17886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1100 +E0E0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_45DF +ENCODING 17887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +FDE0 +9240 +FD80 +A660 +FF80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45E0 +ENCODING 17888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +44A0 +7AC0 +4B80 +94E0 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45E1 +ENCODING 17889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +22C0 +FA80 +AFE0 +AA00 +FBE0 +2200 +2BE0 +FAA0 +0860 +ENDCHAR +STARTCHAR U_45E2 +ENCODING 17890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2140 +25E0 +FA40 +AFE0 +AA00 +FAE0 +22A0 +3AE0 +EF00 +00E0 +ENDCHAR +STARTCHAR U_45E3 +ENCODING 17891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1900 +1F00 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_45E4 +ENCODING 17892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2940 +FFE0 +A940 +AFC0 +F940 +2FC0 +2D40 +F7C0 +1540 +ENDCHAR +STARTCHAR U_45E5 +ENCODING 17893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +3940 +2540 +FAA0 +A880 +AA80 +FAE0 +2A80 +3A80 +EB80 +0C60 +ENDCHAR +STARTCHAR U_45E6 +ENCODING 17894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +24A0 +FA40 +A8A0 +AFE0 +FA40 +22E0 +2A40 +3AE0 +EE40 +01E0 +ENDCHAR +STARTCHAR U_45E7 +ENCODING 17895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2280 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +3AA0 +EDC0 +06A0 +ENDCHAR +STARTCHAR U_45E8 +ENCODING 17896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +AFE0 +AAA0 +FBE0 +22A0 +2BE0 +3800 +EAA0 +02A0 +ENDCHAR +STARTCHAR U_45E9 +ENCODING 17897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +FA80 +AB80 +AAA0 +FFA0 +2AC0 +3F40 +CAA0 +1320 +ENDCHAR +STARTCHAR U_45EA +ENCODING 17898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4880 +4F80 +5540 +AAA0 +3F80 +24C0 +7FE0 +ENDCHAR +STARTCHAR U_45EB +ENCODING 17899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA80 +AA80 +AFE0 +FA80 +2BC0 +3EA0 +EA80 +1280 +ENDCHAR +STARTCHAR U_45EC +ENCODING 17900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA80 +2D60 +3100 +CFE0 +0400 +3F80 +2480 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_45ED +ENCODING 17901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2AC0 +24A0 +FC40 +ABA0 +A800 +FFC0 +2440 +2FC0 +FA80 +0FE0 +ENDCHAR +STARTCHAR U_45EE +ENCODING 17902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FBA0 +AD40 +ABA0 +FD40 +23A0 +3900 +EA80 +0C60 +ENDCHAR +STARTCHAR U_45EF +ENCODING 17903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2140 +25E0 +FB40 +A9E0 +AF40 +F5E0 +2540 +3DE0 +E600 +09E0 +ENDCHAR +STARTCHAR U_45F0 +ENCODING 17904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +27E0 +FAA0 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3D40 +CA20 +ENDCHAR +STARTCHAR U_45F1 +ENCODING 17905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFE0 +A900 +ABC0 +F900 +27E0 +2280 +3440 +C820 +ENDCHAR +STARTCHAR U_45F2 +ENCODING 17906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +27E0 +FB80 +AD40 +AAE0 +FD40 +2740 +29E0 +3A40 +CC40 +ENDCHAR +STARTCHAR U_45F3 +ENCODING 17907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FFE0 +A900 +AFE0 +FD20 +27E0 +2940 +3E60 +CBC0 +ENDCHAR +STARTCHAR U_45F4 +ENCODING 17908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2940 +FFE0 +AA80 +ABE0 +FC80 +2280 +2BE0 +3A00 +CDE0 +ENDCHAR +STARTCHAR U_45F5 +ENCODING 17909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +23E0 +FAA0 +ABE0 +AAA0 +FFE0 +22A0 +2BE0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_45F6 +ENCODING 17910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +FBC0 +AA40 +ABE0 +FAA0 +2560 +2A20 +3BA0 +C840 +ENDCHAR +STARTCHAR U_45F7 +ENCODING 17911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2140 +FFE0 +AA20 +ABE0 +FA20 +23E0 +2CA0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_45F8 +ENCODING 17912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +57E0 +F480 +2760 +7FC0 +A440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_45F9 +ENCODING 17913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27E0 +FA40 +AD80 +AEE0 +FA40 +26E0 +2920 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_45FA +ENCODING 17914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +1700 +61C0 +1500 +67E0 +5080 +FFE0 +AAA0 +FBE0 +2480 +FFE0 +ENDCHAR +STARTCHAR U_45FB +ENCODING 17915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2940 +FEE0 +AAA0 +AEA0 +FAA0 +2EA0 +28E0 +3E80 +CA80 +ENDCHAR +STARTCHAR U_45FC +ENCODING 17916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2100 +FFE0 +AD60 +ABA0 +FFE0 +2100 +2FE0 +3540 +CAA0 +ENDCHAR +STARTCHAR U_45FD +ENCODING 17917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +5480 +EFE0 +5480 +EFE0 +2480 +7FE0 +2440 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_45FE +ENCODING 17918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +27E0 +FA40 +ACA0 +AA40 +FCA0 +26E0 +2800 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_45FF +ENCODING 17919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FA40 +ABC0 +A800 +FBE0 +22A0 +2FE0 +3880 +CB80 +ENDCHAR +STARTCHAR U_4600 +ENCODING 17920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2100 +3F80 +2080 +3F80 +2900 +7FE0 +4920 +7FE0 +C920 +ENDCHAR +STARTCHAR U_4601 +ENCODING 17921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +2920 +7F40 +C920 +7FC0 +4840 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_4602 +ENCODING 17922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +22A0 +FFE0 +AA80 +AFA0 +FAA0 +2740 +2A40 +3AA0 +CF20 +ENDCHAR +STARTCHAR U_4603 +ENCODING 17923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2D60 +FBA0 +AFE0 +A900 +FFE0 +2540 +2FE0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_4604 +ENCODING 17924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1900 +2900 +FFE0 +54A0 +7FE0 +14A0 +FBC0 +ENDCHAR +STARTCHAR U_4605 +ENCODING 17925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +4B00 +FBE0 +4A40 +7B80 +4A20 +7BE0 +5540 +7BC0 +1520 +FBC0 +ENDCHAR +STARTCHAR U_4606 +ENCODING 17926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2920 +FFC0 +A900 +AFC0 +F900 +27C0 +2940 +3520 +D7A0 +ENDCHAR +STARTCHAR U_4607 +ENCODING 17927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +1500 +3580 +FBE0 +AAA0 +FBE0 +24C0 +FBA0 +ENDCHAR +STARTCHAR U_4608 +ENCODING 17928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +2FC0 +FAE0 +AFA0 +AAA0 +FFA0 +2AA0 +2BA0 +38A0 +D160 +ENDCHAR +STARTCHAR U_4609 +ENCODING 17929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +7F80 +9560 +7FC0 +5540 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_460A +ENCODING 17930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2AA0 +FFE0 +AD40 +FFE0 +2680 +2DA0 +34A0 +C8C0 +1320 +ENDCHAR +STARTCHAR U_460B +ENCODING 17931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +2AA0 +2FE0 +FA80 +AF80 +AAA0 +FFA0 +2240 +3F40 +32C0 +CF20 +ENDCHAR +STARTCHAR U_460C +ENCODING 17932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +BFC0 +9100 +BFC0 +A880 +FFE0 +AAA0 +FBE0 +2480 +FBA0 +ENDCHAR +STARTCHAR U_460D +ENCODING 17933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2080 +3F80 +2480 +FFE0 +9120 +7FC0 +5540 +7FC0 +D560 +ENDCHAR +STARTCHAR U_460E +ENCODING 17934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +2D40 +FAA0 +AFC0 +A840 +FFC0 +2400 +2FE0 +3820 +C8E0 +ENDCHAR +STARTCHAR U_460F +ENCODING 17935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +20A0 +FEA0 +AAC0 +AAA0 +AAA0 +AAA0 +AFC0 +F080 +0080 +0080 +ENDCHAR +STARTCHAR U_4610 +ENCODING 17936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2140 +4140 +FD40 +AD40 +D760 +A540 +FF40 +0140 +0240 +04C0 +ENDCHAR +STARTCHAR U_4611 +ENCODING 17937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2080 +2380 +4080 +FCA0 +AFC0 +D5C0 +A6A0 +FCA0 +0080 +0180 +ENDCHAR +STARTCHAR U_4612 +ENCODING 17938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2140 +4220 +FFE0 +AD40 +D620 +A5C0 +FF40 +0080 +0140 +0620 +ENDCHAR +STARTCHAR U_4613 +ENCODING 17939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +21C0 +4240 +FC80 +AB60 +AA20 +AB60 +BE20 +C220 +03E0 +0220 +ENDCHAR +STARTCHAR U_4614 +ENCODING 17940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +23E0 +4220 +FDC0 +AF40 +D480 +AF60 +F1C0 +0140 +0140 +01C0 +ENDCHAR +STARTCHAR U_4615 +ENCODING 17941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +44E0 +9E00 +2000 +5DE0 +D440 +5440 +5540 +5640 +6440 +40C0 +ENDCHAR +STARTCHAR U_4616 +ENCODING 17942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +5EE0 +9400 +24E0 +5F40 +C440 +5540 +5540 +5F40 +4140 +40C0 +ENDCHAR +STARTCHAR U_4617 +ENCODING 17943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +55E0 +9F00 +2000 +5FE0 +CA40 +5E40 +4A40 +5F40 +5540 +64C0 +ENDCHAR +STARTCHAR U_4618 +ENCODING 17944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5EE0 +A400 +5E00 +C5E0 +5E40 +4A40 +5E40 +4A40 +5F40 +65C0 +ENDCHAR +STARTCHAR U_4619 +ENCODING 17945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +5EE0 +8A00 +7FE0 +5240 +DE40 +4440 +7F40 +4440 +5F40 +55C0 +ENDCHAR +STARTCHAR U_461A +ENCODING 17946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1440 +3280 +D180 +1860 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_461B +ENCODING 17947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2780 +F480 +1480 +2C80 +7480 +AC80 +2480 +2480 +24A0 +2860 +ENDCHAR +STARTCHAR U_461C +ENCODING 17948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +F7E0 +14A0 +2CA0 +74A0 +ACA0 +24E0 +24A0 +2080 +2080 +ENDCHAR +STARTCHAR U_461D +ENCODING 17949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2140 +F120 +17E0 +2900 +7100 +A900 +2080 +20A0 +2060 +2020 +ENDCHAR +STARTCHAR U_461E +ENCODING 17950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +F240 +1240 +2A40 +73E0 +A820 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_461F +ENCODING 17951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F140 +1140 +2FC0 +7500 +AFE0 +2120 +2120 +21C0 +2100 +ENDCHAR +STARTCHAR U_4620 +ENCODING 17952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +FFE0 +1400 +2540 +6D40 +B540 +2C80 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_4621 +ENCODING 17953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +FBC0 +8200 +9A20 +69E0 +0400 +FFE0 +1440 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_4622 +ENCODING 17954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +1420 +2800 +77E0 +A880 +2080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4623 +ENCODING 17955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +F280 +1280 +2BE0 +7280 +AA80 +2A80 +2A80 +2BA0 +2C60 +ENDCHAR +STARTCHAR U_4624 +ENCODING 17956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +F7E0 +1100 +2B80 +7380 +AD40 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_4625 +ENCODING 17957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +22A0 +F3E0 +12A0 +2AA0 +73E0 +A880 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_4626 +ENCODING 17958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F420 +17E0 +2C00 +7500 +ADE0 +2500 +2500 +2520 +28E0 +ENDCHAR +STARTCHAR U_4627 +ENCODING 17959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +27C0 +3540 +6540 +BFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4628 +ENCODING 17960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +1240 +2420 +7240 +A240 +3180 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_4629 +ENCODING 17961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +F7E0 +1820 +27A0 +74A0 +A7A0 +34A0 +27A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_462A +ENCODING 17962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +1200 +2440 +77C0 +A280 +3280 +2280 +24A0 +2460 +ENDCHAR +STARTCHAR U_462B +ENCODING 17963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FDE0 +4920 +49E0 +3120 +4800 +FFE0 +1240 +E180 +2880 +3060 +ENDCHAR +STARTCHAR U_462C +ENCODING 17964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +F080 +1FE0 +2480 +7FA0 +A4A0 +34C0 +28A0 +2160 +2620 +ENDCHAR +STARTCHAR U_462D +ENCODING 17965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F100 +1240 +27E0 +7080 +A080 +33E0 +2080 +2080 +27E0 +ENDCHAR +STARTCHAR U_462E +ENCODING 17966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +2480 +2480 +5540 +FFE0 +2480 +2300 +2900 +30E0 +ENDCHAR +STARTCHAR U_462F +ENCODING 17967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +F1C0 +13E0 +2A20 +73E0 +AA20 +23E0 +2220 +2220 +2260 +ENDCHAR +STARTCHAR U_4630 +ENCODING 17968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +41C0 +FC40 +4440 +6960 +C940 +6540 +4540 +55E0 +4800 +57E0 +ENDCHAR +STARTCHAR U_4631 +ENCODING 17969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +4E40 +3180 +DF60 +1100 +1F00 +3240 +D180 +1860 +ENDCHAR +STARTCHAR U_4632 +ENCODING 17970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +F3C0 +1040 +27E0 +7420 +A3C0 +3240 +2180 +2180 +2660 +ENDCHAR +STARTCHAR U_4633 +ENCODING 17971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +2820 +37C0 +6100 +B100 +27C0 +2920 +2540 +2FE0 +ENDCHAR +STARTCHAR U_4634 +ENCODING 17972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +E540 +2520 +5E20 +64A0 +C480 +6E80 +5480 +4540 +4520 +45E0 +ENDCHAR +STARTCHAR U_4635 +ENCODING 17973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +F3C0 +1040 +27E0 +7080 +A6A0 +31C0 +26A0 +2080 +2180 +ENDCHAR +STARTCHAR U_4636 +ENCODING 17974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F080 +2100 +2D60 +7BA0 +A920 +3BA0 +2D60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4637 +ENCODING 17975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +24A0 +F2A0 +12C0 +27E0 +74A0 +A5A0 +36E0 +24A0 +24A0 +24E0 +ENDCHAR +STARTCHAR U_4638 +ENCODING 17976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F7E0 +1280 +2CE0 +75A0 +A760 +3520 +24C0 +24C0 +2720 +ENDCHAR +STARTCHAR U_4639 +ENCODING 17977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2240 +3240 +65A0 +B100 +27E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_463A +ENCODING 17978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2420 +33C0 +6080 +B280 +22C0 +2280 +2780 +28E0 +ENDCHAR +STARTCHAR U_463B +ENCODING 17979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F240 +27E0 +3000 +63C0 +B240 +23C0 +2240 +23C0 +2440 +ENDCHAR +STARTCHAR U_463C +ENCODING 17980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2820 +35C0 +6740 +B540 +2BC0 +2100 +2320 +2CE0 +ENDCHAR +STARTCHAR U_463D +ENCODING 17981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2460 +F420 +2760 +3420 +67E0 +B280 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_463E +ENCODING 17982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2420 +2BC0 +7240 +ABC0 +2200 +23E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_463F +ENCODING 17983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F820 +2FE0 +3880 +6AA0 +BBE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_4640 +ENCODING 17984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +FAA0 +2AA0 +2EE0 +7AA0 +AEE0 +3AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_4641 +ENCODING 17985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +F7E0 +1140 +20A0 +7760 +A140 +37E0 +2140 +2180 +2660 +ENDCHAR +STARTCHAR U_4642 +ENCODING 17986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +FA20 +2280 +3440 +67C0 +B100 +20A0 +2A20 +2A40 +29C0 +ENDCHAR +STARTCHAR U_4643 +ENCODING 17987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +F200 +27C0 +3880 +67E0 +B240 +23C0 +2240 +23C0 +2440 +ENDCHAR +STARTCHAR U_4644 +ENCODING 17988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2100 +F7E0 +2100 +3300 +6560 +B520 +2760 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_4645 +ENCODING 17989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F280 +2FE0 +3AA0 +6FE0 +B240 +2FE0 +2440 +2380 +2C60 +ENDCHAR +STARTCHAR U_4646 +ENCODING 17990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EA0 +2AC0 +F6A0 +1440 +2840 +77A0 +A100 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4647 +ENCODING 17991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +2FE0 +3AA0 +6AA0 +B100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4648 +ENCODING 17992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F440 +2FE0 +3500 +65E0 +B680 +27E0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4649 +ENCODING 17993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2480 +F7E0 +2480 +35E0 +6520 +B5E0 +2520 +25E0 +2520 +29E0 +ENDCHAR +STARTCHAR U_464A +ENCODING 17994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +2FE0 +3920 +67E0 +B540 +2540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_464B +ENCODING 17995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +27C0 +3000 +67C0 +B540 +2640 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_464C +ENCODING 17996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +2FE0 +3000 +67C0 +B440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_464D +ENCODING 17997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2060 +F640 +2D60 +3520 +6FC0 +B560 +2540 +2560 +2940 +3120 +ENDCHAR +STARTCHAR U_464E +ENCODING 17998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2520 +F100 +2240 +3780 +6240 +B7E0 +2100 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_464F +ENCODING 17999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +F540 +27C0 +3540 +67C0 +B540 +2FE0 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_4650 +ENCODING 18000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2FE0 +2920 +2960 +ENDCHAR +STARTCHAR U_4651 +ENCODING 18001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F000 +13C0 +2A40 +77E0 +AA40 +23C0 +26A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_4652 +ENCODING 18002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +1240 +2F80 +7440 +AFC0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_4653 +ENCODING 18003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +FAA0 +2FE0 +3100 +67C0 +B100 +2FE0 +2200 +2440 +27E0 +ENDCHAR +STARTCHAR U_4654 +ENCODING 18004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +F5C0 +1540 +2DC0 +7400 +AFE0 +24A0 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_4655 +ENCODING 18005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +F2A0 +14A0 +2800 +7880 +AAE0 +3A80 +2A80 +2B80 +2C60 +ENDCHAR +STARTCHAR U_4656 +ENCODING 18006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +FFE0 +2000 +3EE0 +6AA0 +BEE0 +2AA0 +2EE0 +2AA0 +3360 +ENDCHAR +STARTCHAR U_4657 +ENCODING 18007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F440 +2FE0 +7920 +AFE0 +3920 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_4658 +ENCODING 18008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80A0 +40A0 +EFE0 +2A80 +5B80 +EAA0 +DFA0 +4A40 +4F40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_4659 +ENCODING 18009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7C0 +3EA0 +35C0 +6FA0 +A5C0 +2680 +2BE0 +2880 +3080 +ENDCHAR +STARTCHAR U_465A +ENCODING 18010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2500 +3F80 +2000 +3FC0 +5440 +FFE0 +2240 +E980 +30E0 +ENDCHAR +STARTCHAR U_465B +ENCODING 18011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2440 +3FE0 +6440 +B7C0 +2320 +2CC0 +2440 +2620 +ENDCHAR +STARTCHAR U_465C +ENCODING 18012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2340 +F9C0 +26A0 +31C0 +6E80 +B5C0 +2480 +25E0 +2680 +39E0 +ENDCHAR +STARTCHAR U_465D +ENCODING 18013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +FBC0 +2140 +FB40 +54E0 +FA40 +2180 +EC80 +3060 +ENDCHAR +STARTCHAR U_465E +ENCODING 18014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +25A0 +F240 +2420 +3FE0 +6000 +B7C0 +2440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_465F +ENCODING 18015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +FFA0 +2AA0 +3FE0 +6AA0 +BBA0 +2D20 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4660 +ENCODING 18016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5080 +FA80 +34E0 +5F20 +F540 +D540 +7F40 +54A0 +54A0 +6920 +ENDCHAR +STARTCHAR U_4661 +ENCODING 18017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +27C0 +5100 +6FE0 +B440 +2540 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_4662 +ENCODING 18018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +2920 +5D60 +6BA0 +DFE0 +4440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_4663 +ENCODING 18019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +1280 +2C60 +7280 +6EE0 +B280 +2EE0 +2280 +2480 +ENDCHAR +STARTCHAR U_4664 +ENCODING 18020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5440 +F5C0 +2540 +5FE0 +6820 +CBA0 +6AA0 +4BA0 +4820 +5FE0 +ENDCHAR +STARTCHAR U_4665 +ENCODING 18021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +EFE0 +2D60 +5BA0 +7280 +DD60 +4780 +4080 +4300 +4080 +ENDCHAR +STARTCHAR U_4666 +ENCODING 18022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +2FE0 +5AA0 +6FE0 +D220 +47E0 +5C80 +4300 +5C00 +ENDCHAR +STARTCHAR U_4667 +ENCODING 18023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +2540 +57C0 +67C0 +B100 +27C0 +2100 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_4668 +ENCODING 18024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +2540 +5FE0 +6380 +BD60 +2320 +2D40 +2480 +2660 +ENDCHAR +STARTCHAR U_4669 +ENCODING 18025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +F440 +2FE0 +5820 +E7C0 +D240 +4D80 +4340 +4D20 +4300 +ENDCHAR +STARTCHAR U_466A +ENCODING 18026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2480 +FDE0 +76C0 +ADA0 +FFE0 +2480 +FFE0 +1280 +3500 +D8C0 +ENDCHAR +STARTCHAR U_466B +ENCODING 18027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +2EC0 +F2A0 +2FE0 +2540 +57C0 +6540 +D7C0 +4280 +4FE0 +4440 +ENDCHAR +STARTCHAR U_466C +ENCODING 18028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +2EE0 +5440 +62A0 +DFE0 +4480 +4300 +4CE0 +ENDCHAR +STARTCHAR U_466D +ENCODING 18029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +2FC0 +2280 +5FE0 +6480 +DB40 +45A0 +4500 +4BC0 +ENDCHAR +STARTCHAR U_466E +ENCODING 18030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +F480 +2EE0 +2AA0 +5EE0 +67E0 +D880 +4BE0 +4880 +4BE0 +ENDCHAR +STARTCHAR U_466F +ENCODING 18031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +FA80 +2EC0 +2B20 +57E0 +6480 +D780 +45C0 +4700 +49E0 +ENDCHAR +STARTCHAR U_4670 +ENCODING 18032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FF20 +25E0 +5B40 +7540 +DFE0 +6540 +5FE0 +5540 +5F40 +51E0 +ENDCHAR +STARTCHAR U_4671 +ENCODING 18033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +FFE0 +2940 +3FE0 +6AA0 +BFE0 +2AA0 +2FA0 +2AA0 +3F40 +ENDCHAR +STARTCHAR U_4672 +ENCODING 18034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +0400 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4673 +ENCODING 18035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +4440 +2480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_4674 +ENCODING 18036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +5140 +7FC0 +0400 +FFE0 +2040 +DFA0 +1080 +1FE0 +ENDCHAR +STARTCHAR U_4675 +ENCODING 18037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4676 +ENCODING 18038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +2FE0 +2920 +FE00 +AAA0 +AEA0 +C2C0 +8240 +FE40 +8320 +ENDCHAR +STARTCHAR U_4677 +ENCODING 18039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2580 +2A80 +3480 +3F80 +20A0 +C160 +7F80 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_4678 +ENCODING 18040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9080 +FFE0 +9080 +F480 +9280 +F280 +5080 +51A0 +9020 +9FE0 +ENDCHAR +STARTCHAR U_4679 +ENCODING 18041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +53C0 +5240 +FBC0 +5240 +53C0 +5280 +5280 +94A0 +9860 +ENDCHAR +STARTCHAR U_467A +ENCODING 18042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +AC40 +7440 +27C0 +2440 +37C0 +4A80 +44A0 +9860 +ENDCHAR +STARTCHAR U_467B +ENCODING 18043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3A40 +E3C0 +A240 +A3C0 +FA40 +2BC0 +6A80 +BA80 +24A0 +2860 +ENDCHAR +STARTCHAR U_467C +ENCODING 18044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2BC0 +2A40 +4A40 +93C0 +7A40 +4BC0 +4A80 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_467D +ENCODING 18045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +3180 +DF60 +1500 +1B00 +1500 +1900 +1F40 +61C0 +ENDCHAR +STARTCHAR U_467E +ENCODING 18046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +8BC0 +4240 +7BC0 +4240 +43C0 +4A80 +3AA0 +0C60 +ENDCHAR +STARTCHAR U_467F +ENCODING 18047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +2440 +27C0 +FC40 +27C0 +6440 +77C0 +AA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4680 +ENCODING 18048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A40 +6BC0 +5E40 +EBC0 +6A40 +5BC0 +4980 +5AA0 +8CE0 +ENDCHAR +STARTCHAR U_4681 +ENCODING 18049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +43C0 +FA40 +8BC0 +EA40 +ABC0 +AA40 +EBC0 +8980 +9AA0 +8CE0 +ENDCHAR +STARTCHAR U_4682 +ENCODING 18050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +7440 +27C0 +FC40 +57C0 +5440 +DFC0 +5280 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_4683 +ENCODING 18051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7780 +4480 +F780 +9480 +D780 +D480 +9780 +9300 +F520 +09E0 +ENDCHAR +STARTCHAR U_4684 +ENCODING 18052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0A40 +7BC0 +0A40 +FFC0 +1240 +57C0 +3980 +56A0 +92A0 +3460 +ENDCHAR +STARTCHAR U_4685 +ENCODING 18053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +27C0 +7440 +FFC0 +2440 +77C0 +AA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4686 +ENCODING 18054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FF80 +5480 +2780 +7480 +5780 +5480 +FF80 +2300 +5520 +89E0 +ENDCHAR +STARTCHAR U_4687 +ENCODING 18055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +AC40 +37C0 +4440 +F7C0 +5440 +77C0 +5280 +74A0 +08E0 +ENDCHAR +STARTCHAR U_4688 +ENCODING 18056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +DA40 +FBC0 +2240 +73C0 +2180 +3AA0 +E4E0 +ENDCHAR +STARTCHAR U_4689 +ENCODING 18057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FDC0 +5540 +F5C0 +5540 +EDC0 +4140 +FDC0 +3180 +4AA0 +84E0 +ENDCHAR +STARTCHAR U_468A +ENCODING 18058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FBC0 +5240 +8BC0 +FA40 +ABC0 +A980 +AD80 +FAA0 +84E0 +ENDCHAR +STARTCHAR U_468B +ENCODING 18059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +FBC0 +8A40 +FBC0 +8A40 +FA40 +8BC0 +F980 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_468C +ENCODING 18060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A40 +7BC0 +4A40 +FFC0 +2240 +73C0 +A980 +72A0 +24E0 +ENDCHAR +STARTCHAR U_468D +ENCODING 18061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +73C0 +2240 +73C0 +2240 +FBC0 +5240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_468E +ENCODING 18062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DC0 +1140 +7DC0 +1140 +FFC0 +2940 +C7C0 +6C80 +45A0 +7EE0 +ENDCHAR +STARTCHAR U_468F +ENCODING 18063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +FA40 +73C0 +AA40 +4BC0 +FE40 +ABC0 +FD80 +4AA0 +8CE0 +ENDCHAR +STARTCHAR U_4690 +ENCODING 18064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +FDC0 +5540 +F5C0 +5D40 +A1C0 +7940 +49C0 +7880 +49A0 +7AE0 +ENDCHAR +STARTCHAR U_4691 +ENCODING 18065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +AA40 +FBC0 +5240 +73C0 +5240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_4692 +ENCODING 18066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5240 +FBC0 +AA40 +FBC0 +AA40 +FBC0 +2180 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_4693 +ENCODING 18067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +7240 +53C0 +7240 +53C0 +F980 +22A0 +24E0 +ENDCHAR +STARTCHAR U_4694 +ENCODING 18068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8A40 +73C0 +AA40 +73C0 +D240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_4695 +ENCODING 18069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D800 +03C0 +FA40 +ABC0 +AA40 +23C0 +FA40 +93C0 +D980 +92A0 +DCE0 +ENDCHAR +STARTCHAR U_4696 +ENCODING 18070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +7240 +ABC0 +FA40 +73C0 +A980 +72A0 +FCE0 +ENDCHAR +STARTCHAR U_4697 +ENCODING 18071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9280 +FA40 +AA40 +FC20 +A900 +F900 +AA40 +ABA0 +9A20 +ENDCHAR +STARTCHAR U_4698 +ENCODING 18072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4EE0 +9400 +3FE0 +5540 +DF40 +5540 +5F40 +5540 +5140 +63C0 +ENDCHAR +STARTCHAR U_4699 +ENCODING 18073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9000 +FBC0 +AA40 +FBC0 +AA40 +FBC0 +A800 +8800 +9BE0 +ENDCHAR +STARTCHAR U_469A +ENCODING 18074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FA80 +A880 +FFE0 +A940 +F940 +A940 +AA40 +9C60 +ENDCHAR +STARTCHAR U_469B +ENCODING 18075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A800 +FBE0 +AA20 +AA20 +9BE0 +ENDCHAR +STARTCHAR U_469C +ENCODING 18076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +92A0 +FBE0 +AAA0 +FBE0 +AA40 +FFE0 +A840 +A840 +9840 +ENDCHAR +STARTCHAR U_469D +ENCODING 18077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9000 +F940 +A940 +FAA0 +A880 +FBE0 +A880 +A880 +9880 +ENDCHAR +STARTCHAR U_469E +ENCODING 18078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9100 +FD40 +AD40 +FBA0 +A900 +FB80 +AD40 +A920 +9900 +ENDCHAR +STARTCHAR U_469F +ENCODING 18079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A800 +FFE0 +AA40 +A840 +98C0 +ENDCHAR +STARTCHAR U_46A0 +ENCODING 18080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7000 +53E0 +9220 +FBE0 +AA20 +ABE0 +FA80 +ABE0 +FA80 +AAA0 +9BE0 +ENDCHAR +STARTCHAR U_46A1 +ENCODING 18081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A840 +FAA0 +AE80 +AA20 +99E0 +ENDCHAR +STARTCHAR U_46A2 +ENCODING 18082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +57E0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +AAC0 +ACA0 +9880 +ENDCHAR +STARTCHAR U_46A3 +ENCODING 18083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +93C0 +FA40 +AFE0 +F880 +AA80 +FAE0 +AA80 +AB80 +9CE0 +ENDCHAR +STARTCHAR U_46A4 +ENCODING 18084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +72A0 +93E0 +FAA0 +ABE0 +F880 +ABE0 +FAA0 +AAE0 +ABA0 +9A60 +ENDCHAR +STARTCHAR U_46A5 +ENCODING 18085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7120 +AF60 +F880 +AFE0 +F920 +ADA0 +FB60 +ADA0 +A920 +9EC0 +ENDCHAR +STARTCHAR U_46A6 +ENCODING 18086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5F00 +A9C0 +F900 +ABE0 +FAA0 +ABE0 +FA80 +AAE0 +AB40 +9D60 +ENDCHAR +STARTCHAR U_46A7 +ENCODING 18087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +75A0 +9360 +FCA0 +A980 +FE60 +AB80 +F8C0 +AB20 +A8C0 +9F00 +ENDCHAR +STARTCHAR U_46A8 +ENCODING 18088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +75A0 +9240 +FC20 +A6E0 +FAA0 +AF00 +F8E0 +AEA0 +AA40 +8DA0 +ENDCHAR +STARTCHAR U_46A9 +ENCODING 18089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +97E0 +FA40 +AFA0 +FA80 +ABE0 +FA20 +ABA0 +AAA0 +9BA0 +ENDCHAR +STARTCHAR U_46AA +ENCODING 18090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +AFE0 +F800 +AFE0 +FA40 +ABC0 +FAA0 +AEC0 +AA40 +9B20 +ENDCHAR +STARTCHAR U_46AB +ENCODING 18091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +AD40 +F940 +4F80 +9160 +3F80 +2480 +3E80 +2480 +5E80 +ENDCHAR +STARTCHAR U_46AC +ENCODING 18092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +AFE0 +FB40 +AD20 +FA40 +ABE0 +FD40 +ABE0 +A940 +BE40 +ENDCHAR +STARTCHAR U_46AD +ENCODING 18093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4760 +7140 +93E0 +FAA0 +ABE0 +FA40 +AFE0 +FA40 +ABE0 +AA40 +9BE0 +ENDCHAR +STARTCHAR U_46AE +ENCODING 18094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2F80 +F480 +0480 +F500 +05E0 +F420 +0420 +F420 +95E0 +F840 +ENDCHAR +STARTCHAR U_46AF +ENCODING 18095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FE20 +0120 +7D20 +0120 +7D20 +0120 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_46B0 +ENCODING 18096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +FE00 +0260 +7B80 +0600 +7A00 +0200 +7A20 +4A20 +79E0 +ENDCHAR +STARTCHAR U_46B1 +ENCODING 18097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +0080 +7AC0 +02A0 +7CA0 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_46B2 +ENCODING 18098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1020 +FCC0 +0300 +7820 +00C0 +7B00 +0000 +7820 +48C0 +7F00 +ENDCHAR +STARTCHAR U_46B3 +ENCODING 18099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0100 +F100 +07C0 +F440 +0280 +F100 +9280 +FC60 +ENDCHAR +STARTCHAR U_46B4 +ENCODING 18100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +13E0 +FE20 +03E0 +7A20 +03E0 +7A20 +0220 +7A20 +4A20 +7CE0 +ENDCHAR +STARTCHAR U_46B5 +ENCODING 18101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2280 +F880 +0480 +F280 +0080 +FFE0 +0080 +F080 +9080 +F080 +ENDCHAR +STARTCHAR U_46B6 +ENCODING 18102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +0100 +F100 +0FE0 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46B7 +ENCODING 18103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2240 +FC20 +0000 +F7E0 +0200 +F7E0 +0020 +F020 +9140 +F080 +ENDCHAR +STARTCHAR U_46B8 +ENCODING 18104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +F820 +0240 +F240 +0240 +F240 +9240 +F440 +ENDCHAR +STARTCHAR U_46B9 +ENCODING 18105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +FC80 +0480 +F7E0 +0480 +F480 +0480 +F480 +95A0 +F6E0 +ENDCHAR +STARTCHAR U_46BA +ENCODING 18106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0640 +FA40 +0240 +F240 +0180 +F180 +9240 +FC20 +ENDCHAR +STARTCHAR U_46BB +ENCODING 18107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0F80 +1500 +6A00 +0400 +FFC0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46BC +ENCODING 18108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FA40 +0240 +F240 +07E0 +F240 +0240 +F240 +9240 +FFE0 +ENDCHAR +STARTCHAR U_46BD +ENCODING 18109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +01C0 +F700 +0100 +F1E0 +0F00 +F100 +9120 +F0E0 +ENDCHAR +STARTCHAR U_46BE +ENCODING 18110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2780 +F880 +0080 +F080 +0FE0 +F080 +0080 +F080 +9080 +F7E0 +ENDCHAR +STARTCHAR U_46BF +ENCODING 18111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F7E0 +0520 +F540 +0900 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46C0 +ENCODING 18112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FC00 +07E0 +F620 +0520 +F540 +0480 +F480 +9540 +FA20 +ENDCHAR +STARTCHAR U_46C1 +ENCODING 18113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +F240 +0240 +F7E0 +0240 +F7E0 +0240 +F240 +9240 +F4C0 +ENDCHAR +STARTCHAR U_46C2 +ENCODING 18114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2340 +FD40 +0140 +FBE0 +0140 +F940 +0140 +F940 +9A40 +FC40 +ENDCHAR +STARTCHAR U_46C3 +ENCODING 18115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F000 +0000 +F7E0 +0280 +F280 +02A0 +F4A0 +94A0 +F860 +ENDCHAR +STARTCHAR U_46C4 +ENCODING 18116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4400 +EFE0 +0AA0 +EAA0 +16E0 +E280 +0280 +E4A0 +A4A0 +E8E0 +ENDCHAR +STARTCHAR U_46C5 +ENCODING 18117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +24A0 +F4A0 +07E0 +F4A0 +04A0 +F7E0 +04A0 +F080 +9080 +F080 +ENDCHAR +STARTCHAR U_46C6 +ENCODING 18118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +0080 +7BE0 +02A0 +7AA0 +03E0 +7AA0 +4AA0 +4AA0 +7BE0 +ENDCHAR +STARTCHAR U_46C7 +ENCODING 18119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +0240 +F240 +0420 +F800 +03E0 +F220 +9220 +F220 +93E0 +ENDCHAR +STARTCHAR U_46C8 +ENCODING 18120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F500 +0900 +F100 +07E0 +F100 +0100 +F280 +9240 +F420 +ENDCHAR +STARTCHAR U_46C9 +ENCODING 18121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +07C0 +F500 +07C0 +F500 +0500 +F4A0 +9660 +F420 +ENDCHAR +STARTCHAR U_46CA +ENCODING 18122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FE20 +0220 +7A20 +03E0 +7800 +0000 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_46CB +ENCODING 18123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +20A0 +F080 +07E0 +F480 +0480 +F4A0 +04C0 +F4A0 +96A0 +F160 +ENDCHAR +STARTCHAR U_46CC +ENCODING 18124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F3E0 +0420 +F3A0 +02A0 +F3A0 +0260 +F200 +9220 +F1E0 +ENDCHAR +STARTCHAR U_46CD +ENCODING 18125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +02A0 +FFE0 +0A80 +FFE0 +02A0 +F2A0 +94E0 +F880 +ENDCHAR +STARTCHAR U_46CE +ENCODING 18126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F420 +0840 +F280 +0280 +F280 +0280 +F2A0 +94A0 +F8E0 +ENDCHAR +STARTCHAR U_46CF +ENCODING 18127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +F220 +03E0 +F280 +02A0 +F2C0 +0280 +F2A0 +94A0 +F4E0 +ENDCHAR +STARTCHAR U_46D0 +ENCODING 18128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0040 +3FC0 +1140 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D1 +ENCODING 18129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F540 +0440 +F480 +0C80 +F540 +0620 +F420 +9C40 +F3C0 +ENDCHAR +STARTCHAR U_46D2 +ENCODING 18130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +FBE0 +0420 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D3 +ENCODING 18131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +93E0 +9480 +1440 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D4 +ENCODING 18132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +0100 +E200 +0FE0 +EAA0 +0AA0 +EAA0 +AAA0 +AAA0 +E860 +ENDCHAR +STARTCHAR U_46D5 +ENCODING 18133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +F7E0 +04A0 +F7E0 +04A0 +F7E0 +0480 +F280 +9180 +FE60 +ENDCHAR +STARTCHAR U_46D6 +ENCODING 18134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0520 +F7E0 +0520 +F7E0 +0140 +F080 +9160 +FE20 +ENDCHAR +STARTCHAR U_46D7 +ENCODING 18135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +A7E0 +A000 +FBC0 +8800 +8BC0 +F800 +A3C0 +A240 +FBC0 +ENDCHAR +STARTCHAR U_46D8 +ENCODING 18136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +24E0 +FF80 +0480 +F480 +0480 +F7E0 +0480 +F480 +9480 +F5E0 +ENDCHAR +STARTCHAR U_46D9 +ENCODING 18137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2480 +FC80 +07E0 +F480 +0580 +F5C0 +06A0 +F480 +9480 +F480 +ENDCHAR +STARTCHAR U_46DA +ENCODING 18138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1120 +7920 +1240 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46DB +ENCODING 18139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +0820 +EBA0 +0AA0 +EAA0 +0AA0 +EBA0 +A820 +AFE0 +E820 +ENDCHAR +STARTCHAR U_46DC +ENCODING 18140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F200 +0FE0 +E820 +0C60 +EAA0 +0920 +EAA0 +AC60 +A820 +EFE0 +ENDCHAR +STARTCHAR U_46DD +ENCODING 18141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F240 +0240 +F7C0 +0240 +FFE0 +0100 +F520 +9520 +97E0 +F420 +ENDCHAR +STARTCHAR U_46DE +ENCODING 18142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F000 +07C0 +F100 +9FE0 +9100 +F100 +ENDCHAR +STARTCHAR U_46DF +ENCODING 18143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0540 +F540 +0BA0 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46E0 +ENCODING 18144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +0440 +F440 +07C0 +F000 +0440 +F240 +9280 +FFE0 +ENDCHAR +STARTCHAR U_46E1 +ENCODING 18145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2780 +F480 +07E0 +F480 +0660 +F420 +07E0 +F420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_46E2 +ENCODING 18146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2780 +F100 +0FE0 +F380 +0540 +F920 +0280 +F280 +94A0 +F860 +ENDCHAR +STARTCHAR U_46E3 +ENCODING 18147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +07C0 +F540 +0FE0 +F200 +07C0 +F040 +9240 +F180 +ENDCHAR +STARTCHAR U_46E4 +ENCODING 18148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F440 +0440 +F7C0 +0100 +F1E0 +0500 +F500 +9700 +F9E0 +ENDCHAR +STARTCHAR U_46E5 +ENCODING 18149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4300 +E480 +0200 +FFE0 +0500 +EFC0 +1540 +E540 +A540 +E100 +ENDCHAR +STARTCHAR U_46E6 +ENCODING 18150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +F440 +0900 +F180 +0240 +F420 +0BC0 +F240 +9240 +F3C0 +ENDCHAR +STARTCHAR U_46E7 +ENCODING 18151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4D40 +EB80 +0900 +EFC0 +0900 +EB80 +0B40 +ED40 +A900 +EFE0 +ENDCHAR +STARTCHAR U_46E8 +ENCODING 18152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F440 +0280 +FFE0 +0100 +F100 +07C0 +F100 +9100 +F100 +ENDCHAR +STARTCHAR U_46E9 +ENCODING 18153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +F280 +0EE0 +F820 +0820 +FEE0 +0280 +F280 +9280 +FFE0 +ENDCHAR +STARTCHAR U_46EA +ENCODING 18154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +0480 +FFE0 +0040 +F7C0 +0400 +F7C0 +9040 +F180 +ENDCHAR +STARTCHAR U_46EB +ENCODING 18155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +F7C0 +0400 +F7C0 +0400 +FFE0 +0500 +F540 +9480 +F660 +ENDCHAR +STARTCHAR U_46EC +ENCODING 18156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +F420 +0FA0 +F220 +1FE0 +E220 +0AA0 +EAA0 +AFA0 +E0C0 +ENDCHAR +STARTCHAR U_46ED +ENCODING 18157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +0FE0 +F440 +0280 +F7C0 +0100 +FFE0 +9100 +F100 +ENDCHAR +STARTCHAR U_46EE +ENCODING 18158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +FAA0 +0480 +F480 +0BE0 +F000 +07C0 +F440 +9440 +F7C0 +ENDCHAR +STARTCHAR U_46EF +ENCODING 18159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +E820 +0FE0 +E880 +0FE0 +E880 +0BE0 +EA20 +AA20 +F3E0 +ENDCHAR +STARTCHAR U_46F0 +ENCODING 18160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7E0 +0420 +F7E0 +0000 +F4A0 +07C0 +F480 +95A0 +F660 +ENDCHAR +STARTCHAR U_46F1 +ENCODING 18161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +0540 +F7C0 +0100 +F000 +0540 +FCA0 +9440 +F3C0 +ENDCHAR +STARTCHAR U_46F2 +ENCODING 18162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +E440 +07C0 +E440 +07C0 +E100 +0FE0 +E920 +A960 +E100 +ENDCHAR +STARTCHAR U_46F3 +ENCODING 18163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +E280 +0540 +EFE0 +1540 +E7C0 +0540 +E7C0 +A120 +E0E0 +ENDCHAR +STARTCHAR U_46F4 +ENCODING 18164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +E280 +0440 +EFE0 +0040 +E740 +0540 +E740 +A040 +E1C0 +ENDCHAR +STARTCHAR U_46F5 +ENCODING 18165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +EA40 +0580 +FFE0 +1020 +F7A0 +0480 +E300 +A280 +EC60 +ENDCHAR +STARTCHAR U_46F6 +ENCODING 18166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F7C0 +0100 +F7C0 +0100 +FFE0 +9380 +9540 +F920 +ENDCHAR +STARTCHAR U_46F7 +ENCODING 18167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +FFE0 +1420 +E6E0 +0AA0 +FAA0 +06C0 +E480 +A8A0 +F0E0 +ENDCHAR +STARTCHAR U_46F8 +ENCODING 18168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +0900 +E900 +09E0 +E900 +0BC0 +EA40 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_46F9 +ENCODING 18169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +E440 +0780 +E080 +1FE0 +E540 +1B80 +E5C0 +BAA0 +E580 +ENDCHAR +STARTCHAR U_46FA +ENCODING 18170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +EFE0 +0920 +EFE0 +0480 +E860 +1440 +E440 +A440 +E840 +ENDCHAR +STARTCHAR U_46FB +ENCODING 18171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4900 +EFE0 +0900 +EBC0 +0A40 +EBC0 +0A40 +EBC0 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_46FC +ENCODING 18172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4CE0 +E820 +0EE0 +E820 +0FE0 +E000 +07C0 +E100 +A100 +EFE0 +ENDCHAR +STARTCHAR U_46FD +ENCODING 18173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +E100 +0FE0 +E100 +0500 +E960 +0920 +ED60 +A920 +EFE0 +ENDCHAR +STARTCHAR U_46FE +ENCODING 18174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +E7C0 +0100 +EFE0 +0200 +E680 +0300 +EFE0 +A540 +E920 +ENDCHAR +STARTCHAR U_46FF +ENCODING 18175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +E7C0 +0440 +E7C0 +0000 +EFE0 +0AA0 +EFE0 +A920 +E920 +ENDCHAR +STARTCHAR U_4700 +ENCODING 18176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4AA0 +FBA0 +0EE0 +EAA0 +1760 +F100 +05C0 +F500 +9500 +FFE0 +ENDCHAR +STARTCHAR U_4701 +ENCODING 18177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45C0 +4480 +F7E0 +0480 +F7E0 +0480 +F7E0 +0080 +F7E0 +9140 +F620 +ENDCHAR +STARTCHAR U_4702 +ENCODING 18178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +07C0 +F440 +07C0 +F200 +0FE0 +F540 +9BA0 +F100 +ENDCHAR +STARTCHAR U_4703 +ENCODING 18179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9480 +F7E0 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4704 +ENCODING 18180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +F7E0 +06A0 +F5C0 +06A0 +F580 +05E0 +F680 +9BE0 +F880 +ENDCHAR +STARTCHAR U_4705 +ENCODING 18181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +FFE0 +0480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9480 +F7E0 +ENDCHAR +STARTCHAR U_4706 +ENCODING 18182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4000 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_4707 +ENCODING 18183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +0480 +FFE0 +0440 +F7C0 +0D20 +F4C0 +9440 +F620 +ENDCHAR +STARTCHAR U_4708 +ENCODING 18184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +FFE0 +0920 +FFE0 +0920 +FFE0 +0100 +FFE0 +9540 +F920 +ENDCHAR +STARTCHAR U_4709 +ENCODING 18185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F380 +0D60 +F100 +0380 +FD60 +0540 +F380 +9540 +F720 +ENDCHAR +STARTCHAR U_470A +ENCODING 18186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +0AA0 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_470B +ENCODING 18187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +07C0 +F100 +0FE0 +F440 +0540 +F540 +97C0 +FC60 +ENDCHAR +STARTCHAR U_470C +ENCODING 18188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E40 +5080 +FFE0 +2040 +5EA0 +F1E0 +0E00 +AAA0 +AEA0 +8B00 +ENDCHAR +STARTCHAR U_470D +ENCODING 18189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +0440 +F7C0 +0C60 +F7C0 +0440 +F7C0 +9540 +FB20 +ENDCHAR +STARTCHAR U_470E +ENCODING 18190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4AE0 +F740 +0240 +FDA0 +0FE0 +F920 +07C0 +F140 +9240 +F4C0 +ENDCHAR +STARTCHAR U_470F +ENCODING 18191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4FE0 +EA80 +0DE0 +EB40 +0AE0 +EAA0 +0CE0 +E8A0 +A8E0 +E8A0 +ENDCHAR +STARTCHAR U_4710 +ENCODING 18192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +6280 +57E0 +7AC0 +4240 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4711 +ENCODING 18193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EEE0 +0820 +EEE0 +0280 +EFE0 +0240 +ED20 +B440 +E7C0 +ENDCHAR +STARTCHAR U_4712 +ENCODING 18194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +ED60 +0BA0 +E920 +0FE0 +EBA0 +0D60 +FFE0 +A280 +EC60 +ENDCHAR +STARTCHAR U_4713 +ENCODING 18195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +F440 +0540 +FFE0 +0540 +F7E0 +0100 +FFE0 +9340 +FD20 +ENDCHAR +STARTCHAR U_4714 +ENCODING 18196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +4900 +E7E0 +1E80 +E9E0 +0920 +E9E0 +0920 +E9E0 +AA20 +F7E0 +ENDCHAR +STARTCHAR U_4715 +ENCODING 18197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +0FC0 +EA40 +0FC0 +EA40 +0FE0 +EAA0 +AFA0 +E860 +ENDCHAR +STARTCHAR U_4716 +ENCODING 18198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EFE0 +0AA0 +EFE0 +0440 +E5C0 +0740 +E440 +A7C0 +EC60 +ENDCHAR +STARTCHAR U_4717 +ENCODING 18199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80A0 +5FE0 +F080 +17A0 +F0A0 +17A0 +F540 +17C0 +F540 +BCA0 +F7C0 +ENDCHAR +STARTCHAR U_4718 +ENCODING 18200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +FB80 +0AE0 +EFA0 +11A0 +FFA0 +0B40 +EF40 +A1A0 +A5A0 +E2A0 +ENDCHAR +STARTCHAR U_4719 +ENCODING 18201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F840 +0FC0 +F840 +0FC0 +F480 +0FE0 +F440 +9AA0 +9FE0 +FAA0 +ENDCHAR +STARTCHAR U_471A +ENCODING 18202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +5AA0 +EFE0 +0100 +FBC0 +0D20 +E900 +0BC0 +ED20 +A900 +F7E0 +ENDCHAR +STARTCHAR U_471B +ENCODING 18203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4500 +F7C0 +0540 +F7C0 +02A0 +F7E0 +0560 +F7C0 +92A0 +FCE0 +ENDCHAR +STARTCHAR U_471C +ENCODING 18204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +0800 +EFE0 +0A40 +EDA0 +0A40 +EFE0 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_471D +ENCODING 18205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4A40 +EDA0 +0A40 +EDA0 +0FE0 +EA40 +0DA0 +EA40 +ADA0 +EFE0 +ENDCHAR +STARTCHAR U_471E +ENCODING 18206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +1D60 +F540 +1560 +FD40 +07C0 +F440 +97C0 +F840 +ENDCHAR +STARTCHAR U_471F +ENCODING 18207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +4EA0 +E480 +1FE0 +EA80 +1B80 +EAA0 +1BA0 +EA40 +BFC0 +E120 +ENDCHAR +STARTCHAR U_4720 +ENCODING 18208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +F880 +0FE0 +FAA0 +0AA0 +F7C0 +0440 +F540 +9540 +97C0 +FC60 +ENDCHAR +STARTCHAR U_4721 +ENCODING 18209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +07C0 +F440 +0FE0 +F920 +0460 +F3C0 +9640 +9980 +F660 +ENDCHAR +STARTCHAR U_4722 +ENCODING 18210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +07C0 +F100 +0FE0 +FAA0 +0FE0 +F100 +9540 +9C60 +F7C0 +ENDCHAR +STARTCHAR U_4723 +ENCODING 18211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +4700 +2400 +0400 +E7E0 +2480 +2480 +2480 +3C80 +2880 +1080 +ENDCHAR +STARTCHAR U_4724 +ENCODING 18212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +4480 +2480 +0FC0 +E480 +2480 +3FE0 +2000 +3480 +2440 +0840 +ENDCHAR +STARTCHAR U_4725 +ENCODING 18213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9DE0 +4520 +09E0 +DD20 +4520 +55E0 +4800 +69E0 +5400 +23E0 +ENDCHAR +STARTCHAR U_4726 +ENCODING 18214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +5FE0 +2480 +0FE0 +F020 +27A0 +24A0 +2FA0 +34A0 +27A0 +0040 +ENDCHAR +STARTCHAR U_4727 +ENCODING 18215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FE0 +4AA0 +1BA0 +CAA0 +5320 +4100 +45C0 +5500 +6500 +5FE0 +ENDCHAR +STARTCHAR U_4728 +ENCODING 18216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +87C0 +4540 +0FE0 +C920 +4FE0 +4100 +4A40 +4920 +7460 +57C0 +ENDCHAR +STARTCHAR U_4729 +ENCODING 18217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9FE0 +4480 +0F80 +38E0 +CF80 +4D80 +7FE0 +5000 +6D40 +52A0 +ENDCHAR +STARTCHAR U_472A +ENCODING 18218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5100 +4BC0 +A940 +2140 +5140 +8940 +7140 +5240 +5260 +7460 +ENDCHAR +STARTCHAR U_472B +ENCODING 18219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4800 +4FC0 +A900 +2100 +5100 +8900 +7100 +5100 +5100 +7FE0 +ENDCHAR +STARTCHAR U_472C +ENCODING 18220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +5080 +4BE0 +AAA0 +22A0 +52A0 +8BE0 +72A0 +52A0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_472D +ENCODING 18221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +FFE0 +8020 +7FC0 +2E80 +D160 +3F80 +E160 +2100 +3F00 +ENDCHAR +STARTCHAR U_472E +ENCODING 18222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +57E0 +4C20 +A880 +2280 +53E0 +8C80 +7080 +57E0 +5080 +7080 +ENDCHAR +STARTCHAR U_472F +ENCODING 18223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +53E0 +4C20 +AD60 +23A0 +57E0 +8920 +73A0 +5360 +5520 +7140 +ENDCHAR +STARTCHAR U_4730 +ENCODING 18224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5240 +4BC0 +AA40 +23C0 +5100 +8FE0 +7280 +5540 +5BA0 +7100 +ENDCHAR +STARTCHAR U_4731 +ENCODING 18225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +4A40 +4BC0 +A240 +2FE0 +5AA0 +8FE0 +7440 +5280 +5380 +7C60 +ENDCHAR +STARTCHAR U_4732 +ENCODING 18226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +4D40 +4AA0 +A7E0 +2520 +56A0 +8FE0 +7540 +57C0 +5540 +77A0 +ENDCHAR +STARTCHAR U_4733 +ENCODING 18227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0000 +3FC0 +2040 +3FC0 +1080 +0900 +FFE0 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_4734 +ENCODING 18228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +01C0 +7100 +5100 +57C0 +7440 +0240 +5280 +5100 +3280 +CC60 +ENDCHAR +STARTCHAR U_4735 +ENCODING 18229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +07E0 +74A0 +5480 +57E0 +7620 +0520 +5540 +5480 +3540 +CA20 +ENDCHAR +STARTCHAR U_4736 +ENCODING 18230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +03C0 +7640 +5180 +5240 +7CA0 +0080 +53C0 +5280 +3BC0 +C080 +ENDCHAR +STARTCHAR U_4737 +ENCODING 18231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0040 +77E0 +5040 +5FE0 +7820 +03C0 +5240 +5180 +3A40 +C420 +ENDCHAR +STARTCHAR U_4738 +ENCODING 18232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +0220 +73E0 +5200 +53C0 +7280 +03C0 +5280 +53E0 +3C80 +C460 +ENDCHAR +STARTCHAR U_4739 +ENCODING 18233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0FE0 +7100 +57C0 +5540 +7540 +07C0 +5100 +5380 +3540 +C920 +ENDCHAR +STARTCHAR U_473A +ENCODING 18234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +07E0 +7240 +5240 +5FE0 +7000 +03C0 +5240 +53C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_473B +ENCODING 18235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0240 +73C0 +5240 +53C0 +7000 +0FE0 +5100 +55C0 +3500 +CBE0 +ENDCHAR +STARTCHAR U_473C +ENCODING 18236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +29E0 +FD20 +36A0 +D840 +31A0 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_473D +ENCODING 18237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +0280 +E440 +ABA0 +BE20 +EAA0 +0EA0 +AAA0 +AEA0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_473E +ENCODING 18238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +07C0 +7280 +5280 +5FE0 +7000 +07C0 +5440 +57C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_473F +ENCODING 18239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +51E0 +7D00 +4580 +7E40 +5240 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4740 +ENCODING 18240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F4E0 +06A0 +F5A0 +9760 +F000 +97E0 +6520 +37E0 +C520 +07E0 +ENDCHAR +STARTCHAR U_4741 +ENCODING 18241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +8A20 +FFE0 +8020 +7FC0 +2080 +3F80 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4742 +ENCODING 18242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +B240 +CDE0 +B240 +9180 +9240 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4743 +ENCODING 18243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +04A0 +F520 +97E0 +9240 +F5A0 +97E0 +6240 +37E0 +CAA0 +0AA0 +ENDCHAR +STARTCHAR U_4744 +ENCODING 18244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +0D40 +F7E0 +9540 +F7E0 +0540 +97E0 +7240 +C180 +0E60 +ENDCHAR +STARTCHAR U_4745 +ENCODING 18245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +D080 +37E0 +D880 +1080 +3880 +D480 +1080 +67E0 +ENDCHAR +STARTCHAR U_4746 +ENCODING 18246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FC0 +4A40 +3240 +0480 +FFE0 +0880 +7700 +0B80 +7260 +0C00 +ENDCHAR +STARTCHAR U_4747 +ENCODING 18247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4FE0 +8900 +56A0 +51C0 +5680 +51C0 +56A0 +5280 +9120 +8FE0 +ENDCHAR +STARTCHAR U_4748 +ENCODING 18248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2400 +37E0 +DC00 +35C0 +D540 +3DC0 +D500 +1520 +68E0 +ENDCHAR +STARTCHAR U_4749 +ENCODING 18249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +8020 +7FC0 +0880 +7500 +0E00 +7500 +04C0 +1800 +ENDCHAR +STARTCHAR U_474A +ENCODING 18250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2140 +D7E0 +3140 +D7C0 +3100 +D5C0 +5700 +38E0 +ENDCHAR +STARTCHAR U_474B +ENCODING 18251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2420 +23C0 +D000 +3FE0 +D080 +3AC0 +D2A0 +54A0 +2180 +ENDCHAR +STARTCHAR U_474C +ENCODING 18252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAA0 +22A0 +2940 +D6A0 +33E0 +DAA0 +36A0 +D140 +52A0 +2CA0 +ENDCHAR +STARTCHAR U_474D +ENCODING 18253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +27C0 +2100 +DFC0 +3540 +D7C0 +3540 +DFE0 +5100 +2100 +ENDCHAR +STARTCHAR U_474E +ENCODING 18254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +23E0 +2000 +D7E0 +3900 +D3E0 +3AA0 +D6A0 +52A0 +2260 +ENDCHAR +STARTCHAR U_474F +ENCODING 18255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2540 +2FE0 +D540 +37C0 +D540 +3FE0 +D440 +5380 +2C60 +ENDCHAR +STARTCHAR U_4750 +ENCODING 18256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +4A80 +4AE0 +BD40 +6AE0 +AAA0 +7AE0 +AEA0 +28E0 +48A0 +ENDCHAR +STARTCHAR U_4751 +ENCODING 18257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +2280 +DFE0 +3540 +D7C0 +3540 +DFC0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_4752 +ENCODING 18258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +FAE0 +2EA0 +4A40 +BF40 +62A0 +AFE0 +7540 +A540 +2BA0 +4100 +ENDCHAR +STARTCHAR U_4753 +ENCODING 18259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +FD40 +22A0 +27E0 +DD20 +36A0 +D7E0 +3D40 +D7C0 +5560 +27A0 +ENDCHAR +STARTCHAR U_4754 +ENCODING 18260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4280 +4EE0 +BAA0 +6EE0 +A7C0 +6C80 +B7C0 +2480 +47E0 +ENDCHAR +STARTCHAR U_4755 +ENCODING 18261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAC0 +2340 +27E0 +D840 +37E0 +D2A0 +3BE0 +D2A0 +57E0 +20A0 +ENDCHAR +STARTCHAR U_4756 +ENCODING 18262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +2740 +DD40 +3540 +E540 +3540 +D540 +3540 +D540 +5520 +2920 +ENDCHAR +STARTCHAR U_4757 +ENCODING 18263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +6900 +D100 +27E0 +E100 +3380 +D380 +3540 +D920 +5100 +2100 +ENDCHAR +STARTCHAR U_4758 +ENCODING 18264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2240 +D240 +6240 +D420 +33C0 +D240 +3240 +D180 +1240 +2C20 +ENDCHAR +STARTCHAR U_4759 +ENCODING 18265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +27E0 +DC00 +5440 +E640 +3580 +D480 +3540 +D620 +5400 +27E0 +ENDCHAR +STARTCHAR U_475A +ENCODING 18266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +DC40 +57C0 +E500 +3520 +D5C0 +3500 +D520 +5920 +28E0 +ENDCHAR +STARTCHAR U_475B +ENCODING 18267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2080 +DFE0 +54A0 +E480 +37C0 +D540 +3540 +D480 +5940 +2A20 +ENDCHAR +STARTCHAR U_475C +ENCODING 18268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2240 +D7E0 +5240 +E420 +33C0 +D240 +3640 +D180 +5240 +2C20 +ENDCHAR +STARTCHAR U_475D +ENCODING 18269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27E0 +DA80 +5440 +EFE0 +3040 +D740 +3540 +D740 +5040 +20C0 +ENDCHAR +STARTCHAR U_475E +ENCODING 18270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +2100 +DFE0 +5540 +E780 +34E0 +D400 +35C0 +D540 +5940 +2A60 +ENDCHAR +STARTCHAR U_475F +ENCODING 18271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +27E0 +DAA0 +57A0 +E2A0 +3760 +D100 +37E0 +D180 +5240 +2C20 +ENDCHAR +STARTCHAR U_4760 +ENCODING 18272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5C80 +D5E0 +2520 +E5E0 +3520 +D5E0 +3480 +D6A0 +14A0 +6980 +ENDCHAR +STARTCHAR U_4761 +ENCODING 18273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +6FE0 +D240 +23C0 +E100 +37E0 +D520 +3760 +D5A0 +1760 +6420 +ENDCHAR +STARTCHAR U_4762 +ENCODING 18274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +EC40 +57C0 +2440 +DFE0 +2AA0 +DFE0 +2800 +CFE0 +3240 +2FE0 +ENDCHAR +STARTCHAR U_4763 +ENCODING 18275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +6980 +D6E0 +21A0 +E6E0 +3280 +D7E0 +3180 +D2C0 +1CA0 +3080 +ENDCHAR +STARTCHAR U_4764 +ENCODING 18276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +6FE0 +9540 +6AA0 +C440 +2FE0 +D540 +37C0 +D100 +1540 +6B20 +ENDCHAR +STARTCHAR U_4765 +ENCODING 18277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +B4A0 +67E0 +C080 +26A0 +D080 +36A0 +D080 +17E0 +6080 +ENDCHAR +STARTCHAR U_4766 +ENCODING 18278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +6AA0 +9FE0 +6000 +C1E0 +2F00 +D100 +3540 +D540 +1BA0 +6120 +ENDCHAR +STARTCHAR U_4767 +ENCODING 18279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +F420 +9820 +F7A0 +9020 +F1A0 +4620 +9020 +90C0 +ENDCHAR +STARTCHAR U_4768 +ENCODING 18280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +9240 +9180 +9260 +3F80 +2480 +3280 +2980 +2480 +3F80 +60C0 +ENDCHAR +STARTCHAR U_4769 +ENCODING 18281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +F440 +9920 +F280 +9500 +F240 +4480 +9100 +9600 +ENDCHAR +STARTCHAR U_476A +ENCODING 18282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +F140 +9100 +9500 +F5E0 +9500 +F500 +4500 +9700 +98E0 +ENDCHAR +STARTCHAR U_476B +ENCODING 18283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +F7E0 +9500 +99E0 +F100 +9100 +F1E0 +4100 +9100 +9100 +ENDCHAR +STARTCHAR U_476C +ENCODING 18284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F100 +9100 +F100 +97C0 +F100 +4100 +9100 +9FE0 +ENDCHAR +STARTCHAR U_476D +ENCODING 18285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F820 +97A0 +F4A0 +94A0 +F7A0 +4020 +9020 +90C0 +ENDCHAR +STARTCHAR U_476E +ENCODING 18286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F100 +9200 +F440 +9780 +F200 +4440 +9FE0 +9420 +ENDCHAR +STARTCHAR U_476F +ENCODING 18287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F800 +9500 +FFE0 +9520 +F540 +4500 +9420 +93E0 +ENDCHAR +STARTCHAR U_4770 +ENCODING 18288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +F100 +97C0 +F080 +9FE0 +F480 +2280 +5080 +9180 +ENDCHAR +STARTCHAR U_4771 +ENCODING 18289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +2480 +FFE0 +2920 +DFE0 +2080 +3F80 +2080 +3F80 +4040 +ENDCHAR +STARTCHAR U_4772 +ENCODING 18290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +F7C0 +9480 +9440 +F520 +94A0 +F400 +4900 +9080 +9080 +ENDCHAR +STARTCHAR U_4773 +ENCODING 18291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +5120 +7D40 +A480 +1140 +FFA0 +1080 +1F80 +1080 +1F80 +2040 +ENDCHAR +STARTCHAR U_4774 +ENCODING 18292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +0400 +FFE0 +9120 +1F00 +1100 +1F00 +60C0 +ENDCHAR +STARTCHAR U_4775 +ENCODING 18293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F120 +97E0 +F100 +97E0 +F520 +97E0 +F520 +47E0 +9520 +9560 +ENDCHAR +STARTCHAR U_4776 +ENCODING 18294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F000 +97C0 +F440 +97C0 +F100 +4540 +9920 +9300 +ENDCHAR +STARTCHAR U_4777 +ENCODING 18295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +9120 +FFE0 +2420 +5F80 +1080 +1F80 +1080 +1F80 +2040 +ENDCHAR +STARTCHAR U_4778 +ENCODING 18296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +F100 +9FE0 +F100 +97C0 +F440 +4280 +9100 +9EE0 +ENDCHAR +STARTCHAR U_4779 +ENCODING 18297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +E820 +A400 +AEE0 +EAA0 +AAA0 +F6E0 +0280 +A4A0 +A8E0 +ENDCHAR +STARTCHAR U_477A +ENCODING 18298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4A40 +3180 +DF60 +1100 +1F00 +1100 +1F00 +1100 +2080 +ENDCHAR +STARTCHAR U_477B +ENCODING 18299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +F7E0 +9480 +F7E0 +9480 +F7E0 +4A20 +9A20 +93E0 +ENDCHAR +STARTCHAR U_477C +ENCODING 18300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +F7C0 +9100 +FFE0 +9440 +F7C0 +4440 +97C0 +9440 +ENDCHAR +STARTCHAR U_477D +ENCODING 18301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +F5E0 +9480 +9480 +F7E0 +9480 +F5E0 +4880 +9880 +97E0 +ENDCHAR +STARTCHAR U_477E +ENCODING 18302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0240 +FFE0 +5100 +5CA0 +F760 +1100 +1F00 +1100 +1F00 +6080 +ENDCHAR +STARTCHAR U_477F +ENCODING 18303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +35C0 +4440 +75C0 +4440 +75C0 +1B00 +F1E0 +1F00 +1100 +1F80 +6040 +ENDCHAR +STARTCHAR U_4780 +ENCODING 18304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F440 +9FE0 +F480 +9500 +F7E0 +9480 +F7E0 +4480 +9540 +9620 +ENDCHAR +STARTCHAR U_4781 +ENCODING 18305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F5C0 +9540 +95C0 +F540 +97E0 +F540 +45C0 +9520 +97E0 +ENDCHAR +STARTCHAR U_4782 +ENCODING 18306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A200 +EFE0 +AAA0 +AAA0 +EAA0 +A100 +EFE0 +4280 +A440 +A820 +ENDCHAR +STARTCHAR U_4783 +ENCODING 18307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FF80 +A4E0 +EAA0 +BFA0 +E4A0 +BF40 +E440 +4740 +BCA0 +A120 +ENDCHAR +STARTCHAR U_4784 +ENCODING 18308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +4280 +7FE0 +4AA0 +BFC0 +2080 +3F80 +2080 +3F80 +C040 +ENDCHAR +STARTCHAR U_4785 +ENCODING 18309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +97E0 +F540 +95A0 +F800 +47C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4786 +ENCODING 18310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +F100 +97C0 +9440 +F7C0 +9440 +F7C0 +4440 +57C0 +9820 +ENDCHAR +STARTCHAR U_4787 +ENCODING 18311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1140 +FF40 +55C0 +BF60 +1100 +1F00 +1100 +1F00 +60C0 +ENDCHAR +STARTCHAR U_4788 +ENCODING 18312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9540 +F7C0 +9480 +97C0 +F440 +97E0 +F420 +0560 +AAA0 +9060 +ENDCHAR +STARTCHAR U_4789 +ENCODING 18313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +F100 +9FE0 +9440 +FFE0 +9440 +F7C0 +4440 +57C0 +9820 +ENDCHAR +STARTCHAR U_478A +ENCODING 18314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +A100 +EFE0 +A940 +AFE0 +EA80 +AFE0 +EA40 +6BC0 +9240 +93C0 +ENDCHAR +STARTCHAR U_478B +ENCODING 18315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BFA0 +AAE0 +EAA0 +BFA0 +E4E0 +BFA0 +E4A0 +4EE0 +B4A0 +A520 +ENDCHAR +STARTCHAR U_478C +ENCODING 18316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8B80 +A880 +A880 +AFE0 +A880 +A880 +23E0 +5220 +4A20 +83E0 +ENDCHAR +STARTCHAR U_478D +ENCODING 18317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +ABC0 +A900 +AFE0 +A440 +27C0 +5440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_478E +ENCODING 18318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +ABC0 +AA40 +ABC0 +A800 +A7E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_478F +ENCODING 18319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +AAA0 +ABE0 +AAA0 +ABE0 +A840 +A2A0 +2680 +5A20 +89E0 +ENDCHAR +STARTCHAR U_4790 +ENCODING 18320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +8900 +AFE0 +A900 +AFE0 +AA40 +AF60 +22C0 +5240 +83C0 +ENDCHAR +STARTCHAR U_4791 +ENCODING 18321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FE80 +2880 +6C80 +AA80 +2880 +4880 +9BE0 +ENDCHAR +STARTCHAR U_4792 +ENCODING 18322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7BE0 +1220 +FFA0 +2AA0 +6AA0 +AFA0 +2A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_4793 +ENCODING 18323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +10A0 +7D40 +1140 +FEA0 +2800 +6DE0 +AA80 +2880 +4880 +9BE0 +ENDCHAR +STARTCHAR U_4794 +ENCODING 18324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7BE0 +1200 +FFE0 +2A80 +6BE0 +AE80 +2BE0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_4795 +ENCODING 18325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7FE0 +12A0 +FDC0 +2AA0 +6BE0 +AC80 +2BE0 +4AA0 +9AA0 +ENDCHAR +STARTCHAR U_4796 +ENCODING 18326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +17E0 +FD00 +1100 +5C80 +50A0 +5060 +B020 +8FE0 +ENDCHAR +STARTCHAR U_4797 +ENCODING 18327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1040 +7BE0 +10C0 +FCC0 +1140 +5940 +5240 +5540 +7080 +8FE0 +ENDCHAR +STARTCHAR U_4798 +ENCODING 18328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7C00 +13E0 +FC40 +1080 +5D00 +5220 +51E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_4799 +ENCODING 18329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7BE0 +12A0 +FEA0 +12A0 +5EA0 +52E0 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_479A +ENCODING 18330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1080 +FC80 +13E0 +5D40 +5080 +5140 +B220 +8FE0 +ENDCHAR +STARTCHAR U_479B +ENCODING 18331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7EE0 +12A0 +FEA0 +13E0 +5C20 +5020 +50A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_479C +ENCODING 18332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7C80 +1180 +FD40 +12A0 +5CA0 +5080 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_479D +ENCODING 18333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FFE0 +1080 +5CC0 +50A0 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_479E +ENCODING 18334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +17E0 +7AA0 +17E0 +FA80 +17E0 +5AA0 +52A0 +52C0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_479F +ENCODING 18335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1100 +7BE0 +1220 +FE20 +13E0 +5E20 +5220 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A0 +ENCODING 18336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FD00 +13E0 +5D20 +5120 +51E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A1 +ENCODING 18337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +13C0 +FE40 +1240 +5BC0 +5000 +57E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A2 +ENCODING 18338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7BE0 +1500 +FDE0 +1100 +5DE0 +5100 +5100 +B100 +8FE0 +ENDCHAR +STARTCHAR U_47A3 +ENCODING 18339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1380 +7E00 +13E0 +FE40 +12C0 +5E60 +5240 +5440 +B840 +8FE0 +ENDCHAR +STARTCHAR U_47A4 +ENCODING 18340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7C20 +13A0 +FEA0 +12A0 +5BA0 +5020 +50A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_47A5 +ENCODING 18341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1100 +FBE0 +1520 +5DE0 +5120 +51E0 +B120 +8FE0 +ENDCHAR +STARTCHAR U_47A6 +ENCODING 18342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13E0 +7D40 +1080 +FD40 +1220 +5DC0 +5140 +51C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A7 +ENCODING 18343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +10E0 +7F00 +1200 +FFE0 +1200 +5FE0 +5320 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47A8 +ENCODING 18344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7DE0 +1080 +FFE0 +1080 +5DE0 +5080 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A9 +ENCODING 18345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1180 +7A40 +1420 +FBC0 +1000 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AA +ENCODING 18346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1400 +7DE0 +1500 +FDE0 +1540 +5D40 +5640 +57E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AB +ENCODING 18347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1140 +7FE0 +1140 +FFC0 +1200 +57C0 +5A40 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AC +ENCODING 18348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1380 +7C80 +13E0 +FDC0 +12A0 +5BE0 +5140 +5160 +B220 +8FE0 +ENDCHAR +STARTCHAR U_47AD +ENCODING 18349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1240 +7FE0 +1240 +FE20 +13C0 +5A40 +5580 +5180 +B240 +8FE0 +ENDCHAR +STARTCHAR U_47AE +ENCODING 18350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7A20 +17E0 +FC80 +13E0 +5C80 +52C0 +54A0 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47AF +ENCODING 18351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1320 +7AA0 +1140 +FDE0 +1040 +5C80 +53E0 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47B0 +ENCODING 18352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +FFE0 +1280 +56C0 +5AA0 +5480 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B1 +ENCODING 18353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1240 +7C20 +1180 +FE40 +1420 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B2 +ENCODING 18354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +16A0 +7A80 +17E0 +FA80 +13A0 +5EA0 +5240 +52C0 +B520 +8FE0 +ENDCHAR +STARTCHAR U_47B3 +ENCODING 18355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +7A40 +1180 +FFE0 +5000 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B4 +ENCODING 18356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7BE0 +12A0 +FFE0 +1220 +5BA0 +52A0 +53A0 +B440 +8FE0 +ENDCHAR +STARTCHAR U_47B5 +ENCODING 18357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7EA0 +1140 +FEA0 +1000 +5FE0 +52A0 +5140 +B2A0 +8FE0 +ENDCHAR +STARTCHAR U_47B6 +ENCODING 18358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +12C0 +7B40 +13C0 +FE00 +13E0 +5560 +5AA0 +5520 +B240 +8FE0 +ENDCHAR +STARTCHAR U_47B7 +ENCODING 18359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7FE0 +1280 +FEA0 +13E0 +5E80 +52A0 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47B8 +ENCODING 18360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1000 +7BE0 +1080 +FAA0 +1480 +5BE0 +5220 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B9 +ENCODING 18361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +11C0 +7D40 +1140 +FFE0 +1080 +5DC0 +5080 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47BA +ENCODING 18362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1480 +7FE0 +1480 +FDE0 +15A0 +5D60 +55A0 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47BB +ENCODING 18363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1140 +7FE0 +12A0 +FFE0 +12A0 +5EA0 +53E0 +5120 +B220 +8FE0 +ENDCHAR +STARTCHAR U_47BC +ENCODING 18364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1140 +7B80 +1080 +FFE0 +1220 +5D40 +52C0 +55A0 +B280 +8FE0 +ENDCHAR +STARTCHAR U_47BD +ENCODING 18365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +13E0 +7C80 +17E0 +FAA0 +1140 +5FE0 +5080 +52A0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_47BE +ENCODING 18366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1780 +7CE0 +1480 +FFE0 +14A0 +5FC0 +5480 +5560 +BA40 +8FE0 +ENDCHAR +STARTCHAR U_47BF +ENCODING 18367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +2480 +DF60 +1480 +1D00 +67E0 +ENDCHAR +STARTCHAR U_47C0 +ENCODING 18368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7880 +17E0 +F900 +17E0 +5280 +5C80 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47C1 +ENCODING 18369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +1540 +7AA0 +13E0 +FEA0 +13E0 +5AA0 +57E0 +51C0 +B2A0 +8FE0 +ENDCHAR +STARTCHAR U_47C2 +ENCODING 18370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7FC0 +1240 +FFE0 +5520 +5FE0 +5240 +5180 +B660 +8FE0 +ENDCHAR +STARTCHAR U_47C3 +ENCODING 18371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +13E0 +7D20 +17E0 +F880 +17E0 +5940 +56A0 +5140 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47C4 +ENCODING 18372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +7900 +17E0 +FB40 +12C0 +5B40 +52C0 +53C0 +B420 +8FE0 +ENDCHAR +STARTCHAR U_47C5 +ENCODING 18373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +7DE0 +5540 +FE40 +1440 +3F80 +0400 +7FC0 +1400 +EFE0 +ENDCHAR +STARTCHAR U_47C6 +ENCODING 18374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7FE0 +12A0 +FFE0 +12A0 +5FE0 +52A0 +57E0 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47C7 +ENCODING 18375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +15C0 +7AA0 +17E0 +FAA0 +17E0 +5A80 +52A0 +5540 +B8A0 +87E0 +ENDCHAR +STARTCHAR U_47C8 +ENCODING 18376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12C0 +17A0 +7A80 +17E0 +FD80 +17A0 +5AA0 +5740 +5240 +B4A0 +8FE0 +ENDCHAR +STARTCHAR U_47C9 +ENCODING 18377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +12A0 +7FE0 +1200 +FFE0 +1520 +5BA0 +5120 +53A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_47CA +ENCODING 18378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1080 +7FE0 +12A0 +FFC0 +12A0 +5FE0 +5340 +55C0 +BAA0 +87E0 +ENDCHAR +STARTCHAR U_47CB +ENCODING 18379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +7FE0 +1540 +FFE0 +1400 +5DC0 +5400 +57E0 +B940 +8FE0 +ENDCHAR +STARTCHAR U_47CC +ENCODING 18380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7A40 +17E0 +FD40 +17C0 +5D60 +57C0 +5540 +B5A0 +8FE0 +ENDCHAR +STARTCHAR U_47CD +ENCODING 18381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +7A40 +17E0 +FAA0 +1540 +5FE0 +5100 +53C0 +B440 +8FE0 +ENDCHAR +STARTCHAR U_47CE +ENCODING 18382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7A40 +17E0 +FD20 +13C0 +5B40 +52C0 +53C0 +B420 +8FE0 +ENDCHAR +STARTCHAR U_47CF +ENCODING 18383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +FEE0 +27C0 +FAA0 +2FE0 +B900 +A7E0 +E380 +B540 +8FE0 +ENDCHAR +STARTCHAR U_47D0 +ENCODING 18384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +F7E0 +2540 +F760 +2440 +2560 +B540 +ABE0 +F000 +8FE0 +ENDCHAR +STARTCHAR U_47D1 +ENCODING 18385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +F540 +27C0 +2540 +B7C0 +A540 +E000 +9FE0 +ENDCHAR +STARTCHAR U_47D2 +ENCODING 18386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEE0 +2280 +F5E0 +2C80 +25E0 +B480 +A5E0 +E000 +9FE0 +ENDCHAR +STARTCHAR U_47D3 +ENCODING 18387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8880 +F880 +2080 +2080 +B880 +A080 +A080 +B880 +C380 +ENDCHAR +STARTCHAR U_47D4 +ENCODING 18388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FA00 +8A00 +8A00 +FA00 +2300 +2280 +BA40 +A240 +A200 +BA00 +C200 +ENDCHAR +STARTCHAR U_47D5 +ENCODING 18389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +8FE0 +8A20 +FD20 +2440 +2280 +BA80 +A100 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_47D6 +ENCODING 18390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8900 +FD20 +2520 +2520 +BD20 +A520 +A520 +BFE0 +C420 +ENDCHAR +STARTCHAR U_47D7 +ENCODING 18391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9780 +9480 +F480 +27E0 +2480 +B480 +A480 +A4A0 +B660 +C420 +ENDCHAR +STARTCHAR U_47D8 +ENCODING 18392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8900 +8FE0 +F800 +2380 +2280 +BAA0 +A2A0 +A2A0 +BAA0 +C460 +ENDCHAR +STARTCHAR U_47D9 +ENCODING 18393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F5E0 +94A0 +9EA0 +F4A0 +24A0 +B4A0 +A4A0 +A6A0 +B520 +C260 +ENDCHAR +STARTCHAR U_47DA +ENCODING 18394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8800 +8800 +FFE0 +2240 +2240 +BA40 +A240 +A240 +BA40 +C440 +ENDCHAR +STARTCHAR U_47DB +ENCODING 18395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +FFE0 +2920 +B920 +A920 +A920 +B940 +C100 +ENDCHAR +STARTCHAR U_47DC +ENCODING 18396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8FE0 +FD20 +2520 +2520 +BEA0 +A460 +A420 +BC20 +C460 +ENDCHAR +STARTCHAR U_47DD +ENCODING 18397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F240 +9240 +9240 +F460 +2BC0 +B240 +A180 +A180 +B240 +C420 +ENDCHAR +STARTCHAR U_47DE +ENCODING 18398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8900 +F940 +2520 +2520 +B900 +A120 +A040 +B980 +C600 +ENDCHAR +STARTCHAR U_47DF +ENCODING 18399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +6220 +4220 +7A20 +53E0 +5080 +5080 +5AE0 +5280 +5780 +9860 +ENDCHAR +STARTCHAR U_47E0 +ENCODING 18400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +88A0 +8880 +FFE0 +2480 +24A0 +BCC0 +A480 +A4A0 +BD60 +C620 +ENDCHAR +STARTCHAR U_47E1 +ENCODING 18401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +9480 +F480 +27E0 +2480 +B480 +A4A0 +A560 +B6A0 +C4A0 +ENDCHAR +STARTCHAR U_47E2 +ENCODING 18402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +93E0 +F500 +2100 +2540 +B540 +A920 +A120 +B100 +C300 +ENDCHAR +STARTCHAR U_47E3 +ENCODING 18403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8900 +8FE0 +F900 +2180 +2380 +BB40 +A540 +A520 +B920 +C100 +ENDCHAR +STARTCHAR U_47E4 +ENCODING 18404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +88A0 +8A20 +FA40 +2240 +2680 +BB20 +A220 +A600 +BA20 +C1C0 +ENDCHAR +STARTCHAR U_47E5 +ENCODING 18405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +8880 +8A80 +F900 +27E0 +2120 +BB40 +A300 +A500 +B900 +C300 +ENDCHAR +STARTCHAR U_47E6 +ENCODING 18406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +9100 +9FE0 +F100 +2100 +B3E0 +A2A0 +A2A0 +B440 +C9A0 +ENDCHAR +STARTCHAR U_47E7 +ENCODING 18407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +9520 +F520 +2520 +27E0 +B520 +A520 +A520 +B7E0 +C420 +ENDCHAR +STARTCHAR U_47E8 +ENCODING 18408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +F7E0 +2480 +27E0 +B480 +A4A0 +A4A0 +B660 +C420 +ENDCHAR +STARTCHAR U_47E9 +ENCODING 18409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8FC0 +F900 +2100 +27E0 +B900 +A200 +A440 +BFA0 +C420 +ENDCHAR +STARTCHAR U_47EA +ENCODING 18410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +8F00 +8900 +F880 +27E0 +2040 +B880 +A100 +A200 +B600 +C9E0 +ENDCHAR +STARTCHAR U_47EB +ENCODING 18411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +8020 +3F80 +2080 +3F80 +0400 +27C0 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_47EC +ENCODING 18412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +91C0 +9600 +F400 +27C0 +2480 +B480 +A480 +A480 +B480 +CFE0 +ENDCHAR +STARTCHAR U_47ED +ENCODING 18413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +8BE0 +FD00 +2100 +21E0 +B900 +A100 +A1E0 +B900 +C100 +ENDCHAR +STARTCHAR U_47EE +ENCODING 18414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F2C0 +92A0 +9480 +F7E0 +2C80 +B480 +A540 +A540 +B640 +C620 +ENDCHAR +STARTCHAR U_47EF +ENCODING 18415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +8F00 +8900 +F900 +27E0 +2100 +B900 +A7C0 +A440 +BC40 +C7C0 +ENDCHAR +STARTCHAR U_47F0 +ENCODING 18416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +92E0 +9500 +F200 +27E0 +2A40 +B240 +A240 +A240 +B240 +C2C0 +ENDCHAR +STARTCHAR U_47F1 +ENCODING 18417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9100 +F7E0 +2520 +2560 +B100 +A380 +A540 +B920 +C100 +ENDCHAR +STARTCHAR U_47F2 +ENCODING 18418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +9100 +F240 +27E0 +22A0 +B280 +A280 +A2A0 +B2A0 +C4E0 +ENDCHAR +STARTCHAR U_47F3 +ENCODING 18419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4DA0 +7B60 +1360 +5DA0 +5120 +55A0 +7240 +9000 +8FE0 +ENDCHAR +STARTCHAR U_47F4 +ENCODING 18420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +27E0 +2540 +B560 +A540 +A540 +B5A0 +C520 +ENDCHAR +STARTCHAR U_47F5 +ENCODING 18421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9120 +9FE0 +F100 +2920 +2540 +B380 +A540 +A920 +B100 +C300 +ENDCHAR +STARTCHAR U_47F6 +ENCODING 18422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9540 +9540 +F540 +2BA0 +2100 +B7C0 +A100 +A100 +B900 +C7E0 +ENDCHAR +STARTCHAR U_47F7 +ENCODING 18423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +9580 +9F00 +F5E0 +2540 +2740 +B540 +AD40 +A540 +B640 +CA40 +ENDCHAR +STARTCHAR U_47F8 +ENCODING 18424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93E0 +9540 +FA80 +2300 +2C80 +B280 +A7E0 +A280 +B280 +C480 +ENDCHAR +STARTCHAR U_47F9 +ENCODING 18425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +9020 +F540 +2280 +27E0 +B080 +A480 +A280 +B080 +C180 +ENDCHAR +STARTCHAR U_47FA +ENCODING 18426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +8BE0 +FA20 +23E0 +2220 +BBE0 +A000 +A140 +B940 +C220 +ENDCHAR +STARTCHAR U_47FB +ENCODING 18427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +FBA0 +2100 +27C0 +B100 +A540 +A920 +B100 +C300 +ENDCHAR +STARTCHAR U_47FC +ENCODING 18428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +9760 +9040 +F7E0 +2040 +2140 +B5C0 +A540 +A540 +B5E0 +CE20 +ENDCHAR +STARTCHAR U_47FD +ENCODING 18429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F200 +2440 +2FE0 +B560 +A540 +A540 +B540 +C960 +ENDCHAR +STARTCHAR U_47FE +ENCODING 18430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9120 +95A0 +F240 +25A0 +2000 +B7E0 +A120 +A5A0 +B240 +C5A0 +ENDCHAR +STARTCHAR U_47FF +ENCODING 18431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +F040 +2FE0 +2100 +B540 +A380 +A540 +B120 +C600 +ENDCHAR +STARTCHAR U_4800 +ENCODING 18432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +9380 +9100 +FFE0 +2820 +3BA0 +AAA0 +ABA0 +B820 +C860 +ENDCHAR +STARTCHAR U_4801 +ENCODING 18433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +F240 +97E0 +9240 +F5A0 +2FE0 +3800 +A7C0 +A000 +B000 +CFE0 +ENDCHAR +STARTCHAR U_4802 +ENCODING 18434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +A480 +1F00 +1100 +5F00 +4400 +6700 +9FE0 +ENDCHAR +STARTCHAR U_4803 +ENCODING 18435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9FE0 +F920 +2DA0 +2B60 +BB60 +ADA0 +B920 +C960 +ENDCHAR +STARTCHAR U_4804 +ENCODING 18436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97C0 +9540 +F7C0 +2540 +3FE0 +A000 +A480 +F440 +8840 +ENDCHAR +STARTCHAR U_4805 +ENCODING 18437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +94A0 +9720 +F520 +27E0 +A520 +BDA0 +A760 +A520 +FD20 +87E0 +ENDCHAR +STARTCHAR U_4806 +ENCODING 18438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +97C0 +F400 +2FE0 +A500 +BD20 +A540 +AC80 +F440 +0620 +ENDCHAR +STARTCHAR U_4807 +ENCODING 18439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F480 +26A0 +A6A0 +B7E0 +A480 +A6A0 +FAA0 +8BE0 +ENDCHAR +STARTCHAR U_4808 +ENCODING 18440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9140 +FFE0 +2140 +A7C0 +B920 +A540 +AB80 +B540 +C920 +ENDCHAR +STARTCHAR U_4809 +ENCODING 18441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +F7E0 +9820 +97C0 +F440 +27C0 +3400 +A7C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_480A +ENCODING 18442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +F280 +2EE0 +B280 +A280 +AEE0 +F280 +8480 +ENDCHAR +STARTCHAR U_480B +ENCODING 18443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +97C0 +F540 +27C0 +B200 +A500 +AFE0 +B100 +C100 +ENDCHAR +STARTCHAR U_480C +ENCODING 18444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9380 +9540 +FB20 +27C0 +2440 +B7C0 +A440 +A7C0 +BC40 +C4C0 +ENDCHAR +STARTCHAR U_480D +ENCODING 18445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9520 +9520 +F7E0 +2400 +27E0 +B4A0 +A740 +A440 +F7A0 +8520 +ENDCHAR +STARTCHAR U_480E +ENCODING 18446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F400 +27E0 +2540 +B7E0 +A480 +A5C0 +F480 +8BE0 +ENDCHAR +STARTCHAR U_480F +ENCODING 18447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +92C0 +96A0 +92C0 +F440 +2BA0 +B100 +AFE0 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_4810 +ENCODING 18448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +27C0 +2440 +B7C0 +A120 +A7E0 +B280 +E440 +ENDCHAR +STARTCHAR U_4811 +ENCODING 18449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A540 +EFE0 +2100 +2FE0 +B100 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_4812 +ENCODING 18450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A4E0 +A4A0 +FFA0 +24E0 +2EA0 +BAA0 +AAE0 +AEA0 +B0A0 +C120 +ENDCHAR +STARTCHAR U_4813 +ENCODING 18451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9280 +FFE0 +2AA0 +2EE0 +B820 +ABA0 +B820 +CFE0 +ENDCHAR +STARTCHAR U_4814 +ENCODING 18452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9FE0 +F100 +2320 +25C0 +B280 +A580 +A2C0 +B4A0 +CB20 +ENDCHAR +STARTCHAR U_4815 +ENCODING 18453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +E240 +AB60 +AA40 +EF60 +2100 +B7C0 +A100 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_4816 +ENCODING 18454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EBE0 +A220 +E480 +2880 +2B60 +B000 +A7E0 +A420 +B420 +C7E0 +ENDCHAR +STARTCHAR U_4817 +ENCODING 18455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +96C0 +F540 +27C0 +B120 +AFE0 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_4818 +ENCODING 18456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9660 +95A0 +F5A0 +2660 +B7E0 +A480 +A6E0 +B480 +C6E0 +ENDCHAR +STARTCHAR U_4819 +ENCODING 18457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +EFE0 +2920 +B7C0 +A200 +A3C0 +BA40 +C440 +ENDCHAR +STARTCHAR U_481A +ENCODING 18458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A280 +EC60 +2380 +B540 +A540 +A540 +B520 +CBA0 +ENDCHAR +STARTCHAR U_481B +ENCODING 18459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0200 +E7C0 +AA80 +A100 +EA00 +27C0 +B900 +A7C0 +A100 +B540 +C7C0 +ENDCHAR +STARTCHAR U_481C +ENCODING 18460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FEE0 +9440 +9FE0 +F240 +23C0 +B240 +A3C0 +A240 +B7E0 +C040 +ENDCHAR +STARTCHAR U_481D +ENCODING 18461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +97E0 +F420 +27E0 +2420 +B7E0 +A420 +A7E0 +B240 +C420 +ENDCHAR +STARTCHAR U_481E +ENCODING 18462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +E080 +AFE0 +AA80 +EB80 +2AA0 +BFA0 +AA40 +AF40 +BA40 +D0A0 +ENDCHAR +STARTCHAR U_481F +ENCODING 18463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +23C0 +F940 +5340 +F9C0 +2260 +7F80 +2080 +3F80 +4900 +BFE0 +ENDCHAR +STARTCHAR U_4820 +ENCODING 18464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +4A40 +FFE0 +8420 +3F80 +3580 +2A80 +3FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_4821 +ENCODING 18465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +E080 +AFE0 +A900 +EBC0 +29C0 +B800 +ABC0 +AAC0 +BB40 +D7E0 +ENDCHAR +STARTCHAR U_4822 +ENCODING 18466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +5140 +7FC0 +0000 +FFE0 +8020 +3F80 +2080 +3FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_4823 +ENCODING 18467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E880 +2EE0 +2280 +BFE0 +A280 +AFE0 +B240 +C420 +ENDCHAR +STARTCHAR U_4824 +ENCODING 18468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E000 +27C0 +26C0 +B540 +A7C0 +A100 +BFE0 +C100 +ENDCHAR +STARTCHAR U_4825 +ENCODING 18469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +B540 +AE80 +E4E0 +5F20 +55A0 +F5A0 +DF40 +D540 +F540 +95A0 +ENDCHAR +STARTCHAR U_4826 +ENCODING 18470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B2A0 +AFA0 +E2E0 +2500 +B7C0 +A440 +A7C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_4827 +ENCODING 18471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F480 +25C0 +24A0 +B7E0 +A520 +A7E0 +B520 +C9E0 +ENDCHAR +STARTCHAR U_4828 +ENCODING 18472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E3C0 +A480 +AFE0 +E540 +27E0 +2400 +B5E0 +A400 +A5E0 +B520 +C9E0 +ENDCHAR +STARTCHAR U_4829 +ENCODING 18473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A080 +EFE0 +2880 +2FA0 +BAA0 +AE40 +AB40 +AA40 +D4A0 +ENDCHAR +STARTCHAR U_482A +ENCODING 18474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EA40 +ADA0 +AA40 +EDA0 +2FE0 +BA40 +ADA0 +AA40 +BDA0 +CFE0 +ENDCHAR +STARTCHAR U_482B +ENCODING 18475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF00 +A5E0 +A7A0 +E540 +2740 +2DA0 +B000 +AFE0 +A520 +A940 +D5A0 +ENDCHAR +STARTCHAR U_482C +ENCODING 18476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DD60 +AAA0 +BBA0 +EAC0 +31A0 +2EA0 +B0A0 +AEA0 +AAC0 +B580 +CE80 +ENDCHAR +STARTCHAR U_482D +ENCODING 18477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +AF20 +A4E0 +EEA0 +2AE0 +2EA0 +B4E0 +AEA0 +B5E0 +A4A0 +C520 +ENDCHAR +STARTCHAR U_482E +ENCODING 18478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +A200 +EFE0 +2480 +AFE0 +BD40 +AA80 +AFE0 +D020 +AAA0 +ENDCHAR +STARTCHAR U_482F +ENCODING 18479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AB40 +E000 +2FE0 +2AA0 +B540 +AFE0 +AAA0 +BFE0 +CAA0 +ENDCHAR +STARTCHAR U_4830 +ENCODING 18480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +97C0 +F540 +26C0 +23E0 +BC80 +A7E0 +B480 +C7E0 +ENDCHAR +STARTCHAR U_4831 +ENCODING 18481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F540 +27E0 +24A0 +B7E0 +A520 +B7E0 +E520 +8BC0 +ENDCHAR +STARTCHAR U_4832 +ENCODING 18482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7280 +5440 +7820 +5380 +7000 +57C0 +F040 +5280 +9100 +3100 +ENDCHAR +STARTCHAR U_4833 +ENCODING 18483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7520 +5520 +7520 +57E0 +7100 +5520 +F520 +5520 +97E0 +3420 +ENDCHAR +STARTCHAR U_4834 +ENCODING 18484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7080 +57E0 +7000 +5420 +7420 +5220 +F240 +5240 +9000 +37E0 +ENDCHAR +STARTCHAR U_4835 +ENCODING 18485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7240 +5440 +77E0 +5440 +7E40 +5540 +F440 +5440 +9440 +34C0 +ENDCHAR +STARTCHAR U_4836 +ENCODING 18486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7200 +53E0 +7480 +5880 +77E0 +5880 +F140 +3140 +5220 +B420 +ENDCHAR +STARTCHAR U_4837 +ENCODING 18487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7280 +5AA0 +76C0 +5280 +72C0 +56A0 +FA80 +32A0 +52A0 +B4E0 +ENDCHAR +STARTCHAR U_4838 +ENCODING 18488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +7440 +5BA0 +7000 +57C0 +F200 +57C0 +9040 +3180 +ENDCHAR +STARTCHAR U_4839 +ENCODING 18489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +4900 +7A00 +4A40 +7980 +4920 +FE40 +2880 +4940 +9E20 +ENDCHAR +STARTCHAR U_483A +ENCODING 18490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +E3E0 +A820 +E820 +ABA0 +EAA0 +BAA0 +EBA0 +6AA0 +A820 +6860 +ENDCHAR +STARTCHAR U_483B +ENCODING 18491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5AA0 +7440 +57C0 +7040 +53C0 +F400 +57E0 +9020 +33C0 +ENDCHAR +STARTCHAR U_483C +ENCODING 18492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +A440 +FBA0 +AE20 +EAA0 +BEA0 +EAA0 +6EA0 +AA20 +6A60 +ENDCHAR +STARTCHAR U_483D +ENCODING 18493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7540 +57C0 +7000 +5FE0 +7000 +57C0 +D440 +37C0 +5280 +9FE0 +ENDCHAR +STARTCHAR U_483E +ENCODING 18494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +AEE0 +EAA0 +AEE0 +E920 +B920 +EAA0 +6C60 +A820 +6860 +ENDCHAR +STARTCHAR U_483F +ENCODING 18495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5540 +77C0 +5100 +7FE0 +5440 +F7C0 +5440 +97C0 +3820 +ENDCHAR +STARTCHAR U_4840 +ENCODING 18496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +A000 +EFE0 +A920 +EAA0 +AFE0 +F440 +27C0 +6440 +AFE0 +ENDCHAR +STARTCHAR U_4841 +ENCODING 18497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +DF80 +AAE0 +FF20 +A0E0 +EE80 +AAE0 +EE80 +3AE0 +6E80 +AAE0 +ENDCHAR +STARTCHAR U_4842 +ENCODING 18498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +FA40 +2240 +FA40 +AA40 +FA40 +AA40 +FBC0 +2040 +F840 +2040 +ENDCHAR +STARTCHAR U_4843 +ENCODING 18499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F900 +2100 +FBE0 +A920 +F920 +A920 +F920 +2220 +FA20 +24C0 +ENDCHAR +STARTCHAR U_4844 +ENCODING 18500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FB80 +2280 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4845 +ENCODING 18501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FA20 +22A0 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +22A0 +FA20 +2420 +ENDCHAR +STARTCHAR U_4846 +ENCODING 18502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F940 +2140 +F940 +AA20 +FAA0 +AC80 +F900 +2240 +FBE0 +2020 +ENDCHAR +STARTCHAR U_4847 +ENCODING 18503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2000 +F800 +AFE0 +FA80 +AA80 +FA80 +2280 +FC80 +2460 +ENDCHAR +STARTCHAR U_4848 +ENCODING 18504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +2080 +F940 +AA20 +F800 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_4849 +ENCODING 18505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +F800 +ABC0 +FA40 +AA40 +FA40 +2240 +FA40 +2420 +ENDCHAR +STARTCHAR U_484A +ENCODING 18506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2200 +FA00 +ABE0 +FAA0 +AAA0 +FAA0 +2240 +FCA0 +2920 +ENDCHAR +STARTCHAR U_484B +ENCODING 18507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_484C +ENCODING 18508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +27E0 +F900 +A940 +FA40 +AA80 +FC80 +2120 +FBE0 +2020 +ENDCHAR +STARTCHAR U_484D +ENCODING 18509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +A880 +F940 +2140 +FA20 +2220 +ENDCHAR +STARTCHAR U_484E +ENCODING 18510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2200 +FBE0 +AA20 +FA20 +ABE0 +FA00 +2200 +FC00 +2400 +ENDCHAR +STARTCHAR U_484F +ENCODING 18511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +F940 +2140 +FB40 +AC40 +F840 +AE40 +FAA0 +22A0 +FBE0 +2620 +ENDCHAR +STARTCHAR U_4850 +ENCODING 18512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +23E0 +FA20 +A800 +F900 +A920 +F9C0 +2100 +F920 +20E0 +ENDCHAR +STARTCHAR U_4851 +ENCODING 18513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2220 +FA20 +ABE0 +FA80 +AA80 +FBE0 +2280 +FA40 +2320 +ENDCHAR +STARTCHAR U_4852 +ENCODING 18514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +22A0 +FAA0 +AAA0 +FBE0 +AAA0 +FAA0 +22A0 +FBE0 +2000 +ENDCHAR +STARTCHAR U_4853 +ENCODING 18515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3F60 +4400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +5F40 +44C0 +ENDCHAR +STARTCHAR U_4854 +ENCODING 18516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBC0 +2440 +FA80 +A900 +FA80 +A9E0 +FA20 +2140 +F880 +2300 +ENDCHAR +STARTCHAR U_4855 +ENCODING 18517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F840 +2080 +F8A0 +AEC0 +FAA0 +AAA0 +FAA0 +2480 +F800 +23E0 +ENDCHAR +STARTCHAR U_4856 +ENCODING 18518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +2140 +FA20 +AC80 +F880 +ABE0 +F880 +2080 +F880 +23E0 +ENDCHAR +STARTCHAR U_4857 +ENCODING 18519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2240 +3740 +C260 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4858 +ENCODING 18520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2420 +F820 +AFA0 +FAA0 +AFA0 +FAA0 +27A0 +F820 +2040 +ENDCHAR +STARTCHAR U_4859 +ENCODING 18521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +FBE0 +AA20 +FBE0 +AA80 +FAA0 +2240 +FA40 +2320 +ENDCHAR +STARTCHAR U_485A +ENCODING 18522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F900 +23E0 +FA20 +ABE0 +FA20 +ABE0 +F940 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_485B +ENCODING 18523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_485C +ENCODING 18524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +A940 +FA40 +AC60 +F880 +23E0 +F880 +23E0 +ENDCHAR +STARTCHAR U_485D +ENCODING 18525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FA00 +ABE0 +FAA0 +A8A0 +FAA0 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_485E +ENCODING 18526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +FFE0 +2480 +7FC0 +9520 +1F00 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_485F +ENCODING 18527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F900 +23E0 +FAA0 +ABE0 +FAA0 +ABE0 +F940 +2240 +FBE0 +2040 +ENDCHAR +STARTCHAR U_4860 +ENCODING 18528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +F880 +23E0 +FA20 +ABE0 +FA20 +ABE0 +FA20 +23E0 +F940 +2220 +ENDCHAR +STARTCHAR U_4861 +ENCODING 18529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FBE0 +2280 +FBA0 +AA60 +F900 +ABE0 +FA20 +23E0 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4862 +ENCODING 18530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FA00 +23E0 +FA20 +ABE0 +FA00 +ABE0 +FAA0 +23E0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_4863 +ENCODING 18531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4864 +ENCODING 18532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +3F40 +0480 +FFE0 +3480 +5280 +FFE0 +4E40 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4865 +ENCODING 18533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2440 +FA80 +AC40 +F980 +AA40 +FFE0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4866 +ENCODING 18534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +2080 +FFE0 +AAA0 +FB40 +ACA0 +F880 +27E0 +FAC0 +24A0 +ENDCHAR +STARTCHAR U_4867 +ENCODING 18535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2220 +FBE0 +AA00 +FBE0 +AA00 +FBE0 +2020 +FAA0 +2060 +ENDCHAR +STARTCHAR U_4868 +ENCODING 18536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +0400 +7FC0 +2200 +5FC0 +8400 +FFE0 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4869 +ENCODING 18537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AA20 +FBA0 +AAE0 +FA20 +27E0 +F940 +2220 +ENDCHAR +STARTCHAR U_486A +ENCODING 18538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FA00 +23E0 +FA20 +ABE0 +FA00 +ABE0 +FAA0 +23E0 +FAA0 +25E0 +ENDCHAR +STARTCHAR U_486B +ENCODING 18539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FD20 +22A0 +FE40 +AAA0 +FB40 +AAE0 +FA40 +22E0 +FA40 +25E0 +ENDCHAR +STARTCHAR U_486C +ENCODING 18540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +AFE0 +FAA0 +AFE0 +FBC0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_486D +ENCODING 18541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FFE0 +2080 +FBE0 +A880 +FFE0 +ABC0 +FD40 +27C0 +F940 +27E0 +ENDCHAR +STARTCHAR U_486E +ENCODING 18542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +24A0 +F940 +AA00 +FA40 +AEC0 +FAE0 +22C0 +FAC0 +2360 +ENDCHAR +STARTCHAR U_486F +ENCODING 18543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +26A0 +FD60 +ACA0 +FFE0 +A900 +FAA0 +2620 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4870 +ENCODING 18544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4871 +ENCODING 18545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +22E0 +FAA0 +AAE0 +FA00 +ABE0 +FAA0 +23E0 +FE00 +23E0 +ENDCHAR +STARTCHAR U_4872 +ENCODING 18546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +23E0 +F800 +ABE0 +FAA0 +ABE0 +FAA0 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_4873 +ENCODING 18547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FAA0 +27C0 +FA80 +ABE0 +FAA0 +ABA0 +FAA0 +27A0 +FAA0 +24A0 +ENDCHAR +STARTCHAR U_4874 +ENCODING 18548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2140 +FFE0 +A800 +FBE0 +AAE0 +FBA0 +27E0 +F880 +27E0 +ENDCHAR +STARTCHAR U_4875 +ENCODING 18549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FBE0 +2680 +FAC0 +AB60 +FEC0 +AB60 +FAC0 +2340 +FAC0 +25E0 +ENDCHAR +STARTCHAR U_4876 +ENCODING 18550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +FDE0 +2500 +FDA0 +AF40 +FCE0 +AF40 +FDE0 +2540 +FD40 +2F40 +ENDCHAR +STARTCHAR U_4877 +ENCODING 18551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +F880 +ABE0 +F880 +AFE0 +FA00 +27E0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_4878 +ENCODING 18552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +2140 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +22A0 +FA40 +23A0 +ENDCHAR +STARTCHAR U_4879 +ENCODING 18553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +ABE0 +FAA0 +ABE0 +F880 +22C0 +FA80 +25E0 +ENDCHAR +STARTCHAR U_487A +ENCODING 18554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FBC0 +A840 +FFE0 +A840 +FBC0 +2080 +FB60 +25C0 +ENDCHAR +STARTCHAR U_487B +ENCODING 18555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +AA40 +FFE0 +AD40 +FA20 +27C0 +FA40 +24C0 +ENDCHAR +STARTCHAR U_487C +ENCODING 18556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +27E0 +FCA0 +AAA0 +F940 +AA20 +FFE0 +25A0 +FDA0 +27E0 +ENDCHAR +STARTCHAR U_487D +ENCODING 18557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +AA40 +FDA0 +ABC0 +FA40 +23C0 +FA40 +2660 +ENDCHAR +STARTCHAR U_487E +ENCODING 18558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFC0 +2A60 +FF40 +AAE0 +FF40 +A940 +FF40 +2B60 +FDA0 +2B20 +ENDCHAR +STARTCHAR U_487F +ENCODING 18559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F100 +2FE0 +F920 +AFE0 +FAA0 +AFE0 +FD40 +2BA0 +F100 +2FE0 +ENDCHAR +STARTCHAR U_4880 +ENCODING 18560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F200 +47E0 +A800 +A7C0 +F040 +2080 +3100 +6200 +A420 +27E0 +ENDCHAR +STARTCHAR U_4881 +ENCODING 18561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +F7C0 +4440 +A440 +A740 +F440 +2740 +3440 +6440 +A9C0 +3080 +ENDCHAR +STARTCHAR U_4882 +ENCODING 18562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F100 +4FE0 +8000 +A440 +F440 +2280 +3280 +6100 +AFE0 +2000 +ENDCHAR +STARTCHAR U_4883 +ENCODING 18563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +7A80 +47E0 +B900 +AFE0 +3940 +0080 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_4884 +ENCODING 18564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F7E0 +0280 +F7E0 +9100 +F7E0 +2100 +FFE0 +2100 +7380 +AD60 +ENDCHAR +STARTCHAR U_4885 +ENCODING 18565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4040 +7BC0 +4040 +7FE0 +4000 +5FC0 +4000 +7FE0 +5240 +99E0 +ENDCHAR +STARTCHAR U_4886 +ENCODING 18566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8DC0 +7400 +57E0 +5540 +55A0 +5440 +5FE0 +9540 +88C0 +ENDCHAR +STARTCHAR U_4887 +ENCODING 18567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +FDC0 +8400 +7FE0 +55A0 +5540 +5520 +57E0 +9940 +88C0 +ENDCHAR +STARTCHAR U_4888 +ENCODING 18568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7FC0 +5280 +91C0 +1F00 +F5E0 +2E80 +3F80 +1500 +1F00 +ENDCHAR +STARTCHAR U_4889 +ENCODING 18569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +5F40 +7BC0 +5540 +7FC0 +4000 +7FC0 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_488A +ENCODING 18570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +2080 +07E0 +F080 +2080 +2080 +2280 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_488B +ENCODING 18571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2FE0 +0240 +F240 +2240 +2240 +2440 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_488C +ENCODING 18572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0100 +F7C0 +2540 +2540 +2540 +25C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_488D +ENCODING 18573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0200 +F3C0 +2240 +2440 +2840 +2180 +5800 +87E0 +ENDCHAR +STARTCHAR U_488E +ENCODING 18574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +2280 +0280 +F7E0 +2280 +2280 +2480 +2880 +5C00 +83E0 +ENDCHAR +STARTCHAR U_488F +ENCODING 18575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +2280 +0180 +F480 +22E0 +2F80 +2080 +2080 +3080 +CFE0 +ENDCHAR +STARTCHAR U_4890 +ENCODING 18576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4880 +0F80 +C880 +4F80 +4880 +4880 +5FE0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_4891 +ENCODING 18577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2680 +2480 +07E0 +F480 +2480 +24A0 +2560 +26A0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4892 +ENCODING 18578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0440 +EC60 +2280 +2100 +2280 +2460 +5000 +8FE0 +ENDCHAR +STARTCHAR U_4893 +ENCODING 18579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +07C0 +F100 +2FE0 +2100 +2100 +2300 +5800 +87E0 +ENDCHAR +STARTCHAR U_4894 +ENCODING 18580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +0BA0 +E000 +27C0 +2440 +2440 +27C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_4895 +ENCODING 18581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +27E0 +0480 +F780 +24A0 +24C0 +24E0 +2B20 +5800 +87E0 +ENDCHAR +STARTCHAR U_4896 +ENCODING 18582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2140 +0FE0 +F140 +27C0 +2100 +2FE0 +2100 +5900 +87E0 +ENDCHAR +STARTCHAR U_4897 +ENCODING 18583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +2FE0 +0AA0 +FAA0 +2FE0 +2AA0 +2AA0 +2FE0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4898 +ENCODING 18584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +28A0 +0080 +F7C0 +2880 +2480 +2080 +2180 +5800 +87E0 +ENDCHAR +STARTCHAR U_4899 +ENCODING 18585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +2440 +07C0 +F440 +27C0 +2440 +27C0 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_489A +ENCODING 18586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +27C0 +0540 +F7C0 +2540 +27C0 +2500 +2380 +5C60 +87E0 +ENDCHAR +STARTCHAR U_489B +ENCODING 18587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2AA0 +0C60 +FBA0 +2AA0 +2AA0 +2BA0 +2860 +7800 +87E0 +ENDCHAR +STARTCHAR U_489C +ENCODING 18588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +27C0 +0040 +FFE0 +2920 +27C0 +2540 +25C0 +3900 +C7E0 +ENDCHAR +STARTCHAR U_489D +ENCODING 18589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2280 +0EE0 +E820 +2EE0 +2280 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_489E +ENCODING 18590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +3FE0 +0480 +F480 +2DC0 +36A0 +2480 +2480 +5800 +87E0 +ENDCHAR +STARTCHAR U_489F +ENCODING 18591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +3EE0 +09A0 +EEA0 +2AA0 +2A40 +2AA0 +3520 +5000 +8FE0 +ENDCHAR +STARTCHAR U_48A0 +ENCODING 18592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +2940 +0280 +EC60 +2240 +2FE0 +2240 +2440 +5840 +8FE0 +ENDCHAR +STARTCHAR U_48A1 +ENCODING 18593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +2540 +07E0 +F100 +2FE0 +2380 +2540 +2920 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A2 +ENCODING 18594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2540 +2FE0 +0440 +F7C0 +2440 +2FE0 +3420 +27E0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A3 +ENCODING 18595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +27C0 +2240 +0F80 +F100 +2FE0 +2500 +2280 +27C0 +7440 +8FE0 +ENDCHAR +STARTCHAR U_48A4 +ENCODING 18596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2CA0 +2480 +1FE0 +E480 +2DC0 +36A0 +2480 +2480 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_48A5 +ENCODING 18597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +25C0 +0500 +FFE0 +2540 +26C0 +2540 +27C0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A6 +ENCODING 18598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +07C0 +EAA0 +2FE0 +2100 +2FE0 +2100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_48A7 +ENCODING 18599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2660 +0BA0 +F540 +2A20 +2180 +2640 +2180 +3A00 +C7E0 +ENDCHAR +STARTCHAR U_48A8 +ENCODING 18600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +36A0 +0800 +FA80 +2AE0 +2A80 +2B80 +2CE0 +7800 +87E0 +ENDCHAR +STARTCHAR U_48A9 +ENCODING 18601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2880 +3EE0 +0BA0 +EAA0 +3FA0 +2A40 +2AA0 +2F20 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AA +ENCODING 18602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2200 +2FE0 +0480 +FFC0 +24A0 +2FC0 +2940 +2F40 +7840 +87E0 +ENDCHAR +STARTCHAR U_48AB +ENCODING 18603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2BE0 +2C80 +0BE0 +FA40 +2BE0 +2D20 +29E0 +2920 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AC +ENCODING 18604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E40 +2A80 +0FE0 +F4A0 +2FC0 +3A80 +27E0 +2480 +3880 +C7E0 +ENDCHAR +STARTCHAR U_48AD +ENCODING 18605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +2100 +07C0 +F100 +2FE0 +24A0 +22C0 +2D20 +F800 +07E0 +ENDCHAR +STARTCHAR U_48AE +ENCODING 18606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +27E0 +0D60 +F380 +2540 +27C0 +2540 +27C0 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AF +ENCODING 18607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2380 +2D60 +0380 +FC60 +27C0 +2A80 +27E0 +2480 +7880 +87E0 +ENDCHAR +STARTCHAR U_48B0 +ENCODING 18608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +94A0 +4C60 +14A0 +FFE0 +4900 +4FC0 +4900 +4FC0 +6900 +9FE0 +ENDCHAR +STARTCHAR U_48B1 +ENCODING 18609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2100 +0FE0 +FAA0 +2FE0 +2540 +2540 +27C0 +7820 +8FE0 +ENDCHAR +STARTCHAR U_48B2 +ENCODING 18610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +4AA0 +2EE0 +FAA0 +2FE0 +2480 +27E0 +2480 +2FE0 +7240 +8FE0 +ENDCHAR +STARTCHAR U_48B3 +ENCODING 18611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4940 +4980 +4940 +4920 +4920 +4B20 +4DC0 +4900 +8100 +ENDCHAR +STARTCHAR U_48B4 +ENCODING 18612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +1BC0 +E240 +2280 +2280 +FA40 +2240 +2340 +2280 +4200 +8200 +ENDCHAR +STARTCHAR U_48B5 +ENCODING 18613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F920 +0140 +0140 +FD20 +2120 +4120 +4920 +8DC0 +F500 +0100 +ENDCHAR +STARTCHAR U_48B6 +ENCODING 18614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FD40 +1180 +3140 +3920 +5520 +9120 +11C0 +1100 +1100 +ENDCHAR +STARTCHAR U_48B7 +ENCODING 18615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +6540 +5540 +4520 +FF20 +4520 +4520 +45A0 +8540 +8D00 +ENDCHAR +STARTCHAR U_48B8 +ENCODING 18616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +4540 +7D40 +4520 +4520 +7D20 +4520 +47A0 +F940 +0100 +ENDCHAR +STARTCHAR U_48B9 +ENCODING 18617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8120 +8120 +F940 +8940 +8920 +F920 +8120 +81A0 +FD40 +0100 +ENDCHAR +STARTCHAR U_48BA +ENCODING 18618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +9520 +9520 +FD40 +1140 +1120 +9520 +9520 +95A0 +FD40 +0100 +ENDCHAR +STARTCHAR U_48BB +ENCODING 18619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +9120 +9140 +F940 +8920 +8920 +F920 +91A0 +9140 +FD00 +0100 +ENDCHAR +STARTCHAR U_48BC +ENCODING 18620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4920 +FD40 +4940 +4920 +4920 +FD20 +0120 +49C0 +4500 +8500 +ENDCHAR +STARTCHAR U_48BD +ENCODING 18621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +2080 +FFE0 +5140 +BFA0 +2480 +3F80 +2000 +2040 +1FC0 +ENDCHAR +STARTCHAR U_48BE +ENCODING 18622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5120 +7D40 +9140 +1120 +FF20 +2920 +2920 +4BC0 +8D00 +0100 +ENDCHAR +STARTCHAR U_48BF +ENCODING 18623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD20 +8540 +4140 +4920 +FD20 +4920 +4920 +39C0 +C500 +0100 +ENDCHAR +STARTCHAR U_48C0 +ENCODING 18624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +3EA0 +44A0 +FEC0 +40A0 +5EA0 +52A0 +56C0 +5080 +9C80 +9080 +ENDCHAR +STARTCHAR U_48C1 +ENCODING 18625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +22A0 +AAA0 +66C0 +22A0 +66A0 +AAA0 +22A0 +22E0 +AA80 +4480 +ENDCHAR +STARTCHAR U_48C2 +ENCODING 18626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +7920 +1120 +7D40 +1140 +FF20 +3120 +39A0 +5540 +5500 +9100 +ENDCHAR +STARTCHAR U_48C3 +ENCODING 18627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +7CA0 +90A0 +10C0 +FEA0 +10A0 +5EA0 +50C0 +5080 +5E80 +F080 +ENDCHAR +STARTCHAR U_48C4 +ENCODING 18628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +28A0 +44A0 +B8C0 +10A0 +7CA0 +10A0 +58C0 +5480 +B480 +1080 +ENDCHAR +STARTCHAR U_48C5 +ENCODING 18629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +40A0 +7CA0 +40C0 +7EA0 +50A0 +5AA0 +54C0 +5480 +9280 +9880 +ENDCHAR +STARTCHAR U_48C6 +ENCODING 18630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +0120 +5520 +A940 +5540 +0120 +FD20 +2120 +3DC0 +E100 +0100 +ENDCHAR +STARTCHAR U_48C7 +ENCODING 18631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14E0 +12A0 +FEA0 +10C0 +92A0 +54A0 +10A0 +54C0 +9280 +9280 +3080 +ENDCHAR +STARTCHAR U_48C8 +ENCODING 18632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +FBC0 +0000 +FBE0 +AAA0 +AAA0 +FBE0 +8200 +BA20 +C3E0 +ENDCHAR +STARTCHAR U_48C9 +ENCODING 18633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +AA80 +5340 +8400 +7F80 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_48CA +ENCODING 18634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92E0 +54A0 +10A0 +FEC0 +82A0 +BAA0 +AAA0 +AAC0 +BA80 +8280 +8680 +ENDCHAR +STARTCHAR U_48CB +ENCODING 18635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +48A0 +12C0 +FEA0 +10A0 +38A0 +54C0 +9080 +1080 +1080 +ENDCHAR +STARTCHAR U_48CC +ENCODING 18636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +40A0 +5EC0 +54A0 +54A0 +5EA0 +54C0 +5280 +9980 +9680 +ENDCHAR +STARTCHAR U_48CD +ENCODING 18637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FEA0 +34A0 +52C0 +FFA0 +52A0 +7EA0 +52C0 +7E80 +1080 +1C80 +ENDCHAR +STARTCHAR U_48CE +ENCODING 18638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +5520 +A920 +5540 +0140 +7D20 +5520 +7DA0 +5540 +5500 +7D00 +ENDCHAR +STARTCHAR U_48CF +ENCODING 18639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2AA0 +2AA0 +5FC0 +4AA0 +CAA0 +7FA0 +40A0 +4AE0 +4980 +5080 +ENDCHAR +STARTCHAR U_48D0 +ENCODING 18640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FFE0 +2920 +1140 +7D40 +5520 +5520 +FF20 +29C0 +4500 +8300 +ENDCHAR +STARTCHAR U_48D1 +ENCODING 18641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4120 +7D40 +55C0 +7D20 +5520 +7D20 +51A0 +7D40 +9100 +BF00 +ENDCHAR +STARTCHAR U_48D2 +ENCODING 18642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +5520 +FF40 +0140 +7D20 +5520 +55A0 +5540 +2900 +C500 +ENDCHAR +STARTCHAR U_48D3 +ENCODING 18643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCE0 +00A0 +7CA0 +44C0 +7CA0 +00A0 +FEA0 +AAA0 +FEE0 +9280 +9680 +ENDCHAR +STARTCHAR U_48D4 +ENCODING 18644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +59E0 +FD20 +8540 +FD40 +8520 +FD20 +8520 +FDC0 +4900 +8500 +ENDCHAR +STARTCHAR U_48D5 +ENCODING 18645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5120 +7D40 +5140 +7D20 +5120 +7D20 +05A0 +AD40 +A500 +1900 +ENDCHAR +STARTCHAR U_48D6 +ENCODING 18646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7A40 +53C0 +7800 +53E0 +7AA0 +0BE0 +AA00 +AA20 +19E0 +ENDCHAR +STARTCHAR U_48D7 +ENCODING 18647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +4520 +7D40 +4540 +7D20 +2120 +FFA0 +5540 +FF00 +1100 +ENDCHAR +STARTCHAR U_48D8 +ENCODING 18648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95E0 +5920 +FD40 +8540 +7920 +4920 +7920 +21A0 +7940 +2100 +FD00 +ENDCHAR +STARTCHAR U_48D9 +ENCODING 18649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +92E0 +FEA0 +00A0 +EEC0 +AAA0 +EEA0 +AAA0 +EEE0 +AA80 +B280 +ENDCHAR +STARTCHAR U_48DA +ENCODING 18650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +5520 +FF40 +5540 +7D20 +5520 +FDA0 +4940 +3900 +C700 +ENDCHAR +STARTCHAR U_48DB +ENCODING 18651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +3920 +5540 +9140 +2920 +D720 +55A0 +3940 +D500 +3100 +ENDCHAR +STARTCHAR U_48DC +ENCODING 18652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +10E0 +7EA0 +54A0 +7CC0 +54A0 +5CA0 +54A0 +5CE0 +9480 +BE80 +ENDCHAR +STARTCHAR U_48DD +ENCODING 18653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +42A0 +7EA0 +48C0 +7EA0 +4AA0 +7FA0 +52A0 +7EE0 +9280 +9E80 +ENDCHAR +STARTCHAR U_48DE +ENCODING 18654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEA0 +44C0 +FEA0 +10A0 +54A0 +54A0 +7CE0 +2080 +C080 +ENDCHAR +STARTCHAR U_48DF +ENCODING 18655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +A520 +FF40 +2540 +7F20 +A520 +7D20 +45A0 +7D40 +4500 +7D00 +ENDCHAR +STARTCHAR U_48E0 +ENCODING 18656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +EF20 +4520 +EF40 +4540 +AB20 +7D20 +45A0 +7D40 +4500 +7D00 +ENDCHAR +STARTCHAR U_48E1 +ENCODING 18657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +2140 +7940 +2120 +FD20 +5520 +FDA0 +5540 +E900 +5500 +ENDCHAR +STARTCHAR U_48E2 +ENCODING 18658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +FFA0 +4AC0 +EAA0 +5FA0 +E0A0 +4EA0 +6AA0 +DEC0 +4A80 +4E80 +ENDCHAR +STARTCHAR U_48E3 +ENCODING 18659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54E0 +FEA0 +AAA0 +7CC0 +54A0 +7CA0 +10A0 +7CA0 +10E0 +FE80 +5480 +ENDCHAR +STARTCHAR U_48E4 +ENCODING 18660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEA0 +AAC0 +7EA0 +C8A0 +7CA0 +48A0 +FEC0 +4880 +FC80 +ENDCHAR +STARTCHAR U_48E5 +ENCODING 18661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2200 +FA00 +AA20 +AAC0 +DB00 +8A00 +FA00 +8A00 +FA20 +89C0 +ENDCHAR +STARTCHAR U_48E6 +ENCODING 18662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +27E0 +F920 +A920 +D920 +8920 +F920 +8A20 +FAA0 +8C40 +ENDCHAR +STARTCHAR U_48E7 +ENCODING 18663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +2100 +FFE0 +A900 +D900 +8900 +F880 +8880 +F860 +8820 +ENDCHAR +STARTCHAR U_48E8 +ENCODING 18664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +F9C0 +AF00 +A900 +D900 +8FE0 +F900 +8900 +F920 +88C0 +ENDCHAR +STARTCHAR U_48E9 +ENCODING 18665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +27E0 +F880 +AAA0 +AAA0 +DBE0 +8880 +F880 +8880 +F860 +ENDCHAR +STARTCHAR U_48EA +ENCODING 18666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +23E0 +F880 +ABE0 +AAA0 +DAA0 +8AA0 +FAA0 +8AA0 +F880 +8880 +ENDCHAR +STARTCHAR U_48EB +ENCODING 18667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +FBE0 +A880 +A880 +DBE0 +8A20 +F940 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_48EC +ENCODING 18668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +27E0 +F900 +A920 +D920 +8940 +F880 +8980 +FA60 +8C20 +ENDCHAR +STARTCHAR U_48ED +ENCODING 18669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +20A0 +F880 +ABE0 +A880 +D880 +8880 +F940 +8940 +FA20 +8A20 +ENDCHAR +STARTCHAR U_48EE +ENCODING 18670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +27E0 +F900 +A920 +D920 +89A0 +FA40 +8AC0 +FD20 +8A20 +ENDCHAR +STARTCHAR U_48EF +ENCODING 18671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +FBC0 +AA40 +AA40 +DBC0 +8A40 +FA40 +8A40 +FFE0 +ENDCHAR +STARTCHAR U_48F0 +ENCODING 18672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2200 +FA00 +ABE0 +AA20 +DA20 +8BE0 +FA00 +8A00 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_48F1 +ENCODING 18673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2200 +27E0 +F820 +ABA0 +AAA0 +DAA0 +8BA0 +FAA0 +8820 +F8C0 +ENDCHAR +STARTCHAR U_48F2 +ENCODING 18674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2240 +27E0 +F800 +AA40 +DA40 +8FE0 +FA40 +8A40 +FA40 +8C40 +ENDCHAR +STARTCHAR U_48F3 +ENCODING 18675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2020 +2020 +FBE0 +A820 +DBA0 +8AA0 +FBA0 +8820 +F8A0 +8840 +ENDCHAR +STARTCHAR U_48F4 +ENCODING 18676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +2360 +22A0 +FB60 +AA20 +DBE0 +8940 +F940 +8940 +FA40 +8C60 +ENDCHAR +STARTCHAR U_48F5 +ENCODING 18677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2240 +FA40 +ABC0 +AA40 +DBC0 +8A40 +FA40 +8FE0 +F840 +8840 +ENDCHAR +STARTCHAR U_48F6 +ENCODING 18678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +F880 +ABE0 +A880 +D880 +8BE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_48F7 +ENCODING 18679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +23C0 +FC80 +A880 +DFE0 +8880 +F9C0 +8AA0 +FC80 +8880 +ENDCHAR +STARTCHAR U_48F8 +ENCODING 18680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E100 +3FE0 +2100 +FFE0 +1100 +7FC0 +5140 +6EC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_48F9 +ENCODING 18681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +22A0 +2680 +FBE0 +AA80 +DAA0 +8AA0 +FA40 +8A40 +FAE0 +8B20 +ENDCHAR +STARTCHAR U_48FA +ENCODING 18682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FBE0 +A800 +ABE0 +DA20 +8BE0 +FA20 +8BE0 +FA20 +8C60 +ENDCHAR +STARTCHAR U_48FB +ENCODING 18683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +27C0 +F820 +ABC0 +D880 +8900 +FBC0 +8A40 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_48FC +ENCODING 18684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +23E0 +F800 +ABE0 +AA20 +DBE0 +8880 +FAA0 +8CA0 +F8A0 +8980 +ENDCHAR +STARTCHAR U_48FD +ENCODING 18685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +A3C0 +FA40 +53C0 +8800 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_48FE +ENCODING 18686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2080 +FBE0 +AC20 +ABC0 +DA40 +8BC0 +FA40 +8BC0 +FA40 +8FE0 +ENDCHAR +STARTCHAR U_48FF +ENCODING 18687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2080 +27E0 +F880 +A880 +D980 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_4900 +ENCODING 18688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +F900 +AFE0 +D900 +8A00 +FFC0 +8A40 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_4901 +ENCODING 18689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +2140 +F9C0 +A940 +D9C0 +8940 +FFE0 +8AC0 +FB20 +8BE0 +ENDCHAR +STARTCHAR U_4902 +ENCODING 18690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +23E0 +F940 +A9C0 +A940 +D880 +8BE0 +F880 +89C0 +FAA0 +8880 +ENDCHAR +STARTCHAR U_4903 +ENCODING 18691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +FA40 +A980 +AFE0 +D800 +8BC0 +FA40 +8BC0 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_4904 +ENCODING 18692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +2400 +FFE0 +AAA0 +DBA0 +8AA0 +FBA0 +8AA0 +FFE0 +8820 +ENDCHAR +STARTCHAR U_4905 +ENCODING 18693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +FBA0 +A800 +DE20 +8AA0 +FEA0 +8AA0 +FE20 +8A60 +ENDCHAR +STARTCHAR U_4906 +ENCODING 18694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +2AC0 +26A0 +FA40 +AC20 +FBC0 +8900 +FFE0 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_4907 +ENCODING 18695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +24A0 +FAC0 +A980 +D940 +8E20 +FBC0 +8A40 +F980 +8E60 +ENDCHAR +STARTCHAR U_4908 +ENCODING 18696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA40 +2420 +FFE0 +A900 +FBC0 +8840 +F880 +8FE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_4909 +ENCODING 18697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F940 +24A0 +FB20 +AA40 +DDC0 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_490A +ENCODING 18698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +27E0 +FA40 +AFE0 +AA40 +DBC0 +8A40 +FBC0 +8A40 +FFE0 +8840 +ENDCHAR +STARTCHAR U_490B +ENCODING 18699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2080 +FB80 +AA80 +DBA0 +88A0 +FF40 +88C0 +FB20 +ENDCHAR +STARTCHAR U_490C +ENCODING 18700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA40 +25A0 +F800 +ABC0 +FA40 +8BC0 +FA40 +8BE0 +FE20 +8BE0 +ENDCHAR +STARTCHAR U_490D +ENCODING 18701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +27E0 +FA40 +ABC0 +A900 +DFE0 +8DA0 +FB60 +8DA0 +F920 +8860 +ENDCHAR +STARTCHAR U_490E +ENCODING 18702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2140 +FFE0 +A9A0 +AA80 +DC80 +8FE0 +FAA0 +8FE0 +FAA0 +8BA0 +ENDCHAR +STARTCHAR U_490F +ENCODING 18703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +2140 +2760 +F940 +ABE0 +D880 +8BE0 +F880 +8FE0 +F880 +8980 +ENDCHAR +STARTCHAR U_4910 +ENCODING 18704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2540 +27E0 +FB40 +ADE0 +A800 +DBC0 +8A40 +FBC0 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_4911 +ENCODING 18705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +23E0 +2140 +FFE0 +A880 +DBE0 +8AA0 +FBE0 +8AA0 +FBE0 +8C20 +ENDCHAR +STARTCHAR U_4912 +ENCODING 18706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +FFE0 +A940 +FBE0 +8A80 +FAA0 +8B40 +FCC0 +8B20 +ENDCHAR +STARTCHAR U_4913 +ENCODING 18707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +FFE0 +AC20 +DBC0 +8920 +FEC0 +89C0 +FEA0 +8980 +ENDCHAR +STARTCHAR U_4914 +ENCODING 18708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +BF80 +6AE0 +3FA0 +C920 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_4915 +ENCODING 18709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FDC0 +2AA0 +FFC0 +AAA0 +FFE0 +8900 +FFE0 +8B40 +FD20 +8900 +ENDCHAR +STARTCHAR U_4916 +ENCODING 18710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +22A0 +FBE0 +A940 +ABE0 +D940 +8FE0 +FAA0 +8EA0 +F9C0 +8EA0 +ENDCHAR +STARTCHAR U_4917 +ENCODING 18711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDC0 +4740 +FDE0 +5680 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_4918 +ENCODING 18712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AC0 +FAA0 +2580 +FFE0 +AA80 +DB80 +8AA0 +FBC0 +8E80 +F960 +8E20 +ENDCHAR +STARTCHAR U_4919 +ENCODING 18713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA80 +27E0 +FB40 +ADC0 +FAA0 +8FE0 +FAA0 +8FE0 +F2A0 +8FE0 +ENDCHAR +STARTCHAR U_491A +ENCODING 18714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +F540 +97C0 +9540 +F100 +97C0 +9100 +B100 +9FE0 +ENDCHAR +STARTCHAR U_491B +ENCODING 18715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +5240 +8A40 +7240 +2240 +FA40 +2A40 +B3C0 +6040 +3840 +C040 +ENDCHAR +STARTCHAR U_491C +ENCODING 18716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +88E0 +7780 +2080 +F880 +27E0 +A880 +B080 +38A0 +C060 +ENDCHAR +STARTCHAR U_491D +ENCODING 18717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +34E0 +4CA0 +F4A0 +24A0 +FCA0 +2CA0 +B5A0 +66E0 +3C80 +E080 +ENDCHAR +STARTCHAR U_491E +ENCODING 18718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +30C0 +48A0 +FFE0 +2080 +FC80 +2940 +B140 +6140 +3A40 +E460 +ENDCHAR +STARTCHAR U_491F +ENCODING 18719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8C40 +7380 +2280 +FA80 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_4920 +ENCODING 18720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F080 +2280 +FAE0 +2A80 +B280 +6280 +3A80 +C7E0 +ENDCHAR +STARTCHAR U_4921 +ENCODING 18721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F2A0 +23E0 +FAA0 +2FE0 +B220 +6220 +3A60 +C220 +ENDCHAR +STARTCHAR U_4922 +ENCODING 18722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +F3E0 +2000 +F900 +2BE0 +B120 +6120 +3A20 +C460 +ENDCHAR +STARTCHAR U_4923 +ENCODING 18723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4880 +F2A0 +21C0 +F880 +2FE0 +B080 +6080 +3980 +C080 +ENDCHAR +STARTCHAR U_4924 +ENCODING 18724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4880 +F120 +2240 +F980 +2920 +B240 +6080 +3940 +C620 +ENDCHAR +STARTCHAR U_4925 +ENCODING 18725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31E0 +4A40 +F3E0 +2200 +FAE0 +2AA0 +B2E0 +6280 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_4926 +ENCODING 18726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +32C0 +4AA0 +F280 +27E0 +FA80 +2AA0 +B2C0 +62A0 +3B60 +C220 +ENDCHAR +STARTCHAR U_4927 +ENCODING 18727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +F220 +22E0 +FAA0 +2AA0 +B2E0 +6220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_4928 +ENCODING 18728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4C60 +F580 +2540 +FD40 +2D60 +B540 +6540 +3D40 +C9A0 +ENDCHAR +STARTCHAR U_4929 +ENCODING 18729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F0C0 +2700 +F900 +2FE0 +B100 +6100 +3920 +C1E0 +ENDCHAR +STARTCHAR U_492A +ENCODING 18730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4A40 +F260 +2480 +FBE0 +2880 +B2C0 +62A0 +3AA0 +C480 +ENDCHAR +STARTCHAR U_492B +ENCODING 18731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3540 +4D40 +F7C0 +2100 +FA80 +2D40 +B820 +67C0 +3840 +C080 +ENDCHAR +STARTCHAR U_492C +ENCODING 18732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3280 +4880 +F9C0 +26A0 +FA80 +2980 +B6A0 +62C0 +3A80 +C300 +ENDCHAR +STARTCHAR U_492D +ENCODING 18733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2640 +31C0 +4E20 +F100 +27E0 +FA80 +2FE0 +B2A0 +62A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_492E +ENCODING 18734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32E0 +4A80 +F7E0 +2080 +FA80 +2A80 +B4A0 +60C0 +3980 +C600 +ENDCHAR +STARTCHAR U_492F +ENCODING 18735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +32A0 +4AC0 +F280 +27A0 +FAA0 +2AC0 +B280 +62A0 +3AA0 +C4C0 +ENDCHAR +STARTCHAR U_4930 +ENCODING 18736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +24A0 +3940 +C620 +1B00 +6EC0 +8420 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_4931 +ENCODING 18737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4BE0 +F020 +23C0 +FA00 +2BE0 +B240 +6240 +3A40 +C440 +ENDCHAR +STARTCHAR U_4932 +ENCODING 18738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F080 +27E0 +F940 +2940 +B360 +6540 +3940 +C240 +ENDCHAR +STARTCHAR U_4933 +ENCODING 18739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4940 +F240 +2660 +FAA0 +2BE0 +B2A0 +6240 +3A40 +C2A0 +ENDCHAR +STARTCHAR U_4934 +ENCODING 18740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4880 +F080 +24A0 +FEE0 +2DA0 +B6E0 +65A0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_4935 +ENCODING 18741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3140 +4B60 +F140 +2360 +F940 +2B60 +B540 +6140 +3A40 +C240 +ENDCHAR +STARTCHAR U_4936 +ENCODING 18742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4900 +F2C0 +2520 +FBC0 +2D40 +B540 +63C0 +3900 +C0E0 +ENDCHAR +STARTCHAR U_4937 +ENCODING 18743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4DE0 +F520 +25E0 +FC80 +2FE0 +B540 +64C0 +3D20 +C7E0 +ENDCHAR +STARTCHAR U_4938 +ENCODING 18744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31C0 +4940 +FFE0 +2080 +F9A0 +2AC0 +B540 +62E0 +3940 +C2C0 +ENDCHAR +STARTCHAR U_4939 +ENCODING 18745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4AA0 +F1C0 +2080 +F940 +2A20 +B3E0 +6140 +3880 +C360 +ENDCHAR +STARTCHAR U_493A +ENCODING 18746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +37C0 +4A80 +F280 +24E0 +FBA0 +2AA0 +B2A0 +63A0 +38A0 +C120 +ENDCHAR +STARTCHAR U_493B +ENCODING 18747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4A80 +F5E0 +2000 +FBE0 +2A20 +B3E0 +6220 +3BE0 +C420 +ENDCHAR +STARTCHAR U_493C +ENCODING 18748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33E0 +4A20 +F3E0 +2220 +FBE0 +2880 +B7A0 +61C0 +3AA0 +C5A0 +ENDCHAR +STARTCHAR U_493D +ENCODING 18749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +47E0 +F080 +22A0 +F9C0 +2880 +B1C0 +62A0 +3880 +C080 +ENDCHAR +STARTCHAR U_493E +ENCODING 18750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4AA0 +F140 +2000 +FA00 +2CE0 +B420 +6760 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_493F +ENCODING 18751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +37A0 +4AA0 +F7A0 +2260 +FBC0 +2880 +B080 +63E0 +3880 +C180 +ENDCHAR +STARTCHAR U_4940 +ENCODING 18752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4BE0 +F000 +23E0 +F880 +2BE0 +B2A0 +63E0 +3880 +C3E0 +ENDCHAR +STARTCHAR U_4941 +ENCODING 18753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3040 +4880 +F3E0 +2220 +FB60 +2AA0 +B3E0 +62A0 +3AA0 +C3E0 +ENDCHAR +STARTCHAR U_4942 +ENCODING 18754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3420 +4BC0 +F000 +27E0 +F900 +2EA0 +B140 +66E0 +3940 +C680 +ENDCHAR +STARTCHAR U_4943 +ENCODING 18755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D20 +F240 +27E0 +FA40 +2BE0 +B240 +63E0 +3A40 +C3E0 +ENDCHAR +STARTCHAR U_4944 +ENCODING 18756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3540 +4FE0 +F540 +27E0 +FC00 +2DE0 +B520 +65E0 +3D20 +C9E0 +ENDCHAR +STARTCHAR U_4945 +ENCODING 18757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +75C0 +2480 +75C0 +1B00 +64C0 +BFA0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4946 +ENCODING 18758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +71C0 +1100 +75C0 +1B00 +64C0 +BFA0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4947 +ENCODING 18759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F7E0 +2400 +FF60 +2D20 +B760 +6520 +3F60 +C920 +ENDCHAR +STARTCHAR U_4948 +ENCODING 18760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +37E0 +4A40 +F120 +27E0 +FA80 +2C60 +B140 +67E0 +3940 +C240 +ENDCHAR +STARTCHAR U_4949 +ENCODING 18761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F1C0 +2240 +FFE0 +2AA0 +B3E0 +6140 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_494A +ENCODING 18762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4880 +F3E0 +2080 +FFE0 +2A20 +B3E0 +6220 +3BE0 +C620 +ENDCHAR +STARTCHAR U_494B +ENCODING 18763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4A40 +F3C0 +2000 +FBE0 +2840 +B080 +6180 +3880 +C560 +ENDCHAR +STARTCHAR U_494C +ENCODING 18764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +3B80 +2A80 +3B80 +0400 +1B00 +EEE0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_494D +ENCODING 18765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +73C0 +2140 +FB40 +5140 +FA60 +2400 +1B00 +EEE0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_494E +ENCODING 18766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3400 +4FE0 +F540 +2540 +FDA0 +2BE0 +B220 +63A0 +3A60 +C220 +ENDCHAR +STARTCHAR U_494F +ENCODING 18767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +6BE0 +96A0 +E2A0 +4FA0 +EAA0 +5AE0 +EBA0 +4A80 +6B80 +8C80 +ENDCHAR +STARTCHAR U_4950 +ENCODING 18768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +5340 +FC80 +2940 +67E0 +A140 +2EC0 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4951 +ENCODING 18769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D40 +F540 +2BA0 +F960 +2BC0 +B340 +6480 +3940 +C640 +ENDCHAR +STARTCHAR U_4952 +ENCODING 18770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +F7E0 +84A0 +F3E0 +1EA0 +E5E0 +1500 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_4953 +ENCODING 18771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8AC0 +7340 +22C0 +FB40 +2FE0 +B540 +6BA0 +3100 +C7E0 +ENDCHAR +STARTCHAR U_4954 +ENCODING 18772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8FE0 +7AA0 +2AA0 +FFE0 +2540 +AFE0 +7380 +3D40 +E920 +ENDCHAR +STARTCHAR U_4955 +ENCODING 18773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7620 +2FA0 +FAA0 +2BA0 +BEC0 +6AC0 +3AA0 +EBA0 +ENDCHAR +STARTCHAR U_4956 +ENCODING 18774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8280 +7FE0 +2AA0 +FC60 +2FE0 +B100 +6FE0 +3280 +CC60 +ENDCHAR +STARTCHAR U_4957 +ENCODING 18775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +84E0 +7F20 +2040 +F740 +2040 +BFC0 +6E40 +35A0 +C520 +ENDCHAR +STARTCHAR U_4958 +ENCODING 18776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5140 +8AA0 +F140 +2140 +FAA0 +2BE0 +B220 +63E0 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_4959 +ENCODING 18777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +5EC0 +8A00 +7DE0 +2A80 +FB60 +2AC0 +BF40 +68E0 +3B40 +C880 +ENDCHAR +STARTCHAR U_495A +ENCODING 18778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +5DC0 +5540 +5DC0 +5540 +5F40 +64C0 +5F40 +9560 +FFA0 +ENDCHAR +STARTCHAR U_495B +ENCODING 18779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +52A0 +8FA0 +72A0 +2F20 +F2C0 +2B80 +B440 +67C0 +3540 +CB20 +ENDCHAR +STARTCHAR U_495C +ENCODING 18780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7AA0 +2EE0 +F920 +2FE0 +BBA0 +6D60 +3920 +C860 +ENDCHAR +STARTCHAR U_495D +ENCODING 18781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +7FE0 +2AA0 +FAC0 +2B60 +BA00 +6BC0 +3A00 +D1E0 +ENDCHAR +STARTCHAR U_495E +ENCODING 18782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +5A80 +8EE0 +7BA0 +2EA0 +F4A0 +2E40 +BA40 +6AA0 +F520 +ENDCHAR +STARTCHAR U_495F +ENCODING 18783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +3540 +4FC0 +F540 +25C0 +F700 +25E0 +BEA0 +6560 +35A0 +CCC0 +ENDCHAR +STARTCHAR U_4960 +ENCODING 18784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8A80 +70A0 +27E0 +F480 +2FA0 +B460 +6740 +3DA0 +D720 +ENDCHAR +STARTCHAR U_4961 +ENCODING 18785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5BE0 +8AA0 +7AE0 +2E00 +F9E0 +2E40 +BBE0 +6A40 +3AE0 +D140 +ENDCHAR +STARTCHAR U_4962 +ENCODING 18786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +4880 +7BC0 +5140 +FC80 +0F60 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4963 +ENCODING 18787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DFE0 +8A40 +F980 +2260 +FF00 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4964 +ENCODING 18788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +7560 +2380 +F440 +2FC0 +B540 +6740 +34A0 +E3E0 +ENDCHAR +STARTCHAR U_4965 +ENCODING 18789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A40 +7FE0 +2A80 +FFE0 +2AA0 +BFE0 +6AC0 +3EA0 +D280 +ENDCHAR +STARTCHAR U_4966 +ENCODING 18790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53E0 +8940 +75E0 +2F40 +F5C0 +2540 +B5C0 +6540 +3E00 +D1E0 +ENDCHAR +STARTCHAR U_4967 +ENCODING 18791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +7420 +23C0 +FDA0 +2A40 +B7E0 +62C0 +3340 +C3C0 +ENDCHAR +STARTCHAR U_4968 +ENCODING 18792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7AA0 +2FE0 +FAA0 +2BA0 +B820 +6BA0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_4969 +ENCODING 18793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +5A80 +AAE0 +1FA0 +F0A0 +57A0 +F040 +5740 +F540 +75A0 +D4A0 +ENDCHAR +STARTCHAR U_496A +ENCODING 18794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +54C0 +8D40 +77C0 +2240 +FFE0 +2A40 +B7E0 +6000 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_496B +ENCODING 18795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5FC0 +84A0 +7FE0 +2480 +FFA0 +2AA0 +BF40 +6AC0 +3F20 +C220 +ENDCHAR +STARTCHAR U_496C +ENCODING 18796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8540 +77E0 +2540 +FFC0 +2D40 +B7E0 +6240 +3A40 +E0C0 +ENDCHAR +STARTCHAR U_496D +ENCODING 18797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28A0 +FFE0 +AAA0 +71C0 +AEA0 +3180 +EEE0 +0400 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_496E +ENCODING 18798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +7AA0 +2FE0 +F800 +2FE0 +BAA0 +6FA0 +3AE0 +CF80 +ENDCHAR +STARTCHAR U_496F +ENCODING 18799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +7480 +2AE0 +FE80 +2A60 +BE80 +6AE0 +3E80 +CA60 +ENDCHAR +STARTCHAR U_4970 +ENCODING 18800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7200 +21C0 +FA80 +2FE0 +BAA0 +6FE0 +32A0 +C7E0 +ENDCHAR +STARTCHAR U_4971 +ENCODING 18801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +72C0 +2440 +FEC0 +2440 +B7E0 +6820 +3560 +C540 +ENDCHAR +STARTCHAR U_4972 +ENCODING 18802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F80 +8AE0 +7F20 +2880 +FF80 +2A80 +BF80 +6880 +3F40 +C220 +ENDCHAR +STARTCHAR U_4973 +ENCODING 18803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5200 +8FC0 +7540 +2FE0 +FA40 +2560 +BBC0 +6C40 +3380 +CC60 +ENDCHAR +STARTCHAR U_4974 +ENCODING 18804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8280 +7FE0 +2480 +FFE0 +2480 +B760 +65A0 +3420 +C460 +ENDCHAR +STARTCHAR U_4975 +ENCODING 18805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +BFE0 +1480 +F7E0 +5D40 +F7E0 +5540 +77E0 +DD40 +4140 +E260 +ENDCHAR +STARTCHAR U_4976 +ENCODING 18806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8FE0 +7540 +27E0 +FD40 +2FE0 +B440 +6560 +3940 +CFE0 +ENDCHAR +STARTCHAR U_4977 +ENCODING 18807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +6F20 +9A20 +70A0 +2EA0 +FAA0 +2EA0 +BA20 +6F20 +3A20 +D260 +ENDCHAR +STARTCHAR U_4978 +ENCODING 18808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +CFE0 +8D60 +EBA0 +2D60 +5F00 +E4E0 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4979 +ENCODING 18809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +8FA0 +72A0 +2740 +FAE0 +2A80 +B7E0 +6520 +3EE0 +C7E0 +ENDCHAR +STARTCHAR U_497A +ENCODING 18810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +7840 +8240 +7440 +27E0 +F8C0 +2140 +2640 +3040 +20C0 +ENDCHAR +STARTCHAR U_497B +ENCODING 18811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +7900 +8100 +7100 +27E0 +F900 +2180 +2280 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_497C +ENCODING 18812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +7FE0 +8AA0 +72A0 +22A0 +F2A0 +24A0 +2920 +3220 +20C0 +ENDCHAR +STARTCHAR U_497D +ENCODING 18813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7520 +8FE0 +7100 +2200 +FBC0 +2640 +2580 +2980 +3660 +ENDCHAR +STARTCHAR U_497E +ENCODING 18814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7200 +83E0 +F200 +23E0 +FA20 +2020 +2FE0 +3020 +20C0 +ENDCHAR +STARTCHAR U_497F +ENCODING 18815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7800 +8FE0 +F900 +49C0 +F940 +4940 +4A40 +6A40 +54C0 +ENDCHAR +STARTCHAR U_4980 +ENCODING 18816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7920 +85A0 +7360 +2120 +FB60 +25A0 +2120 +2920 +3360 +ENDCHAR +STARTCHAR U_4981 +ENCODING 18817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +42E0 +7FA0 +82A0 +77C0 +22A0 +FFA0 +22A0 +22E0 +2A80 +3480 +ENDCHAR +STARTCHAR U_4982 +ENCODING 18818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8FE0 +F800 +4FE0 +FDA0 +4B60 +4DA0 +5920 +6360 +ENDCHAR +STARTCHAR U_4983 +ENCODING 18819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8100 +F7E0 +4140 +F7E0 +4240 +4FC0 +5240 +63C0 +ENDCHAR +STARTCHAR U_4984 +ENCODING 18820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7540 +87C0 +F540 +47C0 +F120 +4FE0 +4540 +5C80 +6660 +ENDCHAR +STARTCHAR U_4985 +ENCODING 18821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +7FC0 +8100 +77C0 +2100 +FFE0 +2540 +2FE0 +3440 +27C0 +ENDCHAR +STARTCHAR U_4986 +ENCODING 18822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7EE0 +8AA0 +FFE0 +4480 +FFE0 +4480 +4FE0 +6240 +4FE0 +ENDCHAR +STARTCHAR U_4987 +ENCODING 18823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4240 +7A40 +4520 +7D20 +4200 +FBC0 +5040 +8840 +F840 +0180 +ENDCHAR +STARTCHAR U_4988 +ENCODING 18824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4100 +7FE0 +4100 +7900 +43E0 +FA80 +2280 +4A80 +FC80 +0BE0 +ENDCHAR +STARTCHAR U_4989 +ENCODING 18825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +8AA0 +EAA0 +8AA0 +EAA0 +8AA0 +FCE0 +4820 +9820 +FFE0 +8820 +ENDCHAR +STARTCHAR U_498A +ENCODING 18826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4100 +79C0 +4100 +7900 +47E0 +F900 +5340 +8D20 +F920 +0300 +ENDCHAR +STARTCHAR U_498B +ENCODING 18827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +9E80 +E5E0 +9EA0 +E4A0 +9EA0 +E8A0 +4E40 +8A40 +AAA0 +F720 +ENDCHAR +STARTCHAR U_498C +ENCODING 18828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_498D +ENCODING 18829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +9F20 +A020 +9C20 +8820 +9120 +9F60 +ENDCHAR +STARTCHAR U_498E +ENCODING 18830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F3E0 +9E20 +8020 +BF20 +8A20 +92A0 +A3A0 +ENDCHAR +STARTCHAR U_498F +ENCODING 18831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9B20 +EAE0 +8A20 +9220 +A260 +ENDCHAR +STARTCHAR U_4990 +ENCODING 18832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +9F20 +8420 +BFA0 +8420 +9C60 +ENDCHAR +STARTCHAR U_4991 +ENCODING 18833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9F20 +8520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_4992 +ENCODING 18834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8820 +9FA0 +E8A0 +8FE0 +ENDCHAR +STARTCHAR U_4993 +ENCODING 18835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8820 +8F20 +8820 +BF20 +A120 +BF60 +ENDCHAR +STARTCHAR U_4994 +ENCODING 18836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA60 +CAA0 +FBE0 +8020 +9F20 +9320 +9520 +9F20 +8020 +BFE0 +ENDCHAR +STARTCHAR U_4995 +ENCODING 18837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AB20 +CAA0 +FBE0 +9120 +8A20 +9F20 +8A20 +BFA0 +8A20 +92E0 +ENDCHAR +STARTCHAR U_4996 +ENCODING 18838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +BFA0 +8420 +9F20 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_4997 +ENCODING 18839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9020 +BFA0 +AAA0 +AAA0 +FFA0 +8060 +ENDCHAR +STARTCHAR U_4998 +ENCODING 18840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FFE0 +9120 +9F20 +9120 +9F20 +92A0 +9520 +98E0 +ENDCHAR +STARTCHAR U_4999 +ENCODING 18841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +9F20 +8420 +BFA0 +8220 +9F20 +8A20 +8660 +ENDCHAR +STARTCHAR U_499A +ENCODING 18842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA60 +CAA0 +F3E0 +9C20 +8420 +BFA0 +8420 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_499B +ENCODING 18843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8A20 +9F20 +8520 +BFA0 +8520 +9F20 +8420 +8C60 +ENDCHAR +STARTCHAR U_499C +ENCODING 18844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +9F20 +8920 +BFA0 +9120 +9F60 +ENDCHAR +STARTCHAR U_499D +ENCODING 18845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +8420 +9F20 +8420 +BFA0 +9B20 +AAA0 +9660 +ENDCHAR +STARTCHAR U_499E +ENCODING 18846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +9020 +8FA0 +B120 +87A0 +8920 +B7A0 +8060 +ENDCHAR +STARTCHAR U_499F +ENCODING 18847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +AEA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_49A0 +ENCODING 18848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +BE40 +9540 +AE40 +95C0 +AC40 +80C0 +ENDCHAR +STARTCHAR U_49A1 +ENCODING 18849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9A40 +FFC0 +A140 +9E40 +9240 +9F40 +9140 +9FC0 +ENDCHAR +STARTCHAR U_49A2 +ENCODING 18850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +A740 +D240 +AFC0 +E540 +AF40 +A0C0 +ENDCHAR +STARTCHAR U_49A3 +ENCODING 18851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +9F20 +8A20 +BFA0 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_49A4 +ENCODING 18852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8E20 +FBE0 +9120 +EEA0 +BBA0 +AAA0 +9120 +EAE0 +ENDCHAR +STARTCHAR U_49A5 +ENCODING 18853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +FFE0 +9120 +BBA0 +D560 +9160 +ENDCHAR +STARTCHAR U_49A6 +ENCODING 18854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +8E20 +9120 +AEA0 +8420 +BFA0 +9520 +BFE0 +ENDCHAR +STARTCHAR U_49A7 +ENCODING 18855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +F3E0 +9120 +9B20 +9120 +9F20 +8A20 +92A0 +A1E0 +ENDCHAR +STARTCHAR U_49A8 +ENCODING 18856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +BFA0 +9520 +9F20 +9520 +9F20 +9520 +ACE0 +ENDCHAR +STARTCHAR U_49A9 +ENCODING 18857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +9520 +9F20 +B120 +8E20 +F360 +ENDCHAR +STARTCHAR U_49AA +ENCODING 18858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9120 +9F20 +9120 +9FA0 +B4A0 +DAA0 +9FA0 +8160 +ENDCHAR +STARTCHAR U_49AB +ENCODING 18859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +9120 +FFE0 +9520 +BFA0 +A4A0 +FFE0 +9220 +E1A0 +ENDCHAR +STARTCHAR U_49AC +ENCODING 18860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +92A0 +BAA0 +92A0 +FCA0 +9520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_49AD +ENCODING 18861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +F3E0 +9C20 +8420 +BFA0 +9520 +E4E0 +9F20 +9520 +9F60 +ENDCHAR +STARTCHAR U_49AE +ENCODING 18862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8420 +9F20 +8820 +BFA0 +99A0 +EF60 +8920 +8F60 +ENDCHAR +STARTCHAR U_49AF +ENCODING 18863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8020 +FE20 +ABE0 +FEA0 +92A0 +B920 +92A0 +FC60 +ENDCHAR +STARTCHAR U_49B0 +ENCODING 18864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9220 +BF20 +9520 +9F20 +9520 +9F20 +9560 +8FE0 +ENDCHAR +STARTCHAR U_49B1 +ENCODING 18865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9520 +9E20 +9220 +9F20 +9120 +BFA0 +AAA0 +CB60 +ENDCHAR +STARTCHAR U_49B2 +ENCODING 18866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8A20 +9FE0 +B4A0 +9FE0 +9020 +97A0 +A4A0 +A7A0 +ENDCHAR +STARTCHAR U_49B3 +ENCODING 18867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8220 +9FE0 +A960 +BFA0 +A960 +BF60 +9BA0 +AD20 +ENDCHAR +STARTCHAR U_49B4 +ENCODING 18868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FFE0 +AAA0 +BFA0 +8420 +FFE0 +9120 +BFA0 +8460 +ENDCHAR +STARTCHAR U_49B5 +ENCODING 18869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8020 +BFA0 +9520 +BFA0 +EDE0 +B6A0 +ADA0 +B6A0 +ENDCHAR +STARTCHAR U_49B6 +ENCODING 18870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2420 +8F20 +9220 +9F20 +8520 +BFA0 +8520 +9F20 +8420 +8C60 +ENDCHAR +STARTCHAR U_49B7 +ENCODING 18871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8020 +9520 +9520 +AEA0 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_49B8 +ENCODING 18872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +5FE0 +4020 +9F20 +9520 +9F20 +9520 +BFA0 +A6A0 +BFA0 +A0E0 +ENDCHAR +STARTCHAR U_49B9 +ENCODING 18873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A100 +AFE0 +9100 +9100 +9100 +E100 +8100 +8100 +8100 +ENDCHAR +STARTCHAR U_49BA +ENCODING 18874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +A080 +A080 +9080 +9080 +D080 +A080 +8080 +8280 +8100 +ENDCHAR +STARTCHAR U_49BB +ENCODING 18875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A080 +A100 +9100 +9FE0 +D100 +A100 +8100 +8100 +8700 +ENDCHAR +STARTCHAR U_49BC +ENCODING 18876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +AFC0 +A240 +9240 +9240 +DFE0 +A300 +8480 +8840 +B020 +ENDCHAR +STARTCHAR U_49BD +ENCODING 18877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A280 +A100 +9FE0 +9120 +9100 +E100 +8100 +8100 +8300 +ENDCHAR +STARTCHAR U_49BE +ENCODING 18878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4280 +F440 +9FE0 +F480 +8480 +F480 +9480 +F4A0 +88A0 +10E0 +ENDCHAR +STARTCHAR U_49BF +ENCODING 18879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7E0 +A520 +9520 +97E0 +9100 +D100 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_49C0 +ENCODING 18880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +AFE0 +A200 +9400 +9500 +9500 +EA00 +8A80 +9440 +87C0 +ENDCHAR +STARTCHAR U_49C1 +ENCODING 18881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +9400 +A7E0 +A820 +97A0 +94A0 +94A0 +E7A0 +84A0 +8020 +80C0 +ENDCHAR +STARTCHAR U_49C2 +ENCODING 18882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +A220 +A220 +94A0 +9840 +D7E0 +A420 +8420 +87E0 +8420 +ENDCHAR +STARTCHAR U_49C3 +ENCODING 18883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +A4A0 +A4A0 +97E0 +94A0 +94A0 +D4A0 +A7E0 +8420 +8000 +ENDCHAR +STARTCHAR U_49C4 +ENCODING 18884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +A440 +AA80 +9380 +9C60 +9000 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49C5 +ENCODING 18885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +A7C0 +9140 +97C0 +9500 +D7E0 +A120 +82C0 +8C60 +ENDCHAR +STARTCHAR U_49C6 +ENCODING 18886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +A280 +AFE0 +9280 +9280 +DFE0 +A000 +8280 +8440 +8820 +ENDCHAR +STARTCHAR U_49C7 +ENCODING 18887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +A100 +9320 +9540 +9C80 +D480 +A440 +8540 +8620 +ENDCHAR +STARTCHAR U_49C8 +ENCODING 18888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +A280 +CFE0 +AAA0 +AAA0 +AAA0 +ACE0 +C820 +8FE0 +8820 +ENDCHAR +STARTCHAR U_49C9 +ENCODING 18889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +A540 +9540 +97C0 +9100 +D7C0 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_49CA +ENCODING 18890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9500 +A7C0 +A900 +9100 +9FE0 +9000 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49CB +ENCODING 18891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +A440 +97C0 +9440 +97C0 +D280 +A280 +84A0 +98E0 +ENDCHAR +STARTCHAR U_49CC +ENCODING 18892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9F20 +A520 +A4C0 +9200 +9240 +9FE0 +D440 +A480 +8380 +9C60 +ENDCHAR +STARTCHAR U_49CD +ENCODING 18893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9440 +A920 +A100 +9280 +9440 +9820 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49CE +ENCODING 18894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +A000 +97E0 +9420 +97E0 +D420 +A7E0 +8420 +8460 +ENDCHAR +STARTCHAR U_49CF +ENCODING 18895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A780 +A880 +D700 +AA80 +BFE0 +A200 +CF80 +8200 +9FC0 +8200 +ENDCHAR +STARTCHAR U_49D0 +ENCODING 18896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C440 +A7C0 +A000 +A7C0 +C080 +8FE0 +8080 +8380 +ENDCHAR +STARTCHAR U_49D1 +ENCODING 18897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +C7C0 +A100 +A100 +A5C0 +C500 +8B00 +8900 +90E0 +ENDCHAR +STARTCHAR U_49D2 +ENCODING 18898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A100 +C540 +A540 +ABA0 +A100 +C380 +8540 +8920 +8100 +ENDCHAR +STARTCHAR U_49D3 +ENCODING 18899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +ABA0 +C920 +ABA0 +A820 +ABA0 +CAA0 +8BA0 +8820 +9060 +ENDCHAR +STARTCHAR U_49D4 +ENCODING 18900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A500 +A880 +D240 +AFA0 +A080 +A100 +C200 +8940 +94A0 +97A0 +ENDCHAR +STARTCHAR U_49D5 +ENCODING 18901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +A0A0 +BFE0 +C080 +AE80 +AAA0 +AEA0 +C0C0 +8680 +9940 +8220 +ENDCHAR +STARTCHAR U_49D6 +ENCODING 18902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +AFC0 +A480 +C300 +A4C0 +A500 +AFC0 +C400 +8280 +8320 +8CE0 +ENDCHAR +STARTCHAR U_49D7 +ENCODING 18903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFE0 +B840 +CFC0 +A840 +AFC0 +A400 +CFC0 +9480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_49D8 +ENCODING 18904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A3C0 +A480 +CFE0 +A200 +AD20 +A2C0 +CD80 +82C0 +8CA0 +8300 +ENDCHAR +STARTCHAR U_49D9 +ENCODING 18905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AA40 +AFC0 +C200 +A700 +A880 +B260 +C200 +8B40 +92A0 +8600 +ENDCHAR +STARTCHAR U_49DA +ENCODING 18906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +C380 +A000 +AFE0 +A820 +CBA0 +8AA0 +8BA0 +8860 +ENDCHAR +STARTCHAR U_49DB +ENCODING 18907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +CFE0 +A920 +A7C0 +A200 +C3C0 +8240 +8440 +8980 +ENDCHAR +STARTCHAR U_49DC +ENCODING 18908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A940 +CFE0 +A940 +AFC0 +A900 +CFC0 +9440 +9440 +A7C0 +ENDCHAR +STARTCHAR U_49DD +ENCODING 18909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A7C0 +A100 +CFE0 +A100 +A7C0 +A540 +C7C0 +8100 +8140 +8FE0 +ENDCHAR +STARTCHAR U_49DE +ENCODING 18910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A900 +AFC0 +C900 +AFC0 +A900 +AFE0 +C020 +8AA0 +9520 +80C0 +ENDCHAR +STARTCHAR U_49DF +ENCODING 18911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE00 +A920 +C540 +A000 +A200 +ACE0 +C820 +8EE0 +8820 +8FE0 +ENDCHAR +STARTCHAR U_49E0 +ENCODING 18912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A540 +C7C0 +A540 +AFE0 +A080 +CFE0 +8480 +8080 +8180 +ENDCHAR +STARTCHAR U_49E1 +ENCODING 18913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A940 +CFE0 +A940 +AFE0 +AD20 +AFE0 +D520 +97E0 +A520 +ENDCHAR +STARTCHAR U_49E2 +ENCODING 18914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AB80 +CA80 +AB80 +A800 +AFC0 +AD40 +CFC0 +8800 +8FE0 +ENDCHAR +STARTCHAR U_49E3 +ENCODING 18915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +CAA0 +AFE0 +A000 +A7C0 +A000 +CFE0 +8540 +8920 +ENDCHAR +STARTCHAR U_49E4 +ENCODING 18916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +AFE0 +A440 +C280 +AFE0 +A100 +A7C0 +A100 +CFE0 +8280 +8C60 +ENDCHAR +STARTCHAR U_49E5 +ENCODING 18917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +BFC0 +AA80 +CF80 +AA80 +AF80 +A240 +DFA0 +8400 +9AC0 +AFA0 +ENDCHAR +STARTCHAR U_49E6 +ENCODING 18918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE00 +A540 +CFC0 +A480 +A7C0 +A840 +CFE0 +9020 +8AA0 +9540 +ENDCHAR +STARTCHAR U_49E7 +ENCODING 18919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +BFC0 +A200 +CF80 +A200 +BFC0 +A940 +DFE0 +8940 +BCA0 +8960 +ENDCHAR +STARTCHAR U_49E8 +ENCODING 18920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +A280 +AFE0 +C440 +AFE0 +A100 +A7C0 +A100 +CFE0 +8540 +8920 +ENDCHAR +STARTCHAR U_49E9 +ENCODING 18921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A280 +BEE0 +CB40 +AE40 +AB40 +AE80 +CA80 +8F40 +9A60 +8220 +ENDCHAR +STARTCHAR U_49EA +ENCODING 18922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFC0 +A900 +CFC0 +AA80 +AD40 +AA80 +AFE0 +CA80 +9380 +8440 +ENDCHAR +STARTCHAR U_49EB +ENCODING 18923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +CFE0 +A820 +A7C0 +A500 +CAC0 +8580 +8AC0 +8520 +ENDCHAR +STARTCHAR U_49EC +ENCODING 18924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A920 +C540 +A180 +A7C0 +AC40 +B7C0 +C440 +87C0 +8820 +ENDCHAR +STARTCHAR U_49ED +ENCODING 18925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFC0 +AA40 +CD40 +AAC0 +A940 +AFC0 +C400 +9B40 +A8A0 +8780 +ENDCHAR +STARTCHAR U_49EE +ENCODING 18926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A920 +C7C0 +A100 +AFE0 +A540 +A7C0 +C240 +9920 +97C0 +ENDCHAR +STARTCHAR U_49EF +ENCODING 18927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A900 +BFC0 +C900 +AFC0 +A500 +AF80 +DA80 +8F80 +8540 +99E0 +ENDCHAR +STARTCHAR U_49F0 +ENCODING 18928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E880 +BC80 +A540 +DFC0 +AA80 +BF40 +ABE0 +DE80 +95C0 +AAA0 +8080 +ENDCHAR +STARTCHAR U_49F1 +ENCODING 18929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +F7E0 +5C80 +57C0 +5480 +5480 +57C0 +5C80 +9480 +87E0 +ENDCHAR +STARTCHAR U_49F2 +ENCODING 18930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7240 +27E0 +2C80 +F480 +27E0 +2480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_49F3 +ENCODING 18931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2200 +A3E0 +BA40 +A640 +A3E0 +A240 +ABE0 +B240 +C240 +03E0 +ENDCHAR +STARTCHAR U_49F4 +ENCODING 18932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +FBE0 +2240 +2640 +FBE0 +0A40 +53E0 +2240 +5240 +8BE0 +ENDCHAR +STARTCHAR U_49F5 +ENCODING 18933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2200 +FBE0 +AE40 +2240 +33E0 +3240 +33E0 +5240 +5A40 +83E0 +ENDCHAR +STARTCHAR U_49F6 +ENCODING 18934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6100 +7FE0 +A100 +3FE0 +0400 +FFE0 +0000 +1080 +6040 +ENDCHAR +STARTCHAR U_49F7 +ENCODING 18935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4280 +F440 +9FE0 +6480 +67E0 +9480 +47E0 +2480 +4480 +27E0 +ENDCHAR +STARTCHAR U_49F8 +ENCODING 18936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +2440 +F7E0 +2C80 +27E0 +F480 +97E0 +9480 +9480 +F7E0 +ENDCHAR +STARTCHAR U_49F9 +ENCODING 18937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A80 +4A40 +57E0 +7C80 +57E0 +5480 +57E0 +5480 +97E0 +ENDCHAR +STARTCHAR U_49FA +ENCODING 18938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +F7E0 +2C80 +4480 +47E0 +F480 +57E0 +5480 +5480 +77E0 +ENDCHAR +STARTCHAR U_49FB +ENCODING 18939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +53E0 +8A40 +77E0 +0240 +73E0 +5240 +5240 +73E0 +ENDCHAR +STARTCHAR U_49FC +ENCODING 18940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A140 +FA20 +A3E0 +2640 +FBE0 +0240 +F3E0 +9240 +9240 +F3E0 +ENDCHAR +STARTCHAR U_49FD +ENCODING 18941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1940 +E120 +ABE0 +7640 +2240 +FBE0 +2240 +73E0 +6A40 +A240 +23E0 +ENDCHAR +STARTCHAR U_49FE +ENCODING 18942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +53E0 +8A40 +7640 +23E0 +FA40 +23E0 +7240 +5240 +73E0 +ENDCHAR +STARTCHAR U_49FF +ENCODING 18943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4920 +FDE0 +4B40 +FD40 +01E0 +7940 +49E0 +7940 +4940 +79E0 +ENDCHAR +STARTCHAR U_4A00 +ENCODING 18944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +5240 +8BE0 +2640 +ABE0 +2240 +FBE0 +7240 +ABE0 +2200 +ENDCHAR +STARTCHAR U_4A01 +ENCODING 18945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13E0 +FD40 +3480 +5360 +9200 +3FC0 +2200 +7FC0 +A200 +3FE0 +ENDCHAR +STARTCHAR U_4A02 +ENCODING 18946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +22A0 +FDC0 +3080 +6940 +A220 +7FE0 +A200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4A03 +ENCODING 18947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4940 +79E0 +4B40 +FD40 +A5E0 +2140 +FDE0 +4940 +3140 +CDE0 +ENDCHAR +STARTCHAR U_4A04 +ENCODING 18948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5540 +B9E0 +0B40 +FDE0 +2940 +DDE0 +B540 +CDE0 +B500 +ENDCHAR +STARTCHAR U_4A05 +ENCODING 18949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F940 +ABE0 +5640 +FA40 +53E0 +7240 +53E0 +7240 +AA40 +63E0 +ENDCHAR +STARTCHAR U_4A06 +ENCODING 18950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FA40 +AD40 +F880 +AB40 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4A07 +ENCODING 18951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7BC0 +5280 +7FE0 +0000 +FBE0 +4920 +30C0 +CB20 +ENDCHAR +STARTCHAR U_4A08 +ENCODING 18952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA40 +8FE0 +7280 +6A80 +B3E0 +5280 +F3E0 +5280 +7280 +8BE0 +ENDCHAR +STARTCHAR U_4A09 +ENCODING 18953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B540 +DDE0 +B740 +4940 +B5E0 +4940 +FDE0 +4940 +3140 +CDE0 +ENDCHAR +STARTCHAR U_4A0A +ENCODING 18954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FC0 +5100 +FFE0 +5140 +7FE0 +5140 +7DE0 +4920 +7FE0 +8920 +ENDCHAR +STARTCHAR U_4A0B +ENCODING 18955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2080 +3F80 +0400 +7FC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_4A0C +ENCODING 18956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2480 +7FC0 +0000 +FFC0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_4A0D +ENCODING 18957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2E80 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_4A0E +ENCODING 18958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +7A80 +0900 +7900 +4100 +7A00 +0A40 +33A0 +ENDCHAR +STARTCHAR U_4A0F +ENCODING 18959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +9540 +2480 +E7E0 +0920 +2180 +C240 +0420 +ENDCHAR +STARTCHAR U_4A10 +ENCODING 18960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5B40 +2080 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4A11 +ENCODING 18961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +0480 +7FC0 +4400 +FFE0 +0A20 +7160 +ENDCHAR +STARTCHAR U_4A12 +ENCODING 18962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +FBE0 +0820 +4920 +28A0 +DB60 +ENDCHAR +STARTCHAR U_4A13 +ENCODING 18963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +9520 +2480 +7FC0 +4040 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_4A14 +ENCODING 18964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9120 +2480 +1500 +7FC0 +0A00 +1220 +E3E0 +ENDCHAR +STARTCHAR U_4A15 +ENCODING 18965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +1480 +6000 +03C0 +C080 +07E0 +2080 +4180 +ENDCHAR +STARTCHAR U_4A16 +ENCODING 18966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +94A0 +0900 +7FE0 +1000 +2F80 +4880 +8F80 +0880 +ENDCHAR +STARTCHAR U_4A17 +ENCODING 18967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7F80 +2900 +7F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_4A18 +ENCODING 18968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +1F00 +1100 +1500 +1F00 +0A20 +73C0 +ENDCHAR +STARTCHAR U_4A19 +ENCODING 18969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +1480 +2520 +43C0 +A880 +57E0 +3080 +E7E0 +ENDCHAR +STARTCHAR U_4A1A +ENCODING 18970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +94A0 +A520 +1FC0 +2540 +4A80 +1500 +52A0 +8F80 +ENDCHAR +STARTCHAR U_4A1B +ENCODING 18971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +A4A0 +1500 +2040 +F7E0 +2400 +77E0 +A480 +2480 +ENDCHAR +STARTCHAR U_4A1C +ENCODING 18972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +8C40 +ENDCHAR +STARTCHAR U_4A1D +ENCODING 18973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +3F80 +0400 +FFE0 +2080 +3C80 +2780 +2080 +ENDCHAR +STARTCHAR U_4A1E +ENCODING 18974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +FFE0 +A4A0 +1500 +2080 +1F00 +3F80 +2480 +FFE0 +8520 +9F20 +ENDCHAR +STARTCHAR U_4A1F +ENCODING 18975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +8420 +37C0 +9100 +47E0 +9100 +57C0 +2100 +CFE0 +ENDCHAR +STARTCHAR U_4A20 +ENCODING 18976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +94A0 +3F00 +2900 +3FC0 +6440 +AA40 +3F40 +0080 +ENDCHAR +STARTCHAR U_4A21 +ENCODING 18977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9540 +3F80 +0200 +3580 +8E20 +B520 +8CA0 +FFE0 +ENDCHAR +STARTCHAR U_4A22 +ENCODING 18978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1100 +7FC0 +1500 +FFE0 +2500 +2880 +3FC0 +ENDCHAR +STARTCHAR U_4A23 +ENCODING 18979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1140 +7FC0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4A24 +ENCODING 18980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4480 +0200 +CF80 +4A80 +4F80 +6A80 +9FE0 +ENDCHAR +STARTCHAR U_4A25 +ENCODING 18981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +1200 +3FC0 +5200 +1FC0 +7100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_4A26 +ENCODING 18982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +FFE0 +A4A0 +7FC0 +1100 +FFE0 +8420 +7FC0 +1100 +2300 +ENDCHAR +STARTCHAR U_4A27 +ENCODING 18983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2180 +FE60 +5080 +57E0 +3A40 +C180 +ENDCHAR +STARTCHAR U_4A28 +ENCODING 18984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +CFA0 +2880 +EF80 +2800 +2FC0 +6840 +9FE0 +ENDCHAR +STARTCHAR U_4A29 +ENCODING 18985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +8420 +7480 +27E0 +FAA0 +13E0 +6AA0 +ABE0 +2080 +ENDCHAR +STARTCHAR U_4A2A +ENCODING 18986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +27C0 +2540 +F7C0 +2100 +37C0 +E100 +0FE0 +ENDCHAR +STARTCHAR U_4A2B +ENCODING 18987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +FFE0 +5540 +2480 +DF60 +2900 +0600 +7900 +ENDCHAR +STARTCHAR U_4A2C +ENCODING 18988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4880 +1DE0 +C880 +1DC0 +6AA0 +8880 +8880 +ENDCHAR +STARTCHAR U_4A2D +ENCODING 18989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +22A0 +FAA0 +A880 +FBE0 +AA20 +73E0 +0220 +FBE0 +5220 +FA60 +ENDCHAR +STARTCHAR U_4A2E +ENCODING 18990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +1100 +7BC0 +1140 +7FE0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_4A2F +ENCODING 18991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +EFE0 +A540 +C7C0 +A540 +A7C0 +C540 +9920 +ENDCHAR +STARTCHAR U_4A30 +ENCODING 18992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +0280 +6FC0 +0280 +C7C0 +1540 +EFE0 +4100 +ENDCHAR +STARTCHAR U_4A31 +ENCODING 18993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2800 +CFE0 +3540 +C7C0 +5A40 +4180 +4E60 +ENDCHAR +STARTCHAR U_4A32 +ENCODING 18994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +2140 +FA40 +ABE0 +FAA0 +22A0 +FBE0 +4080 +F960 +A940 +AA60 +ENDCHAR +STARTCHAR U_4A33 +ENCODING 18995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +52A0 +9CE0 +ENDCHAR +STARTCHAR U_4A34 +ENCODING 18996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +D440 +5BE0 +FC40 +4A40 +FD40 +1040 +FCC0 +ENDCHAR +STARTCHAR U_4A35 +ENCODING 18997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +92A0 +4FE0 +2AA0 +8FE0 +6540 +1540 +EFE0 +4100 +ENDCHAR +STARTCHAR U_4A36 +ENCODING 18998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2980 +5F40 +5540 +7FC0 +0A00 +FBC0 +4A40 +ENDCHAR +STARTCHAR U_4A37 +ENCODING 18999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4880 +FDC0 +4900 +FFC0 +4A40 +7980 +8E60 +ENDCHAR +STARTCHAR U_4A38 +ENCODING 19000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +EFE0 +5540 +6FE0 +5040 +57C0 +6540 +4BA0 +ENDCHAR +STARTCHAR U_4A39 +ENCODING 19001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2280 +5FE0 +D540 +57C0 +5100 +57C0 +4AA0 +ENDCHAR +STARTCHAR U_4A3A +ENCODING 19002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +7FE0 +1100 +FFE0 +AAA0 +7BE0 +5140 +FBA0 +ENDCHAR +STARTCHAR U_4A3B +ENCODING 19003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +2080 +FBE0 +AAA0 +71C0 +5140 +FBE0 +AAA0 +71C0 +5140 +71C0 +ENDCHAR +STARTCHAR U_4A3C +ENCODING 19004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FB60 +2140 +7BE0 +2280 +FFE0 +4A80 +7BE0 +4940 +7880 +8B60 +ENDCHAR +STARTCHAR U_4A3D +ENCODING 19005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1400 +F780 +1400 +F780 +1400 +FF80 +0100 +FF00 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_4A3E +ENCODING 19006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4500 +5DC0 +4500 +5DC0 +4500 +5DC0 +4500 +8900 +ENDCHAR +STARTCHAR U_4A3F +ENCODING 19007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0A00 +71C0 +9120 +71C0 +1100 +71C0 +1100 +61C0 +ENDCHAR +STARTCHAR U_4A40 +ENCODING 19008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FFE0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_4A41 +ENCODING 19009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +73C0 +1D00 +77C0 +1D00 +6600 +3DC0 +E700 +31C0 +E720 +3DE0 +ENDCHAR +STARTCHAR U_4A42 +ENCODING 19010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2140 +4220 +FE20 +ABC0 +BA00 +ABE0 +BA20 +AA40 +FE40 +8280 +ENDCHAR +STARTCHAR U_4A43 +ENCODING 19011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +2280 +4280 +FEA0 +ABC0 +BA80 +AA80 +BA80 +AA80 +FFA0 +82E0 +ENDCHAR +STARTCHAR U_4A44 +ENCODING 19012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +42A0 +FEA0 +AAA0 +BAA0 +AAA0 +BAA0 +AB40 +FD40 +8260 +ENDCHAR +STARTCHAR U_4A45 +ENCODING 19013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +42A0 +FE80 +AA80 +BBE0 +AAA0 +BAA0 +AA40 +FEA0 +8520 +ENDCHAR +STARTCHAR U_4A46 +ENCODING 19014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FE80 +11E0 +2280 +FE80 +AAE0 +BA80 +AA80 +BAE0 +AA80 +FE80 +ENDCHAR +STARTCHAR U_4A47 +ENCODING 19015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FE80 +20E0 +FE80 +AA80 +BBE0 +AA20 +BA20 +AA20 +FFE0 +8220 +ENDCHAR +STARTCHAR U_4A48 +ENCODING 19016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +4400 +FFC0 +AB40 +BAC0 +AFE0 +BA40 +ABE0 +FC40 +8180 +ENDCHAR +STARTCHAR U_4A49 +ENCODING 19017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCC0 +20A0 +43E0 +FE80 +ABE0 +BAA0 +ABE0 +BAA0 +ABE0 +FEA0 +82A0 +ENDCHAR +STARTCHAR U_4A4A +ENCODING 19018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +4220 +FE00 +ABE0 +BAA0 +ABA0 +BAE0 +AA80 +FFA0 +8260 +ENDCHAR +STARTCHAR U_4A4B +ENCODING 19019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +2FE0 +4A80 +FFE0 +AA80 +BA80 +AB80 +BEC0 +AAA0 +FE80 +9280 +ENDCHAR +STARTCHAR U_4A4C +ENCODING 19020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +43E0 +FE80 +ABC0 +BA80 +ABC0 +BA80 +ABE0 +FC00 +85A0 +ENDCHAR +STARTCHAR U_4A4D +ENCODING 19021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2A40 +4420 +FFC0 +AA40 +BBC0 +AA40 +BBC0 +AAA0 +FCA0 +ENDCHAR +STARTCHAR U_4A4E +ENCODING 19022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +4FE0 +F800 +AFE0 +D920 +AFE0 +AA40 +FA40 +05A0 +ENDCHAR +STARTCHAR U_4A4F +ENCODING 19023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +27E0 +4140 +FBE0 +AAA0 +BBE0 +A840 +BBE0 +AA40 +ABE0 +FCA0 +ENDCHAR +STARTCHAR U_4A50 +ENCODING 19024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F9E0 +5200 +2400 +FBE0 +A820 +F840 +2080 +F900 +2220 +23E0 +ENDCHAR +STARTCHAR U_4A51 +ENCODING 19025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +FBE0 +5020 +73E0 +2200 +FA00 +ABE0 +F820 +2020 +FA20 +21C0 +ENDCHAR +STARTCHAR U_4A52 +ENCODING 19026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBE0 +5080 +7080 +2080 +FFE0 +A880 +F880 +2080 +F880 +2180 +ENDCHAR +STARTCHAR U_4A53 +ENCODING 19027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +53E0 +7420 +2120 +F920 +AA20 +FAA0 +27A0 +F820 +20C0 +ENDCHAR +STARTCHAR U_4A54 +ENCODING 19028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29C0 +FD40 +2940 +3960 +1200 +7FE0 +5540 +7D40 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_4A55 +ENCODING 19029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F900 +72E0 +22A0 +FAA0 +AAA0 +FAA0 +23A0 +FAE0 +20A0 +2080 +ENDCHAR +STARTCHAR U_4A56 +ENCODING 19030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +52A0 +72A0 +22A0 +FA80 +ACA0 +F840 +2080 +F900 +2600 +ENDCHAR +STARTCHAR U_4A57 +ENCODING 19031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F9E0 +5120 +7120 +21E0 +F920 +A920 +F9E0 +2120 +FA20 +2460 +ENDCHAR +STARTCHAR U_4A58 +ENCODING 19032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBE0 +5080 +7100 +2240 +FE80 +AB00 +F940 +2240 +FEE0 +2720 +ENDCHAR +STARTCHAR U_4A59 +ENCODING 19033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +57E0 +7080 +2100 +FA40 +AC80 +FB40 +2240 +FDE0 +2620 +ENDCHAR +STARTCHAR U_4A5A +ENCODING 19034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FB80 +5280 +7280 +2280 +FBE0 +AA80 +FA80 +22A0 +FB60 +22A0 +ENDCHAR +STARTCHAR U_4A5B +ENCODING 19035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F8A0 +5020 +7140 +2140 +FB40 +ADC0 +F9A0 +2100 +FB20 +25E0 +ENDCHAR +STARTCHAR U_4A5C +ENCODING 19036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +73E0 +22A0 +FAA0 +ABE0 +FAA0 +22A0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_4A5D +ENCODING 19037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +FFC0 +5540 +7540 +2540 +FD40 +A940 +F940 +2AA0 +FBA0 +2820 +ENDCHAR +STARTCHAR U_4A5E +ENCODING 19038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +70E0 +2080 +F880 +ABE0 +FA20 +2220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4A5F +ENCODING 19039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5080 +73E0 +20A0 +FBE0 +AA80 +FBE0 +20A0 +F940 +2620 +ENDCHAR +STARTCHAR U_4A60 +ENCODING 19040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F820 +5740 +71C0 +2240 +FBE0 +A940 +FEE0 +2300 +FC80 +2460 +ENDCHAR +STARTCHAR U_4A61 +ENCODING 19041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +F920 +57E0 +7100 +2540 +FB40 +A9A0 +F900 +2280 +FA40 +2420 +ENDCHAR +STARTCHAR U_4A62 +ENCODING 19042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FA60 +5280 +7F80 +22E0 +FAA0 +ABA0 +FEA0 +22A0 +FAA0 +24A0 +ENDCHAR +STARTCHAR U_4A63 +ENCODING 19043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5140 +2220 +FDC0 +A880 +FBE0 +2080 +FAC0 +24A0 +2180 +ENDCHAR +STARTCHAR U_4A64 +ENCODING 19044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5240 +73C0 +2240 +FBC0 +AA40 +FBC0 +2180 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A65 +ENCODING 19045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F8E0 +5740 +2140 +FA60 +AF40 +F940 +2540 +F3E0 +2500 +28E0 +ENDCHAR +STARTCHAR U_4A66 +ENCODING 19046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +D680 +5180 +4740 +5100 +7FC0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4A67 +ENCODING 19047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +57E0 +7000 +23C0 +F800 +ABC0 +F800 +23C0 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4A68 +ENCODING 19048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA00 +53C0 +7200 +23C0 +FA00 +AFE0 +FAA0 +22C0 +FB40 +2220 +ENDCHAR +STARTCHAR U_4A69 +ENCODING 19049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +7200 +23E0 +FDA0 +ABA0 +F9E0 +2280 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A6A +ENCODING 19050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +73C0 +2240 +FBC0 +AA00 +FBC0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4A6B +ENCODING 19051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +F880 +53E0 +72A0 +FAA0 +ABE0 +FBE0 +22A0 +FAA0 +22A0 +2220 +ENDCHAR +STARTCHAR U_4A6C +ENCODING 19052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5080 +73C0 +F900 +AFE0 +FAA0 +25C0 +F880 +23E0 +2080 +ENDCHAR +STARTCHAR U_4A6D +ENCODING 19053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F7E0 +5180 +7240 +27E0 +F840 +ABC0 +FAC0 +23C0 +F840 +20C0 +ENDCHAR +STARTCHAR U_4A6E +ENCODING 19054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FFC0 +5440 +7780 +2080 +FFE0 +B520 +F3C0 +2540 +F920 +2300 +ENDCHAR +STARTCHAR U_4A6F +ENCODING 19055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +57E0 +F900 +5200 +FAE0 +A9A0 +FB40 +21A0 +FAA0 +2000 +27E0 +ENDCHAR +STARTCHAR U_4A70 +ENCODING 19056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7000 +27E0 +FAC0 +AB40 +FAC0 +2340 +FFE0 +2040 +ENDCHAR +STARTCHAR U_4A71 +ENCODING 19057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FA80 +5440 +7BA0 +2000 +FF20 +ADA0 +FFA0 +25A0 +FF20 +2560 +ENDCHAR +STARTCHAR U_4A72 +ENCODING 19058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5540 +77E0 +FD40 +ADC0 +FC00 +27C0 +FD40 +2480 +2B60 +ENDCHAR +STARTCHAR U_4A73 +ENCODING 19059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +7480 +23C0 +F940 +AA20 +F9C0 +2140 +F880 +2140 +ENDCHAR +STARTCHAR U_4A74 +ENCODING 19060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FAE0 +57A0 +72A0 +22E0 +FFA0 +ADA0 +FDE0 +27A0 +F920 +2260 +ENDCHAR +STARTCHAR U_4A75 +ENCODING 19061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +5080 +73E0 +22A0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4A76 +ENCODING 19062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAA0 +53E0 +7080 +27E0 +F880 +ABE0 +FAA0 +23E0 +F8A0 +23E0 +ENDCHAR +STARTCHAR U_4A77 +ENCODING 19063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5240 +77E0 +24A0 +FFE0 +A900 +F9E0 +2220 +FA20 +24C0 +ENDCHAR +STARTCHAR U_4A78 +ENCODING 19064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +77E0 +2240 +FBC0 +AA40 +FBC0 +2240 +FFE0 +2040 +ENDCHAR +STARTCHAR U_4A79 +ENCODING 19065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F800 +53C0 +7240 +23C0 +F800 +AFE0 +FD60 +27E0 +FCA0 +24A0 +ENDCHAR +STARTCHAR U_4A7A +ENCODING 19066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FA40 +5520 +7A80 +27C0 +F800 +AFE0 +FDA0 +2360 +FDA0 +2360 +ENDCHAR +STARTCHAR U_4A7B +ENCODING 19067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FE80 +53C0 +7280 +23C0 +FA80 +ABE0 +F820 +22A0 +FD20 +20C0 +ENDCHAR +STARTCHAR U_4A7C +ENCODING 19068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FAC0 +5120 +76C0 +23A0 +FC40 +AAE0 +FA40 +22E0 +FE40 +21E0 +ENDCHAR +STARTCHAR U_4A7D +ENCODING 19069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FC00 +55C0 +7540 +25C0 +FC00 +AFE0 +FEA0 +27E0 +FC00 +27E0 +ENDCHAR +STARTCHAR U_4A7E +ENCODING 19070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5400 +7540 +27E0 +FD40 +AD40 +FDC0 +2400 +F940 +2AA0 +ENDCHAR +STARTCHAR U_4A7F +ENCODING 19071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5540 +7FE0 +2440 +FFC0 +AC40 +FFC0 +2440 +FFC0 +2C60 +ENDCHAR +STARTCHAR U_4A80 +ENCODING 19072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +73C0 +2240 +FBE0 +AA20 +FBE0 +2520 +F440 +2BC0 +ENDCHAR +STARTCHAR U_4A81 +ENCODING 19073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAC0 +57E0 +7280 +27E0 +F900 +ABC0 +F900 +27E0 +FA80 +2460 +ENDCHAR +STARTCHAR U_4A82 +ENCODING 19074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7280 +2FE0 +FAA0 +AAA0 +FBA0 +26C0 +FAA0 +2280 +ENDCHAR +STARTCHAR U_4A83 +ENCODING 19075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFC0 +5040 +7760 +2580 +FF20 +A8A0 +FFA0 +2240 +FDA0 +2320 +ENDCHAR +STARTCHAR U_4A84 +ENCODING 19076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FBE0 +5140 +77E0 +2080 +FBE0 +AAA0 +FBE0 +22A0 +FBE0 +2620 +ENDCHAR +STARTCHAR U_4A85 +ENCODING 19077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FD20 +57E0 +7200 +23E0 +FD20 +ABA0 +FAA0 +23A0 +F920 +2360 +ENDCHAR +STARTCHAR U_4A86 +ENCODING 19078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +52A0 +7FE0 +2AA0 +FFE0 +AA40 +FA40 +23C0 +F940 +27E0 +ENDCHAR +STARTCHAR U_4A87 +ENCODING 19079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +2120 +FFE0 +A540 +FFC0 +2540 +FFE0 +2240 +20C0 +ENDCHAR +STARTCHAR U_4A88 +ENCODING 19080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FAE0 +56A0 +72E0 +2440 +FAE0 +AAA0 +FAA0 +26E0 +FA00 +21E0 +ENDCHAR +STARTCHAR U_4A89 +ENCODING 19081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FD40 +52A0 +7FE0 +2920 +FAA0 +AFE0 +F940 +2DC0 +FB40 +2DA0 +ENDCHAR +STARTCHAR U_4A8A +ENCODING 19082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54E0 +FF80 +52E0 +7F20 +2AE0 +FA80 +AEE0 +FA80 +2EE0 +FA80 +2AE0 +ENDCHAR +STARTCHAR U_4A8B +ENCODING 19083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +56A0 +73E0 +2080 +FFE0 +AAC0 +FB40 +2BC0 +FE20 +21E0 +ENDCHAR +STARTCHAR U_4A8C +ENCODING 19084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FC80 +57E0 +7420 +27E0 +FA40 +ABE0 +FD20 +27C0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A8D +ENCODING 19085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +4EE0 +7AA0 +2FE0 +F920 +AFE0 +FAA0 +2BA0 +FD60 +2920 +ENDCHAR +STARTCHAR U_4A8E +ENCODING 19086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54A0 +FFE0 +5240 +77E0 +2240 +FBE0 +AA40 +FFE0 +25A0 +FE60 +25A0 +ENDCHAR +STARTCHAR U_4A8F +ENCODING 19087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +2BE0 +FEA0 +8AA0 +FAA0 +22A0 +FB60 +A220 +FA20 +2260 +ENDCHAR +STARTCHAR U_4A90 +ENCODING 19088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F0A0 +5220 +FA40 +5240 +7660 +2AA0 +7280 +A2A0 +F920 +26C0 +ENDCHAR +STARTCHAR U_4A91 +ENCODING 19089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +2BE0 +FC20 +3000 +4A40 +3240 +7A80 +5320 +FE20 +13C0 +ENDCHAR +STARTCHAR U_4A92 +ENCODING 19090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +2BE0 +FC80 +0080 +7BE0 +4880 +7880 +5080 +FC80 +13E0 +ENDCHAR +STARTCHAR U_4A93 +ENCODING 19091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +48E0 +FC80 +0080 +7880 +4BE0 +FA20 +A220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4A94 +ENCODING 19092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78A0 +4BE0 +F880 +03E0 +7AA0 +4BE0 +FAA0 +A3E0 +FAA0 +22A0 +ENDCHAR +STARTCHAR U_4A95 +ENCODING 19093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +4BE0 +FD20 +03A0 +7920 +4BE0 +F920 +A3A0 +F920 +2060 +ENDCHAR +STARTCHAR U_4A96 +ENCODING 19094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +2B20 +FDE0 +0120 +79E0 +4900 +7BE0 +5140 +FC80 +1360 +ENDCHAR +STARTCHAR U_4A97 +ENCODING 19095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F760 +5520 +FF60 +5400 +76E0 +24A0 +F6A0 +A440 +F4A0 +2520 +ENDCHAR +STARTCHAR U_4A98 +ENCODING 19096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2BE0 +FE20 +4BE0 +7800 +23E0 +F880 +A2E0 +FA80 +25E0 +ENDCHAR +STARTCHAR U_4A99 +ENCODING 19097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +2880 +FFE0 +02A0 +7BE0 +4AA0 +7840 +13E0 +FD40 +10C0 +ENDCHAR +STARTCHAR U_4A9A +ENCODING 19098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2BC0 +FA40 +4BC0 +7800 +27E0 +FDA0 +A360 +FDA0 +2360 +ENDCHAR +STARTCHAR U_4A9B +ENCODING 19099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2AA0 +FFE0 +49C0 +7AA0 +23E0 +FAA0 +A3E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_4A9C +ENCODING 19100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7BE0 +2EA0 +FB40 +4BE0 +7A00 +13E0 +FA00 +55E0 +F920 +11E0 +ENDCHAR +STARTCHAR U_4A9D +ENCODING 19101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +F7E0 +5240 +FBE0 +5680 +73E0 +2280 +77E0 +A240 +F180 +2660 +ENDCHAR +STARTCHAR U_4A9E +ENCODING 19102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +7FC0 +0A00 +3180 +CA60 +3B80 +0A00 +3B80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4A9F +ENCODING 19103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FA80 +2100 +FEE0 +AA80 +AEC0 +AA80 +BEC0 +2280 +27E0 +ENDCHAR +STARTCHAR U_4AA0 +ENCODING 19104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +92A0 +FC80 +5560 +9200 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4AA1 +ENCODING 19105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F5E0 +A2A0 +FC80 +6B60 +A000 +79C0 +0900 +79C0 +0900 +FFE0 +ENDCHAR +STARTCHAR U_4AA2 +ENCODING 19106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +35E0 +E0A0 +A540 +A220 +F940 +2B60 +2940 +6B60 +A140 +23E0 +ENDCHAR +STARTCHAR U_4AA3 +ENCODING 19107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +22A0 +FC80 +A940 +A940 +BF60 +2140 +6760 +A140 +27E0 +ENDCHAR +STARTCHAR U_4AA4 +ENCODING 19108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +5F80 +D540 +5FE0 +D380 +5540 +5FE0 +D540 +5FC0 +7540 +C7C0 +ENDCHAR +STARTCHAR U_4AA5 +ENCODING 19109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3A20 +2140 +F880 +8B60 +7140 +5360 +7140 +5360 +7140 +8BE0 +ENDCHAR +STARTCHAR U_4AA6 +ENCODING 19110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +4880 +3080 +FC80 +0080 +7880 +4880 +7880 +4880 +7BE0 +ENDCHAR +STARTCHAR U_4AA7 +ENCODING 19111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4A80 +32E0 +FFA0 +02A0 +7AE0 +4A80 +7A20 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_4AA8 +ENCODING 19112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +4BE0 +3220 +FC20 +0120 +78A0 +48A0 +7820 +4820 +78C0 +ENDCHAR +STARTCHAR U_4AA9 +ENCODING 19113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +5140 +5220 +FD00 +0080 +FBE0 +8820 +F840 +8840 +F880 +ENDCHAR +STARTCHAR U_4AAA +ENCODING 19114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FDE0 +2520 +C9E0 +0400 +3FC0 +0900 +FFE0 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_4AAB +ENCODING 19115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +52A0 +2140 +FBE0 +0000 +FBE0 +8880 +F880 +8880 +FBE0 +ENDCHAR +STARTCHAR U_4AAC +ENCODING 19116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5080 +57E0 +FC20 +03C0 +7040 +5080 +77E0 +5080 +7180 +ENDCHAR +STARTCHAR U_4AAD +ENCODING 19117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +5240 +2180 +FFE0 +0000 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_4AAE +ENCODING 19118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +9520 +63A0 +F960 +0200 +F3E0 +9520 +F7E0 +9120 +F260 +ENDCHAR +STARTCHAR U_4AAF +ENCODING 19119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +5140 +7FE0 +8420 +7FC0 +1100 +FFE0 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_4AB0 +ENCODING 19120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +9440 +6280 +FFE0 +0440 +F7C0 +9440 +F7C0 +9D60 +F3C0 +ENDCHAR +STARTCHAR U_4AB1 +ENCODING 19121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0900 +0BE0 +0A20 +FBE0 +8220 +8BE0 +9220 +A3E0 +C140 +8220 +ENDCHAR +STARTCHAR U_4AB2 +ENCODING 19122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FD00 +53E0 +5220 +53E0 +5220 +53E0 +5620 +5BE0 +9140 +8220 +ENDCHAR +STARTCHAR U_4AB3 +ENCODING 19123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2900 +FFE0 +2A20 +2BE0 +7A20 +23E0 +2220 +43E0 +4140 +8220 +ENDCHAR +STARTCHAR U_4AB4 +ENCODING 19124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +ABC0 +AA40 +23C0 +3240 +33C0 +5240 +57C0 +5A40 +9420 +ENDCHAR +STARTCHAR U_4AB5 +ENCODING 19125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +53E0 +9220 +FBE0 +3220 +53E0 +5220 +53E0 +9140 +3220 +ENDCHAR +STARTCHAR U_4AB6 +ENCODING 19126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +7880 +4BE0 +7A20 +4BE0 +4A20 +7BE0 +4A20 +5FE0 +E140 +0220 +ENDCHAR +STARTCHAR U_4AB7 +ENCODING 19127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7C80 +45E0 +F520 +55E0 +5520 +55E0 +7520 +05E0 +04C0 +1920 +ENDCHAR +STARTCHAR U_4AB8 +ENCODING 19128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +8BE0 +FA20 +A3E0 +A220 +FBE0 +A220 +93E0 +D540 +8A20 +ENDCHAR +STARTCHAR U_4AB9 +ENCODING 19129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FBE0 +2080 +73E0 +AA20 +ABE0 +A220 +23E0 +0140 +F940 +0220 +ENDCHAR +STARTCHAR U_4ABA +ENCODING 19130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2100 +FBE0 +2220 +23E0 +FA20 +23E0 +4A20 +9BE0 +E940 +0220 +ENDCHAR +STARTCHAR U_4ABB +ENCODING 19131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +47C0 +5200 +EFC0 +0440 +5740 +FC40 +5740 +5540 +9280 +1440 +ENDCHAR +STARTCHAR U_4ABC +ENCODING 19132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +A900 +ABC0 +FA40 +23C0 +AA40 +ABC0 +AA40 +FBC0 +0420 +ENDCHAR +STARTCHAR U_4ABD +ENCODING 19133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +0220 +FFE0 +2220 +7BE0 +0A20 +0BE0 +0940 +3220 +ENDCHAR +STARTCHAR U_4ABE +ENCODING 19134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +FAC0 +8C20 +F880 +8B00 +F840 +8980 +FA20 +50C0 +8B00 +ENDCHAR +STARTCHAR U_4ABF +ENCODING 19135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2080 +FBE0 +8A20 +DBE0 +AA20 +ABE0 +DA20 +8BE0 +F940 +0220 +ENDCHAR +STARTCHAR U_4AC0 +ENCODING 19136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +8BE0 +FA20 +8BE0 +8A20 +FBE0 +8220 +ABE0 +9140 +CA20 +ENDCHAR +STARTCHAR U_4AC1 +ENCODING 19137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +4080 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8940 +0220 +ENDCHAR +STARTCHAR U_4AC2 +ENCODING 19138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7880 +93E0 +6220 +53E0 +9A20 +27E0 +5A20 +13E0 +6140 +8220 +ENDCHAR +STARTCHAR U_4AC3 +ENCODING 19139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8080 +F3E0 +8220 +F3E0 +A220 +ABE0 +B220 +ABE0 +A540 +B220 +ENDCHAR +STARTCHAR U_4AC4 +ENCODING 19140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5080 +0100 +FBE0 +8A20 +8BA0 +FAE0 +5220 +53E0 +5940 +9220 +ENDCHAR +STARTCHAR U_4AC5 +ENCODING 19141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +8BE0 +2220 +FBE0 +2220 +73E0 +6A20 +ABE0 +2140 +2220 +ENDCHAR +STARTCHAR U_4AC6 +ENCODING 19142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +0A80 +7DE0 +4920 +4BE0 +7520 +55E0 +5520 +75E0 +8AC0 +8320 +ENDCHAR +STARTCHAR U_4AC7 +ENCODING 19143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0900 +F3E0 +0A20 +F3E0 +6220 +93E0 +FA20 +93E0 +F940 +9220 +ENDCHAR +STARTCHAR U_4AC8 +ENCODING 19144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +FBE0 +5220 +8BE0 +7220 +03E0 +FA20 +13E0 +1140 +2220 +ENDCHAR +STARTCHAR U_4AC9 +ENCODING 19145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +A880 +53E0 +2220 +D3E0 +2A20 +5BE0 +2A20 +CBE0 +3140 +1220 +ENDCHAR +STARTCHAR U_4ACA +ENCODING 19146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +23E0 +7220 +ABE0 +2220 +FBE0 +8A20 +8BE0 +F940 +8A20 +ENDCHAR +STARTCHAR U_4ACB +ENCODING 19147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +2100 +FBC0 +7240 +ABC0 +2240 +FBC0 +5240 +93C0 +7240 +8C20 +ENDCHAR +STARTCHAR U_4ACC +ENCODING 19148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F900 +ABE0 +FA20 +ABE0 +FA20 +43E0 +A220 +FBE0 +2140 +2220 +ENDCHAR +STARTCHAR U_4ACD +ENCODING 19149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2900 +EFE0 +2A20 +6FE0 +2A20 +6FE0 +AA20 +2BE0 +4940 +8A20 +ENDCHAR +STARTCHAR U_4ACE +ENCODING 19150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B480 +49E0 +4920 +B5E0 +0120 +FDE0 +B520 +49E0 +48C0 +B520 +ENDCHAR +STARTCHAR U_4ACF +ENCODING 19151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +4BE0 +7A20 +4BE0 +7A20 +4BE0 +FE20 +4BE0 +4940 +8620 +ENDCHAR +STARTCHAR U_4AD0 +ENCODING 19152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4900 +FFE0 +4A20 +7BE0 +DE20 +DBE0 +6A20 +6BE0 +4940 +4A20 +ENDCHAR +STARTCHAR U_4AD1 +ENCODING 19153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +5220 +FFE0 +0A20 +EBE0 +AA20 +EBE0 +0940 +1A20 +ENDCHAR +STARTCHAR U_4AD2 +ENCODING 19154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A100 +FBE0 +A220 +97E0 +CA20 +FBE0 +8A20 +FBE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4AD3 +ENCODING 19155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2100 +FBE0 +4A20 +53E0 +FA20 +03E0 +FA20 +8BE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4AD4 +ENCODING 19156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FC80 +55E0 +F620 +47E0 +EA20 +53E0 +FE20 +11E0 +2940 +C620 +ENDCHAR +STARTCHAR U_4AD5 +ENCODING 19157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +53E0 +5220 +FFE0 +A620 +7BE0 +AA20 +ABE0 +B940 +2220 +ENDCHAR +STARTCHAR U_4AD6 +ENCODING 19158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FC80 +49E0 +7920 +49E0 +7920 +49E0 +FD20 +A9E0 +C4C0 +FD20 +ENDCHAR +STARTCHAR U_4AD7 +ENCODING 19159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDE0 +A480 +A7E0 +EA20 +83E0 +EE20 +8BE0 +EA20 +8BE0 +8540 +9A20 +ENDCHAR +STARTCHAR U_4AD8 +ENCODING 19160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +79E0 +4920 +79E0 +4120 +BDE0 +5520 +6DE0 +74C0 +0920 +ENDCHAR +STARTCHAR U_4AD9 +ENCODING 19161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +5220 +FBE0 +5220 +23E0 +FA20 +73E0 +B140 +AA20 +ENDCHAR +STARTCHAR U_4ADA +ENCODING 19162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +75E0 +5520 +55E0 +FD20 +85E0 +BD20 +ADE0 +BCC0 +8520 +ENDCHAR +STARTCHAR U_4ADB +ENCODING 19163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +3C80 +45E0 +7F20 +D1E0 +5D20 +69E0 +7F20 +49E0 +54C0 +6320 +ENDCHAR +STARTCHAR U_4ADC +ENCODING 19164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +A880 +BBE0 +EA20 +BBE0 +AA20 +EBE0 +BA20 +ABE0 +F940 +8A20 +ENDCHAR +STARTCHAR U_4ADD +ENCODING 19165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E100 +23E0 +FA20 +73E0 +AA20 +FBE0 +8A20 +FBE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4ADE +ENCODING 19166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5080 +FBE0 +2220 +FBE0 +2220 +23E0 +FA20 +03E0 +A940 +AA20 +ENDCHAR +STARTCHAR U_4ADF +ENCODING 19167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4900 +7BE0 +0220 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +5140 +8A20 +ENDCHAR +STARTCHAR U_4AE0 +ENCODING 19168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +5080 +ABE0 +5220 +FFE0 +2220 +7BE0 +A620 +7BE0 +4940 +7A20 +ENDCHAR +STARTCHAR U_4AE1 +ENCODING 19169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +FC80 +51E0 +FD20 +55E0 +FF20 +55E0 +FD20 +51E0 +D8C0 +D520 +ENDCHAR +STARTCHAR U_4AE2 +ENCODING 19170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9080 +BFE0 +AA20 +BDE0 +A920 +ADE0 +A120 +ADE0 +5480 +A720 +ENDCHAR +STARTCHAR U_4AE3 +ENCODING 19171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +C900 +ABE0 +5220 +9BE0 +7220 +8BE0 +7620 +23E0 +FD40 +4A20 +ENDCHAR +STARTCHAR U_4AE4 +ENCODING 19172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4240 +BDE0 +3520 +2DA0 +3D60 +1120 +7DE0 +1040 +28C0 +4520 +ENDCHAR +STARTCHAR U_4AE5 +ENCODING 19173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F900 +ABC0 +FA40 +ABC0 +FA40 +2BC0 +7640 +6BC0 +A420 +9FE0 +ENDCHAR +STARTCHAR U_4AE6 +ENCODING 19174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +23E0 +FE20 +23E0 +4A20 +FFE0 +0220 +FFE0 +AB40 +FE20 +ENDCHAR +STARTCHAR U_4AE7 +ENCODING 19175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +8BE0 +FA20 +8BE0 +FA20 +23E0 +DA20 +ABE0 +F940 +2220 +ENDCHAR +STARTCHAR U_4AE8 +ENCODING 19176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +F440 +27E0 +F5A0 +29E0 +F5A0 +42E0 +72A0 +55E0 +94A0 +B920 +ENDCHAR +STARTCHAR U_4AE9 +ENCODING 19177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7880 +49E0 +9520 +FFE0 +5520 +A9E0 +1520 +61E0 +08C0 +7120 +ENDCHAR +STARTCHAR U_4AEA +ENCODING 19178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FE80 +11E0 +BB20 +55E0 +BB20 +55E0 +BB20 +11E0 +2880 +C520 +ENDCHAR +STARTCHAR U_4AEB +ENCODING 19179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +ABC0 +FE40 +ABC0 +FA40 +ABC0 +FA40 +53C0 +7140 +CA20 +ENDCHAR +STARTCHAR U_4AEC +ENCODING 19180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +A880 +FFE0 +5520 +B7E0 +2520 +79E0 +4920 +79E0 +4880 +7920 +ENDCHAR +STARTCHAR U_4AED +ENCODING 19181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7C80 +55E0 +FF20 +01E0 +7D20 +45E0 +5520 +55E0 +2880 +4520 +ENDCHAR +STARTCHAR U_4AEE +ENCODING 19182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +0880 +FFE0 +0920 +F5E0 +5520 +EDE0 +0920 +FFE0 +4880 +1920 +ENDCHAR +STARTCHAR U_4AEF +ENCODING 19183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +2F40 +F4E0 +4AA0 +7FE0 +52A0 +5EE0 +5AA0 +5EE0 +9240 +B6A0 +ENDCHAR +STARTCHAR U_4AF0 +ENCODING 19184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +4540 +FFE0 +9540 +F920 +9540 +F7E0 +9940 +F5E0 +5240 +9440 +ENDCHAR +STARTCHAR U_4AF1 +ENCODING 19185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +2040 +FEE0 +AAA0 +AAE0 +00A0 +FEE0 +20A0 +FEE0 +AA40 +AAA0 +ENDCHAR +STARTCHAR U_4AF2 +ENCODING 19186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +7E80 +51E0 +7920 +4BE0 +7520 +D5E0 +7B20 +29E0 +A2A0 +9F20 +ENDCHAR +STARTCHAR U_4AF3 +ENCODING 19187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +FFE0 +4120 +7FE0 +9120 +7DE0 +5520 +7DE0 +14C0 +7B20 +ENDCHAR +STARTCHAR U_4AF4 +ENCODING 19188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FE80 +75E0 +AF20 +25E0 +7D20 +01E0 +FF20 +39E0 +5540 +9220 +ENDCHAR +STARTCHAR U_4AF5 +ENCODING 19189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +A5E0 +FD20 +11E0 +FD20 +ABE0 +4520 +FDE0 +48A0 +9920 +ENDCHAR +STARTCHAR U_4AF6 +ENCODING 19190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +EF40 +52E0 +6BA0 +CEE0 +52A0 +6AE0 +10A0 +FEE0 +2840 +C5A0 +ENDCHAR +STARTCHAR U_4AF7 +ENCODING 19191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2080 +F9E0 +A920 +FDE0 +2120 +F9E0 +A920 +F9E0 +2120 +FE20 +ENDCHAR +STARTCHAR U_4AF8 +ENCODING 19192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +42A0 +7EA0 +4AA0 +7EA0 +4AA0 +7F20 +4A60 +4F20 +B0E0 +ENDCHAR +STARTCHAR U_4AF9 +ENCODING 19193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47E0 +7C80 +5480 +7C80 +5480 +7C80 +57E0 +5C00 +6620 +81E0 +ENDCHAR +STARTCHAR U_4AFA +ENCODING 19194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2540 +27C0 +4540 +57C0 +9540 +AD40 +7BA0 +08A0 +ENDCHAR +STARTCHAR U_4AFB +ENCODING 19195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +45C0 +7D40 +5540 +7DC0 +5540 +7D40 +55C0 +5A00 +BD20 +80E0 +ENDCHAR +STARTCHAR U_4AFC +ENCODING 19196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4D00 +77C0 +5540 +7D40 +57E0 +7D40 +5520 +5E20 +7400 +83E0 +ENDCHAR +STARTCHAR U_4AFD +ENCODING 19197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +45E0 +7C80 +57E0 +7C80 +57E0 +7C80 +54E0 +5C00 +7220 +81E0 +ENDCHAR +STARTCHAR U_4AFE +ENCODING 19198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4440 +7D20 +5740 +7DA0 +5700 +7D20 +54E0 +5C00 +B220 +81E0 +ENDCHAR +STARTCHAR U_4AFF +ENCODING 19199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47E0 +7CA0 +5520 +7E60 +5400 +7DE0 +5520 +5DE0 +7300 +80E0 +ENDCHAR +STARTCHAR U_4B00 +ENCODING 19200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8AE0 +FDA0 +ADA0 +FAA0 +ADA0 +FDA0 +AAA0 +B960 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B01 +ENCODING 19201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4440 +7DE0 +5620 +7D00 +55C0 +7D00 +5520 +55E0 +7A00 +81E0 +ENDCHAR +STARTCHAR U_4B02 +ENCODING 19202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8BE0 +FA80 +AAA0 +FAA0 +AA40 +FAC0 +AB20 +BA20 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B03 +ENCODING 19203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +4480 +7FE0 +5440 +7D40 +5540 +7C80 +57E0 +5C00 +6220 +81E0 +ENDCHAR +STARTCHAR U_4B04 +ENCODING 19204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8BE0 +FA80 +AA80 +FBA0 +AAC0 +FA40 +ACA0 +BB00 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B05 +ENCODING 19205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FC0 +F940 +A940 +FA40 +AFE0 +FB60 +ADA0 +B960 +E400 +83E0 +ENDCHAR +STARTCHAR U_4B06 +ENCODING 19206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +8E20 +FAA0 +AFA0 +FAA0 +AEA0 +FBA0 +AA20 +AA60 +B400 +83E0 +ENDCHAR +STARTCHAR U_4B07 +ENCODING 19207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6440 +F7C0 +9540 +97C0 +F540 +47C0 +6540 +65C0 +B660 +A820 +ENDCHAR +STARTCHAR U_4B08 +ENCODING 19208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8A20 +FFE0 +AA20 +FBE0 +A940 +F940 +A940 +BA60 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B09 +ENCODING 19209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +89C0 +F880 +ABE0 +F940 +AB60 +FD40 +A940 +BA40 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B0A +ENCODING 19210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F880 +AAA0 +FAA0 +ADC0 +F940 +AA20 +B400 +EA20 +81E0 +ENDCHAR +STARTCHAR U_4B0B +ENCODING 19211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +45C0 +7C80 +57E0 +7D40 +56A0 +7DC0 +5740 +5C80 +7340 +81E0 +ENDCHAR +STARTCHAR U_4B0C +ENCODING 19212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7E20 +53E0 +7E20 +53E0 +5EA0 +43E0 +7AA0 +AAE0 +AB20 +4C20 +ENDCHAR +STARTCHAR U_4B0D +ENCODING 19213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8FE0 +FAA0 +AAA0 +FD20 +A940 +FAA0 +AE40 +B9C0 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B0E +ENCODING 19214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8FE0 +F880 +AFA0 +FD40 +AF40 +F840 +AFA0 +B8A0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B0F +ENCODING 19215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +5480 +7FE0 +5400 +7DC0 +5540 +5DC0 +7220 +81E0 +ENDCHAR +STARTCHAR U_4B10 +ENCODING 19216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +7FE0 +55C0 +7EA0 +57E0 +7D40 +5480 +5F60 +6400 +83E0 +ENDCHAR +STARTCHAR U_4B11 +ENCODING 19217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +FBE0 +AAA0 +FBE0 +A940 +F9C0 +A940 +A9C0 +F540 +93E0 +ENDCHAR +STARTCHAR U_4B12 +ENCODING 19218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +FAA0 +AD40 +F980 +AE60 +FBC0 +AA40 +B980 +E640 +83E0 +ENDCHAR +STARTCHAR U_4B13 +ENCODING 19219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +8880 +FBE0 +A940 +FBE0 +A940 +F9C0 +A940 +B9C0 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B14 +ENCODING 19220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +FBE0 +AC00 +FBA0 +AAA0 +FBA0 +AAA0 +BAA0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B15 +ENCODING 19221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +BAE0 +CB20 +8C20 +ENDCHAR +STARTCHAR U_4B16 +ENCODING 19222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BE0 +FAA0 +AB20 +FBE0 +A880 +FBE0 +A880 +BBE0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B17 +ENCODING 19223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +7BE0 +4AA0 +FFE0 +42A0 +FBE0 +5AA0 +AAA0 +4BE0 +3420 +ENDCHAR +STARTCHAR U_4B18 +ENCODING 19224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F940 +A940 +FBE0 +AA20 +FBA0 +AAA0 +BBA0 +EA20 +87E0 +ENDCHAR +STARTCHAR U_4B19 +ENCODING 19225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +8E40 +FB80 +AE80 +FBE0 +A880 +FFE0 +AAA0 +ABE0 +FC00 +83E0 +ENDCHAR +STARTCHAR U_4B1A +ENCODING 19226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9A80 +EBC0 +AA80 +FBC0 +AA80 +FBE0 +AAA0 +BD60 +EEA0 +83E0 +ENDCHAR +STARTCHAR U_4B1B +ENCODING 19227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +FBE0 +AAA0 +F9C0 +AAA0 +FFE0 +AAA0 +BFE0 +E880 +87E0 +ENDCHAR +STARTCHAR U_4B1C +ENCODING 19228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +F940 +AAA0 +FBE0 +A880 +FBE0 +AAA0 +ABE0 +F620 +81E0 +ENDCHAR +STARTCHAR U_4B1D +ENCODING 19229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8BE0 +F940 +AFE0 +FAA0 +ABE0 +FAA0 +ABE0 +B940 +E620 +83E0 +ENDCHAR +STARTCHAR U_4B1E +ENCODING 19230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F880 +ABE0 +F920 +AFE0 +F920 +AFA0 +B860 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B1F +ENCODING 19231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDA0 +89A0 +FEA0 +A9A0 +FF20 +AAA0 +FFA0 +AAA0 +BF60 +E400 +83E0 +ENDCHAR +STARTCHAR U_4B20 +ENCODING 19232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +A4A0 +3F40 +6580 +2540 +FEE0 +2580 +2540 +44E0 +ENDCHAR +STARTCHAR U_4B21 +ENCODING 19233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0500 +FFE0 +3280 +D480 +7FA0 +24C0 +FFE0 +2480 +4460 +ENDCHAR +STARTCHAR U_4B22 +ENCODING 19234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4920 +B120 +4920 +7920 +4920 +7920 +4220 +5A20 +6CC0 +ENDCHAR +STARTCHAR U_4B23 +ENCODING 19235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +EC00 +0000 +FBC0 +A840 +A880 +F900 +8200 +B220 +C9E0 +ENDCHAR +STARTCHAR U_4B24 +ENCODING 19236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4600 +4D00 +72C0 +5F80 +5480 +5F40 +5580 +98C0 +ENDCHAR +STARTCHAR U_4B25 +ENCODING 19237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +0100 +08A0 +1660 +2980 +FF60 +2900 +3F80 +2500 +3BC0 +ENDCHAR +STARTCHAR U_4B26 +ENCODING 19238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +4A40 +A640 +7A20 +4C00 +7BC0 +4A40 +7A40 +4180 +5240 +6C20 +ENDCHAR +STARTCHAR U_4B27 +ENCODING 19239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4800 +B000 +4FE0 +7A80 +4A80 +7A80 +4280 +5AA0 +6C60 +ENDCHAR +STARTCHAR U_4B28 +ENCODING 19240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4FE0 +B220 +4FA0 +7AA0 +4AA0 +7AA0 +54E0 +5820 +68C0 +ENDCHAR +STARTCHAR U_4B29 +ENCODING 19241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0C00 +3580 +C460 +1F00 +E4E0 +3F80 +2480 +3FC0 +2A80 +31E0 +ENDCHAR +STARTCHAR U_4B2A +ENCODING 19242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4880 +B080 +4980 +7AC0 +4CA0 +7880 +5080 +5880 +6880 +ENDCHAR +STARTCHAR U_4B2B +ENCODING 19243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A80 +B280 +4BE0 +7A80 +4A80 +7A80 +5240 +5B60 +6AA0 +ENDCHAR +STARTCHAR U_4B2C +ENCODING 19244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +AFC0 +F540 +9540 +F540 +9FE0 +F100 +8280 +B440 +D820 +ENDCHAR +STARTCHAR U_4B2D +ENCODING 19245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4920 +7920 +4260 +1F00 +E4E0 +3F80 +2480 +3FC0 +2A80 +31E0 +ENDCHAR +STARTCHAR U_4B2E +ENCODING 19246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5440 +AC40 +F440 +9640 +F540 +95C0 +F640 +A440 +B0A0 +D320 +ENDCHAR +STARTCHAR U_4B2F +ENCODING 19247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +48E0 +B080 +4880 +7BE0 +4A20 +7A20 +4220 +5BE0 +6A20 +ENDCHAR +STARTCHAR U_4B30 +ENCODING 19248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +48A0 +A4A0 +78A0 +4920 +7960 +4A20 +79E0 +4120 +5920 +69E0 +ENDCHAR +STARTCHAR U_4B31 +ENCODING 19249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5100 +AFE0 +7100 +5380 +7540 +5920 +77C0 +5100 +6900 +ENDCHAR +STARTCHAR U_4B32 +ENCODING 19250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3200 +4FE0 +A420 +FBA0 +4AA0 +7AA0 +4BA0 +7820 +5020 +68E0 +ENDCHAR +STARTCHAR U_4B33 +ENCODING 19251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +49C0 +F880 +4BE0 +7880 +4880 +7BE0 +5080 +5880 +6880 +ENDCHAR +STARTCHAR U_4B34 +ENCODING 19252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +8000 +47E0 +3100 +1100 +8100 +6680 +1100 +0100 +F100 +06E0 +ENDCHAR +STARTCHAR U_4B35 +ENCODING 19253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +6FE0 +8100 +7220 +57C0 +7080 +5320 +74C0 +5140 +6A20 +ENDCHAR +STARTCHAR U_4B36 +ENCODING 19254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +AFC0 +F440 +97C0 +F500 +9520 +F4C0 +8480 +B540 +D620 +ENDCHAR +STARTCHAR U_4B37 +ENCODING 19255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +31E0 +6A40 +9580 +7900 +4A80 +7D60 +4A20 +7940 +5080 +6F00 +ENDCHAR +STARTCHAR U_4B38 +ENCODING 19256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2140 +5180 +D640 +2A20 +D500 +2E80 +D160 +1E00 +1500 +3BC0 +ENDCHAR +STARTCHAR U_4B39 +ENCODING 19257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +6480 +9140 +7BE0 +4880 +7880 +49C0 +7880 +5080 +6BE0 +ENDCHAR +STARTCHAR U_4B3A +ENCODING 19258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F100 +97C0 +F100 +9100 +FFE0 +A100 +B100 +D100 +ENDCHAR +STARTCHAR U_4B3B +ENCODING 19259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +7900 +CFE0 +7900 +4FE0 +7920 +4140 +51A0 +6E60 +ENDCHAR +STARTCHAR U_4B3C +ENCODING 19260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2A20 +57E0 +F800 +4BE0 +7A20 +4BE0 +7A20 +43E0 +5A20 +6A60 +ENDCHAR +STARTCHAR U_4B3D +ENCODING 19261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5440 +E820 +07C0 +7440 +5440 +77C0 +5280 +6280 +54A0 +68E0 +ENDCHAR +STARTCHAR U_4B3E +ENCODING 19262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F120 +97E0 +F500 +97E0 +F120 +8320 +B560 +D900 +ENDCHAR +STARTCHAR U_4B3F +ENCODING 19263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +6BE0 +BE40 +4B80 +7AE0 +4B80 +7AE0 +4580 +54A0 +68E0 +ENDCHAR +STARTCHAR U_4B40 +ENCODING 19264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53C0 +A940 +F540 +9F40 +F5C0 +9540 +F540 +A660 +BC40 +D3E0 +ENDCHAR +STARTCHAR U_4B41 +ENCODING 19265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +F240 +2E40 +3580 +FF60 +2900 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_4B42 +ENCODING 19266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +67C0 +9000 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +5220 +6BE0 +ENDCHAR +STARTCHAR U_4B43 +ENCODING 19267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +AE60 +F100 +97C0 +F040 +9180 +F240 +A520 +B440 +CBC0 +ENDCHAR +STARTCHAR U_4B44 +ENCODING 19268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A540 +F7C0 +9100 +F7C0 +9140 +FFE0 +A140 +B7C0 +D100 +ENDCHAR +STARTCHAR U_4B45 +ENCODING 19269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7520 +AFE0 +7520 +5520 +77A0 +54A0 +77A0 +4C20 +57E0 +7420 +ENDCHAR +STARTCHAR U_4B46 +ENCODING 19270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +E940 +9220 +EE00 +3580 +DF60 +2900 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_4B47 +ENCODING 19271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +57E0 +AC20 +F120 +97E0 +F120 +93A0 +F2A0 +83A0 +9020 +E9C0 +ENDCHAR +STARTCHAR U_4B48 +ENCODING 19272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51E0 +AEA0 +F3E0 +94A0 +F5E0 +9280 +F280 +8DE0 +A480 +DBE0 +ENDCHAR +STARTCHAR U_4B49 +ENCODING 19273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +57E0 +AA00 +F3C0 +9480 +FFE0 +9240 +F3C0 +A240 +B3C0 +D440 +ENDCHAR +STARTCHAR U_4B4A +ENCODING 19274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6280 +5FE0 +AA80 +F100 +97C0 +F540 +9540 +FFE0 +A100 +B240 +DC20 +ENDCHAR +STARTCHAR U_4B4B +ENCODING 19275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +55E0 +AD20 +F5E0 +9480 +F7E0 +9480 +F5C0 +A5A0 +B6A0 +D480 +ENDCHAR +STARTCHAR U_4B4C +ENCODING 19276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +8AC0 +7F40 +A4E0 +3F00 +2940 +3F80 +20C0 +ENDCHAR +STARTCHAR U_4B4D +ENCODING 19277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +A900 +F3C0 +9100 +FFE0 +9000 +F7C0 +A540 +B540 +CFE0 +ENDCHAR +STARTCHAR U_4B4E +ENCODING 19278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +57E0 +AD40 +F5C0 +9400 +F7C0 +9100 +FFE0 +A100 +B540 +D920 +ENDCHAR +STARTCHAR U_4B4F +ENCODING 19279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +6FE0 +9820 +EFE0 +A800 +EFE0 +AAA0 +EFE0 +8AA0 +AAA0 +D060 +ENDCHAR +STARTCHAR U_4B50 +ENCODING 19280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +7100 +57C0 +7100 +5FE0 +7200 +5540 +7C60 +4B80 +ENDCHAR +STARTCHAR U_4B51 +ENCODING 19281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +B280 +07E0 +72A0 +57E0 +72A0 +47E0 +5280 +6AA0 +ENDCHAR +STARTCHAR U_4B52 +ENCODING 19282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5200 +EBE0 +82A0 +7360 +52A0 +73E0 +5100 +66A0 +5A00 +69E0 +ENDCHAR +STARTCHAR U_4B53 +ENCODING 19283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +77C0 +E800 +77C0 +5000 +7380 +5280 +7380 +5440 +5A80 +6FE0 +ENDCHAR +STARTCHAR U_4B54 +ENCODING 19284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +6900 +D5C0 +F140 +9DC0 +F500 +95C0 +F940 +A5C0 +B400 +CBE0 +ENDCHAR +STARTCHAR U_4B55 +ENCODING 19285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA00 +FBE0 +AA40 +F440 +2E40 +3580 +DF60 +1100 +1F00 +1080 +ENDCHAR +STARTCHAR U_4B56 +ENCODING 19286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A40 +EA40 +AFE0 +EA40 +ABC0 +E800 +8A40 +ADA0 +D4A0 +ENDCHAR +STARTCHAR U_4B57 +ENCODING 19287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4940 +FBE0 +4A20 +7BE0 +4A20 +7BE0 +5140 +5A40 +6C60 +ENDCHAR +STARTCHAR U_4B58 +ENCODING 19288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5340 +BAC0 +03C0 +7880 +6FE0 +5BC0 +7A40 +63C0 +52C0 +6DA0 +ENDCHAR +STARTCHAR U_4B59 +ENCODING 19289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +56C0 +AB40 +7FE0 +56C0 +7B60 +57C0 +7440 +67C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_4B5A +ENCODING 19290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +EA80 +7FE0 +5540 +77C0 +5540 +77C0 +6100 +77C0 +5FE0 +ENDCHAR +STARTCHAR U_4B5B +ENCODING 19291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +57C0 +8A60 +F7A0 +55A0 +75A0 +5760 +7540 +57E0 +6D40 +41A0 +ENDCHAR +STARTCHAR U_4B5C +ENCODING 19292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +BFE0 +D540 +EF80 +B8C0 +EFA0 +A880 +EF80 +8A80 +F240 +A220 +ENDCHAR +STARTCHAR U_4B5D +ENCODING 19293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +5540 +FAA0 +4FE0 +7AA0 +4BE0 +7A20 +43E0 +5220 +6BE0 +ENDCHAR +STARTCHAR U_4B5E +ENCODING 19294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6AA0 +9FE0 +4100 +F7C0 +9FE0 +F280 +97C0 +F100 +AFE0 +F100 +ENDCHAR +STARTCHAR U_4B5F +ENCODING 19295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +2B60 +7EA0 +83E0 +7AA0 +4AE0 +7A00 +4BE0 +7880 +53E0 +6AA0 +ENDCHAR +STARTCHAR U_4B60 +ENCODING 19296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A80 +EFE0 +AAA0 +EFE0 +AAA0 +EFE0 +8A80 +EEC0 +B2A0 +ENDCHAR +STARTCHAR U_4B61 +ENCODING 19297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +AFE0 +F080 +97E0 +F020 +97E0 +F020 +87E0 +A540 +DBA0 +ENDCHAR +STARTCHAR U_4B62 +ENCODING 19298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A920 +F6A0 +9BC0 +F540 +9FE0 +F000 +9FE0 +A100 +D300 +ENDCHAR +STARTCHAR U_4B63 +ENCODING 19299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A940 +7EC0 +56A0 +7AC0 +5240 +73C0 +4240 +53C0 +7440 +ENDCHAR +STARTCHAR U_4B64 +ENCODING 19300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +AAA0 +77E0 +5140 +7F40 +55E0 +7520 +45E0 +5E00 +71E0 +ENDCHAR +STARTCHAR U_4B65 +ENCODING 19301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +A900 +77C0 +5100 +77E0 +5540 +7FE0 +4540 +57C0 +7460 +ENDCHAR +STARTCHAR U_4B66 +ENCODING 19302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +AAC0 +77E0 +52A0 +7BE0 +56A0 +7440 +47E0 +5940 +68C0 +ENDCHAR +STARTCHAR U_4B67 +ENCODING 19303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +5A40 +EFE0 +AA40 +EEE0 +AB40 +E980 +8A40 +AFE0 +F540 +ENDCHAR +STARTCHAR U_4B68 +ENCODING 19304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +AFE0 +5280 +E7E0 +AC80 +E7E0 +A480 +EFE0 +8AA0 +AFE0 +E820 +ENDCHAR +STARTCHAR U_4B69 +ENCODING 19305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A40 +EFE0 +AAC0 +EF60 +AA40 +EF60 +8940 +AF60 +F140 +ENDCHAR +STARTCHAR U_4B6A +ENCODING 19306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +4240 +7BC0 +AA40 +2FE0 +2540 +27C0 +2540 +37C0 +6100 +0FE0 +ENDCHAR +STARTCHAR U_4B6B +ENCODING 19307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +F280 +8FE0 +9200 +F7C0 +0440 +F7C0 +9440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_4B6C +ENCODING 19308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8540 +8A80 +F540 +8FC0 +F200 +07C0 +F540 +96C0 +F540 +9640 +F7C0 +ENDCHAR +STARTCHAR U_4B6D +ENCODING 19309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +23E0 +7A20 +4BE0 +7A20 +4BE0 +7A20 +4BE0 +7940 +0220 +ENDCHAR +STARTCHAR U_4B6E +ENCODING 19310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +49A0 +5040 +FDA0 +4940 +FFE0 +0800 +1F80 +1280 +1280 +1F80 +ENDCHAR +STARTCHAR U_4B6F +ENCODING 19311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2080 +FAA0 +72A0 +AAA0 +ABE0 +7080 +52A0 +72A0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_4B70 +ENCODING 19312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27E0 +F900 +77C0 +AA00 +2FE0 +7540 +5BA0 +7100 +57C0 +7100 +ENDCHAR +STARTCHAR U_4B71 +ENCODING 19313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74A0 +22A0 +FAC0 +27E0 +74A0 +ADA0 +75E0 +56A0 +74A0 +54A0 +74E0 +ENDCHAR +STARTCHAR U_4B72 +ENCODING 19314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27E0 +F980 +2240 +7420 +AFE0 +7040 +5740 +7540 +5740 +70C0 +ENDCHAR +STARTCHAR U_4B73 +ENCODING 19315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23E0 +FAA0 +23E0 +DD80 +5660 +FFE0 +2480 +DFE0 +1280 +1F80 +ENDCHAR +STARTCHAR U_4B74 +ENCODING 19316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +7FC0 +4400 +7FE0 +92A0 +9240 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4B75 +ENCODING 19317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A240 +F240 +A240 +F340 +A2C0 +FA40 +2A40 +AA40 +8C40 +3860 +ENDCHAR +STARTCHAR U_4B76 +ENCODING 19318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +A7E0 +F140 +A140 +F140 +A140 +F940 +0A40 +AA40 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B77 +ENCODING 19319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +A700 +F100 +A7C0 +F100 +A100 +FFE0 +0900 +5900 +A920 +10E0 +ENDCHAR +STARTCHAR U_4B78 +ENCODING 19320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A220 +F420 +A240 +F240 +A240 +FA40 +0980 +A980 +8A40 +3420 +ENDCHAR +STARTCHAR U_4B79 +ENCODING 19321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A6E0 +F4A0 +A4A0 +F4A0 +A4A0 +F5A0 +0EA0 +A8E0 +8880 +3080 +ENDCHAR +STARTCHAR U_4B7A +ENCODING 19322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +A100 +F7E0 +A000 +F380 +A280 +FA80 +0AA0 +AAA0 +8AA0 +3460 +ENDCHAR +STARTCHAR U_4B7B +ENCODING 19323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A240 +F240 +A420 +F3C0 +A940 +F940 +0A40 +AA40 +8D40 +3080 +ENDCHAR +STARTCHAR U_4B7C +ENCODING 19324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +5000 +7800 +53E0 +7940 +5140 +7D40 +0540 +F540 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B7D +ENCODING 19325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5280 +7BE0 +5280 +7C80 +5080 +7FE0 +0880 +A880 +8880 +1080 +ENDCHAR +STARTCHAR U_4B7E +ENCODING 19326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5140 +7920 +57E0 +7900 +5100 +7900 +0A80 +AA80 +9440 +2820 +ENDCHAR +STARTCHAR U_4B7F +ENCODING 19327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A280 +FBE0 +A480 +F880 +A7E0 +F880 +0940 +A940 +8A20 +3420 +ENDCHAR +STARTCHAR U_4B80 +ENCODING 19328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A3E0 +FA20 +A7A0 +FAA0 +A2A0 +FBA0 +0A60 +AA00 +8A20 +33E0 +ENDCHAR +STARTCHAR U_4B81 +ENCODING 19329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A240 +F7E0 +A000 +F240 +A240 +FFE0 +0A40 +AA40 +8A40 +3640 +ENDCHAR +STARTCHAR U_4B82 +ENCODING 19330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A120 +F7E0 +A100 +F900 +A1E0 +FA20 +0B40 +AC80 +8940 +3620 +ENDCHAR +STARTCHAR U_4B83 +ENCODING 19331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F7C0 +A100 +F100 +AFE0 +F900 +0A00 +AA80 +8C40 +37C0 +ENDCHAR +STARTCHAR U_4B84 +ENCODING 19332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A080 +F7E0 +A080 +F100 +A200 +F940 +0880 +A900 +8A40 +33E0 +ENDCHAR +STARTCHAR U_4B85 +ENCODING 19333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +A080 +F3E0 +A280 +F280 +A2A0 +FAA0 +0AA0 +AB40 +8AA0 +3120 +ENDCHAR +STARTCHAR U_4B86 +ENCODING 19334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A080 +F9C0 +A2A0 +F8A0 +A000 +F880 +0BE0 +A880 +8880 +3080 +ENDCHAR +STARTCHAR U_4B87 +ENCODING 19335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F8A0 +A3E0 +F8A0 +A3E0 +F880 +0BE0 +A880 +8FE0 +3080 +ENDCHAR +STARTCHAR U_4B88 +ENCODING 19336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A0E0 +F920 +A2C0 +F880 +A300 +F8E0 +0920 +AAC0 +8880 +3700 +ENDCHAR +STARTCHAR U_4B89 +ENCODING 19337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F440 +AB80 +F220 +A340 +FA80 +0A40 +AA40 +8AA0 +3320 +ENDCHAR +STARTCHAR U_4B8A +ENCODING 19338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +53E0 +78A0 +53C0 +7A80 +07E0 +54A0 +A540 +9A20 +ENDCHAR +STARTCHAR U_4B8B +ENCODING 19339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7BA0 +5120 +7920 +53A0 +52E0 +7AA0 +0D20 +5920 +AA20 +1440 +ENDCHAR +STARTCHAR U_4B8C +ENCODING 19340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A480 +F7E0 +AC80 +F480 +A5C0 +F6A0 +16A0 +B480 +9480 +6480 +ENDCHAR +STARTCHAR U_4B8D +ENCODING 19341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2400 +3F00 +2400 +3FC0 +5540 +8A80 +7FC0 +3500 +D200 +19C0 +ENDCHAR +STARTCHAR U_4B8E +ENCODING 19342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F6C0 +A380 +F6C0 +A200 +F7C0 +A300 +F7C0 +9D40 +7540 +D5C0 +B100 +ENDCHAR +STARTCHAR U_4B8F +ENCODING 19343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5100 +7900 +53C0 +7940 +5140 +7BE0 +0800 +6BC0 +8A40 +33C0 +ENDCHAR +STARTCHAR U_4B90 +ENCODING 19344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F360 +A220 +F3A0 +A2A0 +FAA0 +0BA0 +AA20 +8A20 +3240 +ENDCHAR +STARTCHAR U_4B91 +ENCODING 19345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F140 +A000 +F040 +A7E0 +F840 +0A40 +A940 +8840 +3080 +ENDCHAR +STARTCHAR U_4B92 +ENCODING 19346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78A0 +53E0 +7880 +53E0 +7AA0 +53E0 +7AA0 +0BE0 +AAA0 +AAA0 +1A60 +ENDCHAR +STARTCHAR U_4B93 +ENCODING 19347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F100 +A1C0 +F100 +A7C0 +F4C0 +2740 +F7C0 +1100 +F7C0 +1100 +6100 +ENDCHAR +STARTCHAR U_4B94 +ENCODING 19348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +A780 +F080 +A7E0 +F2A0 +A7E0 +FAA0 +0AA0 +AFE0 +8880 +37E0 +ENDCHAR +STARTCHAR U_4B95 +ENCODING 19349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A120 +F5A0 +A240 +F5A0 +A000 +FFE0 +0920 +ADA0 +8A40 +35A0 +ENDCHAR +STARTCHAR U_4B96 +ENCODING 19350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A240 +F3C0 +A240 +F3C0 +A000 +F7E0 +3420 +57E0 +9420 +27E0 +ENDCHAR +STARTCHAR U_4B97 +ENCODING 19351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A2A0 +F3E0 +A000 +F3E0 +A200 +FBE0 +0A40 +ABE0 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B98 +ENCODING 19352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A6C0 +F440 +A6C0 +F440 +A7C0 +FA80 +0A80 +AA80 +8AA0 +3460 +ENDCHAR +STARTCHAR U_4B99 +ENCODING 19353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +A080 +F7E0 +A080 +F780 +A5A0 +FDA0 +0FA0 +AA40 +8CC0 +3320 +ENDCHAR +STARTCHAR U_4B9A +ENCODING 19354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A3C0 +F100 +A7E0 +F280 +A4E0 +FBC0 +0A40 +AD40 +8880 +3360 +ENDCHAR +STARTCHAR U_4B9B +ENCODING 19355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +AAA0 +FAA0 +AAE0 +FDA0 +AAA0 +FAE0 +0AA0 +AEA0 +88A0 +38E0 +ENDCHAR +STARTCHAR U_4B9C +ENCODING 19356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +AFE0 +F540 +A5C0 +F400 +A7E0 +F100 +5FE0 +B100 +5540 +B920 +ENDCHAR +STARTCHAR U_4B9D +ENCODING 19357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A920 +F7C0 +A540 +F7C0 +A540 +FFC0 +0900 +6FC0 +8900 +1900 +ENDCHAR +STARTCHAR U_4B9E +ENCODING 19358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F280 +AFE0 +F440 +AFE0 +FC60 +17C0 +5440 +97C0 +2440 +ENDCHAR +STARTCHAR U_4B9F +ENCODING 19359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +FDA0 +A240 +FDA0 +A240 +FC20 +2BC0 +DA80 +A900 +16E0 +ENDCHAR +STARTCHAR U_4BA0 +ENCODING 19360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A000 +FBE0 +A220 +FBE0 +A000 +FBE0 +0AA0 +FBE0 +8AA0 +33E0 +ENDCHAR +STARTCHAR U_4BA1 +ENCODING 19361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F640 +A3C0 +F240 +A3C0 +FA00 +0FC0 +AA40 +8980 +3660 +ENDCHAR +STARTCHAR U_4BA2 +ENCODING 19362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +5380 +7880 +57E0 +7980 +52E0 +7AA0 +2BE0 +7AA0 +CBE0 +1A20 +ENDCHAR +STARTCHAR U_4BA3 +ENCODING 19363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A140 +F080 +A140 +F7E0 +A5A0 +F240 +15A0 +FFE0 +9380 +3540 +ENDCHAR +STARTCHAR U_4BA4 +ENCODING 19364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F520 +A240 +F2E0 +A440 +FAE0 +0A40 +AAE0 +8A40 +32E0 +ENDCHAR +STARTCHAR U_4BA5 +ENCODING 19365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A000 +F3C0 +A240 +F3C0 +A000 +FBE0 +0B60 +AAA0 +8BE0 +32A0 +ENDCHAR +STARTCHAR U_4BA6 +ENCODING 19366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F940 +A1C0 +F800 +A3E0 +FA20 +2AA0 +5B60 +AAA0 +1A60 +ENDCHAR +STARTCHAR U_4BA7 +ENCODING 19367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F280 +2C60 +F7C0 +9480 +F7C0 +9480 +F7E0 +2520 +FAA0 +20C0 +ENDCHAR +STARTCHAR U_4BA8 +ENCODING 19368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F920 +A7C0 +FA80 +A100 +FFE0 +0900 +5FC0 +A900 +1900 +ENDCHAR +STARTCHAR U_4BA9 +ENCODING 19369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +F2C0 +A2C0 +F7E0 +A420 +FBC0 +0B40 +AAC0 +8B40 +3440 +ENDCHAR +STARTCHAR U_4BAA +ENCODING 19370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +53E0 +7D40 +5740 +79E0 +56C0 +7FE0 +0880 +A9C0 +9AA0 +0CA0 +ENDCHAR +STARTCHAR U_4BAB +ENCODING 19371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F6A0 +A3E0 +F080 +A3E0 +FAA0 +0940 +ABE0 +8940 +33A0 +ENDCHAR +STARTCHAR U_4BAC +ENCODING 19372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A7E0 +F240 +A3C0 +F240 +A3C0 +F880 +0FE0 +A900 +8A40 +3420 +ENDCHAR +STARTCHAR U_4BAD +ENCODING 19373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +A6A0 +F2C0 +A3C0 +F240 +ABC0 +FA40 +0BC0 +A900 +8AA0 +34E0 +ENDCHAR +STARTCHAR U_4BAE +ENCODING 19374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +FD40 +A540 +FBA0 +A540 +FAA0 +09C0 +AF40 +8880 +3740 +ENDCHAR +STARTCHAR U_4BAF +ENCODING 19375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A7E0 +F2A0 +A7A0 +F2A0 +A7A0 +FAA0 +0B40 +AD40 +8D40 +35A0 +ENDCHAR +STARTCHAR U_4BB0 +ENCODING 19376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F140 +A140 +F3E0 +A2A0 +FBE0 +0AA0 +AB60 +8BE0 +3220 +ENDCHAR +STARTCHAR U_4BB1 +ENCODING 19377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +ABE0 +F480 +A140 +F2E0 +AD40 +F6C0 +9560 +5640 +9480 +6BE0 +ENDCHAR +STARTCHAR U_4BB2 +ENCODING 19378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A7E0 +F140 +A7E0 +F1C0 +A2A0 +FBE0 +0AA0 +ABE0 +8940 +3220 +ENDCHAR +STARTCHAR U_4BB3 +ENCODING 19379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +AF00 +E540 +BFE0 +E540 +A920 +F7C0 +5540 +B7C0 +5540 +B7C0 +ENDCHAR +STARTCHAR U_4BB4 +ENCODING 19380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F740 +A2A0 +F640 +A440 +F7E0 +A820 +FBC0 +0A40 +ABC0 +AA40 +17E0 +ENDCHAR +STARTCHAR U_4BB5 +ENCODING 19381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A7E0 +F220 +A140 +F7E0 +A2A0 +FBE0 +0AA0 +ABE0 +8880 +37E0 +ENDCHAR +STARTCHAR U_4BB6 +ENCODING 19382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A3E0 +F480 +ABE0 +F280 +A3E0 +FA80 +0BE0 +A880 +8AA0 +3080 +ENDCHAR +STARTCHAR U_4BB7 +ENCODING 19383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A6A0 +F7E0 +A400 +F7E0 +8920 +FBA0 +0BA0 +A920 +8BA0 +30C0 +ENDCHAR +STARTCHAR U_4BB8 +ENCODING 19384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4040 +FFE0 +A420 +3F00 +2400 +3FC0 +5440 +AAC0 +ENDCHAR +STARTCHAR U_4BB9 +ENCODING 19385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2C0 +A280 +F7E0 +A040 +F7E0 +A440 +F7C0 +1540 +57E0 +9540 +2AA0 +ENDCHAR +STARTCHAR U_4BBA +ENCODING 19386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F2A0 +AD40 +F7A0 +ABE0 +FA40 +1BC0 +2A40 +CBC0 +3E40 +ENDCHAR +STARTCHAR U_4BBB +ENCODING 19387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A000 +AFE0 +A020 +F380 +1040 +3FE0 +5040 +9240 +3080 +ENDCHAR +STARTCHAR U_4BBC +ENCODING 19388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +A540 +F100 +A2C0 +F520 +A540 +FA80 +0CE0 +AB40 +8DE0 +3240 +ENDCHAR +STARTCHAR U_4BBD +ENCODING 19389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +A7E0 +F540 +A7E0 +F560 +A7E0 +F540 +15E0 +B540 +95E0 +2EA0 +ENDCHAR +STARTCHAR U_4BBE +ENCODING 19390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +DFE0 +EA80 +DFE0 +E060 +CE80 +EAE0 +2E80 +EAE0 +AE80 +6AE0 +ENDCHAR +STARTCHAR U_4BBF +ENCODING 19391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +FAA0 +A7C0 +F280 +AFE0 +F240 +17E0 +B2C0 +9680 +39E0 +ENDCHAR +STARTCHAR U_4BC0 +ENCODING 19392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A2C0 +F340 +A2C0 +F7E0 +A040 +FFE0 +0AA0 +AAE0 +8FA0 +3220 +ENDCHAR +STARTCHAR U_4BC1 +ENCODING 19393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +F400 +A7C0 +F240 +AFC0 +F540 +37C0 +5D40 +97C0 +6D60 +ENDCHAR +STARTCHAR U_4BC2 +ENCODING 19394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2A00 +1F80 +2A80 +FFE0 +AA80 +7DE0 +AAA0 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4BC3 +ENCODING 19395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +57E0 +5420 +5100 +7FE0 +0A40 +3A40 +C980 +0980 +3660 +ENDCHAR +STARTCHAR U_4BC4 +ENCODING 19396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +5240 +53C0 +5080 +7BE0 +0AA0 +3AA0 +CB60 +0A20 +3260 +ENDCHAR +STARTCHAR U_4BC5 +ENCODING 19397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +5240 +53C0 +5240 +53C0 +7A40 +0FE0 +3840 +CFE0 +0A40 +35A0 +ENDCHAR +STARTCHAR U_4BC6 +ENCODING 19398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +6900 +FD00 +8500 +7900 +4900 +7900 +4920 +7920 +49E0 +ENDCHAR +STARTCHAR U_4BC7 +ENCODING 19399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +5900 +FFE0 +8520 +7920 +4920 +7920 +4920 +7A20 +9C40 +ENDCHAR +STARTCHAR U_4BC8 +ENCODING 19400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4800 +6BE0 +FD40 +CD40 +6940 +5940 +6940 +5940 +4A40 +9A60 +ENDCHAR +STARTCHAR U_4BC9 +ENCODING 19401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +59E0 +FD20 +86C0 +7880 +4880 +7880 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_4BCA +ENCODING 19402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +6BE0 +5840 +FC40 +87C0 +7AC0 +4AC0 +7BC0 +4840 +7940 +4880 +ENDCHAR +STARTCHAR U_4BCB +ENCODING 19403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +6BE0 +FD00 +85E0 +7A20 +4A40 +7B40 +4C80 +7940 +4A20 +ENDCHAR +STARTCHAR U_4BCC +ENCODING 19404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +FD00 +8D00 +77C0 +5540 +7540 +5540 +7540 +5A60 +ENDCHAR +STARTCHAR U_4BCD +ENCODING 19405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +FA80 +8A80 +7440 +5BA0 +7000 +57E0 +7040 +9180 +B080 +ENDCHAR +STARTCHAR U_4BCE +ENCODING 19406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +4940 +4940 +7A20 +85C0 +7880 +4880 +6BE0 +4880 +6880 +9880 +ENDCHAR +STARTCHAR U_4BCF +ENCODING 19407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +7840 +4880 +6980 +5A80 +FFC0 +8480 +7880 +6BC0 +4A40 +5BC0 +ENDCHAR +STARTCHAR U_4BD0 +ENCODING 19408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FEA0 +8760 +7AA0 +4AA0 +7B60 +4A20 +7A20 +4A60 +ENDCHAR +STARTCHAR U_4BD1 +ENCODING 19409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +68A0 +5AA0 +FDC0 +8480 +7BE0 +4940 +7940 +4940 +7A40 +4C60 +ENDCHAR +STARTCHAR U_4BD2 +ENCODING 19410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +6AE0 +5A00 +FD00 +85E0 +7A40 +4E40 +7A40 +4A40 +7A40 +4AC0 +ENDCHAR +STARTCHAR U_4BD3 +ENCODING 19411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FC80 +87E0 +7C80 +4880 +7BE0 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_4BD4 +ENCODING 19412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +6BE0 +FE20 +85C0 +7B00 +4900 +69E0 +5F00 +4920 +59E0 +ENDCHAR +STARTCHAR U_4BD5 +ENCODING 19413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +6B40 +59C0 +FD40 +8640 +7BE0 +4940 +7E40 +4AE0 +7B00 +4CE0 +ENDCHAR +STARTCHAR U_4BD6 +ENCODING 19414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5BC0 +FE40 +83C0 +7A20 +4B40 +7A80 +4A40 +5B20 +ENDCHAR +STARTCHAR U_4BD7 +ENCODING 19415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4B60 +6A40 +5A40 +FF60 +8480 +7880 +49C0 +5880 +6880 +5BE0 +ENDCHAR +STARTCHAR U_4BD8 +ENCODING 19416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5220 +75C0 +2400 +FFE0 +A940 +F940 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_4BD9 +ENCODING 19417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +48A0 +6BE0 +5880 +FFE0 +82A0 +7BE0 +4AA0 +7BE0 +4AA0 +5A60 +ENDCHAR +STARTCHAR U_4BDA +ENCODING 19418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6920 +5BC0 +FD20 +87E0 +7C00 +49E0 +7920 +49E0 +7920 +4960 +ENDCHAR +STARTCHAR U_4BDB +ENCODING 19419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5A20 +FD00 +87E0 +7EA0 +4AA0 +7DE0 +4980 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_4BDC +ENCODING 19420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +6BC0 +5A40 +FDC0 +8600 +7BE0 +4D60 +5AA0 +6920 +5A40 +ENDCHAR +STARTCHAR U_4BDD +ENCODING 19421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6880 +FDE0 +8640 +7BE0 +4920 +79E0 +4920 +79E0 +4920 +ENDCHAR +STARTCHAR U_4BDE +ENCODING 19422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +7340 +FB40 +8FE0 +7420 +55E0 +7560 +55E0 +7420 +5460 +ENDCHAR +STARTCHAR U_4BDF +ENCODING 19423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +6FE0 +5900 +FE80 +85A0 +7AC0 +4D80 +7AC0 +4CA0 +7A80 +4900 +ENDCHAR +STARTCHAR U_4BE0 +ENCODING 19424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7380 +5280 +7380 +5280 +FB80 +5000 +77C0 +5540 +7540 +5540 +9FE0 +ENDCHAR +STARTCHAR U_4BE1 +ENCODING 19425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +7280 +FFE0 +8AA0 +7FE0 +52A0 +77E0 +5280 +76C0 +5AA0 +ENDCHAR +STARTCHAR U_4BE2 +ENCODING 19426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7DE0 +6AA0 +4F80 +4880 +5FE0 +68A0 +8F80 +9080 +ENDCHAR +STARTCHAR U_4BE3 +ENCODING 19427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +FFE0 +8800 +77C0 +5440 +77C0 +5440 +77C0 +5820 +ENDCHAR +STARTCHAR U_4BE4 +ENCODING 19428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6980 +5A40 +FFE0 +86A0 +7D20 +4FE0 +6A40 +5BC0 +4A40 +5BC0 +ENDCHAR +STARTCHAR U_4BE5 +ENCODING 19429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6A20 +5BE0 +FE20 +87E0 +7A40 +4B60 +7A40 +4FE0 +7800 +4DA0 +ENDCHAR +STARTCHAR U_4BE6 +ENCODING 19430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +6B60 +5940 +FBE0 +82A0 +7BE0 +4880 +7BE0 +4AA0 +7A40 +4CA0 +ENDCHAR +STARTCHAR U_4BE7 +ENCODING 19431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +2200 +FF80 +8080 +7F00 +5500 +5D00 +4100 +4300 +ENDCHAR +STARTCHAR U_4BE8 +ENCODING 19432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +7FC0 +5140 +5F40 +40C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_4BE9 +ENCODING 19433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0400 +7FC0 +0A00 +7FC0 +4A40 +BF40 +25C0 +3F00 +2080 +3FC0 +ENDCHAR +STARTCHAR U_4BEA +ENCODING 19434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +7220 +FBE0 +8A20 +FBE0 +DA20 +FBE0 +8940 +9A20 +ENDCHAR +STARTCHAR U_4BEB +ENCODING 19435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +7240 +53C0 +F800 +57E0 +7420 +27A0 +76A0 +AFA0 +6460 +ENDCHAR +STARTCHAR U_4BEC +ENCODING 19436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +52A0 +FBE0 +AAA0 +DBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4BED +ENCODING 19437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +4380 +7860 +4380 +FC60 +4B80 +F400 +3F80 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4BEE +ENCODING 19438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7860 +4380 +FC60 +4380 +FF80 +1080 +11E0 +2020 +40C0 +ENDCHAR +STARTCHAR U_4BEF +ENCODING 19439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7900 +4280 +7140 +4280 +F900 +2200 +7000 +0400 +2680 +0400 +3800 +ENDCHAR +STARTCHAR U_4BF0 +ENCODING 19440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7C60 +4380 +FC60 +4980 +7600 +1B00 +71C0 +9120 +2100 +ENDCHAR +STARTCHAR U_4BF1 +ENCODING 19441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4300 +F860 +5180 +E860 +8D80 +FFE0 +0C00 +3500 +44C0 +0400 +ENDCHAR +STARTCHAR U_4BF2 +ENCODING 19442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4040 +FD80 +4840 +FD80 +0000 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_4BF3 +ENCODING 19443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7900 +4200 +7100 +4280 +F900 +5200 +F800 +2200 +C980 +1400 +3E00 +ENDCHAR +STARTCHAR U_4BF4 +ENCODING 19444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +F060 +1F80 +1100 +EEE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4BF5 +ENCODING 19445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +FC60 +0580 +7FC0 +2480 +FFE0 +2080 +C080 +ENDCHAR +STARTCHAR U_4BF6 +ENCODING 19446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +FC60 +0180 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4BF7 +ENCODING 19447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4380 +F860 +5380 +F800 +0440 +FFE0 +2240 +F980 +22A0 +C460 +ENDCHAR +STARTCHAR U_4BF8 +ENCODING 19448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +5180 +6040 +FD80 +4860 +FA80 +43C0 +2540 +1100 +2280 +4C60 +ENDCHAR +STARTCHAR U_4BF9 +ENCODING 19449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +5020 +FBC0 +5020 +FFC0 +0100 +7FC0 +0100 +FFE0 +8E20 +3B80 +ENDCHAR +STARTCHAR U_4BFA +ENCODING 19450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +00C0 +7F00 +4220 +79E0 +2080 +3F80 +ENDCHAR +STARTCHAR U_4BFB +ENCODING 19451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +51A0 +6040 +FDA0 +5040 +F580 +1F00 +2400 +7FC0 +1100 +1F00 +ENDCHAR +STARTCHAR U_4BFC +ENCODING 19452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5140 +4AA0 +FCC0 +5300 +E880 +2AA0 +F2E0 +1880 +E940 +1A20 +ENDCHAR +STARTCHAR U_4BFD +ENCODING 19453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +ENDCHAR +STARTCHAR U_4BFE +ENCODING 19454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +5180 +6860 +FD80 +5860 +E580 +3FC0 +2E40 +35C0 +4A40 +8EC0 +ENDCHAR +STARTCHAR U_4BFF +ENCODING 19455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7C60 +4380 +FC60 +5580 +FFE0 +2080 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4C00 +ENCODING 19456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5140 +FE80 +4940 +BF80 +0400 +7FC0 +1500 +FFE0 +1200 +7FC0 +ENDCHAR +STARTCHAR U_4C01 +ENCODING 19457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +F980 +0F00 +1200 +FFE0 +2480 +1500 +6CC0 +ENDCHAR +STARTCHAR U_4C02 +ENCODING 19458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FC80 +07C0 +3A80 +1500 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4C03 +ENCODING 19459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2080 +1100 +FFE0 +4A40 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4C04 +ENCODING 19460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4040 +FD80 +4860 +FF80 +1280 +1F80 +1280 +1F40 +50A0 +9F80 +ENDCHAR +STARTCHAR U_4C05 +ENCODING 19461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4840 +FFE0 +0400 +3F80 +2280 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_4C06 +ENCODING 19462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FF80 +0900 +FFE0 +1440 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4C07 +ENCODING 19463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +F980 +5460 +FF80 +0500 +7FE0 +0880 +1F80 +E880 +0F80 +ENDCHAR +STARTCHAR U_4C08 +ENCODING 19464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +20C0 +3B20 +2AC0 +FF20 +24C0 +7F80 +1000 +7F80 +8400 +7FC0 +ENDCHAR +STARTCHAR U_4C09 +ENCODING 19465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FC80 +23C0 +7A40 +4FE0 +FA40 +4980 +9E40 +ENDCHAR +STARTCHAR U_4C0A +ENCODING 19466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FF80 +2480 +3F80 +2480 +FFC0 +2100 +1300 +ENDCHAR +STARTCHAR U_4C0B +ENCODING 19467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +1080 +FFE0 +8420 +7FC0 +0A00 +77C0 +ENDCHAR +STARTCHAR U_4C0C +ENCODING 19468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2280 +5540 +2100 +65C0 +A500 +2BE0 +ENDCHAR +STARTCHAR U_4C0D +ENCODING 19469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +42A0 +F940 +5280 +0400 +FFE0 +1500 +6AC0 +9520 +6EC0 +1500 +ENDCHAR +STARTCHAR U_4C0E +ENCODING 19470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5320 +FC40 +53A0 +F440 +3F80 +2480 +FFE0 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_4C0F +ENCODING 19471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2240 +FFE0 +5200 +FD40 +50A0 +7D60 +ENDCHAR +STARTCHAR U_4C10 +ENCODING 19472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +F8C0 +5300 +F8C0 +4B00 +79E0 +5240 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4C11 +ENCODING 19473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5360 +FDA0 +4840 +FFC0 +0400 +7FC0 +5540 +FFE0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_4C12 +ENCODING 19474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +4980 +FBE0 +2080 +FFE0 +8CA0 +7680 +0B00 +74C0 +ENDCHAR +STARTCHAR U_4C13 +ENCODING 19475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +4980 +7F60 +1500 +FFE0 +A4A0 +7FC0 +0900 +3300 +ENDCHAR +STARTCHAR U_4C14 +ENCODING 19476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +29C0 +7D20 +57E0 +FD20 +54C0 +7FA0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4C15 +ENCODING 19477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +51A0 +FC40 +49A0 +7EC0 +0400 +7FE0 +4AA0 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_4C16 +ENCODING 19478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +5100 +FEE0 +4900 +F9E0 +2240 +FFE0 +5540 +9560 +1F00 +2080 +ENDCHAR +STARTCHAR U_4C17 +ENCODING 19479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A0A0 +FFE0 +9220 +BF20 +9120 +BFA0 +AAA0 +BFA0 +8420 +87A0 +ENDCHAR +STARTCHAR U_4C18 +ENCODING 19480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A0A0 +FBE0 +AAA0 +99A0 +AEA0 +9520 +FAE0 +8D20 +8220 +9C60 +ENDCHAR +STARTCHAR U_4C19 +ENCODING 19481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +0040 +7DE0 +4440 +7C40 +01E0 +FEA0 +AAA0 +92A0 +FE40 +93A0 +ENDCHAR +STARTCHAR U_4C1A +ENCODING 19482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0080 +7BE0 +4940 +7940 +0140 +FD40 +D480 +A480 +FD40 +A620 +ENDCHAR +STARTCHAR U_4C1B +ENCODING 19483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0100 +7900 +49C0 +7940 +0140 +FDC0 +D540 +A540 +FD60 +A5A0 +ENDCHAR +STARTCHAR U_4C1C +ENCODING 19484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DF60 +4020 +5F20 +D160 +9F40 +8040 +DF60 +5120 +5B20 +5520 +D560 +ENDCHAR +STARTCHAR U_4C1D +ENCODING 19485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +0140 +7BE0 +4AA0 +7BE0 +02A0 +FFE0 +AD40 +95C0 +FD40 +95C0 +ENDCHAR +STARTCHAR U_4C1E +ENCODING 19486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2520 +FFE0 +8A80 +FEE0 +2A20 +7FE0 +1100 +7FC0 +5540 +4440 +ENDCHAR +STARTCHAR U_4C1F +ENCODING 19487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +2080 +7FC0 +2440 +3FC0 +2440 +3FC0 +12A0 +E3E0 +ENDCHAR +STARTCHAR U_4C20 +ENCODING 19488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +53E0 +5880 +5480 +98A0 +8FE0 +ENDCHAR +STARTCHAR U_4C21 +ENCODING 19489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FA80 +ABE0 +FC80 +A880 +FFE0 +5080 +5940 +5620 +9820 +8FE0 +ENDCHAR +STARTCHAR U_4C22 +ENCODING 19490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FAE0 +AD00 +FAE0 +AE40 +FA40 +5240 +5AC0 +5640 +9820 +8FE0 +ENDCHAR +STARTCHAR U_4C23 +ENCODING 19491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FA20 +AB60 +FAA0 +AB60 +FA20 +5360 +5AA0 +5760 +9A20 +8FC0 +ENDCHAR +STARTCHAR U_4C24 +ENCODING 19492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +22A0 +FBE0 +AAA0 +FBE0 +A940 +F940 +7160 +AA40 +2460 +ENDCHAR +STARTCHAR U_4C25 +ENCODING 19493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4A40 +F1C0 +3F20 +2480 +3F80 +2480 +3F80 +12A0 +E3E0 +ENDCHAR +STARTCHAR U_4C26 +ENCODING 19494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +5180 +5A80 +57E0 +9880 +8FE0 +ENDCHAR +STARTCHAR U_4C27 +ENCODING 19495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4080 +FBE0 +AAA0 +FBC0 +AA80 +FAE0 +5540 +5540 +5220 +9FE0 +ENDCHAR +STARTCHAR U_4C28 +ENCODING 19496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FAA0 +ABE0 +FA00 +AAE0 +FAA0 +52E0 +5AA0 +54E0 +98A0 +8FE0 +ENDCHAR +STARTCHAR U_4C29 +ENCODING 19497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2AA0 +33E0 +FAA0 +23E0 +7940 +C9A0 +7AE0 +4A80 +7CE0 +ENDCHAR +STARTCHAR U_4C2A +ENCODING 19498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +77C0 +AD40 +57C0 +8D40 +77C0 +5280 +72A0 +52E0 +7280 +94E0 +ENDCHAR +STARTCHAR U_4C2B +ENCODING 19499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FBC0 +A880 +FFE0 +AA40 +FFE0 +5240 +57E0 +5940 +9620 +8FE0 +ENDCHAR +STARTCHAR U_4C2C +ENCODING 19500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F840 +AFE0 +FAA0 +AC80 +FBE0 +52A0 +5B60 +56A0 +9800 +8FE0 +ENDCHAR +STARTCHAR U_4C2D +ENCODING 19501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +23E0 +FAA0 +ABE0 +AAA0 +03E0 +FC80 +20C0 +F9E0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_4C2E +ENCODING 19502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +FBE0 +A880 +FBE0 +A880 +FBE0 +5140 +5BE0 +5540 +9B20 +8FE0 +ENDCHAR +STARTCHAR U_4C2F +ENCODING 19503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +4420 +FF40 +A8E0 +FF40 +AA60 +FF40 +55C0 +5960 +9000 +8FE0 +ENDCHAR +STARTCHAR U_4C30 +ENCODING 19504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +13E0 +FEA0 +BBE0 +D6A0 +2BE0 +FCA0 +4140 +FD60 +A540 +AE60 +ENDCHAR +STARTCHAR U_4C31 +ENCODING 19505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +AFC0 +7540 +AFC0 +F940 +21A0 +ABC0 +7520 +F9E0 +ENDCHAR +STARTCHAR U_4C32 +ENCODING 19506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +9200 +FA00 +AA00 +FA00 +AA00 +FA20 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_4C33 +ENCODING 19507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +F880 +A880 +F880 +A880 +F880 +0080 +AA80 +A900 +ENDCHAR +STARTCHAR U_4C34 +ENCODING 19508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FC00 +ABC0 +F820 +A840 +F880 +0100 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C35 +ENCODING 19509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7BE0 +9020 +F8C0 +A880 +FFE0 +A880 +F880 +0080 +AA80 +A980 +ENDCHAR +STARTCHAR U_4C36 +ENCODING 19510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7900 +9080 +FFE0 +AA00 +FA00 +AA00 +FA00 +0200 +ABE0 +A800 +ENDCHAR +STARTCHAR U_4C37 +ENCODING 19511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +3C80 +CBE0 +7C80 +5480 +7FE0 +5480 +7C80 +03E0 +5480 +AA80 +ENDCHAR +STARTCHAR U_4C38 +ENCODING 19512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7940 +9140 +F940 +AA40 +FA20 +ACA0 +F900 +0100 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C39 +ENCODING 19513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78A0 +9080 +FBE0 +A880 +F880 +A8A0 +F840 +00C0 +A940 +D420 +ENDCHAR +STARTCHAR U_4C3A +ENCODING 19514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7B80 +9200 +FA00 +ABE0 +FA40 +AA40 +FA40 +0240 +5440 +A840 +ENDCHAR +STARTCHAR U_4C3B +ENCODING 19515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +91E0 +FA00 +A840 +FA40 +A940 +F940 +0080 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C3C +ENCODING 19516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +ABA0 +F800 +AFE0 +F840 +0280 +A900 +A880 +ENDCHAR +STARTCHAR U_4C3D +ENCODING 19517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +FAA0 +AAA0 +FAA0 +02A0 +A880 +A880 +ENDCHAR +STARTCHAR U_4C3E +ENCODING 19518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +92A0 +FAA0 +AAA0 +FBE0 +AA00 +FA00 +0200 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_4C3F +ENCODING 19519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FC00 +AA80 +FAE0 +AFA0 +FAA0 +0200 +AA20 +A9C0 +ENDCHAR +STARTCHAR U_4C40 +ENCODING 19520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +97C0 +2540 +FD40 +AD40 +FFE0 +A900 +FA80 +0440 +A820 +ENDCHAR +STARTCHAR U_4C41 +ENCODING 19521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +8BE0 +7C80 +55C0 +7DC0 +56A0 +7CA0 +03E0 +5A80 +A480 +ENDCHAR +STARTCHAR U_4C42 +ENCODING 19522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9280 +FDE0 +AEA0 +FAA0 +AAA0 +FDA0 +07A0 +ACA0 +A940 +ENDCHAR +STARTCHAR U_4C43 +ENCODING 19523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9280 +FBE0 +AC80 +F880 +AFE0 +F880 +0140 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C44 +ENCODING 19524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +96A0 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +02E0 +AA20 +AC20 +ENDCHAR +STARTCHAR U_4C45 +ENCODING 19525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +A880 +FBE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_4C46 +ENCODING 19526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A80 +9260 +FA20 +ADE0 +F840 +A880 +FFE0 +0080 +A880 +A980 +ENDCHAR +STARTCHAR U_4C47 +ENCODING 19527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +53C0 +2240 +FA40 +ABC0 +FA40 +AA40 +ABC0 +FA40 +0800 +A7E0 +ENDCHAR +STARTCHAR U_4C48 +ENCODING 19528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +79C0 +9000 +F800 +ABE0 +F880 +A9C0 +FAA0 +04A0 +A880 +A880 +ENDCHAR +STARTCHAR U_4C49 +ENCODING 19529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9240 +FA40 +ABC0 +FA40 +AA40 +FBC0 +0240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_4C4A +ENCODING 19530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +49C0 +9080 +7FE0 +5480 +7DC0 +55C0 +7EA0 +54A0 +AA80 +ENDCHAR +STARTCHAR U_4C4B +ENCODING 19531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7940 +4940 +FFE0 +5540 +7D40 +57E0 +7C00 +0140 +A920 +AA20 +ENDCHAR +STARTCHAR U_4C4C +ENCODING 19532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A40 +9240 +FAE0 +AAA0 +FAA0 +AAA0 +FAE0 +0240 +AA40 +ABE0 +ENDCHAR +STARTCHAR U_4C4D +ENCODING 19533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7900 +9100 +F9E0 +AA20 +FB20 +AAA0 +FD40 +00C0 +A840 +ABE0 +ENDCHAR +STARTCHAR U_4C4E +ENCODING 19534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9000 +FBC0 +AA40 +FBC0 +AA40 +FA40 +03C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_4C4F +ENCODING 19535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93C0 +FA40 +ABC0 +F800 +AA40 +FA40 +0180 +A980 +AFE0 +ENDCHAR +STARTCHAR U_4C50 +ENCODING 19536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7B00 +92A0 +F940 +ABE0 +F840 +A880 +FBE0 +0080 +3880 +C180 +ENDCHAR +STARTCHAR U_4C51 +ENCODING 19537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7AC0 +9780 +FA80 +AAE0 +FBA0 +AEA0 +FAA0 +02A0 +AAA0 +AF20 +ENDCHAR +STARTCHAR U_4C52 +ENCODING 19538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +F800 +ABE0 +FAA0 +AAA0 +FBE0 +0200 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C53 +ENCODING 19539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +77C0 +9140 +FA40 +AFE0 +F940 +A940 +FD40 +02E0 +AB00 +ACE0 +ENDCHAR +STARTCHAR U_4C54 +ENCODING 19540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +92E0 +FBA0 +AEA0 +FAA0 +AAA0 +FA40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_4C55 +ENCODING 19541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +9400 +FBE0 +AAA0 +FFE0 +AAA0 +FAA0 +03E0 +3820 +C0C0 +ENDCHAR +STARTCHAR U_4C56 +ENCODING 19542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +9280 +FA80 +AEE0 +FAA0 +AAA0 +FEE0 +0280 +A480 +A880 +ENDCHAR +STARTCHAR U_4C57 +ENCODING 19543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +2140 +7940 +AE80 +1140 +FFA0 +2480 +3F80 +2480 +3F80 +5240 +ENDCHAR +STARTCHAR U_4C58 +ENCODING 19544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7040 +2140 +F940 +7640 +AAC0 +3F80 +2480 +3F80 +2480 +3F80 +6AC0 +ENDCHAR +STARTCHAR U_4C59 +ENCODING 19545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7B00 +92E0 +FFA0 +AAA0 +FAA0 +AFA0 +FAA0 +0240 +AA40 +AAA0 +ENDCHAR +STARTCHAR U_4C5A +ENCODING 19546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79C0 +9240 +FB80 +A880 +FBE0 +A880 +FAA0 +01C0 +AAA0 +A980 +ENDCHAR +STARTCHAR U_4C5B +ENCODING 19547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +78A0 +97E0 +F880 +AE80 +FAA0 +AEA0 +F840 +06C0 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C5C +ENCODING 19548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +9140 +F940 +ABE0 +F800 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C5D +ENCODING 19549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +73E0 +92A0 +FBE0 +AAA0 +FBE0 +A940 +FA40 +07E0 +A840 +A040 +ENDCHAR +STARTCHAR U_4C5E +ENCODING 19550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9140 +FA20 +AFE0 +F800 +AFE0 +F880 +02C0 +AAA0 +A5A0 +ENDCHAR +STARTCHAR U_4C5F +ENCODING 19551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +73E0 +A220 +FBE0 +AA80 +FBE0 +AA80 +FBE0 +5320 +AD20 +A9E0 +ENDCHAR +STARTCHAR U_4C60 +ENCODING 19552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7240 +97E0 +F940 +A8A0 +FB60 +AA40 +FFE0 +0140 +A8A0 +AB60 +ENDCHAR +STARTCHAR U_4C61 +ENCODING 19553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +A520 +FD60 +ABA0 +FFE0 +A920 +FBA0 +2D60 +D520 +A0C0 +ENDCHAR +STARTCHAR U_4C62 +ENCODING 19554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +9480 +FBC0 +A940 +FFE0 +A940 +FBC0 +0100 +A900 +AB00 +ENDCHAR +STARTCHAR U_4C63 +ENCODING 19555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9000 +F940 +AAA0 +F800 +A880 +FBE0 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_4C64 +ENCODING 19556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9120 +FA20 +A840 +F900 +AA60 +FA20 +0360 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C65 +ENCODING 19557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7EA0 +88A0 +7E20 +4A60 +3F80 +2480 +3F80 +2480 +3F80 +4940 +ENDCHAR +STARTCHAR U_4C66 +ENCODING 19558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3A80 +5280 +A5E0 +7E80 +ABC0 +FA80 +AA80 +FBC0 +0280 +ABE0 +ENDCHAR +STARTCHAR U_4C67 +ENCODING 19559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7880 +93E0 +F880 +ABE0 +F940 +AA20 +FDC0 +0140 +A920 +A9E0 +ENDCHAR +STARTCHAR U_4C68 +ENCODING 19560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +6FA0 +9220 +FFA0 +AAA0 +FAA0 +ABA0 +FA20 +0720 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_4C69 +ENCODING 19561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +73E0 +9360 +FAA0 +ABE0 +FAA0 +ABE0 +FAA0 +02E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4C6A +ENCODING 19562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +73C0 +9100 +FFC0 +A900 +FFC0 +A920 +FAC0 +0680 +AA40 +AB20 +ENDCHAR +STARTCHAR U_4C6B +ENCODING 19563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FE40 +1140 +7D40 +5540 +7C40 +D4C0 +7FC0 +4440 +7FC0 +EAE0 +ENDCHAR +STARTCHAR U_4C6C +ENCODING 19564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +78A0 +92C0 +FA80 +ADE0 +F800 +ABE0 +FA20 +03E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4C6D +ENCODING 19565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9240 +FB40 +AEA0 +FAA0 +AAE0 +FAA0 +0340 +AA40 +ABE0 +ENDCHAR +STARTCHAR U_4C6E +ENCODING 19566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +77E0 +92A0 +FFA0 +AAA0 +FF60 +AA80 +FFE0 +0080 +A940 +AE20 +ENDCHAR +STARTCHAR U_4C6F +ENCODING 19567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +13E0 +FD40 +5480 +9360 +3F80 +6480 +3F80 +2480 +3F80 +4A40 +ENDCHAR +STARTCHAR U_4C70 +ENCODING 19568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_4C71 +ENCODING 19569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +93E0 +F940 +ABE0 +FCA0 +ABC0 +FAA0 +02A0 +AAA0 +A880 +ENDCHAR +STARTCHAR U_4C72 +ENCODING 19570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7A40 +9380 +F880 +AFE0 +F900 +AEA0 +F9C0 +06A0 +A8A0 +AB00 +ENDCHAR +STARTCHAR U_4C73 +ENCODING 19571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7800 +8BE0 +FAA0 +ABE0 +FAA0 +ABE0 +F880 +0BE0 +A880 +B3E0 +ENDCHAR +STARTCHAR U_4C74 +ENCODING 19572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +7A00 +92E0 +FEA0 +ABA0 +FAE0 +AAA0 +FAA0 +02E0 +AA00 +AAE0 +ENDCHAR +STARTCHAR U_4C75 +ENCODING 19573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +9520 +FA40 +ABC0 +F800 +AFE0 +F5A0 +0360 +ADA0 +AA60 +ENDCHAR +STARTCHAR U_4C76 +ENCODING 19574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +64E0 +AEA0 +FAC0 +AEA0 +FAA0 +AEA0 +F8A0 +2AE0 +AE80 +8080 +ENDCHAR +STARTCHAR U_4C77 +ENCODING 19575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1100 +7F00 +59E0 +6B40 +7D40 +5540 +7D40 +5480 +7D40 +AA20 +ENDCHAR +STARTCHAR U_4C78 +ENCODING 19576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +7AA0 +93E0 +FAA0 +ABE0 +F880 +ABE0 +F920 +00C0 +A8C0 +AB20 +ENDCHAR +STARTCHAR U_4C79 +ENCODING 19577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9080 +FBE0 +A880 +FFE0 +AA00 +FBE0 +0680 +A880 +AFE0 +ENDCHAR +STARTCHAR U_4C7A +ENCODING 19578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +93E0 +F800 +ABE0 +F800 +ABE0 +FA20 +03E0 +A940 +ABE0 +ENDCHAR +STARTCHAR U_4C7B +ENCODING 19579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7B40 +92C0 +FFE0 +AC20 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_4C7C +ENCODING 19580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7820 +AFE0 +FA40 +AFE0 +FA40 +AFE0 +FA80 +0AA0 +AA40 +B320 +ENDCHAR +STARTCHAR U_4C7D +ENCODING 19581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7140 +A3E0 +FC00 +ABE0 +FAA0 +ABE0 +FA00 +0BE0 +A520 +A9E0 +ENDCHAR +STARTCHAR U_4C7E +ENCODING 19582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +92A0 +FFE0 +AAA0 +FBE0 +AAA0 +F9E0 +0220 +A9C0 +AE20 +ENDCHAR +STARTCHAR U_4C7F +ENCODING 19583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7760 +9280 +FF80 +AAE0 +FFA0 +AAA0 +FFA0 +02A0 +AF20 +AA20 +ENDCHAR +STARTCHAR U_4C80 +ENCODING 19584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27C0 +F940 +57C0 +FA60 +2F80 +6480 +3F80 +2480 +3F80 +4A40 +ENDCHAR +STARTCHAR U_4C81 +ENCODING 19585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +7920 +8F20 +F8E0 +AF20 +F8A0 +AF60 +FA20 +0F20 +AAA0 +B260 +ENDCHAR +STARTCHAR U_4C82 +ENCODING 19586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +75E0 +AE00 +F9E0 +A8A0 +FE80 +AAC0 +FA80 +0A80 +AB80 +B460 +ENDCHAR +STARTCHAR U_4C83 +ENCODING 19587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7D40 +92A0 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +0880 +AFE0 +A2A0 +ENDCHAR +STARTCHAR U_4C84 +ENCODING 19588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7680 +98E0 +FF20 +AAA0 +FAA0 +AEA0 +FA40 +0F40 +A2A0 +A520 +ENDCHAR +STARTCHAR U_4C85 +ENCODING 19589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7AE0 +97A0 +FAE0 +AAA0 +FFE0 +AAA0 +FAE0 +0240 +ADC0 +A960 +ENDCHAR +STARTCHAR U_4C86 +ENCODING 19590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +0000 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C87 +ENCODING 19591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +73E0 +9480 +FBE0 +AAA0 +FBE0 +AA80 +FBC0 +02A0 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_4C88 +ENCODING 19592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +9000 +FFE0 +AA40 +FFE0 +AA40 +FB40 +0EE0 +AA40 +B240 +ENDCHAR +STARTCHAR U_4C89 +ENCODING 19593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +6AC0 +AF80 +FAE0 +AEA0 +FAA0 +AEA0 +FAA0 +0FA0 +AAA0 +B120 +ENDCHAR +STARTCHAR U_4C8A +ENCODING 19594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +6BE0 +AA80 +FCE0 +AB40 +FAE0 +AEA0 +F8E0 +08A0 +A8E0 +A920 +ENDCHAR +STARTCHAR U_4C8B +ENCODING 19595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +9240 +FFE0 +AA40 +FDA0 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C8C +ENCODING 19596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7780 +92E0 +FF40 +A840 +FF40 +A840 +FF40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_4C8D +ENCODING 19597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +77E0 +5100 +7FE0 +5480 +FFE0 +5540 +77C0 +5540 +57C0 +AAA0 +ENDCHAR +STARTCHAR U_4C8E +ENCODING 19598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +7480 +AEE0 +FBA0 +AEA0 +FAA0 +AEA0 +FA40 +0E40 +A2A0 +A320 +ENDCHAR +STARTCHAR U_4C8F +ENCODING 19599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +9240 +FDA0 +A800 +FFE0 +A920 +FBC0 +0140 +AA40 +ACC0 +ENDCHAR +STARTCHAR U_4C90 +ENCODING 19600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7880 +93E0 +FA80 +AAA0 +FBE0 +AAA0 +FBE0 +0280 +ABE0 +AD20 +ENDCHAR +STARTCHAR U_4C91 +ENCODING 19601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A100 +FBC0 +A900 +FFE0 +AAA0 +FFE0 +02A0 +AB40 +ACA0 +ENDCHAR +STARTCHAR U_4C92 +ENCODING 19602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7EA0 +92A0 +FF60 +B540 +FFE0 +B540 +FFE0 +1540 +A540 +A340 +ENDCHAR +STARTCHAR U_4C93 +ENCODING 19603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A80 +9440 +FBA0 +A800 +FEE0 +AAA0 +FEE0 +0440 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C94 +ENCODING 19604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +03E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_4C95 +ENCODING 19605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +F940 +AB60 +F940 +ABE0 +F940 +01C0 +A940 +A9C0 +ENDCHAR +STARTCHAR U_4C96 +ENCODING 19606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9080 +FFE0 +A8A0 +FBC0 +A840 +FFE0 +0540 +AFC0 +A840 +ENDCHAR +STARTCHAR U_4C97 +ENCODING 19607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +7760 +A880 +FFE0 +AA20 +FFA0 +AA20 +FEA0 +0B20 +AFA0 +A860 +ENDCHAR +STARTCHAR U_4C98 +ENCODING 19608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7BE0 +9540 +F880 +AFE0 +F820 +ABC0 +FA40 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C99 +ENCODING 19609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +6EE0 +B540 +FEE0 +AAA0 +FEA0 +AAA0 +FEA0 +08A0 +AAE0 +AE80 +ENDCHAR +STARTCHAR U_4C9A +ENCODING 19610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +7FA0 +9220 +FFE0 +AAA0 +FAE0 +AFA0 +FAE0 +0740 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C9B +ENCODING 19611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7FE0 +A280 +FFE0 +AAA0 +FFE0 +A820 +F7C0 +0D40 +A540 +A7C0 +ENDCHAR +STARTCHAR U_4C9C +ENCODING 19612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3B80 +7FC0 +D540 +7FC0 +5540 +AAA0 +5540 +7FC0 +5540 +7FC0 +AAA0 +ENDCHAR +STARTCHAR U_4C9D +ENCODING 19613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9240 +FC20 +ABC0 +FA40 +AA40 +FAC0 +0A40 +3220 +C3E0 +ENDCHAR +STARTCHAR U_4C9E +ENCODING 19614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +9080 +FFE0 +A800 +FA20 +AA20 +F940 +0940 +3000 +C7E0 +ENDCHAR +STARTCHAR U_4C9F +ENCODING 19615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +72E0 +92A0 +22A0 +FBA0 +AAA0 +FAA0 +ABE0 +FAA0 +0080 +F880 +ENDCHAR +STARTCHAR U_4CA0 +ENCODING 19616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7900 +93C0 +F900 +AFE0 +FA40 +AFE0 +FA40 +03C0 +1A40 +E3C0 +ENDCHAR +STARTCHAR U_4CA1 +ENCODING 19617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +2140 +FBE0 +AB60 +FB60 +AA20 +FBE0 +0220 +FBE0 +ENDCHAR +STARTCHAR U_4CA2 +ENCODING 19618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5180 +57C0 +7200 +5FE0 +5440 +7BA0 +5540 +57C0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_4CA3 +ENCODING 19619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2100 +FDE0 +A640 +F940 +A540 +F940 +A880 +F880 +A940 +FE20 +ENDCHAR +STARTCHAR U_4CA4 +ENCODING 19620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +7540 +9140 +FBE0 +AAA0 +FEA0 +AAA0 +FB60 +06A0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4CA5 +ENCODING 19621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FF00 +1120 +29E0 +FF00 +2500 +3F00 +2000 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_4CA6 +ENCODING 19622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +9100 +F7C0 +9100 +F100 +8100 +FA80 +2A80 +8A40 +3420 +ENDCHAR +STARTCHAR U_4CA7 +ENCODING 19623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +27C0 +2440 +27C0 +FC40 +27E0 +2400 +27E0 +3820 +C520 +0AE0 +ENDCHAR +STARTCHAR U_4CA8 +ENCODING 19624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +FC40 +27C0 +2440 +27E0 +2400 +27E0 +3AA0 +C520 +00C0 +ENDCHAR +STARTCHAR U_4CA9 +ENCODING 19625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2400 +2FE0 +2820 +2FE0 +2820 +4FE0 +5520 +9560 +ENDCHAR +STARTCHAR U_4CAA +ENCODING 19626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +2240 +FBC0 +2240 +23E0 +3200 +53E0 +4820 +4D60 +82A0 +ENDCHAR +STARTCHAR U_4CAB +ENCODING 19627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +53C0 +5240 +53C0 +5240 +53E0 +5200 +53E0 +5520 +9440 +8FE0 +ENDCHAR +STARTCHAR U_4CAC +ENCODING 19628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7B80 +4A80 +7A80 +4A80 +7BE0 +4280 +7A80 +AAA0 +8A60 +3320 +ENDCHAR +STARTCHAR U_4CAD +ENCODING 19629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +D3C0 +9240 +93C0 +FA40 +93E0 +9200 +93E0 +9020 +D560 +8AA0 +ENDCHAR +STARTCHAR U_4CAE +ENCODING 19630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FC0 +0440 +FFC0 +5440 +57C0 +5400 +57E0 +52A0 +5D20 +8560 +ENDCHAR +STARTCHAR U_4CAF +ENCODING 19631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4BC0 +4A40 +53C0 +5240 +7BE0 +4A00 +6BE0 +9020 +AAA0 +C960 +ENDCHAR +STARTCHAR U_4CB0 +ENCODING 19632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +73C0 +0240 +03C0 +FA40 +23E0 +2200 +43E0 +4D20 +FAA0 +0840 +ENDCHAR +STARTCHAR U_4CB1 +ENCODING 19633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +97E0 +F200 +93C0 +F240 +8240 +FA40 +0A40 +DA40 +AC80 +ENDCHAR +STARTCHAR U_4CB2 +ENCODING 19634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2960 +49A0 +4920 +A5C0 +2100 +21E0 +4820 +75E0 +8420 +00C0 +ENDCHAR +STARTCHAR U_4CB3 +ENCODING 19635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +03C0 +7240 +53E0 +5200 +53E0 +5820 +5560 +82A0 +ENDCHAR +STARTCHAR U_4CB4 +ENCODING 19636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +2A40 +B3C0 +A240 +A3E0 +2200 +23E0 +5020 +5560 +82A0 +ENDCHAR +STARTCHAR U_4CB5 +ENCODING 19637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +2B00 +4C80 +8800 +1400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +ENDCHAR +STARTCHAR U_4CB6 +ENCODING 19638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0000 +FFE0 +2900 +5F20 +95E0 +1F00 +1000 +1FC0 +2A40 +54C0 +ENDCHAR +STARTCHAR U_4CB7 +ENCODING 19639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +0800 +FF80 +4900 +8880 +ENDCHAR +STARTCHAR U_4CB8 +ENCODING 19640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +5240 +53E0 +5200 +53E0 +5020 +5560 +92A0 +ENDCHAR +STARTCHAR U_4CB9 +ENCODING 19641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +7240 +ABE0 +2200 +23E0 +2020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_4CBA +ENCODING 19642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4BC0 +FE40 +4BC0 +4A40 +7BE0 +4A00 +4BE0 +4820 +7D60 +02A0 +ENDCHAR +STARTCHAR U_4CBB +ENCODING 19643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +23C0 +4A40 +53E0 +2200 +4BE0 +8420 +FD60 +02A0 +ENDCHAR +STARTCHAR U_4CBC +ENCODING 19644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +5240 +7FC0 +9240 +13E0 +7E00 +13E0 +1020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_4CBD +ENCODING 19645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +4240 +7BE0 +AA00 +2BE0 +2920 +3EE0 +0040 +ENDCHAR +STARTCHAR U_4CBE +ENCODING 19646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2200 +27E0 +3020 +C9C0 +3F80 +2080 +3F80 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CBF +ENCODING 19647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4A40 +4BC0 +7A40 +53E0 +5E00 +53E0 +5420 +9960 +92A0 +ENDCHAR +STARTCHAR U_4CC0 +ENCODING 19648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +97C0 +F900 +9100 +FFE0 +8100 +F900 +0A80 +DA40 +AC20 +ENDCHAR +STARTCHAR U_4CC1 +ENCODING 19649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F220 +9200 +F7E0 +9200 +F2A0 +82A0 +FAA0 +0A40 +DAA0 +AD20 +ENDCHAR +STARTCHAR U_4CC2 +ENCODING 19650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2A40 +2BC0 +4A40 +9BE0 +0200 +7BE0 +4820 +4D60 +7AA0 +ENDCHAR +STARTCHAR U_4CC3 +ENCODING 19651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2900 +3F80 +2000 +3FC0 +D240 +3B80 +6A80 +1220 +63E0 +ENDCHAR +STARTCHAR U_4CC4 +ENCODING 19652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2BC0 +2A40 +ABC0 +BE40 +ABE0 +AA00 +ABE0 +BCA0 +E2A0 +8260 +ENDCHAR +STARTCHAR U_4CC5 +ENCODING 19653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F3E0 +9220 +F220 +9220 +F3E0 +8000 +F940 +0940 +DA20 +A420 +ENDCHAR +STARTCHAR U_4CC6 +ENCODING 19654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +47C0 +F440 +97C0 +9440 +F7E0 +9400 +97E0 +F2A0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_4CC7 +ENCODING 19655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +AAA0 +8BE0 +FE00 +8BE0 +AA00 +8BE0 +FC20 +09A0 +1A60 +ENDCHAR +STARTCHAR U_4CC8 +ENCODING 19656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +8A20 +FC20 +83A0 +FAA0 +83A0 +FA60 +0A00 +6A20 +9BE0 +ENDCHAR +STARTCHAR U_4CC9 +ENCODING 19657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +D3C0 +2240 +53C0 +8A00 +27E0 +52A0 +2560 +1060 +ENDCHAR +STARTCHAR U_4CCA +ENCODING 19658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +43E0 +FA20 +43E0 +4A20 +6BE0 +5300 +AAE0 +ABE0 +4120 +86E0 +ENDCHAR +STARTCHAR U_4CCB +ENCODING 19659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +FA20 +ABE0 +AA20 +FBE0 +2200 +2BE0 +3420 +C2A0 +0560 +ENDCHAR +STARTCHAR U_4CCC +ENCODING 19660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +03C0 +7A40 +4BE0 +7A00 +4BE0 +7820 +4D60 +9AA0 +ENDCHAR +STARTCHAR U_4CCD +ENCODING 19661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +5240 +53E0 +FA40 +03E0 +5020 +52A0 +8560 +ENDCHAR +STARTCHAR U_4CCE +ENCODING 19662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +9BC0 +8A40 +8BC0 +8A40 +DBE0 +8A00 +8BE0 +8820 +8AA0 +F960 +ENDCHAR +STARTCHAR U_4CCF +ENCODING 19663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F7C0 +4440 +F7C0 +4440 +47E0 +F400 +47E0 +42A0 +7AA0 +C860 +ENDCHAR +STARTCHAR U_4CD0 +ENCODING 19664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1940 +E280 +4C60 +3F00 +2900 +2500 +3FE0 +5520 +AAC0 +ENDCHAR +STARTCHAR U_4CD1 +ENCODING 19665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +4240 +FBC0 +CA40 +7BE0 +4A00 +7BE0 +4820 +4D60 +92A0 +ENDCHAR +STARTCHAR U_4CD2 +ENCODING 19666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7480 +2480 +FFE0 +4200 +FA20 +8940 +FC80 +0580 +F640 +0C20 +ENDCHAR +STARTCHAR U_4CD3 +ENCODING 19667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +73C0 +2A40 +FBC0 +2240 +43E0 +AA00 +33E0 +2820 +2D60 +3AA0 +ENDCHAR +STARTCHAR U_4CD4 +ENCODING 19668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +E780 +8080 +F780 +1000 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +ENDCHAR +STARTCHAR U_4CD5 +ENCODING 19669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +39E0 +C520 +55E0 +2920 +7DE0 +0900 +15E0 +7820 +92A0 +3560 +ENDCHAR +STARTCHAR U_4CD6 +ENCODING 19670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +9540 +F740 +9540 +F740 +8540 +FD40 +0F40 +D960 +A940 +ENDCHAR +STARTCHAR U_4CD7 +ENCODING 19671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +6480 +FFC0 +3200 +6500 +ENDCHAR +STARTCHAR U_4CD8 +ENCODING 19672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F660 +9240 +F7E0 +9240 +FA40 +8340 +FE60 +0AC0 +AA40 +B660 +ENDCHAR +STARTCHAR U_4CD9 +ENCODING 19673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA20 +ABE0 +AA00 +FBA0 +0200 +FBE0 +40A0 +BB20 +1220 +71E0 +ENDCHAR +STARTCHAR U_4CDA +ENCODING 19674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +03E0 +FA00 +23E0 +FAA0 +2560 +2040 +ENDCHAR +STARTCHAR U_4CDB +ENCODING 19675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BE0 +FA20 +8BE0 +FA00 +43E0 +FA00 +53E0 +9020 +6520 +9560 +ENDCHAR +STARTCHAR U_4CDC +ENCODING 19676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4B40 +F640 +23C0 +FA00 +23E0 +7020 +AAA0 +2520 +6060 +ENDCHAR +STARTCHAR U_4CDD +ENCODING 19677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +33C0 +FE40 +03E0 +7A00 +4BE0 +4AA0 +7D20 +4860 +ENDCHAR +STARTCHAR U_4CDE +ENCODING 19678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +7D00 +12C0 +3A40 +12C0 +FD40 +20C0 +7B40 +9040 +3D80 +1100 +ENDCHAR +STARTCHAR U_4CDF +ENCODING 19679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +EBC0 +AA40 +BBC0 +EA40 +BBC0 +AA00 +EBE0 +2AA0 +4D20 +98C0 +ENDCHAR +STARTCHAR U_4CE0 +ENCODING 19680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3C0 +2240 +FBC0 +2240 +ABE0 +FA00 +ABE0 +7520 +2AA0 +F060 +ENDCHAR +STARTCHAR U_4CE1 +ENCODING 19681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +43C0 +D240 +7BC0 +5240 +7BE0 +5200 +7BE0 +52A0 +7D60 +4420 +ENDCHAR +STARTCHAR U_4CE2 +ENCODING 19682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +7240 +53E0 +7200 +53E0 +FAA0 +5520 +8860 +ENDCHAR +STARTCHAR U_4CE3 +ENCODING 19683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +2120 +FFE0 +4940 +5F80 +B160 +1F00 +1100 +1FC0 +1540 +6A40 +ENDCHAR +STARTCHAR U_4CE4 +ENCODING 19684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +ABC0 +7240 +23C0 +FA40 +ABE0 +BA00 +EBE0 +A820 +AAA0 +8D60 +ENDCHAR +STARTCHAR U_4CE5 +ENCODING 19685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A5E0 +A520 +FDE0 +2120 +51E0 +AD00 +11E0 +F8A0 +4D20 +3560 +ENDCHAR +STARTCHAR U_4CE6 +ENCODING 19686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +8240 +7BC0 +0240 +7BE0 +4A00 +7BE0 +48A0 +7EA0 +C260 +ENDCHAR +STARTCHAR U_4CE7 +ENCODING 19687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F2E0 +9220 +F7E0 +9680 +FAE0 +8240 +FBE0 +0A40 +DAA0 +AB20 +ENDCHAR +STARTCHAR U_4CE8 +ENCODING 19688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +FBC0 +2200 +FBE0 +22A0 +3D20 +C560 +ENDCHAR +STARTCHAR U_4CE9 +ENCODING 19689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +AA40 +FFE0 +4A00 +FFE0 +4820 +32A0 +CD40 +ENDCHAR +STARTCHAR U_4CEA +ENCODING 19690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +ABE0 +AAA0 +FBE0 +0200 +FBE0 +2200 +FBE0 +A820 +ABA0 +8860 +ENDCHAR +STARTCHAR U_4CEB +ENCODING 19691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E900 +B7C0 +5A40 +53C0 +8A40 +7FE0 +2200 +FFE0 +20A0 +5AA0 +8A60 +ENDCHAR +STARTCHAR U_4CEC +ENCODING 19692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +73C0 +2240 +FBE0 +AA00 +FBE0 +2120 +FD60 +2440 +ENDCHAR +STARTCHAR U_4CED +ENCODING 19693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +AA40 +EBC0 +AA40 +ABE0 +EA00 +8BE0 +AEA0 +EAA0 +0860 +ENDCHAR +STARTCHAR U_4CEE +ENCODING 19694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4B80 +78A0 +4BC0 +4AA0 +BF80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CEF +ENCODING 19695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +23C0 +FA40 +23C0 +FA40 +ABE0 +FA00 +ABE0 +F820 +2560 +FAA0 +ENDCHAR +STARTCHAR U_4CF0 +ENCODING 19696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DC0 +5540 +55C0 +DD40 +49E0 +7F00 +49E0 +5C20 +6BA0 +4A60 +ENDCHAR +STARTCHAR U_4CF1 +ENCODING 19697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +5540 +FBE0 +20A0 +6360 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF2 +ENCODING 19698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +E400 +57E0 +E540 +55A0 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF3 +ENCODING 19699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBC0 +2240 +ABC0 +FA40 +03E0 +7200 +03E0 +F820 +7560 +AAA0 +ENDCHAR +STARTCHAR U_4CF4 +ENCODING 19700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +2240 +ABE0 +7200 +23E0 +7020 +A960 +22A0 +ENDCHAR +STARTCHAR U_4CF5 +ENCODING 19701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +51E0 +DD20 +75E0 +D520 +55E0 +F500 +55E0 +D420 +6560 +48A0 +ENDCHAR +STARTCHAR U_4CF6 +ENCODING 19702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F2A0 +9000 +F340 +9280 +F100 +81E0 +F8A0 +0BC0 +D940 +AA20 +ENDCHAR +STARTCHAR U_4CF7 +ENCODING 19703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AB60 +4580 +CB00 +52E0 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF8 +ENCODING 19704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +56C0 +5B40 +5FE0 +4020 +A560 +ENDCHAR +STARTCHAR U_4CF9 +ENCODING 19705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +9020 +F760 +9040 +FFE0 +85A0 +F540 +15A0 +D920 +31E0 +ENDCHAR +STARTCHAR U_4CFA +ENCODING 19706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +AA40 +73C0 +1240 +FBE0 +5200 +FBE0 +A820 +DD60 +FAA0 +ENDCHAR +STARTCHAR U_4CFB +ENCODING 19707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD00 +79E0 +7940 +FD40 +2A40 +7F00 +7F00 +7FE0 +AA20 +A960 +ENDCHAR +STARTCHAR U_4CFC +ENCODING 19708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +95C0 +F540 +95C0 +FC00 +87E0 +F6A0 +17E0 +F400 +17E0 +ENDCHAR +STARTCHAR U_4CFD +ENCODING 19709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +ABC0 +FA40 +53C0 +7A40 +D3E0 +7A00 +53E0 +7AA0 +5520 +7860 +ENDCHAR +STARTCHAR U_4CFE +ENCODING 19710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D080 +BBE0 +52A0 +ABE0 +7200 +53E0 +7200 +03E0 +5060 +3BA0 +E060 +ENDCHAR +STARTCHAR U_4CFF +ENCODING 19711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +6BE0 +BF20 +69E0 +A920 +49E0 +5500 +A1E0 +0020 +AAA0 +A860 +ENDCHAR +STARTCHAR U_4D00 +ENCODING 19712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2020 +3D60 +E540 +ENDCHAR +STARTCHAR U_4D01 +ENCODING 19713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +8320 +7DE0 +5520 +7DE0 +5500 +FFE0 +92A0 +9BA0 +A660 +ENDCHAR +STARTCHAR U_4D02 +ENCODING 19714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +93C0 +FA40 +ABC0 +AA40 +FBE0 +4A00 +B3E0 +7520 +AD60 +6040 +ENDCHAR +STARTCHAR U_4D03 +ENCODING 19715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7DE0 +1120 +FFE0 +4520 +EFE0 +4500 +FDE0 +4820 +4D60 +8AA0 +ENDCHAR +STARTCHAR U_4D04 +ENCODING 19716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E3C0 +AA40 +FFC0 +8640 +4BE0 +FE00 +ABE0 +7C20 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_4D05 +ENCODING 19717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +5520 +FFE0 +4520 +79E0 +4900 +79E0 +4820 +7AA0 +86E0 +ENDCHAR +STARTCHAR U_4D06 +ENCODING 19718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +53C0 +FA40 +53C0 +FA40 +23E0 +7200 +23E0 +F820 +52A0 +8AC0 +ENDCHAR +STARTCHAR U_4D07 +ENCODING 19719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +11C0 +FF40 +D5C0 +3940 +65E0 +9300 +79E0 +0AA0 +32A0 +1060 +ENDCHAR +STARTCHAR U_4D08 +ENCODING 19720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FBC0 +BA40 +EBC0 +BA40 +EBE0 +2200 +FBE0 +2020 +5160 +8AA0 +ENDCHAR +STARTCHAR U_4D09 +ENCODING 19721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +03C0 +FE40 +4BE0 +7A00 +57E0 +D820 +4D60 +6540 +ENDCHAR +STARTCHAR U_4D0A +ENCODING 19722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +2240 +FBC0 +2240 +FBE0 +5200 +FBE0 +5020 +FBA0 +4C60 +ENDCHAR +STARTCHAR U_4D0B +ENCODING 19723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F2A0 +93E0 +F000 +97E0 +FA20 +83E0 +F920 +2EC0 +AA40 +9320 +ENDCHAR +STARTCHAR U_4D0C +ENCODING 19724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +9240 +F7E0 +9420 +FBC0 +8100 +FEA0 +09C0 +AEA0 +B100 +ENDCHAR +STARTCHAR U_4D0D +ENCODING 19725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +AAE0 +EEA0 +AAE0 +AAA0 +EEE0 +AA80 +EEE0 +4420 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_4D0E +ENCODING 19726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1500 +FFE0 +AAA0 +FBE0 +1000 +3F80 +2480 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_4D0F +ENCODING 19727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FDE0 +4920 +79E0 +4520 +F7E0 +5500 +F7E0 +4020 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_4D10 +ENCODING 19728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FDC0 +9540 +69C0 +DD40 +69E0 +9D00 +71E0 +4820 +7AA0 +CE60 +ENDCHAR +STARTCHAR U_4D11 +ENCODING 19729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +49C0 +FD40 +A5C0 +FD40 +85E0 +7900 +49E0 +7AA0 +4AA0 +FC60 +ENDCHAR +STARTCHAR U_4D12 +ENCODING 19730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +10E0 +FEA0 +BAE0 +54A0 +FEE0 +AA80 +FEE0 +5420 +BBA0 +FE60 +ENDCHAR +STARTCHAR U_4D13 +ENCODING 19731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3C0 +2340 +FAC0 +AA40 +AAC0 +AA00 +ABE0 +A820 +B7E0 +2040 +ENDCHAR +STARTCHAR U_4D14 +ENCODING 19732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FB40 +52C0 +8A40 +5280 +53E0 +5020 +27E0 +5020 +88C0 +ENDCHAR +STARTCHAR U_4D15 +ENCODING 19733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +F920 +4920 +3460 +DF80 +1480 +1FC0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_4D16 +ENCODING 19734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +7B40 +22C0 +FE00 +4BE0 +7820 +4FE0 +7820 +48C0 +ENDCHAR +STARTCHAR U_4D17 +ENCODING 19735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7B40 +4AC0 +7A40 +4A80 +7BE0 +2820 +FFA0 +4820 +84C0 +ENDCHAR +STARTCHAR U_4D18 +ENCODING 19736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +53C0 +5A40 +5340 +7EC0 +5200 +7BE0 +4020 +7BA0 +A820 +CCC0 +ENDCHAR +STARTCHAR U_4D19 +ENCODING 19737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7FC0 +5140 +7BC0 +4540 +4FC0 +7500 +5FE0 +7420 +95A0 +0440 +ENDCHAR +STARTCHAR U_4D1A +ENCODING 19738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3880 +27E0 +F800 +8BC0 +DA40 +AA40 +DA40 +AA40 +8A40 +FC60 +ENDCHAR +STARTCHAR U_4D1B +ENCODING 19739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3AA0 +21C0 +FBE0 +8A20 +DBE0 +AA20 +ABE0 +DA20 +AA20 +FC60 +ENDCHAR +STARTCHAR U_4D1C +ENCODING 19740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +22A0 +FBE0 +8AA0 +DBE0 +A940 +A940 +D960 +AA40 +FA60 +ENDCHAR +STARTCHAR U_4D1D +ENCODING 19741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2140 +F9C0 +A940 +DFE0 +AA80 +FBE0 +AAA0 +DBC0 +AEA0 +F880 +ENDCHAR +STARTCHAR U_4D1E +ENCODING 19742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2360 +3DA0 +2360 +FDA0 +AAA0 +DA40 +AFE0 +FA40 +ABE0 +DA40 +FBE0 +ENDCHAR +STARTCHAR U_4D1F +ENCODING 19743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5100 +5DC0 +5120 +5FE0 +9900 +9520 +20E0 +ENDCHAR +STARTCHAR U_4D20 +ENCODING 19744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +7FC0 +5520 +58E0 +4F00 +4200 +5FE0 +8880 +B060 +ENDCHAR +STARTCHAR U_4D21 +ENCODING 19745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4920 +2940 +7FE0 +4A00 +7FC0 +4A40 +7FC0 +5A80 +9320 +9BE0 +ENDCHAR +STARTCHAR U_4D22 +ENCODING 19746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5120 +5CE0 +4200 +7FC0 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_4D23 +ENCODING 19747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FFC0 +AAA0 +FDC0 +9480 +FFE0 +A880 +BC80 +A880 +B880 +AD80 +ENDCHAR +STARTCHAR U_4D24 +ENCODING 19748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5080 +5EE0 +4B80 +5200 +4F80 +8200 +9FC0 +ENDCHAR +STARTCHAR U_4D25 +ENCODING 19749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +A100 +AD20 +B0E0 +9000 +BDE0 +9520 +ADE0 +ENDCHAR +STARTCHAR U_4D26 +ENCODING 19750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5080 +5AC0 +7FE0 +4000 +4F80 +8880 +0F80 +ENDCHAR +STARTCHAR U_4D27 +ENCODING 19751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FC80 +ABE0 +FC80 +ADC0 +FEA0 +8080 +ABE0 +BD40 +A880 +B760 +ENDCHAR +STARTCHAR U_4D28 +ENCODING 19752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE80 +ABE0 +FE20 +ABE0 +FE20 +ABE0 +BE80 +ABC0 +BAA0 +AD80 +ENDCHAR +STARTCHAR U_4D29 +ENCODING 19753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +7FE0 +5540 +5FC0 +4000 +9FC0 +B260 +ENDCHAR +STARTCHAR U_4D2A +ENCODING 19754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FC0 +5100 +79C0 +4A40 +57E0 +7AA0 +91C0 +92A0 +ENDCHAR +STARTCHAR U_4D2B +ENCODING 19755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +ABE0 +FEA0 +ADC0 +FC80 +A940 +BEA0 +A9C0 +A840 +BCC0 +ENDCHAR +STARTCHAR U_4D2C +ENCODING 19756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +BA80 +3880 +5480 +A280 +3C80 +6440 +1860 +E620 +ENDCHAR +STARTCHAR U_4D2D +ENCODING 19757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +F840 +A840 +57E0 +A8C0 +5140 +A940 +7240 +D440 +2940 +D080 +ENDCHAR +STARTCHAR U_4D2E +ENCODING 19758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +A880 +52A0 +AAA0 +52A0 +AAA0 +72A0 +D2A0 +22A0 +D3E0 +ENDCHAR +STARTCHAR U_4D2F +ENCODING 19759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +56A0 +B8A0 +5520 +A660 +78A0 +4B20 +3020 +CC40 +ENDCHAR +STARTCHAR U_4D30 +ENCODING 19760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +10A0 +FC80 +55E0 +BA80 +2880 +C4A0 +38A0 +E8C0 +3160 +CA20 +ENDCHAR +STARTCHAR U_4D31 +ENCODING 19761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FC80 +ABE0 +6A20 +B500 +4940 +A580 +7920 +C920 +3120 +C9E0 +ENDCHAR +STARTCHAR U_4D32 +ENCODING 19762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +AFE0 +5100 +ABC0 +5100 +AB80 +7540 +D920 +2100 +D100 +ENDCHAR +STARTCHAR U_4D33 +ENCODING 19763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +AFE0 +5420 +A800 +5140 +A940 +7140 +D240 +2220 +D420 +ENDCHAR +STARTCHAR U_4D34 +ENCODING 19764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +A9E0 +5100 +A900 +5100 +AFE0 +7420 +D420 +2420 +D7E0 +ENDCHAR +STARTCHAR U_4D35 +ENCODING 19765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +ABE0 +5140 +A940 +57E0 +A940 +7140 +D140 +2240 +D440 +ENDCHAR +STARTCHAR U_4D36 +ENCODING 19766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FB40 +A9C0 +52A0 +ADE0 +5080 +A3E0 +7080 +D3E0 +2080 +DFE0 +ENDCHAR +STARTCHAR U_4D37 +ENCODING 19767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +A820 +5380 +A800 +57E0 +AA80 +72A0 +D2A0 +24A0 +D860 +ENDCHAR +STARTCHAR U_4D38 +ENCODING 19768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FBA0 +AAA0 +5140 +ABE0 +7040 +97E0 +5080 +2080 +5280 +9100 +ENDCHAR +STARTCHAR U_4D39 +ENCODING 19769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +ABE0 +52A0 +8BE0 +2080 +77E0 +91C0 +52A0 +24A0 +D080 +ENDCHAR +STARTCHAR U_4D3A +ENCODING 19770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +AC40 +5280 +AFE0 +5000 +AFC0 +7440 +D440 +2440 +D7C0 +ENDCHAR +STARTCHAR U_4D3B +ENCODING 19771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +21E0 +FAA0 +2520 +FFE0 +2480 +5B40 +2E80 +D160 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_4D3C +ENCODING 19772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA80 +5120 +AEE0 +5280 +A240 +7FE0 +D140 +20A0 +D760 +ENDCHAR +STARTCHAR U_4D3D +ENCODING 19773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +AAA0 +53E0 +AAA0 +53E0 +A980 +7280 +D7E0 +2080 +D080 +ENDCHAR +STARTCHAR U_4D3E +ENCODING 19774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +A880 +53E0 +A880 +53E0 +A900 +71E0 +D280 +2480 +DBE0 +ENDCHAR +STARTCHAR U_4D3F +ENCODING 19775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +ABC0 +5000 +AFE0 +5200 +ADA0 +72C0 +D5A0 +2280 +D580 +ENDCHAR +STARTCHAR U_4D40 +ENCODING 19776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FAA0 +A9C0 +53E0 +AA20 +53A0 +AAE0 +7220 +D3E0 +2140 +D220 +ENDCHAR +STARTCHAR U_4D41 +ENCODING 19777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FAE0 +2F20 +72C0 +AA80 +7340 +AE40 +7BE0 +DA40 +2B40 +DAC0 +ENDCHAR +STARTCHAR U_4D42 +ENCODING 19778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2240 +77E0 +AD20 +77E0 +AD20 +7FA0 +D4A0 +27A0 +D460 +ENDCHAR +STARTCHAR U_4D43 +ENCODING 19779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FFE0 +5540 +BBE0 +26A0 +5BE0 +CAA0 +2BE0 +1140 +2A20 +C420 +ENDCHAR +STARTCHAR U_4D44 +ENCODING 19780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +AAA0 +73E0 +AAA0 +57E0 +8A20 +73E0 +D220 +3140 +4BE0 +ENDCHAR +STARTCHAR U_4D45 +ENCODING 19781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1340 +FCC0 +4920 +FFE0 +4A40 +B7A0 +4940 +0F00 +70C0 +ENDCHAR +STARTCHAR U_4D46 +ENCODING 19782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA40 +57E0 +AC20 +53C0 +A920 +76C0 +D180 +26C0 +D120 +ENDCHAR +STARTCHAR U_4D47 +ENCODING 19783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +41E0 +5440 +7F40 +5540 +5D40 +7680 +5C80 +5540 +9220 +ENDCHAR +STARTCHAR U_4D48 +ENCODING 19784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5600 +AFE0 +6220 +AFC0 +2A80 +15C0 +7FE0 +4880 +7DE0 +5DC0 +AAA0 +ENDCHAR +STARTCHAR U_4D49 +ENCODING 19785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5580 +7F60 +5540 +9D40 +94C0 +ENDCHAR +STARTCHAR U_4D4A +ENCODING 19786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +57C0 +5280 +7FE0 +5540 +FFC0 +5540 +57C0 +5000 +9280 +B440 +ENDCHAR +STARTCHAR U_4D4B +ENCODING 19787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57E0 +FA00 +03C0 +FE40 +ABC0 +FA40 +ABC0 +5240 +8AC0 +ENDCHAR +STARTCHAR U_4D4C +ENCODING 19788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57C0 +FD40 +AB40 +FBA0 +AD00 +F900 +5280 +5440 +8820 +ENDCHAR +STARTCHAR U_4D4D +ENCODING 19789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5000 +F9C0 +0140 +F9C0 +A800 +A9C0 +F880 +53E0 +8880 +ENDCHAR +STARTCHAR U_4D4E +ENCODING 19790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FAA0 +53E0 +F800 +23E0 +F900 +ABE0 +FAA0 +AAA0 +52A0 +8A60 +ENDCHAR +STARTCHAR U_4D4F +ENCODING 19791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F920 +55A0 +FB60 +05A0 +FB60 +A880 +FB40 +A8A0 +5040 +8B80 +ENDCHAR +STARTCHAR U_4D50 +ENCODING 19792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +53E0 +FD40 +02A0 +FBE0 +AAA0 +FBE0 +A880 +57E0 +8880 +ENDCHAR +STARTCHAR U_4D51 +ENCODING 19793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +F3E0 +2120 +F920 +7320 +A920 +51A0 +A920 +7120 +AA20 +64C0 +ENDCHAR +STARTCHAR U_4D52 +ENCODING 19794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1800 +E3C0 +2240 +FE40 +7240 +ABC0 +2240 +5240 +AA40 +73C0 +AA40 +ENDCHAR +STARTCHAR U_4D53 +ENCODING 19795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +2280 +FBE0 +7480 +A880 +5080 +AFE0 +A880 +7080 +A880 +6080 +ENDCHAR +STARTCHAR U_4D54 +ENCODING 19796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +23E0 +FC80 +73E0 +AAA0 +23E0 +DAA0 +ABE0 +71C0 +AAA0 +64A0 +ENDCHAR +STARTCHAR U_4D55 +ENCODING 19797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3E0 +2220 +FBE0 +7280 +ABE0 +5280 +AA80 +73E0 +AB20 +65E0 +ENDCHAR +STARTCHAR U_4D56 +ENCODING 19798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A140 +F880 +9140 +FFA0 +0400 +FFE0 +2A80 +D560 +2E80 +5540 +ENDCHAR +STARTCHAR U_4D57 +ENCODING 19799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2000 +FDC0 +6940 +A5C0 +5000 +ABE0 +AAA0 +73E0 +AEA0 +63E0 +ENDCHAR +STARTCHAR U_4D58 +ENCODING 19800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +2240 +FBC0 +7240 +AFE0 +5200 +ABE0 +AEA0 +72A0 +AD20 +6240 +ENDCHAR +STARTCHAR U_4D59 +ENCODING 19801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +27E0 +FA40 +75E0 +AB40 +2080 +5300 +A9E0 +72A0 +A8C0 +6700 +ENDCHAR +STARTCHAR U_4D5A +ENCODING 19802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +2720 +FD20 +72C0 +A900 +2660 +5420 +AF60 +7420 +AFE0 +6420 +ENDCHAR +STARTCHAR U_4D5B +ENCODING 19803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +4AA0 +FFA0 +6940 +DF40 +4AA0 +AFA0 +5100 +E7C0 +5100 +DFE0 +ENDCHAR +STARTCHAR U_4D5C +ENCODING 19804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +23E0 +FAA0 +73E0 +AAA0 +73E0 +AA00 +ABE0 +76A0 +AA40 +6B20 +ENDCHAR +STARTCHAR U_4D5D +ENCODING 19805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +D680 +BA80 +FE80 +1080 +7C80 +1080 +FE80 +0080 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_4D5E +ENCODING 19806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +D420 +BD20 +9520 +FD20 +1120 +7D20 +1120 +FC20 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4D5F +ENCODING 19807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +DC80 +B480 +FC80 +1080 +7BE0 +1080 +FC80 +0080 +A480 +A480 +ENDCHAR +STARTCHAR U_4D60 +ENCODING 19808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5500 +7DE0 +5520 +7E20 +1020 +7D20 +10A0 +FE20 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_4D61 +ENCODING 19809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFC0 +3580 +6EC0 +BFA0 +0400 +3F80 +0400 +FFE0 +5240 +ENDCHAR +STARTCHAR U_4D62 +ENCODING 19810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +F9C0 +2080 +7080 +23E0 +F880 +01C0 +51C0 +AAA0 +0080 +ENDCHAR +STARTCHAR U_4D63 +ENCODING 19811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7DE0 +6D20 +5520 +7DE0 +1120 +7D20 +11E0 +FE00 +0000 +ABE0 +ENDCHAR +STARTCHAR U_4D64 +ENCODING 19812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +FFE0 +2100 +7FC0 +5540 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_4D65 +ENCODING 19813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AC80 +FFE0 +2AA0 +72A0 +23E0 +FA00 +6A20 +D620 +A3E0 +ENDCHAR +STARTCHAR U_4D66 +ENCODING 19814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +AA40 +F840 +ADE0 +FA40 +2040 +7140 +2140 +FA40 +5240 +AEC0 +ENDCHAR +STARTCHAR U_4D67 +ENCODING 19815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +2100 +FFE0 +A900 +F940 +2140 +F880 +2180 +FEA0 +AA60 +ENDCHAR +STARTCHAR U_4D68 +ENCODING 19816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +5540 +7FE0 +5500 +7D40 +1180 +7AE0 +1280 +FAE0 +5580 +54E0 +ENDCHAR +STARTCHAR U_4D69 +ENCODING 19817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +3920 +F460 +3F80 +2E80 +3F80 +1500 +FFE0 +6AC0 +ENDCHAR +STARTCHAR U_4D6A +ENCODING 19818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +7DE0 +5520 +7DE0 +1000 +7D40 +11E0 +FF40 +AB40 +ABE0 +ENDCHAR +STARTCHAR U_4D6B +ENCODING 19819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A3A0 +5480 +AC40 +1780 +7FC0 +5540 +0400 +7FC0 +9120 +ENDCHAR +STARTCHAR U_4D6C +ENCODING 19820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CA0 +57C0 +7D80 +56C0 +7CA0 +1080 +7DE0 +1120 +FFE0 +AB20 +ABE0 +ENDCHAR +STARTCHAR U_4D6D +ENCODING 19821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +55C0 +7CA0 +54A0 +7FE0 +1080 +7FE0 +1320 +FDE0 +AB20 +ABE0 +ENDCHAR +STARTCHAR U_4D6E +ENCODING 19822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA20 +ABE0 +FA20 +23E0 +F800 +27E0 +3A00 +E7E0 +1520 +AAE0 +ENDCHAR +STARTCHAR U_4D6F +ENCODING 19823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +AB80 +FFE0 +FAA0 +23E0 +72A0 +23E0 +F080 +55C0 +AA80 +83E0 +ENDCHAR +STARTCHAR U_4D70 +ENCODING 19824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FE40 +ABC0 +FA40 +27E0 +7200 +27E0 +FAA0 +0520 +AAC0 +ENDCHAR +STARTCHAR U_4D71 +ENCODING 19825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F880 +AFE0 +FA40 +23C0 +F940 +27E0 +3A40 +EBC0 +AA40 +ENDCHAR +STARTCHAR U_4D72 +ENCODING 19826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA40 +FA40 +AFE0 +FDA0 +27E0 +7080 +27E0 +F9C0 +52A0 +ACA0 +ENDCHAR +STARTCHAR U_4D73 +ENCODING 19827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +AA40 +FDA0 +A800 +FFE0 +24A0 +FFE0 +2240 +FBC0 +AA40 +A3C0 +ENDCHAR +STARTCHAR U_4D74 +ENCODING 19828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FAA0 +ABE0 +F880 +23E0 +72A0 +23E0 +7AA0 +D7A0 +A8E0 +ENDCHAR +STARTCHAR U_4D75 +ENCODING 19829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +9240 +3F80 +2880 +2480 +FFE0 +2480 +DF60 +0400 +6B40 +ENDCHAR +STARTCHAR U_4D76 +ENCODING 19830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +8EE0 +0A80 +EEE0 +AAA0 +AEE0 +EAA0 +0EE0 +0A80 +33E0 +ENDCHAR +STARTCHAR U_4D77 +ENCODING 19831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EEE0 +4280 +EEE0 +0AA0 +4EE0 +EAA0 +4EE0 +6A00 +83E0 +ENDCHAR +STARTCHAR U_4D78 +ENCODING 19832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +22A0 +FC80 +7140 +AA20 +2420 +7FC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_4D79 +ENCODING 19833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E40 +ABE0 +7A40 +2E40 +D0C0 +7FC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_4D7A +ENCODING 19834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +4AA0 +4BA0 +4AA0 +EBA0 +4820 +4EE0 +4280 +6EE0 +8AA0 +12A0 +ENDCHAR +STARTCHAR U_4D7B +ENCODING 19835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3940 +2BE0 +B940 +ABE0 +B940 +A940 +FFE0 +2840 +EFE0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_4D7C +ENCODING 19836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7A40 +0FE0 +7A40 +8940 +5FA0 +54A0 +72E0 +1F80 +70E0 +90A0 +ENDCHAR +STARTCHAR U_4D7D +ENCODING 19837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +73E0 +5220 +7740 +5E80 +F560 +3F00 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4D7E +ENCODING 19838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6FE0 +A480 +2280 +F880 +23E0 +F880 +53E0 +7140 +5080 +FB60 +ENDCHAR +STARTCHAR U_4D7F +ENCODING 19839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +9120 +F4C0 +5720 +E400 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4D80 +ENCODING 19840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +4880 +7BC0 +5140 +FAE0 +0E00 +3180 +CE60 +1100 +1F00 +ENDCHAR +STARTCHAR U_4D81 +ENCODING 19841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +5640 +3D80 +D660 +2D80 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_4D82 +ENCODING 19842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8900 +DBE0 +8A20 +DC20 +A920 +F8A0 +A820 +F820 +AA20 +F6C0 +ENDCHAR +STARTCHAR U_4D83 +ENCODING 19843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8880 +D940 +8940 +FA20 +ACA0 +73C0 +A840 +F840 +AC80 +F880 +ENDCHAR +STARTCHAR U_4D84 +ENCODING 19844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8880 +DAA0 +89C0 +F880 +AFE0 +F880 +A880 +F880 +AC80 +E880 +ENDCHAR +STARTCHAR U_4D85 +ENCODING 19845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +89E0 +DB40 +8C80 +F940 +0620 +ABC0 +FA40 +ABC0 +F820 +A7C0 +ENDCHAR +STARTCHAR U_4D86 +ENCODING 19846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +9A40 +8BE0 +DE40 +8BE0 +FA40 +AA40 +FBE0 +AA40 +FA40 +A7E0 +ENDCHAR +STARTCHAR U_4D87 +ENCODING 19847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D880 +8BE0 +DAA0 +8BE0 +FAA0 +03E0 +A940 +F9C0 +A940 +F9C0 +A540 +ENDCHAR +STARTCHAR U_4D88 +ENCODING 19848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D880 +8BE0 +D880 +8BE0 +FAA0 +03E0 +AAA0 +F840 +ABE0 +F940 +A4C0 +ENDCHAR +STARTCHAR U_4D89 +ENCODING 19849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +8AE0 +DAA0 +8B60 +F940 +0240 +ABE0 +FAA0 +ABE0 +FAA0 +ABE0 +ENDCHAR +STARTCHAR U_4D8A +ENCODING 19850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4920 +7920 +4920 +FFE0 +A520 +FD20 +4920 +4920 +8BE0 +ENDCHAR +STARTCHAR U_4D8B +ENCODING 19851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7240 +5280 +7AE0 +5220 +FB20 +AB40 +FAC0 +5480 +5540 +9A20 +ENDCHAR +STARTCHAR U_4D8C +ENCODING 19852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +5C20 +6BA0 +FAA0 +ABA0 +FA20 +AA60 +FA00 +5220 +93E0 +ENDCHAR +STARTCHAR U_4D8D +ENCODING 19853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F9E0 +2160 +49A0 +FBE0 +26A0 +FBE0 +22A0 +23E0 +3940 +C240 +ENDCHAR +STARTCHAR U_4D8E +ENCODING 19854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +5940 +6A20 +7FE0 +5400 +7DC0 +5540 +FF40 +29C0 +C940 +ENDCHAR +STARTCHAR U_4D8F +ENCODING 19855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +11E0 +F960 +29A0 +FBE0 +A2A0 +FBE0 +6AA0 +6BE0 +B940 +2240 +ENDCHAR +STARTCHAR U_4D90 +ENCODING 19856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +7A40 +5DA0 +6800 +FBE0 +AAA0 +FBE0 +0120 +F9E0 +5120 +91E0 +ENDCHAR +STARTCHAR U_4D91 +ENCODING 19857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +5880 +6BE0 +FEA0 +ABE0 +F940 +ABE0 +F8C0 +5280 +95E0 +ENDCHAR +STARTCHAR U_4D92 +ENCODING 19858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +F5E0 +5540 +A0A0 +5F40 +4840 +5B40 +4C40 +9B20 +ENDCHAR +STARTCHAR U_4D93 +ENCODING 19859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F940 +AEA0 +AAC0 +AEA0 +AA40 +ABC0 +BA40 +23C0 +2440 +ENDCHAR +STARTCHAR U_4D94 +ENCODING 19860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B880 +A2A0 +FBE0 +06A0 +AAA0 +DAA0 +FAC0 +AA80 +DA20 +F9E0 +ENDCHAR +STARTCHAR U_4D95 +ENCODING 19861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B3E0 +A2A0 +FAA0 +02A0 +ABE0 +DA00 +AA00 +DA20 +8A20 +F9C0 +ENDCHAR +STARTCHAR U_4D96 +ENCODING 19862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B140 +A140 +FA20 +05E0 +A800 +DBE0 +A820 +D840 +8880 +F900 +ENDCHAR +STARTCHAR U_4D97 +ENCODING 19863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B7E0 +A040 +F840 +03C0 +AAC0 +DAC0 +ABC0 +D840 +8840 +F8C0 +ENDCHAR +STARTCHAR U_4D98 +ENCODING 19864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5880 +53E0 +F800 +0220 +DA20 +A920 +F940 +D940 +A800 +FBE0 +ENDCHAR +STARTCHAR U_4D99 +ENCODING 19865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B3E0 +A200 +FBC0 +0240 +AA40 +DA40 +ABC0 +DA00 +8A00 +FBE0 +ENDCHAR +STARTCHAR U_4D9A +ENCODING 19866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B080 +A080 +FBE0 +02A0 +AAA0 +DBE0 +A880 +D8A0 +89E0 +FA20 +ENDCHAR +STARTCHAR U_4D9B +ENCODING 19867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +2120 +7D20 +AA20 +1360 +6A00 +FFE0 +4940 +76C0 +4940 +7FC0 +ENDCHAR +STARTCHAR U_4D9C +ENCODING 19868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +5BE0 +5280 +FFE0 +0000 +ADE0 +D520 +AD20 +D520 +FDE0 +ENDCHAR +STARTCHAR U_4D9D +ENCODING 19869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +5C80 +53E0 +FC80 +A6A0 +B5C0 +CEA0 +FC80 +A540 +D540 +FE20 +ENDCHAR +STARTCHAR U_4D9E +ENCODING 19870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5D40 +53E0 +FF40 +ADC0 +D540 +FDC0 +AD40 +B7E0 +CD40 +FE20 +ENDCHAR +STARTCHAR U_4D9F +ENCODING 19871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +B9E0 +A220 +FA40 +0500 +AA60 +DA20 +AB60 +DA20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_4DA0 +ENCODING 19872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4080 +7FA0 +5540 +9DC0 +2120 +FFE0 +5240 +6DC0 +5240 +7FC0 +ENDCHAR +STARTCHAR U_4DA1 +ENCODING 19873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +AA20 +FAA0 +2EA0 +5AA0 +8EA0 +FAA0 +AEA0 +D8A0 +8A20 +FA60 +ENDCHAR +STARTCHAR U_4DA2 +ENCODING 19874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +B8A0 +AFE0 +F880 +2F80 +D880 +AEA0 +FAA0 +AE40 +D8C0 +F320 +ENDCHAR +STARTCHAR U_4DA3 +ENCODING 19875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5AA0 +53E0 +FC00 +01E0 +AD20 +D520 +FDE0 +AD20 +D4C0 +FFE0 +ENDCHAR +STARTCHAR U_4DA4 +ENCODING 19876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +BC40 +A5C0 +F540 +2FE0 +DA40 +ABC0 +FA40 +ABC0 +DA40 +FCC0 +ENDCHAR +STARTCHAR U_4DA5 +ENCODING 19877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +B880 +A3E0 +FAA0 +23E0 +DAA0 +AAE0 +FAA0 +AAE0 +DAA0 +FDE0 +ENDCHAR +STARTCHAR U_4DA6 +ENCODING 19878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +B7E0 +A100 +FBC0 +2100 +DFE0 +AA40 +FBC0 +AA40 +DBC0 +FC20 +ENDCHAR +STARTCHAR U_4DA7 +ENCODING 19879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +53E0 +FC80 +2BE0 +B540 +DFE0 +F540 +AFE0 +D540 +FD40 +8260 +ENDCHAR +STARTCHAR U_4DA8 +ENCODING 19880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B940 +A220 +FDC0 +0000 +ABE0 +AAA0 +FBE0 +A940 +AAA0 +FCA0 +ENDCHAR +STARTCHAR U_4DA9 +ENCODING 19881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +BFE0 +A280 +FD60 +2540 +DD60 +AA40 +FBC0 +AA40 +DBC0 +FC40 +ENDCHAR +STARTCHAR U_4DAA +ENCODING 19882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +BF60 +A240 +FFE0 +2A40 +D940 +AFC0 +F960 +AFC0 +D920 +FFA0 +ENDCHAR +STARTCHAR U_4DAB +ENCODING 19883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +B360 +A2A0 +F800 +23E0 +DA80 +8BE0 +FAA0 +ABA0 +DAA0 +8BC0 +FCA0 +ENDCHAR +STARTCHAR U_4DAC +ENCODING 19884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +2080 +FBC0 +5200 +FBC0 +5040 +73C0 +5220 +B3E0 +ENDCHAR +STARTCHAR U_4DAD +ENCODING 19885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4BE0 +F880 +4080 +53E0 +5080 +5480 +57E0 +5800 +4820 +97E0 +ENDCHAR +STARTCHAR U_4DAE +ENCODING 19886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7FC0 +0A80 +3320 +E1E0 +3F80 +0400 +7FC0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4DAF +ENCODING 19887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +F480 +57E0 +5AA0 +56E0 +9AC0 +6AA0 +27C0 +5A20 +85C0 +ENDCHAR +STARTCHAR U_4DB0 +ENCODING 19888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +4980 +FE80 +AA80 +EFE0 +2880 +FFE0 +2A80 +FE80 +20A0 +DEE0 +ENDCHAR +STARTCHAR U_4DB1 +ENCODING 19889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5A40 +D7E0 +22A0 +57E0 +4A80 +A7E0 +12A0 +47E0 +2220 +11E0 +ENDCHAR +STARTCHAR U_4DB2 +ENCODING 19890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +AAE0 +FE80 +AAE0 +FFA0 +8AE0 +8F80 +8AA0 +9EE0 +ENDCHAR +STARTCHAR U_4DB3 +ENCODING 19891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +3840 +45E0 +FE00 +AAE0 +FEA0 +00A0 +FEA0 +AAA0 +FEA0 +AB20 +ENDCHAR +STARTCHAR U_4DB4 +ENCODING 19892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +74A0 +5140 +8F20 +F0E0 +3F80 +2A80 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_4DB5 +ENCODING 19893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +4540 +BA60 +0240 +FFE0 +AAA0 +FEC0 +AB60 +FEA0 +AAA0 +8520 +ENDCHAR +STARTCHAR U_4E00 +ENCODING 19968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 2 0 4 +BITMAP +0040 +FFE0 +ENDCHAR +STARTCHAR U_4E01 +ENCODING 19969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E02 +ENCODING 19970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +1000 +3FC0 +0040 +0040 +0040 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_4E03 +ENCODING 19971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +0800 +08C0 +0F00 +F800 +0800 +0800 +0840 +0840 +07C0 +ENDCHAR +STARTCHAR U_4E04 +ENCODING 19972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E05 +ENCODING 19973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E06 +ENCODING 19974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 2 +BITMAP +FFE0 +0400 +0400 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_4E07 +ENCODING 19975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +0880 +0880 +1080 +1080 +2080 +4300 +ENDCHAR +STARTCHAR U_4E08 +ENCODING 19976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2400 +2400 +1400 +0800 +1400 +2200 +C1E0 +ENDCHAR +STARTCHAR U_4E09 +ENCODING 19977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +0000 +0000 +3F80 +0000 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E0A +ENCODING 19978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +07C0 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E0B +ENCODING 19979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +0600 +0500 +0480 +0480 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E0C +ENCODING 19980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +1100 +1100 +1100 +1100 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_4E0D +ENCODING 19981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0200 +0400 +0D00 +1480 +2440 +4420 +8400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E0E +ENCODING 19982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +1000 +1000 +1FC0 +0040 +FE40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_4E0F +ENCODING 19983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +4FC0 +4840 +4840 +7FC0 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_4E10 +ENCODING 19984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +4400 +47C0 +4400 +7FC0 +0040 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_4E11 +ENCODING 19985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7F80 +0880 +0880 +0880 +7F80 +1080 +1080 +1080 +1080 +FFE0 +ENDCHAR +STARTCHAR U_4E12 +ENCODING 19986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0840 +2840 +1840 +0C40 +0A40 +1040 +2040 +4380 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E13 +ENCODING 19987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0400 +0400 +FFE0 +0800 +1FC0 +0080 +0D00 +0200 +0100 +ENDCHAR +STARTCHAR U_4E14 +ENCODING 19988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +3F00 +2100 +2100 +2100 +3F00 +2100 +2100 +FFC0 +ENDCHAR +STARTCHAR U_4E15 +ENCODING 19989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0400 +0C00 +1480 +2440 +4420 +8420 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E16 +ENCODING 19990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +2480 +2480 +FFE0 +2480 +2480 +2480 +2780 +2000 +2000 +3FE0 +ENDCHAR +STARTCHAR U_4E17 +ENCODING 19991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +FFE0 +2480 +2480 +2480 +2480 +2480 +3F80 +2080 +ENDCHAR +STARTCHAR U_4E18 +ENCODING 19992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1000 +1FC0 +1100 +1100 +1100 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4E19 +ENCODING 19993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4640 +4940 +5040 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_4E1A +ENCODING 19994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0920 +8920 +4940 +2940 +2980 +0900 +0900 +0900 +FFE0 +ENDCHAR +STARTCHAR U_4E1B +ENCODING 19995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +1080 +2880 +2540 +4240 +8C20 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1C +ENCODING 19996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +1400 +2400 +7F80 +0400 +2500 +4480 +8440 +1C00 +ENDCHAR +STARTCHAR U_4E1D +ENCODING 19997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2940 +4A40 +F780 +1080 +2100 +4200 +F7C0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1E +ENCODING 19998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0220 +74C0 +1700 +2500 +4480 +8460 +0C00 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1F +ENCODING 19999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0400 +7FC0 +0400 +0400 +FFE0 +0800 +1100 +2080 +7FC0 +ENDCHAR +STARTCHAR U_4E20 +ENCODING 20000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1240 +F280 +1300 +1200 +3240 +D240 +11C0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E21 +ENCODING 20001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4440 +5540 +5540 +5540 +5F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_4E22 +ENCODING 20002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +0400 +7FC0 +0400 +0400 +FFE0 +0800 +1080 +3FC0 +1040 +ENDCHAR +STARTCHAR U_4E23 +ENCODING 20003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7BC0 +4A40 +4A40 +7BC0 +0A00 +1200 +1200 +2200 +ENDCHAR +STARTCHAR U_4E24 +ENCODING 20004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +1200 +7FC0 +5240 +5240 +5B40 +64C0 +4840 +4040 +40C0 +ENDCHAR +STARTCHAR U_4E25 +ENCODING 20005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +0A00 +7FC0 +4000 +4000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_4E26 +ENCODING 20006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0A00 +4A40 +4A40 +2A40 +2A80 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E27 +ENCODING 20007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +1500 +FFE0 +2440 +2280 +2100 +2C80 +3060 +ENDCHAR +STARTCHAR U_4E28 +ENCODING 20008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 6 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_4E29 +ENCODING 20009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +08 +88 +88 +88 +88 +98 +E8 +88 +08 +08 +08 +ENDCHAR +STARTCHAR U_4E2A +ENCODING 20010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +1400 +2200 +4900 +88C0 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2B +ENCODING 20011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8080 +4100 +2200 +2400 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2C +ENCODING 20012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 1 -1 +BITMAP +04 +44 +24 +24 +04 +14 +24 +C4 +44 +04 +04 +ENDCHAR +STARTCHAR U_4E2D +ENCODING 20013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2E +ENCODING 20014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +0880 +0880 +7E80 +0880 +0880 +FF80 +08A0 +08A0 +0860 +0820 +ENDCHAR +STARTCHAR U_4E2F +ENCODING 20015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0580 +0E00 +7440 +0580 +0E00 +7460 +0580 +1E00 +E400 +0400 +ENDCHAR +STARTCHAR U_4E30 +ENCODING 20016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E31 +ENCODING 20017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +9240 +9240 +9240 +9240 +B3C0 +D240 +1200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_4E32 +ENCODING 20018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +7F00 +4900 +7F00 +0800 +FF80 +8880 +8880 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR U_4E33 +ENCODING 20019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +7F80 +5280 +7F80 +1200 +FFC0 +9240 +FFC0 +1200 +2200 +C200 +ENDCHAR +STARTCHAR U_4E34 +ENCODING 20020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7E0 +A800 +B100 +A080 +AFE0 +A920 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4E35 +ENCODING 20021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +4A40 +2A80 +FFE0 +1100 +0A00 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E36 +ENCODING 20022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_4E37 +ENCODING 20023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 1 3 +BITMAP +80C0 +4080 +3100 +1200 +0400 +ENDCHAR +STARTCHAR U_4E38 +ENCODING 20024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F00 +0900 +0900 +2900 +1900 +1500 +2520 +4120 +80E0 +ENDCHAR +STARTCHAR U_4E39 +ENCODING 20025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1480 +1280 +1080 +FFE0 +1080 +1080 +1080 +2080 +4380 +ENDCHAR +STARTCHAR U_4E3A +ENCODING 20026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4800 +2800 +0800 +FF80 +0880 +0C80 +1280 +1280 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_4E3B +ENCODING 20027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0400 +0400 +0400 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E3C +ENCODING 20028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FE0 +1100 +1900 +1500 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E3D +ENCODING 20029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +7BC0 +4A40 +4A40 +6B40 +5AC0 +4A40 +4A40 +4A40 +5AC0 +ENDCHAR +STARTCHAR U_4E3E +ENCODING 20030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +FFE0 +1100 +2480 +5F40 +8420 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E3F +ENCODING 20031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 3 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_4E40 +ENCODING 20032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +2000 +2000 +5000 +8800 +0400 +0200 +0100 +00E0 +0040 +ENDCHAR +STARTCHAR U_4E41 +ENCODING 20033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FC00 +0400 +0400 +0400 +0400 +0200 +0200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_4E42 +ENCODING 20034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +2080 +2080 +1100 +1100 +1200 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E43 +ENCODING 20035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0880 +0880 +0900 +13E0 +1020 +1020 +2020 +2020 +4240 +8180 +ENDCHAR +STARTCHAR U_4E44 +ENCODING 20036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +0040 +0040 +0080 +0880 +0500 +0300 +0280 +8440 +9840 +E000 +ENDCHAR +STARTCHAR U_4E45 +ENCODING 20037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1F00 +2100 +4200 +0200 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4E46 +ENCODING 20038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1100 +1100 +2100 +3E00 +0200 +0500 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_4E47 +ENCODING 20039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0600 +F800 +0800 +0800 +0FC0 +F800 +0800 +0820 +0820 +07E0 +ENDCHAR +STARTCHAR U_4E48 +ENCODING 20040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0800 +1100 +2100 +4200 +8400 +0880 +1040 +7FE0 +2020 +ENDCHAR +STARTCHAR U_4E49 +ENCODING 20041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +2480 +2480 +2100 +1100 +1200 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E4A +ENCODING 20042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +01E0 +FE00 +0000 +0040 +4040 +2080 +1080 +1100 +ENDCHAR +STARTCHAR U_4E4B +ENCODING 20043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +0080 +0100 +0200 +0400 +0800 +3000 +4800 +87E0 +ENDCHAR +STARTCHAR U_4E4C +ENCODING 20044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1080 +1180 +1000 +1FE0 +0020 +FF20 +0020 +00C0 +ENDCHAR +STARTCHAR U_4E4D +ENCODING 20045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2400 +4400 +87C0 +0400 +0400 +07C0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E4E +ENCODING 20046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +2440 +1480 +1500 +FFE0 +0400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_4E4F +ENCODING 20047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +0800 +0400 +7F00 +0200 +0400 +0800 +3000 +4800 +87C0 +ENDCHAR +STARTCHAR U_4E50 +ENCODING 20048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C00 +4000 +4400 +4400 +7FC0 +0400 +2500 +4480 +8440 +0C00 +ENDCHAR +STARTCHAR U_4E51 +ENCODING 20049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FC00 +0440 +1480 +2500 +4600 +1600 +2500 +4480 +8460 +0440 +ENDCHAR +STARTCHAR U_4E52 +ENCODING 20050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1FC0 +1100 +1100 +FFE0 +0000 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_4E53 +ENCODING 20051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1FC0 +1100 +1100 +FFE0 +0000 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_4E54 +ENCODING 20052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0800 +FFE0 +1100 +2080 +D160 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E55 +ENCODING 20053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +7E00 +4200 +5FC0 +4200 +7FE0 +4200 +5FC0 +5240 +92C0 +8200 +ENDCHAR +STARTCHAR U_4E56 +ENCODING 20054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +7540 +1580 +3520 +D4E0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E57 +ENCODING 20055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +7FC0 +1500 +FFE0 +1500 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4E58 +ENCODING 20056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1540 +75A0 +1520 +FEE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4E59 +ENCODING 20057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_4E5A +ENCODING 20058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +82 +82 +82 +7E +ENDCHAR +STARTCHAR U_4E5B +ENCODING 20059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR U_4E5C +ENCODING 20060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1040 +13C0 +1C40 +F040 +1040 +1280 +1100 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_4E5D +ENCODING 20061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FE00 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_4E5E +ENCODING 20062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3F80 +4000 +BE00 +0400 +0800 +1000 +2040 +2040 +1FC0 +ENDCHAR +STARTCHAR U_4E5F +ENCODING 20063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +24C0 +2740 +3C40 +E440 +2540 +2480 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E60 +ENCODING 20064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0080 +2080 +1080 +1080 +0280 +0C80 +3080 +C080 +0480 +0300 +ENDCHAR +STARTCHAR U_4E61 +ENCODING 20065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2200 +7C00 +0880 +1100 +7F00 +0200 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_4E62 +ENCODING 20066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +2200 +2200 +AA00 +AA00 +AA00 +AA00 +AA00 +BA40 +EA40 +81C0 +ENDCHAR +STARTCHAR U_4E63 +ENCODING 20067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2200 +4200 +8A00 +F200 +1200 +2200 +4200 +9240 +FA40 +09C0 +ENDCHAR +STARTCHAR U_4E64 +ENCODING 20068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0480 +0460 +0420 +FF80 +0100 +0600 +3820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E65 +ENCODING 20069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FC40 +2080 +1100 +0000 +FFC0 +0300 +0C00 +3020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E66 +ENCODING 20070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0860 +7FA0 +0880 +0880 +FFE0 +0820 +0820 +0940 +0880 +0800 +ENDCHAR +STARTCHAR U_4E67 +ENCODING 20071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +4A00 +2200 +0FE0 +F200 +0200 +FF80 +0C00 +3000 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E68 +ENCODING 20072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +4900 +FD00 +0500 +7900 +4900 +4920 +4920 +78E0 +ENDCHAR +STARTCHAR U_4E69 +ENCODING 20073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2100 +2100 +FD00 +8500 +8500 +8520 +FD20 +84E0 +ENDCHAR +STARTCHAR U_4E6A +ENCODING 20074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +17C0 +1540 +2540 +27C0 +4540 +4540 +47C0 +8020 +8020 +7FE0 +ENDCHAR +STARTCHAR U_4E6B +ENCODING 20075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +55E0 +8800 +FFC0 +0700 +3820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6C +ENCODING 20076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +FFE0 +0700 +3800 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6D +ENCODING 20077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +3FC0 +5040 +9FC0 +0000 +7F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E6E +ENCODING 20078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +43C0 +4A40 +7A40 +4AC0 +1200 +FF80 +0C00 +3020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6F +ENCODING 20079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +1500 +FFE0 +0400 +0400 +7F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E70 +ENCODING 20080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0040 +2480 +1400 +4400 +2400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E71 +ENCODING 20081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +7100 +1100 +FF00 +1100 +1100 +7D00 +4500 +4520 +7D20 +44E0 +ENDCHAR +STARTCHAR U_4E72 +ENCODING 20082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0940 +2300 +C480 +4860 +3F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E73 +ENCODING 20083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +F500 +5500 +2900 +FD00 +0900 +1100 +1D00 +F120 +1120 +30E0 +ENDCHAR +STARTCHAR U_4E74 +ENCODING 20084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FB80 +1200 +FBE0 +1240 +2440 +FFC0 +0300 +3C00 +4040 +3FC0 +ENDCHAR +STARTCHAR U_4E75 +ENCODING 20085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FF00 +4500 +2900 +FD00 +1100 +7D00 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_4E76 +ENCODING 20086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +FF80 +1C20 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4E77 +ENCODING 20087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +8520 +4940 +2180 +CE00 +0000 +FF80 +1800 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4E78 +ENCODING 20088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +A2A0 +BAA0 +EFE0 +AAA0 +AAA0 +ABE0 +9840 +8020 +7FE0 +ENDCHAR +STARTCHAR U_4E79 +ENCODING 20089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +2200 +FA00 +8A00 +FA00 +8A00 +FA20 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_4E7A +ENCODING 20090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +4300 +7A00 +4BE0 +7A40 +4240 +8440 +7F00 +1820 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E7B +ENCODING 20091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +2140 +3A20 +4C80 +4940 +9080 +7FC0 +0C00 +1020 +1FE0 +ENDCHAR +STARTCHAR U_4E7C +ENCODING 20092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +47C0 +2100 +4FE0 +8000 +7FC0 +0C00 +1020 +1FE0 +ENDCHAR +STARTCHAR U_4E7D +ENCODING 20093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1880 +EF80 +0880 +7F80 +0620 +1820 +0FE0 +ENDCHAR +STARTCHAR U_4E7E +ENCODING 20094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +21E0 +FA00 +8BC0 +F840 +8880 +F900 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_4E7F +ENCODING 20095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +EA80 +5480 +2480 +7880 +2480 +7E80 +0880 +2CA0 +4AA0 +9960 +ENDCHAR +STARTCHAR U_4E80 +ENCODING 20096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3E00 +4200 +FF00 +4900 +7F00 +4900 +FF80 +8880 +FF80 +0840 +0FC0 +ENDCHAR +STARTCHAR U_4E81 +ENCODING 20097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +7D00 +4600 +7DE0 +4440 +FC80 +1120 +FE20 +11E0 +ENDCHAR +STARTCHAR U_4E82 +ENCODING 20098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +FD00 +2900 +FD00 +A500 +FD00 +AD00 +9520 +AD20 +84E0 +ENDCHAR +STARTCHAR U_4E83 +ENCODING 20099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5480 +FE80 +5480 +9280 +4480 +7E80 +D480 +3FA0 +44A0 +8460 +ENDCHAR +STARTCHAR U_4E84 +ENCODING 20100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +1080 +FE80 +8280 +BA80 +0080 +7C80 +4480 +7CA0 +28A0 +FE60 +ENDCHAR +STARTCHAR U_4E85 +ENCODING 20101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_4E86 +ENCODING 20102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0100 +0200 +0C00 +0800 +0800 +0800 +0800 +0800 +2800 +1000 +ENDCHAR +STARTCHAR U_4E87 +ENCODING 20103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2240 +4280 +8200 +0200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_4E88 +ENCODING 20104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +0A00 +0400 +FFE0 +0440 +0480 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E89 +ENCODING 20105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8A +ENCODING 20106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +1500 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +0C00 +ENDCHAR +STARTCHAR U_4E8B +ENCODING 20107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2480 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8C +ENCODING 20108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +7FC0 +0000 +0000 +0000 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E8D +ENCODING 20109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0200 +0200 +0200 +0200 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_4E8E +ENCODING 20110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8F +ENCODING 20111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0800 +1000 +3FC0 +0040 +0040 +0480 +0300 +ENDCHAR +STARTCHAR U_4E90 +ENCODING 20112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +0800 +FFE0 +1000 +3F80 +0080 +0080 +0080 +0500 +0200 +ENDCHAR +STARTCHAR U_4E91 +ENCODING 20113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +0000 +FFE0 +0800 +1000 +1100 +2080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_4E92 +ENCODING 20114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +1080 +1080 +1080 +3F00 +0100 +0100 +FFE0 +ENDCHAR +STARTCHAR U_4E93 +ENCODING 20115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +0000 +FFE0 +1100 +1100 +1100 +2100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E94 +ENCODING 20116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +3F80 +0880 +0880 +0880 +0880 +FFE0 +ENDCHAR +STARTCHAR U_4E95 +ENCODING 20117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FFC0 +1200 +1200 +1200 +FFC0 +2200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_4E96 +ENCODING 20118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0000 +0000 +3F80 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E97 +ENCODING 20119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +2480 +3F80 +0000 +0000 +3F80 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E98 +ENCODING 20120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E99 +ENCODING 20121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +1000 +1000 +1F00 +2900 +2500 +5200 +4A00 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR U_4E9A +ENCODING 20122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0A00 +0A00 +4A40 +2A40 +2A80 +2A80 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E9B +ENCODING 20123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5A80 +5320 +5220 +5A20 +E1E0 +0000 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E9C +ENCODING 20124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +4A40 +7FC0 +0A00 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E9D +ENCODING 20125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F00 +0000 +2100 +4A40 +FBE0 +0020 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E9E +ENCODING 20126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +1100 +1100 +71C0 +4040 +4040 +71C0 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4E9F +ENCODING 20127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +0400 +75C0 +5540 +5480 +7540 +0640 +1400 +0800 +FFE0 +ENDCHAR +STARTCHAR U_4EA0 +ENCODING 20128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +0800 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4EA1 +ENCODING 20129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0600 +0200 +FFE0 +2000 +2000 +2000 +2000 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_4EA2 +ENCODING 20130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0000 +1F00 +1100 +1100 +1100 +1120 +2120 +40E0 +ENDCHAR +STARTCHAR U_4EA3 +ENCODING 20131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +1100 +1100 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_4EA4 +ENCODING 20132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +1100 +2080 +5140 +1100 +0A00 +0400 +1B00 +60E0 +ENDCHAR +STARTCHAR U_4EA5 +ENCODING 20133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +1000 +2200 +7C80 +0900 +3200 +C600 +1900 +E0C0 +ENDCHAR +STARTCHAR U_4EA6 +ENCODING 20134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0900 +2940 +2920 +4920 +0900 +1100 +2100 +4700 +ENDCHAR +STARTCHAR U_4EA7 +ENCODING 20135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +1080 +0900 +3FE0 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_4EA8 +ENCODING 20136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +7FC0 +0100 +0600 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4EA9 +ENCODING 20137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +3F80 +2480 +3F80 +2480 +2480 +3F80 +2080 +ENDCHAR +STARTCHAR U_4EAA +ENCODING 20138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +5140 +9120 +6300 +0000 +7F80 +0080 +0080 +0060 +ENDCHAR +STARTCHAR U_4EAB +ENCODING 20139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2080 +3F80 +0000 +3F80 +0100 +7FE0 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_4EAC +ENCODING 20140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EAD +ENCODING 20141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8020 +BFA0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4EAE +ENCODING 20142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +1F00 +0000 +FFE0 +8020 +1F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_4EAF +ENCODING 20143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +2080 +3F80 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_4EB0 +ENCODING 20144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EB1 +ENCODING 20145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1000 +27C0 +6440 +A7C0 +2440 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4EB2 +ENCODING 20146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EB3 +ENCODING 20147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8320 +3C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_4EB4 +ENCODING 20148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8420 +7FC0 +0800 +7F00 +0920 +1120 +E1E0 +ENDCHAR +STARTCHAR U_4EB5 +ENCODING 20149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2200 +FF80 +2A80 +76A0 +A960 +3480 +E300 +2900 +70E0 +ENDCHAR +STARTCHAR U_4EB6 +ENCODING 20150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5140 +5F40 +4040 +7FC0 +2080 +3E80 +2780 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4EB7 +ENCODING 20151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FE0 +4A80 +7FE0 +4A80 +7F80 +5B00 +AA80 +CA60 +ENDCHAR +STARTCHAR U_4EB8 +ENCODING 20152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FA80 +57C0 +7540 +07C0 +F540 +17C0 +2100 +FFE0 +2100 +6100 +ENDCHAR +STARTCHAR U_4EB9 +ENCODING 20153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +60C0 +4E40 +6AC0 +4A40 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4EBA +ENCODING 20154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4EBB +ENCODING 20155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +10 +10 +20 +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_4EBC +ENCODING 20156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0A00 +0A00 +1100 +1080 +2060 +4040 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4EBD +ENCODING 20157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0400 +0400 +0A00 +1100 +2080 +C060 +0800 +0400 +0200 +0200 +ENDCHAR +STARTCHAR U_4EBE +ENCODING 20158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8400 +8400 +8400 +8400 +8A00 +8A00 +9100 +A0C0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_4EBF +ENCODING 20159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2100 +6200 +A200 +2400 +2400 +2820 +2820 +27E0 +ENDCHAR +STARTCHAR U_4EC0 +ENCODING 20160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EC1 +ENCODING 20161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +27C0 +2000 +6000 +A000 +2000 +2000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4EC2 +ENCODING 20162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2FE0 +6220 +A220 +2220 +2220 +2420 +2820 +30C0 +ENDCHAR +STARTCHAR U_4EC3 +ENCODING 20163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2080 +6080 +A080 +2080 +2080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_4EC4 +ENCODING 20164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4200 +4200 +4200 +4200 +4200 +4500 +4880 +5060 +A040 +ENDCHAR +STARTCHAR U_4EC5 +ENCODING 20165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2440 +2440 +6440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4EC6 +ENCODING 20166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +2300 +2280 +6260 +A220 +2200 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_4EC7 +ENCODING 20167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2F80 +6280 +A280 +2280 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4EC8 +ENCODING 20168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1480 +2480 +2480 +6480 +A480 +2480 +2840 +2840 +2820 +3020 +ENDCHAR +STARTCHAR U_4EC9 +ENCODING 20169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +1480 +2480 +6480 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4ECA +ENCODING 20170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C260 +0000 +3F80 +0100 +0200 +0200 +0400 +ENDCHAR +STARTCHAR U_4ECB +ENCODING 20171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +D160 +1100 +1100 +1100 +2100 +2100 +4100 +ENDCHAR +STARTCHAR U_4ECC +ENCODING 20172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2480 +4440 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4ECD +ENCODING 20173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2440 +2480 +4480 +45E0 +C420 +4420 +4420 +4820 +48A0 +5040 +ENDCHAR +STARTCHAR U_4ECE +ENCODING 20174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +2A80 +2A80 +4440 +8840 +1020 +ENDCHAR +STARTCHAR U_4ECF +ENCODING 20175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6200 +A200 +2200 +2400 +2480 +2840 +2FE0 +2020 +ENDCHAR +STARTCHAR U_4ED0 +ENCODING 20176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +C460 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4ED1 +ENCODING 20177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +D060 +1100 +1200 +1C00 +1040 +1040 +0FC0 +ENDCHAR +STARTCHAR U_4ED2 +ENCODING 20178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0800 +1400 +1200 +2100 +48C0 +8400 +0200 +1800 +0400 +0200 +ENDCHAR +STARTCHAR U_4ED3 +ENCODING 20179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +3F40 +D120 +1500 +1200 +1040 +1040 +0FC0 +ENDCHAR +STARTCHAR U_4ED4 +ENCODING 20180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4ED5 +ENCODING 20181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_4ED6 +ENCODING 20182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2540 +25C0 +6F40 +A540 +2540 +2580 +2520 +2420 +23E0 +ENDCHAR +STARTCHAR U_4ED7 +ENCODING 20183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +2FE0 +2080 +6480 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4ED8 +ENCODING 20184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +2080 +2FE0 +6080 +A480 +2280 +2280 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4ED9 +ENCODING 20185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2920 +6920 +A920 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4EDA +ENCODING 20186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C460 +0400 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_4EDB +ENCODING 20187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11C0 +2E00 +6200 +A200 +23E0 +3E00 +2200 +2200 +2220 +21E0 +ENDCHAR +STARTCHAR U_4EDC +ENCODING 20188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2100 +2100 +6100 +A100 +2100 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4EDD +ENCODING 20189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +C060 +3F80 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4EDE +ENCODING 20190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2120 +2120 +6520 +A520 +2920 +2220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4EDF +ENCODING 20191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EE0 +ENCODING 20192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2100 +6100 +A100 +2FE0 +2100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EE1 +ENCODING 20193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2800 +67C0 +A040 +2180 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4EE2 +ENCODING 20194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2400 +2400 +4FC0 +C840 +5040 +4440 +4340 +4140 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_4EE3 +ENCODING 20195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2200 +23E0 +6E00 +A200 +2200 +2100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_4EE4 +ENCODING 20196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2480 +C260 +3F80 +0100 +0A00 +0400 +0200 +ENDCHAR +STARTCHAR U_4EE5 +ENCODING 20197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0100 +8100 +9100 +8900 +8900 +8100 +9100 +A100 +C280 +8440 +1840 +ENDCHAR +STARTCHAR U_4EE6 +ENCODING 20198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6540 +A540 +2520 +2920 +2920 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4EE7 +ENCODING 20199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0780 +0400 +0400 +FFE0 +0400 +0600 +0900 +1080 +6060 +ENDCHAR +STARTCHAR U_4EE8 +ENCODING 20200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +2000 +6000 +A000 +27C0 +2000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4EE9 +ENCODING 20201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2200 +63C0 +A200 +2200 +2200 +2200 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4EEA +ENCODING 20202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1140 +2940 +2840 +6440 +A480 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4EEB +ENCODING 20203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2200 +2280 +6480 +A900 +2100 +2240 +2420 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4EEC +ENCODING 20204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +4A20 +4820 +C820 +4820 +4820 +4820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_4EED +ENCODING 20205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2240 +6240 +B240 +2E40 +2340 +24E0 +2440 +2840 +31C0 +ENDCHAR +STARTCHAR U_4EEE +ENCODING 20206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +2400 +2400 +67E0 +A620 +2520 +2540 +2880 +2940 +3220 +ENDCHAR +STARTCHAR U_4EEF +ENCODING 20207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2280 +2A40 +6A20 +AA20 +3240 +2240 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_4EF0 +ENCODING 20208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1DE0 +2920 +2920 +6920 +A920 +2B20 +2D20 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF1 +ENCODING 20209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +2880 +7260 +A100 +2FC0 +2080 +2080 +2100 +2200 +ENDCHAR +STARTCHAR U_4EF2 +ENCODING 20210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2FE0 +6920 +A920 +2FE0 +2920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF3 +ENCODING 20211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2480 +24A0 +67C0 +A480 +2480 +2480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_4EF4 +ENCODING 20212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6420 +A420 +27E0 +2420 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_4EF5 +ENCODING 20213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27C0 +2900 +6100 +A100 +3FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF6 +ENCODING 20214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +2500 +2FC0 +7100 +A100 +2FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF7 +ENCODING 20215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1300 +2480 +3860 +6480 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4EF8 +ENCODING 20216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +1100 +2100 +2FE0 +6100 +A300 +2280 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_4EF9 +ENCODING 20217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +A7C0 +2100 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4EFA +ENCODING 20218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +DF60 +1000 +1F00 +1000 +1000 +1F80 +ENDCHAR +STARTCHAR U_4EFB +ENCODING 20219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_4EFC +ENCODING 20220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +2100 +2100 +67C0 +A100 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4EFD +ENCODING 20221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +2240 +2440 +6820 +A7C0 +2240 +2240 +2240 +2440 +28C0 +ENDCHAR +STARTCHAR U_4EFE +ENCODING 20222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2200 +63E0 +A440 +2440 +2FC0 +2080 +2080 +3FE0 +ENDCHAR +STARTCHAR U_4EFF +ENCODING 20223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2200 +6200 +A3C0 +2240 +2240 +2440 +2440 +2980 +ENDCHAR +STARTCHAR U_4F00 +ENCODING 20224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1480 +2480 +2440 +6940 +A920 +3200 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F01 +ENCODING 20225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +2260 +C200 +1380 +1200 +1200 +1200 +7FE0 +ENDCHAR +STARTCHAR U_4F02 +ENCODING 20226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6FE0 +A920 +2920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4F03 +ENCODING 20227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2300 +6100 +AFE0 +2140 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_4F04 +ENCODING 20228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1140 +2140 +2FC0 +6900 +A900 +2FE0 +2120 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_4F05 +ENCODING 20229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6920 +A920 +2FE0 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_4F06 +ENCODING 20230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2AA0 +62A0 +A520 +2520 +2920 +2220 +2420 +20C0 +ENDCHAR +STARTCHAR U_4F07 +ENCODING 20231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1780 +2480 +2480 +6860 +B780 +2480 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F08 +ENCODING 20232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1080 +2080 +2200 +6200 +AA40 +2A20 +3220 +2240 +2240 +21C0 +ENDCHAR +STARTCHAR U_4F09 +ENCODING 20233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +6780 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F0A +ENCODING 20234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2240 +2240 +6FE0 +A240 +2240 +2FC0 +2200 +2400 +2800 +ENDCHAR +STARTCHAR U_4F0B +ENCODING 20235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2240 +2280 +62E0 +A220 +2220 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_4F0C +ENCODING 20236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2400 +25C0 +6540 +A540 +25C0 +2500 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F0D +ENCODING 20237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2200 +6200 +AFC0 +2240 +2440 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_4F0E +ENCODING 20238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +AFE0 +2440 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F0F +ENCODING 20239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +2120 +2100 +6FE0 +A100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F10 +ENCODING 20240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2200 +23E0 +7E20 +A240 +2280 +2100 +22A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_4F11 +ENCODING 20241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +3FE0 +6100 +A380 +2380 +2540 +2920 +3100 +2100 +ENDCHAR +STARTCHAR U_4F12 +ENCODING 20242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2400 +2400 +67E0 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4F13 +ENCODING 20243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2100 +6100 +A340 +2520 +2920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F14 +ENCODING 20244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2820 +2820 +6780 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F15 +ENCODING 20245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27C0 +2100 +6100 +AFE0 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F16 +ENCODING 20246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2200 +6200 +A3C0 +2640 +2540 +2880 +3340 +2C20 +ENDCHAR +STARTCHAR U_4F17 +ENCODING 20247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +D160 +1100 +1100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_4F18 +ENCODING 20248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1220 +2200 +3FE0 +6200 +A300 +2300 +2500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F19 +ENCODING 20249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2120 +2540 +6580 +A900 +2100 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F1A +ENCODING 20250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +0000 +7FC0 +0800 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4F1B +ENCODING 20251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2840 +2A40 +6980 +A880 +2940 +2A20 +2800 +2800 +2FE0 +ENDCHAR +STARTCHAR U_4F1C +ENCODING 20252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2F80 +6280 +A4A0 +38E0 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F1D +ENCODING 20253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2000 +2000 +6FE0 +A100 +2200 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F1E +ENCODING 20254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +3180 +C460 +2480 +1500 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4F1F +ENCODING 20255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +67C0 +A100 +2FE0 +2120 +2120 +2160 +2100 +ENDCHAR +STARTCHAR U_4F20 +ENCODING 20256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27E0 +2100 +6FE0 +A200 +27E0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_4F21 +ENCODING 20257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2400 +6500 +A900 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F22 +ENCODING 20258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2480 +2880 +6FE0 +A080 +2180 +2280 +2480 +3880 +2180 +ENDCHAR +STARTCHAR U_4F23 +ENCODING 20259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2840 +2A40 +6A40 +AA40 +2300 +2500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F24 +ENCODING 20260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2900 +6100 +A7E0 +2120 +2120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_4F25 +ENCODING 20261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1480 +2500 +2600 +6400 +BFC0 +2500 +2500 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4F26 +ENCODING 20262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6820 +A240 +2280 +2300 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_4F27 +ENCODING 20263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6FE0 +B440 +2440 +25C0 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F28 +ENCODING 20264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2820 +7220 +A120 +20A0 +2320 +2C20 +2020 +20C0 +ENDCHAR +STARTCHAR U_4F29 +ENCODING 20265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2000 +2FE0 +2440 +6440 +A280 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F2A +ENCODING 20266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1500 +2100 +2FE0 +6220 +A320 +22A0 +24A0 +2420 +2820 +30C0 +ENDCHAR +STARTCHAR U_4F2B +ENCODING 20267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +7040 +A000 +2000 +2000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4F2C +ENCODING 20268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +2420 +67E0 +A480 +2480 +2480 +2840 +2840 +3020 +ENDCHAR +STARTCHAR U_4F2D +ENCODING 20269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2200 +6440 +AF80 +2100 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F2E +ENCODING 20270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +48A0 +FEA0 +4AA0 +52A0 +52A0 +4A40 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_4F2F +ENCODING 20271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +27E0 +2420 +6420 +A7E0 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_4F30 +ENCODING 20272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2FE0 +6100 +A100 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F31 +ENCODING 20273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +6880 +B240 +2220 +2A80 +2A40 +3240 +2200 +2600 +ENDCHAR +STARTCHAR U_4F32 +ENCODING 20274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6400 +A520 +2540 +2580 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F33 +ENCODING 20275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1540 +2540 +2FE0 +6540 +A540 +2540 +25C0 +2540 +2400 +27E0 +ENDCHAR +STARTCHAR U_4F34 +ENCODING 20276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2540 +2100 +67C0 +A100 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F35 +ENCODING 20277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4AA0 +CAA0 +4AA0 +4AA0 +4AA0 +4CE0 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_4F36 +ENCODING 20278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +7920 +A080 +2FE0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_4F37 +ENCODING 20279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +CFE0 +4920 +4920 +4FE0 +4920 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_4F38 +ENCODING 20280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6FE0 +A920 +2920 +2FE0 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_4F39 +ENCODING 20281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +6440 +A7C0 +2440 +2440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_4F3A +ENCODING 20282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2020 +2FA0 +6020 +A720 +2520 +2520 +2720 +2020 +20E0 +ENDCHAR +STARTCHAR U_4F3B +ENCODING 20283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2100 +2920 +6520 +A540 +2FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F3C +ENCODING 20284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2A40 +2940 +2940 +6840 +A840 +2840 +2A80 +2CC0 +3120 +2620 +ENDCHAR +STARTCHAR U_4F3D +ENCODING 20285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +3EE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +32E0 +26A0 +ENDCHAR +STARTCHAR U_4F3E +ENCODING 20286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2100 +6300 +A540 +2920 +2120 +2100 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4F3F +ENCODING 20287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +6440 +A7C0 +2000 +2280 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_4F40 +ENCODING 20288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +4840 +C840 +4FC0 +4800 +4FE0 +4820 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_4F41 +ENCODING 20289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2200 +2440 +6FE0 +A020 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F42 +ENCODING 20290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +C100 +4100 +49C0 +4900 +4900 +4900 +4900 +5FE0 +ENDCHAR +STARTCHAR U_4F43 +ENCODING 20291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2920 +2920 +6920 +AFE0 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F44 +ENCODING 20292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4880 +FFE0 +4880 +4880 +4F80 +4880 +4880 +4880 +4F80 +ENDCHAR +STARTCHAR U_4F45 +ENCODING 20293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FC0 +2200 +6200 +BFE0 +2700 +2A80 +3240 +2220 +2200 +ENDCHAR +STARTCHAR U_4F46 +ENCODING 20294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A440 +2440 +27C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4F47 +ENCODING 20295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1080 +2FE0 +2820 +6000 +AFE0 +2100 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4F48 +ENCODING 20296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +3FE0 +2500 +6900 +AFE0 +3920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4F49 +ENCODING 20297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +BFE0 +2200 +2280 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F4A +ENCODING 20298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +C920 +4920 +4FC0 +4A40 +4A80 +5100 +5280 +6C60 +ENDCHAR +STARTCHAR U_4F4B +ENCODING 20299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4220 +C220 +4540 +4880 +57E0 +4420 +4420 +4420 +47E0 +ENDCHAR +STARTCHAR U_4F4C +ENCODING 20300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +54A0 +D7C0 +5480 +5480 +5480 +56A0 +54A0 +5860 +ENDCHAR +STARTCHAR U_4F4D +ENCODING 20301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2000 +2FE0 +6000 +A440 +2240 +2280 +2080 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F4E +ENCODING 20302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F00 +2900 +2900 +6900 +AFE0 +2900 +2920 +2AA0 +2D60 +28A0 +ENDCHAR +STARTCHAR U_4F4F +ENCODING 20303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2100 +6100 +A100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F50 +ENCODING 20304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2400 +6400 +A7C0 +2900 +2900 +3100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F51 +ENCODING 20305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2200 +6400 +A7C0 +2C40 +3440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F52 +ENCODING 20306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27C0 +2540 +6540 +A540 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F53 +ENCODING 20307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +5FC0 +4200 +C700 +4A80 +5240 +6220 +4F80 +4200 +4200 +ENDCHAR +STARTCHAR U_4F54 +ENCODING 20308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21E0 +2100 +6100 +A7C0 +2440 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F55 +ENCODING 20309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2040 +6F40 +A940 +2940 +2F40 +2940 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_4F56 +ENCODING 20310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +2480 +2480 +6C80 +B540 +3520 +2620 +2440 +2C40 +33C0 +ENDCHAR +STARTCHAR U_4F57 +ENCODING 20311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +6400 +A480 +2500 +2600 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F58 +ENCODING 20312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +3FC0 +0400 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4F59 +ENCODING 20313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +7FC0 +0400 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4F5A +ENCODING 20314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +2500 +2FC0 +6900 +A100 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F5B +ENCODING 20315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +5FC0 +C540 +5FC0 +5500 +5FE0 +4520 +45A0 +4940 +5100 +ENDCHAR +STARTCHAR U_4F5C +ENCODING 20316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2A00 +7200 +A3C0 +2200 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_4F5D +ENCODING 20317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +7720 +A520 +2520 +2720 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U_4F5E +ENCODING 20318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2000 +2FE0 +6100 +A100 +2FE0 +2240 +2480 +2380 +2E60 +ENDCHAR +STARTCHAR U_4F5F +ENCODING 20319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +2A80 +6100 +A680 +3860 +2300 +2080 +2600 +2180 +ENDCHAR +STARTCHAR U_4F60 +ENCODING 20320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +6100 +A540 +2540 +2920 +3120 +2120 +2300 +ENDCHAR +STARTCHAR U_4F61 +ENCODING 20321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6920 +A100 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F62 +ENCODING 20322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1400 +2400 +27C0 +6440 +A440 +27C0 +2400 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_4F63 +ENCODING 20323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +2FE0 +6920 +A920 +2FE0 +2920 +2920 +2920 +3060 +ENDCHAR +STARTCHAR U_4F64 +ENCODING 20324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1400 +2400 +2780 +6480 +A680 +2580 +2880 +2AA0 +2CA0 +2860 +ENDCHAR +STARTCHAR U_4F65 +ENCODING 20325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0C00 +1200 +2100 +DEC0 +0000 +0880 +4480 +2500 +2100 +FFC0 +ENDCHAR +STARTCHAR U_4F66 +ENCODING 20326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4200 +C200 +4400 +47E0 +4C20 +5420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_4F67 +ENCODING 20327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +23C0 +2200 +6200 +AFE0 +2200 +2300 +2280 +2240 +2200 +ENDCHAR +STARTCHAR U_4F68 +ENCODING 20328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +4FC0 +D040 +6F40 +4940 +4F40 +48C0 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_4F69 +ENCODING 20329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5040 +57C0 +5140 +D7C0 +5540 +5540 +5540 +55C0 +5540 +6120 +ENDCHAR +STARTCHAR U_4F6A +ENCODING 20330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2820 +2BA0 +6AA0 +AAA0 +2BA0 +2AA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F6B +ENCODING 20331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17C0 +2440 +2680 +6900 +A280 +2460 +3FC0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F6C +ENCODING 20332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FA0 +2240 +2280 +7FE0 +A200 +24C0 +2F00 +3420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F6D +ENCODING 20333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4C40 +D280 +4100 +4680 +5960 +47C0 +4900 +4FE0 +4100 +ENDCHAR +STARTCHAR U_4F6E +ENCODING 20334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +2880 +7040 +AFA0 +2000 +2FC0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_4F6F +ENCODING 20335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2100 +6100 +A7C0 +2100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F70 +ENCODING 20336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +27C0 +6440 +A440 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F71 +ENCODING 20337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +7FC0 +0400 +1780 +1400 +FFE0 +ENDCHAR +STARTCHAR U_4F72 +ENCODING 20338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +23C0 +4440 +CA80 +5100 +4200 +47C0 +4C40 +5440 +4440 +47C0 +ENDCHAR +STARTCHAR U_4F73 +ENCODING 20339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2100 +6FE0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F74 +ENCODING 20340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1440 +2440 +27C0 +6440 +A440 +27C0 +2440 +24E0 +3F40 +2040 +ENDCHAR +STARTCHAR U_4F75 +ENCODING 20341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +2FE0 +2480 +6480 +A480 +3FE0 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4F76 +ENCODING 20342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F77 +ENCODING 20343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A500 +2520 +24C0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4F78 +ENCODING 20344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6FE0 +A100 +2100 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F79 +ENCODING 20345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2480 +27E0 +6C00 +A5C0 +2540 +2540 +2580 +2920 +31E0 +ENDCHAR +STARTCHAR U_4F7A +ENCODING 20346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +2820 +67C0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F7B +ENCODING 20347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2AA0 +26C0 +6280 +A2C0 +26A0 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4F7C +ENCODING 20348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2280 +6440 +AAA0 +3280 +2280 +2100 +2280 +3C60 +ENDCHAR +STARTCHAR U_4F7D +ENCODING 20349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +29E0 +2620 +60A0 +A480 +3880 +2880 +2940 +2220 +2420 +ENDCHAR +STARTCHAR U_4F7E +ENCODING 20350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1440 +2820 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +2440 +25C0 +ENDCHAR +STARTCHAR U_4F7F +ENCODING 20351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +2FE0 +6920 +AFE0 +2900 +2500 +2200 +2580 +3860 +ENDCHAR +STARTCHAR U_4F80 +ENCODING 20352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2AA0 +2AA0 +6AA0 +BFA0 +2AA0 +2AA0 +2AA0 +2A20 +3220 +22E0 +ENDCHAR +STARTCHAR U_4F81 +ENCODING 20353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1500 +27C0 +2900 +6100 +AFE0 +2280 +2280 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F82 +ENCODING 20354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2800 +28C0 +6B00 +A900 +29E0 +2F00 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F83 +ENCODING 20355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2880 +2880 +4F80 +4000 +CA80 +4A80 +4A80 +4AA0 +52A0 +62E0 +ENDCHAR +STARTCHAR U_4F84 +ENCODING 20356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2440 +6FE0 +A120 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F85 +ENCODING 20357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +2440 +6F80 +A120 +2240 +2C80 +2140 +2220 +2C20 +ENDCHAR +STARTCHAR U_4F86 +ENCODING 20358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_4F87 +ENCODING 20359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27E0 +6120 +AFE0 +2900 +2FE0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F88 +ENCODING 20360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +2A80 +6300 +AD00 +23E0 +2620 +2940 +2180 +2E00 +ENDCHAR +STARTCHAR U_4F89 +ENCODING 20361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2BA0 +7000 +AFE0 +2200 +27C0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4F8A +ENCODING 20362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2920 +6540 +A100 +2FE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4F8B +ENCODING 20363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +24A0 +6BA0 +69A0 +BAA0 +26A0 +22A0 +2420 +2820 +3060 +ENDCHAR +STARTCHAR U_4F8C +ENCODING 20364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +2280 +DF60 +0200 +3FC0 +0000 +FFE0 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4F8D +ENCODING 20365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2100 +6FE0 +A040 +2FE0 +2440 +2240 +2040 +21C0 +ENDCHAR +STARTCHAR U_4F8E +ENCODING 20366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3240 +4A80 +C200 +5FE0 +4200 +4700 +4A80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_4F8F +ENCODING 20367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +27C0 +2900 +6100 +AFE0 +2380 +2540 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_4F90 +ENCODING 20368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +2FE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_4F91 +ENCODING 20369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +27C0 +6440 +AFC0 +3440 +27C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_4F92 +ENCODING 20370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2920 +2100 +6FE0 +A240 +2440 +2280 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_4F93 +ENCODING 20371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2140 +2FE0 +6140 +A7C0 +2100 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4F94 +ENCODING 20372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +2100 +6900 +AFE0 +3100 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F95 +ENCODING 20373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +2FE0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_4F96 +ENCODING 20374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0E00 +1100 +2E80 +4060 +BFC0 +2A40 +2A40 +3FC0 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_4F97 +ENCODING 20375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +6820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_4F98 +ENCODING 20376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +2180 +6600 +A2C0 +2F00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_4F99 +ENCODING 20377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +2120 +2FE0 +6100 +AF00 +2500 +2480 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_4F9A +ENCODING 20378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +77A0 +A4A0 +27A0 +24A0 +27A0 +2020 +2060 +ENDCHAR +STARTCHAR U_4F9B +ENCODING 20379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2480 +2FE0 +6480 +A480 +3FE0 +2000 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_4F9C +ENCODING 20380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2440 +2640 +6540 +BFE0 +2440 +2640 +2540 +2840 +30C0 +ENDCHAR +STARTCHAR U_4F9D +ENCODING 20381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2100 +6320 +A540 +2C80 +3480 +2440 +2520 +2620 +ENDCHAR +STARTCHAR U_4F9E +ENCODING 20382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +3EA0 +6AA0 +AAA0 +2AA0 +2AA0 +24A0 +24E0 +2AA0 +3000 +ENDCHAR +STARTCHAR U_4F9F +ENCODING 20383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2200 +65E0 +AC40 +37E0 +2440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_4FA0 +ENCODING 20384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6540 +A100 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FA1 +ENCODING 20385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +6280 +A280 +2FE0 +2AA0 +2AA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_4FA2 +ENCODING 20386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2100 +67C0 +A540 +27C0 +2540 +3FE0 +2440 +2540 +24C0 +ENDCHAR +STARTCHAR U_4FA3 +ENCODING 20387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A000 +2FE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4FA4 +ENCODING 20388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1740 +2280 +7FE0 +A100 +23C0 +2500 +2BC0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4FA5 +ENCODING 20389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2240 +22A0 +6120 +AEE0 +2000 +3FE0 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_4FA6 +ENCODING 20390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +2100 +27E0 +6420 +A520 +2520 +2520 +2280 +2240 +2C20 +ENDCHAR +STARTCHAR U_4FA7 +ENCODING 20391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3F20 +5120 +55A0 +D5A0 +55A0 +55A0 +5520 +4620 +4920 +5060 +ENDCHAR +STARTCHAR U_4FA8 +ENCODING 20392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +4200 +5FE0 +C480 +4840 +54A0 +4480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_4FA9 +ENCODING 20393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +2820 +67C0 +A000 +2FE0 +2100 +2200 +2440 +2FA0 +ENDCHAR +STARTCHAR U_4FAA +ENCODING 20394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6100 +A680 +3860 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4FAB +ENCODING 20395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +6400 +A7C0 +2200 +2FE0 +2480 +2300 +22C0 +2C40 +ENDCHAR +STARTCHAR U_4FAC +ENCODING 20396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6200 +A340 +2480 +2C80 +3440 +2540 +2620 +ENDCHAR +STARTCHAR U_4FAD +ENCODING 20397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +67C0 +A500 +2880 +2B40 +3120 +2400 +2300 +2100 +ENDCHAR +STARTCHAR U_4FAE +ENCODING 20398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1800 +27E0 +2520 +64A0 +AFE0 +2520 +24A0 +2FE0 +2020 +20C0 +ENDCHAR +STARTCHAR U_4FAF +ENCODING 20399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1080 +2FE0 +2400 +67C0 +A900 +2100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FB0 +ENCODING 20400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2240 +7FE0 +A240 +2FC0 +2400 +2FC0 +3440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FB1 +ENCODING 20401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +67C0 +A000 +2FE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FB2 +ENCODING 20402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +4800 +CFE0 +4A80 +4AA0 +4A40 +4A40 +53A0 +6220 +ENDCHAR +STARTCHAR U_4FB3 +ENCODING 20403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +2540 +2540 +6BA0 +A100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FB4 +ENCODING 20404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +2F60 +C040 +7D40 +1540 +7D40 +2640 +F8C0 +ENDCHAR +STARTCHAR U_4FB5 +ENCODING 20405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +4FC0 +4040 +DFE0 +5020 +4FC0 +4480 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_4FB6 +ENCODING 20406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +A200 +2FE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4FB7 +ENCODING 20407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2800 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +30C0 +ENDCHAR +STARTCHAR U_4FB8 +ENCODING 20408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +67C0 +A440 +27C0 +2000 +2440 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4FB9 +ENCODING 20409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2D80 +2480 +6480 +ABE0 +2C80 +2480 +3480 +2DC0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_4FBA +ENCODING 20410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +6100 +A280 +2540 +38A0 +27C0 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_4FBB +ENCODING 20411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FC0 +2840 +6840 +AFC0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FBC +ENCODING 20412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A820 +27C0 +2080 +2FE0 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4FBD +ENCODING 20413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +6540 +A7C0 +2100 +2FE0 +2220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4FBE +ENCODING 20414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1740 +2280 +7FE0 +A200 +27C0 +2900 +37E0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_4FBF +ENCODING 20415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +6FE0 +A920 +2FE0 +2500 +2200 +2500 +38E0 +ENDCHAR +STARTCHAR U_4FC0 +ENCODING 20416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F20 +2A20 +2540 +6100 +AFE0 +2240 +2440 +2380 +2140 +2E20 +ENDCHAR +STARTCHAR U_4FC1 +ENCODING 20417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +2A40 +2BC0 +6800 +AFC0 +2140 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4FC2 +ENCODING 20418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F00 +2200 +6480 +AF00 +2240 +2FE0 +2100 +2940 +3120 +2300 +ENDCHAR +STARTCHAR U_4FC3 +ENCODING 20419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +A100 +25C0 +2500 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_4FC4 +ENCODING 20420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1340 +1D20 +2500 +3FE0 +6500 +A720 +2D40 +3480 +25A0 +26A0 +2C60 +ENDCHAR +STARTCHAR U_4FC5 +ENCODING 20421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +1140 +2FE0 +2100 +6920 +A540 +2380 +2540 +3920 +2120 +2700 +ENDCHAR +STARTCHAR U_4FC6 +ENCODING 20422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +6820 +B7E0 +2100 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_4FC7 +ENCODING 20423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3BE0 +4880 +5480 +C480 +4FE0 +5480 +6480 +4480 +5480 +4BE0 +ENDCHAR +STARTCHAR U_4FC8 +ENCODING 20424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +27C0 +6900 +B100 +2FE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FC9 +ENCODING 20425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2FC0 +2240 +6240 +BFE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FCA +ENCODING 20426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +22A0 +6640 +ABE0 +2440 +2A80 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4FCB +ENCODING 20427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +2780 +2000 +6FC0 +A940 +2940 +2FC0 +2800 +2820 +27E0 +ENDCHAR +STARTCHAR U_4FCC +ENCODING 20428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2FE0 +6200 +AFC0 +2A40 +2FC0 +2A40 +2FC0 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_4FCD +ENCODING 20429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FC0 +2840 +6FC0 +A840 +2FC0 +2920 +28C0 +2A40 +2C20 +ENDCHAR +STARTCHAR U_4FCE +ENCODING 20430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +53C0 +8A40 +2240 +23C0 +2240 +5240 +8A40 +0FE0 +ENDCHAR +STARTCHAR U_4FCF +ENCODING 20431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +14A0 +22C0 +27E0 +6420 +A7E0 +2420 +2420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_4FD0 +ENCODING 20432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2320 +3C20 +24A0 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +24A0 +2420 +2460 +ENDCHAR +STARTCHAR U_4FD1 +ENCODING 20433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +2100 +2FE0 +6920 +AFE0 +2920 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_4FD2 +ENCODING 20434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +6380 +A000 +2FE0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FD3 +ENCODING 20435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1540 +2540 +2A80 +6540 +A540 +2FE0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FD4 +ENCODING 20436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A440 +27C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FD5 +ENCODING 20437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +6820 +A100 +2FE0 +2300 +2580 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_4FD6 +ENCODING 20438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2380 +2540 +6920 +A100 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FD7 +ENCODING 20439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1440 +2920 +2180 +6240 +A420 +3FC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FD8 +ENCODING 20440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F20 +2A20 +2540 +6FE0 +A080 +2100 +3FE0 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4FD9 +ENCODING 20441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1660 +1180 +2660 +2100 +6FE0 +A500 +2FE0 +3520 +2520 +2560 +2100 +ENDCHAR +STARTCHAR U_4FDA +ENCODING 20442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2920 +2FE0 +6920 +AFE0 +2100 +2FE0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_4FDB +ENCODING 20443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17C0 +2880 +3FE0 +6920 +A920 +2FE0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FDC +ENCODING 20444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +27C0 +6540 +BFE0 +2200 +27C0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4FDD +ENCODING 20445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +AFE0 +2100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_4FDE +ENCODING 20446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +CF60 +3C40 +2540 +3D40 +2540 +3D40 +2440 +2CC0 +ENDCHAR +STARTCHAR U_4FDF +ENCODING 20447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +2420 +67C0 +A900 +2100 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE0 +ENCODING 20448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6540 +A540 +2BA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE1 +ENCODING 20449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +67C0 +A000 +27C0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FE2 +ENCODING 20450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2640 +6980 +A240 +2520 +2A80 +2520 +2240 +2080 +2700 +ENDCHAR +STARTCHAR U_4FE3 +ENCODING 20451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6000 +A7C0 +2100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE4 +ENCODING 20452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +6120 +AFE0 +2900 +2FE0 +2320 +2520 +2960 +2100 +ENDCHAR +STARTCHAR U_4FE5 +ENCODING 20453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +6FC0 +AA40 +2FC0 +2A40 +2FC0 +2200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_4FE6 +ENCODING 20454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +2FE0 +6200 +AFE0 +2440 +2FE0 +3440 +2240 +20C0 +ENDCHAR +STARTCHAR U_4FE7 +ENCODING 20455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6100 +A100 +27C0 +2200 +2940 +2AA0 +3240 +23C0 +ENDCHAR +STARTCHAR U_4FE8 +ENCODING 20456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1280 +2AA0 +26C0 +6FE0 +A800 +2800 +2800 +2800 +2800 +3000 +ENDCHAR +STARTCHAR U_4FE9 +ENCODING 20457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +4480 +5FE0 +D4A0 +54A0 +56A0 +5960 +5220 +5020 +50E0 +ENDCHAR +STARTCHAR U_4FEA +ENCODING 20458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +5DE0 +5520 +D520 +5DA0 +5560 +5520 +5520 +5520 +5560 +ENDCHAR +STARTCHAR U_4FEB +ENCODING 20459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6540 +A380 +3FE0 +2300 +2580 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_4FEC +ENCODING 20460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +3C40 +4440 +4440 +DF40 +4480 +4E80 +55A0 +6520 +45E0 +4520 +ENDCHAR +STARTCHAR U_4FED +ENCODING 20461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1300 +2480 +2840 +77A0 +A000 +2A40 +2540 +2540 +2080 +3FE0 +ENDCHAR +STARTCHAR U_4FEE +ENCODING 20462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2D40 +2880 +6B40 +ACA0 +2940 +2A80 +2920 +20C0 +2700 +ENDCHAR +STARTCHAR U_4FEF +ENCODING 20463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2A40 +2A40 +6BE0 +AE40 +2B40 +2AC0 +2A40 +2A40 +32C0 +ENDCHAR +STARTCHAR U_4FF0 +ENCODING 20464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +1C00 +24E0 +64A0 +BFA0 +24A0 +2EA0 +2DA0 +34E0 +24A0 +2400 +ENDCHAR +STARTCHAR U_4FF1 +ENCODING 20465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_4FF2 +ENCODING 20466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +3F80 +69E0 +AAA0 +31A0 +2AA0 +24A0 +2B20 +31A0 +2240 +ENDCHAR +STARTCHAR U_4FF3 +ENCODING 20467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2EE0 +2280 +6280 +AEE0 +2280 +2280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_4FF4 +ENCODING 20468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2140 +23A0 +6C60 +A280 +2240 +2FE0 +2140 +21A0 +2E60 +ENDCHAR +STARTCHAR U_4FF5 +ENCODING 20469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2520 +2CC0 +3480 +2540 +2620 +ENDCHAR +STARTCHAR U_4FF6 +ENCODING 20470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +2EA0 +48A0 +FEA0 +48A0 +5CA0 +6A40 +4840 +48A0 +5920 +ENDCHAR +STARTCHAR U_4FF7 +ENCODING 20471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +52A0 +D2A0 +5EA0 +53E0 +5E00 +5200 +5220 +5220 +67E0 +ENDCHAR +STARTCHAR U_4FF8 +ENCODING 20472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27E0 +6200 +AFE0 +2540 +2BA0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4FF9 +ENCODING 20473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4500 +C500 +5DC0 +5040 +5040 +5DC0 +4500 +4500 +7FE0 +ENDCHAR +STARTCHAR U_4FFA +ENCODING 20474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FC0 +2500 +2A80 +6FC0 +BAA0 +2F80 +2A80 +2FA0 +2220 +23E0 +ENDCHAR +STARTCHAR U_4FFB +ENCODING 20475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2C80 +3300 +6480 +B860 +2FC0 +2A40 +2FC0 +2A40 +2FC0 +ENDCHAR +STARTCHAR U_4FFC +ENCODING 20476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2FE0 +6000 +A7C0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FFD +ENCODING 20477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2680 +3900 +51E0 +DE20 +5480 +5480 +5480 +5480 +5540 +5520 +6620 +ENDCHAR +STARTCHAR U_4FFE +ENCODING 20478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2920 +2FE0 +6920 +AFE0 +2280 +2480 +3FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_4FFF +ENCODING 20479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1200 +2FE0 +2A40 +6F80 +AA40 +29C0 +2800 +2B80 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_5000 +ENCODING 20480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1400 +2780 +2400 +6780 +A400 +3FE0 +2540 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_5001 +ENCODING 20481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +4EE0 +D4A0 +64A0 +5EA0 +44A0 +44A0 +4AA0 +49E0 +5100 +ENDCHAR +STARTCHAR U_5002 +ENCODING 20482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1240 +2480 +2EE0 +6440 +A440 +2EE0 +2440 +2440 +2840 +3040 +ENDCHAR +STARTCHAR U_5003 +ENCODING 20483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EC0 +52A0 +EAA0 +4480 +4B00 +70E0 +4FC0 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_5004 +ENCODING 20484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14C0 +1300 +2480 +2FE0 +6400 +AFC0 +3440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_5005 +ENCODING 20485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2440 +6440 +AAA0 +2100 +3FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5006 +ENCODING 20486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2100 +2FE0 +6920 +ADA0 +2B60 +2DA0 +2B60 +2920 +2960 +ENDCHAR +STARTCHAR U_5007 +ENCODING 20487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2820 +2400 +6EE0 +AAA0 +2AA0 +36E0 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_5008 +ENCODING 20488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2540 +6540 +ABA0 +3100 +2380 +2540 +2920 +3100 +ENDCHAR +STARTCHAR U_5009 +ENCODING 20489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +C260 +1F80 +1280 +1F80 +1000 +2FC0 +2840 +4FC0 +ENDCHAR +STARTCHAR U_500A +ENCODING 20490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +4A40 +D220 +4480 +4F40 +4200 +4140 +5420 +5480 +4380 +ENDCHAR +STARTCHAR U_500B +ENCODING 20491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +2FE0 +6920 +ABA0 +2AA0 +2BA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_500C +ENCODING 20492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +67C0 +A440 +27C0 +2400 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_500D +ENCODING 20493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2440 +6280 +AFE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_500E +ENCODING 20494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2AA0 +2AA0 +6FE0 +AAA0 +2AA0 +3FE0 +2480 +2860 +3020 +ENDCHAR +STARTCHAR U_500F +ENCODING 20495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2640 +2980 +6E60 +A980 +2940 +2FE0 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_5010 +ENCODING 20496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5680 +D900 +5280 +5C60 +5100 +5540 +5900 +4280 +4C60 +ENDCHAR +STARTCHAR U_5011 +ENCODING 20497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +2AA0 +6EE0 +A820 +2820 +2820 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_5012 +ENCODING 20498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3F20 +48A0 +52A0 +DFA0 +44A0 +44A0 +5FA0 +44A0 +4720 +5860 +ENDCHAR +STARTCHAR U_5013 +ENCODING 20499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1580 +2900 +2280 +6440 +B920 +2540 +2580 +2A80 +2440 +3820 +ENDCHAR +STARTCHAR U_5014 +ENCODING 20500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +6880 +AAA0 +2AA0 +2BE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_5015 +ENCODING 20501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2FE0 +6540 +BFE0 +2540 +2540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_5016 +ENCODING 20502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A440 +2280 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_5017 +ENCODING 20503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +6EE0 +AAA0 +2AA0 +2EE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_5018 +ENCODING 20504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2540 +2FE0 +6820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_5019 +ENCODING 20505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2080 +5FE0 +5400 +D7C0 +5900 +5FE0 +5100 +5280 +4440 +4820 +ENDCHAR +STARTCHAR U_501A +ENCODING 20506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2280 +2440 +7FE0 +A040 +2F40 +2940 +2F40 +2040 +21C0 +ENDCHAR +STARTCHAR U_501B +ENCODING 20507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2440 +27C0 +6440 +A7C0 +2440 +3FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_501C +ENCODING 20508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FA0 +2920 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +30E0 +ENDCHAR +STARTCHAR U_501D +ENCODING 20509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +1080 +7C80 +4480 +7D40 +4540 +7D40 +1240 +FE20 +1420 +ENDCHAR +STARTCHAR U_501E +ENCODING 20510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +67C0 +A440 +27C0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_501F +ENCODING 20511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2480 +7FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5020 +ENCODING 20512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +27E0 +6C80 +B480 +27E0 +2480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_5021 +ENCODING 20513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A000 +2FE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5022 +ENCODING 20514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2FC0 +2140 +7FE0 +A140 +2FC0 +2500 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_5023 +ENCODING 20515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +3FE0 +68A0 +AFA0 +2AA0 +2AA0 +2AA0 +2A40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_5024 +ENCODING 20516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +C7C0 +5440 +57C0 +5440 +57C0 +5440 +57C0 +5FE0 +ENDCHAR +STARTCHAR U_5025 +ENCODING 20517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2AA0 +6440 +A820 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5026 +ENCODING 20518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2680 +3FE0 +6400 +BFE0 +2840 +37A0 +2480 +2580 +2420 +23E0 +ENDCHAR +STARTCHAR U_5027 +ENCODING 20519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +67C0 +A000 +2FE0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_5028 +ENCODING 20520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6480 +A7E0 +2480 +2BE0 +2A20 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5029 +ENCODING 20521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_502A +ENCODING 20522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2820 +2EE0 +6820 +AFE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_502B +ENCODING 20523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +3BA0 +6000 +AFE0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_502C +ENCODING 20524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2200 +6FC0 +A840 +2FC0 +2840 +2FC0 +2200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_502D +ENCODING 20525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +2100 +3FE0 +6540 +A920 +2200 +3FE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_502E +ENCODING 20526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +2FC0 +2940 +6FC0 +A100 +3FE0 +2300 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_502F +ENCODING 20527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2940 +4940 +7D40 +C920 +5AA0 +5C80 +6880 +4940 +4920 +4BE0 +ENDCHAR +STARTCHAR U_5030 +ENCODING 20528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2FE0 +6440 +AA20 +33C0 +2440 +2A80 +2180 +2E60 +ENDCHAR +STARTCHAR U_5031 +ENCODING 20529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +2840 +6FC0 +A020 +2940 +2F80 +2920 +2B20 +2CE0 +ENDCHAR +STARTCHAR U_5032 +ENCODING 20530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4200 +CFC0 +4A40 +4FC0 +4A40 +4FC0 +4700 +4A80 +7260 +ENDCHAR +STARTCHAR U_5033 +ENCODING 20531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5FC0 +D240 +5FC0 +4240 +7FE0 +4240 +5FC0 +4200 +4600 +ENDCHAR +STARTCHAR U_5034 +ENCODING 20532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4500 +CA80 +7760 +4200 +4880 +7FE0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_5035 +ENCODING 20533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2EA0 +40A0 +5FE0 +C480 +5480 +5780 +54A0 +54A0 +5EA0 +6060 +ENDCHAR +STARTCHAR U_5036 +ENCODING 20534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2880 +4F80 +C880 +4F80 +4880 +4F80 +4000 +7FE0 +4480 +4840 +ENDCHAR +STARTCHAR U_5037 +ENCODING 20535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2480 +2840 +77A0 +A000 +2FC0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_5038 +ENCODING 20536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +5220 +C940 +4200 +5FE0 +4200 +4700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5039 +ENCODING 20537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +4880 +D740 +6220 +4FC0 +4A40 +4FC0 +4200 +4500 +58C0 +ENDCHAR +STARTCHAR U_503A +ENCODING 20538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_503B +ENCODING 20539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5520 +DD40 +5580 +5D40 +5520 +5FA0 +7540 +4500 +4500 +ENDCHAR +STARTCHAR U_503C +ENCODING 20540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +27C0 +6440 +A7C0 +2440 +2740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_503D +ENCODING 20541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4500 +C880 +5740 +6220 +5FC0 +4200 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_503E +ENCODING 20542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1900 +2BE0 +2E20 +6AA0 +AAA0 +2AA0 +2EA0 +2AA0 +2140 +2620 +ENDCHAR +STARTCHAR U_503F +ENCODING 20543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4880 +C500 +5FC0 +4200 +5FE0 +4480 +4980 +4600 +5DC0 +ENDCHAR +STARTCHAR U_5040 +ENCODING 20544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2100 +6FC0 +A940 +2940 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5041 +ENCODING 20545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A20 +2540 +2100 +6FC0 +A940 +2FC0 +2940 +3FE0 +2840 +29C0 +ENDCHAR +STARTCHAR U_5042 +ENCODING 20546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +5FE0 +C000 +5E20 +52A0 +5EA0 +52A0 +5EA0 +5220 +5660 +ENDCHAR +STARTCHAR U_5043 +ENCODING 20547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2BC0 +2A40 +6BC0 +A900 +2FE0 +2A40 +2980 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_5044 +ENCODING 20548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +5FC0 +D540 +5540 +52C0 +4200 +5FE0 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_5045 +ENCODING 20549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +3FE0 +2940 +6FC0 +A940 +2FC0 +2100 +2FC0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_5046 +ENCODING 20550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +2FE0 +6280 +A440 +2FE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5047 +ENCODING 20551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +2A20 +2EE0 +6800 +AEE0 +28A0 +2EA0 +2840 +28C0 +2920 +ENDCHAR +STARTCHAR U_5048 +ENCODING 20552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +2840 +6FC0 +A400 +2FE0 +3920 +2AA0 +2FA0 +2040 +ENDCHAR +STARTCHAR U_5049 +ENCODING 20553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2240 +2FE0 +6440 +A7C0 +2100 +27E0 +2500 +2FE0 +2100 +ENDCHAR +STARTCHAR U_504A +ENCODING 20554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1100 +27C0 +2540 +67C0 +A100 +2FE0 +2920 +2FA0 +28A0 +2860 +ENDCHAR +STARTCHAR U_504B +ENCODING 20555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2A20 +6940 +AFE0 +2940 +2FE0 +2940 +3240 +2440 +ENDCHAR +STARTCHAR U_504C +ENCODING 20556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2100 +6FE0 +A200 +27C0 +2C40 +3440 +27C0 +2440 +ENDCHAR +STARTCHAR U_504D +ENCODING 20557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A000 +2FE0 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_504E +ENCODING 20558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +2FC0 +2940 +6FC0 +A000 +3FE0 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_504F +ENCODING 20559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +2FE0 +6800 +AFE0 +2AA0 +2FE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_5050 +ENCODING 20560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +6440 +A280 +2FE0 +2840 +2B80 +2860 +2B80 +2860 +3380 +ENDCHAR +STARTCHAR U_5051 +ENCODING 20561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +5140 +5E40 +D440 +5F40 +5540 +5F40 +5440 +5520 +6F20 +ENDCHAR +STARTCHAR U_5052 +ENCODING 20562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +2780 +2480 +7FE0 +A800 +2FE0 +32A0 +24A0 +2920 +2260 +ENDCHAR +STARTCHAR U_5053 +ENCODING 20563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2800 +6FE0 +AA40 +2FE0 +2880 +2BE0 +3080 +27E0 +ENDCHAR +STARTCHAR U_5054 +ENCODING 20564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +C000 +4FC0 +4000 +5FE0 +4400 +47C0 +4080 +4300 +ENDCHAR +STARTCHAR U_5055 +ENCODING 20565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +28C0 +2AA0 +6C60 +A100 +27E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5056 +ENCODING 20566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +2FC0 +2280 +7FE0 +A100 +27C0 +3C40 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5057 +ENCODING 20567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1520 +2940 +3080 +67E0 +BC20 +27E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5058 +ENCODING 20568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A000 +2EE0 +2AA0 +2AA0 +2AA0 +2EE0 +ENDCHAR +STARTCHAR U_5059 +ENCODING 20569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4880 +C500 +5FE0 +5220 +4FC0 +4A40 +4A40 +4AC0 +4200 +ENDCHAR +STARTCHAR U_505A +ENCODING 20570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4880 +7FE0 +C940 +4B40 +5D40 +5540 +5480 +5D40 +4220 +ENDCHAR +STARTCHAR U_505B +ENCODING 20571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +3FE0 +6100 +AD60 +2920 +2D60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_505C +ENCODING 20572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2000 +4FC0 +4840 +DFE0 +5020 +4FC0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_505D +ENCODING 20573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +22A0 +2E60 +67C0 +A440 +27C0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_505E +ENCODING 20574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +2540 +25C0 +6400 +A7E0 +2100 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_505F +ENCODING 20575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +27C0 +2440 +67C0 +A440 +2FE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5060 +ENCODING 20576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +6AA0 +AFE0 +2200 +2FE0 +2240 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_5061 +ENCODING 20577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +27C0 +6440 +A7C0 +2440 +3FE0 +2540 +2620 +27E0 +ENDCHAR +STARTCHAR U_5062 +ENCODING 20578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2C40 +2540 +3F60 +6540 +A640 +2D40 +3440 +2440 +24A0 +2520 +ENDCHAR +STARTCHAR U_5063 +ENCODING 20579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5064 +ENCODING 20580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2280 +6FE0 +AAA0 +2CE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5065 +ENCODING 20581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4940 +CFE0 +5140 +5FE0 +4500 +57E0 +4900 +5500 +63E0 +ENDCHAR +STARTCHAR U_5066 +ENCODING 20582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2240 +2B80 +4E00 +F1E0 +4F80 +4880 +4F80 +4880 +4F80 +4880 +ENDCHAR +STARTCHAR U_5067 +ENCODING 20583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4500 +CA80 +7560 +4200 +4D80 +4240 +4580 +4100 +4E00 +ENDCHAR +STARTCHAR U_5068 +ENCODING 20584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +56C0 +5480 +D6A0 +5960 +4100 +5FE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_5069 +ENCODING 20585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +2420 +67E0 +A420 +27E0 +2420 +27E0 +2280 +2C60 +ENDCHAR +STARTCHAR U_506A +ENCODING 20586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1000 +27C0 +2440 +67C0 +A000 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_506B +ENCODING 20587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +4880 +5480 +CBE0 +5840 +4FE0 +4A40 +4940 +4840 +48C0 +ENDCHAR +STARTCHAR U_506C +ENCODING 20588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +4AA0 +54A0 +CF20 +52A0 +4440 +4240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_506D +ENCODING 20589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4200 +5FE0 +D4A0 +57A0 +54A0 +57A0 +54A0 +5FE0 +5020 +ENDCHAR +STARTCHAR U_506E +ENCODING 20590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +27C0 +6000 +AFE0 +2440 +27C0 +2440 +2FE0 +2040 +ENDCHAR +STARTCHAR U_506F +ENCODING 20591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2000 +27C0 +6440 +A7C0 +2320 +2540 +2C80 +2540 +2620 +ENDCHAR +STARTCHAR U_5070 +ENCODING 20592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +3FE0 +48A0 +DEA0 +48A0 +5F60 +4A00 +7FE0 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_5071 +ENCODING 20593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1880 +2BE0 +2880 +6BE0 +AA20 +2BE0 +2A20 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5072 +ENCODING 20594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FE0 +6920 +AFE0 +2820 +2200 +2540 +2C20 +3440 +23C0 +ENDCHAR +STARTCHAR U_5073 +ENCODING 20595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +27C0 +2000 +6FE0 +A100 +2FE0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_5074 +ENCODING 20596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3E20 +52A0 +5EA0 +D2A0 +5EA0 +52A0 +5EA0 +4420 +4A20 +5160 +ENDCHAR +STARTCHAR U_5075 +ENCODING 20597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2200 +2FC0 +6840 +AFC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5076 +ENCODING 20598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +2540 +67C0 +A100 +2FE0 +2920 +29A0 +2F20 +2860 +ENDCHAR +STARTCHAR U_5077 +ENCODING 20599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +5B60 +4000 +5E20 +D2A0 +5EA0 +52A0 +5EA0 +5220 +56E0 +ENDCHAR +STARTCHAR U_5078 +ENCODING 20600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2500 +2880 +7760 +A000 +2EA0 +2AA0 +2F40 +2B40 +2EA0 +2AA0 +ENDCHAR +STARTCHAR U_5079 +ENCODING 20601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +5440 +DC80 +5380 +5C60 +57C0 +5540 +57C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_507A +ENCODING 20602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +2AA0 +76A0 +A580 +2860 +37C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_507B +ENCODING 20603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2100 +6540 +A920 +2FE0 +2240 +2680 +2140 +2E20 +ENDCHAR +STARTCHAR U_507C +ENCODING 20604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4200 +CFC0 +4040 +4FC0 +4040 +4FC0 +5200 +5A00 +67E0 +ENDCHAR +STARTCHAR U_507D +ENCODING 20605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +2600 +2F80 +2480 +67C0 +A440 +27E0 +2820 +3520 +2AA0 +2060 +ENDCHAR +STARTCHAR U_507E +ENCODING 20606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2540 +2FE0 +6440 +AFE0 +2820 +2920 +2920 +2280 +2C60 +ENDCHAR +STARTCHAR U_507F +ENCODING 20607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4100 +5FE0 +D020 +4FC0 +4000 +5FE0 +4200 +4440 +4FE0 +ENDCHAR +STARTCHAR U_5080 +ENCODING 20608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5240 +5FC0 +D240 +5FC0 +4240 +46A0 +46E0 +4A20 +51E0 +ENDCHAR +STARTCHAR U_5081 +ENCODING 20609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2EC0 +4A40 +4EC0 +CA40 +4FC0 +4200 +4FC0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_5082 +ENCODING 20610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +5F00 +51C0 +5100 +D7E0 +5520 +57E0 +5500 +65C0 +4940 +5260 +ENDCHAR +STARTCHAR U_5083 +ENCODING 20611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +27C0 +2100 +6FE0 +A280 +2700 +2240 +27A0 +2940 +3320 +ENDCHAR +STARTCHAR U_5084 +ENCODING 20612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2540 +5480 +4FC0 +D860 +4FC0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_5085 +ENCODING 20613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FE0 +4200 +4FC0 +CA40 +4FC0 +4A40 +7FE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_5086 +ENCODING 20614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +3100 +57C0 +5440 +D7C0 +5440 +57C0 +5100 +5540 +5520 +6B20 +ENDCHAR +STARTCHAR U_5087 +ENCODING 20615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2240 +2FE0 +6440 +A7C0 +2440 +27C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_5088 +ENCODING 20616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6AA0 +AFE0 +2100 +2FE0 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_5089 +ENCODING 20617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2BC0 +4800 +4FE0 +CA80 +4B60 +4840 +4FE0 +5240 +51C0 +ENDCHAR +STARTCHAR U_508A +ENCODING 20618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +4000 +4FE0 +C820 +4FE0 +4820 +4FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_508B +ENCODING 20619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +2480 +2FC0 +6480 +BFE0 +2A40 +2FC0 +2A40 +3FE0 +2840 +ENDCHAR +STARTCHAR U_508C +ENCODING 20620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2FC0 +2900 +6FC0 +A900 +2FE0 +2020 +2D20 +2AA0 +32E0 +ENDCHAR +STARTCHAR U_508D +ENCODING 20621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +6FE0 +A920 +2FE0 +2200 +23E0 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_508E +ENCODING 20622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +27C0 +6440 +A740 +25C0 +2440 +3FE0 +2480 +3860 +ENDCHAR +STARTCHAR U_508F +ENCODING 20623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +4FC0 +C940 +4FE0 +4940 +4FC0 +5440 +5440 +67C0 +ENDCHAR +STARTCHAR U_5090 +ENCODING 20624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4000 +4780 +C480 +5FE0 +5020 +57A0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_5091 +ENCODING 20625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2DE0 +5540 +5D40 +C7E0 +4840 +5240 +7FE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5092 +ENCODING 20626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F20 +2940 +2480 +6700 +A240 +2FA0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_5093 +ENCODING 20627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +4FE0 +C800 +4EE0 +4A20 +4AA0 +4E60 +52A0 +6660 +ENDCHAR +STARTCHAR U_5094 +ENCODING 20628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +4500 +5FC0 +C540 +7FE0 +4540 +5FC0 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_5095 +ENCODING 20629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +23E0 +6480 +AFE0 +3480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_5096 +ENCODING 20630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +4A80 +5160 +EFC0 +4940 +4FC0 +4800 +4FC0 +5440 +67C0 +ENDCHAR +STARTCHAR U_5097 +ENCODING 20631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +4F00 +C480 +5FC0 +5240 +5FC0 +5240 +5FC0 +5040 +ENDCHAR +STARTCHAR U_5098 +ENCODING 20632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E4E0 +2480 +5540 +2480 +5540 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5099 +ENCODING 20633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +2480 +3FE0 +6400 +AFE0 +2920 +3FE0 +2920 +2FE0 +2920 +ENDCHAR +STARTCHAR U_509A +ENCODING 20634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +3FE0 +6AA0 +B1A0 +2AA0 +24A0 +24A0 +2A40 +30A0 +2320 +ENDCHAR +STARTCHAR U_509B +ENCODING 20635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +4440 +C920 +4280 +4440 +4FE0 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_509C +ENCODING 20636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1E20 +2A20 +2540 +6400 +AFC0 +3100 +2FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_509D +ENCODING 20637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4FC0 +4840 +CFC0 +4000 +5EE0 +4AA0 +4660 +5BA0 +4660 +ENDCHAR +STARTCHAR U_509E +ENCODING 20638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2100 +67C0 +A100 +3FE0 +2400 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_509F +ENCODING 20639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2A40 +54A0 +4F80 +C000 +5DC0 +5540 +4CC0 +5540 +4CC0 +ENDCHAR +STARTCHAR U_50A0 +ENCODING 20640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2440 +3E40 +41E0 +5E40 +C140 +5EC0 +4040 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_50A1 +ENCODING 20641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4000 +5DE0 +C000 +5540 +5540 +5540 +4840 +4C80 +73E0 +ENDCHAR +STARTCHAR U_50A2 +ENCODING 20642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +3020 +2FC0 +6440 +AA80 +3500 +2B80 +2540 +2920 +2600 +ENDCHAR +STARTCHAR U_50A3 +ENCODING 20643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +2FC0 +6400 +BFE0 +2940 +3560 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_50A4 +ENCODING 20644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +3F40 +4540 +5FE0 +C900 +5F40 +5540 +5E80 +44A0 +5F60 +4520 +ENDCHAR +STARTCHAR U_50A5 +ENCODING 20645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2820 +67C0 +A440 +27C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_50A6 +ENCODING 20646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2E40 +4A40 +5FE0 +D020 +4FC0 +4840 +4FC0 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_50A7 +ENCODING 20647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +28A0 +2700 +6400 +A7C0 +2480 +2480 +3FE0 +2480 +3860 +ENDCHAR +STARTCHAR U_50A8 +ENCODING 20648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6120 +57C0 +4140 +77E0 +D100 +53C0 +5640 +53C0 +5A40 +5240 +43C0 +ENDCHAR +STARTCHAR U_50A9 +ENCODING 20649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3D40 +47E0 +5640 +D7E0 +4A40 +4BE0 +5640 +6240 +43E0 +4200 +ENDCHAR +STARTCHAR U_50AA +ENCODING 20650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4000 +48A0 +DDE0 +4200 +4D80 +5260 +4480 +4100 +4E00 +ENDCHAR +STARTCHAR U_50AB +ENCODING 20651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +4FC0 +4940 +CFC0 +4480 +4340 +5FE0 +4100 +4940 +5720 +ENDCHAR +STARTCHAR U_50AC +ENCODING 20652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +2500 +6FE0 +A900 +3FC0 +2900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_50AD +ENCODING 20653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2940 +2BE0 +6940 +AFE0 +2AA0 +2BE0 +2AA0 +2BE0 +32A0 +ENDCHAR +STARTCHAR U_50AE +ENCODING 20654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +AAA0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_50AF +ENCODING 20655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2940 +2B40 +6EC0 +A940 +2FC0 +2540 +2CA0 +3460 +23C0 +ENDCHAR +STARTCHAR U_50B0 +ENCODING 20656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +2000 +2EE0 +6AA0 +AEE0 +2AA0 +2EE0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_50B1 +ENCODING 20657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +2940 +32A0 +64A0 +A800 +3A80 +2AE0 +2A80 +2A80 +2D80 +28E0 +ENDCHAR +STARTCHAR U_50B2 +ENCODING 20658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +3F00 +4900 +5FE0 +C940 +7F40 +4940 +5D40 +5480 +6540 +4A20 +ENDCHAR +STARTCHAR U_50B3 +ENCODING 20659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2A40 +2FC0 +6A40 +BFC0 +2280 +3FE0 +2880 +2480 +2180 +ENDCHAR +STARTCHAR U_50B4 +ENCODING 20660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2BC0 +2A40 +2BC0 +6800 +AEE0 +2AA0 +2AA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_50B5 +ENCODING 20661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_50B6 +ENCODING 20662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3FE0 +5500 +5700 +D520 +5F20 +5540 +5E80 +55A0 +54E0 +6D20 +ENDCHAR +STARTCHAR U_50B7 +ENCODING 20663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C40 +37C0 +6440 +BFE0 +2400 +2FE0 +3520 +2A20 +24C0 +ENDCHAR +STARTCHAR U_50B8 +ENCODING 20664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +2200 +3740 +6A80 +B740 +2A80 +3740 +2200 +2580 +3860 +ENDCHAR +STARTCHAR U_50B9 +ENCODING 20665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +5FE0 +C840 +4FC0 +4840 +4FC0 +4480 +44A0 +58E0 +ENDCHAR +STARTCHAR U_50BA +ENCODING 20666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +5AC0 +6440 +5BA0 +D000 +6FE0 +4100 +4940 +5120 +6720 +ENDCHAR +STARTCHAR U_50BB +ENCODING 20667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2AA0 +2920 +6AA0 +AFE0 +2A40 +37E0 +2C80 +2300 +2CE0 +ENDCHAR +STARTCHAR U_50BC +ENCODING 20668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +4780 +CFC0 +4A40 +4FC0 +4200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_50BD +ENCODING 20669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +2FE0 +6440 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_50BE +ENCODING 20670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +2BE0 +2A20 +6FE0 +AA20 +2BE0 +2E20 +2BE0 +3140 +2620 +ENDCHAR +STARTCHAR U_50BF +ENCODING 20671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +25C0 +2500 +6FE0 +A400 +2FC0 +2800 +2FE0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_50C0 +ENCODING 20672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +5540 +D760 +6000 +5FE0 +5220 +4FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_50C1 +ENCODING 20673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +4A80 +5FE0 +CA80 +7260 +4000 +4640 +5520 +54A0 +6380 +ENDCHAR +STARTCHAR U_50C2 +ENCODING 20674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +2FE0 +6540 +AFC0 +2940 +3FE0 +2440 +2380 +3E60 +ENDCHAR +STARTCHAR U_50C3 +ENCODING 20675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +5500 +DFE0 +6020 +4FA0 +4AA0 +4FA0 +4AA0 +4FA0 +4AE0 +ENDCHAR +STARTCHAR U_50C4 +ENCODING 20676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4480 +5FE0 +54A0 +DFE0 +4000 +4FC0 +4000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_50C5 +ENCODING 20677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1FE0 +2280 +27C0 +6540 +A540 +2FE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_50C6 +ENCODING 20678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +2AA0 +23E0 +7AA0 +ABE0 +2880 +2BE0 +2880 +3480 +23E0 +ENDCHAR +STARTCHAR U_50C7 +ENCODING 20679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +2AA0 +4660 +4AA0 +57A0 +C940 +5620 +4080 +4720 +4040 +4F80 +ENDCHAR +STARTCHAR U_50C8 +ENCODING 20680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +6FE0 +AAA0 +2AA0 +2FE0 +2480 +2300 +3CE0 +ENDCHAR +STARTCHAR U_50C9 +ENCODING 20681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0000 +7BC0 +4A40 +7BC0 +1080 +2940 +C620 +ENDCHAR +STARTCHAR U_50CA +ENCODING 20682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1280 +2FE0 +2AA0 +6FE0 +A200 +3FE0 +2CC0 +35A0 +2440 +23C0 +ENDCHAR +STARTCHAR U_50CB +ENCODING 20683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +4A40 +57A0 +C100 +4FC0 +4840 +4FC0 +4840 +4FC0 +5860 +ENDCHAR +STARTCHAR U_50CC +ENCODING 20684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3F40 +44E0 +5FA0 +D5A0 +5FA0 +5540 +5F40 +4440 +5EA0 +4520 +ENDCHAR +STARTCHAR U_50CD +ENCODING 20685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4480 +7FE0 +D5A0 +5FA0 +55A0 +5FA0 +44A0 +5FA0 +44A0 +5F40 +ENDCHAR +STARTCHAR U_50CE +ENCODING 20686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +4880 +CEE0 +4480 +4FC0 +4480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_50CF +ENCODING 20687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +3520 +67E0 +A220 +2D40 +2280 +2DC0 +22A0 +2D80 +ENDCHAR +STARTCHAR U_50D0 +ENCODING 20688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +2200 +5FC0 +C200 +5FC0 +4A80 +7FE0 +4880 +4880 +4F80 +ENDCHAR +STARTCHAR U_50D1 +ENCODING 20689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +5FE0 +4840 +D7A0 +6480 +5FE0 +5020 +57A0 +54A0 +57E0 +ENDCHAR +STARTCHAR U_50D2 +ENCODING 20690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +28A0 +5FC0 +C480 +7FE0 +5F80 +4800 +5FC0 +6840 +4FC0 +ENDCHAR +STARTCHAR U_50D3 +ENCODING 20691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +67C0 +A000 +3FE0 +2640 +2540 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_50D4 +ENCODING 20692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2280 +2FE0 +6AA0 +AC60 +2FE0 +2080 +3FE0 +2880 +2580 +ENDCHAR +STARTCHAR U_50D5 +ENCODING 20693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +2280 +6FE0 +A100 +27E0 +2100 +3FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_50D6 +ENCODING 20694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +3FE0 +6840 +AFC0 +2480 +3FE0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_50D7 +ENCODING 20695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +5DC0 +6A80 +D540 +6220 +5FE0 +5220 +4FC0 +4240 +4440 +5980 +ENDCHAR +STARTCHAR U_50D8 +ENCODING 20696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5580 +4EE0 +DF20 +51A0 +5DA0 +5540 +5D40 +51A0 +5320 +ENDCHAR +STARTCHAR U_50D9 +ENCODING 20697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +2480 +5FE0 +4100 +CFC0 +4940 +4FC0 +4940 +4FC0 +5860 +ENDCHAR +STARTCHAR U_50DA +ENCODING 20698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4F80 +D8C0 +6F80 +4880 +4F80 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_50DB +ENCODING 20699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7F80 +52E0 +DF20 +5280 +5E80 +5280 +7F80 +4880 +5540 +6220 +ENDCHAR +STARTCHAR U_50DC +ENCODING 20700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D40 +2580 +54A0 +4FC0 +D020 +4FC0 +4840 +4FC0 +4840 +4480 +5FE0 +ENDCHAR +STARTCHAR U_50DD +ENCODING 20701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +6880 +AFE0 +2880 +2FE0 +2A40 +2FE0 +3240 +26C0 +ENDCHAR +STARTCHAR U_50DE +ENCODING 20702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1F20 +2540 +6F80 +A880 +2FC0 +2840 +2FE0 +2AA0 +2AA0 +3060 +ENDCHAR +STARTCHAR U_50DF +ENCODING 20703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +29A0 +4FE0 +4540 +CBA0 +5FE0 +4900 +5FE0 +4940 +4CA0 +5160 +ENDCHAR +STARTCHAR U_50E0 +ENCODING 20704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1FA0 +2540 +2FE0 +6540 +A920 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_50E1 +ENCODING 20705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2A40 +4FC0 +4A40 +CFC0 +4240 +5FE0 +4520 +5440 +57C0 +ENDCHAR +STARTCHAR U_50E2 +ENCODING 20706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F40 +4A80 +5FE0 +D020 +4E40 +52E0 +5D40 +45E0 +4840 +5040 +ENDCHAR +STARTCHAR U_50E3 +ENCODING 20707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3DE0 +4880 +7DE0 +C880 +5540 +6FE0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_50E4 +ENCODING 20708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2FE0 +2920 +6FE0 +A920 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_50E5 +ENCODING 20709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A440 +2EE0 +2440 +3FE0 +2480 +24A0 +3860 +ENDCHAR +STARTCHAR U_50E6 +ENCODING 20710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7EC0 +40A0 +5FE0 +D280 +5E80 +4880 +5C80 +6AA0 +49A0 +5A60 +ENDCHAR +STARTCHAR U_50E7 +ENCODING 20711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2D60 +6BA0 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_50E8 +ENCODING 20712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2540 +3FE0 +6440 +AFC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_50E9 +ENCODING 20713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +2AA0 +6EE0 +ABA0 +2AA0 +2BA0 +2AA0 +2BA0 +2CE0 +ENDCHAR +STARTCHAR U_50EA +ENCODING 20714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +5FE0 +4540 +C900 +5FE0 +54A0 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_50EB +ENCODING 20715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2500 +5DC0 +5040 +5DC0 +C500 +5FE0 +4240 +5520 +5440 +47C0 +ENDCHAR +STARTCHAR U_50EC +ENCODING 20716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1480 +27E0 +2C80 +67E0 +A480 +27E0 +2480 +27E0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_50ED +ENCODING 20717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4540 +5540 +7FE0 +CCC0 +5560 +6FC0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_50EE +ENCODING 20718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6FE0 +A540 +27C0 +2540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_50EF +ENCODING 20719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2540 +6920 +B540 +2EE0 +2B40 +35E0 +2840 +3040 +ENDCHAR +STARTCHAR U_50F0 +ENCODING 20720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +7180 +AAC0 +24A0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_50F1 +ENCODING 20721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5020 +5FE0 +D500 +5480 +5FE0 +5480 +57E0 +5480 +67E0 +ENDCHAR +STARTCHAR U_50F2 +ENCODING 20722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +4AA0 +CFE0 +4840 +4DE0 +5540 +6DE0 +4840 +5040 +ENDCHAR +STARTCHAR U_50F3 +ENCODING 20723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +A920 +2540 +3FE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_50F4 +ENCODING 20724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5DE0 +5520 +DFE0 +54A0 +57A0 +54A0 +57A0 +5020 +5060 +ENDCHAR +STARTCHAR U_50F5 +ENCODING 20725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +2540 +67C0 +A540 +2FE0 +2540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_50F6 +ENCODING 20726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2EE0 +6280 +AEE0 +2AA0 +2EE0 +2AA0 +2EE0 +2280 +21E0 +ENDCHAR +STARTCHAR U_50F7 +ENCODING 20727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1FE0 +1280 +2540 +7FE0 +A540 +27E0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_50F8 +ENCODING 20728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +2440 +6EE0 +B540 +2FC0 +2000 +2FE0 +2580 +2940 +3320 +ENDCHAR +STARTCHAR U_50F9 +ENCODING 20729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +A440 +2740 +25C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_50FA +ENCODING 20730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +6000 +AEE0 +2AA0 +2EE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_50FB +ENCODING 20731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3FE0 +52A0 +5E40 +D1E0 +5040 +5E40 +5BE0 +6A40 +4E40 +4040 +ENDCHAR +STARTCHAR U_50FC +ENCODING 20732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FC0 +5540 +5FC0 +D540 +7FE0 +5040 +5FC0 +4880 +4500 +5FC0 +ENDCHAR +STARTCHAR U_50FD +ENCODING 20733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E40 +2940 +5F60 +4940 +DC40 +6AA0 +4920 +4240 +5520 +54A0 +6380 +ENDCHAR +STARTCHAR U_50FE +ENCODING 20734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +2FE0 +2920 +6640 +ABE0 +2200 +27E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_50FF +ENCODING 20735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +34A0 +2FC0 +6480 +BFE0 +2480 +2A40 +37A0 +2200 +2FE0 +ENDCHAR +STARTCHAR U_5100 +ENCODING 20736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4200 +4FC0 +C200 +5FE0 +4940 +5FE0 +6D40 +5AA0 +4860 +ENDCHAR +STARTCHAR U_5101 +ENCODING 20737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2FC0 +2900 +5FC0 +4900 +CFE0 +4800 +4EE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_5102 +ENCODING 20738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +4FE0 +CAA0 +5FE0 +5000 +5FE0 +54A0 +5540 +6620 +ENDCHAR +STARTCHAR U_5103 +ENCODING 20739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +5740 +5040 +DFC0 +4F80 +4880 +4F80 +4880 +7FE0 +ENDCHAR +STARTCHAR U_5104 +ENCODING 20740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +5FE0 +C840 +4FC0 +4840 +4FC0 +4540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_5105 +ENCODING 20741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +2A80 +5FE0 +5020 +C780 +4480 +5FE0 +5120 +5FE0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_5106 +ENCODING 20742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +4AE0 +4AA0 +DFA0 +62A0 +5EA0 +56A0 +5E40 +42A0 +4D20 +ENDCHAR +STARTCHAR U_5107 +ENCODING 20743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +3FE0 +6000 +AFC0 +2840 +2FC0 +2540 +2C80 +3660 +ENDCHAR +STARTCHAR U_5108 +ENCODING 20744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +27C0 +3820 +6FE0 +AAA0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5109 +ENCODING 20745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +27C0 +3820 +6EE0 +AAA0 +2AA0 +2EE0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_510A +ENCODING 20746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2440 +2EE0 +7540 +A000 +3FE0 +2520 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_510B +ENCODING 20747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +3AA0 +6FE0 +A800 +2BE0 +2800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_510C +ENCODING 20748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5280 +5EE0 +5320 +DEA0 +48A0 +7FA0 +50A0 +5E40 +52A0 +6D20 +ENDCHAR +STARTCHAR U_510D +ENCODING 20749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2D40 +2AC0 +4D40 +CFC0 +4480 +4A40 +77A0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_510E +ENCODING 20750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FC0 +24A0 +5FE0 +C480 +5FA0 +54A0 +5FC0 +54C0 +7FA0 +4520 +ENDCHAR +STARTCHAR U_510F +ENCODING 20751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +26E0 +24A0 +4E40 +DAA0 +4440 +5A80 +5FE0 +4700 +4A80 +5260 +ENDCHAR +STARTCHAR U_5110 +ENCODING 20752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +27E0 +6940 +A7C0 +3C40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5111 +ENCODING 20753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2820 +6FE0 +A440 +2AA0 +2440 +2EE0 +2440 +2AA0 +ENDCHAR +STARTCHAR U_5112 +ENCODING 20754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +67C0 +A100 +2FE0 +2100 +2FE0 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_5113 +ENCODING 20755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +4200 +4F80 +4880 +FFE0 +64A0 +5FC0 +4200 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_5114 +ENCODING 20756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4200 +5FE0 +4220 +DFC0 +4000 +5FE0 +4040 +5FE0 +5540 +5CC0 +ENDCHAR +STARTCHAR U_5115 +ENCODING 20757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4A80 +DAC0 +6AA0 +4840 +4FC0 +4840 +4FC0 +5040 +ENDCHAR +STARTCHAR U_5116 +ENCODING 20758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +34E0 +5E80 +5EC0 +D520 +5E20 +4000 +5FC0 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_5117 +ENCODING 20759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2C20 +4AC0 +4E40 +D1E0 +5E40 +6940 +5F60 +4940 +55C0 +6260 +ENDCHAR +STARTCHAR U_5118 +ENCODING 20760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +3FE0 +4240 +4FC0 +C200 +5FE0 +4AA0 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_5119 +ENCODING 20761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +67C0 +5540 +5FE0 +C480 +7780 +57C0 +5440 +57C0 +5000 +6FE0 +ENDCHAR +STARTCHAR U_511A +ENCODING 20762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +5FC0 +D540 +5FE0 +5420 +4F80 +5480 +4300 +5C00 +ENDCHAR +STARTCHAR U_511B +ENCODING 20763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +3540 +4FE0 +C540 +7FE0 +4840 +5FE0 +6B40 +45E0 +5840 +ENDCHAR +STARTCHAR U_511C +ENCODING 20764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +2540 +6FE0 +AAA0 +3FE0 +2000 +3FE0 +2100 +2700 +ENDCHAR +STARTCHAR U_511D +ENCODING 20765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +36C0 +2D80 +4480 +CB40 +5FE0 +5220 +4FC0 +4680 +4A40 +5220 +ENDCHAR +STARTCHAR U_511E +ENCODING 20766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +2A40 +5FE0 +D220 +5B60 +56A0 +5B60 +5B60 +56A0 +5B60 +ENDCHAR +STARTCHAR U_511F +ENCODING 20767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +3FE0 +34A0 +2480 +6FC0 +A840 +2F40 +2BC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5120 +ENCODING 20768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3500 +4A80 +5FC0 +D540 +5FC0 +56C0 +5B40 +56C0 +5240 +5B20 +ENDCHAR +STARTCHAR U_5121 +ENCODING 20769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +5FC0 +5240 +DFC0 +4000 +7FE0 +6AA0 +7FE0 +6AA0 +7FE0 +ENDCHAR +STARTCHAR U_5122 +ENCODING 20770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +5FE0 +5220 +D7E0 +5540 +57C0 +5540 +57C0 +6AA0 +53C0 +ENDCHAR +STARTCHAR U_5123 +ENCODING 20771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +3280 +57C0 +D280 +5FE0 +5540 +57C0 +5540 +57C0 +6C60 +ENDCHAR +STARTCHAR U_5124 +ENCODING 20772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +6FE0 +A280 +3FE0 +2540 +3BA0 +2540 +3B20 +ENDCHAR +STARTCHAR U_5125 +ENCODING 20773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +2FE0 +6AA0 +AFE0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5126 +ENCODING 20774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +5540 +DFC0 +54A0 +56C0 +54A0 +56E0 +5540 +5AA0 +ENDCHAR +STARTCHAR U_5127 +ENCODING 20775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1EE0 +2440 +2EE0 +6AA0 +A7C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5128 +ENCODING 20776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2880 +2EE0 +68C0 +B540 +2FC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5129 +ENCODING 20777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +55E0 +5D20 +D5E0 +5D00 +57E0 +5D60 +4AA0 +5520 +62C0 +ENDCHAR +STARTCHAR U_512A +ENCODING 20778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +27C0 +2440 +6FE0 +B220 +2D40 +37A0 +2480 +2300 +3CE0 +ENDCHAR +STARTCHAR U_512B +ENCODING 20779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +DFE0 +5020 +4FC0 +4200 +4D40 +5380 +4540 +4B20 +ENDCHAR +STARTCHAR U_512C +ENCODING 20780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +3E20 +4BE0 +DE20 +4BE0 +7E20 +57E0 +5D40 +5540 +5D40 +5660 +ENDCHAR +STARTCHAR U_512D +ENCODING 20781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7F20 +55E0 +4920 +FF20 +49E0 +5D20 +49E0 +5C80 +69A0 +5AE0 +ENDCHAR +STARTCHAR U_512E +ENCODING 20782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2A40 +2FE0 +6940 +ABE0 +2D40 +2900 +35E0 +2500 +2FE0 +ENDCHAR +STARTCHAR U_512F +ENCODING 20783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +2100 +2FE0 +6280 +AFC0 +3920 +2900 +2FE0 +2520 +2AE0 +ENDCHAR +STARTCHAR U_5130 +ENCODING 20784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +5480 +4A00 +DF80 +4480 +47C0 +4840 +5FE0 +6AA0 +5560 +ENDCHAR +STARTCHAR U_5131 +ENCODING 20785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +3E80 +2BE0 +3E20 +6AE0 +AE80 +2AE0 +2E80 +2AE0 +2AA0 +36E0 +ENDCHAR +STARTCHAR U_5132 +ENCODING 20786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3DE0 +40A0 +5DE0 +C080 +5DE0 +4320 +5DE0 +5520 +5DE0 +5520 +ENDCHAR +STARTCHAR U_5133 +ENCODING 20787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +5FC0 +4AA0 +CFE0 +4480 +4FC0 +5940 +4FC0 +4520 +59E0 +ENDCHAR +STARTCHAR U_5134 +ENCODING 20788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +DDC0 +4500 +5FC0 +4500 +5FE0 +4D40 +5480 +4660 +ENDCHAR +STARTCHAR U_5135 +ENCODING 20789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2640 +5980 +5240 +DFE0 +5AA0 +5FE0 +5100 +5FE0 +4540 +4AA0 +ENDCHAR +STARTCHAR U_5136 +ENCODING 20790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +4900 +DFE0 +6900 +4FE0 +4900 +5FE0 +54A0 +57A0 +5020 +ENDCHAR +STARTCHAR U_5137 +ENCODING 20791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +2FE0 +2AA0 +6FE0 +AAA0 +2FE0 +2C80 +37E0 +2480 +26E0 +ENDCHAR +STARTCHAR U_5138 +ENCODING 20792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +2940 +75E0 +A940 +37E0 +3D40 +21E0 +2B40 +35E0 +ENDCHAR +STARTCHAR U_5139 +ENCODING 20793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +3540 +2FE0 +6A40 +B7E0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_513A +ENCODING 20794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7F40 +55E0 +4940 +FFE0 +4940 +7FE0 +4940 +7FE0 +5540 +63E0 +ENDCHAR +STARTCHAR U_513B +ENCODING 20795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +7FE0 +68A0 +5FC0 +D540 +5FC0 +4200 +4FC0 +4200 +5FE0 +52A0 +ENDCHAR +STARTCHAR U_513C +ENCODING 20796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5FE0 +5280 +DE80 +53E0 +5EA0 +53A0 +5E40 +52A0 +6320 +ENDCHAR +STARTCHAR U_513D +ENCODING 20797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +5FC0 +7240 +DFE0 +6AA0 +5FE0 +4440 +5FA0 +4A80 +7660 +ENDCHAR +STARTCHAR U_513E +ENCODING 20798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4A40 +DFE0 +5540 +4FC0 +4480 +5FE0 +4500 +4D80 +5660 +ENDCHAR +STARTCHAR U_513F +ENCODING 20799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_5140 +ENCODING 20800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +1200 +1200 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5141 +ENCODING 20801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +2100 +7F80 +1280 +1200 +1200 +1200 +2240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5142 +ENCODING 20802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +4400 +4400 +FFE0 +0A00 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5143 +ENCODING 20803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +7F80 +0000 +0000 +FFC0 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5144 +ENCODING 20804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +4100 +4100 +7F00 +5500 +1400 +1400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_5145 +ENCODING 20805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0800 +1100 +7F80 +1280 +1200 +1200 +2240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5146 +ENCODING 20806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +9240 +5280 +5300 +1200 +3380 +5240 +9200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5147 +ENCODING 20807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +4A80 +4480 +4A80 +5080 +7F80 +1200 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5148 +ENCODING 20808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2400 +3FC0 +4400 +8400 +FFE0 +1200 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5149 +ENCODING 20809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +0400 +FFE0 +1200 +1200 +1220 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514A +ENCODING 20810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +2480 +4840 +9120 +3F80 +0840 +0A00 +1200 +2220 +43E0 +ENDCHAR +STARTCHAR U_514B +ENCODING 20811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514C +ENCODING 20812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4080 +BF40 +2100 +2100 +3F00 +0A00 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_514D +ENCODING 20813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3E00 +4400 +FF80 +4880 +4880 +7F80 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_514E +ENCODING 20814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +0400 +3F80 +2480 +2480 +3FC0 +0A00 +1280 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514F +ENCODING 20815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +43C0 +4200 +4200 +7FE0 +4500 +4500 +4900 +9120 +A0E0 +ENDCHAR +STARTCHAR U_5150 +ENCODING 20816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +2440 +27C0 +2000 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5151 +ENCODING 20817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +1200 +3F00 +2100 +2100 +2100 +3F00 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5152 +ENCODING 20818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +6780 +4080 +7380 +4080 +7F80 +5280 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5153 +ENCODING 20819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +A280 +A280 +FFE0 +5080 +5180 +5280 +5AA0 +94A0 +8860 +ENDCHAR +STARTCHAR U_5154 +ENCODING 20820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +0400 +0A80 +0AA0 +1220 +61E0 +ENDCHAR +STARTCHAR U_5155 +ENCODING 20821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +9480 +9480 +9C80 +8080 +FF80 +9280 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5156 +ENCODING 20822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +2100 +4880 +9240 +2100 +3E80 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5157 +ENCODING 20823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +2100 +4080 +BF40 +2100 +3F00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_5158 +ENCODING 20824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FA00 +0280 +FA40 +57C0 +5000 +57C0 +5440 +57C0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5159 +ENCODING 20825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +1080 +7FE0 +4480 +4480 +7C80 +2880 +28A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515A +ENCODING 20826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4900 +2A00 +FFC0 +8040 +BF40 +2100 +3F00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_515B +ENCODING 20827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +1080 +7C80 +47E0 +4480 +7C80 +2880 +28A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515C +ENCODING 20828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2800 +DEC0 +9240 +9E40 +9240 +FEC0 +8040 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_515D +ENCODING 20829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FD40 +1220 +7C20 +47C0 +4540 +7D40 +2A40 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515E +ENCODING 20830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FB00 +2100 +FFC0 +8900 +8FC0 +F900 +5120 +50C0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_515F +ENCODING 20831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A280 +A280 +FBE0 +2480 +2480 +FBE0 +5280 +5680 +9AA0 +A4A0 +08E0 +ENDCHAR +STARTCHAR U_5160 +ENCODING 20832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +EEA0 +2AC0 +2E80 +6A80 +AEA0 +2060 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5161 +ENCODING 20833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +2100 +FBE0 +8A20 +8BE0 +FA20 +53E0 +5000 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5162 +ENCODING 20834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +8A20 +FBE0 +5080 +5580 +5AA0 +A2A0 +8C60 +ENDCHAR +STARTCHAR U_5163 +ENCODING 20835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC00 +27E0 +F4A0 +97E0 +94A0 +F7E0 +5480 +5BE0 +9020 +0FE0 +ENDCHAR +STARTCHAR U_5164 +ENCODING 20836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7E0 +AD40 +67E0 +FC80 +57E0 +56A0 +57E0 +5540 +5A20 +8FE0 +ENDCHAR +STARTCHAR U_5165 +ENCODING 20837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0400 +0400 +0A00 +0A00 +1100 +1100 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_5166 +ENCODING 20838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8200 +8200 +8200 +8500 +8500 +8880 +9040 +A020 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5167 +ENCODING 20839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +8880 +8880 +8880 +9480 +A280 +C280 +8080 +8180 +ENDCHAR +STARTCHAR U_5168 +ENCODING 20840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +0400 +1F00 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5169 +ENCODING 20841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +FFC0 +8840 +CC40 +AA40 +AA40 +DD40 +8840 +8840 +88C0 +ENDCHAR +STARTCHAR U_516A +ENCODING 20842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0000 +7940 +4940 +7A80 +4A80 +7940 +4940 +ENDCHAR +STARTCHAR U_516B +ENCODING 20843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0200 +1200 +1200 +1200 +1100 +1100 +2080 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_516C +ENCODING 20844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +1080 +2080 +2440 +4420 +8800 +0900 +1080 +3FC0 +1040 +ENDCHAR +STARTCHAR U_516D +ENCODING 20845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +0000 +FFE0 +0000 +0000 +1100 +1080 +2040 +4020 +8020 +ENDCHAR +STARTCHAR U_516E +ENCODING 20846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2080 +5F40 +8820 +0800 +1F80 +0080 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_516F +ENCODING 20847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4040 +2080 +1100 +1200 +FFC0 +0840 +0840 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_5170 +ENCODING 20848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0000 +0000 +0000 +3F80 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_5171 +ENCODING 20849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +1100 +1100 +FFE0 +0000 +1100 +2080 +4040 +ENDCHAR +STARTCHAR U_5172 +ENCODING 20850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F00 +0400 +0400 +FFC0 +0000 +1200 +2100 +4080 +8060 +ENDCHAR +STARTCHAR U_5173 +ENCODING 20851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +FFC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5174 +ENCODING 20852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +4440 +2480 +2080 +0100 +FFE0 +0000 +1100 +1080 +2040 +4040 +ENDCHAR +STARTCHAR U_5175 +ENCODING 20853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FE0 +2100 +2100 +2100 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5176 +ENCODING 20854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +1100 +2080 +C040 +ENDCHAR +STARTCHAR U_5177 +ENCODING 20855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5178 +ENCODING 20856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +3FC0 +2A40 +3FC0 +2A40 +2A40 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5179 +ENCODING 20857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1200 +FFE0 +2100 +2100 +4A40 +FBC0 +2100 +2100 +4A40 +FBE0 +ENDCHAR +STARTCHAR U_517A +ENCODING 20858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +20C0 +DFA0 +0880 +3280 +C100 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_517B +ENCODING 20859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +7FC0 +0800 +FFE0 +1100 +3180 +D160 +1100 +2100 +ENDCHAR +STARTCHAR U_517C +ENCODING 20860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +1200 +7F80 +1280 +FFE0 +1280 +7F80 +3300 +5280 +9260 +ENDCHAR +STARTCHAR U_517D +ENCODING 20861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +4440 +7FC0 +4440 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_517E +ENCODING 20862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +2480 +3F80 +2480 +3F80 +1100 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_517F +ENCODING 20863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +1100 +7BC0 +1140 +7A40 +1F60 +0000 +FFE0 +0900 +3F80 +ENDCHAR +STARTCHAR U_5180 +ENCODING 20864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +0A20 +7FE0 +2480 +3F80 +2480 +7FC0 +0900 +FFE0 +0900 +70E0 +ENDCHAR +STARTCHAR U_5181 +ENCODING 20865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +5420 +27E0 +FD40 +A7E0 +FD40 +A7E0 +FDA0 +2540 +F920 +29A0 +ENDCHAR +STARTCHAR U_5182 +ENCODING 20866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5183 +ENCODING 20867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8080 +8080 +BE80 +8080 +8080 +BE80 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_5184 +ENCODING 20868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +FFE0 +2080 +2080 +FFE0 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_5185 +ENCODING 20869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +8840 +8840 +8C40 +9240 +A140 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5186 +ENCODING 20870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8080 +8080 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_5187 +ENCODING 20871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1000 +1F80 +3080 +5080 +1080 +1080 +1080 +1180 +ENDCHAR +STARTCHAR U_5188 +ENCODING 20872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8140 +9140 +8A40 +8440 +8A40 +9140 +A140 +8040 +81C0 +ENDCHAR +STARTCHAR U_5189 +ENCODING 20873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +7FC0 +4440 +4440 +FFE0 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_518A +ENCODING 20874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_518B +ENCODING 20875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +FFC0 +8040 +8040 +9E40 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_518C +ENCODING 20876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_518D +ENCODING 20877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2480 +3F80 +2480 +2480 +FFE0 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_518E +ENCODING 20878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3E80 +2280 +2280 +FFE0 +8020 +8020 +8020 +8020 +80E0 +ENDCHAR +STARTCHAR U_518F +ENCODING 20879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9240 +A140 +DEC0 +9240 +9240 +9240 +9E40 +8040 +80C0 +ENDCHAR +STARTCHAR U_5190 +ENCODING 20880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +BE80 +8080 +7F00 +4100 +7F00 +4100 +7F00 +4100 +4300 +ENDCHAR +STARTCHAR U_5191 +ENCODING 20881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +4100 +5D00 +4100 +5D00 +4300 +ENDCHAR +STARTCHAR U_5192 +ENCODING 20882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_5193 +ENCODING 20883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_5194 +ENCODING 20884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +4040 +5F40 +0000 +F7C0 +9100 +9FE0 +F100 +0300 +ENDCHAR +STARTCHAR U_5195 +ENCODING 20885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +4040 +5F40 +2200 +7F80 +A480 +3FA0 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_5196 +ENCODING 20886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_5197 +ENCODING 20887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4020 +9F40 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_5198 +ENCODING 20888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +7FC0 +8880 +0800 +0C00 +0C00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_5199 +ENCODING 20889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +9040 +1F80 +1000 +1FC0 +0040 +7F40 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_519A +ENCODING 20890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4020 +8400 +0400 +4440 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_519B +ENCODING 20891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +0800 +7F80 +1000 +2400 +7F80 +0400 +FFC0 +0400 +0400 +ENDCHAR +STARTCHAR U_519C +ENCODING 20892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +8C40 +1200 +1240 +3280 +5100 +9480 +1860 +1020 +ENDCHAR +STARTCHAR U_519D +ENCODING 20893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4040 +9F00 +1100 +1F00 +1100 +1F00 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_519E +ENCODING 20894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +0400 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_519F +ENCODING 20895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8820 +3F80 +2080 +3F80 +2080 +3F80 +4000 +7F80 +4020 +3FE0 +ENDCHAR +STARTCHAR U_51A0 +ENCODING 20896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +80A0 +7880 +03E0 +FC80 +5280 +5080 +51A0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_51A1 +ENCODING 20897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +9F80 +0000 +7FE0 +0880 +1500 +6A00 +1700 +6AE0 +1600 +ENDCHAR +STARTCHAR U_51A2 +ENCODING 20898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +7F00 +1000 +2C80 +D500 +2E00 +D500 +2480 +C440 +1800 +ENDCHAR +STARTCHAR U_51A3 +ENCODING 20899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +8020 +7F80 +2400 +3DC0 +2540 +3C80 +2480 +7D40 +0620 +ENDCHAR +STARTCHAR U_51A4 +ENCODING 20900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8820 +1F00 +2200 +7FC0 +A240 +3FC0 +0A00 +0AA0 +3220 +C1E0 +ENDCHAR +STARTCHAR U_51A5 +ENCODING 20901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_51A6 +ENCODING 20902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8020 +3900 +01C0 +FD00 +2BC0 +2A40 +2980 +2920 +4AA0 +87E0 +ENDCHAR +STARTCHAR U_51A7 +ENCODING 20903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4040 +9100 +1100 +7BC0 +1100 +3B80 +5540 +9120 +1100 +ENDCHAR +STARTCHAR U_51A8 +ENCODING 20904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +BFC0 +0000 +1F80 +1080 +3FC0 +2240 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_51A9 +ENCODING 20905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +3B80 +2080 +3B80 +2080 +3FE0 +4120 +94A0 +2A20 +4A60 +ENDCHAR +STARTCHAR U_51AA +ENCODING 20906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +BFA0 +2080 +3F80 +2080 +FFE0 +1500 +7FC0 +A4A0 +2580 +ENDCHAR +STARTCHAR U_51AB +ENCODING 20907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +80 +40 +20 +00 +10 +20 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U_51AC +ENCODING 20908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +3100 +4A00 +0400 +1B00 +E4E0 +0200 +1800 +0400 +0200 +ENDCHAR +STARTCHAR U_51AD +ENCODING 20909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +1100 +2080 +CC60 +0300 +1900 +0400 +0200 +ENDCHAR +STARTCHAR U_51AE +ENCODING 20910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +8F80 +4200 +4200 +0200 +2200 +4200 +C200 +4200 +4200 +5FC0 +ENDCHAR +STARTCHAR U_51AF +ENCODING 20911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4080 +4480 +1480 +2480 +27E0 +C020 +5FA0 +4020 +4020 +00C0 +ENDCHAR +STARTCHAR U_51B0 +ENCODING 20912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0120 +2D40 +2580 +4580 +C940 +4940 +5120 +4100 +0700 +ENDCHAR +STARTCHAR U_51B1 +ENCODING 20913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +0200 +13C0 +2440 +2440 +4840 +CF80 +4080 +4080 +5FE0 +ENDCHAR +STARTCHAR U_51B2 +ENCODING 20914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0920 +2920 +2920 +CFE0 +4920 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_51B3 +ENCODING 20915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2FC0 +0240 +2240 +2240 +5FE0 +C200 +4500 +4880 +5060 +ENDCHAR +STARTCHAR U_51B4 +ENCODING 20916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +8FE0 +4080 +4480 +1480 +2FE0 +4180 +C280 +4480 +5880 +0100 +ENDCHAR +STARTCHAR U_51B5 +ENCODING 20917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +4840 +0840 +2FC0 +2500 +C500 +4500 +4520 +4920 +51E0 +ENDCHAR +STARTCHAR U_51B6 +ENCODING 20918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4200 +0440 +2FE0 +2020 +47C0 +C440 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_51B7 +ENCODING 20919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +0500 +2880 +3260 +4100 +4FC0 +8080 +8700 +8100 +0080 +ENDCHAR +STARTCHAR U_51B8 +ENCODING 20920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4920 +2520 +2540 +0FE0 +1100 +2100 +DFE0 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_51B9 +ENCODING 20921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4240 +4FE0 +0200 +23C0 +2540 +4540 +C880 +4880 +5340 +2420 +ENDCHAR +STARTCHAR U_51BA +ENCODING 20922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +2FC0 +0900 +0900 +1FE0 +2900 +C880 +4AA0 +4C60 +4820 +ENDCHAR +STARTCHAR U_51BB +ENCODING 20923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +2400 +2500 +0900 +5FE0 +C100 +4540 +4920 +5120 +0300 +ENDCHAR +STARTCHAR U_51BC +ENCODING 20924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4500 +27E0 +2900 +0100 +2FE0 +C280 +4280 +42A0 +44A0 +1860 +ENDCHAR +STARTCHAR U_51BD +ENCODING 20925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F20 +4420 +46A0 +0AA0 +2AA0 +2AA0 +56A0 +C2A0 +4420 +4820 +50E0 +ENDCHAR +STARTCHAR U_51BE +ENCODING 20926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +4880 +1040 +0FA0 +2000 +2FC0 +4840 +C840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_51BF +ENCODING 20927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +47C0 +2140 +2FE0 +0140 +17C0 +2100 +C7C0 +4100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_51C0 +ENCODING 20928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4F80 +4900 +1FC0 +2240 +3FE0 +2240 +CFC0 +4200 +4200 +4E00 +ENDCHAR +STARTCHAR U_51C1 +ENCODING 20929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FE0 +4200 +4FC0 +1A40 +2A40 +2FC0 +C200 +4700 +4A80 +3260 +ENDCHAR +STARTCHAR U_51C2 +ENCODING 20930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47C0 +2880 +2FE0 +1920 +2920 +2FE0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_51C3 +ENCODING 20931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +4500 +0880 +3760 +2200 +4F80 +C200 +4A80 +5240 +2620 +ENDCHAR +STARTCHAR U_51C4 +ENCODING 20932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FE0 +4240 +0FE0 +0240 +2FC0 +2240 +DFE0 +4480 +4340 +5C20 +ENDCHAR +STARTCHAR U_51C5 +ENCODING 20933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5220 +5220 +1FE0 +1220 +37A0 +54A0 +D4A0 +57A0 +5020 +5FE0 +ENDCHAR +STARTCHAR U_51C6 +ENCODING 20934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +8900 +4FE0 +5900 +0900 +2FC0 +2900 +CFC0 +4900 +4900 +4FE0 +ENDCHAR +STARTCHAR U_51C7 +ENCODING 20935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +4940 +5D40 +0A20 +1AA0 +2C80 +6900 +C900 +4940 +4BE0 +4A20 +ENDCHAR +STARTCHAR U_51C8 +ENCODING 20936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5220 +4940 +0FC0 +2140 +3FE0 +C140 +4FC0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_51C9 +ENCODING 20937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4000 +07C0 +2440 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_51CA +ENCODING 20938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4100 +07C0 +0100 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_51CB +ENCODING 20939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4920 +4FE0 +0920 +2FE0 +2820 +CBA0 +4AA0 +4BA0 +5020 +20E0 +ENDCHAR +STARTCHAR U_51CC +ENCODING 20940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +4200 +3FE0 +2880 +5460 +C780 +4C80 +5300 +4480 +1860 +ENDCHAR +STARTCHAR U_51CD +ENCODING 20941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4100 +0FE0 +2920 +2FE0 +4920 +CFE0 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_51CE +ENCODING 20942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +8880 +5040 +4FA0 +2200 +2200 +DFE0 +5240 +4A80 +4200 +5FE0 +ENDCHAR +STARTCHAR U_51CF +ENCODING 20943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +80A0 +5FE0 +5080 +1780 +30A0 +57A0 +D5C0 +56A0 +5160 +6220 +ENDCHAR +STARTCHAR U_51D0 +ENCODING 20944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +4FE0 +2AA0 +2AA0 +2FE0 +4100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_51D1 +ENCODING 20945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4100 +4FC0 +0200 +2FE0 +2840 +37A0 +C100 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_51D2 +ENCODING 20946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4540 +2540 +27C0 +1000 +2FE0 +C440 +47C0 +4280 +4100 +0FE0 +ENDCHAR +STARTCHAR U_51D3 +ENCODING 20947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4280 +2FE0 +2AA0 +0FE0 +1100 +2FE0 +C100 +4380 +4540 +1920 +ENDCHAR +STARTCHAR U_51D4 +ENCODING 20948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4280 +2540 +2920 +07C0 +2440 +27C0 +C440 +4BE0 +4A20 +53E0 +ENDCHAR +STARTCHAR U_51D5 +ENCODING 20949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4820 +27C0 +2440 +17C0 +2440 +C7C0 +4100 +5FE0 +4280 +0C60 +ENDCHAR +STARTCHAR U_51D6 +ENCODING 20950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2BE0 +0880 +5BE0 +C880 +4BE0 +4880 +0BE0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_51D7 +ENCODING 20951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +2FE0 +0900 +2FE0 +2900 +DFC0 +4900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_51D8 +ENCODING 20952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AE0 +5F80 +4A80 +0EE0 +2AA0 +2EA0 +4AA0 +DFA0 +4AA0 +5120 +6220 +ENDCHAR +STARTCHAR U_51D9 +ENCODING 20953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +2FE0 +2100 +0FE0 +2100 +5FE0 +C440 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_51DA +ENCODING 20954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9FE0 +4480 +4EC0 +15A0 +2FC0 +2000 +DFE0 +4580 +4940 +3320 +ENDCHAR +STARTCHAR U_51DB +ENCODING 20955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +5540 +1740 +1040 +3FC0 +C000 +7FE0 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_51DC +ENCODING 20956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +5540 +5740 +1040 +3FC0 +4200 +DFE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_51DD +ENCODING 20957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +89E0 +4CA0 +4840 +0E40 +29E0 +2E40 +5440 +DF60 +4540 +4B40 +52E0 +ENDCHAR +STARTCHAR U_51DE +ENCODING 20958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +64A0 +24A0 +6EA0 +AAE0 +AE80 +A480 +A4A0 +BEE0 +4A40 +9120 +ENDCHAR +STARTCHAR U_51DF +ENCODING 20959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9FE0 +4100 +4FE0 +1AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_51E0 +ENCODING 20960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E1 +ENCODING 20961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1900 +1500 +1500 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_51E2 +ENCODING 20962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0800 +1F00 +1100 +1100 +1100 +1100 +1120 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E3 +ENCODING 20963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +1F00 +1100 +1100 +1100 +1100 +1120 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E4 +ENCODING 20964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4280 +5280 +4A80 +4480 +44A0 +4AA0 +5260 +8020 +ENDCHAR +STARTCHAR U_51E5 +ENCODING 20965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F00 +4900 +4900 +4900 +4920 +5120 +A0E0 +ENDCHAR +STARTCHAR U_51E6 +ENCODING 20966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2380 +3A80 +4A80 +AA80 +2AA0 +12A0 +14A0 +2860 +4600 +81E0 +ENDCHAR +STARTCHAR U_51E7 +ENCODING 20967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +4440 +5F40 +5540 +5540 +5540 +5540 +5740 +4460 +8420 +ENDCHAR +STARTCHAR U_51E8 +ENCODING 20968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4080 +7F80 +4880 +4880 +5280 +5EA0 +4060 +8020 +ENDCHAR +STARTCHAR U_51E9 +ENCODING 20969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +4440 +4440 +5F40 +4440 +4E40 +5540 +6540 +4460 +8020 +ENDCHAR +STARTCHAR U_51EA +ENCODING 20970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +4480 +4480 +5480 +5680 +5480 +5480 +54A0 +BF60 +8020 +ENDCHAR +STARTCHAR U_51EB +ENCODING 20971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +5100 +4B00 +4000 +7FC0 +0040 +3E40 +22A0 +4220 +81E0 +ENDCHAR +STARTCHAR U_51EC +ENCODING 20972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4080 +5E80 +5280 +5E80 +5280 +5EA0 +4060 +8020 +ENDCHAR +STARTCHAR U_51ED +ENCODING 20973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F00 +6200 +BFE0 +2200 +2FC0 +0000 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51EE +ENCODING 20974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4880 +5E80 +5280 +5E80 +5280 +5EA0 +40A0 +8060 +ENDCHAR +STARTCHAR U_51EF +ENCODING 20975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABC0 +AA40 +FA40 +0240 +FA40 +0A40 +FA40 +8240 +9240 +A440 +C860 +ENDCHAR +STARTCHAR U_51F0 +ENCODING 20976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4880 +5E80 +5280 +5E80 +5280 +7F80 +4480 +5FA0 +8460 +BFA0 +ENDCHAR +STARTCHAR U_51F1 +ENCODING 20977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +FA40 +0240 +FA40 +0240 +FA40 +8A40 +FA40 +5440 +F860 +ENDCHAR +STARTCHAR U_51F2 +ENCODING 20978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +7F40 +5440 +7F40 +5540 +7FC0 +5540 +7F40 +9640 +9560 +ENDCHAR +STARTCHAR U_51F3 +ENCODING 20979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +5140 +2E80 +C060 +1F00 +1100 +FFE0 +0000 +1F20 +1120 +E0E0 +ENDCHAR +STARTCHAR U_51F4 +ENCODING 20980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4900 +2FC0 +2900 +CFE0 +5520 +5560 +1F00 +1100 +1120 +E1E0 +ENDCHAR +STARTCHAR U_51F5 +ENCODING 20981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4020 +4020 +4020 +4020 +4020 +4020 +4020 +4020 +FFE0 +4020 +ENDCHAR +STARTCHAR U_51F6 +ENCODING 20982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9120 +8A20 +8420 +8620 +8A20 +9120 +A120 +8020 +FFE0 +8020 +ENDCHAR +STARTCHAR U_51F7 +ENCODING 20983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +8420 +8420 +9F20 +8420 +8420 +BFA0 +8020 +8020 +FFE0 +ENDCHAR +STARTCHAR U_51F8 +ENCODING 20984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1E00 +1200 +1200 +1200 +F3C0 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_51F9 +ENCODING 20985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +F3C0 +9240 +9240 +9240 +9E40 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_51FA +ENCODING 20986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +4440 +7FC0 +0400 +8420 +8420 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_51FB +ENCODING 20987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_51FC +ENCODING 20988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +B4A0 +9520 +9620 +A520 +C4A0 +9420 +8820 +FFE0 +8020 +ENDCHAR +STARTCHAR U_51FD +ENCODING 20989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +2480 +9520 +8E20 +9520 +A4A0 +CCA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_51FE +ENCODING 20990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +3BC0 +AB60 +AAA0 +BB60 +8260 +8A20 +8420 +FFE0 +ENDCHAR +STARTCHAR U_51FF +ENCODING 20991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +4A40 +5F40 +4440 +5F40 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5200 +ENCODING 20992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +1080 +1080 +1080 +1080 +1080 +2080 +2080 +4080 +8300 +ENDCHAR +STARTCHAR U_5201 +ENCODING 20993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0040 +0040 +0240 +0C40 +3040 +C040 +0040 +0040 +0180 +ENDCHAR +STARTCHAR U_5202 +ENCODING 20994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 7 -1 +BITMAP +10 +10 +90 +90 +90 +90 +90 +10 +10 +10 +70 +ENDCHAR +STARTCHAR U_5203 +ENCODING 20995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +0880 +0880 +4880 +4880 +8880 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_5204 +ENCODING 20996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +1080 +9080 +5080 +3080 +1080 +1880 +1680 +21C0 +4280 +8100 +ENDCHAR +STARTCHAR U_5205 +ENCODING 20997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7F00 +1100 +1100 +5140 +9120 +9120 +1120 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_5206 +ENCODING 20998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2080 +2080 +4040 +BFA0 +0880 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_5207 +ENCODING 20999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +3920 +E120 +2120 +2920 +3220 +2220 +0420 +08C0 +ENDCHAR +STARTCHAR U_5208 +ENCODING 21000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +8920 +4920 +2920 +1120 +1120 +2920 +2520 +4420 +8020 +00E0 +ENDCHAR +STARTCHAR U_5209 +ENCODING 21001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3EA0 +40A0 +80A0 +3CA0 +08A0 +10A0 +20A0 +4220 +4220 +3EE0 +ENDCHAR +STARTCHAR U_520A +ENCODING 21002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +1120 +1120 +FF20 +1120 +1120 +1120 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U_520B +ENCODING 21003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +0C20 +7020 +1120 +1120 +FD20 +1120 +1120 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_520C +ENCODING 21004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +0820 +08A0 +FEA0 +08A0 +48A0 +28A0 +28A0 +0820 +2820 +10E0 +ENDCHAR +STARTCHAR U_520D +ENCODING 21005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1F00 +2200 +4400 +BF80 +0080 +0080 +3F80 +0080 +0080 +7F80 +ENDCHAR +STARTCHAR U_520E +ENCODING 21006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7E20 +AAA0 +2AA0 +2AA0 +4AA0 +92A0 +12A0 +2220 +4A20 +04E0 +ENDCHAR +STARTCHAR U_520F +ENCODING 21007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7C20 +80A0 +78A0 +00A0 +F8A0 +08A0 +08A0 +0A20 +0A20 +06E0 +ENDCHAR +STARTCHAR U_5210 +ENCODING 21008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +64A0 +54A0 +44A0 +FEA0 +44A0 +44A0 +4420 +5420 +88E0 +ENDCHAR +STARTCHAR U_5211 +ENCODING 21009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2420 +24A0 +24A0 +FEA0 +24A0 +24A0 +24A0 +4420 +4420 +84E0 +ENDCHAR +STARTCHAR U_5212 +ENCODING 21010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2420 +20A0 +FEA0 +20A0 +24A0 +28A0 +10A0 +3220 +4A20 +86E0 +ENDCHAR +STARTCHAR U_5213 +ENCODING 21011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +00A0 +00A0 +FEA0 +28A0 +28A0 +28A0 +28A0 +4A20 +4C20 +88E0 +ENDCHAR +STARTCHAR U_5214 +ENCODING 21012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +F820 +2920 +2920 +2920 +FD20 +2120 +2120 +5020 +4820 +84E0 +ENDCHAR +STARTCHAR U_5215 +ENCODING 21013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0840 +0840 +1240 +E180 +0000 +FBE0 +4920 +4920 +4A20 +B4C0 +ENDCHAR +STARTCHAR U_5216 +ENCODING 21014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +22A0 +22A0 +3EA0 +22A0 +22A0 +3EA0 +22A0 +2220 +4A20 +84E0 +ENDCHAR +STARTCHAR U_5217 +ENCODING 21015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +1020 +1120 +3D20 +2520 +6520 +9920 +0920 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_5218 +ENCODING 21016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +04A0 +24A0 +18A0 +08A0 +14A0 +2220 +42A0 +8040 +ENDCHAR +STARTCHAR U_5219 +ENCODING 21017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7C40 +4540 +4540 +5540 +5540 +5540 +5540 +1140 +2840 +4440 +81C0 +ENDCHAR +STARTCHAR U_521A +ENCODING 21018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +82A0 +8AA0 +CAA0 +B2A0 +92A0 +AAA0 +CAA0 +8220 +8A20 +84E0 +ENDCHAR +STARTCHAR U_521B +ENCODING 21019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +42A0 +BCA0 +24A0 +24A0 +38A0 +2220 +2220 +1E60 +ENDCHAR +STARTCHAR U_521C +ENCODING 21020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FEA0 +2AA0 +2AA0 +FEA0 +A8A0 +FEA0 +2AA0 +2E20 +4820 +88E0 +ENDCHAR +STARTCHAR U_521D +ENCODING 21021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F920 +1120 +2120 +6920 +B120 +2920 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_521E +ENCODING 21022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +44A0 +7CA0 +44A0 +44A0 +7CA0 +44A0 +4420 +5E20 +E0E0 +ENDCHAR +STARTCHAR U_521F +ENCODING 21023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2220 +22A0 +22A0 +4CA0 +80A0 +7EA0 +42A0 +4220 +7E20 +42E0 +ENDCHAR +STARTCHAR U_5220 +ENCODING 21024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AAA0 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AAA0 +AA20 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_5221 +ENCODING 21025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +8420 +84A0 +FCA0 +90A0 +FEA0 +90A0 +92A0 +8A20 +A620 +C2E0 +ENDCHAR +STARTCHAR U_5222 +ENCODING 21026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +54A0 +90A0 +00A0 +7CA0 +04A0 +2820 +1020 +08E0 +ENDCHAR +STARTCHAR U_5223 +ENCODING 21027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +20A0 +44A0 +FEA0 +02A0 +7CA0 +44A0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5224 +ENCODING 21028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +52A0 +54A0 +10A0 +7CA0 +10A0 +FEA0 +10A0 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_5225 +ENCODING 21029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +4520 +7D20 +2120 +3D20 +2520 +2520 +2420 +4420 +98E0 +ENDCHAR +STARTCHAR U_5226 +ENCODING 21030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +7CA0 +10A0 +10A0 +FCA0 +10A0 +20A0 +4420 +FE20 +02E0 +ENDCHAR +STARTCHAR U_5227 +ENCODING 21031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7920 +1120 +1120 +FD20 +1120 +1120 +2120 +4920 +FD20 +0660 +ENDCHAR +STARTCHAR U_5228 +ENCODING 21032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3EA0 +42A0 +FAA0 +4AA0 +4AA0 +7AA0 +4CA0 +4020 +4220 +3EE0 +ENDCHAR +STARTCHAR U_5229 +ENCODING 21033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +70A0 +10A0 +FEA0 +10A0 +38A0 +34A0 +52A0 +9020 +1020 +10E0 +ENDCHAR +STARTCHAR U_522A +ENCODING 21034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AAA0 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AAA0 +AA20 +A220 +8EE0 +ENDCHAR +STARTCHAR U_522B +ENCODING 21035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +7CA0 +10A0 +FEA0 +12A0 +22A0 +2220 +4220 +8CE0 +ENDCHAR +STARTCHAR U_522C +ENCODING 21036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2820 +FD20 +2120 +2120 +FD20 +1120 +1D20 +3020 +CA20 +04E0 +ENDCHAR +STARTCHAR U_522D +ENCODING 21037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +08A0 +10A0 +28A0 +44A0 +FCA0 +10A0 +10A0 +1020 +1C20 +E0E0 +ENDCHAR +STARTCHAR U_522E +ENCODING 21038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +F020 +1120 +1120 +FD20 +1120 +7D20 +4520 +4420 +7C20 +44E0 +ENDCHAR +STARTCHAR U_522F +ENCODING 21039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +0020 +7CA0 +44A0 +44A0 +7CA0 +44A0 +7CA0 +0020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5230 +ENCODING 21040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +1020 +20A0 +44A0 +FEA0 +10A0 +7CA0 +10A0 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5231 +ENCODING 21041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5140 +5140 +FB40 +5560 +5140 +FD40 +5140 +5240 +5240 +94C0 +ENDCHAR +STARTCHAR U_5232 +ENCODING 21042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1120 +7D20 +1120 +1120 +FD20 +1120 +7D20 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5233 +ENCODING 21043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +24A0 +42A0 +BDA0 +00A0 +FEA0 +20A0 +7C20 +04A0 +1840 +ENDCHAR +STARTCHAR U_5234 +ENCODING 21044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2820 +2EA0 +42A0 +4AA0 +94A0 +10A0 +FEA0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5235 +ENCODING 21045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2420 +24A0 +3CA0 +24A0 +3CA0 +24A0 +26A0 +FCA0 +0420 +04E0 +ENDCHAR +STARTCHAR U_5236 +ENCODING 21046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +50A0 +7EA0 +90A0 +FEA0 +10A0 +7EA0 +52A0 +5220 +5620 +10E0 +ENDCHAR +STARTCHAR U_5237 +ENCODING 21047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +48A0 +48A0 +7EA0 +6AA0 +AAA0 +AAA0 +2E20 +08E0 +ENDCHAR +STARTCHAR U_5238 +ENCODING 21048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7FC0 +0800 +FFE0 +2080 +5FC0 +8920 +0900 +1100 +2600 +ENDCHAR +STARTCHAR U_5239 +ENCODING 21049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C20 +1020 +28A0 +54A0 +10A0 +FEA0 +10A0 +54A0 +5220 +9220 +30E0 +ENDCHAR +STARTCHAR U_523A +ENCODING 21050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +10A0 +7EA0 +52A0 +52A0 +56A0 +38A0 +5420 +9220 +1060 +ENDCHAR +STARTCHAR U_523B +ENCODING 21051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +24A0 +48A0 +F4A0 +24A0 +48A0 +9820 +2420 +C4E0 +ENDCHAR +STARTCHAR U_523C +ENCODING 21052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +10A0 +7CA0 +12A0 +FEA0 +12A0 +2120 +2920 +4520 +9EA0 +6440 +ENDCHAR +STARTCHAR U_523D +ENCODING 21053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1820 +2420 +42A0 +B8A0 +00A0 +00A0 +FEA0 +20A0 +4820 +8C20 +F4E0 +ENDCHAR +STARTCHAR U_523E +ENCODING 21054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +10A0 +54A0 +54A0 +10A0 +FEA0 +10A0 +2820 +2420 +C2E0 +ENDCHAR +STARTCHAR U_523F +ENCODING 21055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +9220 +92A0 +FEA0 +20A0 +3CA0 +44A0 +C4A0 +2820 +10A0 +E040 +ENDCHAR +STARTCHAR U_5240 +ENCODING 21056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +9220 +FEA0 +02A0 +7CA0 +04A0 +7CA0 +40A0 +4020 +4C20 +70E0 +ENDCHAR +STARTCHAR U_5241 +ENCODING 21057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +44A0 +96A0 +10A0 +FEA0 +10A0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5242 +ENCODING 21058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +44A0 +38A0 +C6A0 +24A0 +24A0 +2420 +4420 +84E0 +ENDCHAR +STARTCHAR U_5243 +ENCODING 21059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +28A0 +FEA0 +12A0 +FEA0 +90A0 +FEA0 +12A0 +3220 +5620 +90E0 +ENDCHAR +STARTCHAR U_5244 +ENCODING 21060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +54A0 +A8A0 +A8A0 +54A0 +00A0 +FEA0 +10A0 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5245 +ENCODING 21061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +0020 +7CA0 +44A0 +44A0 +7CA0 +00A0 +44A0 +2820 +1C20 +E0E0 +ENDCHAR +STARTCHAR U_5246 +ENCODING 21062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1120 +FD20 +8520 +FD20 +8520 +FD20 +9120 +8820 +B420 +C4E0 +ENDCHAR +STARTCHAR U_5247 +ENCODING 21063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4520 +4520 +7D20 +4520 +7D20 +4520 +4520 +7C20 +2820 +C6E0 +ENDCHAR +STARTCHAR U_5248 +ENCODING 21064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +4820 +7920 +0120 +FD20 +8520 +FD20 +8520 +FC20 +8420 +8CE0 +ENDCHAR +STARTCHAR U_5249 +ENCODING 21065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +54A0 +54A0 +54A0 +BAA0 +10A0 +10A0 +7EA0 +1020 +1020 +FEE0 +ENDCHAR +STARTCHAR U_524A +ENCODING 21066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +10A0 +7CA0 +44A0 +7CA0 +44A0 +7CA0 +4420 +4420 +4CE0 +ENDCHAR +STARTCHAR U_524B +ENCODING 21067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FD40 +1140 +7D40 +4540 +4540 +7D40 +2840 +28C0 +4820 +87E0 +ENDCHAR +STARTCHAR U_524C +ENCODING 21068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +10A0 +FEA0 +92A0 +FEA0 +92A0 +18A0 +34A0 +5220 +90E0 +ENDCHAR +STARTCHAR U_524D +ENCODING 21069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +1200 +FFC0 +0000 +7A80 +4A80 +7A80 +4A80 +7A80 +4880 +5B80 +ENDCHAR +STARTCHAR U_524E +ENCODING 21070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C20 +10A0 +28A0 +54A0 +14A0 +FEA0 +10A0 +38A0 +5420 +9220 +10E0 +ENDCHAR +STARTCHAR U_524F +ENCODING 21071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +24A0 +08A0 +FCA0 +2AA0 +2AA0 +FEA0 +28A0 +2920 +4AA0 +8A40 +ENDCHAR +STARTCHAR U_5250 +ENCODING 21072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +7CA0 +10A0 +FEA0 +92A0 +9AA0 +A620 +C220 +86E0 +ENDCHAR +STARTCHAR U_5251 +ENCODING 21073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1820 +2420 +42A0 +BCA0 +00A0 +24A0 +94A0 +54A0 +4820 +1E20 +E060 +ENDCHAR +STARTCHAR U_5252 +ENCODING 21074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2820 +FEA0 +28A0 +FEA0 +00A0 +7CA0 +44A0 +7CA0 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5253 +ENCODING 21075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +11E0 +FEA0 +32A0 +5920 +92C0 +0000 +7FE0 +0420 +0820 +70C0 +ENDCHAR +STARTCHAR U_5254 +ENCODING 21076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +42A0 +7EA0 +42A0 +7EA0 +20A0 +7EA0 +AAA0 +5220 +2220 +CCE0 +ENDCHAR +STARTCHAR U_5255 +ENCODING 21077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2820 +EEA0 +28A0 +28A0 +EEA0 +28A0 +28A0 +EEA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_5256 +ENCODING 21078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +10A0 +FEA0 +44A0 +28A0 +FEA0 +00A0 +7CA0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5257 +ENCODING 21079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2420 +FD20 +2920 +1520 +ED20 +2920 +FD20 +2920 +1420 +EC60 +ENDCHAR +STARTCHAR U_5258 +ENCODING 21080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +FE20 +44A0 +7CA0 +44A0 +7CA0 +44A0 +FEA0 +2820 +4420 +8460 +ENDCHAR +STARTCHAR U_5259 +ENCODING 21081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57C0 +F940 +5140 +5360 +5540 +FD40 +5140 +5140 +5240 +94C0 +ENDCHAR +STARTCHAR U_525A +ENCODING 21082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +54A0 +FEA0 +12A0 +FFA0 +12A0 +FEA0 +1020 +30E0 +ENDCHAR +STARTCHAR U_525B +ENCODING 21083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +CAA0 +AAA0 +92A0 +FEA0 +92A0 +92A0 +D6A0 +FE20 +8220 +86E0 +ENDCHAR +STARTCHAR U_525C +ENCODING 21084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +0820 +FEA0 +82A0 +7EA0 +5AA0 +DAA0 +2EA0 +2820 +4A20 +8CE0 +ENDCHAR +STARTCHAR U_525D +ENCODING 21085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +44A0 +78A0 +08A0 +FEA0 +92A0 +54A0 +38A0 +5420 +9220 +30E0 +ENDCHAR +STARTCHAR U_525E +ENCODING 21086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +28A0 +44A0 +FEA0 +04A0 +74A0 +54A0 +7420 +0420 +1CE0 +ENDCHAR +STARTCHAR U_525F +ENCODING 21087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AAA0 +44A0 +AAA0 +91A0 +00A0 +EEA0 +AAA0 +44A0 +AA20 +91E0 +ENDCHAR +STARTCHAR U_5260 +ENCODING 21088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +1040 +FE40 +0040 +7D40 +4540 +7D40 +1140 +5840 +9440 +31C0 +ENDCHAR +STARTCHAR U_5261 +ENCODING 21089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +5220 +94A0 +28A0 +C6A0 +10A0 +52A0 +94A0 +1020 +28A0 +C640 +ENDCHAR +STARTCHAR U_5262 +ENCODING 21090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2020 +72A0 +94A0 +28A0 +68A0 +BCA0 +2AA0 +CA20 +2820 +10E0 +ENDCHAR +STARTCHAR U_5263 +ENCODING 21091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +44A0 +BAA0 +10A0 +7CA0 +54A0 +7CA0 +1020 +2820 +C460 +ENDCHAR +STARTCHAR U_5264 +ENCODING 21092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +2420 +18A0 +24A0 +42A0 +BFA0 +22A0 +3E20 +4220 +8260 +ENDCHAR +STARTCHAR U_5265 +ENCODING 21093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +0420 +7CA0 +04A0 +FEA0 +10A0 +54A0 +38A0 +5420 +9220 +30E0 +ENDCHAR +STARTCHAR U_5266 +ENCODING 21094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +4420 +92A0 +7DA0 +54A0 +7CA0 +54A0 +7C20 +1020 +1C60 +ENDCHAR +STARTCHAR U_5267 +ENCODING 21095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +48A0 +48A0 +7EA0 +48A0 +7EA0 +6220 +A220 +BEE0 +ENDCHAR +STARTCHAR U_5268 +ENCODING 21096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +10A0 +7CA0 +10A0 +7CA0 +10A0 +FEA0 +6420 +A420 +3CE0 +ENDCHAR +STARTCHAR U_5269 +ENCODING 21097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0620 +7820 +10A0 +FEA0 +54A0 +D6A0 +54A0 +D6A0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_526A +ENCODING 21098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7A40 +4A40 +7A40 +48C0 +0000 +7FC0 +0840 +7180 +ENDCHAR +STARTCHAR U_526B +ENCODING 21099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +A4A0 +FEA0 +A4A0 +BCA0 +80A0 +FEA0 +A420 +9820 +E6E0 +ENDCHAR +STARTCHAR U_526C +ENCODING 21100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +92A0 +FEA0 +00A0 +FEA0 +10A0 +FEA0 +AAA0 +AA20 +AA20 +86E0 +ENDCHAR +STARTCHAR U_526D +ENCODING 21101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +82A0 +FEA0 +80A0 +FEA0 +A4A0 +FEA0 +88A0 +BE20 +8820 +FF60 +ENDCHAR +STARTCHAR U_526E +ENCODING 21102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +74A0 +54A0 +FEA0 +82A0 +BAA0 +AAA0 +AA20 +BA20 +86E0 +ENDCHAR +STARTCHAR U_526F +ENCODING 21103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +00A0 +7CA0 +44A0 +7CA0 +00A0 +FEA0 +92A0 +FE20 +9220 +FEE0 +ENDCHAR +STARTCHAR U_5270 +ENCODING 21104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +7020 +10A0 +FEA0 +54A0 +FEA0 +54A0 +FEA0 +3820 +5420 +9260 +ENDCHAR +STARTCHAR U_5271 +ENCODING 21105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +53C0 +8940 +7140 +2340 +FD40 +A940 +FA40 +2240 +5440 +88C0 +ENDCHAR +STARTCHAR U_5272 +ENCODING 21106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +92A0 +7CA0 +10A0 +7CA0 +10A0 +FEA0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5273 +ENCODING 21107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +FE20 +44A0 +54A0 +28A0 +44A0 +BAA0 +00A0 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5274 +ENCODING 21108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +92A0 +FEA0 +00A0 +FEA0 +00A0 +7CA0 +44A0 +7C20 +2820 +FEE0 +ENDCHAR +STARTCHAR U_5275 +ENCODING 21109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +54A0 +FEA0 +44A0 +7CA0 +44A0 +7CA0 +C420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5276 +ENCODING 21110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7E20 +4420 +FCA0 +08A0 +FEA0 +52A0 +A8A0 +5C20 +AA20 +58E0 +ENDCHAR +STARTCHAR U_5277 +ENCODING 21111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +44A0 +28A0 +7FA0 +68A0 +7EA0 +48A0 +7E20 +8820 +3EE0 +ENDCHAR +STARTCHAR U_5278 +ENCODING 21112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +0AA0 +FE20 +4820 +18E0 +ENDCHAR +STARTCHAR U_5279 +ENCODING 21113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +2220 +AAA0 +36A0 +48A0 +94A0 +6AA0 +12A0 +6420 +0820 +F0E0 +ENDCHAR +STARTCHAR U_527A +ENCODING 21114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FD40 +5480 +9340 +3FE0 +2000 +2FE0 +4420 +98C0 +ENDCHAR +STARTCHAR U_527B +ENCODING 21115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +9220 +FEA0 +00A0 +EEA0 +AAA0 +EEA0 +AAA0 +EEA0 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_527C +ENCODING 21116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7CA0 +24A0 +FEA0 +10A0 +28A0 +D6A0 +28A0 +5420 +0820 +70E0 +ENDCHAR +STARTCHAR U_527D +ENCODING 21117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +28A0 +FEA0 +AAA0 +FEA0 +00A0 +7CA0 +00A0 +FEA0 +5420 +B360 +ENDCHAR +STARTCHAR U_527E +ENCODING 21118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +8020 +BCA0 +A4A0 +BCA0 +80A0 +FEA0 +DAA0 +FE20 +8020 +FEE0 +ENDCHAR +STARTCHAR U_527F +ENCODING 21119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5420 +A8A0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +FEA0 +2820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5280 +ENCODING 21120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2820 +FEA0 +2AA0 +48A0 +FEA0 +AAA0 +FEA0 +AA20 +BA20 +86E0 +ENDCHAR +STARTCHAR U_5281 +ENCODING 21121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7EA0 +48A0 +FEA0 +48A0 +7EA0 +48A0 +7EA0 +0020 +5220 +A960 +ENDCHAR +STARTCHAR U_5282 +ENCODING 21122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +D420 +A4A0 +FFA0 +A0A0 +AAA0 +AAA0 +FAA0 +A620 +A920 +50E0 +ENDCHAR +STARTCHAR U_5283 +ENCODING 21123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7EA0 +12A0 +FFA0 +12A0 +FFA0 +54A0 +7CA0 +5420 +5420 +FEE0 +ENDCHAR +STARTCHAR U_5284 +ENCODING 21124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7F20 +AAA0 +10A0 +38A0 +44A0 +BAA0 +00A0 +7EA0 +4220 +7E60 +ENDCHAR +STARTCHAR U_5285 +ENCODING 21125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AA20 +FEA0 +40A0 +7EA0 +92A0 +7EA0 +56A0 +7E20 +1220 +FA60 +ENDCHAR +STARTCHAR U_5286 +ENCODING 21126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +54A0 +7EA0 +54A0 +7BA0 +54A0 +7EA0 +5420 +B620 +D5E0 +ENDCHAR +STARTCHAR U_5287 +ENCODING 21127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1020 +FEA0 +92A0 +BCA0 +92A0 +FEA0 +ADA0 +D620 +A520 +D9E0 +ENDCHAR +STARTCHAR U_5288 +ENCODING 21128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +A7E0 +3C80 +0080 +7FC0 +0840 +7180 +ENDCHAR +STARTCHAR U_5289 +ENCODING 21129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE20 +8A20 +AAA0 +D6A0 +28A0 +FEA0 +10A0 +FEA0 +9220 +5420 +FEE0 +ENDCHAR +STARTCHAR U_528A +ENCODING 21130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3820 +4420 +BAA0 +00A0 +FEA0 +AAA0 +FEA0 +44A0 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_528B +ENCODING 21131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +7CA0 +00A0 +EEA0 +AAA0 +EEA0 +10A0 +FF20 +5420 +9360 +ENDCHAR +STARTCHAR U_528C +ENCODING 21132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2820 +7F20 +0AA0 +7FA0 +44A0 +7DA0 +56A0 +7520 +AB20 +9160 +ENDCHAR +STARTCHAR U_528D +ENCODING 21133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +44A0 +BAA0 +00A0 +EEA0 +AAA0 +EEA0 +4420 +AA20 +9160 +ENDCHAR +STARTCHAR U_528E +ENCODING 21134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +29E0 +44A0 +BAA0 +00A0 +EEA0 +AAA0 +EEA0 +4520 +4520 +AA60 +ENDCHAR +STARTCHAR U_528F +ENCODING 21135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +FEA0 +82A0 +7CA0 +44A0 +FEA0 +92A0 +FE20 +9220 +FEE0 +ENDCHAR +STARTCHAR U_5290 +ENCODING 21136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +7EA0 +C8A0 +7EA0 +48A0 +7EA0 +2420 +1820 +66E0 +ENDCHAR +STARTCHAR U_5291 +ENCODING 21137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FF20 +2AA0 +54A0 +56A0 +95A0 +42A0 +7EA0 +4220 +7E20 +82E0 +ENDCHAR +STARTCHAR U_5292 +ENCODING 21138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +29E0 +46A0 +BAA0 +01A0 +EEA0 +AAA0 +EEA0 +0120 +4520 +AA60 +ENDCHAR +STARTCHAR U_5293 +ENCODING 21139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +54A0 +54A0 +FEA0 +92A0 +FEA0 +92A0 +FF20 +2420 +C4E0 +ENDCHAR +STARTCHAR U_5294 +ENCODING 21140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53C0 +8940 +7540 +0140 +FB40 +A9C0 +F960 +5240 +5240 +AC80 +ENDCHAR +STARTCHAR U_5295 +ENCODING 21141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7620 +44A0 +7FA0 +AAA0 +7EA0 +4AA0 +66A0 +52A0 +7E20 +2420 +4260 +ENDCHAR +STARTCHAR U_5296 +ENCODING 21142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +FE20 +42A0 +FFA0 +ADA0 +EAA0 +7EA0 +52A0 +7E20 +2A20 +C7E0 +ENDCHAR +STARTCHAR U_5297 +ENCODING 21143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A420 +FF20 +24A0 +FFA0 +55A0 +FEA0 +42A0 +7EA0 +4220 +7E20 +C3E0 +ENDCHAR +STARTCHAR U_5298 +ENCODING 21144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +7F20 +54A0 +7EA0 +56A0 +5DA0 +76A0 +54A0 +7620 +9420 +F760 +ENDCHAR +STARTCHAR U_5299 +ENCODING 21145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7C20 +24A0 +FFA0 +66A0 +D5A0 +EEA0 +AAA0 +EE20 +4420 +EEE0 +ENDCHAR +STARTCHAR U_529A +ENCODING 21146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +42A0 +7EA0 +54A0 +48A0 +7EA0 +56A0 +7EA0 +4A20 +CA20 +34E0 +ENDCHAR +STARTCHAR U_529B +ENCODING 21147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_529C +ENCODING 21148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +2500 +2500 +2500 +2520 +4520 +4520 +99E0 +ENDCHAR +STARTCHAR U_529D +ENCODING 21149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +0BE0 +8920 +4920 +3120 +1120 +2920 +4A20 +8420 +08C0 +ENDCHAR +STARTCHAR U_529E +ENCODING 21150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +FF00 +1100 +1100 +5180 +5140 +A140 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_529F +ENCODING 21151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +27E0 +2120 +2120 +2120 +3A20 +C220 +0420 +18C0 +ENDCHAR +STARTCHAR U_52A0 +ENCODING 21152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +FDE0 +2520 +2520 +2520 +2520 +2520 +4520 +55E0 +8920 +ENDCHAR +STARTCHAR U_52A1 +ENCODING 21153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3100 +4A00 +0400 +1B00 +E4E0 +3F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52A2 +ENCODING 21154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +3BE0 +28A0 +28A0 +28A0 +4920 +4920 +8A20 +9460 +ENDCHAR +STARTCHAR U_52A3 +ENCODING 21155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2500 +4480 +8140 +1E00 +E400 +3FC0 +0440 +0840 +1040 +E180 +ENDCHAR +STARTCHAR U_52A4 +ENCODING 21156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +43E0 +40A0 +7CA0 +48A0 +48A0 +48A0 +4920 +8920 +8A60 +ENDCHAR +STARTCHAR U_52A5 +ENCODING 21157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +03E0 +7120 +5120 +5120 +5520 +5A20 +5420 +88C0 +ENDCHAR +STARTCHAR U_52A6 +ENCODING 21158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0440 +0980 +7080 +1080 +7FE0 +14A0 +24A0 +4520 +9AC0 +ENDCHAR +STARTCHAR U_52A7 +ENCODING 21159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7C80 +1080 +13E0 +7CA0 +10A0 +FCA0 +1120 +1120 +5220 +2460 +ENDCHAR +STARTCHAR U_52A8 +ENCODING 21160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +0100 +03E0 +FD20 +2120 +2120 +4920 +FA20 +0A20 +04C0 +ENDCHAR +STARTCHAR U_52A9 +ENCODING 21161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4900 +4BE0 +7920 +4920 +7920 +4920 +5E20 +E2A0 +0440 +ENDCHAR +STARTCHAR U_52AA +ENCODING 21162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +FFC0 +5480 +9300 +6280 +DC40 +0800 +FF80 +0880 +1080 +E300 +ENDCHAR +STARTCHAR U_52AB +ENCODING 21163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +13E0 +1120 +FD20 +2120 +2920 +4A20 +7A20 +04C0 +ENDCHAR +STARTCHAR U_52AC +ENCODING 21164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7C80 +87E0 +74A0 +54A0 +54A0 +54A0 +7520 +0520 +1A60 +ENDCHAR +STARTCHAR U_52AD +ENCODING 21165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4900 +4BE0 +4920 +4920 +9920 +0120 +F920 +8920 +8B20 +FCE0 +ENDCHAR +STARTCHAR U_52AE +ENCODING 21166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +7C80 +93E0 +10A0 +FEA0 +10A0 +18A0 +2520 +4220 +8460 +ENDCHAR +STARTCHAR U_52AF +ENCODING 21167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +27E0 +2120 +4120 +7920 +C920 +4920 +4920 +7A20 +0460 +ENDCHAR +STARTCHAR U_52B0 +ENCODING 21168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +FBE0 +8920 +8920 +F920 +8920 +8A20 +FA20 +04C0 +ENDCHAR +STARTCHAR U_52B1 +ENCODING 21169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4080 +4080 +7DE0 +50A0 +5CA0 +54A0 +54A0 +5520 +AA20 +4460 +ENDCHAR +STARTCHAR U_52B2 +ENCODING 21170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0900 +17E0 +2920 +4520 +8120 +7920 +1120 +1220 +3A20 +C460 +ENDCHAR +STARTCHAR U_52B3 +ENCODING 21171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +8080 +0800 +7F80 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_52B4 +ENCODING 21172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2440 +2480 +7FE0 +4420 +8400 +7FC0 +0440 +0840 +1040 +6180 +ENDCHAR +STARTCHAR U_52B5 +ENCODING 21173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7F80 +0800 +FFE0 +2080 +4440 +BFA0 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52B6 +ENCODING 21174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7080 +4080 +7DE0 +40A0 +5CA0 +54A0 +54A0 +5D20 +8220 +04C0 +ENDCHAR +STARTCHAR U_52B7 +ENCODING 21175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +FC80 +13E0 +7CA0 +10A0 +FCA0 +1120 +1120 +2220 +C4C0 +ENDCHAR +STARTCHAR U_52B8 +ENCODING 21176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +1080 +13E0 +FCA0 +10A0 +7CA0 +1120 +1120 +1E20 +E4C0 +ENDCHAR +STARTCHAR U_52B9 +ENCODING 21177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +4BE0 +44A0 +8AA0 +28A0 +1120 +2920 +4520 +8660 +ENDCHAR +STARTCHAR U_52BA +ENCODING 21178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +7C80 +17E0 +50A0 +7CA0 +90A0 +10A0 +FD20 +1120 +1260 +ENDCHAR +STARTCHAR U_52BB +ENCODING 21179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +83E0 +FCA0 +90A0 +B8A0 +90A0 +FD20 +8120 +FE20 +04C0 +ENDCHAR +STARTCHAR U_52BC +ENCODING 21180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +13E0 +10A0 +7CA0 +00A0 +7CA0 +44A0 +4520 +7E20 +44C0 +ENDCHAR +STARTCHAR U_52BD +ENCODING 21181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2140 +7940 +8940 +5140 +2840 +C8C0 +7F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52BE +ENCODING 21182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FE80 +23E0 +48A0 +F0A0 +14A0 +28A0 +5920 +2620 +C4C0 +ENDCHAR +STARTCHAR U_52BF +ENCODING 21183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +FD40 +2240 +ED60 +0800 +7FC0 +0840 +1040 +E1C0 +ENDCHAR +STARTCHAR U_52C0 +ENCODING 21184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F8A0 +88A0 +88A0 +F8A0 +50A0 +5520 +5A20 +94C0 +ENDCHAR +STARTCHAR U_52C1 +ENCODING 21185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +A900 +ABE0 +5520 +0120 +FD20 +2120 +2220 +3A20 +CCC0 +ENDCHAR +STARTCHAR U_52C2 +ENCODING 21186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5100 +7FE0 +9120 +FD20 +0120 +7D20 +4520 +4520 +7E20 +44C0 +ENDCHAR +STARTCHAR U_52C3 +ENCODING 21187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +11E0 +7EA0 +84A0 +78A0 +08A0 +10A0 +7D20 +1220 +3460 +ENDCHAR +STARTCHAR U_52C4 +ENCODING 21188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7E80 +8080 +7DE0 +54A0 +54A0 +FEA0 +54A0 +7D20 +0520 +1A60 +ENDCHAR +STARTCHAR U_52C5 +ENCODING 21189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +FE80 +13E0 +7CA0 +54A0 +7CA0 +10A0 +3920 +5520 +1260 +ENDCHAR +STARTCHAR U_52C6 +ENCODING 21190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +8BE0 +F920 +8920 +F920 +A120 +B220 +CA20 +84C0 +ENDCHAR +STARTCHAR U_52C7 +ENCODING 21191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +1200 +7F80 +4880 +7F80 +4880 +7F80 +4880 +FFC0 +1040 +E380 +ENDCHAR +STARTCHAR U_52C8 +ENCODING 21192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +2100 +FBE0 +A920 +F920 +A920 +FA20 +AA20 +AA20 +BCC0 +ENDCHAR +STARTCHAR U_52C9 +ENCODING 21193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +4BE0 +7CA0 +D4A0 +54A0 +7D20 +2A20 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_52CA +ENCODING 21194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23C0 +F940 +8940 +8940 +F940 +5240 +5480 +5060 +8FC0 +ENDCHAR +STARTCHAR U_52CB +ENCODING 21195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +F900 +03E0 +F920 +8920 +A920 +A920 +A120 +5220 +8CC0 +ENDCHAR +STARTCHAR U_52CC +ENCODING 21196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +1100 +7D00 +13E0 +FD20 +2920 +4520 +B920 +2920 +2220 +3CC0 +ENDCHAR +STARTCHAR U_52CD +ENCODING 21197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FDE0 +00A0 +7CA0 +44A0 +7CA0 +10A0 +5920 +9520 +3260 +ENDCHAR +STARTCHAR U_52CE +ENCODING 21198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7080 +23E0 +FCA0 +48A0 +A4A0 +20A0 +F920 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_52CF +ENCODING 21199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +4BE0 +50A0 +FCA0 +00A0 +78A0 +4920 +4920 +7A60 +ENDCHAR +STARTCHAR U_52D0 +ENCODING 21200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +0880 +1080 +FFE0 +10A0 +50A0 +20A0 +7CA0 +5520 +5520 +FE60 +ENDCHAR +STARTCHAR U_52D1 +ENCODING 21201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +5480 +55E0 +BAA0 +10A0 +3920 +3520 +5520 +9220 +1460 +ENDCHAR +STARTCHAR U_52D2 +ENCODING 21202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +77E0 +2120 +F920 +A920 +F920 +2220 +FA20 +2460 +ENDCHAR +STARTCHAR U_52D3 +ENCODING 21203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +F880 +95E0 +DCA0 +20A0 +FCA0 +84A0 +FCA0 +8520 +FD20 +8660 +ENDCHAR +STARTCHAR U_52D4 +ENCODING 21204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +FBE0 +A8A0 +B8A0 +A8A0 +B920 +A920 +FA20 +0460 +ENDCHAR +STARTCHAR U_52D5 +ENCODING 21205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +1080 +FE80 +55E0 +7CA0 +54A0 +7CA0 +10A0 +7D20 +1120 +FE60 +ENDCHAR +STARTCHAR U_52D6 +ENCODING 21206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +8280 +BBE0 +82A0 +BAA0 +44A0 +7CA0 +44A0 +7CA0 +4520 +7E60 +ENDCHAR +STARTCHAR U_52D7 +ENCODING 21207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +7FC0 +4900 +7BE0 +4920 +7920 +4A20 +FC60 +ENDCHAR +STARTCHAR U_52D8 +ENCODING 21208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FE80 +2480 +3DE0 +24A0 +3CA0 +24A0 +FEA0 +54A0 +6320 +7E60 +ENDCHAR +STARTCHAR U_52D9 +ENCODING 21209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +2640 +F980 +2A40 +3520 +6FE0 +A120 +2120 +A2A0 +6C40 +ENDCHAR +STARTCHAR U_52DA +ENCODING 21210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FE80 +5480 +5DE0 +40A0 +7CA0 +44A0 +54A0 +1120 +2920 +C660 +ENDCHAR +STARTCHAR U_52DB +ENCODING 21211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +FDE0 +84A0 +FCA0 +84A0 +FCA0 +84A0 +FD20 +4A20 +8460 +ENDCHAR +STARTCHAR U_52DC +ENCODING 21212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5480 +AA80 +7DE0 +00A0 +EEA0 +22A0 +AAA0 +66A0 +AAA0 +4560 +ENDCHAR +STARTCHAR U_52DD +ENCODING 21213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F200 +9FE0 +9240 +F520 +9FC0 +9240 +9440 +B9C0 +ENDCHAR +STARTCHAR U_52DE +ENCODING 21214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +B580 +A500 +5280 +8C40 +FFC0 +8840 +7F80 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_52DF +ENCODING 21215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2880 +FFE0 +4840 +BFA0 +1080 +6300 +ENDCHAR +STARTCHAR U_52E0 +ENCODING 21216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AA80 +6680 +ABE0 +18A0 +E6A0 +38A0 +04A0 +78A0 +0520 +7A60 +ENDCHAR +STARTCHAR U_52E1 +ENCODING 21217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2880 +FE80 +ABE0 +FEA0 +00A0 +FEA0 +54A0 +5520 +9520 +2260 +ENDCHAR +STARTCHAR U_52E2 +ENCODING 21218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1140 +FF40 +5540 +BAA0 +1420 +7FC0 +0440 +0840 +7180 +ENDCHAR +STARTCHAR U_52E3 +ENCODING 21219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +11E0 +FCA0 +10A0 +FEA0 +44A0 +7CA0 +4520 +7D20 +C660 +ENDCHAR +STARTCHAR U_52E4 +ENCODING 21220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +2880 +7FE0 +54A0 +54A0 +7CA0 +10A0 +7D20 +1120 +FE60 +ENDCHAR +STARTCHAR U_52E5 +ENCODING 21221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1440 +FFE0 +8920 +FFE0 +1140 +77E0 +0820 +7FC0 +0840 +F0C0 +ENDCHAR +STARTCHAR U_52E6 +ENCODING 21222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +A880 +5480 +7DE0 +54A0 +7CA0 +54A0 +FEA0 +1920 +5520 +9260 +ENDCHAR +STARTCHAR U_52E7 +ENCODING 21223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7C80 +93E0 +20A0 +7CA0 +D0A0 +7CA0 +50A0 +7D20 +5120 +7E60 +ENDCHAR +STARTCHAR U_52E8 +ENCODING 21224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +9080 +7C80 +55E0 +7CA0 +20A0 +D4A0 +38A0 +5520 +A920 +5A60 +ENDCHAR +STARTCHAR U_52E9 +ENCODING 21225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4BE0 +78A0 +40A0 +7CA0 +44A0 +7CA0 +4520 +7D20 +C660 +ENDCHAR +STARTCHAR U_52EA +ENCODING 21226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FE80 +45E0 +BAA0 +28A0 +FEA0 +82A0 +BB20 +AB20 +BA60 +ENDCHAR +STARTCHAR U_52EB +ENCODING 21227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +ABE0 +FCA0 +68A0 +A4A0 +FCA0 +A4A0 +FD20 +A520 +FE60 +ENDCHAR +STARTCHAR U_52EC +ENCODING 21228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FE80 +1080 +FFE0 +54A0 +BAA0 +54A0 +FF20 +5520 +9320 +3660 +ENDCHAR +STARTCHAR U_52ED +ENCODING 21229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +2880 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +1120 +1D20 +E260 +ENDCHAR +STARTCHAR U_52EE +ENCODING 21230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +1080 +7FE0 +52A0 +7CA0 +50A0 +7EA0 +6AA0 +5CA0 +6AA0 +9160 +ENDCHAR +STARTCHAR U_52EF +ENCODING 21231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +8480 +B5E0 +84A0 +FCA0 +48A0 +78A0 +4920 +4920 +FE60 +ENDCHAR +STARTCHAR U_52F0 +ENCODING 21232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +2BE0 +4AA0 +9BE0 +5220 +FCC0 +55A0 +5680 +54A0 +ACE0 +ENDCHAR +STARTCHAR U_52F1 +ENCODING 21233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +29E0 +7CA0 +54A0 +7CA0 +54A0 +FEA0 +96A0 +FB20 +8660 +ENDCHAR +STARTCHAR U_52F2 +ENCODING 21234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FFE0 +54A0 +7CA0 +54A0 +7D20 +1260 +FC00 +5540 +AAA0 +ENDCHAR +STARTCHAR U_52F3 +ENCODING 21235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +1080 +FE80 +ABE0 +FEA0 +10A0 +FCA0 +10A0 +FD20 +5520 +AA60 +ENDCHAR +STARTCHAR U_52F4 +ENCODING 21236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +2080 +FE80 +8BE0 +FCA0 +94A0 +FCA0 +9520 +FD20 +AA20 +9E40 +ENDCHAR +STARTCHAR U_52F5 +ENCODING 21237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9480 +BE80 +ABE0 +BEA0 +AAA0 +FEA0 +8AA0 +BEA0 +8320 +8660 +ENDCHAR +STARTCHAR U_52F6 +ENCODING 21238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5EE0 +AB20 +5EA0 +CA40 +4EC0 +4B20 +0400 +7FC0 +0840 +71C0 +ENDCHAR +STARTCHAR U_52F7 +ENCODING 21239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +AA80 +EFE0 +28A0 +FCA0 +28A0 +FEA0 +2AA0 +E520 +3A60 +ENDCHAR +STARTCHAR U_52F8 +ENCODING 21240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2880 +EE80 +ABE0 +EEA0 +48A0 +FEA0 +48A0 +7D20 +4920 +7E60 +ENDCHAR +STARTCHAR U_52F9 +ENCODING 21241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FA +ENCODING 21242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +3FC0 +2040 +4040 +8840 +0440 +0440 +0040 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FB +ENCODING 21243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +2000 +3FC0 +4040 +9E40 +0040 +0040 +3F40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FC +ENCODING 21244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +2020 +4820 +BE20 +0A20 +0AA0 +12A0 +21A0 +4020 +00C0 +ENDCHAR +STARTCHAR U_52FD +ENCODING 21245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4020 +8820 +0820 +0820 +1420 +2220 +4020 +0020 +01C0 +ENDCHAR +STARTCHAR U_52FE +ENCODING 21246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +9040 +1040 +2440 +7E40 +0240 +0040 +0380 +ENDCHAR +STARTCHAR U_52FF +ENCODING 21247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2920 +4920 +8920 +1120 +2220 +4420 +0920 +30C0 +ENDCHAR +STARTCHAR U_5300 +ENCODING 21248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +5820 +8620 +0020 +0320 +0C20 +3020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5301 +ENCODING 21249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1F80 +2280 +5280 +8C80 +0480 +0A80 +1180 +60E0 +0300 +ENDCHAR +STARTCHAR U_5302 +ENCODING 21250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +50A0 +9320 +1C20 +10A0 +0FA0 +0020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5303 +ENCODING 21251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +1220 +2220 +4220 +A520 +28A0 +2060 +3FA0 +0020 +01C0 +ENDCHAR +STARTCHAR U_5304 +ENCODING 21252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8420 +7FA0 +2020 +2020 +2020 +3F20 +0020 +01C0 +ENDCHAR +STARTCHAR U_5305 +ENCODING 21253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4040 +7E40 +A240 +2240 +3E40 +2040 +21A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5306 +ENCODING 21254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +2000 +3F80 +4A80 +B280 +1A80 +2680 +4580 +8880 +1080 +2300 +ENDCHAR +STARTCHAR U_5307 +ENCODING 21255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +4820 +8FA0 +08A0 +1520 +0220 +0420 +1820 +01C0 +ENDCHAR +STARTCHAR U_5308 +ENCODING 21256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4020 +9220 +2D20 +2520 +2B20 +2120 +3F20 +0020 +00C0 +ENDCHAR +STARTCHAR U_5309 +ENCODING 21257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +8040 +3E40 +4940 +2A40 +FF40 +0840 +0840 +0840 +0180 +ENDCHAR +STARTCHAR U_530A +ENCODING 21258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4840 +C940 +2A40 +FF40 +1840 +2C40 +4B40 +0840 +0180 +ENDCHAR +STARTCHAR U_530B +ENCODING 21259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +A040 +3E40 +4840 +FF40 +0840 +4A40 +7E40 +0040 +0180 +ENDCHAR +STARTCHAR U_530C +ENCODING 21260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4420 +4A20 +9120 +2EA0 +4060 +1F20 +1120 +1F20 +00C0 +ENDCHAR +STARTCHAR U_530D +ENCODING 21261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +8A40 +7F40 +4940 +7F40 +4940 +7F40 +4940 +4A40 +0180 +ENDCHAR +STARTCHAR U_530E +ENCODING 21262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +BFA0 +1520 +3FA0 +5560 +1F20 +04A0 +07A0 +00C0 +ENDCHAR +STARTCHAR U_530F +ENCODING 21263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +4A20 +87A0 +7AA0 +03A0 +FEA0 +4220 +7A40 +0A20 +73E0 +ENDCHAR +STARTCHAR U_5310 +ENCODING 21264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4020 +BFA0 +1120 +3FA0 +24A0 +3FA0 +24A0 +3FA0 +00C0 +ENDCHAR +STARTCHAR U_5311 +ENCODING 21265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5020 +BBA0 +28A0 +3BA0 +2A20 +7BA0 +28A0 +4B20 +98C0 +ENDCHAR +STARTCHAR U_5312 +ENCODING 21266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5120 +BFA0 +1120 +1F20 +60E0 +1F20 +1120 +1F20 +00C0 +ENDCHAR +STARTCHAR U_5313 +ENCODING 21267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +7BA0 +AAA0 +3AE0 +2C20 +3BA0 +22A0 +3940 +2AC0 +ENDCHAR +STARTCHAR U_5314 +ENCODING 21268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5020 +BBA0 +2AA0 +3BA0 +2820 +7BA0 +2AA0 +4BA0 +10C0 +ENDCHAR +STARTCHAR U_5315 +ENCODING 21269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 3 -1 +BITMAP +80 +80 +86 +98 +E0 +80 +80 +81 +81 +7F +ENDCHAR +STARTCHAR U_5316 +ENCODING 21270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2240 +2280 +6300 +A200 +2600 +2A00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_5317 +ENCODING 21271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +F260 +1380 +1200 +1200 +3200 +5220 +9220 +11E0 +ENDCHAR +STARTCHAR U_5318 +ENCODING 21272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +82A0 +8540 +8A80 +A540 +CFE0 +8820 +8AA0 +8920 +8AA0 +A820 +6FE0 +ENDCHAR +STARTCHAR U_5319 +ENCODING 21273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +7D20 +4540 +7D80 +0100 +FF20 +5120 +5CE0 +B000 +9FE0 +ENDCHAR +STARTCHAR U_531A +ENCODING 21274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +FFC0 +8000 +ENDCHAR +STARTCHAR U_531B +ENCODING 21275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +8800 +8F80 +9080 +A100 +8200 +8500 +8880 +B040 +FFE0 +ENDCHAR +STARTCHAR U_531C +ENCODING 21276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +9400 +9700 +9D00 +F500 +9500 +9080 +8F80 +8000 +FFC0 +ENDCHAR +STARTCHAR U_531D +ENCODING 21277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +8400 +BF80 +A480 +A480 +A480 +A580 +8400 +8400 +FFC0 +ENDCHAR +STARTCHAR U_531E +ENCODING 21278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +9F80 +8200 +8200 +8200 +8200 +BFC0 +8000 +8000 +FFE0 +ENDCHAR +STARTCHAR U_531F +ENCODING 21279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8800 +8400 +FF80 +8000 +9E00 +9280 +9280 +A180 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5320 +ENCODING 21280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8100 +9E00 +9000 +9FC0 +9200 +9200 +9200 +A200 +C200 +FFC0 +ENDCHAR +STARTCHAR U_5321 +ENCODING 21281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BF80 +8400 +8400 +9F00 +8400 +8400 +BF80 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5322 +ENCODING 21282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9000 +BF80 +CA80 +8A80 +9280 +A480 +8880 +9300 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5323 +ENCODING 21283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +BF80 +A480 +BF80 +A480 +BF80 +8400 +8400 +8400 +FFC0 +ENDCHAR +STARTCHAR U_5324 +ENCODING 21284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BFC0 +8400 +8400 +9F80 +8500 +8480 +BFC0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5325 +ENCODING 21285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +9100 +BF80 +8080 +9100 +FFC0 +9100 +9100 +A100 +FFE0 +ENDCHAR +STARTCHAR U_5326 +ENCODING 21286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +F900 +93C0 +A940 +FD40 +8940 +FD40 +8960 +8A40 +FFE0 +ENDCHAR +STARTCHAR U_5327 +ENCODING 21287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +9480 +9480 +AD40 +C520 +8A00 +9100 +A0C0 +FFE0 +ENDCHAR +STARTCHAR U_5328 +ENCODING 21288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A880 +A880 +B880 +8BE0 +F880 +A880 +A880 +CBE0 +8800 +FFE0 +ENDCHAR +STARTCHAR U_5329 +ENCODING 21289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8200 +9240 +9FC0 +8200 +BFE0 +8000 +8200 +9FC0 +8200 +FFE0 +ENDCHAR +STARTCHAR U_532A +ENCODING 21290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +8A00 +FBC0 +8A00 +BB80 +8A00 +FBC0 +8A00 +8A00 +FFC0 +ENDCHAR +STARTCHAR U_532B +ENCODING 21291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +9FC0 +A940 +9240 +A540 +BFC0 +A040 +BFC0 +A040 +FFE0 +ENDCHAR +STARTCHAR U_532C +ENCODING 21292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8A00 +9180 +EF60 +BC40 +A540 +BD40 +A540 +A4C0 +FFE0 +ENDCHAR +STARTCHAR U_532D +ENCODING 21293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A200 +FA00 +A780 +FA80 +AA80 +FAA0 +AAA0 +FE60 +A400 +FFE0 +ENDCHAR +STARTCHAR U_532E +ENCODING 21294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +9F00 +9500 +FFC0 +8000 +BF80 +A480 +AA80 +9100 +FFC0 +ENDCHAR +STARTCHAR U_532F +ENCODING 21295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A500 +97C0 +C500 +AFC0 +9500 +E7C0 +A500 +A7E0 +A400 +FFE0 +ENDCHAR +STARTCHAR U_5330 +ENCODING 21296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +AA80 +BB80 +8000 +BF80 +A480 +BF80 +A480 +FFC0 +8400 +FFC0 +ENDCHAR +STARTCHAR U_5331 +ENCODING 21297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +9F00 +9500 +FFE0 +9080 +9F80 +9080 +9F80 +B0C0 +FFE0 +ENDCHAR +STARTCHAR U_5332 +ENCODING 21298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +8900 +9F80 +E960 +8F00 +BDC0 +A540 +BDC0 +FFE0 +ENDCHAR +STARTCHAR U_5333 +ENCODING 21299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8A00 +9180 +EE60 +BB80 +AA80 +BB80 +9100 +AA80 +FFE0 +ENDCHAR +STARTCHAR U_5334 +ENCODING 21300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +BDE0 +CA40 +9FC0 +9040 +9FC0 +8480 +BFE0 +8880 +FFE0 +ENDCHAR +STARTCHAR U_5335 +ENCODING 21301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +8400 +BF80 +AA80 +BF80 +9500 +9F00 +A080 +FFE0 +ENDCHAR +STARTCHAR U_5336 +ENCODING 21302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +FFC0 +9500 +BF80 +D400 +9F80 +A080 +BB80 +A080 +FFE0 +ENDCHAR +STARTCHAR U_5337 +ENCODING 21303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA40 +BBC0 +AA40 +BBC0 +9400 +BFC0 +E200 +BFC0 +A200 +FFE0 +ENDCHAR +STARTCHAR U_5338 +ENCODING 21304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +3FE0 +ENDCHAR +STARTCHAR U_5339 +ENCODING 21305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +9200 +9200 +9200 +9240 +A240 +A1C0 +C000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533A +ENCODING 21306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8000 +A100 +9100 +8A00 +8400 +8A00 +9100 +A100 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533B +ENCODING 21307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9000 +9000 +9F80 +A400 +FFC0 +8400 +8A00 +9100 +A080 +FFC0 +ENDCHAR +STARTCHAR U_533C +ENCODING 21308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +8A00 +9100 +EEC0 +8000 +9F00 +9100 +9F00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533D +ENCODING 21309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9100 +9F00 +9100 +9F00 +8400 +FF80 +9200 +8E00 +9900 +FFC0 +ENDCHAR +STARTCHAR U_533E +ENCODING 21310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BF80 +A080 +BF80 +A000 +BFC0 +B540 +DFC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_533F +ENCODING 21311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +FF80 +9200 +FFC0 +8800 +9F00 +B100 +DF00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5340 +ENCODING 21312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8880 +8F80 +8000 +BDE0 +A520 +A520 +BDE0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5341 +ENCODING 21313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5342 +ENCODING 21314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +1100 +1100 +1100 +FF00 +1100 +1100 +10A0 +10A0 +1060 +1020 +ENDCHAR +STARTCHAR U_5343 +ENCODING 21315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5344 +ENCODING 21316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +FFE0 +1100 +1100 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_5345 +ENCODING 21317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2440 +2440 +2440 +FFE0 +2440 +2440 +2440 +2440 +4440 +8040 +ENDCHAR +STARTCHAR U_5346 +ENCODING 21318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F00 +1120 +2120 +44E0 +8400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5347 +ENCODING 21319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0D00 +7100 +1100 +1100 +1100 +FFC0 +1100 +1100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_5348 +ENCODING 21320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3F80 +4400 +8400 +0400 +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5349 +ENCODING 21321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +0200 +1280 +1280 +1080 +FFE0 +1080 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_534A +ENCODING 21322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +1500 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_534B +ENCODING 21323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +2480 +2080 +FFE0 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_534C +ENCODING 21324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +2A80 +2A80 +FFE0 +2A80 +2A80 +2A80 +2A80 +2A80 +2080 +ENDCHAR +STARTCHAR U_534D +ENCODING 21325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F880 +0880 +0880 +0880 +0880 +FF80 +8800 +8800 +8800 +8800 +8FC0 +ENDCHAR +STARTCHAR U_534E +ENCODING 21326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2280 +6300 +AE20 +2220 +21E0 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_534F +ENCODING 21327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +4F80 +E280 +4280 +4AC0 +52A0 +4480 +4480 +4A80 +5100 +ENDCHAR +STARTCHAR U_5350 +ENCODING 21328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4200 +4200 +4200 +4200 +7FE0 +0220 +0220 +0220 +0220 +FE20 +ENDCHAR +STARTCHAR U_5351 +ENCODING 21329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +4480 +7F80 +4480 +7F80 +1400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5352 +ENCODING 21330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +1100 +2A80 +4440 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5353 +ENCODING 21331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_5354 +ENCODING 21332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +FA40 +2480 +2480 +3FE0 +2AA0 +2AA0 +3320 +2440 +ENDCHAR +STARTCHAR U_5355 +ENCODING 21333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5356 +ENCODING 21334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1040 +2A80 +1200 +FFE0 +0200 +0D80 +7040 +ENDCHAR +STARTCHAR U_5357 +ENCODING 21335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5140 +4A40 +7FC0 +4440 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5358 +ENCODING 21336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5359 +ENCODING 21337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FE80 +2480 +3C80 +27E0 +3C80 +2480 +FE80 +5480 +6280 +7E80 +ENDCHAR +STARTCHAR U_535A +ENCODING 21338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +5FE0 +4200 +EFC0 +4A40 +4FC0 +4A40 +7FE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_535B +ENCODING 21339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4EA0 +F1E0 +4E80 +F1E0 +0E00 +AAA0 +AEA0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_535C +ENCODING 21340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +90 +8C +84 +80 +80 +80 +ENDCHAR +STARTCHAR U_535D +ENCODING 21341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +1200 +1200 +F3E0 +1200 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR U_535E +ENCODING 21342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +0800 +0800 +0E00 +0980 +0880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_535F +ENCODING 21343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +F200 +9200 +9300 +92C0 +9240 +F200 +9200 +0200 +0200 +ENDCHAR +STARTCHAR U_5360 +ENCODING 21344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1000 +1F80 +1000 +1000 +FF00 +8100 +8100 +8100 +FF00 +8100 +ENDCHAR +STARTCHAR U_5361 +ENCODING 21345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +0800 +FFE0 +0800 +0A00 +0900 +0880 +0800 +0800 +ENDCHAR +STARTCHAR U_5362 +ENCODING 21346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5363 +ENCODING 21347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +FF80 +8080 +FC80 +8480 +FC80 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_5364 +ENCODING 21348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0F80 +0800 +FF80 +A280 +9480 +8880 +9480 +A280 +FF80 +8080 +ENDCHAR +STARTCHAR U_5365 +ENCODING 21349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1F80 +1000 +FFC0 +A940 +9140 +AA40 +C440 +8A40 +9040 +FFC0 +ENDCHAR +STARTCHAR U_5366 +ENCODING 21350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1100 +FD80 +1140 +1120 +7D20 +1100 +1D00 +E100 +ENDCHAR +STARTCHAR U_5367 +ENCODING 21351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +9100 +9100 +FD80 +8560 +8520 +FD00 +9100 +9100 +FD00 +0100 +ENDCHAR +STARTCHAR U_5368 +ENCODING 21352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +3F80 +2080 +3E80 +2280 +FFE0 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_5369 +ENCODING 21353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 5 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +A8 +90 +80 +80 +80 +ENDCHAR +STARTCHAR U_536A +ENCODING 21354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +FE +82 +A2 +92 +92 +82 +92 +8C +80 +80 +80 +ENDCHAR +STARTCHAR U_536B +ENCODING 21355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +0880 +0880 +0880 +0A80 +0900 +0800 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_536C +ENCODING 21356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +8440 +8440 +8440 +8440 +9440 +A540 +C480 +0400 +0400 +ENDCHAR +STARTCHAR U_536D +ENCODING 21357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +2220 +2220 +2220 +2220 +2220 +3AA0 +C240 +0200 +0200 +ENDCHAR +STARTCHAR U_536E +ENCODING 21358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FE0 +2000 +2F80 +2880 +2880 +2B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_536F +ENCODING 21359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E7C0 +8440 +9440 +9440 +9440 +B440 +D540 +1480 +2400 +C400 +ENDCHAR +STARTCHAR U_5370 +ENCODING 21360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E7C0 +8440 +8440 +F440 +8440 +8440 +9440 +E580 +8400 +0400 +ENDCHAR +STARTCHAR U_5371 +ENCODING 21361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2100 +7FE0 +2000 +2F80 +2880 +2880 +2B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_5372 +ENCODING 21362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2520 +2520 +5920 +8120 +7D20 +45A0 +4540 +7D00 +4500 +ENDCHAR +STARTCHAR U_5373 +ENCODING 21363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +8A40 +FA40 +8A40 +FA40 +8A40 +A240 +9340 +AA80 +CA00 +0200 +ENDCHAR +STARTCHAR U_5374 +ENCODING 21364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11E0 +7D20 +1120 +1120 +FF20 +1120 +2120 +4D60 +7500 +0100 +ENDCHAR +STARTCHAR U_5375 +ENCODING 21365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +9440 +D440 +B540 +94C0 +9440 +F440 +15C0 +2400 +C400 +ENDCHAR +STARTCHAR U_5376 +ENCODING 21366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1D20 +2520 +6920 +1120 +2920 +DF20 +2320 +55E0 +0900 +7100 +ENDCHAR +STARTCHAR U_5377 +ENCODING 21367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7FE0 +0800 +FFE0 +1080 +3F40 +D120 +1300 +1040 +1FC0 +ENDCHAR +STARTCHAR U_5378 +ENCODING 21368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +9120 +1120 +FF20 +1120 +5D20 +5120 +51A0 +5D40 +E100 +ENDCHAR +STARTCHAR U_5379 +ENCODING 21369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +20A0 +FEA0 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +AFE0 +F080 +0080 +ENDCHAR +STARTCHAR U_537A +ENCODING 21370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +F640 +2580 +5480 +8860 +7FC0 +2100 +2640 +2040 +1FC0 +ENDCHAR +STARTCHAR U_537B +ENCODING 21371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +25E0 +5320 +9920 +2520 +4320 +BD20 +25A0 +2540 +3D00 +2500 +ENDCHAR +STARTCHAR U_537C +ENCODING 21372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +57E0 +5400 +55C0 +5540 +55C0 +5520 +59E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_537D +ENCODING 21373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4000 +FBC0 +8A40 +FA40 +8A40 +FA40 +8240 +F240 +82C0 +B200 +C200 +ENDCHAR +STARTCHAR U_537E +ENCODING 21374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B520 +FD20 +0120 +7920 +0120 +FDA0 +4140 +7900 +0900 +3100 +ENDCHAR +STARTCHAR U_537F +ENCODING 21375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +CAA0 +AEA0 +AAA0 +AEA0 +AAA0 +E8A0 +AAE0 +2D80 +4880 +8080 +ENDCHAR +STARTCHAR U_5380 +ENCODING 21376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +3920 +5520 +9120 +2920 +D720 +55A0 +3940 +5500 +B200 +ENDCHAR +STARTCHAR U_5381 +ENCODING 21377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +28C0 +5540 +B8C0 +5040 +5BE0 +B440 +7FC0 +0440 +05C0 +0400 +ENDCHAR +STARTCHAR U_5382 +ENCODING 21378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3FE0 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_5383 +ENCODING 21379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2080 +4100 +BFE0 +2000 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5384 +ENCODING 21380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2000 +2F80 +2880 +2880 +2880 +2B00 +4820 +4820 +87E0 +ENDCHAR +STARTCHAR U_5385 +ENCODING 21381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2000 +3FE0 +2100 +2100 +2100 +2100 +4100 +4100 +8700 +ENDCHAR +STARTCHAR U_5386 +ENCODING 21382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2200 +2200 +2FE0 +2220 +2220 +2420 +4420 +4820 +90C0 +ENDCHAR +STARTCHAR U_5387 +ENCODING 21383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +23C0 +2E00 +2200 +2200 +3FE0 +2200 +4220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5388 +ENCODING 21384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2100 +2100 +3FE0 +2100 +2100 +4100 +4100 +8100 +ENDCHAR +STARTCHAR U_5389 +ENCODING 21385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +3FE0 +2400 +2400 +27C0 +2440 +2440 +4840 +4840 +9180 +ENDCHAR +STARTCHAR U_538A +ENCODING 21386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4480 +4880 +5FE0 +4280 +4480 +4880 +9080 +A380 +ENDCHAR +STARTCHAR U_538B +ENCODING 21387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2200 +2200 +2200 +3FC0 +2200 +2280 +4240 +4200 +BFE0 +ENDCHAR +STARTCHAR U_538C +ENCODING 21388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4280 +4240 +5FE0 +4200 +4200 +4500 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_538D +ENCODING 21389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4400 +5FE0 +4800 +4A00 +5FC0 +4200 +7FE0 +8200 +8200 +ENDCHAR +STARTCHAR U_538E +ENCODING 21390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5100 +5100 +5FE0 +5100 +5100 +5520 +9AA0 +9160 +ENDCHAR +STARTCHAR U_538F +ENCODING 21391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4800 +4800 +4FE0 +5400 +67C0 +4400 +4400 +47E0 +8400 +8400 +ENDCHAR +STARTCHAR U_5390 +ENCODING 21392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +2440 +3FE0 +2400 +2540 +2540 +2580 +4B20 +5520 +A0E0 +ENDCHAR +STARTCHAR U_5391 +ENCODING 21393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4100 +4100 +5D60 +5580 +5500 +5500 +5520 +5D20 +8120 +80E0 +ENDCHAR +STARTCHAR U_5392 +ENCODING 21394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4800 +4FC0 +5200 +7FE0 +4200 +5240 +5240 +9FC0 +9040 +ENDCHAR +STARTCHAR U_5393 +ENCODING 21395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +5FC0 +4200 +7FE0 +4000 +4200 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5394 +ENCODING 21396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4400 +4880 +5FC0 +4240 +4F80 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5395 +ENCODING 21397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BE20 +A2A0 +AAA0 +AAA0 +AAA0 +AAA0 +AA20 +9420 +A2E0 +ENDCHAR +STARTCHAR U_5396 +ENCODING 21398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4840 +7FE0 +4900 +4A80 +4940 +5680 +5520 +A620 +DBE0 +ENDCHAR +STARTCHAR U_5397 +ENCODING 21399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +7FE0 +4500 +4200 +7FE0 +4200 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_5398 +ENCODING 21400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FE0 +2920 +2FE0 +2920 +2FE0 +2100 +2FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5399 +ENCODING 21401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +7FE0 +8200 +8200 +ENDCHAR +STARTCHAR U_539A +ENCODING 21402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2840 +2FC0 +2840 +2FC0 +2080 +3FE0 +4100 +8700 +ENDCHAR +STARTCHAR U_539B +ENCODING 21403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +41C0 +5D00 +5500 +55E0 +5540 +5D40 +4140 +8240 +8440 +ENDCHAR +STARTCHAR U_539C +ENCODING 21404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4080 +5F00 +4200 +5FC0 +4A80 +7FE0 +4A80 +5FE0 +8200 +9FC0 +ENDCHAR +STARTCHAR U_539D +ENCODING 21405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +5FC0 +4480 +5FE0 +4000 +4FC0 +4840 +4FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_539E +ENCODING 21406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4500 +4500 +7DE0 +4500 +5DC0 +4500 +7DE0 +4500 +8500 +8500 +ENDCHAR +STARTCHAR U_539F +ENCODING 21407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +2200 +2A80 +5260 +A620 +ENDCHAR +STARTCHAR U_53A0 +ENCODING 21408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5E20 +52A0 +5EA0 +52A0 +5EA0 +52A0 +5E20 +5420 +A2E0 +ENDCHAR +STARTCHAR U_53A1 +ENCODING 21409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +2120 +5DC0 +4540 +9B20 +ENDCHAR +STARTCHAR U_53A2 +ENCODING 21410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4800 +49E0 +7F20 +49E0 +4D20 +5BE0 +6920 +89E0 +8920 +ENDCHAR +STARTCHAR U_53A3 +ENCODING 21411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4280 +7FE0 +4880 +7FE0 +5240 +5FC0 +5240 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_53A4 +ENCODING 21412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +4D80 +5AC0 +6AA0 +8880 +8880 +ENDCHAR +STARTCHAR U_53A5 +ENCODING 21413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +4880 +7EE0 +4920 +6A80 +6A80 +7E80 +4880 +9140 +A220 +ENDCHAR +STARTCHAR U_53A6 +ENCODING 21414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4840 +4F40 +4BC0 +4840 +4FC0 +4C80 +5300 +ACE0 +ENDCHAR +STARTCHAR U_53A7 +ENCODING 21415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7FE0 +4880 +4F80 +4880 +4F80 +4880 +7FE0 +8880 +B060 +ENDCHAR +STARTCHAR U_53A8 +ENCODING 21416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4040 +5E40 +4040 +5DE0 +5440 +5540 +5CC0 +5440 +8E40 +B8C0 +ENDCHAR +STARTCHAR U_53A9 +ENCODING 21417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5DE0 +5440 +5D40 +5540 +5FE0 +5080 +5580 +9AA0 +8460 +ENDCHAR +STARTCHAR U_53AA +ENCODING 21418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +2FE0 +2480 +2FE0 +2920 +2FE0 +2100 +4FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_53AB +ENCODING 21419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7C80 +49E0 +7E40 +4940 +7EC0 +5040 +5EA0 +52A0 +A720 +ENDCHAR +STARTCHAR U_53AC +ENCODING 21420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5040 +5FC0 +5040 +5FC0 +5280 +6CC0 +52A0 +6FE0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_53AD +ENCODING 21421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5EC0 +52A0 +5E80 +41E0 +5E80 +5280 +5E80 +9340 +9620 +ENDCHAR +STARTCHAR U_53AE +ENCODING 21422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +7FC0 +5280 +5E80 +52E0 +5EA0 +52A0 +5FA0 +92A0 +A120 +ENDCHAR +STARTCHAR U_53AF +ENCODING 21423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7DE0 +4880 +5DC0 +6AA0 +4000 +5240 +6920 +A8A0 +8F80 +ENDCHAR +STARTCHAR U_53B0 +ENCODING 21424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +5A80 +4CE0 +5F20 +52A0 +5EA0 +5640 +5E40 +52A0 +9520 +ENDCHAR +STARTCHAR U_53B1 +ENCODING 21425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7760 +4000 +5DC0 +5540 +5DC0 +8880 +9540 +ENDCHAR +STARTCHAR U_53B2 +ENCODING 21426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +5FE0 +4480 +4FC0 +4A40 +4FC0 +4A40 +5FE0 +92A0 +9760 +ENDCHAR +STARTCHAR U_53B3 +ENCODING 21427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +7FE0 +4100 +5D00 +45E0 +7E40 +5540 +5D40 +5680 +7C80 +8560 +ENDCHAR +STARTCHAR U_53B4 +ENCODING 21428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5FE0 +5480 +5FC0 +5260 +5FC0 +5240 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_53B5 +ENCODING 21429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +5FC0 +5240 +5FC0 +8A80 +7FE0 +5240 +7FE0 +4AA0 +B5C0 +ENDCHAR +STARTCHAR U_53B6 +ENCODING 21430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1080 +2040 +41C0 +FE20 +4020 +ENDCHAR +STARTCHAR U_53B7 +ENCODING 21431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0800 +0900 +1100 +1200 +2280 +2440 +4FC0 +8840 +ENDCHAR +STARTCHAR U_53B8 +ENCODING 21432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +2080 +2080 +4100 +5140 +5140 +4920 +FBE0 +4920 +ENDCHAR +STARTCHAR U_53B9 +ENCODING 21433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +FF00 +1100 +1140 +2140 +48C0 +8800 +1000 +2100 +FF80 +4080 +ENDCHAR +STARTCHAR U_53BA +ENCODING 21434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +1100 +2480 +C460 +0900 +1080 +23C0 +7C40 +ENDCHAR +STARTCHAR U_53BB +ENCODING 21435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0900 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_53BC +ENCODING 21436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +2080 +7FC0 +0040 +0400 +2480 +2440 +4420 +8420 +1C00 +ENDCHAR +STARTCHAR U_53BD +ENCODING 21437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1100 +2080 +7FC0 +0040 +2080 +2080 +4920 +FBE0 +0820 +ENDCHAR +STARTCHAR U_53BE +ENCODING 21438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +1080 +1080 +7C80 +1080 +1080 +FE80 +20A0 +44A0 +FE60 +4220 +ENDCHAR +STARTCHAR U_53BF +ENCODING 21439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_53C0 +ENCODING 21440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +4880 +7F80 +4880 +7F80 +1200 +2100 +7F80 +ENDCHAR +STARTCHAR U_53C1 +ENCODING 21441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0440 +FFE0 +2080 +DF60 +0000 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_53C2 +ENCODING 21442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2480 +D860 +0600 +1880 +0300 +3C00 +ENDCHAR +STARTCHAR U_53C3 +ENCODING 21443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3E80 +5140 +FFC0 +2080 +CC60 +3300 +0C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_53C4 +ENCODING 21444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1200 +3F00 +2100 +4A40 +FFE0 +1120 +3F80 +C460 +0200 +7FC0 +ENDCHAR +STARTCHAR U_53C5 +ENCODING 21445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1F00 +1100 +2A80 +7FC0 +0A00 +3180 +C460 +2680 +4540 +0C00 +ENDCHAR +STARTCHAR U_53C6 +ENCODING 21446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +7700 +02A0 +07E0 +F520 +27E0 +2100 +51E0 +52A0 +FAC0 +0D20 +ENDCHAR +STARTCHAR U_53C7 +ENCODING 21447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +75E0 +04A0 +03E0 +F0A0 +4DE0 +46A0 +95C0 +F6A0 +1480 +0BE0 +ENDCHAR +STARTCHAR U_53C8 +ENCODING 21448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +1040 +1080 +0880 +0900 +0500 +0200 +0600 +1980 +E060 +ENDCHAR +STARTCHAR U_53C9 +ENCODING 21449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +7F00 +2900 +2500 +2200 +1200 +1400 +0800 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_53CA +ENCODING 21450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F00 +1100 +1200 +1200 +17C0 +1040 +2880 +2500 +4200 +4580 +9860 +ENDCHAR +STARTCHAR U_53CB +ENCODING 21451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +1F80 +1880 +2880 +2500 +4200 +8D80 +3060 +ENDCHAR +STARTCHAR U_53CC +ENCODING 21452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A40 +4A40 +2A40 +1140 +1140 +2880 +4580 +8240 +0420 +ENDCHAR +STARTCHAR U_53CD +ENCODING 21453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +2000 +3FC0 +2880 +2500 +2200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_53CE +ENCODING 21454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +9FC0 +9440 +9440 +9280 +9280 +B100 +D100 +1280 +1440 +1820 +ENDCHAR +STARTCHAR U_53CF +ENCODING 21455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +0880 +FFE0 +0800 +7F80 +2080 +1300 +0C00 +3300 +C0E0 +ENDCHAR +STARTCHAR U_53D0 +ENCODING 21456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0800 +FFE0 +0800 +1F80 +1880 +2500 +2200 +4D00 +B0E0 +ENDCHAR +STARTCHAR U_53D1 +ENCODING 21457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2440 +4400 +7FE0 +0800 +0F80 +0880 +1500 +2200 +4580 +9860 +ENDCHAR +STARTCHAR U_53D2 +ENCODING 21458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +2080 +1100 +0E00 +F1C0 +0000 +FBC0 +4940 +4940 +3080 +CB60 +ENDCHAR +STARTCHAR U_53D3 +ENCODING 21459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +0400 +7FC0 +1100 +0E00 +71E0 +ENDCHAR +STARTCHAR U_53D4 +ENCODING 21460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13C0 +1C40 +1140 +FF40 +1140 +5540 +5280 +9280 +9140 +3220 +ENDCHAR +STARTCHAR U_53D5 +ENCODING 21461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A20 +5140 +2080 +5360 +8C20 +F7C0 +5240 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_53D6 +ENCODING 21462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +4A20 +7A20 +4940 +7940 +4880 +4C80 +F940 +0A40 +0C20 +ENDCHAR +STARTCHAR U_53D7 +ENCODING 21463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C80 +2900 +1500 +FFC0 +8040 +3F00 +1200 +0C00 +1300 +E0C0 +ENDCHAR +STARTCHAR U_53D8 +ENCODING 21464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +1200 +5280 +9240 +0000 +7F80 +1200 +0C00 +1200 +E1C0 +ENDCHAR +STARTCHAR U_53D9 +ENCODING 21465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +4520 +BB20 +1120 +7D40 +1140 +5880 +5540 +9240 +3420 +ENDCHAR +STARTCHAR U_53DA +ENCODING 21466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8820 +8820 +FBE0 +8000 +FBE0 +8220 +8140 +F880 +8140 +8620 +ENDCHAR +STARTCHAR U_53DB +ENCODING 21467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB00 +7200 +2200 +FBE0 +2240 +FA40 +2540 +2480 +4940 +9620 +ENDCHAR +STARTCHAR U_53DC +ENCODING 21468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9420 +1580 +2600 +1980 +E060 +1F80 +0900 +0600 +79C0 +ENDCHAR +STARTCHAR U_53DD +ENCODING 21469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FAA0 +2240 +2200 +FBE0 +22A0 +42A0 +4A40 +FAA0 +0320 +ENDCHAR +STARTCHAR U_53DE +ENCODING 21470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47C0 +7D40 +4140 +7D40 +4140 +7F40 +4880 +AC80 +AB40 +5A20 +ENDCHAR +STARTCHAR U_53DF +ENCODING 21471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +7FC0 +0400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_53E0 +ENCODING 21472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0A00 +1500 +FFE0 +5280 +AD40 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_53E1 +ENCODING 21473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C00 +21E0 +FD20 +4920 +B520 +4940 +FD40 +4880 +7980 +4A40 +7C20 +ENDCHAR +STARTCHAR U_53E2 +ENCODING 21474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +1200 +7FC0 +0400 +FFE0 +4540 +7D40 +4480 +FD40 +0620 +ENDCHAR +STARTCHAR U_53E3 +ENCODING 21475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_53E4 +ENCODING 21476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +3F80 +2080 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_53E5 +ENCODING 21477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +4020 +BE20 +2220 +2220 +3E20 +2220 +0020 +00C0 +ENDCHAR +STARTCHAR U_53E6 +ENCODING 21478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2480 +0400 +7FC0 +0840 +1040 +2040 +C380 +ENDCHAR +STARTCHAR U_53E7 +ENCODING 21479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F80 +4080 +4080 +7F80 +0000 +FF80 +0880 +0880 +1080 +2080 +C700 +ENDCHAR +STARTCHAR U_53E8 +ENCODING 21480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F220 +9220 +9220 +9220 +9220 +F220 +9420 +0420 +0820 +30C0 +ENDCHAR +STARTCHAR U_53E9 +ENCODING 21481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +07C0 +F440 +9440 +9440 +9440 +9440 +F440 +9440 +05C0 +0400 +0400 +ENDCHAR +STARTCHAR U_53EA +ENCODING 21482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +2080 +2080 +2080 +3F80 +2080 +1100 +2080 +4040 +8040 +ENDCHAR +STARTCHAR U_53EB +ENCODING 21483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0040 +0440 +F440 +9440 +9440 +9440 +95C0 +F640 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_53EC +ENCODING 21484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +1080 +1080 +1080 +2280 +4100 +FF80 +4080 +4080 +4080 +7F80 +ENDCHAR +STARTCHAR U_53ED +ENCODING 21485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F280 +9280 +9280 +9280 +9280 +F240 +0440 +0440 +0820 +1020 +ENDCHAR +STARTCHAR U_53EE +ENCODING 21486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +9080 +9080 +9080 +9080 +F080 +9080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_53EF +ENCODING 21487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0080 +3C80 +2480 +2480 +3C80 +2480 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_53F0 +ENCODING 21488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2200 +4100 +FF80 +0080 +7F00 +4100 +4100 +4100 +7F00 +ENDCHAR +STARTCHAR U_53F1 +ENCODING 21489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +9220 +9240 +9280 +9300 +9600 +F200 +9220 +0220 +01E0 +ENDCHAR +STARTCHAR U_53F2 +ENCODING 21490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +2400 +1400 +0800 +1600 +E1E0 +ENDCHAR +STARTCHAR U_53F3 +ENCODING 21491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0800 +1000 +1F80 +3080 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_53F4 +ENCODING 21492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +0900 +1120 +20E0 +C000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_53F5 +ENCODING 21493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8000 +8000 +9F00 +9100 +9100 +9F00 +9100 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_53F6 +ENCODING 21494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9100 +9100 +9FE0 +9100 +F100 +9100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_53F7 +ENCODING 21495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +FFE0 +0800 +1F80 +0080 +0080 +0480 +0300 +ENDCHAR +STARTCHAR U_53F8 +ENCODING 21496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +0040 +FF40 +0040 +7E40 +4240 +4240 +7E40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_53F9 +ENCODING 21497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +9440 +9240 +9280 +9280 +F100 +9100 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_53FA +ENCODING 21498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +F200 +9200 +9200 +9200 +F500 +8500 +0880 +1040 +2020 +ENDCHAR +STARTCHAR U_53FB +ENCODING 21499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97E0 +9120 +9120 +9120 +F120 +9220 +0220 +0420 +08C0 +ENDCHAR +STARTCHAR U_53FC +ENCODING 21500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F020 +9020 +90A0 +9120 +9220 +F420 +9820 +0020 +0020 +00C0 +ENDCHAR +STARTCHAR U_53FD +ENCODING 21501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +9480 +9480 +9480 +9480 +F480 +9480 +04A0 +08A0 +10E0 +ENDCHAR +STARTCHAR U_53FE +ENCODING 21502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0200 +0400 +0400 +1400 +0800 +0000 +FF80 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_53FF +ENCODING 21503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +1FC0 +E200 +A200 +A200 +A200 +A200 +E200 +0200 +0200 +3FE0 +ENDCHAR +STARTCHAR U_5400 +ENCODING 21504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F00 +0100 +F100 +9100 +9FE0 +9100 +9100 +F100 +0100 +0100 +ENDCHAR +STARTCHAR U_5401 +ENCODING 21505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +9FE0 +9100 +F100 +9100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_5402 +ENCODING 21506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +2000 +2000 +3FC0 +0000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5403 +ENCODING 21507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9800 +97C0 +9080 +9100 +F200 +9420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5404 +ENCODING 21508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3080 +4900 +0600 +0900 +3080 +DFE0 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_5405 +ENCODING 21509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +9480 +9480 +9480 +9480 +9480 +F780 +9480 +ENDCHAR +STARTCHAR U_5406 +ENCODING 21510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9240 +9240 +9480 +9F80 +9100 +F240 +9420 +0FE0 +0420 +ENDCHAR +STARTCHAR U_5407 +ENCODING 21511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F040 +9080 +9100 +9FE0 +9100 +9100 +F100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_5408 +ENCODING 21512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5409 +ENCODING 21513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +7FC0 +0000 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_540A +ENCODING 21514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +FF80 +8880 +8880 +8880 +8980 +0800 +ENDCHAR +STARTCHAR U_540B +ENCODING 21515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +9FE0 +9080 +9480 +9280 +9280 +F080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_540C +ENCODING 21516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8040 +BF40 +8040 +9E40 +9240 +9240 +9E40 +9240 +8040 +80C0 +ENDCHAR +STARTCHAR U_540D +ENCODING 21517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1FC0 +1080 +2900 +4600 +0400 +1FC0 +F040 +1040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_540E +ENCODING 21518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +3FE0 +2000 +2000 +2FC0 +2840 +4840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_540F +ENCODING 21519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +2400 +1400 +0800 +1600 +E1E0 +ENDCHAR +STARTCHAR U_5410 +ENCODING 21520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +97C0 +9100 +9100 +F100 +9100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5411 +ENCODING 21521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +FFC0 +8040 +9E40 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5412 +ENCODING 21522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0700 +F100 +9100 +91E0 +9F00 +9100 +F100 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_5413 +ENCODING 21523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9100 +9180 +9140 +F120 +9120 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5414 +ENCODING 21524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0A00 +EAC0 +AB40 +AE40 +BA40 +AA40 +EAC0 +0A20 +0820 +07E0 +ENDCHAR +STARTCHAR U_5415 +ENCODING 21525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +4100 +0000 +FF80 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_5416 +ENCODING 21526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +0440 +F280 +9100 +9100 +9100 +9100 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_5417 +ENCODING 21527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F040 +9240 +9240 +9440 +97E0 +9020 +9FA0 +F020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5418 +ENCODING 21528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7C0 +A900 +B100 +A100 +BFE0 +A100 +E100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5419 +ENCODING 21529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +E240 +AA40 +AA80 +B200 +A300 +E480 +0480 +0840 +1060 +ENDCHAR +STARTCHAR U_541A +ENCODING 21530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E240 +A240 +BFE0 +A240 +A240 +EFC0 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_541B +ENCODING 21531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0440 +FFE0 +0840 +3FC0 +1000 +2000 +5FC0 +9040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_541C +ENCODING 21532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F240 +9240 +9240 +9240 +97C0 +9240 +F240 +0240 +0240 +1FE0 +ENDCHAR +STARTCHAR U_541D +ENCODING 21533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFC0 +2100 +1200 +0C00 +1200 +6180 +BF60 +2100 +2100 +3F00 +ENDCHAR +STARTCHAR U_541E +ENCODING 21534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +1100 +2080 +7FC0 +A0A0 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_541F +ENCODING 21535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +9A20 +9100 +97C0 +F040 +9080 +0100 +0200 +ENDCHAR +STARTCHAR U_5420 +ENCODING 21536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +9120 +9FE0 +9100 +9100 +F280 +9280 +0440 +0840 +1020 +ENDCHAR +STARTCHAR U_5421 +ENCODING 21537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +E900 +A900 +A920 +AFC0 +A900 +A900 +E900 +AB20 +0D20 +08E0 +ENDCHAR +STARTCHAR U_5422 +ENCODING 21538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +5220 +52A0 +9080 +0F80 +0000 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5423 +ENCODING 21539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0080 +E080 +A200 +A240 +AA20 +AA20 +B200 +E220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5424 +ENCODING 21540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +9CA0 +9480 +F480 +9480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_5425 +ENCODING 21541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +9080 +9100 +9380 +9540 +9920 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_5426 +ENCODING 21542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0D80 +3440 +C420 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5427 +ENCODING 21543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +A940 +A940 +A940 +AFC0 +E800 +A800 +0820 +0820 +07E0 +ENDCHAR +STARTCHAR U_5428 +ENCODING 21544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +A200 +AA40 +AA40 +EFC0 +0200 +0220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5429 +ENCODING 21545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9440 +9820 +97C0 +F240 +9240 +0440 +0840 +1180 +ENDCHAR +STARTCHAR U_542A +ENCODING 21546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A920 +A940 +B980 +A900 +AB00 +ED00 +A920 +0920 +08E0 +ENDCHAR +STARTCHAR U_542B +ENCODING 21547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1900 +2480 +FFE0 +0100 +0200 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_542C +ENCODING 21548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +97E0 +9480 +F480 +0480 +0880 +1080 +2080 +ENDCHAR +STARTCHAR U_542D +ENCODING 21549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9000 +9780 +9480 +9480 +F480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_542E +ENCODING 21550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +9FE0 +9020 +9480 +F480 +9480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_542F +ENCODING 21551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +3FC0 +2040 +2040 +3FC0 +2000 +3FC0 +3040 +5040 +5FC0 +9040 +ENDCHAR +STARTCHAR U_5430 +ENCODING 21552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFE0 +A200 +A280 +A480 +A480 +E900 +0A40 +17E0 +2220 +ENDCHAR +STARTCHAR U_5431 +ENCODING 21553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +97C0 +9440 +F280 +9100 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5432 +ENCODING 21554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F20 +E120 +A120 +AF20 +A820 +AF20 +A120 +E120 +0120 +0920 +0620 +ENDCHAR +STARTCHAR U_5433 +ENCODING 21555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +2880 +2880 +2F80 +2000 +3FC0 +0440 +7FE0 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_5434 +ENCODING 21556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0000 +3FC0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5435 +ENCODING 21557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A540 +A520 +A900 +B120 +A140 +E080 +0100 +0600 +1800 +ENDCHAR +STARTCHAR U_5436 +ENCODING 21558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A920 +A920 +A920 +AAA0 +EC60 +0820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5437 +ENCODING 21559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFC0 +A240 +A240 +BFE0 +A200 +E200 +0500 +0880 +3060 +ENDCHAR +STARTCHAR U_5438 +ENCODING 21560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +A480 +A480 +A5E0 +A440 +EA40 +0A80 +1100 +2280 +4C60 +ENDCHAR +STARTCHAR U_5439 +ENCODING 21561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9420 +9940 +9100 +9100 +F280 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_543A +ENCODING 21562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A480 +A4E0 +A800 +B7C0 +E440 +A280 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_543B +ENCODING 21563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +F7E0 +9AA0 +92A0 +94A0 +9520 +F920 +0220 +04A0 +1840 +ENDCHAR +STARTCHAR U_543C +ENCODING 21564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E80 +E280 +A480 +A480 +A480 +A680 +BC80 +E480 +04A0 +14A0 +0860 +ENDCHAR +STARTCHAR U_543D +ENCODING 21565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9500 +97C0 +9900 +9100 +9FE0 +F100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_543E +ENCODING 21566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +0880 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_543F +ENCODING 21567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5440 +ENCODING 21568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E480 +A480 +A880 +AFE0 +A180 +E280 +A480 +0880 +3080 +0180 +ENDCHAR +STARTCHAR U_5441 +ENCODING 21569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9420 +9820 +9220 +90A0 +9120 +F220 +0C20 +0020 +00E0 +ENDCHAR +STARTCHAR U_5442 +ENCODING 21570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +1000 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_5443 +ENCODING 21571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A800 +ABC0 +AA40 +AA40 +AA40 +EA40 +AAC0 +0A20 +1220 +21E0 +ENDCHAR +STARTCHAR U_5444 +ENCODING 21572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +2040 +4480 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5445 +ENCODING 21573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +9440 +9280 +9280 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_5446 +ENCODING 21574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5447 +ENCODING 21575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0480 +F500 +1600 +2500 +54C0 +8800 +7F00 +4100 +4100 +7F00 +4100 +ENDCHAR +STARTCHAR U_5448 +ENCODING 21576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0000 +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5449 +ENCODING 21577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +5080 +5080 +5F80 +4000 +7F80 +0080 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_544A +ENCODING 21578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_544B +ENCODING 21579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +9FE0 +F100 +9100 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_544C +ENCODING 21580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +E480 +A280 +A880 +A480 +A0E0 +E380 +AC80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_544D +ENCODING 21581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F000 +9000 +9000 +9FE0 +9100 +9200 +F280 +8440 +09E0 +0E20 +ENDCHAR +STARTCHAR U_544E +ENCODING 21582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +9500 +F500 +9480 +0880 +1040 +2020 +ENDCHAR +STARTCHAR U_544F +ENCODING 21583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EC80 +A480 +A480 +BFE0 +A480 +E480 +A880 +0880 +1080 +2080 +ENDCHAR +STARTCHAR U_5450 +ENCODING 21584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +EFE0 +A920 +A920 +A9A0 +AA60 +EC20 +A820 +0820 +0860 +ENDCHAR +STARTCHAR U_5451 +ENCODING 21585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +0A00 +3180 +C060 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5452 +ENCODING 21586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +9FE0 +9280 +F280 +9480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_5453 +ENCODING 21587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9000 +9FC0 +9080 +9100 +F200 +9420 +0820 +07E0 +ENDCHAR +STARTCHAR U_5454 +ENCODING 21588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A100 +AFE0 +A100 +A100 +A280 +E280 +A640 +0940 +1020 +ENDCHAR +STARTCHAR U_5455 +ENCODING 21589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +A840 +AA40 +A980 +A880 +A980 +EA40 +AC40 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5456 +ENCODING 21590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E900 +A900 +ABE0 +A920 +A920 +E920 +A920 +0920 +1220 +24C0 +ENDCHAR +STARTCHAR U_5457 +ENCODING 21591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9520 +9520 +9520 +9520 +F520 +9520 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5458 +ENCODING 21592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +7FC0 +4040 +4440 +4440 +4A40 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5459 +ENCODING 21593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +FF80 +8880 +9480 +A280 +8080 +8180 +ENDCHAR +STARTCHAR U_545A +ENCODING 21594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F200 +97E0 +9480 +9A80 +9280 +F100 +8100 +0280 +1C60 +ENDCHAR +STARTCHAR U_545B +ENCODING 21595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9820 +97C0 +9440 +9440 +F580 +9420 +0420 +03E0 +ENDCHAR +STARTCHAR U_545C +ENCODING 21596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +9440 +9580 +9400 +F7E0 +9020 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_545D +ENCODING 21597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0200 +EF80 +A880 +AF80 +A800 +EB80 +9100 +1200 +2440 +47C0 +ENDCHAR +STARTCHAR U_545E +ENCODING 21598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +1FC0 +0040 +EF40 +A040 +AF40 +A940 +EF40 +A040 +0040 +01C0 +ENDCHAR +STARTCHAR U_545F +ENCODING 21599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0200 +EFC0 +A200 +A480 +A880 +EF00 +A200 +8480 +0FC0 +0040 +ENDCHAR +STARTCHAR U_5460 +ENCODING 21600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +9380 +9540 +F920 +97C0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5461 +ENCODING 21601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +AFC0 +A900 +AFE0 +E900 +A900 +0AA0 +0C60 +0820 +ENDCHAR +STARTCHAR U_5462 +ENCODING 21602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +AFC0 +A800 +AA20 +EAC0 +AB00 +0A20 +1220 +61E0 +ENDCHAR +STARTCHAR U_5463 +ENCODING 21603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AA40 +A940 +BFE0 +A840 +AA40 +E940 +AFE0 +0040 +0180 +ENDCHAR +STARTCHAR U_5464 +ENCODING 21604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B220 +A100 +AFC0 +E040 +A480 +0300 +0100 +0080 +ENDCHAR +STARTCHAR U_5465 +ENCODING 21605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +9540 +97C0 +9540 +FFE0 +9440 +0440 +0440 +04C0 +ENDCHAR +STARTCHAR U_5466 +ENCODING 21606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A5E0 +AAA0 +AEA0 +A2A0 +A4A0 +EAA0 +1D20 +02A0 +0440 +ENDCHAR +STARTCHAR U_5467 +ENCODING 21607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F780 +9480 +9480 +97E0 +9480 +F480 +9480 +05A0 +0760 +04A0 +ENDCHAR +STARTCHAR U_5468 +ENCODING 21608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +2FA0 +2220 +3FE0 +2020 +2FA0 +28A0 +4FA0 +4020 +8060 +ENDCHAR +STARTCHAR U_5469 +ENCODING 21609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0F80 +E000 +BFC0 +A200 +AA80 +EA40 +AA40 +1240 +0200 +0600 +ENDCHAR +STARTCHAR U_546A +ENCODING 21610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +9280 +9280 +F280 +92A0 +04A0 +08E0 +ENDCHAR +STARTCHAR U_546B +ENCODING 21611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F1E0 +9100 +9100 +97C0 +9440 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_546C +ENCODING 21612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AAA0 +AAA0 +AAA0 +AAA0 +ECE0 +A820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_546D +ENCODING 21613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EA80 +AA80 +AA80 +BFE0 +AA80 +AA80 +EA80 +AB80 +0800 +0FE0 +ENDCHAR +STARTCHAR U_546E +ENCODING 21614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +07E0 +F420 +9420 +9420 +97E0 +9000 +F240 +0240 +0420 +0820 +ENDCHAR +STARTCHAR U_546F +ENCODING 21615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +A920 +A540 +A540 +AFE0 +E100 +A100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5470 +ENCODING 21616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5160 +5D80 +5120 +5D20 +E0E0 +1F80 +1080 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5471 +ENCODING 21617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +AA80 +AA80 +AA80 +AA80 +EA40 +AA40 +0AA0 +13A0 +26A0 +ENDCHAR +STARTCHAR U_5472 +ENCODING 21618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +A280 +ABA0 +AAC0 +AA80 +EA80 +AA80 +0BA0 +0CA0 +1060 +ENDCHAR +STARTCHAR U_5473 +ENCODING 21619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9FE0 +9100 +F380 +9540 +0920 +1120 +0100 +ENDCHAR +STARTCHAR U_5474 +ENCODING 21620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9820 +9020 +97A0 +94A0 +F4A0 +97A0 +0020 +0020 +00C0 +ENDCHAR +STARTCHAR U_5475 +ENCODING 21621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F040 +9040 +9740 +9540 +9540 +F740 +9540 +0040 +0040 +01C0 +ENDCHAR +STARTCHAR U_5476 +ENCODING 21622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5E0 +BEA0 +AAA0 +AAA0 +AAA0 +EAA0 +A440 +0AC0 +1120 +2220 +ENDCHAR +STARTCHAR U_5477 +ENCODING 21623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +A920 +AFE0 +A920 +A920 +EFE0 +A920 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5478 +ENCODING 21624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FE0 +F080 +9100 +9340 +9520 +9920 +9100 +F100 +0000 +1FE0 +ENDCHAR +STARTCHAR U_5479 +ENCODING 21625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0A00 +EFC0 +B200 +A200 +BFE0 +E200 +0500 +0480 +0840 +3020 +ENDCHAR +STARTCHAR U_547A +ENCODING 21626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9000 +9FE0 +F200 +97C0 +0040 +0040 +0180 +ENDCHAR +STARTCHAR U_547B +ENCODING 21627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +A920 +AFE0 +A920 +A920 +EFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_547C +ENCODING 21628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A120 +A920 +A540 +BFE0 +E100 +A100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_547D +ENCODING 21629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +EEE0 +0000 +7BC0 +4A40 +4A40 +7A40 +4AC0 +0200 +ENDCHAR +STARTCHAR U_547E +ENCODING 21630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +A840 +AFC0 +A840 +A840 +EFC0 +A840 +0000 +1FE0 +ENDCHAR +STARTCHAR U_547F +ENCODING 21631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +9FE0 +F100 +9200 +0440 +0FE0 +0420 +ENDCHAR +STARTCHAR U_5480 +ENCODING 21632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9440 +9440 +F7C0 +9440 +0440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_5481 +ENCODING 21633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F440 +9FE0 +9440 +9440 +97C0 +F440 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5482 +ENCODING 21634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +A880 +ABE0 +AAA0 +AAA0 +EAA0 +AAE0 +0880 +0880 +0FE0 +ENDCHAR +STARTCHAR U_5483 +ENCODING 21635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A4A0 +AAE0 +BBA0 +AEA0 +AAA0 +EAE0 +AA80 +0A20 +0BE0 +ENDCHAR +STARTCHAR U_5484 +ENCODING 21636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E540 +A540 +A540 +A7C0 +A100 +A920 +E920 +0920 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5485 +ENCODING 21637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +1080 +0900 +FFE0 +0000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5486 +ENCODING 21638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +E820 +B7A0 +A4A0 +A4A0 +A7A0 +E440 +A400 +0420 +03E0 +ENDCHAR +STARTCHAR U_5487 +ENCODING 21639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0140 +E440 +A480 +A480 +AD40 +B520 +E620 +0440 +0C40 +33C0 +ENDCHAR +STARTCHAR U_5488 +ENCODING 21640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A2A0 +AFE0 +AA80 +AA80 +EFE0 +A2A0 +04E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5489 +ENCODING 21641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +A920 +A920 +A920 +BFE0 +E100 +A280 +0440 +0820 +ENDCHAR +STARTCHAR U_548A +ENCODING 21642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F780 +9100 +9100 +9FE0 +9100 +9380 +F340 +9520 +0920 +0100 +ENDCHAR +STARTCHAR U_548B +ENCODING 21643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E400 +A7E0 +AA00 +B3C0 +A200 +E200 +A3C0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_548C +ENCODING 21644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +7000 +11E0 +FD20 +1120 +3920 +3520 +5520 +9120 +11E0 +1000 +ENDCHAR +STARTCHAR U_548D +ENCODING 21645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +9FE0 +9420 +9000 +97C0 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_548E +ENCODING 21646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D80 +4540 +A520 +1900 +27E0 +C000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_548F +ENCODING 21647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F000 +9700 +9120 +9F40 +9580 +F580 +9540 +0920 +1120 +0700 +ENDCHAR +STARTCHAR U_5490 +ENCODING 21648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +9440 +97E0 +9C40 +9540 +F4C0 +9440 +0440 +0440 +05C0 +ENDCHAR +STARTCHAR U_5491 +ENCODING 21649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5E0 +BE40 +A440 +A440 +A640 +EC40 +B440 +0440 +0440 +0CC0 +ENDCHAR +STARTCHAR U_5492 +ENCODING 21650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +9240 +F3C0 +0000 +1E00 +1200 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5493 +ENCODING 21651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +9200 +9380 +9280 +9480 +9680 +F580 +94A0 +05A0 +0EE0 +ENDCHAR +STARTCHAR U_5494 +ENCODING 21652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A200 +A200 +BFE0 +A200 +E300 +A280 +0240 +0200 +0200 +ENDCHAR +STARTCHAR U_5495 +ENCODING 21653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +9100 +97C0 +F440 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5496 +ENCODING 21654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FEE0 +AAA0 +AAA0 +AAA0 +AAA0 +EAA0 +AAA0 +12E0 +2600 +ENDCHAR +STARTCHAR U_5497 +ENCODING 21655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9200 +9200 +9200 +97C0 +F480 +9480 +0880 +17E0 +ENDCHAR +STARTCHAR U_5498 +ENCODING 21656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +A500 +A500 +AFC0 +B540 +E540 +A540 +05C0 +0100 +ENDCHAR +STARTCHAR U_5499 +ENCODING 21657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E440 +A400 +BFE0 +A500 +A540 +E580 +A900 +0B20 +1520 +21E0 +ENDCHAR +STARTCHAR U_549A +ENCODING 21658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A440 +AA80 +A100 +A280 +EC60 +B300 +0080 +0600 +0180 +ENDCHAR +STARTCHAR U_549B +ENCODING 21659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A000 +AFE0 +A100 +A100 +E100 +A100 +0100 +0700 +ENDCHAR +STARTCHAR U_549C +ENCODING 21660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +97E0 +9820 +9200 +9240 +9380 +F200 +9200 +0220 +01E0 +ENDCHAR +STARTCHAR U_549D +ENCODING 21661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E440 +A880 +A880 +B320 +BDC0 +A440 +E880 +1EE0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_549E +ENCODING 21662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +9240 +9240 +9240 +9FE0 +9240 +F240 +9240 +0240 +0440 +ENDCHAR +STARTCHAR U_549F +ENCODING 21663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +9080 +9100 +97E0 +9420 +9420 +F7E0 +9420 +0420 +07E0 +ENDCHAR +STARTCHAR U_54A0 +ENCODING 21664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +FFC0 +2100 +3F00 +2100 +3F00 +21C0 +FF00 +0100 +ENDCHAR +STARTCHAR U_54A1 +ENCODING 21665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +97C0 +9440 +9440 +97C0 +F440 +9460 +07C0 +0C40 +0040 +ENDCHAR +STARTCHAR U_54A2 +ENCODING 21666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3F80 +0000 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_54A3 +ENCODING 21667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F520 +9540 +9100 +9FE0 +9280 +F280 +9280 +04A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_54A4 +ENCODING 21668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +90C0 +9700 +9120 +F1C0 +9700 +0120 +0120 +00E0 +ENDCHAR +STARTCHAR U_54A5 +ENCODING 21669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9200 +9440 +9FE0 +9020 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_54A6 +ENCODING 21670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A120 +AFE0 +E900 +AFE0 +0120 +0680 +1860 +ENDCHAR +STARTCHAR U_54A7 +ENCODING 21671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F20 +E420 +A6A0 +AAA0 +B2A0 +AAA0 +EAA0 +A4A0 +0420 +0820 +10E0 +ENDCHAR +STARTCHAR U_54A8 +ENCODING 21672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1540 +2900 +C280 +4460 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_54A9 +ENCODING 21673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +9100 +97C0 +F100 +9100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54AA +ENCODING 21674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9540 +9FE0 +9100 +F380 +9540 +0920 +1120 +0100 +ENDCHAR +STARTCHAR U_54AB +ENCODING 21675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +4A20 +7BE0 +5000 +5140 +4A20 +4420 +8300 +80E0 +ENDCHAR +STARTCHAR U_54AC +ENCODING 21676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9440 +9AA0 +9280 +F280 +9100 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_54AD +ENCODING 21677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +9100 +97C0 +9000 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54AE +ENCODING 21678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A7C0 +A900 +A100 +AFE0 +E100 +A380 +0540 +0920 +1120 +ENDCHAR +STARTCHAR U_54AF +ENCODING 21679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9440 +9A80 +9100 +9280 +FFE0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54B0 +ENCODING 21680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +A7A0 +A4A0 +A7A0 +E4A0 +A7A0 +04A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_54B1 +ENCODING 21681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0100 +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +A840 +E840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_54B2 +ENCODING 21682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0240 +E280 +AFE0 +A100 +A100 +BFE0 +E100 +8280 +0440 +0820 +ENDCHAR +STARTCHAR U_54B3 +ENCODING 21683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A200 +A480 +AF00 +E240 +A480 +1980 +0240 +1C20 +ENDCHAR +STARTCHAR U_54B4 +ENCODING 21684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A200 +A280 +A4A0 +A5A0 +EAC0 +A880 +1180 +2240 +0C20 +ENDCHAR +STARTCHAR U_54B5 +ENCODING 21685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E500 +A880 +B740 +A020 +BFC0 +E400 +8780 +0080 +0300 +ENDCHAR +STARTCHAR U_54B6 +ENCODING 21686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9FE0 +9100 +9100 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54B7 +ENCODING 21687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +02A0 +EAC0 +A680 +A280 +A6C0 +AAA0 +E280 +A4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_54B8 +ENCODING 21688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4100 +5D40 +4140 +5D80 +5480 +5DA0 +4260 +8C20 +ENDCHAR +STARTCHAR U_54B9 +ENCODING 21689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +A200 +AFE0 +A280 +E680 +A180 +0240 +0C20 +ENDCHAR +STARTCHAR U_54BA +ENCODING 21690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F000 +97C0 +9440 +9440 +97C0 +9440 +F7C0 +0440 +0000 +1FE0 +ENDCHAR +STARTCHAR U_54BB +ENCODING 21691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A880 +AFE0 +A880 +B880 +A9C0 +EAA0 +ACA0 +0880 +0880 +ENDCHAR +STARTCHAR U_54BC +ENCODING 21692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +2480 +FFE0 +8020 +9F20 +9120 +9F20 +8060 +ENDCHAR +STARTCHAR U_54BD +ENCODING 21693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A920 +AFE0 +A920 +A920 +A9A0 +EA60 +AC20 +0FE0 +0820 +ENDCHAR +STARTCHAR U_54BE +ENCODING 21694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E120 +A7C0 +A140 +A180 +AFE0 +E240 +A680 +0B20 +1220 +01E0 +ENDCHAR +STARTCHAR U_54BF +ENCODING 21695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BC0 +E940 +A940 +AFE0 +B940 +A940 +ABC0 +E900 +A900 +0A00 +0C00 +ENDCHAR +STARTCHAR U_54C0 +ENCODING 21696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +1440 +3280 +D100 +1480 +3860 +ENDCHAR +STARTCHAR U_54C1 +ENCODING 21697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +3F00 +0000 +F3C0 +9240 +9240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_54C2 +ENCODING 21698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +AAA0 +AAA0 +EAE0 +AC20 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_54C3 +ENCODING 21699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +ABA0 +A820 +ABA0 +AAA0 +AAA0 +EBA0 +A820 +0820 +0860 +ENDCHAR +STARTCHAR U_54C4 +ENCODING 21700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +A280 +A280 +A280 +AFE0 +E000 +A480 +0840 +1020 +ENDCHAR +STARTCHAR U_54C5 +ENCODING 21701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +B520 +AAA0 +AAA0 +ADA0 +E8A0 +AFA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_54C6 +ENCODING 21702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E3C0 +AC40 +A280 +A300 +AD00 +E3E0 +AC40 +0280 +0300 +1C00 +ENDCHAR +STARTCHAR U_54C7 +ENCODING 21703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +9FE0 +9000 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_54C8 +ENCODING 21704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F280 +9440 +9FE0 +9000 +97C0 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54C9 +ENCODING 21705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2280 +FA40 +2200 +FFC0 +0200 +7A80 +4B00 +4A40 +7D40 +48C0 +ENDCHAR +STARTCHAR U_54CA +ENCODING 21706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E400 +AFC0 +B440 +A7C0 +A440 +E7C0 +A440 +0440 +04C0 +ENDCHAR +STARTCHAR U_54CB +ENCODING 21707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0A80 +EAA0 +BEE0 +ABA0 +AEA0 +AAA0 +AAA0 +EE00 +3A20 +03E0 +ENDCHAR +STARTCHAR U_54CC +ENCODING 21708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A800 +ABC0 +AA80 +AAA0 +EAC0 +AA80 +0A40 +1320 +2620 +ENDCHAR +STARTCHAR U_54CD +ENCODING 21709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +EFE0 +A820 +ABA0 +AAA0 +AAA0 +EBA0 +0820 +0820 +0860 +ENDCHAR +STARTCHAR U_54CE +ENCODING 21710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +A000 +A480 +A480 +A280 +E300 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_54CF +ENCODING 21711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +AA40 +EA20 +A940 +0880 +0A40 +0C20 +ENDCHAR +STARTCHAR U_54D0 +ENCODING 21712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABE0 +A880 +A880 +ABE0 +E880 +A880 +0BE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_54D1 +ENCODING 21713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +A280 +A280 +AAA0 +AAA0 +E6C0 +A280 +0280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_54D2 +ENCODING 21714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +93E0 +9080 +9C80 +9480 +F540 +9620 +0400 +0A00 +11E0 +ENDCHAR +STARTCHAR U_54D3 +ENCODING 21715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A240 +A280 +A120 +AEE0 +E000 +AFE0 +0280 +04A0 +1860 +ENDCHAR +STARTCHAR U_54D4 +ENCODING 21716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E8A0 +AEC0 +A8A0 +AAA0 +AD60 +E100 +AFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_54D5 +ENCODING 21717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +A920 +AFE0 +A200 +A3E0 +E620 +A940 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_54D6 +ENCODING 21718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A880 +A080 +A7E0 +A480 +E480 +AFE0 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_54D7 +ENCODING 21719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E520 +AD40 +B580 +A520 +A6E0 +E100 +BFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_54D8 +ENCODING 21720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +05E0 +E800 +B200 +A5E0 +AC40 +B440 +E440 +A440 +0440 +05C0 +ENDCHAR +STARTCHAR U_54D9 +ENCODING 21721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B020 +A780 +A000 +BFE0 +E200 +A480 +09C0 +1E40 +ENDCHAR +STARTCHAR U_54DA +ENCODING 21722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A480 +A860 +B100 +AFE0 +E100 +A380 +0540 +0920 +0100 +ENDCHAR +STARTCHAR U_54DB +ENCODING 21723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F5C0 +9600 +F420 +93C0 +0900 +1080 +2F40 +4920 +9500 +2200 +ENDCHAR +STARTCHAR U_54DC +ENCODING 21724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9480 +9300 +9280 +9C60 +F480 +9480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_54DD +ENCODING 21725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +AA20 +A200 +A520 +E540 +AC80 +1440 +0540 +0620 +ENDCHAR +STARTCHAR U_54DE +ENCODING 21726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +A840 +BFA0 +A500 +A7C0 +E900 +A100 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54DF +ENCODING 21727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A8E0 +AB20 +BD20 +A4A0 +AAA0 +FC20 +A020 +0620 +18C0 +ENDCHAR +STARTCHAR U_54E0 +ENCODING 21728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A7C0 +A900 +AFE0 +A000 +E7C0 +A440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54E1 +ENCODING 21729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +7F80 +4080 +7F80 +4080 +7F80 +4080 +7F80 +2100 +C0C0 +ENDCHAR +STARTCHAR U_54E2 +ENCODING 21730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A7C0 +A100 +AFE0 +A480 +EFE0 +A480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_54E3 +ENCODING 21731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0000 +F7C0 +9440 +9440 +97C0 +F000 +8440 +0240 +0280 +1FE0 +ENDCHAR +STARTCHAR U_54E4 +ENCODING 21732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C40 +EA80 +BF20 +A840 +AA80 +AB20 +EA40 +AA80 +1320 +2220 +41E0 +ENDCHAR +STARTCHAR U_54E5 +ENCODING 21733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0100 +7900 +4900 +7900 +FFC0 +0100 +7900 +4900 +7900 +0700 +ENDCHAR +STARTCHAR U_54E6 +ENCODING 21734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +FCA0 +A480 +BFE0 +A480 +A6A0 +ACC0 +B480 +E5A0 +1660 +0820 +ENDCHAR +STARTCHAR U_54E7 +ENCODING 21735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +A100 +AFE0 +A280 +AAC0 +EAA0 +12A0 +0480 +1980 +ENDCHAR +STARTCHAR U_54E8 +ENCODING 21736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9100 +97E0 +9420 +97E0 +F420 +97E0 +0420 +0420 +04E0 +ENDCHAR +STARTCHAR U_54E9 +ENCODING 21737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AFE0 +A100 +A100 +E7C0 +0100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_54EA +ENCODING 21738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EAA0 +AAA0 +BEC0 +AAA0 +BEA0 +EAA0 +AAA0 +0AE0 +1280 +2680 +ENDCHAR +STARTCHAR U_54EB +ENCODING 21739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9100 +9100 +F5C0 +9500 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_54EC +ENCODING 21740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0FE0 +E820 +BBA0 +AAA0 +AAA0 +EAA0 +ABA0 +0820 +0820 +08E0 +ENDCHAR +STARTCHAR U_54ED +ENCODING 21741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0500 +0480 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_54EE +ENCODING 21742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +EFC0 +A280 +BFE0 +A200 +A7C0 +E880 +B7E0 +2080 +0080 +0380 +ENDCHAR +STARTCHAR U_54EF +ENCODING 21743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9440 +F7C0 +9280 +02A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_54F0 +ENCODING 21744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +B220 +AA00 +AFC0 +B200 +E200 +9FE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_54F1 +ENCODING 21745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A820 +A7C0 +E080 +AFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_54F2 +ENCODING 21746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC00 +27E0 +F480 +2480 +6880 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_54F3 +ENCODING 21747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +E500 +BF00 +A5E0 +A540 +A740 +ED40 +B540 +0540 +0540 +1E40 +ENDCHAR +STARTCHAR U_54F4 +ENCODING 21748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FC0 +E840 +AFC0 +A840 +AFC0 +AA00 +E940 +0980 +0A80 +0C60 +ENDCHAR +STARTCHAR U_54F5 +ENCODING 21749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1220 +FEA0 +A8A0 +A8A0 +BEA0 +EAA0 +8AA0 +0A20 +1220 +26E0 +ENDCHAR +STARTCHAR U_54F6 +ENCODING 21750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +ECE0 +A480 +A480 +AFC0 +A200 +A200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_54F7 +ENCODING 21751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +0FA0 +EA20 +A540 +A040 +AFE0 +A040 +E240 +A140 +0040 +01C0 +ENDCHAR +STARTCHAR U_54F8 +ENCODING 21752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +A220 +A940 +A400 +A200 +BFE0 +E480 +0300 +0280 +1C60 +ENDCHAR +STARTCHAR U_54F9 +ENCODING 21753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0F00 +EA20 +A540 +AFC0 +A080 +E100 +BFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_54FA +ENCODING 21754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +E140 +BFE0 +A100 +AFE0 +A920 +EFE0 +A920 +0FE0 +0920 +0960 +ENDCHAR +STARTCHAR U_54FB +ENCODING 21755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +A7C0 +A000 +E7C0 +A100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54FC +ENCODING 21756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F000 +97C0 +9440 +97C0 +F000 +97C0 +0080 +0100 +0300 +ENDCHAR +STARTCHAR U_54FD +ENCODING 21757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +AFE0 +A920 +EFE0 +A500 +0200 +0500 +18E0 +ENDCHAR +STARTCHAR U_54FE +ENCODING 21758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0500 +EFC0 +A840 +A840 +AFC0 +E500 +A500 +0500 +0920 +10E0 +ENDCHAR +STARTCHAR U_54FF +ENCODING 21759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1520 +25E0 +4800 +FFE0 +0040 +1E40 +1240 +1E40 +01C0 +ENDCHAR +STARTCHAR U_5500 +ENCODING 21760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0E00 +E200 +BFE0 +A700 +AA80 +F760 +A500 +05C0 +0840 +1180 +ENDCHAR +STARTCHAR U_5501 +ENCODING 21761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A000 +A7C0 +A000 +A7C0 +E000 +A7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5502 +ENCODING 21762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +EA40 +B240 +A500 +A880 +BFE0 +E880 +0880 +0F80 +0880 +ENDCHAR +STARTCHAR U_5503 +ENCODING 21763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03C0 +E480 +AFE0 +A920 +AFE0 +E920 +AFE0 +0920 +0920 +1060 +ENDCHAR +STARTCHAR U_5504 +ENCODING 21764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +97E0 +9420 +97E0 +F420 +97E0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_5505 +ENCODING 21765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A440 +A920 +B7C0 +A040 +E080 +A7C0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_5506 +ENCODING 21766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E440 +AFE0 +A440 +AA20 +B3C0 +E640 +AA80 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_5507 +ENCODING 21767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +4000 +7FE0 +5240 +5980 +5060 +9FC0 +9040 +1FC0 +ENDCHAR +STARTCHAR U_5508 +ENCODING 21768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A000 +AFE0 +A920 +E920 +AFE0 +0800 +0820 +07E0 +ENDCHAR +STARTCHAR U_5509 +ENCODING 21769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0440 +F7A0 +9400 +97C0 +9900 +9100 +FFE0 +8280 +0440 +1820 +ENDCHAR +STARTCHAR U_550A +ENCODING 21770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A540 +A540 +ABA0 +E920 +A300 +0480 +0840 +1020 +ENDCHAR +STARTCHAR U_550B +ENCODING 21771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B7A0 +A100 +A100 +AFE0 +E100 +0940 +0920 +1320 +ENDCHAR +STARTCHAR U_550C +ENCODING 21772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FDC0 +A440 +A840 +BD60 +A540 +E540 +B540 +09E0 +1400 +23E0 +ENDCHAR +STARTCHAR U_550D +ENCODING 21773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +A380 +A000 +EFE0 +A280 +0280 +04A0 +0860 +ENDCHAR +STARTCHAR U_550E +ENCODING 21774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FCA0 +A4A0 +BFA0 +A4A0 +A6A0 +E5A0 +ACA0 +1420 +0420 +04E0 +ENDCHAR +STARTCHAR U_550F +ENCODING 21775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0CC0 +E300 +ACC0 +A200 +BFE0 +A500 +EFE0 +B520 +0520 +0560 +0100 +ENDCHAR +STARTCHAR U_5510 +ENCODING 21776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4240 +7FE0 +4240 +5FC0 +4200 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_5511 +ENCODING 21777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E540 +A540 +A540 +ABA0 +B100 +A100 +E7C0 +0100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5512 +ENCODING 21778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +AAA0 +AAA0 +ACE0 +E820 +AFE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5513 +ENCODING 21779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E100 +AFE0 +A920 +AFE0 +A920 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5514 +ENCODING 21780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9240 +9FE0 +9000 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5515 +ENCODING 21781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +F7C0 +9440 +97C0 +9440 +97C0 +F100 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5516 +ENCODING 21782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +AAA0 +AAA0 +AAA0 +AAA0 +EFE0 +A280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_5517 +ENCODING 21783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9FE0 +9100 +F500 +95C0 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5518 +ENCODING 21784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2220 +3D40 +6480 +BD60 +0220 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5519 +ENCODING 21785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EA80 +A4A0 +AEA0 +B5C0 +A480 +AC80 +F540 +8540 +1620 +0A20 +ENDCHAR +STARTCHAR U_551A +ENCODING 21786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +AFC0 +A040 +BFE0 +B020 +AFC0 +E480 +0300 +0480 +1860 +ENDCHAR +STARTCHAR U_551B +ENCODING 21787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +A200 +E7C0 +AA40 +0180 +0E60 +ENDCHAR +STARTCHAR U_551C +ENCODING 21788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +1500 +E4E0 +0200 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_551D +ENCODING 21789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0100 +F100 +9FE0 +9000 +97C0 +F540 +9540 +0100 +0280 +0C40 +ENDCHAR +STARTCHAR U_551E +ENCODING 21790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0540 +E4C0 +BE40 +A540 +A6C0 +AC60 +F7C0 +8440 +1440 +0840 +ENDCHAR +STARTCHAR U_551F +ENCODING 21791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1080 +7FC0 +0000 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_5520 +ENCODING 21792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +A820 +A200 +AFC0 +E240 +0240 +0440 +0980 +ENDCHAR +STARTCHAR U_5521 +ENCODING 21793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AAA0 +AAA0 +EDA0 +A960 +8A20 +0820 +08E0 +ENDCHAR +STARTCHAR U_5522 +ENCODING 21794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9100 +97E0 +9420 +9520 +F520 +9520 +0520 +0240 +0C20 +ENDCHAR +STARTCHAR U_5523 +ENCODING 21795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +A220 +E3C0 +1E00 +0220 +01E0 +ENDCHAR +STARTCHAR U_5524 +ENCODING 21796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03C0 +F480 +9FC0 +9540 +9540 +F540 +9FE0 +0100 +0280 +0C60 +ENDCHAR +STARTCHAR U_5525 +ENCODING 21797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +EA80 +A440 +A120 +A7C0 +A840 +F280 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_5526 +ENCODING 21798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E900 +A140 +B520 +AD20 +A540 +A940 +F880 +A900 +0200 +0C00 +ENDCHAR +STARTCHAR U_5527 +ENCODING 21799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEA0 +AAA0 +AAA0 +AEA0 +A8A0 +EAE0 +0E80 +0A80 +0080 +ENDCHAR +STARTCHAR U_5528 +ENCODING 21800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +EAE0 +AAA0 +ACA0 +ACE0 +AAA0 +AAA0 +EEE0 +08A0 +09E0 +0800 +ENDCHAR +STARTCHAR U_5529 +ENCODING 21801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F00 +E100 +BFE0 +A380 +BD60 +A200 +BFE0 +E480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_552A +ENCODING 21802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AFC0 +A400 +BFE0 +EA80 +1740 +2220 +0F80 +0200 +ENDCHAR +STARTCHAR U_552B +ENCODING 21803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0500 +E880 +B060 +AF80 +A200 +AF80 +E200 +0A80 +0700 +1FC0 +ENDCHAR +STARTCHAR U_552C +ENCODING 21804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +ABC0 +AE20 +E9E0 +AB80 +0A80 +12A0 +2CE0 +ENDCHAR +STARTCHAR U_552D +ENCODING 21805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A440 +A7C0 +A440 +A7C0 +E440 +BFE0 +0000 +0440 +1820 +ENDCHAR +STARTCHAR U_552E +ENCODING 21806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +7FC0 +A200 +3FC0 +2200 +3FE0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_552F +ENCODING 21807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +97E0 +9C80 +97E0 +9480 +F7E0 +9480 +0480 +07E0 +0400 +ENDCHAR +STARTCHAR U_5530 +ENCODING 21808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FA0 +08A0 +EFA0 +AA20 +AA20 +AFA0 +EAA0 +0AA0 +1BA0 +1220 +2260 +ENDCHAR +STARTCHAR U_5531 +ENCODING 21809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +FFE0 +0820 +0FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5532 +ENCODING 21810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F6E0 +9420 +96E0 +9420 +9420 +F7E0 +9280 +02A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5533 +ENCODING 21811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +AFE0 +A940 +A920 +EFE0 +0900 +1280 +2440 +4820 +ENDCHAR +STARTCHAR U_5534 +ENCODING 21812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +97C0 +9100 +FFE0 +9280 +02A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5535 +ENCODING 21813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A500 +AA80 +BFC0 +AAA0 +EF80 +AA80 +0FA0 +0220 +01E0 +ENDCHAR +STARTCHAR U_5536 +ENCODING 21814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9280 +9FE0 +9000 +97C0 +F440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5537 +ENCODING 21815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9FE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5538 +ENCODING 21816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E500 +AA80 +B160 +AF80 +A100 +E600 +A240 +1520 +1460 +23C0 +ENDCHAR +STARTCHAR U_5539 +ENCODING 21817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E480 +BE80 +A940 +AE20 +AA80 +EA40 +AA00 +0A80 +1240 +2420 +ENDCHAR +STARTCHAR U_553A +ENCODING 21818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0280 +EFE0 +AAA0 +AFE0 +AAA0 +AAA0 +FFE0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_553B +ENCODING 21819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +9540 +9540 +9BA0 +9100 +F380 +0540 +0920 +1120 +ENDCHAR +STARTCHAR U_553C +ENCODING 21820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +AFE0 +A200 +FFE0 +A240 +0480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_553D +ENCODING 21821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0460 +E580 +BF00 +A5E0 +AF40 +AD40 +ED40 +1540 +2540 +0640 +ENDCHAR +STARTCHAR U_553E +ENCODING 21822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9FE0 +9540 +9FE0 +F540 +9540 +0FE0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_553F +ENCODING 21823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +92A0 +9520 +92C0 +F400 +9340 +0AA0 +0A60 +11C0 +ENDCHAR +STARTCHAR U_5540 +ENCODING 21824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +A880 +ABE0 +A880 +ABE0 +E880 +ABE0 +0880 +1080 +27E0 +ENDCHAR +STARTCHAR U_5541 +ENCODING 21825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +ABA0 +A920 +AFE0 +A820 +EBA0 +0AA0 +0BA0 +1020 +2060 +ENDCHAR +STARTCHAR U_5542 +ENCODING 21826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0680 +F880 +AA80 +B480 +A080 +AE80 +A480 +E680 +BCA0 +04A0 +0C60 +ENDCHAR +STARTCHAR U_5543 +ENCODING 21827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F5E0 +9500 +9FE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5544 +ENCODING 21828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9200 +9520 +9B40 +9580 +FD40 +9340 +0520 +0920 +1300 +ENDCHAR +STARTCHAR U_5545 +ENCODING 21829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F100 +97C0 +9440 +97C0 +9440 +F7C0 +9100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5546 +ENCODING 21830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +4A40 +5140 +7FC0 +5140 +5F40 +5140 +40C0 +ENDCHAR +STARTCHAR U_5547 +ENCODING 21831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +7FC0 +4840 +7F40 +4840 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_5548 +ENCODING 21832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9FE0 +9440 +9280 +97C0 +F100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5549 +ENCODING 21833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BFE0 +A480 +A480 +AEC0 +ADA0 +F6A0 +0480 +0480 +0480 +ENDCHAR +STARTCHAR U_554A +ENCODING 21834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E820 +A820 +B3A0 +AAA0 +AAA0 +EBA0 +B820 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U_554B +ENCODING 21835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF20 +A920 +A4C0 +A100 +AFE0 +A100 +E380 +0540 +1920 +0100 +ENDCHAR +STARTCHAR U_554C +ENCODING 21836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +B280 +A440 +A820 +E7C0 +8100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_554D +ENCODING 21837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A7C0 +A000 +AFC0 +E080 +AFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_554E +ENCODING 21838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +A7C0 +2140 +2140 +FFE0 +2000 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_554F +ENCODING 21839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +9120 +9120 +9F20 +8060 +ENDCHAR +STARTCHAR U_5550 +ENCODING 21840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +9440 +9AA0 +9100 +FFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5551 +ENCODING 21841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFC0 +A140 +BFE0 +A140 +AFC0 +E900 +09E0 +1500 +23E0 +ENDCHAR +STARTCHAR U_5552 +ENCODING 21842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A880 +AAA0 +AAA0 +ABE0 +E880 +0CA0 +14A0 +27E0 +ENDCHAR +STARTCHAR U_5553 +ENCODING 21843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4A40 +7D40 +4080 +4140 +4220 +BFC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5554 +ENCODING 21844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D00 +47E0 +7D20 +41C0 +4720 +80E0 +3FA0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5555 +ENCODING 21845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B420 +A7A0 +AA20 +BFE0 +E220 +AAA0 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5556 +ENCODING 21846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +F540 +9580 +9A80 +9540 +9920 +F540 +0580 +0A80 +0440 +1820 +ENDCHAR +STARTCHAR U_5557 +ENCODING 21847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A440 +AA80 +BCE0 +A820 +E820 +AEE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5558 +ENCODING 21848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A5C0 +AF40 +AB40 +B740 +E5C0 +8500 +0920 +10E0 +ENDCHAR +STARTCHAR U_5559 +ENCODING 21849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5B80 +5200 +5220 +F9E0 +0000 +7BC0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_555A +ENCODING 21850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0400 +FFE0 +0400 +7FC0 +4040 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_555B +ENCODING 21851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A200 +AFC0 +A240 +BFE0 +E240 +9FE0 +0480 +0300 +0CC0 +ENDCHAR +STARTCHAR U_555C +ENCODING 21852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +E220 +ACC0 +A440 +AAA0 +B100 +BEE0 +AAA0 +E440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_555D +ENCODING 21853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +E5E0 +A520 +BF20 +A520 +AF20 +AD20 +F520 +15E0 +2400 +0400 +ENDCHAR +STARTCHAR U_555E +ENCODING 21854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AEE0 +A820 +A820 +AEE0 +E280 +0280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_555F +ENCODING 21855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +45E0 +7D40 +4340 +5D40 +5540 +5480 +9480 +9D40 +8220 +ENDCHAR +STARTCHAR U_5560 +ENCODING 21856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18E0 +6300 +4200 +7BE0 +5240 +5240 +9440 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5561 +ENCODING 21857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +9280 +9EE0 +9280 +F280 +8EE0 +0280 +0280 +ENDCHAR +STARTCHAR U_5562 +ENCODING 21858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A100 +AFE0 +A920 +ADA0 +AB60 +EDA0 +A920 +0920 +0960 +ENDCHAR +STARTCHAR U_5563 +ENCODING 21859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EEE0 +B4A0 +A4A0 +BEA0 +A4A0 +E6A0 +14A0 +16E0 +1880 +0080 +ENDCHAR +STARTCHAR U_5564 +ENCODING 21860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A920 +AFE0 +A920 +AFE0 +E280 +A480 +1FE0 +0080 +0080 +ENDCHAR +STARTCHAR U_5565 +ENCODING 21861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9BA0 +9100 +9FE0 +9100 +F7C0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_5566 +ENCODING 21862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E480 +BFE0 +A400 +A640 +A540 +ED40 +B540 +0480 +07E0 +1C00 +ENDCHAR +STARTCHAR U_5567 +ENCODING 21863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +E440 +A540 +0540 +0280 +1C60 +ENDCHAR +STARTCHAR U_5568 +ENCODING 21864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +AF80 +A200 +BFE0 +A880 +EF80 +0880 +0F80 +0880 +ENDCHAR +STARTCHAR U_5569 +ENCODING 21865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +A480 +BE80 +A0C0 +A4A0 +AE80 +E480 +0680 +1880 +0080 +ENDCHAR +STARTCHAR U_556A +ENCODING 21866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E480 +BFE0 +A520 +A520 +A720 +EDE0 +B520 +0520 +0520 +1DE0 +ENDCHAR +STARTCHAR U_556B +ENCODING 21867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFA0 +A240 +BFE0 +A200 +A7C0 +EC40 +9440 +27C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_556C +ENCODING 21868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +4900 +2A00 +FFC0 +0000 +7F80 +5280 +5E80 +4080 +7F80 +ENDCHAR +STARTCHAR U_556D +ENCODING 21869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E440 +BFE0 +A840 +B5E0 +BE80 +E4E0 +A620 +1D40 +0480 +0440 +ENDCHAR +STARTCHAR U_556E +ENCODING 21870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E5E0 +A500 +BFE0 +A100 +A920 +A920 +EAA0 +0C60 +0820 +0FE0 +ENDCHAR +STARTCHAR U_556F +ENCODING 21871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A920 +AFE0 +A9A0 +A960 +EFE0 +0820 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5570 +ENCODING 21872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AAA0 +AFE0 +A200 +A7C0 +E440 +8B40 +1080 +0100 +0E00 +ENDCHAR +STARTCHAR U_5571 +ENCODING 21873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +E920 +AFE0 +A000 +BFE0 +A200 +E7E0 +AC20 +1420 +27E0 +ENDCHAR +STARTCHAR U_5572 +ENCODING 21874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0440 +E880 +AEE0 +AB20 +AA20 +AEA0 +AA60 +EA20 +AA20 +0E60 +ENDCHAR +STARTCHAR U_5573 +ENCODING 21875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0540 +EFE0 +A100 +AFE0 +A280 +A7C0 +ECA0 +9580 +2420 +03E0 +ENDCHAR +STARTCHAR U_5574 +ENCODING 21876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A920 +AFE0 +A920 +AFE0 +A100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5575 +ENCODING 21877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E7E0 +A2A0 +B280 +ABE0 +A220 +A720 +BAC0 +EA80 +0D40 +0A20 +ENDCHAR +STARTCHAR U_5576 +ENCODING 21878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9820 +97C0 +9100 +9100 +F5C0 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5577 +ENCODING 21879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +EEA0 +AAA0 +AEA0 +AAC0 +AEA0 +E8A0 +AAA0 +0DE0 +0880 +0080 +ENDCHAR +STARTCHAR U_5578 +ENCODING 21880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +A140 +BFE0 +A140 +AFC0 +E920 +ABA0 +0D60 +1120 +2120 +ENDCHAR +STARTCHAR U_5579 +ENCODING 21881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A900 +A900 +AFE0 +E900 +AFC0 +1440 +1440 +27C0 +ENDCHAR +STARTCHAR U_557A +ENCODING 21882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A780 +A480 +BFE0 +A400 +EFC0 +1540 +0A40 +1540 +0880 +ENDCHAR +STARTCHAR U_557B +ENCODING 21883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +8420 +3F80 +2480 +0400 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_557C +ENCODING 21884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +AFE0 +A920 +A7C0 +E540 +0540 +05C0 +0100 +ENDCHAR +STARTCHAR U_557D +ENCODING 21885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +97C0 +9820 +97C0 +9440 +F7C0 +9280 +1FE0 +0280 +0C80 +ENDCHAR +STARTCHAR U_557E +ENCODING 21886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F880 +AAA0 +BEC0 +AA80 +AC80 +EA80 +1880 +2940 +0A20 +0C20 +ENDCHAR +STARTCHAR U_557F +ENCODING 21887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +9440 +97C0 +9440 +97C0 +F440 +9FE0 +0A80 +0C40 +0FE0 +ENDCHAR +STARTCHAR U_5580 +ENCODING 21888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A7C0 +AC40 +A380 +A440 +EFE0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5581 +ENCODING 21889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +97C0 +9100 +FFE0 +9960 +0FA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5582 +ENCODING 21890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +97C0 +9000 +FFE0 +9540 +0480 +0540 +0E20 +ENDCHAR +STARTCHAR U_5583 +ENCODING 21891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +AAA0 +A920 +AFE0 +E920 +0FE0 +0920 +0860 +ENDCHAR +STARTCHAR U_5584 +ENCODING 21892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5585 +ENCODING 21893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9100 +9FE0 +F440 +9240 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5586 +ENCODING 21894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2080 +2080 +FBE0 +0000 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_5587 +ENCODING 21895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FF20 +A4A0 +BFA0 +B5A0 +B5A0 +FFA0 +A4A0 +0E20 +1520 +2460 +ENDCHAR +STARTCHAR U_5588 +ENCODING 21896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E8A0 +AEC0 +A8A0 +AEE0 +BA00 +E7C0 +A440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5589 +ENCODING 21897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BC0 +E840 +AFE0 +BA00 +ABE0 +AC80 +E880 +AFE0 +0880 +0940 +0A20 +ENDCHAR +STARTCHAR U_558A +ENCODING 21898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E0A0 +AFE0 +A880 +AEA0 +A8A0 +EEC0 +AA80 +0EA0 +1160 +2220 +ENDCHAR +STARTCHAR U_558B +ENCODING 21899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +9540 +95C0 +9400 +97E0 +F100 +9FE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_558C +ENCODING 21900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7BE0 +0000 +1220 +5B20 +56A0 +9220 +2220 +4220 +ENDCHAR +STARTCHAR U_558D +ENCODING 21901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EAC0 +AB80 +AAA0 +ABA0 +BC60 +E100 +AFE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_558E +ENCODING 21902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A740 +A540 +AFE0 +A820 +EBA0 +AAA0 +0BA0 +0820 +0860 +ENDCHAR +STARTCHAR U_558F +ENCODING 21903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A200 +BFE0 +A400 +E7C0 +AC40 +1440 +27C0 +0440 +ENDCHAR +STARTCHAR U_5590 +ENCODING 21904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E4E0 +BFA0 +A8A0 +AEC0 +BAA0 +EEA0 +8AA0 +0EC0 +0A80 +0A80 +ENDCHAR +STARTCHAR U_5591 +ENCODING 21905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +9FE0 +9000 +F7C0 +9440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5592 +ENCODING 21906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EF80 +AAC0 +BAA0 +A500 +A8E0 +F7C0 +A440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5593 +ENCODING 21907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A200 +EFE0 +A440 +0380 +0140 +0E20 +ENDCHAR +STARTCHAR U_5594 +ENCODING 21908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A800 +AFE0 +AA40 +EFE0 +A900 +0FC0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_5595 +ENCODING 21909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A200 +AFE0 +AAA0 +ABA0 +AAA0 +EBA0 +AAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5596 +ENCODING 21910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BE80 +A5E0 +AC80 +AE80 +F5E0 +A520 +0520 +05E0 +0520 +ENDCHAR +STARTCHAR U_5597 +ENCODING 21911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +B7C0 +A100 +A7C0 +E7C0 +8540 +07C0 +0100 +1FE0 +0100 +ENDCHAR +STARTCHAR U_5598 +ENCODING 21912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +AFE0 +A000 +AFE0 +A200 +EFE0 +AAA0 +0AA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_5599 +ENCODING 21913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +E880 +BFE0 +A200 +AD20 +A340 +ED80 +0340 +1D20 +0300 +ENDCHAR +STARTCHAR U_559A +ENCODING 21914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A900 +BFC0 +AB40 +ACC0 +EA40 +1FE0 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_559B +ENCODING 21915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1E40 +EA80 +BFC0 +A400 +BFE0 +A400 +E7C0 +8A80 +1100 +26E0 +ENDCHAR +STARTCHAR U_559C +ENCODING 21916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +1100 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_559D +ENCODING 21917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A400 +EFE0 +1920 +0AA0 +0F20 +00C0 +ENDCHAR +STARTCHAR U_559E +ENCODING 21918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EEE0 +AAA0 +AEA0 +AAA0 +AEA0 +E8A0 +AEA0 +08C0 +0A80 +0680 +ENDCHAR +STARTCHAR U_559F +ENCODING 21919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AFE0 +A440 +E7C0 +A440 +07C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_55A0 +ENCODING 21920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +AA40 +AFC0 +AA40 +EFC0 +8200 +0FC0 +0200 +1FE0 +ENDCHAR +STARTCHAR U_55A1 +ENCODING 21921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +9240 +9FE0 +9440 +97C0 +F080 +9FE0 +9480 +0FE0 +0080 +ENDCHAR +STARTCHAR U_55A2 +ENCODING 21922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E700 +A100 +AFE0 +A100 +ADE0 +A920 +ED60 +0920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_55A3 +ENCODING 21923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9420 +9BA0 +92A0 +93A0 +F020 +00C0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_55A4 +ENCODING 21924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +97C0 +9440 +9FE0 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_55A5 +ENCODING 21925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +AA40 +ABC0 +E800 +AFE0 +0A40 +1180 +2660 +ENDCHAR +STARTCHAR U_55A6 +ENCODING 21926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +0000 +F1E0 +9520 +F5E0 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_55A7 +ENCODING 21927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +AFE0 +A000 +A7C0 +A440 +E7C0 +A440 +0440 +0FE0 +ENDCHAR +STARTCHAR U_55A8 +ENCODING 21928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +97C0 +9000 +9FE0 +F820 +9380 +02A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_55A9 +ENCODING 21929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E500 +A880 +B760 +A000 +BD40 +F540 +9E80 +1680 +1D40 +1540 +ENDCHAR +STARTCHAR U_55AA +ENCODING 21930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +5540 +75C0 +0400 +FFE0 +2140 +2880 +3060 +ENDCHAR +STARTCHAR U_55AB +ENCODING 21931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +FEA0 +A4A0 +BEA0 +A520 +BEC0 +E200 +BFE0 +0200 +0D80 +3060 +ENDCHAR +STARTCHAR U_55AC +ENCODING 21932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0800 +FFE0 +2080 +DF60 +1100 +7FC0 +4040 +4F40 +4940 +4FC0 +ENDCHAR +STARTCHAR U_55AD +ENCODING 21933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +AFE0 +A880 +A900 +EE40 +A980 +0E60 +1080 +2F00 +ENDCHAR +STARTCHAR U_55AE +ENCODING 21934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +9240 +FFC0 +4480 +7F80 +4480 +7F80 +0400 +FFC0 +0400 +ENDCHAR +STARTCHAR U_55AF +ENCODING 21935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FC0 +E480 +BA60 +AFC0 +A200 +EA80 +BFE0 +0880 +0880 +3080 +ENDCHAR +STARTCHAR U_55B0 +ENCODING 21936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0280 +F540 +9FE0 +9440 +97C0 +F440 +87C0 +0560 +0480 +0660 +ENDCHAR +STARTCHAR U_55B1 +ENCODING 21937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABE0 +AAA0 +ABE0 +AAA0 +EBE0 +A880 +0BE0 +1080 +27E0 +ENDCHAR +STARTCHAR U_55B2 +ENCODING 21938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A8E0 +BB20 +A420 +AB20 +BEA0 +E0A0 +0A20 +1520 +15C0 +ENDCHAR +STARTCHAR U_55B3 +ENCODING 21939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +9920 +97C0 +9440 +F7C0 +9440 +07C0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_55B4 +ENCODING 21940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EAC0 +AB80 +AAA0 +BFE0 +A100 +E100 +AFE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_55B5 +ENCODING 21941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9FE0 +9280 +97E0 +9520 +F520 +97E0 +0520 +07E0 +0420 +ENDCHAR +STARTCHAR U_55B6 +ENCODING 21942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4880 +2500 +FFC0 +8040 +BF40 +2100 +3F00 +0000 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_55B7 +ENCODING 21943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +AFE0 +A440 +AFE0 +E820 +A920 +0920 +0280 +0C60 +ENDCHAR +STARTCHAR U_55B8 +ENCODING 21944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4440 +7FC0 +4440 +7FC0 +4440 +0280 +7B00 +4A40 +79C0 +ENDCHAR +STARTCHAR U_55B9 +ENCODING 21945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9540 +9FE0 +9100 +FFE0 +9100 +07C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_55BA +ENCODING 21946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04C0 +E700 +A900 +AA40 +BBC0 +A920 +EBC0 +A880 +0AC0 +0CA0 +0920 +ENDCHAR +STARTCHAR U_55BB +ENCODING 21947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +BB60 +A000 +AE20 +AAA0 +EEA0 +AAA0 +0EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_55BC +ENCODING 21948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0900 +F7C0 +9040 +97C0 +9040 +F7C0 +8200 +0D40 +1460 +03C0 +ENDCHAR +STARTCHAR U_55BD +ENCODING 21949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9FE0 +9380 +9540 +9920 +FFE0 +9240 +0680 +0140 +0E20 +ENDCHAR +STARTCHAR U_55BE +ENCODING 21950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4880 +2500 +FFC0 +A440 +3F00 +4400 +FFC0 +0000 +3F00 +2100 +3F00 +ENDCHAR +STARTCHAR U_55BF +ENCODING 21951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +FFE0 +8A20 +FBE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_55C0 +ENCODING 21952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FE60 +8400 +7BC0 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_55C1 +ENCODING 21953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E900 +A9C0 +A900 +ABE0 +AAA0 +EBC0 +AA80 +15C0 +1540 +2A60 +ENDCHAR +STARTCHAR U_55C2 +ENCODING 21954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +0C40 +EA40 +A580 +A200 +A7C0 +A900 +EFE0 +A100 +0920 +0FE0 +ENDCHAR +STARTCHAR U_55C3 +ENCODING 21955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A7C0 +A000 +AFE0 +E820 +ABA0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_55C4 +ENCODING 21956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E200 +A7C0 +A440 +A740 +A5C0 +E440 +AFE0 +1480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_55C5 +ENCODING 21957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +F440 +9740 +95C0 +9440 +97C0 +F140 +9FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55C6 +ENCODING 21958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E680 +A940 +BFA0 +A880 +AF80 +E880 +AFC0 +0C40 +17C0 +2440 +ENDCHAR +STARTCHAR U_55C7 +ENCODING 21959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +FFE0 +0000 +3FC0 +2940 +2F40 +2040 +3FC0 +ENDCHAR +STARTCHAR U_55C8 +ENCODING 21960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FA80 +9540 +97C0 +9440 +9FC0 +FA40 +9A40 +0FC0 +0820 +07E0 +ENDCHAR +STARTCHAR U_55C9 +ENCODING 21961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9100 +9FE0 +9240 +FF80 +9440 +0FA0 +0540 +1B20 +ENDCHAR +STARTCHAR U_55CA +ENCODING 21962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9FE0 +9440 +97C0 +9440 +F7C0 +9440 +07C0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55CB +ENCODING 21963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +A440 +BFE0 +AAA0 +BFC0 +E840 +AFC0 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_55CC +ENCODING 21964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +E480 +BFE0 +A280 +A440 +A820 +BFE0 +EAA0 +AAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55CD +ENCODING 21965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +E520 +BF20 +A520 +B5E0 +B520 +FF20 +A5E0 +0520 +0A20 +14E0 +ENDCHAR +STARTCHAR U_55CE +ENCODING 21966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E900 +AFC0 +A900 +AFC0 +A900 +EFE0 +A020 +0D20 +0AA0 +12C0 +ENDCHAR +STARTCHAR U_55CF +ENCODING 21967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +9300 +9480 +9960 +F100 +9FE0 +0580 +0940 +1320 +ENDCHAR +STARTCHAR U_55D0 +ENCODING 21968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +A7C0 +A100 +A7C0 +E100 +1FE0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_55D1 +ENCODING 21969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +AFE0 +A440 +AFA0 +A000 +EFE0 +AAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55D2 +ENCODING 21970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +9380 +9440 +9BA0 +F000 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_55D3 +ENCODING 21971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +A300 +BFE0 +AAA0 +A440 +EBA0 +0100 +1FE0 +0540 +0920 +ENDCHAR +STARTCHAR U_55D4 +ENCODING 21972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +97C0 +9440 +9740 +F5C0 +9440 +0FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55D5 +ENCODING 21973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABC0 +A800 +AFE0 +AAA0 +EB40 +AA60 +0FE0 +1440 +22C0 +ENDCHAR +STARTCHAR U_55D6 +ENCODING 21974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +ED60 +A920 +AF60 +A920 +AFE0 +E100 +AFE0 +0440 +0380 +1C60 +ENDCHAR +STARTCHAR U_55D7 +ENCODING 21975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A740 +A540 +AFE0 +F460 +87C0 +0440 +07C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_55D8 +ENCODING 21976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0F00 +F520 +92C0 +97C0 +9280 +F7C0 +9100 +8FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_55D9 +ENCODING 21977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +9FE0 +9920 +FFE0 +9200 +03C0 +0440 +1980 +ENDCHAR +STARTCHAR U_55DA +ENCODING 21978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A800 +AFE0 +E800 +AFE0 +0020 +0AA0 +1540 +ENDCHAR +STARTCHAR U_55DB +ENCODING 21979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +A500 +AFC0 +A540 +BFE0 +E540 +AFC0 +0500 +0D40 +1520 +ENDCHAR +STARTCHAR U_55DC +ENCODING 21980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9380 +9D20 +F7E0 +9440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_55DD +ENCODING 21981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A000 +AFE0 +AAA0 +E920 +AFE0 +0920 +0920 +0860 +ENDCHAR +STARTCHAR U_55DE +ENCODING 21982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A240 +A440 +A480 +A9A0 +E640 +A240 +05A0 +0EE0 +ENDCHAR +STARTCHAR U_55DF +ENCODING 21983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +97C0 +9100 +FFE0 +9400 +0FC0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_55E0 +ENCODING 21984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E7C0 +AA40 +5440 +7A80 +0900 +1280 +FFE0 +1440 +5440 +27C0 +ENDCHAR +STARTCHAR U_55E1 +ENCODING 21985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EA40 +B4A0 +AFC0 +A000 +AEE0 +F320 +AAA0 +0EE0 +1320 +0660 +ENDCHAR +STARTCHAR U_55E2 +ENCODING 21986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +FFE0 +9AA0 +0AA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55E3 +ENCODING 21987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4820 +7BA0 +0020 +FBA0 +AAA0 +AAA0 +FBA0 +A820 +A820 +98E0 +ENDCHAR +STARTCHAR U_55E4 +ENCODING 21988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0920 +EFE0 +A100 +BFE0 +A100 +AFE0 +E920 +0FE0 +0120 +1FE0 +ENDCHAR +STARTCHAR U_55E5 +ENCODING 21989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +07C0 +E440 +A7C0 +A440 +BFE0 +A540 +E920 +17C0 +0100 +0100 +ENDCHAR +STARTCHAR U_55E6 +ENCODING 21990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +BFE0 +B2A0 +AF00 +E240 +AFA0 +0540 +0920 +1320 +ENDCHAR +STARTCHAR U_55E7 +ENCODING 21991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +5FE0 +8900 +3F80 +C060 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_55E8 +ENCODING 21992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +0BE0 +E400 +B3E0 +AAA0 +A2A0 +A7E0 +FAA0 +0BE0 +0820 +08C0 +ENDCHAR +STARTCHAR U_55E9 +ENCODING 21993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0540 +EFE0 +A820 +AFE0 +A820 +AFE0 +E820 +0FE0 +0440 +0820 +ENDCHAR +STARTCHAR U_55EA +ENCODING 21994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFC0 +A200 +BFE0 +E540 +0920 +1FE0 +0540 +1920 +ENDCHAR +STARTCHAR U_55EB +ENCODING 21995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A440 +A7C0 +A440 +FFE0 +0AA0 +0440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_55EC +ENCODING 21996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +A800 +AFE0 +B040 +B740 +F540 +1740 +1040 +10C0 +ENDCHAR +STARTCHAR U_55ED +ENCODING 21997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2880 +2480 +FFE0 +0240 +7B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_55EE +ENCODING 21998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E940 +A940 +ABE0 +BAA0 +AAA0 +AAA0 +EB60 +3A20 +2BE0 +0220 +ENDCHAR +STARTCHAR U_55EF +ENCODING 21999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AAA0 +AFE0 +E000 +0540 +1520 +1460 +03C0 +ENDCHAR +STARTCHAR U_55F0 +ENCODING 22000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +E920 +AFE0 +A920 +ABA0 +AAA0 +EAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_55F1 +ENCODING 22001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +FB40 +A7A0 +A480 +A780 +A100 +E7C0 +0100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_55F2 +ENCODING 22002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EAA0 +A100 +AEE0 +A380 +A480 +EBE0 +A240 +0D80 +0100 +0E00 +ENDCHAR +STARTCHAR U_55F3 +ENCODING 22003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF20 +A540 +AFE0 +B220 +AFC0 +E400 +07C0 +0A80 +1100 +0EE0 +ENDCHAR +STARTCHAR U_55F4 +ENCODING 22004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0FE0 +E100 +A7C0 +A100 +BFE0 +A340 +E3A0 +05E0 +0520 +18E0 +ENDCHAR +STARTCHAR U_55F5 +ENCODING 22005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +0940 +E3E0 +A2A0 +BBE0 +AAA0 +ABE0 +EAA0 +0AE0 +1400 +23E0 +ENDCHAR +STARTCHAR U_55F6 +ENCODING 22006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +9FE0 +9540 +FFE0 +9540 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_55F7 +ENCODING 22007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1E80 +E480 +BEE0 +A520 +BF20 +A8A0 +EE40 +0A40 +12A0 +2520 +ENDCHAR +STARTCHAR U_55F8 +ENCODING 22008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FD40 +2140 +3880 +4940 +9220 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_55F9 +ENCODING 22009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +17E0 +E880 +A3E0 +BAA0 +ABE0 +AAA0 +EFE0 +0880 +1480 +23E0 +ENDCHAR +STARTCHAR U_55FA +ENCODING 22010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +EFE0 +A500 +AFE0 +B900 +AFC0 +E900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_55FB +ENCODING 22011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A800 +AA40 +AFE0 +AA40 +ABC0 +E800 +1540 +16A0 +2AA0 +ENDCHAR +STARTCHAR U_55FC +ENCODING 22012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +AFC0 +AA40 +A940 +AFC0 +E200 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_55FD +ENCODING 22013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +3E80 +E8E0 +BF20 +AAC0 +AA80 +BE80 +EC80 +1A80 +2940 +0A20 +ENDCHAR +STARTCHAR U_55FE +ENCODING 22014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +FFE0 +A900 +AFE0 +AA80 +ABE0 +EA80 +0B40 +1540 +2A20 +ENDCHAR +STARTCHAR U_55FF +ENCODING 22015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +EA40 +B7A0 +A100 +AFC0 +A840 +EFC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5600 +ENCODING 22016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E480 +AFE0 +A920 +AFE0 +A920 +EBA0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5601 +ENCODING 22017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E0A0 +AFE0 +AA80 +ABA0 +AAA0 +AFA0 +EAC0 +0EA0 +1360 +2620 +ENDCHAR +STARTCHAR U_5602 +ENCODING 22018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E2E0 +AAA0 +AAA0 +AAA0 +EAE0 +0A00 +EAE0 +AEA0 +A2A0 +A2A0 +E2E0 +ENDCHAR +STARTCHAR U_5603 +ENCODING 22019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A940 +AFE0 +A940 +AFC0 +E900 +0FC0 +0D40 +17C0 +2540 +ENDCHAR +STARTCHAR U_5604 +ENCODING 22020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFE0 +E220 +1FA0 +0760 +0A80 +3260 +ENDCHAR +STARTCHAR U_5605 +ENCODING 22021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA80 +AE80 +AA80 +AFE0 +A880 +EC80 +0B80 +0DA0 +0AA0 +0460 +ENDCHAR +STARTCHAR U_5606 +ENCODING 22022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E500 +AFC0 +AA40 +AFC0 +A200 +EFC0 +0200 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5607 +ENCODING 22023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +AFC0 +A480 +AFC0 +A500 +EA80 +1560 +0A80 +0100 +1E00 +ENDCHAR +STARTCHAR U_5608 +ENCODING 22024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +AAA0 +AFE0 +AAA0 +AFE0 +E440 +07C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5609 +ENCODING 22025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +1100 +FFE0 +2A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_560A +ENCODING 22026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0940 +EFC0 +A000 +AFE0 +A900 +AFC0 +E900 +17C0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_560B +ENCODING 22027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EF40 +A560 +BFA0 +A4A0 +AFA0 +F240 +0440 +1E40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_560C +ENCODING 22028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A000 +A7C0 +E000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_560D +ENCODING 22029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +AFE0 +A540 +AFE0 +E920 +1FE0 +0280 +0380 +1C60 +ENDCHAR +STARTCHAR U_560E +ENCODING 22030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +0200 +EFC0 +AA40 +A940 +AFC0 +A240 +FFE0 +0280 +0320 +1CE0 +ENDCHAR +STARTCHAR U_560F +ENCODING 22031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4A20 +FA20 +4EE0 +4800 +EEE0 +A8A0 +A8A0 +EE40 +A8A0 +0B20 +ENDCHAR +STARTCHAR U_5610 +ENCODING 22032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EAA0 +A660 +AAA0 +A300 +A480 +FA60 +0500 +0A80 +0100 +0E00 +ENDCHAR +STARTCHAR U_5611 +ENCODING 22033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AF80 +AA40 +EFC0 +1540 +1FE0 +1100 +2300 +ENDCHAR +STARTCHAR U_5612 +ENCODING 22034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E440 +AEE0 +A440 +AEE0 +A440 +EFE0 +0020 +0FE0 +0020 +0FE0 +ENDCHAR +STARTCHAR U_5613 +ENCODING 22035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E160 +BFE0 +A120 +BD20 +B560 +FDA0 +2120 +3AA0 +2460 +3FE0 +ENDCHAR +STARTCHAR U_5614 +ENCODING 22036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABC0 +AA40 +ABC0 +A800 +EEE0 +0AA0 +0EE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5615 +ENCODING 22037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A9C0 +A900 +BFE0 +A800 +EFC0 +0800 +0FE0 +1AA0 +2560 +ENDCHAR +STARTCHAR U_5616 +ENCODING 22038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +E440 +07C0 +0440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_5617 +ENCODING 22039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9120 +1F00 +2200 +2C40 +3FC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_5618 +ENCODING 22040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AFC0 +AA20 +E9E0 +AA80 +1AA0 +26C0 +5FE0 +ENDCHAR +STARTCHAR U_5619 +ENCODING 22041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +EBE0 +A2A0 +BBC0 +A740 +AA80 +F540 +1FE0 +0480 +0300 +0CC0 +ENDCHAR +STARTCHAR U_561A +ENCODING 22042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +EA20 +B3E0 +AA20 +ABE0 +B800 +EBE0 +0840 +0BE0 +0A40 +09C0 +ENDCHAR +STARTCHAR U_561B +ENCODING 22043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +F480 +9480 +9FE0 +9480 +F6C0 +1DA0 +14A0 +2480 +4480 +ENDCHAR +STARTCHAR U_561C +ENCODING 22044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A940 +A940 +B6A0 +A440 +FBA0 +0480 +0B00 +0280 +1C40 +ENDCHAR +STARTCHAR U_561D +ENCODING 22045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0720 +EA60 +BFA0 +AAA0 +AFE0 +AAA0 +EFA0 +0AE0 +0AA0 +12A0 +21A0 +ENDCHAR +STARTCHAR U_561E +ENCODING 22046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FE80 +ABE0 +AEA0 +A4A0 +BFA0 +F5A0 +1FA0 +04A0 +1F20 +0560 +ENDCHAR +STARTCHAR U_561F +ENCODING 22047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +FDA0 +AAA0 +BFC0 +A4A0 +AEA0 +EAA0 +1EA0 +2AE0 +0E80 +0A80 +ENDCHAR +STARTCHAR U_5620 +ENCODING 22048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E200 +A7C0 +A540 +A540 +BFE0 +F2A0 +0FC0 +0240 +01A0 +1E60 +ENDCHAR +STARTCHAR U_5621 +ENCODING 22049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0540 +EFE0 +A820 +A7C0 +A440 +A7C0 +E100 +07C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5622 +ENCODING 22050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +EA20 +AAA0 +BE40 +ABE0 +BE40 +E840 +1E40 +0840 +0E40 +30C0 +ENDCHAR +STARTCHAR U_5623 +ENCODING 22051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E920 +AFE0 +A000 +AEE0 +AAA0 +EEE0 +AAA0 +0EE0 +12A0 +2760 +ENDCHAR +STARTCHAR U_5624 +ENCODING 22052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +EAA0 +AAA0 +AAA0 +B540 +A220 +FFE0 +0480 +0300 +3CE0 +ENDCHAR +STARTCHAR U_5625 +ENCODING 22053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EA80 +B2E0 +AA80 +BFE0 +A880 +EA80 +0AE0 +0A80 +0D80 +08E0 +ENDCHAR +STARTCHAR U_5626 +ENCODING 22054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +4040 +BFA0 +0A00 +3F80 +2A80 +FFE0 +0A00 +3580 +ENDCHAR +STARTCHAR U_5627 +ENCODING 22055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +B220 +A980 +B520 +A6A0 +FB80 +0100 +0920 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5628 +ENCODING 22056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A240 +BFE0 +A240 +AFC0 +F6C0 +1FC0 +1240 +2740 +4AC0 +ENDCHAR +STARTCHAR U_5629 +ENCODING 22057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9FE0 +9540 +9FE0 +9540 +FFE0 +0100 +07C0 +0100 +ENDCHAR +STARTCHAR U_562A +ENCODING 22058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +F4A0 +B4A0 +BFE0 +A840 +AFC0 +E840 +0FC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_562B +ENCODING 22059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E6C0 +AAA0 +B7E0 +AA80 +A480 +E940 +1220 +0000 +14A0 +14A0 +ENDCHAR +STARTCHAR U_562C +ENCODING 22060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +9FE0 +9A00 +FFE0 +0A20 +0F40 +0AC0 +1F20 +ENDCHAR +STARTCHAR U_562D +ENCODING 22061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF20 +A240 +AF80 +A020 +AF40 +E980 +0F20 +0940 +0680 +1F00 +ENDCHAR +STARTCHAR U_562E +ENCODING 22062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15A0 +EEC0 +A480 +AB40 +B220 +BFE0 +F220 +0FC0 +0240 +0440 +09C0 +ENDCHAR +STARTCHAR U_562F +ENCODING 22063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A120 +BFE0 +A120 +AFE0 +A920 +EFE0 +0920 +1DE0 +25A0 +ENDCHAR +STARTCHAR U_5630 +ENCODING 22064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EBA0 +BDC0 +AB40 +BFE0 +A940 +FFE0 +A940 +0CA0 +1160 +2620 +ENDCHAR +STARTCHAR U_5631 +ENCODING 22065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A900 +AFC0 +AD40 +EFC0 +1100 +1FE0 +2920 +4FE0 +ENDCHAR +STARTCHAR U_5632 +ENCODING 22066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +1FA0 +E4A0 +AEE0 +AAA0 +AEA0 +EAE0 +AEA0 +04A0 +1F20 +0560 +ENDCHAR +STARTCHAR U_5633 +ENCODING 22067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +AA40 +BFE0 +A840 +AFC0 +E840 +0FC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5634 +ENCODING 22068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EBC0 +AAA0 +BFE0 +A480 +AFE0 +F920 +0FE0 +0920 +0FE0 +1120 +ENDCHAR +STARTCHAR U_5635 +ENCODING 22069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +AFE0 +A480 +AFE0 +E480 +1FE0 +0280 +04A0 +1860 +ENDCHAR +STARTCHAR U_5636 +ENCODING 22070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AE0 +FF80 +AA80 +AEE0 +AAA0 +AEA0 +EAA0 +1FA0 +0AA0 +1120 +2220 +ENDCHAR +STARTCHAR U_5637 +ENCODING 22071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +EA40 +0680 +0A40 +1FE0 +0200 +ENDCHAR +STARTCHAR U_5638 +ENCODING 22072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B540 +A540 +AFE0 +A540 +A540 +EFE0 +0D40 +0AA0 +12A0 +ENDCHAR +STARTCHAR U_5639 +ENCODING 22073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B4A0 +AFC0 +B8A0 +AF80 +E880 +0F80 +0A80 +1240 +2620 +ENDCHAR +STARTCHAR U_563A +ENCODING 22074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +A440 +BFA0 +A480 +FFE0 +1020 +17A0 +14A0 +17A0 +ENDCHAR +STARTCHAR U_563B +ENCODING 22075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +BFE0 +A440 +A7C0 +E280 +0FE0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_563C +ENCODING 22076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_563D +ENCODING 22077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +A000 +A7C0 +A540 +E7C0 +0540 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_563E +ENCODING 22078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A440 +E7C0 +0440 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_563F +ENCODING 22079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +A920 +AFE0 +A100 +A7C0 +E100 +BFE0 +0000 +0AA0 +12A0 +ENDCHAR +STARTCHAR U_5640 +ENCODING 22080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +F2A0 +BEE0 +B2A0 +AE60 +A480 +BFE0 +E480 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5641 +ENCODING 22081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AEE0 +A820 +AEE0 +A280 +EFE0 +0140 +1520 +1440 +23C0 +ENDCHAR +STARTCHAR U_5642 +ENCODING 22082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E280 +AFE0 +AAA0 +AC60 +ABA0 +E820 +1FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_5643 +ENCODING 22083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +A380 +AFE0 +A540 +A920 +FFE0 +0920 +0FE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5644 +ENCODING 22084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +EEA0 +A4A0 +AEA0 +A540 +A280 +AFE0 +E540 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5645 +ENCODING 22085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF40 +A540 +AFC0 +A840 +AFC0 +E840 +0FE0 +0820 +1AA0 +2560 +ENDCHAR +STARTCHAR U_5646 +ENCODING 22086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EA80 +BFE0 +A880 +BDA0 +AA60 +EFC0 +0840 +0FC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_5647 +ENCODING 22087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FC0 +E500 +BFE0 +AA80 +AF80 +AA80 +EA80 +1FC0 +0200 +3FE0 +ENDCHAR +STARTCHAR U_5648 +ENCODING 22088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E4C0 +BEA0 +A1E0 +BE80 +A280 +BEC0 +E8C0 +1CC0 +2B40 +5A60 +ENDCHAR +STARTCHAR U_5649 +ENCODING 22089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +E900 +BFE0 +A540 +BD40 +A540 +BD40 +E540 +3E80 +0540 +0620 +ENDCHAR +STARTCHAR U_564A +ENCODING 22090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E280 +AFE0 +A540 +A900 +AFE0 +EAA0 +0FE0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_564B +ENCODING 22091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +1F40 +EA80 +AEE0 +A120 +AEA0 +A2A0 +E440 +1E40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_564C +ENCODING 22092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A920 +AAA0 +AFE0 +A000 +E7C0 +0440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_564D +ENCODING 22093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E480 +AFE0 +A900 +BFE0 +A900 +EFE0 +0900 +0FE0 +0D40 +12A0 +ENDCHAR +STARTCHAR U_564E +ENCODING 22094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A820 +A7C0 +E440 +07C0 +0440 +0280 +1FE0 +ENDCHAR +STARTCHAR U_564F +ENCODING 22095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +BB60 +A000 +A7C0 +A440 +BFE0 +EAA0 +0660 +0AA0 +1760 +ENDCHAR +STARTCHAR U_5650 +ENCODING 22096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +7FC0 +0400 +FFE0 +0000 +7FC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_5651 +ENCODING 22097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FC0 +E840 +AFC0 +A840 +AFC0 +AA80 +E700 +0A80 +3FE0 +0200 +ENDCHAR +STARTCHAR U_5652 +ENCODING 22098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E540 +AFE0 +A540 +A920 +A440 +AEE0 +F340 +0AE0 +0440 +1840 +ENDCHAR +STARTCHAR U_5653 +ENCODING 22099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AB80 +AE20 +E9E0 +0AA0 +0EE0 +1280 +2FE0 +ENDCHAR +STARTCHAR U_5654 +ENCODING 22100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +E280 +ACE0 +A440 +ABA0 +B000 +E7C0 +0440 +07C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5655 +ENCODING 22101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7C80 +1500 +3FC0 +2080 +3FE0 +5520 +A960 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5656 +ENCODING 22102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E440 +AEE0 +A440 +AFE0 +A280 +E640 +1920 +07C0 +0080 +0100 +ENDCHAR +STARTCHAR U_5657 +ENCODING 22103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +E6C0 +BFE0 +A280 +AFE0 +A100 +E7C0 +0100 +0FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_5658 +ENCODING 22104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +ED00 +AA80 +AFE0 +AA20 +AA80 +EF80 +0A80 +1280 +2540 +4A20 +ENDCHAR +STARTCHAR U_5659 +ENCODING 22105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A640 +B920 +A7C0 +A540 +E6C0 +0FE0 +0AA0 +0FA0 +0860 +ENDCHAR +STARTCHAR U_565A +ENCODING 22106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +A7C0 +A040 +AFE0 +A4A0 +FEE0 +0040 +1FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_565B +ENCODING 22107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +05C0 +E500 +BFE0 +AAC0 +AB40 +AFC0 +EA40 +0F40 +0AC0 +0FC0 +ENDCHAR +STARTCHAR U_565C +ENCODING 22108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +AFE0 +B920 +AFE0 +A920 +BFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_565D +ENCODING 22109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E880 +B520 +BDC0 +A880 +B520 +BDE0 +E080 +15C0 +2AA0 +01A0 +ENDCHAR +STARTCHAR U_565E +ENCODING 22110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +ABA0 +B000 +AEE0 +AAA0 +EAA0 +0EE0 +0440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_565F +ENCODING 22111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4B00 +5480 +5FC0 +7480 +57C0 +5480 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_5660 +ENCODING 22112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +E880 +A3E0 +A140 +BBE0 +A880 +EBE0 +0880 +0BE0 +1480 +23E0 +ENDCHAR +STARTCHAR U_5661 +ENCODING 22113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E880 +BFE0 +AA40 +AFE0 +A800 +EBC0 +0800 +0BC0 +1240 +23C0 +ENDCHAR +STARTCHAR U_5662 +ENCODING 22114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +AD60 +ABA0 +AFE0 +ABA0 +ED60 +1FE0 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5663 +ENCODING 22115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A400 +A7E0 +AA20 +BFA0 +EAA0 +0FA0 +02A0 +1FE0 +ENDCHAR +STARTCHAR U_5664 +ENCODING 22116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +AEC0 +B5A0 +A480 +EFC0 +0000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5665 +ENCODING 22117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +AAA0 +AFE0 +AAA0 +AFE0 +E800 +0FE0 +0AA0 +1340 +2220 +ENDCHAR +STARTCHAR U_5666 +ENCODING 22118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05C0 +E500 +BFE0 +A0A0 +BFE0 +A080 +FFA0 +24C0 +2EA0 +3560 +4A20 +ENDCHAR +STARTCHAR U_5667 +ENCODING 22119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A440 +A7C0 +A540 +A7C0 +E540 +0FE0 +0AA0 +0FA0 +0860 +ENDCHAR +STARTCHAR U_5668 +ENCODING 22120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0480 +FFE0 +1100 +FBE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_5669 +ENCODING 22121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +75C0 +5540 +FFE0 +0400 +75C0 +5540 +75C0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_566A +ENCODING 22122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A780 +BDE0 +A520 +BDE0 +E200 +1FE0 +0A80 +1240 +2220 +ENDCHAR +STARTCHAR U_566B +ENCODING 22123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +BFE0 +A440 +A7C0 +E440 +07C0 +0120 +0A60 +09C0 +ENDCHAR +STARTCHAR U_566C +ENCODING 22124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +AD40 +B220 +AFE0 +A100 +E540 +0540 +0BA0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_566D +ENCODING 22125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AFA0 +AAA0 +AEA0 +A4A0 +FF40 +0A40 +12A0 +2720 +ENDCHAR +STARTCHAR U_566E +ENCODING 22126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A000 +BFE0 +A840 +AFC0 +E520 +0CC0 +1540 +2620 +ENDCHAR +STARTCHAR U_566F +ENCODING 22127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F20 +E540 +AFE0 +A920 +AA60 +F3C0 +0400 +0FC0 +1380 +0C60 +ENDCHAR +STARTCHAR U_5670 +ENCODING 22128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A940 +B7E0 +BA40 +ABE0 +F640 +1FE0 +0A40 +13E0 +2200 +ENDCHAR +STARTCHAR U_5671 +ENCODING 22129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AFC0 +AA20 +EFE0 +0AA0 +15C0 +22A0 +4DA0 +ENDCHAR +STARTCHAR U_5672 +ENCODING 22130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +ABA0 +B000 +AFE0 +AAA0 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5673 +ENCODING 22131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +0200 +EFE0 +AA20 +AFC0 +AA20 +EBE0 +0A40 +1FE0 +1280 +2C60 +ENDCHAR +STARTCHAR U_5674 +ENCODING 22132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +AFE0 +A440 +A7C0 +E440 +07C0 +0440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_5675 +ENCODING 22133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +5FE0 +0200 +CFC0 +4940 +4CC0 +6A40 +9FE0 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_5676 +ENCODING 22134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +0480 +EFC0 +A840 +AFC0 +A840 +AFE0 +F920 +2AA0 +0FA0 +0040 +ENDCHAR +STARTCHAR U_5677 +ENCODING 22135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AAE0 +A420 +BEC0 +A080 +AE80 +EA80 +0F40 +0B40 +0E20 +ENDCHAR +STARTCHAR U_5678 +ENCODING 22136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +0880 +FFE0 +A920 +ABE0 +AB20 +BFE0 +E920 +0BE0 +0D40 +0A20 +ENDCHAR +STARTCHAR U_5679 +ENCODING 22137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +B020 +A780 +A480 +AFE0 +E920 +0FE0 +0920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_567A +ENCODING 22138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0860 +FF80 +B500 +ADE0 +BF40 +A940 +BF40 +E940 +1D40 +2A40 +1C40 +ENDCHAR +STARTCHAR U_567B +ENCODING 22139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B520 +AFE0 +A500 +BFE0 +E480 +0A40 +17A0 +0200 +1FE0 +ENDCHAR +STARTCHAR U_567C +ENCODING 22140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E40 +EBE0 +AAA0 +AEA0 +A840 +AFE0 +EA40 +1AE0 +1A40 +2E40 +0040 +ENDCHAR +STARTCHAR U_567D +ENCODING 22141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +1080 +7C80 +45C0 +7EA0 +28A0 +FE80 +4480 +4400 +7FE0 +ENDCHAR +STARTCHAR U_567E +ENCODING 22142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +EAA0 +A540 +AFE0 +A280 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_567F +ENCODING 22143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +A660 +AAA0 +BFE0 +A440 +EAA0 +0100 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5680 +ENCODING 22144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +B520 +AD40 +BFE0 +AAA0 +AFE0 +E000 +0FE0 +0100 +0300 +ENDCHAR +STARTCHAR U_5681 +ENCODING 22145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +A660 +AAA0 +AFE0 +B900 +EFC0 +0900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5682 +ENCODING 22146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +EA40 +AF60 +A980 +AF40 +AA20 +EF00 +0000 +0FE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_5683 +ENCODING 22147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +B100 +AB40 +BD20 +EB40 +0D20 +0900 +0C00 +13E0 +ENDCHAR +STARTCHAR U_5684 +ENCODING 22148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +AFE0 +A900 +BFE0 +A900 +EFE0 +0480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5685 +ENCODING 22149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +B560 +A380 +A540 +EFE0 +0100 +0FE0 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_5686 +ENCODING 22150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A540 +AFE0 +A280 +A380 +E000 +AFE0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5687 +ENCODING 22151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +BFE0 +AD40 +AD40 +BF60 +ED60 +0D40 +1540 +2EC0 +ENDCHAR +STARTCHAR U_5688 +ENCODING 22152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2E40 +EA60 +AE40 +A1E0 +AE40 +AA40 +EE40 +2A40 +2EA0 +4B20 +ENDCHAR +STARTCHAR U_5689 +ENCODING 22153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +1B40 +EA40 +BFE0 +AA40 +BF40 +A4C0 +FF40 +0440 +0740 +18C0 +ENDCHAR +STARTCHAR U_568A +ENCODING 22154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E7C0 +A540 +A6C0 +AFE0 +A920 +AFE0 +E920 +1FE0 +0440 +0840 +ENDCHAR +STARTCHAR U_568B +ENCODING 22155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +BFE0 +A000 +AFE0 +A200 +BFE0 +EA40 +0F40 +00C0 +ENDCHAR +STARTCHAR U_568C +ENCODING 22156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E520 +BAC0 +AAA0 +B2A0 +AFC0 +E840 +0FC0 +0840 +1040 +ENDCHAR +STARTCHAR U_568D +ENCODING 22157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E140 +BFE0 +A140 +AFE0 +A100 +FFE0 +0AA0 +0FE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_568E +ENCODING 22158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A480 +BFE0 +B020 +AFC0 +EA20 +1540 +0B80 +0540 +1B20 +ENDCHAR +STARTCHAR U_568F +ENCODING 22159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +BFE0 +B540 +A7C0 +A540 +EFE0 +0120 +09C0 +0D00 +13E0 +ENDCHAR +STARTCHAR U_5690 +ENCODING 22160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0940 +0580 +FFE0 +B4A0 +A780 +A920 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5691 +ENCODING 22161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +AAC0 +AB40 +AFC0 +A200 +EFC0 +0200 +1FE0 +12A0 +ENDCHAR +STARTCHAR U_5692 +ENCODING 22162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +AB40 +AEE0 +A940 +EA40 +1180 +1240 +27E0 +ENDCHAR +STARTCHAR U_5693 +ENCODING 22163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +F820 +AFE0 +AAA0 +B440 +ABA0 +F000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5694 +ENCODING 22164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +BFE0 +AAA0 +AF80 +A500 +FFC0 +0340 +0A00 +17E0 +ENDCHAR +STARTCHAR U_5695 +ENCODING 22165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E880 +BFE0 +A920 +AFE0 +A920 +EFE0 +0AA0 +17E0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5696 +ENCODING 22166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +BFE0 +A480 +AFC0 +E040 +0FC0 +0A20 +2940 +47C0 +ENDCHAR +STARTCHAR U_5697 +ENCODING 22167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A480 +BFE0 +A480 +BFE0 +EA40 +1AA0 +2700 +1AC0 +ENDCHAR +STARTCHAR U_5698 +ENCODING 22168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A740 +A5C0 +A440 +BFE0 +B520 +EFE0 +0A40 +0180 +0E60 +ENDCHAR +STARTCHAR U_5699 +ENCODING 22169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E5E0 +A500 +BFE0 +AAA0 +AD60 +EFE0 +0AA0 +0D60 +0820 +0FE0 +ENDCHAR +STARTCHAR U_569A +ENCODING 22170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +4400 +7FC0 +4040 +7FC0 +4400 +FFE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_569B +ENCODING 22171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +0B40 +F5A0 +AB40 +B5A0 +BFE0 +A200 +FFE0 +0700 +0A80 +3260 +ENDCHAR +STARTCHAR U_569C +ENCODING 22172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +A920 +AFE0 +A100 +BFE0 +AAA0 +E100 +0FC0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_569D +ENCODING 22173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +F280 +9FE0 +9280 +9FE0 +9540 +F7C0 +1540 +17C0 +2C60 +ENDCHAR +STARTCHAR U_569E +ENCODING 22174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +1100 +FFE0 +1100 +FFE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_569F +ENCODING 22175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F9E0 +A8A0 +BEA0 +AD20 +BA40 +ED80 +3260 +0A80 +0700 +1AC0 +ENDCHAR +STARTCHAR U_56A0 +ENCODING 22176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1620 +EA20 +AAA0 +B6A0 +A8A0 +B6A0 +BEA0 +E8A0 +3E20 +2AA0 +3E40 +ENDCHAR +STARTCHAR U_56A1 +ENCODING 22177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FF40 +AAE0 +AE40 +A4E0 +BF40 +B5E0 +FF40 +0440 +3E40 +05E0 +ENDCHAR +STARTCHAR U_56A2 +ENCODING 22178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +7FC0 +5140 +EAE0 +3FC0 +0A00 +7FC0 +2A80 +CDC0 +ENDCHAR +STARTCHAR U_56A3 +ENCODING 22179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +FFE0 +0400 +7FC0 +4440 +5B40 +2080 +FBE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_56A4 +ENCODING 22180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +F480 +9FE0 +95C0 +9EA0 +97C0 +F080 +1FE0 +2100 +4300 +ENDCHAR +STARTCHAR U_56A5 +ENCODING 22181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A780 +A840 +BF60 +AD40 +ED40 +3F20 +0D40 +12A0 +ENDCHAR +STARTCHAR U_56A6 +ENCODING 22182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E240 +AC80 +BFC0 +A480 +AFC0 +B4A0 +E100 +25C0 +4500 +9FE0 +ENDCHAR +STARTCHAR U_56A7 +ENCODING 22183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +BFE0 +A420 +AFE0 +AA80 +EF80 +2A80 +3FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_56A8 +ENCODING 22184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FF80 +AAE0 +A420 +BFE0 +AA80 +AEE0 +EA80 +0EE0 +0A80 +0AE0 +ENDCHAR +STARTCHAR U_56A9 +ENCODING 22185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +F3E0 +BC80 +ABE0 +B6A0 +BBE0 +A2A0 +F440 +17E0 +2140 +00C0 +ENDCHAR +STARTCHAR U_56AA +ENCODING 22186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +E520 +BDE0 +A520 +BFE0 +A920 +B5A0 +E8A0 +2DA0 +28A0 +2FE0 +ENDCHAR +STARTCHAR U_56AB +ENCODING 22187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FFA0 +AAE0 +A4A0 +BFA0 +A4E0 +AEA0 +E4E0 +0E40 +15C0 +2D60 +ENDCHAR +STARTCHAR U_56AC +ENCODING 22188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02E0 +EB40 +AAE0 +BFA0 +A2E0 +AAA0 +AAE0 +F3A0 +02E0 +04A0 +1920 +ENDCHAR +STARTCHAR U_56AD +ENCODING 22189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2080 +FDC0 +4AA0 +7C80 +5080 +FFE0 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_56AE +ENCODING 22190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +BEA0 +D2C0 +BEC0 +D4A0 +5EE0 +8980 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_56AF +ENCODING 22191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +B5A0 +A940 +A500 +EFE0 +B900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_56B0 +ENCODING 22192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FE0 +EA40 +AFE0 +AF60 +AAC0 +AFE0 +E900 +ABC0 +1640 +23C0 +ENDCHAR +STARTCHAR U_56B1 +ENCODING 22193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +08C0 +FEA0 +ABE0 +BC80 +AAA0 +BEC0 +EA80 +2F40 +2A60 +5F20 +ENDCHAR +STARTCHAR U_56B2 +ENCODING 22194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FEA0 +4BE0 +7AA0 +03E0 +FAA0 +13E0 +3880 +E7E0 +2080 +6080 +ENDCHAR +STARTCHAR U_56B3 +ENCODING 22195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +9420 +3FC0 +4400 +FFE0 +2080 +3F80 +ENDCHAR +STARTCHAR U_56B4 +ENCODING 22196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FE0 +4500 +7F00 +55E0 +5D20 +56A0 +5C40 +56A0 +BD20 +ENDCHAR +STARTCHAR U_56B5 +ENCODING 22197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E880 +BFE0 +A920 +AFE0 +A520 +AFE0 +F540 +07C0 +02A0 +1CE0 +ENDCHAR +STARTCHAR U_56B6 +ENCODING 22198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +AEE0 +A440 +EAA0 +BFE0 +0480 +0380 +1C60 +ENDCHAR +STARTCHAR U_56B7 +ENCODING 22199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AAA0 +AEE0 +A280 +AFE0 +A280 +EFE0 +0540 +0C80 +1660 +ENDCHAR +STARTCHAR U_56B8 +ENCODING 22200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F40 +F540 +BF60 +B540 +BF40 +A440 +FFE0 +A520 +1F20 +1520 +2BE0 +ENDCHAR +STARTCHAR U_56B9 +ENCODING 22201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +F080 +BFE0 +AA80 +ABC0 +BEA0 +ABE0 +EAC0 +0BE0 +2A40 +3EC0 +ENDCHAR +STARTCHAR U_56BA +ENCODING 22202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +BAA0 +AFE0 +A200 +BB40 +ED80 +AB60 +0D20 +0B00 +17E0 +ENDCHAR +STARTCHAR U_56BB +ENCODING 22203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E4E0 +AEA0 +EAE0 +0E00 +EAE0 +AEA0 +AAA0 +AEA0 +EAE0 +1100 +ENDCHAR +STARTCHAR U_56BC +ENCODING 22204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AFE0 +AAA0 +AFE0 +AA20 +EFE0 +AB20 +0EA0 +0820 +0EE0 +ENDCHAR +STARTCHAR U_56BD +ENCODING 22205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A4A0 +BF40 +B2A0 +AFC0 +E840 +AFC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_56BE +ENCODING 22206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +AEE0 +AAA0 +AFE0 +A900 +AFC0 +F900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_56BF +ENCODING 22207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +FFE0 +A900 +AFC0 +BFC0 +A900 +EFE0 +A440 +0EC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_56C0 +ENCODING 22208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +3FE0 +E8A0 +BFE0 +AAA0 +BFE0 +AA40 +FFE0 +8940 +3F40 +08C0 +ENDCHAR +STARTCHAR U_56C1 +ENCODING 22209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A440 +AFE0 +A040 +FFE0 +AAA0 +0EE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_56C2 +ENCODING 22210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_56C3 +ENCODING 22211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FF40 +ABE0 +B540 +ABE0 +A940 +FFE0 +A940 +1D40 +2BE0 +0900 +ENDCHAR +STARTCHAR U_56C4 +ENCODING 22212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FF40 +B5E0 +AB40 +BFE0 +A540 +BFE0 +B540 +FF40 +93E0 +1100 +ENDCHAR +STARTCHAR U_56C5 +ENCODING 22213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AC20 +FFE0 +2D40 +FFE0 +AD40 +FFE0 +25A0 +FD40 +2540 +2BA0 +ENDCHAR +STARTCHAR U_56C6 +ENCODING 22214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +AFC0 +AA40 +BFE0 +B2A0 +BFE0 +EA40 +0FC0 +0240 +1FA0 +ENDCHAR +STARTCHAR U_56C7 +ENCODING 22215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AEE0 +ABA0 +AFE0 +AA80 +AFE0 +EAA0 +AFE0 +1280 +2760 +ENDCHAR +STARTCHAR U_56C8 +ENCODING 22216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +BFE0 +A4A0 +BFA0 +A4E0 +FFA0 +A000 +1FE0 +0440 +0FA0 +ENDCHAR +STARTCHAR U_56C9 +ENCODING 22217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A540 +A9E0 +BF40 +A9E0 +F540 +1BE0 +1540 +2BE0 +ENDCHAR +STARTCHAR U_56CA +ENCODING 22218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +AAA0 +7FC0 +1100 +FFE0 +1240 +3180 +D8E0 +ENDCHAR +STARTCHAR U_56CB +ENCODING 22219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +FFE0 +A440 +BFE0 +AAA0 +B7C0 +E440 +A7C0 +0440 +07C0 +0820 +ENDCHAR +STARTCHAR U_56CC +ENCODING 22220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +AC80 +B5E0 +BE40 +ABE0 +BE40 +EAE0 +1F40 +1440 +2A40 +ENDCHAR +STARTCHAR U_56CD +ENCODING 22221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +8A20 +FBE0 +5140 +FFE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_56CE +ENCODING 22222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0E80 +EBE0 +AEA0 +ABE0 +AEA0 +ABE0 +EF20 +A5E0 +0B20 +11E0 +ENDCHAR +STARTCHAR U_56CF +ENCODING 22223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +2900 +7FC0 +5440 +7FC0 +1280 +FFE0 +2A40 +47C0 +8240 +ENDCHAR +STARTCHAR U_56D0 +ENCODING 22224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0F60 +0A40 +EFE0 +AD40 +AA40 +AF40 +E940 +0F40 +15A0 +1520 +ENDCHAR +STARTCHAR U_56D1 +ENCODING 22225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E020 +BFE0 +A540 +AFE0 +AAA0 +EFE0 +2AA0 +2FA0 +22A0 +5F60 +ENDCHAR +STARTCHAR U_56D2 +ENCODING 22226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +AEE0 +AAA0 +AEE0 +A920 +EFE0 +0BA0 +0D60 +0920 +ENDCHAR +STARTCHAR U_56D3 +ENCODING 22227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E8A0 +BF20 +AA20 +BFC0 +AA00 +BFE0 +F520 +BFE0 +12A0 +1FE0 +ENDCHAR +STARTCHAR U_56D4 +ENCODING 22228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +AA40 +BFE0 +B2A0 +BFE0 +E480 +BFE0 +0D40 +1480 +2760 +ENDCHAR +STARTCHAR U_56D5 +ENCODING 22229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +0AE0 +EF40 +AAA0 +AFC0 +A440 +A7C0 +E440 +07C0 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_56D6 +ENCODING 22230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0EE0 +F540 +AFE0 +AAA0 +AFE0 +A480 +EB40 +05E0 +0F40 +05E0 +ENDCHAR +STARTCHAR U_56D7 +ENCODING 22231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56D8 +ENCODING 22232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +9120 +9F20 +9020 +90A0 +8FA0 +8020 +8060 +ENDCHAR +STARTCHAR U_56D9 +ENCODING 22233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +FE40 +8240 +8240 +8240 +FE40 +8040 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56DA +ENCODING 22234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8840 +8840 +8840 +8C40 +9240 +A140 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56DB +ENCODING 22235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +9480 +9480 +9480 +9480 +A780 +C080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_56DC +ENCODING 22236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8840 +8840 +9040 +9240 +A740 +B940 +8040 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56DD +ENCODING 22237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +8220 +8420 +BFA0 +8420 +9420 +8820 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56DE +ENCODING 22238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +9E40 +9240 +9240 +9E40 +9240 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56DF +ENCODING 22239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8080 +A280 +9280 +8C80 +8C80 +9280 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR U_56E0 +ENCODING 22240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +BFA0 +8420 +8420 +8A20 +9120 +A0A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E1 +ENCODING 22241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +8840 +FFC0 +9240 +A440 +9C40 +9240 +A140 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E2 +ENCODING 22242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8440 +8440 +FF40 +8440 +8C40 +9440 +A440 +8C40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E3 +ENCODING 22243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8240 +8240 +BF40 +8240 +9240 +8A40 +8240 +8640 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E4 +ENCODING 22244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FF40 +8840 +AA40 +BE40 +8940 +8F40 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E5 +ENCODING 22245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BF40 +8040 +9C40 +9440 +9540 +A740 +C040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E6 +ENCODING 22246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +84A0 +B520 +9620 +9520 +A520 +C4A0 +8C20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E7 +ENCODING 22247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9240 +A140 +C0C0 +9E40 +9240 +9240 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E8 +ENCODING 22248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8220 +8C20 +9520 +A4A0 +8420 +8420 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E9 +ENCODING 22249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +8020 +BFA0 +8420 +8920 +93A0 +BCA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56EA +ENCODING 22250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +FFC0 +8040 +9540 +8A40 +B440 +8640 +9940 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56EB +ENCODING 22251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A040 +BF40 +D540 +9540 +A540 +C940 +9540 +A240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56EC +ENCODING 22252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9120 +9F20 +9120 +9120 +9F20 +9120 +9120 +9120 +FFE0 +ENDCHAR +STARTCHAR U_56ED +ENCODING 22253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BE40 +8040 +FF40 +9440 +9540 +A540 +C340 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56EE +ENCODING 22254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9440 +9540 +B640 +DC40 +9540 +9340 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56EF +ENCODING 22255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8420 +8420 +9F20 +8420 +8420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F0 +ENCODING 22256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8440 +8440 +BF40 +8440 +8E40 +9540 +A540 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F1 +ENCODING 22257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +FFC0 +8840 +8840 +9F40 +B240 +CC40 +9240 +A140 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F2 +ENCODING 22258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8920 +BFA0 +8920 +8920 +BFA0 +8920 +9120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F3 +ENCODING 22259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +94A0 +AAA0 +9120 +8A20 +8420 +8A20 +B1A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F4 +ENCODING 22260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FF40 +8840 +BE40 +8840 +FF40 +8940 +8A40 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F5 +ENCODING 22261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +9440 +A240 +D540 +9840 +9140 +8F40 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F6 +ENCODING 22262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8A20 +9120 +A4A0 +8420 +9F20 +8420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F7 +ENCODING 22263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8240 +BC40 +8840 +FF40 +8C40 +9A40 +A940 +C840 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F8 +ENCODING 22264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8420 +8420 +9720 +9420 +9420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F9 +ENCODING 22265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +9440 +AA40 +C940 +BF40 +9240 +8C40 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56FA +ENCODING 22266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +8840 +FF40 +8840 +BE40 +A240 +A240 +BE40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56FB +ENCODING 22267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +9F20 +9420 +9F20 +9220 +B9A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56FC +ENCODING 22268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8820 +9120 +BFA0 +8020 +9F20 +9120 +9F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56FD +ENCODING 22269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +8840 +BF40 +8A40 +8940 +FFC0 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56FE +ENCODING 22270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9040 +9F40 +B240 +CC40 +9240 +E9C0 +8440 +8840 +8440 +FFC0 +ENDCHAR +STARTCHAR U_56FF +ENCODING 22271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FFC0 +9140 +BF40 +D140 +9F40 +9140 +9740 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5700 +ENCODING 22272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +9120 +A4A0 +DF60 +8820 +8F20 +9120 +9120 +A620 +FFE0 +ENDCHAR +STARTCHAR U_5701 +ENCODING 22273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BF40 +8040 +BF40 +8040 +BF40 +9240 +9E40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5702 +ENCODING 22274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +9D40 +A540 +8E40 +B540 +8CC0 +9440 +FFC0 +ENDCHAR +STARTCHAR U_5703 +ENCODING 22275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8A40 +FFC0 +A940 +BF40 +A940 +BF40 +A940 +AB40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5704 +ENCODING 22276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +BE40 +9240 +FF40 +9240 +9E40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5705 +ENCODING 22277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +1200 +0C00 +FF80 +A280 +9480 +BE80 +8880 +BE80 +8880 +FF80 +ENDCHAR +STARTCHAR U_5706 +ENCODING 22278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +BFA0 +A0A0 +A4A0 +A4A0 +8A20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_5707 +ENCODING 22279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8A20 +9120 +AEA0 +8020 +BFA0 +AAA0 +BFA0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_5708 +ENCODING 22280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9520 +BFA0 +8820 +BFA0 +9120 +BEE0 +D2A0 +9FA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5709 +ENCODING 22281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +9F20 +8420 +BFA0 +8A20 +9F20 +8420 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_570A +ENCODING 22282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +9120 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_570B +ENCODING 22283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8540 +FFC0 +8440 +F540 +D540 +F640 +8540 +FB40 +8140 +FFC0 +ENDCHAR +STARTCHAR U_570C +ENCODING 22284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +A4A0 +BFA0 +8020 +BFA0 +8420 +BFA0 +AAA0 +ABA0 +FFE0 +ENDCHAR +STARTCHAR U_570D +ENCODING 22285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BE40 +9240 +BF40 +9240 +BF40 +A440 +FF40 +8440 +FFC0 +ENDCHAR +STARTCHAR U_570E +ENCODING 22286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +8020 +9F20 +9120 +9F20 +9120 +9F20 +A0A0 +FFE0 +ENDCHAR +STARTCHAR U_570F +ENCODING 22287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9520 +BFA0 +8820 +BFA0 +9120 +AEA0 +C960 +8F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5710 +ENCODING 22288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFA0 +8420 +BFA0 +8820 +8F20 +9120 +A320 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5711 +ENCODING 22289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8520 +FFE0 +A4A0 +BFA0 +A4A0 +8120 +FFE0 +9120 +8320 +FFE0 +ENDCHAR +STARTCHAR U_5712 +ENCODING 22290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BE40 +8840 +FF40 +A240 +BEC0 +9540 +F240 +9140 +FFC0 +ENDCHAR +STARTCHAR U_5713 +ENCODING 22291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +A0A0 +BFA0 +A0A0 +BFA0 +A0A0 +BFA0 +E0E0 +FFE0 +ENDCHAR +STARTCHAR U_5714 +ENCODING 22292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +9F20 +8420 +BFA0 +8920 +9EA0 +8020 +BFA0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_5715 +ENCODING 22293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +84A0 +FFE0 +84A0 +BFA0 +9120 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_5716 +ENCODING 22294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9F20 +8420 +FFE0 +AAA0 +AEA0 +A0A0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5717 +ENCODING 22295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +8420 +FFE0 +AAA0 +AEA0 +AAA0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5718 +ENCODING 22296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +FFE0 +A4A0 +BFA0 +A4A0 +BFA0 +8260 +FFA0 +9220 +FFE0 +ENDCHAR +STARTCHAR U_5719 +ENCODING 22297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +A0A0 +DF60 +8820 +BFA0 +AAA0 +AEA0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_571A +ENCODING 22298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +A4A0 +FFE0 +9120 +9F20 +9120 +9F20 +B1A0 +FFE0 +ENDCHAR +STARTCHAR U_571B +ENCODING 22299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFA0 +8420 +9F20 +8420 +BFA0 +8A20 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_571C +ENCODING 22300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8AA0 +9920 +ACA0 +FFE0 +ENDCHAR +STARTCHAR U_571D +ENCODING 22301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +DF60 +A1E0 +DEA0 +D160 +FFE0 +AAA0 +DF60 +8020 +FFE0 +ENDCHAR +STARTCHAR U_571E +ENCODING 22302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +DF60 +A0A0 +FFE0 +AAA0 +D560 +FFE0 +9520 +A4A0 +FFE0 +ENDCHAR +STARTCHAR U_571F +ENCODING 22303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +7FC0 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5720 +ENCODING 22304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2200 +FA00 +2200 +2200 +2200 +3A00 +C220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5721 +ENCODING 22305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0400 +0400 +0400 +7FC0 +0400 +0600 +0580 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5722 +ENCODING 22306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +F880 +2080 +2080 +2080 +3880 +E080 +0280 +0100 +ENDCHAR +STARTCHAR U_5723 +ENCODING 22307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1080 +0900 +0600 +1980 +E460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5724 +ENCODING 22308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +2200 +2200 +FB00 +2280 +2240 +2240 +2200 +3A00 +C200 +0200 +ENDCHAR +STARTCHAR U_5725 +ENCODING 22309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +1100 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5726 +ENCODING 22310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +2200 +2200 +FA00 +2200 +2200 +2500 +3500 +C880 +1060 +2040 +ENDCHAR +STARTCHAR U_5727 +ENCODING 22311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2200 +2200 +2200 +2FC0 +2200 +2200 +2200 +4200 +5FE0 +8000 +ENDCHAR +STARTCHAR U_5728 +ENCODING 22312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +1000 +2200 +6200 +AF80 +2200 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5729 +ENCODING 22313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +F100 +2FE0 +2100 +2100 +3100 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_572A +ENCODING 22314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2400 +F800 +27C0 +2080 +2100 +3A00 +E420 +0420 +03E0 +ENDCHAR +STARTCHAR U_572B +ENCODING 22315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2E00 +2200 +2200 +FBE0 +2E00 +2200 +2A00 +3200 +E220 +01E0 +ENDCHAR +STARTCHAR U_572C +ENCODING 22316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +2000 +FFE0 +2200 +2200 +27E0 +3820 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_572D +ENCODING 22317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +7F80 +0800 +FFC0 +0000 +0800 +7F80 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_572E +ENCODING 22318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +2020 +F820 +27E0 +2420 +2400 +2400 +3C20 +E420 +03E0 +ENDCHAR +STARTCHAR U_572F +ENCODING 22319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2420 +FC20 +27E0 +2420 +2400 +3C00 +E420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5730 +ENCODING 22320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +2540 +F5C0 +2740 +2D40 +2540 +25C0 +3520 +C420 +03E0 +ENDCHAR +STARTCHAR U_5731 +ENCODING 22321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2100 +2100 +F900 +27C0 +2100 +2100 +4100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_5732 +ENCODING 22322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F900 +2100 +2FE0 +2100 +3900 +E100 +0100 +0100 +ENDCHAR +STARTCHAR U_5733 +ENCODING 22323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2520 +2520 +FD20 +2520 +2520 +2520 +3D20 +C920 +1020 +2020 +ENDCHAR +STARTCHAR U_5734 +ENCODING 22324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2220 +FC20 +2220 +2120 +2120 +3820 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_5735 +ENCODING 22325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2200 +2200 +FBC0 +2200 +2200 +2200 +3A00 +E200 +0FE0 +ENDCHAR +STARTCHAR U_5736 +ENCODING 22326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1100 +E4E0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5737 +ENCODING 22327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +2100 +F900 +2180 +2140 +2140 +3900 +C100 +0100 +ENDCHAR +STARTCHAR U_5738 +ENCODING 22328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +2520 +FD20 +2520 +2520 +2520 +3D20 +C7E0 +0420 +ENDCHAR +STARTCHAR U_5739 +ENCODING 22329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC00 +2400 +2400 +2400 +3C00 +C400 +0800 +1000 +ENDCHAR +STARTCHAR U_573A +ENCODING 22330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2080 +2100 +F200 +2FE0 +22A0 +24A0 +3920 +C220 +0C20 +00C0 +ENDCHAR +STARTCHAR U_573B +ENCODING 22331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +23E0 +2240 +2240 +3C40 +E440 +0840 +1040 +ENDCHAR +STARTCHAR U_573C +ENCODING 22332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +2080 +3F80 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_573D +ENCODING 22333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2520 +2960 +2260 +24A0 +2120 +3220 +C4A0 +0040 +ENDCHAR +STARTCHAR U_573E +ENCODING 22334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2240 +FA80 +22E0 +2220 +2420 +3540 +C880 +1140 +2620 +ENDCHAR +STARTCHAR U_573F +ENCODING 22335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +2AA0 +2280 +2280 +3A80 +C280 +0480 +0880 +ENDCHAR +STARTCHAR U_5740 +ENCODING 22336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +25E0 +2500 +2500 +2500 +3D00 +C500 +1FE0 +ENDCHAR +STARTCHAR U_5741 +ENCODING 22337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +FC80 +27E0 +2480 +2480 +3C80 +E5A0 +0660 +0C20 +ENDCHAR +STARTCHAR U_5742 +ENCODING 22338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +2400 +FC00 +27E0 +2520 +2540 +3D40 +C480 +0940 +1620 +ENDCHAR +STARTCHAR U_5743 +ENCODING 22339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2000 +2000 +FFE0 +2280 +2280 +2A80 +3480 +C4A0 +08E0 +1000 +ENDCHAR +STARTCHAR U_5744 +ENCODING 22340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +2480 +F4E0 +2800 +2780 +2480 +3280 +C100 +0280 +1C60 +ENDCHAR +STARTCHAR U_5745 +ENCODING 22341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +F440 +2920 +2080 +27E0 +3840 +C080 +0080 +0100 +ENDCHAR +STARTCHAR U_5746 +ENCODING 22342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2440 +2A40 +2280 +2280 +2100 +3A80 +C460 +1840 +ENDCHAR +STARTCHAR U_5747 +ENCODING 22343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +27E0 +F020 +2420 +2220 +28A0 +3120 +C620 +0020 +00C0 +ENDCHAR +STARTCHAR U_5748 +ENCODING 22344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +F000 +2780 +2480 +2480 +3480 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_5749 +ENCODING 22345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F100 +2540 +2540 +27C0 +3900 +C120 +0120 +00E0 +ENDCHAR +STARTCHAR U_574A +ENCODING 22346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FA00 +23C0 +2240 +2240 +3A40 +C240 +0440 +1980 +ENDCHAR +STARTCHAR U_574B +ENCODING 22347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2240 +FC20 +2800 +27E0 +2220 +3A20 +C220 +0420 +18C0 +ENDCHAR +STARTCHAR U_574C +ENCODING 22348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +5FC0 +88A0 +0880 +1280 +6500 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_574D +ENCODING 22349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2640 +FD40 +2440 +2FE0 +2440 +3C40 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_574E +ENCODING 22350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +2140 +2100 +2100 +3A80 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_574F +ENCODING 22351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2080 +F880 +2100 +2180 +2340 +3520 +C920 +0100 +0100 +ENDCHAR +STARTCHAR U_5750 +ENCODING 22352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +2480 +5540 +8E20 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5751 +ENCODING 22353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2780 +2480 +2480 +3C80 +E4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_5752 +ENCODING 22354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4240 +7A80 +4320 +5A20 +E1E0 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5753 +ENCODING 22355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +7FC0 +0900 +FFE0 +1100 +2500 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5754 +ENCODING 22356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0460 +F580 +1600 +2580 +D460 +0800 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5755 +ENCODING 22357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2900 +2900 +2880 +4460 +8400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5756 +ENCODING 22358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +1200 +1220 +21E0 +C400 +3FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5757 +ENCODING 22359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F940 +2140 +2140 +2FE0 +3100 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_5758 +ENCODING 22360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +FA00 +23C0 +2440 +2440 +2780 +3880 +C080 +0FE0 +ENDCHAR +STARTCHAR U_5759 +ENCODING 22361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2480 +4480 +4900 +2480 +2480 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_575A +ENCODING 22362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +5440 +5280 +5100 +5280 +1460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_575B +ENCODING 22363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +F000 +2FE0 +2100 +2200 +3200 +C440 +1FE0 +0820 +ENDCHAR +STARTCHAR U_575C +ENCODING 22364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2480 +FC80 +27E0 +24A0 +24A0 +3CA0 +C520 +0AA0 +1440 +ENDCHAR +STARTCHAR U_575D +ENCODING 22365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2520 +FD20 +2520 +2520 +2520 +3D20 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_575E +ENCODING 22366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FC40 +2580 +2400 +27E0 +3820 +E7A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_575F +ENCODING 22367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2440 +2280 +2280 +3900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_5760 +ENCODING 22368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +9100 +A100 +9280 +D440 +A820 +8400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5761 +ENCODING 22369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +FCA0 +2480 +27C0 +2D40 +3540 +E480 +0940 +1620 +ENDCHAR +STARTCHAR U_5762 +ENCODING 22370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +F900 +27C0 +2100 +3900 +EFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5763 +ENCODING 22371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +1480 +7FE0 +4020 +8440 +3F80 +0400 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5764 +ENCODING 22372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F920 +2FE0 +2920 +2FE0 +3920 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_5765 +ENCODING 22373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +FFC0 +2440 +2440 +27C0 +2440 +3C40 +C440 +1FE0 +ENDCHAR +STARTCHAR U_5766 +ENCODING 22374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +2440 +FFC0 +2440 +2440 +27C0 +3800 +C000 +0FE0 +ENDCHAR +STARTCHAR U_5767 +ENCODING 22375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +F200 +2400 +27C0 +2C40 +2440 +3440 +E7C0 +0440 +ENDCHAR +STARTCHAR U_5768 +ENCODING 22376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC20 +2200 +2240 +2280 +3B00 +C220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5769 +ENCODING 22377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2FE0 +F440 +2440 +27C0 +2440 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_576A +ENCODING 22378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2920 +F520 +2540 +2100 +2FE0 +3100 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_576B +ENCODING 22379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21E0 +F900 +2100 +27E0 +2420 +3C20 +E420 +07E0 +0420 +ENDCHAR +STARTCHAR U_576C +ENCODING 22380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +2F80 +2A80 +FA80 +2A80 +2A80 +2A40 +3A40 +CAC0 +13A0 +24A0 +ENDCHAR +STARTCHAR U_576D +ENCODING 22381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2420 +FFE0 +2500 +2520 +2540 +3D80 +C520 +0920 +10E0 +ENDCHAR +STARTCHAR U_576E +ENCODING 22382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2200 +F440 +27E0 +2000 +27C0 +3C40 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_576F +ENCODING 22383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +F900 +2380 +2540 +2920 +3920 +E100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5770 +ENCODING 22384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +FAA0 +2AA0 +2AA0 +2BA0 +3AA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5771 +ENCODING 22385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F540 +2540 +2540 +2FE0 +3900 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_5772 +ENCODING 22386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +F2A0 +2FE0 +2A80 +2FE0 +32A0 +C4E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5773 +ENCODING 22387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +25E0 +FAA0 +2EA0 +24A0 +24A0 +3BA0 +CCA0 +0120 +0260 +ENDCHAR +STARTCHAR U_5774 +ENCODING 22388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +2080 +C460 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5775 +ENCODING 22389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +23E0 +2240 +2240 +2240 +3A40 +C240 +07E0 +ENDCHAR +STARTCHAR U_5776 +ENCODING 22390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +2540 +F440 +2FE0 +2640 +2540 +3C40 +C7E0 +0040 +0180 +ENDCHAR +STARTCHAR U_5777 +ENCODING 22391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2040 +2040 +F740 +2540 +2540 +2740 +3540 +C040 +0040 +01C0 +ENDCHAR +STARTCHAR U_5778 +ENCODING 22392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +2200 +27C0 +F840 +2F40 +2940 +2940 +2F40 +3040 +C140 +0080 +ENDCHAR +STARTCHAR U_5779 +ENCODING 22393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +2FE0 +2820 +FAA0 +2280 +2280 +3280 +C440 +0440 +0820 +ENDCHAR +STARTCHAR U_577A +ENCODING 22394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +2240 +2FE0 +2200 +F3C0 +2240 +2240 +2540 +3480 +C940 +1260 +ENDCHAR +STARTCHAR U_577B +ENCODING 22395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +FC80 +27E0 +2480 +2480 +3C80 +E540 +06A0 +00A0 +ENDCHAR +STARTCHAR U_577C +ENCODING 22396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +2400 +FFE0 +2480 +2580 +24C0 +3CA0 +C4A0 +0880 +1080 +ENDCHAR +STARTCHAR U_577D +ENCODING 22397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +2080 +27E0 +2040 +3A80 +C100 +0080 +0080 +ENDCHAR +STARTCHAR U_577E +ENCODING 22398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +7420 +2000 +23C0 +2880 +3080 +C080 +4280 +0100 +ENDCHAR +STARTCHAR U_577F +ENCODING 22399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +4440 +EBE0 +5840 +4A40 +4940 +6940 +4840 +8940 +0880 +ENDCHAR +STARTCHAR U_5780 +ENCODING 22400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2520 +FB40 +2100 +2FE0 +2100 +3900 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_5781 +ENCODING 22401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23C0 +F500 +2900 +2FE0 +2100 +2100 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_5782 +ENCODING 22402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +2480 +FFE0 +2480 +2480 +FFE0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5783 +ENCODING 22403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F800 +2440 +2440 +2240 +3A40 +C280 +0080 +0FE0 +ENDCHAR +STARTCHAR U_5784 +ENCODING 22404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +FFE0 +1480 +1520 +2620 +5BE0 +8400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5785 +ENCODING 22405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FA00 +2FE0 +2500 +2540 +2540 +3D80 +C520 +0920 +12E0 +ENDCHAR +STARTCHAR U_5786 +ENCODING 22406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2100 +FFE0 +2420 +2420 +27E0 +3C20 +C400 +0800 +1000 +ENDCHAR +STARTCHAR U_5787 +ENCODING 22407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5CE0 +54A0 +54A0 +F4A0 +57A0 +54A0 +5020 +7020 +9FE0 +1020 +ENDCHAR +STARTCHAR U_5788 +ENCODING 22408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +6FE0 +A200 +21A0 +2460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5789 +ENCODING 22409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +5040 +EF40 +4940 +4940 +4F40 +5940 +6880 +C820 +07E0 +ENDCHAR +STARTCHAR U_578A +ENCODING 22410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4FC0 +E900 +4900 +4FE0 +4900 +6900 +4AA0 +8CA0 +0860 +ENDCHAR +STARTCHAR U_578B +ENCODING 22411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +2940 +2940 +FF40 +2940 +2840 +4CC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_578C +ENCODING 22412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +F820 +2BA0 +2AA0 +2BA0 +3AA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_578D +ENCODING 22413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +27E0 +FC20 +2420 +27E0 +2420 +3FE0 +C420 +0420 +07E0 +ENDCHAR +STARTCHAR U_578E +ENCODING 22414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2440 +FA80 +2100 +2280 +2C60 +37C0 +C440 +0440 +07C0 +ENDCHAR +STARTCHAR U_578F +ENCODING 22415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +2140 +27C0 +2100 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5790 +ENCODING 22416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +87C0 +5440 +2A80 +D300 +4480 +5860 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5791 +ENCODING 22417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2440 +FA80 +2300 +2D00 +23E0 +3C40 +C280 +0100 +0E00 +ENDCHAR +STARTCHAR U_5792 +ENCODING 22418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7F40 +2080 +5140 +EBA0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5793 +ENCODING 22419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FA40 +2480 +2320 +2240 +3C80 +C140 +0220 +0C20 +ENDCHAR +STARTCHAR U_5794 +ENCODING 22420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +4440 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5795 +ENCODING 22421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4000 +7FC0 +4000 +5F80 +5080 +9F80 +0400 +3F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_5796 +ENCODING 22422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +23E0 +FA20 +2220 +23E0 +2200 +3BE0 +C220 +0220 +03E0 +ENDCHAR +STARTCHAR U_5797 +ENCODING 22423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2AA0 +F6C0 +2280 +26C0 +2AA0 +3280 +C4A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5798 +ENCODING 22424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +24A0 +F7E0 +2C80 +2480 +2480 +3540 +C540 +0520 +0620 +ENDCHAR +STARTCHAR U_5799 +ENCODING 22425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +F100 +2FE0 +2280 +2280 +3A80 +C2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_579A +ENCODING 22426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +0400 +FFE0 +0000 +2080 +FBE0 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_579B +ENCODING 22427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +2280 +FCE0 +2100 +2100 +2FE0 +3100 +C580 +0940 +1120 +ENDCHAR +STARTCHAR U_579C +ENCODING 22428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2280 +22E0 +FA20 +24A0 +2940 +2FE0 +3380 +C540 +1920 +0100 +ENDCHAR +STARTCHAR U_579D +ENCODING 22429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFE0 +2400 +25E0 +2520 +3D60 +C500 +0920 +10E0 +ENDCHAR +STARTCHAR U_579E +ENCODING 22430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F820 +20C0 +2700 +2100 +39E0 +C700 +0120 +00E0 +ENDCHAR +STARTCHAR U_579F +ENCODING 22431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +F100 +2100 +27C0 +2100 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57A0 +ENCODING 22432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2520 +2540 +3C80 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_57A1 +ENCODING 22433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +7FE0 +A440 +2280 +2320 +3CE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57A2 +ENCODING 22434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +F400 +27E0 +2400 +27E0 +3620 +CA20 +0BE0 +1220 +ENDCHAR +STARTCHAR U_57A3 +ENCODING 22435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +2440 +27C0 +2440 +37C0 +C440 +0000 +0FE0 +ENDCHAR +STARTCHAR U_57A4 +ENCODING 22436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2200 +F440 +27A0 +2100 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57A5 +ENCODING 22437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F820 +27C0 +2000 +27C0 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_57A6 +ENCODING 22438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7FA0 +4940 +F080 +0460 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57A7 +ENCODING 22439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +2FE0 +F820 +2BA0 +2AA0 +2AA0 +3BA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_57A8 +ENCODING 22440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +F820 +2080 +27E0 +2080 +3480 +C280 +0080 +0180 +ENDCHAR +STARTCHAR U_57A9 +ENCODING 22441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +4940 +2980 +0900 +FFE0 +0400 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57AA +ENCODING 22442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +FA80 +2280 +2FE0 +2280 +3280 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_57AB +ENCODING 22443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FF80 +2280 +36A0 +E3A0 +2CE0 +6400 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57AC +ENCODING 22444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +27E0 +FA40 +2240 +2240 +2FE0 +3000 +C240 +0420 +0820 +ENDCHAR +STARTCHAR U_57AD +ENCODING 22445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2280 +F2A0 +2AA0 +26C0 +2280 +3280 +C280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_57AE +ENCODING 22446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +FBA0 +2000 +2FE0 +2200 +3BC0 +E040 +0240 +0180 +ENDCHAR +STARTCHAR U_57AF +ENCODING 22447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2880 +2480 +23E0 +FC80 +2480 +2540 +2620 +3420 +CA00 +11E0 +ENDCHAR +STARTCHAR U_57B0 +ENCODING 22448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21C0 +F900 +27E0 +2000 +27E0 +3100 +C140 +0120 +0100 +ENDCHAR +STARTCHAR U_57B1 +ENCODING 22449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2920 +2540 +F100 +27E0 +2020 +2020 +23E0 +3020 +C020 +07E0 +ENDCHAR +STARTCHAR U_57B2 +ENCODING 22450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +2FE0 +F000 +2FE0 +2020 +2FE0 +3800 +C800 +0820 +07E0 +ENDCHAR +STARTCHAR U_57B3 +ENCODING 22451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +24E0 +2800 +F200 +25E0 +2C40 +2440 +2440 +3440 +C440 +04C0 +ENDCHAR +STARTCHAR U_57B4 +ENCODING 22452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2280 +2AA0 +2920 +3AA0 +CAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_57B5 +ENCODING 22453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F520 +2100 +2FE0 +2240 +3A40 +E180 +0140 +0E20 +ENDCHAR +STARTCHAR U_57B6 +ENCODING 22454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2280 +2FE0 +2100 +37C0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_57B7 +ENCODING 22455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2440 +27C0 +3280 +C280 +04A0 +0860 +ENDCHAR +STARTCHAR U_57B8 +ENCODING 22456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +F7C0 +2000 +2FE0 +2280 +3280 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_57B9 +ENCODING 22457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +44A0 +5FA0 +E4A0 +4EC0 +44A0 +5FA0 +64A0 +84E0 +0880 +1080 +ENDCHAR +STARTCHAR U_57BA +ENCODING 22458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +F280 +27E0 +2040 +2080 +37E0 +C080 +0080 +0380 +ENDCHAR +STARTCHAR U_57BB +ENCODING 22459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +FC20 +2420 +27E0 +2420 +37E0 +C240 +0420 +0820 +ENDCHAR +STARTCHAR U_57BC +ENCODING 22460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +44E0 +9800 +2FC0 +6480 +A300 +2CE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57BD +ENCODING 22461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +A400 +57E0 +1480 +2480 +C880 +5080 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57BE +ENCODING 22462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2000 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57BF +ENCODING 22463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2800 +FFE0 +2940 +2880 +2FE0 +38A0 +C880 +1280 +2100 +ENDCHAR +STARTCHAR U_57C0 +ENCODING 22464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +75C0 +1520 +F5E0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57C1 +ENCODING 22465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +2FE0 +F100 +2280 +2540 +2920 +37C0 +C080 +0100 +0200 +ENDCHAR +STARTCHAR U_57C2 +ENCODING 22466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +F920 +2FE0 +2920 +2FE0 +3500 +C200 +0500 +18E0 +ENDCHAR +STARTCHAR U_57C3 +ENCODING 22467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +2FA0 +F400 +27C0 +2900 +2100 +3FE0 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_57C4 +ENCODING 22468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2A80 +F100 +2EE0 +2100 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57C5 +ENCODING 22469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +6200 +53C0 +5240 +6540 +4880 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57C6 +ENCODING 22470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2880 +FFE0 +2920 +2FE0 +2920 +3FE0 +C920 +0920 +1060 +ENDCHAR +STARTCHAR U_57C7 +ENCODING 22471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +C920 +0920 +0860 +ENDCHAR +STARTCHAR U_57C8 +ENCODING 22472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2240 +27E0 +FA40 +2520 +23E0 +3640 +C980 +0240 +0C20 +ENDCHAR +STARTCHAR U_57C9 +ENCODING 22473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +5FE0 +E200 +4A40 +4A40 +56A0 +6200 +C500 +0880 +1060 +ENDCHAR +STARTCHAR U_57CA +ENCODING 22474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +74C0 +2500 +C8E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57CB +ENCODING 22475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2540 +FFC0 +2540 +27C0 +2100 +3FC0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57CC +ENCODING 22476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +2440 +27C0 +2520 +3D40 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_57CD +ENCODING 22477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +F800 +27E0 +2420 +3FE0 +E420 +47E0 +0420 +0460 +ENDCHAR +STARTCHAR U_57CE +ENCODING 22478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +4FE0 +F880 +4EA0 +4AA0 +5AC0 +6A80 +D6A0 +1160 +2220 +ENDCHAR +STARTCHAR U_57CF +ENCODING 22479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +45C0 +4440 +E960 +4D40 +4540 +4540 +75E0 +CC00 +1200 +21E0 +ENDCHAR +STARTCHAR U_57D0 +ENCODING 22480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4040 +47C0 +E040 +5FE0 +5020 +4FC0 +6480 +8300 +0CC0 +3020 +ENDCHAR +STARTCHAR U_57D1 +ENCODING 22481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +13E0 +1E80 +F280 +1480 +3880 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57D2 +ENCODING 22482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +2520 +FAC0 +2040 +2FE0 +2440 +3A40 +C240 +0040 +00C0 +ENDCHAR +STARTCHAR U_57D3 +ENCODING 22483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +24A0 +F2C0 +2340 +2C40 +27E0 +3040 +C440 +0240 +00C0 +ENDCHAR +STARTCHAR U_57D4 +ENCODING 22484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +F100 +2FE0 +2920 +2FE0 +3920 +CFE0 +0920 +0860 +ENDCHAR +STARTCHAR U_57D5 +ENCODING 22485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F7C0 +2000 +2FE0 +2100 +37C0 +E100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57D6 +ENCODING 22486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +2480 +2200 +FA80 +24A0 +2CC0 +2580 +3680 +C4A0 +0460 +ENDCHAR +STARTCHAR U_57D7 +ENCODING 22487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +25C0 +F500 +2FE0 +2100 +2520 +3540 +C980 +0100 +0E00 +ENDCHAR +STARTCHAR U_57D8 +ENCODING 22488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2E40 +2A40 +FBE0 +2A40 +2F40 +2AC0 +2A40 +3A40 +CE40 +00C0 +ENDCHAR +STARTCHAR U_57D9 +ENCODING 22489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F000 +2FE0 +2820 +2920 +3920 +C920 +0280 +0C60 +ENDCHAR +STARTCHAR U_57DA +ENCODING 22490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F7C0 +2100 +2FE0 +2920 +3AA0 +CC60 +0820 +0860 +ENDCHAR +STARTCHAR U_57DB +ENCODING 22491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +2AA0 +FC60 +2BA0 +2AA0 +2BA0 +3820 +C8A0 +0840 +ENDCHAR +STARTCHAR U_57DC +ENCODING 22492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +3080 +69C0 +A2A0 +2480 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57DD +ENCODING 22493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2A40 +F120 +2FC0 +2080 +2100 +32C0 +CA20 +0A60 +11C0 +ENDCHAR +STARTCHAR U_57DE +ENCODING 22494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2820 +F000 +2FC0 +2200 +2BC0 +3A00 +CA00 +0E00 +11E0 +ENDCHAR +STARTCHAR U_57DF +ENCODING 22495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +F080 +2EA0 +2AA0 +2EC0 +3080 +C6A0 +1960 +0220 +ENDCHAR +STARTCHAR U_57E0 +ENCODING 22496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +F7C0 +2400 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_57E1 +ENCODING 22497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2280 +FEE0 +2820 +2820 +2820 +3EE0 +E280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_57E2 +ENCODING 22498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +F100 +2FE0 +2440 +2FA0 +3C80 +E5A0 +0420 +03E0 +ENDCHAR +STARTCHAR U_57E3 +ENCODING 22499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F440 +2AA0 +2920 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_57E4 +ENCODING 22500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2920 +FFE0 +2920 +2FE0 +2AA0 +3480 +CFE0 +0080 +0080 +ENDCHAR +STARTCHAR U_57E5 +ENCODING 22501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2100 +2FE0 +2440 +3FC0 +C440 +07C0 +04C0 +ENDCHAR +STARTCHAR U_57E6 +ENCODING 22502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FA40 +27E0 +29A0 +36A0 +22E0 +3A80 +C4A0 +1860 +ENDCHAR +STARTCHAR U_57E7 +ENCODING 22503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +F840 +2FC0 +2840 +2FC0 +3840 +CFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_57E8 +ENCODING 22504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4300 +4480 +F840 +5720 +4000 +4FE0 +4AA0 +7FE0 +CAA0 +0AA0 +ENDCHAR +STARTCHAR U_57E9 +ENCODING 22505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2140 +2FE0 +2140 +37C0 +C100 +0100 +0300 +ENDCHAR +STARTCHAR U_57EA +ENCODING 22506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4100 +4FE0 +4820 +F280 +4440 +4000 +47C0 +7100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_57EB +ENCODING 22507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +FFE0 +2820 +2BA0 +2AA0 +3AA0 +EBA0 +0820 +0840 +ENDCHAR +STARTCHAR U_57EC +ENCODING 22508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +E580 +0940 +1120 +ENDCHAR +STARTCHAR U_57ED +ENCODING 22509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +2140 +FFE0 +2140 +2FE0 +2540 +3380 +C540 +1920 +0300 +ENDCHAR +STARTCHAR U_57EE +ENCODING 22510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2540 +2900 +F280 +2D60 +2120 +2540 +3580 +C900 +0280 +0C60 +ENDCHAR +STARTCHAR U_57EF +ENCODING 22511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F540 +2FE0 +2540 +27C0 +3D40 +E7C0 +0120 +00E0 +ENDCHAR +STARTCHAR U_57F0 +ENCODING 22512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2A20 +F540 +2100 +2FE0 +2100 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_57F1 +ENCODING 22513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +45E0 +46A0 +E4A0 +5FA0 +44A0 +46A0 +6DA0 +D440 +24A0 +0D20 +ENDCHAR +STARTCHAR U_57F2 +ENCODING 22514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2200 +2FE0 +3540 +CBA0 +0100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_57F3 +ENCODING 22515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2440 +F880 +22E0 +2C20 +2820 +3EE0 +C820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_57F4 +ENCODING 22516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2440 +27C0 +2440 +3F40 +C5C0 +0440 +1FE0 +ENDCHAR +STARTCHAR U_57F5 +ENCODING 22517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +FFE0 +2540 +2FE0 +2540 +3540 +CFE0 +0100 +07C0 +ENDCHAR +STARTCHAR U_57F6 +ENCODING 22518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +13C0 +FD40 +2940 +5740 +9140 +79C0 +1240 +FC60 +0420 +ENDCHAR +STARTCHAR U_57F7 +ENCODING 22519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27C0 +F940 +5540 +FB40 +2140 +F9C0 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_57F8 +ENCODING 22520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2200 +27E0 +3AA0 +C2A0 +0D20 +02C0 +ENDCHAR +STARTCHAR U_57F9 +ENCODING 22521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2280 +2FE0 +2000 +37C0 +C440 +0440 +07C0 +ENDCHAR +STARTCHAR U_57FA +ENCODING 22522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1D00 +1700 +1100 +FFE0 +2480 +DF60 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57FB +ENCODING 22523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F7C0 +2000 +27E0 +2080 +3FE0 +E100 +0500 +0200 +ENDCHAR +STARTCHAR U_57FC +ENCODING 22524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F440 +2FE0 +2040 +2740 +3D40 +C740 +0040 +01C0 +ENDCHAR +STARTCHAR U_57FD +ENCODING 22525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +27C0 +F040 +2FE0 +2920 +27C0 +3540 +C540 +05C0 +0100 +ENDCHAR +STARTCHAR U_57FE +ENCODING 22526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2620 +3D40 +2480 +3C80 +2560 +FE20 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57FF +ENCODING 22527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5A00 +2BC0 +CA20 +55E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5800 +ENCODING 22528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2820 +FFE0 +2880 +2AA0 +2BE0 +2880 +3AA0 +CAA0 +13E0 +ENDCHAR +STARTCHAR U_5801 +ENCODING 22529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +27C0 +2100 +27E0 +3900 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_5802 +ENCODING 22530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +8020 +BFA0 +2080 +3F80 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5803 +ENCODING 22531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4200 +7BC0 +4A40 +6A40 +9CC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5804 +ENCODING 22532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2820 +FEE0 +2820 +2820 +2FE0 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5805 +ENCODING 22533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A480 +FC80 +8A80 +F900 +A280 +F440 +0800 +7F80 +0800 +FFC0 +ENDCHAR +STARTCHAR U_5806 +ENCODING 22534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +27E0 +FC80 +27E0 +2480 +2480 +3FE0 +C480 +07E0 +0400 +ENDCHAR +STARTCHAR U_5807 +ENCODING 22535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +1200 +7F80 +4480 +FFC0 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_5808 +ENCODING 22536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2920 +FFE0 +2920 +2D60 +2D60 +3FE0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5809 +ENCODING 22537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2240 +FFA0 +2000 +27C0 +2440 +3FC0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_580A +ENCODING 22538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0900 +79E0 +4020 +79E0 +0900 +7FE0 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_580B +ENCODING 22539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +FEE0 +2AA0 +2AA0 +2EE0 +2AA0 +D2A0 +12A0 +2760 +ENDCHAR +STARTCHAR U_580C +ENCODING 22540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +FFE0 +2920 +2BA0 +2AA0 +3BA0 +CAA0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_580D +ENCODING 22541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2540 +2540 +27C0 +3300 +C5A0 +0920 +10E0 +ENDCHAR +STARTCHAR U_580E +ENCODING 22542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2440 +2A20 +23C0 +3E40 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_580F +ENCODING 22543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1100 +39E0 +5520 +92A0 +1440 +3FC0 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_5810 +ENCODING 22544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2900 +FFC0 +2900 +2FE0 +2900 +3FC0 +C900 +1100 +2FE0 +ENDCHAR +STARTCHAR U_5811 +ENCODING 22545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FDC0 +5100 +FDE0 +1140 +7A40 +1440 +0200 +3FC0 +0200 +7FE0 +ENDCHAR +STARTCHAR U_5812 +ENCODING 22546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +F840 +2FC0 +2900 +2960 +3F80 +E920 +0B20 +0CE0 +ENDCHAR +STARTCHAR U_5813 +ENCODING 22547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +27E0 +F000 +27E0 +2400 +35C0 +C480 +07E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5814 +ENCODING 22548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2440 +F920 +2100 +2FE0 +2100 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_5815 +ENCODING 22549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +A440 +CFC0 +A440 +A7C0 +E440 +84C0 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5816 +ENCODING 22550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +2A80 +FA80 +2540 +2FE0 +2AA0 +3920 +CAA0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5817 +ENCODING 22551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2FE0 +2820 +2240 +F5A0 +2140 +2FE0 +3100 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_5818 +ENCODING 22552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2680 +2FC0 +F200 +3FE0 +2500 +2880 +3260 +EF80 +0200 +1FE0 +ENDCHAR +STARTCHAR U_5819 +ENCODING 22553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +2AA0 +2FE0 +2100 +37C0 +C100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_581A +ENCODING 22554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5220 +EFC0 +4200 +4FC0 +4EC0 +4B40 +6FC0 +C200 +1FE0 +0200 +ENDCHAR +STARTCHAR U_581B +ENCODING 22555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +27C0 +2000 +2FE0 +3920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_581C +ENCODING 22556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2AA0 +2920 +2FE0 +3100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_581D +ENCODING 22557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2740 +F540 +2FE0 +2820 +2BA0 +3AA0 +CBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_581E +ENCODING 22558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +F5C0 +2400 +27E0 +2100 +3FE0 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_581F +ENCODING 22559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +4440 +4780 +E080 +5FE0 +4340 +4580 +7AC0 +C5A0 +02A0 +0D80 +ENDCHAR +STARTCHAR U_5820 +ENCODING 22560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27E0 +F500 +2DE0 +2680 +2480 +37E0 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_5821 +ENCODING 22561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +6200 +BFE0 +2A80 +3260 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5822 +ENCODING 22562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +4A20 +FBE0 +4880 +4FE0 +4880 +79C0 +CAA0 +0CA0 +0880 +ENDCHAR +STARTCHAR U_5823 +ENCODING 22563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +27C0 +2100 +2FE0 +3920 +C960 +0FA0 +0860 +ENDCHAR +STARTCHAR U_5824 +ENCODING 22564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2000 +2FE0 +3500 +C5C0 +0B00 +10E0 +ENDCHAR +STARTCHAR U_5825 +ENCODING 22565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +29E0 +1140 +7F40 +1480 +3140 +5220 +B200 +1FC0 +0200 +7FE0 +ENDCHAR +STARTCHAR U_5826 +ENCODING 22566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2960 +2F80 +F920 +2EE0 +2000 +27C0 +3440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5827 +ENCODING 22567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +FAA0 +2AA0 +2860 +2100 +3FE0 +C100 +0280 +0C60 +ENDCHAR +STARTCHAR U_5828 +ENCODING 22568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2200 +27E0 +3CA0 +C560 +07A0 +00C0 +ENDCHAR +STARTCHAR U_5829 +ENCODING 22569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4BE0 +4800 +EBE0 +4E20 +5BE0 +4A20 +7BE0 +8800 +0800 +0BE0 +ENDCHAR +STARTCHAR U_582A +ENCODING 22570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +FBC0 +2240 +23C0 +2240 +3FE0 +C540 +0620 +07E0 +ENDCHAR +STARTCHAR U_582B +ENCODING 22571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +2AA0 +FFE0 +2480 +2A40 +33A0 +2480 +3A80 +C100 +1EE0 +ENDCHAR +STARTCHAR U_582C +ENCODING 22572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +4BA0 +F000 +4EA0 +4AA0 +4EA0 +7AA0 +8EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_582D +ENCODING 22573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +F7C0 +2440 +2FE0 +2100 +3100 +C7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_582E +ENCODING 22574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +F000 +27C0 +2000 +2FE0 +3200 +E7C0 +0040 +0180 +ENDCHAR +STARTCHAR U_582F +ENCODING 22575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +7FC0 +2100 +FBC0 +2100 +FFE0 +0A00 +1220 +E1E0 +ENDCHAR +STARTCHAR U_5830 +ENCODING 22576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A40 +4BC0 +FA40 +4BC0 +4900 +4FE0 +7A40 +C980 +0A40 +0FE0 +ENDCHAR +STARTCHAR U_5831 +ENCODING 22577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7E20 +1220 +FEC0 +4600 +2BE0 +7E20 +1320 +FEC0 +12A0 +1320 +ENDCHAR +STARTCHAR U_5832 +ENCODING 22578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +4520 +7D20 +4960 +7500 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5833 +ENCODING 22579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +4FE0 +F800 +4BE0 +4A20 +4BE0 +7A20 +CBE0 +1220 +23E0 +ENDCHAR +STARTCHAR U_5834 +ENCODING 22580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2200 +37E0 +CAA0 +14A0 +0920 +02C0 +ENDCHAR +STARTCHAR U_5835 +ENCODING 22581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +27A0 +F940 +27E0 +2100 +3BE0 +E620 +0BE0 +1220 +03E0 +ENDCHAR +STARTCHAR U_5836 +ENCODING 22582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2200 +F7C0 +2880 +27E0 +2420 +3FE0 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_5837 +ENCODING 22583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +4FE0 +4000 +47C0 +7440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5838 +ENCODING 22584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +48A0 +4F20 +FA20 +4FA0 +4AA0 +4AA0 +7FA0 +CA20 +12A0 +2F60 +ENDCHAR +STARTCHAR U_5839 +ENCODING 22585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +FD40 +27C0 +2540 +27C0 +3900 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_583A +ENCODING 22586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4A40 +FFC0 +4A40 +4FC0 +4480 +4840 +74A0 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_583B +ENCODING 22587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +8FE0 +6240 +3FE0 +C200 +5FE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_583C +ENCODING 22588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +FE40 +1140 +7C40 +1940 +E480 +3FC0 +0400 +7FE0 +ENDCHAR +STARTCHAR U_583D +ENCODING 22589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +4AA0 +FFE0 +4000 +4FE0 +4100 +75C0 +C500 +0500 +1FE0 +ENDCHAR +STARTCHAR U_583E +ENCODING 22590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2200 +F780 +2200 +2FE0 +2480 +2FC0 +F7A0 +2480 +0780 +ENDCHAR +STARTCHAR U_583F +ENCODING 22591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +4FE0 +F880 +4F80 +48A0 +7EA0 +CAC0 +0EA0 +1160 +2220 +ENDCHAR +STARTCHAR U_5840 +ENCODING 22592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +FC40 +2A80 +2FE0 +2A80 +3FE0 +CA80 +1280 +2480 +ENDCHAR +STARTCHAR U_5841 +ENCODING 22593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2100 +1600 +2500 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5842 +ENCODING 22594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +4FC0 +E480 +5FE0 +4480 +4FC0 +74A0 +C780 +0420 +07E0 +ENDCHAR +STARTCHAR U_5843 +ENCODING 22595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +4100 +5FE0 +4400 +47C0 +4000 +6540 +C540 +0960 +ENDCHAR +STARTCHAR U_5844 +ENCODING 22596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +FFE0 +2100 +2FE0 +2200 +33C0 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_5845 +ENCODING 22597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45C0 +5940 +5160 +FE00 +51C0 +5D40 +5140 +5480 +7880 +D140 +1220 +ENDCHAR +STARTCHAR U_5846 +ENCODING 22598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +4D80 +5540 +EFC0 +4040 +4FC0 +4800 +6FC0 +C040 +01C0 +ENDCHAR +STARTCHAR U_5847 +ENCODING 22599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F820 +27C0 +2000 +27C0 +3C40 +C7C0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_5848 +ENCODING 22600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9500 +FFC0 +9100 +F340 +A540 +D8C0 +0800 +7F80 +0800 +FFC0 +ENDCHAR +STARTCHAR U_5849 +ENCODING 22601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D60 +2380 +2D60 +F280 +2FE0 +2440 +27C0 +3C40 +C7C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_584A +ENCODING 22602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2920 +FFE0 +2920 +2FE0 +2140 +33A0 +E5E0 +0920 +10E0 +ENDCHAR +STARTCHAR U_584B +ENCODING 22603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +55A0 +5AC0 +9080 +2940 +4620 +FFE0 +8420 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_584C +ENCODING 22604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +27C0 +3000 +2EE0 +3AA0 +C660 +0BA0 +0660 +ENDCHAR +STARTCHAR U_584D +ENCODING 22605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +57E0 +7200 +5FE0 +5540 +7920 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_584E +ENCODING 22606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +2920 +2280 +2440 +3FE0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_584F +ENCODING 22607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +F000 +2FE0 +2000 +27C0 +3440 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5850 +ENCODING 22608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4100 +EFE0 +4480 +4F00 +4240 +6FE0 +C100 +0940 +1320 +ENDCHAR +STARTCHAR U_5851 +ENCODING 22609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +11E0 +5520 +7DE0 +1220 +2C60 +4400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5852 +ENCODING 22610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2FE0 +2A40 +FBE0 +2E40 +2BE0 +2A40 +3F40 +CAC0 +0040 +00C0 +ENDCHAR +STARTCHAR U_5853 +ENCODING 22611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F440 +27C0 +2440 +27C0 +3900 +EFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_5854 +ENCODING 22612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2540 +FA80 +2440 +2BA0 +2000 +3FC0 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5855 +ENCODING 22613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4A40 +54A0 +FF40 +4000 +5EE0 +42A0 +6A60 +C6A0 +1B20 +0660 +ENDCHAR +STARTCHAR U_5856 +ENCODING 22614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4100 +5FE0 +E540 +5D60 +4540 +5D60 +6100 +C380 +0540 +1920 +ENDCHAR +STARTCHAR U_5857 +ENCODING 22615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +A840 +57A0 +2200 +5FC0 +CA80 +5240 +6620 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5858 +ENCODING 22616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4900 +FFC0 +4940 +4FE0 +7940 +CFC0 +0C40 +17C0 +2440 +ENDCHAR +STARTCHAR U_5859 +ENCODING 22617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F7C0 +2000 +2FE0 +2820 +3BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_585A +ENCODING 22618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F200 +2520 +2EC0 +3480 +CBC0 +06A0 +1880 +0300 +ENDCHAR +STARTCHAR U_585B +ENCODING 22619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +FAA0 +4FE0 +4100 +4FE0 +7100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_585C +ENCODING 22620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +47C0 +E000 +4FE0 +4640 +4B80 +6540 +CB40 +0520 +1B00 +ENDCHAR +STARTCHAR U_585D +ENCODING 22621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2920 +2FE0 +2200 +3BC0 +C240 +0540 +0880 +ENDCHAR +STARTCHAR U_585E +ENCODING 22622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +1100 +2480 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_585F +ENCODING 22623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1A00 +6B80 +1220 +E5E0 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5860 +ENCODING 22624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +4A00 +4BC0 +E240 +5BC0 +4A00 +4BC0 +4A40 +6BC0 +8800 +17E0 +ENDCHAR +STARTCHAR U_5861 +ENCODING 22625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +4400 +47E0 +F000 +4BC0 +4A40 +4BC0 +5A40 +6FE0 +C440 +0820 +ENDCHAR +STARTCHAR U_5862 +ENCODING 22626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +2400 +27E0 +2400 +3FE0 +C020 +0AA0 +1540 +ENDCHAR +STARTCHAR U_5863 +ENCODING 22627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A840 +5FC0 +2200 +CFC0 +4200 +5FE0 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5864 +ENCODING 22628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FE0 +F820 +2FE0 +2820 +2FE0 +3820 +CFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5865 +ENCODING 22629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +27C0 +2000 +2FE0 +3AA0 +CFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_5866 +ENCODING 22630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +5540 +67C0 +5540 +7FE0 +4100 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5867 +ENCODING 22631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +4FE0 +F000 +4440 +4820 +47C0 +4540 +7540 +C540 +0FE0 +ENDCHAR +STARTCHAR U_5868 +ENCODING 22632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +F480 +4FE0 +4A40 +5220 +6340 +CAA0 +12A0 +0600 +ENDCHAR +STARTCHAR U_5869 +ENCODING 22633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +5000 +EF80 +4880 +4F80 +4000 +5FC0 +7540 +D540 +3FE0 +ENDCHAR +STARTCHAR U_586A +ENCODING 22634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4F00 +4920 +F540 +4000 +4EE0 +4820 +4EE0 +6820 +C820 +0FE0 +ENDCHAR +STARTCHAR U_586B +ENCODING 22635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2440 +2740 +25C0 +3440 +EFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_586C +ENCODING 22636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4880 +4BE0 +FA20 +4BE0 +4A20 +4BE0 +7880 +CAC0 +14A0 +29A0 +ENDCHAR +STARTCHAR U_586D +ENCODING 22637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +27C0 +2000 +2FE0 +3AA0 +CAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_586E +ENCODING 22638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4E40 +4A40 +EFE0 +4A40 +4F40 +4AC0 +5E40 +6640 +CA40 +16C0 +ENDCHAR +STARTCHAR U_586F +ENCODING 22639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +48A0 +FAA0 +4F20 +4240 +4FE0 +7920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5870 +ENCODING 22640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +9540 +2FC0 +4A80 +CFC0 +4080 +0580 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5871 +ENCODING 22641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +8BE0 +FA20 +8BE0 +FA20 +94E0 +E400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5872 +ENCODING 22642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +4C40 +F7C0 +4440 +4FE0 +4400 +6FE0 +D2A0 +0D20 +06C0 +ENDCHAR +STARTCHAR U_5873 +ENCODING 22643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +57C0 +4A40 +E180 +5F60 +4900 +4BC0 +6900 +CFE0 +0900 +17E0 +ENDCHAR +STARTCHAR U_5874 +ENCODING 22644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +4000 +FEE0 +4AA0 +4EE0 +4AA0 +7EE0 +CAA0 +12A0 +2760 +ENDCHAR +STARTCHAR U_5875 +ENCODING 22645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +4940 +7FC0 +5240 +5FA0 +5220 +5FE0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5876 +ENCODING 22646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5280 +FFE0 +52A0 +5FE0 +54A0 +77C0 +D480 +15A0 +2660 +ENDCHAR +STARTCHAR U_5877 +ENCODING 22647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41E0 +4100 +EFE0 +4920 +4AA0 +4D60 +6AA0 +CD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5878 +ENCODING 22648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5000 +5380 +F280 +5380 +5000 +57C0 +7540 +D7C0 +1000 +1FE0 +ENDCHAR +STARTCHAR U_5879 +ENCODING 22649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +5540 +FE40 +1200 +3FC0 +0200 +FFE0 +ENDCHAR +STARTCHAR U_587A +ENCODING 22650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +5DC0 +6AA0 +4200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_587B +ENCODING 22651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFC0 +2440 +27C0 +2440 +3FE0 +C100 +0280 +1C60 +ENDCHAR +STARTCHAR U_587C +ENCODING 22652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +F7C0 +2D40 +27C0 +20A0 +3FE0 +C480 +0280 +0100 +ENDCHAR +STARTCHAR U_587D +ENCODING 22653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FBA0 +2540 +2BA0 +2540 +3BA0 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_587E +ENCODING 22654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +7940 +0740 +F940 +26C0 +FC20 +2420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_587F +ENCODING 22655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FC0 +4940 +FFE0 +4940 +4FC0 +4940 +7FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5880 +ENCODING 22656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +4FE0 +ED20 +5B40 +4D20 +4A80 +6BE0 +CC80 +17E0 +2080 +ENDCHAR +STARTCHAR U_5881 +ENCODING 22657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2AA0 +2AA0 +3FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5882 +ENCODING 22658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +FAA0 +4FE0 +4000 +47C0 +7000 +CFE0 +0540 +1B20 +ENDCHAR +STARTCHAR U_5883 +ENCODING 22659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2440 +27C0 +2440 +37C0 +C280 +04A0 +1860 +ENDCHAR +STARTCHAR U_5884 +ENCODING 22660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +5FE0 +F480 +57A0 +54A0 +5FA0 +7440 +DF40 +14A0 +2D20 +ENDCHAR +STARTCHAR U_5885 +ENCODING 22661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A940 +F880 +ABE0 +FCA0 +2080 +F980 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5886 +ENCODING 22662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5FE0 +4A80 +FBE0 +4000 +5FE0 +5120 +7FC0 +8940 +09C0 +0100 +ENDCHAR +STARTCHAR U_5887 +ENCODING 22663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2440 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5888 +ENCODING 22664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +4A80 +EFE0 +4AA0 +4EA0 +4AA0 +7FA0 +D4A0 +1B20 +1E60 +ENDCHAR +STARTCHAR U_5889 +ENCODING 22665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4940 +EFE0 +4940 +4FE0 +7920 +CFE0 +1920 +2FE0 +4920 +ENDCHAR +STARTCHAR U_588A +ENCODING 22666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +23C0 +F940 +5140 +FB40 +22C0 +FC20 +2420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_588B +ENCODING 22667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +27E0 +FAA0 +27E0 +2280 +2540 +3AA0 +C540 +0280 +0100 +ENDCHAR +STARTCHAR U_588C +ENCODING 22668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4800 +EA80 +4FE0 +4A80 +4A80 +6B80 +D000 +1AA0 +2AA0 +ENDCHAR +STARTCHAR U_588D +ENCODING 22669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A80 +7BE0 +4880 +7980 +52A0 +7460 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_588E +ENCODING 22670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5FA0 +4AA0 +EEC0 +40A0 +4EA0 +42A0 +64A0 +DEE0 +0480 +0C80 +ENDCHAR +STARTCHAR U_588F +ENCODING 22671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5240 +7580 +1D40 +F7E0 +5240 +94C0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5890 +ENCODING 22672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +FFE0 +4920 +4920 +4FE0 +7100 +C7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5891 +ENCODING 22673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2920 +2FE0 +2920 +3BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5892 +ENCODING 22674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2AA0 +2C60 +2BA0 +3AA0 +CBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5893 +ENCODING 22675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3F80 +2080 +3F80 +2080 +FFE0 +2480 +DF60 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5894 +ENCODING 22676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +4500 +F900 +4FE0 +5900 +4FC0 +7900 +CFC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5895 +ENCODING 22677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4200 +EBC0 +4A00 +5FE0 +4800 +4FC0 +4800 +6FE0 +C020 +1560 +ENDCHAR +STARTCHAR U_5896 +ENCODING 22678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4D80 +5740 +F040 +4FA0 +4880 +5FC0 +5240 +7FC0 +D240 +1FC0 +ENDCHAR +STARTCHAR U_5897 +ENCODING 22679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +4920 +EFE0 +4920 +4FE0 +47C0 +4440 +67C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_5898 +ENCODING 22680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +44E0 +FF00 +53E0 +5E40 +5280 +7E80 +C520 +1F20 +04E0 +ENDCHAR +STARTCHAR U_5899 +ENCODING 22681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4920 +F540 +4FE0 +4000 +4FE0 +7820 +CBA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_589A +ENCODING 22682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +5540 +4B60 +E540 +5940 +4AC0 +4900 +7FE0 +C580 +0940 +1120 +ENDCHAR +STARTCHAR U_589B +ENCODING 22683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E40 +5240 +5240 +FEE0 +5040 +56C0 +50C0 +7F40 +D540 +1540 +2CC0 +ENDCHAR +STARTCHAR U_589C +ENCODING 22684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFE0 +C220 +AD40 +A380 +ED40 +8320 +8400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_589D +ENCODING 22685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2440 +2EE0 +2440 +3FE0 +C280 +04A0 +1860 +ENDCHAR +STARTCHAR U_589E +ENCODING 22686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +F920 +2BA0 +2920 +2FE0 +2440 +37C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_589F +ENCODING 22687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +2FE0 +FAA0 +2F00 +2BE0 +2A80 +3AA0 +CEC0 +1280 +2FE0 +ENDCHAR +STARTCHAR U_58A0 +ENCODING 22688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2FE0 +F540 +27C0 +2540 +2FC0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_58A1 +ENCODING 22689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2100 +F7C0 +2100 +2FE0 +2280 +3FE0 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_58A2 +ENCODING 22690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EC0 +4AA0 +4440 +F860 +45C0 +5D40 +5220 +7DC0 +C540 +0480 +1B60 +ENDCHAR +STARTCHAR U_58A3 +ENCODING 22691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +F280 +2FE0 +2100 +27C0 +3100 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_58A4 +ENCODING 22692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4540 +EFE0 +4000 +47C0 +4440 +77C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_58A5 +ENCODING 22693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F100 +2FE0 +2540 +27C0 +3540 +CFE0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_58A6 +ENCODING 22694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +FFE0 +2540 +2920 +27C0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_58A7 +ENCODING 22695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +5FE0 +E480 +5FE0 +4480 +4FE0 +6BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_58A8 +ENCODING 22696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +7FC0 +0400 +3F80 +0400 +FFE0 +5540 +BFA0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58A9 +ENCODING 22697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +4AE0 +EFA0 +40A0 +5FA0 +42A0 +64A0 +DE40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_58AA +ENCODING 22698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +49E0 +7A40 +0940 +7D80 +1260 +3400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AB +ENCODING 22699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2B40 +FDC0 +2A40 +2FC0 +2840 +3FE0 +C880 +0480 +0180 +ENDCHAR +STARTCHAR U_58AC +ENCODING 22700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A480 +BFE0 +C220 +AD40 +A380 +ED40 +8520 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AD +ENCODING 22701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +4900 +EF40 +4AA0 +4F60 +5220 +6FC0 +CB40 +0B40 +1FE0 +ENDCHAR +STARTCHAR U_58AE +ENCODING 22702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A500 +A7E0 +CC40 +B7C0 +A440 +E7C0 +8440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AF +ENCODING 22703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2500 +77E0 +AC40 +B7C0 +2440 +27C0 +2440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58B0 +ENCODING 22704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +EAA0 +4FE0 +4640 +4540 +67C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_58B1 +ENCODING 22705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +2480 +F440 +2BA0 +2000 +27C0 +3C40 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_58B2 +ENCODING 22706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +5B40 +EB40 +5FE0 +4B40 +4B40 +7FE0 +C000 +12A0 +12A0 +ENDCHAR +STARTCHAR U_58B3 +ENCODING 22707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +FFE0 +2440 +27C0 +2440 +3FC0 +E440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_58B4 +ENCODING 22708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +FFE0 +4100 +4FC0 +4940 +6FC0 +C940 +0FC0 +1860 +ENDCHAR +STARTCHAR U_58B5 +ENCODING 22709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +4FE0 +4920 +F540 +4000 +47C0 +6000 +CFE0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_58B6 +ENCODING 22710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +4900 +E7E0 +4280 +5FE0 +4900 +6BC0 +C900 +1900 +27E0 +ENDCHAR +STARTCHAR U_58B7 +ENCODING 22711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4480 +FFE0 +4940 +5FE0 +4940 +5FE0 +6100 +CFC0 +0100 +ENDCHAR +STARTCHAR U_58B8 +ENCODING 22712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4480 +E240 +4FC0 +4280 +5FE0 +6440 +DFC0 +0440 +07C0 +ENDCHAR +STARTCHAR U_58B9 +ENCODING 22713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +EAA0 +4EE0 +4BA0 +4AA0 +6BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_58BA +ENCODING 22714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2D60 +FBA0 +2FE0 +2BA0 +2D60 +3920 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_58BB +ENCODING 22715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4540 +FBA0 +4FE0 +4000 +4FE0 +7820 +CBA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_58BC +ENCODING 22716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +F960 +AA00 +FFE0 +A940 +F8C0 +0520 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58BD +ENCODING 22717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +52E0 +FFA0 +52A0 +5EA0 +48A0 +7EA0 +CA40 +12A0 +2720 +ENDCHAR +STARTCHAR U_58BE +ENCODING 22718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +DA40 +53C0 +E240 +5BC0 +AAA0 +5340 +2420 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58BF +ENCODING 22719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +F100 +2FE0 +2280 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_58C0 +ENCODING 22720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +4A40 +4BE0 +EE00 +48A0 +49E0 +4E40 +6AE0 +DA40 +2E40 +0840 +ENDCHAR +STARTCHAR U_58C1 +ENCODING 22721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +67E0 +BC80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C2 +ENCODING 22722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FD60 +AA00 +FFE0 +A940 +FCC0 +AB20 +7FC0 +0200 +FFE0 +ENDCHAR +STARTCHAR U_58C3 +ENCODING 22723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4000 +4FC0 +E940 +5FE0 +4000 +4FE0 +6940 +CFC0 +0940 +1FE0 +ENDCHAR +STARTCHAR U_58C4 +ENCODING 22724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +F5E0 +2E80 +75C0 +A4A0 +2C80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C5 +ENCODING 22725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2500 +5480 +E7E0 +2C80 +F7E0 +2480 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C6 +ENCODING 22726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4440 +7BC0 +4A40 +75C0 +4A40 +FFE0 +8420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C7 +ENCODING 22727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4AA0 +FBA0 +4820 +4FE0 +4440 +7740 +C5C0 +0440 +1FE0 +ENDCHAR +STARTCHAR U_58C8 +ENCODING 22728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +FBA0 +4820 +4FE0 +4180 +7100 +CFE0 +0540 +1920 +ENDCHAR +STARTCHAR U_58C9 +ENCODING 22729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +F920 +2FC0 +2A80 +2D20 +3AC0 +CD80 +12C0 +25A0 +ENDCHAR +STARTCHAR U_58CA +ENCODING 22730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4100 +4FE0 +EAA0 +4FE0 +4100 +5FE0 +6540 +9C80 +0660 +ENDCHAR +STARTCHAR U_58CB +ENCODING 22731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +4FE0 +E820 +47C0 +4440 +4FE0 +6920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_58CC +ENCODING 22732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +EAA0 +4FC0 +4280 +4FE0 +6300 +C4A0 +1C40 +0720 +ENDCHAR +STARTCHAR U_58CD +ENCODING 22733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +4900 +9DE0 +5D40 +C940 +7F40 +4940 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58CE +ENCODING 22734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4100 +4FE0 +FAA0 +4920 +4FE0 +4100 +7FE0 +C100 +0FE0 +12A0 +ENDCHAR +STARTCHAR U_58CF +ENCODING 22735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +5480 +5EE0 +F280 +5F40 +5420 +5F20 +6000 +DFC0 +1540 +3FE0 +ENDCHAR +STARTCHAR U_58D0 +ENCODING 22736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +7FC0 +EEE0 +5540 +6EC0 +5140 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D1 +ENCODING 22737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +10A0 +FEA0 +AAA0 +5440 +28A0 +7F20 +2400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D2 +ENCODING 22738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +F7C0 +2100 +2FE0 +2280 +3440 +EFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_58D3 +ENCODING 22739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5CA0 +55E0 +7E80 +6280 +7F40 +6220 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_58D4 +ENCODING 22740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2120 +2FC0 +2040 +3FE0 +CA40 +0F40 +00C0 +ENDCHAR +STARTCHAR U_58D5 +ENCODING 22741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +FFE0 +5020 +4FC0 +4440 +6B80 +D540 +0AA0 +1520 +ENDCHAR +STARTCHAR U_58D6 +ENCODING 22742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +4FE0 +F920 +4540 +4920 +4FE0 +7100 +CFE0 +0AA0 +0AA0 +ENDCHAR +STARTCHAR U_58D7 +ENCODING 22743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4140 +4FE0 +F140 +4FE0 +4540 +7AA0 +CFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_58D8 +ENCODING 22744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D9 +ENCODING 22745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A80 +FFE0 +2A80 +2FE0 +2D40 +3FC0 +ED40 +17C0 +2C60 +ENDCHAR +STARTCHAR U_58DA +ENCODING 22746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +5FE0 +F220 +5FE0 +5540 +57C0 +7540 +DFE0 +2AA0 +5FE0 +ENDCHAR +STARTCHAR U_58DB +ENCODING 22747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5DE0 +F520 +5FE0 +52A0 +54A0 +77A0 +D4A0 +17A0 +1060 +ENDCHAR +STARTCHAR U_58DC +ENCODING 22748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4FC0 +F100 +4FE0 +4920 +4540 +7000 +CFE0 +0480 +0FE0 +ENDCHAR +STARTCHAR U_58DD +ENCODING 22749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +53E0 +4AA0 +E7E0 +7A20 +4BE0 +4A20 +6BE0 +C940 +1A20 +27E0 +ENDCHAR +STARTCHAR U_58DE +ENCODING 22750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +EFE0 +4940 +4580 +4940 +7720 +CCC0 +1540 +0620 +ENDCHAR +STARTCHAR U_58DF +ENCODING 22751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +53E0 +FC20 +8BE0 +EA00 +BBE0 +8A20 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58E0 +ENCODING 22752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +4A80 +FFE0 +4020 +4EE0 +4A80 +4EE0 +6A80 +CEA0 +0AE0 +ENDCHAR +STARTCHAR U_58E1 +ENCODING 22753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +2140 +FD40 +8480 +6940 +B2A0 +4C80 +FBC0 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_58E2 +ENCODING 22754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5360 +5240 +FFE0 +5240 +57E0 +5A40 +7100 +D5E0 +1500 +2FE0 +ENDCHAR +STARTCHAR U_58E3 +ENCODING 22755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +56A0 +5540 +FEA0 +57E0 +5C00 +5540 +7560 +DF60 +3540 +0640 +ENDCHAR +STARTCHAR U_58E4 +ENCODING 22756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +5DC0 +E500 +5FC0 +4500 +5FE0 +6D40 +9480 +0660 +ENDCHAR +STARTCHAR U_58E5 +ENCODING 22757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +4FC0 +ED40 +4FC0 +4900 +4FE0 +6AA0 +D7C0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_58E6 +ENCODING 22758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +4AA0 +FEE0 +4480 +4FE0 +7480 +C7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_58E7 +ENCODING 22759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +5FE0 +F000 +5E80 +54E0 +5FA0 +7AA0 +D640 +1EC0 +2320 +ENDCHAR +STARTCHAR U_58E8 +ENCODING 22760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58E9 +ENCODING 22761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +4FE0 +EBA0 +4540 +5FE0 +6AA0 +DFE0 +14A0 +3FE0 +0520 +ENDCHAR +STARTCHAR U_58EA +ENCODING 22762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +6FA0 +5540 +EDA0 +5FC0 +4040 +5FC0 +7000 +5FC0 +8040 +00C0 +ENDCHAR +STARTCHAR U_58EB +ENCODING 22763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_58EC +ENCODING 22764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0380 +7C00 +0400 +0440 +FFE0 +0400 +0400 +0400 +0480 +7FC0 +ENDCHAR +STARTCHAR U_58ED +ENCODING 22765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +7FC0 +0440 +0440 +0540 +0480 +0400 +ENDCHAR +STARTCHAR U_58EE +ENCODING 22766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9100 +5100 +5100 +1FE0 +1100 +3100 +5100 +9100 +1100 +17C0 +ENDCHAR +STARTCHAR U_58EF +ENCODING 22767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5100 +5100 +7FE0 +1100 +F100 +5100 +5100 +5100 +97C0 +ENDCHAR +STARTCHAR U_58F0 +ENCODING 22768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +0000 +3FC0 +2440 +3FC0 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_58F1 +ENCODING 22769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0000 +FFE0 +8020 +1100 +1E00 +1080 +0F80 +ENDCHAR +STARTCHAR U_58F2 +ENCODING 22770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0000 +FFE0 +8020 +1200 +1200 +2240 +41C0 +ENDCHAR +STARTCHAR U_58F3 +ENCODING 22771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +0000 +FFE0 +8020 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_58F4 +ENCODING 22772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +3F80 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58F5 +ENCODING 22773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0400 +7FC0 +0000 +2080 +FBE0 +2080 +2080 +FBE0 +ENDCHAR +STARTCHAR U_58F6 +ENCODING 22774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +FFE0 +8920 +2940 +1980 +0900 +FFE0 +ENDCHAR +STARTCHAR U_58F7 +ENCODING 22775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +8A20 +BFA0 +2A80 +2A80 +3F80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58F8 +ENCODING 22776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0000 +7FE0 +8020 +BF80 +4A40 +2A80 +7FE0 +ENDCHAR +STARTCHAR U_58F9 +ENCODING 22777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +FFE0 +A0A0 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58FA +ENCODING 22778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8A20 +0A00 +3B80 +2080 +3B80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58FB +ENCODING 22779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2BC0 +2E00 +F3E0 +2000 +27C0 +2440 +37C0 +C440 +04C0 +ENDCHAR +STARTCHAR U_58FC +ENCODING 22780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8020 +7FC0 +0A00 +3B80 +2080 +1B00 +FFE0 +ENDCHAR +STARTCHAR U_58FD +ENCODING 22781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0440 +7FC0 +0040 +FFE0 +4A40 +4940 +78C0 +ENDCHAR +STARTCHAR U_58FE +ENCODING 22782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FBC0 +0240 +FA40 +8BC0 +FA40 +5200 +2200 +FBE0 +ENDCHAR +STARTCHAR U_58FF +ENCODING 22783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4280 +FFE0 +4AA0 +4C60 +4FE0 +7040 +CFE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_5900 +ENCODING 22784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +24A0 +3F80 +0400 +FFE0 +5440 +7240 +00C0 +ENDCHAR +STARTCHAR U_5901 +ENCODING 22785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5140 +7FC0 +2480 +2E80 +2A80 +2A80 +3F80 +ENDCHAR +STARTCHAR U_5902 +ENCODING 22786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +1000 +1F00 +3100 +4A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5903 +ENCODING 22787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +1100 +13E0 +1020 +1F20 +1120 +2A20 +2620 +4920 +B0C0 +ENDCHAR +STARTCHAR U_5904 +ENCODING 22788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2580 +4540 +A920 +2900 +1100 +2900 +4600 +81E0 +ENDCHAR +STARTCHAR U_5905 +ENCODING 22789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +3080 +C900 +0E00 +3580 +C460 +3F80 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_5906 +ENCODING 22790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +3100 +4E00 +FBE0 +0400 +7FC0 +0400 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_5907 +ENCODING 22791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3100 +4E00 +0B00 +30E0 +FF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_5908 +ENCODING 22792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2080 +5900 +8600 +1980 +6460 +1500 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_5909 +ENCODING 22793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +D320 +2800 +1F80 +2900 +4600 +0900 +F0E0 +ENDCHAR +STARTCHAR U_590A +ENCODING 22794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1F80 +5080 +2080 +5100 +8A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_590B +ENCODING 22795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +7F80 +2100 +4880 +9F40 +1100 +2A00 +4400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_590C +ENCODING 22796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +1100 +2480 +4F40 +1900 +2600 +1900 +E0E0 +ENDCHAR +STARTCHAR U_590D +ENCODING 22797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +6080 +BF80 +2080 +3F80 +1000 +3F80 +C900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_590E +ENCODING 22798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5540 +7FC0 +0400 +FFE0 +1000 +3F80 +4900 +0600 +79E0 +ENDCHAR +STARTCHAR U_590F +ENCODING 22799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +1F80 +1080 +1C80 +1780 +1080 +3F80 +4900 +8600 +39E0 +ENDCHAR +STARTCHAR U_5910 +ENCODING 22800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFC0 +2A40 +1F80 +1480 +1280 +1F80 +6900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5911 +ENCODING 22801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F60 +E0C0 +4F40 +6AA0 +9F20 +1000 +3F80 +5100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5912 +ENCODING 22802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +2FE0 +B920 +AFE0 +A900 +FFE0 +5240 +8C20 +1300 +E0E0 +ENDCHAR +STARTCHAR U_5913 +ENCODING 22803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EC0 +4440 +6EC0 +4A40 +6A40 +4EC0 +6860 +8FA0 +7100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5914 +ENCODING 22804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A00 +BAE0 +AEA0 +AA80 +FFE0 +4940 +8920 +0600 +79E0 +ENDCHAR +STARTCHAR U_5915 +ENCODING 22805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0840 +0FE0 +1040 +2880 +4480 +0500 +0100 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_5916 +ENCODING 22806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2500 +4580 +A540 +1920 +0900 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5917 +ENCODING 22807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +3E40 +4A40 +4A40 +AA40 +12C0 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5918 +ENCODING 22808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3DE0 +2520 +4520 +A520 +1520 +09A0 +1140 +2100 +C100 +0100 +ENDCHAR +STARTCHAR U_5919 +ENCODING 22809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4880 +4F80 +5280 +6A80 +4AA0 +44A0 +8860 +B020 +ENDCHAR +STARTCHAR U_591A +ENCODING 22810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1F00 +2100 +5200 +0C00 +3400 +CF80 +1080 +6900 +0600 +F800 +ENDCHAR +STARTCHAR U_591B +ENCODING 22811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +0080 +FFE0 +1000 +1F80 +6080 +1900 +0600 +7800 +ENDCHAR +STARTCHAR U_591C +ENCODING 22812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +13C0 +2640 +6940 +B480 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_591D +ENCODING 22813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +7500 +57E0 +9900 +5100 +57E0 +2100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_591E +ENCODING 22814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +7D80 +A540 +1920 +3100 +C100 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_591F +ENCODING 22815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +4620 +8540 +7480 +57E0 +5520 +76A0 +0440 +0480 +1B00 +ENDCHAR +STARTCHAR U_5920 +ENCODING 22816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +8A20 +5020 +23A0 +FAA0 +2AA0 +CBA0 +2820 +1120 +E0C0 +ENDCHAR +STARTCHAR U_5921 +ENCODING 22817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3900 +4FE0 +B100 +23C0 +4000 +BBC0 +4A40 +B240 +2240 +C3C0 +ENDCHAR +STARTCHAR U_5922 +ENCODING 22818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +FFE0 +8820 +1F80 +2900 +0600 +7800 +ENDCHAR +STARTCHAR U_5923 +ENCODING 22819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3F80 +2A80 +FFE0 +8820 +1F80 +6900 +0600 +7800 +ENDCHAR +STARTCHAR U_5924 +ENCODING 22820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +7100 +0A00 +FFE0 +8020 +7FC0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5925 +ENCODING 22821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A9E0 +FA20 +A940 +F880 +23E0 +F920 +22A0 +7040 +A880 +2300 +ENDCHAR +STARTCHAR U_5926 +ENCODING 22822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FEE0 +2520 +3CA0 +2440 +3D80 +24E0 +FF20 +54A0 +6240 +7D80 +ENDCHAR +STARTCHAR U_5927 +ENCODING 22823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5928 +ENCODING 22824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +3C00 +0400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5929 +ENCODING 22825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592A +ENCODING 22826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0A00 +0A00 +1100 +1900 +2480 +C460 +ENDCHAR +STARTCHAR U_592B +ENCODING 22827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592C +ENCODING 22828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +0480 +0480 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592D +ENCODING 22829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +0400 +FFE0 +0400 +0400 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_592E +ENCODING 22830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +2480 +2480 +2480 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592F +ENCODING 22831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1200 +2100 +4880 +8860 +7F80 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_5930 +ENCODING 22832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2080 +D160 +1100 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5931 +ENCODING 22833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5932 +ENCODING 22834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2480 +C460 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5933 +ENCODING 22835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1100 +E0E0 +1F40 +0000 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR U_5934 +ENCODING 22836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +0A00 +2200 +1200 +0200 +FFE0 +0200 +0500 +0880 +1040 +6020 +ENDCHAR +STARTCHAR U_5935 +ENCODING 22837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1100 +2480 +C460 +1500 +2480 +C440 +0440 +1C00 +ENDCHAR +STARTCHAR U_5936 +ENCODING 22838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +FFE0 +1100 +1100 +2A80 +2A80 +4440 +4440 +8820 +ENDCHAR +STARTCHAR U_5937 +ENCODING 22839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0440 +7FC0 +4400 +7FE0 +0A20 +3180 +C060 +ENDCHAR +STARTCHAR U_5938 +ENCODING 22840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2E80 +4040 +BFA0 +0800 +1F80 +0080 +0900 +0600 +ENDCHAR +STARTCHAR U_5939 +ENCODING 22841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2480 +1500 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_593A +ENCODING 22842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +1080 +2040 +C120 +3FC0 +1100 +0900 +0100 +0700 +ENDCHAR +STARTCHAR U_593B +ENCODING 22843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1100 +2080 +C060 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_593C +ENCODING 22844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +3180 +C060 +2480 +2480 +2480 +2480 +4480 +8080 +ENDCHAR +STARTCHAR U_593D +ENCODING 22845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A00 +1100 +2080 +DF60 +0000 +7FC0 +0900 +1080 +3FC0 +ENDCHAR +STARTCHAR U_593E +ENCODING 22846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_593F +ENCODING 22847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +3080 +C060 +3F80 +2480 +3F80 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5940 +ENCODING 22848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0D00 +34C0 +C440 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5941 +ENCODING 22849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FFE0 +2880 +2500 +2200 +2500 +2880 +3FC0 +ENDCHAR +STARTCHAR U_5942 +ENCODING 22850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2100 +7FC0 +A440 +2440 +2440 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5943 +ENCODING 22851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +1080 +3F60 +D200 +1FC0 +1200 +1120 +14A0 +1A60 +ENDCHAR +STARTCHAR U_5944 +ENCODING 22852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +7FC0 +A4A0 +3F80 +2480 +3FA0 +0420 +07E0 +ENDCHAR +STARTCHAR U_5945 +ENCODING 22853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2880 +F3E0 +4A40 +4A40 +5A40 +6AC0 +1200 +6200 +ENDCHAR +STARTCHAR U_5946 +ENCODING 22854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FF60 +2000 +3F80 +2080 +3F80 +2000 +3FC0 +ENDCHAR +STARTCHAR U_5947 +ENCODING 22855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1100 +FFE0 +0080 +3E80 +2280 +3E80 +0080 +0180 +ENDCHAR +STARTCHAR U_5948 +ENCODING 22856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +DF60 +0000 +7FC0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_5949 +ENCODING 22857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +3F80 +1000 +FFE0 +2480 +5F40 +8420 +7FC0 +0400 +ENDCHAR +STARTCHAR U_594A +ENCODING 22858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2200 +3FC0 +2200 +2F80 +2200 +3FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_594B +ENCODING 22859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2080 +FFE0 +2480 +3F80 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_594C +ENCODING 22860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_594D +ENCODING 22861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +3FC0 +0400 +7FE0 +1080 +2940 +C920 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_594E +ENCODING 22862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +1100 +2480 +DF60 +0400 +7FC0 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_594F +ENCODING 22863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +1100 +3F80 +C460 +3F80 +0A00 +1100 +60C0 +ENDCHAR +STARTCHAR U_5950 +ENCODING 22864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +AA40 +3140 +2440 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5951 +ENCODING 22865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +1120 +7D20 +1220 +7CC0 +1400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5952 +ENCODING 22866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +7FC0 +8920 +1A00 +0480 +3900 +0680 +7840 +ENDCHAR +STARTCHAR U_5953 +ENCODING 22867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2F80 +D960 +0600 +3BC0 +0480 +1D00 +0200 +7C00 +ENDCHAR +STARTCHAR U_5954 +ENCODING 22868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +DF60 +0400 +1080 +FFE0 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_5955 +ENCODING 22869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +2A80 +4A40 +1600 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5956 +ENCODING 22870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +53E0 +1640 +3180 +D100 +1600 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5957 +ENCODING 22871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1080 +3F40 +D020 +1F00 +1000 +FFE0 +0800 +1080 +3FC0 +ENDCHAR +STARTCHAR U_5958 +ENCODING 22872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7FE0 +0880 +F880 +2BE0 +4C00 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5959 +ENCODING 22873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +0400 +FFE0 +1100 +2480 +FFE0 +2480 +3FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_595A +ENCODING 22874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +2480 +0900 +1E00 +0880 +3F40 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_595B +ENCODING 22875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +0440 +08C0 +ENDCHAR +STARTCHAR U_595C +ENCODING 22876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_595D +ENCODING 22877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +3FC0 +E460 +2F40 +2440 +3FC0 +2940 +2F40 +40C0 +ENDCHAR +STARTCHAR U_595E +ENCODING 22878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0900 +3480 +DF60 +2200 +7F80 +A200 +3F80 +2200 +3FC0 +ENDCHAR +STARTCHAR U_595F +ENCODING 22879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +94C0 +ENDCHAR +STARTCHAR U_5960 +ENCODING 22880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3F80 +2A80 +3380 +2E80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5961 +ENCODING 22881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +3C80 +2780 +2080 +FFE0 +5140 +9120 +2100 +ENDCHAR +STARTCHAR U_5962 +ENCODING 22882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2880 +5D40 +8A20 +7FE0 +1080 +3F80 +D080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5963 +ENCODING 22883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +0440 +ENDCHAR +STARTCHAR U_5964 +ENCODING 22884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3F80 +C460 +7FC0 +4A40 +4E40 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_5965 +ENCODING 22885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +4E40 +7FC0 +4E40 +5540 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5966 +ENCODING 22886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +5640 +2380 +F560 +6BC0 +A140 +66C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5967 +ENCODING 22887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4340 +7D40 +5640 +7FC0 +5540 +64C0 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5968 +ENCODING 22888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5620 +3540 +1FE0 +3240 +D140 +1480 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5969 +ENCODING 22889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2100 +4080 +FFE0 +5200 +5E00 +4000 +7B80 +4A80 +7FC0 +ENDCHAR +STARTCHAR U_596A +ENCODING 22890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2880 +5240 +BFA0 +6200 +BFC0 +2200 +FFE0 +2100 +1700 +ENDCHAR +STARTCHAR U_596B +ENCODING 22891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +D560 +5DC0 +B040 +5FC0 +3040 +DDC0 +5540 +6540 +ENDCHAR +STARTCHAR U_596C +ENCODING 22892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5640 +7980 +1640 +FFE0 +5240 +91C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_596D +ENCODING 22893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +2480 +75C0 +5540 +75C0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_596E +ENCODING 22894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +3280 +5FE0 +A200 +7F80 +A200 +3FE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_596F +ENCODING 22895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1480 +2740 +D420 +7FE0 +4A40 +5940 +6AA0 +4D60 +B220 +ENDCHAR +STARTCHAR U_5970 +ENCODING 22896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2A80 +3F80 +0000 +FBE0 +AAA0 +FBE0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5971 +ENCODING 22897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +E0E0 +4E40 +E0E0 +5F40 +ABA0 +AEA0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_5972 +ENCODING 22898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +4BE0 +F6A0 +2AA0 +FBE0 +4AA0 +FBE0 +4880 +7BE0 +4880 +ENDCHAR +STARTCHAR U_5973 +ENCODING 22899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +1100 +1100 +2100 +3A00 +0600 +0980 +7040 +ENDCHAR +STARTCHAR U_5974 +ENCODING 22900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA20 +2A20 +2A40 +4940 +5140 +3080 +2880 +4940 +8620 +ENDCHAR +STARTCHAR U_5975 +ENCODING 22901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2080 +F880 +2880 +2880 +4880 +3080 +2880 +4880 +8380 +ENDCHAR +STARTCHAR U_5976 +ENCODING 22902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2A80 +2AE0 +4A20 +5220 +3420 +2C20 +4520 +88C0 +ENDCHAR +STARTCHAR U_5977 +ENCODING 22903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +F880 +2880 +2FE0 +4880 +5080 +3080 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_5978 +ENCODING 22904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2880 +2880 +4FE0 +4880 +3080 +3080 +4880 +8080 +ENDCHAR +STARTCHAR U_5979 +ENCODING 22905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F5C0 +5740 +5D40 +5540 +55C0 +2500 +3420 +5420 +83E0 +ENDCHAR +STARTCHAR U_597A +ENCODING 22906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23C0 +FA40 +2C80 +2880 +4900 +5100 +2280 +5240 +8C20 +ENDCHAR +STARTCHAR U_597B +ENCODING 22907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2940 +2940 +4A40 +5240 +3180 +2880 +4540 +8220 +ENDCHAR +STARTCHAR U_597C +ENCODING 22908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +29E0 +4F00 +5100 +3100 +2920 +4920 +84E0 +ENDCHAR +STARTCHAR U_597D +ENCODING 22909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F840 +2880 +2880 +4FE0 +5080 +3080 +2880 +4880 +8380 +ENDCHAR +STARTCHAR U_597E +ENCODING 22910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +2AA0 +2AA0 +4AA0 +52A0 +32A0 +2AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_597F +ENCODING 22911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2940 +2940 +2A40 +6940 +3880 +4940 +4A20 +87E0 +ENDCHAR +STARTCHAR U_5980 +ENCODING 22912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +1100 +1FE0 +F240 +8440 +8440 +9280 +A180 +C240 +9C20 +ENDCHAR +STARTCHAR U_5981 +ENCODING 22913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2820 +4A20 +5120 +3120 +2820 +48A0 +8040 +ENDCHAR +STARTCHAR U_5982 +ENCODING 22914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +FBE0 +2A20 +2A20 +4A20 +4A20 +3220 +33E0 +4A20 +8000 +ENDCHAR +STARTCHAR U_5983 +ENCODING 22915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +F820 +2820 +2BE0 +4A00 +5200 +3200 +2A20 +4E20 +81E0 +ENDCHAR +STARTCHAR U_5984 +ENCODING 22916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0800 +FFE0 +1100 +1A00 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5985 +ENCODING 22917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +2880 +4880 +5080 +3080 +2880 +4FE0 +8000 +ENDCHAR +STARTCHAR U_5986 +ENCODING 22918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +9100 +5FE0 +5240 +1440 +3480 +5280 +9100 +1280 +1C60 +ENDCHAR +STARTCHAR U_5987 +ENCODING 22919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F820 +2820 +2820 +4BE0 +5020 +3020 +2820 +4BE0 +8020 +ENDCHAR +STARTCHAR U_5988 +ENCODING 22920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +2A40 +2A40 +4BE0 +5020 +37A0 +2820 +4820 +81C0 +ENDCHAR +STARTCHAR U_5989 +ENCODING 22921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +FD20 +2900 +2900 +4980 +5280 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_598A +ENCODING 22922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +F880 +2880 +2880 +4FE0 +5080 +3080 +2880 +4880 +83E0 +ENDCHAR +STARTCHAR U_598B +ENCODING 22923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F900 +2900 +4FE0 +4900 +5280 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_598C +ENCODING 22924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4240 +FFE0 +5240 +5240 +97E0 +5240 +2240 +5440 +8440 +0840 +ENDCHAR +STARTCHAR U_598D +ENCODING 22925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2240 +FA40 +2A40 +4FE0 +5240 +3240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_598E +ENCODING 22926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +F420 +5A40 +5240 +9240 +5240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_598F +ENCODING 22927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +5240 +5240 +5140 +9140 +6080 +2080 +5140 +9620 +ENDCHAR +STARTCHAR U_5990 +ENCODING 22928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA40 +5440 +5520 +5920 +5200 +2200 +2440 +5FE0 +8420 +ENDCHAR +STARTCHAR U_5991 +ENCODING 22929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F540 +5540 +5540 +97C0 +9400 +6400 +2420 +5420 +93E0 +ENDCHAR +STARTCHAR U_5992 +ENCODING 22930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FBE0 +2A20 +2A20 +4BE0 +5200 +3200 +2A00 +4A00 +8400 +ENDCHAR +STARTCHAR U_5993 +ENCODING 22931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2900 +2FC0 +4C40 +5280 +3280 +2900 +4A80 +8460 +ENDCHAR +STARTCHAR U_5994 +ENCODING 22932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F800 +2B80 +2A80 +4A80 +5280 +22A0 +52A0 +8C60 +ENDCHAR +STARTCHAR U_5995 +ENCODING 22933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4AA0 +2BE0 +1080 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_5996 +ENCODING 22934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +2FE0 +4900 +5100 +3100 +2A80 +4A40 +8420 +ENDCHAR +STARTCHAR U_5997 +ENCODING 22935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C40 +2920 +4880 +57E0 +3040 +2840 +4880 +8080 +ENDCHAR +STARTCHAR U_5998 +ENCODING 22936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2800 +2FE0 +4900 +5100 +3240 +2A40 +4FA0 +8020 +ENDCHAR +STARTCHAR U_5999 +ENCODING 22937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FB40 +2D20 +2920 +4900 +3120 +1040 +2880 +4100 +8600 +ENDCHAR +STARTCHAR U_599A +ENCODING 22938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +49C0 +49A0 +2AA0 +1480 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_599B +ENCODING 22939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0800 +FFE0 +0900 +1200 +0D00 +70C0 +ENDCHAR +STARTCHAR U_599C +ENCODING 22940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2940 +2940 +4FE0 +5100 +3100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_599D +ENCODING 22941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4900 +4900 +7FE0 +4940 +0A40 +FA40 +4940 +4880 +4940 +8E20 +ENDCHAR +STARTCHAR U_599E +ENCODING 22942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2940 +2940 +4FC0 +5240 +3240 +2A40 +4A40 +87E0 +ENDCHAR +STARTCHAR U_599F +ENCODING 22943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0800 +FFE0 +0900 +1200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59A0 +ENCODING 22944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4AA0 +5360 +3220 +2A20 +4A20 +8260 +ENDCHAR +STARTCHAR U_59A1 +ENCODING 22945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FA00 +2BE0 +2A40 +4A40 +5240 +3240 +2A40 +4440 +8840 +ENDCHAR +STARTCHAR U_59A2 +ENCODING 22946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +2820 +2FC0 +4A40 +5240 +3240 +2A40 +4440 +88C0 +ENDCHAR +STARTCHAR U_59A3 +ENCODING 22947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +54A0 +57C0 +5480 +5480 +3480 +24A0 +55A0 +8E60 +ENDCHAR +STARTCHAR U_59A4 +ENCODING 22948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F940 +2880 +2FE0 +48A0 +5080 +3080 +2880 +4A80 +8100 +ENDCHAR +STARTCHAR U_59A5 +ENCODING 22949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0840 +4480 +2100 +0800 +FFE0 +1100 +3200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59A6 +ENCODING 22950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2880 +4BE0 +5080 +3080 +2FE0 +4880 +8080 +ENDCHAR +STARTCHAR U_59A7 +ENCODING 22951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2FE0 +2A80 +4A80 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_59A8 +ENCODING 22952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +29E0 +4920 +5120 +3120 +2920 +4AA0 +8440 +ENDCHAR +STARTCHAR U_59A9 +ENCODING 22953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2900 +2FE0 +4900 +5180 +3280 +2AA0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_59AA +ENCODING 22954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +FB20 +2AA0 +2A40 +4A40 +52A0 +3320 +2A00 +4A00 +83E0 +ENDCHAR +STARTCHAR U_59AB +ENCODING 22955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2300 +F900 +2FE0 +2920 +4920 +51A0 +3260 +2A20 +44A0 +8840 +ENDCHAR +STARTCHAR U_59AC +ENCODING 22956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2900 +2A00 +4BC0 +5640 +3240 +2A40 +4A40 +83C0 +ENDCHAR +STARTCHAR U_59AD +ENCODING 22957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2A00 +2BC0 +4A40 +4A40 +3340 +3480 +4940 +9220 +ENDCHAR +STARTCHAR U_59AE +ENCODING 22958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +FC20 +57E0 +5400 +5520 +9540 +6580 +3520 +4920 +90E0 +ENDCHAR +STARTCHAR U_59AF +ENCODING 22959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4BE0 +52A0 +32A0 +2AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59B0 +ENCODING 22960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2D00 +2900 +49E0 +5100 +3100 +29E0 +4900 +8100 +ENDCHAR +STARTCHAR U_59B1 +ENCODING 22961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2920 +2AA0 +4C40 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59B2 +ENCODING 22962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2A20 +2BE0 +4A20 +5220 +33E0 +2800 +4800 +87E0 +ENDCHAR +STARTCHAR U_59B3 +ENCODING 22963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2CA0 +2880 +4AC0 +52A0 +34A0 +2880 +4880 +8180 +ENDCHAR +STARTCHAR U_59B4 +ENCODING 22964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +D2C0 +2220 +C9E0 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59B5 +ENCODING 22965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2880 +2880 +4880 +53E0 +3080 +2880 +4880 +87E0 +ENDCHAR +STARTCHAR U_59B6 +ENCODING 22966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +2940 +4A40 +5780 +3080 +2900 +4A40 +87A0 +ENDCHAR +STARTCHAR U_59B7 +ENCODING 22967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +F7C0 +5900 +5100 +5FE0 +9100 +5100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_59B8 +ENCODING 22968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F040 +5740 +5540 +5540 +9740 +6040 +3040 +4840 +81C0 +ENDCHAR +STARTCHAR U_59B9 +ENCODING 22969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2900 +2900 +4FE0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_59BA +ENCODING 22970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2900 +2900 +4FC0 +5100 +3380 +2D40 +4920 +8100 +ENDCHAR +STARTCHAR U_59BB +ENCODING 22971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +0480 +7FE0 +0480 +FFE0 +0900 +0700 +78E0 +ENDCHAR +STARTCHAR U_59BC +ENCODING 22972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FA40 +2A40 +2A80 +4EC0 +52A0 +3300 +2240 +5240 +8DC0 +ENDCHAR +STARTCHAR U_59BD +ENCODING 22973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2BE0 +4AA0 +52A0 +33E0 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_59BE +ENCODING 22974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0800 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59BF +ENCODING 22975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +2A40 +2A40 +5BC0 +0400 +FFE0 +0900 +1200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59C0 +ENCODING 22976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +2FE0 +4900 +5380 +3540 +2920 +4900 +8100 +ENDCHAR +STARTCHAR U_59C1 +ENCODING 22977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2BA0 +4AA0 +52A0 +33A0 +2820 +4820 +80C0 +ENDCHAR +STARTCHAR U_59C2 +ENCODING 22978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +4100 +F080 +57C0 +5040 +9080 +5100 +2200 +5700 +88E0 +ENDCHAR +STARTCHAR U_59C3 +ENCODING 22979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +2880 +4AE0 +4A80 +3280 +3280 +4A80 +87E0 +ENDCHAR +STARTCHAR U_59C4 +ENCODING 22980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +FC20 +57E0 +5480 +9480 +97E0 +6480 +34A0 +4D60 +8620 +ENDCHAR +STARTCHAR U_59C5 +ENCODING 22981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +FAC0 +2880 +2FE0 +4880 +5080 +37E0 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_59C6 +ENCODING 22982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4640 +F540 +5440 +5FE0 +9640 +9540 +6440 +37C0 +4840 +80C0 +ENDCHAR +STARTCHAR U_59C7 +ENCODING 22983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6FE0 +A480 +2280 +2180 +0800 +FFE0 +1100 +3200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59C8 +ENCODING 22984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C40 +2920 +4880 +57E0 +3040 +2A80 +4900 +8080 +ENDCHAR +STARTCHAR U_59C9 +ENCODING 22985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5540 +5540 +5540 +2540 +25C0 +5100 +8100 +ENDCHAR +STARTCHAR U_59CA +ENCODING 22986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4160 +F780 +5500 +5500 +57E0 +5120 +2320 +35C0 +4900 +8100 +ENDCHAR +STARTCHAR U_59CB +ENCODING 22987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA40 +2A20 +2FE0 +4800 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59CC +ENCODING 22988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +5540 +57C0 +5540 +5540 +2FE0 +3440 +4C40 +84C0 +ENDCHAR +STARTCHAR U_59CD +ENCODING 22989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FAA0 +AAA0 +AAA0 +BFE0 +AAA0 +4AA0 +6AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_59CE +ENCODING 22990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +F7C0 +5540 +5540 +5540 +9FE0 +6100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_59CF +ENCODING 22991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +F7E0 +5240 +5240 +93C0 +5240 +2240 +5240 +53C0 +8240 +ENDCHAR +STARTCHAR U_59D0 +ENCODING 22992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +FA40 +2A40 +2BC0 +4A40 +5240 +33C0 +2A40 +4A40 +87E0 +ENDCHAR +STARTCHAR U_59D1 +ENCODING 22993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2880 +4BE0 +5220 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59D2 +ENCODING 22994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2440 +F640 +5540 +5540 +5440 +5440 +3540 +2E40 +44A0 +8120 +ENDCHAR +STARTCHAR U_59D3 +ENCODING 22995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +2BE0 +2C80 +4880 +53E0 +3080 +2880 +4880 +87E0 +ENDCHAR +STARTCHAR U_59D4 +ENCODING 22996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +E4E0 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59D5 +ENCODING 22997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5A60 +5380 +5A20 +E1E0 +0800 +FFE0 +0900 +1200 +0C00 +73C0 +ENDCHAR +STARTCHAR U_59D6 +ENCODING 22998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +FC00 +57C0 +5440 +5440 +97C0 +6400 +3400 +4C00 +87E0 +ENDCHAR +STARTCHAR U_59D7 +ENCODING 22999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EAA0 +AAA0 +BFE0 +AAA0 +AAA0 +4AA0 +6AA0 +5AA0 +9360 +ENDCHAR +STARTCHAR U_59D8 +ENCODING 23000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2A40 +2A40 +4FE0 +5240 +3240 +2A40 +4A40 +8440 +ENDCHAR +STARTCHAR U_59D9 +ENCODING 23001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4780 +F480 +5480 +5C80 +97E0 +9480 +6480 +2480 +5480 +87E0 +ENDCHAR +STARTCHAR U_59DA +ENCODING 23002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +56C0 +5280 +52C0 +96A0 +6A80 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_59DB +ENCODING 23003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FBA0 +A820 +ABA0 +AAA0 +AAA0 +4BA0 +6820 +9820 +8860 +ENDCHAR +STARTCHAR U_59DC +ENCODING 23004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59DD +ENCODING 23005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +5900 +5100 +9FE0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_59DE +ENCODING 23006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2BE0 +4800 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59DF +ENCODING 23007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +2A40 +4FA0 +5140 +3280 +2D40 +4A20 +8420 +ENDCHAR +STARTCHAR U_59E0 +ENCODING 23008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4200 +FFE0 +A820 +ABA0 +AAA0 +AAA0 +4BA0 +6820 +9820 +88E0 +ENDCHAR +STARTCHAR U_59E1 +ENCODING 23009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +5100 +5FE0 +5100 +97C0 +6440 +3440 +4C40 +87C0 +ENDCHAR +STARTCHAR U_59E2 +ENCODING 23010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4440 +FFE0 +5000 +57C0 +5440 +97C0 +6440 +37C0 +4C40 +84C0 +ENDCHAR +STARTCHAR U_59E3 +ENCODING 23011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2A40 +2C20 +4A40 +5240 +3180 +2980 +4A40 +8420 +ENDCHAR +STARTCHAR U_59E4 +ENCODING 23012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +F400 +57E0 +5400 +55E0 +5520 +3520 +2D20 +45E0 +8920 +ENDCHAR +STARTCHAR U_59E5 +ENCODING 23013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +F7C0 +5140 +5FE0 +5200 +5240 +3680 +2B20 +4A20 +81E0 +ENDCHAR +STARTCHAR U_59E6 +ENCODING 23014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +71C0 +2080 +FFE0 +4A40 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_59E7 +ENCODING 23015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FC80 +4880 +3080 +CBE0 +2080 +FC80 +4880 +3080 +C880 +ENDCHAR +STARTCHAR U_59E8 +ENCODING 23016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +57E0 +5120 +57E0 +5500 +37E0 +2920 +4280 +8C60 +ENDCHAR +STARTCHAR U_59E9 +ENCODING 23017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FA80 +5480 +53E0 +5280 +5280 +2FE0 +3080 +4880 +8080 +ENDCHAR +STARTCHAR U_59EA +ENCODING 23018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +5440 +57A0 +5100 +5100 +27C0 +3100 +4900 +87E0 +ENDCHAR +STARTCHAR U_59EB +ENCODING 23019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4480 +FC80 +57E0 +5420 +5420 +97E0 +6480 +3480 +4C80 +87E0 +ENDCHAR +STARTCHAR U_59EC +ENCODING 23020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FC80 +55C0 +5540 +5540 +5540 +25C0 +3480 +4C80 +87E0 +ENDCHAR +STARTCHAR U_59ED +ENCODING 23021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +1100 +FBE0 +2920 +DA60 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59EE +ENCODING 23022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +2A40 +2A40 +4BC0 +5240 +23C0 +3240 +4800 +87E0 +ENDCHAR +STARTCHAR U_59EF +ENCODING 23023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +F540 +5100 +5FE0 +5280 +9280 +6280 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_59F0 +ENCODING 23024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2BA0 +4AA0 +53A0 +32A0 +2BA0 +4820 +80E0 +ENDCHAR +STARTCHAR U_59F1 +ENCODING 23025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +5440 +5BA0 +5000 +5FE0 +2200 +33C0 +4840 +8180 +ENDCHAR +STARTCHAR U_59F2 +ENCODING 23026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +5520 +5100 +57E0 +5240 +2240 +3180 +4940 +8620 +ENDCHAR +STARTCHAR U_59F3 +ENCODING 23027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F220 +5540 +5080 +5100 +57E0 +2220 +3220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59F4 +ENCODING 23028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2240 +7A40 +8A40 +50C0 +2800 +FFC0 +1200 +2400 +1A00 +F1C0 +ENDCHAR +STARTCHAR U_59F5 +ENCODING 23029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +FFC0 +5540 +57C0 +5540 +9540 +6540 +35C0 +4920 +9120 +ENDCHAR +STARTCHAR U_59F6 +ENCODING 23030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +5820 +57C0 +5000 +57C0 +2440 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_59F7 +ENCODING 23031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +53E0 +5620 +5BE0 +5220 +23E0 +3220 +4A20 +8260 +ENDCHAR +STARTCHAR U_59F8 +ENCODING 23032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4EE0 +F440 +5440 +5440 +5EE0 +9440 +6440 +3440 +4840 +9040 +ENDCHAR +STARTCHAR U_59F9 +ENCODING 23033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2C20 +2BC0 +4900 +51E0 +3700 +2920 +4920 +80E0 +ENDCHAR +STARTCHAR U_59FA +ENCODING 23034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +5900 +5100 +5FE0 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_59FB +ENCODING 23035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +F520 +57E0 +5520 +5520 +55A0 +2660 +3420 +4FE0 +8420 +ENDCHAR +STARTCHAR U_59FC +ENCODING 23036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FA20 +5540 +5080 +5100 +56E0 +2120 +32A0 +4840 +8780 +ENDCHAR +STARTCHAR U_59FD +ENCODING 23037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +57E0 +5400 +55C0 +9540 +65C0 +3500 +4920 +90E0 +ENDCHAR +STARTCHAR U_59FE +ENCODING 23038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +2FC0 +4900 +5100 +37C0 +2900 +4900 +87E0 +ENDCHAR +STARTCHAR U_59FF +ENCODING 23039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2A40 +C200 +4500 +48E0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A00 +ENCODING 23040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20C0 +F0A0 +5FE0 +5480 +54A0 +5FA0 +24C0 +3480 +4960 +8220 +ENDCHAR +STARTCHAR U_5A01 +ENCODING 23041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4100 +5D20 +4920 +7F40 +5540 +4CA0 +9360 +A420 +ENDCHAR +STARTCHAR U_5A02 +ENCODING 23042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +5280 +5280 +9280 +5FE0 +2000 +3280 +4460 +8840 +ENDCHAR +STARTCHAR U_5A03 +ENCODING 23043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +5100 +5FE0 +9100 +5100 +27C0 +3100 +4900 +87E0 +ENDCHAR +STARTCHAR U_5A04 +ENCODING 23044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +C460 +0800 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5A05 +ENCODING 23045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F280 +5280 +5AA0 +56C0 +9280 +6280 +2280 +5280 +8FE0 +ENDCHAR +STARTCHAR U_5A06 +ENCODING 23046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F00 +F2A0 +5120 +56E0 +5000 +5FE0 +2280 +32A0 +4CA0 +8860 +ENDCHAR +STARTCHAR U_5A07 +ENCODING 23047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +5FE0 +5240 +5420 +9240 +6240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_5A08 +ENCODING 23048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +2940 +4920 +0400 +FFE0 +0900 +1200 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5A09 +ENCODING 23049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +57C0 +5540 +9FE0 +5200 +27C0 +3040 +4840 +8180 +ENDCHAR +STARTCHAR U_5A0A +ENCODING 23050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +FFC0 +5440 +57C0 +9440 +57C0 +2280 +32A0 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A0B +ENCODING 23051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +F340 +57E0 +5420 +97E0 +5420 +27E0 +3420 +4C20 +8460 +ENDCHAR +STARTCHAR U_5A0C +ENCODING 23052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FD40 +57C0 +5540 +57C0 +9100 +67C0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5A0D +ENCODING 23053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +40A0 +F7E0 +5480 +5480 +57A0 +95A0 +6540 +3560 +4AA0 +9120 +ENDCHAR +STARTCHAR U_5A0E +ENCODING 23054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE00 +1BE0 +3280 +D480 +0400 +FFE0 +0880 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_5A0F +ENCODING 23055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +4FE0 +F500 +55C0 +9500 +55C0 +2500 +55C0 +4B20 +94E0 +ENDCHAR +STARTCHAR U_5A10 +ENCODING 23056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F540 +5280 +57E0 +9040 +5080 +27E0 +3080 +4880 +8180 +ENDCHAR +STARTCHAR U_5A11 +ENCODING 23057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +C920 +2940 +4080 +C700 +4800 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5A12 +ENCODING 23058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +F800 +57C0 +5540 +5540 +9FE0 +6540 +27E0 +5040 +80C0 +ENDCHAR +STARTCHAR U_5A13 +ENCODING 23059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +5440 +5780 +94E0 +5780 +24E0 +3780 +48A0 +9060 +ENDCHAR +STARTCHAR U_5A14 +ENCODING 23060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5440 +9440 +57C0 +2280 +3280 +4AA0 +8460 +ENDCHAR +STARTCHAR U_5A15 +ENCODING 23061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57E0 +5520 +97E0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_5A16 +ENCODING 23062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +2BE0 +2880 +4A80 +52E0 +3280 +2A80 +4580 +88E0 +ENDCHAR +STARTCHAR U_5A17 +ENCODING 23063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E60 +4380 +F480 +5480 +5FE0 +5280 +9280 +6A80 +25E0 +5600 +89E0 +ENDCHAR +STARTCHAR U_5A18 +ENCODING 23064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +57C0 +5440 +57C0 +9520 +6540 +3480 +4E40 +8420 +ENDCHAR +STARTCHAR U_5A19 +ENCODING 23065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +FAA0 +5540 +52A0 +92A0 +5000 +27C0 +3100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_5A1A +ENCODING 23066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +5540 +57C0 +9100 +5FE0 +2220 +3220 +44A0 +8840 +ENDCHAR +STARTCHAR U_5A1B +ENCODING 23067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FE40 +57C0 +5400 +57C0 +7140 +17E0 +2900 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A1C +ENCODING 23068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +FAA0 +AEA0 +AAC0 +BEA0 +AAA0 +4AA0 +6AE0 +5280 +9480 +ENDCHAR +STARTCHAR U_5A1D +ENCODING 23069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +F980 +52C0 +54A0 +9080 +53E0 +2220 +3220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_5A1E +ENCODING 23070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +5280 +5100 +9FE0 +5240 +2640 +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A1F +ENCODING 23071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +2800 +2BE0 +4A20 +53E0 +3220 +2BE0 +4A20 +8260 +ENDCHAR +STARTCHAR U_5A20 +ENCODING 23072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +FBC0 +A800 +AFE0 +AA80 +AAA0 +6AC0 +5A80 +8B40 +1620 +ENDCHAR +STARTCHAR U_5A21 +ENCODING 23073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +5100 +57C0 +9000 +5140 +26A0 +3A20 +4A40 +81C0 +ENDCHAR +STARTCHAR U_5A22 +ENCODING 23074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +5540 +5920 +97C0 +5080 +2100 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5A23 +ENCODING 23075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +5140 +57C0 +5500 +57E0 +2320 +3520 +49C0 +8100 +ENDCHAR +STARTCHAR U_5A24 +ENCODING 23076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4880 +7FE0 +0880 +F880 +2BE0 +4400 +FFE0 +0880 +0700 +38C0 +ENDCHAR +STARTCHAR U_5A25 +ENCODING 23077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +26C0 +FAA0 +57E0 +5280 +52A0 +53C0 +36A0 +2AA0 +4360 +8620 +ENDCHAR +STARTCHAR U_5A26 +ENCODING 23078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +5400 +57E0 +9480 +5480 +2FE0 +3000 +4440 +8820 +ENDCHAR +STARTCHAR U_5A27 +ENCODING 23079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +F7C0 +5440 +5440 +97C0 +5280 +2280 +3280 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A28 +ENCODING 23080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +2A20 +2BE0 +4800 +53E0 +3080 +2BE0 +4880 +8080 +ENDCHAR +STARTCHAR U_5A29 +ENCODING 23081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +5FE0 +5520 +5520 +97E0 +6280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_5A2A +ENCODING 23082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +2940 +2940 +4FE0 +5000 +33E0 +2A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_5A2B +ENCODING 23083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4DC0 +F440 +5560 +5940 +5540 +9540 +6FE0 +3400 +4A00 +91E0 +ENDCHAR +STARTCHAR U_5A2C +ENCODING 23084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27E0 +F040 +5FE0 +5140 +5540 +55C0 +5540 +2540 +57C0 +8820 +ENDCHAR +STARTCHAR U_5A2D +ENCODING 23085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7A0 +5200 +57C0 +5900 +9100 +6FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A2E +ENCODING 23086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F800 +2BE0 +2800 +4BE0 +5000 +33E0 +2A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_5A2F +ENCODING 23087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2140 +F540 +55C0 +5400 +57C0 +9040 +6FE0 +2000 +5440 +8820 +ENDCHAR +STARTCHAR U_5A30 +ENCODING 23088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4520 +4D20 +F520 +55A0 +5560 +5520 +55A0 +2540 +5460 +84A0 +ENDCHAR +STARTCHAR U_5A31 +ENCODING 23089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +57C0 +5000 +97C0 +5100 +2FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A32 +ENCODING 23090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F440 +A7C0 +A100 +AFE0 +A920 +CAA0 +2C60 +5820 +8860 +ENDCHAR +STARTCHAR U_5A33 +ENCODING 23091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +4E20 +F4A0 +AFA0 +A4A0 +A6A0 +ADA0 +54A0 +24A0 +5420 +84E0 +ENDCHAR +STARTCHAR U_5A34 +ENCODING 23092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4220 +F920 +AFE0 +A920 +A920 +CBA0 +6D60 +5920 +8920 +08E0 +ENDCHAR +STARTCHAR U_5A35 +ENCODING 23093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4AE0 +FEA0 +AAA0 +AAA0 +AEA0 +AAA0 +CB40 +3E40 +52A0 +8320 +ENDCHAR +STARTCHAR U_5A36 +ENCODING 23094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +6940 +5880 +4940 +FA20 +0800 +FFE0 +1900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5A37 +ENCODING 23095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4780 +F100 +AFE0 +A540 +A540 +AFE0 +C540 +2FE0 +5100 +8FC0 +ENDCHAR +STARTCHAR U_5A38 +ENCODING 23096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2BC0 +2A40 +4BC0 +5240 +37E0 +2A80 +4C40 +8020 +ENDCHAR +STARTCHAR U_5A39 +ENCODING 23097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +4240 +F3E0 +AE80 +A8A0 +AF20 +A3C0 +4240 +22A0 +5B60 +85A0 +ENDCHAR +STARTCHAR U_5A3A +ENCODING 23098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +6AA0 +4440 +FAA0 +5000 +5EE0 +9AA0 +5AA0 +6440 +5AA0 +9AA0 +ENDCHAR +STARTCHAR U_5A3B +ENCODING 23099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +6FE0 +4100 +F7C0 +5540 +57C0 +5540 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5A3C +ENCODING 23100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +5240 +53C0 +5000 +57E0 +3420 +2FE0 +4420 +87E0 +ENDCHAR +STARTCHAR U_5A3D +ENCODING 23101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +F7C0 +5040 +5FE0 +5100 +5D60 +5380 +2540 +5920 +8300 +ENDCHAR +STARTCHAR U_5A3E +ENCODING 23102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +57E0 +5480 +57E0 +5480 +27E0 +3480 +4880 +8BE0 +ENDCHAR +STARTCHAR U_5A3F +ENCODING 23103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5040 +6740 +5540 +7740 +4840 +FFE0 +1100 +1900 +0600 +3980 +ENDCHAR +STARTCHAR U_5A40 +ENCODING 23104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A20 +FA20 +ACE0 +AAA0 +AAA0 +AAA0 +4EE0 +2820 +5820 +88E0 +ENDCHAR +STARTCHAR U_5A41 +ENCODING 23105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +2480 +7FC0 +4440 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A42 +ENCODING 23106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +57C0 +5440 +57C0 +5100 +3FE0 +2920 +4960 +8100 +ENDCHAR +STARTCHAR U_5A43 +ENCODING 23107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2BC0 +4800 +57E0 +3100 +2D40 +4920 +8320 +ENDCHAR +STARTCHAR U_5A44 +ENCODING 23108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2C40 +2A80 +4FE0 +5000 +37C0 +2C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5A45 +ENCODING 23109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +F920 +5560 +55A0 +5FE0 +5320 +55E0 +2920 +5120 +8160 +ENDCHAR +STARTCHAR U_5A46 +ENCODING 23110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4920 +2FC0 +CA40 +5180 +4640 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5A47 +ENCODING 23111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +FD20 +2AC0 +2900 +4FE0 +5100 +3380 +2D40 +4920 +8100 +ENDCHAR +STARTCHAR U_5A48 +ENCODING 23112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2FE0 +2A40 +4D20 +53C0 +3640 +2980 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A49 +ENCODING 23113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +5400 +57E0 +5AA0 +56E0 +3280 +2AA0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_5A4A +ENCODING 23114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +53C0 +5100 +57E0 +52A0 +36C0 +2A80 +4B40 +8220 +ENDCHAR +STARTCHAR U_5A4B +ENCODING 23115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4080 +F7E0 +5500 +57C0 +5520 +95E0 +5400 +25C0 +6540 +9A60 +ENDCHAR +STARTCHAR U_5A4C +ENCODING 23116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +46E0 +E4A0 +A4A0 +BFA0 +A4A0 +AEA0 +75A0 +2440 +54A0 +8920 +ENDCHAR +STARTCHAR U_5A4D +ENCODING 23117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +5440 +5FE0 +5040 +5740 +2540 +3740 +4840 +81C0 +ENDCHAR +STARTCHAR U_5A4E +ENCODING 23118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4480 +4FE0 +F480 +57E0 +5480 +9480 +57E0 +2480 +5480 +8FE0 +ENDCHAR +STARTCHAR U_5A4F +ENCODING 23119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFE0 +5520 +5520 +57E0 +2280 +52A0 +9480 +8860 +ENDCHAR +STARTCHAR U_5A50 +ENCODING 23120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +5540 +57C0 +5100 +5FE0 +3100 +2B80 +4540 +8920 +ENDCHAR +STARTCHAR U_5A51 +ENCODING 23121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5340 +5D20 +5100 +5FE0 +2240 +3280 +4980 +8660 +ENDCHAR +STARTCHAR U_5A52 +ENCODING 23122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +5A80 +5460 +5100 +5520 +2540 +3A80 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A53 +ENCODING 23123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0900 +0600 +79C0 +ENDCHAR +STARTCHAR U_5A54 +ENCODING 23124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +FEE0 +5280 +5280 +5EE0 +5280 +5280 +2EE0 +5280 +8280 +ENDCHAR +STARTCHAR U_5A55 +ENCODING 23125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +5140 +57E0 +5140 +57C0 +3500 +25C0 +5B00 +91E0 +ENDCHAR +STARTCHAR U_5A56 +ENCODING 23126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5280 +5540 +5920 +5140 +25A0 +3560 +4940 +8700 +ENDCHAR +STARTCHAR U_5A57 +ENCODING 23127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +2420 +FC20 +56E0 +5420 +57E0 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A58 +ENCODING 23128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +FFE0 +A200 +AFE0 +A440 +AFA0 +6480 +35A0 +4420 +83E0 +ENDCHAR +STARTCHAR U_5A59 +ENCODING 23129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +F880 +57C0 +5140 +9FE0 +5140 +57C0 +2100 +5100 +8300 +ENDCHAR +STARTCHAR U_5A5A +ENCODING 23130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +5480 +5660 +5020 +57C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5A5B +ENCODING 23131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +57C0 +5440 +57C0 +5100 +2380 +3540 +4920 +9320 +ENDCHAR +STARTCHAR U_5A5C +ENCODING 23132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A140 +F940 +8880 +F940 +A420 +FFE0 +1100 +1A00 +0580 +F860 +ENDCHAR +STARTCHAR U_5A5D +ENCODING 23133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +5000 +57E0 +5080 +5280 +32E0 +2A80 +4580 +88E0 +ENDCHAR +STARTCHAR U_5A5E +ENCODING 23134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +5280 +57C0 +2100 +37E0 +4900 +8100 +ENDCHAR +STARTCHAR U_5A5F +ENCODING 23135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +F920 +AFE0 +A920 +ABA0 +AAA0 +6BA0 +5820 +8FE0 +0820 +ENDCHAR +STARTCHAR U_5A60 +ENCODING 23136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +5820 +57C0 +5440 +57C0 +3400 +2FE0 +4420 +87E0 +ENDCHAR +STARTCHAR U_5A61 +ENCODING 23137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +5540 +5540 +5BA0 +9100 +6380 +2540 +5920 +8100 +ENDCHAR +STARTCHAR U_5A62 +ENCODING 23138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FCA0 +57E0 +54A0 +57E0 +5180 +2280 +37E0 +4880 +8080 +ENDCHAR +STARTCHAR U_5A63 +ENCODING 23139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +4AA0 +4EE0 +F820 +5FE0 +9820 +9EE0 +6AA0 +52A0 +92A0 +A020 +ENDCHAR +STARTCHAR U_5A64 +ENCODING 23140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FBA0 +A920 +AFE0 +A820 +ABA0 +6AA0 +3BA0 +4820 +90E0 +ENDCHAR +STARTCHAR U_5A65 +ENCODING 23141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFC0 +5440 +57C0 +5440 +57C0 +5100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_5A66 +ENCODING 23142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +F7C0 +A040 +AFE0 +A920 +A7C0 +4540 +2540 +5540 +8100 +ENDCHAR +STARTCHAR U_5A67 +ENCODING 23143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +5100 +5FE0 +5440 +57C0 +3440 +2FC0 +4440 +84C0 +ENDCHAR +STARTCHAR U_5A68 +ENCODING 23144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC60 +57C0 +9000 +AFE0 +6AA0 +5FE0 +8AA0 +8AA0 +ENDCHAR +STARTCHAR U_5A69 +ENCODING 23145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +27E0 +F800 +57E0 +5400 +55C0 +5480 +27E0 +3480 +4880 +9080 +ENDCHAR +STARTCHAR U_5A6A +ENCODING 23146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +3100 +6B80 +A540 +2500 +FFE0 +0900 +1200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A6B +ENCODING 23147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +57C0 +5480 +94A0 +56C0 +2480 +56A0 +84E0 +ENDCHAR +STARTCHAR U_5A6C +ENCODING 23148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F20 +FA20 +A540 +A040 +A780 +A100 +6FE0 +2100 +5100 +87C0 +ENDCHAR +STARTCHAR U_5A6D +ENCODING 23149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +F940 +5760 +5420 +5420 +5760 +2140 +3140 +4940 +8FE0 +ENDCHAR +STARTCHAR U_5A6E +ENCODING 23150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +F420 +57E0 +5480 +57E0 +5480 +27E0 +2620 +5A20 +93E0 +ENDCHAR +STARTCHAR U_5A6F +ENCODING 23151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0000 +7BC0 +4A40 +6B40 +4A40 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5A70 +ENCODING 23152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FAA0 +AAA0 +AFE0 +AAA0 +AAA0 +5FE0 +6480 +9840 +1020 +ENDCHAR +STARTCHAR U_5A71 +ENCODING 23153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +1FE0 +7240 +4780 +7140 +17E0 +2400 +FFE0 +0900 +0E00 +31C0 +ENDCHAR +STARTCHAR U_5A72 +ENCODING 23154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +FFE0 +5280 +5480 +5CA0 +54C0 +5580 +2480 +54A0 +84E0 +ENDCHAR +STARTCHAR U_5A73 +ENCODING 23155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F000 +57C0 +5D60 +5FE0 +5D60 +7D60 +2FE0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_5A74 +ENCODING 23156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +5540 +5540 +5540 +2A80 +4440 +FFE0 +1100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5A75 +ENCODING 23157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +A920 +AFE0 +A920 +AFE0 +6100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_5A76 +ENCODING 23158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +A100 +AFE0 +A920 +AFE0 +4920 +6FE0 +9100 +0100 +ENDCHAR +STARTCHAR U_5A77 +ENCODING 23159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F440 +A7C0 +A000 +AFE0 +A820 +67C0 +3080 +4A80 +8100 +ENDCHAR +STARTCHAR U_5A78 +ENCODING 23160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +5440 +5FE0 +5200 +57E0 +2AA0 +32A0 +4D20 +8260 +ENDCHAR +STARTCHAR U_5A79 +ENCODING 23161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F280 +5FE0 +5AA0 +5FE0 +5100 +7FE0 +2440 +5380 +8C60 +ENDCHAR +STARTCHAR U_5A7A +ENCODING 23162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +1140 +FD40 +3480 +5140 +9420 +FFE0 +1100 +0F80 +F060 +ENDCHAR +STARTCHAR U_5A7B +ENCODING 23163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +AFE0 +AAA0 +A920 +AFE0 +4920 +6FE0 +9920 +0860 +ENDCHAR +STARTCHAR U_5A7C +ENCODING 23164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +5100 +5100 +9FE0 +5200 +27E0 +2A20 +5220 +83E0 +ENDCHAR +STARTCHAR U_5A7D +ENCODING 23165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +FD20 +5760 +5400 +57E0 +54A0 +27A0 +3440 +44A0 +8520 +ENDCHAR +STARTCHAR U_5A7E +ENCODING 23166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +F440 +5BA0 +9000 +AEA0 +AAA0 +4F40 +4AA0 +AEA0 +AAA0 +ENDCHAR +STARTCHAR U_5A7F +ENCODING 23167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +F5C0 +5500 +5FE0 +5440 +57C0 +2440 +37C0 +4C40 +84C0 +ENDCHAR +STARTCHAR U_5A80 +ENCODING 23168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +47C0 +FD40 +57C0 +9100 +AFE0 +6920 +59E0 +8E20 +8860 +ENDCHAR +STARTCHAR U_5A81 +ENCODING 23169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4240 +FFE0 +5000 +57C0 +9440 +9FE0 +6500 +5FE0 +8100 +ENDCHAR +STARTCHAR U_5A82 +ENCODING 23170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F440 +5FE0 +5920 +5FE0 +5540 +2540 +5540 +8100 +0100 +ENDCHAR +STARTCHAR U_5A83 +ENCODING 23171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +F100 +5FE0 +5520 +5940 +5100 +2FE0 +3380 +4540 +8920 +ENDCHAR +STARTCHAR U_5A84 +ENCODING 23172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +5100 +57C0 +5100 +5FE0 +2100 +3FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A85 +ENCODING 23173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +FA40 +53C0 +5240 +53C0 +9240 +6FE0 +2540 +5620 +87E0 +ENDCHAR +STARTCHAR U_5A86 +ENCODING 23174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4200 +F7E0 +5520 +5520 +5460 +9100 +6FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A87 +ENCODING 23175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +9100 +9FE0 +6380 +2340 +5520 +8920 +ENDCHAR +STARTCHAR U_5A88 +ENCODING 23176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +47C0 +F900 +57C0 +9540 +97C0 +6540 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_5A89 +ENCODING 23177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +47E0 +F400 +57E0 +9540 +97E0 +6480 +27E0 +5480 +8BE0 +ENDCHAR +STARTCHAR U_5A8A +ENCODING 23178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +A000 +AE20 +AAA0 +AEA0 +4AA0 +6EA0 +5A20 +8A60 +ENDCHAR +STARTCHAR U_5A8B +ENCODING 23179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +5200 +57E0 +5240 +57E0 +2A40 +33C0 +4A40 +83C0 +ENDCHAR +STARTCHAR U_5A8C +ENCODING 23180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +5240 +5000 +57E0 +9520 +67E0 +2520 +57E0 +8420 +ENDCHAR +STARTCHAR U_5A8D +ENCODING 23181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2240 +FFE0 +5220 +53E0 +9220 +53E0 +2220 +51C0 +8A20 +ENDCHAR +STARTCHAR U_5A8E +ENCODING 23182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27E0 +F140 +5180 +5FE0 +5200 +97C0 +6A40 +23C0 +5240 +83C0 +ENDCHAR +STARTCHAR U_5A8F +ENCODING 23183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4920 +FFE0 +A000 +AFE0 +A200 +AFE0 +4AA0 +2AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_5A90 +ENCODING 23184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +BBC0 +AA00 +9220 +FDE0 +0800 +FFE0 +1100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5A91 +ENCODING 23185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +6100 +4FE0 +F100 +57C0 +5540 +57C0 +5100 +27C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5A92 +ENCODING 23186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +F7C0 +5440 +57C0 +5100 +2FE0 +3380 +4D40 +8920 +ENDCHAR +STARTCHAR U_5A93 +ENCODING 23187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +57C0 +5440 +5FE0 +5100 +2100 +37C0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_5A94 +ENCODING 23188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +F200 +AFE0 +AAA0 +ABA0 +AAA0 +CBA0 +2AA0 +5FE0 +8820 +ENDCHAR +STARTCHAR U_5A95 +ENCODING 23189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FBA0 +5000 +57C0 +5440 +57C0 +2280 +3FE0 +4A80 +8480 +ENDCHAR +STARTCHAR U_5A96 +ENCODING 23190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +F440 +5100 +57C0 +9540 +5540 +2FE0 +3280 +4440 +8820 +ENDCHAR +STARTCHAR U_5A97 +ENCODING 23191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +5000 +5FE0 +5440 +57C0 +2440 +37C0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_5A98 +ENCODING 23192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +66E0 +4480 +F6A0 +54E0 +9100 +97E0 +5420 +27E0 +5420 +87E0 +ENDCHAR +STARTCHAR U_5A99 +ENCODING 23193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4FE0 +4880 +FF80 +AAA0 +AAA0 +AFC0 +6940 +2D40 +52A0 +9520 +ENDCHAR +STARTCHAR U_5A9A +ENCODING 23194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +F7E0 +5400 +55E0 +5520 +55E0 +3520 +2DE0 +4920 +91E0 +ENDCHAR +STARTCHAR U_5A9B +ENCODING 23195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F540 +57E0 +5100 +5FE0 +5200 +33E0 +2D40 +4880 +9760 +ENDCHAR +STARTCHAR U_5A9C +ENCODING 23196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFC0 +5440 +57C0 +5440 +57C0 +2440 +37C0 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A9D +ENCODING 23197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7120 +2540 +FD80 +3100 +6A80 +A440 +FFE0 +0880 +1900 +0700 +F8E0 +ENDCHAR +STARTCHAR U_5A9E +ENCODING 23198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +5440 +57C0 +5000 +5FE0 +2500 +35E0 +4B00 +91E0 +ENDCHAR +STARTCHAR U_5A9F +ENCODING 23199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F540 +55C0 +5400 +57E0 +5100 +2FE0 +3380 +4D40 +8920 +ENDCHAR +STARTCHAR U_5AA0 +ENCODING 23200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F200 +57E0 +5C80 +57E0 +5420 +57E0 +2420 +57E0 +8420 +ENDCHAR +STARTCHAR U_5AA1 +ENCODING 23201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5540 +57C0 +5540 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5AA2 +ENCODING 23202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +5820 +5FE0 +5440 +57C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5AA3 +ENCODING 23203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +43C0 +4940 +F540 +5940 +9A60 +9100 +6FE0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5AA4 +ENCODING 23204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +47C0 +FD40 +57C0 +9000 +9540 +64A0 +2AA0 +5240 +81C0 +ENDCHAR +STARTCHAR U_5AA5 +ENCODING 23205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +AFE0 +A800 +AFE0 +AAA0 +4FE0 +2AA0 +5AA0 +A860 +ENDCHAR +STARTCHAR U_5AA6 +ENCODING 23206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FFE0 +A920 +AFE0 +A440 +A7C0 +A440 +67C0 +5440 +8CC0 +ENDCHAR +STARTCHAR U_5AA7 +ENCODING 23207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F740 +A540 +AFE0 +A820 +ABA0 +6AA0 +3AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_5AA8 +ENCODING 23208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4280 +FFE0 +5AA0 +9AA0 +9CE0 +6820 +2FE0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_5AA9 +ENCODING 23209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FFA0 +54E0 +54A0 +5EA0 +5AE0 +2AA0 +3EA0 +4920 +8260 +ENDCHAR +STARTCHAR U_5AAA +ENCODING 23210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +5440 +57C0 +5440 +5000 +6FE0 +3AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_5AAB +ENCODING 23211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41C0 +4100 +F7C0 +5040 +5FE0 +9100 +E5C0 +2500 +5B00 +91E0 +ENDCHAR +STARTCHAR U_5AAC +ENCODING 23212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +F520 +5DE0 +5480 +57E0 +5480 +25C0 +36A0 +4CA0 +8480 +ENDCHAR +STARTCHAR U_5AAD +ENCODING 23213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +C200 +37E0 +C520 +3520 +C280 +0440 +FFE0 +0900 +0E00 +31C0 +ENDCHAR +STARTCHAR U_5AAE +ENCODING 23214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +FBA0 +A000 +AE20 +AAA0 +AEA0 +6AA0 +2EA0 +5A20 +8A60 +ENDCHAR +STARTCHAR U_5AAF +ENCODING 23215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4500 +EF80 +A480 +A7C0 +A440 +A7E0 +A820 +6560 +5AA0 +8060 +ENDCHAR +STARTCHAR U_5AB0 +ENCODING 23216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +26A0 +FBE0 +5120 +5240 +53E0 +56A0 +5AA0 +23E0 +5120 +8EC0 +ENDCHAR +STARTCHAR U_5AB1 +ENCODING 23217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2A80 +2A00 +4BE0 +5480 +33E0 +2880 +4AA0 +83E0 +ENDCHAR +STARTCHAR U_5AB2 +ENCODING 23218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +FAA0 +A920 +AAA0 +AFE0 +A880 +AEA0 +68C0 +5AA0 +8CE0 +ENDCHAR +STARTCHAR U_5AB3 +ENCODING 23219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +57C0 +5440 +57C0 +5440 +27C0 +3540 +4AA0 +83C0 +ENDCHAR +STARTCHAR U_5AB4 +ENCODING 23220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +57C0 +5120 +2340 +3C80 +4D40 +8620 +ENDCHAR +STARTCHAR U_5AB5 +ENCODING 23221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E200 +AFE0 +A540 +EA20 +AFE0 +A480 +A380 +6C60 +ENDCHAR +STARTCHAR U_5AB6 +ENCODING 23222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +57E0 +5240 +53C0 +5240 +53C0 +2240 +57E0 +8840 +ENDCHAR +STARTCHAR U_5AB7 +ENCODING 23223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4BC0 +E800 +AFE0 +AAA0 +AAC0 +AB20 +A840 +6FE0 +5440 +A2C0 +ENDCHAR +STARTCHAR U_5AB8 +ENCODING 23224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +F100 +AFE0 +A100 +AFE0 +A920 +6FE0 +3100 +4140 +8FE0 +ENDCHAR +STARTCHAR U_5AB9 +ENCODING 23225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +5720 +5560 +5000 +57E0 +2520 +37E0 +4D20 +87E0 +ENDCHAR +STARTCHAR U_5ABA +ENCODING 23226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5540 +FFE0 +A0A0 +AEA0 +A0A0 +AEC0 +4A40 +6B40 +8AA0 +1120 +ENDCHAR +STARTCHAR U_5ABB +ENCODING 23227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA60 +AC00 +FBC0 +AA40 +9980 +0A40 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5ABC +ENCODING 23228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +5440 +57C0 +5000 +57C0 +2540 +3540 +4D40 +9FE0 +ENDCHAR +STARTCHAR U_5ABD +ENCODING 23229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FFC0 +5480 +57C0 +5480 +57E0 +3020 +2AA0 +4560 +8960 +ENDCHAR +STARTCHAR U_5ABE +ENCODING 23230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57E0 +5280 +5FE0 +5540 +27C0 +3540 +4FE0 +84C0 +ENDCHAR +STARTCHAR U_5ABF +ENCODING 23231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +5540 +57C0 +5540 +57C0 +3140 +2BA0 +4520 +88E0 +ENDCHAR +STARTCHAR U_5AC0 +ENCODING 23232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +57C0 +5200 +5FE0 +5540 +2FE0 +3380 +4540 +8920 +ENDCHAR +STARTCHAR U_5AC1 +ENCODING 23233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +57C0 +5220 +5D40 +5280 +35C0 +2AA0 +44A0 +8300 +ENDCHAR +STARTCHAR U_5AC2 +ENCODING 23234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4DE0 +F920 +AF60 +A920 +AFE0 +A100 +6FC0 +3480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_5AC3 +ENCODING 23235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5440 +57C0 +9440 +67C0 +2440 +5FE0 +8440 +ENDCHAR +STARTCHAR U_5AC4 +ENCODING 23236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4880 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +6880 +39C0 +4AA0 +95A0 +ENDCHAR +STARTCHAR U_5AC5 +ENCODING 23237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +4080 +F3C0 +5100 +97E0 +9200 +63E0 +2480 +5480 +8BE0 +ENDCHAR +STARTCHAR U_5AC6 +ENCODING 23238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +A440 +AAA0 +A440 +AFE0 +6440 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_5AC7 +ENCODING 23239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +F7C0 +A440 +A7C0 +A440 +A7C0 +4100 +6FE0 +9280 +0C60 +ENDCHAR +STARTCHAR U_5AC8 +ENCODING 23240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2980 +4640 +FFE0 +8420 +7FC0 +1900 +0F00 +70E0 +ENDCHAR +STARTCHAR U_5AC9 +ENCODING 23241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F500 +ADE0 +A680 +AC80 +B7E0 +6480 +3540 +4A20 +9420 +ENDCHAR +STARTCHAR U_5ACA +ENCODING 23242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +57C0 +5100 +5FE0 +9280 +6540 +3FE0 +4940 +9320 +ENDCHAR +STARTCHAR U_5ACB +ENCODING 23243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4220 +FEE0 +A880 +AEE0 +A220 +AAA0 +4660 +6BA0 +9220 +0CC0 +ENDCHAR +STARTCHAR U_5ACC +ENCODING 23244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4FE0 +F500 +AFC0 +A540 +BFE0 +A540 +4FC0 +3500 +4D40 +9520 +ENDCHAR +STARTCHAR U_5ACD +ENCODING 23245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2520 +FAA0 +5140 +5260 +5420 +5760 +2420 +3420 +4FE0 +8420 +ENDCHAR +STARTCHAR U_5ACE +ENCODING 23246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +9920 +9FE0 +6180 +2240 +5440 +8880 +ENDCHAR +STARTCHAR U_5ACF +ENCODING 23247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4EE0 +4AA0 +FEA0 +AAA0 +AEC0 +A8A0 +AAA0 +6BE0 +5C80 +8880 +ENDCHAR +STARTCHAR U_5AD0 +ENCODING 23248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +5540 +5F40 +5540 +FFE0 +A4A0 +BFA0 +4540 +6960 +ADA0 +B2A0 +ENDCHAR +STARTCHAR U_5AD1 +ENCODING 23249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1500 +2480 +7FC0 +1200 +7FC0 +5240 +FFE0 +2100 +1E00 +61C0 +ENDCHAR +STARTCHAR U_5AD2 +ENCODING 23250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +FFE0 +AA20 +AFE0 +A200 +A3C0 +6640 +2980 +5240 +8C20 +ENDCHAR +STARTCHAR U_5AD3 +ENCODING 23251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +4480 +FFE0 +5AA0 +9920 +9AA0 +68A0 +2EC0 +5880 +8EE0 +ENDCHAR +STARTCHAR U_5AD4 +ENCODING 23252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F8A0 +5700 +5400 +57E0 +5480 +2480 +3FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_5AD5 +ENCODING 23253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2500 +FDE0 +5680 +57E0 +5540 +57E0 +2140 +36A0 +4A40 +81C0 +ENDCHAR +STARTCHAR U_5AD6 +ENCODING 23254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +FFE0 +AAA0 +AFE0 +A000 +A7C0 +6000 +2FE0 +5540 +8B20 +ENDCHAR +STARTCHAR U_5AD7 +ENCODING 23255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +F9C0 +A940 +A9C0 +A800 +ABE0 +4AA0 +2BE0 +5800 +8FE0 +ENDCHAR +STARTCHAR U_5AD8 +ENCODING 23256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FFE0 +A920 +AFE0 +A280 +A700 +6240 +37E0 +4540 +8B20 +ENDCHAR +STARTCHAR U_5AD9 +ENCODING 23257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +45E0 +FF00 +A9E0 +AEA0 +AA80 +AAE0 +4A80 +7380 +9280 +2660 +ENDCHAR +STARTCHAR U_5ADA +ENCODING 23258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F7C0 +A440 +AFE0 +AAA0 +AAA0 +6FE0 +5440 +8B80 +0C60 +ENDCHAR +STARTCHAR U_5ADB +ENCODING 23259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9160 +FFC0 +9140 +A880 +FD60 +0A00 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5ADC +ENCODING 23260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +5100 +5FE0 +5440 +57C0 +2440 +3FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_5ADD +ENCODING 23261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E940 +AFE0 +A940 +AFC0 +A920 +4D40 +3380 +5540 +8B20 +ENDCHAR +STARTCHAR U_5ADE +ENCODING 23262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F940 +AFE0 +A940 +AFE0 +A920 +4FE0 +2D20 +57E0 +A560 +ENDCHAR +STARTCHAR U_5ADF +ENCODING 23263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +5540 +57E0 +5500 +55E0 +2720 +35E0 +4C00 +87E0 +ENDCHAR +STARTCHAR U_5AE0 +ENCODING 23264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +2240 +FD80 +7260 +A800 +7FE0 +4400 +7FE0 +4900 +8700 +3CE0 +ENDCHAR +STARTCHAR U_5AE1 +ENCODING 23265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +AFE0 +A920 +AFE0 +A920 +4BA0 +2AA0 +5BA0 +8860 +ENDCHAR +STARTCHAR U_5AE2 +ENCODING 23266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +27C0 +52A0 +84E0 +FFE0 +1100 +0E00 +F9C0 +ENDCHAR +STARTCHAR U_5AE3 +ENCODING 23267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FDE0 +5500 +57E0 +5200 +53E0 +2200 +37E0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_5AE4 +ENCODING 23268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +F7C0 +5100 +97C0 +9540 +6540 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5AE5 +ENCODING 23269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +57C0 +5540 +57C0 +50A0 +27E0 +3480 +4A80 +8100 +ENDCHAR +STARTCHAR U_5AE6 +ENCODING 23270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F820 +57C0 +5440 +57C0 +5100 +6FE0 +2920 +5960 +8100 +ENDCHAR +STARTCHAR U_5AE7 +ENCODING 23271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F100 +57C0 +5100 +5FE0 +9440 +67C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_5AE8 +ENCODING 23272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +5540 +5FE0 +5100 +57E0 +3100 +2FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_5AE9 +ENCODING 23273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +E4E0 +5FA0 +B5A0 +BFA0 +A4A0 +6E40 +5540 +64A0 +8520 +ENDCHAR +STARTCHAR U_5AEA +ENCODING 23274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +F660 +AAA0 +A700 +BAE0 +A480 +6120 +3640 +4980 +8600 +ENDCHAR +STARTCHAR U_5AEB +ENCODING 23275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57C0 +5440 +57C0 +5440 +2FE0 +3100 +4A80 +8C60 +ENDCHAR +STARTCHAR U_5AEC +ENCODING 23276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F800 +AA40 +AFE0 +AA40 +ABC0 +6800 +2540 +5AA0 +8820 +ENDCHAR +STARTCHAR U_5AED +ENCODING 23277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +FFE0 +AA40 +AFE0 +A840 +AFC0 +4AA0 +2FE0 +5880 +9180 +ENDCHAR +STARTCHAR U_5AEE +ENCODING 23278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +FFE0 +A920 +ABA0 +A540 +AFE0 +6200 +27C0 +5040 +8B80 +ENDCHAR +STARTCHAR U_5AEF +ENCODING 23279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +11E0 +7F40 +2480 +DD60 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5AF0 +ENCODING 23280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2F40 +2440 +FF60 +55A0 +5F40 +5440 +5640 +2DA0 +54A0 +8520 +ENDCHAR +STARTCHAR U_5AF1 +ENCODING 23281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +5540 +5FE0 +5000 +5FE0 +6AA0 +3BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_5AF2 +ENCODING 23282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2800 +FA40 +5FE0 +5A40 +5B40 +6EC0 +3B60 +4A40 +9240 +ENDCHAR +STARTCHAR U_5AF3 +ENCODING 23283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FDE0 +A740 +F480 +AD40 +A620 +0800 +FFE0 +1200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_5AF4 +ENCODING 23284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5440 +5FE0 +5280 +2FE0 +3100 +57C0 +8100 +ENDCHAR +STARTCHAR U_5AF5 +ENCODING 23285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +FD40 +A540 +AFE0 +A540 +A540 +6FE0 +3540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_5AF6 +ENCODING 23286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +47E0 +F480 +AFE0 +A480 +A7E0 +A480 +67E0 +3540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_5AF7 +ENCODING 23287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A80 +FBE0 +AD40 +ABE0 +A920 +ABE0 +CD20 +29E0 +5920 +8960 +ENDCHAR +STARTCHAR U_5AF8 +ENCODING 23288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +57C0 +5100 +5FE0 +5280 +2FE0 +3440 +47C0 +8440 +ENDCHAR +STARTCHAR U_5AF9 +ENCODING 23289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F280 +5FE0 +5100 +97C0 +5540 +27C0 +3540 +47C0 +8820 +ENDCHAR +STARTCHAR U_5AFA +ENCODING 23290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +AAA0 +AEE0 +ABA0 +AAA0 +4BA0 +2AA0 +5BA0 +8AE0 +ENDCHAR +STARTCHAR U_5AFB +ENCODING 23291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +AAA0 +AEE0 +A920 +AFE0 +4920 +2BA0 +5D60 +8920 +ENDCHAR +STARTCHAR U_5AFC +ENCODING 23292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2D60 +FBA0 +5FE0 +5100 +67C0 +2100 +57E0 +4D40 +92A0 +ENDCHAR +STARTCHAR U_5AFD +ENCODING 23293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +A440 +AFE0 +A440 +A7C0 +6440 +57C0 +8D40 +0B20 +ENDCHAR +STARTCHAR U_5AFE +ENCODING 23294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +5380 +5D60 +5440 +56E0 +2B40 +35E0 +4C40 +8040 +ENDCHAR +STARTCHAR U_5AFF +ENCODING 23295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +5140 +57C0 +5100 +5FE0 +5540 +27C0 +5540 +8FE0 +ENDCHAR +STARTCHAR U_5B00 +ENCODING 23296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2E40 +2540 +F780 +5480 +57C0 +5440 +57E0 +2820 +5AA0 +9060 +ENDCHAR +STARTCHAR U_5B01 +ENCODING 23297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +F480 +5BC0 +5020 +57C0 +5440 +27C0 +3440 +4A80 +8FE0 +ENDCHAR +STARTCHAR U_5B02 +ENCODING 23298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +EAA0 +BFE0 +A080 +AE80 +AAA0 +6EC0 +2AA0 +5F60 +8220 +ENDCHAR +STARTCHAR U_5B03 +ENCODING 23299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +D440 +27C0 +D440 +27C0 +C280 +0C40 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5B04 +ENCODING 23300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5000 +5FE0 +5820 +27C0 +3440 +4A80 +87E0 +ENDCHAR +STARTCHAR U_5B05 +ENCODING 23301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +F280 +AFE0 +A540 +AFE0 +A540 +6FE0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_5B06 +ENCODING 23302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C60 +F7C0 +5440 +57C0 +5000 +3FE0 +2AA0 +4660 +8AA0 +ENDCHAR +STARTCHAR U_5B07 +ENCODING 23303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +5FE0 +5440 +57C0 +5440 +27C0 +3440 +4FC0 +8C60 +ENDCHAR +STARTCHAR U_5B08 +ENCODING 23304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +5EE0 +5440 +2FE0 +3280 +4CA0 +8860 +ENDCHAR +STARTCHAR U_5B09 +ENCODING 23305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +5FE0 +5440 +57C0 +5280 +6FE0 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_5B0A +ENCODING 23306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +2AA0 +EEE0 +0400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5B0B +ENCODING 23307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +A920 +AFE0 +A920 +AFE0 +6100 +37E0 +4900 +8100 +ENDCHAR +STARTCHAR U_5B0C +ENCODING 23308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5440 +5BA0 +5280 +5FE0 +2AA0 +3BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_5B0D +ENCODING 23309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5540 +5F40 +F0E0 +5FA0 +54A0 +9EA0 +6440 +2440 +5EA0 +8120 +ENDCHAR +STARTCHAR U_5B0E +ENCODING 23310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4EC0 +4540 +FFE0 +AA40 +ABE0 +AE40 +E440 +55E0 +4A00 +93E0 +ENDCHAR +STARTCHAR U_5B0F +ENCODING 23311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4920 +F540 +AFE0 +A540 +A920 +AFE0 +E920 +2FE0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_5B10 +ENCODING 23312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +FBA0 +A000 +AEE0 +AAA0 +AEE0 +6000 +3440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_5B11 +ENCODING 23313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +FFE0 +5000 +57C0 +9440 +67C0 +2920 +5440 +87C0 +ENDCHAR +STARTCHAR U_5B12 +ENCODING 23314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +4440 +FFE0 +AD60 +ABA0 +AFE0 +A440 +67C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5B13 +ENCODING 23315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +FAE0 +AEA0 +ABA0 +AEA0 +A4A0 +5FA0 +6A40 +92A0 +2520 +ENDCHAR +STARTCHAR U_5B14 +ENCODING 23316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +4B40 +FFE0 +5540 +5540 +55E0 +9F40 +5440 +2DE0 +5520 +A3E0 +ENDCHAR +STARTCHAR U_5B15 +ENCODING 23317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +F100 +57C0 +5100 +9FE0 +E280 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_5B16 +ENCODING 23318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +4940 +7FE0 +A480 +3FE0 +0480 +FFE0 +0900 +0700 +78E0 +ENDCHAR +STARTCHAR U_5B17 +ENCODING 23319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +ABA0 +AAA0 +AAA0 +AFE0 +6440 +27C0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_5B18 +ENCODING 23320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4940 +4BE0 +F100 +52A0 +5D40 +96E0 +E540 +34C0 +4C00 +93E0 +ENDCHAR +STARTCHAR U_5B19 +ENCODING 23321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F540 +ABA0 +A100 +AFE0 +AAA0 +6BA0 +2820 +5FE0 +8820 +ENDCHAR +STARTCHAR U_5B1A +ENCODING 23322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +4FE0 +3280 +56C0 +AAA0 +ENDCHAR +STARTCHAR U_5B1B +ENCODING 23323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +5000 +5FE0 +5440 +57C0 +6280 +36A0 +4A40 +8320 +ENDCHAR +STARTCHAR U_5B1C +ENCODING 23324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +29E0 +FEA0 +4880 +7940 +4A20 +FFE0 +1100 +0F00 +70C0 +ENDCHAR +STARTCHAR U_5B1D +ENCODING 23325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +F840 +AFC0 +A840 +AFE0 +A220 +BFA0 +6AC0 +5900 +8CE0 +ENDCHAR +STARTCHAR U_5B1E +ENCODING 23326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +5100 +5FE0 +5540 +57C0 +5540 +2FE0 +5100 +9FE0 +ENDCHAR +STARTCHAR U_5B1F +ENCODING 23327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2100 +F7C0 +5100 +5FE0 +9540 +6280 +2FE0 +5240 +96A0 +ENDCHAR +STARTCHAR U_5B20 +ENCODING 23328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4280 +F380 +AEE0 +AAA0 +AEE0 +A100 +AFE0 +6380 +5540 +8920 +ENDCHAR +STARTCHAR U_5B21 +ENCODING 23329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +5520 +52C0 +5620 +53E0 +2240 +3580 +4A40 +8420 +ENDCHAR +STARTCHAR U_5B22 +ENCODING 23330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F2A0 +57C0 +5280 +9FE0 +E300 +36A0 +5A40 +8320 +ENDCHAR +STARTCHAR U_5B23 +ENCODING 23331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F2A0 +AA40 +AFE0 +AAA0 +BFE0 +C000 +2FE0 +5100 +8300 +ENDCHAR +STARTCHAR U_5B24 +ENCODING 23332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA40 +AFE0 +AB40 +AEE0 +AA40 +4D40 +6B80 +9440 +27A0 +ENDCHAR +STARTCHAR U_5B25 +ENCODING 23333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +E660 +AAA0 +A220 +A900 +BFE0 +C900 +2FC0 +5900 +8FE0 +ENDCHAR +STARTCHAR U_5B26 +ENCODING 23334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +AFE0 +A120 +AFC0 +A020 +DFE0 +2AA0 +5EA0 +8060 +ENDCHAR +STARTCHAR U_5B27 +ENCODING 23335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +F240 +AFE0 +A240 +AFE0 +A540 +CAA0 +3FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_5B28 +ENCODING 23336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +E440 +A9A0 +BEC0 +AAA0 +AEE0 +E240 +2D20 +5460 +83C0 +ENDCHAR +STARTCHAR U_5B29 +ENCODING 23337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F40 +4A40 +FFC0 +4940 +5DC0 +9940 +EFE0 +2000 +5440 +8820 +ENDCHAR +STARTCHAR U_5B2A +ENCODING 23338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +A7C0 +A980 +AFC0 +B440 +C7C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_5B2B +ENCODING 23339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2B60 +2A40 +F5A0 +5000 +5FE0 +9920 +57C0 +2380 +5540 +9920 +ENDCHAR +STARTCHAR U_5B2C +ENCODING 23340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +EFE0 +AAA0 +A440 +AFE0 +A100 +CFE0 +2AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_5B2D +ENCODING 23341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +F920 +AFE0 +A920 +ADA0 +AB60 +CDA0 +6B60 +5DA0 +8860 +ENDCHAR +STARTCHAR U_5B2E +ENCODING 23342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5CA0 +57E0 +5C80 +5540 +5620 +7FE0 +4480 +8700 +98C0 +ENDCHAR +STARTCHAR U_5B2F +ENCODING 23343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E100 +AFE0 +B440 +BFE0 +A2A0 +A440 +5FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5B30 +ENCODING 23344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2A80 +4440 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5B31 +ENCODING 23345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3F00 +95E0 +5F40 +3540 +DF40 +4440 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5B32 +ENCODING 23346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +AEA0 +FBE0 +4A80 +FBE0 +54A0 +54A0 +9B20 +6260 +ENDCHAR +STARTCHAR U_5B33 +ENCODING 23347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57E0 +5C80 +57E0 +9480 +57E0 +2240 +5180 +8E60 +ENDCHAR +STARTCHAR U_5B34 +ENCODING 23348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4000 +7FC0 +4080 +FFC0 +A540 +FFC0 +AB40 +E540 +BA60 +ENDCHAR +STARTCHAR U_5B35 +ENCODING 23349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +6500 +4BE0 +FD20 +55E0 +5480 +53E0 +2EA0 +2AA0 +54E0 +9480 +ENDCHAR +STARTCHAR U_5B36 +ENCODING 23350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F340 +52C0 +57E0 +5520 +97E0 +5520 +27E0 +5240 +8440 +ENDCHAR +STARTCHAR U_5B37 +ENCODING 23351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA40 +AFE0 +AA40 +AFE0 +A940 +EA80 +2D40 +5240 +A3A0 +ENDCHAR +STARTCHAR U_5B38 +ENCODING 23352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FB20 +5540 +5FE0 +5540 +5FE0 +2540 +37C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_5B39 +ENCODING 23353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4BA0 +4AA0 +EEE0 +ABA0 +AEE0 +AAA0 +BFE0 +A000 +4440 +A820 +ENDCHAR +STARTCHAR U_5B3A +ENCODING 23354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2FE0 +F900 +5FC0 +5940 +5FE0 +2140 +5520 +8A40 +0BC0 +ENDCHAR +STARTCHAR U_5B3B +ENCODING 23355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +5AA0 +5FE0 +9440 +E7C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_5B3C +ENCODING 23356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +56A0 +FCA0 +A5A0 +AAA0 +BFA0 +A4A0 +BFA0 +7520 +4E20 +9F60 +ENDCHAR +STARTCHAR U_5B3D +ENCODING 23357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4A80 +EFA0 +B020 +BFE0 +B540 +AFE0 +E100 +3FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_5B3E +ENCODING 23358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F540 +5FE0 +5520 +55E0 +5F20 +55E0 +2F20 +55E0 +8720 +ENDCHAR +STARTCHAR U_5B3F +ENCODING 23359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +A780 +A8A0 +BBC0 +AA80 +DBE0 +2000 +6D40 +92A0 +ENDCHAR +STARTCHAR U_5B40 +ENCODING 23360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +5AA0 +55E0 +5F20 +55E0 +2720 +2DE0 +5520 +85E0 +ENDCHAR +STARTCHAR U_5B41 +ENCODING 23361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +77C0 +5540 +77C0 +0800 +FFE0 +0A00 +75C0 +ENDCHAR +STARTCHAR U_5B42 +ENCODING 23362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FAA0 +57C0 +5440 +57C0 +9540 +6480 +27C0 +5540 +8FE0 +ENDCHAR +STARTCHAR U_5B43 +ENCODING 23363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +AEE0 +A280 +AFE0 +A280 +AFE0 +76A0 +4A40 +8320 +ENDCHAR +STARTCHAR U_5B44 +ENCODING 23364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +FAA0 +5EE0 +5BA0 +9D60 +EFE0 +2920 +5BA0 +8D60 +ENDCHAR +STARTCHAR U_5B45 +ENCODING 23365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +4AA0 +F580 +BFE0 +AA80 +BBA0 +AAA0 +9B40 +6A40 +5FA0 +8120 +ENDCHAR +STARTCHAR U_5B46 +ENCODING 23366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +FAA0 +5EE0 +5440 +9AA0 +EFE0 +2480 +5380 +8C60 +ENDCHAR +STARTCHAR U_5B47 +ENCODING 23367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5FE0 +F540 +BFE0 +A540 +BFE0 +A540 +DFE0 +2440 +5380 +8C60 +ENDCHAR +STARTCHAR U_5B48 +ENCODING 23368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4920 +FFE0 +A900 +AFE0 +A900 +AFE0 +CAA0 +2FE0 +5AA0 +8BA0 +ENDCHAR +STARTCHAR U_5B49 +ENCODING 23369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +5FE0 +4280 +FEE0 +5AA0 +5AE0 +97E0 +DC80 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_5B4A +ENCODING 23370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4A40 +FFE0 +5A40 +5BA0 +9EE0 +EA80 +2EE0 +5280 +96E0 +ENDCHAR +STARTCHAR U_5B4B +ENCODING 23371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +EDA0 +AB60 +AFE0 +AAA0 +AFE0 +ECA0 +2FC0 +54A0 +A6E0 +ENDCHAR +STARTCHAR U_5B4C +ENCODING 23372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +9080 +EEE0 +4040 +BEE0 +AAA0 +5B40 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5B4D +ENCODING 23373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +AE00 +AA80 +AEE0 +ABA0 +6EA0 +2AA0 +5E40 +A2A0 +ENDCHAR +STARTCHAR U_5B4E +ENCODING 23374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FFE0 +AD40 +AB80 +AD40 +AFE0 +CAA0 +37A0 +52A0 +8760 +ENDCHAR +STARTCHAR U_5B4F +ENCODING 23375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +4280 +FEE0 +5AA0 +5FE0 +9920 +EFE0 +2D60 +5BA0 +8D60 +ENDCHAR +STARTCHAR U_5B50 +ENCODING 23376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +0400 +0400 +FFE0 +0400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B51 +ENCODING 23377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0100 +0600 +0420 +04C0 +0F00 +F400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B52 +ENCODING 23378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +0200 +0400 +1800 +1000 +1F80 +1000 +1000 +1000 +5000 +2000 +ENDCHAR +STARTCHAR U_5B53 +ENCODING 23379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +8200 +4C00 +2800 +1800 +0C00 +0B00 +08E0 +2800 +1000 +ENDCHAR +STARTCHAR U_5B54 +ENCODING 23380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +0500 +0900 +1100 +1100 +1D00 +F100 +1120 +1120 +1120 +70E0 +ENDCHAR +STARTCHAR U_5B55 +ENCODING 23381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13E0 +2020 +5F20 +82C0 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B56 +ENCODING 23382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +1040 +2080 +2080 +3BE0 +E080 +2080 +2080 +2080 +6180 +ENDCHAR +STARTCHAR U_5B57 +ENCODING 23383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F40 +0200 +0400 +FFE0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B58 +ENCODING 23384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +2FC0 +2080 +6100 +BFE0 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_5B59 +ENCODING 23385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +2100 +2540 +3540 +E520 +2920 +2920 +2100 +2100 +E700 +ENDCHAR +STARTCHAR U_5B5A +ENCODING 23386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E40 +4840 +2480 +7FC0 +0200 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B5B +ENCODING 23387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8020 +3F80 +0200 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B5C +ENCODING 23388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +0BE0 +3240 +2640 +3A40 +E140 +2080 +2180 +A240 +4420 +ENDCHAR +STARTCHAR U_5B5D +ENCODING 23389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +3FC0 +0500 +FFE0 +0400 +1F80 +6100 +8200 +7FE0 +0200 +0600 +ENDCHAR +STARTCHAR U_5B5E +ENCODING 23390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0200 +0400 +FFE0 +0400 +1400 +0800 +4440 +A520 +A120 +1F00 +ENDCHAR +STARTCHAR U_5B5F +ENCODING 23391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0200 +0400 +FFC0 +0400 +1400 +0800 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_5B60 +ENCODING 23392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0020 +7FA0 +2120 +3F20 +0060 +3F00 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B61 +ENCODING 23393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0900 +1200 +2440 +37A0 +6000 +A7E0 +2420 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_5B62 +ENCODING 23394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +0BE0 +1420 +23A0 +2AA0 +33A0 +E220 +22C0 +2200 +A220 +61E0 +ENDCHAR +STARTCHAR U_5B63 +ENCODING 23395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +1500 +E4E0 +3F80 +0200 +FFE0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B64 +ENCODING 23396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +1740 +2540 +2D40 +3540 +E540 +2540 +2520 +25A0 +AB60 +5020 +ENDCHAR +STARTCHAR U_5B65 +ENCODING 23397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA40 +4980 +3640 +C820 +1F80 +0100 +FFE0 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_5B66 +ENCODING 23398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4880 +2500 +FFC0 +8040 +3F00 +0200 +0400 +FFC0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B67 +ENCODING 23399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47E0 +F120 +2220 +52A0 +E440 +3F00 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B68 +ENCODING 23400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0200 +FFE0 +0400 +1400 +0C00 +7BC0 +0840 +3BE0 +D080 +3180 +ENDCHAR +STARTCHAR U_5B69 +ENCODING 23401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +17E0 +2100 +2240 +3780 +E120 +2240 +2480 +2140 +A220 +4C20 +ENDCHAR +STARTCHAR U_5B6A +ENCODING 23402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +8020 +3F80 +0200 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B6B +ENCODING 23403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +1100 +2240 +2780 +3140 +E7A0 +2080 +22C0 +A4A0 +4180 +ENDCHAR +STARTCHAR U_5B6C +ENCODING 23404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +0EC0 +7220 +23C0 +F840 +2880 +4FE0 +5080 +2A80 +C580 +ENDCHAR +STARTCHAR U_5B6D +ENCODING 23405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7BE0 +0A20 +13E0 +1220 +3BE0 +D220 +13E0 +1000 +1240 +3420 +ENDCHAR +STARTCHAR U_5B6E +ENCODING 23406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +2820 +27C0 +3000 +6FE0 +A100 +2540 +2920 +B120 +4300 +ENDCHAR +STARTCHAR U_5B6F +ENCODING 23407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7940 +4880 +7B60 +0000 +7F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B70 +ENCODING 23408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +4BC0 +7940 +0140 +7F40 +09C0 +1140 +7A40 +1420 +7820 +ENDCHAR +STARTCHAR U_5B71 +ENCODING 23409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +3FE0 +2100 +3EE0 +2440 +5FE0 +4440 +9CC0 +ENDCHAR +STARTCHAR U_5B72 +ENCODING 23410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1280 +2280 +2EE0 +2820 +3820 +E820 +2EE0 +2280 +A280 +6FE0 +ENDCHAR +STARTCHAR U_5B73 +ENCODING 23411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +F780 +4A40 +FFA0 +0100 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B74 +ENCODING 23412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0200 +FFE0 +1040 +FBE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_5B75 +ENCODING 23413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +CD00 +8A80 +AB20 +EEA0 +ABE0 +EA40 +AEE0 +2840 +4840 +88C0 +ENDCHAR +STARTCHAR U_5B76 +ENCODING 23414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +1140 +7FC0 +0000 +3F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B77 +ENCODING 23415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2540 +FC80 +7140 +AA20 +7FE0 +4200 +5FC0 +4200 +8600 +ENDCHAR +STARTCHAR U_5B78 +ENCODING 23416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +8020 +3F00 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B79 +ENCODING 23417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +7A80 +47C0 +7900 +A900 +3F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B7A +ENCODING 23418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +2FE0 +2920 +3AA0 +6FE0 +A100 +2FE0 +2AA0 +AAA0 +6860 +ENDCHAR +STARTCHAR U_5B7B +ENCODING 23419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17C0 +2140 +27E0 +3140 +6FE0 +A540 +2AA0 +2FE0 +AAA0 +7FE0 +ENDCHAR +STARTCHAR U_5B7C +ENCODING 23420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBC0 +5280 +FFE0 +4900 +7900 +1F80 +0200 +FFC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B7D +ENCODING 23421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2080 +7BE0 +4940 +7BE0 +4880 +7FC0 +0100 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_5B7E +ENCODING 23422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2EE0 +4AA0 +4EE0 +6440 +CAA0 +5FE0 +4480 +4380 +CC60 +ENDCHAR +STARTCHAR U_5B7F +ENCODING 23423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +A0C0 +4E40 +E0E0 +4F40 +AAA0 +3F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B80 +ENCODING 23424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0400 +0200 +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_5B81 +ENCODING 23425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8040 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B82 +ENCODING 23426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FE0 +4040 +9E80 +1200 +1200 +2200 +2200 +4240 +81C0 +ENDCHAR +STARTCHAR U_5B83 +ENCODING 23427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9040 +1000 +1380 +1C00 +1000 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_5B84 +ENCODING 23428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0800 +7F00 +0900 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5B85 +ENCODING 23429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +0400 +07C0 +7C00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5B86 +ENCODING 23430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +4040 +BF80 +0080 +3F80 +2000 +3FC0 +0040 +02C0 +0100 +ENDCHAR +STARTCHAR U_5B87 +ENCODING 23431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F80 +0200 +0200 +7FE0 +0200 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_5B88 +ENCODING 23432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4040 +8200 +7FC0 +0200 +2200 +1200 +0200 +0E00 +ENDCHAR +STARTCHAR U_5B89 +ENCODING 23433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0800 +FFE0 +1100 +3100 +0E00 +0980 +7060 +ENDCHAR +STARTCHAR U_5B8A +ENCODING 23434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8540 +0480 +7FC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5B8B +ENCODING 23435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8440 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5B8C +ENCODING 23436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F40 +0000 +7FE0 +0A00 +1200 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_5B8D +ENCODING 23437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0400 +FFE0 +0000 +0900 +1080 +2040 +C040 +ENDCHAR +STARTCHAR U_5B8E +ENCODING 23438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5B8F +ENCODING 23439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +8440 +7FE0 +0800 +0A00 +1200 +2480 +4860 +1FA0 +ENDCHAR +STARTCHAR U_5B90 +ENCODING 23440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +8820 +0F80 +1080 +2900 +2500 +0100 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5B91 +ENCODING 23441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +1100 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5B92 +ENCODING 23442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +87A0 +3C00 +0780 +7C00 +07C0 +FC20 +0420 +03E0 +ENDCHAR +STARTCHAR U_5B93 +ENCODING 23443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +84A0 +1480 +5100 +5240 +5420 +98A0 +3080 +CF80 +ENDCHAR +STARTCHAR U_5B94 +ENCODING 23444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +7FC0 +0400 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5B95 +ENCODING 23445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8040 +7FE0 +0800 +1FC0 +3040 +5040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5B96 +ENCODING 23446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7880 +0880 +7880 +4100 +7900 +0A40 +0FE0 +3020 +ENDCHAR +STARTCHAR U_5B97 +ENCODING 23447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +9F80 +0000 +7FE0 +0200 +2280 +2240 +4A40 +0400 +ENDCHAR +STARTCHAR U_5B98 +ENCODING 23448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9FC0 +1080 +1F80 +1000 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5B99 +ENCODING 23449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +8400 +3FC0 +2440 +3FC0 +2440 +2440 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5B9A +ENCODING 23450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8040 +3FC0 +0400 +2400 +2780 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_5B9B +ENCODING 23451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +A040 +3FC0 +2A40 +6A40 +1AC0 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5B9C +ENCODING 23452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9FC0 +1080 +1F80 +1080 +1F80 +1080 +1080 +7FE0 +ENDCHAR +STARTCHAR U_5B9D +ENCODING 23453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +8020 +3F80 +0400 +0400 +3F80 +0500 +0480 +FFE0 +ENDCHAR +STARTCHAR U_5B9E +ENCODING 23454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5020 +8A40 +2200 +1200 +7FE0 +0200 +0500 +0880 +7060 +ENDCHAR +STARTCHAR U_5B9F +ENCODING 23455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +3F80 +0400 +7FC0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5BA0 +ENCODING 23456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +0900 +FFE0 +0A00 +1240 +1280 +2320 +4620 +99E0 +ENDCHAR +STARTCHAR U_5BA1 +ENCODING 23457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +0400 +0400 +ENDCHAR +STARTCHAR U_5BA2 +ENCODING 23458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +9040 +3F00 +5200 +8C00 +3300 +FFC0 +2100 +2100 +3F00 +ENDCHAR +STARTCHAR U_5BA3 +ENCODING 23459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0000 +3F80 +2080 +3F80 +2080 +3F80 +FFE0 +ENDCHAR +STARTCHAR U_5BA4 +ENCODING 23460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +0800 +1100 +3E80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5BA5 +ENCODING 23461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +7FC0 +1000 +3F80 +5080 +9F80 +1080 +1F80 +1180 +ENDCHAR +STARTCHAR U_5BA6 +ENCODING 23462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4040 +BF80 +2200 +3F80 +2080 +3F80 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5BA7 +ENCODING 23463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2200 +2F80 +2880 +2F80 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5BA8 +ENCODING 23464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +2A40 +1A80 +0A00 +1B00 +6AC0 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5BA9 +ENCODING 23465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +A520 +1600 +FFE0 +0E00 +1500 +6480 +8460 +0400 +ENDCHAR +STARTCHAR U_5BAA +ENCODING 23466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8040 +2400 +3F00 +4400 +FFC0 +1200 +1200 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5BAB +ENCODING 23467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8040 +3F00 +2100 +3F00 +0000 +7F80 +4080 +7F80 +4080 +ENDCHAR +STARTCHAR U_5BAC +ENCODING 23468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +42A0 +3FE0 +2200 +3A40 +2A40 +2A80 +2920 +52A0 +8460 +ENDCHAR +STARTCHAR U_5BAD +ENCODING 23469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0880 +7FE0 +0880 +7FC0 +3040 +5FC0 +9040 +ENDCHAR +STARTCHAR U_5BAE +ENCODING 23470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4040 +9F80 +1080 +1F80 +0400 +3FC0 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5BAF +ENCODING 23471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +1F40 +0480 +FFE0 +0900 +3200 +CFC0 +0200 +0E00 +ENDCHAR +STARTCHAR U_5BB0 +ENCODING 23472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +1100 +0A00 +FFE0 +0400 +3FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_5BB1 +ENCODING 23473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2200 +67C0 +AA00 +23C0 +2200 +23C0 +2200 +2200 +ENDCHAR +STARTCHAR U_5BB2 +ENCODING 23474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +1F00 +1100 +1F00 +0400 +FFE0 +0E00 +1500 +64C0 +ENDCHAR +STARTCHAR U_5BB3 +ENCODING 23475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +0400 +3F80 +0400 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5BB4 +ENCODING 23476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +A140 +BF40 +2100 +3F00 +0800 +FFC0 +2200 +1E00 +F1C0 +ENDCHAR +STARTCHAR U_5BB5 +ENCODING 23477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_5BB6 +ENCODING 23478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +1440 +2A80 +1300 +6E80 +1240 +6220 +0C00 +ENDCHAR +STARTCHAR U_5BB7 +ENCODING 23479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +81A0 +3E00 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_5BB8 +ENCODING 23480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2000 +2F80 +2000 +3FE0 +2940 +4880 +8C60 +ENDCHAR +STARTCHAR U_5BB9 +ENCODING 23481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +4A40 +1100 +2080 +DF60 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_5BBA +ENCODING 23482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2080 +3F80 +0000 +FFE0 +1500 +2520 +45E0 +ENDCHAR +STARTCHAR U_5BBB +ENCODING 23483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +4A40 +2480 +1B00 +E0E0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5BBC +ENCODING 23484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7200 +07C0 +FA80 +5480 +5280 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_5BBD +ENCODING 23485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +3F80 +2480 +2480 +2AA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_5BBE +ENCODING 23486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +9F20 +1000 +1FC0 +1100 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5BBF +ENCODING 23487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9020 +1FC0 +2100 +67C0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_5BC0 +ENCODING 23488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +FF20 +2480 +1500 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5BC1 +ENCODING 23489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8440 +7F80 +0500 +FFC0 +0500 +3F80 +2400 +5400 +8FC0 +ENDCHAR +STARTCHAR U_5BC2 +ENCODING 23490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9020 +1DC0 +1140 +FF40 +1140 +3940 +5480 +9140 +3620 +ENDCHAR +STARTCHAR U_5BC3 +ENCODING 23491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5020 +9E40 +2200 +7F80 +2480 +3F80 +0A80 +1220 +E3E0 +ENDCHAR +STARTCHAR U_5BC4 +ENCODING 23492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0380 +ENDCHAR +STARTCHAR U_5BC5 +ENCODING 23493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BC6 +ENCODING 23494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +88A0 +5500 +9240 +14A0 +EFA0 +0400 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5BC7 +ENCODING 23495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8120 +39C0 +0100 +7FC0 +2940 +2880 +2960 +4A20 +87E0 +ENDCHAR +STARTCHAR U_5BC8 +ENCODING 23496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5BC9 +ENCODING 23497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9220 +BFC0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_5BCA +ENCODING 23498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_5BCB +ENCODING 23499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +BFA0 +0900 +7FE0 +1880 +2F40 +4B20 +0840 +07C0 +ENDCHAR +STARTCHAR U_5BCC +ENCODING 23500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +1F00 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5BCD +ENCODING 23501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5240 +9040 +0F80 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_5BCE +ENCODING 23502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8020 +ABE0 +2880 +7BE0 +0AA0 +FAA0 +2B60 +4A20 +8A60 +ENDCHAR +STARTCHAR U_5BCF +ENCODING 23503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +1F00 +2200 +FFC0 +5140 +64C0 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5BD0 +ENCODING 23504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +D120 +57C0 +7100 +1FE0 +F100 +5380 +5540 +9920 +ENDCHAR +STARTCHAR U_5BD1 +ENCODING 23505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8020 +97A0 +2080 +2780 +6080 +AFE0 +2AA0 +2100 +2EE0 +ENDCHAR +STARTCHAR U_5BD2 +ENCODING 23506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +BFA0 +0900 +FFE0 +0900 +1480 +E360 +0C00 +0300 +ENDCHAR +STARTCHAR U_5BD3 +ENCODING 23507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2480 +3F80 +2480 +7FC0 +4540 +5F40 +40C0 +ENDCHAR +STARTCHAR U_5BD4 +ENCODING 23508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +90A0 +1F80 +1080 +FFE0 +1200 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_5BD5 +ENCODING 23509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +0800 +7FC0 +4A40 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BD6 +ENCODING 23510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +80A0 +2780 +1080 +9F80 +6080 +3FE0 +D4A0 +4300 +4C60 +ENDCHAR +STARTCHAR U_5BD7 +ENCODING 23511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +54C0 +3FA0 +E480 +3F80 +2480 +FFE0 +2080 +2180 +ENDCHAR +STARTCHAR U_5BD8 +ENCODING 23512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +7F80 +2100 +3D00 +2F00 +2100 +FFC0 +1200 +E1C0 +ENDCHAR +STARTCHAR U_5BD9 +ENCODING 23513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +89E0 +7700 +5540 +5540 +5540 +5520 +9DE0 +A240 +ENDCHAR +STARTCHAR U_5BDA +ENCODING 23514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +7FC0 +2000 +3FC0 +C400 +2440 +7FC0 +ENDCHAR +STARTCHAR U_5BDB +ENCODING 23515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +BF80 +1200 +3F80 +2080 +3F80 +2A80 +0A20 +71E0 +ENDCHAR +STARTCHAR U_5BDC +ENCODING 23516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +9100 +5F40 +0000 +3F80 +2A80 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BDD +ENCODING 23517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +97A0 +5080 +3780 +1080 +3FE0 +DAA0 +1100 +1EE0 +ENDCHAR +STARTCHAR U_5BDE +ENCODING 23518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +FFE0 +2080 +3F80 +2080 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5BDF +ENCODING 23519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A220 +BDE0 +6940 +5080 +2F40 +C020 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_5BE0 +ENCODING 23520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +FFE0 +2480 +7FC0 +4440 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5BE1 +ENCODING 23521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +3F00 +2100 +3F00 +2100 +FFC0 +4A80 +9240 +6600 +ENDCHAR +STARTCHAR U_5BE2 +ENCODING 23522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +5780 +5080 +7780 +1000 +FFE0 +5AA0 +5100 +9EE0 +ENDCHAR +STARTCHAR U_5BE3 +ENCODING 23523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +5FE0 +5000 +77C0 +1000 +F7C0 +5440 +57C0 +9440 +ENDCHAR +STARTCHAR U_5BE4 +ENCODING 23524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +57C0 +5100 +77C0 +1240 +FFE0 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_5BE5 +ENCODING 23525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +99A0 +2A80 +0E00 +F5E0 +1900 +0600 +0180 +1E00 +ENDCHAR +STARTCHAR U_5BE6 +ENCODING 23526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +7FC0 +2A00 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BE7 +ENCODING 23527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8420 +32C0 +5FA0 +0000 +3F80 +2A80 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BE8 +ENCODING 23528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +1100 +FFE0 +2480 +5F40 +8420 +2480 +4C40 +ENDCHAR +STARTCHAR U_5BE9 +ENCODING 23529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +1500 +FFE0 +1500 +7FC0 +A4A0 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_5BEA +ENCODING 23530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +1500 +3F80 +2080 +3FC0 +2040 +3FE0 +5520 +AA60 +ENDCHAR +STARTCHAR U_5BEB +ENCODING 23531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +B3A0 +2080 +3B80 +2080 +3FE0 +D520 +2AA0 +4AC0 +ENDCHAR +STARTCHAR U_5BEC +ENCODING 23532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +3F80 +2080 +3F80 +20E0 +3FA0 +E0E0 +ENDCHAR +STARTCHAR U_5BED +ENCODING 23533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +BF80 +0400 +3F80 +24A0 +FFE0 +0400 +5140 +8F20 +ENDCHAR +STARTCHAR U_5BEE +ENCODING 23534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +FFE0 +5240 +3F80 +E0E0 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_5BEF +ENCODING 23535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A220 +3FC0 +6200 +BFE0 +2200 +7BC0 +4A40 +4E40 +40C0 +ENDCHAR +STARTCHAR U_5BF0 +ENCODING 23536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2A80 +FFE0 +2080 +3F80 +1280 +F100 +18E0 +ENDCHAR +STARTCHAR U_5BF1 +ENCODING 23537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8120 +57C0 +5440 +77C0 +1440 +FFE0 +5380 +5540 +9920 +ENDCHAR +STARTCHAR U_5BF2 +ENCODING 23538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A820 +B7E0 +3D40 +03E0 +7CA0 +1280 +7EE0 +2A80 +C5E0 +ENDCHAR +STARTCHAR U_5BF3 +ENCODING 23539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8220 +7BC0 +1540 +7B80 +1540 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_5BF4 +ENCODING 23540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9020 +7DE0 +2920 +7FE0 +1120 +7DE0 +10C0 +5540 +B260 +ENDCHAR +STARTCHAR U_5BF5 +ENCODING 23541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +93A0 +7A00 +2BC0 +FC40 +4BC0 +7A00 +4BC0 +7A20 +59E0 +ENDCHAR +STARTCHAR U_5BF6 +ENCODING 23542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A520 +77C0 +2540 +FFC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BF7 +ENCODING 23543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_5BF8 +ENCODING 23544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +0200 +FFC0 +0200 +2200 +1200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_5BF9 +ENCODING 23545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +1FE0 +9080 +5080 +2480 +2280 +5080 +5080 +8280 +0100 +ENDCHAR +STARTCHAR U_5BFA +ENCODING 23546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0100 +FFE0 +2100 +1100 +0500 +0200 +ENDCHAR +STARTCHAR U_5BFB +ENCODING 23547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +0080 +7F80 +0100 +FFE0 +2100 +1100 +0500 +0200 +ENDCHAR +STARTCHAR U_5BFC +ENCODING 23548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3FA0 +2020 +1FE0 +0100 +FFE0 +1100 +0900 +0900 +0300 +ENDCHAR +STARTCHAR U_5BFD +ENCODING 23549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +4840 +2480 +1500 +0080 +FFE0 +2080 +1080 +1280 +0100 +ENDCHAR +STARTCHAR U_5BFE +ENCODING 23550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +FBE0 +1040 +9240 +5140 +2140 +2040 +5040 +4940 +8880 +ENDCHAR +STARTCHAR U_5BFF +ENCODING 23551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0800 +FFE0 +1080 +3FE0 +4880 +0480 +0180 +ENDCHAR +STARTCHAR U_5C00 +ENCODING 23552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FC40 +83E0 +B840 +AA40 +A940 +B940 +A840 +8040 +FD40 +0080 +ENDCHAR +STARTCHAR U_5C01 +ENCODING 23553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +1040 +13E0 +FC40 +1240 +7D40 +1040 +1040 +1C40 +E1C0 +ENDCHAR +STARTCHAR U_5C02 +ENCODING 23554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0100 +FFE0 +2100 +1100 +1300 +ENDCHAR +STARTCHAR U_5C03 +ENCODING 23555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0900 +FFC0 +4880 +7F80 +4880 +7F80 +4880 +4100 +FFC0 +4100 +2700 +ENDCHAR +STARTCHAR U_5C04 +ENCODING 23556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7C40 +4440 +7FE0 +4440 +7E40 +4540 +FC40 +2440 +4440 +8CC0 +ENDCHAR +STARTCHAR U_5C05 +ENCODING 23557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +7C40 +4540 +7D40 +2840 +2940 +2880 +4820 +87C0 +ENDCHAR +STARTCHAR U_5C06 +ENCODING 23558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +A480 +6B00 +2280 +2480 +6FE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_5C07 +ENCODING 23559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53E0 +5540 +5280 +F140 +1240 +FFE0 +5240 +5140 +5040 +91C0 +ENDCHAR +STARTCHAR U_5C08 +ENCODING 23560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +3F80 +2480 +7F80 +0540 +FFE0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_5C09 +ENCODING 23561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4240 +7E40 +41E0 +5C40 +4140 +7EC0 +4840 +5C40 +EA40 +99C0 +ENDCHAR +STARTCHAR U_5C0A +ENCODING 23562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3FC0 +2A40 +35C0 +3FC0 +0100 +FFE0 +1100 +0700 +ENDCHAR +STARTCHAR U_5C0B +ENCODING 23563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +0080 +FFC0 +2240 +FBC0 +0100 +FFE0 +2100 +1700 +ENDCHAR +STARTCHAR U_5C0C +ENCODING 23564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FC40 +2040 +FBE0 +0040 +FA40 +8940 +F940 +8840 +5140 +FC80 +ENDCHAR +STARTCHAR U_5C0D +ENCODING 23565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +AA40 +6C40 +FFE0 +2840 +7D40 +10C0 +7C40 +1040 +1D40 +E080 +ENDCHAR +STARTCHAR U_5C0E +ENCODING 23566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0840 +CF40 +4BC0 +4840 +BFE0 +0080 +FFE0 +1080 +0980 +ENDCHAR +STARTCHAR U_5C0F +ENCODING 23567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +2440 +4440 +4420 +8420 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5C10 +ENCODING 23568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +4440 +8420 +0400 +2400 +5000 +0800 +0600 +01E0 +ENDCHAR +STARTCHAR U_5C11 +ENCODING 23569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +1480 +1440 +2420 +4480 +0500 +0200 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_5C12 +ENCODING 23570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C460 +0500 +2480 +2480 +4440 +9440 +0800 +ENDCHAR +STARTCHAR U_5C13 +ENCODING 23571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +3FE0 +4400 +8400 +1500 +2480 +4440 +8440 +1400 +0800 +ENDCHAR +STARTCHAR U_5C14 +ENCODING 23572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8480 +0400 +2500 +2480 +4480 +4440 +8440 +1C00 +ENDCHAR +STARTCHAR U_5C15 +ENCODING 23573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +1100 +13E0 +2020 +44C0 +8400 +2480 +2440 +4420 +9420 +0800 +ENDCHAR +STARTCHAR U_5C16 +ENCODING 23574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +4440 +8020 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5C17 +ENCODING 23575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +0400 +FFE0 +0400 +2500 +2480 +4440 +9440 +0800 +ENDCHAR +STARTCHAR U_5C18 +ENCODING 23576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +2440 +4420 +8000 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5C19 +ENCODING 23577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4440 +8420 +7FC0 +4040 +5F40 +5140 +5F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_5C1A +ENCODING 23578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +1500 +FFE0 +8020 +9F20 +9120 +9120 +9F20 +8020 +80E0 +ENDCHAR +STARTCHAR U_5C1B +ENCODING 23579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +4440 +0400 +1080 +1080 +5AC0 +94A0 +1080 +3180 +ENDCHAR +STARTCHAR U_5C1C +ENCODING 23580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4440 +8020 +0400 +FFE0 +1500 +E4E0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_5C1D +ENCODING 23581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +1000 +2080 +7FC0 +ENDCHAR +STARTCHAR U_5C1E +ENCODING 23582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +1F00 +3180 +DF60 +1100 +1F00 +0400 +2480 +4C40 +ENDCHAR +STARTCHAR U_5C1F +ENCODING 23583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7DC0 +46A0 +7CA0 +0080 +FCA0 +5040 +5D80 +B000 +8FE0 +ENDCHAR +STARTCHAR U_5C20 +ENCODING 23584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4880 +79C0 +49A0 +7A80 +48A0 +FCA0 +5840 +6480 +7F00 +ENDCHAR +STARTCHAR U_5C21 +ENCODING 23585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA20 +73E0 +2220 +FBE0 +5280 +53A0 +52C0 +5280 +9AA0 +9360 +ENDCHAR +STARTCHAR U_5C22 +ENCODING 23586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +0A00 +0A00 +0A00 +1200 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_5C23 +ENCODING 23587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1200 +2100 +4080 +9240 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5C24 +ENCODING 23588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +0800 +FFE0 +0A00 +0A00 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5C25 +ENCODING 23589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +2040 +2A40 +2940 +2940 +2840 +28E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C26 +ENCODING 23590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +43C0 +AC40 +2A40 +2940 +2840 +2940 +48A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C27 +ENCODING 23591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FD00 +0A40 +0C40 +73C0 +0000 +FFE0 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5C28 +ENCODING 23592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0840 +FFE0 +0A00 +0B40 +16A0 +1340 +1680 +2320 +4620 +81E0 +ENDCHAR +STARTCHAR U_5C29 +ENCODING 23593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +27C0 +4500 +A900 +2BC0 +2900 +2900 +2FC0 +2800 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C2A +ENCODING 23594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +F900 +57C0 +5100 +5100 +5100 +5FE0 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2B +ENCODING 23595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +57C0 +5100 +5100 +57C0 +5100 +5100 +57E0 +5000 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2C +ENCODING 23596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4240 +FC20 +5280 +5280 +5280 +5280 +5280 +54A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2D +ENCODING 23597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2080 +FFE0 +2080 +7FC0 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5C2E +ENCODING 23598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4480 +FCC0 +5440 +58C0 +5100 +5FE0 +5540 +5920 +5120 +8FE0 +ENDCHAR +STARTCHAR U_5C2F +ENCODING 23599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +FFE0 +5400 +55C0 +5540 +55C0 +5520 +59E0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5C30 +ENCODING 23600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +FFE0 +5540 +57C0 +5540 +57C0 +5100 +57C0 +9120 +8FE0 +ENDCHAR +STARTCHAR U_5C31 +ENCODING 23601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD40 +0120 +7FE0 +4A80 +7A80 +1280 +5AA0 +56A0 +92A0 +3460 +ENDCHAR +STARTCHAR U_5C32 +ENCODING 23602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FC0 +4500 +FFC0 +5540 +5FE0 +5540 +5FC0 +55A0 +5D60 +8FE0 +ENDCHAR +STARTCHAR U_5C33 +ENCODING 23603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +F540 +5FE0 +5A20 +53C0 +5240 +53C0 +5240 +9260 +8FE0 +ENDCHAR +STARTCHAR U_5C34 +ENCODING 23604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4AE0 +FB80 +4A40 +A200 +A000 +AFE0 +AAA0 +BFE0 +A020 +9FE0 +ENDCHAR +STARTCHAR U_5C35 +ENCODING 23605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +5FE0 +5000 +57C0 +5540 +57C0 +5280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_5C36 +ENCODING 23606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5560 +57C0 +54A0 +57A0 +5520 +57E0 +5540 +5FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5C37 +ENCODING 23607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4AE0 +FF00 +4940 +4F20 +4A00 +4FE0 +AAA0 +BFE0 +A020 +9FE0 +ENDCHAR +STARTCHAR U_5C38 +ENCODING 23608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +2020 +2020 +3FE0 +2020 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5C39 +ENCODING 23609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0880 +0880 +FFC0 +0880 +0880 +7F80 +1080 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5C3A +ENCODING 23610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +2040 +3FC0 +2400 +2400 +2200 +2100 +4080 +8060 +ENDCHAR +STARTCHAR U_5C3B +ENCODING 23611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2400 +3F80 +2480 +2480 +44A0 +48A0 +90E0 +ENDCHAR +STARTCHAR U_5C3C +ENCODING 23612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2000 +2840 +2980 +2E00 +4820 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C3D +ENCODING 23613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2200 +2100 +4C80 +4240 +9820 +0400 +0200 +ENDCHAR +STARTCHAR U_5C3E +ENCODING 23614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2180 +3E00 +23C0 +3E00 +23C0 +3E20 +4220 +83E0 +ENDCHAR +STARTCHAR U_5C3F +ENCODING 23615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +2240 +3E80 +2700 +2A80 +5240 +AA20 +0400 +ENDCHAR +STARTCHAR U_5C40 +ENCODING 23616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +3FE0 +2020 +2F20 +2920 +4F20 +4920 +80C0 +ENDCHAR +STARTCHAR U_5C41 +ENCODING 23617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2900 +2900 +2F40 +2980 +2900 +2B20 +4D20 +89E0 +ENDCHAR +STARTCHAR U_5C42 +ENCODING 23618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +2FC0 +2000 +3FE0 +2200 +2480 +4840 +8FE0 +ENDCHAR +STARTCHAR U_5C43 +ENCODING 23619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +5040 +5240 +5240 +5200 +44C0 +9820 +ENDCHAR +STARTCHAR U_5C44 +ENCODING 23620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2FE0 +2820 +2AA0 +2480 +2440 +4820 +9020 +ENDCHAR +STARTCHAR U_5C45 +ENCODING 23621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +3FE0 +2200 +2FC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5C46 +ENCODING 23622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2920 +2FE0 +2920 +2FE0 +2820 +4FE0 +8820 +ENDCHAR +STARTCHAR U_5C47 +ENCODING 23623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2FE0 +2920 +2920 +2FE0 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_5C48 +ENCODING 23624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2920 +2920 +2FE0 +2100 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_5C49 +ENCODING 23625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2A80 +2A80 +3FE0 +2A80 +2A80 +4B80 +4800 +8FE0 +ENDCHAR +STARTCHAR U_5C4A +ENCODING 23626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2100 +2FE0 +2920 +2FE0 +4920 +4FE0 +8820 +ENDCHAR +STARTCHAR U_5C4B +ENCODING 23627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +3FE0 +2480 +2FC0 +2100 +2FC0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5C4C +ENCODING 23628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2FC0 +2840 +2FC0 +2100 +2FE0 +4920 +8960 +ENDCHAR +STARTCHAR U_5C4D +ENCODING 23629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +3FE0 +2900 +2F20 +3340 +2DA0 +4920 +90E0 +ENDCHAR +STARTCHAR U_5C4E +ENCODING 23630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2200 +2A40 +2680 +3FE0 +2300 +2680 +4A40 +9220 +ENDCHAR +STARTCHAR U_5C4F +ENCODING 23631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2840 +2480 +3FE0 +2480 +3FE0 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_5C50 +ENCODING 23632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2480 +2BE0 +3480 +2BE0 +3940 +2880 +4940 +8A20 +ENDCHAR +STARTCHAR U_5C51 +ENCODING 23633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2920 +2540 +2FC0 +2840 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5C52 +ENCODING 23634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FC0 +5000 +5FC0 +5000 +5FE0 +A940 +CCE0 +ENDCHAR +STARTCHAR U_5C53 +ENCODING 23635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +4480 +9840 +ENDCHAR +STARTCHAR U_5C54 +ENCODING 23636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +7420 +4420 +7FE0 +5500 +5520 +5540 +5580 +5D20 +F520 +08E0 +ENDCHAR +STARTCHAR U_5C55 +ENCODING 23637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4900 +7FC0 +4900 +7FE0 +5240 +5180 +9480 +9860 +ENDCHAR +STARTCHAR U_5C56 +ENCODING 23638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2200 +3FE0 +2500 +3FE0 +2200 +3FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5C57 +ENCODING 23639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4A40 +7140 +5D40 +7040 +5D40 +70A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C58 +ENCODING 23640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +7C80 +4880 +73E0 +5080 +7C80 +5080 +7DA0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5C59 +ENCODING 23641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FE0 +5440 +59C0 +5540 +55C0 +5C40 +90C0 +ENDCHAR +STARTCHAR U_5C5A +ENCODING 23642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +7FE0 +4200 +7FE0 +6AA0 +6220 +AAA0 +A260 +ENDCHAR +STARTCHAR U_5C5B +ENCODING 23643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4440 +4880 +5DE0 +4880 +5DE0 +4880 +8880 +9080 +ENDCHAR +STARTCHAR U_5C5C +ENCODING 23644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4AA0 +52A0 +6FE0 +52A0 +72A0 +52E0 +9200 +93E0 +ENDCHAR +STARTCHAR U_5C5D +ENCODING 23645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2500 +3DE0 +2500 +3DC0 +2500 +5DE0 +4500 +8500 +ENDCHAR +STARTCHAR U_5C5E +ENCODING 23646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +5F80 +4200 +5FC0 +5240 +BFE0 +A220 +AF60 +ENDCHAR +STARTCHAR U_5C5F +ENCODING 23647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5280 +7FE0 +5280 +5F80 +4400 +7FE0 +5480 +A440 +ENDCHAR +STARTCHAR U_5C60 +ENCODING 23648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2240 +2F40 +2280 +3FE0 +2440 +2FC0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5C61 +ENCODING 23649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2940 +3FE0 +2940 +3220 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_5C62 +ENCODING 23650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A80 +7FE0 +4A40 +7FE0 +4480 +4880 +8700 +BCE0 +ENDCHAR +STARTCHAR U_5C63 +ENCODING 23651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2480 +2AE0 +3680 +2BE0 +2A80 +2AE0 +4D80 +88E0 +ENDCHAR +STARTCHAR U_5C64 +ENCODING 23652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FE0 +5520 +5FE0 +4840 +4FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_5C65 +ENCODING 23653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A40 +53C0 +6A40 +53C0 +7640 +5A80 +9180 +9660 +ENDCHAR +STARTCHAR U_5C66 +ENCODING 23654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5540 +67E0 +4B40 +5520 +77E0 +5240 +9180 +9660 +ENDCHAR +STARTCHAR U_5C67 +ENCODING 23655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5540 +6FE0 +4D40 +57E0 +7100 +5FE0 +9540 +9920 +ENDCHAR +STARTCHAR U_5C68 +ENCODING 23656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2AA0 +37E0 +26A0 +2AA0 +3FE0 +4A40 +4980 +8E60 +ENDCHAR +STARTCHAR U_5C69 +ENCODING 23657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +FFE0 +9100 +AFE0 +D480 +AFE0 +E480 +AFE0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_5C6A +ENCODING 23658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4200 +7FE0 +68A0 +5FC0 +68A0 +4F80 +8A80 +B260 +ENDCHAR +STARTCHAR U_5C6B +ENCODING 23659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4900 +6FE0 +6A40 +7DA0 +4BE0 +BAA0 +ABA0 +CA60 +ENDCHAR +STARTCHAR U_5C6C +ENCODING 23660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2A80 +3FC0 +2540 +3FE0 +3AA0 +2FA0 +42A0 +9F60 +ENDCHAR +STARTCHAR U_5C6D +ENCODING 23661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5040 +5FC0 +5040 +5FC0 +5540 +5540 +5DC0 +A220 +ENDCHAR +STARTCHAR U_5C6E +ENCODING 23662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_5C6F +ENCODING 23663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2480 +2480 +2480 +3F80 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5C70 +ENCODING 23664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1200 +FFE0 +0400 +4440 +4440 +7FC0 +4440 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_5C71 +ENCODING 23665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_5C72 +ENCODING 23666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03E0 +FC00 +0400 +0400 +4440 +4440 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5C73 +ENCODING 23667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0400 +0A00 +3180 +C460 +0400 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5C74 +ENCODING 23668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0400 +FF80 +0880 +0880 +1080 +2480 +C300 +ENDCHAR +STARTCHAR U_5C75 +ENCODING 23669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_5C76 +ENCODING 23670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +1040 +1040 +1040 +2140 +C080 +ENDCHAR +STARTCHAR U_5C77 +ENCODING 23671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +AA80 +AB00 +ABE0 +AA20 +AA20 +AA20 +FA20 +84A0 +0860 +ENDCHAR +STARTCHAR U_5C78 +ENCODING 23672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A900 +A900 +A900 +A900 +A900 +A900 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5C79 +ENCODING 23673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AA00 +AC00 +ABE0 +A840 +A880 +A900 +F920 +8A20 +01E0 +ENDCHAR +STARTCHAR U_5C7A +ENCODING 23674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +A820 +A820 +ABE0 +AA20 +AA00 +AA00 +FA20 +8A20 +01E0 +ENDCHAR +STARTCHAR U_5C7B +ENCODING 23675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +A920 +AB20 +AD20 +A920 +A920 +AA20 +FA20 +04A0 +0840 +ENDCHAR +STARTCHAR U_5C7C +ENCODING 23676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AA80 +AA80 +AA80 +AA80 +AA80 +BA80 +C4A0 +04A0 +08E0 +ENDCHAR +STARTCHAR U_5C7D +ENCODING 23677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +A900 +A900 +AFE0 +A900 +A900 +A900 +F900 +8100 +ENDCHAR +STARTCHAR U_5C7E +ENCODING 23678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +BAA0 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5C7F +ENCODING 23679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +23E0 +AA00 +AA00 +ABE0 +A820 +AFA0 +B820 +C020 +00C0 +ENDCHAR +STARTCHAR U_5C80 +ENCODING 23680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +4040 +0400 +8420 +8420 +8420 +FFE0 +8020 +ENDCHAR +STARTCHAR U_5C81 +ENCODING 23681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +0FC0 +1040 +6880 +0500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_5C82 +ENCODING 23682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF00 +0100 +FF00 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5C83 +ENCODING 23683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +FFC0 +0440 +2440 +C840 +1040 +61C0 +ENDCHAR +STARTCHAR U_5C84 +ENCODING 23684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AA20 +ABE0 +AA20 +AA20 +ABE0 +AA20 +FA20 +8420 +0860 +ENDCHAR +STARTCHAR U_5C85 +ENCODING 23685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +ABC0 +AA40 +AA40 +AB40 +BC80 +C480 +0940 +1220 +ENDCHAR +STARTCHAR U_5C86 +ENCODING 23686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2380 +A880 +A880 +AFE0 +A880 +A880 +A940 +FA40 +8C20 +0820 +ENDCHAR +STARTCHAR U_5C87 +ENCODING 23687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +FF80 +0000 +3780 +C480 +8480 +A680 +C500 +0400 +0400 +ENDCHAR +STARTCHAR U_5C88 +ENCODING 23688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +AA80 +AA80 +AFE0 +A880 +A980 +AA80 +FC80 +8A80 +0100 +ENDCHAR +STARTCHAR U_5C89 +ENCODING 23689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +AFE0 +AAA0 +AAA0 +AAA0 +ACA0 +A920 +FA20 +8C20 +00C0 +ENDCHAR +STARTCHAR U_5C8A +ENCODING 23690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8040 +8040 +7FC0 +0800 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_5C8B +ENCODING 23691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +AA40 +AA80 +AAE0 +AA20 +AA40 +FD40 +8480 +0940 +1220 +ENDCHAR +STARTCHAR U_5C8C +ENCODING 23692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +8840 +FFC0 +0000 +FF80 +1100 +1380 +1900 +2600 +4900 +B0C0 +ENDCHAR +STARTCHAR U_5C8D +ENCODING 23693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +AA40 +AA40 +AFE0 +AA40 +AA40 +AA40 +FA40 +8C40 +0840 +ENDCHAR +STARTCHAR U_5C8E +ENCODING 23694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +AA80 +AC40 +A820 +AFC0 +AA40 +BA40 +C240 +0540 +0880 +ENDCHAR +STARTCHAR U_5C8F +ENCODING 23695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +A800 +AFE0 +AA80 +AA80 +AA80 +FA80 +8AA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5C90 +ENCODING 23696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A900 +A900 +AFC0 +AC40 +AC40 +FA80 +8900 +0280 +0C60 +ENDCHAR +STARTCHAR U_5C91 +ENCODING 23697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0400 +0A00 +3580 +C260 +1F80 +0100 +0200 +0400 +ENDCHAR +STARTCHAR U_5C92 +ENCODING 23698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC60 +A920 +A880 +A800 +AFE0 +F840 +8840 +0080 +0100 +ENDCHAR +STARTCHAR U_5C93 +ENCODING 23699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +AA00 +AA00 +ABE0 +AA40 +AA40 +FA40 +8A40 +0440 +0840 +ENDCHAR +STARTCHAR U_5C94 +ENCODING 23700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4080 +BF60 +0900 +1100 +6600 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5C95 +ENCODING 23701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0400 +0A00 +3180 +C060 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5C96 +ENCODING 23702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +AB20 +AAA0 +AA40 +AA40 +AAA0 +FB20 +8A00 +0200 +03E0 +ENDCHAR +STARTCHAR U_5C97 +ENCODING 23703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF80 +A280 +9480 +8C80 +9280 +A080 +8180 +ENDCHAR +STARTCHAR U_5C98 +ENCODING 23704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +A880 +F9A0 +8AA0 +0460 +ENDCHAR +STARTCHAR U_5C99 +ENCODING 23705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +0A00 +3580 +C460 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5C9A +ENCODING 23706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +7FC0 +4040 +5140 +4A40 +4440 +4A40 +9120 +ENDCHAR +STARTCHAR U_5C9B +ENCODING 23707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +7F00 +5100 +4900 +4200 +7FC0 +1040 +9240 +9240 +FE40 +0180 +ENDCHAR +STARTCHAR U_5C9C +ENCODING 23708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF00 +8900 +FF00 +8100 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_5C9D +ENCODING 23709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4440 +4440 +7FC0 +1000 +3FC0 +4800 +8F80 +0800 +0FC0 +0800 +0800 +ENDCHAR +STARTCHAR U_5C9E +ENCODING 23710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +23E0 +AD00 +A900 +A9E0 +A900 +A9E0 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_5C9F +ENCODING 23711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFC0 +AD40 +AD40 +AD40 +AFE0 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5CA0 +ENCODING 23712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +AA00 +ABC0 +AA40 +AA40 +ABC0 +FA40 +8A00 +0200 +03E0 +ENDCHAR +STARTCHAR U_5CA1 +ENCODING 23713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9120 +8A20 +FFE0 +8420 +A4A0 +A4A0 +BFA0 +8020 +80E0 +ENDCHAR +STARTCHAR U_5CA2 +ENCODING 23714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4220 +7FE0 +0000 +FFE0 +0080 +3C80 +2480 +3C80 +0080 +0180 +ENDCHAR +STARTCHAR U_5CA3 +ENCODING 23715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +ABE0 +AC20 +ABA0 +AAA0 +AAA0 +ABA0 +F820 +8820 +00C0 +ENDCHAR +STARTCHAR U_5CA4 +ENCODING 23716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +AFE0 +A820 +AA80 +AA80 +AA80 +AA40 +FC40 +8420 +0820 +ENDCHAR +STARTCHAR U_5CA5 +ENCODING 23717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AAA0 +AA80 +ABE0 +AA40 +AA40 +FB40 +8A80 +0540 +0A20 +ENDCHAR +STARTCHAR U_5CA6 +ENCODING 23718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +0400 +7FC0 +0000 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_5CA7 +ENCODING 23719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4440 +7FC0 +0000 +FFC0 +0840 +3280 +C100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5CA8 +ENCODING 23720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AA40 +ABC0 +AA40 +AA40 +ABC0 +FA40 +8A40 +0240 +0FE0 +ENDCHAR +STARTCHAR U_5CA9 +ENCODING 23721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +8840 +FFC0 +0000 +FFC0 +1000 +3F80 +6080 +A080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5CAA +ENCODING 23722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +1200 +FFC0 +1240 +FFC0 +9200 +FFC0 +1240 +2240 +C280 +ENDCHAR +STARTCHAR U_5CAB +ENCODING 23723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +ABE0 +AAA0 +AAA0 +ABE0 +AAA0 +AAA0 +FAA0 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CAC +ENCODING 23724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +AAA0 +ABE0 +AAA0 +AAA0 +ABE0 +FAA0 +8880 +0080 +0080 +ENDCHAR +STARTCHAR U_5CAD +ENCODING 23725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +AA40 +AD20 +A880 +A800 +AFE0 +B840 +EB80 +0080 +0040 +ENDCHAR +STARTCHAR U_5CAE +ENCODING 23726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +AFE0 +AC20 +A900 +A920 +A940 +A980 +F920 +8920 +00E0 +ENDCHAR +STARTCHAR U_5CAF +ENCODING 23727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +A900 +A900 +AB40 +AD20 +A920 +F900 +8900 +0000 +0FE0 +ENDCHAR +STARTCHAR U_5CB0 +ENCODING 23728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +ADE0 +AAA0 +AEA0 +AAA0 +ACA0 +FAA0 +8FA0 +0120 +0240 +ENDCHAR +STARTCHAR U_5CB1 +ENCODING 23729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2440 +3FE0 +6200 +A120 +24E0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5CB2 +ENCODING 23730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +2220 +2220 +AA20 +ABE0 +A940 +A940 +A940 +B940 +CA40 +0460 +ENDCHAR +STARTCHAR U_5CB3 +ENCODING 23731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FC0 +2200 +2200 +FFE0 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CB4 +ENCODING 23732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2200 +2200 +AA00 +ABE0 +AA40 +AA40 +AA40 +BA40 +CA40 +07E0 +ENDCHAR +STARTCHAR U_5CB5 +ENCODING 23733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +ABE0 +A880 +A880 +ABE0 +AA20 +AA20 +FA20 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CB6 +ENCODING 23734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2100 +ABE0 +AA20 +AA20 +ABE0 +AA20 +AA20 +FA20 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CB7 +ENCODING 23735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AA20 +ABE0 +AA80 +AA80 +ABE0 +AA80 +FAA0 +8B60 +0620 +ENDCHAR +STARTCHAR U_5CB8 +ENCODING 23736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +7FE0 +4000 +5FC0 +4200 +7FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5CB9 +ENCODING 23737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +2120 +2120 +A920 +AA60 +A800 +ABE0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5CBA +ENCODING 23738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +0A00 +3580 +C460 +1F00 +0100 +0A00 +0400 +ENDCHAR +STARTCHAR U_5CBB +ENCODING 23739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +2380 +2280 +AA80 +ABE0 +AA80 +AA80 +AA80 +AA40 +FB40 +02A0 +ENDCHAR +STARTCHAR U_5CBC +ENCODING 23740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2100 +2120 +AD40 +AB80 +AFE0 +A900 +A900 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_5CBD +ENCODING 23741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +7FE0 +1200 +7FC0 +0200 +1280 +2A40 +C420 +ENDCHAR +STARTCHAR U_5CBE +ENCODING 23742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +2080 +2080 +A8E0 +A880 +A880 +ABE0 +AA20 +BA20 +CA20 +03E0 +ENDCHAR +STARTCHAR U_5CBF +ENCODING 23743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +4FE0 +4820 +4820 +4BE0 +4820 +3020 +C7E0 +ENDCHAR +STARTCHAR U_5CC0 +ENCODING 23744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +FF80 +0800 +FF80 +8880 +8880 +FF80 +8880 +8880 +FF80 +ENDCHAR +STARTCHAR U_5CC1 +ENCODING 23745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0800 +73C0 +4240 +4A40 +5A40 +EAC0 +1200 +E200 +ENDCHAR +STARTCHAR U_5CC2 +ENCODING 23746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2440 +AA80 +A900 +AA80 +AC60 +AB00 +B880 +CA00 +0180 +ENDCHAR +STARTCHAR U_5CC3 +ENCODING 23747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24C0 +1500 +FFE0 +8020 +0400 +4440 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CC4 +ENCODING 23748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +AA80 +A900 +AEE0 +A900 +AFC0 +F900 +8FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5CC5 +ENCODING 23749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +2240 +AFE0 +AA40 +AA40 +AFE0 +AA40 +BA40 +CC40 +0840 +ENDCHAR +STARTCHAR U_5CC6 +ENCODING 23750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC40 +A820 +ABC0 +A800 +ABC0 +FA40 +8A40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5CC7 +ENCODING 23751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0A00 +1100 +2080 +5F40 +8020 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5CC8 +ENCODING 23752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AE40 +A980 +AA40 +AC20 +ABE0 +FA20 +8A20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5CC9 +ENCODING 23753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1000 +3F80 +5100 +8E00 +3180 +DF60 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_5CCA +ENCODING 23754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4000 +7F80 +4080 +7F80 +8440 +8440 +FFC0 +ENDCHAR +STARTCHAR U_5CCB +ENCODING 23755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AC20 +ABA0 +AAA0 +ABA0 +AAA0 +FBA0 +8AA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5CCC +ENCODING 23756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A900 +AA40 +AFA0 +A900 +A900 +FFC0 +8900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5CCD +ENCODING 23757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2140 +AFE0 +A940 +AFC0 +A900 +AFC0 +B900 +CFE0 +0100 +ENDCHAR +STARTCHAR U_5CCE +ENCODING 23758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +0000 +7F80 +4080 +7F80 +4080 +7FC0 +4480 +5B00 +61C0 +ENDCHAR +STARTCHAR U_5CCF +ENCODING 23759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AA00 +AFE0 +AAA0 +AAA0 +AAA0 +FAA0 +8AA0 +0A20 +0860 +ENDCHAR +STARTCHAR U_5CD0 +ENCODING 23760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +A920 +ABC0 +A880 +A920 +FA40 +8880 +0140 +0620 +ENDCHAR +STARTCHAR U_5CD1 +ENCODING 23761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +1B00 +E0E0 +1F00 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5CD2 +ENCODING 23762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +ABA0 +A820 +ABA0 +AAA0 +AAA0 +FBA0 +8AA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5CD3 +ENCODING 23763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A900 +AFC0 +A940 +AFC0 +A900 +FFE0 +8AA0 +0440 +0820 +ENDCHAR +STARTCHAR U_5CD4 +ENCODING 23764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +AFA0 +A940 +AFE0 +A900 +AA40 +FE80 +8B20 +0220 +01E0 +ENDCHAR +STARTCHAR U_5CD5 +ENCODING 23765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_5CD6 +ENCODING 23766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +AD20 +A900 +AFE0 +A940 +AA40 +FA40 +8980 +0340 +0C20 +ENDCHAR +STARTCHAR U_5CD7 +ENCODING 23767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +AFE0 +AC00 +ADE0 +AD20 +FD60 +8500 +0920 +10E0 +ENDCHAR +STARTCHAR U_5CD8 +ENCODING 23768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +ABC0 +AA40 +AA40 +ABC0 +AA40 +FBC0 +8A40 +0000 +07E0 +ENDCHAR +STARTCHAR U_5CD9 +ENCODING 23769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +A900 +AFE0 +A840 +AFE0 +AA40 +F940 +8840 +01C0 +ENDCHAR +STARTCHAR U_5CDA +ENCODING 23770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +0400 +FFE0 +1100 +2480 +DF60 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5CDB +ENCODING 23771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +FFC0 +0000 +FC40 +2140 +3D40 +4940 +A940 +1140 +2040 +C0C0 +ENDCHAR +STARTCHAR U_5CDC +ENCODING 23772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +0A00 +3580 +C460 +1700 +1400 +1400 +FFE0 +ENDCHAR +STARTCHAR U_5CDD +ENCODING 23773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +FF80 +0000 +FF80 +8080 +BE80 +8080 +BE80 +A280 +BE80 +8180 +ENDCHAR +STARTCHAR U_5CDE +ENCODING 23774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1000 +1F00 +2200 +7FE0 +2000 +2F80 +48A0 +4920 +87E0 +ENDCHAR +STARTCHAR U_5CDF +ENCODING 23775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +FFE0 +1000 +3F80 +5080 +9F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5CE0 +ENCODING 23776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +21C0 +2100 +AFE0 +A800 +AFE0 +A900 +A980 +B940 +C920 +0100 +ENDCHAR +STARTCHAR U_5CE1 +ENCODING 23777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +AD20 +AB40 +A900 +AFE0 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5CE2 +ENCODING 23778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07A0 +2220 +23A0 +AAA0 +ACE0 +AB60 +A960 +A920 +BA20 +CAA0 +0440 +ENDCHAR +STARTCHAR U_5CE3 +ENCODING 23779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2120 +A8C0 +A980 +AA60 +AFE0 +AA80 +BA80 +CAA0 +04E0 +ENDCHAR +STARTCHAR U_5CE4 +ENCODING 23780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +A900 +AFE0 +AA80 +AC60 +AA40 +FA40 +8A40 +0440 +0840 +ENDCHAR +STARTCHAR U_5CE5 +ENCODING 23781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +AFC0 +A960 +AFC0 +A940 +FFC0 +9100 +0500 +0200 +ENDCHAR +STARTCHAR U_5CE6 +ENCODING 23782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +4920 +8920 +0400 +2480 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5CE7 +ENCODING 23783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +27E0 +AA40 +AC20 +AA40 +AA40 +AA40 +B980 +C980 +0660 +ENDCHAR +STARTCHAR U_5CE8 +ENCODING 23784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +26A0 +AA80 +AFE0 +AA80 +AB80 +AEA0 +FAC0 +8AA0 +0360 +0620 +ENDCHAR +STARTCHAR U_5CE9 +ENCODING 23785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0200 +7A40 +1240 +FFE0 +1280 +3900 +D2A0 +3460 +ENDCHAR +STARTCHAR U_5CEA +ENCODING 23786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2420 +A980 +AA40 +AC20 +A800 +ABC0 +FA40 +8A40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5CEB +ENCODING 23787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +22A0 +2AA0 +BEA0 +B2C0 +B2C0 +B6A0 +B6A0 +BAE0 +CA80 +1680 +ENDCHAR +STARTCHAR U_5CEC +ENCODING 23788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +A880 +ABE0 +AAA0 +ABE0 +AAA0 +FBE0 +8AA0 +0260 +ENDCHAR +STARTCHAR U_5CED +ENCODING 23789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +21C0 +A880 +ABE0 +AA20 +ABE0 +AA20 +AA20 +FBE0 +8A20 +0260 +ENDCHAR +STARTCHAR U_5CEE +ENCODING 23790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +AFE0 +A940 +AFC0 +AA00 +ABC0 +FA40 +8E40 +0BC0 +0240 +ENDCHAR +STARTCHAR U_5CEF +ENCODING 23791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +1F80 +7100 +0E00 +F5E0 +0E00 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_5CF0 +ENCODING 23792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AE40 +A980 +AA40 +AFE0 +A900 +BFC0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5CF1 +ENCODING 23793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2240 +6240 +97C0 +3240 +5FE0 +9000 +1100 +1520 +5520 +27E0 +ENDCHAR +STARTCHAR U_5CF2 +ENCODING 23794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0800 +7140 +1140 +FD40 +3940 +5540 +9240 +10C0 +ENDCHAR +STARTCHAR U_5CF3 +ENCODING 23795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +2200 +27C0 +5480 +DA80 +5280 +5100 +4280 +4C40 +ENDCHAR +STARTCHAR U_5CF4 +ENCODING 23796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +AC40 +AFC0 +AC40 +AFC0 +FA80 +92A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5CF5 +ENCODING 23797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27E0 +2520 +A900 +AFE0 +A900 +AA40 +AA80 +BD40 +CA20 +03E0 +ENDCHAR +STARTCHAR U_5CF6 +ENCODING 23798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7FC0 +4000 +7FC0 +9240 +FE40 +8380 +ENDCHAR +STARTCHAR U_5CF7 +ENCODING 23799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +7FC0 +2100 +1200 +FFE0 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_5CF8 +ENCODING 23800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +A880 +A880 +AEA0 +AAA0 +FAC0 +8EA0 +0960 +1220 +ENDCHAR +STARTCHAR U_5CF9 +ENCODING 23801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0400 +FFE0 +2480 +CC60 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5CFA +ENCODING 23802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +2080 +23E0 +AAA0 +ABE0 +AAA0 +ABE0 +AC80 +BA80 +C900 +0EE0 +ENDCHAR +STARTCHAR U_5CFB +ENCODING 23803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +AFA0 +AA40 +AC20 +ABE0 +AE40 +FA40 +8980 +0240 +0C20 +ENDCHAR +STARTCHAR U_5CFC +ENCODING 23804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +23E0 +2480 +A880 +AFE0 +A800 +ABE0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5CFD +ENCODING 23805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +A900 +AD40 +AD40 +ABA0 +B900 +CA80 +0440 +1820 +ENDCHAR +STARTCHAR U_5CFE +ENCODING 23806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8800 +5FE0 +2880 +C880 +5080 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CFF +ENCODING 23807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +AFC0 +A940 +A940 +AFE0 +A800 +FBE0 +8A20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D00 +ENCODING 23808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +0800 +7F00 +4100 +7F00 +4100 +7F00 +4500 +73C0 +ENDCHAR +STARTCHAR U_5D01 +ENCODING 23809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0040 +2400 +27E0 +F520 +2940 +2100 +3A80 +E440 +0820 +ENDCHAR +STARTCHAR U_5D02 +ENCODING 23810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +AFE0 +AD20 +A900 +AFE0 +A920 +F920 +8A20 +04C0 +ENDCHAR +STARTCHAR U_5D03 +ENCODING 23811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AD40 +AB80 +A900 +AFE0 +A900 +FB80 +8540 +0920 +0100 +ENDCHAR +STARTCHAR U_5D04 +ENCODING 23812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +22C0 +AC20 +ABC0 +A800 +A920 +ACA0 +FA40 +0080 +0FE0 +ENDCHAR +STARTCHAR U_5D05 +ENCODING 23813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +AA40 +AFE0 +AAA0 +ABE0 +AAA0 +BBE0 +C2A0 +02A0 +0460 +ENDCHAR +STARTCHAR U_5D06 +ENCODING 23814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +AA80 +AC40 +A820 +AFC0 +A900 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5D07 +ENCODING 23815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +5440 +8820 +ENDCHAR +STARTCHAR U_5D08 +ENCODING 23816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +4C40 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D09 +ENCODING 23817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AFA0 +A9C0 +AAA0 +AC80 +ABE0 +BA20 +C3E0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D0A +ENCODING 23818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2FE0 +AA40 +AA40 +AB40 +AEC0 +BB60 +CA40 +0240 +0240 +ENDCHAR +STARTCHAR U_5D0B +ENCODING 23819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_5D0C +ENCODING 23820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +ABE0 +AA80 +ABE0 +AA80 +AA80 +FBE0 +8620 +0BE0 +0220 +ENDCHAR +STARTCHAR U_5D0D +ENCODING 23821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A900 +AB40 +AB40 +ADA0 +A900 +FB80 +8D40 +0920 +0100 +ENDCHAR +STARTCHAR U_5D0E +ENCODING 23822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA80 +AC40 +AFE0 +A840 +AF40 +FD40 +8F40 +0040 +00C0 +ENDCHAR +STARTCHAR U_5D0F +ENCODING 23823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +ABE0 +AA80 +AB60 +A800 +ABE0 +BA20 +C3E0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D10 +ENCODING 23824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +ABE0 +AA20 +ABE0 +A800 +AAA0 +BBC0 +C280 +02A0 +0360 +ENDCHAR +STARTCHAR U_5D11 +ENCODING 23825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +4100 +7F00 +4100 +7F00 +8400 +F780 +8400 +B440 +C3C0 +ENDCHAR +STARTCHAR U_5D12 +ENCODING 23826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +8880 +FF80 +0800 +FFC0 +2200 +5500 +8880 +FFC0 +0800 +0800 +ENDCHAR +STARTCHAR U_5D13 +ENCODING 23827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A920 +AFE0 +A920 +ABA0 +AAA0 +ABA0 +B820 +CFE0 +0820 +ENDCHAR +STARTCHAR U_5D14 +ENCODING 23828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +1200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_5D15 +ENCODING 23829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +ABE0 +AA80 +ABE0 +AA00 +AA80 +BBE0 +CA80 +0480 +0BE0 +ENDCHAR +STARTCHAR U_5D16 +ENCODING 23830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +3FE0 +2200 +2F80 +2200 +3FE0 +2200 +2FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5D17 +ENCODING 23831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0000 +FFC0 +9240 +FFC0 +A540 +A540 +BF40 +80C0 +ENDCHAR +STARTCHAR U_5D18 +ENCODING 23832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2460 +AB80 +A800 +AFE0 +AAA0 +AAA0 +FFE0 +8AA0 +0A60 +ENDCHAR +STARTCHAR U_5D19 +ENCODING 23833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +1B00 +EEE0 +0000 +7FC0 +4A40 +7FC0 +4A40 +40C0 +ENDCHAR +STARTCHAR U_5D1A +ENCODING 23834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFE0 +AA40 +AB20 +ADC0 +FB40 +8C80 +0140 +0620 +ENDCHAR +STARTCHAR U_5D1B +ENCODING 23835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +AFE0 +A880 +AAA0 +AAA0 +ABE0 +F880 +8AA0 +0AA0 +13E0 +ENDCHAR +STARTCHAR U_5D1C +ENCODING 23836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2080 +AFE0 +AAA0 +AAA0 +AFE0 +BAA0 +CFE0 +0080 +07E0 +ENDCHAR +STARTCHAR U_5D1D +ENCODING 23837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +ABC0 +A880 +AFE0 +AA20 +BBE0 +CA20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D1E +ENCODING 23838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA40 +ABC0 +A800 +AFE0 +A880 +FFE0 +8900 +0100 +0300 +ENDCHAR +STARTCHAR U_5D1F +ENCODING 23839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +0A00 +3180 +DF60 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_5D20 +ENCODING 23840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +ABE0 +AAA0 +ABE0 +AAA0 +FBE0 +89C0 +02A0 +04A0 +ENDCHAR +STARTCHAR U_5D21 +ENCODING 23841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +A920 +AD60 +ABA0 +AD60 +A920 +FB20 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5D22 +ENCODING 23842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2520 +AA40 +AFC0 +A940 +AFE0 +A940 +FFC0 +8900 +0100 +0300 +ENDCHAR +STARTCHAR U_5D23 +ENCODING 23843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0300 +1C00 +FFE0 +2480 +4840 +FFE0 +1100 +0E00 +79E0 +ENDCHAR +STARTCHAR U_5D24 +ENCODING 23844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +AE60 +A900 +AFE0 +AA20 +AFE0 +FA20 +8BE0 +0220 +0260 +ENDCHAR +STARTCHAR U_5D25 +ENCODING 23845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AAA0 +ABE0 +AAA0 +ABE0 +A9A0 +FA80 +8FE0 +0080 +0080 +ENDCHAR +STARTCHAR U_5D26 +ENCODING 23846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +AD40 +AFE0 +AD40 +AFC0 +FD40 +8FC0 +0120 +00E0 +ENDCHAR +STARTCHAR U_5D27 +ENCODING 23847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1000 +1280 +FA80 +1440 +3920 +5500 +9240 +17E0 +1020 +ENDCHAR +STARTCHAR U_5D28 +ENCODING 23848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A940 +AFE0 +A940 +AFC0 +A900 +FDE0 +8500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5D29 +ENCODING 23849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3FE0 +0000 +3DE0 +2520 +3DE0 +2520 +3DE0 +2520 +4520 +8E60 +ENDCHAR +STARTCHAR U_5D2A +ENCODING 23850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2240 +AA40 +ADA0 +A880 +A880 +AFE0 +F880 +0080 +0080 +ENDCHAR +STARTCHAR U_5D2B +ENCODING 23851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7FC0 +4040 +7FC0 +5280 +5F80 +A220 +BFE0 +ENDCHAR +STARTCHAR U_5D2C +ENCODING 23852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_5D2D +ENCODING 23853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2020 +FDC0 +2100 +51E0 +FD40 +1140 +1D40 +F240 +1440 +ENDCHAR +STARTCHAR U_5D2E +ENCODING 23854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0000 +FFC0 +8840 +FF40 +A240 +BE40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5D2F +ENCODING 23855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +ABA0 +A900 +A900 +AFE0 +A900 +FD20 +0340 +0FE0 +ENDCHAR +STARTCHAR U_5D30 +ENCODING 23856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +AAA0 +A940 +ABE0 +AAA0 +AAA0 +FBE0 +8AA0 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D31 +ENCODING 23857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0000 +7C20 +4520 +7D20 +4520 +7D20 +4520 +7C20 +C6E0 +ENDCHAR +STARTCHAR U_5D32 +ENCODING 23858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA20 +ABE0 +AA20 +AFE0 +A880 +ABE0 +F880 +0080 +07E0 +ENDCHAR +STARTCHAR U_5D33 +ENCODING 23859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +ABA0 +A800 +AE20 +AAA0 +AEA0 +FAA0 +8EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_5D34 +ENCODING 23860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +0140 +7FE0 +4100 +7F40 +4940 +7F40 +54A0 +4960 +B620 +ENDCHAR +STARTCHAR U_5D35 +ENCODING 23861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +AFE0 +AA00 +AFE0 +FAA0 +8CA0 +0120 +06C0 +ENDCHAR +STARTCHAR U_5D36 +ENCODING 23862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +FFC0 +1040 +7C40 +13E0 +FC40 +1240 +7D40 +1040 +1D40 +F080 +ENDCHAR +STARTCHAR U_5D37 +ENCODING 23863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AA80 +AFE0 +AAA0 +ACE0 +F820 +8FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5D38 +ENCODING 23864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +FA20 +8BE0 +0140 +0620 +ENDCHAR +STARTCHAR U_5D39 +ENCODING 23865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +AFE0 +A920 +AFC0 +AD40 +FD40 +8540 +05C0 +0100 +ENDCHAR +STARTCHAR U_5D3A +ENCODING 23866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2200 +FBE0 +2480 +3AE0 +2BA0 +2EA0 +2A80 +4A20 +B1E0 +ENDCHAR +STARTCHAR U_5D3B +ENCODING 23867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +25E0 +AA80 +ADE0 +AA40 +ABE0 +AA40 +FBC0 +0240 +02C0 +ENDCHAR +STARTCHAR U_5D3C +ENCODING 23868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +ABC0 +A800 +AFE0 +FA80 +8AE0 +0580 +08E0 +ENDCHAR +STARTCHAR U_5D3D +ENCODING 23869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +2480 +3F80 +2480 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_5D3E +ENCODING 23870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +AFE0 +AAA0 +AFE0 +A900 +AFE0 +FA40 +8380 +0140 +0620 +ENDCHAR +STARTCHAR U_5D3F +ENCODING 23871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +A800 +ABE0 +A800 +AFE0 +F900 +8BE0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5D40 +ENCODING 23872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2100 +2100 +FFE0 +2100 +7100 +AFC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5D41 +ENCODING 23873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +ABC0 +AA40 +ABC0 +AA40 +FFE0 +8940 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_5D42 +ENCODING 23874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0200 +2FC0 +4260 +9FC0 +2240 +6FE0 +A200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_5D43 +ENCODING 23875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +AFE0 +A880 +A900 +AE40 +F8A0 +8B40 +1080 +2700 +ENDCHAR +STARTCHAR U_5D44 +ENCODING 23876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2100 +AFC0 +A900 +AFC0 +A900 +BFE0 +E900 +0280 +0C60 +ENDCHAR +STARTCHAR U_5D45 +ENCODING 23877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0140 +7FE0 +4100 +5D20 +4140 +5D80 +54A0 +9D60 +8220 +ENDCHAR +STARTCHAR U_5D46 +ENCODING 23878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +2140 +F7E0 +2100 +7280 +A4A0 +A8E0 +2400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D47 +ENCODING 23879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +E120 +2FE0 +F280 +22A0 +34E0 +6900 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_5D48 +ENCODING 23880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +A240 +AFE0 +A900 +AFE0 +AA00 +FBE0 +0520 +18C0 +0320 +ENDCHAR +STARTCHAR U_5D49 +ENCODING 23881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A800 +ABC0 +AA40 +AFE0 +AC20 +FBC0 +8880 +0280 +0100 +ENDCHAR +STARTCHAR U_5D4A +ENCODING 23882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A900 +AFE0 +A940 +AF60 +A940 +FF60 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D4B +ENCODING 23883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AA00 +ABE0 +AB20 +ABE0 +FD20 +85E0 +0920 +11E0 +ENDCHAR +STARTCHAR U_5D4C +ENCODING 23884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0100 +4900 +FFE0 +4AA0 +7880 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_5D4D +ENCODING 23885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +29E0 +1140 +FE40 +3540 +5080 +9140 +3620 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D4E +ENCODING 23886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AAA0 +ABE0 +A880 +ABE0 +FAA0 +8BE0 +0220 +0260 +ENDCHAR +STARTCHAR U_5D4F +ENCODING 23887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0A00 +2480 +2A80 +3F80 +5040 +9FA0 +2900 +4600 +1980 +ENDCHAR +STARTCHAR U_5D50 +ENCODING 23888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +4140 +5E40 +4440 +5F40 +5540 +5F40 +4560 +BEA0 +ENDCHAR +STARTCHAR U_5D51 +ENCODING 23889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +ABC0 +A900 +ABE0 +FEA0 +8B60 +03A0 +0040 +ENDCHAR +STARTCHAR U_5D52 +ENCODING 23890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +3F00 +0000 +F3C0 +9240 +F3C0 +0400 +8440 +8440 +FFC0 +ENDCHAR +STARTCHAR U_5D53 +ENCODING 23891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_5D54 +ENCODING 23892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +2480 +2E80 +2480 +FFE0 +4480 +5300 +60E0 +ENDCHAR +STARTCHAR U_5D55 +ENCODING 23893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +25A0 +AE60 +AC20 +ABE0 +AD40 +AA20 +FFE0 +8A40 +0180 +0660 +ENDCHAR +STARTCHAR U_5D56 +ENCODING 23894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A980 +AAC0 +ACA0 +ABC0 +AA40 +BBC0 +EA40 +03C0 +0FE0 +ENDCHAR +STARTCHAR U_5D57 +ENCODING 23895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +7FE0 +4100 +7F00 +4920 +5D40 +6880 +CD40 +3020 +ENDCHAR +STARTCHAR U_5D58 +ENCODING 23896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +A940 +AFE0 +AC20 +A880 +AFE0 +F880 +89C0 +02A0 +04A0 +ENDCHAR +STARTCHAR U_5D59 +ENCODING 23897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0800 +7240 +1140 +FE40 +1140 +3860 +57C0 +9040 +1040 +ENDCHAR +STARTCHAR U_5D5A +ENCODING 23898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4200 +7BE0 +8520 +7900 +2100 +7900 +2280 +2A40 +3420 +ENDCHAR +STARTCHAR U_5D5B +ENCODING 23899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0C00 +3300 +CEE0 +7C40 +4540 +7D40 +4540 +7C40 +44C0 +ENDCHAR +STARTCHAR U_5D5C +ENCODING 23900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +7FC0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_5D5D +ENCODING 23901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +AFE0 +A980 +AB40 +AD20 +AFE0 +FA40 +8A80 +0140 +0620 +ENDCHAR +STARTCHAR U_5D5E +ENCODING 23902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +0400 +FFC0 +2480 +4C40 +2080 +AAA0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_5D5F +ENCODING 23903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FE0 +4A00 +57C0 +7100 +57C0 +5100 +9100 +9FE0 +ENDCHAR +STARTCHAR U_5D60 +ENCODING 23904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +A940 +AA40 +AF80 +A920 +AFE0 +F900 +07E0 +0140 +0620 +ENDCHAR +STARTCHAR U_5D61 +ENCODING 23905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +2880 +DF60 +0100 +7BC0 +8C40 +5AC0 +2940 +4A40 +ENDCHAR +STARTCHAR U_5D62 +ENCODING 23906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +ACA0 +ABC0 +AA40 +ABC0 +AA40 +FBE0 +8620 +0BE0 +1220 +ENDCHAR +STARTCHAR U_5D63 +ENCODING 23907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +A8A0 +AFE0 +A8A0 +AFE0 +A880 +FBE0 +8A20 +0BE0 +1220 +ENDCHAR +STARTCHAR U_5D64 +ENCODING 23908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +5140 +8A20 +FFE0 +8420 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5D65 +ENCODING 23909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +25E0 +AB40 +A9E0 +AA40 +AC40 +AFE0 +F900 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D66 +ENCODING 23910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +A7E0 +A800 +AFE0 +A800 +ABE0 +AA20 +FBE0 +0140 +07E0 +ENDCHAR +STARTCHAR U_5D67 +ENCODING 23911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +28A0 +AAA0 +AEA0 +A920 +AFE0 +A920 +FFE0 +8920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5D68 +ENCODING 23912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AA20 +ABE0 +AA00 +ABE0 +AA00 +FBE0 +0520 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_5D69 +ENCODING 23913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +0400 +FFC0 +2100 +3F00 +0000 +FFC0 +9240 +9E40 +80C0 +ENDCHAR +STARTCHAR U_5D6A +ENCODING 23914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2000 +ABC0 +AA40 +AFE0 +A820 +BBA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5D6B +ENCODING 23915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AA40 +AC80 +AFE0 +AA40 +FA40 +8C80 +05A0 +07E0 +ENDCHAR +STARTCHAR U_5D6C +ENCODING 23916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +7FC0 +4440 +7FC0 +4440 +7FC0 +1480 +2540 +C3E0 +ENDCHAR +STARTCHAR U_5D6D +ENCODING 23917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +A980 +AFE0 +AD40 +BBE0 +E900 +89C0 +0240 +0480 +ENDCHAR +STARTCHAR U_5D6E +ENCODING 23918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +ABC0 +AA40 +ABC0 +AA40 +FBC0 +0A40 +07E0 +0240 +ENDCHAR +STARTCHAR U_5D6F +ENCODING 23919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +A900 +ABC0 +A900 +AFE0 +AA00 +FBC0 +8C80 +0880 +17E0 +ENDCHAR +STARTCHAR U_5D70 +ENCODING 23920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2280 +A7E0 +AAA0 +AFE0 +AAA0 +BFE0 +EA80 +86C0 +0AA0 +ENDCHAR +STARTCHAR U_5D71 +ENCODING 23921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +AC20 +AA40 +ADA0 +AA40 +AC20 +FBC0 +8A40 +0240 +03C0 +ENDCHAR +STARTCHAR U_5D72 +ENCODING 23922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA20 +ABE0 +AA20 +ABE0 +A900 +FFE0 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D73 +ENCODING 23923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1080 +7FC0 +0400 +FFE0 +0800 +1780 +2200 +CFE0 +ENDCHAR +STARTCHAR U_5D74 +ENCODING 23924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +A940 +AE80 +AA40 +AFE0 +AA40 +ABC0 +FA40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5D75 +ENCODING 23925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +F7E0 +9100 +FFE0 +9080 +9FE0 +F480 +9280 +0180 +ENDCHAR +STARTCHAR U_5D76 +ENCODING 23926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2120 +2360 +AA40 +AB60 +ADA0 +AB60 +A920 +FB60 +05A0 +0360 +ENDCHAR +STARTCHAR U_5D77 +ENCODING 23927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2940 +A2A0 +AAA0 +AC80 +A880 +AAE0 +FA80 +8A80 +0B80 +0CE0 +ENDCHAR +STARTCHAR U_5D78 +ENCODING 23928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +2480 +4480 +AB40 +4220 +D200 +5BC0 +5600 +61E0 +ENDCHAR +STARTCHAR U_5D79 +ENCODING 23929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0440 +F7C0 +1100 +F7C0 +8540 +F540 +17C0 +1140 +6FA0 +ENDCHAR +STARTCHAR U_5D7A +ENCODING 23930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +AB60 +ADA0 +A880 +AB40 +ACA0 +FB40 +89A0 +0040 +0780 +ENDCHAR +STARTCHAR U_5D7B +ENCODING 23931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA80 +ABE0 +AAA0 +ABE0 +AAA0 +F5E0 +06A0 +0880 +02A0 +ENDCHAR +STARTCHAR U_5D7C +ENCODING 23932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A940 +AFE0 +A880 +AA80 +ABE0 +FC80 +89E0 +0880 +13E0 +ENDCHAR +STARTCHAR U_5D7D +ENCODING 23933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A540 +A760 +A800 +AFE0 +A920 +AFC0 +F940 +89C0 +0100 +ENDCHAR +STARTCHAR U_5D7E +ENCODING 23934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7F80 +1080 +7DE0 +1B00 +ECE0 +3680 +0900 +7E00 +ENDCHAR +STARTCHAR U_5D7F +ENCODING 23935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +F7C0 +2440 +27C0 +2440 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_5D80 +ENCODING 23936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +AD20 +ABA0 +AD40 +AFE0 +FA00 +8FE0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5D81 +ENCODING 23937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A540 +AFE0 +AD40 +AFE0 +A920 +F7E0 +8480 +0380 +1C60 +ENDCHAR +STARTCHAR U_5D82 +ENCODING 23938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2280 +AFE0 +AA40 +ABC0 +AA40 +ABC0 +F900 +8FE0 +0100 +ENDCHAR +STARTCHAR U_5D83 +ENCODING 23939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F80 +AA80 +AFE0 +AAA0 +AFA0 +AAA0 +F7A0 +02A0 +0FA0 +0220 +ENDCHAR +STARTCHAR U_5D84 +ENCODING 23940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1020 +FFC0 +5500 +7DE0 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_5D85 +ENCODING 23941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FA40 +2540 +3880 +4B40 +9420 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D86 +ENCODING 23942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2A80 +AFE0 +AAA0 +AFE0 +AAA0 +AFE0 +FC40 +87C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5D87 +ENCODING 23943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +AA40 +ABC0 +A800 +AEE0 +FAA0 +8EE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5D88 +ENCODING 23944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +5100 +57E0 +7A80 +1540 +FFE0 +5440 +5240 +5040 +90C0 +ENDCHAR +STARTCHAR U_5D89 +ENCODING 23945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0500 +E500 +AFE0 +B900 +AFC0 +A900 +EFC0 +A900 +0FE0 +ENDCHAR +STARTCHAR U_5D8A +ENCODING 23946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2280 +2480 +FFE0 +2480 +37E0 +E480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_5D8B +ENCODING 23947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23C0 +AA40 +ABC0 +AA40 +ABE0 +AA00 +FBE0 +0020 +0AA0 +0060 +ENDCHAR +STARTCHAR U_5D8C +ENCODING 23948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +1000 +7F00 +5100 +4900 +7FC0 +4000 +7FC0 +5440 +AAC0 +ENDCHAR +STARTCHAR U_5D8D +ENCODING 23949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +ADA0 +AB60 +ACA0 +A900 +ABE0 +FA20 +8BE0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D8E +ENCODING 23950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7C40 +47E0 +7C40 +4140 +7C40 +4A40 +98C0 +ENDCHAR +STARTCHAR U_5D8F +ENCODING 23951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7FE0 +4000 +5EE0 +4C20 +5EE0 +9280 +9EE0 +ENDCHAR +STARTCHAR U_5D90 +ENCODING 23952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7F80 +0400 +EFE0 +B440 +C380 +AD60 +C900 +8FE0 +8100 +8FE0 +ENDCHAR +STARTCHAR U_5D91 +ENCODING 23953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AFE0 +AAA0 +ABE0 +AA80 +ADA0 +F2C0 +0580 +02C0 +0DA0 +ENDCHAR +STARTCHAR U_5D92 +ENCODING 23954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AAA0 +A920 +AFE0 +AA40 +ABC0 +FA40 +83C0 +0240 +ENDCHAR +STARTCHAR U_5D93 +ENCODING 23955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +AD40 +AFE0 +AB40 +AD20 +ABE0 +AAA0 +FBE0 +82A0 +03E0 +ENDCHAR +STARTCHAR U_5D94 +ENCODING 23956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2200 +53E0 +FC20 +2140 +F900 +2900 +B180 +6240 +FC20 +ENDCHAR +STARTCHAR U_5D95 +ENCODING 23957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +AE80 +ABE0 +AA80 +ABE0 +AA80 +ABE0 +FD40 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_5D96 +ENCODING 23958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +A7E0 +AA40 +ABC0 +A800 +AF60 +F9A0 +0560 +03A0 +0D60 +ENDCHAR +STARTCHAR U_5D97 +ENCODING 23959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2760 +AAC0 +AD40 +A8A0 +AFE0 +AA20 +FFC0 +8A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_5D98 +ENCODING 23960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7F80 +2240 +2FE0 +F240 +2180 +7560 +6FC0 +A480 +2320 +2CE0 +ENDCHAR +STARTCHAR U_5D99 +ENCODING 23961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +AFE0 +A940 +AB20 +AC40 +AFE0 +F940 +8DE0 +0240 +0C40 +ENDCHAR +STARTCHAR U_5D9A +ENCODING 23962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +5140 +3F80 +D160 +1F00 +0400 +3580 +CC60 +ENDCHAR +STARTCHAR U_5D9B +ENCODING 23963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AAA0 +AC40 +ABE0 +AA40 +ABC0 +AA40 +FBC0 +04A0 +09A0 +ENDCHAR +STARTCHAR U_5D9C +ENCODING 23964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +A280 +FFE0 +3180 +52A0 +BEE0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5D9D +ENCODING 23965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +25A0 +AA40 +AC20 +ABC0 +A800 +ABC0 +AA40 +FBC0 +0280 +0FE0 +ENDCHAR +STARTCHAR U_5D9E +ENCODING 23966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A500 +AFE0 +C440 +A7C0 +A440 +E7C0 +8440 +44C0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D9F +ENCODING 23967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +AA80 +AFE0 +AAA0 +AD60 +A820 +AFE0 +FA40 +0140 +00C0 +ENDCHAR +STARTCHAR U_5DA0 +ENCODING 23968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +AA80 +AFC0 +AAA0 +AFE0 +AAA0 +FBA0 +8820 +0860 +ENDCHAR +STARTCHAR U_5DA1 +ENCODING 23969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FE0 +5480 +7EE0 +49A0 +6A80 +7E80 +8940 +9220 +ENDCHAR +STARTCHAR U_5DA2 +ENCODING 23970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFE0 +AA40 +AFE0 +AA40 +FFE0 +8A80 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_5DA3 +ENCODING 23971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +C920 +ENDCHAR +STARTCHAR U_5DA4 +ENCODING 23972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +2040 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5DA5 +ENCODING 23973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +2DC0 +AA80 +AFE0 +AA40 +AA40 +FFC0 +8A40 +14A0 +2920 +ENDCHAR +STARTCHAR U_5DA6 +ENCODING 23974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2440 +2FE0 +AA40 +AFE0 +A800 +ABC0 +F800 +8BC0 +1240 +23C0 +ENDCHAR +STARTCHAR U_5DA7 +ENCODING 23975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +A900 +AFE0 +AA80 +AFE0 +A900 +FFE0 +8100 +0100 +ENDCHAR +STARTCHAR U_5DA8 +ENCODING 23976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +4440 +7BC0 +4A40 +75C0 +4A40 +FFE0 +8020 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DA9 +ENCODING 23977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +AFE0 +AAA0 +AFE0 +A800 +FFE0 +9AA0 +0A40 +1720 +ENDCHAR +STARTCHAR U_5DAA +ENCODING 23978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2A80 +FFE0 +1100 +7FC0 +0400 +FFE0 +0400 +3580 +C460 +ENDCHAR +STARTCHAR U_5DAB +ENCODING 23979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2280 +AFE0 +AA80 +AFE0 +A900 +AFE0 +F900 +0FE0 +0540 +0920 +ENDCHAR +STARTCHAR U_5DAC +ENCODING 23980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +A900 +AFE0 +AB40 +AAA0 +AFE0 +FAA0 +8F40 +02E0 +0720 +ENDCHAR +STARTCHAR U_5DAD +ENCODING 23981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4100 +F7E0 +9280 +F100 +8FE0 +F100 +97C0 +F100 +9100 +ENDCHAR +STARTCHAR U_5DAE +ENCODING 23982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +AC20 +ABC0 +A800 +AFE0 +A920 +FFE0 +8240 +04A0 +0920 +ENDCHAR +STARTCHAR U_5DAF +ENCODING 23983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4900 +FD40 +4D20 +7BE0 +4920 +7940 +4CA0 +F960 +0A20 +ENDCHAR +STARTCHAR U_5DB0 +ENCODING 23984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AEA0 +AB60 +AE40 +AAE0 +AB40 +FFE0 +8A40 +0A40 +1240 +ENDCHAR +STARTCHAR U_5DB1 +ENCODING 23985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +ABC0 +AA40 +ABC0 +AA40 +ABE0 +ACA0 +F960 +8FA0 +0060 +ENDCHAR +STARTCHAR U_5DB2 +ENCODING 23986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +1200 +3FC0 +6200 +BFC0 +2200 +79E0 +4920 +4F20 +4060 +ENDCHAR +STARTCHAR U_5DB3 +ENCODING 23987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +FFE0 +2C80 +D700 +2AE0 +2680 +7BC0 +2080 +FBE0 +ENDCHAR +STARTCHAR U_5DB4 +ENCODING 23988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +64C0 +5540 +7FC0 +5540 +FFE0 +1500 +E4E0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DB5 +ENCODING 23989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +AA80 +AEE0 +AA80 +AEE0 +AA80 +FEE0 +8A80 +0280 +ENDCHAR +STARTCHAR U_5DB6 +ENCODING 23990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FC0 +5540 +9F40 +20E0 +5F20 +C0A0 +5CA0 +5440 +56A0 +6520 +ENDCHAR +STARTCHAR U_5DB7 +ENCODING 23991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +4800 +53E0 +7D40 +43E0 +F8A0 +2280 +FEE0 +5580 +88E0 +ENDCHAR +STARTCHAR U_5DB8 +ENCODING 23992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +ADA0 +AFE0 +A920 +AFE0 +F900 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5DB9 +ENCODING 23993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFC0 +A800 +AFE0 +A920 +FFE0 +0E40 +0B40 +0EC0 +ENDCHAR +STARTCHAR U_5DBA +ENCODING 23994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2100 +57C0 +AC40 +27C0 +FC40 +17C0 +A440 +47C0 +2820 +ENDCHAR +STARTCHAR U_5DBB +ENCODING 23995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FC0 +7980 +2140 +FFE0 +5140 +7D40 +D080 +7CA0 +5160 +7E20 +ENDCHAR +STARTCHAR U_5DBC +ENCODING 23996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E60 +2B20 +AE60 +ABA0 +A8A0 +AEE0 +AAA0 +FFE0 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5DBD +ENCODING 23997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FC0 +4480 +2EC0 +60A0 +BFE0 +2080 +6E80 +AA80 +2F40 +CA20 +ENDCHAR +STARTCHAR U_5DBE +ENCODING 23998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +23C0 +A880 +AFE0 +A940 +A840 +FBC0 +0520 +0AA0 +03C0 +ENDCHAR +STARTCHAR U_5DBF +ENCODING 23999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +A920 +ADA0 +A920 +ABC0 +F080 +0FE0 +0AA0 +0A60 +ENDCHAR +STARTCHAR U_5DC0 +ENCODING 24000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1180 +5540 +9520 +1BC0 +FD20 +4940 +7CA0 +4960 +7C20 +ENDCHAR +STARTCHAR U_5DC1 +ENCODING 24001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +AA40 +ABE0 +AAA0 +ABE0 +F880 +17E0 +14A0 +25A0 +ENDCHAR +STARTCHAR U_5DC2 +ENCODING 24002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2440 +7FC0 +C400 +7FC0 +4400 +FFE0 +AAA0 +CA60 +8EE0 +ENDCHAR +STARTCHAR U_5DC3 +ENCODING 24003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1100 +7DE0 +2900 +FFE0 +4420 +7DE0 +45C0 +7D20 +4DE0 +ENDCHAR +STARTCHAR U_5DC4 +ENCODING 24004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +AA80 +AFE0 +A820 +AEE0 +AA80 +AEE0 +FA80 +0EA0 +12E0 +ENDCHAR +STARTCHAR U_5DC5 +ENCODING 24005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2000 +FFE0 +4900 +6BE0 +5A20 +4AA0 +FEA0 +4940 +8620 +ENDCHAR +STARTCHAR U_5DC6 +ENCODING 24006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +ACA0 +AFE0 +AA60 +ABC0 +F800 +87E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_5DC7 +ENCODING 24007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2440 +AF60 +A9C0 +AF40 +A860 +AF40 +F940 +8F60 +15A0 +2F20 +ENDCHAR +STARTCHAR U_5DC8 +ENCODING 24008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +5200 +FBE0 +5520 +FB60 +A920 +FFE0 +2120 +FBA0 +2560 +ENDCHAR +STARTCHAR U_5DC9 +ENCODING 24009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +A880 +AFC0 +AAA0 +AFE0 +F940 +8FC0 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_5DCA +ENCODING 24010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AA40 +ADA0 +AA00 +AFE0 +FA40 +0180 +0E60 +ENDCHAR +STARTCHAR U_5DCB +ENCODING 24011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +4840 +7FC0 +4440 +7FE0 +16A0 +53E0 +5AA0 +52E0 +FC80 +ENDCHAR +STARTCHAR U_5DCC +ENCODING 24012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1080 +7FE0 +4900 +7FC0 +5480 +5580 +5CC0 +8520 +ENDCHAR +STARTCHAR U_5DCD +ENCODING 24013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0900 +F7E0 +2520 +FFE0 +AD20 +FFE0 +52C0 +32A0 +CC60 +ENDCHAR +STARTCHAR U_5DCE +ENCODING 24014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +ABE0 +AAA0 +AFE0 +AAC0 +BFA0 +CA80 +1300 +06C0 +1820 +ENDCHAR +STARTCHAR U_5DCF +ENCODING 24015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +AEE0 +AAA0 +AFE0 +A900 +AFE0 +F900 +8FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5DD0 +ENCODING 24016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +FFC0 +2000 +F7C0 +5640 +7540 +97C0 +F340 +BE40 +93E0 +9C40 +ENDCHAR +STARTCHAR U_5DD1 +ENCODING 24017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +2FE0 +A240 +AFE0 +A540 +BFE0 +A840 +FFC0 +8840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5DD2 +ENCODING 24018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +8E80 +E1C0 +4E80 +F0E0 +5F40 +AAA0 +0E00 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DD3 +ENCODING 24019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2800 +B3E0 +A480 +BDC0 +A940 +B9C0 +FD40 +29C0 +CA20 +ENDCHAR +STARTCHAR U_5DD4 +ENCODING 24020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2000 +FFE0 +4A40 +6BC0 +5A40 +4BC0 +FE40 +53C0 +8E60 +ENDCHAR +STARTCHAR U_5DD5 +ENCODING 24021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +AEA0 +ABE0 +AE40 +ABE0 +AC80 +FFE0 +8100 +0FE0 +0300 +ENDCHAR +STARTCHAR U_5DD6 +ENCODING 24022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4A40 +FFE0 +8900 +BDE0 +A520 +BF40 +A480 +FD40 +8620 +ENDCHAR +STARTCHAR U_5DD7 +ENCODING 24023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2FE0 +2880 +AFE0 +AAA0 +AEA0 +FAA0 +8F40 +12A0 +12A0 +ENDCHAR +STARTCHAR U_5DD8 +ENCODING 24024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +AFE0 +AA40 +AFC0 +AA40 +FF40 +8940 +1FA0 +2AA0 +ENDCHAR +STARTCHAR U_5DD9 +ENCODING 24025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2100 +ABE0 +AAA0 +AFE0 +AA80 +BBE0 +C640 +0180 +0E60 +ENDCHAR +STARTCHAR U_5DDA +ENCODING 24026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FC0 +1080 +7CA0 +57E0 +7C80 +5080 +7D40 +7540 +AD20 +B620 +ENDCHAR +STARTCHAR U_5DDB +ENCODING 24027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_5DDC +ENCODING 24028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1100 +1100 +2200 +4400 +8800 +4400 +2200 +2200 +1100 +1980 +1100 +ENDCHAR +STARTCHAR U_5DDD +ENCODING 24029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2220 +2220 +2220 +2220 +2220 +2220 +2220 +2220 +4020 +8020 +ENDCHAR +STARTCHAR U_5DDE +ENCODING 24030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1220 +1220 +5B20 +56A0 +92A0 +1220 +1220 +1220 +2220 +4020 +ENDCHAR +STARTCHAR U_5DDF +ENCODING 24031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0000 +2480 +2480 +44A0 +44A0 +8460 +ENDCHAR +STARTCHAR U_5DE0 +ENCODING 24032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +4900 +4900 +2480 +2480 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DE1 +ENCODING 24033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +22A0 +2540 +0540 +EA80 +2540 +2540 +22A0 +22A0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5DE2 +ENCODING 24034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2480 +1240 +3FC0 +2440 +3FC0 +2440 +7FE0 +0400 +3580 +C460 +ENDCHAR +STARTCHAR U_5DE3 +ENCODING 24035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +FFE0 +2480 +4460 +ENDCHAR +STARTCHAR U_5DE4 +ENCODING 24036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4900 +9200 +4900 +FF00 +A900 +9500 +FF00 +9500 +D900 +9540 +D880 +ENDCHAR +STARTCHAR U_5DE5 +ENCODING 24037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DE6 +ENCODING 24038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +1000 +1FC0 +2200 +2200 +4200 +8200 +3FE0 +ENDCHAR +STARTCHAR U_5DE7 +ENCODING 24039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2200 +23E0 +2020 +3820 +C020 +0020 +0240 +0180 +ENDCHAR +STARTCHAR U_5DE8 +ENCODING 24040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8000 +8000 +FF00 +8100 +8100 +FF00 +8000 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5DE9 +ENCODING 24041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2480 +2480 +2680 +2580 +2480 +3480 +C4A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_5DEA +ENCODING 24042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +7FC0 +0000 +FFC0 +0040 +0040 +ENDCHAR +STARTCHAR U_5DEB +ENCODING 24043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +2480 +2480 +4500 +6580 +9640 +9640 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DEC +ENCODING 24044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +2480 +24A0 +3860 +C400 +1F00 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5DED +ENCODING 24045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2120 +3A20 +C460 +0400 +7FC0 +0400 +FFE0 +1200 +E1E0 +ENDCHAR +STARTCHAR U_5DEE +ENCODING 24046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +FFE0 +0400 +7FC0 +0800 +FFE0 +1000 +2F80 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5DEF +ENCODING 24047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +2100 +5240 +8FA0 +F020 +2540 +2540 +3D40 +C940 +1160 +ENDCHAR +STARTCHAR U_5DF0 +ENCODING 24048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +57E0 +5500 +AA40 +ABA0 +4400 +FD40 +2540 +2540 +3D40 +C960 +ENDCHAR +STARTCHAR U_5DF1 +ENCODING 24049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF80 +0080 +0080 +7F80 +4000 +4000 +4000 +4020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_5DF2 +ENCODING 24050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF00 +0100 +0100 +8100 +FF00 +8000 +8040 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF3 +ENCODING 24051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +8100 +8100 +FF00 +8000 +8000 +8040 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF4 +ENCODING 24052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8000 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF5 +ENCODING 24053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4000 +7FE0 +4000 +5FC0 +5240 +5240 +5FC0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5DF6 +ENCODING 24054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +4A40 +4A40 +9BC0 +0240 +FA00 +8A00 +8A20 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_5DF7 +ENCODING 24055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1100 +3F80 +D160 +1F00 +1040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_5DF8 +ENCODING 24056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +9240 +BA40 +ABC0 +AA40 +BA00 +9200 +9200 +9220 +F9E0 +ENDCHAR +STARTCHAR U_5DF9 +ENCODING 24057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0240 +7580 +2480 +DFC0 +0000 +3F80 +0080 +3FA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5DFA +ENCODING 24058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4200 +3DC0 +0000 +FFE0 +0000 +1100 +20C0 +C040 +ENDCHAR +STARTCHAR U_5DFB +ENCODING 24059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +0D00 +3F80 +0400 +7FE0 +1080 +3F40 +C120 +1F00 +1080 +1F80 +ENDCHAR +STARTCHAR U_5DFC +ENCODING 24060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8040 +FFC0 +0000 +F440 +9780 +9400 +F440 +03C0 +ENDCHAR +STARTCHAR U_5DFD +ENCODING 24061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +8A20 +FBE0 +1100 +7FC0 +1100 +FFE0 +0900 +F0E0 +ENDCHAR +STARTCHAR U_5DFE +ENCODING 24062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +8880 +8A80 +8900 +0800 +0800 +ENDCHAR +STARTCHAR U_5DFF +ENCODING 24063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4440 +45C0 +0400 +0400 +ENDCHAR +STARTCHAR U_5E00 +ENCODING 24064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4540 +4480 +0400 +0400 +ENDCHAR +STARTCHAR U_5E01 +ENCODING 24065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +01C0 +FE00 +0400 +7FC0 +4440 +4440 +4440 +4540 +4480 +0400 +0400 +ENDCHAR +STARTCHAR U_5E02 +ENCODING 24066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3FC0 +2440 +2440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_5E03 +ENCODING 24067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +1200 +1200 +3FC0 +5240 +9240 +1240 +12C0 +0200 +ENDCHAR +STARTCHAR U_5E04 +ENCODING 24068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +A880 +A880 +A880 +A880 +A880 +B880 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_5E05 +ENCODING 24069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +97E0 +9520 +9520 +9520 +9520 +9520 +2560 +4100 +8100 +ENDCHAR +STARTCHAR U_5E06 +ENCODING 24070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +AA40 +AB40 +AAC0 +AA40 +AA40 +2240 +2440 +2860 +ENDCHAR +STARTCHAR U_5E07 +ENCODING 24071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E08 +ENCODING 24072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +A100 +AFE0 +A920 +A920 +A920 +2920 +2960 +4100 +8100 +ENDCHAR +STARTCHAR U_5E09 +ENCODING 24073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +AA40 +AC20 +ABC0 +A940 +A940 +BA40 +2240 +2CC0 +ENDCHAR +STARTCHAR U_5E0A +ENCODING 24074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +FAA0 +AAA0 +AAA0 +ABE0 +AA20 +BA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_5E0B +ENCODING 24075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8800 +FFC0 +A400 +D240 +09C0 +FF80 +8880 +8880 +8B80 +0800 +ENDCHAR +STARTCHAR U_5E0C +ENCODING 24076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3380 +0C00 +7380 +0800 +FFC0 +1400 +3F80 +E480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E0D +ENCODING 24077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4200 +5FC0 +5240 +5240 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_5E0E +ENCODING 24078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AAA0 +A880 +A880 +B980 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_5E0F +ENCODING 24079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +A900 +AFE0 +A920 +A920 +2160 +2100 +2100 +ENDCHAR +STARTCHAR U_5E10 +ENCODING 24080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FA80 +AB00 +AA00 +AFE0 +AA80 +BA80 +2240 +22C0 +2320 +ENDCHAR +STARTCHAR U_5E11 +ENCODING 24081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +5240 +5180 +3080 +6D40 +8620 +7FC0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E12 +ENCODING 24082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +2480 +7FE0 +A200 +25A0 +2460 +7FC0 +4440 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E13 +ENCODING 24083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +A900 +AFC0 +A900 +AB80 +BB40 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_5E14 +ENCODING 24084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AA80 +ABE0 +AA20 +BB40 +2280 +2540 +2A20 +ENDCHAR +STARTCHAR U_5E15 +ENCODING 24085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +AA20 +AA20 +ABE0 +AA20 +BA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E16 +ENCODING 24086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F8E0 +A880 +A880 +ABE0 +AA20 +BA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E17 +ENCODING 24087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +A900 +A9E0 +A920 +A9A0 +BA40 +22C0 +2520 +2A20 +ENDCHAR +STARTCHAR U_5E18 +ENCODING 24088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +4440 +BFA0 +2480 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E19 +ENCODING 24089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FBC0 +AC80 +A880 +AFE0 +A880 +B940 +2140 +2220 +2420 +ENDCHAR +STARTCHAR U_5E1A +ENCODING 24090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +0080 +FFE0 +8420 +3F80 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E1B +ENCODING 24091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +0800 +FF80 +8880 +8B80 +0800 +ENDCHAR +STARTCHAR U_5E1C +ENCODING 24092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +AA20 +AA20 +ABE0 +AA20 +B800 +2140 +2220 +2420 +ENDCHAR +STARTCHAR U_5E1D +ENCODING 24093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +FFE0 +8420 +BFA0 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E1E +ENCODING 24094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +AA20 +AA20 +ABE0 +AA20 +BA20 +2220 +2220 +23E0 +ENDCHAR +STARTCHAR U_5E1F +ENCODING 24095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +9620 +2400 +7FC0 +4440 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E20 +ENCODING 24096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +7700 +4100 +7700 +4100 +7F00 +0800 +FF80 +8880 +8880 +8980 +0800 +ENDCHAR +STARTCHAR U_5E21 +ENCODING 24097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +F800 +AFE0 +AA40 +AA40 +AFE0 +BA40 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_5E22 +ENCODING 24098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2180 +FA40 +AC20 +ABC0 +A800 +ABE0 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E23 +ENCODING 24099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2900 +FFC0 +1000 +FFE0 +2480 +4440 +FFE0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E24 +ENCODING 24100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +4A20 +D220 +2BE0 +4220 +8400 +7FC0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E25 +ENCODING 24101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +97E0 +9520 +F520 +8520 +F520 +9520 +9560 +F100 +9100 +ENDCHAR +STARTCHAR U_5E26 +ENCODING 24102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +2480 +FFE0 +8420 +BFA0 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E27 +ENCODING 24103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20E0 +F880 +ABE0 +AA20 +AAA0 +AAA0 +AAA0 +B880 +2140 +2620 +ENDCHAR +STARTCHAR U_5E28 +ENCODING 24104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +2000 +FBE0 +AA20 +AA20 +ABE0 +BA80 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_5E29 +ENCODING 24105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +21C0 +F880 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +2220 +2220 +22E0 +ENDCHAR +STARTCHAR U_5E2A +ENCODING 24106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2400 +FDC0 +AC00 +AFE0 +AD40 +BD60 +A540 +2920 +31A0 +ENDCHAR +STARTCHAR U_5E2B +ENCODING 24107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F100 +9100 +97E0 +F520 +8520 +F520 +9520 +9560 +F100 +9100 +ENDCHAR +STARTCHAR U_5E2C +ENCODING 24108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +FFE0 +2080 +7FC0 +A040 +3FC0 +0400 +3FC0 +2440 +24C0 +ENDCHAR +STARTCHAR U_5E2D +ENCODING 24109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4F80 +4200 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_5E2E +ENCODING 24110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +1120 +7D40 +1120 +FDE0 +2500 +7FC0 +2440 +24C0 +0400 +ENDCHAR +STARTCHAR U_5E2F +ENCODING 24111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +3F80 +0000 +FFE0 +8420 +BFC0 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E30 +ENCODING 24112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +27C0 +A040 +AFE0 +A920 +37C0 +2540 +2540 +45C0 +8100 +ENDCHAR +STARTCHAR U_5E31 +ENCODING 24113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +A900 +AFE0 +AA40 +AFE0 +BA40 +2540 +2840 +20C0 +ENDCHAR +STARTCHAR U_5E32 +ENCODING 24114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2240 +FF60 +AA40 +AA40 +AA40 +AF60 +AA40 +BA40 +2440 +2840 +ENDCHAR +STARTCHAR U_5E33 +ENCODING 24115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +FBC0 +AA00 +ABC0 +AA00 +AFE0 +BAA0 +2240 +23A0 +2620 +ENDCHAR +STARTCHAR U_5E34 +ENCODING 24116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA40 +A9A0 +AEE0 +AA40 +AFE0 +BA40 +21A0 +2160 +2620 +ENDCHAR +STARTCHAR U_5E35 +ENCODING 24117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +A820 +AEE0 +AAA0 +AEA0 +AAE0 +BA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_5E36 +ENCODING 24118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +DEE0 +0000 +FFE0 +8420 +BFA0 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E37 +ENCODING 24119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +FA80 +AE80 +ABE0 +AA80 +AA80 +BBE0 +2280 +2280 +23E0 +ENDCHAR +STARTCHAR U_5E38 +ENCODING 24120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FE0 +4020 +9FA0 +1080 +1F80 +0400 +3FC0 +2440 +24C0 +0400 +ENDCHAR +STARTCHAR U_5E39 +ENCODING 24121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FA80 +AFE0 +A900 +AFE0 +AA80 +AA80 +BA80 +2100 +26C0 +ENDCHAR +STARTCHAR U_5E3A +ENCODING 24122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +AA40 +ABC0 +AA40 +ABC0 +AA40 +BFE0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E3B +ENCODING 24123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F880 +ABE0 +A880 +AFE0 +AA20 +BAA0 +22A0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E3C +ENCODING 24124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +AD20 +AD20 +AFE0 +ADA0 +BD60 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5E3D +ENCODING 24125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FDA0 +AC20 +ABC0 +AA40 +ABC0 +BA40 +23C0 +2240 +23C0 +ENDCHAR +STARTCHAR U_5E3E +ENCODING 24126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +AFE0 +A900 +ABE0 +AE20 +BBE0 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E3F +ENCODING 24127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25C0 +F840 +AFE0 +A900 +ABE0 +AC80 +ABE0 +B880 +2940 +2A20 +ENDCHAR +STARTCHAR U_5E40 +ENCODING 24128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E41 +ENCODING 24129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E42 +ENCODING 24130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A140 +BF40 +2100 +3F00 +1000 +FFC0 +2900 +7F80 +A940 +2B00 +ENDCHAR +STARTCHAR U_5E43 +ENCODING 24131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F940 +AFE0 +AA40 +ABC0 +A880 +BFE0 +2280 +27E0 +2080 +ENDCHAR +STARTCHAR U_5E44 +ENCODING 24132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +AA00 +ABE0 +AAA0 +ABE0 +BC80 +25E0 +2880 +27E0 +ENDCHAR +STARTCHAR U_5E45 +ENCODING 24133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +AA40 +ABC0 +A800 +AFE0 +BD20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_5E46 +ENCODING 24134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +A900 +ABE0 +AEA0 +BB60 +23A0 +2040 +ENDCHAR +STARTCHAR U_5E47 +ENCODING 24135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +FC40 +1140 +3CC0 +4400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E48 +ENCODING 24136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +AA40 +AFE0 +AA40 +AFE0 +AA40 +BA40 +2A40 +3440 +ENDCHAR +STARTCHAR U_5E49 +ENCODING 24137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2FE0 +FA80 +AB80 +A800 +AFE0 +A900 +AFE0 +B900 +27C0 +2920 +ENDCHAR +STARTCHAR U_5E4A +ENCODING 24138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FFE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E4B +ENCODING 24139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +AA60 +FFE0 +AA40 +A980 +1E60 +0400 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E4C +ENCODING 24140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +AA20 +ABE0 +ACA0 +AAC0 +BFE0 +2180 +22A0 +24E0 +ENDCHAR +STARTCHAR U_5E4D +ENCODING 24141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +FD20 +AAC0 +AA00 +ACE0 +A820 +BEE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_5E4E +ENCODING 24142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +AA40 +ABC0 +AA40 +ABC0 +B900 +27E0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E4F +ENCODING 24143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFE0 +AA00 +AD40 +AA80 +BDC0 +22A0 +24A0 +2300 +ENDCHAR +STARTCHAR U_5E50 +ENCODING 24144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5100 +7FE0 +5280 +5540 +7FE0 +5540 +5540 +95C0 +B100 +ENDCHAR +STARTCHAR U_5E51 +ENCODING 24145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9FE0 +20A0 +5FA0 +C4A0 +5FC0 +5540 +5540 +57A0 +44A0 +ENDCHAR +STARTCHAR U_5E52 +ENCODING 24146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F940 +AA40 +A940 +AFC0 +A800 +AA40 +BD20 +2440 +27C0 +ENDCHAR +STARTCHAR U_5E53 +ENCODING 24147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27A0 +FA40 +AFE0 +A900 +AA80 +AD60 +BA80 +2120 +2240 +2180 +ENDCHAR +STARTCHAR U_5E54 +ENCODING 24148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +AFE0 +AC40 +BA80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_5E55 +ENCODING 24149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2880 +FFE0 +1480 +FFE0 +2480 +2580 +ENDCHAR +STARTCHAR U_5E56 +ENCODING 24150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +AAA0 +AFE0 +A800 +AFC0 +A800 +BFE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_5E57 +ENCODING 24151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +A920 +AF20 +A960 +AFA0 +B920 +2EE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5E58 +ENCODING 24152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +AA40 +ABC0 +AA40 +BBC0 +2240 +23C0 +2420 +ENDCHAR +STARTCHAR U_5E59 +ENCODING 24153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +ABC0 +AA40 +ABC0 +AA40 +BFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_5E5A +ENCODING 24154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +1140 +FD20 +21E0 +C100 +3F80 +2480 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E5B +ENCODING 24155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +AFE0 +AA40 +ABC0 +AA40 +BBC0 +2100 +27E0 +2100 +ENDCHAR +STARTCHAR U_5E5C +ENCODING 24156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +AC40 +AFC0 +A900 +AFE0 +BC40 +27C0 +2540 +2B20 +ENDCHAR +STARTCHAR U_5E5D +ENCODING 24157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +AAA0 +ABE0 +AAA0 +ABE0 +B880 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_5E5E +ENCODING 24158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2360 +FFE0 +A940 +ABE0 +A880 +ABE0 +B880 +27E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E5F +ENCODING 24159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +FA80 +AFE0 +A880 +AEA0 +AAC0 +BE80 +2AA0 +2F60 +2220 +ENDCHAR +STARTCHAR U_5E60 +ENCODING 24160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +AAA0 +AFE0 +AAA0 +AAA0 +BFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_5E61 +ENCODING 24161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +AB40 +AD20 +A900 +AFE0 +B920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_5E62 +ENCODING 24162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +A900 +AFE0 +AD40 +AFC0 +BD40 +A7E0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5E63 +ENCODING 24163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9300 +55E0 +FE20 +9B20 +B6C0 +D320 +0200 +3FC0 +2240 +22C0 +0200 +ENDCHAR +STARTCHAR U_5E64 +ENCODING 24164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +AD40 +BF40 +8480 +8D40 +0520 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E65 +ENCODING 24165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +AAA0 +AB80 +A900 +AFC0 +A900 +BFE0 +2100 +2300 +ENDCHAR +STARTCHAR U_5E66 +ENCODING 24166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +47E0 +7880 +ABE0 +3C80 +0480 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E67 +ENCODING 24167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +AFE0 +AAA0 +AEE0 +A900 +BFE0 +2540 +2920 +2920 +ENDCHAR +STARTCHAR U_5E68 +ENCODING 24168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2280 +FFE0 +AA40 +AFE0 +A800 +ABE0 +B800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5E69 +ENCODING 24169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FAA0 +AFE0 +AA20 +ABE0 +AA20 +BBE0 +2220 +23E0 +2620 +ENDCHAR +STARTCHAR U_5E6A +ENCODING 24170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +AFE0 +A820 +AFE0 +AA40 +BD80 +2340 +2520 +2300 +ENDCHAR +STARTCHAR U_5E6B +ENCODING 24171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2240 +F940 +2440 +FF80 +2080 +3F80 +2480 +7FC0 +44C0 +ENDCHAR +STARTCHAR U_5E6C +ENCODING 24172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +A920 +AFC0 +A820 +B9E0 +2F20 +2AA0 +2E60 +ENDCHAR +STARTCHAR U_5E6D +ENCODING 24173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +AAA0 +AFE0 +A940 +AFE0 +B940 +2E80 +29A0 +3660 +ENDCHAR +STARTCHAR U_5E6E +ENCODING 24174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +AFA0 +A920 +AFE0 +AAA0 +BBA0 +2D60 +2A20 +3760 +ENDCHAR +STARTCHAR U_5E6F +ENCODING 24175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +AEE0 +AAA0 +AEA0 +AAA0 +BEA0 +2AE0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_5E70 +ENCODING 24176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFC0 +A900 +AFE0 +AAA0 +AFE0 +B800 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_5E71 +ENCODING 24177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +AEE0 +A920 +AFE0 +AAA0 +ABA0 +B920 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_5E72 +ENCODING 24178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5E73 +ENCODING 24179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +2480 +1500 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5E74 +ENCODING 24180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4200 +8200 +3FC0 +2200 +2200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_5E75 +ENCODING 24181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +1080 +1080 +1080 +FBE0 +1080 +1080 +1080 +2080 +2080 +4080 +ENDCHAR +STARTCHAR U_5E76 +ENCODING 24182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +1100 +1100 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5E77 +ENCODING 24183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +1080 +7DE0 +1080 +1080 +FDE0 +1080 +1080 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_5E78 +ENCODING 24184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +0A00 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5E79 +ENCODING 24185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FDC0 +8880 +F880 +8BE0 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_5E7A +ENCODING 24186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +0800 +1100 +2100 +7E00 +0400 +0800 +1080 +27C0 +F840 +ENDCHAR +STARTCHAR U_5E7B +ENCODING 24187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2020 +4820 +4820 +F020 +2020 +2820 +4420 +FD40 +0080 +ENDCHAR +STARTCHAR U_5E7C +ENCODING 24188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +4FE0 +F920 +1120 +2120 +4920 +F520 +42A0 +0440 +ENDCHAR +STARTCHAR U_5E7D +ENCODING 24189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +94A0 +A520 +AD60 +F7A0 +94A0 +AD60 +FFE0 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_5E7E +ENCODING 24190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4500 +F7C0 +2CA0 +FFE0 +2480 +FFE0 +2280 +3120 +49A0 +8E60 +ENDCHAR +STARTCHAR U_5E7F +ENCODING 24191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_5E80 +ENCODING 24192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2400 +2440 +2480 +2700 +2400 +2420 +4420 +83E0 +ENDCHAR +STARTCHAR U_5E81 +ENCODING 24193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2FE0 +2100 +2100 +2100 +4100 +4500 +8200 +ENDCHAR +STARTCHAR U_5E82 +ENCODING 24194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +2200 +2200 +2200 +2500 +2880 +5060 +A020 +ENDCHAR +STARTCHAR U_5E83 +ENCODING 24195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2200 +2200 +2200 +2400 +4840 +5FE0 +8020 +ENDCHAR +STARTCHAR U_5E84 +ENCODING 24196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +2200 +2FC0 +2200 +2200 +2200 +4200 +9FE0 +ENDCHAR +STARTCHAR U_5E85 +ENCODING 24197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2200 +2280 +2480 +2900 +2200 +4440 +4FE0 +8020 +ENDCHAR +STARTCHAR U_5E86 +ENCODING 24198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2200 +2200 +3FE0 +2200 +2200 +2500 +4480 +4840 +9020 +ENDCHAR +STARTCHAR U_5E87 +ENCODING 24199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5100 +5120 +5D40 +5180 +5100 +5520 +9920 +90E0 +ENDCHAR +STARTCHAR U_5E88 +ENCODING 24200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +4880 +5260 +6220 +5FC0 +4080 +8100 +8200 +ENDCHAR +STARTCHAR U_5E89 +ENCODING 24201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +5240 +5240 +5FC0 +4200 +8220 +81E0 +ENDCHAR +STARTCHAR U_5E8A +ENCODING 24202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4200 +7FE0 +4200 +4700 +4A80 +5240 +A220 +8200 +ENDCHAR +STARTCHAR U_5E8B +ENCODING 24203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +4200 +5FC0 +4880 +4500 +4200 +8D80 +B060 +ENDCHAR +STARTCHAR U_5E8C +ENCODING 24204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +3FE0 +2500 +2900 +2FE0 +2300 +2500 +4900 +9300 +ENDCHAR +STARTCHAR U_5E8D +ENCODING 24205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2040 +2F80 +2800 +2FE0 +2880 +2880 +2880 +4880 +9080 +ENDCHAR +STARTCHAR U_5E8E +ENCODING 24206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2200 +2580 +2840 +34A0 +2480 +4480 +4480 +8880 +ENDCHAR +STARTCHAR U_5E8F +ENCODING 24207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5F80 +4500 +4200 +7FE0 +4240 +4200 +8200 +8E00 +ENDCHAR +STARTCHAR U_5E90 +ENCODING 24208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FC0 +2840 +2840 +2FC0 +2800 +4800 +5000 +A000 +ENDCHAR +STARTCHAR U_5E91 +ENCODING 24209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +5FE0 +4500 +4500 +4920 +9120 +A0E0 +ENDCHAR +STARTCHAR U_5E92 +ENCODING 24210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +4200 +5FC0 +4200 +4280 +4240 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5E93 +ENCODING 24211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +3FE0 +2400 +2900 +2FC0 +2100 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_5E94 +ENCODING 24212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4440 +5240 +4A40 +4880 +4080 +8100 +9FE0 +ENDCHAR +STARTCHAR U_5E95 +ENCODING 24213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2FC0 +2900 +2FE0 +2900 +2880 +2AA0 +4D60 +8920 +ENDCHAR +STARTCHAR U_5E96 +ENCODING 24214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +4FC0 +5040 +6F40 +4940 +4F40 +48A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5E97 +ENCODING 24215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +23C0 +2200 +2FC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5E98 +ENCODING 24216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5240 +5FC0 +5240 +5FC0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_5E99 +ENCODING 24217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +5FC0 +5240 +5FC0 +5240 +5240 +9FC0 +9040 +ENDCHAR +STARTCHAR U_5E9A +ENCODING 24218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +2FC0 +2240 +3FE0 +2240 +2FC0 +2500 +4880 +B060 +ENDCHAR +STARTCHAR U_5E9B +ENCODING 24219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +4480 +54A0 +57C0 +5480 +5480 +54A0 +96A0 +B8E0 +ENDCHAR +STARTCHAR U_5E9C +ENCODING 24220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4440 +4840 +4BE0 +5840 +6A40 +4940 +4840 +8940 +8880 +ENDCHAR +STARTCHAR U_5E9D +ENCODING 24221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4400 +4F80 +4880 +5500 +4200 +4D00 +72C0 +4C00 +8300 +ENDCHAR +STARTCHAR U_5E9E +ENCODING 24222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2280 +2240 +3FE0 +2220 +2540 +2580 +2520 +4B20 +B4E0 +ENDCHAR +STARTCHAR U_5E9F +ENCODING 24223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2A80 +2A40 +3FE0 +2400 +27C0 +2A40 +3180 +4240 +8C20 +ENDCHAR +STARTCHAR U_5EA0 +ENCODING 24224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2880 +2500 +3FE0 +2200 +3FC0 +2200 +3FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5EA1 +ENCODING 24225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4400 +7FC0 +4400 +4A40 +5A80 +6900 +4880 +4C60 +8800 +ENDCHAR +STARTCHAR U_5EA2 +ENCODING 24226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +4480 +4840 +4FE0 +4200 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5EA3 +ENCODING 24227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +3540 +2D80 +2500 +2D80 +3540 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_5EA4 +ENCODING 24228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +4080 +5FE0 +4880 +8480 +8380 +ENDCHAR +STARTCHAR U_5EA5 +ENCODING 24229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +4880 +4FE0 +5880 +6980 +4AC0 +4CA0 +8880 +8880 +ENDCHAR +STARTCHAR U_5EA6 +ENCODING 24230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FC0 +4900 +4F00 +4000 +5F80 +4900 +8600 +B9C0 +ENDCHAR +STARTCHAR U_5EA7 +ENCODING 24231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4A80 +4A80 +5740 +6220 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5EA8 +ENCODING 24232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4240 +5FC0 +4280 +7FE0 +4400 +4F80 +5100 +AFC0 +8200 +ENDCHAR +STARTCHAR U_5EA9 +ENCODING 24233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +4880 +5740 +6220 +5FC0 +4700 +4A80 +5240 +8600 +ENDCHAR +STARTCHAR U_5EAA +ENCODING 24234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4BE0 +4D40 +7940 +4880 +A940 +9220 +ENDCHAR +STARTCHAR U_5EAB +ENCODING 24235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_5EAC +ENCODING 24236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +4880 +7FE0 +5480 +5700 +54C0 +5720 +5420 +A3E0 +ENDCHAR +STARTCHAR U_5EAD +ENCODING 24237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +7BE0 +5080 +7BE0 +4880 +6880 +53E0 +9000 +AFE0 +ENDCHAR +STARTCHAR U_5EAE +ENCODING 24238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +7FE0 +4500 +5FC0 +5540 +59C0 +5740 +9040 +9FC0 +ENDCHAR +STARTCHAR U_5EAF +ENCODING 24239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4280 +7FE0 +4200 +5FC0 +5240 +5FC0 +5240 +5FC0 +9240 +ENDCHAR +STARTCHAR U_5EB0 +ENCODING 24240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5080 +4900 +7FC0 +4900 +7FE0 +4900 +4900 +9100 +A100 +ENDCHAR +STARTCHAR U_5EB1 +ENCODING 24241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +5440 +6FA0 +5480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_5EB2 +ENCODING 24242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +4A40 +4A40 +56A0 +6700 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_5EB3 +ENCODING 24243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5FC0 +5240 +5FC0 +5240 +5FC0 +4900 +BFE0 +8100 +ENDCHAR +STARTCHAR U_5EB4 +ENCODING 24244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5FE0 +4480 +7FE0 +4000 +4FC0 +4940 +8A40 +8FC0 +ENDCHAR +STARTCHAR U_5EB5 +ENCODING 24245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +7FE0 +5280 +5FC0 +72A0 +5F80 +52A0 +8220 +81E0 +ENDCHAR +STARTCHAR U_5EB6 +ENCODING 24246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4480 +5FE0 +4480 +4780 +4000 +5540 +92A0 +A2A0 +ENDCHAR +STARTCHAR U_5EB7 +ENCODING 24247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4240 +7FE0 +4240 +5FC0 +5240 +8A80 +B660 +ENDCHAR +STARTCHAR U_5EB8 +ENCODING 24248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4FC0 +4240 +5FE0 +4240 +5FC0 +5240 +5FC0 +9240 +92C0 +ENDCHAR +STARTCHAR U_5EB9 +ENCODING 24249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4FC0 +4840 +4FC0 +4900 +9080 +A060 +ENDCHAR +STARTCHAR U_5EBA +ENCODING 24250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +5540 +68A0 +5FC0 +4200 +7FE0 +4700 +4A80 +B260 +ENDCHAR +STARTCHAR U_5EBB +ENCODING 24251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4900 +4F00 +4000 +4880 +4880 +5540 +A220 +ENDCHAR +STARTCHAR U_5EBC +ENCODING 24252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +53E0 +5080 +5BE0 +52A0 +52A0 +5AA0 +6140 +8220 +ENDCHAR +STARTCHAR U_5EBD +ENCODING 24253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A80 +4F80 +4A80 +4F80 +4200 +5FC0 +5240 +53C0 +9C40 +ENDCHAR +STARTCHAR U_5EBE +ENCODING 24254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5AC0 +5240 +5AC0 +5240 +5FC0 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_5EBF +ENCODING 24255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +5FC0 +5240 +5240 +9FC0 +ENDCHAR +STARTCHAR U_5EC0 +ENCODING 24256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +5240 +4D80 +5040 +67A0 +4480 +4300 +8CC0 +ENDCHAR +STARTCHAR U_5EC1 +ENCODING 24257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5EA0 +52A0 +5AA0 +56A0 +52A0 +5E20 +9420 +A2E0 +ENDCHAR +STARTCHAR U_5EC2 +ENCODING 24258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +49E0 +7F20 +49E0 +4D20 +5BE0 +6920 +89E0 +8920 +ENDCHAR +STARTCHAR U_5EC3 +ENCODING 24259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4140 +5D80 +54A0 +4840 +77A0 +4500 +5FE0 +8500 +19E0 +ENDCHAR +STARTCHAR U_5EC4 +ENCODING 24260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5D40 +5540 +5D60 +5400 +5FE0 +5540 +5A80 +B140 +8220 +ENDCHAR +STARTCHAR U_5EC5 +ENCODING 24261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +4880 +5FC0 +5540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_5EC6 +ENCODING 24262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5FC0 +5240 +5FC0 +5240 +5FC0 +4740 +8AA0 +B1E0 +ENDCHAR +STARTCHAR U_5EC7 +ENCODING 24263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +59E0 +54A0 +5560 +5FC0 +5240 +5FC0 +9240 +9FC0 +ENDCHAR +STARTCHAR U_5EC8 +ENCODING 24264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +4840 +4FC0 +4840 +4FC0 +5480 +A300 +9CE0 +ENDCHAR +STARTCHAR U_5EC9 +ENCODING 24265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +4540 +7FE0 +4540 +5FC0 +4D80 +9540 +A520 +ENDCHAR +STARTCHAR U_5ECA +ENCODING 24266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5EE0 +52A0 +5EA0 +52C0 +5EA0 +54A0 +96E0 +9A80 +ENDCHAR +STARTCHAR U_5ECB +ENCODING 24267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5BC0 +5240 +5FC0 +4200 +5FC0 +4880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_5ECC +ENCODING 24268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FC0 +4940 +7FE0 +4800 +5FE0 +5520 +AAA0 +AAC0 +ENDCHAR +STARTCHAR U_5ECD +ENCODING 24269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +7FE0 +52A0 +7FA0 +40C0 +5EA0 +52A0 +52E0 +9E80 +ENDCHAR +STARTCHAR U_5ECE +ENCODING 24270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +57E0 +5240 +5FC0 +5240 +53C0 +5640 +5BC0 +8660 +ENDCHAR +STARTCHAR U_5ECF +ENCODING 24271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +5DC0 +5540 +5D60 +5600 +5DE0 +5140 +9480 +9D60 +ENDCHAR +STARTCHAR U_5ED0 +ENCODING 24272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +5DE0 +5440 +5D40 +57E0 +5CC0 +58C0 +9540 +9A60 +ENDCHAR +STARTCHAR U_5ED1 +ENCODING 24273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5240 +5240 +7FE0 +4200 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5ED2 +ENCODING 24274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7EE0 +48A0 +7FA0 +48A0 +7EA0 +5240 +A2A0 +A520 +ENDCHAR +STARTCHAR U_5ED3 +ENCODING 24275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +52C0 +7EA0 +48A0 +7EA0 +88E0 +9880 +ENDCHAR +STARTCHAR U_5ED4 +ENCODING 24276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FE0 +5240 +5FC0 +5240 +7FE0 +4480 +8700 +B8E0 +ENDCHAR +STARTCHAR U_5ED5 +ENCODING 24277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4140 +5EA0 +57C0 +5840 +55E0 +5400 +5BE0 +9140 +93A0 +ENDCHAR +STARTCHAR U_5ED6 +ENCODING 24278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +4CC0 +5540 +4700 +78E0 +4300 +5C40 +8380 +9C00 +ENDCHAR +STARTCHAR U_5ED7 +ENCODING 24279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +7FE0 +5540 +7760 +4000 +7FE0 +6220 +5FC0 +9240 +ENDCHAR +STARTCHAR U_5ED8 +ENCODING 24280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5280 +5FE0 +52A0 +5FE0 +5B40 +ADA0 +AEE0 +ENDCHAR +STARTCHAR U_5ED9 +ENCODING 24281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4480 +7FE0 +4000 +8D80 +B060 +ENDCHAR +STARTCHAR U_5EDA +ENCODING 24282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4840 +7E40 +49E0 +4840 +7F40 +52C0 +5E40 +9440 +BEC0 +ENDCHAR +STARTCHAR U_5EDB +ENCODING 24283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4A80 +5240 +6FA0 +8200 +9FE0 +ENDCHAR +STARTCHAR U_5EDC +ENCODING 24284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5040 +5FC0 +5200 +5FE0 +5440 +5FC0 +5440 +57C0 +A440 +ENDCHAR +STARTCHAR U_5EDD +ENCODING 24285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5420 +7FC0 +5500 +5DE0 +5540 +5540 +BF40 +9540 +2240 +ENDCHAR +STARTCHAR U_5EDE +ENCODING 24286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +55E0 +7E20 +4880 +7C80 +4A80 +AD40 +9A20 +3E20 +ENDCHAR +STARTCHAR U_5EDF +ENCODING 24287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +5EE0 +52A0 +5EE0 +48A0 +7F20 +8960 +ENDCHAR +STARTCHAR U_5EE0 +ENCODING 24288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8880 +AA80 +9CE0 +BFA0 +A2A0 +AEA0 +AA40 +AEA0 +A720 +ENDCHAR +STARTCHAR U_5EE1 +ENCODING 24289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5FE0 +7540 +5540 +7FE0 +5540 +7FE0 +9540 +AAA0 +ENDCHAR +STARTCHAR U_5EE2 +ENCODING 24290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5540 +48A0 +7DC0 +4520 +5E00 +51C0 +5D40 +8480 +9B60 +ENDCHAR +STARTCHAR U_5EE3 +ENCODING 24291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5FC0 +4480 +7FE0 +5240 +5FC0 +5240 +5FC0 +B060 +ENDCHAR +STARTCHAR U_5EE4 +ENCODING 24292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +4200 +5D20 +55C0 +5500 +9DE0 +ENDCHAR +STARTCHAR U_5EE5 +ENCODING 24293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4D80 +5040 +7FE0 +5540 +5FC0 +4880 +4F80 +8880 +8F80 +ENDCHAR +STARTCHAR U_5EE6 +ENCODING 24294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8080 +BFE0 +A540 +BC80 +A3E0 +BC80 +D7E0 +9480 +9C80 +ENDCHAR +STARTCHAR U_5EE7 +ENCODING 24295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +6AA0 +7FE0 +5540 +5740 +9040 +9FC0 +ENDCHAR +STARTCHAR U_5EE8 +ENCODING 24296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +52A0 +5FA0 +55A0 +5F40 +55E0 +5F40 +55E0 +9540 +A340 +ENDCHAR +STARTCHAR U_5EE9 +ENCODING 24297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +7FE0 +5540 +5240 +5FC0 +4200 +5FE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_5EEA +ENCODING 24298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5740 +5040 +5FC0 +4000 +7FE0 +8A80 +B660 +ENDCHAR +STARTCHAR U_5EEB +ENCODING 24299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5F60 +5520 +5F60 +5520 +56A0 +5D40 +56A0 +A540 +ENDCHAR +STARTCHAR U_5EEC +ENCODING 24300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5240 +52A0 +57E0 +5540 +6FE0 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_5EED +ENCODING 24301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4480 +5BE0 +4880 +7FE0 +4A20 +5FE0 +6A20 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_5EEE +ENCODING 24302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +5DC0 +5540 +5DC0 +5540 +7FE0 +4480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_5EEF +ENCODING 24303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +7E80 +6BE0 +7E80 +6BE0 +7E80 +55E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_5EF0 +ENCODING 24304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4080 +7FE0 +5540 +5EA0 +57E0 +5C00 +5540 +5F20 +A5E0 +ENDCHAR +STARTCHAR U_5EF1 +ENCODING 24305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +6B40 +7DE0 +4540 +7DE0 +5540 +7DE0 +A140 +BDE0 +ENDCHAR +STARTCHAR U_5EF2 +ENCODING 24306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +9540 +9DC0 +9540 +BFE0 +A540 +BFC0 +AB40 +ADA0 +5DE0 +ENDCHAR +STARTCHAR U_5EF3 +ENCODING 24307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A880 +BBE0 +AAA0 +FAA0 +AFE0 +A940 +FAA0 +AD40 +F9C0 +ENDCHAR +STARTCHAR U_5EF4 +ENCODING 24308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +1000 +2000 +2000 +7800 +0800 +8800 +5000 +2000 +3000 +CFE0 +ENDCHAR +STARTCHAR U_5EF5 +ENCODING 24309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F2A0 +12A0 +22A0 +7540 +1540 +92A0 +62A0 +22A0 +5800 +87E0 +ENDCHAR +STARTCHAR U_5EF6 +ENCODING 24310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +1780 +2080 +4080 +F4E0 +1480 +9480 +5480 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EF7 +ENCODING 24311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +1780 +2100 +4100 +FFE0 +1100 +9100 +57C0 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EF8 +ENCODING 24312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +27C0 +4540 +77C0 +1540 +9540 +57C0 +3440 +4800 +87E0 +ENDCHAR +STARTCHAR U_5EF9 +ENCODING 24313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77C0 +1440 +2440 +47C0 +7440 +1440 +57C0 +2440 +5800 +87E0 +ENDCHAR +STARTCHAR U_5EFA +ENCODING 24314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +2240 +5FE0 +E240 +2FC0 +A200 +6FE0 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_5EFB +ENCODING 24315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EFE0 +2820 +4BA0 +EAA0 +2AA0 +ABA0 +A820 +4FE0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_5EFC +ENCODING 24316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +4280 +EFE0 +2AA0 +2AA0 +ACE0 +A820 +4FE0 +A000 +1FE0 +ENDCHAR +STARTCHAR U_5EFD +ENCODING 24317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E000 +2FE0 +2AA0 +4BA0 +EAA0 +2BA0 +AAA0 +6AA0 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EFE +ENCODING 24318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +FFE0 +1080 +1080 +2080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_5EFF +ENCODING 24319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +FFE0 +1080 +1080 +1080 +1080 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5F00 +ENCODING 24320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +1100 +1100 +1100 +FFE0 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_5F01 +ENCODING 24321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +2080 +7FC0 +1140 +1100 +FFE0 +1100 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F02 +ENCODING 24322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2020 +3FE0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F03 +ENCODING 24323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1080 +3FC0 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F04 +ENCODING 24324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +0000 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F05 +ENCODING 24325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +DFE0 +0480 +0880 +7700 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F06 +ENCODING 24326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +1100 +7FC0 +2080 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F07 +ENCODING 24327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +3F80 +C060 +3F80 +2080 +3F80 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F08 +ENCODING 24328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4940 +8920 +1120 +6B00 +0900 +FFE0 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_5F09 +ENCODING 24329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +7FE0 +0900 +7900 +4FC0 +8800 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F0A +ENCODING 24330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9300 +5500 +FDE0 +9720 +BCC0 +D720 +1100 +0900 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F0B +ENCODING 24331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +07E0 +FC00 +0400 +0200 +0200 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_5F0C +ENCODING 24332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +04C0 +0400 +FFE0 +0200 +0200 +0100 +0100 +FCA0 +0060 +0020 +ENDCHAR +STARTCHAR U_5F0D +ENCODING 24333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0280 +0240 +FFE0 +0200 +7A00 +0100 +0100 +1CA0 +E060 +0020 +ENDCHAR +STARTCHAR U_5F0E +ENCODING 24334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +0400 +FA00 +0200 +7100 +0120 +FCA0 +0040 +ENDCHAR +STARTCHAR U_5F0F +ENCODING 24335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +0200 +FFE0 +0200 +7A00 +1200 +1100 +1120 +18A0 +E060 +ENDCHAR +STARTCHAR U_5F10 +ENCODING 24336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7C80 +0440 +FFE0 +0400 +0400 +7A00 +0200 +1D00 +E0A0 +0040 +ENDCHAR +STARTCHAR U_5F11 +ENCODING 24337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +27E0 +5080 +AF80 +FA80 +2280 +7240 +AB40 +2C20 +6020 +ENDCHAR +STARTCHAR U_5F12 +ENCODING 24338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +60A0 +9FE0 +2880 +F880 +2780 +3280 +6A40 +A340 +2E20 +2020 +ENDCHAR +STARTCHAR U_5F13 +ENCODING 24339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0080 +3F80 +2000 +4000 +7F80 +0080 +0080 +0080 +0500 +0200 +ENDCHAR +STARTCHAR U_5F14 +ENCODING 24340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0880 +0880 +7F80 +4800 +FFC0 +0840 +0840 +0940 +0880 +0800 +ENDCHAR +STARTCHAR U_5F15 +ENCODING 24341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +0440 +0440 +7C40 +4040 +FC40 +0440 +0440 +0440 +2840 +1040 +ENDCHAR +STARTCHAR U_5F16 +ENCODING 24342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +2000 +2000 +3F80 +0080 +0080 +0500 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5F17 +ENCODING 24343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FF80 +1280 +7F80 +5200 +FFC0 +1240 +1240 +2380 +C200 +ENDCHAR +STARTCHAR U_5F18 +ENCODING 24344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +1080 +F100 +8100 +8100 +F240 +1240 +1240 +A7E0 +4020 +ENDCHAR +STARTCHAR U_5F19 +ENCODING 24345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +1100 +F100 +8FE0 +8100 +F100 +1100 +1100 +A500 +4200 +ENDCHAR +STARTCHAR U_5F1A +ENCODING 24346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4200 +2400 +FF00 +0900 +FF00 +8800 +FF80 +0880 +0880 +0B00 +0800 +ENDCHAR +STARTCHAR U_5F1B +ENCODING 24347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1500 +1540 +F5E0 +8F40 +8540 +F540 +15C0 +1520 +A420 +43E0 +ENDCHAR +STARTCHAR U_5F1C +ENCODING 24348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +0820 +0820 +79E0 +4100 +79E0 +0820 +0820 +0820 +5140 +2080 +ENDCHAR +STARTCHAR U_5F1D +ENCODING 24349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1540 +1540 +7540 +47C0 +F440 +1400 +1400 +1420 +9420 +63E0 +ENDCHAR +STARTCHAR U_5F1E +ENCODING 24350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +0A00 +0BE0 +7D40 +4100 +7900 +0900 +0A80 +0A80 +5460 +2840 +ENDCHAR +STARTCHAR U_5F1F +ENCODING 24351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0440 +3FC0 +4400 +7FE0 +1420 +24A0 +C440 +0400 +ENDCHAR +STARTCHAR U_5F20 +ENCODING 24352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +2440 +2480 +E700 +8400 +9FE0 +E500 +2500 +2480 +A640 +4420 +ENDCHAR +STARTCHAR U_5F21 +ENCODING 24353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +1400 +1400 +F780 +8480 +F480 +1780 +1400 +1400 +A7C0 +4000 +ENDCHAR +STARTCHAR U_5F22 +ENCODING 24354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1520 +1520 +F7E0 +8100 +8FE0 +F440 +1280 +1100 +9280 +6C60 +ENDCHAR +STARTCHAR U_5F23 +ENCODING 24355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +1240 +1440 +F5E0 +8C40 +F640 +1540 +1440 +1440 +5540 +2480 +ENDCHAR +STARTCHAR U_5F24 +ENCODING 24356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +1780 +1480 +F480 +87E0 +8480 +F480 +1480 +1540 +A720 +4CA0 +ENDCHAR +STARTCHAR U_5F25 +ENCODING 24357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +1400 +17E0 +F820 +8100 +8100 +F540 +1520 +1920 +A100 +4300 +ENDCHAR +STARTCHAR U_5F26 +ENCODING 24358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1100 +1FE0 +F100 +8240 +8780 +F080 +1100 +1240 +AFA0 +4420 +ENDCHAR +STARTCHAR U_5F27 +ENCODING 24359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +1740 +1540 +F540 +8540 +8540 +F540 +1520 +15A0 +A960 +4A20 +ENDCHAR +STARTCHAR U_5F28 +ENCODING 24360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1120 +1120 +F220 +84A0 +8840 +F7E0 +1420 +1420 +A7E0 +4420 +ENDCHAR +STARTCHAR U_5F29 +ENCODING 24361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +5180 +2A40 +7FA0 +0080 +3F80 +2000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F2A +ENCODING 24362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1040 +1080 +F180 +8260 +8420 +F7E0 +1100 +1100 +A100 +4FE0 +ENDCHAR +STARTCHAR U_5F2B +ENCODING 24363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1500 +7500 +47C0 +4440 +7440 +17C0 +1500 +1500 +A7E0 +4000 +ENDCHAR +STARTCHAR U_5F2C +ENCODING 24364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2880 +E880 +8AC0 +8A40 +EA40 +2AC0 +2880 +2880 +AFE0 +4000 +ENDCHAR +STARTCHAR U_5F2D +ENCODING 24365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1240 +1240 +F3C0 +8240 +8240 +F3C0 +1240 +1260 +A7C0 +4040 +ENDCHAR +STARTCHAR U_5F2E +ENCODING 24366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FC0 +0800 +FFE0 +2180 +DF60 +1000 +3F80 +0080 +0480 +0300 +ENDCHAR +STARTCHAR U_5F2F +ENCODING 24367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2940 +4920 +BFC0 +0040 +7F80 +4000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F30 +ENCODING 24368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F4A0 +12C0 +1080 +F7E0 +8420 +87E0 +F420 +17E0 +1420 +A420 +44E0 +ENDCHAR +STARTCHAR U_5F31 +ENCODING 24369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +FBE0 +8200 +FBE0 +8A20 +4920 +38E0 +CB20 +0820 +71C0 +ENDCHAR +STARTCHAR U_5F32 +ENCODING 24370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +13C0 +F000 +87E0 +8420 +F7E0 +1420 +17E0 +A420 +4460 +ENDCHAR +STARTCHAR U_5F33 +ENCODING 24371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1540 +1540 +FA80 +8540 +8540 +F000 +17C0 +1100 +A100 +4FE0 +ENDCHAR +STARTCHAR U_5F34 +ENCODING 24372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +2440 +E7C0 +8000 +EFC0 +2080 +3FE0 +2100 +A500 +4200 +ENDCHAR +STARTCHAR U_5F35 +ENCODING 24373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1400 +17C0 +F400 +87C0 +8400 +FFE0 +14A0 +1440 +A520 +4620 +ENDCHAR +STARTCHAR U_5F36 +ENCODING 24374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +1FE0 +F000 +87C0 +8440 +F7C0 +1100 +1540 +A920 +4B20 +ENDCHAR +STARTCHAR U_5F37 +ENCODING 24375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1240 +1420 +F7E0 +8100 +87C0 +F540 +17C0 +1120 +51E0 +2E20 +ENDCHAR +STARTCHAR U_5F38 +ENCODING 24376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2AA0 +EEE0 +8AA0 +8AA0 +EEE0 +2AA0 +2AA0 +B320 +4660 +ENDCHAR +STARTCHAR U_5F39 +ENCODING 24377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +2280 +2FE0 +E920 +8FE0 +8920 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F3A +ENCODING 24378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +2440 +27C0 +E100 +8FE0 +8920 +E920 +2FC0 +2120 +21E0 +CF20 +ENDCHAR +STARTCHAR U_5F3B +ENCODING 24379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2420 +3F20 +F560 +9540 +9B40 +FB60 +3120 +3120 +BFA0 +4040 +ENDCHAR +STARTCHAR U_5F3C +ENCODING 24380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2420 +2E20 +EAE0 +8A80 +8E80 +EAE0 +2A20 +2E20 +AAA0 +4040 +ENDCHAR +STARTCHAR U_5F3D +ENCODING 24381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +1FE0 +1540 +F5C0 +8400 +F7E0 +1100 +1FE0 +1380 +A540 +4920 +ENDCHAR +STARTCHAR U_5F3E +ENCODING 24382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A20 +E540 +2FC0 +EA40 +8FC0 +EA40 +2FC0 +2200 +3FE0 +A200 +4200 +ENDCHAR +STARTCHAR U_5F3F +ENCODING 24383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7F80 +1100 +FFE0 +2F80 +D060 +1F00 +0100 +0600 +ENDCHAR +STARTCHAR U_5F40 +ENCODING 24384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2140 +FD60 +8E00 +7BE0 +4240 +7940 +0880 +4940 +3620 +ENDCHAR +STARTCHAR U_5F41 +ENCODING 24385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1740 +1540 +7740 +4040 +4FE0 +7540 +1740 +1040 +A140 +4080 +ENDCHAR +STARTCHAR U_5F42 +ENCODING 24386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A40 +2A80 +FFE0 +1500 +77E0 +4900 +77E0 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_5F43 +ENCODING 24387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2920 +2FE0 +E920 +8FE0 +8540 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F44 +ENCODING 24388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2800 +2BC0 +EA40 +8BC0 +8800 +EBE0 +2AA0 +2BE0 +A800 +4FE0 +ENDCHAR +STARTCHAR U_5F45 +ENCODING 24389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E240 +2FE0 +2000 +EEA0 +8AA0 +EEA0 +2A40 +2FE0 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_5F46 +ENCODING 24390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +B540 +EC80 +BFC0 +00A0 +3F80 +2000 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F47 +ENCODING 24391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +27C0 +2140 +EFE0 +8140 +8BA0 +ED60 +2FE0 +2920 +AD60 +53A0 +ENDCHAR +STARTCHAR U_5F48 +ENCODING 24392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2FE0 +E920 +8FE0 +8920 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F49 +ENCODING 24393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +1280 +1FE0 +F100 +87C0 +F540 +17C0 +1540 +97C0 +6C60 +ENDCHAR +STARTCHAR U_5F4A +ENCODING 24394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +17C0 +F540 +8FE0 +8000 +F7C0 +1540 +17C0 +A540 +4FE0 +ENDCHAR +STARTCHAR U_5F4B +ENCODING 24395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2AA0 +2FE0 +E000 +9FE0 +8840 +EFE0 +2540 +2C80 +B540 +4E20 +ENDCHAR +STARTCHAR U_5F4C +ENCODING 24396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +2920 +FFE0 +8920 +8DA0 +EB60 +2DA0 +2B60 +ADA0 +4960 +ENDCHAR +STARTCHAR U_5F4D +ENCODING 24397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +2A40 +EFE0 +8A40 +EFE0 +2940 +2FC0 +2940 +AFC0 +5660 +ENDCHAR +STARTCHAR U_5F4E +ENCODING 24398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +A1C0 +CEA0 +51C0 +FEA0 +AB40 +3F80 +2000 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F4F +ENCODING 24399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2EE0 +EAA0 +8FE0 +8900 +EFC0 +2900 +2FE0 +A300 +5CE0 +ENDCHAR +STARTCHAR U_5F50 +ENCODING 24400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +0080 +0080 +0080 +7F80 +0080 +0080 +0080 +FF80 +ENDCHAR +STARTCHAR U_5F51 +ENCODING 24401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1000 +1F00 +1100 +1100 +2100 +7E00 +0200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5F52 +ENCODING 24402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +17C0 +9040 +9040 +9040 +97C0 +9040 +9040 +2040 +4FC0 +8040 +ENDCHAR +STARTCHAR U_5F53 +ENCODING 24403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +4900 +2A00 +FF80 +0080 +0080 +7F80 +0080 +0080 +FF80 +ENDCHAR +STARTCHAR U_5F54 +ENCODING 24404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1100 +3F00 +0200 +FFE0 +4440 +2680 +1D00 +2480 +D460 +0800 +ENDCHAR +STARTCHAR U_5F55 +ENCODING 24405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +2440 +1680 +0D00 +3480 +C460 +0C00 +ENDCHAR +STARTCHAR U_5F56 +ENCODING 24406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +3F00 +0100 +FFE0 +1440 +6A80 +1700 +6A80 +1240 +6C20 +ENDCHAR +STARTCHAR U_5F57 +ENCODING 24407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +FBC0 +2100 +FBE0 +2100 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_5F58 +ENCODING 24408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +3F00 +0100 +FFE0 +8880 +EFA0 +94C0 +9F80 +CAA0 +9160 +ENDCHAR +STARTCHAR U_5F59 +ENCODING 24409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2100 +FFE0 +8020 +BFA0 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_5F5A +ENCODING 24410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +FFE0 +A4A0 +3F80 +2480 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_5F5B +ENCODING 24411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +7FC0 +1280 +5440 +FFA0 +3A80 +5580 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_5F5C +ENCODING 24412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1100 +FFE0 +5580 +FE40 +5BE0 +9540 +2280 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_5F5D +ENCODING 24413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFE0 +5480 +3940 +FFA0 +39C0 +56A0 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F5E +ENCODING 24414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +FFE0 +5680 +3940 +FFE0 +39C0 +56A0 +FFE0 +1080 +2080 +ENDCHAR +STARTCHAR U_5F5F +ENCODING 24415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +0BE0 +7E80 +0BC0 +FA80 +13C0 +FA80 +97C0 +5280 +1100 +36E0 +ENDCHAR +STARTCHAR U_5F60 +ENCODING 24416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0FE0 +7A80 +07C0 +FA80 +2FC0 +FA80 +17C0 +FA80 +5100 +36E0 +ENDCHAR +STARTCHAR U_5F61 +ENCODING 24417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +02 +04 +08 +32 +C4 +08 +31 +C2 +04 +18 +E0 +ENDCHAR +STARTCHAR U_5F62 +ENCODING 24418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2440 +2480 +2420 +FE40 +2480 +2500 +2420 +2440 +4480 +8700 +ENDCHAR +STARTCHAR U_5F63 +ENCODING 24419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2080 +FB00 +5040 +5080 +5300 +5040 +2080 +3300 +4C00 +83E0 +ENDCHAR +STARTCHAR U_5F64 +ENCODING 24420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E00 +2220 +3240 +2A80 +2220 +FF40 +2280 +2220 +2240 +4A80 +8500 +ENDCHAR +STARTCHAR U_5F65 +ENCODING 24421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +0A80 +0500 +7FE0 +4300 +5CC0 +4300 +5CC0 +4300 +9C00 +ENDCHAR +STARTCHAR U_5F66 +ENCODING 24422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FC0 +1080 +0900 +7FE0 +4300 +5CC0 +4300 +5CC0 +4300 +9C00 +ENDCHAR +STARTCHAR U_5F67 +ENCODING 24423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0500 +7680 +5520 +7A40 +0680 +3920 +C2A0 +0C60 +ENDCHAR +STARTCHAR U_5F68 +ENCODING 24424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FE20 +0040 +EEA0 +AA20 +EE40 +AA80 +AA20 +AA20 +AA40 +AA80 +ENDCHAR +STARTCHAR U_5F69 +ENCODING 24425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C40 +F280 +5500 +2820 +1040 +FE80 +3900 +5420 +9240 +1080 +1300 +ENDCHAR +STARTCHAR U_5F6A +ENCODING 24426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1040 +7EA0 +5240 +7C80 +5220 +5E40 +4080 +5D20 +9420 +A3E0 +ENDCHAR +STARTCHAR U_5F6B +ENCODING 24427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +9280 +BB00 +9220 +FE40 +8280 +BB00 +AA20 +BA40 +8280 +8700 +ENDCHAR +STARTCHAR U_5F6C +ENCODING 24428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2220 +FF40 +2280 +7620 +6B40 +AA80 +A220 +2240 +2280 +2300 +ENDCHAR +STARTCHAR U_5F6D +ENCODING 24429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +1080 +7D20 +0040 +7C80 +4500 +7C20 +2840 +2C80 +F300 +ENDCHAR +STARTCHAR U_5F6E +ENCODING 24430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +AA80 +4520 +9240 +2880 +4500 +FE20 +4440 +4480 +7F00 +ENDCHAR +STARTCHAR U_5F6F +ENCODING 24431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2840 +FE80 +AB20 +FE40 +0080 +7D00 +0020 +FE40 +5480 +B300 +ENDCHAR +STARTCHAR U_5F70 +ENCODING 24432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +2880 +FF20 +4440 +7C80 +4500 +7C20 +1040 +FE80 +1100 +ENDCHAR +STARTCHAR U_5F71 +ENCODING 24433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4440 +7C80 +4520 +7C40 +1080 +FF00 +4420 +7C40 +5480 +B300 +ENDCHAR +STARTCHAR U_5F72 +ENCODING 24434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7720 +0020 +7740 +5580 +3F20 +5440 +7F80 +5520 +7F40 +5480 +9F00 +ENDCHAR +STARTCHAR U_5F73 +ENCODING 24435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +40 +88 +10 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR U_5F74 +ENCODING 24436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +43E0 +9420 +2820 +6220 +A120 +2020 +2020 +2140 +2080 +ENDCHAR +STARTCHAR U_5F75 +ENCODING 24437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +4560 +97A0 +2D20 +6520 +A520 +2560 +2500 +2420 +23E0 +ENDCHAR +STARTCHAR U_5F76 +ENCODING 24438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +2440 +4440 +9480 +25E0 +6420 +A620 +2540 +2880 +2940 +3620 +ENDCHAR +STARTCHAR U_5F77 +ENCODING 24439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9200 +2200 +63C0 +A240 +2240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_5F78 +ENCODING 24440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4500 +8480 +2480 +4840 +CA40 +5220 +4400 +4480 +5FC0 +4840 +ENDCHAR +STARTCHAR U_5F79 +ENCODING 24441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +4480 +8480 +08E0 +3000 +4780 +C480 +4300 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_5F7A +ENCODING 24442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +27C0 +4100 +8100 +1100 +2100 +67C0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F7B +ENCODING 24443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4BE0 +88A0 +2CA0 +58A0 +C8A0 +4D20 +4920 +4220 +44A0 +4840 +ENDCHAR +STARTCHAR U_5F7C +ENCODING 24444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +8920 +2900 +4900 +CFC0 +4C40 +4A80 +5100 +5280 +6C60 +ENDCHAR +STARTCHAR U_5F7D +ENCODING 24445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4F00 +8900 +2900 +4FE0 +C900 +4900 +4880 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_5F7E +ENCODING 24446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4500 +8880 +3440 +4220 +DFC0 +4080 +4100 +4600 +4200 +4100 +ENDCHAR +STARTCHAR U_5F7F +ENCODING 24447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +57E0 +A2A0 +6FE0 +AA80 +2FE0 +22A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_5F80 +ENCODING 24448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9100 +2100 +6100 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F81 +ENCODING 24449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +9100 +2100 +65E0 +A500 +2500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_5F82 +ENCODING 24450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +9440 +27C0 +6440 +A440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5F83 +ENCODING 24451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +4500 +97C0 +2900 +6100 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F84 +ENCODING 24452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2080 +4900 +9280 +2440 +6820 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F85 +ENCODING 24453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +47C0 +9100 +1FE0 +2080 +6FE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_5F86 +ENCODING 24454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4280 +8280 +1FE0 +2AA0 +6AA0 +AAA0 +2C60 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5F87 +ENCODING 24455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4820 +97A0 +24A0 +67A0 +A4A0 +27A0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_5F88 +ENCODING 24456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +47C0 +9440 +27C0 +6520 +A540 +2480 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_5F89 +ENCODING 24457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2280 +4FE0 +9100 +2100 +67C0 +A100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_5F8A +ENCODING 24458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5020 +9020 +37A0 +54A0 +D4A0 +57A0 +5020 +5020 +5FE0 +5020 +ENDCHAR +STARTCHAR U_5F8B +ENCODING 24459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5FC0 +8240 +3FE0 +4240 +DFC0 +4200 +5FC0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_5F8C +ENCODING 24460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2480 +4700 +9240 +2FE0 +6420 +A7C0 +2C40 +3280 +2380 +2C60 +ENDCHAR +STARTCHAR U_5F8D +ENCODING 24461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +9100 +2FE0 +6100 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F8E +ENCODING 24462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +97C0 +2000 +6FE0 +A100 +27C0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_5F8F +ENCODING 24463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +45C0 +9500 +2FE0 +4100 +C520 +4540 +4980 +4300 +5C00 +ENDCHAR +STARTCHAR U_5F90 +ENCODING 24464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +9440 +2820 +67C0 +A100 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_5F91 +ENCODING 24465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2540 +4540 +9A80 +2540 +6540 +A000 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F92 +ENCODING 24466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +47C0 +9100 +2FE0 +6100 +A500 +25E0 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5F93 +ENCODING 24467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +8100 +2100 +4500 +C5C0 +4500 +4500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_5F94 +ENCODING 24468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2480 +4FE0 +9480 +2200 +6FC0 +A080 +2100 +2600 +2C00 +33E0 +ENDCHAR +STARTCHAR U_5F95 +ENCODING 24469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9FC0 +3240 +4A80 +FFE0 +4700 +4A80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_5F96 +ENCODING 24470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9820 +27C0 +6000 +AFE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_5F97 +ENCODING 24471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +9440 +27C0 +6000 +A7E0 +2080 +2FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_5F98 +ENCODING 24472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +4EE0 +9280 +2280 +6EE0 +A280 +2280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_5F99 +ENCODING 24473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +45E0 +9500 +2FE0 +6100 +A500 +25E0 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5F9A +ENCODING 24474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4200 +9FC0 +3AC0 +5740 +DFC0 +4700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5F9B +ENCODING 24475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +4280 +9440 +2FE0 +6040 +A740 +2540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_5F9C +ENCODING 24476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2920 +4540 +9100 +2FE0 +6820 +ABA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_5F9D +ENCODING 24477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +97C0 +2440 +67C0 +A440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5F9E +ENCODING 24478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2240 +45A0 +9920 +2000 +6500 +A500 +25E0 +2500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_5F9F +ENCODING 24479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2920 +4920 +9BA0 +2920 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +3060 +ENDCHAR +STARTCHAR U_5FA0 +ENCODING 24480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4FE0 +9540 +2540 +6BA0 +A120 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_5FA1 +ENCODING 24481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +24E0 +47A0 +9AA0 +2FA0 +62A0 +ABA0 +2AA0 +2BE0 +3C80 +2080 +ENDCHAR +STARTCHAR U_5FA2 +ENCODING 24482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4280 +9FE0 +2280 +4F80 +C200 +4B80 +4A00 +5600 +63C0 +ENDCHAR +STARTCHAR U_5FA3 +ENCODING 24483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +4FE0 +9280 +2FE0 +6000 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5FA4 +ENCODING 24484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4940 +8FE0 +3140 +5BC0 +C900 +6FE0 +5100 +5900 +67E0 +ENDCHAR +STARTCHAR U_5FA5 +ENCODING 24485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +87C0 +1440 +27C0 +6000 +AFE0 +2100 +25C0 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5FA6 +ENCODING 24486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +4A20 +8A20 +2EE0 +4800 +CEE0 +48A0 +4EA0 +4840 +48A0 +4920 +ENDCHAR +STARTCHAR U_5FA7 +ENCODING 24487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4840 +9FC0 +2800 +4FE0 +CAA0 +5FE0 +5AA0 +6AA0 +4860 +ENDCHAR +STARTCHAR U_5FA8 +ENCODING 24488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27C0 +4440 +97C0 +2440 +6FE0 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5FA9 +ENCODING 24489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4C40 +97C0 +2440 +67C0 +A400 +27C0 +2C80 +3300 +2CE0 +ENDCHAR +STARTCHAR U_5FAA +ENCODING 24490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2880 +4FE0 +9880 +2BE0 +6A20 +ABE0 +2A20 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5FAB +ENCODING 24491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27C0 +4240 +9FE0 +2440 +67C0 +A080 +27E0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_5FAC +ENCODING 24492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8480 +3FE0 +5120 +DFE0 +4200 +43C0 +4240 +4440 +48C0 +ENDCHAR +STARTCHAR U_5FAD +ENCODING 24493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +4E40 +8A40 +1580 +2900 +6FC0 +B100 +2FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_5FAE +ENCODING 24494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +6A80 +BE80 +01E0 +5D40 +C340 +5D40 +5480 +5680 +5540 +6220 +ENDCHAR +STARTCHAR U_5FAF +ENCODING 24495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FA0 +2A40 +4580 +9240 +2F80 +6240 +AFA0 +2100 +2FE0 +2280 +3C60 +ENDCHAR +STARTCHAR U_5FB0 +ENCODING 24496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +45C0 +9500 +1FE0 +2000 +67E0 +A100 +25C0 +2500 +2FE0 +ENDCHAR +STARTCHAR U_5FB1 +ENCODING 24497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2500 +5FC0 +9540 +3FC0 +4000 +CF80 +4000 +5FE0 +4A80 +5640 +ENDCHAR +STARTCHAR U_5FB2 +ENCODING 24498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4820 +8FE0 +1AA0 +29C0 +6AA0 +ABE0 +2C80 +2FE0 +2880 +3080 +ENDCHAR +STARTCHAR U_5FB3 +ENCODING 24499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +9FE0 +2AA0 +4FE0 +C400 +4A40 +5AA0 +68A0 +4780 +ENDCHAR +STARTCHAR U_5FB4 +ENCODING 24500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +9FE0 +2140 +5F40 +C540 +5E80 +4480 +4540 +5A20 +ENDCHAR +STARTCHAR U_5FB5 +ENCODING 24501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9F60 +10A0 +2EA0 +60A0 +BEA0 +24A0 +2E40 +24A0 +3F20 +ENDCHAR +STARTCHAR U_5FB6 +ENCODING 24502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +4E80 +84E0 +3F20 +5520 +D520 +5FA0 +5540 +5540 +55A0 +5320 +ENDCHAR +STARTCHAR U_5FB7 +ENCODING 24503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5FE0 +8200 +3FC0 +5540 +DFC0 +4000 +7FE0 +4A40 +58A0 +6F80 +ENDCHAR +STARTCHAR U_5FB8 +ENCODING 24504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +9FE0 +2A40 +4A40 +CFC0 +4200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_5FB9 +ENCODING 24505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +8AE0 +3FA0 +40A0 +DEA0 +52A0 +5E40 +5240 +5EA0 +5320 +ENDCHAR +STARTCHAR U_5FBA +ENCODING 24506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4200 +9FE0 +2480 +4FC0 +C480 +5FE0 +4500 +4520 +58E0 +ENDCHAR +STARTCHAR U_5FBB +ENCODING 24507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +4440 +8BA0 +1000 +2FE0 +6AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5FBC +ENCODING 24508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5E80 +92E0 +3FA0 +52A0 +FFA0 +48A0 +4EA0 +4A40 +52A0 +6720 +ENDCHAR +STARTCHAR U_5FBD +ENCODING 24509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +7E80 +80E0 +3FA0 +48A0 +DCA0 +4AA0 +7F40 +5C40 +6AA0 +5920 +ENDCHAR +STARTCHAR U_5FBE +ENCODING 24510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9F60 +25A0 +5EA0 +C0A0 +5EA0 +40A0 +5E40 +52A0 +5F20 +ENDCHAR +STARTCHAR U_5FBF +ENCODING 24511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5F80 +8AE0 +2420 +5FE0 +D280 +5EE0 +5280 +5EE0 +5280 +56E0 +ENDCHAR +STARTCHAR U_5FC0 +ENCODING 24512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +2EE0 +4280 +CFE0 +4280 +5FE0 +4D40 +5480 +4660 +ENDCHAR +STARTCHAR U_5FC1 +ENCODING 24513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4820 +8FE0 +2940 +4FC0 +D120 +5FE0 +4D40 +53A0 +4540 +4B20 +ENDCHAR +STARTCHAR U_5FC2 +ENCODING 24514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +BAA0 +6EE0 +A900 +2FE0 +3900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_5FC3 +ENCODING 24515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +1200 +1200 +1040 +5020 +5020 +50A0 +9080 +1080 +0F80 +ENDCHAR +STARTCHAR U_5FC4 +ENCODING 24516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +20 +30 +A8 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_5FC5 +ENCODING 24517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +0500 +1100 +5240 +5220 +9420 +1880 +1080 +3080 +CF80 +ENDCHAR +STARTCHAR U_5FC6 +ENCODING 24518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +3040 +A880 +A880 +A100 +2200 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FC7 +ENCODING 24519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +B7E0 +A920 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_5FC8 +ENCODING 24520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0000 +0440 +5220 +50A0 +9080 +0F80 +ENDCHAR +STARTCHAR U_5FC9 +ENCODING 24521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2120 +B120 +A920 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_5FCA +ENCODING 24522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +B100 +A900 +2100 +2100 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_5FCB +ENCODING 24523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2040 +B040 +A840 +27C0 +2400 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FCC +ENCODING 24524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +2020 +2020 +1FE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FCD +ENCODING 24525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0440 +2440 +2440 +4840 +1180 +6400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FCE +ENCODING 24526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +0400 +0400 +0440 +5220 +52A0 +9080 +0F80 +ENDCHAR +STARTCHAR U_5FCF +ENCODING 24527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A100 +B100 +A900 +2FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FD0 +ENCODING 24528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07C0 +0400 +0400 +FFE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD1 +ENCODING 24529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0700 +0480 +0400 +0000 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD2 +ENCODING 24530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +1100 +0900 +0100 +1500 +52A0 +52A0 +9460 +0C20 +ENDCHAR +STARTCHAR U_5FD3 +ENCODING 24531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +B100 +A900 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FD4 +ENCODING 24532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +A3E0 +B400 +ABC0 +A080 +2100 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FD5 +ENCODING 24533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B100 +AFE0 +A100 +A100 +2280 +2280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_5FD6 +ENCODING 24534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +A040 +B7E0 +A840 +2240 +2140 +2040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_5FD7 +ENCODING 24535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +7FC0 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD8 +ENCODING 24536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +2000 +2000 +3FC0 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD9 +ENCODING 24537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2000 +AFE0 +B400 +AC00 +A400 +2400 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_5FDA +ENCODING 24538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2500 +B5C0 +A740 +2D40 +2540 +25C0 +2520 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FDB +ENCODING 24539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +2480 +B480 +B680 +A580 +2480 +2480 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_5FDC +ENCODING 24540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4400 +4200 +4A40 +5820 +68A0 +4880 +8F80 +ENDCHAR +STARTCHAR U_5FDD +ENCODING 24541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +1100 +2480 +4440 +A6A0 +2540 +4540 +0C00 +ENDCHAR +STARTCHAR U_5FDE +ENCODING 24542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +C060 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FDF +ENCODING 24543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B440 +B440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5FE0 +ENCODING 24544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +4440 +7FC0 +0400 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FE1 +ENCODING 24545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B920 +A920 +2FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FE2 +ENCODING 24546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +0880 +FFE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FE3 +ENCODING 24547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2280 +B3E0 +A220 +A220 +2240 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_5FE4 +ENCODING 24548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +B7C0 +A900 +B100 +3FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FE5 +ENCODING 24549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +9F80 +0000 +3F80 +0880 +2580 +A0A0 +A260 +9E20 +ENDCHAR +STARTCHAR U_5FE6 +ENCODING 24550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +6300 +D480 +C840 +54A0 +4480 +4480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_5FE7 +ENCODING 24551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +B7E0 +AA80 +2280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_5FE8 +ENCODING 24552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +B000 +A800 +AFE0 +2280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_5FE9 +ENCODING 24553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0900 +1080 +2440 +4920 +1F80 +0000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FEA +ENCODING 24554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +3280 +B440 +A440 +A920 +2120 +2200 +2240 +2440 +27E0 +ENDCHAR +STARTCHAR U_5FEB +ENCODING 24555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +37C0 +AA40 +A240 +BFE0 +2200 +2300 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_5FEC +ENCODING 24556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2040 +B280 +A100 +AFE0 +2120 +2100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_5FED +ENCODING 24557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B100 +A900 +A1C0 +2120 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FEE +ENCODING 24558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +A900 +A7C0 +2440 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_5FEF +ENCODING 24559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +B480 +AFE0 +A480 +2480 +2480 +24A0 +2660 +2420 +ENDCHAR +STARTCHAR U_5FF0 +ENCODING 24560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2F80 +2280 +B2A0 +ACA0 +A960 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FF1 +ENCODING 24561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +B520 +AD40 +A100 +2300 +2300 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_5FF2 +ENCODING 24562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +6200 +DFE0 +C200 +4500 +4500 +4480 +4A80 +4A40 +5020 +ENDCHAR +STARTCHAR U_5FF3 +ENCODING 24563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +AD40 +A540 +27C0 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_5FF4 +ENCODING 24564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B280 +AC40 +A920 +B080 +27E0 +2040 +2080 +2080 +2100 +ENDCHAR +STARTCHAR U_5FF5 +ENCODING 24565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +22E0 +DF80 +0100 +0200 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FF6 +ENCODING 24566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +B000 +A800 +AFE0 +2100 +2100 +2240 +2420 +2FE0 +ENDCHAR +STARTCHAR U_5FF7 +ENCODING 24567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +28A0 +ACA0 +BB20 +A920 +2920 +2AA0 +2AA0 +2CA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5FF8 +ENCODING 24568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2240 +B240 +AA40 +AFC0 +2440 +2440 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5FF9 +ENCODING 24569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FC0 +4200 +E200 +D200 +4F80 +4200 +4200 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_5FFA +ENCODING 24570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +B520 +A940 +B100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5FFB +ENCODING 24571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +B400 +AFE0 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_5FFC +ENCODING 24572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4200 +5FE0 +E000 +D780 +4480 +4480 +4480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_5FFD +ENCODING 24573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +2A40 +4A40 +1440 +2840 +0580 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FFE +ENCODING 24574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +3800 +AFC0 +B000 +AF80 +2080 +2080 +20A0 +2060 +2020 +ENDCHAR +STARTCHAR U_5FFF +ENCODING 24575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +2040 +FFA0 +0880 +1080 +6700 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6000 +ENCODING 24576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +A100 +B180 +AB40 +A520 +2920 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6001 +ENCODING 24577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0A00 +3980 +C460 +0000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6002 +ENCODING 24578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +2A80 +4440 +8820 +0400 +1240 +5020 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6003 +ENCODING 24579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +B100 +AFE0 +A180 +2180 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6004 +ENCODING 24580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2820 +BA20 +A940 +A880 +2940 +2E20 +2820 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6005 +ENCODING 24581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2440 +2480 +B500 +A600 +BFE0 +2500 +2500 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_6006 +ENCODING 24582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A820 +AF80 +A480 +2480 +2580 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6007 +ENCODING 24583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2400 +B7C0 +AC40 +2440 +2440 +27C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_6008 +ENCODING 24584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4A40 +6A40 +DFE0 +CA40 +4A40 +4A40 +4BC0 +4800 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6009 +ENCODING 24585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +A840 +B740 +A540 +2540 +2740 +24C0 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_600A +ENCODING 24586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +B120 +AA20 +A4A0 +A840 +27E0 +2420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_600B +ENCODING 24587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +A840 +BFC0 +A900 +2FE0 +2900 +2920 +28A0 +2A60 +2C20 +ENDCHAR +STARTCHAR U_600C +ENCODING 24588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +B100 +AB80 +A540 +A920 +3120 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_600D +ENCODING 24589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +B3E0 +AE00 +ABC0 +2200 +2200 +23E0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_600E +ENCODING 24590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2800 +4F80 +0800 +0FC0 +0800 +5440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_600F +ENCODING 24591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +AD40 +A540 +2540 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6010 +ENCODING 24592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +37E0 +A820 +B7A0 +24A0 +24A0 +27A0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_6011 +ENCODING 24593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +B100 +AFE0 +2100 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6012 +ENCODING 24594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA40 +4A40 +4A80 +3180 +2E60 +C000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6013 +ENCODING 24595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +BFA0 +AAA0 +AAA0 +AAA0 +2AA0 +24A0 +2640 +29A0 +3120 +ENDCHAR +STARTCHAR U_6014 +ENCODING 24596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A100 +B100 +AD00 +25E0 +2500 +2500 +2500 +2500 +2FE0 +ENDCHAR +STARTCHAR U_6015 +ENCODING 24597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +27E0 +B420 +AC20 +A420 +27E0 +2420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_6016 +ENCODING 24598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B200 +AD00 +A7E0 +AD20 +3520 +2520 +2520 +2560 +2100 +ENDCHAR +STARTCHAR U_6017 +ENCODING 24599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B1E0 +A900 +A100 +27E0 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6018 +ENCODING 24600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +0400 +1240 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6019 +ENCODING 24601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +A900 +27C0 +2440 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_601A +ENCODING 24602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B440 +AC40 +A7C0 +A440 +2440 +27C0 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_601B +ENCODING 24603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A440 +B440 +AFC0 +A440 +2440 +27C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_601C +ENCODING 24604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +2880 +B240 +A120 +AFC0 +2080 +2080 +2500 +2200 +2100 +ENDCHAR +STARTCHAR U_601D +ENCODING 24605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +3F80 +2480 +2480 +3F80 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_601E +ENCODING 24606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B100 +AFE0 +A920 +2920 +2FE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_601F +ENCODING 24607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +4900 +E900 +DFE0 +4900 +4900 +48A0 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_6020 +ENCODING 24608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6021 +ENCODING 24609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B240 +AC20 +AFE0 +2000 +27C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6022 +ENCODING 24610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +A7C0 +B500 +A900 +BFE0 +2100 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_6023 +ENCODING 24611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2400 +3FC0 +4400 +FFC0 +0A00 +F1E0 +0440 +5220 +9080 +0F80 +ENDCHAR +STARTCHAR U_6024 +ENCODING 24612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2080 +6FE0 +A880 +2480 +2080 +2580 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6025 +ENCODING 24613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1100 +3FC0 +4040 +1FC0 +0040 +3FC0 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6026 +ENCODING 24614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A520 +B340 +A900 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6027 +ENCODING 24615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +B500 +AFE0 +A900 +B100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6028 +ENCODING 24616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +AA40 +13A0 +2220 +41E0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6029 +ENCODING 24617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +A7E0 +B400 +AC00 +A520 +2540 +2580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_602A +ENCODING 24618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2440 +B280 +A900 +A280 +AD60 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_602B +ENCODING 24619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B2A0 +AFE0 +AA80 +2FE0 +22A0 +22A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_602C +ENCODING 24620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +BAA0 +AAA0 +AAA0 +AAA0 +2CE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_602D +ENCODING 24621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +B240 +AA40 +A280 +AAA0 +2AA0 +3300 +2240 +2640 +29C0 +ENDCHAR +STARTCHAR U_602E +ENCODING 24622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +B9E0 +AAA0 +ACA0 +A4A0 +24A0 +2AA0 +3D20 +22A0 +2440 +ENDCHAR +STARTCHAR U_602F +ENCODING 24623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +A900 +A100 +AFE0 +2100 +2240 +2440 +2FA0 +2420 +ENDCHAR +STARTCHAR U_6030 +ENCODING 24624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +A200 +B440 +AF80 +2100 +2200 +2440 +2FE0 +2020 +ENDCHAR +STARTCHAR U_6031 +ENCODING 24625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2540 +D540 +0A40 +3540 +0A80 +0000 +54C0 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6032 +ENCODING 24626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A100 +BFE0 +A920 +A920 +2AA0 +2C60 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_6033 +ENCODING 24627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A440 +B440 +AC40 +A7C0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6034 +ENCODING 24628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +AFE0 +B900 +A920 +A920 +2940 +2B40 +2CA0 +2960 +2220 +ENDCHAR +STARTCHAR U_6035 +ENCODING 24629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +A100 +B7E0 +A900 +A380 +2340 +2540 +2520 +2920 +3100 +ENDCHAR +STARTCHAR U_6036 +ENCODING 24630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B940 +A900 +2FC0 +2A40 +2A40 +2980 +2A40 +3420 +ENDCHAR +STARTCHAR U_6037 +ENCODING 24631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +0400 +2500 +2500 +C4E0 +0400 +1240 +5020 +5080 +8F80 +ENDCHAR +STARTCHAR U_6038 +ENCODING 24632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +1500 +2480 +C460 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6039 +ENCODING 24633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +25C0 +2740 +6D40 +A580 +2420 +23E0 +1400 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_603A +ENCODING 24634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2720 +3120 +A140 +AD80 +2540 +2920 +3120 +2500 +2200 +ENDCHAR +STARTCHAR U_603B +ENCODING 24635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +3F80 +2080 +2080 +3F80 +2080 +0440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_603C +ENCODING 24636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5080 +2480 +3280 +4880 +8180 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_603D +ENCODING 24637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +37C0 +A900 +A100 +2FE0 +2100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_603E +ENCODING 24638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +B440 +A440 +A7C0 +2000 +2280 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_603F +ENCODING 24639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +B180 +AA40 +A520 +A100 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6040 +ENCODING 24640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A480 +BB00 +A280 +ADE0 +2220 +2540 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_6041 +ENCODING 24641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F00 +4200 +5FE0 +C200 +4FC0 +4000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6042 +ENCODING 24642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +B7E0 +A820 +A3A0 +A2A0 +23A0 +22A0 +23A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6043 +ENCODING 24643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +A900 +AFE0 +A080 +2FE0 +2480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_6044 +ENCODING 24644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B100 +A7C0 +A000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6045 +ENCODING 24645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +B140 +A940 +AFE0 +A100 +2240 +2680 +2B20 +2220 +21E0 +ENDCHAR +STARTCHAR U_6046 +ENCODING 24646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +B3C0 +AC40 +A540 +A4C0 +2A40 +2940 +2040 +2040 +3FE0 +ENDCHAR +STARTCHAR U_6047 +ENCODING 24647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B7E0 +AC80 +A480 +A7E0 +2480 +2480 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_6048 +ENCODING 24648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +2440 +B7E0 +A900 +2FC0 +3100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6049 +ENCODING 24649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2700 +B420 +AFE0 +A000 +A7E0 +2420 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_604A +ENCODING 24650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +B240 +A340 +2480 +3FE0 +2AA0 +2AA0 +2AA0 +3540 +ENDCHAR +STARTCHAR U_604B +ENCODING 24651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +2A80 +2A40 +4A40 +0000 +5440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_604C +ENCODING 24652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +AAA0 +B6C0 +AA80 +A280 +26C0 +2AA0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_604D +ENCODING 24653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +B540 +AB80 +A100 +AFE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_604E +ENCODING 24654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +B440 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_604F +ENCODING 24655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +FC40 +2480 +6BE0 +1080 +E980 +0440 +54A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6050 +ENCODING 24656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2680 +25A0 +3CA0 +C860 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6051 +ENCODING 24657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A480 +BFE0 +A800 +2BC0 +2A40 +2AC0 +2A20 +2A20 +31E0 +ENDCHAR +STARTCHAR U_6052 +ENCODING 24658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +B7C0 +AC40 +A440 +27C0 +2440 +27C0 +2440 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6053 +ENCODING 24659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +A280 +BFE0 +AAA0 +AAA0 +2AA0 +2CE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6054 +ENCODING 24660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B480 +A840 +B4A0 +2480 +2300 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_6055 +ENCODING 24661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2A40 +4A40 +3240 +2BC0 +C400 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6056 +ENCODING 24662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +2A80 +2480 +2A80 +3F80 +0440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6057 +ENCODING 24663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2300 +B480 +AFC0 +B020 +27C0 +2200 +2380 +2080 +2180 +ENDCHAR +STARTCHAR U_6058 +ENCODING 24664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +B480 +AFE0 +B480 +A5C0 +26A0 +26A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_6059 +ENCODING 24665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FE0 +0400 +3FC0 +0400 +FFE0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_605A +ENCODING 24666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_605B +ENCODING 24667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +B820 +ABA0 +AAA0 +AAA0 +2BA0 +2AA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_605C +ENCODING 24668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +AFE0 +A100 +BF00 +A500 +2500 +24A0 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_605D +ENCODING 24669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +F920 +2120 +FA20 +24C0 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_605E +ENCODING 24670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B7C0 +A940 +A7C0 +2500 +2FE0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_605F +ENCODING 24671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +A820 +B520 +AAA0 +ADA0 +28A0 +2FA0 +28A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6060 +ENCODING 24672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2FE0 +B280 +A480 +AFC0 +3480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_6061 +ENCODING 24673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +2300 +B480 +A200 +AFE0 +2200 +2500 +2900 +2240 +27E0 +ENDCHAR +STARTCHAR U_6062 +ENCODING 24674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +B200 +AA80 +A480 +A5A0 +2AC0 +3080 +2140 +2240 +2420 +ENDCHAR +STARTCHAR U_6063 +ENCODING 24675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2A20 +C240 +4500 +4880 +7060 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6064 +ENCODING 24676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2200 +AFE0 +BAA0 +AAA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6065 +ENCODING 24677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5080 +5280 +7200 +5240 +7620 +5A20 +5240 +7A40 +D240 +13C0 +ENDCHAR +STARTCHAR U_6066 +ENCODING 24678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +AFE0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_6067 +ENCODING 24679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +7FC0 +4A40 +4A40 +4A40 +40C0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6068 +ENCODING 24680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A520 +2540 +2480 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_6069 +ENCODING 24681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +4A40 +5140 +7FC0 +0400 +6240 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_606A +ENCODING 24682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A440 +BA80 +A100 +2280 +2FE0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_606B +ENCODING 24683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +ABA0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_606C +ENCODING 24684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +B100 +AFE0 +A100 +A100 +27E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_606D +ENCODING 24685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1200 +2900 +48C0 +AA20 +2940 +4940 +1800 +ENDCHAR +STARTCHAR U_606E +ENCODING 24686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +BC40 +A820 +A7C0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_606F +ENCODING 24687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6070 +ENCODING 24688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A820 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6071 +ENCODING 24689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +B540 +AA20 +A480 +2FC0 +2000 +2280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_6072 +ENCODING 24690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7E0 +AA40 +A240 +AFE0 +2240 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6073 +ENCODING 24691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3FA0 +2440 +2B80 +34E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6074 +ENCODING 24692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +5440 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6075 +ENCODING 24693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6076 +ENCODING 24694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +0A00 +FFE0 +0000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6077 +ENCODING 24695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FC0 +6200 +A700 +2A80 +2260 +0800 +54C0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6078 +ENCODING 24696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2080 +B1E0 +A8A0 +BFA0 +24A0 +24A0 +2AA0 +3DA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_6079 +ENCODING 24697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B4C0 +ACA0 +A7E0 +A480 +2480 +2480 +2940 +2A20 +3420 +ENDCHAR +STARTCHAR U_607A +ENCODING 24698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +A520 +B7E0 +A800 +A7E0 +2020 +27E0 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_607B +ENCODING 24699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +5120 +F5A0 +D5A0 +D5A0 +55A0 +55A0 +5520 +5520 +4A20 +5160 +ENDCHAR +STARTCHAR U_607C +ENCODING 24700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B480 +AAA0 +A920 +2AA0 +2CA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_607D +ENCODING 24701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A100 +B7E0 +AC80 +A7C0 +2080 +2FE0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_607E +ENCODING 24702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2FE0 +B480 +A200 +BFE0 +2400 +2400 +2400 +27C0 +2000 +ENDCHAR +STARTCHAR U_607F +ENCODING 24703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +12C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6080 +ENCODING 24704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +B280 +AFE0 +A920 +AFE0 +2920 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_6081 +ENCODING 24705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +B3C0 +A800 +A7E0 +A420 +27E0 +2420 +27E0 +2420 +24E0 +ENDCHAR +STARTCHAR U_6082 +ENCODING 24706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +2EE0 +B880 +ACA0 +A960 +2100 +2FC0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_6083 +ENCODING 24707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +A920 +BFE0 +A920 +ABA0 +2D60 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6084 +ENCODING 24708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +A100 +B7E0 +A420 +A7E0 +2420 +27E0 +2420 +2420 +24E0 +ENDCHAR +STARTCHAR U_6085 +ENCODING 24709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +B7E0 +AC40 +A440 +A7C0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6086 +ENCODING 24710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0400 +7FC0 +1500 +ECE0 +0200 +5140 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6087 +ENCODING 24711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A280 +B440 +A820 +A7C0 +2100 +2FE0 +2540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_6088 +ENCODING 24712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B080 +AAA0 +AAA0 +3FC0 +2A80 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_6089 +ENCODING 24713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +2480 +1500 +FFE0 +1600 +6580 +8460 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_608A +ENCODING 24714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +3A80 +E280 +2480 +6880 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_608B +ENCODING 24715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3280 +A900 +AA80 +A440 +2FE0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_608C +ENCODING 24716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7E0 +A920 +A7E0 +2500 +27E0 +2120 +2320 +25C0 +2900 +ENDCHAR +STARTCHAR U_608D +ENCODING 24717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +BC40 +A7C0 +A000 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_608E +ENCODING 24718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +A7C0 +B500 +A900 +AFE0 +2000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_608F +ENCODING 24719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +37E0 +A900 +A540 +A540 +2BA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6090 +ENCODING 24720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5120 +2540 +5580 +3900 +5280 +9440 +6820 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6091 +ENCODING 24721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +37E0 +A900 +AFE0 +A520 +27E0 +2520 +27E0 +2520 +2560 +ENDCHAR +STARTCHAR U_6092 +ENCODING 24722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A000 +AFE0 +A920 +2FE0 +2800 +2820 +2820 +27E0 +ENDCHAR +STARTCHAR U_6093 +ENCODING 24723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +B440 +A7C0 +2440 +27C0 +2280 +2280 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6094 +ENCODING 24724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +B000 +AFC0 +A540 +A540 +3FE0 +2940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_6095 +ENCODING 24725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +B660 +A900 +AFE0 +A280 +27E0 +2AA0 +22A0 +22E0 +2080 +ENDCHAR +STARTCHAR U_6096 +ENCODING 24726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B100 +AFE0 +A820 +A7C0 +2080 +2FE0 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_6097 +ENCODING 24727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +B480 +AFE0 +A520 +A520 +27E0 +2180 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6098 +ENCODING 24728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4800 +4F80 +5200 +7FC0 +4880 +7FC0 +0000 +5440 +92A0 +0F80 +ENDCHAR +STARTCHAR U_6099 +ENCODING 24729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B000 +B7C0 +2440 +27C0 +2080 +2100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_609A +ENCODING 24730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +BFE0 +A920 +AFE0 +2920 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_609B +ENCODING 24731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2440 +B7A0 +AA40 +A420 +ABC0 +2440 +2A80 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_609C +ENCODING 24732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B440 +AFC0 +A000 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_609D +ENCODING 24733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +B7C0 +AD40 +A7C0 +A540 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_609E +ENCODING 24734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2A40 +ABC0 +B800 +2FC0 +2240 +3FE0 +2200 +2500 +2880 +3060 +ENDCHAR +STARTCHAR U_609F +ENCODING 24735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +B7C0 +A240 +A240 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_60A0 +ENCODING 24736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +D640 +5240 +5180 +5660 +4000 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A1 +ENCODING 24737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +1140 +FD40 +1140 +3940 +D440 +10C0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A2 +ENCODING 24738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B440 +AFC0 +A440 +A7C0 +2520 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_60A3 +ENCODING 24739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +3F80 +0400 +7FC0 +4440 +7FC0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60A4 +ENCODING 24740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +4840 +4F40 +5540 +4A40 +7FC0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A5 +ENCODING 24741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0000 +1F80 +0000 +1F80 +1080 +1F80 +5040 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60A6 +ENCODING 24742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2000 +B7C0 +AC40 +A440 +27C0 +2280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_60A7 +ENCODING 24743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +4E20 +44A0 +E4A0 +DEA0 +44A0 +4EA0 +4CA0 +5420 +44A0 +4440 +ENDCHAR +STARTCHAR U_60A8 +ENCODING 24744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +4920 +D540 +4520 +4920 +4300 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60A9 +ENCODING 24745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2220 +2920 +A540 +B400 +A080 +2AA0 +2920 +2AA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_60AA +ENCODING 24746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0A00 +FFE0 +0400 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60AB +ENCODING 24747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8020 +1E40 +F3C0 +0400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60AC +ENCODING 24748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2780 +2080 +FFE0 +1080 +7F40 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60AD +ENCODING 24749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2AA0 +AAA0 +BA40 +AAA0 +AB20 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60AE +ENCODING 24750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +3440 +B7C0 +B000 +A7C0 +2100 +2FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_60AF +ENCODING 24751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2420 +A920 +BFE0 +AAA0 +AAA0 +2920 +2AA0 +2C60 +2820 +28E0 +ENDCHAR +STARTCHAR U_60B0 +ENCODING 24752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +B7C0 +A000 +AFE0 +2100 +2540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_60B1 +ENCODING 24753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +A280 +B280 +AEE0 +A280 +2280 +2EE0 +2280 +2280 +2280 +ENDCHAR +STARTCHAR U_60B2 +ENCODING 24754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60B3 +ENCODING 24755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +5F80 +5280 +5F80 +4000 +7FE0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60B4 +ENCODING 24756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +B440 +AAA0 +A920 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_60B5 +ENCODING 24757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B7C0 +AC00 +A7C0 +A400 +2FE0 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_60B6 +ENCODING 24758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +8A20 +A8A0 +A960 +C720 +8060 +ENDCHAR +STARTCHAR U_60B7 +ENCODING 24759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +AFE0 +A940 +A920 +2FE0 +2900 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_60B8 +ENCODING 24760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A540 +A920 +B7C0 +2080 +3FE0 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_60B9 +ENCODING 24761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F00 +2100 +3F80 +2080 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60BA +ENCODING 24762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +B820 +A7C0 +A440 +27C0 +2400 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_60BB +ENCODING 24763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +AFE0 +A440 +2280 +2FC0 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_60BC +ENCODING 24764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +A100 +B7C0 +AC40 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_60BD +ENCODING 24765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B140 +AFE0 +A140 +A7C0 +2200 +3FE0 +2480 +2380 +2E60 +ENDCHAR +STARTCHAR U_60BE +ENCODING 24766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +B280 +A440 +A820 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60BF +ENCODING 24767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A280 +A440 +BA20 +2340 +2AA0 +2AA0 +3200 +2600 +ENDCHAR +STARTCHAR U_60C0 +ENCODING 24768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B7A0 +A000 +AFE0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60C1 +ENCODING 24769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +37E0 +6C80 +A480 +2880 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60C2 +ENCODING 24770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +B240 +AC80 +AA00 +24E0 +2420 +26E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_60C3 +ENCODING 24771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A880 +2EA0 +28C0 +2880 +2EA0 +2860 +ENDCHAR +STARTCHAR U_60C4 +ENCODING 24772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1D40 +1140 +FC80 +5540 +9220 +2400 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60C5 +ENCODING 24773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +B7C0 +A100 +AFE0 +2440 +2740 +25C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_60C6 +ENCODING 24774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +BBA0 +A920 +AFE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +3060 +ENDCHAR +STARTCHAR U_60C7 +ENCODING 24775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B440 +AFC0 +A000 +A7C0 +2080 +2FE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_60C8 +ENCODING 24776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +B7C0 +AD40 +A7C0 +A100 +2FE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_60C9 +ENCODING 24777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +93C0 +6200 +2FC0 +C840 +4FC0 +4840 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60CA +ENCODING 24778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B000 +AFC0 +A440 +A7C0 +2100 +2540 +2920 +3520 +2200 +ENDCHAR +STARTCHAR U_60CB +ENCODING 24779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +A400 +A7E0 +A5A0 +29A0 +36E0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_60CC +ENCODING 24780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +3BC0 +4A40 +B2C0 +1220 +E7E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60CD +ENCODING 24781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B020 +A7C0 +A100 +2FE0 +2100 +2920 +2540 +2FE0 +ENDCHAR +STARTCHAR U_60CE +ENCODING 24782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1D00 +1700 +1100 +FFE0 +4440 +92A0 +3140 +4F40 +ENDCHAR +STARTCHAR U_60CF +ENCODING 24783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +AFE0 +B480 +AC80 +AEC0 +35A0 +26A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_60D0 +ENCODING 24784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2140 +AFE0 +B100 +AF20 +2AA0 +2EC0 +22A0 +2D60 +2220 +ENDCHAR +STARTCHAR U_60D1 +ENCODING 24785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +0200 +7A40 +4A80 +7920 +02A0 +FC60 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60D2 +ENCODING 24786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3C0 +2240 +FA40 +7240 +ABC0 +0000 +1440 +54A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60D3 +ENCODING 24787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +B7E0 +AA00 +AFE0 +A440 +2FA0 +3480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_60D4 +ENCODING 24788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +B540 +A980 +A240 +AD20 +2520 +2540 +2980 +2280 +2C60 +ENDCHAR +STARTCHAR U_60D5 +ENCODING 24789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A440 +AFC0 +A400 +27E0 +2AA0 +2520 +2A20 +24C0 +ENDCHAR +STARTCHAR U_60D6 +ENCODING 24790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +1000 +3FC0 +C940 +32C0 +0400 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60D7 +ENCODING 24791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2300 +2480 +AA60 +B100 +A780 +2080 +2140 +2CA0 +34A0 +2380 +ENDCHAR +STARTCHAR U_60D8 +ENCODING 24792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +A920 +BFE0 +A920 +AFE0 +2A20 +2A20 +2BA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_60D9 +ENCODING 24793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +24A0 +BAC0 +A520 +A000 +AFE0 +2AA0 +24A0 +2240 +24A0 +2920 +ENDCHAR +STARTCHAR U_60DA +ENCODING 24794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +AAA0 +B4A0 +A920 +A220 +24C0 +2500 +2D40 +34A0 +2380 +ENDCHAR +STARTCHAR U_60DB +ENCODING 24795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +B7E0 +AC80 +A760 +A420 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60DC +ENCODING 24796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +B280 +AA80 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60DD +ENCODING 24797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +B100 +AFE0 +A820 +ABA0 +2AA0 +2BA0 +2AA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_60DE +ENCODING 24798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +5880 +71E0 +DF20 +D480 +5480 +5480 +5480 +5540 +5540 +6620 +ENDCHAR +STARTCHAR U_60DF +ENCODING 24799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +B7E0 +AC80 +B7E0 +A480 +2480 +27E0 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_60E0 +ENCODING 24800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2440 +3FC0 +2440 +3FC0 +0440 +7FA0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60E1 +ENCODING 24801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60E2 +ENCODING 24802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +5280 +5040 +9140 +0F00 +1080 +2940 +2B20 +6560 +A940 +38C0 +ENDCHAR +STARTCHAR U_60E3 +ENCODING 24803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +7D60 +52A0 +98A0 +7320 +1060 +0440 +2AA0 +48A0 +0780 +ENDCHAR +STARTCHAR U_60E4 +ENCODING 24804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2240 +B3E0 +AE40 +A880 +BF20 +22C0 +2240 +2280 +2AA0 +25E0 +ENDCHAR +STARTCHAR U_60E5 +ENCODING 24805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +7FC0 +1100 +E4E0 +1280 +50C0 +8FA0 +ENDCHAR +STARTCHAR U_60E6 +ENCODING 24806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +B7E0 +AC80 +A4E0 +A480 +27E0 +2620 +2A20 +2BE0 +3220 +ENDCHAR +STARTCHAR U_60E7 +ENCODING 24807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A440 +27C0 +2440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_60E8 +ENCODING 24808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +A200 +BFE0 +A480 +B960 +2680 +2100 +2640 +2180 +2E00 +ENDCHAR +STARTCHAR U_60E9 +ENCODING 24809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4100 +A100 +49C0 +C900 +4900 +5FE0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60EA +ENCODING 24810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_60EB +ENCODING 24811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +6900 +0600 +3F80 +E4E0 +3F80 +2480 +3F80 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60EC +ENCODING 24812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +AFE0 +BAA0 +A9C0 +A880 +2FE0 +2880 +2940 +2A20 +2FE0 +ENDCHAR +STARTCHAR U_60ED +ENCODING 24813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +3F00 +A900 +B5E0 +BF40 +A540 +2740 +3D40 +2540 +2540 +2640 +ENDCHAR +STARTCHAR U_60EE +ENCODING 24814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7C0 +AD40 +A7C0 +A540 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_60EF +ENCODING 24815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +BFE0 +A540 +A7C0 +2000 +2FE0 +2920 +2920 +2280 +2C60 +ENDCHAR +STARTCHAR U_60F0 +ENCODING 24816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A200 +B7C0 +A900 +37E0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_60F1 +ENCODING 24817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +A540 +B2A0 +A000 +2FE0 +28A0 +2AA0 +2920 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_60F2 +ENCODING 24818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +B100 +AFE0 +A540 +27C0 +2540 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_60F3 +ENCODING 24819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +AC40 +27C0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60F4 +ENCODING 24820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +AFE0 +B000 +AFE0 +2200 +2FE0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60F5 +ENCODING 24821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +B540 +ADC0 +A400 +27E0 +2100 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_60F6 +ENCODING 24822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B440 +AFC0 +A440 +2FE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60F7 +ENCODING 24823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +3180 +5F40 +9120 +1F00 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_60F8 +ENCODING 24824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2CA0 +B7A0 +ACA0 +A7A0 +2060 +27C0 +2080 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_60F9 +ENCODING 24825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1000 +3F80 +D080 +1F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60FA +ENCODING 24826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2500 +27E0 +2900 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60FB +ENCODING 24827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2AA0 +AAA0 +BEA0 +AAA0 +AEA0 +2AA0 +2EA0 +2020 +2A20 +3160 +ENDCHAR +STARTCHAR U_60FC +ENCODING 24828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +BFE0 +A800 +2FE0 +2AA0 +2FE0 +3AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60FD +ENCODING 24829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +B900 +AFC0 +A8A0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60FE +ENCODING 24830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +BAA0 +AFE0 +A280 +2440 +2A20 +27C0 +2A80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_60FF +ENCODING 24831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2000 +2FE0 +2500 +25E0 +2B00 +30E0 +ENDCHAR +STARTCHAR U_6100 +ENCODING 24832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C80 +2480 +BEA0 +A5C0 +AE80 +2D80 +3480 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_6101 +ENCODING 24833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1120 +FD40 +3B80 +5580 +9240 +1C20 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6102 +ENCODING 24834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +13E0 +FEA0 +8AA0 +7CA0 +1160 +3600 +0440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6103 +ENCODING 24835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B000 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_6104 +ENCODING 24836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +37C0 +AD40 +A7C0 +A000 +3FE0 +2540 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_6105 +ENCODING 24837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A280 +B380 +A900 +A7C0 +2540 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6106 +ENCODING 24838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +45E0 +A800 +45E0 +C440 +5840 +49C0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6107 +ENCODING 24839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +3240 +AFE0 +A440 +A7C0 +2100 +2FE0 +2900 +3FE0 +2100 +ENDCHAR +STARTCHAR U_6108 +ENCODING 24840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +7EE0 +A440 +3D40 +2540 +3C40 +24C0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6109 +ENCODING 24841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2B60 +B000 +AE20 +AAA0 +2EA0 +2AA0 +2EA0 +2A20 +2AE0 +ENDCHAR +STARTCHAR U_610A +ENCODING 24842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +B440 +AFC0 +A000 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_610B +ENCODING 24843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2520 +32C0 +AFE0 +A100 +AFE0 +2200 +27C0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_610C +ENCODING 24844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +3100 +AFE0 +AAA0 +AC60 +2920 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_610D +ENCODING 24845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +FA40 +A240 +F980 +A180 +9260 +CC00 +1240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_610E +ENCODING 24846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C40 +B7C0 +A440 +A7C0 +2200 +27E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_610F +ENCODING 24847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +5440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6110 +ENCODING 24848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A200 +AFE0 +BAA0 +ABA0 +2AA0 +2BA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6111 +ENCODING 24849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +27E0 +B520 +AFE0 +A520 +27E0 +2520 +2FE0 +2220 +2460 +ENDCHAR +STARTCHAR U_6112 +ENCODING 24850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +37C0 +AC40 +A7C0 +A400 +2FE0 +3920 +2AA0 +2FA0 +2040 +ENDCHAR +STARTCHAR U_6113 +ENCODING 24851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFE0 +A200 +27E0 +2AA0 +32A0 +2520 +2AC0 +ENDCHAR +STARTCHAR U_6114 +ENCODING 24852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +B280 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6115 +ENCODING 24853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B000 +AFC0 +A000 +3FE0 +2200 +27C0 +2040 +2380 +ENDCHAR +STARTCHAR U_6116 +ENCODING 24854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +B440 +AFC0 +A440 +A7C0 +2440 +3FE0 +2A80 +2C40 +2FE0 +ENDCHAR +STARTCHAR U_6117 +ENCODING 24855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +0900 +13E0 +FD40 +3540 +5080 +9140 +3620 +4440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6118 +ENCODING 24856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A20 +B7C0 +AA40 +A180 +2E60 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6119 +ENCODING 24857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +1F00 +2A00 +0E00 +F1E0 +1F00 +4440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_611A +ENCODING 24858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +7FC0 +4540 +5F40 +44C0 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_611B +ENCODING 24859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +FFE0 +9220 +50C0 +4FA0 +1000 +1FC0 +2880 +4700 +38E0 +ENDCHAR +STARTCHAR U_611C +ENCODING 24860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2900 +AFE0 +BB40 +AB40 +2D20 +2980 +2A40 +2C20 +2FE0 +ENDCHAR +STARTCHAR U_611D +ENCODING 24861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +ABC0 +BA40 +ABC0 +A900 +2FE0 +2A40 +2980 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_611E +ENCODING 24862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4100 +4FE0 +EAA0 +DAA0 +4860 +4100 +5FE0 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_611F +ENCODING 24863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4100 +7F40 +5D40 +5280 +9DA0 +8260 +2440 +A2A0 +9F80 +ENDCHAR +STARTCHAR U_6120 +ENCODING 24864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFC0 +A000 +2FE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6121 +ENCODING 24865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +52A0 +EAA0 +E6A0 +49A0 +5260 +4040 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6122 +ENCODING 24866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +4FE0 +E920 +C920 +4FE0 +4000 +4240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6123 +ENCODING 24867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +BAA0 +AFE0 +A100 +2FE0 +2200 +23C0 +2440 +2840 +3180 +ENDCHAR +STARTCHAR U_6124 +ENCODING 24868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +BFE0 +A440 +A7C0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_6125 +ENCODING 24869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B100 +AFC0 +A540 +2540 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6126 +ENCODING 24870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A000 +27C0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_6127 +ENCODING 24871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A920 +BFE0 +A920 +2FE0 +2340 +25A0 +25E0 +2920 +30E0 +ENDCHAR +STARTCHAR U_6128 +ENCODING 24872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2260 +F800 +03C0 +FE40 +8580 +7A60 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6129 +ENCODING 24873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +B440 +AFC0 +A440 +27C0 +2440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_612A +ENCODING 24874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +B7E0 +A800 +A7E0 +2420 +27E0 +2420 +27E0 +2240 +2420 +ENDCHAR +STARTCHAR U_612B +ENCODING 24875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B100 +AFE0 +A240 +2780 +2240 +2FE0 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_612C +ENCODING 24876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +55E0 +5520 +7DE0 +2220 +4460 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_612D +ENCODING 24877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B140 +AFE0 +A280 +2720 +3BE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_612E +ENCODING 24878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +B520 +A940 +A400 +27C0 +2900 +3FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_612F +ENCODING 24879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +B480 +AFE0 +A480 +27E0 +2480 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6130 +ENCODING 24880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2940 +2580 +2FE0 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_6131 +ENCODING 24881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +B500 +ADE0 +B680 +2C80 +2FE0 +3480 +2540 +2A40 +3420 +ENDCHAR +STARTCHAR U_6132 +ENCODING 24882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B740 +AFE0 +A820 +27C0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6133 +ENCODING 24883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6134 +ENCODING 24884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A920 +BFC0 +2840 +2FC0 +2840 +2FE0 +2820 +37E0 +ENDCHAR +STARTCHAR U_6135 +ENCODING 24885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +2220 +AEE0 +B880 +AEE0 +2220 +2AA0 +2660 +3BA0 +2660 +ENDCHAR +STARTCHAR U_6136 +ENCODING 24886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4240 +E480 +DFE0 +CAA0 +5540 +4FC0 +4840 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6137 +ENCODING 24887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +B000 +AFE0 +A000 +27C0 +2440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6138 +ENCODING 24888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +55E0 +BAA0 +10A0 +38A0 +D560 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6139 +ENCODING 24889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3820 +AA80 +A540 +A280 +2C60 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_613A +ENCODING 24890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B7C0 +A440 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_613B +ENCODING 24891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +1140 +2380 +F940 +27E0 +2540 +6920 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_613C +ENCODING 24892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4700 +5400 +F3E0 +D440 +57C0 +5440 +57C0 +5440 +5FE0 +4440 +ENDCHAR +STARTCHAR U_613D +ENCODING 24893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2200 +BFC0 +AA40 +AFC0 +2A40 +2080 +3FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_613E +ENCODING 24894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A800 +B7C0 +A040 +2AC0 +2740 +3FC0 +2740 +2AA0 +3220 +ENDCHAR +STARTCHAR U_613F +ENCODING 24895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +5FC0 +5240 +5FC0 +4A80 +5640 +4400 +4A40 +A8A0 +AF80 +ENDCHAR +STARTCHAR U_6140 +ENCODING 24896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A20 +2540 +B280 +AF00 +A240 +2FC0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6141 +ENCODING 24897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5140 +6E40 +5540 +6CC0 +7FC0 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6142 +ENCODING 24898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2480 +8FC0 +5A40 +2FC0 +CA40 +4AC0 +0400 +5240 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6143 +ENCODING 24899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2540 +2AA0 +B7C0 +A000 +2EE0 +2220 +2AA0 +2660 +3AA0 +2760 +ENDCHAR +STARTCHAR U_6144 +ENCODING 24900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +2100 +2FE0 +2380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_6145 +ENCODING 24901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +B280 +AB00 +ACE0 +2100 +2FE0 +2920 +2FE0 +2140 +2FE0 +ENDCHAR +STARTCHAR U_6146 +ENCODING 24902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +AA20 +B540 +A200 +ACE0 +2820 +2EE0 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6147 +ENCODING 24903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4240 +7860 +4BC0 +7A40 +4980 +9E60 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6148 +ENCODING 24904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +7B80 +1080 +2940 +7FE0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6149 +ENCODING 24905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2500 +B240 +AFE0 +A000 +27C0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_614A +ENCODING 24906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FE0 +4500 +EFC0 +C540 +5FE0 +4540 +5FC0 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_614B +ENCODING 24907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4BC0 +FE20 +4BE0 +7A00 +4BC0 +7A20 +4BE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_614C +ENCODING 24908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +B100 +AFE0 +A400 +27E0 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_614D +ENCODING 24909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2540 +B6C0 +AFC0 +A000 +2FE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_614E +ENCODING 24910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +AC40 +A7C0 +2440 +27C0 +2440 +2FE0 +2440 +ENDCHAR +STARTCHAR U_614F +ENCODING 24911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +B440 +AFC0 +A440 +27C0 +2100 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_6150 +ENCODING 24912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2A80 +2580 +3F80 +1100 +2480 +1220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6151 +ENCODING 24913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +A3C0 +B240 +AFE0 +A040 +2FE0 +2920 +26A0 +2640 +29A0 +ENDCHAR +STARTCHAR U_6152 +ENCODING 24914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2AA0 +AFE0 +BAA0 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6153 +ENCODING 24915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +A000 +27C0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6154 +ENCODING 24916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFC0 +A640 +2540 +27C0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6155 +ENCODING 24917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2280 +FFE0 +2480 +C460 +2680 +4D40 +ENDCHAR +STARTCHAR U_6156 +ENCODING 24918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +AFE0 +B8A0 +AEA0 +AAA0 +2EE0 +28A0 +2EA0 +2960 +2FE0 +ENDCHAR +STARTCHAR U_6157 +ENCODING 24919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +5640 +7D40 +3880 +5540 +9220 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6158 +ENCODING 24920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +B7E0 +AAA0 +AFE0 +2280 +2540 +2AA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_6159 +ENCODING 24921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEC0 +5500 +7DE0 +5540 +FF40 +1240 +0400 +A240 +A0A0 +1F80 +ENDCHAR +STARTCHAR U_615A +ENCODING 24922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FC0 +B280 +AF80 +AAE0 +2FA0 +2AA0 +2FA0 +22A0 +3FA0 +22A0 +ENDCHAR +STARTCHAR U_615B +ENCODING 24923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +B500 +AFE0 +3900 +2FC0 +2900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_615C +ENCODING 24924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7E80 +C5E0 +5620 +FD40 +5480 +7D40 +0420 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_615D +ENCODING 24925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7FC0 +4900 +7FE0 +5880 +6880 +7FE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_615E +ENCODING 24926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B280 +AFE0 +A440 +27C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_615F +ENCODING 24927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2280 +AF80 +BAE0 +AFA0 +2AA0 +2FA0 +22A0 +2FA0 +22A0 +2F40 +ENDCHAR +STARTCHAR U_6160 +ENCODING 24928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +C480 +EEE0 +C4A0 +5EA0 +49A0 +4E40 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6161 +ENCODING 24929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +ABA0 +B540 +ABA0 +2540 +2BA0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6162 +ENCODING 24930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFE0 +AAA0 +2FE0 +2000 +27C0 +2380 +2C60 +ENDCHAR +STARTCHAR U_6163 +ENCODING 24931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2FE0 +B540 +AFC0 +A440 +27C0 +2440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6164 +ENCODING 24932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2260 +FC00 +87C0 +7240 +5980 +9660 +0440 +52A0 +9F80 +ENDCHAR +STARTCHAR U_6165 +ENCODING 24933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +ABE0 +B480 +A3E0 +3800 +2BE0 +2A20 +2BE0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_6166 +ENCODING 24934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FFE0 +5540 +3940 +5480 +9340 +3220 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6167 +ENCODING 24935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +2080 +3FC0 +0040 +3FC0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6168 +ENCODING 24936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +AA80 +BE80 +ABE0 +AE80 +2C80 +2A80 +2DA0 +2AA0 +2460 +ENDCHAR +STARTCHAR U_6169 +ENCODING 24937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57C0 +7100 +C7C0 +F540 +57C0 +5540 +5FE0 +5100 +5100 +6FE0 +ENDCHAR +STARTCHAR U_616A +ENCODING 24938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +BA40 +ABC0 +2800 +2EE0 +2AA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_616B +ENCODING 24939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4480 +AB40 +5120 +C9C0 +4D00 +53E0 +0400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_616C +ENCODING 24940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B100 +AFC0 +A540 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_616D +ENCODING 24941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +FE80 +3880 +5540 +9220 +0000 +5540 +5120 +8F00 +ENDCHAR +STARTCHAR U_616E +ENCODING 24942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +7FE0 +5240 +5FC0 +5240 +9FC0 +AAA0 +4FA0 +ENDCHAR +STARTCHAR U_616F +ENCODING 24943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +AC40 +B7C0 +A440 +2FE0 +2400 +2FE0 +32A0 +2520 +2A60 +ENDCHAR +STARTCHAR U_6170 +ENCODING 24944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4040 +7D40 +50C0 +D440 +B2C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6171 +ENCODING 24945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A540 +B7C0 +A540 +2FE0 +2080 +3FE0 +2480 +2280 +2100 +ENDCHAR +STARTCHAR U_6172 +ENCODING 24946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +B3C0 +A900 +AFE0 +2920 +2DA0 +2B60 +2DA0 +2960 +ENDCHAR +STARTCHAR U_6173 +ENCODING 24947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFA0 +B940 +AF40 +2AA0 +2F20 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6174 +ENCODING 24948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +AAA0 +B660 +AAA0 +2200 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6175 +ENCODING 24949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +D140 +FFE0 +D140 +57C0 +5540 +57C0 +5540 +57C0 +6540 +ENDCHAR +STARTCHAR U_6176 +ENCODING 24950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FC0 +4940 +7FE0 +4AA0 +6FC0 +5880 +A700 +98E0 +ENDCHAR +STARTCHAR U_6177 +ENCODING 24951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E940 +DFE0 +C940 +4FC0 +4900 +4D40 +4B80 +5540 +6B20 +ENDCHAR +STARTCHAR U_6178 +ENCODING 24952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +2A80 +4E60 +FFE0 +8420 +7FC0 +4440 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6179 +ENCODING 24953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +F940 +5340 +F940 +22C0 +2420 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_617A +ENCODING 24954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A540 +27C0 +2540 +2FE0 +2240 +2380 +2C60 +ENDCHAR +STARTCHAR U_617B +ENCODING 24955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5FC0 +4200 +DFE0 +E500 +C880 +5FC0 +68A0 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_617C +ENCODING 24956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4900 +4920 +7F40 +48A0 +AB60 +DA20 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_617D +ENCODING 24957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +5FE0 +F480 +D6A0 +D4A0 +5FA0 +54C0 +5EA0 +6560 +4E20 +ENDCHAR +STARTCHAR U_617E +ENCODING 24958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +55E0 +AA20 +4480 +F880 +4940 +7A20 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_617F +ENCODING 24959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2900 +0FC0 +1900 +2FE0 +C4A0 +5FE0 +44A0 +0800 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6180 +ENCODING 24960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +B360 +ACA0 +A100 +2280 +2D60 +2280 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_6181 +ENCODING 24961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +4920 +EBE0 +DEA0 +4920 +4FE0 +4240 +4920 +5840 +67C0 +ENDCHAR +STARTCHAR U_6182 +ENCODING 24962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +3F80 +2480 +FFE0 +9520 +5F40 +1000 +2F80 +0600 +79E0 +ENDCHAR +STARTCHAR U_6183 +ENCODING 24963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +2080 +7BC0 +A0A0 +3F80 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6184 +ENCODING 24964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +A100 +67C0 +A440 +27C0 +2440 +2FE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6185 +ENCODING 24965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +1120 +FE60 +52C0 +8FA0 +ENDCHAR +STARTCHAR U_6186 +ENCODING 24966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2FE0 +A820 +B7C0 +AC40 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6187 +ENCODING 24967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +1240 +FFE0 +1240 +7BC0 +4A40 +7BC0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6188 +ENCODING 24968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +6FE0 +D920 +C9C0 +4F20 +49E0 +4A80 +4AA0 +56C0 +6FE0 +ENDCHAR +STARTCHAR U_6189 +ENCODING 24969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +3F40 +A480 +AF00 +B020 +2F40 +2980 +2F00 +2A20 +2740 +3880 +ENDCHAR +STARTCHAR U_618A +ENCODING 24970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +FFE0 +4D40 +57C0 +6540 +45C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_618B +ENCODING 24971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +39E0 +7F40 +5540 +7480 +5D40 +5620 +1040 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_618C +ENCODING 24972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +45E0 +FE20 +1120 +FCA0 +9120 +5E20 +E0C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_618D +ENCODING 24973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +AFE0 +B440 +ABA0 +3280 +2FE0 +2820 +2BA0 +2AA0 +2BA0 +ENDCHAR +STARTCHAR U_618E +ENCODING 24974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +B920 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_618F +ENCODING 24975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4EE0 +5320 +ECC0 +C740 +D820 +4FC0 +4100 +4540 +4920 +4300 +ENDCHAR +STARTCHAR U_6190 +ENCODING 24976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4680 +DFE0 +EA80 +D260 +4840 +4FE0 +5540 +4DE0 +4840 +5040 +ENDCHAR +STARTCHAR U_6191 +ENCODING 24977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +9FC0 +2900 +CFE0 +4020 +6AA0 +0460 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6192 +ENCODING 24978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A440 +27C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6193 +ENCODING 24979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +B7C0 +A540 +A7C0 +2120 +2FE0 +2540 +2C60 +33C0 +ENDCHAR +STARTCHAR U_6194 +ENCODING 24980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27E0 +B900 +AFC0 +B900 +2FC0 +2900 +2FE0 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6195 +ENCODING 24981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2F40 +2AA0 +B440 +AFC0 +B020 +2FC0 +2840 +2FC0 +2480 +3FE0 +ENDCHAR +STARTCHAR U_6196 +ENCODING 24982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +BA80 +3880 +5540 +9220 +0400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6197 +ENCODING 24983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +5640 +B940 +1480 +3940 +D620 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6198 +ENCODING 24984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +B440 +A7C0 +2280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6199 +ENCODING 24985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +3F80 +0A00 +FFE0 +2080 +3F80 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_619A +ENCODING 24986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B000 +AFC0 +A940 +2FC0 +2940 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_619B +ENCODING 24987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2440 +27C0 +2440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_619C +ENCODING 24988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +57E0 +D500 +FBE0 +D480 +57E0 +5A40 +53C0 +5240 +53C0 +5240 +ENDCHAR +STARTCHAR U_619D +ENCODING 24989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2540 +7D40 +0880 +7D40 +1220 +3000 +1220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_619E +ENCODING 24990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +40E0 +EEA0 +CB20 +4EA0 +4040 +5E40 +44A0 +5EA0 +4520 +ENDCHAR +STARTCHAR U_619F +ENCODING 24991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2920 +2540 +3FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_61A0 +ENCODING 24992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5500 +7FE0 +6AA0 +7E80 +4940 +5220 +8400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61A1 +ENCODING 24993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +B540 +AFE0 +A100 +2FE0 +2920 +2960 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_61A2 +ENCODING 24994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +AFE0 +A440 +2EE0 +2440 +3FE0 +2480 +24A0 +38E0 +ENDCHAR +STARTCHAR U_61A3 +ENCODING 24995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +B380 +AFE0 +A380 +2540 +2FE0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_61A4 +ENCODING 24996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B540 +AFE0 +A440 +27C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_61A5 +ENCODING 24997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD40 +7380 +3280 +4C40 +FFE0 +8840 +7F80 +1080 +2540 +52A0 +9F80 +ENDCHAR +STARTCHAR U_61A6 +ENCODING 24998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +55A0 +CEC0 +E480 +CB40 +5FE0 +5220 +4FC0 +4240 +4440 +58C0 +ENDCHAR +STARTCHAR U_61A7 +ENCODING 24999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B280 +A900 +AFE0 +2540 +27C0 +2540 +27C0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_61A8 +ENCODING 25000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +11E0 +FE40 +4A40 +7980 +4980 +FE60 +0800 +1240 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61A9 +ENCODING 25001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E3E0 +2220 +FFE0 +2220 +7BE0 +4A20 +7BE0 +1440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61AA +ENCODING 25002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AFE0 +2AA0 +2BA0 +2AA0 +2BA0 +2AA0 +2DE0 +ENDCHAR +STARTCHAR U_61AB +ENCODING 25003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +2920 +2FE0 +2AA0 +2920 +2AA0 +2C60 +ENDCHAR +STARTCHAR U_61AC +ENCODING 25004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B440 +A7C0 +2100 +2FE0 +2440 +27C0 +2940 +3320 +ENDCHAR +STARTCHAR U_61AD +ENCODING 25005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +27C0 +2440 +27C0 +2100 +2940 +3320 +ENDCHAR +STARTCHAR U_61AE +ENCODING 25006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +2FE0 +B540 +A540 +AFE0 +2540 +2FE0 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_61AF +ENCODING 25007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +B6C0 +AB60 +3240 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_61B0 +ENCODING 25008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +AFE0 +B2A0 +A480 +2FE0 +2AA0 +2FE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_61B1 +ENCODING 25009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2460 +2F40 +B0E0 +AF40 +2940 +2F40 +24C0 +2EC0 +3540 +2E60 +ENDCHAR +STARTCHAR U_61B2 +ENCODING 25010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +0400 +FFE0 +2A80 +3F80 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61B3 +ENCODING 25011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +27C0 +B040 +AFE0 +24A0 +2EE0 +2040 +2FE0 +2440 +22C0 +ENDCHAR +STARTCHAR U_61B4 +ENCODING 25012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AEE0 +B280 +AEE0 +AAA0 +2EE0 +2AA0 +2EE0 +2280 +23E0 +ENDCHAR +STARTCHAR U_61B5 +ENCODING 25013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +7BE0 +A880 +BBE0 +1480 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61B6 +ENCODING 25014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B280 +AFE0 +A440 +27C0 +2440 +27C0 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_61B7 +ENCODING 25015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +B6C0 +AB60 +A240 +2FE0 +2120 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_61B8 +ENCODING 25016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +AFE0 +B000 +2EE0 +2AA0 +2EE0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_61B9 +ENCODING 25017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +5FC0 +5540 +FFC0 +D540 +5FE0 +5000 +5FE0 +5540 +5480 +6660 +ENDCHAR +STARTCHAR U_61BA +ENCODING 25018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +AFE0 +BAA0 +AFE0 +2800 +2BE0 +2800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_61BB +ENCODING 25019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +F740 +D040 +5FC0 +4C80 +4A80 +4F80 +4000 +7FE0 +ENDCHAR +STARTCHAR U_61BC +ENCODING 25020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7FE0 +2940 +7F40 +D480 +7540 +0E20 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61BD +ENCODING 25021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +6480 +DFC0 +D540 +6B40 +44C0 +4200 +5940 +68A0 +4780 +ENDCHAR +STARTCHAR U_61BE +ENCODING 25022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +A900 +BF20 +A940 +2EA0 +3AA0 +2F60 +2500 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_61BF +ENCODING 25023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +ABE0 +BEA0 +AAA0 +3FA0 +28A0 +2EA0 +2A40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_61C0 +ENCODING 25024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4480 +6B40 +D020 +CFC0 +4A40 +4FC0 +4480 +4780 +4480 +4780 +ENDCHAR +STARTCHAR U_61C1 +ENCODING 25025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B000 +AFE0 +2440 +27E0 +2320 +26C0 +2A40 +2320 +ENDCHAR +STARTCHAR U_61C2 +ENCODING 25026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +A7C0 +B100 +AFE0 +2540 +27C0 +2540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_61C3 +ENCODING 25027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +29E0 +FCA0 +94A0 +FD20 +12C0 +FC00 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61C4 +ENCODING 25028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +4A80 +DFE0 +F5A0 +DFA0 +44A0 +5EA0 +4520 +47A0 +5840 +ENDCHAR +STARTCHAR U_61C5 +ENCODING 25029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFC0 +A920 +2FE0 +2A40 +2D80 +32C0 +25A0 +ENDCHAR +STARTCHAR U_61C6 +ENCODING 25030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B000 +AEE0 +2AA0 +2EE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_61C7 +ENCODING 25031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +EA40 +53C0 +3240 +DBC0 +2AA0 +5340 +0420 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_61C8 +ENCODING 25032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2EA0 +B4A0 +AF60 +AB40 +3FE0 +2A40 +3FE0 +2A40 +2A40 +2E40 +ENDCHAR +STARTCHAR U_61C9 +ENCODING 25033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +57E0 +7C80 +57C0 +5480 +57E0 +4A40 +A8A0 +4FA0 +ENDCHAR +STARTCHAR U_61CA +ENCODING 25034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +5FC0 +5AC0 +F740 +DFC0 +5740 +5AC0 +7FE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_61CB +ENCODING 25035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +F5E0 +3F80 +2480 +6DC0 +B6A0 +2C80 +1400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61CC +ENCODING 25036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +AFE0 +2280 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_61CD +ENCODING 25037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +AAA0 +BBA0 +A820 +2FE0 +2100 +3FE0 +2380 +2540 +3920 +ENDCHAR +STARTCHAR U_61CE +ENCODING 25038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FC0 +6A80 +D740 +FFE0 +5040 +5740 +5540 +5740 +5040 +5FC0 +ENDCHAR +STARTCHAR U_61CF +ENCODING 25039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +5880 +EFC0 +D880 +4FE0 +4000 +4EE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_61D0 +ENCODING 25040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +EFE0 +D100 +5FE0 +4200 +4540 +4C80 +7660 +4440 +ENDCHAR +STARTCHAR U_61D1 +ENCODING 25041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +BFE0 +4480 +3FE0 +C480 +5FE0 +5520 +1AA0 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D2 +ENCODING 25042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +28E0 +3D40 +ABE0 +BE20 +AAA0 +3EA0 +2AA0 +3CA0 +2B40 +2A20 +ENDCHAR +STARTCHAR U_61D3 +ENCODING 25043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +6580 +DFE0 +C920 +4A60 +53C0 +4400 +4FC0 +5380 +4C60 +ENDCHAR +STARTCHAR U_61D4 +ENCODING 25044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +ABA0 +B820 +AFE0 +2000 +27C0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_61D5 +ENCODING 25045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52C0 +5EA0 +41E0 +5E80 +5280 +5F60 +5240 +4920 +6840 +A7C0 +ENDCHAR +STARTCHAR U_61D6 +ENCODING 25046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +F880 +27E0 +F880 +ABE0 +7220 +FBE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D7 +ENCODING 25047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +5FE0 +C880 +FFE0 +5540 +7760 +5540 +5540 +5540 +6EC0 +ENDCHAR +STARTCHAR U_61D8 +ENCODING 25048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +BFE0 +5540 +2520 +DFE0 +5220 +4FC0 +0A40 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D9 +ENCODING 25049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F60 +4A20 +EFE0 +DAA0 +4EE0 +4AA0 +5FE0 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_61DA +ENCODING 25050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4A80 +4FC0 +E200 +DFE0 +C040 +4FC0 +4040 +4FC0 +5560 +57C0 +ENDCHAR +STARTCHAR U_61DB +ENCODING 25051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +4200 +CFC0 +E480 +5FE0 +5220 +4480 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_61DC +ENCODING 25052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +6480 +DFE0 +CAA0 +5FE0 +5420 +4780 +4C80 +4300 +4E00 +ENDCHAR +STARTCHAR U_61DD +ENCODING 25053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +5BE0 +5140 +EC80 +D3E0 +5C80 +6AE0 +7E80 +4A80 +5780 +64E0 +ENDCHAR +STARTCHAR U_61DE +ENCODING 25054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A280 +BFE0 +A820 +A7C0 +2940 +2280 +2DC0 +22A0 +2D20 +ENDCHAR +STARTCHAR U_61DF +ENCODING 25055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +6C40 +FFE0 +2840 +FF40 +10C0 +7C40 +10C0 +FF00 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61E0 +ENCODING 25056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A160 +BEC0 +AAA0 +36C0 +2440 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_61E1 +ENCODING 25057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5240 +FFE0 +D6C0 +DB60 +5240 +5280 +5500 +6A40 +47E0 +ENDCHAR +STARTCHAR U_61E2 +ENCODING 25058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E00 +5480 +5EE0 +F280 +DEC0 +D520 +5E00 +4000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_61E3 +ENCODING 25059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5FE0 +3B20 +D6A0 +5B60 +4000 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61E4 +ENCODING 25060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B100 +AFE0 +A120 +2FC0 +2040 +3FE0 +2A40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_61E5 +ENCODING 25061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A540 +A7C0 +2540 +2FE0 +2120 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_61E6 +ENCODING 25062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +BFE0 +ABA0 +A540 +AFE0 +2100 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_61E7 +ENCODING 25063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A920 +B660 +ABC0 +A000 +2FE0 +2AA0 +3FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_61E8 +ENCODING 25064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +AF60 +B940 +AFE0 +A940 +2F40 +2940 +2F40 +39A0 +2B20 +ENDCHAR +STARTCHAR U_61E9 +ENCODING 25065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A100 +BFE0 +A200 +3FE0 +2D40 +37E0 +2540 +2480 +2660 +ENDCHAR +STARTCHAR U_61EA +ENCODING 25066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B440 +AFC0 +2280 +3FE0 +2D40 +33A0 +2540 +3B20 +ENDCHAR +STARTCHAR U_61EB +ENCODING 25067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DC0 +2900 +AFE0 +A940 +B7C0 +2440 +2740 +25C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_61EC +ENCODING 25068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +4A80 +4F80 +4A80 +4F80 +5040 +AAA0 +AFA0 +ENDCHAR +STARTCHAR U_61ED +ENCODING 25069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +A940 +BFE0 +A940 +2FE0 +2AA0 +2BE0 +2AA0 +2BE0 +3620 +ENDCHAR +STARTCHAR U_61EE +ENCODING 25070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A7C0 +B440 +AFE0 +2AA0 +2640 +2BC0 +2640 +2980 +2E60 +ENDCHAR +STARTCHAR U_61EF +ENCODING 25071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FF00 +55E0 +7E20 +5540 +1080 +FD40 +4A20 +9C40 +52A0 +4F80 +ENDCHAR +STARTCHAR U_61F0 +ENCODING 25072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2AA0 +AEA0 +BAA0 +A520 +AFA0 +3220 +2FA0 +2AA0 +2720 +3FE0 +ENDCHAR +STARTCHAR U_61F1 +ENCODING 25073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +A140 +2FE0 +2920 +2D40 +28C0 +3320 +ENDCHAR +STARTCHAR U_61F2 +ENCODING 25074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +5FE0 +A0A0 +5FA0 +C440 +5E40 +44A0 +5F20 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61F3 +ENCODING 25075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +EFC0 +C480 +4FC0 +4040 +4FC0 +4220 +5940 +67C0 +ENDCHAR +STARTCHAR U_61F4 +ENCODING 25076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +64A0 +DFE0 +CA80 +5BA0 +4AA0 +5BC0 +4AA0 +4F60 +5A20 +ENDCHAR +STARTCHAR U_61F5 +ENCODING 25077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A820 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_61F6 +ENCODING 25078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5F40 +C4E0 +FFA0 +D5E0 +55A0 +5FE0 +44A0 +4EE0 +5540 +64A0 +ENDCHAR +STARTCHAR U_61F7 +ENCODING 25079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BFE0 +A940 +A580 +2B60 +2520 +2CC0 +2640 +2420 +ENDCHAR +STARTCHAR U_61F8 +ENCODING 25080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +6B80 +5920 +4BE0 +FC80 +AAA0 +A5A0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_61F9 +ENCODING 25081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B5A0 +AFE0 +A240 +2FE0 +2240 +3FE0 +24A0 +3D40 +2620 +ENDCHAR +STARTCHAR U_61FA +ENCODING 25082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +35A0 +BFE0 +AA80 +BBA0 +2AA0 +3BC0 +2A40 +3B60 +2AA0 +3F20 +ENDCHAR +STARTCHAR U_61FB +ENCODING 25083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +22A0 +AFE0 +B540 +A7C0 +2240 +2FE0 +2240 +2FE0 +2420 +ENDCHAR +STARTCHAR U_61FC +ENCODING 25084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +BEE0 +AAA0 +AFE0 +A480 +2FE0 +3480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_61FD +ENCODING 25085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AEE0 +BAA0 +AEE0 +A480 +2FE0 +3480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_61FE +ENCODING 25086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +A3C0 +B240 +AFE0 +2040 +3FE0 +2AA0 +2EE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_61FF +ENCODING 25087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +13E0 +FD20 +8680 +7A80 +0540 +7A20 +4800 +7AA0 +5660 +F9C0 +ENDCHAR +STARTCHAR U_6200 +ENCODING 25088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E80 +E1E0 +4E40 +A0A0 +EFE0 +5B40 +AEA0 +0440 +52A0 +4F80 +ENDCHAR +STARTCHAR U_6201 +ENCODING 25089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +FFE0 +2940 +57E0 +7D40 +11E0 +7D40 +29E0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6202 +ENCODING 25090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4A40 +EFE0 +DAE0 +4F40 +4A80 +4EE0 +5280 +5EE0 +6280 +ENDCHAR +STARTCHAR U_6203 +ENCODING 25091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A820 +B7C0 +A440 +2FE0 +2AA0 +2FE0 +2100 +3FE0 +2AA0 +ENDCHAR +STARTCHAR U_6204 +ENCODING 25092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AAA0 +BAA0 +AFE0 +A900 +3FE0 +2900 +2FE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6205 +ENCODING 25093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +57E0 +FA40 +53C0 +7240 +23C0 +FA40 +2420 +52A0 +9F80 +ENDCHAR +STARTCHAR U_6206 +ENCODING 25094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +51C0 +FE20 +8BE0 +F880 +23E0 +FEA0 +2140 +5620 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6207 +ENCODING 25095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5140 +FFE0 +8880 +FFE0 +AA40 +FBC0 +2240 +5420 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6208 +ENCODING 25096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +0800 +FFE0 +0880 +0880 +0900 +0600 +0A20 +31A0 +C060 +ENDCHAR +STARTCHAR U_6209 +ENCODING 25097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0A00 +0900 +FFC0 +8800 +8880 +8880 +8900 +8600 +A640 +C940 +90C0 +ENDCHAR +STARTCHAR U_620A +ENCODING 25098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +3FE0 +2200 +2240 +2240 +2180 +2120 +42A0 +4460 +9820 +ENDCHAR +STARTCHAR U_620B +ENCODING 25099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +07E0 +7C00 +0440 +0280 +0320 +0CA0 +7060 +ENDCHAR +STARTCHAR U_620C +ENCODING 25100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +3FE0 +2200 +2240 +3E40 +2280 +2100 +2320 +44A0 +9860 +ENDCHAR +STARTCHAR U_620D +ENCODING 25101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +4240 +6240 +5280 +5100 +4320 +84A0 +9860 +ENDCHAR +STARTCHAR U_620E +ENCODING 25102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +2200 +2240 +2240 +FA80 +2100 +2320 +44A0 +9860 +ENDCHAR +STARTCHAR U_620F +ENCODING 25103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +0A00 +4FE0 +2A00 +1240 +1280 +2900 +4120 +86A0 +0060 +ENDCHAR +STARTCHAR U_6210 +ENCODING 25104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +4200 +7A40 +4A40 +4A80 +4920 +52A0 +8460 +ENDCHAR +STARTCHAR U_6211 +ENCODING 25105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +7240 +1200 +FFE0 +1200 +1A40 +3280 +D100 +1320 +54A0 +2060 +ENDCHAR +STARTCHAR U_6212 +ENCODING 25106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0220 +FFE0 +0200 +2A40 +2A40 +FE80 +2980 +4920 +4AA0 +8460 +ENDCHAR +STARTCHAR U_6213 +ENCODING 25107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +F440 +9480 +9500 +F200 +0520 +18A0 +6060 +ENDCHAR +STARTCHAR U_6214 +ENCODING 25108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +F880 +0500 +0620 +79E0 +1100 +FFE0 +0900 +0E20 +71E0 +ENDCHAR +STARTCHAR U_6215 +ENCODING 25109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4920 +49E0 +7F00 +0920 +0920 +F940 +4880 +49A0 +4A60 +8C20 +ENDCHAR +STARTCHAR U_6216 +ENCODING 25110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +0200 +7A40 +4A40 +7940 +0180 +1CA0 +E160 +0620 +ENDCHAR +STARTCHAR U_6217 +ENCODING 25111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +2920 +45E0 +8700 +7920 +4920 +4940 +5880 +44A0 +4560 +3E20 +ENDCHAR +STARTCHAR U_6218 +ENCODING 25112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +3D00 +2160 +2780 +F920 +8940 +8980 +8920 +FEA0 +8860 +ENDCHAR +STARTCHAR U_6219 +ENCODING 25113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +82A0 +BA80 +83E0 +BA80 +AAA0 +AAA0 +BAC0 +82A0 +82E0 +8720 +ENDCHAR +STARTCHAR U_621A +ENCODING 25114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4900 +4D20 +4920 +7F40 +4880 +5CA0 +AB60 +5A20 +ENDCHAR +STARTCHAR U_621B +ENCODING 25115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +3E80 +2F80 +2080 +3F80 +0900 +FFE0 +0480 +0720 +F8E0 +ENDCHAR +STARTCHAR U_621C +ENCODING 25116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +7920 +4920 +FD40 +1080 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_621D +ENCODING 25117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7940 +4900 +79E0 +4F00 +7920 +4940 +7880 +01A0 +5660 +8820 +ENDCHAR +STARTCHAR U_621E +ENCODING 25118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +3F80 +2480 +2280 +FFE0 +8920 +0FC0 +F900 +0E40 +71C0 +ENDCHAR +STARTCHAR U_621F +ENCODING 25119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +1100 +7FE0 +4900 +7940 +4940 +7880 +10A0 +FD60 +1220 +ENDCHAR +STARTCHAR U_6220 +ENCODING 25120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FD20 +4900 +3100 +FFE0 +0100 +7920 +48C0 +78A0 +4960 +7A20 +ENDCHAR +STARTCHAR U_6221 +ENCODING 25121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +FD20 +4900 +7FE0 +4920 +7920 +4940 +FE80 +A8A0 +C560 +FE20 +ENDCHAR +STARTCHAR U_6222 +ENCODING 25122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +4900 +FFE0 +4500 +7D20 +4520 +7D40 +44A0 +FD60 +0620 +ENDCHAR +STARTCHAR U_6223 +ENCODING 25123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +3520 +EBE0 +4500 +8320 +7D20 +1140 +FC80 +28A0 +4560 +8220 +ENDCHAR +STARTCHAR U_6224 +ENCODING 25124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +4920 +5D00 +47E0 +7D00 +9120 +2940 +FE80 +AAA0 +AB60 +FE20 +ENDCHAR +STARTCHAR U_6225 +ENCODING 25125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +4520 +7D00 +47E0 +7D20 +5140 +7D40 +9080 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_6226 +ENCODING 25126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +5980 +7D40 +55E0 +7F00 +5520 +7D40 +1080 +FDA0 +1260 +1420 +ENDCHAR +STARTCHAR U_6227 +ENCODING 25127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3940 +5520 +FF00 +47E0 +7D00 +4540 +7D40 +4080 +7CA0 +A560 +BE20 +ENDCHAR +STARTCHAR U_6228 +ENCODING 25128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +0520 +7500 +55E0 +FF00 +0520 +7540 +5480 +75A0 +1660 +0820 +ENDCHAR +STARTCHAR U_6229 +ENCODING 25129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +4920 +B500 +FFE0 +0100 +F940 +8940 +F880 +88A0 +F960 +8A20 +ENDCHAR +STARTCHAR U_622A +ENCODING 25130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +2900 +7D20 +C920 +7D40 +4880 +7DA0 +4260 +ENDCHAR +STARTCHAR U_622B +ENCODING 25131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +47E0 +7080 +D7A0 +75A0 +57A0 +70C0 +56A0 +5160 +5220 +ENDCHAR +STARTCHAR U_622C +ENCODING 25132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +A920 +6FE0 +2900 +FD40 +0140 +7D40 +4480 +7CA0 +4560 +7E20 +ENDCHAR +STARTCHAR U_622D +ENCODING 25133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FF20 +8300 +7DE0 +1300 +7D20 +5540 +7C80 +54A0 +7D60 +C620 +ENDCHAR +STARTCHAR U_622E +ENCODING 25134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +B520 +6D00 +B7E0 +3100 +4920 +A540 +5080 +29A0 +1260 +EC20 +ENDCHAR +STARTCHAR U_622F +ENCODING 25135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D40 +1120 +7D00 +57E0 +7D00 +5120 +4EC0 +5480 +76A0 +9560 +BE20 +ENDCHAR +STARTCHAR U_6230 +ENCODING 25136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEC0 +AAA0 +FE80 +54E0 +7F80 +54A0 +7CA0 +10C0 +FEA0 +1160 +1220 +ENDCHAR +STARTCHAR U_6231 +ENCODING 25137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2140 +FD20 +A7E0 +F900 +A520 +9CC0 +AA80 +EEA0 +A960 +FE20 +ENDCHAR +STARTCHAR U_6232 +ENCODING 25138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CC0 +10A0 +FE80 +93E0 +BC80 +92A0 +BEA0 +A4C0 +BCA0 +A960 +FE20 +ENDCHAR +STARTCHAR U_6233 +ENCODING 25139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +9AA0 +5680 +AAE0 +7F80 +48A0 +FEA0 +48C0 +7EA0 +4960 +7E20 +ENDCHAR +STARTCHAR U_6234 +ENCODING 25140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +5500 +7D40 +5540 +7D40 +2880 +FEA0 +4960 +8620 +ENDCHAR +STARTCHAR U_6235 +ENCODING 25141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AAC0 +EEA0 +ABE0 +EE80 +28A0 +7EA0 +C8C0 +7EA0 +4960 +7E20 +ENDCHAR +STARTCHAR U_6236 +ENCODING 25142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +01C0 +3E00 +2000 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_6237 +ENCODING 25143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +0200 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_6238 +ENCODING 25144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0000 +3FC0 +2040 +3FC0 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_6239 +ENCODING 25145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2FC0 +2080 +2300 +4420 +4820 +87E0 +ENDCHAR +STARTCHAR U_623A +ENCODING 25146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +09E0 +7D20 +4520 +4520 +7DE0 +4100 +4100 +4120 +8120 +80E0 +ENDCHAR +STARTCHAR U_623B +ENCODING 25147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FC0 +2040 +3FC0 +2200 +3FE0 +2200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_623C +ENCODING 25148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +0A00 +7BC0 +4A40 +7BC0 +0A00 +0A00 +1200 +2200 +4200 +ENDCHAR +STARTCHAR U_623D +ENCODING 25149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2480 +2280 +2880 +24E0 +3F80 +4080 +8080 +ENDCHAR +STARTCHAR U_623E +ENCODING 25150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4500 +4480 +7FC0 +4600 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_623F +ENCODING 25151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2200 +3FE0 +2400 +27C0 +4440 +4840 +9180 +ENDCHAR +STARTCHAR U_6240 +ENCODING 25152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +6380 +4200 +7A00 +4BE0 +4A40 +7A40 +4240 +4240 +4440 +8840 +ENDCHAR +STARTCHAR U_6241 +ENCODING 25153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2FE0 +2AA0 +2FE0 +4AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_6242 +ENCODING 25154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2200 +23E0 +2200 +2FE0 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_6243 +ENCODING 25155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4000 +5FE0 +5020 +57A0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_6244 +ENCODING 25156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4400 +5FE0 +5020 +57A0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_6245 +ENCODING 25157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2400 +2780 +2D00 +23E0 +4E40 +4180 +9E00 +ENDCHAR +STARTCHAR U_6246 +ENCODING 25158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2200 +3FE0 +2220 +2540 +3C80 +4640 +8420 +ENDCHAR +STARTCHAR U_6247 +ENCODING 25159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4000 +7DE0 +4420 +54A0 +4C60 +54A0 +A960 +ENDCHAR +STARTCHAR U_6248 +ENCODING 25160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4880 +5FC0 +5240 +5FC0 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_6249 +ENCODING 25161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4500 +7DE0 +4500 +7DE0 +4500 +BDE0 +8500 +ENDCHAR +STARTCHAR U_624A +ENCODING 25162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +5280 +5700 +48E0 +7200 +4A80 +8500 +B8E0 +ENDCHAR +STARTCHAR U_624B +ENCODING 25163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_624C +ENCODING 25164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 1 -1 +BITMAP +20 +20 +20 +F8 +20 +30 +E0 +20 +20 +20 +60 +ENDCHAR +STARTCHAR U_624D +ENCODING 25165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +7FE0 +0300 +0500 +0900 +1100 +2100 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_624E +ENCODING 25166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2200 +2A00 +3200 +6200 +A200 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_624F +ENCODING 25167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F200 +2F80 +2280 +3280 +6280 +A280 +24A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_6250 +ENCODING 25168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2120 +2920 +3120 +6120 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_6251 +ENCODING 25169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FD00 +2180 +2940 +3120 +6100 +A100 +2100 +A100 +4100 +ENDCHAR +STARTCHAR U_6252 +ENCODING 25170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2080 +FA80 +2280 +2A80 +3280 +6240 +A440 +2440 +2820 +F020 +ENDCHAR +STARTCHAR U_6253 +ENCODING 25171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2080 +2880 +3080 +6080 +A080 +2080 +2080 +E380 +ENDCHAR +STARTCHAR U_6254 +ENCODING 25172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FA40 +2280 +2AE0 +3220 +6220 +A220 +2420 +2420 +E8C0 +ENDCHAR +STARTCHAR U_6255 +ENCODING 25173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +F100 +2100 +2A00 +3280 +6240 +A440 +2FE0 +2420 +E000 +ENDCHAR +STARTCHAR U_6256 +ENCODING 25174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2400 +F200 +2200 +2A00 +3300 +6500 +A480 +2480 +2860 +F040 +ENDCHAR +STARTCHAR U_6257 +ENCODING 25175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F100 +2100 +27C0 +3100 +6100 +A100 +2100 +2FE0 +E000 +ENDCHAR +STARTCHAR U_6258 +ENCODING 25176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +29E0 +3700 +6100 +A100 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6259 +ENCODING 25177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2480 +3480 +6280 +A100 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_625A +ENCODING 25178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2820 +3220 +6120 +A120 +2020 +2020 +E0C0 +ENDCHAR +STARTCHAR U_625B +ENCODING 25179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2900 +3100 +6100 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_625C +ENCODING 25180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2080 +27E0 +3080 +6080 +A080 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_625D +ENCODING 25181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +F000 +2FE0 +2200 +3400 +67C0 +A040 +2040 +2280 +E100 +ENDCHAR +STARTCHAR U_625E +ENCODING 25182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2100 +3FE0 +6100 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_625F +ENCODING 25183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F80 +F480 +2480 +2480 +3F80 +6480 +A480 +24A0 +2460 +E420 +ENDCHAR +STARTCHAR U_6260 +ENCODING 25184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +24C0 +2C40 +3280 +6280 +A100 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6261 +ENCODING 25185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +FDC0 +2740 +2D40 +3540 +6540 +A5C0 +2520 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6262 +ENCODING 25186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2400 +2BC0 +3080 +6100 +A200 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6263 +ENCODING 25187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2A20 +3220 +6220 +A220 +2220 +23E0 +E000 +ENDCHAR +STARTCHAR U_6264 +ENCODING 25188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA80 +2280 +2A80 +3280 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6265 +ENCODING 25189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F1C0 +2700 +2100 +31E0 +6F00 +A100 +2100 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6266 +ENCODING 25190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2900 +37E0 +6100 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6267 +ENCODING 25191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FF80 +2280 +2A80 +3680 +6280 +A7A0 +24A0 +A8A0 +5060 +ENDCHAR +STARTCHAR U_6268 +ENCODING 25192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +27C0 +F240 +2240 +2640 +3A40 +6240 +A240 +2440 +2540 +E880 +ENDCHAR +STARTCHAR U_6269 +ENCODING 25193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2400 +2C00 +3400 +6400 +A400 +2400 +2400 +6800 +ENDCHAR +STARTCHAR U_626A +ENCODING 25194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +FC20 +2420 +2C20 +3420 +6420 +A420 +2420 +24A0 +E440 +ENDCHAR +STARTCHAR U_626B +ENCODING 25195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F820 +2020 +2820 +33E0 +6020 +A020 +2020 +27E0 +E000 +ENDCHAR +STARTCHAR U_626C +ENCODING 25196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F900 +2200 +2FE0 +32A0 +62A0 +A520 +2920 +2220 +E4C0 +ENDCHAR +STARTCHAR U_626D +ENCODING 25197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2240 +2A40 +37C0 +6240 +A240 +2240 +2240 +EFE0 +ENDCHAR +STARTCHAR U_626E +ENCODING 25198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2440 +2820 +37C0 +6240 +A240 +2240 +2440 +E980 +ENDCHAR +STARTCHAR U_626F +ENCODING 25199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +2280 +22E0 +3280 +6280 +A280 +2280 +2280 +EFE0 +ENDCHAR +STARTCHAR U_6270 +ENCODING 25200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +F920 +27E0 +2900 +3180 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6271 +ENCODING 25201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2280 +2AE0 +3220 +6220 +A540 +2480 +2940 +F620 +ENDCHAR +STARTCHAR U_6272 +ENCODING 25202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3080 +6FE0 +A040 +2080 +2100 +E200 +ENDCHAR +STARTCHAR U_6273 +ENCODING 25203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +27C0 +2440 +3640 +6540 +A480 +2980 +2A40 +F420 +ENDCHAR +STARTCHAR U_6274 +ENCODING 25204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2460 +2A40 +3240 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6275 +ENCODING 25205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F200 +2500 +2880 +3460 +6300 +A100 +2400 +2300 +E100 +ENDCHAR +STARTCHAR U_6276 +ENCODING 25206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2100 +3FE0 +6100 +A280 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6277 +ENCODING 25207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2FE0 +3100 +6100 +A280 +2480 +2840 +F020 +ENDCHAR +STARTCHAR U_6278 +ENCODING 25208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +23E0 +2A00 +3200 +63C0 +A240 +2440 +2440 +E840 +ENDCHAR +STARTCHAR U_6279 +ENCODING 25209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +24A0 +2FC0 +3480 +6480 +A480 +25A0 +26A0 +E460 +ENDCHAR +STARTCHAR U_627A +ENCODING 25210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +FC80 +2480 +2FE0 +3480 +6480 +A480 +24A0 +2660 +E420 +ENDCHAR +STARTCHAR U_627B +ENCODING 25211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2940 +3100 +6100 +A280 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_627C +ENCODING 25212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDE0 +2520 +2D20 +3520 +6560 +A500 +2900 +2920 +F0E0 +ENDCHAR +STARTCHAR U_627D +ENCODING 25213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2D40 +3540 +6540 +A7C0 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_627E +ENCODING 25214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +2A40 +3240 +6280 +A100 +2320 +24A0 +E860 +ENDCHAR +STARTCHAR U_627F +ENCODING 25215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0200 +0420 +FFC0 +2480 +3F80 +2440 +7FC0 +4420 +8420 +1C00 +ENDCHAR +STARTCHAR U_6280 +ENCODING 25216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2FC0 +3440 +6440 +A280 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6281 +ENCODING 25217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FC20 +27E0 +2A80 +3280 +6280 +A280 +24A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6282 +ENCODING 25218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2900 +37C0 +6100 +A100 +2100 +2FE0 +E000 +ENDCHAR +STARTCHAR U_6283 +ENCODING 25219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F800 +27E0 +2900 +3180 +6160 +A120 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6284 +ENCODING 25220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FB40 +2520 +2900 +3120 +6140 +A080 +2100 +2200 +EC00 +ENDCHAR +STARTCHAR U_6285 +ENCODING 25221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F3E0 +2420 +2A20 +3220 +64A0 +AFE0 +2020 +20A0 +E040 +ENDCHAR +STARTCHAR U_6286 +ENCODING 25222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2440 +3280 +E280 +2100 +2280 +2440 +6820 +ENDCHAR +STARTCHAR U_6287 +ENCODING 25223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +2220 +2BE0 +3220 +6220 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_6288 +ENCODING 25224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +23E0 +2A20 +3220 +63E0 +A220 +2220 +24A0 +E840 +ENDCHAR +STARTCHAR U_6289 +ENCODING 25225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2140 +2940 +3140 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_628A +ENCODING 25226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FD40 +2540 +2D40 +37C0 +6400 +A400 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_628B +ENCODING 25227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F900 +2200 +2A40 +3220 +6620 +AA00 +2A00 +2220 +E1E0 +ENDCHAR +STARTCHAR U_628C +ENCODING 25228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +2940 +3100 +6100 +A300 +2520 +2920 +F0E0 +ENDCHAR +STARTCHAR U_628D +ENCODING 25229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2640 +F240 +2A40 +2240 +37E0 +6240 +A240 +2440 +2440 +E840 +ENDCHAR +STARTCHAR U_628E +ENCODING 25230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F800 +2000 +2FE0 +3100 +6100 +A240 +2240 +2FA0 +E420 +ENDCHAR +STARTCHAR U_628F +ENCODING 25231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2000 +2FE0 +3280 +6280 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6290 +ENCODING 25232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2920 +2920 +3920 +6AA0 +AC60 +2820 +2820 +6860 +ENDCHAR +STARTCHAR U_6291 +ENCODING 25233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +FCA0 +24A0 +2CA0 +34A0 +65A0 +A6A0 +24E0 +2080 +E080 +ENDCHAR +STARTCHAR U_6292 +ENCODING 25234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA80 +2100 +2FE0 +3120 +6140 +A100 +2100 +2100 +E700 +ENDCHAR +STARTCHAR U_6293 +ENCODING 25235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +27C0 +FD40 +2540 +2D40 +3540 +6540 +A540 +2540 +2920 +F120 +ENDCHAR +STARTCHAR U_6294 +ENCODING 25236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2180 +2B40 +3520 +6920 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6295 +ENCODING 25237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +2460 +2800 +37C0 +6440 +A280 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6296 +ENCODING 25238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +F940 +2040 +2A40 +3140 +60E0 +AF40 +2040 +2040 +E040 +ENDCHAR +STARTCHAR U_6297 +ENCODING 25239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2780 +3480 +6480 +A480 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6298 +ENCODING 25240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FA00 +2200 +23E0 +3A40 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6299 +ENCODING 25241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27C0 +2100 +3FE0 +6100 +A100 +2100 +2500 +E200 +ENDCHAR +STARTCHAR U_629A +ENCODING 25242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F900 +2100 +2FE0 +3280 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_629B +ENCODING 25243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +F9E0 +2EA0 +2AA0 +3AA0 +6AA0 +AAA0 +2B40 +2A20 +F1E0 +ENDCHAR +STARTCHAR U_629C +ENCODING 25244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2FE0 +2200 +33C0 +6440 +A640 +2980 +2A40 +F420 +ENDCHAR +STARTCHAR U_629D +ENCODING 25245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +22E0 +F220 +2420 +2F20 +3220 +6420 +A520 +2F20 +20A0 +E040 +ENDCHAR +STARTCHAR U_629E +ENCODING 25246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2BE0 +3280 +6280 +A280 +2440 +2440 +E820 +ENDCHAR +STARTCHAR U_629F +ENCODING 25247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2FE0 +3200 +67E0 +A040 +2380 +2080 +E040 +ENDCHAR +STARTCHAR U_62A0 +ENCODING 25248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC40 +2640 +2D40 +3480 +6480 +A540 +2640 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62A1 +ENCODING 25249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +2A00 +3240 +6280 +A300 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_62A2 +ENCODING 25250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +2780 +3480 +6480 +A580 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62A3 +ENCODING 25251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2A20 +3220 +60A0 +A120 +2620 +20A0 +E040 +ENDCHAR +STARTCHAR U_62A4 +ENCODING 25252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +2420 +37E0 +6400 +A400 +2400 +2800 +F000 +ENDCHAR +STARTCHAR U_62A5 +ENCODING 25253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2580 +2C00 +37E0 +6540 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_62A6 +ENCODING 25254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F100 +2FE0 +2920 +3920 +6AA0 +AC60 +2820 +28A0 +E840 +ENDCHAR +STARTCHAR U_62A7 +ENCODING 25255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2A20 +33E0 +6000 +A140 +2140 +2220 +E420 +ENDCHAR +STARTCHAR U_62A8 +ENCODING 25256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F900 +2520 +2B40 +3100 +6FE0 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62A9 +ENCODING 25257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2FC0 +3540 +6540 +AFE0 +2440 +2440 +E4C0 +ENDCHAR +STARTCHAR U_62AA +ENCODING 25258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +2280 +2FE0 +34A0 +6CA0 +A4A0 +24E0 +2080 +E080 +ENDCHAR +STARTCHAR U_62AB +ENCODING 25259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +24A0 +2C80 +37E0 +6540 +A540 +2480 +2940 +F620 +ENDCHAR +STARTCHAR U_62AC +ENCODING 25260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA40 +27A0 +2820 +3000 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62AD +ENCODING 25261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2420 +2800 +3380 +6280 +A280 +24A0 +28A0 +F0E0 +ENDCHAR +STARTCHAR U_62AE +ENCODING 25262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3200 +6480 +A120 +2640 +2180 +EE00 +ENDCHAR +STARTCHAR U_62AF +ENCODING 25263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +2FC0 +3440 +6440 +A7C0 +2440 +2440 +FFE0 +ENDCHAR +STARTCHAR U_62B0 +ENCODING 25264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2D40 +3540 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_62B1 +ENCODING 25265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +24A0 +34A0 +67A0 +A4C0 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62B2 +ENCODING 25266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F040 +2740 +2540 +3540 +6740 +A040 +2040 +2140 +E080 +ENDCHAR +STARTCHAR U_62B3 +ENCODING 25267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C00 +3520 +6540 +A580 +2520 +2920 +F0E0 +ENDCHAR +STARTCHAR U_62B4 +ENCODING 25268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2540 +F540 +2FE0 +2540 +3540 +65C0 +A540 +2400 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62B5 +ENCODING 25269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +FC80 +2480 +2FE0 +3480 +6480 +A480 +24A0 +2760 +E4A0 +ENDCHAR +STARTCHAR U_62B6 +ENCODING 25270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +2100 +37E0 +6100 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_62B7 +ENCODING 25271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F880 +2100 +2B80 +3540 +E920 +2100 +2100 +2000 +6FE0 +ENDCHAR +STARTCHAR U_62B8 +ENCODING 25272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2080 +27E0 +3040 +6080 +A100 +2200 +2500 +E8E0 +ENDCHAR +STARTCHAR U_62B9 +ENCODING 25273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2100 +37C0 +6100 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_62BA +ENCODING 25274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2FE0 +3100 +6380 +A540 +2920 +2100 +E100 +ENDCHAR +STARTCHAR U_62BB +ENCODING 25275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62BC +ENCODING 25276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +27E0 +2CA0 +34A0 +67E0 +A4A0 +2080 +2080 +E080 +ENDCHAR +STARTCHAR U_62BD +ENCODING 25277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +27E0 +2CA0 +34A0 +67E0 +A4A0 +24A0 +27E0 +E420 +ENDCHAR +STARTCHAR U_62BE +ENCODING 25278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2100 +37E0 +6100 +A200 +2440 +2FA0 +E420 +ENDCHAR +STARTCHAR U_62BF +ENCODING 25279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C80 +3480 +67E0 +A480 +24A0 +2560 +E620 +ENDCHAR +STARTCHAR U_62C0 +ENCODING 25280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2440 +27C0 +3280 +6280 +A280 +2480 +24A0 +E860 +ENDCHAR +STARTCHAR U_62C1 +ENCODING 25281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +FEE0 +2AA0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +2AE0 +F600 +ENDCHAR +STARTCHAR U_62C2 +ENCODING 25282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +22A0 +2FE0 +3A80 +6FE0 +A2A0 +22A0 +24C0 +E880 +ENDCHAR +STARTCHAR U_62C3 +ENCODING 25283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2A00 +2200 +33C0 +6200 +A200 +23C0 +2200 +E200 +ENDCHAR +STARTCHAR U_62C4 +ENCODING 25284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2100 +2900 +3100 +67C0 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62C5 +ENCODING 25285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +2FC0 +3440 +6440 +A7C0 +2440 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62C6 +ENCODING 25286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +27E0 +2480 +3580 +64C0 +A4A0 +2480 +A880 +4880 +ENDCHAR +STARTCHAR U_62C7 +ENCODING 25287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2FE0 +3440 +6540 +A540 +27E0 +2040 +E180 +ENDCHAR +STARTCHAR U_62C8 +ENCODING 25288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F9E0 +2100 +2900 +3100 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62C9 +ENCODING 25289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2040 +3440 +6240 +A280 +2080 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62CA +ENCODING 25290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC40 +25E0 +2C40 +3640 +E540 +2440 +2440 +A540 +4480 +ENDCHAR +STARTCHAR U_62CB +ENCODING 25291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +E9E0 +5EA0 +4AA0 +6AA0 +CAA0 +4AA0 +5360 +5200 +E1E0 +ENDCHAR +STARTCHAR U_62CC +ENCODING 25292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +F540 +2100 +27C0 +3100 +6100 +AFE0 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62CD +ENCODING 25293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +2220 +2A20 +33E0 +6220 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62CE +ENCODING 25294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2A20 +2100 +37E0 +6040 +A080 +2300 +2080 +E040 +ENDCHAR +STARTCHAR U_62CF +ENCODING 25295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +4980 +2A60 +DF80 +0200 +3FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_62D0 +ENCODING 25296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2900 +3100 +67E0 +A120 +2220 +2520 +E8C0 +ENDCHAR +STARTCHAR U_62D1 +ENCODING 25297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +2240 +2A40 +33C0 +6240 +A240 +2240 +23C0 +E240 +ENDCHAR +STARTCHAR U_62D2 +ENCODING 25298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +27C0 +2C40 +3440 +67C0 +A440 +2400 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62D3 +ENCODING 25299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2A00 +37E0 +6A20 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62D4 +ENCODING 25300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +2BC0 +3240 +6540 +A480 +2880 +2940 +E620 +ENDCHAR +STARTCHAR U_62D5 +ENCODING 25301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F440 +2800 +2200 +3240 +6280 +A300 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_62D6 +ENCODING 25302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +2100 +25C0 +3740 +6D40 +A5C0 +2520 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62D7 +ENCODING 25303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +FC80 +2BE0 +2CA0 +36A0 +65A0 +AEA0 +28A0 +2120 +E260 +ENDCHAR +STARTCHAR U_62D8 +ENCODING 25304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2FA0 +34A0 +64A0 +A7A0 +24A0 +2120 +E0C0 +ENDCHAR +STARTCHAR U_62D9 +ENCODING 25305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD40 +2540 +2FC0 +3100 +6920 +A920 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_62DA +ENCODING 25306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFA0 +2000 +2A40 +3240 +6FE0 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_62DB +ENCODING 25307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2120 +2A60 +3400 +63E0 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62DC +ENCODING 25308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +2100 +F7C0 +2100 +27C0 +F900 +27C0 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_62DD +ENCODING 25309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F7C0 +2100 +27C0 +3100 +6FE0 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62DE +ENCODING 25310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +20C0 +F700 +2400 +27E0 +3480 +6480 +A480 +2480 +2FE0 +E000 +ENDCHAR +STARTCHAR U_62DF +ENCODING 25311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FD40 +2440 +2C40 +3440 +6540 +A640 +24C0 +2120 +E620 +ENDCHAR +STARTCHAR U_62E0 +ENCODING 25312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +51C0 +FD40 +5540 +5540 +5540 +ED40 +4540 +4A60 +4900 +D0E0 +ENDCHAR +STARTCHAR U_62E1 +ENCODING 25313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2480 +2480 +3480 +6500 +A540 +2A20 +2BE0 +F020 +ENDCHAR +STARTCHAR U_62E2 +ENCODING 25314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +F200 +2FE0 +2280 +32A0 +62C0 +A480 +25A0 +2AA0 +F0E0 +ENDCHAR +STARTCHAR U_62E3 +ENCODING 25315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +2780 +2C80 +37E0 +6080 +A2C0 +24A0 +2AA0 +E100 +ENDCHAR +STARTCHAR U_62E4 +ENCODING 25316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F3C0 +2200 +2FE0 +3200 +6280 +A240 +2240 +2200 +E200 +ENDCHAR +STARTCHAR U_62E5 +ENCODING 25317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3920 +6FE0 +A920 +2920 +2920 +F060 +ENDCHAR +STARTCHAR U_62E6 +ENCODING 25318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +FA80 +27E0 +2000 +3000 +63C0 +A000 +2000 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62E7 +ENCODING 25319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +2000 +37E0 +6080 +A080 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_62E8 +ENCODING 25320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD20 +27E0 +2900 +33E0 +6240 +A540 +2880 +3140 +E620 +ENDCHAR +STARTCHAR U_62E9 +ENCODING 25321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F980 +2240 +2C20 +3100 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_62EA +ENCODING 25322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2FE0 +2AA0 +3AA0 +6AE0 +AC20 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_62EB +ENCODING 25323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2C40 +37C0 +6520 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_62EC +ENCODING 25324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2FE0 +3100 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62ED +ENCODING 25325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2080 +3780 +6280 +A2A0 +23A0 +2E60 +E020 +ENDCHAR +STARTCHAR U_62EE +ENCODING 25326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2FC0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_62EF +ENCODING 25327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +F980 +2120 +2F40 +3580 +6540 +A920 +2720 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62F0 +ENCODING 25328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +25C0 +FC80 +2480 +2C80 +37E0 +6480 +A480 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_62F1 +ENCODING 25329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +27C0 +2A80 +3280 +6FE0 +A000 +2240 +2420 +E820 +ENDCHAR +STARTCHAR U_62F2 +ENCODING 25330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFE0 +1100 +2E80 +4440 +BFA0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_62F3 +ENCODING 25331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +2080 +5F40 +8420 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_62F4 +ENCODING 25332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +27C0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62F5 +ENCODING 25333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +27E0 +2C40 +3480 +E7E0 +2480 +2480 +2480 +6580 +ENDCHAR +STARTCHAR U_62F6 +ENCODING 25334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +2000 +2A00 +33E0 +6440 +AA40 +2180 +2300 +EC00 +ENDCHAR +STARTCHAR U_62F7 +ENCODING 25335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +27E0 +2900 +33E0 +6500 +ABE0 +2020 +2120 +E0C0 +ENDCHAR +STARTCHAR U_62F8 +ENCODING 25336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FE40 +2280 +2B00 +31E0 +6220 +A540 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_62F9 +ENCODING 25337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FA40 +2240 +2480 +3480 +6FE0 +AAA0 +2AA0 +2AA0 +E540 +ENDCHAR +STARTCHAR U_62FA +ENCODING 25338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +2D20 +3520 +6560 +A380 +2540 +2920 +E120 +ENDCHAR +STARTCHAR U_62FB +ENCODING 25339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2500 +3520 +EB40 +2900 +3280 +2280 +A440 +4820 +ENDCHAR +STARTCHAR U_62FC +ENCODING 25340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +FFE0 +2240 +2240 +3FE0 +6240 +A240 +2440 +2440 +6840 +ENDCHAR +STARTCHAR U_62FD +ENCODING 25341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6140 +A180 +2120 +22A0 +EC60 +ENDCHAR +STARTCHAR U_62FE +ENCODING 25342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2BA0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_62FF +ENCODING 25343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +1100 +3F80 +0400 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6300 +ENCODING 25344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +F860 +2B80 +3AA0 +6AA0 +AA40 +2A40 +2A40 +AB20 +5220 +ENDCHAR +STARTCHAR U_6301 +ENCODING 25345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3080 +6FE0 +A480 +2280 +2080 +E180 +ENDCHAR +STARTCHAR U_6302 +ENCODING 25346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6303 +ENCODING 25347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FA00 +2440 +2FA0 +3120 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6304 +ENCODING 25348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +F540 +2380 +2FE0 +3280 +6280 +A280 +2480 +24A0 +E860 +ENDCHAR +STARTCHAR U_6305 +ENCODING 25349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FAE0 +2420 +2560 +3900 +6FE0 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6306 +ENCODING 25350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2440 +2960 +3100 +6FE0 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6307 +ENCODING 25351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2260 +FB80 +2220 +2BE0 +3000 +63E0 +A220 +23E0 +2220 +E3E0 +ENDCHAR +STARTCHAR U_6308 +ENCODING 25352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +20A0 +F920 +2240 +7F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6309 +ENCODING 25353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2520 +2900 +37E0 +6240 +A640 +2180 +2280 +EC60 +ENDCHAR +STARTCHAR U_630A +ENCODING 25354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +F900 +27E0 +2800 +37E0 +6100 +A180 +2140 +2140 +E100 +ENDCHAR +STARTCHAR U_630B +ENCODING 25355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FC80 +27E0 +2C20 +3420 +67E0 +A480 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_630C +ENCODING 25356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FE40 +2180 +2A40 +3420 +6FC0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_630D +ENCODING 25357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F7E0 +2240 +24A0 +3A80 +6280 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_630E +ENCODING 25358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +2BA0 +3000 +6FC0 +A200 +27C0 +2040 +E180 +ENDCHAR +STARTCHAR U_630F +ENCODING 25359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +2820 +2BA0 +3AA0 +6AA0 +ABA0 +2AA0 +2820 +E8E0 +ENDCHAR +STARTCHAR U_6310 +ENCODING 25360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A20 +F3E0 +2A20 +DF80 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_6311 +ENCODING 25361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +26C0 +2A80 +36C0 +6AA0 +A280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_6312 +ENCODING 25362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2420 +F4A0 +2EA0 +2AA0 +32A0 +6AA0 +A4A0 +2420 +28A0 +F040 +ENDCHAR +STARTCHAR U_6313 +ENCODING 25363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +24A0 +2B00 +3100 +61E0 +AF00 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6314 +ENCODING 25364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +2AA0 +36C0 +6A80 +A280 +22C0 +2320 +E620 +ENDCHAR +STARTCHAR U_6315 +ENCODING 25365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA40 +23C0 +2A40 +3240 +63C0 +A240 +2260 +2FC0 +E040 +ENDCHAR +STARTCHAR U_6316 +ENCODING 25366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F420 +2240 +2420 +37E0 +6080 +A100 +2220 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6317 +ENCODING 25367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2120 +3FE0 +6900 +AFE0 +22A0 +2440 +E820 +ENDCHAR +STARTCHAR U_6318 +ENCODING 25368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +F520 +2940 +2180 +3100 +6200 +AFE0 +2220 +24A0 +E840 +ENDCHAR +STARTCHAR U_6319 +ENCODING 25369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +FFE0 +1100 +2EC0 +C420 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_631A +ENCODING 25370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2940 +F740 +2140 +7FA0 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_631B +ENCODING 25371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2940 +4920 +BFA0 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_631C +ENCODING 25372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2280 +2AA0 +36C0 +6280 +A280 +2280 +2FE0 +E000 +ENDCHAR +STARTCHAR U_631D +ENCODING 25373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2840 +F7E0 +2040 +2240 +3D40 +6440 +A540 +2480 +2400 +EBE0 +ENDCHAR +STARTCHAR U_631E +ENCODING 25374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2880 +F480 +23E0 +2C80 +3480 +6480 +A540 +2620 +2400 +EBE0 +ENDCHAR +STARTCHAR U_631F +ENCODING 25375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F920 +2540 +2B80 +3100 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6320 +ENCODING 25376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +FA80 +2120 +36E0 +6000 +AFE0 +2280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_6321 +ENCODING 25377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +2100 +2FE0 +3020 +6020 +A7E0 +2020 +2020 +EFE0 +ENDCHAR +STARTCHAR U_6322 +ENCODING 25378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27E0 +2A40 +3420 +6200 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6323 +ENCODING 25379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC80 +27C0 +2940 +3FE0 +6140 +A7C0 +2100 +2500 +E200 +ENDCHAR +STARTCHAR U_6324 +ENCODING 25380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +2180 +2E60 +3000 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6325 +ENCODING 25381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FA00 +27E0 +2A00 +3500 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_6326 +ENCODING 25382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +27C0 +3080 +6FE0 +A480 +2280 +2080 +E180 +ENDCHAR +STARTCHAR U_6327 +ENCODING 25383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F220 +2B20 +26A0 +3260 +66A0 +AB20 +2220 +2AA0 +E440 +ENDCHAR +STARTCHAR U_6328 +ENCODING 25384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFA0 +2400 +27C0 +3900 +E100 +2FE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6329 +ENCODING 25385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC20 +27E0 +2C20 +3420 +67E0 +A280 +2280 +24A0 +E860 +ENDCHAR +STARTCHAR U_632A +ENCODING 25386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +EAA0 +5EA0 +4AC0 +6AA0 +5EA0 +CAA0 +4AE0 +4A80 +D680 +ENDCHAR +STARTCHAR U_632B +ENCODING 25387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD40 +2540 +2BA0 +3120 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_632C +ENCODING 25388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +2C20 +37C0 +6080 +AFE0 +2100 +2100 +E300 +ENDCHAR +STARTCHAR U_632D +ENCODING 25389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2200 +2580 +E860 +ENDCHAR +STARTCHAR U_632E +ENCODING 25390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2940 +27C0 +3500 +67E0 +A320 +25A0 +2940 +E100 +ENDCHAR +STARTCHAR U_632F +ENCODING 25391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDC0 +2400 +2FE0 +3500 +65A0 +A540 +2540 +29A0 +E920 +ENDCHAR +STARTCHAR U_6330 +ENCODING 25392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +37C0 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6331 +ENCODING 25393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +F2C0 +2AA0 +26A0 +3280 +64A0 +A820 +2840 +2880 +EB00 +ENDCHAR +STARTCHAR U_6332 +ENCODING 25394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +A540 +5920 +E1C0 +5F00 +4200 +7FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_6333 +ENCODING 25395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +FAA0 +2540 +2AA0 +32A0 +6000 +A7E0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6334 +ENCODING 25396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FC00 +27C0 +2D40 +3540 +6FE0 +A540 +2540 +27E0 +E040 +ENDCHAR +STARTCHAR U_6335 +ENCODING 25397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F7C0 +2100 +2FE0 +3240 +6FE0 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6336 +ENCODING 25398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2400 +2FE0 +3420 +67A0 +A6A0 +2BA0 +2820 +F0C0 +ENDCHAR +STARTCHAR U_6337 +ENCODING 25399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +F4A0 +24A0 +2FC0 +34E0 +64A0 +AFA0 +24C0 +2880 +F080 +ENDCHAR +STARTCHAR U_6338 +ENCODING 25400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3440 +67C0 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6339 +ENCODING 25401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +27C0 +3540 +6540 +A7C0 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_633A +ENCODING 25402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2FC0 +FA40 +2440 +2FE0 +3240 +6240 +AA40 +25E0 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_633B +ENCODING 25403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +23C0 +FA40 +2440 +2E60 +3540 +E540 +2D40 +25E0 +AA00 +51E0 +ENDCHAR +STARTCHAR U_633C +ENCODING 25404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +27A0 +FD20 +2AC0 +2100 +3FE0 +6240 +A480 +2380 +2240 +EC20 +ENDCHAR +STARTCHAR U_633D +ENCODING 25405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27E0 +2D20 +3520 +E7E0 +2280 +22A0 +A4A0 +48E0 +ENDCHAR +STARTCHAR U_633E +ENCODING 25406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2540 +2540 +3BA0 +6100 +A280 +2440 +2820 +F020 +ENDCHAR +STARTCHAR U_633F +ENCODING 25407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +2100 +3FE0 +6920 +AFE0 +2920 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6340 +ENCODING 25408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2680 +F900 +26E0 +2900 +3FE0 +6100 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6341 +ENCODING 25409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +FFC0 +2100 +2FE0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6342 +ENCODING 25410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +2240 +2240 +3FE0 +6000 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6343 +ENCODING 25411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FFE0 +2240 +2FC0 +3200 +63E0 +A620 +2A20 +23E0 +E220 +ENDCHAR +STARTCHAR U_6344 +ENCODING 25412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +2920 +3540 +6380 +A540 +2920 +2520 +E200 +ENDCHAR +STARTCHAR U_6345 +ENCODING 25413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F100 +2FE0 +2920 +3FE0 +6920 +AFE0 +2920 +2920 +E8E0 +ENDCHAR +STARTCHAR U_6346 +ENCODING 25414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3BA0 +6D60 +A920 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6347 +ENCODING 25415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3280 +6AC0 +AAA0 +22A0 +2480 +E980 +ENDCHAR +STARTCHAR U_6348 +ENCODING 25416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2FE0 +2100 +3100 +6FE0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_6349 +ENCODING 25417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +2FC0 +3100 +6500 +A5E0 +2500 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_634A +ENCODING 25418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FD20 +2280 +2FE0 +3040 +6080 +AFE0 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_634B +ENCODING 25419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F920 +2440 +2A80 +3FE0 +6080 +A480 +2280 +2080 +E380 +ENDCHAR +STARTCHAR U_634C +ENCODING 25420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +2920 +F920 +2F20 +24A0 +34A0 +6FA0 +A5A0 +2520 +2920 +F660 +ENDCHAR +STARTCHAR U_634D +ENCODING 25421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3000 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_634E +ENCODING 25422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +27E0 +2C20 +37E0 +6420 +A7E0 +2420 +2420 +E4E0 +ENDCHAR +STARTCHAR U_634F +ENCODING 25423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6350 +ENCODING 25424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +2FE0 +3420 +E7E0 +2420 +27E0 +2420 +6460 +ENDCHAR +STARTCHAR U_6351 +ENCODING 25425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FDE0 +2520 +2DE0 +3400 +67C0 +A080 +2FE0 +2240 +EC20 +ENDCHAR +STARTCHAR U_6352 +ENCODING 25426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2D40 +37C0 +6100 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6353 +ENCODING 25427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +2AA0 +2FC0 +32A0 +62A0 +A6A0 +2AC0 +3280 +E680 +ENDCHAR +STARTCHAR U_6354 +ENCODING 25428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2520 +2920 +F060 +ENDCHAR +STARTCHAR U_6355 +ENCODING 25429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +2FE0 +3920 +6FE0 +A920 +2FE0 +2920 +E960 +ENDCHAR +STARTCHAR U_6356 +ENCODING 25430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2420 +2BC0 +3000 +6FE0 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6357 +ENCODING 25431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +25E0 +FD00 +2500 +2FE0 +3100 +6520 +A940 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_6358 +ENCODING 25432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFA0 +2240 +2D20 +33C0 +6640 +AA80 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6359 +ENCODING 25433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +27C0 +2D40 +37C0 +6540 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_635A +ENCODING 25434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_635B +ENCODING 25435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F240 +2240 +23C0 +3000 +67E0 +A420 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_635C +ENCODING 25436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6100 +A7E0 +2240 +2180 +6660 +ENDCHAR +STARTCHAR U_635D +ENCODING 25437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +FA80 +27C0 +2440 +37C0 +6280 +A280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_635E +ENCODING 25438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +27E0 +2C20 +3100 +6FE0 +A220 +2220 +2520 +E8C0 +ENDCHAR +STARTCHAR U_635F +ENCODING 25439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +2FE0 +3420 +6520 +A520 +2520 +2280 +EC60 +ENDCHAR +STARTCHAR U_6360 +ENCODING 25440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F400 +27E0 +2480 +3480 +6480 +AFE0 +2280 +2460 +E820 +ENDCHAR +STARTCHAR U_6361 +ENCODING 25441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2420 +2BC0 +3000 +6A40 +A540 +2480 +2080 +EFE0 +ENDCHAR +STARTCHAR U_6362 +ENCODING 25442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27C0 +2D40 +3540 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6363 +ENCODING 25443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +2540 +2C80 +37E0 +6220 +AAA0 +2AA0 +2FA0 +E0C0 +ENDCHAR +STARTCHAR U_6364 +ENCODING 25444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2480 +2F00 +35C0 +6700 +A5E0 +2700 +2920 +F0E0 +ENDCHAR +STARTCHAR U_6365 +ENCODING 25445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2400 +26E0 +3AA0 +6AA0 +A6E0 +2280 +24A0 +F860 +ENDCHAR +STARTCHAR U_6366 +ENCODING 25446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F500 +2880 +2760 +3200 +6F80 +A200 +2A40 +2680 +EFC0 +ENDCHAR +STARTCHAR U_6367 +ENCODING 25447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +2900 +3FE0 +6540 +ABA0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6368 +ENCODING 25448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +27E0 +2900 +3FE0 +6100 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6369 +ENCODING 25449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2940 +3920 +6FE0 +A900 +2A80 +2440 +E820 +ENDCHAR +STARTCHAR U_636A +ENCODING 25450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FD00 +27E0 +2D00 +36A0 +67E0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_636B +ENCODING 25451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3820 +6820 +A820 +2820 +28A0 +E840 +ENDCHAR +STARTCHAR U_636C +ENCODING 25452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA40 +2BE0 +3E40 +6B40 +AAC0 +2A40 +B240 +52C0 +ENDCHAR +STARTCHAR U_636D +ENCODING 25453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6280 +A480 +2FE0 +2080 +E080 +ENDCHAR +STARTCHAR U_636E +ENCODING 25454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C80 +37E0 +6480 +A7E0 +2E20 +AA20 +53E0 +ENDCHAR +STARTCHAR U_636F +ENCODING 25455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2F20 +F4A0 +2AA0 +2FA0 +34A0 +EFA0 +24A0 +2420 +2720 +7860 +ENDCHAR +STARTCHAR U_6370 +ENCODING 25456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +2FC0 +3100 +6FE0 +A100 +2380 +2540 +E920 +ENDCHAR +STARTCHAR U_6371 +ENCODING 25457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +27E0 +2C80 +37E0 +E400 +2480 +2BE0 +A880 +57E0 +ENDCHAR +STARTCHAR U_6372 +ENCODING 25458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2200 +2FE0 +3440 +6FA0 +A480 +25A0 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6373 +ENCODING 25459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC00 +27E0 +2C80 +3480 +6FE0 +A100 +2920 +2920 +EFE0 +ENDCHAR +STARTCHAR U_6374 +ENCODING 25460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +F480 +2A40 +24A0 +3780 +6000 +A240 +25A0 +2CA0 +F380 +ENDCHAR +STARTCHAR U_6375 +ENCODING 25461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2AA0 +2FE0 +3AA0 +6AA0 +AFE0 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6376 +ENCODING 25462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F100 +2FE0 +2540 +3540 +6FE0 +A540 +2FE0 +2100 +E7C0 +ENDCHAR +STARTCHAR U_6377 +ENCODING 25463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FC0 +2140 +3FE0 +6140 +AFE0 +2900 +2D00 +F3E0 +ENDCHAR +STARTCHAR U_6378 +ENCODING 25464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F940 +27E0 +2940 +37C0 +6520 +A3C0 +2540 +2920 +F720 +ENDCHAR +STARTCHAR U_6379 +ENCODING 25465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2540 +2BA0 +3100 +6240 +AFE0 +2240 +2240 +E440 +ENDCHAR +STARTCHAR U_637A +ENCODING 25466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +2BA0 +3000 +6FC0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_637B +ENCODING 25467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2120 +2FC0 +3080 +6100 +A240 +2AA0 +2A60 +F1C0 +ENDCHAR +STARTCHAR U_637C +ENCODING 25468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2380 +2540 +3920 +6FE0 +A240 +2480 +2380 +DC60 +ENDCHAR +STARTCHAR U_637D +ENCODING 25469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2240 +2A40 +35A0 +6100 +AFE0 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_637E +ENCODING 25470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +23C0 +2A40 +33C0 +6200 +A3E0 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_637F +ENCODING 25471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F280 +27E0 +2280 +3780 +6200 +AFE0 +2480 +2300 +ECC0 +ENDCHAR +STARTCHAR U_6380 +ENCODING 25472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C80 +F8E0 +2920 +2F40 +3A40 +6A40 +AA40 +2AA0 +2AA0 +F320 +ENDCHAR +STARTCHAR U_6381 +ENCODING 25473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFC0 +2400 +27C0 +3400 +6FE0 +A520 +24C0 +2540 +E620 +ENDCHAR +STARTCHAR U_6382 +ENCODING 25474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2480 +2CE0 +3480 +6480 +A7E0 +2A20 +2A20 +F3E0 +ENDCHAR +STARTCHAR U_6383 +ENCODING 25475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +2FE0 +3920 +6FC0 +A540 +2540 +25C0 +E100 +ENDCHAR +STARTCHAR U_6384 +ENCODING 25476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FBA0 +2000 +2FE0 +3AA0 +6AA0 +AFE0 +2AA0 +2AA0 +E860 +ENDCHAR +STARTCHAR U_6385 +ENCODING 25477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2100 +3FE0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6386 +ENCODING 25478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +FFE0 +2920 +3D60 +6D60 +AFE0 +2C60 +A8A0 +4840 +ENDCHAR +STARTCHAR U_6387 +ENCODING 25479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +F240 +25A0 +2900 +3FE0 +6AA0 +A4A0 +2240 +25A0 +E920 +ENDCHAR +STARTCHAR U_6388 +ENCODING 25480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2A20 +F540 +2800 +2FE0 +3820 +67C0 +A480 +2300 +2480 +F860 +ENDCHAR +STARTCHAR U_6389 +ENCODING 25481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2C40 +37C0 +6440 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_638A +ENCODING 25482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2A80 +37E0 +6000 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_638B +ENCODING 25483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +2BE0 +2A80 +3A80 +EBE0 +2A80 +2AA0 +2B60 +72A0 +ENDCHAR +STARTCHAR U_638C +ENCODING 25484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +9120 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_638D +ENCODING 25485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +64A0 +A7C0 +24A0 +25A0 +EE60 +ENDCHAR +STARTCHAR U_638E +ENCODING 25486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +27E0 +3040 +6740 +A540 +2740 +2040 +E1C0 +ENDCHAR +STARTCHAR U_638F +ENCODING 25487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +2220 +3FE0 +6220 +AAA0 +2FA0 +2020 +E0C0 +ENDCHAR +STARTCHAR U_6390 +ENCODING 25488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +F440 +2A80 +2CE0 +3820 +6820 +AEE0 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6391 +ENCODING 25489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +2440 +37C0 +6440 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6392 +ENCODING 25490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FEE0 +2280 +2280 +3EE0 +6280 +A280 +2EE0 +2280 +E280 +ENDCHAR +STARTCHAR U_6393 +ENCODING 25491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2700 +F4E0 +24A0 +2FA0 +34A0 +6EA0 +B540 +2540 +24A0 +ED20 +ENDCHAR +STARTCHAR U_6394 +ENCODING 25492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +FA40 +8980 +FA60 +A400 +FF80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_6395 +ENCODING 25493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2480 +3A60 +6380 +A680 +2100 +A280 +4C60 +ENDCHAR +STARTCHAR U_6396 +ENCODING 25494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F480 +24E0 +2D20 +36A0 +6540 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_6397 +ENCODING 25495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F280 +2EE0 +2820 +3820 +E820 +2EE0 +2280 +A280 +4FE0 +ENDCHAR +STARTCHAR U_6398 +ENCODING 25496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2880 +2AA0 +3BE0 +E880 +2AA0 +2AA0 +AAA0 +53E0 +ENDCHAR +STARTCHAR U_6399 +ENCODING 25497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2FA0 +FA40 +2500 +27C0 +3140 +EFE0 +2140 +27C0 +A100 +4700 +ENDCHAR +STARTCHAR U_639A +ENCODING 25498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F100 +2FE0 +2DA0 +3B60 +6B60 +ADA0 +2920 +29A0 +E940 +ENDCHAR +STARTCHAR U_639B +ENCODING 25499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FE80 +2480 +2FC0 +30A0 +64A0 +AF80 +2480 +2780 +F880 +ENDCHAR +STARTCHAR U_639C +ENCODING 25500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2E60 +F820 +2EE0 +2820 +3FE0 +EAA0 +2280 +22A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_639D +ENCODING 25501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2E80 +3AA0 +EEA0 +20C0 +26A0 +B960 +4220 +ENDCHAR +STARTCHAR U_639E +ENCODING 25502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +2A40 +2920 +3120 +6540 +A580 +2A40 +2420 +E820 +ENDCHAR +STARTCHAR U_639F +ENCODING 25503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2000 +2FE0 +3100 +6500 +A5E0 +2500 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_63A0 +ENCODING 25504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +3440 +67C0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_63A1 +ENCODING 25505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2FA0 +FA20 +2540 +2100 +3FE0 +6100 +A380 +2540 +2920 +F120 +ENDCHAR +STARTCHAR U_63A2 +ENCODING 25506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F280 +2440 +2920 +3100 +6FE0 +A100 +2580 +2940 +F120 +ENDCHAR +STARTCHAR U_63A3 +ENCODING 25507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +7EA0 +90A0 +FEA0 +5460 +5F80 +0200 +7FE0 +0200 +FFE0 +0600 +ENDCHAR +STARTCHAR U_63A4 +ENCODING 25508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2EE0 +2AA0 +3AA0 +6EE0 +AAA0 +2AA0 +2AA0 +F760 +ENDCHAR +STARTCHAR U_63A5 +ENCODING 25509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3100 +6FE0 +A240 +2680 +2140 +EE20 +ENDCHAR +STARTCHAR U_63A6 +ENCODING 25510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2C40 +27C0 +3200 +67E0 +AAA0 +24A0 +2120 +E2C0 +ENDCHAR +STARTCHAR U_63A7 +ENCODING 25511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2280 +2440 +3820 +67C0 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63A8 +ENCODING 25512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +F7E0 +2480 +2C80 +37E0 +6480 +A7E0 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_63A9 +ENCODING 25513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2540 +2FE0 +3540 +67C0 +A540 +27C0 +2120 +E0E0 +ENDCHAR +STARTCHAR U_63AA +ENCODING 25514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F280 +2280 +2FE0 +3000 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63AB +ENCODING 25515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2BE0 +FAA0 +2EA0 +2AA0 +3EA0 +EAA0 +2BA0 +3E40 +A2A0 +6320 +ENDCHAR +STARTCHAR U_63AC +ENCODING 25516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F960 +25A0 +2320 +3FE0 +E120 +23A0 +2560 +A920 +61C0 +ENDCHAR +STARTCHAR U_63AD +ENCODING 25517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2280 +2440 +3920 +6540 +A5A0 +2960 +2500 +E200 +ENDCHAR +STARTCHAR U_63AE +ENCODING 25518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F420 +27E0 +2400 +37E0 +6420 +A7E0 +2A20 +2BE0 +F260 +ENDCHAR +STARTCHAR U_63AF +ENCODING 25519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22E0 +F280 +2FE0 +2000 +37E0 +6420 +A7E0 +2420 +27E0 +E460 +ENDCHAR +STARTCHAR U_63B0 +ENCODING 25520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +EDC0 +4A40 +53E0 +F040 +5E40 +EBE0 +4A40 +4A40 +5240 +E4C0 +ENDCHAR +STARTCHAR U_63B1 +ENCODING 25521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +3F80 +0400 +FFE0 +2480 +FFE0 +2080 +FBE0 +2080 +E380 +ENDCHAR +STARTCHAR U_63B2 +ENCODING 25522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2C40 +27C0 +3200 +67E0 +ACA0 +2520 +27A0 +E040 +ENDCHAR +STARTCHAR U_63B3 +ENCODING 25523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +F7E0 +2520 +27C0 +3520 +65E0 +A480 +27E0 +2A20 +F4C0 +ENDCHAR +STARTCHAR U_63B4 +ENCODING 25524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2920 +2920 +3BA0 +6920 +A960 +2FE0 +2820 +EFE0 +ENDCHAR +STARTCHAR U_63B5 +ENCODING 25525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2440 +2BA0 +3000 +6EE0 +AAA0 +2AA0 +2EE0 +E080 +ENDCHAR +STARTCHAR U_63B6 +ENCODING 25526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +2FC0 +2940 +3FE0 +6940 +AFC0 +2900 +2A80 +F460 +ENDCHAR +STARTCHAR U_63B7 +ENCODING 25527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +24A0 +FFA0 +24C0 +24A0 +3FA0 +E4A0 +24E0 +2A80 +B180 +4080 +ENDCHAR +STARTCHAR U_63B8 +ENCODING 25528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2540 +27C0 +3540 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_63B9 +ENCODING 25529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F100 +2FE0 +2100 +3500 +6200 +AFE0 +2AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_63BA +ENCODING 25530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFA0 +2100 +2FE0 +3540 +6AA0 +A500 +2240 +2080 +E700 +ENDCHAR +STARTCHAR U_63BB +ENCODING 25531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2480 +F300 +2280 +2D60 +3100 +67C0 +A540 +27C0 +2140 +EFA0 +ENDCHAR +STARTCHAR U_63BC +ENCODING 25532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +27C0 +3000 +E7C0 +2540 +2540 +2280 +6C60 +ENDCHAR +STARTCHAR U_63BD +ENCODING 25533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F000 +27E0 +2280 +3AA0 +6AA0 +A6C0 +2280 +2280 +EFE0 +ENDCHAR +STARTCHAR U_63BE +ENCODING 25534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +F780 +2080 +2FE0 +3540 +6A80 +A5C0 +2AA0 +24A0 +EB00 +ENDCHAR +STARTCHAR U_63BF +ENCODING 25535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F280 +2100 +2FE0 +3200 +67C0 +AC40 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63C0 +ENCODING 25536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2920 +3AA0 +6FE0 +A100 +2380 +2540 +F920 +ENDCHAR +STARTCHAR U_63C1 +ENCODING 25537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +23C0 +2200 +FFC0 +2840 +2FC0 +3840 +6FC0 +A840 +2FC0 +2480 +6840 +ENDCHAR +STARTCHAR U_63C2 +ENCODING 25538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +2FE0 +3AA0 +6CE0 +A820 +2FE0 +2820 +EFE0 +ENDCHAR +STARTCHAR U_63C3 +ENCODING 25539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2000 +2E20 +3AA0 +6EA0 +AAA0 +2EA0 +2A20 +EAE0 +ENDCHAR +STARTCHAR U_63C4 +ENCODING 25540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FFA0 +2000 +2E20 +3AA0 +6EA0 +AAA0 +2EA0 +2A20 +EA60 +ENDCHAR +STARTCHAR U_63C5 +ENCODING 25541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2140 +3BE0 +6940 +BF40 +0200 +3FC0 +0200 +7FE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_63C6 +ENCODING 25542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2580 +F2A0 +2440 +2BA0 +3100 +6100 +AFE0 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_63C7 +ENCODING 25543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A920 +2FE0 +2920 +E860 +ENDCHAR +STARTCHAR U_63C8 +ENCODING 25544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FA20 +2FE0 +2020 +37A0 +6020 +A7A0 +24A0 +27A0 +E0C0 +ENDCHAR +STARTCHAR U_63C9 +ENCODING 25545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FFE0 +2320 +2500 +3B00 +E100 +2FE0 +2380 +2540 +6920 +ENDCHAR +STARTCHAR U_63CA +ENCODING 25546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F7C0 +2440 +27C0 +3000 +6FE0 +A920 +2FE0 +2920 +EFE0 +ENDCHAR +STARTCHAR U_63CB +ENCODING 25547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +3000 +6FE0 +A520 +24C0 +2540 +E620 +ENDCHAR +STARTCHAR U_63CC +ENCODING 25548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3820 +6200 +A540 +2CA0 +24A0 +E380 +ENDCHAR +STARTCHAR U_63CD +ENCODING 25549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2200 +3FE0 +6B40 +A120 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_63CE +ENCODING 25550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2000 +2FE0 +3440 +67C0 +A440 +27C0 +2000 +EFE0 +ENDCHAR +STARTCHAR U_63CF +ENCODING 25551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2000 +27E0 +3520 +6520 +A7E0 +2520 +27E0 +E420 +ENDCHAR +STARTCHAR U_63D0 +ENCODING 25552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6FE0 +A500 +25E0 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_63D1 +ENCODING 25553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +F420 +26E0 +2420 +37E0 +6000 +A7E0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63D2 +ENCODING 25554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +2100 +3560 +6920 +AD60 +2920 +2920 +EFE0 +ENDCHAR +STARTCHAR U_63D3 +ENCODING 25555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +45E0 +FE00 +5080 +5EE0 +77A0 +D6A0 +56E0 +5680 +5620 +ADE0 +ENDCHAR +STARTCHAR U_63D4 +ENCODING 25556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +26A0 +2520 +3AE0 +E000 +2240 +2D20 +3440 +63C0 +ENDCHAR +STARTCHAR U_63D5 +ENCODING 25557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +23C0 +2A40 +33C0 +E240 +2FE0 +2540 +2620 +67E0 +ENDCHAR +STARTCHAR U_63D6 +ENCODING 25558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +2FE0 +3440 +67C0 +A440 +24E0 +2F40 +E040 +ENDCHAR +STARTCHAR U_63D7 +ENCODING 25559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2880 +FFE0 +2880 +2BE0 +3A20 +6BE0 +AA20 +2BE0 +2A20 +F3E0 +ENDCHAR +STARTCHAR U_63D8 +ENCODING 25560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +2440 +3FE0 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63D9 +ENCODING 25561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2800 +3FE0 +6AA0 +AFE0 +2AA0 +2AA0 +EA60 +ENDCHAR +STARTCHAR U_63DA +ENCODING 25562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3200 +67E0 +AAA0 +24A0 +2920 +E2C0 +ENDCHAR +STARTCHAR U_63DB +ENCODING 25563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +2AA0 +3AA0 +6C60 +A100 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_63DC +ENCODING 25564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F7C0 +2820 +27C0 +3440 +67C0 +A280 +2FE0 +2480 +E880 +ENDCHAR +STARTCHAR U_63DD +ENCODING 25565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2A80 +2680 +39E0 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63DE +ENCODING 25566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3000 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63DF +ENCODING 25567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +FDC0 +2700 +28E0 +37C0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_63E0 +ENCODING 25568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +FBC0 +2A40 +2BC0 +3900 +6FE0 +AA40 +2980 +2A40 +EFE0 +ENDCHAR +STARTCHAR U_63E1 +ENCODING 25569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2400 +27E0 +3540 +67E0 +A480 +27E0 +2880 +F7E0 +ENDCHAR +STARTCHAR U_63E2 +ENCODING 25570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +23C0 +2640 +3980 +6240 +AFE0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63E3 +ENCODING 25571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +2FE0 +3200 +6FE0 +AAA0 +2AA0 +2AA0 +E860 +ENDCHAR +STARTCHAR U_63E4 +ENCODING 25572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +FAA0 +2EA0 +2AA0 +3EA0 +68A0 +AAA0 +2AE0 +2D80 +E880 +ENDCHAR +STARTCHAR U_63E5 +ENCODING 25573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3920 +67C0 +A540 +2540 +25C0 +E100 +ENDCHAR +STARTCHAR U_63E6 +ENCODING 25574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +F220 +2FA0 +2AA0 +3FA0 +6620 +AB20 +2AA0 +2220 +E260 +ENDCHAR +STARTCHAR U_63E7 +ENCODING 25575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +7CA0 +5420 +9260 +3FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_63E8 +ENCODING 25576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F000 +27C0 +2440 +3FE0 +6820 +A7C0 +2100 +2100 +E300 +ENDCHAR +STARTCHAR U_63E9 +ENCODING 25577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +FFC0 +24A0 +2760 +3200 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63EA +ENCODING 25578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2480 +F4A0 +2FC0 +2580 +3680 +6D80 +A480 +2540 +2620 +6420 +ENDCHAR +STARTCHAR U_63EB +ENCODING 25579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +22A0 +FCC0 +2980 +6640 +A420 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_63EC +ENCODING 25580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F840 +2480 +2A40 +3280 +6FC0 +A200 +2500 +2480 +F860 +ENDCHAR +STARTCHAR U_63ED +ENCODING 25581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +27C0 +3400 +6FE0 +B920 +2AA0 +AFA0 +40C0 +ENDCHAR +STARTCHAR U_63EE +ENCODING 25582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2540 +27C0 +3540 +67C0 +A100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_63EF +ENCODING 25583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +F500 +25E0 +2720 +35A0 +E560 +25A0 +2560 +2440 +E5E0 +ENDCHAR +STARTCHAR U_63F0 +ENCODING 25584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2FE0 +27C0 +3540 +67C0 +A540 +2FE0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63F1 +ENCODING 25585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D620 +7D20 +4520 +7520 +5CE0 +4700 +0400 +3FC0 +0400 +7FE0 +0C00 +ENDCHAR +STARTCHAR U_63F2 +ENCODING 25586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F540 +25C0 +2C00 +37E0 +6100 +AFE0 +2380 +2540 +E920 +ENDCHAR +STARTCHAR U_63F3 +ENCODING 25587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2EA0 +24A0 +3FA0 +6540 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_63F4 +ENCODING 25588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +F2C0 +2FE0 +2100 +3FE0 +6200 +A3E0 +2540 +2880 +D360 +ENDCHAR +STARTCHAR U_63F5 +ENCODING 25589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +23E0 +F2A0 +27E0 +2C80 +35E0 +6480 +B7E0 +2880 +AC80 +53E0 +ENDCHAR +STARTCHAR U_63F6 +ENCODING 25590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2AA0 +FAA0 +2EA0 +2AC0 +3AA0 +6EA0 +AAA0 +2BA0 +BEC0 +4280 +ENDCHAR +STARTCHAR U_63F7 +ENCODING 25591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +F100 +2FE0 +2100 +3D60 +E920 +2D60 +2920 +AFE0 +4100 +ENDCHAR +STARTCHAR U_63F8 +ENCODING 25592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2920 +27C0 +3440 +67C0 +A440 +27C0 +A000 +4FE0 +ENDCHAR +STARTCHAR U_63F9 +ENCODING 25593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +F2A0 +2EE0 +2000 +37C0 +6440 +A7C0 +2440 +A7C0 +44C0 +ENDCHAR +STARTCHAR U_63FA +ENCODING 25594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +F020 +2520 +2540 +3FE0 +E100 +2FE0 +2100 +A920 +4FE0 +ENDCHAR +STARTCHAR U_63FB +ENCODING 25595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4140 +FFE0 +5080 +5FA0 +74A0 +DFA0 +55A0 +5640 +56C0 +EB20 +ENDCHAR +STARTCHAR U_63FC +ENCODING 25596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4400 +EFC0 +5440 +4440 +67C0 +C120 +4D40 +4580 +4940 +D320 +ENDCHAR +STARTCHAR U_63FD +ENCODING 25597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB40 +2A20 +2000 +37C0 +6540 +A540 +2540 +22A0 +ECE0 +ENDCHAR +STARTCHAR U_63FE +ENCODING 25598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4880 +EF80 +4880 +4F80 +6000 +5FC0 +D540 +5540 +5540 +FFE0 +ENDCHAR +STARTCHAR U_63FF +ENCODING 25599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2E80 +F0E0 +2E20 +2440 +3F40 +6440 +A540 +2640 +ACA0 +4120 +ENDCHAR +STARTCHAR U_6400 +ENCODING 25600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F880 +2FC0 +2A40 +3FC0 +E4A0 +2B60 +3080 +A600 +4180 +ENDCHAR +STARTCHAR U_6401 +ENCODING 25601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4420 +F7E0 +54A0 +5320 +54A0 +FFE0 +54A0 +54A0 +57A0 +D060 +ENDCHAR +STARTCHAR U_6402 +ENCODING 25602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2540 +2920 +3100 +6FE0 +A240 +2680 +A180 +4E60 +ENDCHAR +STARTCHAR U_6403 +ENCODING 25603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7E0 +2420 +3420 +27E0 +6000 +A240 +3520 +B4A0 +43C0 +ENDCHAR +STARTCHAR U_6404 +ENCODING 25604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +E800 +5FC0 +5A40 +6BC0 +CA40 +4A40 +4BC0 +4800 +CFE0 +ENDCHAR +STARTCHAR U_6405 +ENCODING 25605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2540 +FFE0 +2820 +2FC0 +3440 +E540 +2540 +2300 +2520 +69E0 +ENDCHAR +STARTCHAR U_6406 +ENCODING 25606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2280 +3FE0 +6540 +A7C0 +2540 +2FE0 +E4C0 +ENDCHAR +STARTCHAR U_6407 +ENCODING 25607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +5CE0 +E200 +4FC0 +4080 +6300 +DFE0 +4200 +4D40 +5480 +C660 +ENDCHAR +STARTCHAR U_6408 +ENCODING 25608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F840 +2480 +2640 +3B00 +6480 +AFE0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6409 +ENCODING 25609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA20 +2480 +2FE0 +3480 +E7E0 +2480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_640A +ENCODING 25610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +F520 +27E0 +2240 +37E0 +6860 +A560 +27E0 +2220 +ECC0 +ENDCHAR +STARTCHAR U_640B +ENCODING 25611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28E0 +F880 +2BE0 +2AA0 +3BC0 +6AA0 +ABE0 +2A40 +AA40 +5460 +ENDCHAR +STARTCHAR U_640C +ENCODING 25612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2540 +27E0 +3540 +67E0 +A6A0 +2A40 +AB40 +5220 +ENDCHAR +STARTCHAR U_640D +ENCODING 25613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +27E0 +3420 +67E0 +A420 +27E0 +A280 +4C60 +ENDCHAR +STARTCHAR U_640E +ENCODING 25614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F40 +2280 +F540 +24A0 +2DC0 +34A0 +EFE0 +3480 +25C0 +B6A0 +4DA0 +ENDCHAR +STARTCHAR U_640F +ENCODING 25615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +F540 +27C0 +2D40 +37C0 +E540 +3FE0 +2480 +2280 +6180 +ENDCHAR +STARTCHAR U_6410 +ENCODING 25616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2140 +27E0 +3000 +E7E0 +2520 +27E0 +2520 +67E0 +ENDCHAR +STARTCHAR U_6411 +ENCODING 25617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2440 +37C0 +6440 +A7C0 +2460 +2FC0 +E040 +ENDCHAR +STARTCHAR U_6412 +ENCODING 25618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2FE0 +2920 +3FE0 +6200 +A3E0 +2220 +24A0 +F840 +ENDCHAR +STARTCHAR U_6413 +ENCODING 25619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +27C0 +3100 +6FE0 +A400 +2FC0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6414 +ENCODING 25620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +FA40 +2180 +2E60 +3100 +67E0 +A520 +27E0 +2140 +EFA0 +ENDCHAR +STARTCHAR U_6415 +ENCODING 25621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2200 +3440 +6FA0 +A000 +2FE0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_6416 +ENCODING 25622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +F540 +2A80 +2300 +3FC0 +E500 +2FE0 +3100 +2920 +6FE0 +ENDCHAR +STARTCHAR U_6417 +ENCODING 25623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +2C40 +37E0 +6400 +A7E0 +2AA0 +2FA0 +E0C0 +ENDCHAR +STARTCHAR U_6418 +ENCODING 25624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +2140 +FFE0 +2240 +27A0 +3A20 +67E0 +A420 +27E0 +2420 +E7E0 +ENDCHAR +STARTCHAR U_6419 +ENCODING 25625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FFE0 +2B40 +2A80 +3B60 +6880 +AFE0 +2A80 +2880 +F180 +ENDCHAR +STARTCHAR U_641A +ENCODING 25626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FFE0 +24A0 +2920 +37E0 +6420 +A7E0 +2420 +27E0 +E460 +ENDCHAR +STARTCHAR U_641B +ENCODING 25627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2FE0 +F500 +2FC0 +2540 +3FE0 +6540 +AFC0 +2580 +2D40 +F520 +ENDCHAR +STARTCHAR U_641C +ENCODING 25628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2D60 +F920 +2D60 +2920 +3FE0 +6100 +AFC0 +2480 +2300 +ECE0 +ENDCHAR +STARTCHAR U_641D +ENCODING 25629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F840 +2FC0 +2840 +3FC0 +6280 +AFE0 +2200 +2580 +F860 +ENDCHAR +STARTCHAR U_641E +ENCODING 25630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +2000 +3FE0 +6820 +ABA0 +2AA0 +2BA0 +E860 +ENDCHAR +STARTCHAR U_641F +ENCODING 25631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5F40 +E440 +5F40 +55E0 +7F40 +D540 +5F40 +4440 +5F40 +C440 +ENDCHAR +STARTCHAR U_6420 +ENCODING 25632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +24A0 +FFA0 +22E0 +2AA0 +3AA0 +6FE0 +A2A0 +22A0 +2520 +EA60 +ENDCHAR +STARTCHAR U_6421 +ENCODING 25633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +F7E0 +2AA0 +2440 +3AA0 +6120 +AFE0 +2580 +2940 +F120 +ENDCHAR +STARTCHAR U_6422 +ENCODING 25634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FAA0 +26C0 +2280 +3FE0 +6440 +A7C0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6423 +ENCODING 25635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2880 +2F80 +3AA0 +6BA0 +AEC0 +2BA0 +2AE0 +F520 +ENDCHAR +STARTCHAR U_6424 +ENCODING 25636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F000 +2FE0 +2280 +3440 +6FE0 +A540 +2540 +2540 +FFE0 +ENDCHAR +STARTCHAR U_6425 +ENCODING 25637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +F520 +21E0 +2100 +3DE0 +6520 +A5E0 +2520 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_6426 +ENCODING 25638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +FEE0 +2880 +2EE0 +3220 +EAA0 +2660 +3BA0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_6427 +ENCODING 25639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2800 +3FE0 +6920 +ADA0 +2B60 +2DA0 +F360 +ENDCHAR +STARTCHAR U_6428 +ENCODING 25640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6FE0 +AAA0 +2660 +2BA0 +E660 +ENDCHAR +STARTCHAR U_6429 +ENCODING 25641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +F940 +2FE0 +2240 +3D40 +6FE0 +A380 +2540 +2960 +E100 +ENDCHAR +STARTCHAR U_642A +ENCODING 25642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +2FC0 +2940 +3FE0 +6940 +AFC0 +2A40 +2A40 +F3C0 +ENDCHAR +STARTCHAR U_642B +ENCODING 25643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA60 +FFC0 +AA40 +8980 +3F40 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_642C +ENCODING 25644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +5DC0 +F540 +5D40 +5560 +7E00 +55C0 +DD40 +5480 +5540 +EE20 +ENDCHAR +STARTCHAR U_642D +ENCODING 25645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +2280 +3440 +EBA0 +2000 +27C0 +A440 +47C0 +ENDCHAR +STARTCHAR U_642E +ENCODING 25646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3100 +6FE0 +A100 +2380 +2560 +F920 +ENDCHAR +STARTCHAR U_642F +ENCODING 25647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F520 +22C0 +2200 +3CE0 +6820 +AEE0 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6430 +ENCODING 25648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F740 +2FE0 +2820 +37C0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6431 +ENCODING 25649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2480 +27E0 +3540 +67E0 +A480 +2BE0 +2880 +F080 +ENDCHAR +STARTCHAR U_6432 +ENCODING 25650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FAC0 +2440 +29E0 +3E80 +6A80 +AA80 +2A40 +2BA0 +F2A0 +ENDCHAR +STARTCHAR U_6433 +ENCODING 25651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2100 +37C0 +6100 +AFE0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6434 +ENCODING 25652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +1FC0 +0900 +FFE0 +2240 +DFA0 +0200 +3FE0 +0200 +ENDCHAR +STARTCHAR U_6435 +ENCODING 25653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FEC0 +2440 +2FC0 +3000 +EFE0 +2AA0 +2AA0 +2AA0 +6FE0 +ENDCHAR +STARTCHAR U_6436 +ENCODING 25654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +28A0 +27C0 +3440 +67C0 +A440 +27E0 +2A20 +EBE0 +ENDCHAR +STARTCHAR U_6437 +ENCODING 25655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +3740 +65C0 +A440 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_6438 +ENCODING 25656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +E200 +5FE0 +4480 +6F40 +D220 +4FC0 +4680 +4A40 +D220 +ENDCHAR +STARTCHAR U_6439 +ENCODING 25657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F7C0 +2000 +2FE0 +3AA0 +6920 +AFE0 +2920 +2920 +E860 +ENDCHAR +STARTCHAR U_643A +ENCODING 25658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F480 +27E0 +2480 +37E0 +6480 +AFE0 +2240 +2420 +E8E0 +ENDCHAR +STARTCHAR U_643B +ENCODING 25659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +6EC0 +0000 +3F80 +2080 +3F80 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_643C +ENCODING 25660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F100 +2FE0 +2440 +3BA0 +6120 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_643D +ENCODING 25661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2380 +2440 +3920 +67C0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_643E +ENCODING 25662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +2200 +37E0 +6A00 +A3C0 +2200 +23E0 +E200 +ENDCHAR +STARTCHAR U_643F +ENCODING 25663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12E0 +E640 +2940 +2FE0 +7040 +2F40 +29E0 +F940 +2F40 +4940 +80C0 +ENDCHAR +STARTCHAR U_6440 +ENCODING 25664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +2400 +37E0 +6400 +A7E0 +2520 +2AA0 +EAC0 +ENDCHAR +STARTCHAR U_6441 +ENCODING 25665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +2EA0 +37E0 +6100 +A2C0 +2A20 +2A60 +F1C0 +ENDCHAR +STARTCHAR U_6442 +ENCODING 25666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FBC0 +2240 +2FE0 +3040 +6820 +A6C0 +2000 +26C0 +E820 +ENDCHAR +STARTCHAR U_6443 +ENCODING 25667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +27C0 +3440 +67C0 +A440 +27C0 +2280 +EC60 +ENDCHAR +STARTCHAR U_6444 +ENCODING 25668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FBC0 +2240 +2BC0 +3240 +6FE0 +AAA0 +2440 +2AA0 +F120 +ENDCHAR +STARTCHAR U_6445 +ENCODING 25669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +29C0 +3F20 +69E0 +AB40 +2AA0 +2E40 +F1C0 +ENDCHAR +STARTCHAR U_6446 +ENCODING 25670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +2100 +37C0 +6100 +AFE0 +2200 +2440 +EFE0 +ENDCHAR +STARTCHAR U_6447 +ENCODING 25671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +FA20 +2540 +27C0 +3900 +6FE0 +A100 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6448 +ENCODING 25672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2780 +2400 +37C0 +6480 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6449 +ENCODING 25673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F020 +4480 +5A60 +6300 +DCE0 +4200 +5FC0 +4480 +CF00 +ENDCHAR +STARTCHAR U_644A +ENCODING 25674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2E40 +F3E0 +2B40 +25E0 +3540 +6540 +ABE0 +3340 +2140 +E1E0 +ENDCHAR +STARTCHAR U_644B +ENCODING 25675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +4940 +F540 +4A60 +49C0 +7E40 +C940 +5D40 +6A80 +4940 +CA20 +ENDCHAR +STARTCHAR U_644C +ENCODING 25676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2A80 +3BC0 +EC80 +2BC0 +2880 +A880 +57E0 +ENDCHAR +STARTCHAR U_644D +ENCODING 25677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27E0 +2480 +3DE0 +6520 +A5E0 +2520 +25E0 +E520 +ENDCHAR +STARTCHAR U_644E +ENCODING 25678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +F660 +2AA0 +2300 +3480 +6A60 +A500 +2240 +2480 +E300 +ENDCHAR +STARTCHAR U_644F +ENCODING 25679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +E200 +4FC0 +4200 +7FE0 +D5C0 +68A0 +4D80 +4880 +CF80 +ENDCHAR +STARTCHAR U_6450 +ENCODING 25680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +F940 +22A0 +2CA0 +3880 +6A80 +AAE0 +2A80 +2D80 +E8E0 +ENDCHAR +STARTCHAR U_6451 +ENCODING 25681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5160 +FFE0 +5120 +5D60 +75A0 +DD20 +52A0 +5C60 +D020 +5FE0 +ENDCHAR +STARTCHAR U_6452 +ENCODING 25682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2540 +2480 +37E0 +6540 +A7E0 +2540 +2540 +EA40 +ENDCHAR +STARTCHAR U_6453 +ENCODING 25683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +27E0 +F540 +2080 +2F60 +3480 +67E0 +A480 +27E0 +2A80 +F1E0 +ENDCHAR +STARTCHAR U_6454 +ENCODING 25684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2920 +2540 +37A0 +6940 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_6455 +ENCODING 25685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +5540 +F760 +4000 +7FE0 +D220 +4FC0 +4A40 +4AC0 +C200 +ENDCHAR +STARTCHAR U_6456 +ENCODING 25686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +5E20 +F2C0 +4C40 +4BA0 +7000 +C7C0 +4100 +4540 +4920 +C300 +ENDCHAR +STARTCHAR U_6457 +ENCODING 25687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +E4E0 +5F20 +5500 +7F40 +C440 +4E40 +5540 +64A0 +C520 +ENDCHAR +STARTCHAR U_6458 +ENCODING 25688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2920 +3FE0 +E920 +2BA0 +2AA0 +2BA0 +6860 +ENDCHAR +STARTCHAR U_6459 +ENCODING 25689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2480 +F3E0 +22A0 +23E0 +3AA0 +6BE0 +A880 +2BE0 +2C80 +F3E0 +ENDCHAR +STARTCHAR U_645A +ENCODING 25690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +2820 +27C0 +3440 +E7C0 +2100 +27C0 +A100 +4FE0 +ENDCHAR +STARTCHAR U_645B +ENCODING 25691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +26C0 +2540 +37C0 +E100 +2FE0 +2AA0 +ABA0 +6860 +ENDCHAR +STARTCHAR U_645C +ENCODING 25692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +27C0 +3C40 +E7C0 +2440 +27C0 +2440 +6820 +ENDCHAR +STARTCHAR U_645D +ENCODING 25693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FE0 +2AA0 +3FE0 +E880 +2CA0 +2FC0 +B4A0 +66E0 +ENDCHAR +STARTCHAR U_645E +ENCODING 25694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3240 +E780 +2240 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_645F +ENCODING 25695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2540 +3FE0 +E920 +2FE0 +2440 +2380 +6C60 +ENDCHAR +STARTCHAR U_6460 +ENCODING 25696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2AC0 +2D40 +3AC0 +EFC0 +2540 +24A0 +AC60 +73C0 +ENDCHAR +STARTCHAR U_6461 +ENCODING 25697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +F940 +2F40 +29E0 +3F40 +E840 +2A40 +2EC0 +A940 +4260 +ENDCHAR +STARTCHAR U_6462 +ENCODING 25698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4200 +FFE0 +5220 +5FC0 +7220 +DFE0 +5540 +5FE0 +5100 +A300 +ENDCHAR +STARTCHAR U_6463 +ENCODING 25699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4200 +FFE0 +5240 +5F80 +7220 +D7E0 +5440 +57C0 +5440 +AFE0 +ENDCHAR +STARTCHAR U_6464 +ENCODING 25700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2BA0 +2540 +3BA0 +EBA0 +2540 +2BA0 +A280 +4C60 +ENDCHAR +STARTCHAR U_6465 +ENCODING 25701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FC40 +27C0 +2440 +3FE0 +2400 +EFE0 +34A0 +A920 +66C0 +ENDCHAR +STARTCHAR U_6466 +ENCODING 25702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4AA0 +F6A0 +5EA0 +62A0 +7EA0 +D2A0 +5EA0 +42A0 +52E0 +CDA0 +ENDCHAR +STARTCHAR U_6467 +ENCODING 25703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +24A0 +F7E0 +2280 +37E0 +2C80 +F7C0 +2480 +27C0 +A480 +67E0 +ENDCHAR +STARTCHAR U_6468 +ENCODING 25704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2AA0 +29C0 +3EA0 +EA80 +2BC0 +2C80 +ABE0 +7080 +ENDCHAR +STARTCHAR U_6469 +ENCODING 25705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +4200 +7FE0 +4200 +8E00 +ENDCHAR +STARTCHAR U_646A +ENCODING 25706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +55E0 +F720 +5CC0 +6480 +C540 +7FE0 +5440 +5540 +5440 +A4C0 +ENDCHAR +STARTCHAR U_646B +ENCODING 25707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FFE0 +2520 +25E0 +2F20 +E5E0 +2440 +2AC0 +B140 +6660 +ENDCHAR +STARTCHAR U_646C +ENCODING 25708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F280 +2FE0 +2440 +37C0 +E440 +27C0 +22A0 +A4A0 +6860 +ENDCHAR +STARTCHAR U_646D +ENCODING 25709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2540 +2FE0 +3540 +E540 +25C0 +2400 +2AA0 +6AA0 +ENDCHAR +STARTCHAR U_646E +ENCODING 25710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1140 +FC80 +2760 +4400 +7FC0 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_646F +ENCODING 25711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FF80 +2280 +FEA0 +53A0 +FEE0 +0400 +7F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6470 +ENCODING 25712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5940 +B7C0 +1120 +7FA0 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6471 +ENCODING 25713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3AA0 +EFE0 +2440 +2280 +A100 +4EE0 +ENDCHAR +STARTCHAR U_6472 +ENCODING 25714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FC0 +F280 +2F80 +2AE0 +3FA0 +EAA0 +2FA0 +22A0 +AFA0 +6220 +ENDCHAR +STARTCHAR U_6473 +ENCODING 25715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FBC0 +2A40 +2BC0 +3800 +EEE0 +2AA0 +2EE0 +A800 +6FE0 +ENDCHAR +STARTCHAR U_6474 +ENCODING 25716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2AA0 +37C0 +E000 +2FE0 +2040 +A240 +6180 +ENDCHAR +STARTCHAR U_6475 +ENCODING 25717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2A80 +2B80 +3A80 +EFA0 +2A40 +2F40 +AAA0 +7720 +ENDCHAR +STARTCHAR U_6476 +ENCODING 25718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +2540 +3FC0 +E120 +2FE0 +2480 +2280 +6100 +ENDCHAR +STARTCHAR U_6477 +ENCODING 25719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +27C0 +2540 +37C0 +E540 +2FE0 +2580 +2940 +7120 +ENDCHAR +STARTCHAR U_6478 +ENCODING 25720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +2440 +37C0 +E440 +3FE0 +2100 +A280 +6C60 +ENDCHAR +STARTCHAR U_6479 +ENCODING 25721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2080 +3F80 +2080 +FFE0 +2440 +DFA0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_647A +ENCODING 25722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +F660 +2AA0 +2320 +3100 +E7E0 +2420 +27E0 +2420 +67E0 +ENDCHAR +STARTCHAR U_647B +ENCODING 25723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2AA0 +2F60 +3280 +E560 +2A80 +2120 +20C0 +6700 +ENDCHAR +STARTCHAR U_647C +ENCODING 25724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +FF20 +29A0 +2F40 +3A40 +EFA0 +2100 +27C0 +2100 +6FE0 +ENDCHAR +STARTCHAR U_647D +ENCODING 25725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3000 +E7C0 +2000 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_647E +ENCODING 25726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5DE0 +E520 +45E0 +5C80 +73E0 +DEA0 +47E0 +4480 +54A0 +CBE0 +ENDCHAR +STARTCHAR U_647F +ENCODING 25727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +2440 +3280 +EFE0 +2440 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_6480 +ENCODING 25728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +7C80 +8160 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_6481 +ENCODING 25729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +3AA0 +67C0 +A500 +27C0 +2900 +3FE0 +6100 +ENDCHAR +STARTCHAR U_6482 +ENCODING 25730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27E0 +3C40 +E380 +2440 +2FE0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6483 +ENCODING 25731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +5620 +7FE0 +5540 +FE80 +1160 +7FC0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_6484 +ENCODING 25732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FAA0 +2AA0 +2AA0 +3540 +E920 +2FE0 +2480 +A380 +6E60 +ENDCHAR +STARTCHAR U_6485 +ENCODING 25733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2D80 +FA80 +2FE0 +2A20 +3AC0 +EAC0 +2FC0 +2A40 +34A0 +E920 +ENDCHAR +STARTCHAR U_6486 +ENCODING 25734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +59E0 +FF20 +B4C0 +DCC0 +9520 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6487 +ENCODING 25735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +4E80 +E4E0 +5F20 +5520 +75A0 +DFA0 +55A0 +5540 +55A0 +D320 +ENDCHAR +STARTCHAR U_6488 +ENCODING 25736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +FA40 +2540 +28A0 +3FE0 +E920 +27C0 +2240 +2440 +68C0 +ENDCHAR +STARTCHAR U_6489 +ENCODING 25737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BE0 +FD40 +1140 +F880 +1F60 +1400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_648A +ENCODING 25738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +FEE0 +52A0 +5EE0 +77A0 +D4A0 +57A0 +54A0 +57A0 +D4E0 +ENDCHAR +STARTCHAR U_648B +ENCODING 25739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3BA0 +E920 +2BA0 +2920 +ABA0 +4860 +ENDCHAR +STARTCHAR U_648C +ENCODING 25740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2440 +37C0 +E440 +27C0 +2440 +27C0 +6C60 +ENDCHAR +STARTCHAR U_648D +ENCODING 25741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A40 +EFE0 +46C0 +6B60 +5000 +CFC0 +4840 +4FC0 +C840 +4FC0 +ENDCHAR +STARTCHAR U_648E +ENCODING 25742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2820 +3FE0 +E440 +27C0 +2440 +2280 +6FE0 +ENDCHAR +STARTCHAR U_648F +ENCODING 25743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +FFC0 +2040 +2FE0 +32A0 +EFE0 +2040 +3FE0 +A840 +65C0 +ENDCHAR +STARTCHAR U_6490 +ENCODING 25744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F4A0 +27A0 +2000 +3FE0 +E480 +2FE0 +2280 +A480 +6980 +ENDCHAR +STARTCHAR U_6491 +ENCODING 25745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F820 +2380 +3280 +67C0 +A100 +27C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_6492 +ENCODING 25746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +3FA0 +2AA0 +6EA0 +AAA0 +2EA0 +2A40 +AAA0 +6F20 +ENDCHAR +STARTCHAR U_6493 +ENCODING 25747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +3EE0 +E440 +2FE0 +2280 +A4A0 +7860 +ENDCHAR +STARTCHAR U_6494 +ENCODING 25748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2440 +37C0 +E100 +2540 +2920 +6300 +ENDCHAR +STARTCHAR U_6495 +ENCODING 25749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2AC0 +FF80 +2A80 +3EE0 +6AA0 +BEA0 +2AA0 +3FA0 +2AA0 +7120 +ENDCHAR +STARTCHAR U_6496 +ENCODING 25750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +24E0 +FFA0 +2AA0 +3FA0 +2AA0 +6EA0 +ABA0 +2E40 +BAA0 +6320 +ENDCHAR +STARTCHAR U_6497 +ENCODING 25751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2100 +37C0 +E540 +27C0 +2540 +27C0 +6C60 +ENDCHAR +STARTCHAR U_6498 +ENCODING 25752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26E0 +FA40 +2120 +2280 +3440 +EBA0 +2000 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_6499 +ENCODING 25753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2940 +2EC0 +3840 +EFC0 +2840 +3FE0 +A880 +6580 +ENDCHAR +STARTCHAR U_649A +ENCODING 25754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2FE0 +2A80 +3540 +E540 +2A20 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_649B +ENCODING 25755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4680 +FFE0 +4680 +5A60 +6840 +CDE0 +5540 +4DE0 +4840 +D040 +ENDCHAR +STARTCHAR U_649C +ENCODING 25756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2BA0 +F6C0 +2440 +2BA0 +3000 +E7C0 +2440 +27C0 +A280 +6FE0 +ENDCHAR +STARTCHAR U_649D +ENCODING 25757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F40 +F540 +2780 +2480 +37C0 +E440 +2FE0 +3520 +2AA0 +6040 +ENDCHAR +STARTCHAR U_649E +ENCODING 25758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2100 +2FE0 +3540 +E7C0 +2540 +2FE0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_649F +ENCODING 25759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +2BA0 +3280 +EFE0 +2AA0 +2BA0 +2820 +6860 +ENDCHAR +STARTCHAR U_64A0 +ENCODING 25760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +F4A0 +2EE0 +2B80 +3EA0 +EAA0 +2EC0 +24A0 +3F60 +6420 +ENDCHAR +STARTCHAR U_64A1 +ENCODING 25761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F440 +5AA0 +6FE0 +4480 +C960 +5100 +45A0 +4940 +C300 +ENDCHAR +STARTCHAR U_64A2 +ENCODING 25762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +E7C0 +2440 +2FE0 +2100 +6100 +ENDCHAR +STARTCHAR U_64A3 +ENCODING 25763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FFE0 +2540 +27C0 +3540 +E7C0 +2100 +2FE0 +2100 +6100 +ENDCHAR +STARTCHAR U_64A4 +ENCODING 25764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +EAE0 +5DA0 +52A0 +5EA0 +D2A0 +5EA0 +5240 +52A0 +D720 +ENDCHAR +STARTCHAR U_64A5 +ENCODING 25765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2AA0 +F440 +2FE0 +2340 +3E20 +E9E0 +2EA0 +22A0 +B2C0 +6D20 +ENDCHAR +STARTCHAR U_64A6 +ENCODING 25766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2520 +2FA0 +3140 +EFE0 +2440 +2FC0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64A7 +ENCODING 25767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +49C0 +F240 +5FE0 +6AA0 +52A0 +DFE0 +4200 +6A20 +5620 +C1E0 +ENDCHAR +STARTCHAR U_64A8 +ENCODING 25768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +F7E0 +4900 +7FE0 +4900 +CFE0 +4900 +4FE0 +4D40 +D2A0 +ENDCHAR +STARTCHAR U_64A9 +ENCODING 25769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2C60 +37C0 +E440 +27C0 +2580 +A960 +7320 +ENDCHAR +STARTCHAR U_64AA +ENCODING 25770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F100 +4FE0 +5540 +6FE0 +C540 +47C0 +4540 +4FE0 +C100 +ENDCHAR +STARTCHAR U_64AB +ENCODING 25771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FD40 +2540 +2FE0 +3540 +E540 +2FE0 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_64AC +ENCODING 25772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +F1C0 +2F20 +24E0 +3880 +EDC0 +2880 +3FC0 +A8A0 +6EE0 +ENDCHAR +STARTCHAR U_64AD +ENCODING 25773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +F540 +2FE0 +2540 +3920 +EFE0 +2920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_64AE +ENCODING 25774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +3FE0 +2A00 +EBE0 +2EA0 +2AA0 +3E40 +E3A0 +ENDCHAR +STARTCHAR U_64AF +ENCODING 25775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +F200 +47C0 +4200 +7FE0 +C400 +4FC0 +5540 +E6C0 +47C0 +ENDCHAR +STARTCHAR U_64B0 +ENCODING 25776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2880 +2EE0 +3280 +EFE0 +2280 +2FE0 +2280 +6C60 +ENDCHAR +STARTCHAR U_64B1 +ENCODING 25777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FB00 +2DE0 +2A80 +3BE0 +EB20 +2FE0 +2920 +A9E0 +6960 +ENDCHAR +STARTCHAR U_64B2 +ENCODING 25778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +2FE0 +3100 +E7C0 +2100 +2FE0 +A280 +6C60 +ENDCHAR +STARTCHAR U_64B3 +ENCODING 25779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2A80 +F1E0 +2F20 +2480 +3F80 +6480 +B580 +2EC0 +A520 +7E20 +ENDCHAR +STARTCHAR U_64B4 +ENCODING 25780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +E080 +5DE0 +5540 +7E40 +C540 +4880 +7C80 +4940 +DA20 +ENDCHAR +STARTCHAR U_64B5 +ENCODING 25781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2440 +FEE0 +2440 +3AA0 +2FE0 +E500 +27C0 +2100 +AFE0 +6100 +ENDCHAR +STARTCHAR U_64B6 +ENCODING 25782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +3540 +6FE0 +A540 +2FE0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_64B7 +ENCODING 25783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +3C80 +EBE0 +3E20 +22A0 +3EA0 +EAA0 +2AA0 +2EA0 +A140 +6220 +ENDCHAR +STARTCHAR U_64B8 +ENCODING 25784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFC0 +2540 +37C0 +2D40 +EFE0 +2440 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64B9 +ENCODING 25785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4580 +FFE0 +5040 +4F80 +6A80 +CD80 +4A80 +4F80 +4520 +D8E0 +ENDCHAR +STARTCHAR U_64BA +ENCODING 25786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2540 +2FE0 +3540 +EFE0 +2920 +2FE0 +A920 +6100 +ENDCHAR +STARTCHAR U_64BB +ENCODING 25787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2480 +F3E0 +2140 +23E0 +3C80 +E7E0 +2480 +27E0 +AC80 +73E0 +ENDCHAR +STARTCHAR U_64BC +ENCODING 25788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4FE0 +E880 +4EA0 +48C0 +6EA0 +CB60 +5620 +4D40 +54A0 +D3A0 +ENDCHAR +STARTCHAR U_64BD +ENCODING 25789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +FBE0 +2EA0 +3AA0 +EEA0 +24A0 +3FA0 +2A40 +AAA0 +7720 +ENDCHAR +STARTCHAR U_64BE +ENCODING 25790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2640 +F340 +22C0 +3FE0 +E820 +2BA0 +2AA0 +2BE0 +AC00 +73E0 +ENDCHAR +STARTCHAR U_64BF +ENCODING 25791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +2000 +3EE0 +EAA0 +2EE0 +2440 +AAA0 +5120 +ENDCHAR +STARTCHAR U_64C0 +ENCODING 25792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2F40 +F2A0 +2F00 +29E0 +3F40 +E940 +2FE0 +2240 +AFC0 +6240 +ENDCHAR +STARTCHAR U_64C1 +ENCODING 25793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +25E0 +2B40 +3DE0 +6B40 +BDE0 +2540 +2940 +71E0 +ENDCHAR +STARTCHAR U_64C2 +ENCODING 25794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2BA0 +3540 +EFE0 +2920 +2FE0 +2920 +CFE0 +ENDCHAR +STARTCHAR U_64C3 +ENCODING 25795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FAA0 +2FE0 +2AA0 +3FE0 +E800 +2FE0 +2CA0 +B540 +6620 +ENDCHAR +STARTCHAR U_64C4 +ENCODING 25796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3AA0 +EBE0 +2AA0 +37E0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_64C5 +ENCODING 25797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2BA0 +2820 +3FE0 +E440 +27C0 +2440 +A440 +6FE0 +ENDCHAR +STARTCHAR U_64C6 +ENCODING 25798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +3180 +6FE0 +A200 +27C0 +3D40 +2540 +67C0 +ENDCHAR +STARTCHAR U_64C7 +ENCODING 25799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3280 +E7C0 +2100 +2FE0 +A100 +6100 +ENDCHAR +STARTCHAR U_64C8 +ENCODING 25800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +37C0 +6100 +A7C0 +2100 +2FE0 +A380 +4D60 +ENDCHAR +STARTCHAR U_64C9 +ENCODING 25801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2400 +2FE0 +3A20 +EFA0 +2AA0 +2FA0 +A2A0 +6F40 +ENDCHAR +STARTCHAR U_64CA +ENCODING 25802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +F960 +ABC0 +FD40 +A980 +AB60 +FE00 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_64CB +ENCODING 25803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +2B80 +3000 +EFE0 +2920 +2FE0 +A920 +6FE0 +ENDCHAR +STARTCHAR U_64CC +ENCODING 25804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F540 +4200 +5FE0 +6A40 +CA40 +56A0 +4500 +4880 +D060 +ENDCHAR +STARTCHAR U_64CD +ENCODING 25805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2EE0 +2AA0 +3EE0 +E100 +3FE0 +2380 +2540 +6920 +ENDCHAR +STARTCHAR U_64CE +ENCODING 25806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +5480 +7560 +1FC0 +0400 +7FE0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_64CF +ENCODING 25807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +28A0 +2FA0 +32A0 +EEA0 +2AA0 +2E40 +A2A0 +6D20 +ENDCHAR +STARTCHAR U_64D0 +ENCODING 25808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2000 +2FE0 +3440 +E7C0 +2520 +2CC0 +B540 +6620 +ENDCHAR +STARTCHAR U_64D1 +ENCODING 25809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4EC0 +EAA0 +5FE0 +4A80 +6EA0 +CAA0 +4EC0 +4AA0 +5F60 +C220 +ENDCHAR +STARTCHAR U_64D2 +ENCODING 25810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2540 +FFE0 +2AA0 +2920 +3FE0 +E100 +2FE0 +2AA0 +2BA0 +E860 +ENDCHAR +STARTCHAR U_64D3 +ENCODING 25811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5A40 +57E0 +FA40 +57E0 +7240 +D7E0 +5A40 +5BE0 +5200 +DFE0 +ENDCHAR +STARTCHAR U_64D4 +ENCODING 25812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2AA0 +2FE0 +3800 +EBE0 +2800 +2BE0 +B220 +63E0 +ENDCHAR +STARTCHAR U_64D5 +ENCODING 25813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2FE0 +F900 +2FC0 +3900 +6FE0 +A000 +2EE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_64D6 +ENCODING 25814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +2440 +27C0 +3440 +EFE0 +2920 +2AA0 +AFA0 +60C0 +ENDCHAR +STARTCHAR U_64D7 +ENCODING 25815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2BE0 +FAA0 +2E40 +29E0 +3E40 +EA40 +2AE0 +2A40 +AE40 +6A40 +ENDCHAR +STARTCHAR U_64D8 +ENCODING 25816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7D40 +67E0 +BC80 +7FC0 +0200 +3FC0 +0200 +7FE0 +0600 +ENDCHAR +STARTCHAR U_64D9 +ENCODING 25817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FD40 +2A40 +2FC0 +3A40 +ED40 +2AC0 +3FE0 +A480 +7860 +ENDCHAR +STARTCHAR U_64DA +ENCODING 25818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +FFE0 +52A0 +5300 +7FE0 +D540 +5A80 +55C0 +52A0 +E5A0 +ENDCHAR +STARTCHAR U_64DB +ENCODING 25819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F540 +2FE0 +25C0 +3400 +E7E0 +2100 +3FE0 +A540 +7920 +ENDCHAR +STARTCHAR U_64DC +ENCODING 25820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +E460 +5F40 +7BE0 +5540 +DF40 +5540 +5F40 +55A0 +D520 +ENDCHAR +STARTCHAR U_64DD +ENCODING 25821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2EA0 +FAE0 +2EA0 +3AE0 +6EA0 +A140 +2FE0 +2AA0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_64DE +ENCODING 25822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +2E80 +FFE0 +24A0 +3EA0 +65A0 +BFA0 +2AA0 +2E40 +25A0 +6920 +ENDCHAR +STARTCHAR U_64DF +ENCODING 25823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +E920 +5FE0 +4DA0 +6B60 +CDA0 +4DA0 +4B60 +4DA0 +C960 +ENDCHAR +STARTCHAR U_64E0 +ENCODING 25824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2540 +2D60 +3540 +E440 +27C0 +2440 +A7C0 +6840 +ENDCHAR +STARTCHAR U_64E1 +ENCODING 25825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2380 +2FE0 +3820 +67C0 +A280 +27C0 +A100 +4FE0 +ENDCHAR +STARTCHAR U_64E2 +ENCODING 25826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +F360 +2DA0 +27E0 +3500 +EFC0 +3500 +27C0 +A500 +67E0 +ENDCHAR +STARTCHAR U_64E3 +ENCODING 25827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +27E0 +2120 +37C0 +E000 +3FE0 +2A40 +AF40 +60C0 +ENDCHAR +STARTCHAR U_64E4 +ENCODING 25828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3920 +EFE0 +2920 +2FE0 +A480 +6880 +ENDCHAR +STARTCHAR U_64E5 +ENCODING 25829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F480 +97E0 +A4A0 +FFE0 +0000 +7FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_64E6 +ENCODING 25830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +F4A0 +2BA0 +3440 +2BA0 +F000 +2FE0 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_64E7 +ENCODING 25831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +68C0 +4E40 +62C0 +4A40 +FFE0 +2080 +5F40 +8420 +7FC0 +0400 +0C00 +ENDCHAR +STARTCHAR U_64E8 +ENCODING 25832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FAA0 +2FC0 +2AC0 +3E40 +EBC0 +2840 +2F40 +B5A0 +6920 +ENDCHAR +STARTCHAR U_64E9 +ENCODING 25833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2380 +3540 +EFE0 +2100 +2FE0 +AAA0 +6860 +ENDCHAR +STARTCHAR U_64EA +ENCODING 25834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5FE0 +5480 +5D40 +5620 +5F80 +4200 +5FE0 +8200 +8600 +ENDCHAR +STARTCHAR U_64EB +ENCODING 25835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +FF60 +2940 +2FE0 +3940 +EF40 +2940 +2F40 +B9A0 +6B20 +ENDCHAR +STARTCHAR U_64EC +ENCODING 25836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2CA0 +F840 +2E40 +39E0 +2E40 +E560 +3F40 +2540 +AAC0 +7260 +ENDCHAR +STARTCHAR U_64ED +ENCODING 25837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F480 +27E0 +2C80 +37C0 +E480 +2FE0 +2240 +A180 +6E60 +ENDCHAR +STARTCHAR U_64EE +ENCODING 25838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +E4A0 +5FE0 +5A80 +6FA0 +DAA0 +6F40 +4AA0 +4F60 +C820 +ENDCHAR +STARTCHAR U_64EF +ENCODING 25839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2940 +37C0 +EC40 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_64F0 +ENCODING 25840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2820 +3FE0 +EAA0 +2FE0 +2100 +A500 +6200 +ENDCHAR +STARTCHAR U_64F1 +ENCODING 25841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2FE0 +3AA0 +ED20 +2AA0 +2FE0 +AAA0 +6BE0 +ENDCHAR +STARTCHAR U_64F2 +ENCODING 25842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2FA0 +F4A0 +2FA0 +2AC0 +3DA0 +EFA0 +24A0 +3FE0 +A480 +7B80 +ENDCHAR +STARTCHAR U_64F3 +ENCODING 25843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +F440 +2EE0 +2AA0 +3EA0 +EAA0 +2EA0 +2AA0 +AEE0 +7880 +ENDCHAR +STARTCHAR U_64F4 +ENCODING 25844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F940 +2FE0 +2940 +3FE0 +EAA0 +2BE0 +2AA0 +ABE0 +5620 +ENDCHAR +STARTCHAR U_64F5 +ENCODING 25845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F240 +5FE0 +56E0 +7B40 +D7C0 +5100 +5FE0 +5100 +E300 +ENDCHAR +STARTCHAR U_64F6 +ENCODING 25846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FD40 +2280 +3FE0 +6020 +AEA0 +2AA0 +2EA0 +2AA0 +6A60 +ENDCHAR +STARTCHAR U_64F7 +ENCODING 25847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +FFE0 +2520 +2FE0 +3120 +EFE0 +2B20 +2BE0 +2EC0 +6120 +ENDCHAR +STARTCHAR U_64F8 +ENCODING 25848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +2FE0 +2AA0 +3FE0 +EB60 +2DA0 +2B60 +A920 +6DA0 +ENDCHAR +STARTCHAR U_64F9 +ENCODING 25849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +EAE0 +5F20 +5540 +7F40 +C440 +5F40 +44A0 +CAA0 +5120 +ENDCHAR +STARTCHAR U_64FA +ENCODING 25850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2AA0 +3DC0 +2A80 +EE60 +2AA0 +2EC0 +AAA0 +6AE0 +ENDCHAR +STARTCHAR U_64FB +ENCODING 25851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2F80 +FAE0 +3FA0 +2AA0 +3FA0 +EAA0 +3FA0 +2A40 +A6A0 +7920 +ENDCHAR +STARTCHAR U_64FC +ENCODING 25852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2920 +2FE0 +3920 +EFE0 +2AA0 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64FD +ENCODING 25853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +FAA0 +2FE0 +2A80 +3FE0 +E100 +2FE0 +2380 +A540 +6920 +ENDCHAR +STARTCHAR U_64FE +ENCODING 25854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F3C0 +2240 +2FE0 +3AA0 +EA20 +27E0 +2A40 +A180 +6E60 +ENDCHAR +STARTCHAR U_64FF +ENCODING 25855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57E0 +EA40 +4FE0 +6920 +FFE0 +5AA0 +5AA0 +5BA0 +D860 +6FE0 +ENDCHAR +STARTCHAR U_6500 +ENCODING 25856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +4A80 +F5C0 +4AA0 +FFE0 +1500 +3F80 +C460 +3F80 +0C00 +ENDCHAR +STARTCHAR U_6501 +ENCODING 25857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +2FE0 +2440 +3FE0 +E440 +27C0 +24A0 +A440 +6720 +ENDCHAR +STARTCHAR U_6502 +ENCODING 25858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +F7C0 +5540 +67C0 +4000 +DFE0 +52A0 +5FE0 +52A0 +DFE0 +ENDCHAR +STARTCHAR U_6503 +ENCODING 25859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +2940 +3680 +EBE0 +2000 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_6504 +ENCODING 25860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +3FE0 +2D40 +EFC0 +2D40 +2FC0 +B6A0 +6BE0 +ENDCHAR +STARTCHAR U_6505 +ENCODING 25861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +3540 +6FE0 +A540 +26C0 +2540 +27C0 +6C60 +ENDCHAR +STARTCHAR U_6506 +ENCODING 25862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +FFE0 +2A40 +3120 +3FE0 +E540 +27C0 +2540 +AFE0 +6100 +ENDCHAR +STARTCHAR U_6507 +ENCODING 25863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2100 +3FE0 +EAA0 +2FE0 +2540 +ACA0 +73A0 +ENDCHAR +STARTCHAR U_6508 +ENCODING 25864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F540 +5FC0 +5500 +77C0 +D520 +5FE0 +5700 +6A80 +D260 +ENDCHAR +STARTCHAR U_6509 +ENCODING 25865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFE0 +2AA0 +27E0 +3500 +EFC0 +3500 +27C0 +A500 +67E0 +ENDCHAR +STARTCHAR U_650A +ENCODING 25866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4B60 +EA40 +4FE0 +4AC0 +6F60 +4A40 +C880 +52E0 +5280 +EFE0 +ENDCHAR +STARTCHAR U_650B +ENCODING 25867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E540 +5FE0 +5520 +7FE0 +CD20 +57E0 +6520 +45E0 +C4A0 +ENDCHAR +STARTCHAR U_650C +ENCODING 25868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2820 +2FE0 +3AA0 +EBA0 +2960 +2EA0 +AA60 +6FE0 +ENDCHAR +STARTCHAR U_650D +ENCODING 25869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F400 +27E0 +2440 +37C0 +EA60 +2FA0 +2AE0 +AF20 +6AA0 +ENDCHAR +STARTCHAR U_650E +ENCODING 25870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3940 +EFC0 +2940 +3FE0 +AAA0 +6FE0 +ENDCHAR +STARTCHAR U_650F +ENCODING 25871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2F80 +FAE0 +2420 +2FE0 +3A80 +EEE0 +2A80 +2EE0 +AAA0 +6AE0 +ENDCHAR +STARTCHAR U_6510 +ENCODING 25872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2280 +3FE0 +E540 +2BA0 +22C0 +2E40 +6320 +ENDCHAR +STARTCHAR U_6511 +ENCODING 25873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2DE0 +2920 +FFE0 +2AA0 +3FE0 +2540 +6FE0 +B100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_6512 +ENCODING 25874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2A40 +3560 +EFE0 +2920 +2920 +2280 +CC60 +ENDCHAR +STARTCHAR U_6513 +ENCODING 25875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2280 +3FE0 +ECC0 +37A0 +25E0 +A500 +7BE0 +ENDCHAR +STARTCHAR U_6514 +ENCODING 25876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3920 +EFE0 +2AA0 +2FE0 +2BA0 +ED60 +ENDCHAR +STARTCHAR U_6515 +ENCODING 25877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +55A0 +FFE0 +4A80 +5B80 +6AA0 +DBA0 +4AC0 +5BA0 +CA60 +5F20 +ENDCHAR +STARTCHAR U_6516 +ENCODING 25878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3440 +EAA0 +2FE0 +2480 +A380 +6C60 +ENDCHAR +STARTCHAR U_6517 +ENCODING 25879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2FE0 +2AA0 +3CC0 +EBE0 +2D40 +3FE0 +A540 +6920 +ENDCHAR +STARTCHAR U_6518 +ENCODING 25880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +EAA0 +4EE0 +4480 +6FE0 +C480 +5FE0 +4D40 +5480 +C660 +ENDCHAR +STARTCHAR U_6519 +ENCODING 25881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +2420 +2FE0 +34A0 +E7E0 +2540 +27C0 +A120 +6EE0 +ENDCHAR +STARTCHAR U_651A +ENCODING 25882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +4EE0 +4440 +FAA0 +4FE0 +6820 +4780 +C480 +4FC0 +4840 +CFC0 +ENDCHAR +STARTCHAR U_651B +ENCODING 25883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F4A0 +4EC0 +4840 +6FC0 +C940 +56C0 +5B40 +56C0 +DB20 +ENDCHAR +STARTCHAR U_651C +ENCODING 25884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +FFE0 +2500 +2FE0 +3500 +EFE0 +2AA0 +2FE0 +AAA0 +6BA0 +ENDCHAR +STARTCHAR U_651D +ENCODING 25885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F7C0 +2440 +2FE0 +3040 +EFE0 +2AA0 +2EE0 +AAA0 +7FE0 +ENDCHAR +STARTCHAR U_651E +ENCODING 25886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EFE0 +4A40 +77E0 +5A40 +CBE0 +5E40 +43E0 +6A40 +D7E0 +ENDCHAR +STARTCHAR U_651F +ENCODING 25887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F540 +5FC0 +54A0 +77E0 +D4A0 +57E0 +55A0 +D6E0 +67E0 +ENDCHAR +STARTCHAR U_6520 +ENCODING 25888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +2FE0 +2A40 +3FE0 +EA80 +2EE0 +2A80 +AEE0 +7280 +ENDCHAR +STARTCHAR U_6521 +ENCODING 25889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +3F40 +F5E0 +2B40 +35E0 +FF40 +2940 +3FE0 +2B40 +ED40 +23E0 +ENDCHAR +STARTCHAR U_6522 +ENCODING 25890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2AA0 +37C0 +E440 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_6523 +ENCODING 25891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FA0 +E040 +5FE0 +F940 +2FA0 +5200 +3FC0 +0200 +7FE0 +0600 +ENDCHAR +STARTCHAR U_6524 +ENCODING 25892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +5F40 +EBE0 +4540 +5FE0 +7540 +DF40 +45E0 +5F40 +4D40 +D3E0 +ENDCHAR +STARTCHAR U_6525 +ENCODING 25893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3540 +F7C0 +2440 +37C0 +6440 +BFE0 +2AA0 +2FC0 +A540 +7B20 +ENDCHAR +STARTCHAR U_6526 +ENCODING 25894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +FEE0 +2AA0 +2FE0 +3AA0 +EFE0 +2CA0 +2EC0 +B4A0 +66E0 +ENDCHAR +STARTCHAR U_6527 +ENCODING 25895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5C80 +E9E0 +5D20 +55E0 +7D20 +55E0 +DD20 +55E0 +7EA0 +D520 +ENDCHAR +STARTCHAR U_6528 +ENCODING 25896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F4A0 +4FC0 +5A80 +6B40 +4AA0 +FFE0 +5540 +59A0 +D540 +ENDCHAR +STARTCHAR U_6529 +ENCODING 25897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +FAA0 +2280 +2FE0 +3AA0 +EFE0 +2100 +2FE0 +A540 +6AA0 +ENDCHAR +STARTCHAR U_652A +ENCODING 25898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D60 +2AA0 +FD60 +2AA0 +3FE0 +2C60 +E7C0 +2440 +27C0 +A2A0 +7CE0 +ENDCHAR +STARTCHAR U_652B +ENCODING 25899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2EE0 +FAA0 +2FE0 +2900 +3FE0 +E900 +2FE0 +2440 +2380 +DC60 +ENDCHAR +STARTCHAR U_652C +ENCODING 25900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B40 +FFE0 +2AA0 +2FE0 +3440 +E7C0 +2440 +27C0 +A2A0 +6CE0 +ENDCHAR +STARTCHAR U_652D +ENCODING 25901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +FFE0 +2540 +3B80 +2540 +FFE0 +2AA0 +3FE0 +AAA0 +7DE0 +ENDCHAR +STARTCHAR U_652E +ENCODING 25902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2920 +3FE0 +2480 +EFC0 +2480 +3FE0 +ACA0 +7660 +ENDCHAR +STARTCHAR U_652F +ENCODING 25903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3F80 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6530 +ENCODING 25904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2120 +F920 +8920 +4920 +5220 +22A0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_6531 +ENCODING 25905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +0100 +97C0 +5440 +5440 +2280 +1900 +E280 +1C60 +ENDCHAR +STARTCHAR U_6532 +ENCODING 25906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +53E0 +8880 +FFE0 +0A20 +E940 +A940 +E880 +0940 +3A20 +ENDCHAR +STARTCHAR U_6533 +ENCODING 25907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +FBE0 +2020 +FFE0 +52A0 +5FE0 +5440 +22C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_6534 +ENCODING 25908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +0400 +7FC0 +1080 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6535 +ENCODING 25909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FC0 +2100 +2100 +5100 +8A00 +0400 +0A00 +1180 +E060 +ENDCHAR +STARTCHAR U_6536 +ENCODING 25910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +93E0 +9440 +9A40 +9240 +B280 +D100 +9180 +1240 +1420 +ENDCHAR +STARTCHAR U_6537 +ENCODING 25911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +43E0 +4440 +8A40 +F280 +1280 +1100 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_6538 +ENCODING 25912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21E0 +2A40 +6E40 +AA40 +2940 +2940 +2080 +2340 +2C20 +ENDCHAR +STARTCHAR U_6539 +ENCODING 25913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +0BE0 +0C40 +7A40 +4240 +4240 +4180 +5180 +6240 +4C20 +ENDCHAR +STARTCHAR U_653A +ENCODING 25914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9440 +F440 +8A80 +8100 +9100 +A280 +C440 +9820 +ENDCHAR +STARTCHAR U_653B +ENCODING 25915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +FA00 +27E0 +2440 +2C40 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_653C +ENCODING 25916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2240 +2440 +FA80 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_653D +ENCODING 25917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +4900 +4BE0 +8640 +7A40 +2940 +2940 +2880 +4940 +9A20 +ENDCHAR +STARTCHAR U_653E +ENCODING 25918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2240 +2540 +3940 +2940 +2880 +4980 +4A40 +9420 +ENDCHAR +STARTCHAR U_653F +ENCODING 25919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +11E0 +1340 +5D40 +5140 +5140 +5080 +5C80 +E140 +0620 +ENDCHAR +STARTCHAR U_6540 +ENCODING 25920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43E0 +F240 +9240 +9440 +FA40 +9280 +9100 +F280 +0440 +0820 +ENDCHAR +STARTCHAR U_6541 +ENCODING 25921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +3900 +2100 +27C0 +FA40 +8A40 +8940 +8880 +F940 +0620 +ENDCHAR +STARTCHAR U_6542 +ENCODING 25922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +7DE0 +8520 +7620 +5520 +5520 +7540 +0480 +1540 +0A20 +ENDCHAR +STARTCHAR U_6543 +ENCODING 25923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +89E0 +FB40 +9140 +FD40 +9140 +9140 +9480 +AD40 +C620 +ENDCHAR +STARTCHAR U_6544 +ENCODING 25924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0900 +53E0 +2240 +FC40 +2A40 +6280 +A180 +2100 +2280 +6C60 +ENDCHAR +STARTCHAR U_6545 +ENCODING 25925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +1140 +1240 +7D40 +4940 +4880 +4880 +7940 +4E20 +ENDCHAR +STARTCHAR U_6546 +ENCODING 25926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +44E0 +8080 +3BE0 +0120 +7D20 +44C0 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6547 +ENCODING 25927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +7D20 +5620 +5540 +5D40 +1080 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_6548 +ENCODING 25928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2B40 +4540 +8940 +2940 +1080 +2880 +4140 +8620 +ENDCHAR +STARTCHAR U_6549 +ENCODING 25929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +71E0 +2340 +FD40 +2140 +7140 +6940 +A080 +2340 +2C20 +ENDCHAR +STARTCHAR U_654A +ENCODING 25930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1CE0 +1080 +FFE0 +1220 +1220 +5940 +5540 +9480 +1140 +3220 +ENDCHAR +STARTCHAR U_654B +ENCODING 25931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +8BE0 +5240 +2240 +5440 +8240 +7A80 +4900 +4A80 +7C60 +ENDCHAR +STARTCHAR U_654C +ENCODING 25932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +21E0 +FA40 +2540 +2140 +F940 +8880 +8880 +F940 +8E20 +ENDCHAR +STARTCHAR U_654D +ENCODING 25933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +51C0 +8900 +7100 +27C0 +FA40 +2280 +7100 +AA80 +6460 +ENDCHAR +STARTCHAR U_654E +ENCODING 25934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2100 +D900 +23E0 +FA40 +4440 +BA80 +1280 +F900 +1280 +3460 +ENDCHAR +STARTCHAR U_654F +ENCODING 25935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +81E0 +7F40 +5540 +FF40 +5540 +5540 +FE80 +0540 +1A20 +ENDCHAR +STARTCHAR U_6550 +ENCODING 25936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8100 +B9E0 +8240 +FE40 +A140 +B540 +A880 +A480 +B540 +A220 +ENDCHAR +STARTCHAR U_6551 +ENCODING 25937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1500 +FDE0 +1240 +5540 +3940 +5540 +9480 +1080 +1140 +3220 +ENDCHAR +STARTCHAR U_6552 +ENCODING 25938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +7EE0 +6B20 +FF20 +6AA0 +7EA0 +4840 +4840 +4840 +49A0 +ENDCHAR +STARTCHAR U_6553 +ENCODING 25939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2900 +7DE0 +4640 +4540 +7D40 +2940 +2940 +2A80 +4D40 +8A20 +ENDCHAR +STARTCHAR U_6554 +ENCODING 25940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +1100 +79E0 +2B40 +2940 +FD40 +0140 +7D40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6555 +ENCODING 25941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7E40 +5540 +7D40 +1140 +3940 +5480 +9140 +1220 +ENDCHAR +STARTCHAR U_6556 +ENCODING 25942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7E40 +1140 +FD40 +2140 +3D40 +2480 +4540 +9A20 +ENDCHAR +STARTCHAR U_6557 +ENCODING 25943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +7DE0 +4740 +7D40 +4540 +7D40 +4540 +2880 +4540 +8620 +ENDCHAR +STARTCHAR U_6558 +ENCODING 25944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +BB40 +1140 +7D40 +1140 +5940 +5480 +9340 +3220 +ENDCHAR +STARTCHAR U_6559 +ENCODING 25945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +FD00 +29E0 +FF40 +1140 +7D40 +4940 +9D40 +7080 +1140 +7220 +ENDCHAR +STARTCHAR U_655A +ENCODING 25946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FBE0 +8E40 +8A40 +FA80 +5280 +5100 +5A80 +5240 +8C20 +ENDCHAR +STARTCHAR U_655B +ENCODING 25947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +BB40 +0140 +2540 +9540 +4940 +4080 +1D40 +E220 +ENDCHAR +STARTCHAR U_655C +ENCODING 25948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +65E0 +9240 +7E40 +0940 +1140 +2880 +6280 +A540 +3E20 +ENDCHAR +STARTCHAR U_655D +ENCODING 25949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +6900 +21E0 +FD40 +A740 +B540 +ED40 +A540 +A480 +A540 +8E20 +ENDCHAR +STARTCHAR U_655E +ENCODING 25950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +5900 +11E0 +FD40 +8740 +BD40 +AD40 +AC80 +BC80 +8540 +8E20 +ENDCHAR +STARTCHAR U_655F +ENCODING 25951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2900 +FFE0 +AA40 +FE40 +AA40 +AB40 +FE80 +0080 +4540 +8220 +ENDCHAR +STARTCHAR U_6560 +ENCODING 25952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2480 +B4E0 +4880 +B480 +03E0 +FD20 +2540 +B480 +4940 +B620 +ENDCHAR +STARTCHAR U_6561 +ENCODING 25953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7CE0 +4480 +7FE0 +2220 +7D20 +AD40 +5480 +A540 +4E20 +ENDCHAR +STARTCHAR U_6562 +ENCODING 25954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +1100 +FDE0 +4B40 +7940 +4940 +7940 +4940 +5C80 +E940 +0A20 +ENDCHAR +STARTCHAR U_6563 +ENCODING 25955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7D00 +29E0 +FF40 +4940 +7940 +4940 +7940 +4880 +4940 +5A20 +ENDCHAR +STARTCHAR U_6564 +ENCODING 25956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A8E0 +F880 +ABE0 +FA20 +2220 +FD40 +3140 +6880 +A540 +2220 +ENDCHAR +STARTCHAR U_6565 +ENCODING 25957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +A8E0 +3080 +4BE0 +A620 +2220 +A940 +A940 +5080 +4940 +8620 +ENDCHAR +STARTCHAR U_6566 +ENCODING 25958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +49E0 +7B40 +0140 +FD40 +1140 +FD40 +1080 +5140 +2220 +ENDCHAR +STARTCHAR U_6567 +ENCODING 25959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCE0 +3080 +4880 +FFE0 +0940 +E940 +A940 +E880 +0940 +3A20 +ENDCHAR +STARTCHAR U_6568 +ENCODING 25960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +4B40 +3140 +FD40 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_6569 +ENCODING 25961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +9500 +4900 +FEE0 +8240 +7D40 +0940 +FC80 +1080 +1140 +3220 +ENDCHAR +STARTCHAR U_656A +ENCODING 25962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B480 +48E0 +B480 +03E0 +FD40 +2540 +B540 +4880 +B540 +2620 +ENDCHAR +STARTCHAR U_656B +ENCODING 25963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +45E0 +7F40 +4540 +7D40 +2140 +FF40 +2880 +4940 +9A20 +ENDCHAR +STARTCHAR U_656C +ENCODING 25964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FD00 +29E0 +4340 +7D40 +8540 +7540 +5540 +7480 +0540 +1A20 +ENDCHAR +STARTCHAR U_656D +ENCODING 25965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +99E0 +FA40 +0140 +FD40 +4140 +FC80 +5480 +A540 +4E20 +ENDCHAR +STARTCHAR U_656E +ENCODING 25966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7080 +10E0 +FE80 +11E0 +5720 +92A0 +D6C0 +9240 +FEA0 +0120 +ENDCHAR +STARTCHAR U_656F +ENCODING 25967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +FCE0 +9080 +FFE0 +8940 +7D40 +4540 +7C80 +4540 +7E20 +ENDCHAR +STARTCHAR U_6570 +ENCODING 25968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +5900 +FDE0 +3340 +5940 +9540 +FD40 +2940 +6880 +1140 +EE20 +ENDCHAR +STARTCHAR U_6571 +ENCODING 25969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +F8E0 +0080 +F880 +03E0 +FA20 +8A40 +F940 +9080 +5940 +E620 +ENDCHAR +STARTCHAR U_6572 +ENCODING 25970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FEE0 +0080 +7880 +4BE0 +7940 +0140 +FF40 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_6573 +ENCODING 25971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +9500 +FDE0 +0340 +F940 +0140 +F940 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_6574 +ENCODING 25972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +7C80 +3940 +5620 +7FC0 +0400 +2780 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6575 +ENCODING 25973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +29E0 +FF40 +9240 +FE40 +9240 +BB40 +AA80 +BB40 +8220 +ENDCHAR +STARTCHAR U_6576 +ENCODING 25974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +A4E0 +BF20 +D520 +BF20 +B5C0 +FE40 +8C40 +96A0 +A520 +ENDCHAR +STARTCHAR U_6577 +ENCODING 25975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +5100 +7FE0 +5240 +7E40 +5240 +FE40 +2140 +3C80 +2540 +CA20 +ENDCHAR +STARTCHAR U_6578 +ENCODING 25976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +55E0 +FF40 +5540 +FD40 +9540 +FF40 +2880 +1940 +E620 +ENDCHAR +STARTCHAR U_6579 +ENCODING 25977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +FDE0 +8740 +7D40 +9540 +5940 +FD40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_657A +ENCODING 25978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +80E0 +BC80 +A480 +BFE0 +8140 +EF40 +AB40 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_657B +ENCODING 25979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +FFE0 +4920 +7FE0 +2C40 +2340 +1F80 +6880 +0F00 +F0E0 +ENDCHAR +STARTCHAR U_657C +ENCODING 25980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +FE80 +45E0 +7D40 +2940 +FF40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_657D +ENCODING 25981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +FCE0 +4880 +FC80 +4BE0 +FD20 +D540 +F480 +8540 +8E20 +ENDCHAR +STARTCHAR U_657E +ENCODING 25982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +F9E0 +2240 +FE40 +2940 +FD40 +0080 +F880 +8940 +FA20 +ENDCHAR +STARTCHAR U_657F +ENCODING 25983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +1100 +FDE0 +2740 +7D40 +A540 +FF40 +AB40 +BA80 +8340 +8620 +ENDCHAR +STARTCHAR U_6580 +ENCODING 25984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +2080 +7FE0 +A2A0 +FAA0 +AAA0 +FA40 +2AA0 +F520 +ENDCHAR +STARTCHAR U_6581 +ENCODING 25985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FFE0 +1140 +FF40 +2940 +FD40 +1140 +FE80 +1140 +1220 +ENDCHAR +STARTCHAR U_6582 +ENCODING 25986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +2500 +7DE0 +8340 +7D40 +5540 +7D40 +2940 +2880 +5540 +9220 +ENDCHAR +STARTCHAR U_6583 +ENCODING 25987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +55E0 +FF20 +BAC0 +D720 +9220 +FFE0 +4640 +AB80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_6584 +ENCODING 25988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +1340 +FC80 +5540 +FFE0 +4200 +7FE0 +5240 +6FA0 +4A80 +B260 +ENDCHAR +STARTCHAR U_6585 +ENCODING 25989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6680 +5AE0 +6680 +5A80 +FFE0 +8220 +7940 +1080 +7D40 +1160 +3240 +ENDCHAR +STARTCHAR U_6586 +ENCODING 25990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C80 +5480 +6DE0 +5520 +FF20 +82A0 +38A0 +1040 +7C40 +10A0 +3320 +ENDCHAR +STARTCHAR U_6587 +ENCODING 25991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +1100 +1100 +0A00 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6588 +ENCODING 25992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +DF60 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6589 +ENCODING 25993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +E0E0 +3F80 +2080 +3F80 +2080 +4080 +ENDCHAR +STARTCHAR U_658A +ENCODING 25994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +FFE0 +2080 +3F80 +2080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_658B +ENCODING 25995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +F1E0 +0000 +FFC0 +0400 +7FC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_658C +ENCODING 25996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +27A0 +F080 +1FE0 +9280 +5280 +2B80 +3AA0 +4BA0 +9C60 +0020 +ENDCHAR +STARTCHAR U_658D +ENCODING 25997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3F80 +D160 +1F00 +1100 +1F00 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_658E +ENCODING 25998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +DF60 +4040 +7FC0 +5540 +64C0 +8C40 +ENDCHAR +STARTCHAR U_658F +ENCODING 25999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFC0 +1440 +97C0 +5440 +27C0 +5520 +54C0 +8C80 +0660 +ENDCHAR +STARTCHAR U_6590 +ENCODING 26000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_6591 +ENCODING 26001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E9E0 +4440 +5F40 +4240 +EA40 +45E0 +4440 +4640 +6A40 +D040 +23E0 +ENDCHAR +STARTCHAR U_6592 +ENCODING 26002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2820 +AFE0 +6800 +2FE0 +2AA0 +5FE0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_6593 +ENCODING 26003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2A20 +F920 +2FE0 +A920 +6FE0 +2AA0 +2FE0 +5920 +8BA0 +0D60 +ENDCHAR +STARTCHAR U_6594 +ENCODING 26004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FEE0 +54A0 +24A0 +DEE0 +24A0 +FFE0 +A8A0 +F940 +2A20 +F420 +ENDCHAR +STARTCHAR U_6595 +ENCODING 26005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +A920 +6FE0 +2AA0 +2FE0 +5920 +8BA0 +0D60 +ENDCHAR +STARTCHAR U_6596 +ENCODING 26006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +F5E0 +5F40 +71C0 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_6597 +ENCODING 26007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0900 +0900 +2100 +1100 +1100 +01E0 +FF00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_6598 +ENCODING 26008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +3D40 +4440 +4A40 +6940 +9860 +17C0 +2040 +4040 +8040 +ENDCHAR +STARTCHAR U_6599 +ENCODING 26009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AC80 +7280 +2080 +FC80 +2280 +30E0 +6F80 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_659A +ENCODING 26010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +FBE0 +0000 +FFE0 +9220 +0A00 +6600 +13E0 +FE00 +0200 +ENDCHAR +STARTCHAR U_659B +ENCODING 26011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7A40 +5140 +FC40 +5640 +7D40 +5460 +7DC0 +5440 +5440 +8C40 +ENDCHAR +STARTCHAR U_659C +ENCODING 26012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +2940 +44C0 +B840 +1240 +7D40 +1060 +55C0 +5240 +9240 +3040 +ENDCHAR +STARTCHAR U_659D +ENCODING 26013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +FFC0 +9240 +4A00 +2200 +03C0 +FE00 +0200 +ENDCHAR +STARTCHAR U_659E +ENCODING 26014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +DD40 +94C0 +DC40 +9540 +FCC0 +1060 +2BC0 +2440 +4440 +8040 +ENDCHAR +STARTCHAR U_659F +ENCODING 26015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +FD40 +48C0 +7A40 +4940 +7940 +4860 +FFC0 +A840 +C440 +FE40 +ENDCHAR +STARTCHAR U_65A0 +ENCODING 26016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +FEC0 +2840 +7D40 +28C0 +FE40 +5460 +7DC0 +5440 +FE40 +4C40 +ENDCHAR +STARTCHAR U_65A1 +ENCODING 26017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA40 +2420 +F940 +88C0 +FA40 +8940 +F860 +27C0 +F840 +2040 +ENDCHAR +STARTCHAR U_65A2 +ENCODING 26018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +FF40 +28C0 +FE40 +1140 +7CC0 +5460 +7DC0 +5440 +7C40 +C640 +ENDCHAR +STARTCHAR U_65A3 +ENCODING 26019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +AB40 +FEC0 +4140 +FEC0 +A3E0 +FA40 +AA40 +FA40 +2640 +FA40 +ENDCHAR +STARTCHAR U_65A4 +ENCODING 26020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +2000 +3FE0 +2100 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_65A5 +ENCODING 26021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +2000 +3FE0 +2200 +2700 +2280 +2240 +4200 +8200 +ENDCHAR +STARTCHAR U_65A6 +ENCODING 26022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +6180 +4100 +79E0 +5140 +5140 +5140 +5140 +5240 +9240 +9440 +ENDCHAR +STARTCHAR U_65A7 +ENCODING 26023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +6960 +0600 +1980 +E060 +1F80 +1000 +1FC0 +2100 +4100 +ENDCHAR +STARTCHAR U_65A8 +ENCODING 26024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +4B80 +4A00 +7A00 +0BE0 +FA40 +4A40 +4A40 +4A40 +4A40 +8C40 +ENDCHAR +STARTCHAR U_65A9 +ENCODING 26025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +4200 +5200 +93E0 +FA40 +1240 +1A40 +F240 +1440 +1840 +ENDCHAR +STARTCHAR U_65AA +ENCODING 26026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7B80 +8A00 +0A00 +EBE0 +AA40 +AA40 +EA40 +0A40 +4A40 +3440 +ENDCHAR +STARTCHAR U_65AB +ENCODING 26027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FBC0 +2200 +2200 +7BE0 +CA40 +4A40 +4A40 +7C40 +4840 +1040 +ENDCHAR +STARTCHAR U_65AC +ENCODING 26028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2200 +FA00 +ABE0 +FA40 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_65AD +ENCODING 26029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +D580 +B900 +9100 +FDE0 +B140 +D940 +D540 +9140 +FA40 +0440 +ENDCHAR +STARTCHAR U_65AE +ENCODING 26030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +5380 +FE00 +5200 +FFE0 +0240 +7A40 +4A40 +7A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_65AF +ENCODING 26031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +FD80 +4900 +7900 +49E0 +7940 +4940 +FD40 +2940 +4640 +8440 +ENDCHAR +STARTCHAR U_65B0 +ENCODING 26032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +4500 +2900 +FDE0 +1140 +FD40 +1140 +5540 +9240 +3440 +ENDCHAR +STARTCHAR U_65B1 +ENCODING 26033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2580 +F500 +2900 +FDE0 +2140 +7940 +C940 +7A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_65B2 +ENCODING 26034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE60 +AB80 +EF00 +29E0 +ED40 +8540 +ED40 +2940 +2940 +3E40 +C240 +ENDCHAR +STARTCHAR U_65B3 +ENCODING 26035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FFC0 +2900 +2900 +7DE0 +5540 +FF40 +1140 +7D40 +1240 +FC40 +ENDCHAR +STARTCHAR U_65B4 +ENCODING 26036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +54C0 +FE80 +5480 +B2E0 +A2A0 +EFA0 +AAA0 +6FA0 +42A0 +8320 +ENDCHAR +STARTCHAR U_65B5 +ENCODING 26037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE60 +AA80 +F280 +4480 +FCE0 +50A0 +DCA0 +84A0 +DD20 +5120 +7A20 +ENDCHAR +STARTCHAR U_65B6 +ENCODING 26038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +CAA0 +8FE0 +8400 +FFE0 +B220 +AFA0 +AAA0 +AFA0 +A2A0 +AF40 +ENDCHAR +STARTCHAR U_65B7 +ENCODING 26039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +FD80 +9500 +AB00 +FFE0 +A940 +AB40 +FD40 +9540 +AB40 +FE40 +ENDCHAR +STARTCHAR U_65B8 +ENCODING 26040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +85C0 +FD00 +A9E0 +FD40 +9540 +FD40 +D540 +FD40 +9540 +FA40 +ENDCHAR +STARTCHAR U_65B9 +ENCODING 26041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0800 +0800 +0F80 +1080 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_65BA +ENCODING 26042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FD40 +2140 +3A20 +2940 +2940 +4940 +4A40 +AA40 +9440 +ENDCHAR +STARTCHAR U_65BB +ENCODING 26043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +4400 +7B80 +4A80 +4A80 +4A80 +4A80 +6AA0 +9460 +ENDCHAR +STARTCHAR U_65BC +ENCODING 26044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FD40 +2140 +3A20 +2C80 +2840 +2840 +4900 +4880 +9840 +ENDCHAR +STARTCHAR U_65BD +ENCODING 26045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2080 +3AE0 +2BA0 +2EA0 +2AE0 +2A80 +4A20 +91E0 +ENDCHAR +STARTCHAR U_65BE +ENCODING 26046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +FD00 +4900 +77E0 +5520 +5520 +5520 +55A0 +B540 +0100 +ENDCHAR +STARTCHAR U_65BF +ENCODING 26047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +23E0 +3840 +2880 +2FE0 +2880 +4880 +6A80 +9100 +ENDCHAR +STARTCHAR U_65C0 +ENCODING 26048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA40 +47E0 +7100 +5140 +5540 +5520 +5920 +9100 +B300 +ENDCHAR +STARTCHAR U_65C1 +ENCODING 26049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +1200 +FFC0 +8840 +0400 +FFC0 +1000 +1F80 +2080 +C300 +ENDCHAR +STARTCHAR U_65C2 +ENCODING 26050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2040 +3B80 +2A00 +2BE0 +2A40 +2A40 +4A40 +9440 +ENDCHAR +STARTCHAR U_65C3 +ENCODING 26051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +43C0 +7240 +5340 +52C0 +57E0 +5240 +9440 +A8C0 +ENDCHAR +STARTCHAR U_65C4 +ENCODING 26052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +20C0 +3B80 +28E0 +2B80 +28E0 +2F80 +48A0 +90E0 +ENDCHAR +STARTCHAR U_65C5 +ENCODING 26053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FE00 +24C0 +3B00 +2AA0 +2AC0 +2A80 +4A40 +4A40 +9B20 +ENDCHAR +STARTCHAR U_65C6 +ENCODING 26054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC80 +27E0 +3880 +2BE0 +2AA0 +2AA0 +2AA0 +4AE0 +9080 +ENDCHAR +STARTCHAR U_65C7 +ENCODING 26055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F480 +4FE0 +44A0 +75C0 +5540 +5540 +5480 +9540 +BA20 +ENDCHAR +STARTCHAR U_65C8 +ENCODING 26056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +4240 +77E0 +5020 +5540 +5540 +5540 +9540 +A960 +ENDCHAR +STARTCHAR U_65C9 +ENCODING 26057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +4440 +7FC0 +4440 +7FC0 +54C0 +FFE0 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_65CA +ENCODING 26058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +47E0 +4200 +7BC0 +4A40 +4B40 +4A40 +6B60 +9660 +ENDCHAR +STARTCHAR U_65CB +ENCODING 26059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +47E0 +78A0 +4A80 +4AE0 +4A80 +4A80 +AD80 +90E0 +ENDCHAR +STARTCHAR U_65CC +ENCODING 26060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2280 +3BE0 +2C80 +2880 +2BE0 +2880 +4880 +97E0 +ENDCHAR +STARTCHAR U_65CD +ENCODING 26061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC80 +4140 +7A20 +4C80 +4FE0 +4840 +4A80 +A900 +9080 +ENDCHAR +STARTCHAR U_65CE +ENCODING 26062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FC00 +47E0 +7420 +57E0 +5520 +5540 +5580 +9520 +A8E0 +ENDCHAR +STARTCHAR U_65CF +ENCODING 26063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2200 +3BE0 +2C80 +2880 +4FE0 +4880 +A940 +9620 +ENDCHAR +STARTCHAR U_65D0 +ENCODING 26064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +4280 +7AA0 +56C0 +5280 +56C0 +5AA0 +94A0 +A860 +ENDCHAR +STARTCHAR U_65D1 +ENCODING 26065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +4280 +77E0 +5040 +5740 +5540 +5740 +9040 +30C0 +ENDCHAR +STARTCHAR U_65D2 +ENCODING 26066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FD00 +47E0 +7240 +57A0 +5000 +5540 +5540 +9540 +A860 +ENDCHAR +STARTCHAR U_65D3 +ENCODING 26067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FEA0 +21C0 +3880 +2BE0 +2A20 +2BE0 +2A20 +4BE0 +B260 +ENDCHAR +STARTCHAR U_65D4 +ENCODING 26068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +F540 +47E0 +7540 +5BC0 +5500 +5500 +5FE0 +5500 +ABE0 +ENDCHAR +STARTCHAR U_65D5 +ENCODING 26069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +2240 +7DA0 +4900 +9880 +0200 +7A40 +4B80 +7A20 +4BE0 +ENDCHAR +STARTCHAR U_65D6 +ENCODING 26070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +17E0 +F900 +47E0 +7280 +5FE0 +5040 +5740 +5540 +9740 +A0C0 +ENDCHAR +STARTCHAR U_65D7 +ENCODING 26071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FA40 +47E0 +7240 +5340 +52C0 +5240 +5FE0 +9240 +AC20 +ENDCHAR +STARTCHAR U_65D8 +ENCODING 26072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FC0 +EAA0 +5FE0 +7080 +57A0 +5540 +5740 +5540 +97A0 +A120 +ENDCHAR +STARTCHAR U_65D9 +ENCODING 26073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2F40 +F580 +4FE0 +4380 +7540 +57C0 +5540 +57C0 +9540 +A7C0 +ENDCHAR +STARTCHAR U_65DA +ENCODING 26074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FE80 +4FE0 +7AA0 +4AA0 +4FE0 +4800 +4FE0 +AAC0 +95A0 +ENDCHAR +STARTCHAR U_65DB +ENCODING 26075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FD40 +47E0 +7B40 +5520 +57C0 +5540 +57C0 +9540 +A7C0 +ENDCHAR +STARTCHAR U_65DC +ENCODING 26076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27E0 +F500 +4FE0 +76C0 +5540 +57C0 +5000 +57C0 +D540 +2FE0 +ENDCHAR +STARTCHAR U_65DD +ENCODING 26077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FA80 +4440 +7FE0 +5AA0 +5FE0 +5240 +53C0 +9240 +A3C0 +ENDCHAR +STARTCHAR U_65DE +ENCODING 26078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +F940 +47E0 +72A0 +5D40 +56C0 +5560 +5740 +9480 +ABE0 +ENDCHAR +STARTCHAR U_65DF +ENCODING 26079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F900 +4FE0 +7920 +4FE0 +4AA0 +4AA0 +4FE0 +9280 +AC60 +ENDCHAR +STARTCHAR U_65E0 +ENCODING 26080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_65E1 +ENCODING 26081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0400 +4400 +4400 +FFC0 +0800 +0C00 +1400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_65E2 +ENCODING 26082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9100 +9500 +F500 +9FC0 +F100 +A100 +9300 +AD40 +C940 +90C0 +ENDCHAR +STARTCHAR U_65E3 +ENCODING 26083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7C0 +9100 +F500 +97E0 +F100 +8300 +E300 +8520 +A520 +C8E0 +ENDCHAR +STARTCHAR U_65E4 +ENCODING 26084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4880 +6A80 +6A80 +FFE0 +8480 +F480 +D480 +F5A0 +86A0 +8CE0 +ENDCHAR +STARTCHAR U_65E5 +ENCODING 26085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +82 +82 +82 +FE +82 +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_65E6 +ENCODING 26086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +0000 +FFE0 +ENDCHAR +STARTCHAR U_65E7 +ENCODING 26087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +9F80 +9080 +9080 +9080 +9F80 +9080 +9080 +9080 +9080 +9F80 +ENDCHAR +STARTCHAR U_65E8 +ENCODING 26088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8300 +9C00 +E080 +8080 +7F80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_65E9 +ENCODING 26089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_65EA +ENCODING 26090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +9FE0 +F100 +9100 +9100 +F100 +9100 +0100 +ENDCHAR +STARTCHAR U_65EB +ENCODING 26091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +F7C0 +9240 +9240 +F240 +9240 +9240 +9240 +F240 +0540 +0880 +ENDCHAR +STARTCHAR U_65EC +ENCODING 26092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +2000 +3FC0 +4040 +BE40 +2240 +3E40 +2240 +3E40 +0140 +0080 +ENDCHAR +STARTCHAR U_65ED +ENCODING 26093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +2BC0 +2A40 +2A40 +2BC0 +2800 +4820 +87E0 +ENDCHAR +STARTCHAR U_65EE +ENCODING 26094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +1120 +2120 +C0E0 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_65EF +ENCODING 26095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +1000 +FE00 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_65F0 +ENCODING 26096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +F100 +9FE0 +9100 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_65F1 +ENCODING 26097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_65F2 +ENCODING 26098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_65F3 +ENCODING 26099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9420 +F820 +9220 +9120 +F120 +9020 +0120 +00C0 +ENDCHAR +STARTCHAR U_65F4 +ENCODING 26100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9100 +9100 +FFE0 +9100 +9100 +9100 +F900 +0500 +0200 +ENDCHAR +STARTCHAR U_65F5 +ENCODING 26101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +0400 +8440 +8440 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_65F6 +ENCODING 26102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +9FE0 +9080 +9480 +F280 +9280 +9080 +9080 +F080 +0380 +ENDCHAR +STARTCHAR U_65F7 +ENCODING 26103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9400 +F400 +9400 +9400 +F400 +9400 +0800 +1000 +ENDCHAR +STARTCHAR U_65F8 +ENCODING 26104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0080 +F100 +97E0 +92A0 +F2A0 +9520 +9920 +F220 +0C20 +00C0 +ENDCHAR +STARTCHAR U_65F9 +ENCODING 26105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_65FA +ENCODING 26106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9100 +F100 +97C0 +9100 +9100 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_65FB +ENCODING 26107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +0A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_65FC +ENCODING 26108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +F440 +9280 +9280 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_65FD +ENCODING 26109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F540 +9540 +97C0 +F100 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_65FE +ENCODING 26110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2480 +3FA0 +0420 +3FE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_65FF +ENCODING 26111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F3E0 +9480 +9880 +F080 +9FE0 +9080 +F080 +9080 +0080 +ENDCHAR +STARTCHAR U_6600 +ENCODING 26112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +9420 +9A20 +F120 +9020 +91A0 +F620 +90A0 +0040 +ENDCHAR +STARTCHAR U_6601 +ENCODING 26113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97E0 +F520 +9520 +9520 +F520 +95A0 +0540 +0100 +ENDCHAR +STARTCHAR U_6602 +ENCODING 26114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1000 +E780 +8480 +9480 +E580 +0400 +ENDCHAR +STARTCHAR U_6603 +ENCODING 26115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +0000 +7FE0 +4200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_6604 +ENCODING 26116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +F7E0 +9440 +9440 +F680 +9900 +0A80 +1460 +ENDCHAR +STARTCHAR U_6605 +ENCODING 26117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F240 +9240 +9280 +F2E0 +9240 +9240 +F540 +9880 +1140 +2620 +ENDCHAR +STARTCHAR U_6606 +ENCODING 26118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +0000 +8480 +F500 +8640 +B440 +C3C0 +ENDCHAR +STARTCHAR U_6607 +ENCODING 26119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +7900 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_6608 +ENCODING 26120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9420 +F420 +97E0 +9420 +F400 +9400 +0800 +1000 +ENDCHAR +STARTCHAR U_6609 +ENCODING 26121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9200 +F3C0 +9240 +9240 +F240 +9440 +0540 +1880 +ENDCHAR +STARTCHAR U_660A +ENCODING 26122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_660B +ENCODING 26123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0800 +FFE0 +1100 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_660C +ENCODING 26124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7E +42 +7E +42 +7E +00 +FF +81 +FF +81 +FF +ENDCHAR +STARTCHAR U_660D +ENCODING 26125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +F7C0 +9440 +9440 +9440 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_660E +ENCODING 26126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F220 +9220 +93E0 +F220 +9220 +93E0 +F220 +0420 +08A0 +3040 +ENDCHAR +STARTCHAR U_660F +ENCODING 26127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +8800 +FFC0 +8400 +B240 +C1C0 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_6610 +ENCODING 26128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9820 +F7C0 +9240 +9240 +F240 +9240 +0540 +1880 +ENDCHAR +STARTCHAR U_6611 +ENCODING 26129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +FA20 +9100 +97E0 +F040 +9080 +0080 +0100 +ENDCHAR +STARTCHAR U_6612 +ENCODING 26130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +92A0 +F2A0 +94A0 +98A0 +F120 +9220 +0420 +08C0 +ENDCHAR +STARTCHAR U_6613 +ENCODING 26131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2000 +3FC0 +4A40 +9240 +2440 +4980 +ENDCHAR +STARTCHAR U_6614 +ENCODING 26132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6615 +ENCODING 26133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +F7E0 +9480 +9480 +F480 +9480 +0880 +1080 +ENDCHAR +STARTCHAR U_6616 +ENCODING 26134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9480 +9480 +F840 +9A40 +9220 +9200 +F480 +9FC0 +0440 +ENDCHAR +STARTCHAR U_6617 +ENCODING 26135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0000 +0900 +10C0 +6040 +ENDCHAR +STARTCHAR U_6618 +ENCODING 26136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1000 +1F80 +2080 +C380 +ENDCHAR +STARTCHAR U_6619 +ENCODING 26137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0000 +FFE0 +1080 +3FC0 +ENDCHAR +STARTCHAR U_661A +ENCODING 26138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4440 +2A80 +1100 +3F80 +D0E0 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_661B +ENCODING 26139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F400 +9400 +97C0 +F440 +9440 +97C0 +9400 +F400 +9400 +07E0 +ENDCHAR +STARTCHAR U_661C +ENCODING 26140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1000 +3FC0 +4940 +9240 +2440 +0980 +ENDCHAR +STARTCHAR U_661D +ENCODING 26141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +45C0 +A920 +1900 +3FE0 +D080 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_661E +ENCODING 26142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +9100 +97E0 +F520 +9520 +96A0 +9460 +F420 +9420 +0460 +ENDCHAR +STARTCHAR U_661F +ENCODING 26143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2400 +7FC0 +8400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6620 +ENCODING 26144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9540 +F540 +9540 +9FE0 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_6621 +ENCODING 26145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +9100 +F240 +9680 +9100 +F100 +9240 +0FE0 +0420 +ENDCHAR +STARTCHAR U_6622 +ENCODING 26146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +9520 +9520 +F7E0 +9100 +9100 +9520 +F520 +9520 +07E0 +ENDCHAR +STARTCHAR U_6623 +ENCODING 26147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +F920 +9280 +9500 +9240 +F080 +9100 +0600 +ENDCHAR +STARTCHAR U_6624 +ENCODING 26148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +F920 +9080 +9FE0 +9040 +F280 +9100 +0080 +ENDCHAR +STARTCHAR U_6625 +ENCODING 26149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0800 +FFE0 +30C0 +DCA0 +1780 +1080 +1F80 +ENDCHAR +STARTCHAR U_6626 +ENCODING 26150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0800 +FFE0 +2080 +D160 +1100 +6100 +ENDCHAR +STARTCHAR U_6627 +ENCODING 26151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +F100 +9FE0 +9100 +F380 +9540 +0920 +0100 +ENDCHAR +STARTCHAR U_6628 +ENCODING 26152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9600 +FA00 +93C0 +9200 +F200 +93C0 +0200 +0200 +ENDCHAR +STARTCHAR U_6629 +ENCODING 26153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F7C0 +9100 +9380 +9540 +F920 +9100 +0100 +ENDCHAR +STARTCHAR U_662A +ENCODING 26154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +1100 +7FC0 +1100 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_662B +ENCODING 26155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9420 +9820 +F7A0 +94A0 +94A0 +F7A0 +94A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_662C +ENCODING 26156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +FF00 +8800 +FF80 +8240 +FFC0 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_662D +ENCODING 26157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9220 +F4C0 +9800 +93E0 +9220 +F220 +03E0 +0220 +ENDCHAR +STARTCHAR U_662E +ENCODING 26158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0100 +FFE0 +2120 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_662F +ENCODING 26159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +2400 +2780 +5400 +8FE0 +ENDCHAR +STARTCHAR U_6630 +ENCODING 26160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +2780 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6631 +ENCODING 26161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +7FC0 +0100 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_6632 +ENCODING 26162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9FE0 +92A0 +FFE0 +9A80 +9FE0 +92A0 +F2E0 +9480 +0880 +ENDCHAR +STARTCHAR U_6633 +ENCODING 26163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F500 +97C0 +9900 +F100 +9FE0 +9100 +F100 +9280 +0440 +1820 +ENDCHAR +STARTCHAR U_6634 +ENCODING 26164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +C000 +9780 +B480 +D480 +2580 +C400 +ENDCHAR +STARTCHAR U_6635 +ENCODING 26165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +F400 +9520 +9540 +F580 +9520 +0920 +10E0 +ENDCHAR +STARTCHAR U_6636 +ENCODING 26166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +09E0 +7920 +0B20 +EDE0 +2920 +2D20 +2BE0 +4900 +A880 +1060 +ENDCHAR +STARTCHAR U_6637 +ENCODING 26167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_6638 +ENCODING 26168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +9440 +9A80 +F300 +9480 +9860 +9300 +F080 +9300 +0080 +ENDCHAR +STARTCHAR U_6639 +ENCODING 26169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E080 +AF00 +A120 +FD40 +A580 +A500 +E980 +A940 +1520 +0200 +ENDCHAR +STARTCHAR U_663A +ENCODING 26170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +40C0 +ENDCHAR +STARTCHAR U_663B +ENCODING 26171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FBC0 +2240 +3A40 +C2C0 +0200 +ENDCHAR +STARTCHAR U_663C +ENCODING 26172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2100 +3F80 +60E0 +BF80 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_663D +ENCODING 26173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F220 +9200 +9FE0 +F280 +92A0 +92A0 +92C0 +F480 +95A0 +0AE0 +ENDCHAR +STARTCHAR U_663E +ENCODING 26174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0A00 +4A40 +2A40 +2A80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_663F +ENCODING 26175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A800 +E900 +A900 +A900 +AA00 +EA40 +17E0 +2220 +ENDCHAR +STARTCHAR U_6640 +ENCODING 26176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +B540 +AD40 +E580 +AD80 +B540 +A540 +E500 +0520 +38E0 +ENDCHAR +STARTCHAR U_6641 +ENCODING 26177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +9480 +5500 +3600 +D580 +2440 +C3C0 +ENDCHAR +STARTCHAR U_6642 +ENCODING 26178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +FFE0 +9080 +9FE0 +9480 +F280 +0080 +0380 +ENDCHAR +STARTCHAR U_6643 +ENCODING 26179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2480 +1500 +FFE0 +0A00 +1220 +61E0 +ENDCHAR +STARTCHAR U_6644 +ENCODING 26180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F240 +AA80 +A200 +FFE0 +A500 +A500 +A500 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_6645 +ENCODING 26181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F000 +97C0 +9440 +F440 +97C0 +9440 +F440 +97C0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_6646 +ENCODING 26182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +FFE0 +9100 +9100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_6647 +ENCODING 26183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9240 +97A0 +F000 +9FE0 +9200 +F7C0 +9040 +0240 +0180 +ENDCHAR +STARTCHAR U_6648 +ENCODING 26184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9440 +F820 +9440 +9280 +9100 +F280 +0440 +1820 +ENDCHAR +STARTCHAR U_6649 +ENCODING 26185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +2A80 +7BC0 +0000 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_664A +ENCODING 26186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9200 +9440 +FFA0 +9120 +9100 +F7C0 +9100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_664B +ENCODING 26187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_664C +ENCODING 26188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E200 +AFE0 +A820 +EBA0 +AAA0 +AAA0 +ABA0 +EAA0 +A820 +0860 +ENDCHAR +STARTCHAR U_664D +ENCODING 26189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +ABA0 +A820 +EBA0 +AAA0 +ABA0 +E820 +0820 +08A0 +0840 +ENDCHAR +STARTCHAR U_664E +ENCODING 26190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A480 +AFC0 +E480 +A480 +BFE0 +E000 +0480 +0840 +3040 +ENDCHAR +STARTCHAR U_664F +ENCODING 26191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +3F00 +2100 +FFC0 +8840 +1000 +FFC0 +2200 +1E00 +F1C0 +ENDCHAR +STARTCHAR U_6650 +ENCODING 26192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9100 +F240 +9780 +9120 +9240 +F480 +9140 +0E20 +ENDCHAR +STARTCHAR U_6651 +ENCODING 26193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1000 +FF80 +8080 +9C80 +9480 +9D80 +ENDCHAR +STARTCHAR U_6652 +ENCODING 26194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +EAA0 +AAA0 +AAE0 +EC20 +A820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_6653 +ENCODING 26195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9E80 +9120 +F6E0 +9000 +9FE0 +F280 +92A0 +04A0 +18E0 +ENDCHAR +STARTCHAR U_6654 +ENCODING 26196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F2A0 +94C0 +9DA0 +F4A0 +9460 +9100 +FFE0 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_6655 +ENCODING 26197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2280 +FFE0 +8820 +7FC0 +2400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6656 +ENCODING 26198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9100 +9FE0 +F280 +97E0 +9080 +FFE0 +9080 +0080 +0080 +ENDCHAR +STARTCHAR U_6657 +ENCODING 26199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9920 +F7C0 +9040 +9080 +F7C0 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_6658 +ENCODING 26200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9000 +97C0 +F100 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_6659 +ENCODING 26201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +97E0 +9240 +F420 +9BE0 +9640 +FA80 +9180 +0240 +0C20 +ENDCHAR +STARTCHAR U_665A +ENCODING 26202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A900 +BFC0 +EA40 +AA40 +AFC0 +A300 +E520 +0920 +11E0 +ENDCHAR +STARTCHAR U_665B +ENCODING 26203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +9440 +97C0 +F280 +92A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_665C +ENCODING 26204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1400 +FF80 +0900 +FFC0 +2840 +C980 +ENDCHAR +STARTCHAR U_665D +ENCODING 26205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_665E +ENCODING 26206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C60 +E380 +AC60 +A200 +FFE0 +A500 +AFE0 +F520 +A520 +0560 +0100 +ENDCHAR +STARTCHAR U_665F +ENCODING 26207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +0280 +7FE0 +4240 +7A80 +4920 +96E0 +ENDCHAR +STARTCHAR U_6660 +ENCODING 26208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E140 +AFE0 +A900 +E920 +AF20 +AAC0 +AA80 +EAA0 +1560 +2220 +ENDCHAR +STARTCHAR U_6661 +ENCODING 26209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +E120 +AFE0 +A100 +EFE0 +A920 +AFE0 +E920 +AFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_6662 +ENCODING 26210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +37E0 +E480 +2480 +6880 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6663 +ENCODING 26211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0460 +E580 +BF00 +A5E0 +E540 +A740 +AD40 +B540 +E540 +1640 +0840 +ENDCHAR +STARTCHAR U_6664 +ENCODING 26212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9240 +F240 +9FE0 +9000 +F7C0 +9440 +0440 +07C0 +ENDCHAR +STARTCHAR U_6665 +ENCODING 26213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9820 +F7C0 +9000 +9FE0 +F280 +92A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_6666 +ENCODING 26214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9800 +97C0 +F540 +9540 +9FE0 +F540 +9540 +07E0 +0180 +ENDCHAR +STARTCHAR U_6667 +ENCODING 26215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +97C0 +9900 +F100 +9FE0 +9000 +97C0 +F440 +0440 +07C0 +ENDCHAR +STARTCHAR U_6668 +ENCODING 26216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FE0 +4000 +5FC0 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_6669 +ENCODING 26217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A900 +BFC0 +EA40 +AA40 +AFC0 +A500 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_666A +ENCODING 26218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +AAA0 +EAA0 +AFE0 +AAA0 +EAA0 +BFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_666B +ENCODING 26219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F1E0 +9100 +97C0 +F440 +97C0 +9440 +97C0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_666C +ENCODING 26220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9480 +F6C0 +9920 +9100 +FFE0 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_666D +ENCODING 26221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +ABA0 +A920 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +1020 +20C0 +ENDCHAR +STARTCHAR U_666E +ENCODING 26222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +4A40 +2A80 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_666F +ENCODING 26223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +2080 +3F80 +2480 +4C40 +ENDCHAR +STARTCHAR U_6670 +ENCODING 26224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E460 +A580 +BF00 +E5E0 +AF40 +B540 +A540 +E540 +0540 +0640 +ENDCHAR +STARTCHAR U_6671 +ENCODING 26225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +F540 +9580 +9A80 +F440 +9920 +9540 +F580 +9B00 +0480 +1860 +ENDCHAR +STARTCHAR U_6672 +ENCODING 26226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +ECE0 +A820 +AEE0 +E820 +AFE0 +AAA0 +E280 +A2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_6673 +ENCODING 26227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +73E0 +AA80 +2480 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6674 +ENCODING 26228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97C0 +F100 +9FE0 +9440 +F740 +95C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_6675 +ENCODING 26229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BC0 +4C40 +7A80 +4100 +86E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6676 +ENCODING 26230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_6677 +ENCODING 26231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +6500 +99E0 +2500 +7FE0 +A080 +3F80 +ENDCHAR +STARTCHAR U_6678 +ENCODING 26232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0100 +F9E0 +1240 +5D40 +5180 +FE60 +ENDCHAR +STARTCHAR U_6679 +ENCODING 26233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9200 +97E0 +FAA0 +94A0 +0920 +06C0 +ENDCHAR +STARTCHAR U_667A +ENCODING 26234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4000 +7BC0 +A240 +FE40 +33C0 +4A40 +BF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_667B +ENCODING 26235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +97C0 +FD60 +97C0 +9540 +F7C0 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_667C +ENCODING 26236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A400 +E7E0 +A8A0 +B5A0 +E2E0 +A480 +08A0 +10E0 +ENDCHAR +STARTCHAR U_667D +ENCODING 26237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BFE0 +A480 +EEC0 +ADA0 +B6A0 +A4A0 +E480 +0480 +0480 +ENDCHAR +STARTCHAR U_667E +ENCODING 26238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9000 +97C0 +F440 +97C0 +9100 +F380 +9540 +0920 +1320 +ENDCHAR +STARTCHAR U_667F +ENCODING 26239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +E7C0 +A000 +AFE0 +E820 +0FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_6680 +ENCODING 26240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F480 +9BE0 +9280 +F480 +9C80 +95C0 +F480 +9480 +0480 +07E0 +ENDCHAR +STARTCHAR U_6681 +ENCODING 26241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AA80 +FFE0 +A880 +A880 +BFC0 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_6682 +ENCODING 26242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +5200 +FBE0 +1280 +F480 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6683 +ENCODING 26243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +3F80 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_6684 +ENCODING 26244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +9FE0 +F000 +97C0 +94C0 +F540 +97C0 +0000 +0FE0 +ENDCHAR +STARTCHAR U_6685 +ENCODING 26245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFE0 +A800 +ABC0 +EE40 +BBC0 +AA40 +ABC0 +E800 +0FE0 +0800 +ENDCHAR +STARTCHAR U_6686 +ENCODING 26246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +A880 +AE80 +EAE0 +ABA0 +AAA0 +EAA0 +AA80 +0A20 +15E0 +ENDCHAR +STARTCHAR U_6687 +ENCODING 26247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EA20 +AEE0 +A800 +E9E0 +AF40 +A940 +EF40 +A880 +0940 +0A20 +ENDCHAR +STARTCHAR U_6688 +ENCODING 26248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2680 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6689 +ENCODING 26249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A100 +AFE0 +E540 +A7C0 +A540 +E7C0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_668A +ENCODING 26250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9440 +F7C0 +9440 +97C0 +F440 +97C0 +0280 +0C60 +ENDCHAR +STARTCHAR U_668B +ENCODING 26251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +89E0 +FB40 +9080 +FD40 +8A20 +FF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_668C +ENCODING 26252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +F180 +96A0 +9240 +F420 +9BC0 +9100 +FFE0 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_668D +ENCODING 26253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9200 +97E0 +F8A0 +9560 +07A0 +00C0 +ENDCHAR +STARTCHAR U_668E +ENCODING 26254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A200 +EFC0 +AA40 +BFE0 +E200 +0500 +08E0 +3040 +ENDCHAR +STARTCHAR U_668F +ENCODING 26255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A240 +A280 +FFE0 +A400 +AFC0 +B440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_6690 +ENCODING 26256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9140 +9FE0 +F440 +97C0 +9100 +FFE0 +9500 +0FE0 +0100 +ENDCHAR +STARTCHAR U_6691 +ENCODING 26257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +0500 +FFE0 +0880 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_6692 +ENCODING 26258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +E7C0 +A900 +AFC0 +B100 +E7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_6693 +ENCODING 26259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +2BE0 +FC40 +3240 +5180 +A260 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6694 +ENCODING 26260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +AAA0 +EAA0 +AFE0 +A920 +EFE0 +0920 +0860 +ENDCHAR +STARTCHAR U_6695 +ENCODING 26261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +EAA0 +A920 +AFE0 +E920 +A380 +0540 +0920 +ENDCHAR +STARTCHAR U_6696 +ENCODING 26262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA20 +9540 +9FE0 +F200 +9FE0 +9200 +F7C0 +9A40 +1180 +2E60 +ENDCHAR +STARTCHAR U_6697 +ENCODING 26263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +FFE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_6698 +ENCODING 26264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +FFE0 +9200 +97E0 +FAA0 +9520 +0220 +0CC0 +ENDCHAR +STARTCHAR U_6699 +ENCODING 26265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9200 +97C0 +F200 +9FE0 +9440 +FFE0 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_669A +ENCODING 26266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +A280 +E7E0 +A900 +AFE0 +B100 +E920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_669B +ENCODING 26267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A200 +AFC0 +E200 +BFE0 +A400 +E7C0 +0900 +3100 +1FE0 +ENDCHAR +STARTCHAR U_669C +ENCODING 26268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4A40 +5140 +FFE0 +0000 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_669D +ENCODING 26269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A7C0 +A440 +E7C0 +A440 +A7C0 +E100 +AFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_669E +ENCODING 26270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A440 +A7C0 +A440 +E7C0 +A100 +BFE0 +E540 +0920 +1120 +ENDCHAR +STARTCHAR U_669F +ENCODING 26271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +9000 +9FE0 +F000 +97C0 +9440 +F7C0 +9440 +0280 +0FE0 +ENDCHAR +STARTCHAR U_66A0 +ENCODING 26272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5FC0 +ENDCHAR +STARTCHAR U_66A1 +ENCODING 26273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA40 +94A0 +9780 +F000 +9FE0 +92A0 +FA60 +96A0 +0B20 +0660 +ENDCHAR +STARTCHAR U_66A2 +ENCODING 26274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +FFE0 +AA00 +FFE0 +AAA0 +24A0 +2920 +22C0 +ENDCHAR +STARTCHAR U_66A3 +ENCODING 26275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFC0 +B200 +A100 +FFC0 +B540 +AE40 +BFC0 +EE40 +1540 +24A0 +ENDCHAR +STARTCHAR U_66A4 +ENCODING 26276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +E840 +AFC0 +A200 +FFE0 +A540 +1BA0 +0100 +ENDCHAR +STARTCHAR U_66A5 +ENCODING 26277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA40 +A940 +AFC0 +E200 +AFC0 +AA40 +BFE0 +E480 +0300 +1CC0 +ENDCHAR +STARTCHAR U_66A6 +ENCODING 26278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7FE0 +4880 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_66A7 +ENCODING 26279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EFA0 +A540 +AFE0 +E920 +A7E0 +A200 +E3C0 +A640 +0980 +1660 +ENDCHAR +STARTCHAR U_66A8 +ENCODING 26280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9500 +FFC0 +9300 +F540 +99C0 +FF00 +2100 +3F00 +2100 +FFC0 +ENDCHAR +STARTCHAR U_66A9 +ENCODING 26281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F940 +9580 +9A40 +F420 +9BC0 +9000 +FFE0 +9540 +0920 +1320 +ENDCHAR +STARTCHAR U_66AA +ENCODING 26282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A440 +A7C0 +E100 +AFE0 +A920 +EDA0 +AB60 +0DA0 +0960 +ENDCHAR +STARTCHAR U_66AB +ENCODING 26283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +FFC0 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_66AC +ENCODING 26284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BC0 +1140 +FD40 +4A40 +9560 +7F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_66AD +ENCODING 26285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9440 +97C0 +F440 +97C0 +9920 +9540 +F920 +9FE0 +0100 +ENDCHAR +STARTCHAR U_66AE +ENCODING 26286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2080 +FFE0 +2080 +7FC0 +A0A0 +3F80 +ENDCHAR +STARTCHAR U_66AF +ENCODING 26287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +97C0 +9440 +F7C0 +9440 +97C0 +F100 +9FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_66B0 +ENCODING 26288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +E940 +B2A0 +A400 +E880 +B880 +AAE0 +EA80 +AA80 +0B80 +0C60 +ENDCHAR +STARTCHAR U_66B1 +ENCODING 26289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F540 +97E0 +9540 +F7E0 +9500 +95E0 +F720 +95E0 +0400 +07E0 +ENDCHAR +STARTCHAR U_66B2 +ENCODING 26290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9FE0 +F440 +97C0 +9440 +F7C0 +9100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_66B3 +ENCODING 26291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +E440 +BEE0 +A440 +FEE0 +A440 +AFC0 +A040 +EFC0 +0040 +0FC0 +ENDCHAR +STARTCHAR U_66B4 +ENCODING 26292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_66B5 +ENCODING 26293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9100 +F7C0 +9540 +9FE0 +F100 +9FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_66B6 +ENCODING 26294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E900 +BDE0 +AA00 +E9E0 +A880 +AE80 +AAE0 +EA80 +1380 +2460 +ENDCHAR +STARTCHAR U_66B7 +ENCODING 26295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +97C0 +F540 +97C0 +90A0 +FFE0 +9480 +0280 +0100 +ENDCHAR +STARTCHAR U_66B8 +ENCODING 26296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B4A0 +AFC0 +F460 +A7C0 +A440 +E7C0 +A540 +0920 +1320 +ENDCHAR +STARTCHAR U_66B9 +ENCODING 26297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +9F80 +5080 +1F80 +CA00 +5F80 +7200 +5F80 +5200 +BFE0 +ENDCHAR +STARTCHAR U_66BA +ENCODING 26298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AFE0 +A920 +EFE0 +A920 +AFE0 +E100 +AFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66BB +ENCODING 26299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9100 +9FE0 +F440 +97C0 +0940 +1320 +ENDCHAR +STARTCHAR U_66BC +ENCODING 26300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FA40 +AD40 +F880 +AB60 +7F80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_66BD +ENCODING 26301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E540 +BFE0 +A580 +F960 +A940 +AFE0 +FB40 +A5E0 +0840 +3040 +ENDCHAR +STARTCHAR U_66BE +ENCODING 26302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AAE0 +AEA0 +E0A0 +BFA0 +A2A0 +E4A0 +BE40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_66BF +ENCODING 26303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A200 +AFC0 +E840 +AFC0 +A480 +BFE0 +EFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_66C0 +ENCODING 26304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9FE0 +9820 +F7C0 +9000 +97C0 +F440 +97C0 +0280 +0FE0 +ENDCHAR +STARTCHAR U_66C1 +ENCODING 26305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8A80 +FFE0 +8180 +B2A0 +C460 +3F80 +2880 +2480 +FFE0 +ENDCHAR +STARTCHAR U_66C2 +ENCODING 26306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A480 +BFE0 +E100 +AFC0 +A940 +EFC0 +0940 +0FC0 +0480 +ENDCHAR +STARTCHAR U_66C3 +ENCODING 26307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +B140 +AFE0 +E140 +BBC0 +AD40 +EB80 +AD40 +0920 +17E0 +ENDCHAR +STARTCHAR U_66C4 +ENCODING 26308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +E540 +AFE0 +A540 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_66C5 +ENCODING 26309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +3FC0 +1100 +7FC0 +1500 +FFE0 +1500 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_66C6 +ENCODING 26310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_66C7 +ENCODING 26311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +7FC0 +0400 +FFE0 +9520 +3F80 +0000 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_66C8 +ENCODING 26312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A100 +FFE0 +A540 +A7C0 +E540 +AFE0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_66C9 +ENCODING 26313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9FE0 +F440 +9EE0 +9440 +FFE0 +9480 +04A0 +1860 +ENDCHAR +STARTCHAR U_66CA +ENCODING 26314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +92A0 +9FC0 +F2A0 +9FE0 +9440 +F7C0 +9440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_66CB +ENCODING 26315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +9FE0 +9AA0 +FFE0 +9440 +97C0 +F440 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66CC +ENCODING 26316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0440 +FFE0 +A0A0 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_66CD +ENCODING 26317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +96C0 +F540 +97C0 +9540 +9920 +FFE0 +9100 +0100 +ENDCHAR +STARTCHAR U_66CE +ENCODING 26318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A100 +EFE0 +A100 +BFE0 +E440 +AFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66CF +ENCODING 26319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2C40 +2340 +3FC0 +4AE0 +AEA0 +EAC0 +5EA0 +E8A0 +2AE0 +CD80 +ENDCHAR +STARTCHAR U_66D0 +ENCODING 26320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +AAA0 +FFE0 +2400 +3F80 +4400 +1F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_66D1 +ENCODING 26321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2900 +FFE0 +AAA0 +FFE0 +1200 +E9E0 +1400 +6900 +0200 +3C00 +ENDCHAR +STARTCHAR U_66D2 +ENCODING 26322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AEA0 +EAA0 +BFA0 +A8A0 +EEA0 +AA40 +12A0 +2520 +ENDCHAR +STARTCHAR U_66D3 +ENCODING 26323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +4440 +7FC0 +0400 +FFE0 +2480 +DF60 +1500 +6EC0 +ENDCHAR +STARTCHAR U_66D4 +ENCODING 26324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BF80 +AAE0 +A920 +EEA0 +B2A0 +AEA0 +AA40 +EE40 +02A0 +0D20 +ENDCHAR +STARTCHAR U_66D5 +ENCODING 26325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E880 +BFE0 +AA40 +EFE0 +A800 +AFC0 +A800 +EFC0 +1440 +27C0 +ENDCHAR +STARTCHAR U_66D6 +ENCODING 26326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E540 +AFE0 +A920 +E6C0 +ABA0 +A200 +E7C0 +AC80 +0300 +1CE0 +ENDCHAR +STARTCHAR U_66D7 +ENCODING 26327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +ECC0 +BFE0 +A480 +EFC0 +A200 +AFC0 +E200 +1FE0 +0A80 +3260 +ENDCHAR +STARTCHAR U_66D8 +ENCODING 26328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +EAA0 +BFE0 +A100 +EFE0 +AAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_66D9 +ENCODING 26329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A100 +E7A0 +A140 +AFE0 +E440 +0FC0 +1440 +07C0 +ENDCHAR +STARTCHAR U_66DA +ENCODING 26330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +E820 +AFC0 +AA40 +F580 +AAC0 +04A0 +0B20 +ENDCHAR +STARTCHAR U_66DB +ENCODING 26331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +AAA0 +E920 +AFE0 +A100 +EFE0 +A100 +1FE0 +12A0 +ENDCHAR +STARTCHAR U_66DC +ENCODING 26332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +AAA0 +E7E0 +AC80 +B7E0 +E480 +A7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_66DD +ENCODING 26333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +FFE0 +A280 +BFE0 +E540 +ABA0 +0540 +0B20 +ENDCHAR +STARTCHAR U_66DE +ENCODING 26334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +F280 +9FE0 +9280 +F7C0 +9540 +97C0 +F540 +9FE0 +0960 +0BA0 +ENDCHAR +STARTCHAR U_66DF +ENCODING 26335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +AAA0 +FFE0 +4000 +7F80 +4000 +7FE0 +5540 +98E0 +ENDCHAR +STARTCHAR U_66E0 +ENCODING 26336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +EA40 +AFE0 +AD40 +EFC0 +AD40 +17C0 +2C60 +ENDCHAR +STARTCHAR U_66E1 +ENCODING 26337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1500 +7FC0 +5540 +FFE0 +9120 +9F20 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_66E2 +ENCODING 26338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +AFE0 +E540 +AEE0 +A440 +E7C0 +A100 +0540 +0920 +ENDCHAR +STARTCHAR U_66E3 +ENCODING 26339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A780 +E020 +BFC0 +A480 +E7A0 +BCE0 +0B20 +12A0 +ENDCHAR +STARTCHAR U_66E4 +ENCODING 26340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +E7C0 +A500 +AFE0 +F500 +A7C0 +0500 +07E0 +ENDCHAR +STARTCHAR U_66E5 +ENCODING 26341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +EF80 +AA40 +ABC0 +AA80 +EFC0 +1540 +3FE0 +ENDCHAR +STARTCHAR U_66E6 +ENCODING 26342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFC0 +A100 +BFE0 +E4A0 +BFE0 +A480 +FEC0 +AAA0 +0360 +0C20 +ENDCHAR +STARTCHAR U_66E7 +ENCODING 26343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2C40 +2340 +3FC0 +FC80 +4BE0 +FEA0 +D7E0 +FC80 +A4E0 +AB20 +ENDCHAR +STARTCHAR U_66E8 +ENCODING 26344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FF80 +AAE0 +A420 +FFE0 +AA80 +AEE0 +EA80 +AEE0 +0AA0 +0EE0 +ENDCHAR +STARTCHAR U_66E9 +ENCODING 26345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +FFE0 +4A40 +7BC0 +1100 +FFE0 +1100 +FFE0 +5140 +BCE0 +ENDCHAR +STARTCHAR U_66EA +ENCODING 26346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A940 +F5E0 +BA40 +ABE0 +F640 +03E0 +2A40 +2BE0 +ENDCHAR +STARTCHAR U_66EB +ENCODING 26347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +50A0 +EFC0 +5080 +EFE0 +5940 +BFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_66EC +ENCODING 26348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +EC80 +B6E0 +2480 +0EE0 +ENDCHAR +STARTCHAR U_66ED +ENCODING 26349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +B4A0 +AFE0 +EAA0 +AFE0 +A100 +EFE0 +A100 +0FE0 +0AA0 +ENDCHAR +STARTCHAR U_66EE +ENCODING 26350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AFE0 +AA80 +EAE0 +AFA0 +A9A0 +EFA0 +A940 +1FA0 +2120 +ENDCHAR +STARTCHAR U_66EF +ENCODING 26351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +F040 +BFC0 +F500 +BFC0 +B240 +BFE0 +F2A0 +1FA0 +22A0 +5F60 +ENDCHAR +STARTCHAR U_66F0 +ENCODING 26352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8080 +8080 +8080 +FE80 +8080 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_66F1 +ENCODING 26353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_66F2 +ENCODING 26354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FFC0 +9240 +9240 +9240 +FFC0 +9240 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_66F3 +ENCODING 26355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0480 +0300 +0220 +1DA0 +E060 +ENDCHAR +STARTCHAR U_66F4 +ENCODING 26356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +3FC0 +2240 +3FC0 +2240 +3FC0 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_66F5 +ENCODING 26357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FC0 +4440 +7FC0 +4440 +7FC0 +0500 +0220 +0DA0 +F060 +ENDCHAR +STARTCHAR U_66F6 +ENCODING 26358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +7F80 +9280 +2480 +4A80 +1100 +7F80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_66F7 +ENCODING 26359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1040 +1FC0 +1040 +1FC0 +1000 +3FE0 +6520 +A8A0 +3F20 +00C0 +ENDCHAR +STARTCHAR U_66F8 +ENCODING 26360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_66F9 +ENCODING 26361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4940 +7FC0 +4940 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_66FA +ENCODING 26362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +2880 +2480 +3F80 +ENDCHAR +STARTCHAR U_66FB +ENCODING 26363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +4080 +7BC0 +8A80 +57E0 +2080 +C080 +ENDCHAR +STARTCHAR U_66FC +ENCODING 26364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2900 +2500 +FFC0 +9240 +FFC0 +0000 +3F00 +1200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_66FD +ENCODING 26365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2100 +1200 +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_66FE +ENCODING 26366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2400 +FF80 +C980 +AA80 +FF80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_66FF +ENCODING 26367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +3180 +4A40 +BFA0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6700 +ENCODING 26368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +4800 +7FC0 +4A40 +7980 +C980 +0E60 +ENDCHAR +STARTCHAR U_6701 +ENCODING 26369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +2180 +6AA0 +B4E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6702 +ENCODING 26370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +FFE0 +4900 +7900 +4FC0 +7940 +4940 +FA40 +0CC0 +ENDCHAR +STARTCHAR U_6703 +ENCODING 26371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2E80 +C060 +7FC0 +5540 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6704 +ENCODING 26372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +AFE0 +FAA0 +A920 +FFE0 +A900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_6705 +ENCODING 26373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +FA00 +27E0 +4CA0 +9560 +EFA0 +0040 +ENDCHAR +STARTCHAR U_6706 +ENCODING 26374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +FBE0 +ACA0 +F8A0 +A960 +FA60 +48A0 +7920 +4AA0 +7840 +ENDCHAR +STARTCHAR U_6707 +ENCODING 26375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3080 +4BE0 +B6A0 +03E0 +FEA0 +97E0 +FC80 +4A80 +7FE0 +4880 +7880 +ENDCHAR +STARTCHAR U_6708 +ENCODING 26376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_6709 +ENCODING 26377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +1F80 +3080 +5F80 +9080 +1F80 +1080 +1080 +1180 +ENDCHAR +STARTCHAR U_670A +ENCODING 26378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5000 +5000 +7000 +5FE0 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_670B +ENCODING 26379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4920 +79E0 +4920 +4920 +79E0 +4920 +4920 +4920 +9A60 +ENDCHAR +STARTCHAR U_670C +ENCODING 26380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +4A40 +7A40 +4C20 +4BC0 +7940 +4940 +4940 +4A40 +9480 +ENDCHAR +STARTCHAR U_670D +ENCODING 26381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7AE0 +4A00 +4BE0 +7A20 +4AC0 +4A40 +8AA0 +9B20 +ENDCHAR +STARTCHAR U_670E +ENCODING 26382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +5280 +7440 +5A20 +5100 +77C0 +5040 +5280 +5100 +A100 +ENDCHAR +STARTCHAR U_670F +ENCODING 26383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5520 +5520 +7520 +57E0 +5100 +7100 +5520 +5520 +97E0 +B420 +ENDCHAR +STARTCHAR U_6710 +ENCODING 26384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7420 +5BA0 +52A0 +72A0 +53A0 +52A0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_6711 +ENCODING 26385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +5540 +5540 +7540 +5FE0 +5540 +7540 +55C0 +5400 +57E0 +A000 +ENDCHAR +STARTCHAR U_6712 +ENCODING 26386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57E0 +7520 +56A0 +5560 +7520 +56A0 +5460 +9420 +B460 +ENDCHAR +STARTCHAR U_6713 +ENCODING 26387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5AA0 +76C0 +5280 +52C0 +76A0 +5A80 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_6714 +ENCODING 26388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7F20 +11E0 +5520 +5520 +7DE0 +1120 +1120 +2220 +C460 +ENDCHAR +STARTCHAR U_6715 +ENCODING 26389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5240 +5080 +77C0 +5100 +5100 +7FE0 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_6716 +ENCODING 26390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5440 +77C0 +5440 +57C0 +7620 +5540 +5480 +5540 +A620 +ENDCHAR +STARTCHAR U_6717 +ENCODING 26391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +8A20 +FBE0 +8A20 +FA20 +A3E0 +9220 +AA20 +CC60 +ENDCHAR +STARTCHAR U_6718 +ENCODING 26392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5240 +5FA0 +7440 +5A20 +53C0 +7640 +5280 +5100 +9280 +BC60 +ENDCHAR +STARTCHAR U_6719 +ENCODING 26393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +FD20 +B5E0 +CD20 +8520 +BDE0 +A520 +A520 +FD20 +02A0 +0C40 +ENDCHAR +STARTCHAR U_671A +ENCODING 26394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0440 +ENDCHAR +STARTCHAR U_671B +ENCODING 26395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +1240 +FBC0 +2240 +3BC0 +2440 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_671C +ENCODING 26396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5000 +73C0 +5240 +57C0 +7080 +5100 +5FE0 +5100 +B300 +ENDCHAR +STARTCHAR U_671D +ENCODING 26397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +7DE0 +4520 +7D20 +45E0 +7D20 +1120 +FD20 +1260 +ENDCHAR +STARTCHAR U_671E +ENCODING 26398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +1500 +FFE0 +2080 +5F40 +9120 +1F00 +1100 +1300 +ENDCHAR +STARTCHAR U_671F +ENCODING 26399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +4920 +79E0 +4920 +7920 +49E0 +FD20 +0120 +4920 +8660 +ENDCHAR +STARTCHAR U_6720 +ENCODING 26400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +7100 +57C0 +5540 +7540 +5FE0 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_6721 +ENCODING 26401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +4B60 +4AA0 +7BE0 +4940 +4E20 +79E0 +4B40 +4C80 +8940 +9E20 +ENDCHAR +STARTCHAR U_6722 +ENCODING 26402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +A120 +F9E0 +8920 +F9E0 +A220 +FFC0 +0400 +7F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6723 +ENCODING 26403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7100 +5FE0 +5540 +77C0 +5540 +5FE0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_6724 +ENCODING 26404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +79E0 +4920 +9240 +79E0 +4920 +69A0 +5960 +69A0 +9240 +ENDCHAR +STARTCHAR U_6725 +ENCODING 26405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +56C0 +5360 +7240 +55A0 +5FE0 +7A20 +57C0 +5240 +5240 +A4C0 +ENDCHAR +STARTCHAR U_6726 +ENCODING 26406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7FE0 +5820 +5FE0 +7540 +5A80 +55C0 +9AA0 +B500 +ENDCHAR +STARTCHAR U_6727 +ENCODING 26407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +A4E0 +FF20 +AAE0 +AA80 +EEE0 +AA80 +AEE0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_6728 +ENCODING 26408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0440 +0400 +ENDCHAR +STARTCHAR U_6729 +ENCODING 26409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2500 +2480 +2480 +4440 +8440 +1400 +0800 +ENDCHAR +STARTCHAR U_672A +ENCODING 26410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_672B +ENCODING 26411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +7FC0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_672C +ENCODING 26412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0E00 +1500 +1500 +2480 +4440 +9F20 +0400 +0400 +ENDCHAR +STARTCHAR U_672D +ENCODING 26413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1100 +1900 +3500 +5500 +9100 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_672E +ENCODING 26414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0440 +FFE0 +0400 +1480 +1480 +1480 +1480 +2480 +4460 +0400 +ENDCHAR +STARTCHAR U_672F +ENCODING 26415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +0400 +ENDCHAR +STARTCHAR U_6730 +ENCODING 26416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0E00 +1500 +E4E0 +7F80 +0200 +0C00 +1040 +2040 +1FC0 +ENDCHAR +STARTCHAR U_6731 +ENCODING 26417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6732 +ENCODING 26418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +2100 +7100 +6A80 +AA80 +2440 +2860 +3040 +ENDCHAR +STARTCHAR U_6733 +ENCODING 26419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FE80 +2280 +3280 +6A80 +6A40 +A240 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_6734 +ENCODING 26420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1180 +1940 +3520 +5520 +9100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_6735 +ENCODING 26421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +20E0 +4400 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6736 +ENCODING 26422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +2040 +2140 +4480 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_6737 +ENCODING 26423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +F920 +2120 +7120 +6A20 +AA20 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6738 +ENCODING 26424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2120 +3120 +6920 +6120 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6739 +ENCODING 26425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2780 +3280 +6A80 +A280 +A480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_673A +ENCODING 26426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2480 +FC80 +2480 +7480 +6C80 +A480 +A480 +28A0 +30E0 +ENDCHAR +STARTCHAR U_673B +ENCODING 26427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1120 +FD20 +1120 +3120 +3920 +5560 +93A0 +1120 +1020 +1020 +ENDCHAR +STARTCHAR U_673C +ENCODING 26428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1240 +FE40 +1280 +3B00 +5600 +9200 +1220 +1220 +11E0 +ENDCHAR +STARTCHAR U_673D +ENCODING 26429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +FD00 +1200 +3BE0 +3420 +5020 +9020 +1020 +1140 +1080 +ENDCHAR +STARTCHAR U_673E +ENCODING 26430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +F880 +1080 +3080 +3880 +5480 +5080 +9080 +1080 +1380 +ENDCHAR +STARTCHAR U_673F +ENCODING 26431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0400 +7F80 +4480 +4480 +4F80 +1500 +2480 +C440 +0400 +ENDCHAR +STARTCHAR U_6740 +ENCODING 26432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1900 +0600 +1900 +64C0 +0400 +FFE0 +1500 +2480 +C460 +0C00 +ENDCHAR +STARTCHAR U_6741 +ENCODING 26433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2200 +F900 +2100 +7100 +6A80 +A280 +A440 +2440 +2820 +2000 +ENDCHAR +STARTCHAR U_6742 +ENCODING 26434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +1120 +64E0 +0400 +FFE0 +0400 +2480 +5440 +8820 +ENDCHAR +STARTCHAR U_6743 +ENCODING 26435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +F440 +2440 +2440 +7280 +6A80 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6744 +ENCODING 26436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +77E0 +6900 +A100 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6745 +ENCODING 26437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2080 +F880 +2080 +37E0 +6880 +A080 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_6746 +ENCODING 26438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2080 +3080 +6FE0 +6080 +A080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_6747 +ENCODING 26439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +27E0 +3100 +6A00 +63C0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_6748 +ENCODING 26440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA40 +2340 +62C0 +7240 +A980 +A180 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_6749 +ENCODING 26441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1080 +FD00 +1220 +1840 +3480 +5300 +9020 +1040 +1080 +1300 +ENDCHAR +STARTCHAR U_674A +ENCODING 26442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +FAA0 +22A0 +72A0 +6AA0 +A2A0 +A2A0 +24A0 +2420 +2820 +ENDCHAR +STARTCHAR U_674B +ENCODING 26443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +FC80 +2480 +3680 +6D80 +A480 +A480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_674C +ENCODING 26444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA80 +2280 +3280 +2A80 +6280 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_674D +ENCODING 26445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F840 +2080 +2080 +37E0 +6880 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_674E +ENCODING 26446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1F00 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_674F +ENCODING 26447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0E00 +3580 +C460 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_6750 +ENCODING 26448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +2040 +FBE0 +2040 +70C0 +6940 +A240 +2440 +2140 +2080 +ENDCHAR +STARTCHAR U_6751 +ENCODING 26449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +FBE0 +2040 +7240 +6940 +A140 +2040 +2040 +2040 +21C0 +ENDCHAR +STARTCHAR U_6752 +ENCODING 26450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2520 +2520 +7120 +6920 +AA20 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6753 +ENCODING 26451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +3020 +2A20 +6120 +A120 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_6754 +ENCODING 26452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +7100 +6FE0 +A100 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_6755 +ENCODING 26453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +27E0 +7100 +6900 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6756 +ENCODING 26454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2480 +3280 +6A80 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6757 +ENCODING 26455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6758 +ENCODING 26456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2400 +2400 +3FC0 +2600 +4D00 +5480 +A460 +0400 +ENDCHAR +STARTCHAR U_6759 +ENCODING 26457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FA00 +23E0 +2600 +3200 +6A00 +A100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_675A +ENCODING 26458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2400 +23C0 +3080 +6900 +A200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_675B +ENCODING 26459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F820 +23E0 +7200 +6BE0 +A020 +A020 +2020 +2140 +2080 +ENDCHAR +STARTCHAR U_675C +ENCODING 26460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +F900 +27C0 +7100 +6900 +A100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_675D +ENCODING 26461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FAA0 +23E0 +26A0 +32A0 +6AE0 +A280 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_675E +ENCODING 26462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F820 +2020 +23E0 +3220 +6A00 +A200 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_675F +ENCODING 26463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +2480 +3F80 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6760 +ENCODING 26464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2100 +3100 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6761 +ENCODING 26465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2900 +4600 +0A00 +3580 +C460 +3F80 +1500 +2480 +DC40 +ENDCHAR +STARTCHAR U_6762 +ENCODING 26466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1500 +2480 +C060 +3F80 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6763 +ENCODING 26467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +24A0 +74A0 +6CA0 +A4A0 +A4A0 +24A0 +27E0 +2000 +ENDCHAR +STARTCHAR U_6764 +ENCODING 26468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +2200 +73C0 +6A40 +A240 +A440 +2440 +2940 +2880 +ENDCHAR +STARTCHAR U_6765 +ENCODING 26469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +1500 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6766 +ENCODING 26470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBC0 +2280 +7480 +6900 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6767 +ENCODING 26471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F900 +2FE0 +7200 +6A00 +A200 +A200 +2200 +23E0 +2000 +ENDCHAR +STARTCHAR U_6768 +ENCODING 26472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F900 +2200 +77E0 +6AA0 +A2A0 +A4A0 +2920 +2220 +24C0 +ENDCHAR +STARTCHAR U_6769 +ENCODING 26473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +2240 +7240 +6BE0 +A020 +A7A0 +2020 +2020 +20C0 +ENDCHAR +STARTCHAR U_676A +ENCODING 26474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2540 +7520 +6900 +A120 +A040 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_676B +ENCODING 26475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +21C0 +7500 +6D00 +A500 +A500 +2500 +2FE0 +2000 +ENDCHAR +STARTCHAR U_676C +ENCODING 26476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +27E0 +6280 +7280 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_676D +ENCODING 26477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2000 +2380 +3280 +6A80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_676E +ENCODING 26478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +7520 +6D20 +A520 +A5A0 +2540 +2100 +2100 +ENDCHAR +STARTCHAR U_676F +ENCODING 26479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2100 +3100 +2B40 +6520 +A920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6770 +ENCODING 26480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1500 +2480 +4440 +8420 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_6771 +ENCODING 26481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6772 +ENCODING 26482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_6773 +ENCODING 26483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +4440 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_6774 +ENCODING 26484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2220 +6540 +7100 +A900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6775 +ENCODING 26485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2480 +6080 +77E0 +A880 +A080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_6776 +ENCODING 26486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2540 +3540 +6FC0 +A100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_6777 +ENCODING 26487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FD40 +2540 +6540 +77C0 +AC00 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6778 +ENCODING 26488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +2240 +6420 +77C0 +AA40 +A240 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_6779 +ENCODING 26489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FCA0 +24A0 +6CC0 +7480 +AD80 +A680 +24A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_677A +ENCODING 26490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FA80 +2200 +2200 +3640 +6A20 +A220 +2240 +2240 +21C0 +ENDCHAR +STARTCHAR U_677B +ENCODING 26491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2140 +2140 +37C0 +6A40 +A240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_677C +ENCODING 26492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +FA80 +2100 +6FE0 +7120 +A940 +A100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_677D +ENCODING 26493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2780 +F880 +27E0 +2080 +7080 +6FE0 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_677E +ENCODING 26494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2440 +2420 +3120 +6900 +A200 +2240 +2440 +27A0 +ENDCHAR +STARTCHAR U_677F +ENCODING 26495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27C0 +7440 +6E40 +A580 +2880 +2940 +3620 +ENDCHAR +STARTCHAR U_6780 +ENCODING 26496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +C860 +1100 +3F80 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6781 +ENCODING 26497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA80 +22E0 +2220 +7220 +6D40 +A540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_6782 +ENCODING 26498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +23E0 +7220 +6A20 +A3E0 +A220 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_6783 +ENCODING 26499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2020 +6220 +7120 +A8A0 +A120 +2620 +20A0 +2040 +ENDCHAR +STARTCHAR U_6784 +ENCODING 26500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2220 +7220 +6CA0 +A7A0 +20A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6785 +ENCODING 26501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA40 +2240 +27E0 +3240 +6A40 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6786 +ENCODING 26502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2100 +21E0 +3700 +6900 +A1E0 +2720 +2120 +20E0 +ENDCHAR +STARTCHAR U_6787 +ENCODING 26503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +24A0 +27C0 +3480 +6C80 +A480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_6788 +ENCODING 26504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3AC0 +2300 +2A40 +31C0 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6789 +ENCODING 26505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +F900 +2100 +2100 +37C0 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_678A +ENCODING 26506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +25E0 +FD20 +2520 +7520 +6D20 +A520 +A7A0 +2540 +2100 +2100 +ENDCHAR +STARTCHAR U_678B +ENCODING 26507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +61E0 +7120 +A920 +A220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_678C +ENCODING 26508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +2240 +7420 +6FE0 +A240 +A240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_678D +ENCODING 26509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2420 +6FE0 +7200 +ABC0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_678E +ENCODING 26510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +7100 +6FE0 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_678F +ENCODING 26511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2FE0 +7440 +6C40 +AFE0 +A440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_6790 +ENCODING 26512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27E0 +3480 +6C80 +A480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_6791 +ENCODING 26513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +FA00 +23C0 +2240 +3440 +6C40 +A7C0 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_6792 +ENCODING 26514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +FA40 +2240 +67E0 +70C0 +A940 +A240 +2440 +2840 +20C0 +ENDCHAR +STARTCHAR U_6793 +ENCODING 26515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +F940 +2040 +2240 +3140 +6860 +A7C0 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U_6794 +ENCODING 26516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3080 +67E0 +A040 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_6795 +ENCODING 26517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +3540 +6980 +A980 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6796 +ENCODING 26518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F900 +27E0 +7100 +6900 +A280 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_6797 +ENCODING 26519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +7100 +6B80 +A540 +A920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6798 +ENCODING 26520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +6520 +75A0 +AE60 +A420 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_6799 +ENCODING 26521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +25E0 +2520 +3520 +6D60 +A500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_679A +ENCODING 26522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2240 +2440 +7640 +6A80 +A180 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_679B +ENCODING 26523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +7540 +6D40 +A540 +A540 +2520 +2920 +2100 +ENDCHAR +STARTCHAR U_679C +ENCODING 26524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_679D +ENCODING 26525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F100 +27C0 +7240 +6A40 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_679E +ENCODING 26526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +2480 +6480 +7680 +AD80 +A480 +2940 +3220 +2420 +ENDCHAR +STARTCHAR U_679F +ENCODING 26527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F800 +2000 +67E0 +7100 +A900 +A200 +2240 +2FE0 +2420 +ENDCHAR +STARTCHAR U_67A0 +ENCODING 26528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2780 +FA80 +22A0 +74A0 +6A60 +A200 +AFE0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_67A1 +ENCODING 26529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2640 +FA40 +2240 +7240 +6FE0 +A240 +A240 +2440 +2440 +3040 +ENDCHAR +STARTCHAR U_67A2 +ENCODING 26530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC20 +2620 +2540 +3480 +6D40 +A620 +2420 +2400 +27E0 +ENDCHAR +STARTCHAR U_67A3 +ENCODING 26531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +2E80 +1500 +6E80 +0160 +1C00 +0300 +ENDCHAR +STARTCHAR U_67A4 +ENCODING 26532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +F940 +27E0 +7100 +6900 +A280 +A280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_67A5 +ENCODING 26533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +2480 +27E0 +34A0 +6CA0 +A4A0 +2520 +2AA0 +3440 +ENDCHAR +STARTCHAR U_67A6 +ENCODING 26534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FBE0 +2220 +73E0 +6A00 +A200 +2200 +2400 +2400 +2800 +ENDCHAR +STARTCHAR U_67A7 +ENCODING 26535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2540 +3540 +6D40 +A180 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_67A8 +ENCODING 26536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2260 +2240 +FA80 +2300 +2200 +37E0 +6A80 +A280 +22C0 +2320 +2220 +ENDCHAR +STARTCHAR U_67A9 +ENCODING 26537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +0000 +1100 +2480 +C860 +1100 +3F80 +ENDCHAR +STARTCHAR U_67AA +ENCODING 26538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2020 +27C0 +3440 +6C40 +A580 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_67AB +ENCODING 26539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +26C0 +2540 +3540 +6D40 +A6C0 +2440 +2820 +3020 +ENDCHAR +STARTCHAR U_67AC +ENCODING 26540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2640 +7540 +6FE0 +A440 +2440 +2840 +2940 +3080 +ENDCHAR +STARTCHAR U_67AD +ENCODING 26541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2880 +2580 +2000 +3FE0 +0420 +7FA0 +1560 +2480 +C460 +ENDCHAR +STARTCHAR U_67AE +ENCODING 26542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F9E0 +2100 +2100 +37E0 +6C20 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_67AF +ENCODING 26543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2080 +33E0 +6A20 +A220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67B0 +ENCODING 26544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F920 +2540 +2340 +3100 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67B1 +ENCODING 26545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA00 +2440 +77E0 +6820 +67C0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_67B2 +ENCODING 26546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2080 +7FC0 +0040 +3F80 +2080 +3F80 +0400 +FFE0 +1580 +E460 +ENDCHAR +STARTCHAR U_67B3 +ENCODING 26547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +7440 +6FC0 +A000 +A000 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67B4 +ENCODING 26548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +6000 +77E0 +A920 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_67B5 +ENCODING 26549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2000 +6FE0 +7200 +ABC0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_67B6 +ENCODING 26550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +2A20 +4BE0 +9220 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67B7 +ENCODING 26551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +48E0 +5EA0 +FAA0 +4AA0 +6AA0 +DAA0 +4AA0 +4AA0 +52E0 +64A0 +ENDCHAR +STARTCHAR U_67B8 +ENCODING 26552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +23A0 +32A0 +6AA0 +A3A0 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_67B9 +ENCODING 26553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +24A0 +34A0 +6FA0 +A4C0 +2400 +2420 +23E0 +ENDCHAR +STARTCHAR U_67BA +ENCODING 26554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2100 +67C0 +7100 +AB80 +A540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_67BB +ENCODING 26555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2540 +F540 +2FE0 +6540 +7540 +AD40 +A5C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_67BC +ENCODING 26556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +2900 +2F00 +2000 +3FC0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67BD +ENCODING 26557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +2080 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67BE +ENCODING 26558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2540 +7540 +6FC0 +A540 +2540 +2940 +2100 +2100 +ENDCHAR +STARTCHAR U_67BF +ENCODING 26559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +7240 +6A40 +AFE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_67C0 +ENCODING 26560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +24A0 +2480 +37E0 +6D40 +A540 +2880 +3140 +2620 +ENDCHAR +STARTCHAR U_67C1 +ENCODING 26561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2420 +2200 +3240 +6B80 +A200 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_67C2 +ENCODING 26562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FC80 +22A0 +22E0 +33A0 +6EA0 +A2E0 +2280 +2220 +21E0 +ENDCHAR +STARTCHAR U_67C3 +ENCODING 26563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +6920 +7080 +AFE0 +A040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_67C4 +ENCODING 26564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +F880 +27E0 +24A0 +34A0 +6DA0 +A660 +2420 +2420 +24E0 +ENDCHAR +STARTCHAR U_67C5 +ENCODING 26565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2400 +3520 +6D40 +A580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_67C6 +ENCODING 26566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2440 +3440 +6A40 +A240 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_67C7 +ENCODING 26567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +7100 +6B00 +A380 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_67C8 +ENCODING 26568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2520 +FD40 +2100 +27C0 +3100 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67C9 +ENCODING 26569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2080 +27E0 +3040 +6880 +A300 +2400 +2A00 +31E0 +ENDCHAR +STARTCHAR U_67CA +ENCODING 26570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +2280 +2100 +3280 +6C60 +A100 +20C0 +2300 +20C0 +ENDCHAR +STARTCHAR U_67CB +ENCODING 26571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +2480 +7FE0 +A200 +2120 +24E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67CC +ENCODING 26572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FFA0 +2020 +27A0 +34A0 +6CA0 +A7A0 +24A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_67CD +ENCODING 26573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2540 +3540 +6FE0 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67CE +ENCODING 26574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC40 +25E0 +2440 +3640 +6D40 +A440 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_67CF +ENCODING 26575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +2220 +2220 +33E0 +6A20 +A220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67D0 +ENCODING 26576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +1F00 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D1 +ENCODING 26577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +2240 +2240 +33C0 +6A40 +A240 +2240 +23C0 +2240 +ENDCHAR +STARTCHAR U_67D2 +ENCODING 26578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5260 +3380 +6E20 +21E0 +2400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_67D3 +ENCODING 26579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +AF80 +5480 +24A0 +C8E0 +5000 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D4 +ENCODING 26580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0900 +7FE0 +1440 +2480 +4C00 +8400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D5 +ENCODING 26581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +F880 +27E0 +30A0 +69C0 +6280 +A480 +3880 +2280 +2100 +ENDCHAR +STARTCHAR U_67D6 +ENCODING 26582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA20 +2220 +74A0 +6840 +A7E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_67D7 +ENCODING 26583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2280 +FA80 +2240 +7440 +6820 +A7C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_67D8 +ENCODING 26584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +7200 +6BE0 +A620 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67D9 +ENCODING 26585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +27E0 +24A0 +34A0 +6FE0 +A4A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_67DA +ENCODING 26586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2920 +3920 +6FE0 +A920 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_67DB +ENCODING 26587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +27E0 +3520 +6FE0 +A520 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67DC +ENCODING 26588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +27C0 +2440 +7440 +6FC0 +A400 +A400 +2400 +27E0 +ENDCHAR +STARTCHAR U_67DD +ENCODING 26589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27E0 +3480 +6D80 +A4C0 +24A0 +2880 +3080 +ENDCHAR +STARTCHAR U_67DE +ENCODING 26590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2500 +2100 +31E0 +6900 +A100 +21E0 +2100 +2100 +ENDCHAR +STARTCHAR U_67DF +ENCODING 26591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +2540 +27C0 +3540 +6D40 +AFE0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_67E0 +ENCODING 26592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC20 +2000 +27E0 +3080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_67E1 +ENCODING 26593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +FFE0 +2100 +7100 +6DA0 +A540 +A940 +3120 +2300 +ENDCHAR +STARTCHAR U_67E2 +ENCODING 26594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC80 +2480 +27E0 +3480 +6C80 +A4A0 +2560 +2720 +24A0 +ENDCHAR +STARTCHAR U_67E3 +ENCODING 26595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +FFC0 +2900 +2100 +37E0 +6900 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67E4 +ENCODING 26596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2440 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_67E5 +ENCODING 26597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_67E6 +ENCODING 26598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +67C0 +7440 +AC40 +A7C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_67E7 +ENCODING 26599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +6540 +7540 +AD40 +A540 +2520 +2960 +31A0 +ENDCHAR +STARTCHAR U_67E8 +ENCODING 26600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2500 +77C0 +6D40 +B540 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_67E9 +ENCODING 26601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FD00 +25C0 +2540 +3640 +6C40 +A4A0 +2520 +2400 +27E0 +ENDCHAR +STARTCHAR U_67EA +ENCODING 26602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FDE0 +2AA0 +26A0 +34A0 +6EA0 +A9A0 +3EA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_67EB +ENCODING 26603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +22A0 +6FE0 +7A80 +AFE0 +A2A0 +22A0 +24C0 +2880 +ENDCHAR +STARTCHAR U_67EC +ENCODING 26604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5540 +4A40 +7FC0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67ED +ENCODING 26605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +7200 +6BE0 +A240 +A540 +2480 +2940 +3620 +ENDCHAR +STARTCHAR U_67EE +ENCODING 26606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FD20 +2520 +27E0 +3100 +6D20 +A520 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_67EF +ENCODING 26607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +F840 +2740 +2540 +3540 +6F40 +A540 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_67F0 +ENCODING 26608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +3F80 +0000 +FFE0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_67F1 +ENCODING 26609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2100 +7100 +6900 +A7C0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67F2 +ENCODING 26610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FA40 +2240 +2240 +3680 +6AA0 +A320 +2240 +2640 +39C0 +ENDCHAR +STARTCHAR U_67F3 +ENCODING 26611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +FAA0 +2AA0 +2AA0 +3AA0 +6EA0 +AAA0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_67F4 +ENCODING 26612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5E80 +5320 +5220 +F9E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67F5 +ENCODING 26613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FAA0 +4AA0 +5FE0 +6AA0 +DAA0 +4AA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_67F6 +ENCODING 26614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2AA0 +2AA0 +3AA0 +6CE0 +A820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_67F7 +ENCODING 26615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +67C0 +7280 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_67F8 +ENCODING 26616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2180 +6340 +7520 +A920 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67F9 +ENCODING 26617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F700 +2500 +7500 +6FE0 +AB20 +25A0 +3940 +2100 +2100 +ENDCHAR +STARTCHAR U_67FA +ENCODING 26618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +7100 +6FE0 +A120 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_67FB +ENCODING 26619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_67FC +ENCODING 26620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +6080 +7280 +AA80 +A240 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_67FD +ENCODING 26621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2440 +FA40 +2180 +7240 +6D20 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67FE +ENCODING 26622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2100 +3500 +6DC0 +6500 +A500 +2500 +2500 +2FE0 +ENDCHAR +STARTCHAR U_67FF +ENCODING 26623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2100 +27E0 +3520 +6D20 +A520 +2560 +2100 +2100 +ENDCHAR +STARTCHAR U_6800 +ENCODING 26624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2400 +FFE0 +2400 +75C0 +6D40 +A5C0 +A520 +2520 +29E0 +ENDCHAR +STARTCHAR U_6801 +ENCODING 26625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +F7A0 +25A0 +79A0 +6AA0 +B6A0 +A2E0 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_6802 +ENCODING 26626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2640 +7540 +6FE0 +A640 +A940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_6803 +ENCODING 26627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2800 +FFE0 +2900 +69E0 +7920 +A920 +AA20 +2AA0 +3440 +ENDCHAR +STARTCHAR U_6804 +ENCODING 26628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +8420 +0400 +7FC0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6805 +ENCODING 26629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2AA0 +3FE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_6806 +ENCODING 26630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +0A00 +3180 +C460 +0A00 +0400 +ENDCHAR +STARTCHAR U_6807 +ENCODING 26631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +F800 +2FE0 +2100 +7100 +6540 +A520 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_6808 +ENCODING 26632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +31E0 +6F00 +6120 +A140 +20A0 +2360 +2C20 +ENDCHAR +STARTCHAR U_6809 +ENCODING 26633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2000 +2FE0 +3120 +6920 +A120 +2160 +2100 +2100 +ENDCHAR +STARTCHAR U_680A +ENCODING 26634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +F900 +27E0 +2280 +32A0 +6AA0 +A2C0 +2480 +29A0 +3260 +ENDCHAR +STARTCHAR U_680B +ENCODING 26635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2280 +7480 +6FE0 +A080 +A4C0 +24A0 +28A0 +2180 +ENDCHAR +STARTCHAR U_680C +ENCODING 26636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +7420 +6C20 +A7E0 +A400 +2400 +2800 +3000 +ENDCHAR +STARTCHAR U_680D +ENCODING 26637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +2500 +F7E0 +2900 +7100 +6FC0 +A100 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_680E +ENCODING 26638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +FC00 +2480 +2480 +37E0 +6880 +A2C0 +24A0 +28A0 +2180 +ENDCHAR +STARTCHAR U_680F +ENCODING 26639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +F000 +2FE0 +6000 +7000 +A7C0 +A000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6810 +ENCODING 26640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2080 +FF00 +2120 +2F40 +7380 +6D40 +A540 +A920 +2100 +2300 +ENDCHAR +STARTCHAR U_6811 +ENCODING 26641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2E40 +F3E0 +2A40 +2A40 +7540 +A4C0 +2A40 +3140 +2040 +20C0 +ENDCHAR +STARTCHAR U_6812 +ENCODING 26642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2820 +23A0 +32A0 +6BA0 +A2A0 +23A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6813 +ENCODING 26643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2020 +27C0 +3100 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6814 +ENCODING 26644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1120 +7920 +1120 +FEC0 +1400 +FFE0 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_6815 +ENCODING 26645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2900 +FFC0 +2840 +3840 +6840 +AFC0 +2900 +2900 +2FE0 +ENDCHAR +STARTCHAR U_6816 +ENCODING 26646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F280 +2FE0 +6AA0 +7AA0 +AAE0 +AC20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6817 +ENCODING 26647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6818 +ENCODING 26648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FA40 +2580 +2100 +36E0 +6920 +A6A0 +2040 +2080 +2700 +ENDCHAR +STARTCHAR U_6819 +ENCODING 26649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F680 +2100 +76E0 +6900 +AFC0 +2500 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_681A +ENCODING 26650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFC0 +2100 +2100 +37E0 +6900 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_681B +ENCODING 26651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2240 +7540 +6880 +BFE0 +AAA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_681C +ENCODING 26652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27E0 +7520 +6D20 +A560 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_681D +ENCODING 26653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27E0 +7100 +6900 +A7E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_681E +ENCODING 26654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1080 +1080 +7BE0 +2080 +4480 +FFE0 +0D00 +3480 +C460 +0400 +ENDCHAR +STARTCHAR U_681F +ENCODING 26655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +7280 +6FE0 +A280 +A280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_6820 +ENCODING 26656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4F00 +C100 +5FE0 +4100 +4FC0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6821 +ENCODING 26657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2280 +7440 +6AA0 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6822 +ENCODING 26658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +27C0 +7440 +6C40 +A7C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6823 +ENCODING 26659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2260 +F780 +2C80 +7480 +67E0 +A480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_6824 +ENCODING 26660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5100 +E940 +4740 +6380 +CB80 +D540 +5520 +4920 +5500 +4200 +ENDCHAR +STARTCHAR U_6825 +ENCODING 26661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1A40 +2300 +C480 +4840 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6826 +ENCODING 26662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +FAA0 +22A0 +77E0 +6AA0 +A2A0 +A2A0 +22A0 +24A0 +2820 +ENDCHAR +STARTCHAR U_6827 +ENCODING 26663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7540 +6FC0 +A140 +2180 +22A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_6828 +ENCODING 26664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F9E0 +2220 +20A0 +3280 +6A80 +AC80 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_6829 +ENCODING 26665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +7360 +6920 +A360 +A5A0 +2120 +2120 +2360 +ENDCHAR +STARTCHAR U_682A +ENCODING 26666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +7100 +6FE0 +A100 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_682B +ENCODING 26667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F200 +25E0 +3440 +2C80 +77E0 +A480 +2480 +2480 +2580 +ENDCHAR +STARTCHAR U_682C +ENCODING 26668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2540 +7540 +6FC0 +A400 +A420 +2420 +23E0 +ENDCHAR +STARTCHAR U_682D +ENCODING 26669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2FE0 +3AA0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_682E +ENCODING 26670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FC40 +27C0 +2440 +37C0 +6C40 +A440 +25E0 +2E40 +2040 +ENDCHAR +STARTCHAR U_682F +ENCODING 26671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2200 +23E0 +3620 +6BE0 +A220 +23E0 +2220 +22E0 +ENDCHAR +STARTCHAR U_6830 +ENCODING 26672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +22A0 +F480 +2FE0 +7480 +6CA0 +A4A0 +A4C0 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_6831 +ENCODING 26673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +27E0 +2280 +3280 +6FE0 +A000 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_6832 +ENCODING 26674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +2FE0 +2100 +33E0 +6D00 +A3E0 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_6833 +ENCODING 26675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +F920 +2140 +27E0 +3100 +6A40 +A780 +2A20 +2220 +21E0 +ENDCHAR +STARTCHAR U_6834 +ENCODING 26676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +2540 +3540 +6FE0 +A440 +2440 +2940 +3080 +ENDCHAR +STARTCHAR U_6835 +ENCODING 26677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2420 +F4A0 +27A0 +28A0 +39A0 +66A0 +A2A0 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_6836 +ENCODING 26678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F920 +2FE0 +6920 +7920 +AAA0 +AC60 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6837 +ENCODING 26679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +77C0 +6100 +A100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6838 +ENCODING 26680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +2240 +7780 +6920 +A240 +2480 +2140 +2E20 +ENDCHAR +STARTCHAR U_6839 +ENCODING 26681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3520 +6D40 +A480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_683A +ENCODING 26682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2700 +FC20 +23E0 +2000 +37E0 +6C20 +A7E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_683B +ENCODING 26683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +7080 +6F80 +A480 +A4A0 +27A0 +3C60 +2020 +ENDCHAR +STARTCHAR U_683C +ENCODING 26684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F440 +2A80 +2100 +7280 +6C60 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_683D +ENCODING 26685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +1100 +FD20 +1140 +3880 +55A0 +9260 +1420 +ENDCHAR +STARTCHAR U_683E +ENCODING 26686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +C920 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_683F +ENCODING 26687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +24A0 +FFE0 +2480 +7480 +6C80 +A480 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_6840 +ENCODING 26688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +4880 +B280 +17E0 +2080 +4480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6841 +ENCODING 26689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +25E0 +F800 +2200 +75E0 +6C40 +A440 +A440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_6842 +ENCODING 26690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3000 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6843 +ENCODING 26691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +26C0 +2280 +36C0 +6AA0 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6844 +ENCODING 26692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FD40 +2100 +27E0 +3280 +6A80 +A280 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_6845 +ENCODING 26693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +2400 +35E0 +6D20 +A560 +2500 +2520 +28E0 +ENDCHAR +STARTCHAR U_6846 +ENCODING 26694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFE0 +2480 +2480 +75C0 +6C80 +A480 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_6847 +ENCODING 26695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FBC0 +2A40 +6A40 +13C0 +6C00 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6848 +ENCODING 26696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +FFE0 +1200 +0F00 +F8E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6849 +ENCODING 26697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2520 +2100 +37E0 +6A40 +A240 +2180 +2340 +2C20 +ENDCHAR +STARTCHAR U_684A +ENCODING 26698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +2080 +4440 +BFA0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_684B +ENCODING 26699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +2FC0 +2140 +37C0 +6500 +AFE0 +2160 +2280 +2C60 +ENDCHAR +STARTCHAR U_684C +ENCODING 26700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_684D +ENCODING 26701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +6BA0 +7000 +AFE0 +A200 +27C0 +2040 +2180 +ENDCHAR +STARTCHAR U_684E +ENCODING 26702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA00 +2440 +2FA0 +3100 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_684F +ENCODING 26703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2EA0 +FCA0 +24A0 +24C0 +34A0 +6DA0 +A6A0 +3CE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6850 +ENCODING 26704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +2820 +6BA0 +7AA0 +AAA0 +ABA0 +2AA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6851 +ENCODING 26705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1100 +0E00 +1100 +FBE0 +4A40 +3180 +4A40 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6852 +ENCODING 26706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +2080 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6853 +ENCODING 26707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F800 +27C0 +6440 +77C0 +AC40 +A7C0 +2440 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6854 +ENCODING 26708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +27C0 +3000 +6FC0 +A440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6855 +ENCODING 26709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +F820 +2820 +2820 +3EE0 +6820 +A820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6856 +ENCODING 26710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4800 +5FC0 +F540 +5540 +F540 +D540 +5540 +5540 +7FE0 +4000 +ENDCHAR +STARTCHAR U_6857 +ENCODING 26711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +FAE0 +2420 +78A0 +6240 +AFE0 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_6858 +ENCODING 26712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +FC40 +27C0 +7400 +67E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6859 +ENCODING 26713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7C0 +2140 +3500 +67C0 +A900 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_685A +ENCODING 26714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +2A80 +F540 +2200 +77E0 +6440 +AA40 +2180 +2300 +2C00 +ENDCHAR +STARTCHAR U_685B +ENCODING 26715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FA00 +2FE0 +7000 +6FE0 +A200 +2300 +22C0 +2240 +2200 +ENDCHAR +STARTCHAR U_685C +ENCODING 26716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2560 +FD40 +3280 +6A00 +6FE0 +A240 +2680 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_685D +ENCODING 26717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2840 +FFE0 +2A40 +7B40 +65E0 +A440 +2440 +2840 +2040 +ENDCHAR +STARTCHAR U_685E +ENCODING 26718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +2EA0 +FAA0 +2AC0 +76A0 +62A0 +A4E0 +2480 +2480 +2880 +ENDCHAR +STARTCHAR U_685F +ENCODING 26719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FBC0 +2E00 +73C0 +6E00 +A3E0 +2E80 +2120 +2EA0 +2060 +ENDCHAR +STARTCHAR U_6860 +ENCODING 26720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2280 +72A0 +6AA0 +A6C0 +A280 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6861 +ENCODING 26721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FF40 +21A0 +2660 +3000 +6FE0 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6862 +ENCODING 26722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +2420 +3520 +6D20 +A520 +2520 +2280 +2C60 +ENDCHAR +STARTCHAR U_6863 +ENCODING 26723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +2100 +27E0 +7020 +6820 +A7E0 +2020 +2020 +27E0 +ENDCHAR +STARTCHAR U_6864 +ENCODING 26724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +67E0 +7020 +AFE0 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6865 +ENCODING 26725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +6280 +7440 +AAA0 +A280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_6866 +ENCODING 26726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +FCC0 +25A0 +74A0 +6C60 +A100 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6867 +ENCODING 26727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +6FE0 +7000 +AFE0 +A200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_6868 +ENCODING 26728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +33E0 +1440 +3280 +D700 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6869 +ENCODING 26729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC00 +2480 +2480 +37E0 +6C80 +A480 +2480 +2880 +37E0 +ENDCHAR +STARTCHAR U_686A +ENCODING 26730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77C0 +6880 +AFE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_686B +ENCODING 26731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +F8C0 +25A0 +7280 +6AA0 +A420 +AC40 +2480 +2500 +2600 +ENDCHAR +STARTCHAR U_686C +ENCODING 26732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +AA80 +4A40 +3280 +CF00 +5400 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_686D +ENCODING 26733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDC0 +2400 +67E0 +7580 +ADA0 +A540 +2540 +29A0 +3120 +ENDCHAR +STARTCHAR U_686E +ENCODING 26734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +F980 +2340 +6520 +7100 +AFE0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_686F +ENCODING 26735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +37E0 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6870 +ENCODING 26736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +FD00 +27E0 +6480 +75A0 +A660 +2000 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_6871 +ENCODING 26737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FD40 +2A80 +2540 +3540 +6FC0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6872 +ENCODING 26738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2FE0 +6820 +77C0 +A880 +AFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6873 +ENCODING 26739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFE0 +2100 +6FE0 +7280 +A540 +A920 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_6874 +ENCODING 26740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +FD40 +2280 +77C0 +6880 +A100 +AFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6875 +ENCODING 26741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FD20 +22C0 +7100 +6FE0 +A140 +A240 +2280 +2140 +2620 +ENDCHAR +STARTCHAR U_6876 +ENCODING 26742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +F980 +27E0 +6520 +77E0 +AD20 +A7E0 +2520 +2520 +2460 +ENDCHAR +STARTCHAR U_6877 +ENCODING 26743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +6520 +77E0 +AD20 +A7E0 +2520 +2920 +3160 +ENDCHAR +STARTCHAR U_6878 +ENCODING 26744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +F660 +2900 +2FE0 +3480 +6FE0 +B4A0 +24A0 +24E0 +2080 +ENDCHAR +STARTCHAR U_6879 +ENCODING 26745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +6440 +77C0 +AD20 +A540 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_687A +ENCODING 26746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2EE0 +6AA0 +7AA0 +AEE0 +2280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_687B +ENCODING 26747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2C40 +F380 +2C60 +7100 +6FE0 +A100 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_687C +ENCODING 26748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +CE60 +3580 +C4E0 +1500 +0E00 +3580 +CC60 +ENDCHAR +STARTCHAR U_687D +ENCODING 26749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C060 +2480 +5540 +8620 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_687E +ENCODING 26750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +2140 +77C0 +6A00 +A7C0 +AA40 +3240 +23C0 +2240 +ENDCHAR +STARTCHAR U_687F +ENCODING 26751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +A7C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6880 +ENCODING 26752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +6520 +77E0 +A900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_6881 +ENCODING 26753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +A280 +4AC0 +2AA0 +D4A0 +4980 +5400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6882 +ENCODING 26754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2120 +2940 +3580 +6B40 +A540 +2920 +2120 +2300 +ENDCHAR +STARTCHAR U_6883 +ENCODING 26755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +23C0 +FA40 +2440 +2FE0 +3240 +6A40 +ABE0 +2400 +2A00 +31E0 +ENDCHAR +STARTCHAR U_6884 +ENCODING 26756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7C60 +A820 +AFE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6885 +ENCODING 26757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +7540 +6FE0 +A540 +A540 +27E0 +2040 +2180 +ENDCHAR +STARTCHAR U_6886 +ENCODING 26758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +FFA0 +24A0 +6FC0 +74A0 +AFA0 +A4A0 +24E0 +2880 +3080 +ENDCHAR +STARTCHAR U_6887 +ENCODING 26759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFC0 +2100 +2FE0 +3240 +6FE0 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6888 +ENCODING 26760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F800 +27C0 +7440 +6FC0 +A000 +AFC0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6889 +ENCODING 26761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2A40 +FA40 +2E40 +23E0 +3240 +6E40 +AA40 +2A40 +2A40 +32E0 +ENDCHAR +STARTCHAR U_688A +ENCODING 26762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +F7E0 +2480 +E880 +0480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_688B +ENCODING 26763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2000 +27E0 +3420 +6FE0 +A420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_688C +ENCODING 26764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +27C0 +7100 +6FE0 +A100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_688D +ENCODING 26765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F840 +2FC0 +7840 +6FC0 +A200 +23E0 +2E00 +2220 +21E0 +ENDCHAR +STARTCHAR U_688E +ENCODING 26766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FC0 +A400 +24C0 +2720 +2420 +23E0 +ENDCHAR +STARTCHAR U_688F +ENCODING 26767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +F7E0 +2880 +77E0 +6800 +A7E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6890 +ENCODING 26768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +FFC0 +2480 +75A0 +6E60 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6891 +ENCODING 26769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2480 +F8A0 +25A0 +26C0 +3480 +6C80 +B480 +24C0 +3520 +2A20 +ENDCHAR +STARTCHAR U_6892 +ENCODING 26770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2D60 +67C0 +7080 +A100 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6893 +ENCODING 26771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +7280 +6FE0 +A100 +A100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_6894 +ENCODING 26772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +27E0 +2400 +37C0 +6D40 +A7C0 +2400 +2C20 +33E0 +ENDCHAR +STARTCHAR U_6895 +ENCODING 26773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +2520 +7520 +6AA0 +A440 +2120 +2AA0 +2A40 +21C0 +ENDCHAR +STARTCHAR U_6896 +ENCODING 26774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2440 +37C0 +6C40 +A7C0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6897 +ENCODING 26775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2520 +77E0 +6D20 +A7E0 +A100 +2500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6898 +ENCODING 26776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6C40 +A7C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6899 +ENCODING 26777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7100 +6FE0 +A920 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_689A +ENCODING 26778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FC0 +7540 +6D40 +A7C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_689B +ENCODING 26779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +EAA0 +5EA0 +4AC0 +6AA0 +DEA0 +4AA0 +4AE0 +5280 +6480 +ENDCHAR +STARTCHAR U_689C +ENCODING 26780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2540 +2540 +3BA0 +6920 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_689D +ENCODING 26781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5A40 +5180 +DE60 +5100 +5FE0 +5100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_689E +ENCODING 26782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2400 +7440 +6BC0 +A200 +2540 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_689F +ENCODING 26783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7FE0 +4000 +7FE0 +0420 +FFE0 +1520 +2480 +C460 +ENDCHAR +STARTCHAR U_68A0 +ENCODING 26784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +6000 +7000 +AFE0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_68A1 +ENCODING 26785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +23C0 +7000 +6FE0 +A280 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68A2 +ENCODING 26786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F900 +27E0 +6420 +77E0 +AC20 +A7E0 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_68A3 +ENCODING 26787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +FFE0 +2100 +2280 +3540 +6920 +A7C0 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_68A4 +ENCODING 26788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +2520 +FFE0 +2280 +7440 +6FE0 +A240 +A240 +2540 +2880 +ENDCHAR +STARTCHAR U_68A5 +ENCODING 26789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2880 +5140 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68A6 +ENCODING 26790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FBE0 +1080 +39C0 +D6A0 +0800 +0FC0 +7080 +0D00 +0600 +7800 +ENDCHAR +STARTCHAR U_68A7 +ENCODING 26791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +2240 +6240 +77E0 +A800 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68A8 +ENCODING 26792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F940 +1140 +FF40 +5540 +92C0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68A9 +ENCODING 26793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F540 +27C0 +7540 +6FC0 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_68AA +ENCODING 26794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F800 +27C0 +7440 +6C40 +A7C0 +A000 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_68AB +ENCODING 26795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FFC0 +2040 +6FE0 +7820 +A7C0 +A440 +2380 +2280 +2C60 +ENDCHAR +STARTCHAR U_68AC +ENCODING 26796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7540 +6FE0 +A200 +A7C0 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_68AD +ENCODING 26797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFE0 +2240 +7420 +6A00 +A3C0 +A640 +2980 +2240 +2C20 +ENDCHAR +STARTCHAR U_68AE +ENCODING 26798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2400 +77E0 +6C20 +A7A0 +A6A0 +2BA0 +2820 +30C0 +ENDCHAR +STARTCHAR U_68AF +ENCODING 26799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +F940 +27C0 +7500 +6FE0 +A320 +2520 +29C0 +2100 +ENDCHAR +STARTCHAR U_68B0 +ENCODING 26800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2AA0 +3AA0 +6FA0 +AAC0 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_68B1 +ENCODING 26801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3920 +6BA0 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68B2 +ENCODING 26802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +FFE0 +2440 +6440 +77C0 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68B3 +ENCODING 26803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2440 +77E0 +6800 +A540 +A540 +2540 +2960 +3020 +ENDCHAR +STARTCHAR U_68B4 +ENCODING 26804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +45C0 +F840 +4960 +6D40 +5540 +C940 +5940 +4BE0 +5400 +63E0 +ENDCHAR +STARTCHAR U_68B5 +ENCODING 26805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +71C0 +AAA0 +2480 +1F00 +1100 +1920 +2520 +C0E0 +ENDCHAR +STARTCHAR U_68B6 +ENCODING 26806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2400 +67C0 +7500 +A7C0 +2500 +27E0 +2920 +28E0 +ENDCHAR +STARTCHAR U_68B7 +ENCODING 26807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3A20 +2140 +F880 +8940 +FA20 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68B8 +ENCODING 26808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +26A0 +FAA0 +2FA0 +72A0 +66A0 +ABA0 +32A0 +2220 +22A0 +2240 +ENDCHAR +STARTCHAR U_68B9 +ENCODING 26809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +27C0 +7480 +6480 +BFE0 +2000 +2480 +2860 +3020 +ENDCHAR +STARTCHAR U_68BA +ENCODING 26810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +7180 +6AC0 +A4A0 +FFE0 +0400 +0500 +04C0 +0440 +0400 +ENDCHAR +STARTCHAR U_68BB +ENCODING 26811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2680 +2A80 +FFE0 +2AA0 +6FE0 +7A80 +AFE0 +2AA0 +2AA0 +2AE0 +2C80 +ENDCHAR +STARTCHAR U_68BC +ENCODING 26812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +7100 +6FE0 +A240 +A7E0 +2940 +3040 +20C0 +ENDCHAR +STARTCHAR U_68BD +ENCODING 26813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +77E0 +6800 +A200 +2540 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_68BE +ENCODING 26814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F200 +2A80 +7700 +7FE0 +A200 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_68BF +ENCODING 26815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F900 +2A80 +67E0 +7880 +A880 +2FE0 +2880 +2880 +37E0 +ENDCHAR +STARTCHAR U_68C0 +ENCODING 26816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +27C0 +7000 +6920 +A4A0 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_68C1 +ENCODING 26817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2440 +7440 +6FC0 +A280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68C2 +ENCODING 26818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FBE0 +2020 +77E0 +6900 +A520 +A940 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_68C3 +ENCODING 26819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FEA0 +38A0 +5520 +9260 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68C4 +ENCODING 26820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +2480 +FFE0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68C5 +ENCODING 26821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2200 +FFE0 +2240 +6FE0 +7240 +AFC0 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_68C6 +ENCODING 26822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2BA0 +2000 +3FE0 +6AA0 +AFE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_68C7 +ENCODING 26823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +2520 +2100 +3240 +6FA0 +A140 +2AA0 +2A20 +33C0 +ENDCHAR +STARTCHAR U_68C8 +ENCODING 26824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7100 +6FE0 +A440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68C9 +ENCODING 26825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FC0 +A100 +AFE0 +2920 +2960 +2100 +ENDCHAR +STARTCHAR U_68CA +ENCODING 26826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +FFE0 +2480 +7FC0 +9520 +2480 +4440 +ENDCHAR +STARTCHAR U_68CB +ENCODING 26827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +23C0 +2240 +33C0 +6A40 +AFE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_68CC +ENCODING 26828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F920 +24C0 +2000 +3100 +6FE0 +A100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_68CD +ENCODING 26829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6CA0 +A7C0 +24A0 +27A0 +2460 +ENDCHAR +STARTCHAR U_68CE +ENCODING 26830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FA40 +2420 +7100 +6FE0 +A100 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_68CF +ENCODING 26831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77E0 +6840 +AFE0 +A040 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_68D0 +ENCODING 26832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +FBE0 +0A00 +FBE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68D1 +ENCODING 26833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FEE0 +2280 +7280 +6EE0 +A280 +A280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_68D2 +ENCODING 26834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7200 +6FE0 +A540 +ABA0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_68D3 +ENCODING 26835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +6280 +77E0 +A800 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68D4 +ENCODING 26836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2480 +26A0 +3460 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_68D5 +ENCODING 26837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2000 +37E0 +6900 +A540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_68D6 +ENCODING 26838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFC0 +2400 +27C0 +3400 +6FE0 +A540 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_68D7 +ENCODING 26839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2E80 +1500 +2480 +FFE0 +2480 +2E80 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68D8 +ENCODING 26840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +AAA0 +AAA0 +BAE0 +2080 +71C0 +AAA0 +2080 +ENDCHAR +STARTCHAR U_68D9 +ENCODING 26841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +27E0 +3500 +6D40 +67E0 +A500 +2980 +2A40 +3420 +ENDCHAR +STARTCHAR U_68DA +ENCODING 26842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2EE0 +2AA0 +3AA0 +6EE0 +AAA0 +2AA0 +32A0 +2560 +ENDCHAR +STARTCHAR U_68DB +ENCODING 26843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2440 +6FE0 +7440 +AFC0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_68DC +ENCODING 26844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2440 +FEA0 +2520 +2E20 +3A80 +6A60 +AA20 +2A80 +3260 +2420 +ENDCHAR +STARTCHAR U_68DD +ENCODING 26845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +3920 +6BA0 +AAA0 +ABA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68DE +ENCODING 26846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +FB20 +2920 +3FE0 +6920 +ABA0 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68DF +ENCODING 26847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +2540 +37C0 +6D40 +A7C0 +2340 +2520 +2920 +ENDCHAR +STARTCHAR U_68E0 +ENCODING 26848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +FFE0 +8020 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68E1 +ENCODING 26849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2920 +2FE0 +3920 +6D60 +AD60 +2FE0 +2820 +2860 +ENDCHAR +STARTCHAR U_68E2 +ENCODING 26850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +2FE0 +7920 +6FE0 +AA20 +2A20 +2BE0 +2820 +2860 +ENDCHAR +STARTCHAR U_68E3 +ENCODING 26851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +2140 +37C0 +6920 +A540 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_68E4 +ENCODING 26852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2280 +6FE0 +7000 +AFC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_68E5 +ENCODING 26853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +F5E0 +2480 +6BC0 +7AA0 +A4A0 +2A80 +2280 +2080 +2080 +ENDCHAR +STARTCHAR U_68E6 +ENCODING 26854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F880 +27C0 +7140 +6FE0 +A140 +A7C0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_68E7 +ENCODING 26855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F940 +21A0 +2660 +3280 +6BE0 +AE40 +22A0 +21A0 +2E60 +ENDCHAR +STARTCHAR U_68E8 +ENCODING 26856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +4620 +7D40 +4080 +8360 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68E9 +ENCODING 26857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2AA0 +FAA0 +2EE0 +6820 +7FE0 +A820 +AEE0 +2AA0 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_68EA +ENCODING 26858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +2980 +2240 +3520 +6D40 +A580 +2980 +2240 +2C20 +ENDCHAR +STARTCHAR U_68EB +ENCODING 26859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +3EA0 +2AA0 +6EC0 +A080 +26A0 +3960 +2620 +ENDCHAR +STARTCHAR U_68EC +ENCODING 26860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2200 +2FE0 +3440 +6FA0 +B480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_68ED +ENCODING 26861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F500 +25E0 +6920 +7AA0 +AE40 +A940 +2880 +2940 +2E20 +ENDCHAR +STARTCHAR U_68EE +ENCODING 26862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1100 +FFE0 +3180 +5B40 +9520 +1100 +ENDCHAR +STARTCHAR U_68EF +ENCODING 26863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +28A0 +27C0 +3040 +6880 +A340 +2AA0 +2A40 +31C0 +ENDCHAR +STARTCHAR U_68F0 +ENCODING 26864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2540 +7540 +6FE0 +A540 +A540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_68F1 +ENCODING 26865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +3A20 +6BC0 +A680 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_68F2 +ENCODING 26866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F140 +2FE0 +6140 +77C0 +A100 +AFE0 +2240 +2380 +2C60 +ENDCHAR +STARTCHAR U_68F3 +ENCODING 26867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +F440 +2AA0 +2100 +37E0 +6AA0 +A2A0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_68F4 +ENCODING 26868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAE0 +2E80 +6AE0 +7AA0 +AEA0 +AAA0 +2AC0 +2AC0 +36A0 +ENDCHAR +STARTCHAR U_68F5 +ENCODING 26869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +27E0 +3100 +6FE0 +A380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_68F6 +ENCODING 26870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2540 +2540 +3BA0 +6900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_68F7 +ENCODING 26871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2AE0 +FEA0 +2AA0 +2AA0 +3EA0 +6AA0 +ABA0 +3E40 +22A0 +2320 +ENDCHAR +STARTCHAR U_68F8 +ENCODING 26872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +7840 +4940 +7880 +4940 +FE20 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68F9 +ENCODING 26873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2440 +37C0 +6C40 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_68FA +ENCODING 26874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2440 +37C0 +6C00 +A7E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_68FB +ENCODING 26875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +4940 +9320 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68FC +ENCODING 26876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +3980 +56C0 +90A0 +1100 +2080 +7FC0 +88A0 +1080 +6300 +ENDCHAR +STARTCHAR U_68FD +ENCODING 26877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +3180 +5AC0 +94A0 +0A00 +1500 +E2E0 +1F80 +0100 +0200 +ENDCHAR +STARTCHAR U_68FE +ENCODING 26878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3B80 +D560 +1100 +FFE0 +8020 +1F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_68FF +ENCODING 26879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +24C0 +F440 +26C0 +7440 +6FC0 +A280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6900 +ENCODING 26880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2800 +6FC0 +6B40 +BB40 +A5C0 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_6901 +ENCODING 26881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F800 +23C0 +7240 +6BC0 +A080 +A100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_6902 +ENCODING 26882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77E0 +6900 +A560 +A380 +2540 +2960 +2300 +ENDCHAR +STARTCHAR U_6903 +ENCODING 26883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2200 +FFE0 +2A20 +7F80 +6A40 +6BC0 +A800 +2B80 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_6904 +ENCODING 26884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2280 +37E0 +6900 +AFE0 +2480 +2380 +3E60 +ENDCHAR +STARTCHAR U_6905 +ENCODING 26885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2280 +77E0 +6840 +A740 +A540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_6906 +ENCODING 26886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFA0 +2520 +27E0 +3420 +6FA0 +A6A0 +27A0 +2820 +30E0 +ENDCHAR +STARTCHAR U_6907 +ENCODING 26887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +67C0 +7440 +AFC0 +A440 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_6908 +ENCODING 26888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +F7E0 +2D60 +23A0 +37E0 +6920 +A3A0 +2560 +2920 +20C0 +ENDCHAR +STARTCHAR U_6909 +ENCODING 26889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +3BE0 +6A80 +13E0 +6480 +FFE0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_690A +ENCODING 26890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +7640 +69A0 +A100 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_690B +ENCODING 26891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +27C0 +2440 +37C0 +6900 +A540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_690C +ENCODING 26892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +2240 +2420 +3000 +6FC0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_690D +ENCODING 26893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +37C0 +6C40 +A740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_690E +ENCODING 26894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FC80 +2480 +27E0 +3480 +6C80 +A7E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_690F +ENCODING 26895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FA80 +26E0 +2420 +3420 +6C20 +A6E0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6910 +ENCODING 26896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +24A0 +2480 +37E0 +6C80 +A7E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_6911 +ENCODING 26897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2520 +37E0 +6A80 +A480 +2FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6912 +ENCODING 26898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +24A0 +F7A0 +24A0 +2FA0 +34A0 +66A0 +ADA0 +3440 +24A0 +2D20 +ENDCHAR +STARTCHAR U_6913 +ENCODING 26899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA20 +2D40 +2680 +3480 +6DC0 +A2A0 +24A0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_6914 +ENCODING 26900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +FD40 +22A0 +22A0 +37E0 +6D20 +A7E0 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_6915 +ENCODING 26901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2A40 +FAE0 +2140 +2F40 +3540 +6DE0 +A560 +2540 +2940 +3340 +ENDCHAR +STARTCHAR U_6916 +ENCODING 26902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC20 +27E0 +7480 +6FE0 +A500 +25E0 +2920 +2A20 +3460 +ENDCHAR +STARTCHAR U_6917 +ENCODING 26903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2FE0 +3100 +6D00 +A5E0 +2500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_6918 +ENCODING 26904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +3B80 +5540 +9920 +0400 +7FC0 +0300 +0C00 +7000 +8FE0 +ENDCHAR +STARTCHAR U_6919 +ENCODING 26905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +AFE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_691A +ENCODING 26906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7820 +A820 +A820 +2820 +28A0 +2840 +ENDCHAR +STARTCHAR U_691B +ENCODING 26907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +3200 +6A80 +64A0 +ACC0 +3480 +25A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_691C +ENCODING 26908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +33A0 +6900 +67C0 +A540 +27C0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_691D +ENCODING 26909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +2540 +F540 +52A0 +8CE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_691E +ENCODING 26910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +3BE0 +5680 +9280 +1480 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_691F +ENCODING 26911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2420 +3B00 +6500 +AFE0 +2100 +2240 +2C20 +ENDCHAR +STARTCHAR U_6920 +ENCODING 26912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +5200 +FBE0 +1280 +FC80 +1480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6921 +ENCODING 26913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +E4A0 +4AA0 +5FA0 +E4A0 +DFA0 +44A0 +4420 +4720 +5860 +ENDCHAR +STARTCHAR U_6922 +ENCODING 26914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F820 +2FE0 +7920 +6FE0 +A9A0 +2960 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6923 +ENCODING 26915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2AA0 +7FE0 +6AA0 +AAA0 +3FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_6924 +ENCODING 26916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +2100 +33E0 +6E40 +A140 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_6925 +ENCODING 26917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +F7A0 +2AA0 +2FA0 +72A0 +6AA0 +A2A0 +25A0 +28E0 +3000 +ENDCHAR +STARTCHAR U_6926 +ENCODING 26918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +3200 +6FE0 +6480 +AA40 +37A0 +2280 +2480 +2980 +ENDCHAR +STARTCHAR U_6927 +ENCODING 26919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC60 +33C0 +6800 +6EE0 +AAA0 +2AA0 +2EE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6928 +ENCODING 26920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F900 +4A40 +6FE0 +DA40 +4B40 +4AC0 +4A40 +4A40 +52C0 +ENDCHAR +STARTCHAR U_6929 +ENCODING 26921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F900 +2FC0 +7940 +6FE0 +A940 +2FC0 +2900 +3280 +2460 +ENDCHAR +STARTCHAR U_692A +ENCODING 26922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +F280 +2FE0 +2280 +3AA0 +6AA0 +A6C0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_692B +ENCODING 26923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2540 +77C0 +6D40 +A7C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_692C +ENCODING 26924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +7440 +6FC0 +A440 +A7C0 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_692D +ENCODING 26925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA80 +2DE0 +2AA0 +3AE0 +6AA0 +AEE0 +28A0 +28A0 +28E0 +ENDCHAR +STARTCHAR U_692E +ENCODING 26926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4F80 +E200 +5FE0 +6500 +CA80 +D560 +C200 +4C80 +4300 +5C00 +ENDCHAR +STARTCHAR U_692F +ENCODING 26927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +2FE0 +3100 +6FE0 +AAA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_6930 +ENCODING 26928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEA0 +2AA0 +2AC0 +3EA0 +6AA0 +AAA0 +2FE0 +2280 +2280 +ENDCHAR +STARTCHAR U_6931 +ENCODING 26929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +F800 +23C0 +7240 +6BC0 +A240 +23C0 +2640 +2980 +2660 +ENDCHAR +STARTCHAR U_6932 +ENCODING 26930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F240 +2FE0 +2440 +37C0 +6900 +AFE0 +2500 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6933 +ENCODING 26931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +27C0 +3000 +6FE0 +A520 +2540 +2680 +2C60 +ENDCHAR +STARTCHAR U_6934 +ENCODING 26932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +FF40 +2860 +29C0 +3F40 +6940 +A940 +3E80 +2940 +2A20 +ENDCHAR +STARTCHAR U_6935 +ENCODING 26933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +FEE0 +2800 +2EE0 +38A0 +68A0 +AEA0 +2840 +28A0 +2920 +ENDCHAR +STARTCHAR U_6936 +ENCODING 26934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +FAA0 +2FE0 +7440 +6A20 +B7E0 +2A40 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_6937 +ENCODING 26935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2880 +2FA0 +38A0 +6EA0 +AAC0 +2EA0 +3160 +2220 +ENDCHAR +STARTCHAR U_6938 +ENCODING 26936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +2FE0 +FA80 +2EA0 +3AE0 +6BA0 +AAE0 +2A80 +3220 +25E0 +ENDCHAR +STARTCHAR U_6939 +ENCODING 26937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +FA40 +23C0 +2240 +33C0 +6A40 +AFE0 +2540 +2620 +27E0 +ENDCHAR +STARTCHAR U_693A +ENCODING 26938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2BC0 +FA40 +2BC0 +3900 +6FE0 +6900 +AB80 +2D40 +2920 +2900 +ENDCHAR +STARTCHAR U_693B +ENCODING 26939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FDE0 +2520 +25E0 +3480 +6FE0 +A540 +24C0 +2520 +27E0 +ENDCHAR +STARTCHAR U_693C +ENCODING 26940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +2900 +F000 +26E0 +2940 +3940 +6940 +AE40 +2A40 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_693D +ENCODING 26941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2280 +F780 +2080 +6FE0 +7520 +AAC0 +A580 +2AC0 +24A0 +2980 +ENDCHAR +STARTCHAR U_693E +ENCODING 26942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F000 +2E20 +7AA0 +6EA0 +6AA0 +AEA0 +2AA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_693F +ENCODING 26943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +3200 +6FE0 +6440 +AFE0 +2540 +24C0 +27C0 +ENDCHAR +STARTCHAR U_6940 +ENCODING 26944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +27C0 +3540 +2FC0 +6100 +AFE0 +29A0 +2F60 +2860 +ENDCHAR +STARTCHAR U_6941 +ENCODING 26945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA20 +23C0 +3240 +2D80 +6240 +AFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6942 +ENCODING 26946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD40 +2920 +37C0 +2C40 +67C0 +A440 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6943 +ENCODING 26947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +FFC0 +6800 +7FC0 +AA80 +AFC0 +2900 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_6944 +ENCODING 26948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +3800 +2FE0 +6AA0 +AFE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_6945 +ENCODING 26949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +2240 +33C0 +2800 +67E0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_6946 +ENCODING 26950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6FE0 +7100 +AFE0 +2240 +2680 +2140 +2E20 +ENDCHAR +STARTCHAR U_6947 +ENCODING 26951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +2540 +7FE0 +6820 +ABA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6948 +ENCODING 26952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +F5C0 +2D00 +37E0 +2C40 +67C0 +A440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_6949 +ENCODING 26953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +37E0 +2A00 +67E0 +AA20 +3220 +23E0 +2220 +ENDCHAR +STARTCHAR U_694A +ENCODING 26954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +37E0 +2C00 +67E0 +AAA0 +22A0 +2520 +22C0 +ENDCHAR +STARTCHAR U_694B +ENCODING 26955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2F20 +F2A0 +2FA0 +2AA0 +3FA0 +62A0 +A6A0 +2B20 +32A0 +2260 +ENDCHAR +STARTCHAR U_694C +ENCODING 26956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +27E0 +3440 +2C80 +6720 +A4C0 +2720 +28C0 +3300 +ENDCHAR +STARTCHAR U_694D +ENCODING 26957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0E00 +1500 +E4E0 +0000 +EEE0 +AAA0 +AAA0 +AAA0 +EEE0 +ENDCHAR +STARTCHAR U_694E +ENCODING 26958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F100 +2FE0 +3540 +2FC0 +6540 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_694F +ENCODING 26959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +2520 +33C0 +2900 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6950 +ENCODING 26960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A40 +FFC0 +2A40 +6FC0 +7300 +ACE0 +3480 +2480 +2480 +2880 +ENDCHAR +STARTCHAR U_6951 +ENCODING 26961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +F680 +2240 +3420 +2FC0 +6100 +AFE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6952 +ENCODING 26962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +37E0 +2C20 +6100 +A2C0 +2A20 +3A60 +21C0 +ENDCHAR +STARTCHAR U_6953 +ENCODING 26963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +24C0 +FD40 +27C0 +3540 +2D40 +67C0 +A540 +2540 +2920 +33A0 +ENDCHAR +STARTCHAR U_6954 +ENCODING 26964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2EA0 +24A0 +3F20 +6440 +AFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6955 +ENCODING 26965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F400 +37C0 +6900 +7FE0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6956 +ENCODING 26966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEA0 +2AA0 +2EA0 +3AA0 +68A0 +AAA0 +2AE0 +2D80 +2880 +ENDCHAR +STARTCHAR U_6957 +ENCODING 26967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +25E0 +F4A0 +2BE0 +3CA0 +27E0 +7480 +AFE0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_6958 +ENCODING 26968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +3480 +5140 +B220 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6959 +ENCODING 26969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +F5E0 +2F80 +2580 +34C0 +6DA0 +B6A0 +2480 +2480 +2C80 +ENDCHAR +STARTCHAR U_695A +ENCODING 26970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +39C0 +56A0 +9080 +7FE0 +1220 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_695B +ENCODING 26971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +37E0 +2900 +67C0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_695C +ENCODING 26972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FFA0 +24E0 +34A0 +6EA0 +AAE0 +2AA0 +2EA0 +2120 +2260 +ENDCHAR +STARTCHAR U_695D +ENCODING 26973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_695E +ENCODING 26974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +7100 +6FE0 +A200 +A3E0 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_695F +ENCODING 26975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +23C0 +6000 +77E0 +A820 +A7E0 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_6960 +ENCODING 26976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A920 +2FE0 +2920 +2860 +ENDCHAR +STARTCHAR U_6961 +ENCODING 26977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +7000 +6EA0 +AAA0 +2F40 +2B40 +2EA0 +2AA0 +ENDCHAR +STARTCHAR U_6962 +ENCODING 26978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +2FE0 +3AA0 +6CE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6963 +ENCODING 26979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2800 +2BE0 +3A20 +6BE0 +AA20 +2BE0 +3220 +23E0 +ENDCHAR +STARTCHAR U_6964 +ENCODING 26980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +34A0 +2920 +62A0 +6440 +B240 +3520 +2460 +23C0 +ENDCHAR +STARTCHAR U_6965 +ENCODING 26981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FCA0 +27E0 +2100 +37E0 +6A00 +A3E0 +2520 +28C0 +3320 +ENDCHAR +STARTCHAR U_6966 +ENCODING 26982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +2000 +37E0 +2A40 +63C0 +A240 +23C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6967 +ENCODING 26983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2200 +2FC0 +7A40 +6A40 +BFE0 +2500 +2880 +3060 +ENDCHAR +STARTCHAR U_6968 +ENCODING 26984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2440 +37C0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6969 +ENCODING 26985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FBE0 +2AA0 +2BE0 +3AA0 +6BE0 +AA80 +2900 +2A80 +2C60 +ENDCHAR +STARTCHAR U_696A +ENCODING 26986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27E0 +FD40 +25C0 +3400 +2FE0 +6100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_696B +ENCODING 26987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2FE0 +2440 +37C0 +6C40 +A7C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_696C +ENCODING 26988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +37C0 +2A00 +67E0 +ACA0 +2560 +27A0 +20C0 +ENDCHAR +STARTCHAR U_696D +ENCODING 26989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_696E +ENCODING 26990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +2FE0 +3100 +2FC0 +6440 +AFC0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_696F +ENCODING 26991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2480 +35E0 +2D20 +65E0 +A520 +25E0 +2920 +31E0 +ENDCHAR +STARTCHAR U_6970 +ENCODING 26992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2D60 +F920 +2FE0 +2920 +3FE0 +6920 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6971 +ENCODING 26993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +2200 +37E0 +2C40 +6BA0 +A100 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6972 +ENCODING 26994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +40A0 +FFE0 +5680 +74A0 +DFA0 +54A0 +5AC0 +54A0 +6B60 +4220 +ENDCHAR +STARTCHAR U_6973 +ENCODING 26995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +7440 +6FC0 +A100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_6974 +ENCODING 26996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +3FE0 +2920 +67C0 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_6975 +ENCODING 26997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4080 +E100 +5DE0 +7520 +55A0 +DD40 +55A0 +4120 +4200 +4FE0 +ENDCHAR +STARTCHAR U_6976 +ENCODING 26998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +D320 +4CC0 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6977 +ENCODING 26999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26A0 +FCC0 +26A0 +64E0 +7900 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6978 +ENCODING 27000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2440 +F540 +2F60 +3540 +2640 +6D40 +B4A0 +24A0 +2520 +2620 +ENDCHAR +STARTCHAR U_6979 +ENCODING 27001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2480 +F5E0 +27A0 +74A0 +6B20 +B4C0 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_697A +ENCODING 27002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FFE0 +21A0 +32C0 +2D80 +6100 +AFE0 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_697B +ENCODING 27003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FE0 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_697C +ENCODING 27004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F100 +2FE0 +7540 +6920 +A100 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_697D +ENCODING 27005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +9F20 +5140 +3F80 +5140 +9F20 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_697E +ENCODING 27006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +7440 +6FC0 +A100 +2D60 +2580 +2960 +2300 +ENDCHAR +STARTCHAR U_697F +ENCODING 27007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2380 +7D40 +6920 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6980 +ENCODING 27008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +3EE0 +6AA0 +AAA0 +2AA0 +2EE0 +2AA0 +ENDCHAR +STARTCHAR U_6981 +ENCODING 27009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F820 +27C0 +7200 +6480 +AFC0 +2240 +2F80 +2200 +3FE0 +ENDCHAR +STARTCHAR U_6982 +ENCODING 27010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A40 +FE40 +2B40 +2FE0 +3A40 +6C40 +AAC0 +2D40 +2A40 +2460 +ENDCHAR +STARTCHAR U_6983 +ENCODING 27011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +71C0 +AAA0 +A4A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_6984 +ENCODING 27012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB40 +2A20 +27C0 +3440 +6D40 +A540 +25C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6985 +ENCODING 27013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F440 +47C0 +6440 +D7C0 +D000 +4FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6986 +ENCODING 27014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +FB60 +2000 +6E20 +7AA0 +AEA0 +AAA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_6987 +ENCODING 27015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3100 +6FC0 +A100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_6988 +ENCODING 27016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2420 +F820 +2BA0 +6AA0 +7BA0 +A820 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6989 +ENCODING 27017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2280 +3540 +2920 +67C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_698A +ENCODING 27018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4480 +FFE0 +6AA0 +5FE0 +DAA0 +6BE0 +4880 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_698B +ENCODING 27019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77C0 +6800 +AEE0 +2220 +2EE0 +2220 +2EE0 +ENDCHAR +STARTCHAR U_698C +ENCODING 27020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F40 +F180 +2540 +7AC0 +6A00 +BFA0 +2AC0 +2AA0 +2A40 +3220 +ENDCHAR +STARTCHAR U_698D +ENCODING 27021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2CA0 +2AC0 +3BE0 +6A20 +ABE0 +2A20 +2BE0 +3260 +ENDCHAR +STARTCHAR U_698E +ENCODING 27022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FF40 +25C0 +3440 +2FC0 +6200 +A7E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_698F +ENCODING 27023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +7440 +6820 +AFE0 +AAA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6990 +ENCODING 27024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2540 +37E0 +2D40 +67E0 +AAA0 +2A40 +2B20 +3620 +ENDCHAR +STARTCHAR U_6991 +ENCODING 27025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +F540 +2FC0 +3540 +27C0 +6D40 +AFE0 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_6992 +ENCODING 27026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +F220 +6EE0 +7880 +6EE0 +AAA0 +2660 +2AA0 +2220 +2440 +ENDCHAR +STARTCHAR U_6993 +ENCODING 27027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2280 +F740 +2A20 +3240 +2DC0 +6000 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6994 +ENCODING 27028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2EA0 +FAA0 +2EA0 +3AC0 +2EA0 +68A0 +AAA0 +2AE0 +3D80 +2080 +ENDCHAR +STARTCHAR U_6995 +ENCODING 27029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +3380 +2C40 +6FE0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6996 +ENCODING 27030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA40 +8C20 +73C0 +2240 +FD40 +7080 +A940 +2620 +ENDCHAR +STARTCHAR U_6997 +ENCODING 27031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FAA0 +26C0 +2FE0 +3000 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6998 +ENCODING 27032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A00 +A3C0 +FA40 +23C0 +5200 +8BE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6999 +ENCODING 27033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +2380 +3440 +2BA0 +6000 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_699A +ENCODING 27034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +37C0 +2900 +6FE0 +A000 +2540 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_699B +ENCODING 27035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7200 +6FE0 +A540 +2BA0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_699C +ENCODING 27036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2920 +3080 +6FE0 +A200 +23C0 +2440 +39C0 +ENDCHAR +STARTCHAR U_699D +ENCODING 27037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +4940 +5540 +EA60 +5C00 +E9C0 +DD40 +5B40 +6880 +4940 +4A20 +ENDCHAR +STARTCHAR U_699E +ENCODING 27038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FDE0 +2520 +35E0 +2D20 +65E0 +A480 +29C0 +2AA0 +35A0 +ENDCHAR +STARTCHAR U_699F +ENCODING 27039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +3920 +6FC0 +6280 +6FE0 +A100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_69A0 +ENCODING 27040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFC0 +2440 +27C0 +3440 +6FC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69A1 +ENCODING 27041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +2100 +2FE0 +3240 +6780 +A240 +2FA0 +2540 +3B20 +ENDCHAR +STARTCHAR U_69A2 +ENCODING 27042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F820 +37C0 +2A00 +6560 +6280 +ADC0 +22A0 +2C80 +2100 +ENDCHAR +STARTCHAR U_69A3 +ENCODING 27043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +FD20 +22C0 +6400 +77E0 +A880 +AFE0 +2080 +24A0 +27E0 +ENDCHAR +STARTCHAR U_69A4 +ENCODING 27044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +F940 +25E0 +3240 +2D40 +6FE0 +A100 +2380 +2540 +3920 +ENDCHAR +STARTCHAR U_69A5 +ENCODING 27045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2420 +37E0 +2920 +6540 +AFE0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_69A6 +ENCODING 27046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +2140 +FE20 +8880 +FFE0 +8880 +F9C0 +22A0 +FCA0 +2080 +ENDCHAR +STARTCHAR U_69A7 +ENCODING 27047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FD40 +2760 +3540 +2F60 +6540 +A760 +2540 +2540 +27E0 +ENDCHAR +STARTCHAR U_69A8 +ENCODING 27048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +2240 +3520 +2BE0 +6500 +A9E0 +2100 +21E0 +2100 +ENDCHAR +STARTCHAR U_69A9 +ENCODING 27049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +3520 +2FE0 +6480 +A7E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_69AA +ENCODING 27050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FFC0 +2480 +37C0 +2C80 +67E0 +A020 +2560 +2AA0 +2A60 +ENDCHAR +STARTCHAR U_69AB +ENCODING 27051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FC80 +27C0 +3480 +2FC0 +6480 +A7E0 +2080 +2FE0 +2080 +ENDCHAR +STARTCHAR U_69AC +ENCODING 27052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +27E0 +3000 +2FC0 +6440 +A7C0 +26A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_69AD +ENCODING 27053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2E40 +FBE0 +2E40 +3B40 +2EC0 +6A40 +BE40 +2A40 +3240 +26C0 +ENDCHAR +STARTCHAR U_69AE +ENCODING 27054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54A0 +5AA0 +9080 +2940 +4620 +FFE0 +8420 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69AF +ENCODING 27055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +FA80 +2BE0 +2E40 +3BE0 +6A40 +AF40 +2AC0 +2040 +20C0 +ENDCHAR +STARTCHAR U_69B0 +ENCODING 27056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +2140 +FFE0 +2240 +27A0 +3220 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_69B1 +ENCODING 27057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F800 +23C0 +3240 +2FE0 +6240 +A3C0 +26A0 +2B40 +2220 +ENDCHAR +STARTCHAR U_69B2 +ENCODING 27058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FEC0 +2440 +77C0 +6800 +AFE0 +AAA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69B3 +ENCODING 27059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +2EE0 +2A40 +3FE0 +6A40 +AA40 +2BE0 +3500 +28E0 +ENDCHAR +STARTCHAR U_69B4 +ENCODING 27060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +28A0 +FAA0 +2DA0 +3960 +2000 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_69B5 +ENCODING 27061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +FA40 +2FE0 +3440 +2FC0 +6440 +A7C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_69B6 +ENCODING 27062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD40 +27E0 +3540 +2FC0 +6500 +A7C0 +2A40 +2BC0 +3240 +ENDCHAR +STARTCHAR U_69B7 +ENCODING 27063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27E0 +3480 +2FC0 +7480 +A7C0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_69B8 +ENCODING 27064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4BE0 +EAA0 +5FE0 +6AA0 +DAA0 +CBE0 +4880 +4FE0 +7080 +4FE0 +ENDCHAR +STARTCHAR U_69B9 +ENCODING 27065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FCE0 +2480 +37E0 +2CA0 +67C0 +A4A0 +25E0 +2940 +3260 +ENDCHAR +STARTCHAR U_69BA +ENCODING 27066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5380 +5FE0 +7100 +5FE0 +5440 +7920 +57C0 +5380 +9540 +B920 +ENDCHAR +STARTCHAR U_69BB +ENCODING 27067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +AEE0 +AAA0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_69BC +ENCODING 27068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +3200 +2440 +6FA0 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69BD +ENCODING 27069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +FAC0 +2240 +3780 +2940 +67A0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69BE +ENCODING 27070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F740 +2FE0 +6820 +77C0 +AC40 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_69BF +ENCODING 27071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +3FE0 +2800 +67C0 +A440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_69C0 +ENCODING 27072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +5140 +5F40 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69C1 +ENCODING 27073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +3000 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_69C2 +ENCODING 27074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C60 +4780 +F920 +4BC0 +48A0 +6FE0 +D880 +4AC0 +4AA0 +6CA0 +5980 +ENDCHAR +STARTCHAR U_69C3 +ENCODING 27075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +AA60 +FC00 +ABE0 +A940 +9880 +0540 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69C4 +ENCODING 27076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F820 +2540 +7200 +6CE0 +A420 +A6E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_69C5 +ENCODING 27077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FFC0 +3000 +6FE0 +6CA0 +AAA0 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_69C6 +ENCODING 27078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +3420 +2BA0 +62A0 +A3A0 +22A0 +23A0 +20C0 +ENDCHAR +STARTCHAR U_69C7 +ENCODING 27079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +F7E0 +32C0 +2B40 +6AC0 +6BC0 +A800 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_69C8 +ENCODING 27080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2800 +FFE0 +2B40 +6A80 +7B60 +A840 +AFE0 +2A40 +2A40 +30C0 +ENDCHAR +STARTCHAR U_69C9 +ENCODING 27081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F500 +2D00 +35E0 +2680 +6FE0 +B480 +2540 +2A20 +3420 +ENDCHAR +STARTCHAR U_69CA +ENCODING 27082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +11E0 +5520 +7DE0 +1220 +2460 +4400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69CB +ENCODING 27083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2FE0 +3480 +6FE0 +A940 +AFC0 +2940 +3FE0 +28C0 +ENDCHAR +STARTCHAR U_69CC +ENCODING 27084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +F520 +21E0 +3D00 +65E0 +A520 +25E0 +2520 +2A00 +31E0 +ENDCHAR +STARTCHAR U_69CD +ENCODING 27085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +3440 +27C0 +6440 +A7E0 +2C20 +3420 +27E0 +ENDCHAR +STARTCHAR U_69CE +ENCODING 27086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +27C0 +3100 +6FE0 +A200 +27C0 +2880 +37E0 +ENDCHAR +STARTCHAR U_69CF +ENCODING 27087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F500 +2FC0 +2540 +3FE0 +6540 +AFC0 +2580 +2D40 +3520 +ENDCHAR +STARTCHAR U_69D0 +ENCODING 27088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2FC0 +3A40 +2FC0 +6240 +A3A0 +2560 +2920 +31E0 +ENDCHAR +STARTCHAR U_69D1 +ENCODING 27089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +1100 +FBE0 +3B80 +5540 +5920 +9100 +1100 +ENDCHAR +STARTCHAR U_69D2 +ENCODING 27090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2140 +77E0 +6800 +67E0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_69D3 +ENCODING 27091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +37C0 +6C40 +A7C0 +A440 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69D4 +ENCODING 27092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +2FC0 +2440 +3FE0 +6540 +A920 +37C0 +2100 +2100 +ENDCHAR +STARTCHAR U_69D5 +ENCODING 27093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +7440 +6FC0 +A440 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_69D6 +ENCODING 27094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8820 +3F80 +D080 +1080 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69D7 +ENCODING 27095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F400 +2FC0 +7440 +6FE0 +A820 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_69D8 +ENCODING 27096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +2FC0 +7100 +6FE0 +A100 +A540 +2380 +2D40 +2320 +ENDCHAR +STARTCHAR U_69D9 +ENCODING 27097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +27C0 +3440 +2F40 +65C0 +A440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69DA +ENCODING 27098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +7FE0 +6800 +A7C0 +A540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_69DB +ENCODING 27099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2A80 +FAE0 +2A80 +2AC0 +3320 +6000 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69DC +ENCODING 27100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27E0 +FC80 +37C0 +6C80 +67E0 +A400 +2FC0 +2260 +2420 +28C0 +ENDCHAR +STARTCHAR U_69DD +ENCODING 27101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +7440 +6FC0 +6400 +A7E0 +2AA0 +2FA0 +2060 +ENDCHAR +STARTCHAR U_69DE +ENCODING 27102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +7540 +6FC0 +A540 +27C0 +2100 +2120 +20E0 +ENDCHAR +STARTCHAR U_69DF +ENCODING 27103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +7400 +6FE0 +A480 +A480 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_69E0 +ENCODING 27104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2BE0 +F4A0 +23E0 +6C80 +75E0 +A520 +A7E0 +2520 +21E0 +2120 +ENDCHAR +STARTCHAR U_69E1 +ENCODING 27105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +F100 +2EE0 +7440 +6AA0 +A100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_69E2 +ENCODING 27106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2220 +FAA0 +2660 +3AA0 +6920 +A7C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_69E3 +ENCODING 27107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +37C0 +2A80 +6440 +6FE0 +A540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_69E4 +ENCODING 27108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +27E0 +F2A0 +23E0 +2EA0 +37E0 +6C80 +A7E0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_69E5 +ENCODING 27109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2440 +FEE0 +2440 +3EE0 +2440 +67E0 +A020 +27E0 +2020 +27E0 +ENDCHAR +STARTCHAR U_69E6 +ENCODING 27110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F940 +2FE0 +3940 +2FE0 +6D20 +AFE0 +2D20 +37E0 +2560 +ENDCHAR +STARTCHAR U_69E7 +ENCODING 27111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +5500 +7DE0 +5540 +FD40 +1240 +0400 +FFE0 +1480 +E460 +ENDCHAR +STARTCHAR U_69E8 +ENCODING 27112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2FA0 +FAA0 +2EC0 +30A0 +2FA0 +62A0 +A7A0 +3CE0 +2480 +2C80 +ENDCHAR +STARTCHAR U_69E9 +ENCODING 27113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +6A80 +5BE0 +7980 +52A0 +6CE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69EA +ENCODING 27114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +FA40 +2E40 +7BE0 +6E40 +A840 +AEC0 +28C0 +2740 +2260 +ENDCHAR +STARTCHAR U_69EB +ENCODING 27115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +7540 +6FC0 +A0A0 +AFE0 +2480 +2280 +2180 +ENDCHAR +STARTCHAR U_69EC +ENCODING 27116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +26A0 +FAA0 +2EA0 +22A0 +7EA0 +AAA0 +AEA0 +22A0 +32E0 +2DA0 +ENDCHAR +STARTCHAR U_69ED +ENCODING 27117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2A80 +3B80 +6AA0 +AFA0 +2A40 +2F40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_69EE +ENCODING 27118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2AA0 +7FE0 +6A80 +A540 +AAA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_69EF +ENCODING 27119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFC0 +3280 +6FE0 +7C80 +A7C0 +2480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_69F0 +ENCODING 27120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F640 +2980 +7760 +7900 +ABC0 +2900 +2FE0 +2900 +37E0 +ENDCHAR +STARTCHAR U_69F1 +ENCODING 27121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +3CE0 +2820 +6FE0 +A820 +2FE0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_69F2 +ENCODING 27122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +27A0 +FA60 +2FA0 +2AE0 +3FA0 +6AA0 +AFE0 +2AA0 +2AA0 +31A0 +ENDCHAR +STARTCHAR U_69F3 +ENCODING 27123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4B40 +7E80 +0940 +FFE0 +4940 +8A40 +FFE0 +1280 +2240 +C220 +ENDCHAR +STARTCHAR U_69F4 +ENCODING 27124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2940 +3BE0 +6AA0 +ABE0 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_69F5 +ENCODING 27125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2FC0 +2200 +6FC0 +6A40 +AFC0 +2220 +3540 +33C0 +ENDCHAR +STARTCHAR U_69F6 +ENCODING 27126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +2920 +2EA0 +3AA0 +6EE0 +A8A0 +2F60 +2820 +2FE0 +ENDCHAR +STARTCHAR U_69F7 +ENCODING 27127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +FF40 +69C0 +A540 +FA20 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69F8 +ENCODING 27128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +F5E0 +2FA0 +34A0 +6BA0 +A4E0 +AEA0 +24A0 +3F20 +2220 +ENDCHAR +STARTCHAR U_69F9 +ENCODING 27129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +7440 +6FC0 +A540 +A380 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_69FA +ENCODING 27130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F940 +2FE0 +7940 +6FC0 +A900 +2D40 +2B80 +3560 +2B00 +ENDCHAR +STARTCHAR U_69FB +ENCODING 27131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FFE0 +2520 +6FE0 +7520 +ADE0 +A480 +2AA0 +31A0 +2260 +ENDCHAR +STARTCHAR U_69FC +ENCODING 27132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +27C0 +5280 +8EE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69FD +ENCODING 27133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FAA0 +2FE0 +2AA0 +3FE0 +6440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_69FE +ENCODING 27134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +3FE0 +2AA0 +6AA0 +AFE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_69FF +ENCODING 27135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +27C0 +3540 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A00 +ENCODING 27136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2FE0 +6920 +7FE0 +A920 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A01 +ENCODING 27137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +6280 +7440 +AEE0 +A440 +26C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A02 +ENCODING 27138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6A03 +ENCODING 27139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EE0 +FAA0 +2EA0 +7AE0 +6EA0 +A8E0 +2CA0 +2AA0 +2D20 +2260 +ENDCHAR +STARTCHAR U_6A04 +ENCODING 27140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA80 +2DE0 +3AA0 +2BE0 +6AA0 +AFE0 +2880 +29C0 +2EA0 +ENDCHAR +STARTCHAR U_6A05 +ENCODING 27141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2940 +F6A0 +22A0 +3800 +2A80 +7AE0 +AA80 +2A80 +2D80 +28E0 +ENDCHAR +STARTCHAR U_6A06 +ENCODING 27142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2AA0 +2FE0 +3100 +6FE0 +A920 +2AA0 +2F60 +2820 +ENDCHAR +STARTCHAR U_6A07 +ENCODING 27143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24E0 +F9A0 +2A40 +3AA0 +2AE0 +6AA0 +AAE0 +2AA0 +2AE0 +28A0 +ENDCHAR +STARTCHAR U_6A08 +ENCODING 27144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +6440 +77C0 +AC40 +A7C0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_6A09 +ENCODING 27145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2BA0 +3540 +2BA0 +6540 +AAA0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6A0A +ENCODING 27146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2440 +FBE0 +2A40 +74E0 +AB40 +2440 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_6A0B +ENCODING 27147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +2940 +F080 +63E0 +7AA0 +ABE0 +AAA0 +2BE0 +2AA0 +2800 +37E0 +ENDCHAR +STARTCHAR U_6A0C +ENCODING 27148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +77C0 +6C40 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6A0D +ENCODING 27149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2100 +37E0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A0E +ENCODING 27150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F420 +37C0 +6900 +7BC0 +6A40 +ABC0 +2A40 +2A40 +2BC0 +ENDCHAR +STARTCHAR U_6A0F +ENCODING 27151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +3FE0 +2240 +6F80 +A240 +2FA0 +2940 +3320 +ENDCHAR +STARTCHAR U_6A10 +ENCODING 27152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +2FE0 +6D60 +7AA0 +6D60 +AAA0 +2D60 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6A11 +ENCODING 27153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2540 +FB60 +2540 +7940 +6AC0 +A500 +AFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6A12 +ENCODING 27154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F940 +62A0 +7740 +6BC0 +AC00 +2100 +2940 +2940 +2FC0 +ENDCHAR +STARTCHAR U_6A13 +ENCODING 27155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2540 +FFE0 +2540 +3FE0 +6520 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6A14 +ENCODING 27156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +27C0 +3540 +2FC0 +6540 +AFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6A15 +ENCODING 27157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F2A0 +2FA0 +2A40 +7FC0 +6A40 +A740 +2AC0 +32A0 +2320 +ENDCHAR +STARTCHAR U_6A16 +ENCODING 27158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +3F80 +2080 +3FE0 +E040 +2740 +7540 +AF40 +20C0 +ENDCHAR +STARTCHAR U_6A17 +ENCODING 27159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +67C0 +7000 +AFE0 +A200 +27C0 +2040 +2180 +ENDCHAR +STARTCHAR U_6A18 +ENCODING 27160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2820 +27C0 +3440 +6FC0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A19 +ENCODING 27161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3000 +67C0 +A000 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6A1A +ENCODING 27162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FE0 +7AA0 +6FE0 +AA80 +ABE0 +2A80 +2AA0 +3360 +ENDCHAR +STARTCHAR U_6A1B +ENCODING 27163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +25A0 +2320 +3CE0 +6640 +A180 +2620 +20C0 +2700 +ENDCHAR +STARTCHAR U_6A1C +ENCODING 27164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +6A40 +7FE0 +AA40 +AA40 +2BC0 +2800 +36A0 +2AA0 +ENDCHAR +STARTCHAR U_6A1D +ENCODING 27165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +2F80 +3920 +6BE0 +AA40 +2BC0 +2A40 +37E0 +ENDCHAR +STARTCHAR U_6A1E +ENCODING 27166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FBC0 +2A40 +2BC0 +3800 +6EE0 +AAA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6A1F +ENCODING 27167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2FE0 +3440 +6FC0 +A440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A20 +ENCODING 27168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2380 +3100 +2FE0 +6920 +ADA0 +2B60 +2920 +2860 +ENDCHAR +STARTCHAR U_6A21 +ENCODING 27169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +3440 +6FC0 +6440 +AFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A22 +ENCODING 27170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +7440 +6FE0 +A400 +A7E0 +2020 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_6A23 +ENCODING 27171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +7100 +6FE0 +A100 +AF20 +25C0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6A24 +ENCODING 27172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +49E0 +F340 +5480 +7560 +D680 +D5E0 +5480 +52C0 +54A0 +5180 +ENDCHAR +STARTCHAR U_6A25 +ENCODING 27173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +23C0 +6D40 +7380 +AD60 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A26 +ENCODING 27174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FC40 +2220 +2100 +37E0 +6900 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A27 +ENCODING 27175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2540 +FB40 +2560 +3600 +2FE0 +64A0 +AEA0 +3540 +24A0 +2520 +ENDCHAR +STARTCHAR U_6A28 +ENCODING 27176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +26A0 +35C0 +6EA0 +A480 +27E0 +2480 +2BE0 +3080 +ENDCHAR +STARTCHAR U_6A29 +ENCODING 27177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2900 +F7E0 +2200 +7480 +6FE0 +B480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6A2A +ENCODING 27178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2100 +77C0 +6540 +A7C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A2B +ENCODING 27179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +54A0 +FEA0 +5240 +FE40 +D4A0 +DE20 +4100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6A2C +ENCODING 27180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +25C0 +76C0 +6D40 +A7C0 +A240 +2520 +2C40 +33C0 +ENDCHAR +STARTCHAR U_6A2D +ENCODING 27181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2780 +7480 +6FE0 +A480 +A940 +37A0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A2E +ENCODING 27182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +2FE0 +7100 +6920 +A540 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6A2F +ENCODING 27183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2540 +3FE0 +6000 +AFE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6A30 +ENCODING 27184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +6D20 +7340 +6D20 +A7C0 +2040 +27C0 +2040 +27C0 +ENDCHAR +STARTCHAR U_6A31 +ENCODING 27185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FAA0 +2AA0 +2AA0 +3540 +6920 +AFE0 +2280 +2180 +2E60 +ENDCHAR +STARTCHAR U_6A32 +ENCODING 27186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +F080 +2E80 +2080 +3F80 +6A80 +AE80 +2AA0 +2E60 +3B20 +ENDCHAR +STARTCHAR U_6A33 +ENCODING 27187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +7040 +6FE0 +64A0 +A6E0 +2840 +2FE0 +2240 +2080 +ENDCHAR +STARTCHAR U_6A34 +ENCODING 27188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +FAA0 +2480 +6FE0 +7080 +AEA0 +AAC0 +2EA0 +2B60 +2E20 +ENDCHAR +STARTCHAR U_6A35 +ENCODING 27189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FC80 +27E0 +7480 +6FE0 +A480 +A7E0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6A36 +ENCODING 27190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +FFC0 +2840 +3FE0 +6A00 +7EE0 +AAA0 +AB40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_6A37 +ENCODING 27191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +2080 +FFE0 +4800 +7BE0 +4940 +FDC0 +0A20 +ENDCHAR +STARTCHAR U_6A38 +ENCODING 27192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +67C0 +7100 +AFC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A39 +ENCODING 27193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +F220 +2FE0 +7020 +6F20 +A9A0 +AF60 +2920 +2620 +3F60 +ENDCHAR +STARTCHAR U_6A3A +ENCODING 27194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2540 +3FE0 +6540 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A3B +ENCODING 27195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2440 +37C0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A3C +ENCODING 27196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2440 +37E0 +6C80 +A7E0 +2A40 +2FE0 +2A40 +36C0 +ENDCHAR +STARTCHAR U_6A3D +ENCODING 27197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F280 +2FE0 +6AA0 +7C60 +AFE0 +A040 +2FE0 +2440 +22C0 +ENDCHAR +STARTCHAR U_6A3E +ENCODING 27198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4440 +FFE0 +4540 +5F40 +6560 +D740 +55A0 +5520 +6C00 +47E0 +ENDCHAR +STARTCHAR U_6A3F +ENCODING 27199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FFE0 +2540 +27C0 +3540 +6FC0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6A40 +ENCODING 27200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2FA0 +2540 +3540 +6960 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6A41 +ENCODING 27201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F240 +27E0 +6820 +77A0 +A4A0 +A7A0 +24A0 +27A0 +2040 +ENDCHAR +STARTCHAR U_6A42 +ENCODING 27202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F280 +2FE0 +7AA0 +6C60 +AFE0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A43 +ENCODING 27203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +54A0 +E840 +7DE0 +4540 +DE60 +5000 +5DC0 +4540 +5480 +4940 +ENDCHAR +STARTCHAR U_6A44 +ENCODING 27204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +FFE0 +2AA0 +2EA0 +3AA0 +6EA0 +AAA0 +2A40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_6A45 +ENCODING 27205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +EFE0 +3540 +6FE0 +6540 +A540 +BFE0 +2000 +2D40 +32A0 +ENDCHAR +STARTCHAR U_6A46 +ENCODING 27206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +AA80 +FFE0 +2A80 +FFE0 +2080 +FBE0 +2080 +71C0 +AAA0 +ENDCHAR +STARTCHAR U_6A47 +ENCODING 27207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2100 +37E0 +2100 +6FE0 +A480 +2FE0 +24A0 +2FE0 +ENDCHAR +STARTCHAR U_6A48 +ENCODING 27208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +7440 +6FE0 +A440 +AFE0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_6A49 +ENCODING 27209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2540 +6920 +7440 +A7E0 +A940 +2BE0 +2440 +2840 +ENDCHAR +STARTCHAR U_6A4A +ENCODING 27210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FEE0 +2AA0 +6EE0 +7280 +AFE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A4B +ENCODING 27211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +FFE0 +2480 +2FC0 +74A0 +AFE0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6A4C +ENCODING 27212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +4AA0 +6EE0 +DBA0 +CAA0 +4BA0 +4AA0 +4DA0 +4840 +ENDCHAR +STARTCHAR U_6A4D +ENCODING 27213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7BA0 +A920 +ABA0 +2920 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A4E +ENCODING 27214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2920 +F540 +2FE0 +3540 +6920 +A7C0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_6A4F +ENCODING 27215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +3100 +6FE0 +A280 +2FE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6A50 +ENCODING 27216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4440 +FFE0 +8020 +BFE0 +5080 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6A51 +ENCODING 27217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +6C60 +77C0 +A440 +A7C0 +2100 +2940 +3320 +ENDCHAR +STARTCHAR U_6A52 +ENCODING 27218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +7540 +6920 +A7C0 +2000 +2FE0 +2280 +27C0 +ENDCHAR +STARTCHAR U_6A53 +ENCODING 27219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +2FE0 +6820 +7440 +AFE0 +B340 +2DE0 +2840 +3040 +ENDCHAR +STARTCHAR U_6A54 +ENCODING 27220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +FAE0 +2FA0 +70A0 +6EA0 +A4A0 +A6A0 +2C40 +24A0 +2D20 +ENDCHAR +STARTCHAR U_6A55 +ENCODING 27221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +6380 +7000 +AFE0 +A480 +2FE0 +2280 +2D80 +ENDCHAR +STARTCHAR U_6A56 +ENCODING 27222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2820 +67C0 +7440 +AFC0 +A100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_6A57 +ENCODING 27223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2EE0 +6AA0 +7EE0 +AAA0 +AAE0 +2EA0 +2120 +2260 +ENDCHAR +STARTCHAR U_6A58 +ENCODING 27224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2520 +2940 +3FE0 +6AA0 +AC60 +2BA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_6A59 +ENCODING 27225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2AA0 +F440 +27C0 +3820 +27C0 +6440 +A7C0 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6A5A +ENCODING 27226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +6140 +7FC0 +A920 +AFE0 +2920 +2EE0 +32A0 +ENDCHAR +STARTCHAR U_6A5B +ENCODING 27227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2D80 +FA80 +2FE0 +2A20 +3AC0 +6FC0 +AA40 +2A40 +34A0 +2920 +ENDCHAR +STARTCHAR U_6A5C +ENCODING 27228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +7FE0 +4AA0 +7E80 +4940 +5220 +7FE0 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_6A5D +ENCODING 27229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +6FC0 +A440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6A5E +ENCODING 27230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +2540 +37C0 +6140 +AFA0 +2AC0 +2A20 +31C0 +ENDCHAR +STARTCHAR U_6A5F +ENCODING 27231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +29A0 +FF40 +2520 +6FE0 +7540 +AFE0 +A540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_6A60 +ENCODING 27232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2500 +7280 +6DE0 +A240 +AF80 +22A0 +2E40 +2320 +ENDCHAR +STARTCHAR U_6A61 +ENCODING 27233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FFE0 +24A0 +37E0 +2A40 +6D80 +A2C0 +2DA0 +22A0 +2D80 +ENDCHAR +STARTCHAR U_6A62 +ENCODING 27234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA00 +2DE0 +6A80 +7BE0 +AB20 +AFE0 +2920 +29E0 +2920 +ENDCHAR +STARTCHAR U_6A63 +ENCODING 27235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +F940 +44A0 +6B80 +DFC0 +CA40 +4FC0 +4A40 +4FC0 +4A40 +ENDCHAR +STARTCHAR U_6A64 +ENCODING 27236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1600 +5140 +5F20 +2080 +5340 +CD20 +79E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A65 +ENCODING 27237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57A0 +2140 +6FE0 +B440 +5FC0 +9440 +37C0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A66 +ENCODING 27238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2100 +37E0 +2D40 +67C0 +A540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A67 +ENCODING 27239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2AA0 +2920 +3FE0 +6440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6A68 +ENCODING 27240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2FE0 +6440 +77C0 +AC40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A69 +ENCODING 27241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2F60 +F540 +2440 +2AA0 +3FE0 +6820 +A780 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_6A6A +ENCODING 27242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +26A0 +F580 +2DE0 +7280 +6A80 +A540 +AA20 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6A6B +ENCODING 27243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +2100 +37C0 +6D40 +A7C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A6C +ENCODING 27244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +5540 +FFE0 +4AC0 +6B60 +D000 +C7C0 +4440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6A6D +ENCODING 27245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +3FE0 +6280 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A6E +ENCODING 27246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +28A0 +FAA0 +2D60 +77C0 +6C40 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6A6F +ENCODING 27247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2B60 +F2C0 +2520 +3FE0 +6820 +A200 +2FE0 +2220 +2520 +38C0 +ENDCHAR +STARTCHAR U_6A70 +ENCODING 27248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +7440 +67C0 +AD60 +2380 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A71 +ENCODING 27249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FFA0 +2820 +6BE0 +7AA0 +ABE0 +AAA0 +2920 +2FA0 +3060 +ENDCHAR +STARTCHAR U_6A72 +ENCODING 27250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F200 +2FC0 +7840 +6FC0 +A480 +3FE0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_6A73 +ENCODING 27251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EA0 +55C0 +F7E0 +5C80 +77E0 +D540 +DEA0 +57C0 +5540 +6540 +4EC0 +ENDCHAR +STARTCHAR U_6A74 +ENCODING 27252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +56C0 +F4A0 +5EE0 +E240 +D580 +C240 +4FE0 +4100 +4D40 +5320 +ENDCHAR +STARTCHAR U_6A75 +ENCODING 27253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +5F40 +EAE0 +5FA0 +E0A0 +DEA0 +D2A0 +5E40 +5240 +5EA0 +5320 +ENDCHAR +STARTCHAR U_6A76 +ENCODING 27254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +F480 +2FE0 +6A80 +7EA0 +AAA0 +AEA0 +2440 +2EE0 +2520 +ENDCHAR +STARTCHAR U_6A77 +ENCODING 27255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4BC0 +FAE0 +4BC0 +DAC0 +EBE0 +C000 +4480 +44A0 +44A0 +58E0 +ENDCHAR +STARTCHAR U_6A78 +ENCODING 27256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F7C0 +4440 +E7C0 +DEE0 +4AA0 +4EA0 +4AE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_6A79 +ENCODING 27257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFC0 +2540 +67C0 +7540 +AFE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A7A +ENCODING 27258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7BA0 +AAA0 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A7B +ENCODING 27259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4240 +F7C0 +4240 +6240 +DFE0 +CAA0 +4AA0 +5FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6A7C +ENCODING 27260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2540 +F940 +2FE0 +3500 +6AA0 +ADC0 +A2A0 +25A0 +3A80 +2100 +ENDCHAR +STARTCHAR U_6A7D +ENCODING 27261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4BE0 +F080 +47E0 +D940 +EBE0 +C880 +4BE0 +4880 +4C80 +53E0 +ENDCHAR +STARTCHAR U_6A7E +ENCODING 27262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +6EE0 +7AA0 +AEE0 +A100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_6A7F +ENCODING 27263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFC0 +2540 +2FE0 +3000 +67C0 +A540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_6A80 +ENCODING 27264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2AA0 +2BA0 +3820 +6FE0 +A440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_6A81 +ENCODING 27265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2BA0 +3820 +2FE0 +6380 +A100 +2FE0 +2540 +3920 +ENDCHAR +STARTCHAR U_6A82 +ENCODING 27266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FAA0 +4FE0 +E000 +DFE0 +C800 +4FE0 +4AA0 +4A40 +5320 +ENDCHAR +STARTCHAR U_6A83 +ENCODING 27267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF80 +AA40 +AFC0 +C100 +AFE0 +A040 +EFC0 +8040 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A84 +ENCODING 27268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +F2E0 +5F20 +52A0 +FEA0 +C8A0 +5EA0 +4A40 +52A0 +6720 +ENDCHAR +STARTCHAR U_6A85 +ENCODING 27269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2500 +FFE0 +20A0 +2FE0 +3880 +6FA0 +AA40 +2F40 +3260 +2DA0 +ENDCHAR +STARTCHAR U_6A86 +ENCODING 27270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5760 +F440 +4640 +E940 +D4E0 +C5A0 +56A0 +54A0 +4AA0 +50E0 +ENDCHAR +STARTCHAR U_6A87 +ENCODING 27271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2FE0 +F900 +2FE0 +3900 +2FE0 +6900 +AFE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A88 +ENCODING 27272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FFE0 +4000 +EFE0 +D840 +CFC0 +4520 +44C0 +5D40 +4620 +ENDCHAR +STARTCHAR U_6A89 +ENCODING 27273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2AE0 +FEA0 +2AA0 +2FE0 +3A00 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A8A +ENCODING 27274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +F4A0 +4EA0 +EAE0 +DE40 +CA40 +4FE0 +4440 +5E40 +4440 +ENDCHAR +STARTCHAR U_6A8B +ENCODING 27275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +E280 +4FE0 +6540 +5FE0 +C540 +47C0 +4540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6A8C +ENCODING 27276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +6280 +7EE0 +A280 +AEE0 +2280 +2EE0 +2280 +ENDCHAR +STARTCHAR U_6A8D +ENCODING 27277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +3440 +67C0 +A440 +27C0 +2D40 +34A0 +23A0 +ENDCHAR +STARTCHAR U_6A8E +ENCODING 27278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +26C0 +3540 +6FC0 +A200 +2FE0 +2AA0 +2B60 +ENDCHAR +STARTCHAR U_6A8F +ENCODING 27279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4AA0 +EFE0 +4480 +6FE0 +5100 +CFC0 +4100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_6A90 +ENCODING 27280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FFE0 +26A0 +27E0 +3400 +6DC0 +A400 +27E0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_6A91 +ENCODING 27281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2BA0 +3540 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A92 +ENCODING 27282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +6AC0 +A4A0 +7FC0 +4440 +5F40 +5540 +5F40 +8540 +BEA0 +ENDCHAR +STARTCHAR U_6A93 +ENCODING 27283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +29A0 +FFA0 +29A0 +6F00 +70E0 +AEA0 +A4A0 +2440 +26A0 +3920 +ENDCHAR +STARTCHAR U_6A94 +ENCODING 27284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +3380 +2800 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A95 +ENCODING 27285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +7D20 +55E0 +FEA0 +5440 +7DA0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A96 +ENCODING 27286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +F480 +2100 +7EA0 +65C0 +A6C0 +A5A0 +26A0 +2C80 +33E0 +ENDCHAR +STARTCHAR U_6A97 +ENCODING 27287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F940 +87E0 +F880 +CFE0 +7880 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A98 +ENCODING 27288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5E40 +F3E0 +52A0 +5EC0 +7040 +DFE0 +5A40 +5BE0 +6E40 +4040 +ENDCHAR +STARTCHAR U_6A99 +ENCODING 27289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4280 +EBA0 +4AA0 +4BA0 +6EE0 +C280 +5EE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6A9A +ENCODING 27290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F2C0 +2760 +2A40 +3FE0 +6520 +A500 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_6A9B +ENCODING 27291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +2540 +7FE0 +6820 +ABA0 +AAA0 +2BA0 +3420 +23E0 +ENDCHAR +STARTCHAR U_6A9C +ENCODING 27292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +27C0 +F820 +2FE0 +2AA0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A9D +ENCODING 27293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +4AA0 +EE80 +5FE0 +4A80 +6EA0 +CAA0 +4E40 +4B40 +5EA0 +4320 +ENDCHAR +STARTCHAR U_6A9E +ENCODING 27294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +52A0 +FFA0 +5540 +7540 +DFE0 +5540 +5FE0 +5540 +5540 +6340 +ENDCHAR +STARTCHAR U_6A9F +ENCODING 27295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6AA0 +ENCODING 27296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FFE0 +2940 +FD40 +5480 +5540 +7620 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AA1 +ENCODING 27297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3280 +6FE0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6AA2 +ENCODING 27298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +6000 +7EE0 +AAA0 +AEE0 +2440 +2AC0 +3120 +ENDCHAR +STARTCHAR U_6AA3 +ENCODING 27299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2BA0 +2FE0 +3000 +6FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6AA4 +ENCODING 27300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +27E0 +F480 +21E0 +3D20 +25A0 +6560 +A520 +25E0 +2A00 +31E0 +ENDCHAR +STARTCHAR U_6AA5 +ENCODING 27301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F900 +27C0 +3100 +2FE0 +62A0 +AFE0 +26C0 +2BA0 +2E60 +ENDCHAR +STARTCHAR U_6AA6 +ENCODING 27302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +4A20 +FFA0 +55A0 +5FA0 +E0A0 +5EA0 +40A0 +7F20 +5520 +6CE0 +ENDCHAR +STARTCHAR U_6AA7 +ENCODING 27303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +6AA0 +76A0 +A960 +A200 +2540 +2C60 +33C0 +ENDCHAR +STARTCHAR U_6AA8 +ENCODING 27304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +7100 +6FE0 +A100 +ABE0 +24A0 +2D40 +2620 +ENDCHAR +STARTCHAR U_6AA9 +ENCODING 27305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2920 +7FE0 +6800 +A7C0 +A000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6AAA +ENCODING 27306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4BA0 +F6A0 +43C0 +6AA0 +5380 +C100 +5FE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6AAB +ENCODING 27307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F520 +2740 +6AA0 +7440 +AFE0 +A000 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6AAC +ENCODING 27308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +E280 +3FE0 +2820 +37C0 +6A40 +B580 +2B40 +2520 +2B00 +ENDCHAR +STARTCHAR U_6AAD +ENCODING 27309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2B20 +F1E0 +2F20 +65E0 +6F80 +B5A0 +AD40 +2740 +39A0 +2120 +ENDCHAR +STARTCHAR U_6AAE +ENCODING 27310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +3220 +2FC0 +6040 +AFE0 +2B40 +2EC0 +20C0 +ENDCHAR +STARTCHAR U_6AAF +ENCODING 27311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +7FE0 +6920 +A240 +27A0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6AB0 +ENCODING 27312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +49E0 +F520 +5DE0 +6920 +55E0 +DC80 +43E0 +56A0 +52E0 +4080 +ENDCHAR +STARTCHAR U_6AB1 +ENCODING 27313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F340 +4480 +6FE0 +5480 +C780 +4480 +5FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_6AB2 +ENCODING 27314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FFE0 +55A0 +57A0 +7120 +DFE0 +54A0 +52A0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_6AB3 +ENCODING 27315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +3540 +2FC0 +6440 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6AB4 +ENCODING 27316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +2900 +3FE0 +6900 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6AB5 +ENCODING 27317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4DA0 +EA40 +4FE0 +4800 +6FE0 +CA40 +4DA0 +4A40 +4B60 +4FE0 +ENDCHAR +STARTCHAR U_6AB6 +ENCODING 27318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2A40 +3BC0 +6800 +AEE0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6AB7 +ENCODING 27319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2920 +6DA0 +7B60 +ADA0 +AB60 +2DA0 +2920 +2860 +ENDCHAR +STARTCHAR U_6AB8 +ENCODING 27320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2CC0 +77A0 +6000 +AFE0 +AAA0 +2FE0 +2100 +2700 +ENDCHAR +STARTCHAR U_6AB9 +ENCODING 27321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +FE80 +29E0 +7EA0 +6BE0 +AA20 +ABA0 +2AA0 +2BA0 +3660 +ENDCHAR +STARTCHAR U_6ABA +ENCODING 27322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2FE0 +3820 +27C0 +6500 +AAA0 +25C0 +2AA0 +25A0 +ENDCHAR +STARTCHAR U_6ABB +ENCODING 27323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +FF60 +2980 +2F40 +7A20 +AF00 +2000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6ABC +ENCODING 27324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7E0 +2020 +77E0 +6820 +A7E0 +A240 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_6ABD +ENCODING 27325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +7540 +6920 +AFE0 +A200 +2FE0 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6ABE +ENCODING 27326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5B80 +9100 +6A40 +FFE0 +8020 +1100 +FFE0 +3B80 +5540 +9920 +ENDCHAR +STARTCHAR U_6ABF +ENCODING 27327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +BCA0 +A5E0 +BC80 +A4C0 +A520 +8200 +BFE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_6AC0 +ENCODING 27328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +7540 +6AA0 +B780 +A240 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6AC1 +ENCODING 27329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +4500 +5660 +69C0 +D100 +47C0 +4540 +47C0 +5FE0 +ENDCHAR +STARTCHAR U_6AC2 +ENCODING 27330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +25A0 +37E0 +2C80 +67E0 +A480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6AC3 +ENCODING 27331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +FBE0 +2AA0 +3FE0 +2A40 +6BC0 +AA40 +2BC0 +2A60 +2FE0 +ENDCHAR +STARTCHAR U_6AC4 +ENCODING 27332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +FFE0 +4A40 +4EC0 +6A40 +CFC0 +4200 +5FE0 +4940 +52A0 +ENDCHAR +STARTCHAR U_6AC5 +ENCODING 27333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F2A0 +2D40 +2560 +3540 +6FC0 +A440 +27C0 +2840 +3040 +ENDCHAR +STARTCHAR U_6AC6 +ENCODING 27334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +5F60 +F520 +5FA0 +5560 +7F20 +C4E0 +4520 +4EA0 +5520 +67E0 +ENDCHAR +STARTCHAR U_6AC7 +ENCODING 27335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +5E80 +75E0 +5520 +7FE0 +DB20 +D5E0 +5520 +5BE0 +6AC0 +7120 +ENDCHAR +STARTCHAR U_6AC8 +ENCODING 27336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +4AA0 +F7C0 +4C60 +57C0 +6280 +CFE0 +4000 +4780 +44A0 +48E0 +ENDCHAR +STARTCHAR U_6AC9 +ENCODING 27337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +F740 +5240 +5FE0 +7740 +D5C0 +5740 +55C0 +5340 +6CC0 +ENDCHAR +STARTCHAR U_6ACA +ENCODING 27338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +FEE0 +5020 +53A0 +74A0 +D320 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_6ACB +ENCODING 27339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +3440 +2FE0 +6AA0 +A540 +2FE0 +2220 +2CC0 +ENDCHAR +STARTCHAR U_6ACC +ENCODING 27340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F740 +25C0 +3440 +2FE0 +6AA0 +A7C0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_6ACD +ENCODING 27341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2880 +FFE0 +2AA0 +27C0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6ACE +ENCODING 27342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FC0 +7A80 +6FE0 +AD40 +2FC0 +2D40 +2FC0 +3280 +ENDCHAR +STARTCHAR U_6ACF +ENCODING 27343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2540 +F3E0 +22A0 +3FE0 +2940 +6BE0 +AD40 +29C0 +2D20 +33E0 +ENDCHAR +STARTCHAR U_6AD0 +ENCODING 27344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AD1 +ENCODING 27345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +3440 +6FE0 +AAA0 +2FE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6AD2 +ENCODING 27346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +26E0 +6AA0 +7440 +ABA0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6AD3 +ENCODING 27347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6AD4 +ENCODING 27348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +FFE0 +2940 +6BE0 +7AA0 +AFE0 +2CA0 +2FE0 +3420 +3460 +ENDCHAR +STARTCHAR U_6AD5 +ENCODING 27349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +F440 +2AA0 +77E0 +6460 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6AD6 +ENCODING 27350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2200 +FFE0 +2A40 +6FE0 +7AA0 +ABE0 +2AA0 +2BE0 +3540 +3BC0 +ENDCHAR +STARTCHAR U_6AD7 +ENCODING 27351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +6AA0 +7FE0 +A100 +2FE0 +2940 +2CA0 +3360 +ENDCHAR +STARTCHAR U_6AD8 +ENCODING 27352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2FE0 +7480 +EFC0 +A240 +2FC0 +2D60 +3440 +23C0 +ENDCHAR +STARTCHAR U_6AD9 +ENCODING 27353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2A40 +3BC0 +6800 +AEE0 +2AA0 +2EE0 +2FE0 +ENDCHAR +STARTCHAR U_6ADA +ENCODING 27354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6FE0 +7AA0 +ABA0 +A820 +2BA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_6ADB +ENCODING 27355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +F440 +2EE0 +2AA0 +3EA0 +6AA0 +AEA0 +28E0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_6ADC +ENCODING 27356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +A120 +7980 +2940 +FFE0 +1080 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6ADD +ENCODING 27357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +2FE0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6ADE +ENCODING 27358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +5540 +F540 +5BC0 +6900 +D6A0 +DDC0 +5680 +55C0 +6AA0 +41A0 +ENDCHAR +STARTCHAR U_6ADF +ENCODING 27359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +FAA0 +2FE0 +2AA0 +3FE0 +6100 +BFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6AE0 +ENCODING 27360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEC0 +2A40 +2EE0 +3AA0 +6F00 +A9E0 +2EA0 +3240 +26A0 +ENDCHAR +STARTCHAR U_6AE1 +ENCODING 27361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +27A0 +2140 +3FE0 +6240 +A7C0 +2A40 +23C0 +2240 +ENDCHAR +STARTCHAR U_6AE2 +ENCODING 27362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FC0 +FA80 +2FE0 +6AA0 +7FA0 +A240 +3F40 +25A0 +22A0 +2D20 +ENDCHAR +STARTCHAR U_6AE3 +ENCODING 27363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +57E0 +EA40 +4100 +4FE0 +F540 +D7C0 +5540 +5FE0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6AE4 +ENCODING 27364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FD40 +2A20 +6FE0 +7000 +AEA0 +2AA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_6AE5 +ENCODING 27365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +F920 +2FA0 +2960 +3FA0 +6AE0 +ABA0 +2AA0 +3D20 +27E0 +ENDCHAR +STARTCHAR U_6AE6 +ENCODING 27366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F500 +5FC0 +7540 +DFC0 +D540 +5BA0 +5680 +5100 +6EC0 +ENDCHAR +STARTCHAR U_6AE7 +ENCODING 27367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +2FE0 +F0A0 +2DE0 +3080 +2DE0 +6320 +BDE0 +3520 +3DE0 +3520 +ENDCHAR +STARTCHAR U_6AE8 +ENCODING 27368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2920 +3FC0 +2D20 +6BE0 +AAA0 +37E0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_6AE9 +ENCODING 27369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2820 +6BA0 +7D20 +ABA0 +2AA0 +2AA0 +2BA0 +2840 +ENDCHAR +STARTCHAR U_6AEA +ENCODING 27370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2B60 +FA40 +2FE0 +3B40 +2EE0 +6A40 +A880 +2AE0 +3280 +2FE0 +ENDCHAR +STARTCHAR U_6AEB +ENCODING 27371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +27C0 +5940 +57E0 +BA40 +57C0 +9240 +27C0 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_6AEC +ENCODING 27372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2FA0 +F5E0 +22A0 +2FA0 +32E0 +6FA0 +A2E0 +2740 +2AC0 +2760 +ENDCHAR +STARTCHAR U_6AED +ENCODING 27373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5540 +FDE0 +5440 +7CC0 +D160 +DF80 +4880 +4F80 +4880 +5FE0 +ENDCHAR +STARTCHAR U_6AEE +ENCODING 27374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F540 +27C0 +2100 +3FE0 +6540 +A540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6AEF +ENCODING 27375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4A40 +FFE0 +7540 +5540 +DFC0 +D560 +5560 +5F40 +5540 +6AC0 +ENDCHAR +STARTCHAR U_6AF0 +ENCODING 27376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2FE0 +2540 +3380 +6D40 +A320 +3D40 +2480 +2660 +ENDCHAR +STARTCHAR U_6AF1 +ENCODING 27377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +4940 +CFE0 +7880 +4FE0 +7880 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AF2 +ENCODING 27378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5CE0 +4540 +FBE0 +5EA0 +6BE0 +C900 +CAA0 +4940 +4AC0 +6960 +52A0 +ENDCHAR +STARTCHAR U_6AF3 +ENCODING 27379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2E80 +FAE0 +2E20 +20E0 +3E80 +6AE0 +AE80 +2AE0 +2EA0 +2AE0 +ENDCHAR +STARTCHAR U_6AF4 +ENCODING 27380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E540 +5FE0 +7520 +DFE0 +C5A0 +4F60 +55E0 +6540 +4620 +ENDCHAR +STARTCHAR U_6AF5 +ENCODING 27381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FC0 +6900 +7FC0 +A900 +2FC0 +2540 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_6AF6 +ENCODING 27382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +6100 +7FE0 +AAA0 +2FE0 +2540 +2CA0 +23A0 +ENDCHAR +STARTCHAR U_6AF7 +ENCODING 27383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +5FC0 +F040 +5DC0 +6500 +F5E0 +DD60 +75A0 +5DE0 +7500 +43E0 +ENDCHAR +STARTCHAR U_6AF8 +ENCODING 27384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +2920 +FFE0 +2AA0 +2AA0 +3FE0 +6940 +B7A0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6AF9 +ENCODING 27385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7E0 +2140 +37C0 +2D60 +6FE0 +A920 +2FE0 +2D60 +3560 +ENDCHAR +STARTCHAR U_6AFA +ENCODING 27386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +7FE0 +2920 +3BA0 +2440 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_6AFB +ENCODING 27387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +34A0 +6B40 +AFE0 +2480 +2380 +2C60 +ENDCHAR +STARTCHAR U_6AFC +ENCODING 27388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2560 +2AC0 +FFE0 +2540 +2DC0 +3560 +6DC0 +A540 +2DE0 +2520 +2FA0 +ENDCHAR +STARTCHAR U_6AFD +ENCODING 27389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5540 +67C0 +5040 +5FE0 +7540 +5BA0 +4400 +FFC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_6AFE +ENCODING 27390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +5480 +F900 +4FC0 +7500 +DFE0 +C4A0 +56C0 +57A0 +5EA0 +4180 +ENDCHAR +STARTCHAR U_6AFF +ENCODING 27391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2EE0 +F440 +2AA0 +6FE0 +7820 +A7C0 +2440 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6B00 +ENCODING 27392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FB40 +2FC0 +7500 +6FC0 +A500 +3FE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_6B01 +ENCODING 27393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +5F40 +F5E0 +5F40 +7540 +DFC0 +D0E0 +5F60 +5A40 +6940 +6C80 +ENDCHAR +STARTCHAR U_6B02 +ENCODING 27394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F2A0 +2BE0 +76A0 +6BE0 +AAA0 +BFE0 +2A40 +2940 +28C0 +ENDCHAR +STARTCHAR U_6B03 +ENCODING 27395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2420 +27E0 +3C80 +67E0 +A4A0 +27E0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6B04 +ENCODING 27396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6920 +AFE0 +AAA0 +2FE0 +2AA0 +2D60 +ENDCHAR +STARTCHAR U_6B05 +ENCODING 27397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B60 +5220 +FF60 +5520 +7FE0 +C940 +D7A0 +6100 +4FC0 +4100 +4300 +ENDCHAR +STARTCHAR U_6B06 +ENCODING 27398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27E0 +FD40 +27E0 +7540 +6FE0 +A000 +2780 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6B07 +ENCODING 27399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F6C0 +2FE0 +7040 +7FE0 +AAA0 +2EE0 +2AA0 +3FE0 +2220 +ENDCHAR +STARTCHAR U_6B08 +ENCODING 27400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F500 +2FE0 +3500 +2FE0 +6500 +AFE0 +2AA0 +2EE0 +2BA0 +ENDCHAR +STARTCHAR U_6B09 +ENCODING 27401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +3FE0 +2100 +6FE0 +AAA0 +2E40 +2AA0 +3F20 +ENDCHAR +STARTCHAR U_6B0A +ENCODING 27402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FEE0 +2AA0 +2FE0 +3480 +67E0 +BC80 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6B0B +ENCODING 27403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2FE0 +3900 +6FE0 +B900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_6B0C +ENCODING 27404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FA80 +57C0 +7480 +DFA0 +C4E0 +5FC0 +5540 +57A0 +4920 +ENDCHAR +STARTCHAR U_6B0D +ENCODING 27405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F300 +2480 +77E0 +6C80 +A7E0 +2400 +2760 +2420 +27E0 +ENDCHAR +STARTCHAR U_6B0E +ENCODING 27406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +6AC0 +B5A0 +FFE0 +8020 +7C40 +47E0 +7D40 +5840 +64C0 +ENDCHAR +STARTCHAR U_6B0F +ENCODING 27407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2940 +25E0 +7940 +AFE0 +2540 +3FE0 +2B40 +35E0 +ENDCHAR +STARTCHAR U_6B10 +ENCODING 27408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +FEE0 +2AA0 +2FE0 +3AA0 +6FE0 +ACA0 +2FC0 +34A0 +27E0 +ENDCHAR +STARTCHAR U_6B11 +ENCODING 27409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2540 +3FE0 +6440 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6B12 +ENCODING 27410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5FA0 +E0C0 +4E40 +A0A0 +EEE0 +4A40 +AAA0 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6B13 +ENCODING 27411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F4A0 +2FE0 +2AA0 +3FE0 +6100 +AFC0 +2100 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_6B14 +ENCODING 27412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +7FE0 +67C0 +AD00 +27C0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6B15 +ENCODING 27413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +5680 +7280 +DFE0 +D5A0 +5740 +5540 +5FA0 +6120 +ENDCHAR +STARTCHAR U_6B16 +ENCODING 27414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B40 +FFE0 +2AA0 +3FE0 +2440 +67C0 +A440 +27C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6B17 +ENCODING 27415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +AAA0 +2FE0 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_6B18 +ENCODING 27416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2940 +2FE0 +3AA0 +6FE0 +A920 +2BA0 +2960 +37E0 +ENDCHAR +STARTCHAR U_6B19 +ENCODING 27417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +2FE0 +3920 +6FE0 +A2A0 +2FC0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6B1A +ENCODING 27418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +FFE0 +2540 +2B80 +2540 +7FE0 +AAA0 +3FE0 +2AA0 +3DE0 +ENDCHAR +STARTCHAR U_6B1B +ENCODING 27419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +7540 +6AE0 +BFA0 +2AE0 +2EA0 +3EE0 +2520 +ENDCHAR +STARTCHAR U_6B1C +ENCODING 27420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +2A80 +3FE0 +7560 +7FC0 +A500 +2FE0 +2540 +2EA0 +3560 +ENDCHAR +STARTCHAR U_6B1D +ENCODING 27421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +6AC0 +D5A0 +7F80 +4A80 +7F80 +4880 +7FE0 +5280 +6D80 +ENDCHAR +STARTCHAR U_6B1E +ENCODING 27422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +3540 +2FE0 +6AA0 +AFE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_6B1F +ENCODING 27423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +5FA0 +EAE0 +5FA0 +75E0 +DFA0 +F4E0 +5E40 +54C0 +5EC0 +5160 +ENDCHAR +STARTCHAR U_6B20 +ENCODING 27424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +8880 +0800 +0800 +0C00 +1200 +2100 +C0C0 +ENDCHAR +STARTCHAR U_6B21 +ENCODING 27425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +27E0 +0440 +2900 +2100 +C100 +4280 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_6B22 +ENCODING 27426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +0A20 +8D40 +5100 +2100 +3100 +2A80 +4A80 +8440 +0820 +ENDCHAR +STARTCHAR U_6B23 +ENCODING 27427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7200 +43E0 +7E20 +5540 +5100 +5100 +5280 +5280 +9440 +9820 +ENDCHAR +STARTCHAR U_6B24 +ENCODING 27428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +4120 +7AC0 +0880 +3880 +C880 +0940 +0940 +3220 +ENDCHAR +STARTCHAR U_6B25 +ENCODING 27429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9420 +F940 +9100 +9100 +9280 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_6B26 +ENCODING 27430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +33E0 +4C20 +A540 +1100 +F900 +0A80 +1280 +1440 +2820 +ENDCHAR +STARTCHAR U_6B27 +ENCODING 27431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +81E0 +CA20 +AC80 +9080 +9080 +A880 +C940 +8240 +FC20 +ENDCHAR +STARTCHAR U_6B28 +ENCODING 27432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +8520 +76C0 +5480 +5480 +7480 +0540 +1540 +0A20 +ENDCHAR +STARTCHAR U_6B29 +ENCODING 27433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +2BE0 +2A20 +4D40 +9100 +7900 +4A80 +4A80 +7A40 +0420 +ENDCHAR +STARTCHAR U_6B2A +ENCODING 27434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +ABE0 +AA20 +FD40 +2100 +A900 +AA80 +AA80 +FC40 +0820 +ENDCHAR +STARTCHAR U_6B2B +ENCODING 27435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +7BE0 +9420 +F940 +1100 +5D00 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_6B2C +ENCODING 27436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2220 +4880 +F080 +2480 +4940 +1140 +2A20 +C420 +ENDCHAR +STARTCHAR U_6B2D +ENCODING 27437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8500 +95E0 +FE20 +94A0 +9480 +AC80 +C480 +8480 +FD40 +8620 +ENDCHAR +STARTCHAR U_6B2E +ENCODING 27438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2900 +FFE0 +1220 +5540 +5500 +7D00 +1280 +1280 +2460 +C840 +ENDCHAR +STARTCHAR U_6B2F +ENCODING 27439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +1220 +7AC0 +0480 +7880 +4880 +4940 +7940 +4A20 +ENDCHAR +STARTCHAR U_6B30 +ENCODING 27440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +FBE0 +AA20 +AD40 +A900 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_6B31 +ENCODING 27441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +51E0 +4A20 +84C0 +7880 +0080 +7880 +4940 +4940 +7A20 +ENDCHAR +STARTCHAR U_6B32 +ENCODING 27442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +4500 +91E0 +3220 +4880 +8480 +7880 +4880 +4940 +7A20 +0420 +ENDCHAR +STARTCHAR U_6B33 +ENCODING 27443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1D00 +11E0 +FEA0 +AA80 +AA80 +FE80 +AA80 +AB40 +AA20 +8620 +ENDCHAR +STARTCHAR U_6B34 +ENCODING 27444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FBE0 +8C20 +F880 +8880 +F880 +9080 +9940 +EA20 +8C20 +ENDCHAR +STARTCHAR U_6B35 +ENCODING 27445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7200 +4BE0 +3A40 +4500 +7900 +9100 +F980 +3240 +4C60 +8840 +ENDCHAR +STARTCHAR U_6B36 +ENCODING 27446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7EA0 +54A0 +7C80 +1080 +3880 +5540 +9220 +1420 +ENDCHAR +STARTCHAR U_6B37 +ENCODING 27447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CD00 +3100 +CDE0 +1220 +FCA0 +5080 +FC80 +5480 +5540 +5E20 +1420 +ENDCHAR +STARTCHAR U_6B38 +ENCODING 27448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4500 +FDE0 +4220 +7CA0 +9080 +FC80 +1080 +2940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B39 +ENCODING 27449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +51E0 +8A20 +FCA0 +0880 +E880 +A880 +E940 +0A20 +1C20 +ENDCHAR +STARTCHAR U_6B3A +ENCODING 27450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FD00 +49E0 +7A20 +48A0 +7880 +4880 +FE80 +2940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B3B +ENCODING 27451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +5900 +51E0 +AA20 +52A0 +9480 +5880 +5080 +A940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B3C +ENCODING 27452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +45E0 +AA20 +10A0 +EE80 +AA80 +4480 +2940 +5620 +A220 +ENDCHAR +STARTCHAR U_6B3D +ENCODING 27453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +F420 +2120 +F900 +2100 +A900 +7280 +2440 +F820 +ENDCHAR +STARTCHAR U_6B3E +ENCODING 27454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7A20 +00A0 +7880 +0080 +FC80 +5540 +9240 +7420 +ENDCHAR +STARTCHAR U_6B3F +ENCODING 27455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +45E0 +8A20 +20A0 +CE80 +8280 +EE80 +8280 +FF40 +8220 +ENDCHAR +STARTCHAR U_6B40 +ENCODING 27456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +39E0 +5620 +9280 +7C80 +0080 +FC80 +5940 +9560 +3240 +ENDCHAR +STARTCHAR U_6B41 +ENCODING 27457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FD00 +49E0 +7A20 +48A0 +7880 +4880 +FE80 +A880 +C540 +FE20 +ENDCHAR +STARTCHAR U_6B42 +ENCODING 27458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +9280 +FEE0 +0120 +FE40 +1040 +FE40 +AA40 +AA40 +AAA0 +8720 +ENDCHAR +STARTCHAR U_6B43 +ENCODING 27459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +F100 +11E0 +FE20 +10A0 +F680 +9280 +FE80 +9280 +FF40 +8220 +ENDCHAR +STARTCHAR U_6B44 +ENCODING 27460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +75E0 +5620 +FEC0 +8280 +BA80 +AB40 +BB40 +8A20 +8420 +ENDCHAR +STARTCHAR U_6B45 +ENCODING 27461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +2900 +FFE0 +AA20 +AAA0 +FE80 +1080 +7C80 +1140 +FE20 +4420 +ENDCHAR +STARTCHAR U_6B46 +ENCODING 27462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +49E0 +3220 +FCA0 +0080 +7880 +4940 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_6B47 +ENCODING 27463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +F9E0 +8A20 +F8A0 +2080 +7C80 +9480 +AD40 +F620 +0C20 +ENDCHAR +STARTCHAR U_6B48 +ENCODING 27464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +4500 +BBE0 +0020 +E2A0 +AA80 +EA80 +AA80 +EA80 +A340 +AE20 +ENDCHAR +STARTCHAR U_6B49 +ENCODING 27465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +FF00 +29E0 +FF20 +2AA0 +FF80 +2A80 +FE80 +6C80 +AB40 +AA20 +ENDCHAR +STARTCHAR U_6B4A +ENCODING 27466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +49E0 +7A20 +00A0 +FE80 +8280 +BA80 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_6B4B +ENCODING 27467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4F00 +49E0 +7E20 +48A0 +5C80 +4A80 +5E80 +5480 +5540 +A620 +ENDCHAR +STARTCHAR U_6B4C +ENCODING 27468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0900 +E9E0 +AA20 +FE80 +0880 +E880 +A940 +E940 +0A20 +1C20 +ENDCHAR +STARTCHAR U_6B4D +ENCODING 27469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FA00 +8BE0 +FA20 +80A0 +FC80 +8080 +FC80 +5480 +AD40 +AA20 +ENDCHAR +STARTCHAR U_6B4E +ENCODING 27470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FD00 +51E0 +2220 +F880 +A880 +FC80 +2080 +FD80 +5240 +8C20 +ENDCHAR +STARTCHAR U_6B4F +ENCODING 27471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FF00 +49E0 +FE20 +A540 +FD00 +2100 +FA80 +2280 +3A40 +E460 +ENDCHAR +STARTCHAR U_6B50 +ENCODING 27472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8100 +BDE0 +A620 +BCA0 +8080 +EE80 +AA80 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_6B51 +ENCODING 27473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2100 +FFE0 +9220 +FCA0 +9280 +FE80 +AA80 +FE80 +8940 +9A20 +ENDCHAR +STARTCHAR U_6B52 +ENCODING 27474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +28E0 +FF20 +92C0 +FE80 +9280 +BA80 +AB40 +BB40 +8620 +ENDCHAR +STARTCHAR U_6B53 +ENCODING 27475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +91E0 +7D20 +2A80 +7C80 +C880 +7D40 +4940 +7E20 +4420 +ENDCHAR +STARTCHAR U_6B54 +ENCODING 27476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +FFE0 +9220 +FCA0 +9280 +9E80 +AA80 +EE80 +A940 +FE20 +ENDCHAR +STARTCHAR U_6B55 +ENCODING 27477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +FE20 +44A0 +7C80 +4480 +7C80 +4480 +7D40 +C620 +ENDCHAR +STARTCHAR U_6B56 +ENCODING 27478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +11E0 +FF20 +44A0 +7C80 +2880 +FE80 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6B57 +ENCODING 27479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +1480 +FEE0 +1520 +7C80 +BA80 +D680 +FE80 +D6C0 +BB20 +9220 +ENDCHAR +STARTCHAR U_6B58 +ENCODING 27480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3900 +11E0 +6A20 +4480 +D580 +6E80 +4480 +4B40 +A940 +9220 +ENDCHAR +STARTCHAR U_6B59 +ENCODING 27481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4900 +FDE0 +0220 +7CA0 +4480 +FE80 +AA80 +6680 +BB40 +6620 +ENDCHAR +STARTCHAR U_6B5A +ENCODING 27482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7D00 +11E0 +7E20 +10C0 +5480 +FE80 +0140 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_6B5B +ENCODING 27483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +FE20 +00A0 +EE80 +AA80 +EE80 +4540 +6D40 +9220 +ENDCHAR +STARTCHAR U_6B5C +ENCODING 27484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +2120 +7EA0 +A280 +FA80 +AA80 +FA80 +2B40 +F420 +ENDCHAR +STARTCHAR U_6B5D +ENCODING 27485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +1120 +FE80 +2880 +FC80 +1140 +FD40 +1260 +1440 +ENDCHAR +STARTCHAR U_6B5E +ENCODING 27486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8500 +FDE0 +8620 +FCA0 +5280 +FC80 +4A80 +FE80 +5540 +AA20 +ENDCHAR +STARTCHAR U_6B5F +ENCODING 27487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5680 +9A80 +92E0 +FF20 +AAA0 +EE80 +AA80 +AA80 +FEC0 +2920 +C620 +ENDCHAR +STARTCHAR U_6B60 +ENCODING 27488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +44E0 +FF20 +AAA0 +4480 +AA80 +BA80 +EEC0 +8320 +FE20 +ENDCHAR +STARTCHAR U_6B61 +ENCODING 27489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +4480 +EEE0 +AB20 +EE80 +5080 +FE80 +4880 +7D40 +4940 +7E20 +ENDCHAR +STARTCHAR U_6B62 +ENCODING 27490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0400 +2400 +2780 +2400 +2400 +2400 +2400 +2400 +FFC0 +ENDCHAR +STARTCHAR U_6B63 +ENCODING 27491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +2400 +27C0 +2400 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6B64 +ENCODING 27492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1120 +5140 +5D80 +5100 +5100 +5100 +5120 +5D20 +E0E0 +ENDCHAR +STARTCHAR U_6B65 +ENCODING 27493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +2400 +FFE0 +0400 +1440 +2480 +4100 +0600 +F800 +ENDCHAR +STARTCHAR U_6B66 +ENCODING 27494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3D40 +0100 +FFE0 +0900 +2900 +2D00 +2900 +28A0 +2EA0 +F060 +ENDCHAR +STARTCHAR U_6B67 +ENCODING 27495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +17E0 +5100 +5BC0 +5240 +5280 +5180 +7900 +C280 +0C60 +ENDCHAR +STARTCHAR U_6B68 +ENCODING 27496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2200 +2200 +FFE0 +0200 +2200 +23C0 +2200 +5A00 +87E0 +ENDCHAR +STARTCHAR U_6B69 +ENCODING 27497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0480 +2440 +24A0 +4500 +0600 +0C00 +7000 +ENDCHAR +STARTCHAR U_6B6A +ENCODING 27498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +1D80 +E460 +0400 +7FE0 +0400 +27C0 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6B6B +ENCODING 27499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +1200 +5200 +5BE0 +5220 +53E0 +5200 +5A00 +E200 +03E0 +ENDCHAR +STARTCHAR U_6B6C +ENCODING 27500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0000 +3F80 +2480 +FFE0 +2880 +2480 +C180 +ENDCHAR +STARTCHAR U_6B6D +ENCODING 27501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +5100 +5900 +57E0 +5040 +57E0 +5240 +5940 +E040 +41C0 +ENDCHAR +STARTCHAR U_6B6E +ENCODING 27502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +13C0 +1200 +1200 +FFE0 +1080 +18E0 +5280 +5280 +5280 +FFE0 +ENDCHAR +STARTCHAR U_6B6F +ENCODING 27503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5540 +4E40 +7FC0 +4E40 +5540 +64C0 +7FC0 +ENDCHAR +STARTCHAR U_6B70 +ENCODING 27504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2940 +AD40 +6B40 +4A40 +9CC0 +1080 +5AC0 +5280 +7A80 +C7E0 +ENDCHAR +STARTCHAR U_6B71 +ENCODING 27505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +A100 +B7C0 +A540 +A7C0 +A100 +B7C0 +C100 +0FE0 +ENDCHAR +STARTCHAR U_6B72 +ENCODING 27506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +FFE0 +0140 +7FE0 +4100 +7F40 +4B40 +54A0 +69A0 +9660 +ENDCHAR +STARTCHAR U_6B73 +ENCODING 27507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2400 +7FE0 +0240 +7FE0 +4200 +7D40 +4940 +5CA0 +AB60 +1A20 +ENDCHAR +STARTCHAR U_6B74 +ENCODING 27508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7FE0 +5DC0 +5AA0 +6880 +4200 +5200 +53C0 +9200 +3FE0 +ENDCHAR +STARTCHAR U_6B75 +ENCODING 27509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +BFE0 +A000 +A7C0 +A540 +BEC0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_6B76 +ENCODING 27510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FBE0 +3F80 +2480 +3F80 +2480 +FFE0 +8520 +BF60 +ENDCHAR +STARTCHAR U_6B77 +ENCODING 27511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_6B78 +ENCODING 27512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F040 +93C0 +F840 +8FE0 +FCA0 +2080 +BBE0 +A2A0 +BAE0 +E080 +ENDCHAR +STARTCHAR U_6B79 +ENCODING 27513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +0FC0 +1080 +1080 +2900 +4500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_6B7A +ENCODING 27514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07E0 +1400 +1FC0 +2080 +5100 +0A00 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_6B7B +ENCODING 27515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +1100 +1D20 +2540 +6580 +9500 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_6B7C +ENCODING 27516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +2380 +2080 +7880 +4FE0 +A880 +1080 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_6B7D +ENCODING 27517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2300 +2200 +3A00 +4BE0 +B280 +1280 +2280 +2480 +4480 +8880 +ENDCHAR +STARTCHAR U_6B7E +ENCODING 27518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +3EA0 +4AA0 +4AA0 +AAA0 +14A0 +1120 +2220 +4420 +80C0 +ENDCHAR +STARTCHAR U_6B7F +ENCODING 27519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +21E0 +2120 +3A60 +4C00 +CBE0 +2A20 +1140 +1080 +2140 +C620 +ENDCHAR +STARTCHAR U_6B80 +ENCODING 27520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2300 +2100 +7900 +4FE0 +A900 +1100 +1100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_6B81 +ENCODING 27521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2240 +3A40 +2A60 +4C00 +ABE0 +1220 +1140 +2080 +4140 +8620 +ENDCHAR +STARTCHAR U_6B82 +ENCODING 27522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +3BC0 +4A40 +AA40 +13C0 +1240 +2240 +4240 +8FE0 +ENDCHAR +STARTCHAR U_6B83 +ENCODING 27523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +47C0 +7540 +5540 +9540 +5FE0 +3100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_6B84 +ENCODING 27524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FD80 +2240 +3AA0 +4D00 +AA40 +1080 +1120 +2240 +4080 +8300 +ENDCHAR +STARTCHAR U_6B85 +ENCODING 27525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7D00 +2500 +3FE0 +4900 +B100 +17C0 +2100 +4100 +8100 +1FE0 +ENDCHAR +STARTCHAR U_6B86 +ENCODING 27526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2080 +2100 +3920 +4BE0 +C800 +2BE0 +1220 +1220 +23E0 +C220 +ENDCHAR +STARTCHAR U_6B87 +ENCODING 27527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +2400 +3BC0 +4900 +6BE0 +9AA0 +14A0 +2920 +4220 +84C0 +ENDCHAR +STARTCHAR U_6B88 +ENCODING 27528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +2200 +2FE0 +3AA0 +4AA0 +AAA0 +1AA0 +2AA0 +4AA0 +8AA0 +1FE0 +ENDCHAR +STARTCHAR U_6B89 +ENCODING 27529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +2420 +3BA0 +4AA0 +CBA0 +2AA0 +13A0 +22A0 +4020 +80C0 +ENDCHAR +STARTCHAR U_6B8A +ENCODING 27530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2500 +27C0 +3900 +4900 +4FE0 +B100 +1380 +2540 +4920 +8100 +ENDCHAR +STARTCHAR U_6B8B +ENCODING 27531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +F940 +27E0 +2100 +7900 +4FE0 +A900 +1140 +10A0 +2160 +C620 +ENDCHAR +STARTCHAR U_6B8C +ENCODING 27532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +22A0 +3AA0 +4D40 +4AA0 +AAA0 +1FE0 +1100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_6B8D +ENCODING 27533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FBA0 +22A0 +2140 +7BE0 +4840 +A880 +17E0 +1080 +2080 +C180 +ENDCHAR +STARTCHAR U_6B8E +ENCODING 27534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47E0 +4100 +7540 +5540 +DBA0 +3120 +1280 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_6B8F +ENCODING 27535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +27E0 +3900 +4D20 +AB40 +1180 +1340 +2540 +4920 +8300 +ENDCHAR +STARTCHAR U_6B90 +ENCODING 27536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4100 +77C0 +5540 +D7C0 +2300 +2580 +4940 +9120 +0100 +ENDCHAR +STARTCHAR U_6B91 +ENCODING 27537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2100 +3BC0 +4A40 +AA40 +1BC0 +1280 +22A0 +44A0 +8860 +ENDCHAR +STARTCHAR U_6B92 +ENCODING 27538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +23E0 +3800 +4BE0 +AA20 +1AA0 +12A0 +22A0 +4140 +8620 +ENDCHAR +STARTCHAR U_6B93 +ENCODING 27539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +2440 +3820 +4FC0 +4A40 +A940 +1540 +2480 +4100 +9FE0 +ENDCHAR +STARTCHAR U_6B94 +ENCODING 27540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +2140 +3FE0 +4940 +CFE0 +3940 +1580 +2340 +4520 +9B20 +ENDCHAR +STARTCHAR U_6B95 +ENCODING 27541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +47E0 +7440 +5280 +5FE0 +B000 +17C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_6B96 +ENCODING 27542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2100 +3FC0 +4C40 +AFC0 +1440 +1740 +25C0 +4440 +9FE0 +ENDCHAR +STARTCHAR U_6B97 +ENCODING 27543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2280 +3540 +5FE0 +D540 +37C0 +1540 +27C0 +4120 +80E0 +ENDCHAR +STARTCHAR U_6B98 +ENCODING 27544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +2FE0 +2240 +39A0 +4B60 +4A80 +ABE0 +1E40 +2280 +4120 +8EE0 +ENDCHAR +STARTCHAR U_6B99 +ENCODING 27545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2480 +27E0 +3C80 +4F60 +4820 +AFC0 +1440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_6B9A +ENCODING 27546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2280 +2FE0 +3920 +4FE0 +4920 +BFE0 +1100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_6B9B +ENCODING 27547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2080 +2100 +7DE0 +5520 +55A0 +B540 +1DA0 +2320 +4000 +9FE0 +ENDCHAR +STARTCHAR U_6B9C +ENCODING 27548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +4540 +75C0 +5400 +97E0 +5100 +2FE0 +4380 +8540 +1920 +ENDCHAR +STARTCHAR U_6B9D +ENCODING 27549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +7100 +5FE0 +9440 +5BA0 +2100 +4FE0 +8540 +1920 +ENDCHAR +STARTCHAR U_6B9E +ENCODING 27550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +27E0 +3C20 +47E0 +A420 +2FE0 +1420 +27E0 +4280 +8C60 +ENDCHAR +STARTCHAR U_6B9F +ENCODING 27551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +27C0 +7440 +57C0 +D000 +3FE0 +1AA0 +2AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_6BA0 +ENCODING 27552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47C0 +4440 +77C0 +9440 +97C0 +5440 +2FE0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_6BA1 +ENCODING 27553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4820 +4780 +7400 +97E0 +5480 +2480 +2FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_6BA2 +ENCODING 27554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +4FE0 +7A80 +5BE0 +5000 +DFE0 +3920 +17C0 +2540 +45C0 +8100 +ENDCHAR +STARTCHAR U_6BA3 +ENCODING 27555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +4FE0 +4280 +7100 +57C0 +5540 +BFE0 +1100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_6BA4 +ENCODING 27556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +47E0 +4A40 +73C0 +5240 +9FE0 +5400 +17E0 +2AA0 +4520 +8240 +ENDCHAR +STARTCHAR U_6BA5 +ENCODING 27557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +2FE0 +2820 +37C0 +5100 +57C0 +B540 +17C0 +2540 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BA6 +ENCODING 27558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47C0 +4440 +77C0 +5440 +D7E0 +3400 +17E0 +2AA0 +5560 +9540 +ENDCHAR +STARTCHAR U_6BA7 +ENCODING 27559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFC0 +40A0 +7FE0 +5A80 +DE80 +B480 +14C0 +2EC0 +5540 +8E60 +ENDCHAR +STARTCHAR U_6BA8 +ENCODING 27560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +7FE0 +5440 +D7C0 +B440 +27C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_6BA9 +ENCODING 27561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +44A0 +7E40 +5AA0 +D5A0 +BB40 +2FE0 +2380 +4540 +9920 +ENDCHAR +STARTCHAR U_6BAA +ENCODING 27562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4FE0 +7820 +57C0 +D000 +37C0 +1440 +27C0 +4280 +8FE0 +ENDCHAR +STARTCHAR U_6BAB +ENCODING 27563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +4AA0 +4FE0 +7540 +57C0 +D540 +37C0 +1100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_6BAC +ENCODING 27564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2AA0 +2FE0 +7900 +4FE0 +AA80 +17C0 +1100 +2FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_6BAD +ENCODING 27565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4540 +47C0 +7540 +5FE0 +D000 +37C0 +1540 +27C0 +4540 +9FE0 +ENDCHAR +STARTCHAR U_6BAE +ENCODING 27566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4280 +4440 +7FE0 +5000 +5EE0 +B2A0 +1EE0 +2440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_6BAF +ENCODING 27567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +4FE0 +4820 +77C0 +5540 +57C0 +BC40 +17C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BB0 +ENCODING 27568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4FE0 +7AA0 +5FE0 +D440 +3740 +15C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BB1 +ENCODING 27569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FEC0 +44A0 +7FE0 +AA80 +7BA0 +2AA0 +3B80 +4AA0 +8F60 +3020 +ENDCHAR +STARTCHAR U_6BB2 +ENCODING 27570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAC0 +55A0 +5FE0 +6A80 +BB80 +AAA0 +7BA0 +2A40 +3B60 +4AA0 +9F20 +ENDCHAR +STARTCHAR U_6BB3 +ENCODING 27571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +20E0 +C000 +3F80 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6BB4 +ENCODING 27572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8240 +8A60 +CC00 +B3E0 +9240 +AA40 +C980 +8180 +FE40 +0420 +ENDCHAR +STARTCHAR U_6BB5 +ENCODING 27573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +6280 +4280 +74E0 +4000 +77C0 +4440 +4280 +F100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6BB6 +ENCODING 27574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +2460 +2000 +FFE0 +2240 +2140 +3980 +E240 +4420 +ENDCHAR +STARTCHAR U_6BB7 +ENCODING 27575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4140 +7D40 +4660 +7C00 +47E0 +7D40 +4140 +7C80 +8540 +9A20 +ENDCHAR +STARTCHAR U_6BB8 +ENCODING 27576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +1140 +7D60 +0200 +7FE0 +5640 +7D40 +4080 +4140 +8620 +ENDCHAR +STARTCHAR U_6BB9 +ENCODING 27577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +A280 +BA80 +D2E0 +9400 +FBC0 +9240 +AA80 +C100 +FAE0 +0440 +ENDCHAR +STARTCHAR U_6BBA +ENCODING 27578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D9C0 +2140 +D940 +3220 +2800 +FBE0 +2140 +7140 +A880 +2940 +6220 +ENDCHAR +STARTCHAR U_6BBB +ENCODING 27579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +7260 +0400 +FBC0 +8A40 +7140 +5480 +5940 +9620 +ENDCHAR +STARTCHAR U_6BBC +ENCODING 27580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1140 +FF60 +8400 +7BE0 +0140 +7940 +4A80 +4D40 +8220 +ENDCHAR +STARTCHAR U_6BBD +ENCODING 27581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CDC0 +3140 +4940 +FE60 +4000 +7BE0 +C940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_6BBE +ENCODING 27582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7680 +2A80 +FCE0 +1400 +7FC0 +CA40 +7A80 +4900 +4AE0 +7C40 +ENDCHAR +STARTCHAR U_6BBF +ENCODING 27583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FD40 +8260 +A800 +FFE0 +A940 +FD40 +9880 +A540 +C620 +ENDCHAR +STARTCHAR U_6BC0 +ENCODING 27584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +59C0 +8940 +D940 +8A60 +FC00 +23E0 +2140 +F940 +2080 +3940 +C620 +ENDCHAR +STARTCHAR U_6BC1 +ENCODING 27585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDC0 +8540 +DD40 +8560 +FE00 +03C0 +FD40 +1140 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_6BC2 +ENCODING 27586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FF60 +9200 +FFE0 +5140 +7D40 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_6BC3 +ENCODING 27587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +4940 +7960 +0200 +FFE0 +8220 +BB40 +AA80 +BB40 +8E20 +ENDCHAR +STARTCHAR U_6BC4 +ENCODING 27588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +A940 +FB60 +A800 +FBE0 +2140 +FD40 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_6BC5 +ENCODING 27589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +2940 +FE60 +2000 +57E0 +A940 +5D40 +AA80 +4940 +9220 +ENDCHAR +STARTCHAR U_6BC6 +ENCODING 27590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8140 +B940 +AA60 +B800 +81E0 +EE40 +AB40 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_6BC7 +ENCODING 27591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DC0 +8540 +ED40 +8760 +FC00 +93E0 +5540 +FF40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_6BC8 +ENCODING 27592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DEE0 +AAA0 +ABA0 +EA00 +AEE0 +ABA0 +AAA0 +EEA0 +2B40 +4AA0 +8B20 +ENDCHAR +STARTCHAR U_6BC9 +ENCODING 27593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9160 +FA00 +93C0 +A940 +FC80 +0140 +7FC0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_6BCA +ENCODING 27594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FE60 +13C0 +7D40 +5480 +7FC0 +5140 +9120 +7FC0 +5140 +5F40 +ENDCHAR +STARTCHAR U_6BCB +ENCODING 27595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +2480 +2480 +7FE0 +0880 +1080 +2300 +ENDCHAR +STARTCHAR U_6BCC +ENCODING 27596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +4880 +4880 +4880 +7F80 +0080 +ENDCHAR +STARTCHAR U_6BCD +ENCODING 27597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +2080 +FFE0 +2880 +2480 +2080 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BCE +ENCODING 27598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +2480 +FFE0 +2480 +4880 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BCF +ENCODING 27599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +9F80 +1480 +FFE0 +2480 +2280 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BD0 +ENCODING 27600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2480 +2480 +FFE0 +4880 +7FE0 +1080 +6300 +ENDCHAR +STARTCHAR U_6BD1 +ENCODING 27601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6AE0 +5FA0 +FAA0 +4AA0 +6AE0 +5A80 +7A20 +29E0 +1000 +ENDCHAR +STARTCHAR U_6BD2 +ENCODING 27602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +FFE0 +4480 +7FE0 +0300 +ENDCHAR +STARTCHAR U_6BD3 +ENCODING 27603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +8100 +FA40 +ABA0 +A800 +FEA0 +AAA0 +AAA0 +FAA0 +1420 +ENDCHAR +STARTCHAR U_6BD4 +ENCODING 27604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8400 +8400 +8480 +8500 +F600 +8400 +8400 +8400 +B440 +C440 +83C0 +ENDCHAR +STARTCHAR U_6BD5 +ENCODING 27605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4240 +7B80 +4220 +4A20 +71E0 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_6BD6 +ENCODING 27606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A80 +4320 +5A20 +E3E0 +0480 +5300 +5240 +94A0 +18A0 +EF80 +ENDCHAR +STARTCHAR U_6BD7 +ENCODING 27607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +AA80 +AAA0 +FBC0 +AA80 +AA80 +AA80 +FAA0 +8BA0 +02E0 +ENDCHAR +STARTCHAR U_6BD8 +ENCODING 27608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +4240 +7A80 +4320 +FA20 +43E0 +ENDCHAR +STARTCHAR U_6BD9 +ENCODING 27609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7B80 +4220 +FBE0 +0000 +FFE0 +2240 +7A80 +CB20 +3220 +E1E0 +ENDCHAR +STARTCHAR U_6BDA +ENCODING 27610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +2400 +FF80 +4080 +7FA0 +4220 +7FE0 +2480 +7F80 +0CA0 +F3E0 +ENDCHAR +STARTCHAR U_6BDB +ENCODING 27611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0780 +7C00 +0400 +07E0 +FC00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_6BDC +ENCODING 27612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +2080 +3880 +E1C0 +2AA0 +34A0 +E880 +22A0 +2120 +1FE0 +ENDCHAR +STARTCHAR U_6BDD +ENCODING 27613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E040 +2080 +3B40 +E080 +2320 +3840 +E080 +2F20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BDE +ENCODING 27614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7B80 +4220 +79E0 +0380 +3C00 +0780 +7C00 +07A0 +FC20 +07E0 +ENDCHAR +STARTCHAR U_6BDF +ENCODING 27615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +C560 +0600 +7C00 +0780 +3C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_6BE0 +ENCODING 27616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2BE0 +4A20 +9FC0 +0400 +7FC0 +0400 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_6BE1 +ENCODING 27617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2DE0 +F100 +27E0 +2C20 +F420 +27E0 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE2 +ENCODING 27618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +4FE0 +5AA0 +EAA0 +4CE0 +5820 +EFE0 +4820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BE3 +ENCODING 27619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +E940 +3F80 +0800 +7F80 +0800 +FFA0 +0820 +07E0 +ENDCHAR +STARTCHAR U_6BE4 +ENCODING 27620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +4700 +91C0 +2300 +49C0 +FF00 +0120 +2920 +28E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_6BE5 +ENCODING 27621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A00 +E3E0 +2420 +3BA0 +E2A0 +23A0 +3AA0 +E3A0 +2040 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE6 +ENCODING 27622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +4B80 +4900 +7900 +4BC0 +7900 +4900 +4BC0 +FD20 +0920 +08E0 +ENDCHAR +STARTCHAR U_6BE7 +ENCODING 27623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +C0A0 +4FE0 +44A0 +F4C0 +4FA0 +44A0 +F560 +4A00 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BE8 +ENCODING 27624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +F280 +23E0 +2480 +FBE0 +2140 +2140 +FA60 +2400 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE9 +ENCODING 27625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6540 +2380 +3900 +E7E0 +2100 +3B80 +E540 +2940 +2120 +1FE0 +ENDCHAR +STARTCHAR U_6BEA +ENCODING 27626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F240 +27A0 +2280 +FBC0 +2480 +27E0 +F880 +20A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BEB +ENCODING 27627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8220 +3C00 +0780 +3C00 +07A0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_6BEC +ENCODING 27628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E0A0 +27E0 +2080 +FCA0 +23C0 +22C0 +FCA0 +2180 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BED +ENCODING 27629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +0100 +79E0 +4B00 +49E0 +7B00 +4900 +2920 +3D20 +C0E0 +ENDCHAR +STARTCHAR U_6BEE +ENCODING 27630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2920 +F1A0 +2E80 +3700 +E1C0 +2700 +21C0 +AF20 +40E0 +ENDCHAR +STARTCHAR U_6BEF +ENCODING 27631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F2C0 +2480 +2140 +FAA0 +22E0 +2480 +F980 +2260 +2420 +1FE0 +ENDCHAR +STARTCHAR U_6BF0 +ENCODING 27632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F7E0 +2220 +2140 +FFE0 +2000 +23C0 +FA40 +23E0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BF1 +ENCODING 27633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +37C0 +CAC0 +4740 +7240 +CFC0 +7340 +C6C0 +4A40 +40A0 +3FE0 +ENDCHAR +STARTCHAR U_6BF2 +ENCODING 27634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +ABC0 +4480 +AA80 +ABE0 +FE80 +AA80 +ABE0 +4480 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_6BF3 +ENCODING 27635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +7FA0 +0820 +FFE0 +2100 +FFE0 +2100 +FFE0 +2120 +38E0 +ENDCHAR +STARTCHAR U_6BF4 +ENCODING 27636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +E280 +26E0 +3A80 +E6E0 +3A80 +E6E0 +2280 +22A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BF5 +ENCODING 27637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4BC0 +FC80 +1080 +FFE0 +A480 +4880 +93E0 +6880 +10A0 +6060 +ENDCHAR +STARTCHAR U_6BF6 +ENCODING 27638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +C240 +47C0 +7100 +CFE0 +7240 +CCA0 +4740 +40A0 +4720 +3FE0 +ENDCHAR +STARTCHAR U_6BF7 +ENCODING 27639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +87C0 +FC80 +84E0 +FF80 +4880 +78E0 +4B80 +7880 +48A0 +7860 +ENDCHAR +STARTCHAR U_6BF8 +ENCODING 27640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E540 +47C0 +4540 +F7C0 +4100 +46A0 +FA20 +4BC0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BF9 +ENCODING 27641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +4480 +BA80 +01E0 +EA80 +AA80 +EBE0 +AA80 +EAA0 +A2A0 +A660 +ENDCHAR +STARTCHAR U_6BFA +ENCODING 27642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +C180 +4240 +75A0 +C800 +4EA0 +7AA0 +CEA0 +4A40 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BFB +ENCODING 27643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +2080 +7C80 +93E0 +7C80 +4480 +7FE0 +4480 +7CA0 +4C60 +ENDCHAR +STARTCHAR U_6BFC +ENCODING 27644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8B80 +F880 +88E0 +FB80 +4080 +FCE0 +A780 +D4A0 +F4A0 +1860 +ENDCHAR +STARTCHAR U_6BFD +ENCODING 27645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E4A0 +25E0 +2CA0 +F7E0 +2C80 +27E0 +F480 +2BE0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BFE +ENCODING 27646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4780 +7C80 +44E0 +7F80 +0080 +FCE0 +B780 +6CA0 +B4A0 +6C60 +ENDCHAR +STARTCHAR U_6BFF +ENCODING 27647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +FF80 +4880 +B4E0 +DF80 +3080 +48E0 +A780 +54A0 +A8A0 +3060 +ENDCHAR +STARTCHAR U_6C00 +ENCODING 27648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7D80 +D680 +7CE0 +1380 +7C80 +54E0 +FF80 +2480 +38A0 +6460 +ENDCHAR +STARTCHAR U_6C01 +ENCODING 27649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +4280 +47C0 +F440 +47C0 +4440 +FFE0 +4280 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C02 +ENCODING 27650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +11E0 +FEA0 +5440 +92A0 +3FE0 +2300 +3E00 +2380 +5E20 +83E0 +ENDCHAR +STARTCHAR U_6C03 +ENCODING 27651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +2880 +10E0 +FF80 +5480 +7CE0 +5780 +FEA0 +10A0 +FE60 +ENDCHAR +STARTCHAR U_6C04 +ENCODING 27652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +2B80 +FC80 +54E0 +9380 +FC80 +B4E0 +CF80 +BCA0 +A4A0 +BC60 +ENDCHAR +STARTCHAR U_6C05 +ENCODING 27653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FFE0 +82A0 +BA40 +AAA0 +7FA0 +07C0 +7C00 +07C0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_6C06 +ENCODING 27654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +4AA0 +46C0 +FFE0 +4440 +47C0 +F440 +47C0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6C07 +ENCODING 27655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +E480 +4FC0 +4540 +F7C0 +4D60 +47C0 +F440 +47C0 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C08 +ENCODING 27656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +AA80 +BAE0 +8380 +FE80 +48E0 +7B80 +48A0 +48A0 +FC60 +ENDCHAR +STARTCHAR U_6C09 +ENCODING 27657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4880 +FCE0 +B780 +FC80 +10E0 +FF80 +38A0 +54A0 +9260 +ENDCHAR +STARTCHAR U_6C0A +ENCODING 27658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +DFE0 +4A40 +FBC0 +4840 +4FC0 +F480 +44A0 +4FE0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6C0B +ENCODING 27659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2860 +FF80 +2880 +FEE0 +8380 +7C80 +A8E0 +5980 +2CA0 +CAA0 +3160 +ENDCHAR +STARTCHAR U_6C0C +ENCODING 27660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +E480 +4FC0 +4540 +77C0 +CAA0 +47C0 +7440 +C7C0 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C0D +ENCODING 27661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE60 +9380 +FE80 +92E0 +FF80 +2880 +7EE0 +C980 +7EA0 +48A0 +7E60 +ENDCHAR +STARTCHAR U_6C0E +ENCODING 27662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +5580 +FE80 +ABE0 +FE80 +2080 +FFE0 +A280 +7CA0 +28A0 +FE60 +ENDCHAR +STARTCHAR U_6C0F +ENCODING 27663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +8800 +8800 +FFC0 +8800 +8800 +8400 +A440 +C240 +81C0 +ENDCHAR +STARTCHAR U_6C10 +ENCODING 27664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +8800 +8800 +FFC0 +8400 +8400 +9200 +A240 +D140 +88C0 +ENDCHAR +STARTCHAR U_6C11 +ENCODING 27665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8080 +8080 +FF80 +8800 +8800 +FFC0 +8400 +9440 +A240 +C1C0 +ENDCHAR +STARTCHAR U_6C12 +ENCODING 27666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4240 +7FE0 +4900 +50A0 +6460 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_6C13 +ENCODING 27667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +2420 +FFE0 +4480 +47E0 +4480 +4480 +7CA0 +0560 +0620 +ENDCHAR +STARTCHAR U_6C14 +ENCODING 27668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2000 +5F80 +8000 +3F00 +0100 +0120 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_6C15 +ENCODING 27669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5F80 +8000 +3F80 +0080 +08A0 +08A0 +1060 +6020 +ENDCHAR +STARTCHAR U_6C16 +ENCODING 27670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4000 +BF80 +0080 +7E80 +1480 +16A0 +22A0 +4260 +8C20 +ENDCHAR +STARTCHAR U_6C17 +ENCODING 27671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5FC0 +8000 +7F80 +0280 +2480 +18A0 +2660 +4220 +ENDCHAR +STARTCHAR U_6C18 +ENCODING 27672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4000 +9F80 +0000 +3F80 +0080 +2480 +24A0 +2460 +4420 +ENDCHAR +STARTCHAR U_6C19 +ENCODING 27673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0000 +7F80 +1080 +9280 +92A0 +FE60 +8220 +ENDCHAR +STARTCHAR U_6C1A +ENCODING 27674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +4000 +BF80 +0000 +7F80 +0080 +2A80 +2AA0 +2A60 +4220 +ENDCHAR +STARTCHAR U_6C1B +ENCODING 27675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +FF80 +1480 +2280 +4180 +BEA0 +12A0 +2260 +4C20 +ENDCHAR +STARTCHAR U_6C1C +ENCODING 27676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0000 +FF80 +2280 +3E80 +22A0 +2260 +3E20 +ENDCHAR +STARTCHAR U_6C1D +ENCODING 27677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8000 +FF80 +1080 +FE80 +9280 +9280 +AAA0 +C660 +8620 +ENDCHAR +STARTCHAR U_6C1E +ENCODING 27678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +FF80 +0080 +FE80 +1080 +FE80 +92A0 +AA60 +8620 +ENDCHAR +STARTCHAR U_6C1F +ENCODING 27679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8000 +7F80 +2880 +7E80 +2A80 +FF80 +29A0 +4B60 +8820 +ENDCHAR +STARTCHAR U_6C20 +ENCODING 27680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0880 +3E80 +2A80 +3EA0 +2AA0 +3E60 +0820 +ENDCHAR +STARTCHAR U_6C21 +ENCODING 27681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +2280 +5480 +0880 +F780 +08A0 +2460 +1820 +ENDCHAR +STARTCHAR U_6C22 +ENCODING 27682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0080 +7E80 +0C80 +13A0 +FEA0 +0860 +7F20 +ENDCHAR +STARTCHAR U_6C23 +ENCODING 27683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0080 +4980 +2A80 +FFA0 +1CA0 +2A60 +C920 +ENDCHAR +STARTCHAR U_6C24 +ENCODING 27684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +9280 +FE80 +9280 +AAA0 +FE60 +8220 +ENDCHAR +STARTCHAR U_6C25 +ENCODING 27685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +2880 +FE80 +AAA0 +EEA0 +8260 +FE20 +ENDCHAR +STARTCHAR U_6C26 +ENCODING 27686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1080 +FE80 +2480 +7880 +1480 +68A0 +1460 +E320 +ENDCHAR +STARTCHAR U_6C27 +ENCODING 27687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +4480 +2880 +FE80 +1080 +7CA0 +10A0 +FE60 +1020 +ENDCHAR +STARTCHAR U_6C28 +ENCODING 27688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1080 +FE80 +9280 +FF80 +2480 +38A0 +1660 +E120 +ENDCHAR +STARTCHAR U_6C29 +ENCODING 27689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0080 +FF80 +2880 +A980 +6A80 +28A0 +2860 +FF20 +ENDCHAR +STARTCHAR U_6C2A +ENCODING 27690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0880 +7E80 +0880 +3E80 +2280 +3EA0 +1560 +E720 +ENDCHAR +STARTCHAR U_6C2B +ENCODING 27691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +5480 +A880 +5480 +FEA0 +1060 +FF20 +ENDCHAR +STARTCHAR U_6C2C +ENCODING 27692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FF80 +2880 +EE80 +8280 +EEA0 +2860 +FF20 +ENDCHAR +STARTCHAR U_6C2D +ENCODING 27693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +7F80 +2A80 +3E80 +2A80 +3E80 +1CA0 +2A60 +C920 +ENDCHAR +STARTCHAR U_6C2E +ENCODING 27694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1280 +5480 +A880 +5480 +9280 +5480 +A8A0 +C660 +ENDCHAR +STARTCHAR U_6C2F +ENCODING 27695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0280 +3E80 +0280 +FF80 +4A80 +2CA0 +4A60 +9920 +ENDCHAR +STARTCHAR U_6C30 +ENCODING 27696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +BF80 +1080 +7E80 +1080 +FF80 +42A0 +7AA0 +5E60 +4220 +ENDCHAR +STARTCHAR U_6C31 +ENCODING 27697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +FF80 +2480 +3C80 +2480 +7E80 +AAA0 +5260 +2420 +ENDCHAR +STARTCHAR U_6C32 +ENCODING 27698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +7C80 +4480 +7C80 +4480 +FEA0 +AA60 +FF20 +ENDCHAR +STARTCHAR U_6C33 +ENCODING 27699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0080 +7C80 +5480 +5480 +6C80 +FEA0 +AA60 +FF20 +ENDCHAR +STARTCHAR U_6C34 +ENCODING 27700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0440 +F680 +1500 +1500 +2480 +2480 +4440 +9420 +0800 +ENDCHAR +STARTCHAR U_6C35 +ENCODING 27701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +40 +20 +00 +80 +50 +10 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR U_6C36 +ENCODING 27702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +0400 +04C0 +7500 +1600 +1500 +2500 +2480 +5460 +8800 +ENDCHAR +STARTCHAR U_6C37 +ENCODING 27703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4400 +2400 +04C0 +F500 +1600 +1500 +2480 +4460 +9440 +0800 +ENDCHAR +STARTCHAR U_6C38 +ENCODING 27704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3C40 +0480 +F500 +1600 +2500 +2480 +4460 +9400 +0800 +ENDCHAR +STARTCHAR U_6C39 +ENCODING 27705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +1120 +1D40 +2580 +2540 +4920 +9120 +8500 +8220 +7FE0 +ENDCHAR +STARTCHAR U_6C3A +ENCODING 27706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +0400 +4440 +2480 +2500 +1600 +2500 +C4C0 +0440 +1400 +0800 +ENDCHAR +STARTCHAR U_6C3B +ENCODING 27707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +1100 +97E0 +5120 +2120 +2120 +C220 +4420 +4920 +50C0 +ENDCHAR +STARTCHAR U_6C3C +ENCODING 27708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7580 +1600 +2500 +D480 +0860 +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_6C3D +ENCODING 27709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +0900 +3080 +C260 +0200 +7B20 +0B40 +1280 +2240 +CA20 +0400 +ENDCHAR +STARTCHAR U_6C3E +ENCODING 27710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +0440 +8440 +4C40 +1440 +1580 +E400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6C3F +ENCODING 27711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0F80 +9280 +5280 +2280 +2280 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C40 +ENCODING 27712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2100 +8100 +4100 +2100 +2100 +C100 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6C41 +ENCODING 27713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C42 +ENCODING 27714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0440 +FFE0 +0400 +2480 +1500 +0E00 +1500 +2480 +C460 +0C00 +ENDCHAR +STARTCHAR U_6C43 +ENCODING 27715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +8480 +5480 +1480 +2480 +2480 +C840 +4840 +5020 +5020 +ENDCHAR +STARTCHAR U_6C44 +ENCODING 27716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2200 +8200 +4200 +1200 +2500 +C500 +4880 +4860 +5040 +ENDCHAR +STARTCHAR U_6C45 +ENCODING 27717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8200 +4200 +5400 +27C0 +2040 +C040 +4040 +4280 +4100 +ENDCHAR +STARTCHAR U_6C46 +ENCODING 27718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +1200 +2580 +C460 +0440 +7E80 +1500 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6C47 +ENCODING 27719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +8400 +5400 +1400 +2400 +2400 +C400 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6C48 +ENCODING 27720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +0020 +8020 +50A0 +2120 +2220 +CC20 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C49 +ENCODING 27721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +8440 +5440 +1440 +2280 +2280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C4A +ENCODING 27722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +8440 +5540 +1540 +2280 +2280 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6C4B +ENCODING 27723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +5420 +1A20 +2120 +2120 +C020 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C4C +ENCODING 27724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +22A0 +82A0 +52A0 +12A0 +22A0 +22A0 +C2A0 +44A0 +44A0 +4820 +ENDCHAR +STARTCHAR U_6C4D +ENCODING 27725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8F80 +5280 +1280 +2680 +2380 +C2A0 +44A0 +4860 +5020 +ENDCHAR +STARTCHAR U_6C4E +ENCODING 27726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +4480 +1680 +2580 +2480 +C480 +44A0 +48A0 +50E0 +ENDCHAR +STARTCHAR U_6C4F +ENCODING 27727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1100 +2100 +2100 +C280 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6C50 +ENCODING 27728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +83E0 +5220 +1420 +2A40 +2140 +C080 +4100 +4600 +5800 +ENDCHAR +STARTCHAR U_6C51 +ENCODING 27729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +4200 +03E0 +2E00 +2200 +C200 +4220 +4220 +41E0 +ENDCHAR +STARTCHAR U_6C52 +ENCODING 27730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5400 +1400 +2400 +2400 +C400 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6C53 +ENCODING 27731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8080 +4100 +5100 +2FE0 +2100 +C100 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6C54 +ENCODING 27732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +8400 +5800 +17C0 +2080 +2100 +C200 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C55 +ENCODING 27733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +4920 +1920 +2920 +2920 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6C56 +ENCODING 27734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +0440 +7580 +1600 +2580 +C460 +1440 +0800 +ENDCHAR +STARTCHAR U_6C57 +ENCODING 27735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8100 +5100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C58 +ENCODING 27736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +5200 +2200 +3FE0 +C200 +4200 +4200 +4200 +0200 +ENDCHAR +STARTCHAR U_6C59 +ENCODING 27737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8100 +4100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6C5A +ENCODING 27738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8200 +4200 +5FE0 +2400 +27C0 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6C5B +ENCODING 27739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2FC0 +8480 +5480 +1480 +2F80 +2480 +C4A0 +44A0 +4460 +4420 +ENDCHAR +STARTCHAR U_6C5C +ENCODING 27740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +5440 +17C0 +2440 +2400 +C400 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C5D +ENCODING 27741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0200 +9FE0 +5480 +2480 +2880 +CD00 +4300 +44C0 +5820 +ENDCHAR +STARTCHAR U_6C5E +ENCODING 27742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +0400 +7C40 +1680 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6C5F +ENCODING 27743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +8100 +5100 +1100 +2100 +2100 +C100 +4100 +5FE0 +4000 +ENDCHAR +STARTCHAR U_6C60 +ENCODING 27744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +8500 +55C0 +1740 +2D40 +2540 +C5C0 +4520 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C61 +ENCODING 27745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2000 +8000 +5FE0 +1400 +2400 +27C0 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6C62 +ENCODING 27746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0200 +9200 +5FC0 +2200 +4200 +C200 +4200 +5FE0 +4000 +ENDCHAR +STARTCHAR U_6C63 +ENCODING 27747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +07C0 +8440 +4840 +2080 +4080 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C64 +ENCODING 27748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +8100 +5200 +17E0 +22A0 +24A0 +C920 +4220 +44A0 +4840 +ENDCHAR +STARTCHAR U_6C65 +ENCODING 27749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5100 +1FE0 +2440 +2280 +C100 +4380 +4460 +5820 +ENDCHAR +STARTCHAR U_6C66 +ENCODING 27750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +4900 +1FE0 +2900 +2900 +C920 +4AA0 +4C60 +4820 +ENDCHAR +STARTCHAR U_6C67 +ENCODING 27751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2480 +8480 +5480 +1FE0 +2480 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C68 +ENCODING 27752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +5420 +17E0 +2420 +2420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6C69 +ENCODING 27753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +8FE0 +4820 +0820 +2FA0 +2820 +C820 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6C6A +ENCODING 27754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8100 +5100 +1100 +27C0 +2100 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6C6B +ENCODING 27755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +9FE0 +4480 +2480 +2FE0 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C6C +ENCODING 27756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FC0 +0900 +FFE0 +1100 +6500 +0400 +76C0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6C6D +ENCODING 27757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +9920 +5920 +2AA0 +2C60 +C820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6C6E +ENCODING 27758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +8820 +6420 +32A0 +2120 +C220 +4C20 +4020 +40C0 +ENDCHAR +STARTCHAR U_6C6F +ENCODING 27759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +5200 +1200 +2480 +2480 +C900 +4940 +5220 +67E0 +ENDCHAR +STARTCHAR U_6C70 +ENCODING 27760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1100 +2100 +2280 +C280 +4640 +4940 +5020 +ENDCHAR +STARTCHAR U_6C71 +ENCODING 27761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2280 +8240 +5FE0 +1200 +2200 +2200 +C500 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_6C72 +ENCODING 27762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +2440 +8480 +55C0 +1440 +2440 +2640 +C980 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6C73 +ENCODING 27763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2700 +8400 +5400 +17E0 +2420 +2640 +C940 +4880 +5140 +6620 +ENDCHAR +STARTCHAR U_6C74 +ENCODING 27764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1100 +2180 +2140 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C75 +ENCODING 27765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2500 +8880 +5260 +2100 +2FC0 +4080 +C100 +4100 +4200 +ENDCHAR +STARTCHAR U_6C76 +ENCODING 27766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5440 +1440 +2280 +2280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C77 +ENCODING 27767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +03C0 +8440 +5440 +2A80 +4280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C78 +ENCODING 27768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5200 +13C0 +2240 +2240 +C440 +4440 +4940 +5080 +ENDCHAR +STARTCHAR U_6C79 +ENCODING 27769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +28A0 +8CA0 +5AA0 +1920 +2920 +2AA0 +CA60 +4C20 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6C7A +ENCODING 27770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FC0 +5240 +1240 +2FE0 +2200 +C300 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_6C7B +ENCODING 27771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8900 +5100 +1100 +2FE0 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C7C +ENCODING 27772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8900 +4FC0 +1100 +2100 +2FE0 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C7D +ENCODING 27773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +57C0 +1000 +2F80 +2080 +C080 +40A0 +4060 +4020 +ENDCHAR +STARTCHAR U_6C7E +ENCODING 27774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8440 +4820 +17E0 +2240 +2240 +C240 +4440 +4540 +4880 +ENDCHAR +STARTCHAR U_6C7F +ENCODING 27775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +0280 +8100 +5FE0 +2120 +4100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6C80 +ENCODING 27776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1020 +1540 +F880 +3BE0 +38A0 +5480 +5480 +9280 +1080 +3180 +ENDCHAR +STARTCHAR U_6C81 +ENCODING 27777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +8280 +5200 +1240 +2A20 +2A20 +D200 +4220 +4220 +41E0 +ENDCHAR +STARTCHAR U_6C82 +ENCODING 27778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8400 +5400 +17E0 +2480 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C83 +ENCODING 27779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2E00 +8200 +5200 +1FE0 +2200 +2200 +C500 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_6C84 +ENCODING 27780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +8000 +5000 +1000 +2FE0 +2200 +C200 +4440 +4FE0 +4420 +ENDCHAR +STARTCHAR U_6C85 +ENCODING 27781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +8000 +5FE0 +1280 +2280 +2280 +C280 +44A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6C86 +ENCODING 27782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5000 +1780 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C87 +ENCODING 27783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +8840 +5FE0 +1020 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C88 +ENCODING 27784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +4A40 +1200 +2300 +2500 +C500 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6C89 +ENCODING 27785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8000 +5780 +1480 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C8A +ENCODING 27786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F920 +AF40 +2380 +2540 +3540 +3920 +5300 +5020 +8FE0 +ENDCHAR +STARTCHAR U_6C8B +ENCODING 27787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +1300 +2300 +2500 +C500 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6C8C +ENCODING 27788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +1920 +2920 +2FE0 +C100 +4120 +4120 +40E0 +ENDCHAR +STARTCHAR U_6C8D +ENCODING 27789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +8200 +43E0 +1440 +2440 +2440 +CFC0 +4080 +4080 +5FE0 +ENDCHAR +STARTCHAR U_6C8E +ENCODING 27790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +8920 +5920 +2940 +2980 +2900 +CB00 +4D20 +4920 +48E0 +ENDCHAR +STARTCHAR U_6C8F +ENCODING 27791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2BE0 +88A0 +5EA0 +28A0 +28A0 +2AA0 +DCA0 +4920 +42A0 +4440 +ENDCHAR +STARTCHAR U_6C90 +ENCODING 27792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1380 +2380 +2540 +C540 +4920 +5120 +4100 +ENDCHAR +STARTCHAR U_6C91 +ENCODING 27793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8240 +4240 +5240 +2FC0 +2440 +C440 +4440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6C92 +ENCODING 27794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8440 +5940 +1080 +27C0 +2440 +C280 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6C93 +ENCODING 27795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7580 +1600 +2500 +CCC0 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_6C94 +ENCODING 27796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8100 +59E0 +1920 +2920 +2FE0 +C020 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C95 +ENCODING 27797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +4AA0 +12A0 +24A0 +2920 +D120 +4220 +4CA0 +4040 +ENDCHAR +STARTCHAR U_6C96 +ENCODING 27798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1920 +2FE0 +2920 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C97 +ENCODING 27799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2480 +E4E0 +1500 +0E00 +1500 +64C0 +0C40 +ENDCHAR +STARTCHAR U_6C98 +ENCODING 27800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +8920 +4940 +1F80 +2900 +2900 +C900 +4B20 +4D20 +48E0 +ENDCHAR +STARTCHAR U_6C99 +ENCODING 27801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8540 +4520 +1520 +2900 +2120 +C040 +4080 +4300 +5C00 +ENDCHAR +STARTCHAR U_6C9A +ENCODING 27802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5500 +15E0 +2500 +2500 +C500 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6C9B +ENCODING 27803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1920 +2920 +2920 +C920 +4960 +4100 +4100 +ENDCHAR +STARTCHAR U_6C9C +ENCODING 27804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8480 +57E0 +1400 +27C0 +2440 +C440 +4840 +4840 +5040 +ENDCHAR +STARTCHAR U_6C9D +ENCODING 27805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +10A0 +F7C0 +3980 +31C0 +5AC0 +56A0 +92A0 +14A0 +3180 +ENDCHAR +STARTCHAR U_6C9E +ENCODING 27806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8200 +4FC0 +1A40 +2A40 +4A40 +CA40 +4AC0 +4200 +4200 +ENDCHAR +STARTCHAR U_6C9F +ENCODING 27807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +9820 +5220 +2220 +2520 +CFA0 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CA0 +ENCODING 27808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E80 +8A80 +4A80 +1A80 +2A80 +4A80 +CA40 +5240 +5220 +6220 +ENDCHAR +STARTCHAR U_6CA1 +ENCODING 27809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +48E0 +1000 +2FC0 +2480 +4280 +C300 +4480 +5860 +ENDCHAR +STARTCHAR U_6CA2 +ENCODING 27810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8840 +5840 +2FC0 +2A00 +4A00 +C900 +5100 +5080 +6060 +ENDCHAR +STARTCHAR U_6CA3 +ENCODING 27811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +17C0 +2100 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CA4 +ENCODING 27812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8840 +4A40 +1980 +2880 +2940 +CA20 +4C20 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6CA5 +ENCODING 27813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2480 +8480 +57E0 +14A0 +24A0 +24A0 +C920 +4920 +52A0 +6440 +ENDCHAR +STARTCHAR U_6CA6 +ENCODING 27814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2300 +8480 +5840 +1020 +2440 +2480 +C700 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CA7 +ENCODING 27815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +17C0 +2440 +2440 +C580 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CA8 +ENCODING 27816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FC0 +2840 +8CC0 +4AC0 +2940 +4940 +CAC0 +5440 +5020 +6020 +ENDCHAR +STARTCHAR U_6CA9 +ENCODING 27817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +8100 +5FE0 +1120 +2120 +22A0 +C2A0 +4420 +4820 +50C0 +ENDCHAR +STARTCHAR U_6CAA +ENCODING 27818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +87E0 +5420 +1420 +27E0 +2400 +C400 +4400 +4800 +5000 +ENDCHAR +STARTCHAR U_6CAB +ENCODING 27819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +9FE0 +4200 +0FC0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6CAC +ENCODING 27820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FC0 +4200 +1FE0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6CAD +ENCODING 27821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +9FE0 +4200 +1700 +2700 +2A80 +D240 +6220 +4200 +4200 +ENDCHAR +STARTCHAR U_6CAE +ENCODING 27822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +5440 +17C0 +2440 +2440 +C7C0 +4440 +4440 +4FE0 +ENDCHAR +STARTCHAR U_6CAF +ENCODING 27823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +76C0 +1500 +2480 +CC60 +0000 +FFE0 +0800 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_6CB0 +ENCODING 27824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +8200 +5400 +27E0 +2C20 +5420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CB1 +ENCODING 27825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5820 +1400 +24C0 +2700 +C400 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CB2 +ENCODING 27826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +9000 +6200 +2BC0 +2E40 +3A40 +CAC0 +4A00 +4820 +47E0 +ENDCHAR +STARTCHAR U_6CB3 +ENCODING 27827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2040 +8040 +4F40 +0940 +2940 +2F40 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6CB4 +ENCODING 27828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8500 +4880 +3260 +2500 +4A40 +C480 +4100 +4200 +4C00 +ENDCHAR +STARTCHAR U_6CB5 +ENCODING 27829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +0FE0 +8820 +5100 +2100 +4940 +D120 +4120 +4500 +4200 +ENDCHAR +STARTCHAR U_6CB6 +ENCODING 27830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +8000 +5FE0 +1100 +2580 +2540 +C920 +5120 +4100 +4300 +ENDCHAR +STARTCHAR U_6CB7 +ENCODING 27831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +13C0 +2240 +2640 +C580 +4980 +5240 +6420 +ENDCHAR +STARTCHAR U_6CB8 +ENCODING 27832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +9FC0 +4540 +3FC0 +5500 +5FE0 +C520 +4520 +49C0 +5100 +ENDCHAR +STARTCHAR U_6CB9 +ENCODING 27833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4920 +1920 +2920 +2FE0 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CBA +ENCODING 27834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +4920 +1FE0 +2920 +2920 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CBB +ENCODING 27835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8200 +5440 +3FE0 +2020 +C7C0 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6CBC +ENCODING 27836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2220 +8220 +5420 +18C0 +2000 +27E0 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CBD +ENCODING 27837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +9FE0 +4200 +1200 +2FC0 +2840 +C840 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6CBE +ENCODING 27838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +83E0 +5200 +1200 +2FC0 +2840 +C840 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6CBF +ENCODING 27839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +5480 +1860 +2000 +2FC0 +C840 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6CC0 +ENCODING 27840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +87A0 +5020 +1720 +2520 +2520 +C720 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CC1 +ENCODING 27841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8840 +5840 +1FC0 +2500 +2500 +C500 +4920 +4920 +50E0 +ENDCHAR +STARTCHAR U_6CC2 +ENCODING 27842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4BA0 +1AA0 +2AA0 +2BA0 +C820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6CC3 +ENCODING 27843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +4820 +17A0 +24A0 +24A0 +C7A0 +4020 +4020 +40C0 +ENDCHAR +STARTCHAR U_6CC4 +ENCODING 27844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +8540 +5FE0 +1540 +2540 +2540 +C5C0 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6CC5 +ENCODING 27845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8920 +4920 +1920 +2920 +2AA0 +CC60 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6CC6 +ENCODING 27846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87C0 +5900 +1100 +2FE0 +2100 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6CC7 +ENCODING 27847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +9EE0 +4AA0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +5AE0 +64A0 +ENDCHAR +STARTCHAR U_6CC8 +ENCODING 27848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +0C80 +D500 +2300 +2480 +5A60 +C100 +4280 +4100 +4080 +ENDCHAR +STARTCHAR U_6CC9 +ENCODING 27849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2080 +3F80 +2080 +3F80 +04C0 +7700 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6CCA +ENCODING 27850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +87E0 +5420 +1420 +27E0 +2420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CCB +ENCODING 27851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8A80 +6880 +3FE0 +4880 +C880 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6CCC +ENCODING 27852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +8220 +5240 +1240 +2AA0 +2AA0 +D300 +4220 +4620 +49E0 +ENDCHAR +STARTCHAR U_6CCD +ENCODING 27853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +1380 +2380 +2540 +C920 +57E0 +4100 +4100 +ENDCHAR +STARTCHAR U_6CCE +ENCODING 27854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +07E0 +8A00 +53C0 +2200 +2200 +C3E0 +4200 +4200 +4200 +ENDCHAR +STARTCHAR U_6CCF +ENCODING 27855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +8920 +4920 +0920 +2FE0 +2100 +C920 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6CD0 +ENCODING 27856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2A80 +8BE0 +5CA0 +1AA0 +2AA0 +2AA0 +CEA0 +48A0 +4920 +4AC0 +ENDCHAR +STARTCHAR U_6CD1 +ENCODING 27857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +89E0 +5AA0 +1EA0 +24A0 +24A0 +CAA0 +5F20 +41A0 +4240 +ENDCHAR +STARTCHAR U_6CD2 +ENCODING 27858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +8A80 +5A80 +1A80 +2A80 +2A80 +CA40 +4AC0 +52A0 +5360 +ENDCHAR +STARTCHAR U_6CD3 +ENCODING 27859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2240 +8240 +4E40 +0840 +2E80 +2280 +C2A0 +4320 +4BE0 +4420 +ENDCHAR +STARTCHAR U_6CD4 +ENCODING 27860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +8FE0 +5440 +1440 +2440 +27C0 +C440 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6CD5 +ENCODING 27861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +8100 +4100 +0FE0 +2100 +C200 +4440 +4FA0 +4420 +ENDCHAR +STARTCHAR U_6CD6 +ENCODING 27862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CE0 +8AA0 +4AA0 +1AA0 +2AA0 +2AA0 +CEE0 +4280 +4480 +4880 +ENDCHAR +STARTCHAR U_6CD7 +ENCODING 27863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8AA0 +5AA0 +1AA0 +2AA0 +2AE0 +CC20 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CD8 +ENCODING 27864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +0200 +9240 +4A80 +3FE0 +4200 +C200 +4200 +4A00 +4400 +ENDCHAR +STARTCHAR U_6CD9 +ENCODING 27865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8920 +4540 +0100 +3FE0 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CDA +ENCODING 27866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8A80 +4BA0 +1AC0 +2A80 +2A80 +CA80 +4AA0 +4BA0 +5C60 +ENDCHAR +STARTCHAR U_6CDB +ENCODING 27867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2F00 +8200 +5100 +1FE0 +2080 +2100 +C200 +4400 +4A00 +51E0 +ENDCHAR +STARTCHAR U_6CDC +ENCODING 27868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +4900 +1FE0 +2900 +2900 +C880 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_6CDD +ENCODING 27869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8400 +47E0 +1480 +2480 +24C0 +C4A0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6CDE +ENCODING 27870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4820 +2000 +4FE0 +4100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6CDF +ENCODING 27871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8100 +4100 +29E0 +2900 +4900 +C900 +4900 +4900 +5FE0 +ENDCHAR +STARTCHAR U_6CE0 +ENCODING 27872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8280 +4440 +1920 +2080 +2FE0 +C040 +4280 +4100 +4080 +ENDCHAR +STARTCHAR U_6CE1 +ENCODING 27873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +8FC0 +5040 +2F40 +2940 +2F40 +C8C0 +4820 +4820 +47E0 +ENDCHAR +STARTCHAR U_6CE2 +ENCODING 27874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4920 +1900 +2FC0 +2840 +CA80 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6CE3 +ENCODING 27875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4000 +2080 +2880 +2480 +C480 +4500 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6CE4 +ENCODING 27876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2880 +0C80 +8A80 +4880 +2A80 +4C80 +C980 +4140 +4240 +4C20 +ENDCHAR +STARTCHAR U_6CE5 +ENCODING 27877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4FE0 +1800 +2A00 +2A60 +CB80 +5220 +5220 +61E0 +ENDCHAR +STARTCHAR U_6CE6 +ENCODING 27878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8800 +5A00 +2F80 +2A80 +CAA0 +52A0 +54A0 +6860 +ENDCHAR +STARTCHAR U_6CE7 +ENCODING 27879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +8FE0 +5900 +1920 +2920 +2940 +CA80 +4CA0 +4960 +4220 +ENDCHAR +STARTCHAR U_6CE8 +ENCODING 27880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1100 +2100 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6CE9 +ENCODING 27881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87E0 +5900 +1100 +2100 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6CEA +ENCODING 27882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +57E0 +1420 +2420 +27E0 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CEB +ENCODING 27883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1200 +2440 +2F80 +C100 +4240 +4420 +4FE0 +ENDCHAR +STARTCHAR U_6CEC +ENCODING 27884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4820 +2080 +2280 +2280 +C440 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_6CED +ENCODING 27885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +8840 +4BE0 +3840 +2A40 +2940 +C940 +4840 +4940 +4880 +ENDCHAR +STARTCHAR U_6CEE +ENCODING 27886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +8540 +5100 +17C0 +2100 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CEF +ENCODING 27887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4FE0 +1900 +2FE0 +2900 +C900 +48A0 +4AA0 +4C60 +ENDCHAR +STARTCHAR U_6CF0 +ENCODING 27888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0800 +FFE0 +2480 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_6CF1 +ENCODING 27889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FC0 +4940 +2940 +2940 +3FE0 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6CF2 +ENCODING 27890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8F00 +4900 +1900 +2FE0 +2320 +C520 +4960 +5100 +4100 +ENDCHAR +STARTCHAR U_6CF3 +ENCODING 27891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8600 +4240 +3A80 +2B00 +4A80 +D240 +6220 +4200 +4600 +ENDCHAR +STARTCHAR U_6CF4 +ENCODING 27892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7500 +1600 +2500 +C4C0 +0C00 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_6CF5 +ENCODING 27893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0480 +7500 +1600 +2500 +C4E0 +0C00 +ENDCHAR +STARTCHAR U_6CF6 +ENCODING 27894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +8420 +0400 +7440 +1680 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6CF7 +ENCODING 27895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2440 +8FE0 +5500 +1500 +2540 +2540 +C980 +4920 +5320 +64E0 +ENDCHAR +STARTCHAR U_6CF8 +ENCODING 27896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8100 +5FE0 +1820 +2FE0 +2800 +C800 +4800 +5000 +6000 +ENDCHAR +STARTCHAR U_6CF9 +ENCODING 27897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +4440 +17C0 +2440 +2440 +C7C0 +4000 +4000 +4FE0 +ENDCHAR +STARTCHAR U_6CFA +ENCODING 27898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +5900 +1FE0 +2100 +2100 +C940 +4920 +5120 +4300 +ENDCHAR +STARTCHAR U_6CFB +ENCODING 27899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8400 +57E0 +1400 +27E0 +2020 +DFA0 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CFC +ENCODING 27900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2A80 +8A40 +5FE0 +1200 +27C0 +2440 +CA80 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6CFD +ENCODING 27901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2480 +0300 +8480 +5A60 +2200 +4FC0 +C200 +5FE0 +4200 +4200 +ENDCHAR +STARTCHAR U_6CFE +ENCODING 27902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +8100 +5280 +1440 +2820 +27C0 +C100 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6CFF +ENCODING 27903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +5FC0 +2C00 +2A40 +C980 +4880 +4A40 +4C20 +ENDCHAR +STARTCHAR U_6D00 +ENCODING 27904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +8440 +4640 +1540 +2FE0 +4640 +C540 +4440 +4840 +50C0 +ENDCHAR +STARTCHAR U_6D01 +ENCODING 27905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5100 +17C0 +2000 +27C0 +C440 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6D02 +ENCODING 27906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8280 +5280 +2AC0 +2AA0 +D2A0 +4480 +4A80 +5100 +ENDCHAR +STARTCHAR U_6D03 +ENCODING 27907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +5400 +1500 +2520 +2B40 +C900 +5280 +6440 +4820 +ENDCHAR +STARTCHAR U_6D04 +ENCODING 27908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1AA0 +2AA0 +2BA0 +C820 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D05 +ENCODING 27909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8FC0 +4A40 +0FC0 +2A40 +4A40 +DFE0 +4840 +4840 +48C0 +ENDCHAR +STARTCHAR U_6D06 +ENCODING 27910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F80 +4100 +0200 +8240 +5B80 +0A80 +2A80 +D240 +6620 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6D07 +ENCODING 27911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +5FE0 +1920 +2920 +2AA0 +CC60 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D08 +ENCODING 27912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2780 +8900 +4FE0 +1800 +2BC0 +2A40 +CA40 +4AC0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6D09 +ENCODING 27913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8800 +4FE0 +1800 +2800 +2BE0 +CA20 +5220 +5220 +63E0 +ENDCHAR +STARTCHAR U_6D0A +ENCODING 27914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8400 +4BE0 +1840 +2880 +2FE0 +C880 +4880 +4880 +4980 +ENDCHAR +STARTCHAR U_6D0B +ENCODING 27915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +4100 +1100 +27C0 +2100 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6D0C +ENCODING 27916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +2420 +84A0 +47A0 +09A0 +35A0 +22A0 +C2A0 +44A0 +4820 +5060 +ENDCHAR +STARTCHAR U_6D0D +ENCODING 27917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +8900 +4BC0 +1A40 +2A40 +2BC0 +C900 +4900 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6D0E +ENCODING 27918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +87E0 +5420 +17E0 +2420 +2420 +C7E0 +4420 +4420 +47E0 +ENDCHAR +STARTCHAR U_6D0F +ENCODING 27919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8200 +5FE0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6D10 +ENCODING 27920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2800 +9400 +45E0 +0840 +3840 +2840 +C840 +4840 +4940 +4880 +ENDCHAR +STARTCHAR U_6D11 +ENCODING 27921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2540 +8920 +5FE0 +1900 +2900 +2900 +C980 +4A80 +4A40 +4C20 +ENDCHAR +STARTCHAR U_6D12 +ENCODING 27922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +8280 +5FE0 +1AA0 +2AA0 +2AE0 +CC20 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D13 +ENCODING 27923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8FC0 +5A40 +2A40 +4AC0 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6D14 +ENCODING 27924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8200 +5FE0 +2080 +1FE0 +2880 +C480 +4080 +4280 +4100 +ENDCHAR +STARTCHAR U_6D15 +ENCODING 27925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +8880 +5FE0 +2880 +2F80 +4880 +CF80 +4880 +4880 +4980 +ENDCHAR +STARTCHAR U_6D16 +ENCODING 27926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +4000 +1FC0 +2200 +3FE0 +C200 +4500 +4880 +5060 +ENDCHAR +STARTCHAR U_6D17 +ENCODING 27927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87C0 +4900 +2100 +3FE0 +4280 +C280 +44A0 +48A0 +50E0 +ENDCHAR +STARTCHAR U_6D18 +ENCODING 27928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27A0 +8140 +5FE0 +1200 +27E0 +2A00 +D3E0 +4020 +4020 +40C0 +ENDCHAR +STARTCHAR U_6D19 +ENCODING 27929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2900 +8FC0 +5100 +2100 +3FE0 +2300 +C580 +4940 +5120 +4100 +ENDCHAR +STARTCHAR U_6D1A +ENCODING 27930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8C80 +5300 +1CE0 +2100 +3FE0 +C900 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6D1B +ENCODING 27931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8440 +5A80 +1100 +2280 +2FE0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D1C +ENCODING 27932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2900 +0600 +1980 +F0E0 +1F80 +0400 +75C0 +1600 +2500 +CCE0 +ENDCHAR +STARTCHAR U_6D1D +ENCODING 27933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5100 +1FE0 +2240 +2440 +C280 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6D1E +ENCODING 27934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1820 +2BA0 +2AA0 +CBA0 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6D1F +ENCODING 27935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1120 +2FE0 +2900 +CFE0 +4120 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D20 +ENCODING 27936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +8FC0 +5100 +1500 +27C0 +2900 +DFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D21 +ENCODING 27937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8FC0 +6200 +2FE0 +4700 +CA80 +7240 +4220 +4200 +ENDCHAR +STARTCHAR U_6D22 +ENCODING 27938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +8940 +5BE0 +1940 +2940 +2BC0 +C900 +4900 +4A00 +4C00 +ENDCHAR +STARTCHAR U_6D23 +ENCODING 27939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5240 +0A40 +8A80 +5FE0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6D24 +ENCODING 27940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0500 +8880 +57E0 +2200 +C200 +4F80 +4200 +4200 +5FC0 +ENDCHAR +STARTCHAR U_6D25 +ENCODING 27941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8240 +5FE0 +1240 +2FC0 +2200 +CFC0 +4200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_6D26 +ENCODING 27942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4200 +0400 +8FC0 +5840 +2840 +2FC0 +C840 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6D27 +ENCODING 27943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8200 +57C0 +1440 +2FC0 +3440 +C7C0 +4440 +4440 +44C0 +ENDCHAR +STARTCHAR U_6D28 +ENCODING 27944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4080 +2440 +2860 +3480 +C300 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6D29 +ENCODING 27945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8A40 +4FC0 +1A40 +2FC0 +2240 +C280 +4120 +46A0 +5860 +ENDCHAR +STARTCHAR U_6D2A +ENCODING 27946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8480 +5FE0 +0480 +2480 +3FE0 +C000 +4480 +4860 +5020 +ENDCHAR +STARTCHAR U_6D2B +ENCODING 27947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2200 +8FE0 +5AA0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6D2C +ENCODING 27948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5A40 +1BC0 +2D40 +2B40 +C940 +4940 +5220 +6420 +ENDCHAR +STARTCHAR U_6D2D +ENCODING 27949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8BE0 +5880 +1880 +29C0 +2880 +C880 +4BE0 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6D2E +ENCODING 27950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8AA0 +56C0 +1280 +26C0 +2AA0 +C280 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D2F +ENCODING 27951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2120 +FA20 +24C0 +FC00 +0440 +7680 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6D30 +ENCODING 27952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8800 +5FC0 +1840 +2840 +2FC0 +C800 +4800 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6D31 +ENCODING 27953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +8440 +57C0 +1440 +27C0 +2440 +C5E0 +5E40 +4040 +4040 +ENDCHAR +STARTCHAR U_6D32 +ENCODING 27954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +8920 +5920 +0DA0 +2B60 +2920 +C920 +4920 +4920 +5020 +ENDCHAR +STARTCHAR U_6D33 +ENCODING 27955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +9FE0 +4AA0 +2AA0 +2AA0 +2AA0 +C4A0 +46A0 +4AE0 +5100 +ENDCHAR +STARTCHAR U_6D34 +ENCODING 27956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +5280 +1280 +2FE0 +2280 +C280 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6D35 +ENCODING 27957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8820 +57A0 +14A0 +27A0 +24A0 +C7A0 +44A0 +4120 +40C0 +ENDCHAR +STARTCHAR U_6D36 +ENCODING 27958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8820 +5520 +1AA0 +2AA0 +2DA0 +C8A0 +4FA0 +4120 +40C0 +ENDCHAR +STARTCHAR U_6D37 +ENCODING 27959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8200 +5440 +17E0 +2120 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D38 +ENCODING 27960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8540 +5100 +1FE0 +2280 +2280 +C280 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D39 +ENCODING 27961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +8000 +57C0 +1440 +27C0 +2440 +C7C0 +4440 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6D3A +ENCODING 27962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +8440 +5A80 +1100 +2200 +27E0 +CA20 +4220 +43E0 +4220 +ENDCHAR +STARTCHAR U_6D3B +ENCODING 27963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8100 +5FE0 +1100 +2100 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D3C +ENCODING 27964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8100 +5100 +1FE0 +2000 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D3D +ENCODING 27965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +1780 +2000 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D3E +ENCODING 27966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +0860 +8B80 +5A80 +2AA0 +2AC0 +CA80 +4A40 +4A40 +5320 +ENDCHAR +STARTCHAR U_6D3F +ENCODING 27967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5BA0 +1000 +2FE0 +2200 +C7C0 +4040 +4240 +4180 +ENDCHAR +STARTCHAR U_6D40 +ENCODING 27968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8FE0 +5AA0 +1AA0 +2FE0 +2AA0 +CAA0 +4AA0 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D41 +ENCODING 27969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0400 +8880 +5FC0 +2040 +2A80 +CA80 +4AA0 +4AA0 +5260 +ENDCHAR +STARTCHAR U_6D42 +ENCODING 27970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +87E0 +5100 +1100 +2FE0 +2100 +C280 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D43 +ENCODING 27971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5920 +1540 +2FE0 +2100 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D44 +ENCODING 27972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +67C0 +2880 +8FC0 +5140 +2FE0 +4140 +CFC0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6D45 +ENCODING 27973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FC0 +5200 +1FE0 +2200 +2240 +C280 +4120 +46A0 +5860 +ENDCHAR +STARTCHAR U_6D46 +ENCODING 27974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2BE0 +0E40 +3980 +CE00 +0440 +7E80 +1500 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6D47 +ENCODING 27975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2F80 +8240 +53A0 +1CE0 +2000 +2FE0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6D48 +ENCODING 27976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8100 +57E0 +1420 +2520 +2520 +C520 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6D49 +ENCODING 27977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4BE0 +2880 +ABE0 +6AA0 +2AA0 +2AA0 +CAE0 +4880 +5080 +6080 +ENDCHAR +STARTCHAR U_6D4A +ENCODING 27978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1920 +2920 +2FE0 +C100 +4140 +41E0 +5E20 +ENDCHAR +STARTCHAR U_6D4B +ENCODING 27979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BE20 +62A0 +2AA0 +AAA0 +6AA0 +2AA0 +2AA0 +C8A0 +5420 +6220 +40E0 +ENDCHAR +STARTCHAR U_6D4C +ENCODING 27980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2540 +0920 +9BE0 +6900 +2920 +4940 +C880 +49A0 +4A60 +4820 +ENDCHAR +STARTCHAR U_6D4D +ENCODING 27981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +17C0 +2000 +2FE0 +C200 +4440 +4FA0 +4420 +ENDCHAR +STARTCHAR U_6D4E +ENCODING 27982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8480 +5300 +1480 +2860 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6D4F +ENCODING 27983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +2420 +9EA0 +42A0 +0AA0 +24A0 +24A0 +CAA0 +5220 +6020 +4060 +ENDCHAR +STARTCHAR U_6D50 +ENCODING 27984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +0440 +9280 +6FE0 +2800 +4800 +C800 +5000 +5000 +6000 +ENDCHAR +STARTCHAR U_6D51 +ENCODING 27985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8200 +5FE0 +1500 +2FE0 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D52 +ENCODING 27986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +81E0 +4280 +3C80 +2BE0 +2880 +CA80 +4C80 +4880 +4080 +ENDCHAR +STARTCHAR U_6D53 +ENCODING 27987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4A20 +1200 +2520 +2540 +CC80 +5440 +4520 +4600 +ENDCHAR +STARTCHAR U_6D54 +ENCODING 27988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +87C0 +4040 +2FC0 +2080 +4FE0 +C880 +4480 +4080 +4180 +ENDCHAR +STARTCHAR U_6D55 +ENCODING 27989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8840 +4FC0 +0900 +2880 +5240 +D120 +6000 +4200 +4100 +ENDCHAR +STARTCHAR U_6D56 +ENCODING 27990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +0A40 +8540 +5080 +2FE0 +4480 +C280 +4080 +4280 +4100 +ENDCHAR +STARTCHAR U_6D57 +ENCODING 27991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +2AC0 +2700 +4A80 +F240 +4220 +4A00 +4400 +ENDCHAR +STARTCHAR U_6D58 +ENCODING 27992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5840 +1B80 +2900 +2FC0 +C900 +4FC0 +5120 +60E0 +ENDCHAR +STARTCHAR U_6D59 +ENCODING 27993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +9F00 +5500 +17E0 +2D40 +3540 +C540 +4540 +5640 +4A40 +ENDCHAR +STARTCHAR U_6D5A +ENCODING 27994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +8FA0 +5280 +1440 +2A20 +27C0 +CA80 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D5B +ENCODING 27995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +0A80 +9260 +6FC0 +2100 +4200 +CFC0 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6D5C +ENCODING 27996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2780 +8400 +57E0 +1480 +2480 +2480 +CFE0 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D5D +ENCODING 27997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4440 +1FE0 +8600 +5680 +2740 +4A80 +CB20 +4AC0 +5320 +6DE0 +ENDCHAR +STARTCHAR U_6D5E +ENCODING 27998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1100 +2100 +25E0 +C500 +4500 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6D5F +ENCODING 27999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +95E0 +5540 +1740 +3540 +3540 +D540 +5480 +5140 +5220 +ENDCHAR +STARTCHAR U_6D60 +ENCODING 28000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +2300 +8CC0 +5200 +1FE0 +2500 +2FE0 +D520 +4520 +4560 +4100 +ENDCHAR +STARTCHAR U_6D61 +ENCODING 28001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1020 +27C0 +2080 +CFE0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6D62 +ENCODING 28002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +87C0 +5440 +1440 +27C0 +2000 +C440 +4280 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D63 +ENCODING 28003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5380 +1000 +2FE0 +2280 +C280 +42A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6D64 +ENCODING 28004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5200 +1FE0 +2400 +2500 +C900 +5240 +6240 +47A0 +ENDCHAR +STARTCHAR U_6D65 +ENCODING 28005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5000 +1FE0 +2920 +2FE0 +C800 +4820 +4820 +47E0 +ENDCHAR +STARTCHAR U_6D66 +ENCODING 28006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +8FE0 +5100 +1FE0 +2920 +2FE0 +C920 +4FE0 +4920 +4960 +ENDCHAR +STARTCHAR U_6D67 +ENCODING 28007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1000 +2FE0 +2100 +C7C0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6D68 +ENCODING 28008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5100 +1FE0 +2100 +2380 +C340 +4540 +4920 +4100 +ENDCHAR +STARTCHAR U_6D69 +ENCODING 28009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +87C0 +5900 +1100 +2FE0 +2000 +C7C0 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6D6A +ENCODING 28010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8840 +4FC0 +1840 +2FC0 +2A20 +C940 +4980 +4A80 +4C60 +ENDCHAR +STARTCHAR U_6D6B +ENCODING 28011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +0480 +8840 +4FC0 +2200 +2200 +DFE0 +4200 +4200 +4200 +ENDCHAR +STARTCHAR U_6D6C +ENCODING 28012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FE0 +2920 +2100 +CFE0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6D6D +ENCODING 28013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +5920 +1FE0 +2920 +2FE0 +C500 +4200 +4580 +5860 +ENDCHAR +STARTCHAR U_6D6E +ENCODING 28014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +8A20 +5540 +17E0 +2080 +2100 +DFE0 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6D6F +ENCODING 28015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FC0 +5240 +1240 +2FE0 +2000 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D70 +ENCODING 28016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +2C20 +84A0 +5FA0 +14A0 +26A0 +2DA0 +D4A0 +6420 +4420 +44E0 +ENDCHAR +STARTCHAR U_6D71 +ENCODING 28017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5000 +17C0 +9000 +5FE0 +3520 +5540 +D480 +5480 +6660 +4400 +ENDCHAR +STARTCHAR U_6D72 +ENCODING 28018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4FC0 +1880 +8700 +5AE0 +2F80 +4200 +CFC0 +4200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_6D73 +ENCODING 28019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22E0 +0F00 +90A0 +6FE0 +2840 +4FC0 +C840 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6D74 +ENCODING 28020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +8920 +5280 +1440 +2820 +37C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D75 +ENCODING 28021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +2940 +8D80 +4B20 +2940 +3F80 +2920 +C920 +4940 +5180 +6300 +ENDCHAR +STARTCHAR U_6D76 +ENCODING 28022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5500 +17C0 +2900 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D77 +ENCODING 28023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +57C0 +1540 +2FE0 +2940 +C940 +4FE0 +4040 +4180 +ENDCHAR +STARTCHAR U_6D78 +ENCODING 28024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +87C0 +5040 +1FE0 +2820 +27C0 +C280 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D79 +ENCODING 28025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4100 +0540 +2540 +2BA0 +C280 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D7A +ENCODING 28026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +8C80 +5BE0 +1AA0 +2AA0 +2BE0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_6D7B +ENCODING 28027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8AA0 +5C60 +1820 +2BA0 +2AA0 +CAA0 +4BA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6D7C +ENCODING 28028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8880 +5FC0 +0A40 +2A40 +2FC0 +C300 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6D7D +ENCODING 28029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +8920 +54A0 +1140 +2100 +2FE0 +C440 +4280 +4140 +4E20 +ENDCHAR +STARTCHAR U_6D7E +ENCODING 28030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +87C0 +5100 +1FE0 +2280 +2AC0 +CAA0 +52A0 +4480 +4980 +ENDCHAR +STARTCHAR U_6D7F +ENCODING 28031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +1440 +27C0 +2440 +C7C0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D80 +ENCODING 28032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5840 +1FC0 +2840 +2FC0 +C280 +42A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6D81 +ENCODING 28033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +9E80 +4540 +2C40 +2E80 +5520 +E420 +4440 +4480 +4500 +ENDCHAR +STARTCHAR U_6D82 +ENCODING 28034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5BA0 +1100 +2FE0 +2100 +C580 +4940 +5120 +4300 +ENDCHAR +STARTCHAR U_6D83 +ENCODING 28035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +5FE0 +1920 +2BA0 +2D60 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D84 +ENCODING 28036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8540 +57C0 +1540 +2FE0 +2200 +C7C0 +4040 +4240 +4180 +ENDCHAR +STARTCHAR U_6D85 +ENCODING 28037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D86 +ENCODING 28038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2E40 +8A40 +5A40 +1FE0 +2A40 +2A40 +CA40 +4E40 +4A40 +4040 +ENDCHAR +STARTCHAR U_6D87 +ENCODING 28039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8540 +5A80 +1540 +2540 +2FE0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D88 +ENCODING 28040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8100 +57E0 +1420 +27E0 +2420 +C7E0 +4420 +4420 +4460 +ENDCHAR +STARTCHAR U_6D89 +ENCODING 28041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +85E0 +5500 +1FE0 +2100 +2520 +C940 +5080 +4100 +4E00 +ENDCHAR +STARTCHAR U_6D8A +ENCODING 28042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +8520 +5520 +1B20 +24C0 +2100 +CAC0 +4A20 +5260 +43C0 +ENDCHAR +STARTCHAR U_6D8B +ENCODING 28043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5180 +1140 +2FE0 +2100 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D8C +ENCODING 28044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0100 +8FE0 +4920 +1FE0 +2920 +CFE0 +4920 +4920 +4860 +ENDCHAR +STARTCHAR U_6D8D +ENCODING 28045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FA0 +8140 +5FE0 +1100 +2FE0 +2480 +CFE0 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6D8E +ENCODING 28046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +25C0 +8440 +4960 +1D40 +2540 +2540 +D5E0 +4800 +5600 +61E0 +ENDCHAR +STARTCHAR U_6D8F +ENCODING 28047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +5D80 +0480 +8880 +5FE0 +2480 +4480 +DBE0 +4C00 +4A00 +51E0 +ENDCHAR +STARTCHAR U_6D90 +ENCODING 28048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2CC0 +84A0 +5FE0 +1480 +26A0 +2CA0 +D4A0 +4440 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6D91 +ENCODING 28049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1920 +2FE0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6D92 +ENCODING 28050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +8FE0 +5240 +1FC0 +2200 +27C0 +CC40 +5440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D93 +ENCODING 28051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5000 +1FE0 +2820 +2FE0 +C820 +4FE0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6D94 +ENCODING 28052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +8FE0 +5100 +1280 +2540 +28A0 +CFC0 +4040 +4080 +4100 +ENDCHAR +STARTCHAR U_6D95 +ENCODING 28053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FC0 +5140 +1FC0 +2900 +2FE0 +C320 +4520 +4940 +5100 +ENDCHAR +STARTCHAR U_6D96 +ENCODING 28054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +4880 +17E0 +B000 +5440 +3240 +5240 +D280 +5080 +5FE0 +5000 +ENDCHAR +STARTCHAR U_6D97 +ENCODING 28055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8840 +57E0 +1440 +2440 +27C0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6D98 +ENCODING 28056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +8FA0 +5400 +17E0 +2900 +2FE0 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D99 +ENCODING 28057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8840 +5FC0 +2900 +2FE0 +4900 +C900 +5280 +5460 +6840 +ENDCHAR +STARTCHAR U_6D9A +ENCODING 28058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +8FC0 +5840 +2840 +2FC0 +4500 +C520 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6D9B +ENCODING 28059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +8200 +5FC0 +1200 +2FE0 +2440 +C7E0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_6D9C +ENCODING 28060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +47C0 +2000 +3FE0 +5020 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D9D +ENCODING 28061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8280 +5FE0 +1820 +2200 +2FC0 +C240 +4240 +4540 +5880 +ENDCHAR +STARTCHAR U_6D9E +ENCODING 28062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8920 +5540 +1380 +2FE0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6D9F +ENCODING 28063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2BE0 +8900 +5280 +17E0 +3880 +2BE0 +C880 +4880 +5400 +63E0 +ENDCHAR +STARTCHAR U_6DA0 +ENCODING 28064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FA0 +2920 +2FE0 +C960 +49A0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6DA1 +ENCODING 28065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1100 +2FE0 +2920 +CAA0 +4C60 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA2 +ENCODING 28066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5000 +2FC0 +2840 +4940 +C940 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6DA3 +ENCODING 28067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8480 +57C0 +1D40 +2540 +2540 +DFE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6DA4 +ENCODING 28068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +8A40 +5180 +1E60 +2100 +2FE0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DA5 +ENCODING 28069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +87C0 +5440 +27C0 +2000 +CFC0 +4080 +4100 +4300 +ENDCHAR +STARTCHAR U_6DA6 +ENCODING 28070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2220 +8820 +5BA0 +1920 +2BA0 +2920 +C920 +4FE0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA7 +ENCODING 28071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2220 +8820 +5BA0 +1AA0 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA8 +ENCODING 28072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2520 +8540 +5D80 +1100 +33E0 +5D80 +C540 +4540 +45A0 +5920 +ENDCHAR +STARTCHAR U_6DA9 +ENCODING 28073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +8520 +5520 +12A0 +2C40 +2100 +C5C0 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6DAA +ENCODING 28074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5280 +1FE0 +2000 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DAB +ENCODING 28075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +57C0 +1440 +27C0 +2400 +C7E0 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6DAC +ENCODING 28076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8100 +5FE0 +1440 +2280 +2FE0 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6DAD +ENCODING 28077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81C0 +5E40 +0A80 +9FE0 +5020 +2FC0 +4440 +C280 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6DAE +ENCODING 28078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +31A0 +9FA0 +54A0 +14A0 +3FA0 +34A0 +D4A0 +55A0 +5420 +64E0 +ENDCHAR +STARTCHAR U_6DAF +ENCODING 28079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8880 +5BE0 +1880 +2FE0 +2880 +CBE0 +4880 +5080 +6FE0 +ENDCHAR +STARTCHAR U_6DB0 +ENCODING 28080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +0AA0 +8440 +6AA0 +2000 +4EE0 +CAA0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6DB1 +ENCODING 28081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2400 +2780 +8400 +5780 +2400 +7FE0 +C520 +4540 +4480 +4660 +ENDCHAR +STARTCHAR U_6DB2 +ENCODING 28082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8280 +52E0 +1520 +2DA0 +3640 +C540 +4480 +4540 +4620 +ENDCHAR +STARTCHAR U_6DB3 +ENCODING 28083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5280 +1440 +2820 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6DB4 +ENCODING 28084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5400 +1EE0 +2AA0 +36A0 +C2C0 +44A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6DB5 +ENCODING 28085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2040 +8080 +5100 +1D60 +2BA0 +2B20 +CDA0 +4960 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_6DB6 +ENCODING 28086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +5FE0 +2A40 +3FE0 +4A40 +CA40 +5FE0 +4200 +4FC0 +ENDCHAR +STARTCHAR U_6DB7 +ENCODING 28087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +57C0 +1540 +27C0 +2540 +C7C0 +4100 +4780 +5960 +ENDCHAR +STARTCHAR U_6DB8 +ENCODING 28088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8920 +5FE0 +1920 +2BA0 +2AA0 +CBA0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6DB9 +ENCODING 28089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +1FE0 +8680 +5A60 +2200 +5FE0 +C480 +4900 +4700 +58C0 +ENDCHAR +STARTCHAR U_6DBA +ENCODING 28090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5880 +1FE0 +2880 +2BE0 +CA20 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6DBB +ENCODING 28091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5BA0 +1100 +2FE0 +2100 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DBC +ENCODING 28092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5000 +17C0 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DBD +ENCODING 28093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2F80 +8900 +5FE0 +1880 +2E60 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6DBE +ENCODING 28094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +2F40 +8380 +5540 +1920 +2300 +2FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6DBF +ENCODING 28095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8620 +5940 +1680 +24C0 +2BA0 +D2A0 +44A0 +5C80 +4300 +ENDCHAR +STARTCHAR U_6DC0 +ENCODING 28096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5000 +1FE0 +2100 +25E0 +C500 +4500 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6DC1 +ENCODING 28097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0880 +8500 +5FE0 +2200 +5FE0 +C480 +4D00 +4300 +5CC0 +ENDCHAR +STARTCHAR U_6DC2 +ENCODING 28098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +27E0 +C080 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_6DC3 +ENCODING 28099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +1FC0 +8200 +5FE0 +2480 +4FE0 +D480 +45A0 +4420 +43E0 +ENDCHAR +STARTCHAR U_6DC4 +ENCODING 28100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +8A80 +5A80 +1540 +2540 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6DC5 +ENCODING 28101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +8500 +5F00 +15E0 +2740 +2D40 +D540 +4540 +4540 +4640 +ENDCHAR +STARTCHAR U_6DC6 +ENCODING 28102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2100 +86C0 +5FE0 +1200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DC7 +ENCODING 28103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5780 +1480 +2780 +2480 +DFE0 +4480 +4860 +5020 +ENDCHAR +STARTCHAR U_6DC8 +ENCODING 28104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5880 +1AA0 +2AA0 +2BE0 +C880 +4AA0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_6DC9 +ENCODING 28105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FE0 +2100 +2FE0 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6DCA +ENCODING 28106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8440 +5880 +1200 +2CE0 +2820 +CEE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6DCB +ENCODING 28107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +9FE0 +4880 +2880 +3DC0 +2AA0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_6DCC +ENCODING 28108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8100 +5FE0 +1820 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DCD +ENCODING 28109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8BA0 +5920 +1FE0 +2820 +2BA0 +CAA0 +4BA0 +5020 +60E0 +ENDCHAR +STARTCHAR U_6DCE +ENCODING 28110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +9FC0 +6400 +3FE0 +4A80 +D7C0 +6220 +5FC0 +4200 +ENDCHAR +STARTCHAR U_6DCF +ENCODING 28111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +2FE0 +C100 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6DD0 +ENCODING 28112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +2FE0 +C820 +4FE0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6DD1 +ENCODING 28113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +07A0 +94A0 +5FA0 +24A0 +2EA0 +D5A0 +6540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6DD2 +ENCODING 28114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0140 +9FE0 +5140 +27C0 +2100 +DFE0 +4480 +4380 +4E60 +ENDCHAR +STARTCHAR U_6DD3 +ENCODING 28115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +9100 +5FE0 +2200 +23C0 +C240 +4240 +4540 +5880 +ENDCHAR +STARTCHAR U_6DD4 +ENCODING 28116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5440 +27C0 +2440 +C740 +45C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6DD5 +ENCODING 28117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +5480 +2440 +2920 +D100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6DD6 +ENCODING 28118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +0100 +97C0 +5440 +27C0 +2440 +C7C0 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6DD7 +ENCODING 28119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0A20 +8A60 +56A0 +22A0 +2FE0 +C320 +46A0 +4A60 +52C0 +ENDCHAR +STARTCHAR U_6DD8 +ENCODING 28120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0C20 +97A0 +5A20 +2FE0 +2220 +CAA0 +4FA0 +4020 +40C0 +ENDCHAR +STARTCHAR U_6DD9 +ENCODING 28121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +97C0 +5000 +2FE0 +2100 +C540 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DDA +ENCODING 28122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +5940 +2920 +2FE0 +C900 +4980 +5260 +6C20 +ENDCHAR +STARTCHAR U_6DDB +ENCODING 28123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +34A0 +1EA0 +94A0 +5FA0 +24A0 +3FA0 +D5A0 +5520 +5720 +4460 +ENDCHAR +STARTCHAR U_6DDC +ENCODING 28124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0AA0 +9EE0 +5AA0 +2AA0 +2EE0 +CAA0 +4AA0 +52A0 +6760 +ENDCHAR +STARTCHAR U_6DDD +ENCODING 28125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +32A0 +1EA0 +92A0 +53E0 +3E00 +3200 +D200 +5220 +5220 +6DE0 +ENDCHAR +STARTCHAR U_6DDE +ENCODING 28126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2940 +1D40 +8A20 +4AA0 +2C80 +3A80 +C940 +4920 +4FE0 +4A20 +ENDCHAR +STARTCHAR U_6DDF +ENCODING 28127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0FE0 +9AA0 +5FE0 +2AA0 +2AA0 +DFE0 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6DE0 +ENCODING 28128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +5FE0 +2000 +3FE0 +C240 +4240 +4440 +4840 +ENDCHAR +STARTCHAR U_6DE1 +ENCODING 28129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +0980 +8280 +5440 +2920 +2540 +C580 +4900 +4280 +5C60 +ENDCHAR +STARTCHAR U_6DE2 +ENCODING 28130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +9080 +5E80 +2AA0 +2EA0 +C0C0 +46A0 +5960 +4620 +ENDCHAR +STARTCHAR U_6DE3 +ENCODING 28131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CE0 +0820 +9EE0 +5820 +2FE0 +2280 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6DE4 +ENCODING 28132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2440 +1EA0 +8920 +5E00 +2A80 +2A60 +CA20 +4A80 +5260 +6620 +ENDCHAR +STARTCHAR U_6DE5 +ENCODING 28133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2880 +0F80 +9100 +5FE0 +2920 +2540 +C380 +4540 +5920 +4300 +ENDCHAR +STARTCHAR U_6DE6 +ENCODING 28134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5100 +2100 +2FE0 +C100 +4920 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6DE7 +ENCODING 28135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +8820 +5240 +2540 +5480 +D540 +4620 +4C40 +53C0 +ENDCHAR +STARTCHAR U_6DE8 +ENCODING 28136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F40 +0A40 +9480 +5FC0 +2240 +2FE0 +C240 +4FC0 +4200 +4600 +ENDCHAR +STARTCHAR U_6DE9 +ENCODING 28137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +5280 +2440 +2BE0 +C640 +4980 +4240 +4C20 +ENDCHAR +STARTCHAR U_6DEA +ENCODING 28138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5000 +2FE0 +2AA0 +CFE0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6DEB +ENCODING 28139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0920 +9540 +5060 +2F80 +2100 +DFE0 +4100 +4100 +4FC0 +ENDCHAR +STARTCHAR U_6DEC +ENCODING 28140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +9240 +55A0 +2900 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6DED +ENCODING 28141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9FE0 +5900 +2FE0 +2900 +CB80 +5540 +5920 +6100 +ENDCHAR +STARTCHAR U_6DEE +ENCODING 28142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2480 +07E0 +9C80 +57E0 +2480 +2480 +C7E0 +4480 +4480 +47E0 +ENDCHAR +STARTCHAR U_6DEF +ENCODING 28143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +97E0 +5000 +27C0 +2440 +C7C0 +4440 +47C0 +44C0 +ENDCHAR +STARTCHAR U_6DF0 +ENCODING 28144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0640 +9920 +57C0 +2040 +2280 +C500 +5540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_6DF1 +ENCODING 28145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0480 +8940 +4100 +2FE0 +2100 +C380 +4540 +5920 +4100 +ENDCHAR +STARTCHAR U_6DF2 +ENCODING 28146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +0FE0 +9920 +5FC0 +2920 +2BE0 +CA80 +4A80 +52A0 +6460 +ENDCHAR +STARTCHAR U_6DF3 +ENCODING 28147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +97C0 +5000 +2FC0 +2080 +C100 +5FE0 +4100 +4700 +ENDCHAR +STARTCHAR U_6DF4 +ENCODING 28148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0AA0 +92A0 +5520 +2A20 +20C0 +D540 +54A0 +6440 +43C0 +ENDCHAR +STARTCHAR U_6DF5 +ENCODING 28149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +2AA0 +0AA0 +9EE0 +5820 +2FE0 +2820 +CEE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6DF6 +ENCODING 28150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0540 +9540 +5540 +2BA0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6DF7 +ENCODING 28151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +5FC0 +2920 +2940 +CF80 +4920 +4B20 +4CE0 +ENDCHAR +STARTCHAR U_6DF8 +ENCODING 28152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +0200 +8FC0 +4200 +3FE0 +4A40 +CA40 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6DF9 +ENCODING 28153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0480 +8A40 +5FA0 +2A80 +2F80 +CA80 +4FA0 +4220 +41E0 +ENDCHAR +STARTCHAR U_6DFA +ENCODING 28154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9320 +5DE0 +2480 +23E0 +DE00 +42A0 +4320 +5CE0 +ENDCHAR +STARTCHAR U_6DFB +ENCODING 28155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +0200 +9FE0 +4880 +3260 +2200 +CB40 +4AA0 +52A0 +4600 +ENDCHAR +STARTCHAR U_6DFC +ENCODING 28156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04C0 +7500 +1600 +2580 +CC60 +10A0 +F7A0 +59C0 +56A0 +94A0 +31A0 +ENDCHAR +STARTCHAR U_6DFD +ENCODING 28157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +9480 +5100 +2500 +25C0 +C500 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6DFE +ENCODING 28158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F00 +2480 +DF60 +1500 +7FC0 +0400 +7CC0 +1700 +2480 +CC60 +ENDCHAR +STARTCHAR U_6DFF +ENCODING 28159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8440 +47C0 +1440 +27C0 +4100 +CFE0 +4920 +4960 +4100 +ENDCHAR +STARTCHAR U_6E00 +ENCODING 28160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0500 +8A80 +77E0 +2200 +4A80 +DFE0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6E01 +ENCODING 28161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5EC0 +0700 +8A80 +5640 +6200 +5EC0 +C700 +4A80 +5260 +4400 +ENDCHAR +STARTCHAR U_6E02 +ENCODING 28162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +0FC0 +9840 +6FC0 +2100 +5FE0 +C480 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E03 +ENCODING 28163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +9200 +5FE0 +2200 +27C0 +CC40 +5440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E04 +ENCODING 28164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +2EE0 +8280 +4EE0 +2280 +4280 +DEE0 +4280 +4280 +4280 +ENDCHAR +STARTCHAR U_6E05 +ENCODING 28165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5100 +2FE0 +2440 +C740 +45C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E06 +ENCODING 28166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9120 +4A20 +1FA0 +8AA0 +6AA0 +3FA0 +4AA0 +CAA0 +4A20 +4AA0 +5240 +ENDCHAR +STARTCHAR U_6E07 +ENCODING 28167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5840 +2FC0 +2400 +CFE0 +5020 +4E20 +4920 +4F40 +ENDCHAR +STARTCHAR U_6E08 +ENCODING 28168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0480 +8300 +54E0 +2C40 +47C0 +C440 +47C0 +4840 +5040 +ENDCHAR +STARTCHAR U_6E09 +ENCODING 28169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2BC0 +8A00 +5FE0 +2200 +2A40 +4A20 +D280 +4100 +4600 +5800 +ENDCHAR +STARTCHAR U_6E0A +ENCODING 28170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2D60 +0BA0 +9920 +5FE0 +2920 +2BA0 +CD60 +4920 +4920 +5120 +ENDCHAR +STARTCHAR U_6E0B +ENCODING 28171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +05C0 +8500 +5FE0 +2000 +4840 +C480 +4000 +4480 +5840 +ENDCHAR +STARTCHAR U_6E0C +ENCODING 28172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +07C0 +9040 +5FE0 +2920 +2540 +C380 +5D40 +4920 +4720 +ENDCHAR +STARTCHAR U_6E0D +ENCODING 28173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5100 +2FE0 +2440 +C540 +4540 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E0E +ENCODING 28174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +54A0 +2A80 +2480 +CFE0 +4180 +4240 +4C20 +ENDCHAR +STARTCHAR U_6E0F +ENCODING 28175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0500 +8880 +5FE0 +2040 +4F40 +C940 +4F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E10 +ENCODING 28176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +3FC0 +0900 +9500 +55E0 +3F40 +2540 +C740 +5D40 +4540 +4640 +ENDCHAR +STARTCHAR U_6E11 +ENCODING 28177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9100 +5FE0 +2920 +2FE0 +C920 +4FE0 +4120 +40E0 +ENDCHAR +STARTCHAR U_6E12 +ENCODING 28178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0940 +8FC0 +5940 +1FC0 +2400 +C900 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6E13 +ENCODING 28179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E40 +8A40 +6580 +2200 +2FC0 +4200 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E14 +ENCODING 28180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +0480 +8FE0 +5920 +2FE0 +2920 +CFE0 +4820 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E15 +ENCODING 28181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +2A20 +84A0 +4EA0 +04A0 +24A0 +4EA0 +C4A0 +4A20 +4920 +5060 +ENDCHAR +STARTCHAR U_6E16 +ENCODING 28182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9100 +5FE0 +2920 +2FE0 +C920 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6E17 +ENCODING 28183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +07C0 +9120 +5FE0 +2940 +36A0 +C100 +4E40 +4180 +4E00 +ENDCHAR +STARTCHAR U_6E18 +ENCODING 28184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4500 +0200 +9FE0 +4640 +3A00 +4200 +DFE0 +4700 +5AE0 +4200 +ENDCHAR +STARTCHAR U_6E19 +ENCODING 28185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0880 +9FE0 +5AA0 +2C60 +2920 +DFE0 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6E1A +ENCODING 28186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +0240 +9FE0 +5200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E1B +ENCODING 28187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +9880 +5E80 +28A0 +2EA0 +CAC0 +4EA0 +5160 +6620 +ENDCHAR +STARTCHAR U_6E1C +ENCODING 28188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +9AA0 +5AA0 +2A60 +2100 +DFE0 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6E1D +ENCODING 28189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0B60 +9000 +5E20 +2AA0 +2EA0 +CAA0 +4EA0 +4A20 +4AE0 +ENDCHAR +STARTCHAR U_6E1E +ENCODING 28190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4500 +1FE0 +8200 +5FC0 +2840 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6E1F +ENCODING 28191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +97C0 +5000 +2FE0 +2820 +C7C0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6E20 +ENCODING 28192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8FC0 +5840 +AFC0 +4800 +4FE0 +4400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6E21 +ENCODING 28193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A80 +9FE0 +5A80 +2B80 +2800 +CFC0 +4A80 +5100 +6EE0 +ENDCHAR +STARTCHAR U_6E22 +ENCODING 28194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0F40 +9A40 +5FC0 +2AC0 +2FC0 +CA40 +4AC0 +5FA0 +6020 +ENDCHAR +STARTCHAR U_6E23 +ENCODING 28195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0540 +9920 +57C0 +2440 +27C0 +C440 +47C0 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E24 +ENCODING 28196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2E80 +05E0 +9FA0 +52A0 +3EA0 +24A0 +DFA0 +44A0 +4520 +4A60 +ENDCHAR +STARTCHAR U_6E25 +ENCODING 28197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8800 +5FE0 +2A40 +2FA0 +C900 +4FC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6E26 +ENCODING 28198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0740 +9540 +5FE0 +2820 +2BA0 +CAA0 +4BA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6E27 +ENCODING 28199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +9280 +5FE0 +2920 +27C0 +C540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6E28 +ENCODING 28200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +8940 +5FC0 +2000 +3FE0 +C920 +4940 +4A80 +4C60 +ENDCHAR +STARTCHAR U_6E29 +ENCODING 28201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E2A +ENCODING 28202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +0FC0 +8A40 +6FC0 +2200 +5FE0 +D220 +52A0 +5FA0 +5060 +ENDCHAR +STARTCHAR U_6E2B +ENCODING 28203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0540 +95C0 +5400 +27E0 +2100 +DFE0 +4580 +4960 +5120 +ENDCHAR +STARTCHAR U_6E2C +ENCODING 28204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +2AA0 +0AA0 +8EA0 +5AA0 +2EA0 +2AA0 +CAA0 +4E20 +4A20 +5160 +ENDCHAR +STARTCHAR U_6E2D +ENCODING 28205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +9920 +5FE0 +2440 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E2E +ENCODING 28206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +9FE0 +5040 +2F40 +2940 +CF40 +4940 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E2F +ENCODING 28207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +9FE0 +5480 +27C0 +2CA0 +D780 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6E30 +ENCODING 28208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0FC0 +9020 +5FC0 +2840 +2FC0 +C480 +5FE0 +4480 +4880 +ENDCHAR +STARTCHAR U_6E31 +ENCODING 28209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +1F40 +9540 +5540 +3F40 +3540 +C440 +4540 +7F40 +41E0 +ENDCHAR +STARTCHAR U_6E32 +ENCODING 28210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +97E0 +5000 +27C0 +2640 +C540 +47C0 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E33 +ENCODING 28211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2540 +0540 +9DC0 +5140 +31C0 +3D40 +C560 +47C0 +5440 +4840 +ENDCHAR +STARTCHAR U_6E34 +ENCODING 28212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2400 +2FE0 +D920 +4AA0 +4FA0 +4040 +ENDCHAR +STARTCHAR U_6E35 +ENCODING 28213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0FE0 +9480 +5FE0 +2920 +2920 +CFE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6E36 +ENCODING 28214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9100 +57C0 +2540 +2540 +CFE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6E37 +ENCODING 28215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0080 +8840 +5FE0 +2840 +4FC0 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_6E38 +ENCODING 28216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24E0 +1F00 +88E0 +5E20 +2A40 +2BE0 +CA40 +4A40 +5240 +66C0 +ENDCHAR +STARTCHAR U_6E39 +ENCODING 28217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +1220 +8FE0 +5020 +27A0 +2020 +CFA0 +48A0 +4FA0 +40C0 +ENDCHAR +STARTCHAR U_6E3A +ENCODING 28218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +3480 +15C0 +9EA0 +56A0 +3480 +3CA0 +D420 +5440 +5C80 +4300 +ENDCHAR +STARTCHAR U_6E3B +ENCODING 28219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2520 +0960 +9080 +47E0 +2420 +3FE0 +C420 +47E0 +4420 +47E0 +ENDCHAR +STARTCHAR U_6E3C +ENCODING 28220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +1FE0 +9100 +47C0 +2100 +2FE0 +C100 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E3D +ENCODING 28221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2EC0 +04A0 +9FE0 +4080 +2EA0 +2AA0 +CAC0 +4EA0 +4960 +4220 +ENDCHAR +STARTCHAR U_6E3E +ENCODING 28222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0100 +9FE0 +5540 +27C0 +2540 +C7C0 +4100 +5FE0 +4100 +ENDCHAR +STARTCHAR U_6E3F +ENCODING 28223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0380 +8540 +4920 +27C0 +2000 +DFE0 +4100 +4940 +5320 +ENDCHAR +STARTCHAR U_6E40 +ENCODING 28224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2AA0 +0A40 +8440 +4BA0 +3100 +2100 +CFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E41 +ENCODING 28225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2940 +1E20 +8A20 +49C0 +2C00 +3BE0 +CA20 +4A20 +4BE0 +5A20 +ENDCHAR +STARTCHAR U_6E42 +ENCODING 28226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8000 +57C0 +2000 +4FE0 +C200 +43C0 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E43 +ENCODING 28227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3DE0 +0440 +9FE0 +4440 +25E0 +3E40 +C5E0 +4440 +4840 +5040 +ENDCHAR +STARTCHAR U_6E44 +ENCODING 28228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8800 +4BE0 +2A20 +2BE0 +CA20 +4BE0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6E45 +ENCODING 28229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +1100 +9FE0 +4D60 +2BA0 +2FE0 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6E46 +ENCODING 28230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8280 +4FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E47 +ENCODING 28231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4000 +27C0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E48 +ENCODING 28232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8780 +5480 +2780 +4200 +DFE0 +4680 +5A60 +4200 +ENDCHAR +STARTCHAR U_6E49 +ENCODING 28233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2580 +1480 +97E0 +5480 +2480 +25E0 +C520 +4520 +45E0 +4520 +ENDCHAR +STARTCHAR U_6E4A +ENCODING 28234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +07E0 +8100 +4FE0 +2440 +3BA0 +C100 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E4B +ENCODING 28235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0240 +8FE0 +4440 +27C0 +2100 +CFE0 +4500 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6E4C +ENCODING 28236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +0A80 +9FE0 +6880 +2F80 +4880 +CF80 +4A80 +4900 +4CC0 +ENDCHAR +STARTCHAR U_6E4D +ENCODING 28237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +8000 +4FE0 +2100 +2FE0 +CAA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6E4E +ENCODING 28238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0200 +9FE0 +5AA0 +2BA0 +2AA0 +CBA0 +4AA0 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6E4F +ENCODING 28239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4200 +0FC0 +9840 +6FC0 +2840 +4FC0 +C840 +4FC0 +4480 +5860 +ENDCHAR +STARTCHAR U_6E50 +ENCODING 28240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4880 +1FE0 +8920 +6D20 +3BE0 +5920 +E920 +4920 +49E0 +4920 +ENDCHAR +STARTCHAR U_6E51 +ENCODING 28241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +05C0 +8500 +5FE0 +2440 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E52 +ENCODING 28242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8000 +5FE0 +2440 +27C0 +C440 +47C0 +4460 +4FC0 +ENDCHAR +STARTCHAR U_6E53 +ENCODING 28243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2840 +17E0 +8240 +4440 +2980 +3000 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E54 +ENCODING 28244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +1FE0 +8000 +4EA0 +2AA0 +2EA0 +CAA0 +4EA0 +4A20 +4AE0 +ENDCHAR +STARTCHAR U_6E55 +ENCODING 28245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +24A0 +0BE0 +9CA0 +47E0 +2480 +27E0 +D480 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_6E56 +ENCODING 28246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +24A0 +1FA0 +94E0 +54A0 +2EA0 +2AE0 +CAA0 +4EA0 +4120 +4260 +ENDCHAR +STARTCHAR U_6E57 +ENCODING 28247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4840 +1C40 +89E0 +7E40 +4940 +5EC0 +C840 +4E40 +7840 +40C0 +ENDCHAR +STARTCHAR U_6E58 +ENCODING 28248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2520 +0520 +9FE0 +4520 +2720 +2DE0 +D520 +4520 +45E0 +4520 +ENDCHAR +STARTCHAR U_6E59 +ENCODING 28249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0500 +9540 +6520 +2B00 +4200 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E5A +ENCODING 28250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3F40 +1540 +9EC0 +5040 +3740 +3540 +D740 +5540 +5740 +6560 +ENDCHAR +STARTCHAR U_6E5B +ENCODING 28251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +97C0 +5440 +27C0 +2440 +DFE0 +4A80 +4C40 +4FE0 +ENDCHAR +STARTCHAR U_6E5C +ENCODING 28252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8440 +47C0 +2000 +2FE0 +C500 +45E0 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6E5D +ENCODING 28253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +2EC0 +0880 +9AA0 +5CE0 +2100 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E5E +ENCODING 28254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +07C0 +9440 +57C0 +2440 +27C0 +C440 +47C0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E5F +ENCODING 28255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0440 +97C0 +5440 +2FE0 +2100 +C100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E60 +ENCODING 28256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +0FE0 +8200 +5FE0 +2480 +26A0 +CAC0 +4C80 +5140 +6620 +ENDCHAR +STARTCHAR U_6E61 +ENCODING 28257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +9540 +57C0 +2100 +2FE0 +C920 +4960 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6E62 +ENCODING 28258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +9440 +57C0 +2000 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6E63 +ENCODING 28259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8900 +5FE0 +2880 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E64 +ENCODING 28260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +1FE0 +8880 +5EE0 +2BA0 +2AA0 +CAE0 +4A80 +5220 +4DE0 +ENDCHAR +STARTCHAR U_6E65 +ENCODING 28261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0AA0 +8440 +49A0 +2140 +2FE0 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6E66 +ENCODING 28262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +4FC0 +2500 +2FE0 +D100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E67 +ENCODING 28263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +8920 +5FE0 +2920 +2FE0 +C200 +5FE0 +4420 +58C0 +ENDCHAR +STARTCHAR U_6E68 +ENCODING 28264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +17C0 +9440 +47C0 +2440 +27C0 +C140 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E69 +ENCODING 28265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2100 +0FE0 +8920 +4FE0 +2920 +2FE0 +C100 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E6A +ENCODING 28266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +47C0 +0480 +9FE0 +4400 +3AC0 +4500 +DB80 +4540 +5920 +4200 +ENDCHAR +STARTCHAR U_6E6B +ENCODING 28267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3880 +0AA0 +9EC0 +4A80 +2C80 +3A80 +C880 +4880 +4940 +4A20 +ENDCHAR +STARTCHAR U_6E6C +ENCODING 28268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2540 +FB80 +7280 +AC60 +2400 +7580 +1600 +2580 +C460 +0C00 +ENDCHAR +STARTCHAR U_6E6D +ENCODING 28269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +5280 +1FE0 +2AA0 +4AA0 +CC60 +4FA0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6E6E +ENCODING 28270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +9AA0 +4AA0 +2FE0 +2100 +C7C0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E6F +ENCODING 28271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +5FE0 +2400 +27E0 +CAA0 +52A0 +4520 +4AC0 +ENDCHAR +STARTCHAR U_6E70 +ENCODING 28272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5880 +0700 +98E0 +4780 +2A00 +4FC0 +D200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6E71 +ENCODING 28273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4100 +2FE0 +2200 +DFE0 +4A20 +5220 +43E0 +ENDCHAR +STARTCHAR U_6E72 +ENCODING 28274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2A20 +0540 +97E0 +5100 +2FE0 +2400 +C7E0 +4A40 +5180 +6660 +ENDCHAR +STARTCHAR U_6E73 +ENCODING 28275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4AA0 +2920 +2FE0 +C920 +4FE0 +4920 +4860 +ENDCHAR +STARTCHAR U_6E74 +ENCODING 28276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +07E0 +9280 +5280 +2AA0 +2AA0 +C6C0 +4280 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6E75 +ENCODING 28277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4FC0 +0200 +8FC0 +4200 +3FE0 +4400 +C780 +4900 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E76 +ENCODING 28278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4F80 +0880 +9F80 +6880 +2F80 +4240 +DB80 +4A80 +7260 +4600 +ENDCHAR +STARTCHAR U_6E77 +ENCODING 28279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +3FE0 +2C40 +D7E0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E78 +ENCODING 28280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0440 +87C0 +4000 +2FE0 +2820 +C380 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6E79 +ENCODING 28281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BE0 +8AA0 +4BE0 +2AA0 +2BE0 +C880 +4BE0 +5080 +67E0 +ENDCHAR +STARTCHAR U_6E7A +ENCODING 28282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4BC0 +1240 +93C0 +7100 +37E0 +5380 +D540 +5540 +5920 +5100 +ENDCHAR +STARTCHAR U_6E7B +ENCODING 28283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4200 +1FE0 +8480 +5780 +2000 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6E7C +ENCODING 28284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CC0 +8840 +4CC0 +0840 +2FC0 +4000 +CFC0 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6E7D +ENCODING 28285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8540 +4A80 +1FE0 +AA80 +4540 +5FC0 +5240 +DFC0 +5240 +5FC0 +5040 +ENDCHAR +STARTCHAR U_6E7E +ENCODING 28286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +06C0 +8AA0 +47C0 +2040 +27C0 +C400 +47E0 +4020 +40C0 +ENDCHAR +STARTCHAR U_6E7F +ENCODING 28287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2440 +2280 +CAA0 +46C0 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6E80 +ENCODING 28288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +BFE0 +6200 +3FE0 +5220 +DAA0 +5FA0 +50A0 +5040 +ENDCHAR +STARTCHAR U_6E81 +ENCODING 28289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +9FE0 +5220 +2FC0 +4200 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6E82 +ENCODING 28290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8820 +7E20 +08A0 +BEA0 +6AA0 +3EA0 +48A0 +DCA0 +6A20 +48A0 +4840 +ENDCHAR +STARTCHAR U_6E83 +ENCODING 28291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0540 +9FE0 +4000 +27C0 +2440 +C540 +4540 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E84 +ENCODING 28292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +5FC0 +0400 +8FC0 +5880 +2700 +5AE0 +CF80 +4200 +5FC0 +4200 +ENDCHAR +STARTCHAR U_6E85 +ENCODING 28293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEC0 +62A0 +2BE0 +AA80 +6BE0 +2A80 +6A80 +EAA0 +4C40 +52A0 +6120 +ENDCHAR +STARTCHAR U_6E86 +ENCODING 28294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +29E0 +10A0 +8FA0 +44A0 +3FA0 +24A0 +CEA0 +5540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6E87 +ENCODING 28295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +1FE0 +8680 +5A60 +2200 +5FE0 +C480 +4900 +4700 +58C0 +ENDCHAR +STARTCHAR U_6E88 +ENCODING 28296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +2600 +1F80 +8480 +47C0 +2440 +2FE0 +D020 +6560 +4AA0 +4AC0 +ENDCHAR +STARTCHAR U_6E89 +ENCODING 28297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +1C80 +9680 +57E0 +3C80 +30A0 +D5A0 +5AA0 +52A0 +4460 +ENDCHAR +STARTCHAR U_6E8A +ENCODING 28298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +3DC0 +1440 +9DC0 +5000 +3DC0 +5140 +DD40 +5080 +5140 +5620 +ENDCHAR +STARTCHAR U_6E8B +ENCODING 28299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +4480 +07C0 +8D40 +4B40 +3540 +4080 +DFC0 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_6E8C +ENCODING 28300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +5D40 +1480 +8860 +5F80 +2500 +5FC0 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_6E8D +ENCODING 28301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0AA0 +86C0 +4FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E8E +ENCODING 28302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +29E0 +1E80 +8880 +4DE0 +3A00 +2880 +CBE0 +4880 +4880 +4BE0 +ENDCHAR +STARTCHAR U_6E8F +ENCODING 28303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +5940 +2FC0 +2900 +CFC0 +5440 +57C0 +6440 +ENDCHAR +STARTCHAR U_6E90 +ENCODING 28304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2880 +8BE0 +4A20 +1BE0 +2A20 +2BE0 +C880 +4AC0 +54A0 +69A0 +ENDCHAR +STARTCHAR U_6E91 +ENCODING 28305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2680 +8FC0 +4840 +1FC0 +2840 +2FC0 +C840 +4FC0 +4840 +5020 +ENDCHAR +STARTCHAR U_6E92 +ENCODING 28306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +8FE0 +4000 +27C0 +2440 +C7C0 +4CA0 +5540 +4620 +ENDCHAR +STARTCHAR U_6E93 +ENCODING 28307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +1FE0 +8540 +5FE0 +2540 +3FC0 +C500 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_6E94 +ENCODING 28308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +9100 +57C0 +2100 +2FE0 +C000 +4540 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_6E95 +ENCODING 28309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +0FC0 +8000 +5FE0 +2600 +4B60 +C580 +5B40 +4560 +5B00 +ENDCHAR +STARTCHAR U_6E96 +ENCODING 28310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +4FE0 +9900 +4FC0 +4900 +CFC0 +4900 +4FE0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6E97 +ENCODING 28311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +8AA0 +5AC0 +2AA0 +3AE0 +C700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_6E98 +ENCODING 28312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +8FE0 +4100 +2240 +27A0 +C000 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E99 +ENCODING 28313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +2FE0 +2D40 +D360 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6E9A +ENCODING 28314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FC0 +0A80 +8500 +4880 +3760 +4000 +CF80 +4880 +4F80 +4880 +ENDCHAR +STARTCHAR U_6E9B +ENCODING 28315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +5FA0 +2A40 +2A40 +CA40 +4A40 +4AA0 +53A0 +ENDCHAR +STARTCHAR U_6E9C +ENCODING 28316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +08A0 +9AA0 +5F20 +2140 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6E9D +ENCODING 28317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0280 +8FE0 +4280 +3FE0 +2940 +CFC0 +4940 +5FE0 +48C0 +ENDCHAR +STARTCHAR U_6E9E +ENCODING 28318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +0280 +8180 +4E60 +2100 +2FE0 +C920 +4FE0 +4140 +5FA0 +ENDCHAR +STARTCHAR U_6E9F +ENCODING 28319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +07C0 +8440 +47C0 +2440 +27C0 +C100 +5FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6EA0 +ENCODING 28320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +47E0 +2100 +2FE0 +C400 +4FC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6EA1 +ENCODING 28321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3DE0 +1480 +97E0 +5400 +3C40 +37E0 +D540 +5CC0 +4040 +41C0 +ENDCHAR +STARTCHAR U_6EA2 +ENCODING 28322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8280 +4440 +2820 +3FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EA3 +ENCODING 28323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6280 +2440 +ABA0 +6000 +2FE0 +6AA0 +AFE0 +AAA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_6EA4 +ENCODING 28324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +0FC0 +8900 +4FC0 +2900 +2FE0 +C020 +4AA0 +5560 +5560 +ENDCHAR +STARTCHAR U_6EA5 +ENCODING 28325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +3FE0 +0920 +8FE0 +4920 +2FE0 +2920 +C140 +5FE0 +4440 +42C0 +ENDCHAR +STARTCHAR U_6EA6 +ENCODING 28326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3540 +1F60 +80A0 +4FA0 +20A0 +2EA0 +CAA0 +4A40 +4BA0 +5120 +ENDCHAR +STARTCHAR U_6EA7 +ENCODING 28327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +8AA0 +4FE0 +2100 +2FE0 +C100 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_6EA8 +ENCODING 28328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5D20 +0900 +BFE0 +4900 +3F60 +4940 +DC80 +6AA0 +4960 +4E20 +ENDCHAR +STARTCHAR U_6EA9 +ENCODING 28329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0840 +9FC0 +6800 +2FE0 +4800 +CFE0 +4020 +5AA0 +6560 +ENDCHAR +STARTCHAR U_6EAA +ENCODING 28330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +04C0 +8240 +4780 +2240 +2FA0 +C100 +5FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6EAB +ENCODING 28331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +06C0 +8440 +47C0 +2000 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EAC +ENCODING 28332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0200 +8FC0 +6200 +3FE0 +4680 +C740 +4BC0 +4A20 +51E0 +ENDCHAR +STARTCHAR U_6EAD +ENCODING 28333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5240 +1FC0 +9240 +5FC0 +2880 +5440 +CFA0 +5500 +4200 +5DC0 +ENDCHAR +STARTCHAR U_6EAE +ENCODING 28334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2880 +1C80 +97E0 +5EA0 +32A0 +3EA0 +D6A0 +56E0 +5C80 +5080 +ENDCHAR +STARTCHAR U_6EAF +ENCODING 28335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +24A0 +1FA0 +84E0 +55A0 +15A0 +5FE0 +C4A0 +44A0 +4920 +5260 +ENDCHAR +STARTCHAR U_6EB0 +ENCODING 28336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +8000 +5FE0 +2000 +2FC0 +C840 +4FC0 +4480 +5FE0 +ENDCHAR +STARTCHAR U_6EB1 +ENCODING 28337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +2FE0 +2940 +DFE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6EB2 +ENCODING 28338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DE0 +2920 +0FE0 +8920 +5FE0 +2100 +2FE0 +C440 +4280 +4100 +4EE0 +ENDCHAR +STARTCHAR U_6EB3 +ENCODING 28339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0FC0 +9840 +5FC0 +2840 +2FC0 +C840 +4FC0 +4480 +5860 +ENDCHAR +STARTCHAR U_6EB4 +ENCODING 28340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0440 +8740 +55C0 +2440 +27C0 +C140 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6EB5 +ENCODING 28341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DC0 +5140 +1D40 +9540 +5E20 +35C0 +5D40 +D280 +5C80 +6540 +4E20 +ENDCHAR +STARTCHAR U_6EB6 +ENCODING 28342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0AA0 +9540 +5AA0 +2440 +2820 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6EB7 +ENCODING 28343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8A20 +5EA0 +2920 +2BA0 +CD60 +4920 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_6EB8 +ENCODING 28344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +0200 +8F80 +4200 +3FE0 +2B00 +C480 +5FC0 +5280 +5640 +ENDCHAR +STARTCHAR U_6EB9 +ENCODING 28345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4920 +2780 +2240 +CFA0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6EBA +ENCODING 28346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2220 +1EE0 +9080 +5EE0 +3220 +2AA0 +C660 +5BA0 +4220 +4CC0 +ENDCHAR +STARTCHAR U_6EBB +ENCODING 28347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +3FE0 +CAA0 +4660 +5AA0 +46E0 +ENDCHAR +STARTCHAR U_6EBC +ENCODING 28348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2880 +1540 +9DC0 +4880 +3540 +3DE0 +C100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6EBD +ENCODING 28349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BC0 +8800 +4FE0 +2AA0 +2A40 +CFE0 +4840 +5240 +60C0 +ENDCHAR +STARTCHAR U_6EBE +ENCODING 28350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0A40 +8FC0 +5A40 +2FC0 +2140 +C3A0 +4540 +4920 +50E0 +ENDCHAR +STARTCHAR U_6EBF +ENCODING 28351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +7EA0 +2BC0 +AA80 +7FE0 +2A80 +6BE0 +AA80 +BE80 +A280 +8080 +ENDCHAR +STARTCHAR U_6EC0 +ENCODING 28352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0480 +8F00 +4240 +2FE0 +2920 +CFE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6EC1 +ENCODING 28353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +3540 +1620 +99E0 +5480 +35E0 +3480 +DDC0 +52A0 +54A0 +5180 +ENDCHAR +STARTCHAR U_6EC2 +ENCODING 28354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4820 +2100 +2FE0 +C200 +43C0 +4440 +5980 +ENDCHAR +STARTCHAR U_6EC3 +ENCODING 28355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3A40 +04A0 +8FC0 +4000 +3FE0 +2AA0 +C660 +5BA0 +4220 +4660 +ENDCHAR +STARTCHAR U_6EC4 +ENCODING 28356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2240 +0520 +9FC0 +5440 +27C0 +2440 +C7E0 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6EC5 +ENCODING 28357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +8880 +4FA0 +2AA0 +2FA0 +CA40 +5560 +68A0 +5120 +ENDCHAR +STARTCHAR U_6EC6 +ENCODING 28358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +07C0 +8000 +4FE0 +2AA0 +2920 +CFE0 +4920 +4920 +4860 +ENDCHAR +STARTCHAR U_6EC7 +ENCODING 28359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +87C0 +4440 +2740 +25C0 +C440 +5FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6EC8 +ENCODING 28360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +87C0 +4000 +2FE0 +2820 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6EC9 +ENCODING 28361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +4FC0 +2540 +3FE0 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6ECA +ENCODING 28362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +1000 +8FC0 +5240 +2AC0 +2740 +DFC0 +4640 +4B20 +52A0 +ENDCHAR +STARTCHAR U_6ECB +ENCODING 28363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +1FE0 +8440 +4880 +2AA0 +3DC0 +C440 +48A0 +52A0 +5DE0 +ENDCHAR +STARTCHAR U_6ECC +ENCODING 28364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1740 +9480 +5760 +3480 +37E0 +D480 +55C0 +52A0 +54A0 +ENDCHAR +STARTCHAR U_6ECD +ENCODING 28365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +0FE0 +9100 +5FE0 +2100 +2FE0 +C920 +4FE0 +4120 +4FE0 +ENDCHAR +STARTCHAR U_6ECE +ENCODING 28366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +4620 +FFE0 +8420 +7EC0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6ECF +ENCODING 28367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +2A20 +1180 +8240 +4420 +2B80 +2100 +CFE0 +4920 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6ED0 +ENCODING 28368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2FE0 +3340 +8DE0 +4840 +3140 +3FE0 +C380 +4540 +4920 +4100 +ENDCHAR +STARTCHAR U_6ED1 +ENCODING 28369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0740 +8540 +5FE0 +3460 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6ED2 +ENCODING 28370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2740 +0540 +8740 +4040 +2FE0 +2040 +C740 +4540 +4740 +40C0 +ENDCHAR +STARTCHAR U_6ED3 +ENCODING 28371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0920 +8FE0 +4280 +2100 +3FE0 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6ED4 +ENCODING 28372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +27A0 +0A20 +8540 +4260 +2C20 +2820 +CEE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6ED5 +ENCODING 28373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E200 +AFE0 +A540 +ED60 +A380 +A540 +A920 +B320 +ENDCHAR +STARTCHAR U_6ED6 +ENCODING 28374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +87C0 +5440 +2FE0 +2440 +C7C0 +4CA0 +7540 +4620 +ENDCHAR +STARTCHAR U_6ED7 +ENCODING 28375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +8020 +4F80 +2200 +3FC0 +C200 +5FE0 +4220 +41E0 +ENDCHAR +STARTCHAR U_6ED8 +ENCODING 28376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0440 +8BA0 +4100 +2FE0 +2000 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6ED9 +ENCODING 28377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2A80 +2BC0 +8E80 +4BC0 +2A80 +2BC0 +2A80 +EBC0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6EDA +ENCODING 28378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8920 +52A0 +2740 +2220 +C540 +5C80 +4540 +4620 +ENDCHAR +STARTCHAR U_6EDB +ENCODING 28379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +2220 +8920 +4540 +0FE0 +5100 +6FE0 +C100 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6EDC +ENCODING 28380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0840 +8FC0 +4840 +2FC0 +2200 +DFE0 +5240 +6FA0 +4200 +ENDCHAR +STARTCHAR U_6EDD +ENCODING 28381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +2500 +9FC0 +4A80 +2A80 +2F80 +EA80 +2F80 +2220 +21E0 +ENDCHAR +STARTCHAR U_6EDE +ENCODING 28382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +3FE0 +0540 +9000 +5FE0 +2920 +27C0 +C540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6EDF +ENCODING 28383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1E40 +8BE0 +5EA0 +2AA0 +2BE0 +DE00 +4A20 +4A20 +49E0 +ENDCHAR +STARTCHAR U_6EE0 +ENCODING 28384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2440 +07C0 +8440 +5FE0 +2040 +3FE0 +D2A0 +4C40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6EE1 +ENCODING 28385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +1280 +9FE0 +4280 +2FE0 +2AA0 +CAA0 +4D60 +4920 +4860 +ENDCHAR +STARTCHAR U_6EE2 +ENCODING 28386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0280 +9FE0 +5020 +2FC0 +2100 +C7C0 +4140 +4120 +5FE0 +ENDCHAR +STARTCHAR U_6EE3 +ENCODING 28387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +2FC0 +8800 +4FE0 +2B40 +4A80 +CA60 +57C0 +5440 +67C0 +ENDCHAR +STARTCHAR U_6EE4 +ENCODING 28388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8920 +4FC0 +2920 +29E0 +CB40 +4AA0 +5640 +69C0 +ENDCHAR +STARTCHAR U_6EE5 +ENCODING 28389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2A80 +0AE0 +8B40 +4A20 +2200 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EE6 +ENCODING 28390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0480 +8CC0 +54A0 +2100 +3FE0 +C300 +4580 +4960 +5120 +ENDCHAR +STARTCHAR U_6EE7 +ENCODING 28391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7E80 +14E0 +9540 +2340 +5540 +4880 +C880 +4880 +5540 +6620 +ENDCHAR +STARTCHAR U_6EE8 +ENCODING 28392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +08A0 +9700 +5400 +27E0 +2480 +C480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6EE9 +ENCODING 28393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +3D40 +05E0 +9740 +5540 +29E0 +2940 +CD40 +55E0 +6340 +41E0 +ENDCHAR +STARTCHAR U_6EEA +ENCODING 28394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BDE0 +4480 +1900 +8BE0 +7EA0 +2AA0 +4AA0 +CAA0 +4880 +6960 +5220 +ENDCHAR +STARTCHAR U_6EEB +ENCODING 28395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2720 +0AC0 +9B20 +4A00 +2BE0 +2B20 +CBE0 +4B20 +49E0 +4920 +ENDCHAR +STARTCHAR U_6EEC +ENCODING 28396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +4A40 +2FE0 +2D20 +CFE0 +4C00 +5420 +63E0 +ENDCHAR +STARTCHAR U_6EED +ENCODING 28397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +5FE0 +2540 +2FE0 +C540 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6EEE +ENCODING 28398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2220 +0FC0 +8A80 +4F20 +2AC0 +2B80 +D020 +5740 +5520 +69E0 +ENDCHAR +STARTCHAR U_6EEF +ENCODING 28399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +3FE0 +0540 +9760 +5800 +2FE0 +2920 +C7C0 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6EF0 +ENCODING 28400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +2500 +9FE0 +4880 +2F80 +2880 +CF80 +4500 +4520 +58E0 +ENDCHAR +STARTCHAR U_6EF1 +ENCODING 28401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8E60 +4040 +3FE0 +2AA0 +CA40 +4AA0 +5320 +61E0 +ENDCHAR +STARTCHAR U_6EF2 +ENCODING 28402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27A0 +1540 +8AA0 +4D60 +2280 +2D60 +C280 +4D60 +4080 +4700 +ENDCHAR +STARTCHAR U_6EF3 +ENCODING 28403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2440 +8280 +4FE0 +1AA0 +2C60 +EBA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6EF4 +ENCODING 28404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4920 +2FE0 +2920 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6EF5 +ENCODING 28405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1120 +8CC0 +5520 +2640 +3BC0 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6EF6 +ENCODING 28406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +04E0 +9FA0 +44A0 +3FA0 +28A0 +CEA0 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6EF7 +ENCODING 28407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +0100 +9FE0 +5820 +2D60 +2AA0 +CD60 +4AA0 +4D60 +4FE0 +ENDCHAR +STARTCHAR U_6EF8 +ENCODING 28408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +1EE0 +8140 +5E40 +21E0 +3E40 +C040 +5E40 +5240 +5E40 +ENDCHAR +STARTCHAR U_6EF9 +ENCODING 28409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8920 +4FC0 +2920 +2FE0 +CD40 +57E0 +6100 +4300 +ENDCHAR +STARTCHAR U_6EFA +ENCODING 28410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2DE0 +1640 +B540 +5480 +1360 +2000 +CA40 +5AA0 +68A0 +4780 +ENDCHAR +STARTCHAR U_6EFB +ENCODING 28411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +9280 +5FE0 +2A80 +2BE0 +CC80 +4BC0 +4880 +57E0 +ENDCHAR +STARTCHAR U_6EFC +ENCODING 28412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +8FC0 +54A0 +2000 +2780 +C480 +46A0 +49A0 +5060 +ENDCHAR +STARTCHAR U_6EFD +ENCODING 28413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +5940 +2FE0 +2D20 +CFE0 +5520 +57E0 +6520 +ENDCHAR +STARTCHAR U_6EFE +ENCODING 28414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8FE0 +5440 +27C0 +2220 +C540 +5C80 +4640 +4420 +ENDCHAR +STARTCHAR U_6EFF +ENCODING 28415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +87C0 +4100 +2FE0 +2920 +CDA0 +4B60 +4DA0 +4960 +ENDCHAR +STARTCHAR U_6F00 +ENCODING 28416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1260 +FDC0 +5540 +7C80 +4360 +BA40 +0B80 +1280 +E660 +ENDCHAR +STARTCHAR U_6F01 +ENCODING 28417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +0880 +9FE0 +4920 +2FE0 +2920 +C920 +4FE0 +5540 +64A0 +ENDCHAR +STARTCHAR U_6F02 +ENCODING 28418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2280 +0FE0 +8AA0 +4FE0 +2000 +27C0 +C000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F03 +ENCODING 28419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1420 +87E0 +44A0 +3FA0 +24A0 +CEA0 +5540 +64A0 +4D20 +ENDCHAR +STARTCHAR U_6F04 +ENCODING 28420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +2FE0 +8900 +4BC0 +0900 +2FE0 +C900 +4BC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6F05 +ENCODING 28421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2A80 +0540 +87C0 +4540 +27C0 +2540 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6F06 +ENCODING 28422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0380 +8560 +4B80 +2560 +2D40 +C380 +4540 +5920 +4300 +ENDCHAR +STARTCHAR U_6F07 +ENCODING 28423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +12E0 +8680 +4BE0 +3880 +2A80 +CAE0 +4A80 +4D80 +48E0 +ENDCHAR +STARTCHAR U_6F08 +ENCODING 28424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +27A0 +1540 +8A40 +57E0 +2800 +2FE0 +C100 +4580 +4960 +5320 +ENDCHAR +STARTCHAR U_6F09 +ENCODING 28425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A80 +8FE0 +4AA0 +2FE0 +2C80 +CEE0 +5480 +56A0 +6460 +ENDCHAR +STARTCHAR U_6F0A +ENCODING 28426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0540 +9FE0 +5540 +2FE0 +2920 +DFE0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_6F0B +ENCODING 28427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +55C0 +1740 +9880 +5540 +37E0 +5A80 +D3C0 +5480 +51C0 +57E0 +ENDCHAR +STARTCHAR U_6F0C +ENCODING 28428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +8880 +5FC0 +1240 +3FC0 +4200 +DFC0 +4F80 +4200 +7FE0 +ENDCHAR +STARTCHAR U_6F0D +ENCODING 28429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +31A0 +1160 +9FE0 +5520 +3D60 +31A0 +DD20 +51E0 +5260 +5FE0 +ENDCHAR +STARTCHAR U_6F0E +ENCODING 28430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +12A0 +8420 +4880 +3A80 +2AE0 +CA80 +4A80 +4D80 +48E0 +ENDCHAR +STARTCHAR U_6F0F +ENCODING 28431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +9800 +5FE0 +2900 +2FE0 +CDA0 +4B60 +5DA0 +4960 +ENDCHAR +STARTCHAR U_6F10 +ENCODING 28432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +FD40 +2340 +FAC0 +2420 +0400 +F6C0 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6F11 +ENCODING 28433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +5FE0 +1440 +9D40 +5540 +1DE0 +20C0 +D4C0 +5940 +5340 +4E60 +ENDCHAR +STARTCHAR U_6F12 +ENCODING 28434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +2A20 +0BE0 +9880 +53E0 +32A0 +3AA0 +CBE0 +4880 +68A0 +57E0 +ENDCHAR +STARTCHAR U_6F13 +ENCODING 28435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0AA0 +8920 +5AA0 +2FE0 +2100 +CFE0 +4AA0 +4FA0 +4860 +ENDCHAR +STARTCHAR U_6F14 +ENCODING 28436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9FE0 +5100 +27C0 +2540 +C7C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F15 +ENCODING 28437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0AA0 +8FE0 +5AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F16 +ENCODING 28438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5C80 +0AE0 +BF40 +4940 +1D40 +6480 +DE80 +4540 +5540 +4A20 +ENDCHAR +STARTCHAR U_6F17 +ENCODING 28439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FC0 +2A40 +8B40 +4D40 +2AC0 +2FC0 +C240 +5520 +5440 +47C0 +ENDCHAR +STARTCHAR U_6F18 +ENCODING 28440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0FE0 +8AA0 +4E60 +2BE0 +2A20 +CBE0 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6F19 +ENCODING 28441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0A40 +8FC0 +4A40 +2FC0 +2220 +DFE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_6F1A +ENCODING 28442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BC0 +8A40 +5BC0 +2800 +2EE0 +CAA0 +4EE0 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6F1B +ENCODING 28443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +1FC0 +0200 +BFE0 +4500 +2A80 +5A60 +E680 +4B80 +5240 +4400 +ENDCHAR +STARTCHAR U_6F1C +ENCODING 28444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +0880 +9DC0 +4AA0 +2880 +2100 +CFC0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F1D +ENCODING 28445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2220 +2AA0 +8660 +4AA0 +1100 +27E0 +E420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_6F1E +ENCODING 28446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FA0 +2A20 +0540 +8FC0 +5840 +2F40 +2BC0 +C840 +4FC0 +44A0 +58E0 +ENDCHAR +STARTCHAR U_6F1F +ENCODING 28447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0FE0 +9820 +47C0 +2440 +27C0 +C100 +47C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6F20 +ENCODING 28448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +8FC0 +4840 +2FC0 +2840 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6F21 +ENCODING 28449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0A40 +93C0 +5240 +2FE0 +2400 +CFE0 +52A0 +4520 +4AC0 +ENDCHAR +STARTCHAR U_6F22 +ENCODING 28450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +0FC0 +8A40 +5FC0 +2200 +2FC0 +C200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6F23 +ENCODING 28451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2880 +0BE0 +82A0 +5BE0 +2AA0 +2BE0 +C880 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_6F24 +ENCODING 28452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +0880 +9DC0 +6AA0 +2200 +3FE0 +C240 +4480 +4380 +5C60 +ENDCHAR +STARTCHAR U_6F25 +ENCODING 28453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1460 +8920 +47C0 +2100 +2FE0 +C100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F26 +ENCODING 28454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1120 +FEC0 +38C0 +D520 +7FE0 +4200 +7B60 +4A80 +B660 +ENDCHAR +STARTCHAR U_6F27 +ENCODING 28455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +04E0 +8F00 +5AE0 +2E20 +2A40 +CE80 +44A0 +5FA0 +44E0 +ENDCHAR +STARTCHAR U_6F28 +ENCODING 28456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +53C0 +1680 +8100 +5EE0 +4900 +4FC0 +4900 +CFC0 +5900 +67E0 +ENDCHAR +STARTCHAR U_6F29 +ENCODING 28457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +1FE0 +8A00 +4DE0 +3440 +3560 +D540 +5540 +56C0 +5460 +ENDCHAR +STARTCHAR U_6F2A +ENCODING 28458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +2BE0 +1940 +8A20 +4FE0 +2820 +2BA0 +DAA0 +6BA0 +4820 +5860 +ENDCHAR +STARTCHAR U_6F2B +ENCODING 28459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +5FE0 +2AA0 +2FE0 +C440 +4280 +4380 +4C60 +ENDCHAR +STARTCHAR U_6F2C +ENCODING 28460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +9FE0 +4100 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F2D +ENCODING 28461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8240 +4FE0 +2440 +2AA0 +DFE0 +4280 +4480 +4880 +ENDCHAR +STARTCHAR U_6F2E +ENCODING 28462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +4940 +2FC0 +2920 +CD40 +4B80 +5540 +6B20 +ENDCHAR +STARTCHAR U_6F2F +ENCODING 28463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +8940 +5FC0 +2200 +2F80 +C240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F30 +ENCODING 28464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +9000 +5EE0 +2AA0 +2EE0 +CAA0 +4EE0 +52A0 +6760 +ENDCHAR +STARTCHAR U_6F31 +ENCODING 28465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +0480 +9FE0 +5520 +3F40 +2440 +CE40 +5540 +64A0 +4520 +ENDCHAR +STARTCHAR U_6F32 +ENCODING 28466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +2A00 +0BC0 +9A00 +53C0 +3200 +3FE0 +CAA0 +4AC0 +6B40 +5220 +ENDCHAR +STARTCHAR U_6F33 +ENCODING 28467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +9FE0 +5440 +27C0 +2440 +C7C0 +4100 +5FE0 +4100 +ENDCHAR +STARTCHAR U_6F34 +ENCODING 28468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +5FC0 +0200 +9FE0 +6020 +2F80 +4000 +DFE0 +4A80 +5240 +4600 +ENDCHAR +STARTCHAR U_6F35 +ENCODING 28469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0AE0 +9FA0 +44A0 +3FA0 +24A0 +CEA0 +5540 +64A0 +4D20 +ENDCHAR +STARTCHAR U_6F36 +ENCODING 28470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +1540 +9FE0 +4920 +2FE0 +2100 +C240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6F37 +ENCODING 28471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +3FE0 +0AA0 +8AA0 +4EC0 +20A0 +3EA0 +C4A0 +5EE0 +4480 +4C80 +ENDCHAR +STARTCHAR U_6F38 +ENCODING 28472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3F00 +0500 +9FE0 +5540 +3F40 +3540 +DF40 +4540 +5F40 +4540 +ENDCHAR +STARTCHAR U_6F39 +ENCODING 28473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +05C0 +8500 +5FE0 +2400 +27C0 +C800 +4FE0 +4AA0 +5560 +ENDCHAR +STARTCHAR U_6F3A +ENCODING 28474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8BA0 +4540 +2BA0 +2540 +CBA0 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6F3B +ENCODING 28475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +0660 +9AA0 +4300 +2480 +3A60 +C500 +4640 +4080 +4700 +ENDCHAR +STARTCHAR U_6F3C +ENCODING 28476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2FE0 +0500 +8500 +4FE0 +2900 +3FE0 +C900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6F3D +ENCODING 28477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5040 +1FC0 +9540 +7380 +3D40 +5500 +D7C0 +5900 +6FE0 +4100 +ENDCHAR +STARTCHAR U_6F3E +ENCODING 28478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0100 +8FC0 +4100 +3FE0 +2220 +CF40 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6F3F +ENCODING 28479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5680 +7940 +17E0 +F240 +55C0 +8400 +76C0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6F40 +ENCODING 28480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8000 +40E0 +2F00 +2540 +C540 +4BA0 +5120 +4100 +ENDCHAR +STARTCHAR U_6F41 +ENCODING 28481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +7080 +4BE0 +3A20 +17E0 +FA20 +33E0 +5A20 +57E0 +9140 +3620 +ENDCHAR +STARTCHAR U_6F42 +ENCODING 28482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5240 +1FC0 +C880 +2500 +3FE0 +4500 +D540 +4D80 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6F43 +ENCODING 28483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +29E0 +1340 +8480 +4BE0 +3E40 +2BC0 +CA40 +4BC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_6F44 +ENCODING 28484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7E80 +0880 +BFE0 +6B40 +3F40 +5940 +DC80 +6A80 +4940 +4A20 +ENDCHAR +STARTCHAR U_6F45 +ENCODING 28485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5200 +2FE0 +8500 +6FE0 +1900 +6FC0 +C900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6F46 +ENCODING 28486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9FE0 +52A0 +2F00 +2240 +CFE0 +4500 +4940 +5320 +ENDCHAR +STARTCHAR U_6F47 +ENCODING 28487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +8FC0 +4140 +3FE0 +2140 +CFC0 +4920 +4BA0 +5560 +ENDCHAR +STARTCHAR U_6F48 +ENCODING 28488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +0AA0 +8FE0 +4200 +2D20 +4340 +CD80 +4340 +5D20 +4300 +ENDCHAR +STARTCHAR U_6F49 +ENCODING 28489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4940 +0FC0 +8840 +6FC0 +2840 +4FC0 +C920 +4DC0 +4920 +4CE0 +ENDCHAR +STARTCHAR U_6F4A +ENCODING 28490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4640 +0960 +9F40 +44E0 +1EA0 +24A0 +CE40 +5540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6F4B +ENCODING 28491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2A80 +11E0 +8EA0 +40A0 +29A0 +35A0 +CAA0 +4340 +5CA0 +4120 +ENDCHAR +STARTCHAR U_6F4C +ENCODING 28492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +9520 +6880 +2FC0 +4480 +4FC0 +C200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6F4D +ENCODING 28493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +29E0 +1740 +9D40 +49E0 +2B40 +2DE0 +C140 +4D40 +71E0 +4100 +ENDCHAR +STARTCHAR U_6F4E +ENCODING 28494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +2E80 +04E0 +9FA0 +5520 +3520 +3F20 +D5A0 +5540 +55A0 +5320 +ENDCHAR +STARTCHAR U_6F4F +ENCODING 28495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +84A0 +5980 +2FE0 +2AA0 +CFE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F50 +ENCODING 28496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2FE0 +0900 +9FC0 +4900 +2FC0 +2900 +CFE0 +4940 +52A0 +52A0 +ENDCHAR +STARTCHAR U_6F51 +ENCODING 28497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +34A0 +0840 +9DE0 +4540 +3D60 +3000 +DFE0 +4540 +5480 +4B60 +ENDCHAR +STARTCHAR U_6F52 +ENCODING 28498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2480 +0FE0 +9920 +4FE0 +2220 +2D40 +C280 +4DC0 +42A0 +4D80 +ENDCHAR +STARTCHAR U_6F53 +ENCODING 28499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0920 +8FE0 +4920 +2FE0 +2140 +CFE0 +4540 +5460 +63C0 +ENDCHAR +STARTCHAR U_6F54 +ENCODING 28500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +24A0 +1EA0 +84A0 +5F60 +2480 +2F00 +C240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F55 +ENCODING 28501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +5FE0 +3540 +9540 +5FE0 +3540 +3540 +DFE0 +4D40 +52A0 +52A0 +ENDCHAR +STARTCHAR U_6F56 +ENCODING 28502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4440 +1EE0 +8440 +7EE0 +2000 +4FC0 +CA40 +4FC0 +4820 +47E0 +ENDCHAR +STARTCHAR U_6F57 +ENCODING 28503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27E0 +0D00 +97C0 +4500 +27C0 +2500 +CFE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6F58 +ENCODING 28504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +3E40 +0A80 +9FE0 +4A80 +3240 +3FE0 +CA40 +4FC0 +4A40 +4FC0 +ENDCHAR +STARTCHAR U_6F59 +ENCODING 28505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81C0 +4E40 +0A80 +9F80 +6880 +2FC0 +4840 +CFE0 +4020 +5AA0 +5560 +ENDCHAR +STARTCHAR U_6F5A +ENCODING 28506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +0FE0 +8240 +5FC0 +36A0 +3EE0 +D220 +5EE0 +5AA0 +6AA0 +ENDCHAR +STARTCHAR U_6F5B +ENCODING 28507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3540 +1FE0 +8C40 +4EE0 +3540 +2FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6F5C +ENCODING 28508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5DC0 +0880 +BDE0 +4880 +1540 +2FA0 +C880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6F5D +ENCODING 28509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2840 +17E0 +8440 +47C0 +2000 +3FE0 +CAA0 +4660 +5BA0 +4660 +ENDCHAR +STARTCHAR U_6F5E +ENCODING 28510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +32E0 +1320 +9EC0 +44C0 +2520 +3620 +D5E0 +5520 +7720 +59E0 +ENDCHAR +STARTCHAR U_6F5F +ENCODING 28511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2840 +0EC0 +8840 +4FC0 +2400 +2FE0 +D020 +4560 +4AA0 +4040 +ENDCHAR +STARTCHAR U_6F60 +ENCODING 28512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +3540 +1DC0 +9120 +5FE0 +2480 +2FC0 +C480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6F61 +ENCODING 28513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +0AE0 +8AA0 +4FA0 +20A0 +3EA0 +C440 +5F40 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6F62 +ENCODING 28514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +8FE0 +5100 +27C0 +2540 +C7C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F63 +ENCODING 28515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2920 +2FE0 +CAA0 +4920 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6F64 +ENCODING 28516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2BA0 +2920 +CBA0 +4920 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F65 +ENCODING 28517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +4500 +1FC0 +9540 +5FC0 +2A40 +4680 +DFE0 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6F66 +ENCODING 28518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +14A0 +8FC0 +5460 +27C0 +2440 +C7C0 +4540 +4920 +4300 +ENDCHAR +STARTCHAR U_6F67 +ENCODING 28519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8AA0 +4920 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F68 +ENCODING 28520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +1540 +9FC0 +40C0 +3F00 +4A40 +D780 +6A80 +5260 +6200 +ENDCHAR +STARTCHAR U_6F69 +ENCODING 28521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +4FE0 +2280 +2FE0 +C280 +5FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_6F6A +ENCODING 28522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2EE0 +14A0 +8FA0 +44E0 +2A00 +37C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6F6B +ENCODING 28523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0200 +8FE0 +4A40 +37A0 +2240 +CFE0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6F6C +ENCODING 28524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0FE0 +8540 +47C0 +2540 +27C0 +C100 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6F6D +ENCODING 28525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2280 +0FE0 +8AA0 +4FE0 +2440 +27C0 +C440 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6F6E +ENCODING 28526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +04A0 +9EE0 +52A0 +1EA0 +32E0 +DEA0 +44A0 +5EA0 +4560 +ENDCHAR +STARTCHAR U_6F6F +ENCODING 28527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +07C0 +8040 +4FE0 +24A0 +2EE0 +C040 +5FE0 +4840 +44C0 +ENDCHAR +STARTCHAR U_6F70 +ENCODING 28528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +0940 +9FE0 +4840 +2FC0 +2840 +CFC0 +4840 +4FC0 +5860 +ENDCHAR +STARTCHAR U_6F71 +ENCODING 28529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +9020 +4FC0 +2000 +4FC0 +C840 +4FC0 +4480 +5FE0 +ENDCHAR +STARTCHAR U_6F72 +ENCODING 28530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +3DA0 +04C0 +9FE0 +4520 +2DE0 +2F20 +D5E0 +6520 +4520 +4560 +ENDCHAR +STARTCHAR U_6F73 +ENCODING 28531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8900 +4FE0 +2940 +2FE0 +CA20 +4FE0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6F74 +ENCODING 28532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +35E0 +08A0 +97E0 +4480 +2DE0 +3520 +C7E0 +4520 +55E0 +4920 +ENDCHAR +STARTCHAR U_6F75 +ENCODING 28533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +7E80 +14E0 +BF40 +6140 +3F40 +5280 +DE80 +5280 +5F60 +5240 +ENDCHAR +STARTCHAR U_6F76 +ENCODING 28534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0920 +8FE0 +5100 +2FE0 +2100 +CFE0 +4000 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_6F77 +ENCODING 28535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5540 +2220 +9FC0 +4240 +3FE0 +2240 +DFE0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_6F78 +ENCODING 28536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0440 +8EE0 +5540 +27C0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F79 +ENCODING 28537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +0700 +8A80 +5240 +0A80 +5FC0 +CD80 +5AC0 +6AA0 +4880 +ENDCHAR +STARTCHAR U_6F7A +ENCODING 28538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8880 +4FE0 +2900 +2FE0 +CA40 +4FE0 +5240 +66C0 +ENDCHAR +STARTCHAR U_6F7B +ENCODING 28539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +8540 +4920 +3380 +2D60 +C540 +4380 +4540 +5B20 +ENDCHAR +STARTCHAR U_6F7C +ENCODING 28540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8100 +5FE0 +2540 +27C0 +C540 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F7D +ENCODING 28541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0AA0 +86C0 +5FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6F7E +ENCODING 28542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0FE0 +8540 +4920 +3040 +2FE0 +C940 +57E0 +4840 +5040 +ENDCHAR +STARTCHAR U_6F7F +ENCODING 28543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3220 +17A0 +92A0 +5FE0 +34A0 +3FE0 +D520 +57E0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_6F80 +ENCODING 28544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +1BA0 +8AA0 +5320 +2440 +2440 +D760 +5540 +5D40 +73E0 +ENDCHAR +STARTCHAR U_6F81 +ENCODING 28545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4BC0 +0A00 +9FE0 +4000 +2440 +5760 +D540 +5F40 +71E0 +4000 +ENDCHAR +STARTCHAR U_6F82 +ENCODING 28546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3540 +1FE0 +80A0 +4EA0 +21A0 +3EA0 +C4A0 +4E40 +44A0 +5F20 +ENDCHAR +STARTCHAR U_6F83 +ENCODING 28547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +C540 +26C0 +D540 +27C0 +C440 +0820 +7580 +1600 +2500 +CCC0 +ENDCHAR +STARTCHAR U_6F84 +ENCODING 28548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2AA0 +0440 +8FC0 +5020 +27C0 +2440 +C7C0 +4440 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6F85 +ENCODING 28549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2140 +0FE0 +9140 +57C0 +2100 +3FE0 +C540 +47C0 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6F86 +ENCODING 28550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +9FE0 +4440 +2EE0 +2440 +DFE0 +4480 +48A0 +5060 +ENDCHAR +STARTCHAR U_6F87 +ENCODING 28551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9540 +4EE0 +0440 +8AA0 +4FE0 +2A20 +2FC0 +C240 +4240 +4440 +58C0 +ENDCHAR +STARTCHAR U_6F88 +ENCODING 28552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +3F00 +15E0 +BD40 +4340 +3D40 +5540 +DC80 +5480 +5D40 +5620 +ENDCHAR +STARTCHAR U_6F89 +ENCODING 28553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2480 +1FE0 +8AA0 +4EA0 +2AA0 +2EA0 +CAA0 +5F40 +42A0 +4320 +ENDCHAR +STARTCHAR U_6F8A +ENCODING 28554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0500 +9FC0 +5540 +38C0 +5740 +D0C0 +7FE0 +4480 +4180 +ENDCHAR +STARTCHAR U_6F8B +ENCODING 28555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2100 +2FE0 +C440 +47C0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F8C +ENCODING 28556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +3F80 +0A80 +8EE0 +4AA0 +2EA0 +2AA0 +DFA0 +4AA0 +52A0 +6120 +ENDCHAR +STARTCHAR U_6F8D +ENCODING 28557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +3F20 +04E0 +9F20 +4020 +3F20 +32A0 +DEA0 +4A20 +44A0 +5E40 +ENDCHAR +STARTCHAR U_6F8E +ENCODING 28558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +3F20 +0440 +8E80 +4020 +0F40 +2980 +CF20 +4920 +4640 +5980 +ENDCHAR +STARTCHAR U_6F8F +ENCODING 28559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8780 +4000 +3DE0 +5520 +5DE0 +C200 +5220 +5220 +5FE0 +ENDCHAR +STARTCHAR U_6F90 +ENCODING 28560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +8920 +52A0 +2FC0 +2000 +CFE0 +4280 +4440 +4FA0 +ENDCHAR +STARTCHAR U_6F91 +ENCODING 28561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +0EE0 +8AA0 +5EE0 +2280 +4FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6F92 +ENCODING 28562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +1FE0 +8A20 +4BE0 +2A20 +2FE0 +DA20 +43E0 +4140 +4620 +ENDCHAR +STARTCHAR U_6F93 +ENCODING 28563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +2BE0 +1240 +87C0 +4A40 +3BC0 +2900 +CBE0 +4D40 +4880 +4F60 +ENDCHAR +STARTCHAR U_6F94 +ENCODING 28564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2940 +1DE0 +9640 +57E0 +3C00 +35E0 +D520 +5D20 +55E0 +4120 +ENDCHAR +STARTCHAR U_6F95 +ENCODING 28565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9FE0 +5540 +2FE0 +2540 +CFE0 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6F96 +ENCODING 28566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2920 +2FE0 +C920 +4BA0 +4D60 +4860 +ENDCHAR +STARTCHAR U_6F97 +ENCODING 28567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2BA0 +2AA0 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F98 +ENCODING 28568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +8DC0 +5AA0 +2A80 +2000 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6F99 +ENCODING 28569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +39C0 +1040 +9DC0 +5040 +3FC0 +4800 +DFE0 +4020 +55A0 +5540 +ENDCHAR +STARTCHAR U_6F9A +ENCODING 28570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +5FC0 +1AC0 +9FC0 +5740 +1AC0 +3FE0 +C400 +47C0 +4040 +40C0 +ENDCHAR +STARTCHAR U_6F9B +ENCODING 28571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8780 +5900 +0FC0 +CA40 +1FC0 +2A40 +3FE0 +C880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6F9C +ENCODING 28572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2520 +1FE0 +9120 +5FE0 +3560 +3FE0 +D120 +53A0 +5560 +5160 +ENDCHAR +STARTCHAR U_6F9D +ENCODING 28573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1240 +8CA0 +5380 +2FC0 +2A40 +CFC0 +4A40 +4FC0 +4A40 +ENDCHAR +STARTCHAR U_6F9E +ENCODING 28574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +0FE0 +8920 +4FC0 +2920 +2FE0 +CC40 +5FE0 +6280 +4C60 +ENDCHAR +STARTCHAR U_6F9F +ENCODING 28575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +1040 +9740 +1540 +5FC0 +4200 +DFE0 +4680 +5A60 +4200 +ENDCHAR +STARTCHAR U_6FA0 +ENCODING 28576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1DC0 +8500 +5DC0 +3540 +3DC0 +D540 +5DC0 +4520 +43E0 +ENDCHAR +STARTCHAR U_6FA1 +ENCODING 28577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8000 +4EE0 +2AA0 +2EE0 +C100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_6FA2 +ENCODING 28578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +1FE0 +94A0 +4780 +2000 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6FA3 +ENCODING 28579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3EC0 +0520 +9E00 +53E0 +3E40 +33E0 +DE40 +4440 +5E40 +4440 +ENDCHAR +STARTCHAR U_6FA4 +ENCODING 28580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8100 +47C0 +2100 +2FE0 +C280 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6FA5 +ENCODING 28581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2EA0 +12A0 +9F20 +5540 +3FE0 +3540 +D5E0 +5F40 +5540 +6340 +ENDCHAR +STARTCHAR U_6FA6 +ENCODING 28582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +09E0 +9F20 +4BE0 +2920 +29E0 +C920 +49E0 +6940 +5220 +ENDCHAR +STARTCHAR U_6FA7 +ENCODING 28583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0AA0 +8FE0 +4AA0 +3FE0 +2840 +CFC0 +4480 +4300 +5FE0 +ENDCHAR +STARTCHAR U_6FA8 +ENCODING 28584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2A40 +1120 +8000 +4FE0 +2940 +2940 +D5A0 +5520 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6FA9 +ENCODING 28585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +4A40 +75C0 +4A40 +75C0 +4A40 +FFE0 +8220 +7B40 +1280 +E660 +ENDCHAR +STARTCHAR U_6FAA +ENCODING 28586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +8920 +5540 +2AA0 +2540 +CFE0 +4080 +4300 +4080 +ENDCHAR +STARTCHAR U_6FAB +ENCODING 28587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +97C0 +5540 +27C0 +2D40 +CFE0 +4960 +4FA0 +4860 +ENDCHAR +STARTCHAR U_6FAC +ENCODING 28588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +25E0 +06A0 +8940 +4220 +27C0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FAD +ENCODING 28589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0940 +8BE0 +5540 +39E0 +2B40 +D5E0 +5D40 +49E0 +5100 +ENDCHAR +STARTCHAR U_6FAE +ENCODING 28590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +0BA0 +9000 +5FE0 +2AA0 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FAF +ENCODING 28591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46E0 +24A0 +0E40 +92A0 +4D20 +2920 +3540 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6FB0 +ENCODING 28592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2380 +0440 +9BA0 +5000 +2EE0 +2AA0 +CEE0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6FB1 +ENCODING 28593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +62A0 +3EA0 +AAA0 +7F00 +2AE0 +6AA0 +BFA0 +A040 +CAA0 +9120 +ENDCHAR +STARTCHAR U_6FB2 +ENCODING 28594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +26C0 +0FE0 +8280 +4FE0 +2100 +2FE0 +C100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_6FB3 +ENCODING 28595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0D60 +8BA0 +4FE0 +2920 +2BA0 +CD60 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6FB4 +ENCODING 28596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +9000 +5FE0 +2440 +27C0 +C520 +4CC0 +5540 +4620 +ENDCHAR +STARTCHAR U_6FB5 +ENCODING 28597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9020 +49C0 +3F00 +9500 +7FE0 +2940 +7F40 +CD40 +5B40 +6940 +4A40 +ENDCHAR +STARTCHAR U_6FB6 +ENCODING 28598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0AA0 +8BA0 +4820 +2FE0 +2440 +C7C0 +4440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6FB7 +ENCODING 28599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4880 +0F80 +8880 +5FC0 +1540 +3FC0 +C200 +5FE0 +4480 +4980 +ENDCHAR +STARTCHAR U_6FB8 +ENCODING 28600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +2FE0 +8880 +4EA0 +2AA0 +2EC0 +5160 +E220 +5540 +5460 +63C0 +ENDCHAR +STARTCHAR U_6FB9 +ENCODING 28601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +1FE0 +8AA0 +4FE0 +2800 +2BC0 +C800 +4FE0 +5420 +67E0 +ENDCHAR +STARTCHAR U_6FBA +ENCODING 28602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4440 +27C0 +2440 +C7C0 +5540 +54A0 +63E0 +ENDCHAR +STARTCHAR U_6FBB +ENCODING 28603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +6280 +1FC0 +9200 +4540 +3380 +5D40 +D320 +5500 +7900 +47E0 +ENDCHAR +STARTCHAR U_6FBC +ENCODING 28604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2BE0 +0AA0 +8E40 +49E0 +2E40 +2BE0 +DA40 +6A40 +4E40 +4A40 +ENDCHAR +STARTCHAR U_6FBD +ENCODING 28605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8A80 +4B20 +2FE0 +2900 +CEA0 +49C0 +56A0 +6120 +ENDCHAR +STARTCHAR U_6FBE +ENCODING 28606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +1100 +97E0 +4280 +37C0 +5100 +D7E0 +5100 +5900 +67E0 +ENDCHAR +STARTCHAR U_6FBF +ENCODING 28607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0440 +8EE0 +5540 +2440 +2FC0 +C000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6FC0 +ENCODING 28608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3E80 +12E0 +9EA0 +53A0 +3EA0 +28A0 +DFA0 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6FC1 +ENCODING 28609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8400 +4FE0 +3220 +2FA0 +CAA0 +4FA0 +42A0 +4FE0 +ENDCHAR +STARTCHAR U_6FC2 +ENCODING 28610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A40 +8FE0 +4AA0 +2FE0 +2AA0 +CFE0 +52C0 +66A0 +6AA0 +ENDCHAR +STARTCHAR U_6FC3 +ENCODING 28611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8AA0 +4FE0 +2AA0 +2FE0 +2800 +CFE0 +4D40 +5480 +6660 +ENDCHAR +STARTCHAR U_6FC4 +ENCODING 28612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A7C0 +5440 +1740 +8540 +7FE0 +2820 +2BA0 +CAA0 +4BA0 +5400 +63E0 +ENDCHAR +STARTCHAR U_6FC5 +ENCODING 28613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +20A0 +8F80 +4080 +3FE0 +2220 +CF80 +4500 +4200 +4DC0 +ENDCHAR +STARTCHAR U_6FC6 +ENCODING 28614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8540 +4FE0 +2440 +27C0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FC7 +ENCODING 28615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8540 +4BA0 +3FE0 +2820 +2BA0 +CAA0 +4BA0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6FC8 +ENCODING 28616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +2AA0 +8E80 +40E0 +3F80 +2AA0 +2EA0 +CA40 +4E40 +4A60 +5FA0 +ENDCHAR +STARTCHAR U_6FC9 +ENCODING 28617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3D40 +95E0 +5F40 +1540 +15E0 +3D40 +D5E0 +5D40 +5540 +41E0 +ENDCHAR +STARTCHAR U_6FCA +ENCODING 28618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2500 +8FE0 +40A0 +2FE0 +2A80 +2AA0 +CEA0 +4B40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6FCB +ENCODING 28619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +8440 +4EE0 +3540 +2440 +3FE0 +C920 +49C0 +5500 +63E0 +ENDCHAR +STARTCHAR U_6FCC +ENCODING 28620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +26A0 +F9C0 +AEA0 +F980 +A800 +FBE0 +2220 +FBE0 +2220 +FBE0 +ENDCHAR +STARTCHAR U_6FCD +ENCODING 28621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +4FE0 +2AA0 +3720 +2DA0 +C6C0 +5940 +68A0 +47A0 +ENDCHAR +STARTCHAR U_6FCE +ENCODING 28622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2AA0 +8BA0 +4AA0 +2BA0 +2AA0 +2FE0 +C280 +5EE0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6FCF +ENCODING 28623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2440 +8EE0 +4440 +2EE0 +2100 +24C0 +D4A0 +5520 +6640 +5BC0 +ENDCHAR +STARTCHAR U_6FD0 +ENCODING 28624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4A40 +0FC0 +8220 +4FC0 +2280 +3FE0 +C440 +7FC0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FD1 +ENCODING 28625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88E0 +7F40 +09E0 +BE20 +6AA0 +2AA0 +7EA0 +CAA0 +5EA0 +6B40 +4A20 +ENDCHAR +STARTCHAR U_6FD2 +ENCODING 28626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2E80 +8BE0 +5E20 +2AA0 +2AA0 +3AA0 +CAA0 +4680 +4940 +5220 +ENDCHAR +STARTCHAR U_6FD3 +ENCODING 28627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0480 +9FE0 +5540 +3FE0 +5540 +DFC0 +5580 +6D60 +5500 +ENDCHAR +STARTCHAR U_6FD4 +ENCODING 28628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8920 +4FE0 +2DA0 +2B60 +2DA0 +CB60 +4DA0 +4920 +4960 +ENDCHAR +STARTCHAR U_6FD5 +ENCODING 28629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +9FE0 +5820 +2FE0 +2540 +3EE0 +CAA0 +5FE0 +4D40 +52A0 +ENDCHAR +STARTCHAR U_6FD6 +ENCODING 28630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +1FC0 +8220 +5FC0 +2280 +5FE0 +F880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6FD7 +ENCODING 28631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +5FE0 +0500 +8F80 +4A80 +3FE0 +2A80 +DFC0 +6AA0 +4B80 +4200 +ENDCHAR +STARTCHAR U_6FD8 +ENCODING 28632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8AA0 +4640 +2940 +2FE0 +2AA0 +DFE0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6FD9 +ENCODING 28633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +5DC0 +0880 +9540 +5FE0 +1020 +2A40 +CA80 +5300 +4480 +5860 +ENDCHAR +STARTCHAR U_6FDA +ENCODING 28634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FC0 +8480 +4B40 +1FE0 +3220 +2FC0 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6FDB +ENCODING 28635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8280 +4FE0 +2820 +2FE0 +2340 +DC80 +42C0 +5CA0 +4320 +ENDCHAR +STARTCHAR U_6FDC +ENCODING 28636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +8140 +4FE0 +2140 +3FE0 +2AA0 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6FDD +ENCODING 28637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +4780 +2480 +3FE0 +2A40 +D520 +4FC0 +4940 +5320 +ENDCHAR +STARTCHAR U_6FDE +ENCODING 28638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +9440 +5440 +2FE0 +2920 +2FE0 +C920 +5FE0 +4440 +4840 +ENDCHAR +STARTCHAR U_6FDF +ENCODING 28639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8540 +5EA0 +2AA0 +2AA0 +3200 +CFC0 +4840 +4FC0 +5040 +ENDCHAR +STARTCHAR U_6FE0 +ENCODING 28640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5FE0 +3020 +2FC0 +2940 +D280 +4DC0 +42A0 +5D20 +ENDCHAR +STARTCHAR U_6FE1 +ENCODING 28641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +2BA0 +2540 +2FE0 +C100 +4FE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_6FE2 +ENCODING 28642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +4AA0 +2120 +3FC0 +2480 +CB40 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6FE3 +ENCODING 28643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F40 +8420 +5F40 +32C0 +3F40 +32C0 +DE60 +45C0 +5E40 +4440 +ENDCHAR +STARTCHAR U_6FE4 +ENCODING 28644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8200 +5FE0 +2220 +2FC0 +2040 +DFE0 +5540 +5D40 +40C0 +ENDCHAR +STARTCHAR U_6FE5 +ENCODING 28645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8780 +4D00 +0600 +BFE0 +5220 +2FC0 +2A40 +CFC0 +4A40 +4FC0 +4480 +ENDCHAR +STARTCHAR U_6FE6 +ENCODING 28646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +2920 +9FE0 +4200 +3FE0 +2040 +2FC0 +C040 +5FC0 +5920 +6FC0 +ENDCHAR +STARTCHAR U_6FE7 +ENCODING 28647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B20 +2A20 +9F20 +4AE0 +2420 +3F20 +24A0 +DF60 +4420 +5F20 +4060 +ENDCHAR +STARTCHAR U_6FE8 +ENCODING 28648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +9FE0 +4440 +2AA0 +2440 +2AA0 +DEE0 +5540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_6FE9 +ENCODING 28649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8480 +4FE0 +3480 +27E0 +2480 +CFE0 +4240 +4180 +4E60 +ENDCHAR +STARTCHAR U_6FEA +ENCODING 28650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5EE0 +0940 +9DE0 +6960 +3FA0 +55E0 +DD00 +5500 +5D20 +54E0 +ENDCHAR +STARTCHAR U_6FEB +ENCODING 28651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +3480 +1EE0 +9280 +5F40 +3420 +3E00 +C000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_6FEC +ENCODING 28652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +1FE0 +94A0 +4B40 +2480 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FED +ENCODING 28653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0540 +8FC0 +4100 +2FE0 +2200 +C440 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6FEE +ENCODING 28654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2B60 +0FE0 +8940 +5FE0 +2880 +2BE0 +C880 +4FE0 +4940 +4A20 +ENDCHAR +STARTCHAR U_6FEF +ENCODING 28655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +0660 +8AA0 +6320 +2900 +2FE0 +D900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6FF0 +ENCODING 28656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4980 +2940 +13E0 +9D40 +4940 +2BE0 +3F40 +C1E0 +5540 +6B40 +41E0 +ENDCHAR +STARTCHAR U_6FF1 +ENCODING 28657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8FC0 +4540 +3FC0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FF2 +ENCODING 28658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +04A0 +9FA0 +5500 +3FE0 +24A0 +DEA0 +4440 +4EA0 +5520 +ENDCHAR +STARTCHAR U_6FF3 +ENCODING 28659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5FE0 +2480 +9FE0 +4CA0 +3360 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6FF4 +ENCODING 28660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2EE0 +1440 +8AA0 +5FE0 +3120 +2F20 +C540 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6FF5 +ENCODING 28661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1020 +8FC0 +4A40 +2FC0 +2D40 +CEC0 +5540 +57C0 +6480 +ENDCHAR +STARTCHAR U_6FF6 +ENCODING 28662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DE0 +5520 +1DE0 +9520 +7FE0 +5220 +DFE0 +5220 +57A0 +54A0 +57E0 +ENDCHAR +STARTCHAR U_6FF7 +ENCODING 28663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +7D80 +14E0 +2C80 +DFE0 +0480 +DFE0 +39A0 +D560 +5B20 +5160 +ENDCHAR +STARTCHAR U_6FF8 +ENCODING 28664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7FE0 +0A80 +8500 +4F80 +38E0 +2F80 +C880 +4FC0 +5840 +6FC0 +ENDCHAR +STARTCHAR U_6FF9 +ENCODING 28665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3740 +1FC0 +8200 +4FC0 +2200 +3FE0 +EAA0 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6FFA +ENCODING 28666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +37E0 +1540 +9CA0 +5760 +3D40 +37E0 +D520 +5D40 +48A0 +5760 +ENDCHAR +STARTCHAR U_6FFB +ENCODING 28667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +37E0 +16A0 +9BE0 +5480 +37E0 +3620 +DFE0 +5220 +53E0 +5620 +ENDCHAR +STARTCHAR U_6FFC +ENCODING 28668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +2FA0 +1540 +8FA0 +5540 +3FE0 +2100 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6FFD +ENCODING 28669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4EE0 +0440 +8FE0 +6AA0 +27C0 +2540 +C6C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FFE +ENCODING 28670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +0FE0 +8A20 +4FE0 +2920 +2FE0 +C920 +57E0 +6D40 +47A0 +ENDCHAR +STARTCHAR U_6FFF +ENCODING 28671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3280 +1FE0 +9280 +57C0 +3540 +37C0 +D540 +5FE0 +6920 +4BA0 +ENDCHAR +STARTCHAR U_7000 +ENCODING 28672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4440 +07C0 +8440 +5FE0 +2AA0 +57A0 +4400 +CFC0 +5300 +4CC0 +ENDCHAR +STARTCHAR U_7001 +ENCODING 28673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0100 +9FE0 +4840 +3FE0 +2840 +CFC0 +4A20 +4940 +4CE0 +ENDCHAR +STARTCHAR U_7002 +ENCODING 28674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8700 +4900 +1FC0 +9240 +5FC0 +3240 +5FC0 +E8A0 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_7003 +ENCODING 28675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81E0 +5D20 +15E0 +9D20 +55E0 +1D00 +37E0 +DCA0 +4360 +54A0 +5360 +ENDCHAR +STARTCHAR U_7004 +ENCODING 28676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +1540 +8EE0 +4AA0 +2EA0 +2AA0 +CEA0 +4AE0 +4D80 +4880 +ENDCHAR +STARTCHAR U_7005 +ENCODING 28677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2F60 +1540 +8AA0 +4FE0 +2820 +2FE0 +C100 +47C0 +4140 +5FE0 +ENDCHAR +STARTCHAR U_7006 +ENCODING 28678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_7007 +ENCODING 28679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1280 +9FE0 +5280 +3FE0 +3540 +D7C0 +5540 +57C0 +6C60 +ENDCHAR +STARTCHAR U_7008 +ENCODING 28680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DC0 +5540 +0CC0 +9540 +7FE0 +2AA0 +2F80 +CA80 +5FE0 +4200 +4200 +ENDCHAR +STARTCHAR U_7009 +ENCODING 28681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +12A0 +8840 +4EC0 +2840 +2FC0 +C800 +5FE0 +6560 +4AA0 +ENDCHAR +STARTCHAR U_700A +ENCODING 28682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +3D40 +1620 +95E0 +5D40 +3480 +3760 +C000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_700B +ENCODING 28683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9960 +4580 +3FE0 +2940 +3FE0 +C940 +4FC0 +4940 +4FC0 +ENDCHAR +STARTCHAR U_700C +ENCODING 28684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9280 +5FE0 +12A0 +3FE0 +3480 +D7E0 +5480 +57E0 +6AA0 +ENDCHAR +STARTCHAR U_700D +ENCODING 28685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8AA0 +4BE0 +2AA0 +2FE0 +2A40 +CCA0 +57E0 +5080 +6FE0 +ENDCHAR +STARTCHAR U_700E +ENCODING 28686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +8480 +4FE0 +1AA0 +2FE0 +2140 +CFE0 +48A0 +4D60 +5220 +ENDCHAR +STARTCHAR U_700F +ENCODING 28687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +34A0 +9DA0 +56A0 +09A0 +3FA0 +24A0 +DFA0 +55A0 +4F20 +7860 +ENDCHAR +STARTCHAR U_7010 +ENCODING 28688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5EC0 +04A0 +BFE0 +4A80 +3BA0 +4AA0 +DBC0 +4AA0 +4F60 +5220 +ENDCHAR +STARTCHAR U_7011 +ENCODING 28689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +4840 +1FE0 +2480 +3FE0 +CD40 +53A0 +4540 +4B20 +ENDCHAR +STARTCHAR U_7012 +ENCODING 28690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1240 +9740 +6AA0 +5240 +7FE0 +D540 +5740 +5040 +5FC0 +ENDCHAR +STARTCHAR U_7013 +ENCODING 28691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5280 +2AE0 +8FA0 +50A0 +3720 +52A0 +D740 +5240 +5FA0 +5120 +ENDCHAR +STARTCHAR U_7014 +ENCODING 28692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +84A0 +5FA0 +1000 +2FE0 +24A0 +DFA0 +4440 +4EA0 +5520 +ENDCHAR +STARTCHAR U_7015 +ENCODING 28693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3680 +95E0 +5F20 +05E0 +2D20 +35E0 +D720 +45E0 +4940 +5220 +ENDCHAR +STARTCHAR U_7016 +ENCODING 28694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +07C0 +2900 +2FE0 +D900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_7017 +ENCODING 28695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9120 +4FC0 +2100 +3FE0 +2AA0 +CFE0 +5140 +54A0 +67A0 +ENDCHAR +STARTCHAR U_7018 +ENCODING 28696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +8FE0 +4A20 +0FC0 +2A20 +2FE0 +C940 +4FE0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_7019 +ENCODING 28697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3F20 +8BE0 +4520 +1F20 +25E0 +3F20 +C5E0 +4EC0 +5540 +6E60 +ENDCHAR +STARTCHAR U_701A +ENCODING 28698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3F40 +8820 +5FE0 +12A0 +3FE0 +32A0 +DFE0 +48A0 +5EA0 +49E0 +ENDCHAR +STARTCHAR U_701B +ENCODING 28699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8800 +4FE0 +0100 +3FE0 +36A0 +DDE0 +55A0 +56A0 +6D20 +ENDCHAR +STARTCHAR U_701C +ENCODING 28700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BE80 +5480 +1E80 +83E0 +7EA0 +36A0 +2BE0 +7E80 +AA80 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_701D +ENCODING 28701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2B60 +8A40 +4FE0 +0A40 +2FE0 +2A40 +D100 +55E0 +6500 +4FE0 +ENDCHAR +STARTCHAR U_701E +ENCODING 28702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +7FC0 +0A80 +9DE0 +48A0 +7FE0 +54A0 +DDE0 +5480 +5C80 +5580 +ENDCHAR +STARTCHAR U_701F +ENCODING 28703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +8A80 +5FC0 +0240 +3FE0 +32A0 +DEE0 +5220 +5EE0 +62A0 +ENDCHAR +STARTCHAR U_7020 +ENCODING 28704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3760 +9540 +4AA0 +1FE0 +3220 +2F00 +C440 +5FA0 +4A80 +7660 +ENDCHAR +STARTCHAR U_7021 +ENCODING 28705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +35E0 +9640 +5BE0 +14A0 +36E0 +3AA0 +D2E0 +52A0 +52A0 +55E0 +ENDCHAR +STARTCHAR U_7022 +ENCODING 28706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +8AA0 +47E0 +1A20 +2BE0 +2A20 +CBE0 +4940 +4A20 +57E0 +ENDCHAR +STARTCHAR U_7023 +ENCODING 28707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +28A0 +8FA0 +5240 +0CA0 +2A80 +3EE0 +C280 +4EE0 +4280 +5FE0 +ENDCHAR +STARTCHAR U_7024 +ENCODING 28708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8AA0 +4FE0 +0520 +2380 +2D60 +C540 +4C80 +5640 +4C20 +ENDCHAR +STARTCHAR U_7025 +ENCODING 28709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0660 +8AA0 +7FE0 +2280 +4280 +CFE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_7026 +ENCODING 28710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +3FE0 +88A0 +53E0 +2C80 +19E0 +6B20 +D9E0 +6D20 +49E0 +5920 +ENDCHAR +STARTCHAR U_7027 +ENCODING 28711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3F80 +8AE0 +5F20 +0AE0 +2E80 +2AE0 +CE80 +4AE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_7028 +ENCODING 28712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +85E0 +5F20 +15E0 +1520 +3FE0 +C520 +4FE0 +54C0 +6520 +ENDCHAR +STARTCHAR U_7029 +ENCODING 28713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2440 +9FE0 +44A0 +0EE0 +35A0 +2EE0 +CAA0 +4BE0 +52C0 +6120 +ENDCHAR +STARTCHAR U_702A +ENCODING 28714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FF40 +A880 +FD60 +1200 +3F80 +20A0 +7FC0 +1500 +ECE0 +ENDCHAR +STARTCHAR U_702B +ENCODING 28715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +84A0 +5FA0 +1400 +2AE0 +3EA0 +CAA0 +5F40 +56A0 +6520 +ENDCHAR +STARTCHAR U_702C +ENCODING 28716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +89E0 +5E80 +09E0 +BF20 +6BE0 +3F20 +5DE0 +DB20 +69E0 +4920 +4A20 +ENDCHAR +STARTCHAR U_702D +ENCODING 28717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5D40 +0BE0 +BE00 +6BA0 +3EA0 +2BA0 +FEA0 +4BA0 +7EA0 +4AE0 +ENDCHAR +STARTCHAR U_702E +ENCODING 28718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +1FE0 +BAA0 +6700 +2AE0 +4880 +FDE0 +5DC0 +6AA0 +4880 +ENDCHAR +STARTCHAR U_702F +ENCODING 28719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3660 +9440 +4AA0 +1FE0 +34A0 +2780 +C000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_7030 +ENCODING 28720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +5540 +1920 +BFE0 +6920 +2D60 +3BA0 +4960 +CDA0 +4B60 +5920 +ENDCHAR +STARTCHAR U_7031 +ENCODING 28721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8FE0 +4A00 +2F20 +2AA0 +2DA0 +CAA0 +57A0 +5220 +6D60 +ENDCHAR +STARTCHAR U_7032 +ENCODING 28722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +3280 +A1E0 +5EA0 +00A0 +7EA0 +6AA0 +BEA0 +9340 +ACA0 +8520 +ENDCHAR +STARTCHAR U_7033 +ENCODING 28723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +8540 +4FE0 +2AA0 +2FE0 +2A00 +CBE0 +4A00 +57E0 +6AA0 +ENDCHAR +STARTCHAR U_7034 +ENCODING 28724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +3520 +9DE0 +5520 +3DE0 +2840 +36A0 +DFE0 +4480 +4380 +5E60 +ENDCHAR +STARTCHAR U_7035 +ENCODING 28725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2FE0 +9540 +5920 +2FC0 +2A40 +5FE0 +4480 +DFE0 +4480 +5860 +ENDCHAR +STARTCHAR U_7036 +ENCODING 28726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +7DE0 +2A00 +A9C0 +7D40 +25C0 +7C00 +6BE0 +AAA0 +BEA0 +83E0 +ENDCHAR +STARTCHAR U_7037 +ENCODING 28727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +4AA0 +2FE0 +2920 +2FE0 +C240 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_7038 +ENCODING 28728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +35A0 +9FE0 +4A80 +3BA0 +2AA0 +3BA0 +CA40 +7B60 +4A60 +5FA0 +ENDCHAR +STARTCHAR U_7039 +ENCODING 28729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +27C0 +8820 +5FE0 +2AA0 +2FE0 +2000 +CFE0 +4AA0 +4FE0 +4AA0 +ENDCHAR +STARTCHAR U_703A +ENCODING 28730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2900 +9FC0 +4840 +2FC0 +2880 +5FE0 +C940 +4FC0 +4520 +59E0 +ENDCHAR +STARTCHAR U_703B +ENCODING 28731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F60 +2440 +9FE0 +5540 +1F40 +3540 +5F40 +CA60 +5F40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_703C +ENCODING 28732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8AA0 +4EE0 +2280 +2FE0 +2280 +DFE0 +44A0 +5D40 +4620 +ENDCHAR +STARTCHAR U_703D +ENCODING 28733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +2520 +9FC0 +4500 +3FE0 +4880 +DFC0 +6220 +4B80 +77E0 +ENDCHAR +STARTCHAR U_703E +ENCODING 28734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +8EE0 +4AA0 +2EE0 +2920 +4FE0 +CAA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_703F +ENCODING 28735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +35E0 +9FA0 +5540 +3FA0 +2100 +4F80 +C440 +5FC0 +4540 +5B20 +ENDCHAR +STARTCHAR U_7040 +ENCODING 28736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +22E0 +24A0 +5FE0 +C4A0 +4EE0 +55A0 +44E0 +ENDCHAR +STARTCHAR U_7041 +ENCODING 28737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +32A0 +9EE0 +52A0 +3FE0 +34A0 +57A0 +D4E0 +5FA0 +55A0 +5B60 +ENDCHAR +STARTCHAR U_7042 +ENCODING 28738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +2A40 +9FE0 +54A0 +3FE0 +3240 +5FE0 +D240 +5EC0 +5440 +5AC0 +ENDCHAR +STARTCHAR U_7043 +ENCODING 28739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8AA0 +4FE0 +2AA0 +3FE0 +4840 +CFC0 +4880 +4500 +5FE0 +ENDCHAR +STARTCHAR U_7044 +ENCODING 28740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2440 +87C0 +4440 +3FE0 +2040 +4FE0 +CAA0 +4EE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_7045 +ENCODING 28741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2A40 +8FC0 +4A40 +3FE0 +2AA0 +3FE0 +EAA0 +7FE0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_7046 +ENCODING 28742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5E80 +34E0 +3F40 +5220 +D400 +5FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_7047 +ENCODING 28743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94A0 +4CC0 +1FE0 +8480 +7FE0 +2A00 +4EE0 +CAA0 +4E40 +4BA0 +5E20 +ENDCHAR +STARTCHAR U_7048 +ENCODING 28744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +8EE0 +4AA0 +2EE0 +2AA0 +4FE0 +D900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_7049 +ENCODING 28745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +6B40 +95E0 +4B40 +1FE0 +5140 +7F40 +A9E0 +BF40 +A340 +BFE0 +ENDCHAR +STARTCHAR U_704A +ENCODING 28746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3540 +9FE0 +5640 +24A0 +3FE0 +4440 +CFE0 +4AA0 +4FE0 +4920 +ENDCHAR +STARTCHAR U_704B +ENCODING 28747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1540 +9FC0 +5400 +57E0 +5AA0 +D200 +6FE0 +6480 +4FC0 +ENDCHAR +STARTCHAR U_704C +ENCODING 28748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +8EE0 +4AA0 +2EE0 +2500 +4FE0 +D900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_704D +ENCODING 28749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BDE0 +6520 +3DE0 +A520 +7FE0 +2960 +6AA0 +7EA0 +A960 +B220 +A060 +ENDCHAR +STARTCHAR U_704E +ENCODING 28750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +7FE0 +2A80 +BFE0 +6A80 +3F40 +57E0 +5EA0 +D6A0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_704F +ENCODING 28751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +9FE0 +5220 +5EA0 +6AA0 +5EA0 +92A0 +9EA0 +AD40 +CA20 +ENDCHAR +STARTCHAR U_7050 +ENCODING 28752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94A0 +4FC0 +0CC0 +9320 +7FE0 +2520 +4F80 +F260 +4FC0 +4A80 +5FE0 +ENDCHAR +STARTCHAR U_7051 +ENCODING 28753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2000 +8FE0 +4AA0 +2FE0 +2AA0 +4FE0 +CC80 +56C0 +54A0 +66E0 +ENDCHAR +STARTCHAR U_7052 +ENCODING 28754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2FE0 +8240 +5FE0 +2960 +37C0 +4440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_7053 +ENCODING 28755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4440 +AEA0 +FBE0 +AEA0 +0400 +7680 +2500 +D4E0 +0800 +ENDCHAR +STARTCHAR U_7054 +ENCODING 28756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +7FE0 +2A40 +BFE0 +6AA0 +3FA0 +1EE0 +5280 +DE80 +4AA0 +5F60 +ENDCHAR +STARTCHAR U_7055 +ENCODING 28757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3E40 +95E0 +5B40 +3540 +3FE0 +5540 +D540 +5BE0 +5740 +51E0 +ENDCHAR +STARTCHAR U_7056 +ENCODING 28758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +9480 +5FE0 +35A0 +5EE0 +5280 +DEE0 +5280 +6EE0 +4280 +ENDCHAR +STARTCHAR U_7057 +ENCODING 28759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4BE0 +3E20 +ABA0 +6AA0 +2BE0 +7FC0 +8940 +8DC0 +BB40 +83E0 +ENDCHAR +STARTCHAR U_7058 +ENCODING 28760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4B40 +3FE0 +8940 +4F40 +05E0 +3F40 +5540 +FFE0 +4940 +5540 +63E0 +ENDCHAR +STARTCHAR U_7059 +ENCODING 28761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5FE0 +54A0 +8FC0 +4A40 +2FC0 +2200 +CFC0 +4200 +5FE0 +52A0 +ENDCHAR +STARTCHAR U_705A +ENCODING 28762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2920 +8AA0 +4D60 +0AA0 +1FE0 +34A0 +C780 +4480 +47A0 +5CE0 +ENDCHAR +STARTCHAR U_705B +ENCODING 28763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2520 +3DE0 +A720 +7AE0 +2FA0 +6AA0 +AFA0 +A220 +AFA0 +A260 +ENDCHAR +STARTCHAR U_705C +ENCODING 28764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0800 +8FC0 +4880 +3FC0 +5540 +DF40 +5540 +5F60 +6520 +ENDCHAR +STARTCHAR U_705D +ENCODING 28765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3280 +9FE0 +5120 +1FE0 +2520 +5FE0 +D120 +5FE0 +5C40 +6AA0 +ENDCHAR +STARTCHAR U_705E +ENCODING 28766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2100 +9FE0 +52A0 +1FE0 +2AA0 +5FE0 +D4A0 +7FE0 +44A0 +4560 +ENDCHAR +STARTCHAR U_705F +ENCODING 28767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3020 +9FE0 +5540 +1FE0 +1AA0 +37E0 +DA20 +5FA0 +62A0 +4FE0 +ENDCHAR +STARTCHAR U_7060 +ENCODING 28768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +35E0 +9E80 +55E0 +3520 +2FE0 +2880 +CF80 +4880 +4FA0 +58E0 +ENDCHAR +STARTCHAR U_7061 +ENCODING 28769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +8EE0 +4AA0 +1FE0 +2920 +4FE0 +CAA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_7062 +ENCODING 28770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2940 +9FE0 +5540 +3DC0 +2480 +3FC0 +C480 +5FE0 +4CA0 +5660 +ENDCHAR +STARTCHAR U_7063 +ENCODING 28771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +3FE0 +8840 +5FA0 +2AC0 +36A0 +2FE0 +C800 +4FE0 +4020 +41C0 +ENDCHAR +STARTCHAR U_7064 +ENCODING 28772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2BC0 +9C60 +4BC0 +3EE0 +4BA0 +56C0 +C100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_7065 +ENCODING 28773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +1500 +FFE0 +8A20 +FBE0 +2080 +AAA0 +71C0 +AEA0 +ENDCHAR +STARTCHAR U_7066 +ENCODING 28774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +3240 +9EE0 +52A0 +3EE0 +4AA0 +5FE0 +D4A0 +5FE0 +4AC0 +5520 +ENDCHAR +STARTCHAR U_7067 +ENCODING 28775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +7EE0 +2B40 +BEE0 +6AA0 +3FA0 +52E0 +DE80 +5280 +4CA0 +7F60 +ENDCHAR +STARTCHAR U_7068 +ENCODING 28776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +3FE0 +8B40 +5EA0 +31E0 +3F20 +51E0 +DF20 +49E0 +7F40 +4A20 +ENDCHAR +STARTCHAR U_7069 +ENCODING 28777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3F40 +95E0 +5F40 +15E0 +3FA0 +52E0 +DE00 +57E0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_706A +ENCODING 28778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +3FE0 +1240 +AFA0 +7FE0 +2420 +5BC0 +5520 +DFC0 +5420 +5FC0 +ENDCHAR +STARTCHAR U_706B +ENCODING 28779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2440 +2480 +2500 +4400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_706C +ENCODING 28780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 0 +BITMAP +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_706D +ENCODING 28781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +2440 +2440 +2480 +4A00 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_706E +ENCODING 28782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2440 +4580 +0A00 +3180 +C060 +1200 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_706F +ENCODING 28783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +5480 +5880 +5080 +9080 +1080 +1080 +2880 +4480 +8180 +ENDCHAR +STARTCHAR U_7070 +ENCODING 28784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0A00 +1200 +1240 +2A80 +4B00 +9200 +0500 +1880 +6060 +ENDCHAR +STARTCHAR U_7071 +ENCODING 28785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +A920 +B120 +A120 +2120 +2120 +3220 +2A20 +4520 +88C0 +ENDCHAR +STARTCHAR U_7072 +ENCODING 28786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +2040 +6A40 +6A40 +B240 +2240 +3240 +2A40 +4A40 +4140 +8080 +ENDCHAR +STARTCHAR U_7073 +ENCODING 28787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +3FC0 +4040 +8840 +2940 +2A40 +4840 +1440 +2240 +4040 +0180 +ENDCHAR +STARTCHAR U_7074 +ENCODING 28788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2900 +B100 +A100 +A100 +2100 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7075 +ENCODING 28789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +3F80 +0400 +1440 +2480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7076 +ENCODING 28790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +A900 +B7C0 +A100 +2100 +2100 +5100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_7077 +ENCODING 28791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4B00 +1100 +60E0 +0900 +FFE0 +0900 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7078 +ENCODING 28792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +4500 +18E0 +E440 +1480 +6500 +0A00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_7079 +ENCODING 28793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2A00 +6A00 +73E0 +AE00 +2200 +5200 +4A00 +4A20 +81E0 +ENDCHAR +STARTCHAR U_707A +ENCODING 28794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +2AE0 +B3A0 +AEA0 +A2A0 +22E0 +3280 +2A20 +4220 +81E0 +ENDCHAR +STARTCHAR U_707B +ENCODING 28795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0000 +0400 +2480 +4680 +0900 +30E0 +C040 +ENDCHAR +STARTCHAR U_707C +ENCODING 28796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B420 +AA20 +A120 +2120 +3020 +2820 +4120 +80C0 +ENDCHAR +STARTCHAR U_707D +ENCODING 28797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4900 +4900 +2480 +0400 +2480 +2500 +4A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_707E +ENCODING 28798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +2480 +2480 +4500 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_707F +ENCODING 28799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2AA0 +B2A0 +A2A0 +A2A0 +22A0 +32A0 +4AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_7080 +ENCODING 28800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2100 +2A00 +B400 +A7E0 +A2A0 +24A0 +3120 +4A20 +4D20 +80C0 +ENDCHAR +STARTCHAR U_7081 +ENCODING 28801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +4400 +7FC0 +0A00 +1220 +E1E0 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7082 +ENCODING 28802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2A40 +B440 +A520 +A900 +2100 +3200 +4A40 +47A0 +8220 +ENDCHAR +STARTCHAR U_7083 +ENCODING 28803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +2040 +5FA0 +0880 +1380 +6400 +2480 +2500 +4A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7084 +ENCODING 28804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +2A40 +B240 +A240 +A7C0 +2240 +3240 +4A40 +4240 +8FE0 +ENDCHAR +STARTCHAR U_7085 +ENCODING 28805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +0880 +4900 +4A00 +9400 +2300 +C0C0 +ENDCHAR +STARTCHAR U_7086 +ENCODING 28806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B440 +A440 +A280 +2280 +3100 +4900 +4280 +8C60 +ENDCHAR +STARTCHAR U_7087 +ENCODING 28807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1100 +1500 +5BE0 +5240 +9640 +1280 +2900 +2980 +4240 +8420 +ENDCHAR +STARTCHAR U_7088 +ENCODING 28808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +6C80 +74E0 +A800 +2780 +2480 +5300 +4B00 +8480 +1860 +ENDCHAR +STARTCHAR U_7089 +ENCODING 28809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +B420 +A420 +A7E0 +2400 +5400 +5400 +4800 +9000 +ENDCHAR +STARTCHAR U_708A +ENCODING 28810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B220 +A540 +A100 +2100 +5100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_708B +ENCODING 28811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2900 +7300 +6300 +A540 +2920 +5120 +4900 +8100 +0100 +ENDCHAR +STARTCHAR U_708C +ENCODING 28812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +6A80 +7460 +AA80 +2280 +2280 +5280 +4A80 +8480 +0880 +ENDCHAR +STARTCHAR U_708D +ENCODING 28813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +6FC0 +7440 +A640 +2540 +3480 +4880 +4940 +9620 +ENDCHAR +STARTCHAR U_708E +ENCODING 28814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2500 +4A00 +3180 +C460 +2480 +2500 +4A00 +3180 +C060 +ENDCHAR +STARTCHAR U_708F +ENCODING 28815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +6A40 +7240 +AA80 +2A00 +2200 +5500 +4480 +8860 +1040 +ENDCHAR +STARTCHAR U_7090 +ENCODING 28816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +2FE0 +7100 +67C0 +A100 +3100 +4FE0 +4100 +8100 +0100 +ENDCHAR +STARTCHAR U_7091 +ENCODING 28817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +A100 +A380 +2540 +3520 +4920 +4900 +8100 +ENDCHAR +STARTCHAR U_7092 +ENCODING 28818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2940 +B520 +A500 +A920 +2120 +3140 +4880 +4300 +8C00 +ENDCHAR +STARTCHAR U_7093 +ENCODING 28819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +2940 +B040 +A240 +A140 +2060 +37C0 +4840 +4840 +8040 +ENDCHAR +STARTCHAR U_7094 +ENCODING 28820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FC0 +B140 +A140 +AFE0 +2100 +3100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_7095 +ENCODING 28821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B000 +A380 +A280 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_7096 +ENCODING 28822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2900 +B540 +A540 +A540 +27C0 +3100 +4920 +4920 +80E0 +ENDCHAR +STARTCHAR U_7097 +ENCODING 28823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +FFE0 +0900 +0F00 +0400 +1440 +2580 +0A00 +1100 +60E0 +ENDCHAR +STARTCHAR U_7098 +ENCODING 28824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2A00 +B200 +A3E0 +A240 +2240 +3240 +4A40 +4C40 +9040 +ENDCHAR +STARTCHAR U_7099 +ENCODING 28825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +3100 +4A00 +2C00 +F480 +1500 +2A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_709A +ENCODING 28826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9520 +9540 +F580 +9900 +9100 +F100 +9280 +0440 +1820 +ENDCHAR +STARTCHAR U_709B +ENCODING 28827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +2480 +4B00 +1180 +2A60 +D200 +3280 +D300 +1E20 +1220 +11E0 +ENDCHAR +STARTCHAR U_709C +ENCODING 28828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B7E0 +A100 +AFE0 +2120 +3120 +4960 +4900 +8100 +ENDCHAR +STARTCHAR U_709D +ENCODING 28829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C40 +B020 +A3C0 +A240 +2240 +32C0 +4A20 +4A20 +81E0 +ENDCHAR +STARTCHAR U_709E +ENCODING 28830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2200 +2FE0 +6A00 +7200 +A280 +2240 +3240 +4A00 +4200 +8200 +ENDCHAR +STARTCHAR U_709F +ENCODING 28831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2C40 +B440 +A7C0 +A440 +2440 +37C0 +4C40 +4000 +8FE0 +ENDCHAR +STARTCHAR U_70A0 +ENCODING 28832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +2CA0 +77E0 +64A0 +A4A0 +27E0 +5080 +4880 +8080 +0080 +ENDCHAR +STARTCHAR U_70A1 +ENCODING 28833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2880 +B080 +A480 +A4E0 +2480 +3480 +4C80 +4480 +8FE0 +ENDCHAR +STARTCHAR U_70A2 +ENCODING 28834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2900 +B7E0 +A100 +2380 +3540 +4D20 +4920 +9100 +0100 +ENDCHAR +STARTCHAR U_70A3 +ENCODING 28835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2040 +6840 +7740 +A540 +2740 +5040 +5040 +4140 +8080 +ENDCHAR +STARTCHAR U_70A4 +ENCODING 28836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +2920 +B2A0 +A440 +A800 +23E0 +3220 +4A20 +43E0 +8220 +ENDCHAR +STARTCHAR U_70A5 +ENCODING 28837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +32A0 +BFE0 +AA80 +AFE0 +22A0 +52A0 +54E0 +8480 +0880 +ENDCHAR +STARTCHAR U_70A6 +ENCODING 28838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +2FE0 +AA00 +B3C0 +A240 +2240 +3580 +5500 +4AE0 +9440 +ENDCHAR +STARTCHAR U_70A7 +ENCODING 28839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C00 +6900 +75C0 +A740 +2D40 +2540 +5540 +54A0 +83E0 +ENDCHAR +STARTCHAR U_70A8 +ENCODING 28840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +A000 +AA00 +B240 +2380 +5200 +4A20 +8A20 +81E0 +ENDCHAR +STARTCHAR U_70A9 +ENCODING 28841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C40 +B120 +A080 +A7E0 +2040 +3080 +4B00 +4080 +8040 +ENDCHAR +STARTCHAR U_70AA +ENCODING 28842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2080 +24A0 +6CA0 +74A0 +A7E0 +2080 +24A0 +54A0 +4CA0 +87E0 +ENDCHAR +STARTCHAR U_70AB +ENCODING 28843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +B100 +A240 +A780 +2080 +3100 +4A40 +47E0 +8220 +ENDCHAR +STARTCHAR U_70AC +ENCODING 28844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2C00 +B7C0 +A440 +A440 +27C0 +3440 +4C00 +4400 +87E0 +ENDCHAR +STARTCHAR U_70AD +ENCODING 28845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +1000 +7FE0 +1200 +1A40 +2A80 +4500 +8880 +3060 +ENDCHAR +STARTCHAR U_70AE +ENCODING 28846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C20 +B7A0 +ACA0 +A4A0 +27A0 +3420 +4CC0 +4420 +83E0 +ENDCHAR +STARTCHAR U_70AF +ENCODING 28847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2820 +BBA0 +AAA0 +AAA0 +2AA0 +2BA0 +5820 +4820 +88E0 +ENDCHAR +STARTCHAR U_70B0 +ENCODING 28848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4040 +BE40 +2240 +3E80 +2020 +2020 +1FE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_70B1 +ENCODING 28849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +2440 +4A80 +1180 +E060 +ENDCHAR +STARTCHAR U_70B2 +ENCODING 28850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AA80 +B440 +AFE0 +2020 +27C0 +5440 +4C40 +87C0 +8440 +ENDCHAR +STARTCHAR U_70B3 +ENCODING 28851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +B520 +A520 +A520 +25A0 +3660 +4C20 +4420 +84E0 +ENDCHAR +STARTCHAR U_70B4 +ENCODING 28852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FC0 +B540 +A540 +A540 +2FE0 +3100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_70B5 +ENCODING 28853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2E40 +B180 +A280 +AC60 +2100 +30C0 +4800 +4580 +8060 +ENDCHAR +STARTCHAR U_70B6 +ENCODING 28854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2900 +69E0 +7100 +A100 +27C0 +3440 +4C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_70B7 +ENCODING 28855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B100 +A100 +A100 +27C0 +2100 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_70B8 +ENCODING 28856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B500 +A900 +A1E0 +2100 +31E0 +4900 +4100 +8100 +ENDCHAR +STARTCHAR U_70B9 +ENCODING 28857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07C0 +0400 +3F80 +2080 +2080 +3F80 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70BA +ENCODING 28858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +1400 +7F80 +0480 +0FC0 +1040 +3FE0 +4020 +AAA0 +2AA0 +0040 +ENDCHAR +STARTCHAR U_70BB +ENCODING 28859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +A900 +B100 +A200 +27E0 +2A20 +3220 +4A20 +43E0 +8220 +ENDCHAR +STARTCHAR U_70BC +ENCODING 28860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B780 +A280 +A7E0 +2080 +32C0 +4CA0 +44A0 +8180 +ENDCHAR +STARTCHAR U_70BD +ENCODING 28861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2C40 +B440 +A440 +A7C0 +2000 +3280 +4A40 +4420 +8820 +ENDCHAR +STARTCHAR U_70BE +ENCODING 28862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2C40 +B440 +A7C0 +A280 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70BF +ENCODING 28863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B640 +A540 +2FE0 +2440 +3440 +4C40 +4840 +90C0 +ENDCHAR +STARTCHAR U_70C0 +ENCODING 28864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +28A0 +B4A0 +A2C0 +AFE0 +2080 +2080 +5080 +4A80 +8100 +ENDCHAR +STARTCHAR U_70C1 +ENCODING 28865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2E00 +2900 +B900 +AFE0 +A100 +2100 +3540 +4920 +5120 +8300 +ENDCHAR +STARTCHAR U_70C2 +ENCODING 28866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +2A80 +B7E0 +A000 +A000 +23C0 +3000 +4800 +4800 +87E0 +ENDCHAR +STARTCHAR U_70C3 +ENCODING 28867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +2900 +B280 +AC60 +A000 +27C0 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_70C4 +ENCODING 28868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B280 +A440 +A8A0 +2480 +3300 +4B00 +4480 +8860 +ENDCHAR +STARTCHAR U_70C5 +ENCODING 28869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +2FE0 +BAA0 +AAA0 +AAA0 +2AA0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_70C6 +ENCODING 28870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +2800 +B3E0 +A440 +AC40 +2440 +3440 +4C40 +4440 +84C0 +ENDCHAR +STARTCHAR U_70C7 +ENCODING 28871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +B820 +A7C0 +A100 +27C0 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_70C8 +ENCODING 28872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2120 +3D20 +4920 +A920 +1120 +20E0 +C040 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_70C9 +ENCODING 28873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F00 +4200 +FFC0 +4A40 +5140 +0400 +4440 +2A80 +3180 +C060 +ENDCHAR +STARTCHAR U_70CA +ENCODING 28874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B100 +A100 +A7C0 +2100 +3100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_70CB +ENCODING 28875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +3FE0 +6100 +A380 +2540 +2920 +2100 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_70CC +ENCODING 28876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2880 +BBE0 +A880 +A9C0 +29C0 +5AA0 +4CA0 +8880 +0880 +ENDCHAR +STARTCHAR U_70CD +ENCODING 28877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +A7C0 +B900 +A100 +2FE0 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70CE +ENCODING 28878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +FFE0 +1100 +2100 +4500 +2440 +4480 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_70CF +ENCODING 28879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2000 +3FE0 +2000 +3FE0 +5520 +4AA0 +8040 +ENDCHAR +STARTCHAR U_70D0 +ENCODING 28880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B640 +A540 +2FE0 +2440 +3640 +4D40 +4840 +90C0 +ENDCHAR +STARTCHAR U_70D1 +ENCODING 28881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2AA0 +B6C0 +A280 +A6C0 +2AA0 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70D2 +ENCODING 28882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +B080 +A080 +A780 +2280 +3280 +4BA0 +4C60 +8020 +ENDCHAR +STARTCHAR U_70D3 +ENCODING 28883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +B100 +AFE0 +2000 +2100 +27C0 +5100 +4900 +87E0 +ENDCHAR +STARTCHAR U_70D4 +ENCODING 28884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_70D5 +ENCODING 28885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +7E40 +4A40 +6E80 +5900 +4D00 +52A0 +A460 +ENDCHAR +STARTCHAR U_70D6 +ENCODING 28886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +7A40 +1200 +FFE0 +1200 +5640 +5940 +9180 +29A0 +4660 +8C20 +ENDCHAR +STARTCHAR U_70D7 +ENCODING 28887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B200 +A440 +A780 +2120 +3240 +4C80 +4160 +8620 +ENDCHAR +STARTCHAR U_70D8 +ENCODING 28888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2A80 +B7C0 +A280 +A280 +2FE0 +3000 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_70D9 +ENCODING 28889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2A40 +B580 +A240 +AC20 +27C0 +3440 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_70DA +ENCODING 28890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2A80 +B440 +AFE0 +A000 +27C0 +3440 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_70DB +ENCODING 28891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B520 +A520 +2520 +27E0 +2100 +5120 +4FE0 +8020 +ENDCHAR +STARTCHAR U_70DC +ENCODING 28892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +2FC0 +B440 +A440 +A7C0 +2440 +3440 +4FC0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_70DD +ENCODING 28893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +F4C0 +1700 +2500 +5480 +8860 +7FC0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70DE +ENCODING 28894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2F80 +B280 +A6C0 +ABA0 +32A0 +2280 +5280 +4A80 +8280 +ENDCHAR +STARTCHAR U_70DF +ENCODING 28895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +2D20 +B7E0 +A520 +A520 +25A0 +3660 +4C20 +47E0 +8420 +ENDCHAR +STARTCHAR U_70E0 +ENCODING 28896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2A00 +B3C0 +A640 +ABC0 +2240 +23C0 +5240 +4A40 +82C0 +ENDCHAR +STARTCHAR U_70E1 +ENCODING 28897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4B00 +1100 +E0E0 +0900 +7FE0 +0900 +FFE0 +1080 +E060 +ENDCHAR +STARTCHAR U_70E2 +ENCODING 28898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +A8C0 +B700 +A100 +21E0 +2F00 +5100 +4920 +80E0 +ENDCHAR +STARTCHAR U_70E3 +ENCODING 28899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2FE0 +AA80 +B280 +A2A0 +25C0 +3480 +4940 +5240 +A420 +ENDCHAR +STARTCHAR U_70E4 +ENCODING 28900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27C0 +2A80 +B7E0 +A200 +A7E0 +2A00 +33C0 +4840 +4840 +8180 +ENDCHAR +STARTCHAR U_70E5 +ENCODING 28901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +2C80 +B7E0 +A420 +A420 +27E0 +3480 +4C80 +4480 +87E0 +ENDCHAR +STARTCHAR U_70E6 +ENCODING 28902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2A00 +B7C0 +A440 +A540 +2540 +2540 +5280 +5440 +8820 +ENDCHAR +STARTCHAR U_70E7 +ENCODING 28903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +22E0 +2F40 +B2A0 +A1A0 +AE60 +2000 +37E0 +4A80 +44A0 +8860 +ENDCHAR +STARTCHAR U_70E8 +ENCODING 28904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +2CC0 +B580 +A4A0 +A4E0 +2100 +37E0 +4900 +4100 +8100 +ENDCHAR +STARTCHAR U_70E9 +ENCODING 28905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2A80 +B440 +ABA0 +A000 +2FE0 +3100 +4A00 +4440 +8FE0 +ENDCHAR +STARTCHAR U_70EA +ENCODING 28906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +2FC0 +AA00 +B200 +AFE0 +2200 +2500 +5480 +4840 +9020 +ENDCHAR +STARTCHAR U_70EB +ENCODING 28907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +2100 +9FE0 +24A0 +C920 +52C0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_70EC +ENCODING 28908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +AFC0 +B480 +A440 +2920 +2880 +5200 +4980 +8080 +ENDCHAR +STARTCHAR U_70ED +ENCODING 28909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F780 +2280 +3280 +6680 +A380 +24A0 +6860 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70EE +ENCODING 28910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +1140 +3D40 +4940 +3040 +C4C0 +0400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_70EF +ENCODING 28911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4300 +5CC0 +E200 +DFE0 +C500 +4FE0 +5520 +6520 +9560 +8100 +ENDCHAR +STARTCHAR U_70F0 +ENCODING 28912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2D40 +B280 +A7C0 +A080 +2100 +2FE0 +5100 +4900 +8300 +ENDCHAR +STARTCHAR U_70F1 +ENCODING 28913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +BAA0 +AC60 +ABA0 +2AA0 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_70F2 +ENCODING 28914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +F280 +2480 +6880 +0400 +2480 +4B00 +3180 +C060 +ENDCHAR +STARTCHAR U_70F3 +ENCODING 28915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +27E0 +A900 +B7E0 +A520 +27E0 +2520 +57E0 +4D20 +8560 +ENDCHAR +STARTCHAR U_70F4 +ENCODING 28916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +2AA0 +B540 +A2A0 +A000 +27E0 +3080 +4880 +4080 +8FE0 +ENDCHAR +STARTCHAR U_70F5 +ENCODING 28917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +AC00 +B7E0 +A820 +2320 +20A0 +5020 +4940 +8080 +ENDCHAR +STARTCHAR U_70F6 +ENCODING 28918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +22C0 +B440 +AE40 +A2E0 +2240 +2240 +2DE0 +5400 +4A00 +91E0 +ENDCHAR +STARTCHAR U_70F7 +ENCODING 28919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2C20 +B3C0 +A000 +AFE0 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70F8 +ENCODING 28920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2800 +B7C0 +A540 +AFE0 +2540 +3540 +4FC0 +4040 +8180 +ENDCHAR +STARTCHAR U_70F9 +ENCODING 28921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +7FC0 +0300 +0400 +1C00 +5240 +8920 +ENDCHAR +STARTCHAR U_70FA +ENCODING 28922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2C40 +B7C0 +A440 +A7C0 +2520 +3540 +4C80 +4640 +8420 +ENDCHAR +STARTCHAR U_70FB +ENCODING 28923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C60 +25C0 +B440 +A560 +A940 +A540 +2540 +2DE0 +5400 +4B00 +90E0 +ENDCHAR +STARTCHAR U_70FC +ENCODING 28924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2A00 +B520 +A940 +A280 +25C0 +2AA0 +54A0 +4A80 +8100 +ENDCHAR +STARTCHAR U_70FD +ENCODING 28925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2440 +AB80 +B560 +AB80 +2100 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_70FE +ENCODING 28926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2440 +4A80 +3580 +C460 +2A80 +1180 +E460 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_70FF +ENCODING 28927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2540 +2D80 +B720 +A540 +AF80 +2500 +3520 +4D40 +4980 +9300 +ENDCHAR +STARTCHAR U_7100 +ENCODING 28928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2840 +2220 +B300 +A480 +2860 +2FC0 +2840 +5840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7101 +ENCODING 28929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7BE0 +4D40 +7A80 +0460 +0800 +4440 +2480 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7102 +ENCODING 28930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5440 +DA80 +5100 +56E0 +0400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_7103 +ENCODING 28931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +AFE0 +B280 +AAC0 +2AA0 +32A0 +4A80 +4480 +8980 +ENDCHAR +STARTCHAR U_7104 +ENCODING 28932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0840 +FFE0 +0840 +7FC0 +1000 +3FC0 +D040 +1FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7105 +ENCODING 28933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +27E0 +B500 +A900 +AFE0 +2000 +27C0 +5440 +4C40 +87C0 +ENDCHAR +STARTCHAR U_7106 +ENCODING 28934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +A800 +B7E0 +A420 +27E0 +3420 +4FE0 +4420 +8460 +ENDCHAR +STARTCHAR U_7107 +ENCODING 28935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +2AC0 +B7E0 +A420 +A7E0 +2420 +37E0 +4C20 +4420 +8460 +ENDCHAR +STARTCHAR U_7108 +ENCODING 28936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +4A40 +7BC0 +4220 +41E0 +8400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_7109 +ENCODING 28937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +2780 +2400 +FFE0 +2000 +3FC0 +2000 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_710A +ENCODING 28938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +27C0 +3100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_710B +ENCODING 28939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +7900 +0FE0 +F900 +4BC0 +4800 +8400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_710C +ENCODING 28940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +2FE0 +B240 +A520 +A9C0 +2240 +3680 +4900 +4280 +9C60 +ENDCHAR +STARTCHAR U_710D +ENCODING 28941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B120 +AFE0 +A900 +2FE0 +3320 +4D20 +4960 +9100 +ENDCHAR +STARTCHAR U_710E +ENCODING 28942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +7B00 +1600 +1BE0 +3240 +D240 +1440 +3840 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_710F +ENCODING 28943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0300 +75E0 +5420 +5540 +7480 +0540 +0E20 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_7110 +ENCODING 28944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FC0 +B240 +A240 +AFE0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_7111 +ENCODING 28945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2920 +2920 +7FE0 +ABA0 +2B60 +2D60 +5920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7112 +ENCODING 28946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +6C40 +77C0 +A000 +2FE0 +5820 +4820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_7113 +ENCODING 28947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2640 +A920 +B7C0 +A080 +2100 +37C0 +4C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_7114 +ENCODING 28948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +23C0 +2A40 +B480 +A900 +ABC0 +2A40 +2A40 +5BC0 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_7115 +ENCODING 28949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2780 +2900 +B7C0 +A540 +A540 +2FE0 +3100 +4A80 +4440 +9820 +ENDCHAR +STARTCHAR U_7116 +ENCODING 28950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2420 +B920 +A8A0 +AA20 +2AA0 +2E60 +2A20 +59E0 +4820 +88E0 +ENDCHAR +STARTCHAR U_7117 +ENCODING 28951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +B800 +AFE0 +A820 +2BA0 +2AA0 +5BA0 +48A0 +9040 +ENDCHAR +STARTCHAR U_7118 +ENCODING 28952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +3FC0 +4900 +8900 +0300 +5240 +8920 +ENDCHAR +STARTCHAR U_7119 +ENCODING 28953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2840 +B440 +A280 +AFE0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_711A +ENCODING 28954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2300 +7580 +A940 +2520 +0480 +2D00 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_711B +ENCODING 28955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +94A0 +A720 +8920 +B0A0 +8060 +ENDCHAR +STARTCHAR U_711C +ENCODING 28956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +24A0 +37C0 +4C80 +46A0 +8460 +ENDCHAR +STARTCHAR U_711D +ENCODING 28957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +27E0 +AC80 +B640 +A420 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_711E +ENCODING 28958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A800 +B7C0 +A440 +27C0 +2080 +37E0 +4900 +4100 +8300 +ENDCHAR +STARTCHAR U_711F +ENCODING 28959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2A80 +B280 +AFE0 +A000 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_7120 +ENCODING 28960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2C40 +B440 +AAA0 +A100 +2FE0 +2100 +5100 +4900 +8100 +ENDCHAR +STARTCHAR U_7121 +ENCODING 28961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +AA80 +2A80 +FFE0 +2A80 +2A80 +FFE0 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_7122 +ENCODING 28962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B240 +A420 +A820 +27C0 +2100 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7123 +ENCODING 28963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BC0 +7A40 +4A40 +7980 +4D80 +FA40 +0C20 +5240 +8920 +8920 +ENDCHAR +STARTCHAR U_7124 +ENCODING 28964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4840 +5FE0 +6A40 +4940 +8480 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7125 +ENCODING 28965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2820 +B400 +A6E0 +AAA0 +2AA0 +26E0 +5280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_7126 +ENCODING 28966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +7FE0 +A200 +3FC0 +2200 +3FC0 +2200 +3FE0 +5240 +8920 +ENDCHAR +STARTCHAR U_7127 +ENCODING 28967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2440 +BA60 +A480 +AFC0 +2020 +3240 +5520 +4C40 +8BC0 +ENDCHAR +STARTCHAR U_7128 +ENCODING 28968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2DA0 +B420 +A3C0 +A240 +23C0 +2240 +53C0 +4A40 +82C0 +ENDCHAR +STARTCHAR U_7129 +ENCODING 28969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +BEE0 +AAA0 +AAA0 +2EE0 +5AA0 +4AA0 +9B20 +2660 +ENDCHAR +STARTCHAR U_712A +ENCODING 28970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +B440 +ABE0 +A040 +27C0 +2400 +57E0 +4820 +80C0 +ENDCHAR +STARTCHAR U_712B +ENCODING 28971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +B100 +AFE0 +A920 +2920 +29A0 +5A60 +4C20 +8860 +ENDCHAR +STARTCHAR U_712C +ENCODING 28972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A200 +27E0 +2AA0 +5520 +4AA0 +8440 +ENDCHAR +STARTCHAR U_712D +ENCODING 28973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5540 +2A80 +4440 +7FE0 +4040 +9E80 +1200 +1240 +2240 +41C0 +ENDCHAR +STARTCHAR U_712E +ENCODING 28974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2880 +2FE0 +BB20 +AA40 +AA40 +2A40 +3A40 +4A40 +4AA0 +9120 +ENDCHAR +STARTCHAR U_712F +ENCODING 28975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2900 +B7E0 +A420 +A7E0 +2420 +37E0 +4900 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7130 +ENCODING 28976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AA40 +B480 +A800 +26E0 +2420 +26E0 +5420 +4C20 +87E0 +ENDCHAR +STARTCHAR U_7131 +ENCODING 28977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4480 +0A00 +3180 +C060 +1500 +5B40 +9580 +1100 +2A80 +C460 +ENDCHAR +STARTCHAR U_7132 +ENCODING 28978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA80 +B2E0 +A4A0 +ADA0 +3640 +2540 +5480 +4D40 +8620 +ENDCHAR +STARTCHAR U_7133 +ENCODING 28979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +2FE0 +B900 +AFC0 +A900 +2FC0 +5900 +4900 +4FE0 +8800 +ENDCHAR +STARTCHAR U_7134 +ENCODING 28980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFC0 +B000 +A7C0 +2440 +37C0 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_7135 +ENCODING 28981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4820 +DAA0 +EFE0 +C920 +4D60 +4D60 +6FE0 +9820 +8860 +ENDCHAR +STARTCHAR U_7136 +ENCODING 28982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +3240 +4FE0 +B200 +5500 +2500 +4880 +9060 +5240 +8920 +ENDCHAR +STARTCHAR U_7137 +ENCODING 28983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A940 +BFC0 +A940 +2FC0 +2200 +3500 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7138 +ENCODING 28984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0400 +1440 +6680 +0900 +30E0 +C040 +ENDCHAR +STARTCHAR U_7139 +ENCODING 28985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +BFE0 +A920 +AFE0 +2A20 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_713A +ENCODING 28986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +AFE0 +B420 +A7E0 +A140 +2640 +2240 +5FE0 +5240 +8440 +ENDCHAR +STARTCHAR U_713B +ENCODING 28987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +AC20 +B7E0 +A000 +27E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_713C +ENCODING 28988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +B440 +AFE0 +A440 +2FE0 +2280 +5280 +44A0 +9860 +ENDCHAR +STARTCHAR U_713D +ENCODING 28989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7CC0 +0000 +2480 +4500 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_713E +ENCODING 28990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2300 +2680 +B940 +B7E0 +A080 +2100 +3480 +4D20 +5440 +83C0 +ENDCHAR +STARTCHAR U_713F +ENCODING 28991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2900 +AFC0 +B940 +AFE0 +2940 +5FC0 +4900 +9280 +2C60 +ENDCHAR +STARTCHAR U_7140 +ENCODING 28992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +4FE0 +D880 +EAA0 +CAA0 +4BE0 +6880 +5AA0 +92A0 +A3E0 +ENDCHAR +STARTCHAR U_7141 +ENCODING 28993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +B3C0 +A240 +A3C0 +2240 +2FE0 +5540 +5620 +87E0 +ENDCHAR +STARTCHAR U_7142 +ENCODING 28994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B380 +A100 +A7C0 +2540 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7143 +ENCODING 28995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +B540 +ABA0 +2100 +2FE0 +2100 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7144 +ENCODING 28996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +B540 +A7C0 +A540 +27C0 +2100 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7145 +ENCODING 28997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +28A0 +AEA0 +B920 +A800 +2EE0 +28A0 +2EA0 +5840 +48A0 +8920 +ENDCHAR +STARTCHAR U_7146 +ENCODING 28998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +AD20 +B760 +A400 +27E0 +24A0 +27A0 +5440 +4CA0 +8520 +ENDCHAR +STARTCHAR U_7147 +ENCODING 28999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FE0 +B540 +A7C0 +2540 +27C0 +2100 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_7148 +ENCODING 29000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +AF40 +BA40 +AFC0 +AAC0 +2FC0 +2A40 +53C0 +AC60 +4020 +ENDCHAR +STARTCHAR U_7149 +ENCODING 29001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +BFE0 +AAA0 +A920 +2FE0 +2380 +5540 +4920 +9120 +ENDCHAR +STARTCHAR U_714A +ENCODING 29002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B000 +AFE0 +A000 +27C0 +2440 +57C0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_714B +ENCODING 29003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A500 +27C0 +2900 +57C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_714C +ENCODING 29004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B7C0 +A440 +AFE0 +2100 +27C0 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_714D +ENCODING 29005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2440 +2540 +BF60 +A540 +AC40 +3640 +2540 +5440 +4CA0 +8520 +ENDCHAR +STARTCHAR U_714E +ENCODING 29006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0000 +3D40 +2540 +3D40 +2540 +3D40 +24C0 +5240 +8920 +ENDCHAR +STARTCHAR U_714F +ENCODING 29007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +AFC0 +B440 +A7C0 +2000 +2FE0 +5920 +5FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7150 +ENCODING 29008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +B100 +A7C0 +A540 +2540 +2FE0 +5280 +4440 +8820 +ENDCHAR +STARTCHAR U_7151 +ENCODING 29009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +1080 +FF80 +2080 +3FC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7152 +ENCODING 29010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +AA40 +B7E0 +A440 +A7C0 +2080 +2FE0 +5480 +4FE0 +8080 +ENDCHAR +STARTCHAR U_7153 +ENCODING 29011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +AFE0 +B000 +AFE0 +2100 +2FE0 +2AA0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_7154 +ENCODING 29012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A480 +A8E0 +3080 +4880 +A7E0 +AA20 +7220 +3220 +4BE0 +8620 +ENDCHAR +STARTCHAR U_7155 +ENCODING 29013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8940 +AD40 +A5C0 +A500 +AD20 +8920 +FCE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_7156 +ENCODING 29014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +AAC0 +B7E0 +A100 +AFE0 +2200 +23E0 +5540 +4880 +9360 +ENDCHAR +STARTCHAR U_7157 +ENCODING 29015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +2FE0 +AAA0 +BAA0 +AAA0 +2140 +2FE0 +5280 +4440 +9820 +ENDCHAR +STARTCHAR U_7158 +ENCODING 29016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B880 +AFA0 +A8A0 +2EA0 +2AC0 +5EA0 +4960 +9220 +ENDCHAR +STARTCHAR U_7159 +ENCODING 29017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AAA0 +AFE0 +2100 +27C0 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_715A +ENCODING 29018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9440 +97C0 +F400 +07E0 +2440 +4A80 +1180 +E060 +ENDCHAR +STARTCHAR U_715B +ENCODING 29019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5AC0 +6B40 +5AC0 +6B40 +7BC0 +0400 +64C0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_715C +ENCODING 29020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A100 +2FE0 +2440 +5280 +4900 +8FE0 +ENDCHAR +STARTCHAR U_715D +ENCODING 29021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +AFE0 +B800 +ABE0 +AA20 +2BE0 +2A20 +5BE0 +4A20 +93E0 +ENDCHAR +STARTCHAR U_715E +ENCODING 29022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +49E0 +7E40 +8540 +7C80 +0540 +7E20 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_715F +ENCODING 29023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +AFE0 +B920 +AFE0 +2440 +27C0 +3440 +4FC0 +4440 +84C0 +ENDCHAR +STARTCHAR U_7160 +ENCODING 29024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +AD40 +B5C0 +A400 +A7E0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_7161 +ENCODING 29025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C80 +25E0 +ACA0 +B7E0 +A8A0 +27E0 +2480 +2FE0 +5480 +4A80 +B1E0 +ENDCHAR +STARTCHAR U_7162 +ENCODING 29026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +FFE0 +8020 +3F80 +08A0 +7FA0 +0860 +0820 +ENDCHAR +STARTCHAR U_7163 +ENCODING 29027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2940 +B080 +A7E0 +A2A0 +2D80 +2100 +37E0 +4B80 +4540 +8920 +ENDCHAR +STARTCHAR U_7164 +ENCODING 29028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +B7C0 +A440 +27C0 +2100 +3FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_7165 +ENCODING 29029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +B7E0 +A5A0 +A660 +2520 +2FE0 +5180 +5240 +8C20 +ENDCHAR +STARTCHAR U_7166 +ENCODING 29030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +77C0 +5840 +5740 +7540 +5740 +5040 +7140 +0080 +5220 +8920 +ENDCHAR +STARTCHAR U_7167 +ENCODING 29031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4A20 +7C40 +4BE0 +4A20 +7A20 +4BE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_7168 +ENCODING 29032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +A000 +2FE0 +2540 +5480 +4D40 +8620 +ENDCHAR +STARTCHAR U_7169 +ENCODING 29033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +27C0 +AC40 +B7C0 +A440 +27C0 +3440 +4FC0 +4440 +8820 +ENDCHAR +STARTCHAR U_716A +ENCODING 29034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B280 +AFE0 +AAA0 +2CE0 +2820 +5FE0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_716B +ENCODING 29035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2500 +2FE0 +B200 +A440 +AA80 +2580 +5B40 +4560 +9900 +0200 +ENDCHAR +STARTCHAR U_716C +ENCODING 29036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +A400 +27E0 +2AA0 +5520 +4220 +8CC0 +ENDCHAR +STARTCHAR U_716D +ENCODING 29037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +A940 +5540 +FD40 +2140 +3D40 +C840 +30C0 +C000 +5240 +8920 +ENDCHAR +STARTCHAR U_716E +ENCODING 29038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +4240 +4920 +8920 +ENDCHAR +STARTCHAR U_716F +ENCODING 29039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +A8C0 +BCA0 +A8E0 +2200 +2FC0 +5840 +4FC0 +8840 +0FC0 +ENDCHAR +STARTCHAR U_7170 +ENCODING 29040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AC40 +B7C0 +A000 +AEE0 +2AA0 +2AA0 +5AA0 +4EE0 +8AA0 +ENDCHAR +STARTCHAR U_7171 +ENCODING 29041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2F40 +B540 +AFE0 +A820 +2BA0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_7172 +ENCODING 29042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4FC0 +C200 +5FE0 +4A80 +5240 +0400 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7173 +ENCODING 29043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +AEA0 +B4E0 +A4A0 +AEA0 +2AE0 +2AA0 +5EA0 +4120 +8260 +ENDCHAR +STARTCHAR U_7174 +ENCODING 29044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +2FE0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7175 +ENCODING 29045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2200 +BFE0 +AAA0 +ABA0 +2920 +5BA0 +4920 +8920 +0860 +ENDCHAR +STARTCHAR U_7176 +ENCODING 29046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +AA40 +B3C0 +A000 +2FE0 +2100 +55C0 +4700 +88E0 +ENDCHAR +STARTCHAR U_7177 +ENCODING 29047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2240 +ABC0 +B000 +AFE0 +2820 +2380 +5280 +42A0 +8C60 +ENDCHAR +STARTCHAR U_7178 +ENCODING 29048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +AFE0 +A800 +AFE0 +2AA0 +2FE0 +5AA0 +4AA0 +9060 +ENDCHAR +STARTCHAR U_7179 +ENCODING 29049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +5480 +FFE0 +C200 +4FC0 +4A40 +4FC0 +6A40 +9FE0 +8840 +ENDCHAR +STARTCHAR U_717A +ENCODING 29050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2520 +A5E0 +B120 +ADE0 +25A0 +2540 +2520 +55A0 +4A00 +91E0 +ENDCHAR +STARTCHAR U_717B +ENCODING 29051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A940 +BFE0 +A940 +2FC0 +2900 +2FC0 +5C40 +5440 +A7C0 +ENDCHAR +STARTCHAR U_717C +ENCODING 29052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2AA0 +BFA0 +A2A0 +AC40 +2FE0 +5AA0 +4FA0 +82A0 +0C40 +ENDCHAR +STARTCHAR U_717D +ENCODING 29053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +BFE0 +A800 +AFE0 +2920 +2DA0 +5B60 +4DA0 +9360 +ENDCHAR +STARTCHAR U_717E +ENCODING 29054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A6C0 +27C0 +2200 +3540 +4C20 +5440 +83C0 +ENDCHAR +STARTCHAR U_717F +ENCODING 29055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2A40 +AFC0 +BA40 +AFC0 +2A40 +2FE0 +5480 +5280 +8180 +ENDCHAR +STARTCHAR U_7180 +ENCODING 29056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A920 +2540 +2FE0 +5280 +4CA0 +8860 +ENDCHAR +STARTCHAR U_7181 +ENCODING 29057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +A480 +BFE0 +AAA0 +B7E0 +2440 +27C0 +5440 +4FC0 +84C0 +ENDCHAR +STARTCHAR U_7182 +ENCODING 29058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A800 +BFC0 +AAC0 +2740 +2FC0 +2240 +5740 +4AA0 +9220 +ENDCHAR +STARTCHAR U_7183 +ENCODING 29059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FC0 +1280 +FD60 +57C0 +9240 +2480 +2440 +1A80 +3100 +C0E0 +ENDCHAR +STARTCHAR U_7184 +ENCODING 29060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +AC40 +B7C0 +A440 +A7C0 +2440 +37C0 +4D40 +54A0 +83A0 +ENDCHAR +STARTCHAR U_7185 +ENCODING 29061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AEC0 +B440 +A7C0 +A000 +2FE0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7186 +ENCODING 29062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +BFE0 +A240 +A7A0 +2000 +2FE0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7187 +ENCODING 29063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +B3C0 +A000 +A7E0 +2820 +2BA0 +5AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_7188 +ENCODING 29064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +54A0 +5EE0 +5280 +5E80 +54A0 +5E60 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7189 +ENCODING 29065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AFE0 +B420 +A7E0 +A420 +27E0 +2420 +57E0 +4A80 +8C60 +ENDCHAR +STARTCHAR U_718A +ENCODING 29066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +FB80 +0220 +7BE0 +4800 +7A40 +4B80 +7A20 +4BE0 +5240 +8920 +ENDCHAR +STARTCHAR U_718B +ENCODING 29067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +FD20 +48E0 +7900 +49C0 +7920 +4CE0 +2480 +4B00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_718C +ENCODING 29068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +5EE0 +EAA0 +CEE0 +C920 +4AA0 +6C60 +5820 +88A0 +0840 +ENDCHAR +STARTCHAR U_718D +ENCODING 29069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +6FC0 +7440 +A7C0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_718E +ENCODING 29070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +2A40 +B540 +A400 +A7C0 +2900 +37E0 +4900 +4540 +87C0 +ENDCHAR +STARTCHAR U_718F +ENCODING 29071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_7190 +ENCODING 29072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +AC40 +B7C0 +A440 +27C0 +2100 +5FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_7191 +ENCODING 29073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7FE0 +4500 +DFC0 +E540 +DFE0 +4540 +5FC0 +AD80 +9540 +2520 +ENDCHAR +STARTCHAR U_7192 +ENCODING 29074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +FFE0 +8420 +2440 +2480 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7193 +ENCODING 29075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2C40 +B7C0 +A400 +A7E0 +2400 +57E0 +5020 +4AA0 +8040 +ENDCHAR +STARTCHAR U_7194 +ENCODING 29076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B440 +A920 +A280 +2C60 +27C0 +5440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_7195 +ENCODING 29077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +27E0 +A800 +B7C0 +A440 +27C0 +3440 +4FC0 +4440 +8820 +ENDCHAR +STARTCHAR U_7196 +ENCODING 29078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2620 +2920 +7540 +6200 +A4E0 +2420 +36E0 +4C20 +47E0 +8420 +ENDCHAR +STARTCHAR U_7197 +ENCODING 29079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AD40 +B7E0 +A440 +A7C0 +2440 +27C0 +5A40 +4A40 +93C0 +ENDCHAR +STARTCHAR U_7198 +ENCODING 29080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2DE0 +A8A0 +BAA0 +ACA0 +A140 +2FE0 +2920 +5FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7199 +ENCODING 29081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4920 +5D20 +55E0 +5D00 +4920 +4920 +7EE0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_719A +ENCODING 29082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +A540 +2FE0 +2540 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_719B +ENCODING 29083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A000 +27C0 +3000 +4FE0 +4540 +8B20 +ENDCHAR +STARTCHAR U_719C +ENCODING 29084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A920 +BBA0 +AD20 +AAA0 +2FE0 +2540 +54A0 +4C60 +93C0 +ENDCHAR +STARTCHAR U_719D +ENCODING 29085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +BFE0 +AAA0 +AFE0 +2A80 +2BA0 +5AC0 +4BA0 +92E0 +ENDCHAR +STARTCHAR U_719E +ENCODING 29086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFA0 +B940 +AFA0 +AAA0 +2F00 +2100 +57C0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_719F +ENCODING 29087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +4BC0 +7940 +0340 +7D40 +1140 +FAA0 +3420 +4940 +8920 +ENDCHAR +STARTCHAR U_71A0 +ENCODING 29088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +ADA0 +B360 +A5A0 +A100 +27E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_71A1 +ENCODING 29089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFE0 +B540 +AFE0 +A920 +2FE0 +2240 +5480 +4B80 +8E60 +ENDCHAR +STARTCHAR U_71A2 +ENCODING 29090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +5680 +EB80 +C560 +D900 +4BC0 +6900 +9FE0 +8900 +17E0 +ENDCHAR +STARTCHAR U_71A3 +ENCODING 29091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +27E0 +B280 +A7E0 +AC80 +27E0 +3480 +4FE0 +4480 +87E0 +ENDCHAR +STARTCHAR U_71A4 +ENCODING 29092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +ADA0 +B360 +A5A0 +A220 +2100 +2FE0 +5440 +4A80 +8FE0 +ENDCHAR +STARTCHAR U_71A5 +ENCODING 29093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2540 +A880 +B3E0 +B2A0 +ABE0 +2AA0 +2BE0 +5AE0 +4E00 +91E0 +ENDCHAR +STARTCHAR U_71A6 +ENCODING 29094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2A60 +3380 +A500 +BFE0 +A900 +2FC0 +2900 +5FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_71A7 +ENCODING 29095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +46A0 +9900 +25E0 +6500 +ABE0 +3400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71A8 +ENCODING 29096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7E40 +5140 +9440 +B2C0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71A9 +ENCODING 29097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AC20 +B7E0 +A540 +A7E0 +26A0 +27E0 +5A00 +4A20 +91E0 +ENDCHAR +STARTCHAR U_71AA +ENCODING 29098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2CE0 +A520 +BEA0 +A440 +A680 +2DE0 +3520 +54A0 +4C40 +8580 +ENDCHAR +STARTCHAR U_71AB +ENCODING 29099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A40 +7A40 +6FE0 +AA40 +2BC0 +2800 +5540 +5AA0 +AAA0 +ENDCHAR +STARTCHAR U_71AC +ENCODING 29100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7D40 +1340 +FC80 +2540 +DA20 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_71AD +ENCODING 29101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BE0 +1100 +FBE0 +1100 +7FC0 +0040 +7FC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_71AE +ENCODING 29102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +2360 +ADA0 +B100 +A280 +2D60 +2280 +5140 +4080 +8700 +ENDCHAR +STARTCHAR U_71AF +ENCODING 29103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B100 +A7C0 +A540 +27C0 +2100 +5FE0 +4A80 +8C60 +ENDCHAR +STARTCHAR U_71B0 +ENCODING 29104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +BA40 +ABC0 +A800 +2EE0 +2AA0 +5EE0 +4800 +8FE0 +ENDCHAR +STARTCHAR U_71B1 +ENCODING 29105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23C0 +FD40 +5340 +A940 +FAE0 +2220 +FA40 +4920 +8920 +ENDCHAR +STARTCHAR U_71B2 +ENCODING 29106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +6880 +4BE0 +7A20 +27E0 +AA20 +B3E0 +A220 +33E0 +4940 +8620 +ENDCHAR +STARTCHAR U_71B3 +ENCODING 29107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +AAA0 +2FE0 +2440 +5280 +4900 +8EE0 +ENDCHAR +STARTCHAR U_71B4 +ENCODING 29108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +27E0 +AC40 +B7C0 +A440 +27C0 +24A0 +57C0 +4CA0 +86E0 +ENDCHAR +STARTCHAR U_71B5 +ENCODING 29109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +BFE0 +AAA0 +AC60 +2BA0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71B6 +ENCODING 29110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +2500 +27E0 +25A0 +5540 +4F40 +81A0 +ENDCHAR +STARTCHAR U_71B7 +ENCODING 29111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2920 +BB60 +AFE0 +A000 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_71B8 +ENCODING 29112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +B240 +A6C0 +AB60 +27C0 +2440 +57C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_71B9 +ENCODING 29113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +2080 +3F80 +0A00 +FFE0 +2080 +3F80 +5240 +8920 +ENDCHAR +STARTCHAR U_71BA +ENCODING 29114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +A440 +B7C0 +A280 +2FE0 +3000 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_71BB +ENCODING 29115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C60 +B7C0 +A440 +A7C0 +2000 +2EE0 +5AA0 +4660 +8AA0 +ENDCHAR +STARTCHAR U_71BC +ENCODING 29116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +2280 +2FE0 +2280 +5FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_71BD +ENCODING 29117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A140 +BFE0 +A540 +2FE0 +2920 +2FE0 +5920 +4DE0 +95A0 +ENDCHAR +STARTCHAR U_71BE +ENCODING 29118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +BAA0 +A480 +BFE0 +A080 +2EA0 +2AC0 +5E40 +4AA0 +8F20 +ENDCHAR +STARTCHAR U_71BF +ENCODING 29119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFE0 +A100 +A7C0 +2540 +27C0 +5540 +47C0 +8820 +ENDCHAR +STARTCHAR U_71C0 +ENCODING 29120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AFE0 +B540 +A7C0 +A540 +27C0 +2100 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_71C1 +ENCODING 29121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFE0 +A540 +AFE0 +2540 +2FE0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_71C2 +ENCODING 29122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A440 +27C0 +2440 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_71C3 +ENCODING 29123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EC0 +AAA0 +B7E0 +AA80 +A540 +2A20 +2000 +5540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_71C4 +ENCODING 29124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +4AC0 +9080 +2140 +DAA0 +8AA0 +DEC0 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_71C5 +ENCODING 29125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +7EC0 +1280 +FD40 +2AA0 +4480 +91A0 +7EC0 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_71C6 +ENCODING 29126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +AFE0 +B840 +A7A0 +A480 +2FE0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71C7 +ENCODING 29127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +AA80 +B7E0 +A520 +26A0 +27E0 +2080 +5FE0 +4880 +8580 +ENDCHAR +STARTCHAR U_71C8 +ENCODING 29128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2B40 +AC80 +B7C0 +A820 +37C0 +2440 +27C0 +5280 +4900 +8FE0 +ENDCHAR +STARTCHAR U_71C9 +ENCODING 29129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +AAE0 +BFA0 +A0A0 +2EA0 +22A0 +24A0 +5E40 +44A0 +8D20 +ENDCHAR +STARTCHAR U_71CA +ENCODING 29130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1700 +2400 +1B80 +2080 +BAE0 +A280 +5140 +8420 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_71CB +ENCODING 29131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2FE0 +B500 +AFC0 +A500 +27C0 +2500 +37E0 +4D40 +8AA0 +ENDCHAR +STARTCHAR U_71CC +ENCODING 29132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +AFE0 +B440 +A7C0 +2440 +37C0 +4C40 +47C0 +8C60 +ENDCHAR +STARTCHAR U_71CD +ENCODING 29133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +7FE0 +5500 +DD00 +F5E0 +DD40 +5540 +5F40 +B540 +9240 +2440 +ENDCHAR +STARTCHAR U_71CE +ENCODING 29134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +37C0 +2440 +27C0 +5540 +4920 +9320 +ENDCHAR +STARTCHAR U_71CF +ENCODING 29135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +AFE0 +B520 +A900 +AFE0 +2AA0 +2FE0 +5AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_71D0 +ENCODING 29136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +B940 +A520 +2F40 +2940 +25E0 +5340 +45E0 +8840 +ENDCHAR +STARTCHAR U_71D1 +ENCODING 29137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2480 +BFE0 +AA40 +AA40 +2FC0 +3200 +4FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_71D2 +ENCODING 29138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +BFE0 +A440 +2EE0 +2440 +2FE0 +5180 +42A0 +8C60 +ENDCHAR +STARTCHAR U_71D3 +ENCODING 29139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2440 +FBE0 +7A40 +A4E0 +2B40 +0400 +64C0 +0B00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_71D4 +ENCODING 29140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +A540 +BFE0 +A540 +A920 +27C0 +2540 +57C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_71D5 +ENCODING 29141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2E80 +20A0 +EEC0 +2AA0 +EEE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_71D6 +ENCODING 29142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A7C0 +B040 +AFE0 +A4A0 +2EE0 +2040 +5FE0 +4A40 +81C0 +ENDCHAR +STARTCHAR U_71D7 +ENCODING 29143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +BAA0 +AFE0 +AAA0 +2BA0 +2AA0 +5BA0 +4CA0 +8860 +ENDCHAR +STARTCHAR U_71D8 +ENCODING 29144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5920 +4AA0 +8C60 +ENDCHAR +STARTCHAR U_71D9 +ENCODING 29145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +AA40 +4940 +2FE0 +D4A0 +4920 +4240 +1440 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_71DA +ENCODING 29146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55A0 +5AC0 +9080 +2D40 +D220 +1080 +55A0 +5AC0 +9080 +2940 +C620 +ENDCHAR +STARTCHAR U_71DB +ENCODING 29147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +FBE0 +8A20 +FBE0 +2A80 +FBE0 +2440 +2A80 +5100 +E0E0 +ENDCHAR +STARTCHAR U_71DC +ENCODING 29148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2A20 +2EE0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71DD +ENCODING 29149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +AC40 +B7C0 +A100 +2FE0 +2440 +57C0 +4540 +8B20 +ENDCHAR +STARTCHAR U_71DE +ENCODING 29150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7DE0 +D2A0 +7C80 +5080 +7D40 +5240 +7C20 +4000 +5240 +8920 +ENDCHAR +STARTCHAR U_71DF +ENCODING 29151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5AC0 +5480 +A940 +4620 +FFE0 +90A0 +1F80 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_71E0 +ENCODING 29152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +AD60 +BBA0 +A920 +AFE0 +2BA0 +2D60 +5FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_71E1 +ENCODING 29153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +AFE0 +2280 +2100 +2FE0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_71E2 +ENCODING 29154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64C0 +4A40 +75C0 +4A40 +75C0 +4A40 +FFE0 +94A0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_71E3 +ENCODING 29155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +D740 +F040 +DFC0 +4200 +7FE0 +5700 +8A80 +1260 +ENDCHAR +STARTCHAR U_71E4 +ENCODING 29156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B7C0 +A540 +A7C0 +2540 +2FE0 +2920 +5BA0 +8860 +ENDCHAR +STARTCHAR U_71E5 +ENCODING 29157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFE0 +BAA0 +AAA0 +AEE0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_71E6 +ENCODING 29158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +24A0 +BF40 +AAA0 +A500 +A920 +2540 +2FE0 +5380 +4D40 +8920 +ENDCHAR +STARTCHAR U_71E7 +ENCODING 29159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +A500 +B280 +A1A0 +BEC0 +25A0 +26A0 +5580 +4A00 +91E0 +ENDCHAR +STARTCHAR U_71E8 +ENCODING 29160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A900 +B7C0 +A100 +2FE0 +32A0 +2FE0 +52A0 +4A40 +86A0 +ENDCHAR +STARTCHAR U_71E9 +ENCODING 29161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +BAE0 +AEA0 +AB20 +2EA0 +2440 +3F40 +4A40 +4AA0 +9520 +ENDCHAR +STARTCHAR U_71EA +ENCODING 29162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +BFE0 +AAA0 +B7A0 +29A0 +2640 +5520 +5440 +83C0 +ENDCHAR +STARTCHAR U_71EB +ENCODING 29163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +5500 +FFC0 +D540 +DFE0 +5540 +7FC0 +9580 +AD40 +5520 +ENDCHAR +STARTCHAR U_71EC +ENCODING 29164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2B40 +B940 +AF20 +A900 +AFE0 +20A0 +2EA0 +5440 +46C0 +9920 +ENDCHAR +STARTCHAR U_71ED +ENCODING 29165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B400 +AFE0 +A220 +2FA0 +3AA0 +4FA0 +42A0 +8F40 +ENDCHAR +STARTCHAR U_71EE +ENCODING 29166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AF40 +B160 +AF40 +2040 +5EA0 +8B20 +7FC0 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_71EF +ENCODING 29167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +2FE0 +B920 +A540 +A920 +2280 +2560 +5FC0 +5280 +8100 +ENDCHAR +STARTCHAR U_71F0 +ENCODING 29168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +AFE0 +BA20 +AD40 +A7A0 +2400 +27C0 +5C80 +4300 +8CE0 +ENDCHAR +STARTCHAR U_71F1 +ENCODING 29169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +BFE0 +A440 +A7C0 +2440 +27C0 +5540 +4CA0 +9380 +ENDCHAR +STARTCHAR U_71F2 +ENCODING 29170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A240 +BFE0 +AAA0 +AFE0 +2840 +2FC0 +5840 +4FC0 +9860 +ENDCHAR +STARTCHAR U_71F3 +ENCODING 29171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5DE0 +54A0 +F5A0 +DE40 +D5E0 +5520 +5DE0 +7000 +9540 +A4A0 +ENDCHAR +STARTCHAR U_71F4 +ENCODING 29172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A7C0 +B820 +AFE0 +AAA0 +2FE0 +2440 +57C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_71F5 +ENCODING 29173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2BE0 +B480 +A7E0 +A140 +3BE0 +2880 +3BE0 +4880 +5480 +A3E0 +ENDCHAR +STARTCHAR U_71F6 +ENCODING 29174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +BFE0 +AAA0 +2FE0 +2800 +3FE0 +4D40 +5480 +A660 +ENDCHAR +STARTCHAR U_71F7 +ENCODING 29175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BBA0 +AFE0 +2000 +27C0 +3000 +4FE0 +4540 +8B20 +ENDCHAR +STARTCHAR U_71F8 +ENCODING 29176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AFE0 +B920 +A280 +AFE0 +2200 +2FE0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_71F9 +ENCODING 29177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2900 +52A0 +B9C0 +56A0 +90A0 +3580 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71FA +ENCODING 29178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +BAA0 +ABA0 +2920 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_71FB +ENCODING 29179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +AFE0 +BAA0 +AFE0 +A100 +27C0 +2100 +5FE0 +4540 +8AA0 +ENDCHAR +STARTCHAR U_71FC +ENCODING 29180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A140 +B7E0 +A140 +AFE0 +2540 +2AA0 +5FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_71FD +ENCODING 29181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B900 +A7E0 +A120 +AFC0 +2020 +2FE0 +5B20 +4EA0 +8060 +ENDCHAR +STARTCHAR U_71FE +ENCODING 29182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FE0 +0420 +7FE0 +0080 +7FC0 +4A80 +7AC0 +8920 +ENDCHAR +STARTCHAR U_71FF +ENCODING 29183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +AB60 +B4A0 +A7E0 +A480 +2FC0 +2480 +57C0 +4C80 +87E0 +ENDCHAR +STARTCHAR U_7200 +ENCODING 29184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5DC0 +6880 +FFE0 +D540 +7740 +5560 +5760 +B540 +9540 +2EC0 +ENDCHAR +STARTCHAR U_7201 +ENCODING 29185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +AF60 +B940 +AF40 +AAA0 +2F00 +2000 +57C0 +4540 +9FE0 +ENDCHAR +STARTCHAR U_7202 +ENCODING 29186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DF60 +9120 +DF60 +9120 +DF60 +9520 +FFE0 +A4A0 +4500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7203 +ENCODING 29187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2B60 +AA40 +B5A0 +A920 +AFE0 +2920 +27C0 +5380 +4D40 +8920 +ENDCHAR +STARTCHAR U_7204 +ENCODING 29188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5280 +5FE0 +F540 +D7C0 +D540 +57C0 +7FE0 +5960 +AFE0 +4820 +ENDCHAR +STARTCHAR U_7205 +ENCODING 29189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +A7C0 +A100 +2FE0 +2AA0 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7206 +ENCODING 29190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A440 +AFE0 +A280 +3FE0 +2540 +5BA0 +4540 +8920 +ENDCHAR +STARTCHAR U_7207 +ENCODING 29191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5140 +8B40 +F9C0 +2220 +FC20 +5240 +8920 +ENDCHAR +STARTCHAR U_7208 +ENCODING 29192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +A920 +BFC0 +A920 +2FE0 +2940 +5FC0 +4A60 +95C0 +ENDCHAR +STARTCHAR U_7209 +ENCODING 29193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +A540 +BFC0 +AD40 +2AC0 +2FC0 +2A80 +5F80 +4AA0 +8F60 +ENDCHAR +STARTCHAR U_720A +ENCODING 29194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BFE0 +AA80 +ABE0 +2A80 +2BE0 +5940 +4AA0 +92A0 +ENDCHAR +STARTCHAR U_720B +ENCODING 29195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2480 +AFE0 +B4A0 +AFA0 +24A0 +2FA0 +24A0 +5FA0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_720C +ENCODING 29196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +BFE0 +AA40 +AFE0 +2AA0 +2BE0 +5AA0 +4BE0 +9620 +ENDCHAR +STARTCHAR U_720D +ENCODING 29197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +A6A0 +BBC0 +AAA0 +AFE0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_720E +ENCODING 29198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5120 +DFE0 +EAA0 +C440 +4FE0 +6440 +57C0 +9540 +8B20 +ENDCHAR +STARTCHAR U_720F +ENCODING 29199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +5D80 +F480 +DFE0 +D5C0 +5EA0 +7100 +95C0 +A500 +4FE0 +ENDCHAR +STARTCHAR U_7210 +ENCODING 29200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFE0 +AD40 +2FC0 +2D40 +4FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_7211 +ENCODING 29201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2340 +77E0 +6C80 +B7E0 +2480 +27E0 +5480 +4FE0 +8AA0 +ENDCHAR +STARTCHAR U_7212 +ENCODING 29202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +AAA0 +57C0 +6C60 +A7C0 +3440 +A7C0 +3540 +4920 +8300 +ENDCHAR +STARTCHAR U_7213 +ENCODING 29203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +A920 +AEE0 +2C60 +2EE0 +5C60 +4FE0 +8820 +ENDCHAR +STARTCHAR U_7214 +ENCODING 29204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B100 +AFE0 +A480 +BFE0 +2E80 +34A0 +5E40 +42A0 +8F20 +ENDCHAR +STARTCHAR U_7215 +ENCODING 29205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AEA0 +B1C0 +2E80 +5B40 +8E20 +2480 +2500 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7216 +ENCODING 29206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5F00 +55E0 +FE20 +C1E0 +5D00 +55C0 +5D00 +75C0 +9D20 +94E0 +ENDCHAR +STARTCHAR U_7217 +ENCODING 29207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +A540 +B7C0 +A280 +2FE0 +2540 +2FE0 +5540 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7218 +ENCODING 29208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +24E0 +2EA0 +BA40 +A5A0 +BA40 +2FE0 +2540 +57C0 +44A0 +8660 +ENDCHAR +STARTCHAR U_7219 +ENCODING 29209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BEE0 +A280 +AFE0 +2280 +2FE0 +56A0 +4A40 +8720 +ENDCHAR +STARTCHAR U_721A +ENCODING 29210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B7A0 +A000 +A7C0 +2540 +2FE0 +5AA0 +4FE0 +8AA0 +ENDCHAR +STARTCHAR U_721B +ENCODING 29211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5FE0 +4BA0 +8D60 +ENDCHAR +STARTCHAR U_721C +ENCODING 29212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +B280 +AFE0 +A200 +3FE0 +2AA0 +5E40 +4AC0 +9F20 +ENDCHAR +STARTCHAR U_721D +ENCODING 29213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +AFE0 +BAA0 +AFE0 +A920 +2F20 +29E0 +5F20 +4AA0 +8EE0 +ENDCHAR +STARTCHAR U_721E +ENCODING 29214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A520 +B7E0 +A140 +AFE0 +2AA0 +2AA0 +5FE0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_721F +ENCODING 29215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A480 +BEE0 +AAA0 +AEE0 +2FE0 +2900 +5FE0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7220 +ENCODING 29216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AEE0 +2500 +2FE0 +3480 +4FC0 +4480 +87E0 +ENDCHAR +STARTCHAR U_7221 +ENCODING 29217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A540 +B7C0 +A540 +2FE0 +2920 +2540 +57C0 +4140 +8FE0 +ENDCHAR +STARTCHAR U_7222 +ENCODING 29218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4AA0 +7DE0 +4500 +7DE0 +4500 +BDE0 +A4A0 +ENDCHAR +STARTCHAR U_7223 +ENCODING 29219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +BAA0 +AFE0 +AAA0 +2FE0 +2100 +5FE0 +4540 +8AA0 +ENDCHAR +STARTCHAR U_7224 +ENCODING 29220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +AEE0 +BAA0 +AFE0 +2920 +2FE0 +5BA0 +4D60 +8920 +ENDCHAR +STARTCHAR U_7225 +ENCODING 29221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2FE0 +2D40 +7B80 +6D40 +AFE0 +2AA0 +3FE0 +4920 +97A0 +2040 +ENDCHAR +STARTCHAR U_7226 +ENCODING 29222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +BFA0 +AAA0 +AFE0 +A440 +27C0 +2440 +57C0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_7227 +ENCODING 29223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AFE0 +B920 +A280 +AFE0 +2AA0 +2FE0 +5540 +4920 +9FE0 +ENDCHAR +STARTCHAR U_7228 +ENCODING 29224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FC0 +4B40 +FFE0 +9120 +7FC0 +5540 +FFE0 +2480 +D560 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7229 +ENCODING 29225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +2B40 +BDE0 +AB40 +AFE0 +3560 +3B80 +3540 +5FA0 +5940 +8E80 +ENDCHAR +STARTCHAR U_722A +ENCODING 29226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +3F80 +2480 +2480 +2480 +2480 +2480 +2480 +4440 +4440 +8420 +ENDCHAR +STARTCHAR U_722B +ENCODING 29227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +00E0 +0700 +F840 +4840 +2480 +2500 +ENDCHAR +STARTCHAR U_722C +ENCODING 29228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +EAA0 +AAA0 +ABE0 +AA00 +AA20 +AA20 +A5E0 +A400 +A300 +A0E0 +ENDCHAR +STARTCHAR U_722D +ENCODING 29229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2440 +1280 +3FC0 +0440 +FFE0 +0440 +7FC0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_722E +ENCODING 29230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1BC0 +EC40 +ABC0 +AAC0 +ABC0 +AA40 +AAA0 +ABE0 +A400 +A3E0 +ENDCHAR +STARTCHAR U_722F +ENCODING 29231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7E40 +1280 +3FC0 +2440 +3FC0 +2440 +FFE0 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_7230 +ENCODING 29232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2440 +1280 +7FC0 +0800 +FFE0 +1000 +1F80 +2880 +4700 +B8E0 +ENDCHAR +STARTCHAR U_7231 +ENCODING 29233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F40 +2480 +FFE0 +8420 +7FC0 +0800 +1F80 +2900 +CE00 +31E0 +ENDCHAR +STARTCHAR U_7232 +ENCODING 29234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +1500 +3F80 +2080 +3FC0 +2040 +3FE0 +4020 +B520 +4AC0 +ENDCHAR +STARTCHAR U_7233 +ENCODING 29235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +1500 +3F80 +2080 +7FE0 +AAA0 +7FC0 +0180 +0600 +1400 +0800 +ENDCHAR +STARTCHAR U_7234 +ENCODING 29236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +FF40 +9540 +FD40 +9540 +F540 +AD40 +ED40 +9540 +FD20 +0820 +ENDCHAR +STARTCHAR U_7235 +ENCODING 29237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +4900 +FF80 +A480 +FF80 +8880 +FFC0 +8A80 +FA80 +9080 +F980 +ENDCHAR +STARTCHAR U_7236 +ENCODING 29238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4040 +9140 +1100 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7237 +ENCODING 29239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +5140 +0E00 +3180 +C060 +3F80 +0880 +0A80 +0900 +0800 +ENDCHAR +STARTCHAR U_7238 +ENCODING 29240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3180 +4A40 +0400 +1B00 +E0E0 +3F80 +2480 +3FA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7239 +ENCODING 29241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +CA60 +0E00 +35E0 +CF00 +3A00 +0500 +0FC0 +3480 +0300 +7C00 +ENDCHAR +STARTCHAR U_723A +ENCODING 29242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +4E40 +F1E0 +0000 +FBE0 +4A20 +7AC0 +4A20 +7B20 +4EC0 +FA00 +ENDCHAR +STARTCHAR U_723B +ENCODING 29243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +6100 +1A00 +0600 +1900 +E280 +2200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_723C +ENCODING 29244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +5240 +3240 +4BC0 +8240 +0A40 +4A40 +53C0 +3240 +4A40 +8FE0 +ENDCHAR +STARTCHAR U_723D +ENCODING 29245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +5540 +2480 +5540 +2480 +5540 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_723E +ENCODING 29246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +7FC0 +C460 +6EC0 +5540 +6EC0 +5540 +6EC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_723F +ENCODING 29247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +11 +11 +11 +1F +01 +FF +11 +11 +11 +21 +C1 +ENDCHAR +STARTCHAR U_7240 +ENCODING 29248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +5FE0 +7200 +1300 +F680 +5680 +5A40 +5260 +9200 +1200 +ENDCHAR +STARTCHAR U_7241 +ENCODING 29249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5040 +5040 +7740 +1540 +1540 +F740 +5540 +5040 +5140 +9080 +ENDCHAR +STARTCHAR U_7242 +ENCODING 29250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +5280 +5FE0 +7100 +1100 +17C0 +F100 +5FE0 +5100 +5100 +9100 +ENDCHAR +STARTCHAR U_7243 +ENCODING 29251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +5FE0 +5540 +75C0 +1400 +F7E0 +5100 +5FE0 +5380 +9D60 +1100 +ENDCHAR +STARTCHAR U_7244 +ENCODING 29252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +5240 +5520 +7FC0 +1440 +F7C0 +5440 +57E0 +5620 +5BE0 +9220 +ENDCHAR +STARTCHAR U_7245 +ENCODING 29253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +A940 +EFE0 +2940 +EFC0 +AD40 +AFC0 +AD40 +37C0 +2540 +ENDCHAR +STARTCHAR U_7246 +ENCODING 29254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A540 +EBA0 +2FE0 +E000 +AFE0 +AAA0 +ABA0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_7247 +ENCODING 29255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +3FE0 +2000 +2000 +3F80 +2080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_7248 +ENCODING 29256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5400 +7FE0 +4640 +4540 +7540 +5480 +5480 +9540 +9A20 +ENDCHAR +STARTCHAR U_7249 +ENCODING 29257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5520 +5340 +7900 +47E0 +7100 +5100 +5FE0 +5100 +5100 +9100 +ENDCHAR +STARTCHAR U_724A +ENCODING 29258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5120 +5120 +7920 +42E0 +4400 +7BE0 +4A20 +4A20 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_724B +ENCODING 29259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +53E0 +5680 +7B20 +45E0 +4280 +73E0 +5E40 +5180 +5320 +9CE0 +ENDCHAR +STARTCHAR U_724C +ENCODING 29260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57E0 +5520 +7FE0 +4520 +77E0 +5280 +5FE0 +5080 +9080 +9080 +ENDCHAR +STARTCHAR U_724D +ENCODING 29261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57E0 +5100 +7FE0 +44A0 +4A80 +7480 +5FE0 +5100 +5280 +9C60 +ENDCHAR +STARTCHAR U_724E +ENCODING 29262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7C0 +A540 +AD40 +F2C0 +8D40 +E280 +A040 +AD20 +B440 +23C0 +ENDCHAR +STARTCHAR U_724F +ENCODING 29263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +A280 +A440 +FBA0 +8000 +8EA0 +EAA0 +AEA0 +AAA0 +AE20 +AA60 +ENDCHAR +STARTCHAR U_7250 +ENCODING 29264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +A700 +A100 +AFE0 +F100 +8300 +ED60 +A920 +AF60 +A920 +AFE0 +ENDCHAR +STARTCHAR U_7251 +ENCODING 29265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +A840 +EFC0 +8800 +EFE0 +AAA0 +AFE0 +AAA0 +B2A0 +2240 +ENDCHAR +STARTCHAR U_7252 +ENCODING 29266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +AFE0 +A540 +F5C0 +8400 +87E0 +E100 +AFE0 +A540 +A920 +A920 +ENDCHAR +STARTCHAR U_7253 +ENCODING 29267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A280 +FFE0 +8920 +EFE0 +A200 +A3C0 +A240 +A440 +A980 +ENDCHAR +STARTCHAR U_7254 +ENCODING 29268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5FE0 +5540 +77C0 +4540 +77C0 +5540 +5FE0 +5240 +5040 +9080 +ENDCHAR +STARTCHAR U_7255 +ENCODING 29269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57C0 +5540 +76C0 +4540 +7640 +57C0 +5240 +5D20 +5440 +93C0 +ENDCHAR +STARTCHAR U_7256 +ENCODING 29270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A820 +FFE0 +8940 +EFE0 +A920 +AFE0 +A920 +AFE0 +B160 +ENDCHAR +STARTCHAR U_7257 +ENCODING 29271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A940 +EFE0 +8940 +EFE0 +AAA0 +ABE0 +AAA0 +ABE0 +32A0 +ENDCHAR +STARTCHAR U_7258 +ENCODING 29272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5FE0 +5100 +7FE0 +4AA0 +4FE0 +7440 +57C0 +5440 +57C0 +9C60 +ENDCHAR +STARTCHAR U_7259 +ENCODING 29273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0100 +1100 +2100 +7FE0 +0300 +0500 +0900 +1100 +E100 +0300 +ENDCHAR +STARTCHAR U_725A +ENCODING 29274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +A0A0 +3F80 +0000 +7FC0 +2100 +7FE0 +1100 +E700 +ENDCHAR +STARTCHAR U_725B +ENCODING 29275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2400 +2400 +7F80 +8400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_725C +ENCODING 29276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 0 -1 +BITMAP +08 +48 +7E +48 +8A +0C +38 +E8 +48 +08 +08 +ENDCHAR +STARTCHAR U_725D +ENCODING 29277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5120 +7D40 +9180 +1D00 +3100 +D100 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_725E +ENCODING 29278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +53E0 +7D20 +9120 +1920 +3120 +D120 +1220 +1420 +18C0 +ENDCHAR +STARTCHAR U_725F +ENCODING 29279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +3FC0 +0200 +2200 +3FC0 +4200 +0200 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_7260 +ENCODING 29280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A2A0 +A2E0 +FBA0 +A6A0 +32A0 +62E0 +A280 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7261 +ENCODING 29281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +5080 +7880 +93E0 +1880 +3080 +D080 +1080 +17E0 +1000 +ENDCHAR +STARTCHAR U_7262 +ENCODING 29282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8440 +2400 +3F80 +4400 +8400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7263 +ENCODING 29283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5120 +5120 +7D20 +9520 +1D20 +3120 +5120 +1220 +1520 +18C0 +ENDCHAR +STARTCHAR U_7264 +ENCODING 29284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A100 +A100 +FFE0 +2400 +3400 +E400 +2400 +2400 +27C0 +2000 +ENDCHAR +STARTCHAR U_7265 +ENCODING 29285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +57E0 +7A00 +53C0 +9A40 +3240 +D440 +1440 +1940 +1080 +ENDCHAR +STARTCHAR U_7266 +ENCODING 29286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5100 +79E0 +9700 +1900 +31E0 +5700 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_7267 +ENCODING 29287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +53E0 +7A40 +9640 +1A40 +3140 +D140 +1080 +1140 +1620 +ENDCHAR +STARTCHAR U_7268 +ENCODING 29288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +57E0 +7800 +9380 +1A80 +3280 +D280 +12A0 +14A0 +1860 +ENDCHAR +STARTCHAR U_7269 +ENCODING 29289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A200 +A7E0 +FAA0 +A2A0 +32A0 +64A0 +A920 +2220 +2520 +28C0 +ENDCHAR +STARTCHAR U_726A +ENCODING 29290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +7BE0 +9480 +1880 +37E0 +5080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_726B +ENCODING 29291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5240 +52E0 +7F00 +9240 +1A40 +3140 +D180 +11A0 +1660 +1020 +ENDCHAR +STARTCHAR U_726C +ENCODING 29292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +51C0 +5700 +7D00 +97E0 +1920 +3120 +5320 +15C0 +1900 +1100 +ENDCHAR +STARTCHAR U_726D +ENCODING 29293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +6FE0 +6AA0 +7AA0 +AAA0 +3AA0 +EAE0 +2C20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_726E +ENCODING 29294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +7FE0 +A100 +22A0 +1260 +1F80 +2200 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_726F +ENCODING 29295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +5080 +7FE0 +9080 +1080 +1BE0 +7220 +1220 +13E0 +1220 +ENDCHAR +STARTCHAR U_7270 +ENCODING 29296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A080 +A7E0 +FCA0 +A4A0 +2CA0 +37E0 +E4A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_7271 +ENCODING 29297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A040 +F740 +A540 +B540 +6740 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_7272 +ENCODING 29298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A280 +A280 +FBE0 +A480 +3880 +63C0 +A080 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7273 +ENCODING 29299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A540 +FD40 +AFE0 +3840 +6940 +A940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_7274 +ENCODING 29300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +A780 +A480 +FC80 +A7E0 +3480 +E480 +2480 +24A0 +2760 +2CA0 +ENDCHAR +STARTCHAR U_7275 +ENCODING 29301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FFE0 +A420 +3FC0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7276 +ENCODING 29302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +5440 +9FA0 +2400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7277 +ENCODING 29303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5280 +5440 +7C20 +9380 +1900 +3100 +57C0 +1100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_7278 +ENCODING 29304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A820 +F7C0 +A080 +2100 +3FE0 +E100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_7279 +ENCODING 29305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7C0 +F100 +A100 +AFE0 +3080 +6FE0 +A480 +2280 +2080 +2380 +ENDCHAR +STARTCHAR U_727A +ENCODING 29306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A280 +A280 +FFE0 +AAA0 +2AA0 +3AA0 +ECE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_727B +ENCODING 29307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2440 +AFE0 +F540 +A580 +2740 +35A0 +E740 +2980 +2920 +36E0 +ENDCHAR +STARTCHAR U_727C +ENCODING 29308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A540 +A540 +FA80 +AA80 +3540 +6540 +AFC0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_727D +ENCODING 29309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +FFE0 +8920 +BFA0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_727E +ENCODING 29310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +AFC0 +F240 +AFE0 +2000 +37C0 +E440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_727F +ENCODING 29311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +A500 +AFC0 +F100 +AFE0 +3000 +67E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7280 +ENCODING 29312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5280 +4B00 +72C0 +4A00 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_7281 +ENCODING 29313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +1120 +3820 +54E0 +A200 +3FC0 +4200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7282 +ENCODING 29314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +73E0 +12A0 +7CA0 +3920 +D6A0 +2240 +3FC0 +4200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_7283 +ENCODING 29315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57C0 +7840 +5440 +9280 +1FE0 +3000 +D7C0 +1440 +1440 +17C0 +ENDCHAR +STARTCHAR U_7284 +ENCODING 29316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A280 +F440 +AFE0 +3040 +6740 +A540 +2740 +2040 +21C0 +ENDCHAR +STARTCHAR U_7285 +ENCODING 29317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +A920 +FFE0 +A920 +2D60 +3D60 +EFE0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_7286 +ENCODING 29318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7E0 +A100 +FFC0 +A440 +37C0 +6440 +A740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7287 +ENCODING 29319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +7FC0 +0400 +5280 +7BC0 +9480 +1BE0 +7080 +1080 +ENDCHAR +STARTCHAR U_7288 +ENCODING 29320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +A540 +AFE0 +F200 +AFE0 +2440 +3BE0 +E240 +22C0 +2220 +21E0 +ENDCHAR +STARTCHAR U_7289 +ENCODING 29321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57E0 +5240 +7BC0 +9000 +17C0 +1880 +77E0 +1080 +1280 +1100 +ENDCHAR +STARTCHAR U_728A +ENCODING 29322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7C0 +A100 +FFE0 +A4A0 +2280 +3480 +E280 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_728B +ENCODING 29323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +FC40 +A7C0 +2440 +37C0 +E440 +3FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_728C +ENCODING 29324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AA20 +AA20 +FEE0 +A800 +2FE0 +38A0 +EFA0 +2840 +28A0 +2920 +ENDCHAR +STARTCHAR U_728D +ENCODING 29325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AFE0 +A4A0 +FDE0 +A6A0 +23E0 +3A80 +EBE0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_728E +ENCODING 29326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2040 +FA40 +2140 +FCC0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_728F +ENCODING 29327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A820 +FFE0 +A800 +2FE0 +3AA0 +EFE0 +2AA0 +2AA0 +3860 +ENDCHAR +STARTCHAR U_7290 +ENCODING 29328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +AEA0 +A260 +FF20 +A2A0 +2360 +36A0 +EA20 +23E0 +2220 +2220 +ENDCHAR +STARTCHAR U_7291 +ENCODING 29329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +FC40 +A7C0 +2440 +37C0 +E140 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7292 +ENCODING 29330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A000 +FBC0 +A240 +23C0 +3000 +6FE0 +AAA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_7293 +ENCODING 29331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A200 +A7E0 +F520 +AFE0 +2220 +3440 +67E0 +AD20 +27E0 +2120 +2640 +ENDCHAR +STARTCHAR U_7294 +ENCODING 29332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A800 +B780 +E000 +AFC0 +3AC0 +2740 +EFC0 +2740 +2AA0 +2220 +ENDCHAR +STARTCHAR U_7295 +ENCODING 29333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +A7E0 +F280 +AFE0 +2200 +37E0 +6D20 +A7E0 +2520 +27E0 +2560 +ENDCHAR +STARTCHAR U_7296 +ENCODING 29334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +5AC0 +9480 +2B40 +FFE0 +8020 +A420 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7297 +ENCODING 29335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A920 +F7C0 +A100 +27C0 +3100 +EFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7298 +ENCODING 29336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4A80 +5FE0 +6200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_7299 +ENCODING 29337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2480 +AFC0 +F4A0 +AFE0 +3280 +6540 +BAA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_729A +ENCODING 29338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7E40 +4940 +6A40 +58C0 +A400 +3F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_729B +ENCODING 29339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2140 +FC80 +A940 +7FE0 +5200 +5FC0 +4200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_729C +ENCODING 29340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AE80 +A0E0 +FFA0 +AAA0 +2EA0 +32A0 +E440 +2E40 +24A0 +2D20 +ENDCHAR +STARTCHAR U_729D +ENCODING 29341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A280 +F100 +AFE0 +2540 +37C0 +E540 +2FE0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_729E +ENCODING 29342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A200 +BFE0 +E480 +ACC0 +37A0 +2000 +EFE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_729F +ENCODING 29343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0A40 +7FE0 +4520 +7FE0 +4940 +3520 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72A0 +ENCODING 29344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +A7E0 +A100 +FBC0 +A100 +2FE0 +34A0 +EFE0 +24C0 +3EA0 +2560 +ENDCHAR +STARTCHAR U_72A1 +ENCODING 29345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA80 +AFE0 +FA80 +AFC0 +2940 +3FC0 +E940 +2FE0 +3960 +2BA0 +ENDCHAR +STARTCHAR U_72A2 +ENCODING 29346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A100 +FFE0 +AAA0 +2FE0 +3440 +E7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_72A3 +ENCODING 29347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AA80 +A540 +FFE0 +AAA0 +2FE0 +3DC0 +EB40 +2DC0 +2B60 +2DA0 +ENDCHAR +STARTCHAR U_72A4 +ENCODING 29348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +AFE0 +F240 +A560 +2F40 +3960 +EF40 +2960 +2F40 +2960 +ENDCHAR +STARTCHAR U_72A5 +ENCODING 29349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +AA80 +FFE0 +AAA0 +2FE0 +3CA0 +EEC0 +2CE0 +3740 +2AA0 +ENDCHAR +STARTCHAR U_72A6 +ENCODING 29350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +F440 +AFE0 +3280 +2FE0 +E540 +2BA0 +2540 +2B20 +ENDCHAR +STARTCHAR U_72A7 +ENCODING 29351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +A100 +FFE0 +A100 +2FE0 +34A0 +EFE0 +2EC0 +2260 +2DA0 +ENDCHAR +STARTCHAR U_72A8 +ENCODING 29352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +7DE0 +D340 +7DE0 +5140 +7DE0 +1200 +1FC0 +2200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_72A9 +ENCODING 29353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +27C0 +FD40 +27C0 +FD40 +57A0 +2CE0 +7F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72AA +ENCODING 29354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +FA80 +ABE0 +AEA0 +3B80 +6A60 +B7C0 +2CA0 +2300 +3CE0 +ENDCHAR +STARTCHAR U_72AB +ENCODING 29355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +D540 +7FE0 +7BE0 +5F40 +7DE0 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72AC +ENCODING 29356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0400 +0600 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_72AD +ENCODING 29357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +68 +10 +30 +48 +88 +18 +28 +48 +88 +28 +10 +ENDCHAR +STARTCHAR U_72AE +ENCODING 29358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +FFE0 +0800 +0FC0 +1480 +1480 +2300 +2300 +4480 +9860 +ENDCHAR +STARTCHAR U_72AF +ENCODING 29359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +2440 +5440 +9440 +3580 +5400 +9400 +1420 +5420 +23E0 +ENDCHAR +STARTCHAR U_72B0 +ENCODING 29360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +2200 +5F80 +9280 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72B1 +ENCODING 29361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +2200 +5F80 +9280 +3680 +5280 +9580 +14A0 +5860 +2020 +ENDCHAR +STARTCHAR U_72B2 +ENCODING 29362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +2080 +57E0 +9080 +3180 +5280 +9480 +1880 +5280 +2100 +ENDCHAR +STARTCHAR U_72B3 +ENCODING 29363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +5200 +23E0 +5420 +9020 +2920 +48A0 +88A0 +0820 +5140 +2080 +ENDCHAR +STARTCHAR U_72B4 +ENCODING 29364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5100 +2100 +5100 +9FE0 +3100 +5100 +9100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_72B5 +ENCODING 29365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +53E0 +2400 +5800 +97C0 +3080 +5100 +9200 +1420 +5420 +23E0 +ENDCHAR +STARTCHAR U_72B6 +ENCODING 29366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +9140 +5100 +5FE0 +1100 +1100 +3280 +D280 +1440 +1440 +1820 +ENDCHAR +STARTCHAR U_72B7 +ENCODING 29367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +57E0 +2400 +5400 +9400 +3400 +5400 +9400 +1400 +5400 +2800 +ENDCHAR +STARTCHAR U_72B8 +ENCODING 29368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5040 +2240 +5240 +9440 +37E0 +5020 +97A0 +1020 +5120 +20C0 +ENDCHAR +STARTCHAR U_72B9 +ENCODING 29369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +2100 +5FE0 +9280 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72BA +ENCODING 29370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2FE0 +5000 +9380 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72BB +ENCODING 29371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +AFE0 +4100 +A7C0 +3540 +3540 +5540 +95C0 +1540 +5100 +2100 +ENDCHAR +STARTCHAR U_72BC +ENCODING 29372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5F80 +2180 +6280 +9380 +3680 +5A80 +9280 +12A0 +5AA0 +2460 +ENDCHAR +STARTCHAR U_72BD +ENCODING 29373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87E0 +5080 +2280 +5480 +97E0 +3080 +5180 +9280 +1480 +5A80 +2100 +ENDCHAR +STARTCHAR U_72BE +ENCODING 29374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5280 +2240 +DFE0 +1200 +3300 +5500 +9480 +1480 +5860 +2040 +ENDCHAR +STARTCHAR U_72BF +ENCODING 29375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2000 +5FE0 +9100 +3100 +5180 +9140 +1120 +5100 +2100 +ENDCHAR +STARTCHAR U_72C0 +ENCODING 29376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5180 +5140 +5FE0 +7100 +1100 +F100 +5280 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_72C1 +ENCODING 29377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5240 +2420 +5FA0 +9000 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72C2 +ENCODING 29378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2100 +5100 +9100 +37C0 +5100 +9100 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72C3 +ENCODING 29379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5140 +2140 +5140 +9140 +37C0 +5240 +9240 +1240 +5240 +2FE0 +ENDCHAR +STARTCHAR U_72C4 +ENCODING 29380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2520 +5540 +9580 +3900 +5100 +9280 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72C5 +ENCODING 29381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +5700 +2100 +5100 +9100 +3FE0 +5100 +9100 +1100 +5100 +27C0 +ENDCHAR +STARTCHAR U_72C6 +ENCODING 29382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +27E0 +5520 +9520 +37E0 +5520 +9100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_72C7 +ENCODING 29383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +9200 +6200 +6FE0 +A700 +2680 +6A80 +B240 +2260 +A200 +4200 +ENDCHAR +STARTCHAR U_72C8 +ENCODING 29384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +24A0 +54A0 +94A0 +34A0 +54A0 +94A0 +1140 +5220 +2C20 +ENDCHAR +STARTCHAR U_72C9 +ENCODING 29385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +2100 +5100 +9140 +3320 +5520 +9100 +1100 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72CA +ENCODING 29386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0500 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_72CB +ENCODING 29387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5000 +2000 +5FE0 +9100 +3540 +5540 +9520 +1920 +5500 +2200 +ENDCHAR +STARTCHAR U_72CC +ENCODING 29388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5500 +2500 +57E0 +9900 +3100 +57C0 +9100 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72CD +ENCODING 29389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +53E0 +2420 +5FA0 +94A0 +34A0 +57A0 +9460 +1400 +5420 +23E0 +ENDCHAR +STARTCHAR U_72CE +ENCODING 29390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +54A0 +24A0 +57E0 +94A0 +34A0 +57E0 +9080 +1080 +5080 +2080 +ENDCHAR +STARTCHAR U_72CF +ENCODING 29391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +2800 +5500 +95C0 +3740 +5D40 +95C0 +1520 +5520 +23E0 +ENDCHAR +STARTCHAR U_72D0 +ENCODING 29392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +AF00 +4A80 +AA80 +2A80 +2A40 +6A40 +AA40 +2AA0 +2BA0 +D020 +ENDCHAR +STARTCHAR U_72D1 +ENCODING 29393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5A20 +9100 +3FE0 +5040 +9480 +1300 +5100 +2080 +ENDCHAR +STARTCHAR U_72D2 +ENCODING 29394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5FE0 +22A0 +57E0 +9A80 +3A80 +5FE0 +92A0 +12E0 +5480 +2880 +ENDCHAR +STARTCHAR U_72D3 +ENCODING 29395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9100 +6FE0 +6920 +A940 +2FC0 +6A80 +AA80 +2900 +AA80 +5460 +ENDCHAR +STARTCHAR U_72D4 +ENCODING 29396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +2420 +57E0 +9400 +3520 +5540 +9580 +1520 +5920 +20E0 +ENDCHAR +STARTCHAR U_72D5 +ENCODING 29397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A080 +6480 +6480 +ABE0 +3EA0 +64A0 +AAA0 +3EA0 +2120 +A2A0 +4440 +ENDCHAR +STARTCHAR U_72D6 +ENCODING 29398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +5820 +9280 +3280 +5280 +9240 +1440 +5420 +2820 +ENDCHAR +STARTCHAR U_72D7 +ENCODING 29399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5200 +27E0 +5420 +9BA0 +32A0 +52A0 +93A0 +1020 +5140 +2080 +ENDCHAR +STARTCHAR U_72D8 +ENCODING 29400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +27E0 +5500 +9520 +3520 +5540 +9580 +16A0 +5560 +2220 +ENDCHAR +STARTCHAR U_72D9 +ENCODING 29401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +2440 +57C0 +9440 +3440 +5440 +97C0 +1440 +5440 +2FE0 +ENDCHAR +STARTCHAR U_72DA +ENCODING 29402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5440 +2440 +5440 +97C0 +3440 +5440 +97C0 +1440 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72DB +ENCODING 29403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5200 +27E0 +5420 +9420 +37E0 +5420 +9420 +1420 +57E0 +2420 +ENDCHAR +STARTCHAR U_72DC +ENCODING 29404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +2FE0 +5100 +9100 +37C0 +5440 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72DD +ENCODING 29405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +2820 +5140 +9500 +3580 +5940 +9920 +1120 +5500 +2200 +ENDCHAR +STARTCHAR U_72DE +ENCODING 29406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2420 +5000 +97E0 +3100 +5100 +9100 +1100 +5100 +2300 +ENDCHAR +STARTCHAR U_72DF +ENCODING 29407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +2000 +57C0 +9440 +37C0 +5440 +97C0 +1440 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72E0 +ENCODING 29408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +5440 +97C0 +3500 +5540 +9480 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_72E1 +ENCODING 29409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2FE0 +5280 +9440 +3AA0 +5280 +9280 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_72E2 +ENCODING 29410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53C0 +2440 +5A80 +9100 +3680 +5860 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E3 +ENCODING 29411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +2AA0 +56C0 +9280 +36C0 +5AA0 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72E4 +ENCODING 29412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +2FE0 +5100 +97C0 +3000 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E5 +ENCODING 29413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +67E0 +2820 +57A0 +94A0 +37A0 +54A0 +97A0 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_72E6 +ENCODING 29414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4AA0 +AAA0 +3FE0 +2AA0 +6AA0 +BFE0 +2AA0 +2AA0 +2AA0 +C860 +ENDCHAR +STARTCHAR U_72E7 +ENCODING 29415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5F00 +2100 +5FE0 +9100 +3100 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E8 +ENCODING 29416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +2FE0 +5500 +9520 +3F20 +5540 +9480 +14A0 +6960 +2220 +ENDCHAR +STARTCHAR U_72E9 +ENCODING 29417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2420 +5080 +9080 +3FE0 +5480 +9280 +1080 +5280 +2100 +ENDCHAR +STARTCHAR U_72EA +ENCODING 29418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4820 +ABA0 +2820 +2BA0 +6AA0 +AAA0 +2BA0 +2820 +28A0 +C840 +ENDCHAR +STARTCHAR U_72EB +ENCODING 29419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A20 +57A0 +2240 +5280 +9FE0 +3200 +5640 +9B80 +1220 +5220 +21E0 +ENDCHAR +STARTCHAR U_72EC +ENCODING 29420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27E0 +5520 +9520 +3520 +57E0 +9100 +1120 +5FE0 +2020 +ENDCHAR +STARTCHAR U_72ED +ENCODING 29421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2100 +5920 +9540 +3FE0 +5100 +9100 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72EE +ENCODING 29422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A3E0 +4A80 +ABE0 +2AA0 +2AA0 +6AA0 +AAA0 +2AA0 +22E0 +A480 +4880 +ENDCHAR +STARTCHAR U_72EF +ENCODING 29423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5820 +97A0 +3000 +5FE0 +9100 +1240 +5440 +2FA0 +ENDCHAR +STARTCHAR U_72F0 +ENCODING 29424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +53C0 +2480 +57C0 +9140 +3FE0 +5140 +97C0 +1100 +5100 +2300 +ENDCHAR +STARTCHAR U_72F1 +ENCODING 29425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8C0 +44A0 +A480 +3BE0 +2880 +6880 +A880 +2A80 +2D40 +2A20 +C420 +ENDCHAR +STARTCHAR U_72F2 +ENCODING 29426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AE80 +4280 +A480 +2480 +27C0 +6DA0 +B6A0 +2480 +2480 +B680 +4900 +ENDCHAR +STARTCHAR U_72F3 +ENCODING 29427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A300 +4480 +A840 +37E0 +2100 +6FE0 +A100 +2540 +2920 +2920 +C300 +ENDCHAR +STARTCHAR U_72F4 +ENCODING 29428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +4920 +AFC0 +2900 +2B20 +6CE0 +A100 +27C0 +2100 +2100 +DFE0 +ENDCHAR +STARTCHAR U_72F5 +ENCODING 29429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5280 +2240 +5FE0 +9540 +3580 +5540 +95A0 +1540 +59A0 +26E0 +ENDCHAR +STARTCHAR U_72F6 +ENCODING 29430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8B60 +5080 +2360 +5080 +9FE0 +3280 +57E0 +9AA0 +12A0 +52E0 +2080 +ENDCHAR +STARTCHAR U_72F7 +ENCODING 29431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +23C0 +5000 +97E0 +3420 +57E0 +9420 +17E0 +5420 +24E0 +ENDCHAR +STARTCHAR U_72F8 +ENCODING 29432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5520 +2520 +57E0 +9520 +37E0 +5100 +97C0 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72F9 +ENCODING 29433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2100 +5540 +9540 +3BA0 +5100 +9100 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72FA +ENCODING 29434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2000 +57C0 +9000 +37C0 +5000 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72FB +ENCODING 29435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5440 +2FE0 +5280 +9440 +3A20 +53C0 +9680 +1900 +5280 +2C60 +ENDCHAR +STARTCHAR U_72FC +ENCODING 29436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2440 +57C0 +9440 +37C0 +5520 +9540 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_72FD +ENCODING 29437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +27E0 +5420 +97E0 +3420 +57E0 +9000 +1240 +5220 +2C20 +ENDCHAR +STARTCHAR U_72FE +ENCODING 29438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +2500 +5F00 +95E0 +1740 +3540 +5D40 +9540 +1540 +1540 +6E40 +ENDCHAR +STARTCHAR U_72FF +ENCODING 29439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E20 +25C0 +6440 +A960 +2F40 +2540 +6540 +ADE0 +2400 +2A00 +D1E0 +ENDCHAR +STARTCHAR U_7300 +ENCODING 29440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +44C0 +B2A0 +2AA0 +6480 +A8A0 +3840 +2880 +AB00 +4C00 +ENDCHAR +STARTCHAR U_7301 +ENCODING 29441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +24A0 +64A0 +BFA0 +24A0 +66A0 +ADA0 +34A0 +2420 +2420 +C4E0 +ENDCHAR +STARTCHAR U_7302 +ENCODING 29442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +27C0 +5440 +17C0 +3000 +57C0 +9100 +1FE0 +5100 +2100 +ENDCHAR +STARTCHAR U_7303 +ENCODING 29443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5820 +97C0 +3000 +5A40 +9540 +1540 +5080 +2FE0 +ENDCHAR +STARTCHAR U_7304 +ENCODING 29444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +4000 +A7C0 +2440 +57C0 +9100 +1540 +1920 +5520 +2200 +ENDCHAR +STARTCHAR U_7305 +ENCODING 29445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5280 +2EE0 +5280 +9EE0 +3280 +5280 +9EE0 +1280 +5280 +2280 +ENDCHAR +STARTCHAR U_7306 +ENCODING 29446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +0E80 +7FE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7307 +ENCODING 29447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A1E0 +4100 +AFE0 +2920 +2FC0 +6920 +A9E0 +2800 +2B80 +32A0 +CC60 +ENDCHAR +STARTCHAR U_7308 +ENCODING 29448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2520 +57E0 +9520 +37E0 +5280 +9FE0 +1080 +5080 +2080 +ENDCHAR +STARTCHAR U_7309 +ENCODING 29449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +97E0 +6240 +63C0 +9240 +33C0 +5240 +9FE0 +1240 +5420 +2820 +ENDCHAR +STARTCHAR U_730A +ENCODING 29450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5660 +2420 +56E0 +9420 +3420 +57E0 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_730B +ENCODING 29451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FE0 +1100 +E0E0 +1040 +28A0 +FBE0 +2080 +5140 +8A20 +ENDCHAR +STARTCHAR U_730C +ENCODING 29452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCC0 +10A0 +57E0 +5480 +BA80 +1080 +3880 +5540 +9220 +1420 +ENDCHAR +STARTCHAR U_730D +ENCODING 29453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9FE0 +6100 +6540 +9540 +3BA0 +5100 +9380 +1540 +5920 +2100 +ENDCHAR +STARTCHAR U_730E +ENCODING 29454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +27C0 +5280 +9FE0 +3000 +57C0 +9440 +17C0 +5440 +27C0 +ENDCHAR +STARTCHAR U_730F +ENCODING 29455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27E0 +6420 +97E0 +1400 +35E0 +5520 +95E0 +1520 +95E0 +6920 +ENDCHAR +STARTCHAR U_7310 +ENCODING 29456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +6FE0 +2200 +57C0 +9200 +3200 +5FE0 +9300 +1520 +5520 +28E0 +ENDCHAR +STARTCHAR U_7311 +ENCODING 29457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFC0 +4840 +AFC0 +2840 +2FC0 +6900 +AF20 +29C0 +2900 +AF20 +48E0 +ENDCHAR +STARTCHAR U_7312 +ENCODING 29458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48C0 +78A0 +4BE0 +FC80 +8480 +FC80 +8480 +FD40 +8620 +8C20 +ENDCHAR +STARTCHAR U_7313 +ENCODING 29459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2540 +57C0 +9540 +17C0 +3100 +5FE0 +9100 +1380 +1540 +6920 +ENDCHAR +STARTCHAR U_7314 +ENCODING 29460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +4820 +A7C0 +2000 +6FE0 +A100 +2940 +2920 +B520 +4200 +ENDCHAR +STARTCHAR U_7315 +ENCODING 29461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2500 +65E0 +AE20 +2880 +6DC0 +A5A0 +26A0 +24A0 +B480 +4980 +ENDCHAR +STARTCHAR U_7316 +ENCODING 29462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +23C0 +5240 +93C0 +3000 +57E0 +9420 +17E0 +5420 +27E0 +ENDCHAR +STARTCHAR U_7317 +ENCODING 29463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2280 +5440 +9FE0 +3040 +5740 +9540 +1740 +5040 +21C0 +ENDCHAR +STARTCHAR U_7318 +ENCODING 29464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9A20 +6A20 +6FA0 +B220 +2FA0 +62A0 +AFA0 +2AA0 +2AA0 +ABA0 +4260 +ENDCHAR +STARTCHAR U_7319 +ENCODING 29465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5A20 +2540 +57C0 +9140 +3FE0 +5140 +97C0 +1100 +5500 +2200 +ENDCHAR +STARTCHAR U_731A +ENCODING 29466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5240 +27E0 +5C80 +97E0 +3480 +57E0 +9480 +1480 +57E0 +2400 +ENDCHAR +STARTCHAR U_731B +ENCODING 29467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5080 +2100 +5FE0 +9100 +3500 +5200 +9FE0 +2AA0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_731C +ENCODING 29468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2100 +67C0 +A100 +2FE0 +6440 +A7C0 +2440 +27C0 +C440 +ENDCHAR +STARTCHAR U_731D +ENCODING 29469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2440 +5440 +9AA0 +3120 +5100 +9FE0 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_731E +ENCODING 29470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2280 +5440 +9BA0 +1100 +3FE0 +5100 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_731F +ENCODING 29471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +A540 +4080 +AFC0 +2A40 +6FC0 +AA40 +2FC0 +AA40 +5260 +2020 +ENDCHAR +STARTCHAR U_7320 +ENCODING 29472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +A500 +5FC0 +B540 +3FC0 +7540 +B540 +3FE0 +2480 +A840 +5020 +ENDCHAR +STARTCHAR U_7321 +ENCODING 29473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +5AA0 +9FE0 +1200 +33E0 +5640 +9940 +1080 +5100 +2E00 +ENDCHAR +STARTCHAR U_7322 +ENCODING 29474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D4E0 +24A0 +7FA0 +A4E0 +24A0 +2EA0 +6AE0 +AAA0 +2EA0 +A120 +4260 +ENDCHAR +STARTCHAR U_7323 +ENCODING 29475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +4920 +AAA0 +2FE0 +2440 +6A20 +A3C0 +2680 +2900 +2280 +DC60 +ENDCHAR +STARTCHAR U_7324 +ENCODING 29476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AF40 +4AA0 +A440 +3BA0 +6100 +AFE0 +2280 +2280 +A440 +4820 +ENDCHAR +STARTCHAR U_7325 +ENCODING 29477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5540 +27C0 +5540 +97C0 +3000 +57E0 +9540 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_7326 +ENCODING 29478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2440 +57C0 +9540 +17C0 +3540 +57C0 +9540 +15A0 +9760 +6820 +ENDCHAR +STARTCHAR U_7327 +ENCODING 29479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6440 +6740 +A540 +2FE0 +6820 +ABA0 +2AA0 +2BA0 +A820 +4860 +ENDCHAR +STARTCHAR U_7328 +ENCODING 29480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AE40 +4A80 +AFC0 +2200 +3FE0 +6200 +A3C0 +2680 +A900 +56E0 +ENDCHAR +STARTCHAR U_7329 +ENCODING 29481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +5440 +97C0 +3500 +57E0 +9900 +17C0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_732A +ENCODING 29482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8920 +57A0 +2140 +57E0 +9100 +33E0 +5620 +9BE0 +1220 +53E0 +2220 +ENDCHAR +STARTCHAR U_732B +ENCODING 29483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A40 +57E0 +2240 +5240 +97E0 +3520 +5520 +97E0 +1520 +57E0 +2420 +ENDCHAR +STARTCHAR U_732C +ENCODING 29484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5920 +2FE0 +5920 +9FE0 +3440 +57C0 +9440 +17C0 +5440 +24C0 +ENDCHAR +STARTCHAR U_732D +ENCODING 29485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +5480 +2780 +5100 +9FE0 +3220 +5540 +9A80 +15C0 +52A0 +2D80 +ENDCHAR +STARTCHAR U_732E +ENCODING 29486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCC0 +10A0 +FFE0 +AC80 +9480 +FC80 +9480 +FD40 +9540 +8E20 +ENDCHAR +STARTCHAR U_732F +ENCODING 29487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A920 +4FE0 +A000 +3FE0 +2100 +6FE0 +AAA0 +2AA0 +AAA0 +4860 +ENDCHAR +STARTCHAR U_7330 +ENCODING 29488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +5FE0 +24A0 +5EA0 +94A0 +3F60 +5500 +9FE0 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_7331 +ENCODING 29489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5280 +2100 +5FE0 +9540 +3B00 +5100 +9FE0 +1380 +5540 +2920 +ENDCHAR +STARTCHAR U_7332 +ENCODING 29490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2440 +57C0 +9440 +17C0 +3200 +57E0 +9CA0 +1560 +17A0 +60C0 +ENDCHAR +STARTCHAR U_7333 +ENCODING 29491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2A20 +6EE0 +A800 +28E0 +2EA0 +68A0 +AEA0 +2840 +28A0 +C920 +ENDCHAR +STARTCHAR U_7334 +ENCODING 29492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABC0 +4840 +AFE0 +3A00 +2BE0 +6C80 +A880 +2FE0 +2880 +A940 +4A20 +ENDCHAR +STARTCHAR U_7335 +ENCODING 29493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6FE0 +6820 +AFE0 +2800 +6FE0 +AAA0 +2FE0 +2AA0 +BAA0 +4860 +ENDCHAR +STARTCHAR U_7336 +ENCODING 29494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +A280 +5FE0 +A280 +2FE0 +6AA0 +ACE0 +2820 +2FE0 +A820 +4FE0 +ENDCHAR +STARTCHAR U_7337 +ENCODING 29495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +28C0 +FEA0 +29E0 +FE80 +AA80 +CE80 +8280 +FE80 +8340 +FE20 +ENDCHAR +STARTCHAR U_7338 +ENCODING 29496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4920 +AFE0 +2800 +2BE0 +6A20 +ABE0 +2A20 +2BE0 +2A20 +D3E0 +ENDCHAR +STARTCHAR U_7339 +ENCODING 29497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2540 +5920 +97C0 +3440 +57C0 +9440 +17C0 +5000 +2FE0 +ENDCHAR +STARTCHAR U_733A +ENCODING 29498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5000 +2520 +5540 +9200 +33C0 +5500 +9FE0 +1100 +5520 +27E0 +ENDCHAR +STARTCHAR U_733B +ENCODING 29499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFC0 +4480 +A920 +2BC0 +2880 +6D20 +BBE0 +2880 +29C0 +AAA0 +5880 +ENDCHAR +STARTCHAR U_733C +ENCODING 29500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +57E0 +2520 +57E0 +9520 +37E0 +5520 +9040 +1FE0 +5440 +22C0 +ENDCHAR +STARTCHAR U_733D +ENCODING 29501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A840 +4780 +A480 +2780 +2480 +6780 +A200 +3FE0 +A480 +4840 +ENDCHAR +STARTCHAR U_733E +ENCODING 29502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5640 +2540 +6FE0 +A820 +37C0 +6440 +A7C0 +2440 +A7C0 +4440 +ENDCHAR +STARTCHAR U_733F +ENCODING 29503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2100 +5FE0 +9000 +37C0 +5440 +97C0 +16A0 +5A40 +2320 +ENDCHAR +STARTCHAR U_7340 +ENCODING 29504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5760 +2520 +5760 +9520 +37E0 +5100 +97E0 +1240 +5180 +2660 +ENDCHAR +STARTCHAR U_7341 +ENCODING 29505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A500 +47C0 +A500 +27C0 +2500 +57E0 +9020 +1B60 +AAA0 +4040 +ENDCHAR +STARTCHAR U_7342 +ENCODING 29506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4880 +ABE0 +2A20 +2BE0 +6A20 +ABE0 +2880 +2AC0 +34A0 +C9A0 +ENDCHAR +STARTCHAR U_7343 +ENCODING 29507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8C0 +A8A0 +F880 +07E0 +F880 +0080 +F880 +8940 +F940 +5240 +FC20 +ENDCHAR +STARTCHAR U_7344 +ENCODING 29508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +2EC0 +60A0 +AFE0 +2080 +2E80 +6080 +AE80 +2B40 +AE20 +4A20 +ENDCHAR +STARTCHAR U_7345 +ENCODING 29509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +3080 +7BE0 +AAA0 +3AA0 +22A0 +7AA0 +AAA0 +2AE0 +BA80 +4080 +ENDCHAR +STARTCHAR U_7346 +ENCODING 29510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +4A40 +A940 +2FC0 +6200 +BFE0 +2500 +3AC0 +AF80 +4200 +ENDCHAR +STARTCHAR U_7347 +ENCODING 29511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFC0 +4200 +AFC0 +2200 +7FE0 +A680 +2740 +2BC0 +AA20 +51E0 +ENDCHAR +STARTCHAR U_7348 +ENCODING 29512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A840 +4480 +4FC0 +A480 +2840 +7FC0 +A540 +2540 +2540 +BFE0 +4000 +ENDCHAR +STARTCHAR U_7349 +ENCODING 29513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2100 +57C0 +9200 +3FE0 +57C0 +9920 +1FE0 +5540 +2920 +ENDCHAR +STARTCHAR U_734A +ENCODING 29514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8980 +5240 +2520 +5FC0 +9440 +37C0 +5440 +97E0 +1620 +5BE0 +2220 +ENDCHAR +STARTCHAR U_734B +ENCODING 29515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A7C0 +4440 +A7C0 +2440 +67C0 +A920 +2540 +2920 +BFE0 +4100 +ENDCHAR +STARTCHAR U_734C +ENCODING 29516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +6440 +AFE0 +2AA0 +6FE0 +A440 +2280 +A100 +4EE0 +ENDCHAR +STARTCHAR U_734D +ENCODING 29517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27C0 +5280 +9FE0 +1440 +37C0 +5440 +97C0 +1280 +12A0 +6C60 +ENDCHAR +STARTCHAR U_734E +ENCODING 29518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +5540 +7A80 +1140 +FFE0 +5440 +92C0 +0500 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_734F +ENCODING 29519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A480 +4FC0 +A840 +2FC0 +6840 +AFC0 +2200 +3FE0 +A480 +4860 +ENDCHAR +STARTCHAR U_7350 +ENCODING 29520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27C0 +5280 +9FE0 +1440 +37C0 +5440 +97C0 +1100 +1FE0 +6100 +ENDCHAR +STARTCHAR U_7351 +ENCODING 29521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D2E0 +2F80 +6280 +AFE0 +2AA0 +2FA0 +6AA0 +AFA0 +22A0 +AFA0 +42A0 +ENDCHAR +STARTCHAR U_7352 +ENCODING 29522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1220 +FD40 +2880 +4940 +9A20 +0480 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7353 +ENCODING 29523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5E80 +24E0 +6F40 +A540 +3F40 +6940 +AE80 +2A80 +AB40 +5620 +ENDCHAR +STARTCHAR U_7354 +ENCODING 29524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +6F80 +6880 +AF80 +2880 +2F80 +6A80 +A700 +2A80 +BFE0 +4200 +ENDCHAR +STARTCHAR U_7355 +ENCODING 29525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5940 +2FC0 +6500 +AFC0 +3900 +6FC0 +A900 +2FC0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_7356 +ENCODING 29526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +BFC0 +4A80 +BFE0 +2A80 +6980 +AC80 +2A80 +2F80 +A500 +4880 +ENDCHAR +STARTCHAR U_7357 +ENCODING 29527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +5480 +DFE0 +5520 +5540 +5540 +DF40 +5540 +54A0 +5520 +AA20 +ENDCHAR +STARTCHAR U_7358 +ENCODING 29528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +59E0 +FD40 +9740 +BC80 +D540 +96A0 +0440 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7359 +ENCODING 29529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +5C80 +A8E0 +3FA0 +2AA0 +7AA0 +AEA0 +2AA0 +2A40 +AAA0 +4B20 +ENDCHAR +STARTCHAR U_735A +ENCODING 29530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +57E0 +2280 +5FE0 +9100 +37C0 +5540 +97C0 +1540 +57C0 +2820 +ENDCHAR +STARTCHAR U_735B +ENCODING 29531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +56C0 +2FE0 +5280 +9FE0 +3100 +57C0 +9100 +1FE0 +5280 +2C60 +ENDCHAR +STARTCHAR U_735C +ENCODING 29532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +A540 +4FE0 +A380 +2D60 +6840 +ADE0 +3540 +2FE0 +A840 +5040 +ENDCHAR +STARTCHAR U_735D +ENCODING 29533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6280 +7FE0 +A520 +2900 +2FE0 +6AA0 +AFE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_735E +ENCODING 29534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2280 +5100 +9FE0 +3540 +57C0 +9540 +1FE0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_735F +ENCODING 29535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2100 +5FE0 +9440 +3EE0 +5440 +9FE0 +1280 +54A0 +2860 +ENDCHAR +STARTCHAR U_7360 +ENCODING 29536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2AA0 +5440 +9FE0 +3440 +57C0 +9440 +17C0 +5540 +2B20 +ENDCHAR +STARTCHAR U_7361 +ENCODING 29537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95C0 +5840 +2DC0 +6840 +AFC0 +2400 +67E0 +A820 +3AA0 +AAA0 +4040 +ENDCHAR +STARTCHAR U_7362 +ENCODING 29538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8040 +6F80 +4200 +BFE0 +2440 +7BA0 +A280 +2FE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_7363 +ENCODING 29539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +28C0 +7CA0 +57E0 +7C80 +5480 +FF40 +0140 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_7364 +ENCODING 29540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5F40 +20E0 +6FA0 +AAA0 +2FA0 +62A0 +A440 +3F40 +A4A0 +4D20 +ENDCHAR +STARTCHAR U_7365 +ENCODING 29541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5E80 +2AE0 +6FA0 +AAA0 +2EA0 +64A0 +BFA0 +2A40 +AAA0 +5720 +ENDCHAR +STARTCHAR U_7366 +ENCODING 29542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5280 +2FC0 +6840 +AFC0 +2840 +6FE0 +A920 +3AA0 +AFA0 +4040 +ENDCHAR +STARTCHAR U_7367 +ENCODING 29543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +6AA0 +6FE0 +A000 +3FE0 +6840 +AFC0 +2520 +2CC0 +B640 +4420 +ENDCHAR +STARTCHAR U_7368 +ENCODING 29544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +6AA0 +6FE0 +A400 +2FE0 +3220 +6FA0 +AAA0 +2FA0 +A2A0 +4F40 +ENDCHAR +STARTCHAR U_7369 +ENCODING 29545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94E0 +6480 +2FE0 +68A0 +AFE0 +2880 +6FA0 +AAA0 +2FC0 +A960 +5620 +ENDCHAR +STARTCHAR U_736A +ENCODING 29546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +27C0 +6820 +AFE0 +2AA0 +6FE0 +A440 +27C0 +A440 +47C0 +ENDCHAR +STARTCHAR U_736B +ENCODING 29547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5280 +2440 +6BA0 +A000 +2EE0 +6AA0 +AEE0 +2440 +AAA0 +5120 +ENDCHAR +STARTCHAR U_736C +ENCODING 29548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ADE0 +54A0 +DFA0 +5560 +5F40 +55E0 +DF40 +55E0 +5540 +5540 +A340 +ENDCHAR +STARTCHAR U_736D +ENCODING 29549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +3F40 +6BE0 +BE20 +2AA0 +7EA0 +AAA0 +2AA0 +3C80 +2B40 +CA20 +ENDCHAR +STARTCHAR U_736E +ENCODING 29550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +4540 +A920 +2FE0 +2920 +6DA0 +AB60 +2DA0 +2B60 +ADA0 +4960 +ENDCHAR +STARTCHAR U_736F +ENCODING 29551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5100 +3FE0 +6AA0 +AFE0 +2100 +6FC0 +A100 +3FE0 +A540 +4AA0 +ENDCHAR +STARTCHAR U_7370 +ENCODING 29552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +3520 +6CC0 +A7A0 +2000 +6FE0 +AAA0 +3FE0 +A100 +4300 +ENDCHAR +STARTCHAR U_7371 +ENCODING 29553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +4820 +AFE0 +2540 +27C0 +7C40 +A7C0 +2440 +A7C0 +4C60 +ENDCHAR +STARTCHAR U_7372 +ENCODING 29554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5FE0 +2540 +6FE0 +B900 +2FC0 +6900 +AFE0 +2480 +A300 +5CE0 +ENDCHAR +STARTCHAR U_7373 +ENCODING 29555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2FE0 +6920 +A540 +2920 +6FE0 +A100 +2FE0 +AAA0 +4AE0 +ENDCHAR +STARTCHAR U_7374 +ENCODING 29556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFC0 +4480 +AFE0 +3020 +6FC0 +A640 +2B80 +2580 +A340 +4D20 +ENDCHAR +STARTCHAR U_7375 +ENCODING 29557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8520 +5A40 +2520 +6FE0 +AAA0 +2FE0 +6DC0 +AB40 +2DC0 +AB40 +4D20 +ENDCHAR +STARTCHAR U_7376 +ENCODING 29558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5440 +27C0 +6440 +AFE0 +2AA0 +6540 +A7C0 +2C80 +B300 +4CE0 +ENDCHAR +STARTCHAR U_7377 +ENCODING 29559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +5FE0 +2940 +6FE0 +A940 +2FE0 +6AA0 +ABE0 +2AA0 +ABE0 +5620 +ENDCHAR +STARTCHAR U_7378 +ENCODING 29560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEC0 +AAA0 +FE80 +57E0 +7C80 +5480 +FE80 +0080 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_7379 +ENCODING 29561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +A200 +4FE0 +A9A0 +2F40 +69C0 +AAA0 +2AA0 +2BE0 +AAA0 +57E0 +ENDCHAR +STARTCHAR U_737A +ENCODING 29562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +3F40 +29E0 +7F20 +ABE0 +3F20 +69E0 +AD20 +3BE0 +A940 +4A20 +ENDCHAR +STARTCHAR U_737B +ENCODING 29563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +20C0 +FEA0 +A3E0 +FC80 +A880 +FC80 +AD40 +FD40 +9620 +9420 +ENDCHAR +STARTCHAR U_737C +ENCODING 29564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +29C0 +6AA0 +BBE0 +22A0 +7BE0 +AAA0 +2BE0 +2AA0 +ABE0 +52A0 +ENDCHAR +STARTCHAR U_737D +ENCODING 29565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2AA0 +6EE0 +A280 +2FE0 +6280 +AFE0 +24A0 +AC40 +5620 +ENDCHAR +STARTCHAR U_737E +ENCODING 29566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +2480 +6EE0 +AAA0 +2EE0 +7FE0 +A900 +2FC0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_737F +ENCODING 29567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +37E0 +7CA0 +B7E0 +3480 +6FE0 +AA40 +34A0 +EB00 +5CE0 +ENDCHAR +STARTCHAR U_7380 +ENCODING 29568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5AA0 +2FE0 +6540 +A5E0 +2B40 +65E0 +AB40 +2FE0 +EB40 +55E0 +ENDCHAR +STARTCHAR U_7381 +ENCODING 29569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2AA0 +6FE0 +AA80 +2FE0 +2920 +6F20 +A9A0 +2F40 +A9A0 +4F20 +ENDCHAR +STARTCHAR U_7382 +ENCODING 29570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +6480 +BFE0 +2B00 +3FE0 +5540 +9F40 +1540 +FF40 +4540 +ENDCHAR +STARTCHAR U_7383 +ENCODING 29571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2EE0 +6AA0 +AFE0 +3900 +6FE0 +A900 +2FE0 +A300 +5CE0 +ENDCHAR +STARTCHAR U_7384 +ENCODING 29572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0880 +1100 +3E00 +0400 +0900 +1080 +7FC0 +ENDCHAR +STARTCHAR U_7385 +ENCODING 29573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FEC0 +22A0 +4CA0 +7480 +20A0 +4840 +F480 +0300 +0C00 +ENDCHAR +STARTCHAR U_7386 +ENCODING 29574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1080 +FFE0 +2100 +4A40 +FFC0 +1080 +2100 +4A40 +F7A0 +0420 +ENDCHAR +STARTCHAR U_7387 +ENCODING 29575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7388 +ENCODING 29576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FA00 +24E0 +2B80 +5280 +F2A0 +22C0 +4A80 +FB40 +0A20 +ENDCHAR +STARTCHAR U_7389 +ENCODING 29577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +3F80 +0400 +0500 +0480 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738A +ENCODING 29578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0400 +0500 +0480 +0400 +3FC0 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738B +ENCODING 29579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +3F80 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738C +ENCODING 29580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7A00 +2200 +2200 +2200 +7A00 +2200 +2200 +3A20 +E220 +01E0 +ENDCHAR +STARTCHAR U_738D +ENCODING 29581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FC0 +2200 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_738E +ENCODING 29582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +2080 +2080 +7080 +2080 +2080 +3880 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_738F +ENCODING 29583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +2100 +27E0 +7920 +2120 +2220 +3A20 +C420 +0940 +1080 +ENDCHAR +STARTCHAR U_7390 +ENCODING 29584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7500 +2500 +2500 +7480 +2480 +2480 +3840 +C840 +1060 +2040 +ENDCHAR +STARTCHAR U_7391 +ENCODING 29585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +2480 +2480 +7480 +2480 +2480 +3480 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7392 +ENCODING 29586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2100 +2100 +7100 +2100 +2100 +3900 +C100 +0100 +07E0 +ENDCHAR +STARTCHAR U_7393 +ENCODING 29587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2220 +2420 +7120 +20A0 +20A0 +3820 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_7394 +ENCODING 29588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FAA0 +22A0 +22A0 +72A0 +22A0 +22A0 +3AA0 +C2A0 +0420 +0820 +ENDCHAR +STARTCHAR U_7395 +ENCODING 29589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +2080 +2080 +77E0 +2080 +2080 +3880 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_7396 +ENCODING 29590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23C0 +2240 +7440 +2080 +2080 +3980 +E240 +4420 +0820 +ENDCHAR +STARTCHAR U_7397 +ENCODING 29591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +2080 +2080 +77E0 +2080 +2080 +3880 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_7398 +ENCODING 29592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +2040 +2040 +F7C0 +2440 +2400 +2400 +3420 +C420 +03E0 +ENDCHAR +STARTCHAR U_7399 +ENCODING 29593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2200 +2200 +FBE0 +2020 +2020 +37A0 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_739A +ENCODING 29594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F080 +4100 +4200 +F7E0 +42A0 +42A0 +74A0 +C920 +02A0 +0440 +ENDCHAR +STARTCHAR U_739B +ENCODING 29595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F840 +2240 +2240 +7240 +23E0 +2020 +37A0 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_739C +ENCODING 29596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +4480 +4480 +E840 +5260 +4200 +4200 +7480 +CFC0 +0040 +ENDCHAR +STARTCHAR U_739D +ENCODING 29597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2480 +7080 +2080 +27E0 +3080 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_739E +ENCODING 29598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +2100 +FFE0 +2100 +2280 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_739F +ENCODING 29599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2240 +7240 +2240 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_73A0 +ENCODING 29600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2820 +7240 +2240 +2240 +3A40 +C240 +0440 +0840 +ENDCHAR +STARTCHAR U_73A1 +ENCODING 29601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2240 +2240 +F7E0 +20C0 +2140 +3240 +C440 +0840 +00C0 +ENDCHAR +STARTCHAR U_73A2 +ENCODING 29602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2440 +2820 +77C0 +2240 +2240 +3A40 +C440 +0540 +0880 +ENDCHAR +STARTCHAR U_73A3 +ENCODING 29603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4200 +F300 +4280 +4240 +7240 +C200 +0200 +0200 +ENDCHAR +STARTCHAR U_73A4 +ENCODING 29604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +77C0 +2100 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73A5 +ENCODING 29605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +2220 +23E0 +7220 +2220 +23E0 +3A20 +E220 +44A0 +1840 +ENDCHAR +STARTCHAR U_73A6 +ENCODING 29606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2140 +7140 +2FE0 +2100 +3900 +E280 +4440 +1820 +ENDCHAR +STARTCHAR U_73A7 +ENCODING 29607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +2480 +2FC0 +F540 +2500 +2500 +3520 +C520 +08E0 +1000 +ENDCHAR +STARTCHAR U_73A8 +ENCODING 29608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2100 +7100 +27C0 +2100 +3900 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73A9 +ENCODING 29609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F800 +2000 +2000 +77E0 +2280 +2280 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_73AA +ENCODING 29610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +4500 +4480 +EA60 +5100 +4FC0 +4080 +7100 +C100 +0200 +ENDCHAR +STARTCHAR U_73AB +ENCODING 29611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2240 +7440 +2A80 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_73AC +ENCODING 29612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2340 +22C0 +7240 +2FE0 +2240 +3A40 +E440 +4940 +1080 +ENDCHAR +STARTCHAR U_73AD +ENCODING 29613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FC80 +2480 +27A0 +74C0 +2480 +2480 +3C80 +C5A0 +06A0 +0460 +ENDCHAR +STARTCHAR U_73AE +ENCODING 29614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +7100 +2FE0 +2120 +3920 +C160 +0100 +0100 +ENDCHAR +STARTCHAR U_73AF +ENCODING 29615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2300 +7380 +2540 +2520 +3920 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73B0 +ENCODING 29616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +2540 +2540 +F540 +2540 +2540 +3280 +C2A0 +04A0 +18E0 +ENDCHAR +STARTCHAR U_73B1 +ENCODING 29617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0300 +F480 +4440 +4FA0 +F480 +4480 +4680 +7500 +C440 +03C0 +ENDCHAR +STARTCHAR U_73B2 +ENCODING 29618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2A20 +7100 +2000 +27E0 +3840 +C280 +0100 +0080 +ENDCHAR +STARTCHAR U_73B3 +ENCODING 29619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAC0 +24A0 +24E0 +7F80 +2480 +2480 +3CA0 +E4A0 +0460 +0420 +ENDCHAR +STARTCHAR U_73B4 +ENCODING 29620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FD40 +2540 +2FE0 +7540 +2540 +25C0 +3D40 +E400 +0400 +07E0 +ENDCHAR +STARTCHAR U_73B5 +ENCODING 29621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +27E0 +2240 +7240 +23C0 +2240 +3A40 +E240 +43C0 +0240 +ENDCHAR +STARTCHAR U_73B6 +ENCODING 29622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2520 +2340 +7100 +2FE0 +2100 +3900 +E100 +4100 +0100 +ENDCHAR +STARTCHAR U_73B7 +ENCODING 29623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +21E0 +2100 +7100 +27E0 +2420 +3C20 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_73B8 +ENCODING 29624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2420 +2BA0 +72A0 +22A0 +23A0 +3A40 +E200 +4220 +01E0 +ENDCHAR +STARTCHAR U_73B9 +ENCODING 29625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27E0 +2100 +7240 +2780 +2100 +3A00 +C440 +0FA0 +0420 +ENDCHAR +STARTCHAR U_73BA +ENCODING 29626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4440 +1500 +2480 +4440 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_73BB +ENCODING 29627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +24A0 +2480 +77C0 +2640 +2540 +3540 +C480 +0940 +1620 +ENDCHAR +STARTCHAR U_73BC +ENCODING 29628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +2BA0 +7AC0 +2A80 +2A80 +3A80 +EAA0 +5FA0 +08E0 +ENDCHAR +STARTCHAR U_73BD +ENCODING 29629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +2820 +27A0 +F4A0 +24A0 +24A0 +37A0 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_73BE +ENCODING 29630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FCA0 +24A0 +27E0 +74A0 +24A0 +27E0 +3CA0 +E080 +4080 +0080 +ENDCHAR +STARTCHAR U_73BF +ENCODING 29631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F920 +2120 +22E0 +7440 +2800 +23E0 +3A20 +E220 +43E0 +0220 +ENDCHAR +STARTCHAR U_73C0 +ENCODING 29632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F900 +23E0 +2220 +7220 +23E0 +2220 +3A20 +C220 +03E0 +0220 +ENDCHAR +STARTCHAR U_73C1 +ENCODING 29633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F400 +2780 +2480 +F480 +2680 +2580 +3480 +E4A0 +06A0 +0860 +ENDCHAR +STARTCHAR U_73C2 +ENCODING 29634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2040 +2740 +7540 +2540 +2740 +3540 +E040 +0140 +0080 +ENDCHAR +STARTCHAR U_73C3 +ENCODING 29635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2540 +2540 +77C0 +2540 +2FE0 +3440 +E440 +0440 +04C0 +ENDCHAR +STARTCHAR U_73C4 +ENCODING 29636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +4500 +47C0 +4500 +E900 +57C0 +4100 +7100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_73C5 +ENCODING 29637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +24A0 +77E0 +24A0 +27E0 +3880 +E080 +0080 +0080 +ENDCHAR +STARTCHAR U_73C6 +ENCODING 29638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2200 +2440 +FFE0 +2020 +27C0 +2440 +3C40 +C7C0 +0440 +ENDCHAR +STARTCHAR U_73C7 +ENCODING 29639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +2440 +27C0 +7440 +2440 +2440 +3FC0 +C440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_73C8 +ENCODING 29640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +E8E0 +5EA0 +4AA0 +FAA0 +4AA0 +4AA0 +6AA0 +D2A0 +2AE0 +44A0 +ENDCHAR +STARTCHAR U_73C9 +ENCODING 29641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7480 +27E0 +2480 +3C80 +E5A0 +4660 +0420 +ENDCHAR +STARTCHAR U_73CA +ENCODING 29642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2AA0 +2AA0 +FFE0 +2AA0 +2AA0 +3AA0 +EAA0 +0AA0 +1560 +ENDCHAR +STARTCHAR U_73CB +ENCODING 29643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +F8E0 +2AA0 +2AA0 +FAA0 +2AA0 +2EA0 +3AE0 +E280 +0480 +0880 +ENDCHAR +STARTCHAR U_73CC +ENCODING 29644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +2040 +2240 +FA80 +2AC0 +2AA0 +2320 +3240 +C640 +19C0 +ENDCHAR +STARTCHAR U_73CD +ENCODING 29645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +28A0 +F100 +2240 +2480 +2120 +3640 +C080 +0700 +ENDCHAR +STARTCHAR U_73CE +ENCODING 29646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +27E0 +2920 +2100 +F900 +2540 +2520 +3920 +C100 +0300 +ENDCHAR +STARTCHAR U_73CF +ENCODING 29647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F900 +2100 +2100 +7100 +27C0 +2100 +3940 +E120 +4100 +0FE0 +ENDCHAR +STARTCHAR U_73D0 +ENCODING 29648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +7100 +27E0 +2200 +3A80 +E440 +4FE0 +0020 +ENDCHAR +STARTCHAR U_73D1 +ENCODING 29649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F440 +2400 +2FE0 +F500 +2540 +2580 +3900 +CB20 +1520 +21E0 +ENDCHAR +STARTCHAR U_73D2 +ENCODING 29650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2140 +2FE0 +7140 +27C0 +2100 +37C0 +E100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_73D3 +ENCODING 29651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27E0 +2440 +7820 +2440 +2280 +3900 +E280 +4440 +0820 +ENDCHAR +STARTCHAR U_73D4 +ENCODING 29652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2200 +25E0 +7440 +2C80 +27E0 +3C80 +E480 +4480 +0580 +ENDCHAR +STARTCHAR U_73D5 +ENCODING 29653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4240 +4540 +E880 +5FE0 +4AA0 +6AA0 +D320 +12A0 +2440 +ENDCHAR +STARTCHAR U_73D6 +ENCODING 29654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F520 +2340 +2100 +77E0 +2280 +2280 +3A80 +E4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_73D7 +ENCODING 29655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FD00 +27C0 +2900 +7100 +2FE0 +2280 +3A80 +E2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_73D8 +ENCODING 29656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +2540 +F4C0 +2FE0 +2540 +34C0 +C440 +0840 +10C0 +ENDCHAR +STARTCHAR U_73D9 +ENCODING 29657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +27C0 +7280 +2280 +27E0 +3800 +E280 +0240 +0440 +ENDCHAR +STARTCHAR U_73DA +ENCODING 29658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +2520 +27E0 +7520 +2520 +25A0 +3E60 +E420 +07E0 +0420 +ENDCHAR +STARTCHAR U_73DB +ENCODING 29659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2200 +77E0 +2A20 +23E0 +3A20 +E3E0 +0220 +0260 +ENDCHAR +STARTCHAR U_73DC +ENCODING 29660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +2FE0 +2100 +7100 +27C0 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73DD +ENCODING 29661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F120 +29A0 +2560 +7120 +2360 +25A0 +3920 +E120 +45A0 +0240 +ENDCHAR +STARTCHAR U_73DE +ENCODING 29662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2640 +2980 +7240 +2420 +2FC0 +3440 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_73DF +ENCODING 29663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +4FC0 +4A40 +EBC0 +4CC0 +4B40 +6940 +9240 +2460 +4020 +ENDCHAR +STARTCHAR U_73E0 +ENCODING 29664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +27C0 +2900 +F100 +2FE0 +2100 +3380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_73E1 +ENCODING 29665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +7BC0 +2080 +2080 +FBE0 +0400 +0A00 +1100 +20E0 +4040 +ENDCHAR +STARTCHAR U_73E2 +ENCODING 29666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2620 +2540 +3480 +C440 +0660 +0400 +ENDCHAR +STARTCHAR U_73E3 +ENCODING 29667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2820 +27A0 +74A0 +27A0 +24A0 +3FA0 +E4A0 +4020 +00C0 +ENDCHAR +STARTCHAR U_73E4 +ENCODING 29668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2500 +2900 +F900 +2FE0 +2100 +2520 +3520 +C520 +07E0 +ENDCHAR +STARTCHAR U_73E5 +ENCODING 29669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F240 +2240 +23C0 +F240 +23C0 +2240 +2240 +37E0 +C040 +0040 +ENDCHAR +STARTCHAR U_73E6 +ENCODING 29670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +4FE0 +4820 +FBA0 +4AA0 +4AA0 +7BA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_73E7 +ENCODING 29671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAA0 +2AA0 +26C0 +7280 +26C0 +2AA0 +3A80 +E2A0 +44A0 +0860 +ENDCHAR +STARTCHAR U_73E8 +ENCODING 29672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2820 +7380 +2000 +27C0 +3C40 +E440 +47C0 +0440 +ENDCHAR +STARTCHAR U_73E9 +ENCODING 29673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F5E0 +2800 +2200 +F5E0 +2C40 +2440 +2440 +3440 +C440 +04C0 +ENDCHAR +STARTCHAR U_73EA +ENCODING 29674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2100 +7FE0 +2100 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73EB +ENCODING 29675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2240 +77E0 +22A0 +2280 +3A80 +E4A0 +48A0 +1060 +ENDCHAR +STARTCHAR U_73EC +ENCODING 29676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +4FE0 +4900 +E940 +4F40 +4940 +6880 +D140 +1660 +2020 +ENDCHAR +STARTCHAR U_73ED +ENCODING 29677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2280 +2A80 +FA80 +2BE0 +2A80 +2480 +3480 +C880 +13E0 +ENDCHAR +STARTCHAR U_73EE +ENCODING 29678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F840 +4FC0 +4A40 +EFC0 +4AC0 +4AC0 +6AC0 +CAC0 +1220 +2220 +ENDCHAR +STARTCHAR U_73EF +ENCODING 29679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F220 +4FA0 +4240 +FFE0 +4100 +4640 +6C80 +D700 +2420 +03E0 +ENDCHAR +STARTCHAR U_73F0 +ENCODING 29680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +2340 +2100 +27E0 +F020 +2020 +27E0 +3820 +C020 +07E0 +ENDCHAR +STARTCHAR U_73F1 +ENCODING 29681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F920 +2440 +2080 +F900 +2FE0 +2240 +3640 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_73F2 +ENCODING 29682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +2100 +27E0 +7280 +27E0 +2080 +37E0 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_73F3 +ENCODING 29683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +F420 +5F40 +4AA0 +EA40 +4AA0 +4440 +7680 +C900 +10E0 +6040 +ENDCHAR +STARTCHAR U_73F4 +ENCODING 29684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +FEC0 +22A0 +2FE0 +7280 +23A0 +26A0 +3AC0 +C260 +0AA0 +0520 +ENDCHAR +STARTCHAR U_73F5 +ENCODING 29685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +23C0 +7000 +27E0 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73F6 +ENCODING 29686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2120 +77E0 +2500 +27E0 +3B20 +C520 +0960 +1100 +ENDCHAR +STARTCHAR U_73F7 +ENCODING 29687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +EEC0 +40A0 +5FE0 +E280 +4280 +4B80 +4A80 +6AA0 +CB60 +1C20 +ENDCHAR +STARTCHAR U_73F8 +ENCODING 29688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27C0 +2240 +7240 +27E0 +2000 +3BC0 +E240 +43C0 +0240 +ENDCHAR +STARTCHAR U_73F9 +ENCODING 29689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +4FE0 +4900 +FF20 +4AA0 +4AC0 +4A80 +6AA0 +DB60 +2420 +ENDCHAR +STARTCHAR U_73FA +ENCODING 29690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F940 +2FE0 +2140 +77C0 +2200 +23E0 +3620 +CA20 +03E0 +0220 +ENDCHAR +STARTCHAR U_73FB +ENCODING 29691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFC0 +5000 +47C0 +F540 +5FE0 +4A40 +6A40 +CFE0 +0140 +0080 +ENDCHAR +STARTCHAR U_73FC +ENCODING 29692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +7420 +27E0 +2420 +3FE0 +E240 +4420 +0820 +ENDCHAR +STARTCHAR U_73FD +ENCODING 29693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +FBC0 +2240 +2440 +77E0 +2240 +2240 +3BE0 +C600 +0900 +10E0 +ENDCHAR +STARTCHAR U_73FE +ENCODING 29694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2440 +77C0 +2440 +27C0 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_73FF +ENCODING 29695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7100 +2100 +25C0 +3D00 +C500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_7400 +ENCODING 29696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F300 +4480 +4A60 +5780 +E100 +4200 +5FC0 +6840 +8FC0 +0840 +ENDCHAR +STARTCHAR U_7401 +ENCODING 29697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2400 +27E0 +70A0 +2280 +22E0 +3A80 +C280 +0580 +08E0 +ENDCHAR +STARTCHAR U_7402 +ENCODING 29698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4000 +47C0 +F000 +47C0 +4000 +77C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_7403 +ENCODING 29699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +2FE0 +2100 +2520 +F340 +2180 +2340 +3520 +C920 +0300 +ENDCHAR +STARTCHAR U_7404 +ENCODING 29700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +23C0 +2000 +77E0 +2420 +27E0 +3C20 +C7E0 +0420 +04E0 +ENDCHAR +STARTCHAR U_7405 +ENCODING 29701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27C0 +2440 +77C0 +2440 +27E0 +3D40 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_7406 +ENCODING 29702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2920 +2920 +FFE0 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_7407 +ENCODING 29703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2FE0 +2380 +7D60 +2000 +27C0 +3A40 +C2E0 +0420 +18C0 +ENDCHAR +STARTCHAR U_7408 +ENCODING 29704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F7A0 +2520 +22C0 +77E0 +2040 +2080 +37E0 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_7409 +ENCODING 29705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4200 +4480 +4FC0 +E000 +4A80 +4A80 +6AA0 +CAA0 +12E0 +ENDCHAR +STARTCHAR U_740A +ENCODING 29706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E2A0 +4AA0 +4AA0 +FFC0 +42A0 +46A0 +6AA0 +D2E0 +2A80 +0480 +ENDCHAR +STARTCHAR U_740B +ENCODING 29707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F980 +2240 +2100 +F7E0 +2280 +27E0 +3AA0 +C2A0 +02E0 +0080 +ENDCHAR +STARTCHAR U_740C +ENCODING 29708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FD20 +27E0 +2100 +F280 +2640 +2920 +37C0 +C040 +0080 +0100 +ENDCHAR +STARTCHAR U_740D +ENCODING 29709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FC20 +24A0 +3FA0 +64A0 +26A0 +2DA0 +34A0 +E420 +04A0 +0440 +ENDCHAR +STARTCHAR U_740E +ENCODING 29710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +E240 +57E0 +4A40 +E240 +5FE0 +4A40 +4A40 +6A40 +CC40 +17E0 +ENDCHAR +STARTCHAR U_740F +ENCODING 29711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2680 +2280 +7FE0 +2480 +27E0 +3C80 +C480 +0A00 +11E0 +ENDCHAR +STARTCHAR U_7410 +ENCODING 29712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +FAC0 +2080 +27E0 +7420 +24A0 +24A0 +3CA0 +C5A0 +0240 +0C20 +ENDCHAR +STARTCHAR U_7411 +ENCODING 29713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2100 +27C0 +F440 +27C0 +2440 +37C0 +C440 +0440 +04C0 +ENDCHAR +STARTCHAR U_7412 +ENCODING 29714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2C40 +2380 +E540 +2BA0 +2100 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_7413 +ENCODING 29715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +27C0 +F000 +2FE0 +2280 +3280 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7414 +ENCODING 29716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +4820 +47C0 +4100 +E500 +45C0 +7500 +CD00 +0B00 +10E0 +ENDCHAR +STARTCHAR U_7415 +ENCODING 29717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFC0 +4A40 +4FC0 +EA40 +4FC0 +4500 +7FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7416 +ENCODING 29718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FC80 +27E0 +2280 +7320 +2CE0 +2480 +3FE0 +E280 +4320 +0CE0 +ENDCHAR +STARTCHAR U_7417 +ENCODING 29719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4480 +4480 +E480 +4B40 +4200 +7FE0 +8200 +0200 +0200 +ENDCHAR +STARTCHAR U_7418 +ENCODING 29720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +4A00 +4FC0 +EAA0 +4C60 +47C0 +6440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_7419 +ENCODING 29721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +E140 +5FE0 +4100 +5D20 +F520 +5D40 +4080 +6DA0 +9260 +0420 +ENDCHAR +STARTCHAR U_741A +ENCODING 29722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7480 +27E0 +2480 +37E0 +CA20 +13E0 +2220 +ENDCHAR +STARTCHAR U_741B +ENCODING 29723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2AA0 +2440 +F100 +2FE0 +2100 +3380 +E540 +0920 +1120 +ENDCHAR +STARTCHAR U_741C +ENCODING 29724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2540 +F540 +2BA0 +2100 +3380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_741D +ENCODING 29725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2100 +2FE0 +3480 +E300 +0480 +1860 +ENDCHAR +STARTCHAR U_741E +ENCODING 29726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7CC0 +0000 +7FE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_741F +ENCODING 29727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +27E0 +2C80 +3480 +E7C0 +2480 +27C0 +3480 +C7E0 +0400 +ENDCHAR +STARTCHAR U_7420 +ENCODING 29728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +2FE0 +2AA0 +FAA0 +2FE0 +2AA0 +2AA0 +FFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_7421 +ENCODING 29729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +F6A0 +44A0 +44A0 +5FA0 +E4A0 +4EA0 +55A0 +7440 +C4A0 +0D20 +ENDCHAR +STARTCHAR U_7422 +ENCODING 29730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +2220 +2640 +FB80 +2480 +2BC0 +32C0 +C4A0 +0CA0 +1320 +ENDCHAR +STARTCHAR U_7423 +ENCODING 29731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +2280 +77E0 +2000 +27E0 +3420 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_7424 +ENCODING 29732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +2FE0 +F120 +2FE0 +2120 +37E0 +C100 +0100 +0300 +ENDCHAR +STARTCHAR U_7425 +ENCODING 29733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F100 +4FE0 +4920 +4F80 +E920 +49E0 +4800 +6B80 +D2A0 +2CE0 +ENDCHAR +STARTCHAR U_7426 +ENCODING 29734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +2280 +7FE0 +2040 +2740 +3540 +C740 +0040 +00C0 +ENDCHAR +STARTCHAR U_7427 +ENCODING 29735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7428 +ENCODING 29736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +77E0 +2480 +24A0 +3EC0 +E480 +46A0 +0CE0 +ENDCHAR +STARTCHAR U_7429 +ENCODING 29737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +23C0 +2240 +73C0 +2000 +27E0 +3420 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_742A +ENCODING 29738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +27C0 +F440 +27C0 +2440 +3FE0 +C000 +0440 +0820 +ENDCHAR +STARTCHAR U_742B +ENCODING 29739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +F200 +2FE0 +2940 +37A0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_742C +ENCODING 29740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2400 +27E0 +F5A0 +2DA0 +32E0 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_742D +ENCODING 29741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +27C0 +2040 +F7E0 +2920 +2540 +3380 +C540 +0920 +0300 +ENDCHAR +STARTCHAR U_742E +ENCODING 29742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2420 +23C0 +7000 +27E0 +2080 +3AC0 +C4A0 +0AA0 +0100 +ENDCHAR +STARTCHAR U_742F +ENCODING 29743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +27C0 +7440 +27C0 +2400 +37E0 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_7430 +ENCODING 29744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +2580 +2980 +7240 +2D20 +2140 +3D80 +E500 +4280 +1C60 +ENDCHAR +STARTCHAR U_7431 +ENCODING 29745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2BA0 +2920 +FFE0 +2820 +2BA0 +3AA0 +CBA0 +1020 +2060 +ENDCHAR +STARTCHAR U_7432 +ENCODING 29746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2EE0 +2280 +7280 +2EE0 +2280 +3280 +CEE0 +0280 +0280 +ENDCHAR +STARTCHAR U_7433 +ENCODING 29747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2FE0 +2480 +F480 +2EC0 +35A0 +26A0 +3480 +C480 +0480 +ENDCHAR +STARTCHAR U_7434 +ENCODING 29748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0400 +1B00 +E4E0 +1F00 +0200 +0400 +ENDCHAR +STARTCHAR U_7435 +ENCODING 29749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +4200 +4240 +7B80 +4220 +5A20 +61E0 +ENDCHAR +STARTCHAR U_7436 +ENCODING 29750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0000 +7F80 +4480 +7F80 +4020 +3FE0 +ENDCHAR +STARTCHAR U_7437 +ENCODING 29751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4200 +4FC0 +F200 +5FE0 +4500 +7500 +C520 +0920 +10E0 +ENDCHAR +STARTCHAR U_7438 +ENCODING 29752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F200 +4FC0 +4840 +EFC0 +4840 +4FC0 +7200 +9FE0 +0200 +0200 +ENDCHAR +STARTCHAR U_7439 +ENCODING 29753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1100 +7BC0 +1100 +FBE0 +0400 +7FC0 +0D00 +1480 +E460 +0400 +ENDCHAR +STARTCHAR U_743A +ENCODING 29754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +23E0 +2880 +2480 +F3E0 +2480 +2480 +3920 +CBE0 +0920 +ENDCHAR +STARTCHAR U_743B +ENCODING 29755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E300 +4480 +5840 +EFA0 +4200 +4FC0 +4200 +6A40 +C680 +1FE0 +ENDCHAR +STARTCHAR U_743C +ENCODING 29756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2000 +27C0 +2440 +F440 +27C0 +2100 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_743D +ENCODING 29757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFA0 +4240 +5FE0 +E100 +47C0 +5C40 +47C0 +7440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_743E +ENCODING 29758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA40 +4FC0 +4A40 +EFC0 +4500 +4880 +74E0 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_743F +ENCODING 29759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2100 +F7C0 +2540 +27C0 +3540 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_7440 +ENCODING 29760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2100 +27C0 +7540 +27C0 +2100 +3FE0 +C960 +0FA0 +0860 +ENDCHAR +STARTCHAR U_7441 +ENCODING 29761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +25A0 +2420 +75A0 +2000 +27E0 +3C20 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_7442 +ENCODING 29762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +27E0 +2400 +75E0 +2520 +25E0 +3D20 +C5E0 +0920 +11E0 +ENDCHAR +STARTCHAR U_7443 +ENCODING 29763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +4200 +5FC0 +E200 +5FE0 +4880 +58C0 +EFA0 +0880 +0F80 +ENDCHAR +STARTCHAR U_7444 +ENCODING 29764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +2820 +27C0 +F000 +27C0 +2440 +37C0 +C440 +0FE0 +ENDCHAR +STARTCHAR U_7445 +ENCODING 29765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +4780 +4480 +F780 +5FE0 +4A00 +6B80 +CE00 +1300 +20E0 +ENDCHAR +STARTCHAR U_7446 +ENCODING 29766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +77E0 +2480 +27E0 +3880 +C3E0 +0080 +0FE0 +ENDCHAR +STARTCHAR U_7447 +ENCODING 29767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4100 +4FE0 +F7C0 +4540 +5FE0 +6A80 +CFE0 +0280 +0100 +ENDCHAR +STARTCHAR U_7448 +ENCODING 29768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F280 +4100 +4FE0 +F540 +4A00 +4100 +6FE0 +C380 +0540 +1920 +ENDCHAR +STARTCHAR U_7449 +ENCODING 29769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +4FC0 +4900 +EFE0 +4880 +4FE0 +6840 +CFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_744A +ENCODING 29770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F0A0 +2FE0 +2880 +7E80 +28A0 +2EA0 +3AC0 +EEA0 +1160 +2220 +ENDCHAR +STARTCHAR U_744B +ENCODING 29771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2140 +27E0 +7240 +23C0 +2080 +37E0 +C280 +07E0 +0080 +ENDCHAR +STARTCHAR U_744C +ENCODING 29772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E200 +4FE0 +4AA0 +EAA0 +4AE0 +4100 +7FE0 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_744D +ENCODING 29773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F780 +2900 +27C0 +7540 +26C0 +2540 +3FE0 +E100 +4280 +0C60 +ENDCHAR +STARTCHAR U_744E +ENCODING 29774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F4A0 +27C0 +24A0 +76E0 +2100 +27E0 +3420 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_744F +ENCODING 29775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2440 +77E0 +2480 +2FE0 +3980 +C280 +0480 +0980 +ENDCHAR +STARTCHAR U_7450 +ENCODING 29776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2000 +7E20 +2AA0 +2EA0 +3AA0 +CEA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_7451 +ENCODING 29777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2780 +2080 +77E0 +2340 +2580 +3A80 +C5C0 +02A0 +0DA0 +ENDCHAR +STARTCHAR U_7452 +ENCODING 29778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2440 +7FE0 +2200 +27E0 +3AA0 +C4A0 +0920 +0260 +ENDCHAR +STARTCHAR U_7453 +ENCODING 29779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +4200 +5FC0 +FAC0 +5740 +5FC0 +6700 +CA80 +3260 +0200 +ENDCHAR +STARTCHAR U_7454 +ENCODING 29780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2440 +27C0 +7440 +27C0 +2120 +3F40 +C580 +0940 +1320 +ENDCHAR +STARTCHAR U_7455 +ENCODING 29781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FA20 +2A20 +2EE0 +7800 +2EE0 +28A0 +3EA0 +C840 +08A0 +0B20 +ENDCHAR +STARTCHAR U_7456 +ENCODING 29782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EDC0 +4940 +4D60 +EA00 +4DE0 +4940 +6DC0 +D880 +0940 +0A60 +ENDCHAR +STARTCHAR U_7457 +ENCODING 29783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FA20 +2540 +27E0 +7200 +2FE0 +2200 +3BC0 +C640 +0980 +1660 +ENDCHAR +STARTCHAR U_7458 +ENCODING 29784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +4AA0 +4EA0 +EAC0 +4EA0 +4BA0 +6EE0 +DA80 +0280 +0280 +ENDCHAR +STARTCHAR U_7459 +ENCODING 29785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +2540 +22A0 +7100 +2FE0 +2AA0 +3920 +CAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_745A +ENCODING 29786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +F4A0 +2FA0 +24E0 +74A0 +2EA0 +2AE0 +3AA0 +CEA0 +0120 +0260 +ENDCHAR +STARTCHAR U_745B +ENCODING 29787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2100 +77C0 +2540 +2540 +3FE0 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_745C +ENCODING 29788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +EB60 +4000 +4E20 +EAA0 +4EA0 +4AA0 +6EA0 +CA20 +0AE0 +ENDCHAR +STARTCHAR U_745D +ENCODING 29789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +4640 +4540 +F7C0 +4000 +47C0 +7100 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_745E +ENCODING 29790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F920 +2FE0 +2000 +7FE0 +2200 +2FE0 +3AA0 +CAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_745F +ENCODING 29791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0880 +5500 +5240 +94A0 +18A0 +EF80 +ENDCHAR +STARTCHAR U_7460 +ENCODING 29792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F4E0 +44A0 +45A0 +F6A0 +4140 +47E0 +5520 +67E0 +C520 +07E0 +ENDCHAR +STARTCHAR U_7461 +ENCODING 29793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +5480 +57E0 +FEA0 +52A0 +5EA0 +76A0 +D6E0 +1C80 +0080 +ENDCHAR +STARTCHAR U_7462 +ENCODING 29794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2540 +7280 +2440 +2820 +3FC0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7463 +ENCODING 29795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +27E0 +2420 +F7E0 +2420 +27E0 +3C20 +C7E0 +0240 +0420 +ENDCHAR +STARTCHAR U_7464 +ENCODING 29796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2440 +2A80 +7500 +27E0 +2900 +37E0 +C100 +0520 +07E0 +ENDCHAR +STARTCHAR U_7465 +ENCODING 29797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +F880 +4F80 +4880 +EF80 +4000 +5FC0 +5540 +7540 +D540 +3FE0 +ENDCHAR +STARTCHAR U_7466 +ENCODING 29798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EF80 +4880 +4F80 +EFE0 +4800 +4FC0 +6040 +DAC0 +1540 +0080 +ENDCHAR +STARTCHAR U_7467 +ENCODING 29799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FC0 +F200 +2FE0 +25C0 +3920 +EFE0 +4540 +0920 +ENDCHAR +STARTCHAR U_7468 +ENCODING 29800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +46C0 +4280 +EFE0 +4000 +57C0 +6440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_7469 +ENCODING 29801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_746A +ENCODING 29802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD00 +27C0 +2500 +77C0 +2500 +27E0 +38A0 +C560 +0AA0 +12C0 +ENDCHAR +STARTCHAR U_746B +ENCODING 29803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +4920 +4540 +E400 +4300 +4CE0 +5820 +6EE0 +C820 +0FE0 +ENDCHAR +STARTCHAR U_746C +ENCODING 29804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +1FC0 +C880 +1FC0 +CAA0 +5260 +7FC0 +0400 +7FC0 +0500 +FFE0 +ENDCHAR +STARTCHAR U_746D +ENCODING 29805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2940 +2FE0 +F940 +2FC0 +2900 +3BE0 +CA20 +13E0 +2220 +ENDCHAR +STARTCHAR U_746E +ENCODING 29806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_746F +ENCODING 29807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FEA0 +2AA0 +2EA0 +FAC0 +2EA0 +28A0 +3CA0 +EAE0 +0D80 +0880 +ENDCHAR +STARTCHAR U_7470 +ENCODING 29808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2540 +27C0 +7540 +27C0 +2140 +3BA0 +C5E0 +0920 +10E0 +ENDCHAR +STARTCHAR U_7471 +ENCODING 29809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +7440 +2740 +25C0 +3440 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_7472 +ENCODING 29810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2540 +2FE0 +7440 +27C0 +2440 +3FE0 +E620 +4BE0 +1220 +ENDCHAR +STARTCHAR U_7473 +ENCODING 29811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +27E0 +2100 +77C0 +2100 +2FE0 +3200 +C7C0 +0880 +17E0 +ENDCHAR +STARTCHAR U_7474 +ENCODING 29812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2140 +FE20 +8400 +FBE0 +2240 +7940 +2080 +3940 +C620 +ENDCHAR +STARTCHAR U_7475 +ENCODING 29813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F540 +2AC0 +2580 +7660 +2100 +27C0 +3540 +C7C0 +0140 +0FA0 +ENDCHAR +STARTCHAR U_7476 +ENCODING 29814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF20 +2A20 +2540 +7480 +27E0 +2900 +3FE0 +C100 +0920 +0FE0 +ENDCHAR +STARTCHAR U_7477 +ENCODING 29815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +2540 +2FE0 +7920 +2FE0 +2200 +33C0 +C640 +0980 +1660 +ENDCHAR +STARTCHAR U_7478 +ENCODING 29816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +4B80 +F400 +47C0 +4480 +7FE0 +C480 +0840 +1020 +ENDCHAR +STARTCHAR U_7479 +ENCODING 29817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2280 +2380 +7440 +2BA0 +2100 +37E0 +C100 +0540 +0B20 +ENDCHAR +STARTCHAR U_747A +ENCODING 29818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +EA80 +5FE0 +54A0 +E780 +4200 +4FC0 +6A40 +CB40 +0A80 +0200 +ENDCHAR +STARTCHAR U_747B +ENCODING 29819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +4FE0 +4540 +F7C0 +4440 +47C0 +7440 +C7C0 +0440 +0820 +ENDCHAR +STARTCHAR U_747C +ENCODING 29820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27C0 +7540 +27C0 +2120 +3FE0 +E440 +4240 +00C0 +ENDCHAR +STARTCHAR U_747D +ENCODING 29821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0340 +F540 +2940 +26A0 +7440 +2D40 +2560 +3540 +C540 +06C0 +0460 +ENDCHAR +STARTCHAR U_747E +ENCODING 29822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2100 +77C0 +2540 +2FE0 +3100 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_747F +ENCODING 29823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A460 +FBC0 +9240 +FD80 +AA40 +FFC0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7480 +ENCODING 29824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FD20 +27E0 +2500 +77E0 +2C80 +27E0 +3C80 +C7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_7481 +ENCODING 29825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7E0 +2520 +25E0 +76A0 +2560 +26A0 +37E0 +C540 +0CA0 +13E0 +ENDCHAR +STARTCHAR U_7482 +ENCODING 29826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFC0 +4480 +4780 +E480 +5FE0 +4680 +6A40 +57A0 +A200 +0FC0 +ENDCHAR +STARTCHAR U_7483 +ENCODING 29827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2280 +2920 +7AA0 +2FE0 +2100 +3FE0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_7484 +ENCODING 29828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4480 +5FE0 +E840 +4FC0 +4840 +4FC0 +6500 +8520 +18E0 +ENDCHAR +STARTCHAR U_7485 +ENCODING 29829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FA80 +2540 +27C0 +7540 +27C0 +2540 +3FE0 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_7486 +ENCODING 29830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2660 +2AA0 +7320 +2480 +2A60 +3500 +C240 +0080 +0F00 +ENDCHAR +STARTCHAR U_7487 +ENCODING 29831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +E900 +5DE0 +4A00 +FDE0 +5440 +5540 +7560 +D540 +1540 +2AE0 +ENDCHAR +STARTCHAR U_7488 +ENCODING 29832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +24E0 +2FA0 +74A0 +2FA0 +24A0 +3EA0 +CA40 +0AA0 +3520 +ENDCHAR +STARTCHAR U_7489 +ENCODING 29833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2AA0 +23E0 +7AA0 +2BE0 +2880 +3BE0 +C880 +1480 +23E0 +ENDCHAR +STARTCHAR U_748A +ENCODING 29834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +2780 +7100 +2FE0 +2920 +3DA0 +CB60 +0DA0 +0960 +ENDCHAR +STARTCHAR U_748B +ENCODING 29835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7440 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_748C +ENCODING 29836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4BA0 +5100 +47C0 +E540 +47C0 +5540 +67C0 +C280 +0440 +ENDCHAR +STARTCHAR U_748D +ENCODING 29837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2FE0 +2540 +FFE0 +2540 +2FE0 +3100 +DFE0 +0100 +ENDCHAR +STARTCHAR U_748E +ENCODING 29838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2AA0 +2AA0 +7AA0 +2540 +2AA0 +3FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_748F +ENCODING 29839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +4280 +5FE0 +F480 +57A0 +5AC0 +7780 +D280 +15A0 +1860 +ENDCHAR +STARTCHAR U_7490 +ENCODING 29840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +FAE0 +4BA0 +4E40 +F4A0 +4720 +55E0 +5520 +7720 +DDE0 +0120 +ENDCHAR +STARTCHAR U_7491 +ENCODING 29841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +4D40 +5540 +FFE0 +5540 +5540 +7FE0 +D540 +12A0 +22A0 +ENDCHAR +STARTCHAR U_7492 +ENCODING 29842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +FBA0 +26C0 +2440 +7BA0 +2000 +27C0 +3C40 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_7493 +ENCODING 29843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +4280 +4FE0 +E540 +5920 +4FC0 +6240 +C220 +04A0 +1840 +ENDCHAR +STARTCHAR U_7494 +ENCODING 29844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2AA0 +2920 +7FE0 +2000 +27C0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_7495 +ENCODING 29845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +27C0 +2040 +7FE0 +24A0 +2EE0 +3080 +EFE0 +4480 +0380 +ENDCHAR +STARTCHAR U_7496 +ENCODING 29846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F680 +2BE0 +2620 +FBE0 +2A80 +2FE0 +3100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_7497 +ENCODING 29847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A840 +5FC0 +2840 +CFE0 +5520 +7FC0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7498 +ENCODING 29848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2540 +7920 +2540 +2FE0 +3B40 +C7E0 +0440 +1840 +ENDCHAR +STARTCHAR U_7499 +ENCODING 29849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +27C0 +2C60 +F7C0 +2440 +27C0 +3100 +C940 +1320 +ENDCHAR +STARTCHAR U_749A +ENCODING 29850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +2FE0 +2540 +7900 +2FE0 +2AA0 +3FE0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_749B +ENCODING 29851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4240 +5FE0 +F740 +5AC0 +7240 +5FC0 +9AC0 +2740 +2240 +ENDCHAR +STARTCHAR U_749C +ENCODING 29852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +2280 +2FE0 +7100 +27C0 +2540 +37C0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_749D +ENCODING 29853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +5FE0 +E440 +47C0 +4440 +77C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_749E +ENCODING 29854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F6C0 +2FE0 +2280 +7FE0 +2100 +27C0 +3100 +CFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_749F +ENCODING 29855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +7FE0 +2000 +27C0 +3440 +C7C0 +0540 +1B20 +ENDCHAR +STARTCHAR U_74A0 +ENCODING 29856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF20 +2540 +2FE0 +7580 +2940 +27E0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_74A1 +ENCODING 29857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +27E0 +2280 +7BC0 +2A80 +2BC0 +3A80 +CBE0 +0E00 +13E0 +ENDCHAR +STARTCHAR U_74A2 +ENCODING 29858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +4EE0 +4AA0 +EEE0 +4280 +4FE0 +5920 +6FE0 +C920 +0FE0 +ENDCHAR +STARTCHAR U_74A3 +ENCODING 29859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +F2A0 +5FC0 +4AA0 +FFE0 +4540 +5FE0 +6540 +CAA0 +1160 +2620 +ENDCHAR +STARTCHAR U_74A4 +ENCODING 29860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +4A40 +4FC0 +EA40 +4FC0 +4280 +5FE0 +6540 +D460 +13C0 +ENDCHAR +STARTCHAR U_74A5 +ENCODING 29861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +FF80 +52E0 +48A0 +5F20 +F120 +5D20 +55A0 +5D40 +E1A0 +06A0 +ENDCHAR +STARTCHAR U_74A6 +ENCODING 29862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +2540 +2FE0 +7AA0 +27C0 +2A20 +37E0 +CA40 +0180 +1E60 +ENDCHAR +STARTCHAR U_74A7 +ENCODING 29863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7D40 +4480 +7FE0 +8080 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_74A8 +ENCODING 29864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2AA0 +2F40 +75A0 +2320 +2D40 +3580 +CFE0 +0540 +0920 +ENDCHAR +STARTCHAR U_74A9 +ENCODING 29865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F200 +2FE0 +2A20 +7FC0 +2A20 +2FE0 +3AA0 +CDC0 +12A0 +2520 +ENDCHAR +STARTCHAR U_74AA +ENCODING 29866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2000 +7EE0 +2AA0 +2EE0 +3100 +EFE0 +4540 +0920 +ENDCHAR +STARTCHAR U_74AB +ENCODING 29867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2820 +77C0 +2440 +2FE0 +3920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_74AC +ENCODING 29868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +4A80 +4FE0 +EB40 +4F40 +4480 +6E80 +C540 +0A40 +1620 +ENDCHAR +STARTCHAR U_74AD +ENCODING 29869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0920 +EFE0 +5540 +47C0 +FD40 +4FC0 +4900 +6FE0 +C900 +17E0 +ENDCHAR +STARTCHAR U_74AE +ENCODING 29870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4AA0 +4AA0 +EBA0 +4820 +4FE0 +4440 +67C0 +8440 +1FE0 +ENDCHAR +STARTCHAR U_74AF +ENCODING 29871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +F440 +2BA0 +2000 +7FE0 +2AA0 +2FE0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_74B0 +ENCODING 29872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FE0 +2000 +7FE0 +2440 +27C0 +3280 +ECA0 +4540 +0620 +ENDCHAR +STARTCHAR U_74B1 +ENCODING 29873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F440 +2EE0 +2440 +7EE0 +2100 +22C0 +3640 +EAA0 +4340 +1DC0 +ENDCHAR +STARTCHAR U_74B2 +ENCODING 29874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +2FE0 +2920 +72C0 +2980 +2EC0 +39A0 +EEA0 +4900 +17E0 +ENDCHAR +STARTCHAR U_74B3 +ENCODING 29875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0A00 +EFC0 +5700 +5AC0 +EF80 +4A80 +4D80 +6A80 +CF80 +0880 +1040 +ENDCHAR +STARTCHAR U_74B4 +ENCODING 29876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +4EC0 +5560 +F440 +4FE0 +4120 +65C0 +8500 +0B00 +10E0 +ENDCHAR +STARTCHAR U_74B5 +ENCODING 29877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E60 +FBA0 +2A20 +2FE0 +78A0 +2EE0 +2AA0 +3FE0 +E480 +4840 +1020 +ENDCHAR +STARTCHAR U_74B6 +ENCODING 29878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F140 +2FE0 +2140 +7FE0 +2100 +2FE0 +3540 +CFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_74B7 +ENCODING 29879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FF80 +2AE0 +2FA0 +7AA0 +2FA0 +2AA0 +3FA0 +CA40 +0AA0 +1520 +ENDCHAR +STARTCHAR U_74B8 +ENCODING 29880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +23C0 +7580 +23C0 +2E40 +33C0 +C240 +03C0 +0660 +ENDCHAR +STARTCHAR U_74B9 +ENCODING 29881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4200 +5FE0 +F220 +4FC0 +4000 +7FE0 +9540 +1D40 +00C0 +ENDCHAR +STARTCHAR U_74BA +ENCODING 29882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +5140 +7FC0 +5540 +FFE0 +8020 +BFA0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74BB +ENCODING 29883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F5A0 +2360 +25A0 +7100 +2FE0 +2440 +3AA0 +EFE0 +4100 +0100 +ENDCHAR +STARTCHAR U_74BC +ENCODING 29884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E80 +F480 +5EE0 +5280 +FF40 +5420 +5E00 +4000 +6FE0 +CAA0 +3FE0 +ENDCHAR +STARTCHAR U_74BD +ENCODING 29885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4440 +FFE0 +56C0 +6D40 +56C0 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74BE +ENCODING 29886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4AA0 +5540 +F540 +4520 +4FC0 +6840 +CFC0 +0840 +1040 +ENDCHAR +STARTCHAR U_74BF +ENCODING 29887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F100 +2FE0 +2AA0 +7540 +2AA0 +2FE0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_74C0 +ENCODING 29888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7280 +2FE0 +2100 +3FE0 +EAA0 +4AA0 +0860 +ENDCHAR +STARTCHAR U_74C1 +ENCODING 29889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2540 +27E0 +7D00 +27C0 +2500 +3FE0 +C240 +0180 +0E60 +ENDCHAR +STARTCHAR U_74C2 +ENCODING 29890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2540 +27C0 +7100 +2FE0 +2440 +3FE0 +CAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_74C3 +ENCODING 29891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +27C0 +2540 +77C0 +2000 +2FE0 +3AA0 +EFE0 +4AA0 +0FE0 +ENDCHAR +STARTCHAR U_74C4 +ENCODING 29892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4100 +4FE0 +FAA0 +4FE0 +4540 +76C0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74C5 +ENCODING 29893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FBC0 +36A0 +2BE0 +76A0 +2FE0 +2100 +3FE0 +E580 +4940 +1120 +ENDCHAR +STARTCHAR U_74C6 +ENCODING 29894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +F900 +5FE0 +5540 +E640 +4FC0 +4840 +6FC0 +8840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_74C7 +ENCODING 29895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +47C0 +4440 +FFE0 +5540 +4BA0 +6200 +C7C0 +0980 +0660 +ENDCHAR +STARTCHAR U_74C8 +ENCODING 29896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +E5E0 +5EA0 +4EA0 +F520 +4560 +4280 +6D60 +8380 +0D60 +0300 +ENDCHAR +STARTCHAR U_74C9 +ENCODING 29897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +4440 +4FE0 +EAA0 +57C0 +4540 +76C0 +8540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74CA +ENCODING 29898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FFE0 +2AA0 +2FE0 +7440 +27C0 +2440 +37C0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_74CB +ENCODING 29899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4280 +4FE0 +F920 +4FE0 +4920 +6BA0 +CAA0 +1AA0 +27E0 +ENDCHAR +STARTCHAR U_74CC +ENCODING 29900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +4000 +4FE0 +EAA0 +4FE0 +4540 +6B20 +86C0 +1A40 +0320 +ENDCHAR +STARTCHAR U_74CD +ENCODING 29901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +5500 +5BE0 +F480 +57E0 +5940 +75C0 +9540 +1740 +19E0 +ENDCHAR +STARTCHAR U_74CE +ENCODING 29902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FEE0 +4540 +5FE0 +F520 +5FE0 +4520 +6FE0 +9520 +25E0 +0720 +ENDCHAR +STARTCHAR U_74CF +ENCODING 29903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FE80 +2AE0 +2420 +7EE0 +2A80 +2EE0 +3A80 +CEE0 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_74D0 +ENCODING 29904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +5FE0 +52A0 +5F00 +F240 +57C0 +5540 +6FE0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_74D1 +ENCODING 29905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +56C0 +5240 +5FE0 +F6C0 +5B60 +5080 +7480 +D4E0 +2480 +4FE0 +ENDCHAR +STARTCHAR U_74D2 +ENCODING 29906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +E440 +5FE0 +4A40 +F2A0 +47C0 +4540 +7540 +C280 +0C60 +ENDCHAR +STARTCHAR U_74D3 +ENCODING 29907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +F2A0 +5EE0 +52A0 +FFE0 +5120 +57E0 +7560 +97E0 +13A0 +1560 +ENDCHAR +STARTCHAR U_74D4 +ENCODING 29908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2EE0 +2AA0 +7EE0 +2440 +2AA0 +3FE0 +E480 +4300 +1CE0 +ENDCHAR +STARTCHAR U_74D5 +ENCODING 29909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +EFE0 +8B60 +EDA0 +2B60 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74D6 +ENCODING 29910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2EE0 +7280 +2FE0 +2280 +3FE0 +E4A0 +4D40 +1620 +ENDCHAR +STARTCHAR U_74D7 +ENCODING 29911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +2500 +2FC0 +7900 +2FE0 +2AA0 +3FE0 +EAA0 +4BA0 +0860 +ENDCHAR +STARTCHAR U_74D8 +ENCODING 29912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2EE0 +7AA0 +2EE0 +27E0 +3C80 +E7E0 +4480 +07E0 +ENDCHAR +STARTCHAR U_74D9 +ENCODING 29913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +27E0 +2120 +7FE0 +2040 +2FE0 +3B40 +EEC0 +4540 +0AA0 +ENDCHAR +STARTCHAR U_74DA +ENCODING 29914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F540 +2FE0 +2540 +7A60 +27C0 +2440 +37C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74DB +ENCODING 29915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +E460 +5F40 +54E0 +FF40 +5540 +5740 +5A40 +FFA0 +2DA0 +4AA0 +ENDCHAR +STARTCHAR U_74DC +ENCODING 29916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3F00 +2500 +2500 +2500 +2480 +2480 +2440 +4540 +47A0 +8CA0 +ENDCHAR +STARTCHAR U_74DD +ENCODING 29917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F9E0 +AA20 +AC20 +A920 +A8A0 +A8A0 +A420 +AAC0 +B900 +C8E0 +ENDCHAR +STARTCHAR U_74DE +ENCODING 29918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FA80 +ABE0 +AC80 +AFE0 +A880 +A940 +A620 +AA20 +BD80 +A460 +ENDCHAR +STARTCHAR U_74DF +ENCODING 29919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +EBE0 +AC20 +ABA0 +AAA0 +ABA0 +AA40 +AA20 +A5E0 +BA00 +A9E0 +ENDCHAR +STARTCHAR U_74E0 +ENCODING 29920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +5540 +8D40 +7540 +0540 +FD40 +4540 +F520 +1560 +69A0 +ENDCHAR +STARTCHAR U_74E1 +ENCODING 29921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +2540 +FD40 +5540 +2540 +FD20 +2520 +FD20 +25E0 +2920 +ENDCHAR +STARTCHAR U_74E2 +ENCODING 29922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE60 +2BA0 +FEA0 +AAA0 +FEA0 +02A0 +7AA0 +02A0 +FEA0 +5AE0 +B4A0 +ENDCHAR +STARTCHAR U_74E3 +ENCODING 29923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FDE0 +B5A0 +5540 +F5E0 +5540 +5540 +F5E0 +5540 +5740 +A140 +ENDCHAR +STARTCHAR U_74E4 +ENCODING 29924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFA0 +AAA0 +FAA0 +52A0 +FEA0 +52A0 +FEA0 +36A0 +6AA0 +A4E0 +ENDCHAR +STARTCHAR U_74E5 +ENCODING 29925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E920 +AB40 +ADC0 +AAA0 +2480 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_74E6 +ENCODING 29926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +1000 +1F00 +1100 +2900 +2500 +2520 +2120 +F920 +40E0 +ENDCHAR +STARTCHAR U_74E7 +ENCODING 29927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4100 +7900 +4FC0 +4900 +6900 +5900 +4900 +4920 +4820 +67E0 +ENDCHAR +STARTCHAR U_74E8 +ENCODING 29928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +2200 +2780 +2480 +2680 +3580 +C480 +0580 +0EA0 +04E0 +ENDCHAR +STARTCHAR U_74E9 +ENCODING 29929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +4380 +4080 +7C80 +47E0 +6480 +5480 +4480 +44A0 +7420 +C3E0 +ENDCHAR +STARTCHAR U_74EA +ENCODING 29930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +4200 +7BC0 +4A40 +4B40 +6A80 +4C80 +4960 +6A20 +47E0 +ENDCHAR +STARTCHAR U_74EB +ENCODING 29931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2180 +DF60 +0900 +1200 +7FE0 +1000 +1F00 +1900 +2520 +30E0 +ENDCHAR +STARTCHAR U_74EC +ENCODING 29932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2400 +FC00 +4780 +7480 +5680 +5580 +5480 +54A0 +96A0 +ACE0 +ENDCHAR +STARTCHAR U_74ED +ENCODING 29933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +AB80 +2280 +2280 +3580 +5480 +5C80 +56A0 +8460 +ENDCHAR +STARTCHAR U_74EE +ENCODING 29934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2480 +C960 +1E80 +0000 +FFE0 +2000 +3F00 +4920 +4520 +79E0 +ENDCHAR +STARTCHAR U_74EF +ENCODING 29935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8100 +A900 +ABC0 +9240 +9340 +AAC0 +AA40 +8AC0 +8740 +FA60 +ENDCHAR +STARTCHAR U_74F0 +ENCODING 29936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +4280 +7C40 +4BE0 +6940 +5940 +4A40 +4D40 +68A0 +4FE0 +ENDCHAR +STARTCHAR U_74F1 +ENCODING 29937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +4600 +7200 +5FC0 +5200 +5FC0 +B200 +9240 +91C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74F2 +ENCODING 29938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +4F80 +7200 +5A80 +5F80 +B200 +9240 +91C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74F3 +ENCODING 29939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2200 +FB80 +2280 +2280 +7580 +5480 +5480 +76A0 +0460 +ENDCHAR +STARTCHAR U_74F4 +ENCODING 29940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5200 +8A00 +23C0 +1440 +FE40 +0D40 +5440 +2540 +1660 +1460 +ENDCHAR +STARTCHAR U_74F5 +ENCODING 29941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +8A00 +FA00 +0380 +F480 +9680 +9580 +94A0 +F6A0 +9460 +ENDCHAR +STARTCHAR U_74F6 +ENCODING 29942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5100 +FD00 +51C0 +5240 +FF40 +52C0 +5240 +5240 +5360 +9660 +ENDCHAR +STARTCHAR U_74F7 +ENCODING 29943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +47E0 +2940 +C280 +4440 +FFE0 +1000 +1F00 +2920 +2520 +70E0 +ENDCHAR +STARTCHAR U_74F8 +ENCODING 29944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +7BC0 +4A40 +4A40 +6BC0 +5A40 +8A40 +8BC0 +A820 +C7E0 +ENDCHAR +STARTCHAR U_74F9 +ENCODING 29945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9200 +F380 +0280 +F480 +9680 +F580 +9480 +F4A0 +96A0 +B460 +ENDCHAR +STARTCHAR U_74FA +ENCODING 29946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7B80 +4280 +7A80 +4280 +FD80 +2480 +54A0 +FEA0 +0460 +ENDCHAR +STARTCHAR U_74FB +ENCODING 29947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DBE0 +2100 +D900 +23C0 +FE40 +A240 +FB40 +AAC0 +AA40 +BA40 +2360 +ENDCHAR +STARTCHAR U_74FC +ENCODING 29948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4540 +77C0 +5540 +57C0 +7100 +57C0 +9100 +97C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74FD +ENCODING 29949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FFE0 +90A0 +1F80 +0000 +FFE0 +1000 +1F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_74FE +ENCODING 29950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F100 +2100 +FBC0 +7240 +AB40 +22C0 +FE40 +2A40 +33C0 +CA60 +ENDCHAR +STARTCHAR U_74FF +ENCODING 29951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +8900 +51C0 +FA40 +0340 +7AC0 +4A40 +4A40 +7B40 +4E60 +ENDCHAR +STARTCHAR U_7500 +ENCODING 29952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FF00 +55C0 +FF40 +5540 +55C0 +FD40 +1240 +1B60 +E260 +ENDCHAR +STARTCHAR U_7501 +ENCODING 29953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +57E0 +F900 +5100 +53C0 +DE40 +5340 +52C0 +5480 +56A0 +9460 +ENDCHAR +STARTCHAR U_7502 +ENCODING 29954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1100 +FD00 +83C0 +FE40 +8340 +FEC0 +AA40 +FE40 +AA40 +8760 +ENDCHAR +STARTCHAR U_7503 +ENCODING 29955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD20 +2540 +F980 +7240 +AC20 +FFE0 +1000 +3F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_7504 +ENCODING 29956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +FE80 +AAE0 +AAA0 +FF20 +11A0 +7D60 +1120 +1DA0 +E120 +ENDCHAR +STARTCHAR U_7505 +ENCODING 29957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4400 +77C0 +9540 +97C0 +D500 +B7C0 +9500 +9BC0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_7506 +ENCODING 29958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5280 +2940 +FBE0 +0000 +FFE0 +2000 +3F00 +4920 +74E0 +ENDCHAR +STARTCHAR U_7507 +ENCODING 29959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +B2C0 +A480 +5140 +8A20 +FFE0 +9020 +9F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_7508 +ENCODING 29960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7900 +4900 +7BC0 +4A40 +7B40 +12C0 +FE40 +3240 +5B40 +9660 +ENDCHAR +STARTCHAR U_7509 +ENCODING 29961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +5100 +FDC0 +5540 +FF40 +55C0 +FD40 +5940 +D540 +51A0 +ENDCHAR +STARTCHAR U_750A +ENCODING 29962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +5500 +FFC0 +5540 +7D40 +5540 +FEC0 +2A40 +3B60 +C660 +ENDCHAR +STARTCHAR U_750B +ENCODING 29963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD00 +4500 +29C0 +FE40 +9340 +FEC0 +9240 +BA40 +AB40 +BA60 +ENDCHAR +STARTCHAR U_750C +ENCODING 29964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8100 +BD00 +A5C0 +BD40 +8140 +FDC0 +9540 +FD40 +81C0 +FF60 +ENDCHAR +STARTCHAR U_750D +ENCODING 29965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2940 +FFE0 +9020 +1F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_750E +ENCODING 29966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5500 +7DC0 +5540 +7D40 +15C0 +FF40 +4940 +69C0 +1160 +ENDCHAR +STARTCHAR U_750F +ENCODING 29967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +1100 +7C60 +4580 +7C60 +2980 +FFE0 +2000 +3F80 +24A0 +72E0 +ENDCHAR +STARTCHAR U_7510 +ENCODING 29968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +5480 +FE80 +55C0 +9340 +2540 +7FC0 +9540 +7F40 +45C0 +8560 +ENDCHAR +STARTCHAR U_7511 +ENCODING 29969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2900 +FD00 +ABC0 +9240 +FF40 +4AC0 +7A40 +4A40 +7B40 +4A60 +ENDCHAR +STARTCHAR U_7512 +ENCODING 29970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E80 +D480 +55E0 +FF20 +55A0 +5560 +FF20 +5520 +ABA0 +AB20 +ENDCHAR +STARTCHAR U_7513 +ENCODING 29971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +BFE0 +2480 +FFE0 +1000 +3F00 +2920 +35E0 +ENDCHAR +STARTCHAR U_7514 +ENCODING 29972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +4480 +FE80 +6BE0 +7F20 +41A0 +5D60 +4120 +7D20 +A5A0 +BD20 +ENDCHAR +STARTCHAR U_7515 +ENCODING 29973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5480 +2FE0 +7480 +17E0 +2480 +FFE0 +2000 +3F20 +4920 +E5E0 +ENDCHAR +STARTCHAR U_7516 +ENCODING 29974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2A80 +FFE0 +2000 +3F80 +4920 +E5E0 +ENDCHAR +STARTCHAR U_7517 +ENCODING 29975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2100 +FD00 +A3C0 +FE40 +AB40 +AAC0 +FE40 +D640 +FF40 +A660 +ENDCHAR +STARTCHAR U_7518 +ENCODING 29976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2100 +FFC0 +2100 +2100 +2100 +3F00 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_7519 +ENCODING 29977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +4500 +FF00 +4500 +7CA0 +44A0 +7C60 +4420 +ENDCHAR +STARTCHAR U_751A +ENCODING 29978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +2900 +3080 +3FC0 +ENDCHAR +STARTCHAR U_751B +ENCODING 29979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48C0 +4F00 +4900 +F900 +4FE0 +4900 +7BC0 +4A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_751C +ENCODING 29980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E240 +2240 +27E0 +FA40 +2240 +FBC0 +8A40 +8A40 +FBC0 +8A40 +ENDCHAR +STARTCHAR U_751D +ENCODING 29981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A40 +2240 +FFE0 +A240 +F240 +ABC0 +BA40 +83C0 +BA40 +A820 +CFE0 +ENDCHAR +STARTCHAR U_751E +ENCODING 29982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +9120 +1F00 +1100 +FFE0 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_751F +ENCODING 29983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2200 +3FE0 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_7520 +ENCODING 29984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A900 +AFE0 +B100 +E100 +A7C0 +A100 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7521 +ENCODING 29985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +7FE0 +9480 +1080 +7BE0 +1080 +1C80 +F080 +47E0 +ENDCHAR +STARTCHAR U_7522 +ENCODING 29986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +0900 +7FE0 +5200 +5FC0 +6200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7523 +ENCODING 29987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +1080 +0900 +7FC0 +4A00 +5FC0 +6200 +4FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_7524 +ENCODING 29988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +2280 +6BE0 +AC80 +53E0 +B880 +57E0 +9200 +51E0 +2040 +ENDCHAR +STARTCHAR U_7525 +ENCODING 29989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +54A0 +7FE0 +94A0 +97E0 +7900 +17E0 +1120 +1A20 +E420 +08C0 +ENDCHAR +STARTCHAR U_7526 +ENCODING 29990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2280 +FA80 +ABE0 +FC80 +ABE0 +F880 +A080 +67E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7527 +ENCODING 29991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7BC0 +9500 +7BC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7528 +ENCODING 29992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +4440 +4440 +8440 +84C0 +ENDCHAR +STARTCHAR U_7529 +ENCODING 29993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +2440 +3FC0 +2440 +3FC0 +2440 +2440 +25C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_752A +ENCODING 29994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0800 +3FE0 +2220 +3FE0 +2220 +3FE0 +2220 +2220 +4220 +80E0 +ENDCHAR +STARTCHAR U_752B +ENCODING 29995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_752C +ENCODING 29996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +1100 +0A00 +7F80 +4880 +7F80 +4880 +7F80 +4880 +4A80 +4100 +ENDCHAR +STARTCHAR U_752D +ENCODING 29997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +3580 +C440 +7F80 +4480 +7F80 +4480 +7F80 +4480 +8580 +ENDCHAR +STARTCHAR U_752E +ENCODING 29998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +7F80 +9480 +2900 +7F80 +4880 +7F80 +4880 +7F80 +4880 +4980 +ENDCHAR +STARTCHAR U_752F +ENCODING 29999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5140 +9F20 +3F80 +2480 +3F80 +2480 +3F80 +2480 +ENDCHAR +STARTCHAR U_7530 +ENCODING 30000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_7531 +ENCODING 30001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_7532 +ENCODING 30002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8880 +8880 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_7533 +ENCODING 30003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +ENDCHAR +STARTCHAR U_7534 +ENCODING 30004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +8880 +8880 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_7535 +ENCODING 30005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +FF80 +8880 +8880 +FF80 +0840 +0840 +07C0 +ENDCHAR +STARTCHAR U_7536 +ENCODING 30006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +10 +20 +FF +91 +91 +91 +FF +91 +91 +FF +81 +ENDCHAR +STARTCHAR U_7537 +ENCODING 30007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0800 +FFC0 +0840 +1040 +2240 +C180 +ENDCHAR +STARTCHAR U_7538 +ENCODING 30008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +7FA0 +A4A0 +3FA0 +24A0 +3FA0 +20A0 +0020 +01C0 +ENDCHAR +STARTCHAR U_7539 +ENCODING 30009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F80 +4480 +7F80 +4480 +FFC0 +2000 +7F80 +0080 +0880 +0700 +ENDCHAR +STARTCHAR U_753A +ENCODING 30010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +A880 +A880 +F880 +A880 +A880 +A880 +F880 +0080 +0380 +ENDCHAR +STARTCHAR U_753B +ENCODING 30011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +A4A0 +A4A0 +BFA0 +A4A0 +A4A0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_753C +ENCODING 30012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_753D +ENCODING 30013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FAA0 +AAA0 +AAA0 +FAA0 +AAA0 +AAA0 +FAA0 +8AA0 +04A0 +0820 +ENDCHAR +STARTCHAR U_753E +ENCODING 30014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2480 +4900 +9200 +4900 +2480 +FF80 +8880 +FF80 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_753F +ENCODING 30015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +AFE0 +AA00 +FA00 +AA00 +AA00 +FA00 +8A00 +03E0 +0200 +ENDCHAR +STARTCHAR U_7540 +ENCODING 30016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0000 +FFC0 +2200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_7541 +ENCODING 30017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FFE0 +1100 +1100 +6100 +ENDCHAR +STARTCHAR U_7542 +ENCODING 30018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +A9C0 +AA40 +FC40 +A840 +A880 +F980 +0240 +0420 +1820 +ENDCHAR +STARTCHAR U_7543 +ENCODING 30019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AA20 +FC20 +A9A0 +F8A0 +2020 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_7544 +ENCODING 30020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +8C60 +6480 +2100 +7FC0 +4440 +4440 +7FC0 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7545 +ENCODING 30021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F880 +A900 +AA00 +FFE0 +AAA0 +AAA0 +FCA0 +A920 +2220 +24C0 +ENDCHAR +STARTCHAR U_7546 +ENCODING 30022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1080 +FE80 +0080 +F880 +A900 +F900 +AA40 +AA40 +FFE0 +8820 +ENDCHAR +STARTCHAR U_7547 +ENCODING 30023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +AA20 +AD20 +F8A0 +A820 +A8A0 +AB20 +F820 +8820 +00C0 +ENDCHAR +STARTCHAR U_7548 +ENCODING 30024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FB80 +AA00 +AA00 +FBE0 +AAA0 +AAA0 +FAA0 +8A40 +04A0 +0920 +ENDCHAR +STARTCHAR U_7549 +ENCODING 30025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +A900 +F900 +AFE0 +A900 +FA80 +0480 +0840 +1020 +ENDCHAR +STARTCHAR U_754A +ENCODING 30026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +AFE0 +AA40 +FA40 +AFE0 +AA40 +FA40 +0240 +0440 +0840 +ENDCHAR +STARTCHAR U_754B +ENCODING 30027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +A9E0 +AB40 +FD40 +A940 +A940 +F940 +8880 +0340 +0C20 +ENDCHAR +STARTCHAR U_754C +ENCODING 30028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0A00 +3180 +D160 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_754D +ENCODING 30029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AA80 +AC60 +FA80 +AA80 +AA80 +FA80 +0280 +0480 +0880 +ENDCHAR +STARTCHAR U_754E +ENCODING 30030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +A900 +AFE0 +F900 +A900 +A900 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_754F +ENCODING 30031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0000 +FFE0 +2440 +2280 +2900 +30E0 +ENDCHAR +STARTCHAR U_7550 +ENCODING 30032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0000 +7F00 +4100 +7F00 +0000 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7551 +ENCODING 30033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +24A0 +6CA0 +74A0 +A7E0 +24A0 +34A0 +4CA0 +47E0 +8000 +ENDCHAR +STARTCHAR U_7552 +ENCODING 30034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FD00 +0100 +F900 +AA80 +FA80 +AA80 +FA40 +0460 +0840 +ENDCHAR +STARTCHAR U_7553 +ENCODING 30035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7500 +1600 +2580 +D460 +0800 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7554 +ENCODING 30036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FCA0 +AAC0 +A880 +FBE0 +A880 +AFE0 +F880 +8880 +0080 +0080 +ENDCHAR +STARTCHAR U_7555 +ENCODING 30037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +0000 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7556 +ENCODING 30038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +AE80 +AA80 +FA80 +AA80 +AA80 +FA40 +0B40 +0AC0 +1360 +2040 +ENDCHAR +STARTCHAR U_7557 +ENCODING 30039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0000 +3F80 +2080 +7FC0 +4440 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7558 +ENCODING 30040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +AD40 +FFC0 +AD40 +AFE0 +FC40 +0440 +0540 +0480 +ENDCHAR +STARTCHAR U_7559 +ENCODING 30041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3000 +C7C0 +9240 +B240 +D540 +8880 +7F80 +4880 +7F80 +4880 +7F80 +ENDCHAR +STARTCHAR U_755A +ENCODING 30042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2100 +FFE0 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_755B +ENCODING 30043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F980 +AA40 +ACA0 +F900 +AE40 +A980 +FE20 +8840 +0180 +0600 +ENDCHAR +STARTCHAR U_755C +ENCODING 30044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0880 +3F00 +0440 +7FE0 +2240 +3FC0 +2240 +3FC0 +2040 +ENDCHAR +STARTCHAR U_755D +ENCODING 30045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FFC0 +0240 +FC40 +A880 +A880 +F940 +AA40 +FC20 +8820 +ENDCHAR +STARTCHAR U_755E +ENCODING 30046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0500 +FDC0 +AD40 +FE40 +AC80 +AD40 +FE20 +0420 +0400 +ENDCHAR +STARTCHAR U_755F +ENCODING 30047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +2100 +D0C0 +3F00 +5200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_7560 +ENCODING 30048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7561 +ENCODING 30049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A900 +AA40 +FFC0 +A880 +A920 +FA40 +0080 +0360 +0C20 +ENDCHAR +STARTCHAR U_7562 +ENCODING 30050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7563 +ENCODING 30051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2E80 +C060 +1F00 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7564 +ENCODING 30052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +A880 +AFE0 +F840 +A840 +AFE0 +FA40 +8940 +0040 +01C0 +ENDCHAR +STARTCHAR U_7565 +ENCODING 30053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +AE40 +A980 +FA40 +AC20 +ABC0 +AA40 +FA40 +8BC0 +0240 +ENDCHAR +STARTCHAR U_7566 +ENCODING 30054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +A900 +FFE0 +A900 +A900 +FFC0 +8900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_7567 +ENCODING 30055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8880 +FF80 +3F00 +D200 +0C00 +FFC0 +2100 +3F00 +ENDCHAR +STARTCHAR U_7568 +ENCODING 30056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +1600 +FFE0 +1500 +64E0 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7569 +ENCODING 30057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +AFE0 +A900 +F920 +AAC0 +AE80 +FA80 +0240 +0320 +0200 +ENDCHAR +STARTCHAR U_756A +ENCODING 30058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +1500 +FFE0 +2480 +4440 +BFE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_756B +ENCODING 30059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7F80 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_756C +ENCODING 30060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0400 +FFE0 +2480 +FFE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_756D +ENCODING 30061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +AC40 +ABA0 +F900 +AFE0 +A900 +FD40 +0920 +1520 +0200 +ENDCHAR +STARTCHAR U_756E +ENCODING 30062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +AC00 +ABE0 +FAA0 +AFE0 +AB20 +FAA0 +03E0 +0140 +0080 +ENDCHAR +STARTCHAR U_756F +ENCODING 30063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA40 +AFE0 +AA40 +FD20 +ABE0 +AA20 +FE40 +8980 +0240 +0420 +ENDCHAR +STARTCHAR U_7570 +ENCODING 30064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +1100 +FFC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7571 +ENCODING 30065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4A40 +7BC0 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7572 +ENCODING 30066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0000 +FFE0 +2480 +7FE0 +A440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7573 +ENCODING 30067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +8020 +9F40 +1500 +1B00 +1500 +7FE0 +ENDCHAR +STARTCHAR U_7574 +ENCODING 30068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A900 +AFC0 +F900 +AFE0 +AA40 +FFE0 +8A40 +1140 +0080 +ENDCHAR +STARTCHAR U_7575 +ENCODING 30069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +3F80 +0400 +FFE0 +1500 +5F40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_7576 +ENCODING 30070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +8020 +9F20 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7577 +ENCODING 30071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAA0 +AA40 +ACA0 +F900 +AFE0 +A920 +FDA0 +8A40 +0540 +08A0 +ENDCHAR +STARTCHAR U_7578 +ENCODING 30072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AA80 +AC40 +FFE0 +A820 +ABA0 +FAA0 +8BA0 +0020 +00E0 +ENDCHAR +STARTCHAR U_7579 +ENCODING 30073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AE20 +AA00 +FBE0 +ACA0 +AAA0 +F9E0 +8A80 +04A0 +18E0 +ENDCHAR +STARTCHAR U_757A +ENCODING 30074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +3F80 +2480 +FFE0 +0000 +3F80 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_757B +ENCODING 30075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FB40 +AFE0 +A900 +AFE0 +FA80 +AD40 +A920 +FFC0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_757C +ENCODING 30076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +ABC0 +AA40 +AFE0 +F900 +ABE0 +AAA0 +FD60 +02A0 +0160 +ENDCHAR +STARTCHAR U_757D +ENCODING 30077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +AFE0 +AAA0 +FBE0 +AAA0 +ABE0 +F880 +8BE0 +0080 +07E0 +ENDCHAR +STARTCHAR U_757E +ENCODING 30078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0000 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_757F +ENCODING 30079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +EB80 +5940 +AA80 +FFE0 +0400 +FA80 +AB00 +F920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_7580 +ENCODING 30080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5480 +ABE0 +54A0 +57E0 +F8A0 +ABE0 +F880 +AAE0 +FA80 +8DE0 +ENDCHAR +STARTCHAR U_7581 +ENCODING 30081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FDA0 +AB60 +ADA0 +F900 +AA80 +AD60 +AA80 +F940 +0080 +0700 +ENDCHAR +STARTCHAR U_7582 +ENCODING 30082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +1100 +7FC0 +5540 +1B00 +1500 +FFE0 +ENDCHAR +STARTCHAR U_7583 +ENCODING 30083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +A940 +A880 +FFE0 +AAA0 +ABE0 +FAA0 +8FE0 +0080 +0FE0 +ENDCHAR +STARTCHAR U_7584 +ENCODING 30084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FB40 +AFE0 +AB40 +FD20 +AA40 +AFE0 +F940 +8FE0 +0240 +0C40 +ENDCHAR +STARTCHAR U_7585 +ENCODING 30085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +02A0 +FBE0 +AAA0 +ABE0 +F800 +AFE0 +AAA0 +FBE0 +02A0 +07E0 +ENDCHAR +STARTCHAR U_7586 +ENCODING 30086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +F7C0 +8540 +F7C0 +5000 +FFE0 +5540 +F7C0 +9540 +6FE0 +ENDCHAR +STARTCHAR U_7587 +ENCODING 30087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +A900 +AFE0 +F920 +AFE0 +A840 +FFE0 +8B40 +0E40 +00C0 +ENDCHAR +STARTCHAR U_7588 +ENCODING 30088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0200 +72E0 +5AA0 +76E0 +0200 +FBE0 +AAA0 +FBE0 +AAA0 +FDE0 +ENDCHAR +STARTCHAR U_7589 +ENCODING 30089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FFE0 +0800 +1F00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_758A +ENCODING 30090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +5540 +7FC0 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_758B +ENCODING 30091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0220 +0240 +0200 +1200 +13E0 +1200 +1200 +2A00 +4600 +83E0 +ENDCHAR +STARTCHAR U_758C +ENCODING 30092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +0480 +FFE0 +0480 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_758D +ENCODING 30093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0440 +2780 +3400 +4FE0 +8000 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_758E +ENCODING 30094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +1100 +27C0 +A540 +B7C0 +A300 +B380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_758F +ENCODING 30095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +1100 +2240 +A7A0 +B820 +A540 +A540 +B540 +E940 +1160 +ENDCHAR +STARTCHAR U_7590 +ENCODING 30096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +3F80 +2480 +FFE0 +0420 +2780 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7591 +ENCODING 30097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6140 +4880 +7FE0 +40A0 +7A80 +A2E0 +FA80 +2280 +5580 +88E0 +ENDCHAR +STARTCHAR U_7592 +ENCODING 30098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +3000 +5000 +9000 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_7593 +ENCODING 30099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2480 +65C0 +A440 +2440 +2840 +4940 +9080 +ENDCHAR +STARTCHAR U_7594 +ENCODING 30100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5FE0 +1100 +3100 +D100 +1100 +2900 +4500 +8200 +ENDCHAR +STARTCHAR U_7595 +ENCODING 30101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5400 +1440 +3480 +D700 +1400 +2420 +4420 +83E0 +ENDCHAR +STARTCHAR U_7596 +ENCODING 30102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2220 +2220 +6220 +A2E0 +2240 +4200 +8200 +ENDCHAR +STARTCHAR U_7597 +ENCODING 30103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2040 +6180 +A100 +2100 +2100 +4100 +8700 +ENDCHAR +STARTCHAR U_7598 +ENCODING 30104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +17C0 +3100 +5100 +9100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7599 +ENCODING 30105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2800 +6780 +A100 +2200 +2420 +4820 +87E0 +ENDCHAR +STARTCHAR U_759A +ENCODING 30106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6400 +2780 +6880 +B080 +2100 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_759B +ENCODING 30107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6080 +2FE0 +6080 +AC80 +2280 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_759C +ENCODING 30108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFE0 +6200 +2280 +6240 +A240 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_759D +ENCODING 30109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2920 +6920 +A920 +2920 +2920 +4FE0 +8820 +ENDCHAR +STARTCHAR U_759E +ENCODING 30110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2000 +7FE0 +A400 +27C0 +4040 +4280 +8100 +ENDCHAR +STARTCHAR U_759F +ENCODING 30111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2400 +6400 +BFE0 +2400 +2400 +47E0 +8400 +ENDCHAR +STARTCHAR U_75A0 +ENCODING 30112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5FE0 +1200 +33C0 +D240 +1240 +2440 +4940 +9080 +ENDCHAR +STARTCHAR U_75A1 +ENCODING 30113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2200 +6FE0 +A2A0 +24A0 +3920 +4220 +8CC0 +ENDCHAR +STARTCHAR U_75A2 +ENCODING 30114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2540 +6540 +A980 +2100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_75A3 +ENCODING 30115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6240 +3FE0 +6200 +A200 +2500 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_75A4 +ENCODING 30116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2940 +6940 +AFC0 +2800 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_75A5 +ENCODING 30117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2440 +7820 +A480 +2480 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_75A6 +ENCODING 30118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A200 +6FC0 +2240 +6240 +BFE0 +2500 +4880 +5060 +A040 +ENDCHAR +STARTCHAR U_75A7 +ENCODING 30119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A0C0 +6F00 +2900 +2FE0 +6900 +A900 +28A0 +4E60 +9820 +ENDCHAR +STARTCHAR U_75A8 +ENCODING 30120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2500 +6900 +BFE0 +2500 +4900 +5500 +8200 +ENDCHAR +STARTCHAR U_75A9 +ENCODING 30121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A200 +6F80 +24A0 +68E0 +A200 +3FE0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_75AA +ENCODING 30122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6920 +2940 +6D80 +A900 +2900 +2B20 +4D20 +88E0 +ENDCHAR +STARTCHAR U_75AB +ENCODING 30123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6780 +2480 +68E0 +A000 +2FC0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_75AC +ENCODING 30124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2900 +6FE0 +A920 +2920 +2920 +4A20 +94C0 +ENDCHAR +STARTCHAR U_75AD +ENCODING 30125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6480 +2480 +6480 +AB40 +2940 +4A40 +5220 +A420 +ENDCHAR +STARTCHAR U_75AE +ENCODING 30126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2440 +6FA0 +B480 +2480 +2520 +4420 +83E0 +ENDCHAR +STARTCHAR U_75AF +ENCODING 30127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6D40 +AA40 +2940 +2AE0 +4C20 +9020 +ENDCHAR +STARTCHAR U_75B0 +ENCODING 30128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6100 +2FE0 +6100 +A100 +27C0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75B1 +ENCODING 30129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67C0 +2840 +7740 +A540 +2740 +25A0 +4420 +83E0 +ENDCHAR +STARTCHAR U_75B2 +ENCODING 30130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2940 +6900 +AFC0 +2A40 +2980 +4A40 +9420 +ENDCHAR +STARTCHAR U_75B3 +ENCODING 30131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6440 +3FE0 +6440 +A7C0 +2440 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_75B4 +ENCODING 30132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2040 +6F40 +A940 +2F40 +2940 +4040 +81C0 +ENDCHAR +STARTCHAR U_75B5 +ENCODING 30133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6280 +2AA0 +6BC0 +AA80 +2A80 +2AA0 +4BA0 +9CE0 +ENDCHAR +STARTCHAR U_75B6 +ENCODING 30134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA80 +6A80 +3FE0 +6A80 +AA80 +2B80 +2A80 +4800 +8FE0 +ENDCHAR +STARTCHAR U_75B7 +ENCODING 30135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +60C0 +2F00 +6900 +AFE0 +2900 +4900 +4AA0 +8D60 +ENDCHAR +STARTCHAR U_75B8 +ENCODING 30136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A840 +2FC0 +2840 +4000 +9FE0 +ENDCHAR +STARTCHAR U_75B9 +ENCODING 30137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6300 +2480 +2960 +7200 +AC80 +2320 +2C40 +4080 +8F00 +ENDCHAR +STARTCHAR U_75BA +ENCODING 30138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +3E00 +6200 +BFC0 +2100 +2200 +4C00 +93E0 +ENDCHAR +STARTCHAR U_75BB +ENCODING 30139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6840 +AFC0 +2840 +2480 +4840 +9020 +ENDCHAR +STARTCHAR U_75BC +ENCODING 30140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67C0 +2A80 +7100 +A680 +3960 +2080 +4200 +8180 +ENDCHAR +STARTCHAR U_75BD +ENCODING 30141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +67C0 +A440 +27C0 +2440 +4440 +9FE0 +ENDCHAR +STARTCHAR U_75BE +ENCODING 30142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2900 +6100 +BFE0 +2100 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_75BF +ENCODING 30143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FC0 +2540 +7FC0 +B500 +3FE0 +2520 +49C0 +9100 +ENDCHAR +STARTCHAR U_75C0 +ENCODING 30144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2820 +77A0 +A4A0 +27A0 +24A0 +4020 +80C0 +ENDCHAR +STARTCHAR U_75C1 +ENCODING 30145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6200 +23E0 +6200 +AFC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_75C2 +ENCODING 30146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +68E0 +3EA0 +6AA0 +AAA0 +2AA0 +2AA0 +52E0 +A6A0 +ENDCHAR +STARTCHAR U_75C3 +ENCODING 30147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2200 +6440 +AF80 +2100 +2240 +4FA0 +8420 +ENDCHAR +STARTCHAR U_75C4 +ENCODING 30148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2A00 +73C0 +A200 +23C0 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_75C5 +ENCODING 30149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +2100 +6FE0 +A920 +2AA0 +2C60 +4820 +88E0 +ENDCHAR +STARTCHAR U_75C6 +ENCODING 30150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A800 +2A60 +4B80 +5220 +A1E0 +ENDCHAR +STARTCHAR U_75C7 +ENCODING 30151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2100 +6100 +A9C0 +2900 +2900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_75C8 +ENCODING 30152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2920 +6FE0 +A920 +2920 +2FE0 +4920 +9160 +ENDCHAR +STARTCHAR U_75C9 +ENCODING 30153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7F80 +2100 +6680 +B860 +2FC0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75CA +ENCODING 30154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6480 +2840 +77E0 +A100 +27C0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75CB +ENCODING 30155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FC0 +6940 +AFC0 +2940 +2140 +5FA0 +8820 +ENDCHAR +STARTCHAR U_75CC +ENCODING 30156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2820 +6BA0 +A820 +2BA0 +2AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_75CD +ENCODING 30157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2140 +6FC0 +A900 +2FE0 +2160 +4280 +9C60 +ENDCHAR +STARTCHAR U_75CE +ENCODING 30158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2480 +6900 +AE40 +2280 +2D80 +4240 +9C20 +ENDCHAR +STARTCHAR U_75CF +ENCODING 30159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2400 +67C0 +AC40 +37C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_75D0 +ENCODING 30160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2820 +6BA0 +AAA0 +2BA0 +2820 +4FE0 +8820 +ENDCHAR +STARTCHAR U_75D1 +ENCODING 30161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6780 +2D00 +6280 +BDE0 +2240 +2D80 +4100 +9E00 +ENDCHAR +STARTCHAR U_75D2 +ENCODING 30162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6280 +2FE0 +6100 +A7C0 +2100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_75D3 +ENCODING 30163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +BFC0 +6200 +2480 +6FC0 +A200 +2FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_75D4 +ENCODING 30164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FC0 +2200 +7FE0 +A080 +3FE0 +2880 +4480 +8100 +ENDCHAR +STARTCHAR U_75D5 +ENCODING 30165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A840 +2FE0 +2940 +4A80 +8C60 +ENDCHAR +STARTCHAR U_75D6 +ENCODING 30166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2500 +7520 +B520 +2D40 +2500 +4500 +9FE0 +ENDCHAR +STARTCHAR U_75D7 +ENCODING 30167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6FE0 +3540 +6540 +BFE0 +2940 +2FE0 +4040 +8180 +ENDCHAR +STARTCHAR U_75D8 +ENCODING 30168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2000 +67C0 +A440 +27C0 +2440 +4280 +9FE0 +ENDCHAR +STARTCHAR U_75D9 +ENCODING 30169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2540 +6A80 +A540 +2FE0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75DA +ENCODING 30170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AF40 +6280 +3FE0 +6200 +AFC0 +3080 +3FE0 +4100 +8300 +ENDCHAR +STARTCHAR U_75DB +ENCODING 30171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2280 +6FE0 +A920 +2FE0 +2920 +4FE0 +8920 +ENDCHAR +STARTCHAR U_75DC +ENCODING 30172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AF80 +6200 +3FE0 +6A80 +B260 +2F00 +4920 +90E0 +ENDCHAR +STARTCHAR U_75DD +ENCODING 30173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A900 +6880 +3FE0 +6D40 +AEA0 +2D40 +2EA0 +5520 +A3E0 +ENDCHAR +STARTCHAR U_75DE +ENCODING 30174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +2300 +6540 +A920 +3FC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_75DF +ENCODING 30175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6540 +2FC0 +6840 +AFC0 +2840 +2FC0 +4840 +88C0 +ENDCHAR +STARTCHAR U_75E0 +ENCODING 30176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +7FA0 +2480 +7A40 +A7A0 +2C80 +3480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_75E1 +ENCODING 30177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2100 +6FE0 +A920 +2FE0 +2920 +6FE0 +8920 +ENDCHAR +STARTCHAR U_75E2 +ENCODING 30178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6E20 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +4420 +84E0 +ENDCHAR +STARTCHAR U_75E3 +ENCODING 30179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +67C0 +A200 +2540 +2C20 +54A0 +8380 +ENDCHAR +STARTCHAR U_75E4 +ENCODING 30180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6A40 +2A40 +76A0 +A200 +3FC0 +2200 +4200 +BFE0 +ENDCHAR +STARTCHAR U_75E5 +ENCODING 30181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6500 +2FC0 +6840 +AFC0 +2500 +4500 +4920 +90E0 +ENDCHAR +STARTCHAR U_75E6 +ENCODING 30182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2200 +6FC0 +A440 +3FE0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_75E7 +ENCODING 30183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +74C0 +29A0 +6680 +A8A0 +3840 +2880 +4900 +8600 +ENDCHAR +STARTCHAR U_75E8 +ENCODING 30184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A280 +6FE0 +2280 +6FE0 +A920 +27C0 +2240 +4440 +9980 +ENDCHAR +STARTCHAR U_75E9 +ENCODING 30185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2200 +AFC0 +6A40 +2FC0 +6A40 +AFC0 +2480 +4300 +9CC0 +ENDCHAR +STARTCHAR U_75EA +ENCODING 30186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6780 +2500 +6FC0 +B540 +2540 +3FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_75EB +ENCODING 30187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6800 +25E0 +2920 +6FE0 +A920 +2BA0 +4D60 +4920 +8960 +ENDCHAR +STARTCHAR U_75EC +ENCODING 30188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6F80 +2880 +6F80 +A400 +2FC0 +5540 +4B40 +8480 +ENDCHAR +STARTCHAR U_75ED +ENCODING 30189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2AA0 +6EE0 +AAA0 +2EE0 +2AA0 +52A0 +A760 +ENDCHAR +STARTCHAR U_75EE +ENCODING 30190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2400 +6780 +A400 +3FE0 +2940 +4880 +8C60 +ENDCHAR +STARTCHAR U_75EF +ENCODING 30191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +67C0 +A440 +27E0 +2420 +47E0 +8420 +ENDCHAR +STARTCHAR U_75F0 +ENCODING 30192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A520 +69C0 +2280 +6D60 +A540 +2980 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_75F1 +ENCODING 30193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6480 +3CE0 +6480 +BCE0 +2480 +3CE0 +4480 +8480 +ENDCHAR +STARTCHAR U_75F2 +ENCODING 30194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7FE0 +2880 +6AA0 +AAA0 +2AA0 +2AA0 +4880 +8880 +ENDCHAR +STARTCHAR U_75F3 +ENCODING 30195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7FE0 +2880 +6CC0 +BAA0 +29A0 +2AA0 +4880 +8880 +ENDCHAR +STARTCHAR U_75F4 +ENCODING 30196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6EE0 +34A0 +64A0 +BFA0 +24A0 +2AA0 +52E0 +A000 +ENDCHAR +STARTCHAR U_75F5 +ENCODING 30197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A380 +6100 +3FE0 +6940 +B7A0 +2100 +3FE0 +4100 +8700 +ENDCHAR +STARTCHAR U_75F6 +ENCODING 30198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +AAA0 +2AA0 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_75F7 +ENCODING 30199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A80 +7FC0 +AAA0 +2F80 +2AA0 +6FA0 +81E0 +ENDCHAR +STARTCHAR U_75F8 +ENCODING 30200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B400 +7F20 +24A0 +7FA0 +A4A0 +3FA0 +35A0 +5720 +8460 +ENDCHAR +STARTCHAR U_75F9 +ENCODING 30201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2940 +6FC0 +A940 +3FE0 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_75FA +ENCODING 30202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FE0 +2920 +6FE0 +A920 +2FE0 +2500 +7FE0 +8100 +ENDCHAR +STARTCHAR U_75FB +ENCODING 30203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +6F80 +2880 +6FE0 +B880 +2860 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_75FC +ENCODING 30204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +6FE0 +2920 +6FE0 +A920 +2AA0 +2BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_75FD +ENCODING 30205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6FE0 +2900 +7FC0 +A900 +2FC0 +2900 +4FE0 +8800 +ENDCHAR +STARTCHAR U_75FE +ENCODING 30206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFE0 +6A40 +2DC0 +6A40 +AA40 +2BC0 +4C40 +88C0 +ENDCHAR +STARTCHAR U_75FF +ENCODING 30207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +6F80 +2100 +7FE0 +A940 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_7600 +ENCODING 30208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +2400 +A440 +7EA0 +2920 +6E00 +AA40 +2A20 +2A80 +5240 +ENDCHAR +STARTCHAR U_7601 +ENCODING 30209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +6AA0 +B100 +2100 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7602 +ENCODING 30210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +BFC0 +6500 +6DC0 +A840 +2DC0 +4500 +4500 +BFE0 +ENDCHAR +STARTCHAR U_7603 +ENCODING 30211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +7FE0 +2940 +7A80 +A580 +2AC0 +24A0 +48A0 +9300 +ENDCHAR +STARTCHAR U_7604 +ENCODING 30212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FC0 +2480 +7FE0 +A000 +2FC0 +4940 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_7605 +ENCODING 30213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6280 +2FC0 +6940 +AFC0 +2940 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7606 +ENCODING 30214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +5F80 +C400 +7FC0 +D480 +6A60 +4500 +4200 +9C00 +ENDCHAR +STARTCHAR U_7607 +ENCODING 30215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFC0 +6200 +3FE0 +6A40 +AA40 +2FE0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7608 +ENCODING 30216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +7FE0 +24A0 +7F20 +A440 +3FE0 +2200 +4D80 +B060 +ENDCHAR +STARTCHAR U_7609 +ENCODING 30217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6440 +2BA0 +7E00 +B2A0 +3EA0 +32A0 +5E20 +92E0 +ENDCHAR +STARTCHAR U_760A +ENCODING 30218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A5C0 +6840 +2FE0 +7A00 +ABC0 +2C80 +2FE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_760B +ENCODING 30219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2A40 +6FC0 +AAC0 +2FC0 +2A60 +53A0 +AEA0 +ENDCHAR +STARTCHAR U_760C +ENCODING 30220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7E20 +28A0 +7EA0 +AAA0 +3EA0 +2CA0 +5A20 +A960 +ENDCHAR +STARTCHAR U_760D +ENCODING 30221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +67C0 +2440 +7FE0 +A400 +2FE0 +32A0 +4520 +8A60 +ENDCHAR +STARTCHAR U_760E +ENCODING 30222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AFC0 +6480 +2780 +6480 +BFE0 +2A80 +4C40 +8FE0 +ENDCHAR +STARTCHAR U_760F +ENCODING 30223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FA0 +2240 +7FE0 +A440 +2FC0 +3440 +47C0 +8440 +ENDCHAR +STARTCHAR U_7610 +ENCODING 30224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6DE0 +2920 +6FE0 +A920 +2FE0 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_7611 +ENCODING 30225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +67C0 +2440 +6740 +AFE0 +2820 +2BA0 +4AA0 +8BA0 +ENDCHAR +STARTCHAR U_7612 +ENCODING 30226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +3220 +6FC0 +AA40 +2FC0 +2A40 +5FE0 +8200 +ENDCHAR +STARTCHAR U_7613 +ENCODING 30227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6900 +3FE0 +6AA0 +AC60 +2920 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_7614 +ENCODING 30228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2680 +7FE0 +A200 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_7615 +ENCODING 30229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +6EE0 +2A20 +6EE0 +A800 +2EE0 +28A0 +4E40 +88A0 +ENDCHAR +STARTCHAR U_7616 +ENCODING 30230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2280 +7FE0 +A440 +27C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_7617 +ENCODING 30231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2540 +6FE0 +A280 +2D60 +27C0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_7618 +ENCODING 30232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B240 +6A80 +3FE0 +6A80 +B240 +3FE0 +2480 +4380 +9C60 +ENDCHAR +STARTCHAR U_7619 +ENCODING 30233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AA40 +6540 +2B80 +6540 +AFE0 +2940 +2FC0 +4140 +9FA0 +ENDCHAR +STARTCHAR U_761A +ENCODING 30234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA80 +6480 +3FE0 +6AA0 +AA80 +3E80 +2880 +5140 +A220 +ENDCHAR +STARTCHAR U_761B +ENCODING 30235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7FE0 +28A0 +7EA0 +A920 +2A60 +3540 +54A0 +A3A0 +ENDCHAR +STARTCHAR U_761C +ENCODING 30236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2840 +6FC0 +A840 +2FC0 +3540 +54A0 +A3A0 +ENDCHAR +STARTCHAR U_761D +ENCODING 30237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2AA0 +6FE0 +A540 +2920 +2580 +4940 +9120 +ENDCHAR +STARTCHAR U_761E +ENCODING 30238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A40 +75A0 +AA80 +3240 +3FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_761F +ENCODING 30239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2880 +6F80 +A880 +3FC0 +3540 +5540 +BFE0 +ENDCHAR +STARTCHAR U_7620 +ENCODING 30240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B240 +6AC0 +3520 +6FE0 +B840 +2FC0 +2840 +4FC0 +88C0 +ENDCHAR +STARTCHAR U_7621 +ENCODING 30241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6A80 +3FE0 +6840 +AFC0 +2840 +2FE0 +5420 +A7E0 +ENDCHAR +STARTCHAR U_7622 +ENCODING 30242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A400 +6EE0 +2AA0 +6EA0 +AA00 +3FE0 +2AA0 +4E40 +93A0 +ENDCHAR +STARTCHAR U_7623 +ENCODING 30243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2940 +6FC0 +A940 +2FC0 +25A0 +4940 +91E0 +ENDCHAR +STARTCHAR U_7624 +ENCODING 30244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2AA0 +6B40 +AFE0 +2920 +2FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7625 +ENCODING 30245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FE0 +2200 +6FC0 +A200 +3FE0 +2900 +5100 +8FE0 +ENDCHAR +STARTCHAR U_7626 +ENCODING 30246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6FE0 +2920 +6FE0 +A100 +2FC0 +2480 +4300 +8CE0 +ENDCHAR +STARTCHAR U_7627 +ENCODING 30247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A3C0 +6200 +2FE0 +6A40 +AFE0 +2A00 +2FE0 +5200 +A3E0 +ENDCHAR +STARTCHAR U_7628 +ENCODING 30248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2840 +6F40 +ABC0 +2840 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_7629 +ENCODING 30249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2200 +6480 +BB60 +2000 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_762A +ENCODING 30250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6FC0 +2840 +6FC0 +A840 +2FC0 +3920 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_762B +ENCODING 30251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7DE0 +2540 +77E0 +A940 +29E0 +3540 +5540 +A5E0 +ENDCHAR +STARTCHAR U_762C +ENCODING 30252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +DDC0 +4500 +5DC0 +D100 +5FE0 +4540 +5520 +8980 +ENDCHAR +STARTCHAR U_762D +ENCODING 30253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +A000 +3FE0 +2580 +4940 +9320 +ENDCHAR +STARTCHAR U_762E +ENCODING 30254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AFC0 +6AA0 +7FE0 +AA80 +3540 +22A0 +4100 +8E00 +ENDCHAR +STARTCHAR U_762F +ENCODING 30255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6880 +3FE0 +2880 +6FE0 +AA40 +2BE0 +2A40 +4AA0 +9520 +ENDCHAR +STARTCHAR U_7630 +ENCODING 30256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6FE0 +2920 +6FE0 +A280 +2540 +2FA0 +4540 +9B20 +ENDCHAR +STARTCHAR U_7631 +ENCODING 30257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +BFE0 +6A80 +3540 +E880 +3260 +2500 +54A0 +A380 +ENDCHAR +STARTCHAR U_7632 +ENCODING 30258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +6940 +36A0 +6880 +BA80 +2AE0 +2A80 +4D80 +88E0 +ENDCHAR +STARTCHAR U_7633 +ENCODING 30259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AAA0 +6660 +3AA0 +6320 +BCE0 +2100 +2E60 +4080 +8F00 +ENDCHAR +STARTCHAR U_7634 +ENCODING 30260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2280 +6FE0 +A440 +27C0 +2440 +6FE0 +8100 +ENDCHAR +STARTCHAR U_7635 +ENCODING 30261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6BE0 +36A0 +6A40 +A7E0 +2800 +3FE0 +4940 +B320 +ENDCHAR +STARTCHAR U_7636 +ENCODING 30262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +FE80 +48E0 +7F20 +EA80 +7E80 +5D40 +6B60 +8A40 +ENDCHAR +STARTCHAR U_7637 +ENCODING 30263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +FE80 +48E0 +7F20 +EAA0 +7E40 +5C40 +AAA0 +4920 +ENDCHAR +STARTCHAR U_7638 +ENCODING 30264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7EE0 +2AA0 +72E0 +AFE0 +2AA0 +2D60 +4AA0 +8C60 +ENDCHAR +STARTCHAR U_7639 +ENCODING 30265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +D5E0 +7E20 +4920 +DEA0 +68A0 +5A20 +7EA0 +8040 +ENDCHAR +STARTCHAR U_763A +ENCODING 30266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A820 +6FE0 +2800 +6FE0 +A900 +2FE0 +2DA0 +5B60 +A960 +ENDCHAR +STARTCHAR U_763B +ENCODING 30267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2940 +BFE0 +6940 +2FC0 +6940 +BFE0 +2480 +4380 +8C40 +ENDCHAR +STARTCHAR U_763C +ENCODING 30268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2FC0 +6840 +AFC0 +2840 +3FE0 +4280 +9C60 +ENDCHAR +STARTCHAR U_763D +ENCODING 30269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2480 +6780 +AFC0 +2A40 +5FE0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_763E +ENCODING 30270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B9C0 +6A40 +2FE0 +7020 +AFE0 +2820 +3FE0 +6540 +A9E0 +ENDCHAR +STARTCHAR U_763F +ENCODING 30271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A220 +6AA0 +2AA0 +6540 +B220 +3FE0 +2900 +4700 +B8E0 +ENDCHAR +STARTCHAR U_7640 +ENCODING 30272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FC0 +2480 +7FE0 +AA40 +2FC0 +2A40 +6FC0 +9860 +ENDCHAR +STARTCHAR U_7641 +ENCODING 30273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA00 +6BE0 +3640 +6BC0 +BA40 +2BC0 +2A40 +4980 +8E60 +ENDCHAR +STARTCHAR U_7642 +ENCODING 30274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +34A0 +6FC0 +B8A0 +2F80 +2580 +4940 +B320 +ENDCHAR +STARTCHAR U_7643 +ENCODING 30275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +6F40 +2AC0 +6D20 +AAE0 +2F40 +29E0 +4840 +8BE0 +ENDCHAR +STARTCHAR U_7644 +ENCODING 30276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6FC0 +3900 +6FC0 +A900 +2FE0 +4800 +9540 +24A0 +ENDCHAR +STARTCHAR U_7645 +ENCODING 30277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +D540 +5DC0 +4500 +DFC0 +5240 +5FC0 +5240 +9FC0 +ENDCHAR +STARTCHAR U_7646 +ENCODING 30278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6EE0 +3540 +6AA0 +AFE0 +2A20 +2FC0 +4440 +9980 +ENDCHAR +STARTCHAR U_7647 +ENCODING 30279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2BA0 +6EE0 +ABA0 +2AA0 +2BA0 +4AA0 +8AE0 +ENDCHAR +STARTCHAR U_7648 +ENCODING 30280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6440 +3DE0 +6540 +AE20 +29E0 +2CA0 +4440 +9DA0 +ENDCHAR +STARTCHAR U_7649 +ENCODING 30281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6FE0 +2540 +67C0 +A540 +27C0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_764A +ENCODING 30282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5880 +D540 +5BE0 +5480 +D5C0 +5800 +57E0 +5140 +93E0 +ENDCHAR +STARTCHAR U_764B +ENCODING 30283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +DDC0 +5040 +5DC0 +C500 +7FE0 +4240 +AAA0 +2780 +ENDCHAR +STARTCHAR U_764C +ENCODING 30284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +6FE0 +AAA0 +2EE0 +2100 +4920 +8FE0 +ENDCHAR +STARTCHAR U_764D +ENCODING 30285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +FAE0 +5740 +5540 +FAE0 +5340 +5540 +9540 +B9E0 +ENDCHAR +STARTCHAR U_764E +ENCODING 30286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DDC0 +5540 +5FC0 +D540 +5740 +5540 +9740 +90C0 +ENDCHAR +STARTCHAR U_764F +ENCODING 30287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFC0 +5540 +7FE0 +C880 +4F80 +4D40 +7480 +8660 +ENDCHAR +STARTCHAR U_7650 +ENCODING 30288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6CC0 +3FE0 +6AA0 +AFE0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_7651 +ENCODING 30289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +A800 +2FE0 +5540 +A480 +4660 +ENDCHAR +STARTCHAR U_7652 +ENCODING 30290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +7CE0 +2EA0 +6AA0 +AEA0 +2A60 +2620 +54C0 +A7A0 +ENDCHAR +STARTCHAR U_7653 +ENCODING 30291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5A80 +EFE0 +50A0 +77A0 +D0A0 +55A0 +5540 +55A0 +9920 +ENDCHAR +STARTCHAR U_7654 +ENCODING 30292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2480 +7FE0 +A880 +2F80 +2540 +54A0 +93A0 +ENDCHAR +STARTCHAR U_7655 +ENCODING 30293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +FFE0 +5280 +6C80 +D7C0 +6C80 +57C0 +5480 +A7E0 +ENDCHAR +STARTCHAR U_7656 +ENCODING 30294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2040 +AFE0 +6AA0 +2E40 +69E0 +AE40 +4AE0 +5A40 +AE40 +ENDCHAR +STARTCHAR U_7657 +ENCODING 30295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +3720 +6A80 +AFC0 +2A40 +2FC0 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_7658 +ENCODING 30296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FC0 +2480 +6FC0 +AA40 +3FE0 +3220 +5FA0 +9060 +ENDCHAR +STARTCHAR U_7659 +ENCODING 30297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A840 +6DC0 +2840 +6FC0 +A940 +2DC0 +2940 +4DC0 +8920 +ENDCHAR +STARTCHAR U_765A +ENCODING 30298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A780 +6900 +3FE0 +6D40 +AFE0 +2800 +2FC0 +5440 +A7C0 +ENDCHAR +STARTCHAR U_765B +ENCODING 30299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +FFE0 +5540 +5740 +D040 +7FE0 +4A80 +5260 +8200 +ENDCHAR +STARTCHAR U_765C +ENCODING 30300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +7EE0 +32A0 +7E00 +ABE0 +2AA0 +3F40 +4AA0 +9120 +ENDCHAR +STARTCHAR U_765D +ENCODING 30301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +D740 +5040 +5FC0 +C000 +7FE0 +4A80 +5240 +8600 +ENDCHAR +STARTCHAR U_765E +ENCODING 30302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +7FE0 +2A20 +7EA0 +AAA0 +3EA0 +2AA0 +5D40 +AA20 +ENDCHAR +STARTCHAR U_765F +ENCODING 30303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A840 +6FC0 +2840 +6FC0 +A840 +3FE0 +3540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_7660 +ENCODING 30304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A520 +7AC0 +3AC0 +6AA0 +AA40 +2FC0 +2840 +4FC0 +9040 +ENDCHAR +STARTCHAR U_7661 +ENCODING 30305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AA00 +6DE0 +28A0 +6FE0 +B540 +3F40 +2560 +4AC0 +9160 +ENDCHAR +STARTCHAR U_7662 +ENCODING 30306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FE0 +2200 +7FE0 +A8C0 +3FA0 +28A0 +4FC0 +9C60 +ENDCHAR +STARTCHAR U_7663 +ENCODING 30307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AB40 +7480 +3FE0 +6A80 +BFE0 +2A80 +3FE0 +4080 +9E80 +ENDCHAR +STARTCHAR U_7664 +ENCODING 30308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7540 +2FE0 +68A0 +AFA0 +28A0 +2FA0 +4AE0 +8D80 +ENDCHAR +STARTCHAR U_7665 +ENCODING 30309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +DA80 +6FE0 +54A0 +7FA0 +D4A0 +5FA0 +5440 +54A0 +9F20 +ENDCHAR +STARTCHAR U_7666 +ENCODING 30310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +4000 +DFC0 +5240 +5FC0 +C200 +5FC0 +5540 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7667 +ENCODING 30311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFE0 +5440 +5FE0 +D6C0 +5D60 +51C0 +A500 +5FE0 +ENDCHAR +STARTCHAR U_7668 +ENCODING 30312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +39A0 +6540 +AFC0 +3900 +4FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7669 +ENCODING 30313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2520 +7FE0 +B520 +3FE0 +2D20 +57E0 +A620 +ENDCHAR +STARTCHAR U_766A +ENCODING 30314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A080 +7FE0 +2880 +7FE0 +AA40 +2FC0 +3A40 +4BC0 +8E60 +ENDCHAR +STARTCHAR U_766B +ENCODING 30315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +FFE0 +5280 +5BE0 +D6A0 +52A0 +7EA0 +5540 +A220 +ENDCHAR +STARTCHAR U_766C +ENCODING 30316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +7280 +3FE0 +6A80 +BFE0 +2A80 +3FE0 +5480 +AA80 +ENDCHAR +STARTCHAR U_766D +ENCODING 30317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA40 +6FC0 +2A40 +6FC0 +AAA0 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_766E +ENCODING 30318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5D40 +D7E0 +5500 +5BE0 +D440 +57E0 +5D40 +56A0 +9BC0 +ENDCHAR +STARTCHAR U_766F +ENCODING 30319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AEE0 +6AA0 +2EE0 +6500 +AFE0 +3900 +2FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7670 +ENCODING 30320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +6940 +D540 +7DE0 +4540 +FDE0 +5540 +7DE0 +A340 +BFE0 +ENDCHAR +STARTCHAR U_7671 +ENCODING 30321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +D540 +7F40 +55E0 +7F40 +C9E0 +7F40 +49E0 +7F40 +95E0 +ENDCHAR +STARTCHAR U_7672 +ENCODING 30322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +7FE0 +2AA0 +6EE0 +AAA0 +2EE0 +3FA0 +4A40 +91A0 +ENDCHAR +STARTCHAR U_7673 +ENCODING 30323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +DFC0 +5540 +5FC0 +CA00 +4480 +4FC0 +4A80 +9240 +ENDCHAR +STARTCHAR U_7674 +ENCODING 30324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +EFA0 +5240 +6FA0 +C500 +5FC0 +4200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_7675 +ENCODING 30325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +77E0 +2940 +7FE0 +B2A0 +2FC0 +2D40 +4AC0 +8D40 +ENDCHAR +STARTCHAR U_7676 +ENCODING 30326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0480 +7B00 +0A40 +4980 +3100 +2080 +C060 +ENDCHAR +STARTCHAR U_7677 +ENCODING 30327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7B00 +4940 +3080 +2040 +DF20 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7678 +ENCODING 30328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E80 +0920 +2940 +1080 +2F40 +4420 +8400 +7FE0 +0500 +0880 +7060 +ENDCHAR +STARTCHAR U_7679 +ENCODING 30329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E80 +0920 +2940 +1080 +2F40 +49A0 +9000 +3FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_767A +ENCODING 30330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0B20 +5240 +2180 +C060 +3F80 +0A00 +7FC0 +0A00 +1240 +61C0 +ENDCHAR +STARTCHAR U_767B +ENCODING 30331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4A80 +2940 +1080 +3FC0 +C020 +1F80 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_767C +ENCODING 30332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +0B20 +5140 +20E0 +F3C0 +1240 +7420 +43C0 +3240 +9180 +7660 +ENDCHAR +STARTCHAR U_767D +ENCODING 30333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +20 +FF +81 +81 +FF +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_767E +ENCODING 30334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_767F +ENCODING 30335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +F900 +8900 +8900 +F900 +8900 +8900 +8920 +F920 +88E0 +ENDCHAR +STARTCHAR U_7680 +ENCODING 30336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +20 +FE +82 +FE +82 +FE +00 +8E +F0 +81 +7F +ENDCHAR +STARTCHAR U_7681 +ENCODING 30337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7682 +ENCODING 30338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2040 +3FC0 +0800 +0FE0 +F800 +0820 +07E0 +ENDCHAR +STARTCHAR U_7683 +ENCODING 30339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +7F00 +4100 +7F00 +4100 +7F00 +2400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_7684 +ENCODING 30340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +4200 +F7C0 +9840 +9040 +F440 +9240 +9240 +9040 +F040 +9180 +ENDCHAR +STARTCHAR U_7685 +ENCODING 30341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4540 +F540 +9540 +9540 +F7C0 +9400 +9400 +9420 +F420 +03E0 +ENDCHAR +STARTCHAR U_7686 +ENCODING 30342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8480 +F500 +8640 +B440 +CBC0 +1000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_7687 +ENCODING 30343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2880 +2480 +3F80 +0000 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7688 +ENCODING 30344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4780 +F400 +97C0 +9440 +F640 +9540 +9480 +F480 +9940 +1220 +ENDCHAR +STARTCHAR U_7689 +ENCODING 30345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4280 +EA80 +AAA0 +ABC0 +EA80 +AA80 +AAA0 +EBA0 +ACA0 +18E0 +ENDCHAR +STARTCHAR U_768A +ENCODING 30346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +F440 +9920 +9080 +FFE0 +9040 +9280 +F100 +9080 +0080 +ENDCHAR +STARTCHAR U_768B +ENCODING 30347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +FFE0 +1500 +2480 +DF60 +0400 +0400 +ENDCHAR +STARTCHAR U_768C +ENCODING 30348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +FFE0 +A200 +A200 +EFC0 +A700 +AA80 +B240 +E220 +0200 +ENDCHAR +STARTCHAR U_768D +ENCODING 30349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +8000 +F780 +8480 +E580 +0400 +ENDCHAR +STARTCHAR U_768E +ENCODING 30350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +FFE0 +9280 +9440 +F820 +9280 +9280 +F100 +9280 +0C60 +ENDCHAR +STARTCHAR U_768F +ENCODING 30351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +4140 +F7E0 +9240 +9240 +F7E0 +9240 +9240 +F240 +9440 +0840 +ENDCHAR +STARTCHAR U_7690 +ENCODING 30352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4040 +7FC0 +4040 +7FC0 +2480 +1500 +64C0 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7691 +ENCODING 30353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +4520 +F7E0 +9000 +97E0 +F020 +97E0 +9420 +F400 +9420 +07E0 +ENDCHAR +STARTCHAR U_7692 +ENCODING 30354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4CC0 +F4A0 +9FE0 +9480 +F6A0 +9CC0 +9480 +F5A0 +9660 +0C20 +ENDCHAR +STARTCHAR U_7693 +ENCODING 30355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4500 +F7C0 +9900 +9100 +FFE0 +9000 +97C0 +F440 +9440 +07C0 +ENDCHAR +STARTCHAR U_7694 +ENCODING 30356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +F7C0 +9440 +97C0 +F000 +97C0 +9100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_7695 +ENCODING 30357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +4100 +FBE0 +8A20 +8A20 +FBE0 +8A20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_7696 +ENCODING 30358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4080 +F7E0 +9420 +93C0 +F000 +9FE0 +9280 +F2A0 +94A0 +18E0 +ENDCHAR +STARTCHAR U_7697 +ENCODING 30359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +8920 +EBA0 +A920 +AFE0 +E820 +ABA0 +AAA0 +EBA0 +10A0 +2040 +ENDCHAR +STARTCHAR U_7698 +ENCODING 30360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +F100 +97C0 +9100 +FFE0 +9440 +97C0 +F440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7699 +ENCODING 30361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2400 +77E0 +AC80 +2880 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_769A +ENCODING 30362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4920 +FFE0 +9000 +9FE0 +F000 +97C0 +9440 +F7C0 +9280 +1FE0 +ENDCHAR +STARTCHAR U_769B +ENCODING 30363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_769C +ENCODING 30364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +E440 +A7C0 +A000 +AFE0 +E820 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_769D +ENCODING 30365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FD20 +8B40 +F900 +8FE0 +FA80 +2280 +FA80 +22A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_769E +ENCODING 30366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +F440 +97C0 +9440 +FFE0 +9440 +9920 +F7E0 +9100 +0100 +ENDCHAR +STARTCHAR U_769F +ENCODING 30367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E100 +BFE0 +A440 +E7C0 +A440 +A7C0 +E440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_76A0 +ENCODING 30368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +EFE0 +A500 +AFE0 +F900 +AFC0 +A900 +AFC0 +E900 +0FE0 +ENDCHAR +STARTCHAR U_76A1 +ENCODING 30369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F80 +E880 +AF80 +A880 +EF80 +AA80 +B240 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_76A2 +ENCODING 30370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +E200 +BFE0 +A880 +FDE0 +A000 +BFE0 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_76A3 +ENCODING 30371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +BFC0 +AA40 +FFE0 +AA40 +BFE0 +E200 +1FE0 +0200 +ENDCHAR +STARTCHAR U_76A4 +ENCODING 30372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4920 +F540 +9FE0 +9540 +F920 +97E0 +9520 +F7E0 +9520 +07E0 +ENDCHAR +STARTCHAR U_76A5 +ENCODING 30373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4FC0 +E840 +AFC0 +A840 +EFC0 +A540 +A920 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_76A6 +ENCODING 30374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5E80 +F2E0 +BFA0 +B2A0 +FFA0 +A8A0 +AEA0 +EA40 +AAA0 +1520 +ENDCHAR +STARTCHAR U_76A7 +ENCODING 30375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +EA80 +BFE0 +AD60 +F7C0 +A400 +A7C0 +EA80 +1380 +0C60 +ENDCHAR +STARTCHAR U_76A8 +ENCODING 30376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +3F80 +FBE0 +AAA0 +FBE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_76A9 +ENCODING 30377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +97C0 +F440 +97C0 +F920 +2540 +FFE0 +2280 +32A0 +CCE0 +ENDCHAR +STARTCHAR U_76AA +ENCODING 30378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +5740 +FDE0 +AF40 +B540 +FFE0 +A100 +BFE0 +E580 +0940 +1120 +ENDCHAR +STARTCHAR U_76AB +ENCODING 30379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA80 +AFE0 +AAA0 +EFE0 +AA80 +ABE0 +EA80 +AB60 +1540 +ENDCHAR +STARTCHAR U_76AC +ENCODING 30380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +EFE0 +B5A0 +A640 +E900 +BFC0 +A900 +EFC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_76AD +ENCODING 30381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4540 +EFE0 +AAA0 +AFE0 +EA20 +AFE0 +AAA0 +EE60 +A920 +0E60 +ENDCHAR +STARTCHAR U_76AE +ENCODING 30382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +3FE0 +2240 +2200 +3F80 +2880 +2500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_76AF +ENCODING 30383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +5480 +5080 +7C80 +57E0 +5480 +5480 +4880 +9480 +A280 +ENDCHAR +STARTCHAR U_76B0 +ENCODING 30384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +AC20 +A3A0 +FAA0 +ABA0 +AA20 +92C0 +AA00 +C620 +81E0 +ENDCHAR +STARTCHAR U_76B1 +ENCODING 30385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +8AA0 +1280 +FBE0 +0A20 +FB20 +0AC0 +0A80 +FD40 +0A20 +ENDCHAR +STARTCHAR U_76B2 +ENCODING 30386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +23E0 +FEA0 +2280 +53E0 +FE40 +1340 +FE80 +1540 +1220 +ENDCHAR +STARTCHAR U_76B3 +ENCODING 30387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2880 +27E0 +FCA0 +2480 +ADC0 +7540 +6D40 +A480 +2940 +7620 +ENDCHAR +STARTCHAR U_76B4 +ENCODING 30388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +F7E0 +4AA0 +A680 +3BE0 +6A40 +9340 +2A80 +4540 +8A20 +ENDCHAR +STARTCHAR U_76B5 +ENCODING 30389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +FA80 +03E0 +F240 +9240 +F340 +9280 +F540 +9A20 +ENDCHAR +STARTCHAR U_76B6 +ENCODING 30390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +73E0 +AEA0 +7A80 +4BE0 +7B20 +4B40 +7A80 +E560 +0A40 +ENDCHAR +STARTCHAR U_76B7 +ENCODING 30391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +13E0 +7AA0 +0280 +7BC0 +4A40 +7B40 +5280 +3560 +CA40 +ENDCHAR +STARTCHAR U_76B8 +ENCODING 30392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +23E0 +FAA0 +AA80 +FBE0 +AB20 +FAA0 +2240 +FAA0 +2520 +ENDCHAR +STARTCHAR U_76B9 +ENCODING 30393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +7CA0 +57E0 +5080 +7BE0 +4AA0 +6BE0 +52A0 +6FE0 +4080 +8080 +ENDCHAR +STARTCHAR U_76BA +ENCODING 30394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +ABE0 +FAA0 +4AA0 +BA80 +43E0 +FE20 +AB40 +FA80 +4D40 +BA20 +ENDCHAR +STARTCHAR U_76BB +ENCODING 30395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FFE0 +AAA0 +FA80 +A3E0 +BE40 +AB40 +BA80 +AB40 +FE20 +ENDCHAR +STARTCHAR U_76BC +ENCODING 30396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +1080 +FFE0 +86A0 +7A80 +03C0 +7A40 +4B40 +7A80 +2D40 +FA20 +ENDCHAR +STARTCHAR U_76BD +ENCODING 30397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +BAA0 +8280 +FFE0 +4A20 +7A20 +4AA0 +7A40 +02A0 +FF20 +ENDCHAR +STARTCHAR U_76BE +ENCODING 30398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +13E0 +FEA0 +AE80 +FFE0 +4A40 +7B40 +4A80 +7B40 +CE20 +ENDCHAR +STARTCHAR U_76BF +ENCODING 30399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +7F80 +5280 +5280 +5280 +5280 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C0 +ENCODING 30400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0500 +04C0 +0440 +0400 +0000 +3FC0 +2940 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C1 +ENCODING 30401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0880 +11C0 +1040 +2140 +C080 +3FC0 +2A40 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76C2 +ENCODING 30402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0200 +0200 +FFE0 +0200 +0A00 +0400 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C3 +ENCODING 30403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0400 +0A00 +3980 +C840 +0800 +7F80 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C4 +ENCODING 30404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0880 +7F80 +4800 +FF80 +0880 +0980 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C5 +ENCODING 30405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FC0 +2240 +2240 +3FC0 +0200 +0200 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C6 +ENCODING 30406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +2080 +DF60 +0900 +1500 +6200 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76C7 +ENCODING 30407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1900 +2480 +C060 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76C8 +ENCODING 30408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +17E0 +1920 +2620 +4940 +BFC0 +2940 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C9 +ENCODING 30409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1500 +2480 +C060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76CA +ENCODING 30410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +1100 +2080 +4040 +BFA0 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CB +ENCODING 30411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0800 +1F80 +2880 +C700 +38E0 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CC +ENCODING 30412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +AAC0 +1220 +21E0 +C000 +3FC0 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76CD +ENCODING 30413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +7F80 +0040 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CE +ENCODING 30414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2440 +FFE0 +0900 +3080 +C060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76CF +ENCODING 30415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2400 +FF80 +1000 +FF80 +1140 +0E40 +F1C0 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D0 +ENCODING 30416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2200 +FB00 +22C0 +3A40 +E200 +0000 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D1 +ENCODING 30417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +4A00 +4BE0 +4A00 +4C80 +4840 +0800 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D2 +ENCODING 30418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1F00 +2080 +DF60 +1100 +1F00 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D3 +ENCODING 30419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +4100 +2FE0 +4100 +C500 +4200 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D4 +ENCODING 30420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1A40 +2A80 +5500 +8880 +3060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D5 +ENCODING 30421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1780 +4480 +1680 +25A0 +C8A0 +1060 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D6 +ENCODING 30422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +0000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76D7 +ENCODING 30423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8800 +4FC0 +3240 +C200 +4500 +58C0 +0000 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D8 +ENCODING 30424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1480 +1280 +7FE0 +1480 +2280 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D9 +ENCODING 30425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76DA +ENCODING 30426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0500 +FFC0 +2480 +1700 +1D00 +E480 +4C40 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76DB +ENCODING 30427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7FE0 +4200 +7A40 +4A80 +59A0 +8260 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76DC +ENCODING 30428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +17E0 +5920 +2140 +6280 +2440 +2820 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76DD +ENCODING 30429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +2540 +1480 +6460 +3FC0 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76DE +ENCODING 30430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1400 +FF80 +1240 +FFC0 +0400 +FF80 +1240 +EFC0 +7F80 +5480 +FFC0 +ENDCHAR +STARTCHAR U_76DF +ENCODING 30431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +4BC0 +7A40 +04C0 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E0 +ENCODING 30432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFE0 +1480 +6B00 +1680 +6A60 +1600 +7FC0 +4940 +FFE0 +ENDCHAR +STARTCHAR U_76E1 +ENCODING 30433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +0480 +FFE0 +5240 +8920 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E2 +ENCODING 30434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +AFE0 +F900 +A980 +FA40 +0420 +3FC0 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76E3 +ENCODING 30435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F9E0 +8A00 +FA80 +A040 +FC00 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E4 +ENCODING 30436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +FA80 +AAE0 +AC00 +FBC0 +AA80 +A900 +1280 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E5 +ENCODING 30437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +C4C0 +9F40 +ECC0 +9640 +F5C0 +AC40 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E6 +ENCODING 30438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +64C0 +BF20 +0A00 +FFE0 +2A80 +3380 +2080 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E7 +ENCODING 30439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FC0 +5460 +5FC0 +5240 +5FC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_76E8 +ENCODING 30440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2200 +D7C0 +2540 +D6C0 +2540 +C7C0 +0820 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E9 +ENCODING 30441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13E0 +FE40 +2940 +FC80 +1140 +1220 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EA +ENCODING 30442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +A880 +4F80 +2880 +CFE0 +5540 +6540 +0A80 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EB +ENCODING 30443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +1100 +7FC0 +0A00 +3F80 +2A80 +7FC0 +4940 +FFE0 +ENDCHAR +STARTCHAR U_76EC +ENCODING 30444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F480 +9080 +F7E0 +A240 +FBC0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76ED +ENCODING 30445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +A9E0 +FB40 +1140 +FD40 +2880 +FD40 +1220 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EE +ENCODING 30446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +FE +82 +82 +FE +82 +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_76EF +ENCODING 30447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F080 +9080 +F080 +9080 +9080 +F080 +9080 +F080 +9080 +0380 +ENDCHAR +STARTCHAR U_76F0 +ENCODING 30448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +F100 +9100 +9FE0 +F100 +9100 +F100 +9100 +0100 +ENDCHAR +STARTCHAR U_76F1 +ENCODING 30449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +F100 +9FE0 +9100 +F100 +9100 +F900 +9500 +0200 +ENDCHAR +STARTCHAR U_76F2 +ENCODING 30450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +3F80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_76F3 +ENCODING 30451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F400 +9400 +9400 +F400 +9400 +F400 +9400 +07C0 +ENDCHAR +STARTCHAR U_76F4 +ENCODING 30452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2080 +FFE0 +ENDCHAR +STARTCHAR U_76F5 +ENCODING 30453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F800 +9780 +9080 +F100 +9200 +F420 +9420 +03E0 +ENDCHAR +STARTCHAR U_76F6 +ENCODING 30454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +F000 +9FE0 +9280 +F280 +9280 +9480 +F4A0 +8860 +1000 +ENDCHAR +STARTCHAR U_76F7 +ENCODING 30455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +F820 +9220 +9120 +F0A0 +9720 +F020 +9120 +00C0 +ENDCHAR +STARTCHAR U_76F8 +ENCODING 30456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7E20 +13E0 +1220 +3A20 +57E0 +9220 +1220 +13E0 +1220 +ENDCHAR +STARTCHAR U_76F9 +ENCODING 30457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +F100 +9520 +9520 +F7E0 +9100 +F120 +9120 +00E0 +ENDCHAR +STARTCHAR U_76FA +ENCODING 30458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +F780 +9400 +F400 +97E0 +9480 +F480 +9480 +F480 +9880 +1080 +ENDCHAR +STARTCHAR U_76FB +ENCODING 30459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +F820 +9780 +9200 +F7C0 +9040 +F040 +9240 +0180 +ENDCHAR +STARTCHAR U_76FC +ENCODING 30460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F280 +9240 +F440 +9820 +97C0 +F240 +9240 +F240 +9440 +0980 +ENDCHAR +STARTCHAR U_76FD +ENCODING 30461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +E200 +AFC0 +E200 +A200 +BFE0 +E200 +0200 +0200 +ENDCHAR +STARTCHAR U_76FE +ENCODING 30462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2200 +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_76FF +ENCODING 30463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E200 +BFE0 +A880 +E880 +A500 +E500 +A200 +A500 +E8E0 +1040 +ENDCHAR +STARTCHAR U_7700 +ENCODING 30464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9220 +9220 +F3E0 +9220 +F220 +93E0 +9220 +F220 +04A0 +0840 +ENDCHAR +STARTCHAR U_7701 +ENCODING 30465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1480 +2560 +4620 +1F80 +3080 +DF80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7702 +ENCODING 30466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +AF00 +A900 +E900 +AFE0 +E900 +A900 +A880 +EAA0 +AC60 +0820 +ENDCHAR +STARTCHAR U_7703 +ENCODING 30467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F000 +9000 +F000 +9FE0 +9100 +F100 +9200 +F440 +9FA0 +0420 +ENDCHAR +STARTCHAR U_7704 +ENCODING 30468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +9100 +F5E0 +9520 +9520 +F7E0 +9020 +F020 +9120 +00C0 +ENDCHAR +STARTCHAR U_7705 +ENCODING 30469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +F7C0 +9540 +9540 +F540 +9540 +F480 +9940 +1220 +ENDCHAR +STARTCHAR U_7706 +ENCODING 30470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +BFE0 +A400 +E780 +A480 +E480 +A480 +A880 +EA80 +1100 +ENDCHAR +STARTCHAR U_7707 +ENCODING 30471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9540 +F520 +9520 +9900 +F120 +9040 +9080 +F300 +0C00 +ENDCHAR +STARTCHAR U_7708 +ENCODING 30472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97E0 +F520 +9520 +9180 +F180 +9280 +F4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7709 +ENCODING 30473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +3FE0 +2000 +2FC0 +2840 +2FC0 +2840 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_770A +ENCODING 30474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +91C0 +F700 +9100 +F1E0 +9700 +9120 +F120 +00E0 +ENDCHAR +STARTCHAR U_770B +ENCODING 30475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +7F80 +0800 +FFE0 +1080 +3F80 +5080 +9F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_770C +ENCODING 30476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +5080 +5F80 +5080 +5F80 +5080 +7FE0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_770D +ENCODING 30477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F400 +9620 +F520 +94C0 +9440 +F4A0 +9520 +F600 +9400 +07E0 +ENDCHAR +STARTCHAR U_770E +ENCODING 30478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A000 +A000 +FFE0 +A100 +A100 +E940 +A920 +B120 +E500 +0200 +ENDCHAR +STARTCHAR U_770F +ENCODING 30479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFC0 +EA40 +AA40 +FFE0 +A500 +A500 +E880 +1060 +2040 +ENDCHAR +STARTCHAR U_7710 +ENCODING 30480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F080 +9080 +F080 +9480 +94E0 +F480 +9480 +F480 +9480 +0FE0 +ENDCHAR +STARTCHAR U_7711 +ENCODING 30481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9480 +FFE0 +92A0 +94A0 +F5A0 +9EA0 +F0A0 +9120 +0260 +ENDCHAR +STARTCHAR U_7712 +ENCODING 30482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +97E0 +F4A0 +97E0 +94A0 +F7E0 +94A0 +F080 +9080 +0080 +ENDCHAR +STARTCHAR U_7713 +ENCODING 30483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F120 +97E0 +F500 +9540 +9540 +F540 +9480 +F6A0 +9560 +0220 +ENDCHAR +STARTCHAR U_7714 +ENCODING 30484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +0600 +2480 +4440 +9500 +24C0 +4440 +0400 +ENDCHAR +STARTCHAR U_7715 +ENCODING 30485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +F820 +9100 +9680 +F100 +9640 +F080 +9100 +0600 +ENDCHAR +STARTCHAR U_7716 +ENCODING 30486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7C0 +9440 +F440 +9440 +F7C0 +9280 +9280 +F4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7717 +ENCODING 30487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9820 +F7A0 +94A0 +F4A0 +97A0 +9020 +F0A0 +0040 +ENDCHAR +STARTCHAR U_7718 +ENCODING 30488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +5140 +3FC0 +D0A0 +1F80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7719 +ENCODING 30489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +FFA0 +9020 +9000 +F7E0 +9420 +F420 +97E0 +0420 +ENDCHAR +STARTCHAR U_771A +ENCODING 30490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +3FC0 +0400 +FFE0 +1080 +1E80 +1780 +1080 +1F80 +ENDCHAR +STARTCHAR U_771B +ENCODING 30491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +F100 +9FE0 +9100 +F380 +9540 +F920 +9120 +0100 +ENDCHAR +STARTCHAR U_771C +ENCODING 30492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +E200 +AFC0 +A700 +E680 +AA80 +B240 +E220 +0200 +ENDCHAR +STARTCHAR U_771D +ENCODING 30493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9420 +F000 +97E0 +9080 +F080 +9080 +F480 +9280 +0100 +ENDCHAR +STARTCHAR U_771E +ENCODING 30494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4040 +3FC0 +A100 +BF00 +A100 +BF00 +A100 +FFC0 +4100 +8080 +ENDCHAR +STARTCHAR U_771F +ENCODING 30495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +3F00 +2100 +3D00 +2F00 +2100 +FFC0 +1200 +6180 +ENDCHAR +STARTCHAR U_7720 +ENCODING 30496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +97E0 +F480 +9480 +97E0 +F480 +9480 +F4A0 +9660 +0420 +ENDCHAR +STARTCHAR U_7721 +ENCODING 30497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A900 +A900 +EFE0 +A900 +E900 +A880 +AAA0 +ED60 +08A0 +ENDCHAR +STARTCHAR U_7722 +ENCODING 30498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +CAC0 +3220 +7FE0 +A080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7723 +ENCODING 30499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F500 +97C0 +F900 +9100 +9FE0 +F100 +9100 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_7724 +ENCODING 30500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A840 +EFC0 +A800 +AA40 +EA80 +AB00 +AA20 +EA20 +11E0 +2000 +ENDCHAR +STARTCHAR U_7725 +ENCODING 30501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D60 +5180 +5520 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7726 +ENCODING 30502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A280 +AAA0 +EBC0 +AA80 +AA80 +EA80 +AA80 +ABA0 +FEA0 +0860 +ENDCHAR +STARTCHAR U_7727 +ENCODING 30503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9220 +F4A0 +9840 +F7E0 +9420 +9420 +F420 +07E0 +ENDCHAR +STARTCHAR U_7728 +ENCODING 30504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +F080 +97E0 +9040 +F080 +9100 +F200 +9600 +09E0 +ENDCHAR +STARTCHAR U_7729 +ENCODING 30505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +F100 +9240 +97C0 +F080 +9100 +F240 +9FA0 +0420 +ENDCHAR +STARTCHAR U_772A +ENCODING 30506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +E920 +A920 +AAA0 +EA60 +AC20 +A820 +E8A0 +0840 +ENDCHAR +STARTCHAR U_772B +ENCODING 30507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9FE0 +F100 +9100 +FFE0 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_772C +ENCODING 30508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E480 +A440 +BFE0 +E500 +A520 +E540 +A980 +A920 +EB20 +10E0 +ENDCHAR +STARTCHAR U_772D +ENCODING 30509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +F100 +9FE0 +9100 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_772E +ENCODING 30510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +ABA0 +E820 +ABA0 +EAA0 +ABA0 +A820 +E820 +08A0 +0840 +ENDCHAR +STARTCHAR U_772F +ENCODING 30511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F520 +9540 +F100 +9FE0 +9100 +F380 +9540 +F920 +9120 +0100 +ENDCHAR +STARTCHAR U_7730 +ENCODING 30512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A200 +A280 +E440 +AFC0 +A100 +E100 +AFC0 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7731 +ENCODING 30513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9100 +F7E0 +9120 +97E0 +F500 +97E0 +F120 +9280 +0C60 +ENDCHAR +STARTCHAR U_7732 +ENCODING 30514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +9240 +F3C0 +9240 +93C0 +F240 +92E0 +FF40 +9040 +0040 +ENDCHAR +STARTCHAR U_7733 +ENCODING 30515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +9440 +FA80 +9100 +9200 +F7E0 +9A20 +9220 +F3E0 +0220 +ENDCHAR +STARTCHAR U_7734 +ENCODING 30516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9820 +97A0 +F4A0 +97A0 +F4A0 +97A0 +9020 +F0A0 +0040 +ENDCHAR +STARTCHAR U_7735 +ENCODING 30517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +9440 +FA80 +9180 +9FE0 +F220 +9640 +9180 +F100 +0E00 +ENDCHAR +STARTCHAR U_7736 +ENCODING 30518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +97E0 +F480 +9480 +95C0 +F480 +9480 +97E0 +F400 +07E0 +ENDCHAR +STARTCHAR U_7737 +ENCODING 30519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +1080 +3FC0 +50A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7738 +ENCODING 30520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9240 +97E0 +F120 +9500 +97C0 +F900 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7739 +ENCODING 30521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9100 +F7C0 +9100 +9100 +FFE0 +9100 +9280 +F440 +0820 +ENDCHAR +STARTCHAR U_773A +ENCODING 30522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +9AA0 +F6C0 +9280 +96C0 +FAA0 +9280 +94A0 +F8A0 +1060 +ENDCHAR +STARTCHAR U_773B +ENCODING 30523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9FE0 +F100 +9100 +97C0 +F100 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_773C +ENCODING 30524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9500 +F520 +9540 +9480 +F540 +0620 +ENDCHAR +STARTCHAR U_773D +ENCODING 30525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +ABE0 +EA80 +AAA0 +AAC0 +EA80 +AA80 +AAC0 +EB20 +1220 +ENDCHAR +STARTCHAR U_773E +ENCODING 30526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +0180 +7E00 +2480 +2480 +5540 +8E20 +0400 +ENDCHAR +STARTCHAR U_773F +ENCODING 30527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF00 +A100 +E140 +BD80 +E580 +A540 +A940 +F160 +A540 +0200 +ENDCHAR +STARTCHAR U_7740 +ENCODING 30528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0800 +FFE0 +1080 +3E80 +5780 +9080 +1F80 +ENDCHAR +STARTCHAR U_7741 +ENCODING 30529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9480 +F7C0 +9140 +9FE0 +F140 +97C0 +9100 +F500 +0200 +ENDCHAR +STARTCHAR U_7742 +ENCODING 30530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C40 +E340 +1C40 +E340 +3FE0 +2840 +2FC0 +2840 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7743 +ENCODING 30531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9440 +9FE0 +F2A0 +9440 +FA20 +93C0 +9680 +F900 +0280 +0C60 +ENDCHAR +STARTCHAR U_7744 +ENCODING 30532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9520 +9540 +F7E0 +9420 +97E0 +F420 +97E0 +9420 +F420 +04E0 +ENDCHAR +STARTCHAR U_7745 +ENCODING 30533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9000 +F7C0 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7746 +ENCODING 30534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +F7C0 +9000 +9000 +FFE0 +9280 +92A0 +F4A0 +0860 +ENDCHAR +STARTCHAR U_7747 +ENCODING 30535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +F120 +97E0 +F500 +97E0 +9320 +F5E0 +9900 +0100 +ENDCHAR +STARTCHAR U_7748 +ENCODING 30536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AFE0 +A100 +E100 +A7C0 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7749 +ENCODING 30537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AA80 +AA80 +EA80 +B740 +E200 +AFC0 +A200 +E200 +1FE0 +ENDCHAR +STARTCHAR U_774A +ENCODING 30538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F000 +97E0 +9420 +F7E0 +9420 +F7E0 +9420 +04E0 +ENDCHAR +STARTCHAR U_774B +ENCODING 30539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9EA0 +9280 +FFE0 +9280 +93A0 +F6A0 +9AC0 +F2A0 +9360 +0420 +ENDCHAR +STARTCHAR U_774C +ENCODING 30540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93C0 +9440 +FFE0 +9520 +9520 +F7E0 +9280 +F2A0 +94A0 +1860 +ENDCHAR +STARTCHAR U_774D +ENCODING 30541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +9280 +F2A0 +94A0 +1860 +ENDCHAR +STARTCHAR U_774E +ENCODING 30542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F660 +9180 +9660 +F100 +9FE0 +9280 +FFE0 +94A0 +F4A0 +94E0 +0080 +ENDCHAR +STARTCHAR U_774F +ENCODING 30543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +A920 +EFE0 +A920 +ABA0 +ED60 +A920 +A920 +EFE0 +0820 +ENDCHAR +STARTCHAR U_7750 +ENCODING 30544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9540 +F380 +9FE0 +F100 +9380 +9540 +F920 +0100 +ENDCHAR +STARTCHAR U_7751 +ENCODING 30545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +FBA0 +9000 +FA40 +9540 +9540 +F080 +0FE0 +ENDCHAR +STARTCHAR U_7752 +ENCODING 30546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9520 +9540 +FA80 +9540 +9920 +F540 +9980 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_7753 +ENCODING 30547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +EAA0 +AFE0 +EAA0 +AAA0 +BFE0 +E440 +0820 +1020 +ENDCHAR +STARTCHAR U_7754 +ENCODING 30548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A440 +EBA0 +A000 +AFE0 +EAA0 +AFE0 +EAA0 +AAA0 +0860 +ENDCHAR +STARTCHAR U_7755 +ENCODING 30549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +E400 +A7E0 +A8A0 +F5A0 +A2E0 +E480 +A8A0 +1060 +ENDCHAR +STARTCHAR U_7756 +ENCODING 30550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +9440 +9A20 +F3C0 +9680 +F900 +9280 +1C60 +ENDCHAR +STARTCHAR U_7757 +ENCODING 30551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9200 +F7E0 +9AA0 +94A0 +F920 +0240 +ENDCHAR +STARTCHAR U_7758 +ENCODING 30552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +FFE0 +2080 +3F80 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_7759 +ENCODING 30553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9420 +F7E0 +9540 +9520 +F7E0 +9500 +F900 +9280 +0C60 +ENDCHAR +STARTCHAR U_775A +ENCODING 30554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +9480 +F7E0 +9480 +97E0 +F480 +97E0 +F480 +0880 +17E0 +ENDCHAR +STARTCHAR U_775B +ENCODING 30555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +F7C0 +9100 +9FE0 +F440 +97C0 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_775C +ENCODING 30556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9A20 +9540 +F7C0 +9140 +9FE0 +F140 +97C0 +9100 +F500 +0200 +ENDCHAR +STARTCHAR U_775D +ENCODING 30557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +7EA0 +3920 +D660 +0000 +3FC0 +24C0 +2940 +3240 +3FC0 +ENDCHAR +STARTCHAR U_775E +ENCODING 30558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9540 +F540 +9BA0 +9120 +F100 +9380 +F540 +9920 +1120 +ENDCHAR +STARTCHAR U_775F +ENCODING 30559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9440 +F6C0 +9AA0 +9AA0 +F100 +9FE0 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_7760 +ENCODING 30560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AA80 +AFE0 +E200 +AFE0 +A840 +F7A0 +A480 +A5A0 +E420 +07E0 +ENDCHAR +STARTCHAR U_7761 +ENCODING 30561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +F540 +9540 +9FE0 +F540 +9540 +9FE0 +F100 +07C0 +ENDCHAR +STARTCHAR U_7762 +ENCODING 30562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9480 +97E0 +FC80 +97E0 +9480 +F480 +97E0 +9480 +F480 +07E0 +ENDCHAR +STARTCHAR U_7763 +ENCODING 30563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +1120 +FD40 +5880 +5540 +B220 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7764 +ENCODING 30564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +F540 +97C0 +9000 +FFE0 +9280 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_7765 +ENCODING 30565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9520 +F7E0 +9520 +97E0 +F280 +9480 +FFE0 +9080 +0080 +ENDCHAR +STARTCHAR U_7766 +ENCODING 30566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +9440 +9820 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_7767 +ENCODING 30567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +97E0 +F480 +9560 +9620 +F7E0 +9420 +F7E0 +9420 +07E0 +ENDCHAR +STARTCHAR U_7768 +ENCODING 30568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +ACE0 +A820 +EEE0 +A820 +AFE0 +E280 +A280 +A2A0 +E4A0 +1860 +ENDCHAR +STARTCHAR U_7769 +ENCODING 30569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +F040 +9FE0 +9940 +F580 +9340 +F520 +9920 +0300 +ENDCHAR +STARTCHAR U_776A +ENCODING 30570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +1100 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_776B +ENCODING 30571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9140 +FFE0 +9140 +97C0 +F100 +95E0 +F500 +9B00 +10E0 +ENDCHAR +STARTCHAR U_776C +ENCODING 30572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +9920 +F4C0 +9100 +9FE0 +F100 +9380 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_776D +ENCODING 30573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +ABA0 +E920 +AFE0 +A820 +EBA0 +AAA0 +ABA0 +E820 +10E0 +ENDCHAR +STARTCHAR U_776E +ENCODING 30574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +AFA0 +B000 +EEA0 +AAA0 +EEA0 +AAA0 +AEA0 +EA20 +0AE0 +ENDCHAR +STARTCHAR U_776F +ENCODING 30575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +89E0 +FB40 +9140 +FC80 +C960 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7770 +ENCODING 30576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +E200 +BFE0 +A200 +E7C0 +AC40 +B440 +E7C0 +0440 +ENDCHAR +STARTCHAR U_7771 +ENCODING 30577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AA20 +AA20 +EEE0 +A800 +EFE0 +A920 +AEA0 +E8C0 +0940 +0A20 +ENDCHAR +STARTCHAR U_7772 +ENCODING 30578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9500 +F7C0 +9900 +97C0 +F100 +0FE0 +ENDCHAR +STARTCHAR U_7773 +ENCODING 30579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A500 +AA80 +F7E0 +A200 +FFC0 +A200 +AF80 +E200 +1FE0 +ENDCHAR +STARTCHAR U_7774 +ENCODING 30580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +B220 +AFC0 +E200 +AFC0 +AA40 +EFC0 +AA40 +BFE0 +E200 +0200 +ENDCHAR +STARTCHAR U_7775 +ENCODING 30581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E4C0 +BEA0 +A480 +FFE0 +A0A0 +EEA0 +AAC0 +AEA0 +E160 +0620 +ENDCHAR +STARTCHAR U_7776 +ENCODING 30582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +BFE0 +E480 +A840 +F7A0 +A480 +A780 +E480 +0780 +ENDCHAR +STARTCHAR U_7777 +ENCODING 30583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FD40 +A7E0 +E940 +B3C0 +BD00 +E7C0 +A900 +BBE0 +ED00 +13E0 +ENDCHAR +STARTCHAR U_7778 +ENCODING 30584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +E800 +ABE0 +EA20 +ABE0 +AA20 +EBE0 +1220 +23E0 +ENDCHAR +STARTCHAR U_7779 +ENCODING 30585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FF40 +9280 +9FE0 +F100 +97C0 +9C40 +F7C0 +9440 +F7C0 +0440 +ENDCHAR +STARTCHAR U_777A +ENCODING 30586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A880 +FFE0 +AA00 +ABC0 +EC80 +AFE0 +A980 +EA40 +0C20 +ENDCHAR +STARTCHAR U_777B +ENCODING 30587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A820 +B7C0 +E000 +A7C0 +E440 +A7C0 +A440 +E7C0 +9FE0 +ENDCHAR +STARTCHAR U_777C +ENCODING 30588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9000 +FFE0 +9500 +95E0 +FB00 +11E0 +ENDCHAR +STARTCHAR U_777D +ENCODING 30589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +92A0 +9A40 +F440 +9BA0 +9100 +FFE0 +9100 +9280 +F440 +1820 +ENDCHAR +STARTCHAR U_777E +ENCODING 30590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4940 +7FC0 +0400 +7FC0 +0400 +FFE0 +1100 +FFE0 +0400 +ENDCHAR +STARTCHAR U_777F +ENCODING 30591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +50A0 +AF40 +5080 +3FC0 +50A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7780 +ENCODING 30592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +3480 +5140 +9220 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7781 +ENCODING 30593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +9140 +9FE0 +F280 +0C60 +ENDCHAR +STARTCHAR U_7782 +ENCODING 30594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +9120 +FFE0 +9100 +B900 +A9C0 +BA40 +AB40 +BC80 +A940 +BA20 +ENDCHAR +STARTCHAR U_7783 +ENCODING 30595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A880 +AFE0 +E880 +ABE0 +AA20 +EBE0 +AA20 +ABE0 +EA20 +13E0 +ENDCHAR +STARTCHAR U_7784 +ENCODING 30596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +9FE0 +F240 +97E0 +9520 +F520 +97E0 +9520 +F520 +07E0 +ENDCHAR +STARTCHAR U_7785 +ENCODING 30597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +A440 +A560 +FF40 +A540 +A640 +ED40 +B440 +E440 +A4A0 +0520 +ENDCHAR +STARTCHAR U_7786 +ENCODING 30598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +BFE0 +E000 +A7C0 +E440 +A540 +A540 +E280 +0C60 +ENDCHAR +STARTCHAR U_7787 +ENCODING 30599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +AAA0 +A9C0 +E080 +BFE0 +A880 +E9C0 +AAA0 +AC80 +E800 +17E0 +ENDCHAR +STARTCHAR U_7788 +ENCODING 30600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AA40 +B4A0 +EF40 +A000 +AEE0 +EAA0 +A660 +AAA0 +F320 +0660 +ENDCHAR +STARTCHAR U_7789 +ENCODING 30601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8540 +7A20 +03E0 +7940 +4940 +7880 +4940 +7A20 +ENDCHAR +STARTCHAR U_778A +ENCODING 30602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +ABC0 +E940 +AFE0 +E940 +ABC0 +A900 +F7C0 +9440 +27C0 +ENDCHAR +STARTCHAR U_778B +ENCODING 30603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +9440 +9740 +F5C0 +9440 +9FE0 +F280 +0C60 +ENDCHAR +STARTCHAR U_778C +ENCODING 30604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A100 +EFE0 +A440 +AFE0 +E000 +AFE0 +AAA0 +EAA0 +1FE0 +ENDCHAR +STARTCHAR U_778D +ENCODING 30605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +ADE0 +A920 +EFE0 +A920 +AFE0 +E100 +AFE0 +A480 +E300 +1CE0 +ENDCHAR +STARTCHAR U_778E +ENCODING 30606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +E7C0 +A100 +A7C0 +E100 +AFE0 +A440 +E440 +07C0 +ENDCHAR +STARTCHAR U_778F +ENCODING 30607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +FFE0 +2080 +3FA0 +5540 +98E0 +ENDCHAR +STARTCHAR U_7790 +ENCODING 30608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +6500 +5300 +4900 +7F00 +0000 +F780 +9480 +F780 +9480 +F780 +ENDCHAR +STARTCHAR U_7791 +ENCODING 30609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +E440 +A7C0 +A440 +E7C0 +A100 +AFE0 +E280 +0C60 +ENDCHAR +STARTCHAR U_7792 +ENCODING 30610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +A280 +EFE0 +A280 +AFE0 +EAA0 +AAA0 +AD60 +E820 +0860 +ENDCHAR +STARTCHAR U_7793 +ENCODING 30611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +FEA0 +A2A0 +FEA0 +A2A0 +FEA0 +B6A0 +BEA0 +E2A0 +0420 +0820 +ENDCHAR +STARTCHAR U_7794 +ENCODING 30612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +A100 +E7C0 +A100 +BFE0 +E540 +A6C0 +A540 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_7795 +ENCODING 30613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9280 +F100 +9FE0 +9440 +F7C0 +9440 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7796 +ENCODING 30614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +B940 +D220 +B9C0 +A880 +FB60 +1F00 +1500 +1B00 +1500 +1F00 +ENDCHAR +STARTCHAR U_7797 +ENCODING 30615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +9440 +F7C0 +9440 +F7E0 +9400 +97E0 +F520 +9AA0 +0AC0 +ENDCHAR +STARTCHAR U_7798 +ENCODING 30616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A800 +ABC0 +EA40 +ABC0 +A800 +EEE0 +AAA0 +AEE0 +E800 +0FE0 +ENDCHAR +STARTCHAR U_7799 +ENCODING 30617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +F7C0 +9440 +97C0 +F440 +9FE0 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_779A +ENCODING 30618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +EBA0 +A100 +A7C0 +E540 +A7C0 +A540 +E7C0 +1860 +ENDCHAR +STARTCHAR U_779B +ENCODING 30619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A940 +B2A0 +E4A0 +A800 +B880 +EA80 +AAE0 +AA80 +ED80 +08E0 +ENDCHAR +STARTCHAR U_779C +ENCODING 30620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +FFE0 +9540 +9FE0 +F920 +9FE0 +F480 +9300 +1CE0 +ENDCHAR +STARTCHAR U_779D +ENCODING 30621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +A540 +E6C0 +A540 +A7C0 +E100 +AFE0 +AAA0 +EFA0 +0860 +ENDCHAR +STARTCHAR U_779E +ENCODING 30622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A440 +E7C0 +A100 +AFE0 +E920 +ADA0 +AB60 +EDA0 +0960 +ENDCHAR +STARTCHAR U_779F +ENCODING 30623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A000 +E7C0 +A000 +AFE0 +E540 +1B20 +ENDCHAR +STARTCHAR U_77A0 +ENCODING 30624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F820 +97C0 +9440 +F7C0 +9100 +F7C0 +9100 +0FE0 +ENDCHAR +STARTCHAR U_77A1 +ENCODING 30625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBC0 +AA40 +BFC0 +EA40 +ABC0 +BE40 +EA40 +AFC0 +A9A0 +F2A0 +2460 +ENDCHAR +STARTCHAR U_77A2 +ENCODING 30626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4940 +FFE0 +A0A0 +3E80 +2780 +2080 +3F80 +ENDCHAR +STARTCHAR U_77A3 +ENCODING 30627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +E7C0 +A100 +AFE0 +E920 +AFE0 +A540 +ECA0 +17A0 +ENDCHAR +STARTCHAR U_77A4 +ENCODING 30628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AFE0 +E920 +ABA0 +A920 +EFE0 +A820 +0860 +ENDCHAR +STARTCHAR U_77A5 +ENCODING 30629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +9740 +BC80 +D540 +9620 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_77A6 +ENCODING 30630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +E440 +A7C0 +E280 +BFE0 +A440 +E440 +07C0 +ENDCHAR +STARTCHAR U_77A7 +ENCODING 30631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +A900 +BFE0 +E900 +AFC0 +A900 +EFC0 +A900 +AFE0 +E540 +0AA0 +ENDCHAR +STARTCHAR U_77A8 +ENCODING 30632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +A6C0 +AFE0 +E280 +AFE0 +A100 +E7C0 +A100 +AFE0 +E280 +0C60 +ENDCHAR +STARTCHAR U_77A9 +ENCODING 30633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +E900 +AFE0 +E920 +AFE0 +A900 +EFE0 +1960 +2BA0 +ENDCHAR +STARTCHAR U_77AA +ENCODING 30634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF40 +AAA0 +A440 +EBA0 +B000 +A7C0 +E440 +A7C0 +A440 +E280 +1FE0 +ENDCHAR +STARTCHAR U_77AB +ENCODING 30635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9FE0 +FAA0 +9FE0 +9440 +F7C0 +9440 +FFE0 +9100 +0100 +ENDCHAR +STARTCHAR U_77AC +ENCODING 30636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +AF20 +A540 +EFE0 +A820 +A440 +EFE0 +B240 +AFE0 +E840 +1040 +ENDCHAR +STARTCHAR U_77AD +ENCODING 30637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +9AA0 +F440 +97C0 +9C60 +F7C0 +9440 +97C0 +F540 +0B20 +ENDCHAR +STARTCHAR U_77AE +ENCODING 30638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AA80 +EFE0 +A120 +AEA0 +EAA0 +AE40 +AA40 +EEA0 +0B20 +ENDCHAR +STARTCHAR U_77AF +ENCODING 30639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AFE0 +EAA0 +ABA0 +AAA0 +EBA0 +ACA0 +0860 +ENDCHAR +STARTCHAR U_77B0 +ENCODING 30640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A480 +BFE0 +EAA0 +AFA0 +AAA0 +EEA0 +AAA0 +BF40 +E2A0 +0320 +ENDCHAR +STARTCHAR U_77B1 +ENCODING 30641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9FE0 +9480 +FFE0 +9540 +9FE0 +F540 +9FE0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_77B2 +ENCODING 30642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A280 +AFE0 +E520 +A900 +AFE0 +EAA0 +AFE0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_77B3 +ENCODING 30643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +E100 +BFE0 +A540 +E7C0 +A540 +AFE0 +E100 +1FE0 +ENDCHAR +STARTCHAR U_77B4 +ENCODING 30644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E800 +AFE0 +B540 +E540 +BFE0 +A540 +E540 +BFE0 +A540 +EAA0 +12A0 +ENDCHAR +STARTCHAR U_77B5 +ENCODING 30645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +BFE0 +E540 +A920 +A540 +EFE0 +BB40 +A5E0 +E840 +1040 +ENDCHAR +STARTCHAR U_77B6 +ENCODING 30646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9540 +FFE0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +0C60 +ENDCHAR +STARTCHAR U_77B7 +ENCODING 30647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +ABA0 +EAA0 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_77B8 +ENCODING 30648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +EA80 +BFE0 +EA80 +AFC0 +A200 +FFE0 +0A80 +3260 +ENDCHAR +STARTCHAR U_77B9 +ENCODING 30649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +FFE0 +AAC0 +F7A0 +A400 +A7C0 +EA80 +1300 +0CE0 +ENDCHAR +STARTCHAR U_77BA +ENCODING 30650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +BFC0 +E020 +AFE0 +AAA0 +EFE0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_77BB +ENCODING 30651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A480 +AFE0 +FAA0 +AFE0 +A800 +EBC0 +A800 +AFE0 +F420 +27E0 +ENDCHAR +STARTCHAR U_77BC +ENCODING 30652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AFC0 +F020 +AEE0 +AAA0 +EEE0 +A000 +A440 +EAA0 +1120 +ENDCHAR +STARTCHAR U_77BD +ENCODING 30653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +F880 +8BC0 +F940 +50A0 +FF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_77BE +ENCODING 30654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4E40 +FFE0 +90A0 +6FC0 +0400 +7FE0 +ENDCHAR +STARTCHAR U_77BF +ENCODING 30655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2200 +7FE0 +A200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_77C0 +ENCODING 30656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FA80 +AF80 +F0E0 +AFA0 +E0A0 +AEA0 +AB40 +EAC0 +3120 +2220 +ENDCHAR +STARTCHAR U_77C1 +ENCODING 30657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +E4A0 +BFC0 +AE80 +ED80 +B540 +E620 +A140 +A520 +F440 +13C0 +ENDCHAR +STARTCHAR U_77C2 +ENCODING 30658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AEE0 +AAA0 +EEE0 +A100 +AFE0 +E540 +1920 +ENDCHAR +STARTCHAR U_77C3 +ENCODING 30659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +B740 +EFE0 +AAA0 +FFE0 +A000 +AFE0 +E100 +0300 +ENDCHAR +STARTCHAR U_77C4 +ENCODING 30660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +BFE0 +EAA0 +AFE0 +A100 +EFC0 +A100 +BFE0 +E540 +0AA0 +ENDCHAR +STARTCHAR U_77C5 +ENCODING 30661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +EAA0 +A7E0 +EC80 +B7C0 +A480 +E7C0 +0480 +07E0 +ENDCHAR +STARTCHAR U_77C6 +ENCODING 30662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +A500 +EFE0 +B900 +EFC0 +A900 +AFE0 +E440 +0380 +0C60 +ENDCHAR +STARTCHAR U_77C7 +ENCODING 30663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A480 +EFE0 +A820 +AFE0 +EA40 +B580 +AB80 +E540 +0A20 +ENDCHAR +STARTCHAR U_77C8 +ENCODING 30664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E7C0 +A440 +E7C0 +A100 +AFE0 +F4A0 +AFE0 +A240 +E240 +04C0 +ENDCHAR +STARTCHAR U_77C9 +ENCODING 30665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +E7C0 +A540 +A7C0 +FC40 +A7C0 +A440 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_77CA +ENCODING 30666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +A5E0 +AB20 +FDE0 +AB20 +BDE0 +E280 +A7E0 +AAA0 +F6A0 +0080 +ENDCHAR +STARTCHAR U_77CB +ENCODING 30667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EA80 +AFE0 +EA80 +AFC0 +ED40 +AFC0 +AD40 +EFE0 +1920 +2BA0 +ENDCHAR +STARTCHAR U_77CC +ENCODING 30668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +EFE0 +AA40 +AFE0 +ED40 +AFC0 +B540 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_77CD +ENCODING 30669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7FC0 +2200 +7FC0 +A200 +3FC0 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_77CE +ENCODING 30670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A880 +BFE0 +EAA0 +AFE0 +A440 +E7C0 +A7C0 +AC80 +E300 +1CE0 +ENDCHAR +STARTCHAR U_77CF +ENCODING 30671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +9440 +F7C0 +9440 +9FE0 +F4A0 +9FE0 +F3C0 +9440 +08C0 +ENDCHAR +STARTCHAR U_77D0 +ENCODING 30672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +AFE0 +E920 +AAA0 +A500 +EFE0 +B500 +A7C0 +E500 +07E0 +ENDCHAR +STARTCHAR U_77D1 +ENCODING 30673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +E100 +AFE0 +E920 +AB80 +E940 +AFC0 +F540 +9FE0 +2AA0 +5FE0 +ENDCHAR +STARTCHAR U_77D2 +ENCODING 30674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +EFE0 +AAA0 +FFE0 +A7C0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_77D3 +ENCODING 30675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +E420 +BFE0 +AA80 +EEE0 +AA80 +AEE0 +EAA0 +0AE0 +ENDCHAR +STARTCHAR U_77D4 +ENCODING 30676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9EE0 +FAA0 +9FE0 +9500 +FFE0 +9500 +F7C0 +9500 +07E0 +ENDCHAR +STARTCHAR U_77D5 +ENCODING 30677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +A0A0 +4E40 +F0E0 +5F40 +AAA0 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_77D6 +ENCODING 30678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AEE0 +EBA0 +AFE0 +EA80 +AFE0 +EAA0 +8FE0 +1480 +27E0 +ENDCHAR +STARTCHAR U_77D7 +ENCODING 30679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3280 +2980 +2480 +FFE0 +4A40 +6B40 +5AC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_77D8 +ENCODING 30680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +E100 +AFE0 +A100 +EFE0 +0AA0 +ENDCHAR +STARTCHAR U_77D9 +ENCODING 30681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AAE0 +AF20 +EAE0 +AF60 +AAA0 +EF60 +0A60 +ENDCHAR +STARTCHAR U_77DA +ENCODING 30682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +EA80 +AFE0 +AAA0 +EFE0 +AAA0 +ABE0 +F0A0 +27E0 +ENDCHAR +STARTCHAR U_77DB +ENCODING 30683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0100 +1A00 +0400 +FFC0 +0C80 +1500 +2400 +4400 +8400 +1C00 +ENDCHAR +STARTCHAR U_77DC +ENCODING 30684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +2940 +1140 +FE20 +1500 +3080 +57E0 +9040 +1040 +1080 +7080 +ENDCHAR +STARTCHAR U_77DD +ENCODING 30685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1100 +6280 +2640 +F920 +2FC0 +6040 +A480 +2300 +2100 +6100 +ENDCHAR +STARTCHAR U_77DE +ENCODING 30686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0500 +FFE0 +1240 +2200 +FFC0 +5140 +6EC0 +4A40 +4E40 +40C0 +ENDCHAR +STARTCHAR U_77DF +ENCODING 30687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +54A0 +22C0 +FFE0 +2420 +27E0 +6420 +A7E0 +2420 +2420 +6460 +ENDCHAR +STARTCHAR U_77E0 +ENCODING 30688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +5140 +27E0 +F940 +2FE0 +2800 +63E0 +A220 +23E0 +2220 +E3E0 +ENDCHAR +STARTCHAR U_77E1 +ENCODING 30689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +5EE0 +2500 +F7E0 +2900 +3FE0 +6900 +AFE0 +2240 +67E0 +ENDCHAR +STARTCHAR U_77E2 +ENCODING 30690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +7FC0 +4400 +8400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_77E3 +ENCODING 30691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +7E80 +2000 +3F80 +4400 +FFC0 +0400 +0A00 +31C0 +C080 +ENDCHAR +STARTCHAR U_77E4 +ENCODING 30692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +17E0 +F900 +8100 +FFE0 +1100 +1280 +1280 +A440 +4820 +ENDCHAR +STARTCHAR U_77E5 +ENCODING 30693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +7DE0 +9120 +1120 +FF20 +1120 +1120 +2920 +45E0 +8000 +ENDCHAR +STARTCHAR U_77E6 +ENCODING 30694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +C800 +5FC0 +6200 +7FE0 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_77E7 +ENCODING 30695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47A0 +40A0 +78A0 +A3A0 +2220 +FBA0 +20A0 +30A0 +28A0 +44A0 +8320 +ENDCHAR +STARTCHAR U_77E8 +ENCODING 30696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4380 +7880 +A080 +27E0 +F880 +2080 +3140 +2A40 +4420 +8820 +ENDCHAR +STARTCHAR U_77E9 +ENCODING 30697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7E00 +9200 +13E0 +FE20 +1220 +2BE0 +2A00 +4A00 +83E0 +ENDCHAR +STARTCHAR U_77EA +ENCODING 30698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A340 +2240 +FFE0 +2340 +22C0 +5240 +4440 +88C0 +ENDCHAR +STARTCHAR U_77EB +ENCODING 30699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7100 +AFE0 +2240 +FC20 +2240 +2240 +5240 +5440 +8840 +ENDCHAR +STARTCHAR U_77EC +ENCODING 30700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7D40 +9540 +13A0 +F900 +1100 +17C0 +2900 +4500 +8FE0 +ENDCHAR +STARTCHAR U_77ED +ENCODING 30701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +77C0 +A440 +2440 +F7C0 +2000 +2440 +5280 +4080 +8FE0 +ENDCHAR +STARTCHAR U_77EE +ENCODING 30702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +AFE0 +2540 +F920 +2100 +2FE0 +5240 +4980 +8660 +ENDCHAR +STARTCHAR U_77EF +ENCODING 30703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +7FE0 +A440 +2BA0 +F280 +2FE0 +2820 +3BA0 +4AA0 +8BE0 +ENDCHAR +STARTCHAR U_77F0 +ENCODING 30704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +4240 +7FE0 +AAA0 +2FE0 +F000 +27C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_77F1 +ENCODING 30705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +A7E0 +2480 +FFE0 +2480 +27E0 +3240 +4980 +8660 +ENDCHAR +STARTCHAR U_77F2 +ENCODING 30706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7FE0 +A480 +2AE0 +FE80 +2AE0 +2EA0 +2AC0 +5E80 +8AE0 +ENDCHAR +STARTCHAR U_77F3 +ENCODING 30707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +1000 +3FC0 +5040 +9040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_77F4 +ENCODING 30708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2080 +4080 +7880 +C880 +4880 +4880 +7880 +4A80 +0100 +ENDCHAR +STARTCHAR U_77F5 +ENCODING 30709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0040 +F840 +2240 +2240 +7A40 +4A40 +CA40 +4A40 +7A40 +4940 +0080 +ENDCHAR +STARTCHAR U_77F6 +ENCODING 30710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2480 +2480 +7480 +D480 +5480 +5480 +74A0 +08A0 +30E0 +ENDCHAR +STARTCHAR U_77F7 +ENCODING 30711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2040 +2080 +2080 +7880 +CFE0 +4880 +4880 +7C80 +4A80 +0100 +ENDCHAR +STARTCHAR U_77F8 +ENCODING 30712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +2080 +4080 +7FE0 +C880 +4880 +4880 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_77F9 +ENCODING 30713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2280 +2280 +7A80 +4A80 +CA80 +4A80 +4A80 +7AA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_77FA +ENCODING 30714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2700 +2100 +2100 +79E0 +CF00 +4900 +4900 +7920 +4920 +00E0 +ENDCHAR +STARTCHAR U_77FB +ENCODING 30715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +4400 +7BC0 +C880 +4900 +4900 +7A20 +4A20 +01E0 +ENDCHAR +STARTCHAR U_77FC +ENCODING 30716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2080 +2080 +4080 +7880 +C880 +4880 +4880 +7880 +4880 +07E0 +ENDCHAR +STARTCHAR U_77FD +ENCODING 30717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +21E0 +4220 +7420 +DA40 +5140 +5080 +7080 +5100 +0600 +ENDCHAR +STARTCHAR U_77FE +ENCODING 30718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +2480 +2480 +7480 +5680 +D580 +5480 +5480 +74A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_77FF +ENCODING 30719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +27E0 +2400 +7400 +5400 +D400 +5400 +5400 +7400 +0800 +1000 +ENDCHAR +STARTCHAR U_7800 +ENCODING 30720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F080 +2100 +2200 +77E0 +D2A0 +52A0 +5520 +7920 +5220 +04C0 +ENDCHAR +STARTCHAR U_7801 +ENCODING 30721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +2240 +2240 +7A40 +CFE0 +4820 +4FA0 +7820 +4920 +00C0 +ENDCHAR +STARTCHAR U_7802 +ENCODING 30722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +22C0 +22A0 +7CA0 +CC80 +48A0 +4840 +7880 +4900 +0600 +ENDCHAR +STARTCHAR U_7803 +ENCODING 30723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +22C0 +7A40 +CFE0 +4A40 +4A40 +7A40 +4D40 +0880 +ENDCHAR +STARTCHAR U_7804 +ENCODING 30724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2140 +7940 +CFE0 +4900 +4B80 +7A80 +4440 +0820 +ENDCHAR +STARTCHAR U_7805 +ENCODING 30725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2120 +2F40 +7380 +5540 +D540 +5540 +7540 +5920 +0320 +ENDCHAR +STARTCHAR U_7806 +ENCODING 30726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +2080 +7880 +4FE0 +C880 +4880 +7940 +4A20 +0420 +ENDCHAR +STARTCHAR U_7807 +ENCODING 30727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2FE0 +4440 +7A80 +CA80 +4900 +4A80 +7A80 +4440 +0820 +ENDCHAR +STARTCHAR U_7808 +ENCODING 30728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2400 +45E0 +7520 +D520 +5560 +5500 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7809 +ENCODING 30729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0400 +FFE0 +0400 +FFE0 +3040 +DFC0 +1040 +ENDCHAR +STARTCHAR U_780A +ENCODING 30730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +4000 +7780 +D480 +5480 +5480 +74A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_780B +ENCODING 30731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2080 +4280 +7AE0 +CA80 +4A80 +4A80 +7A80 +4A80 +07E0 +ENDCHAR +STARTCHAR U_780C +ENCODING 30732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FDE0 +24A0 +27A0 +7CA0 +D4A0 +55A0 +56A0 +7520 +5220 +0460 +ENDCHAR +STARTCHAR U_780D +ENCODING 30733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2420 +7940 +C900 +4900 +4900 +7A80 +4C40 +0820 +ENDCHAR +STARTCHAR U_780E +ENCODING 30734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +2440 +7820 +CA40 +4A40 +4A40 +4A40 +7A40 +4440 +0840 +ENDCHAR +STARTCHAR U_780F +ENCODING 30735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2440 +2820 +7FC0 +CA40 +4A40 +4A40 +7A40 +4D40 +0880 +ENDCHAR +STARTCHAR U_7810 +ENCODING 30736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FA40 +2240 +2280 +7AE0 +CA20 +4A40 +4B40 +7C80 +4940 +1620 +ENDCHAR +STARTCHAR U_7811 +ENCODING 30737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2140 +2240 +7FE0 +C840 +48C0 +4940 +7A40 +4540 +0880 +ENDCHAR +STARTCHAR U_7812 +ENCODING 30738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2480 +24A0 +77C0 +D480 +5480 +5480 +75A0 +5620 +0460 +ENDCHAR +STARTCHAR U_7813 +ENCODING 30739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +2260 +7C00 +CBE0 +4A40 +4940 +7880 +4940 +0620 +ENDCHAR +STARTCHAR U_7814 +ENCODING 30740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2240 +2240 +4240 +FFE0 +4A40 +4A40 +4A40 +7A40 +4C40 +0840 +ENDCHAR +STARTCHAR U_7815 +ENCODING 30741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2240 +4240 +7A40 +CD60 +4900 +4FE0 +7900 +4900 +0100 +ENDCHAR +STARTCHAR U_7816 +ENCODING 30742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4FE0 +7200 +D200 +57C0 +5040 +7280 +0100 +0080 +ENDCHAR +STARTCHAR U_7817 +ENCODING 30743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +2200 +7A80 +CBE0 +4880 +4FE0 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7818 +ENCODING 30744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2080 +22A0 +7AA0 +CAA0 +4BE0 +4880 +78A0 +48A0 +0060 +ENDCHAR +STARTCHAR U_7819 +ENCODING 30745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +2200 +4380 +7280 +D280 +5580 +5480 +7480 +55A0 +0660 +ENDCHAR +STARTCHAR U_781A +ENCODING 30746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +2540 +2540 +7D40 +CD40 +4D40 +4900 +79A0 +4AA0 +0C60 +ENDCHAR +STARTCHAR U_781B +ENCODING 30747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7920 +C900 +4FC0 +4840 +7880 +4900 +0200 +ENDCHAR +STARTCHAR U_781C +ENCODING 30748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +26C0 +7540 +5540 +D540 +56C0 +5440 +7440 +4860 +1020 +ENDCHAR +STARTCHAR U_781D +ENCODING 30749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +7900 +CFE0 +4900 +4900 +7A40 +4FA0 +0220 +ENDCHAR +STARTCHAR U_781E +ENCODING 30750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +77C0 +D100 +5380 +5540 +7920 +5100 +0100 +ENDCHAR +STARTCHAR U_781F +ENCODING 30751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2500 +79E0 +C900 +4900 +49E0 +7900 +4900 +0100 +ENDCHAR +STARTCHAR U_7820 +ENCODING 30752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +23C0 +7A40 +CA40 +4BC0 +4A40 +7A40 +4A40 +0FE0 +ENDCHAR +STARTCHAR U_7821 +ENCODING 30753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2100 +7FC0 +C900 +4900 +4940 +7920 +4900 +07E0 +ENDCHAR +STARTCHAR U_7822 +ENCODING 30754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2040 +2740 +7540 +D540 +5740 +5540 +7040 +5140 +0080 +ENDCHAR +STARTCHAR U_7823 +ENCODING 30755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2420 +7A00 +CA40 +4A80 +4B00 +7A20 +4A20 +01E0 +ENDCHAR +STARTCHAR U_7824 +ENCODING 30756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FC00 +27E0 +2900 +75C0 +D740 +5D40 +5500 +7520 +5420 +03E0 +ENDCHAR +STARTCHAR U_7825 +ENCODING 30757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +2480 +2480 +77E0 +D480 +5480 +5480 +74A0 +5760 +04A0 +ENDCHAR +STARTCHAR U_7826 +ENCODING 30758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1260 +5F80 +5220 +FBE0 +0000 +FFE0 +1000 +3FC0 +5040 +9FC0 +1040 +ENDCHAR +STARTCHAR U_7827 +ENCODING 30759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +20E0 +2080 +7880 +CBE0 +4A20 +4A20 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7828 +ENCODING 30760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2420 +77E0 +D400 +57C0 +5480 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7829 +ENCODING 30761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +42A0 +4FE0 +7A80 +DFE0 +52A0 +52A0 +72E0 +5480 +0880 +ENDCHAR +STARTCHAR U_782A +ENCODING 30762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2540 +24C0 +4440 +7FE0 +D540 +54C0 +5440 +77E0 +5040 +0180 +ENDCHAR +STARTCHAR U_782B +ENCODING 30763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2080 +7880 +C880 +4BE0 +4880 +7880 +4880 +07E0 +ENDCHAR +STARTCHAR U_782C +ENCODING 30764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2000 +7C40 +CC40 +4A80 +4A80 +7A80 +4900 +07E0 +ENDCHAR +STARTCHAR U_782D +ENCODING 30765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +2100 +2080 +7FE0 +C840 +4880 +4900 +7A00 +4D00 +08E0 +ENDCHAR +STARTCHAR U_782E +ENCODING 30766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD40 +4880 +3140 +4A20 +FFE0 +0800 +1FC0 +7040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_782F +ENCODING 30767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA80 +20A0 +27C0 +7280 +D280 +52C0 +52A0 +74A0 +5AA0 +0100 +ENDCHAR +STARTCHAR U_7830 +ENCODING 30768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +24A0 +7AA0 +4AC0 +C880 +4FE0 +4880 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7831 +ENCODING 30769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD80 +2180 +2240 +7D20 +C880 +4FE0 +4840 +4A80 +7900 +4880 +0040 +ENDCHAR +STARTCHAR U_7832 +ENCODING 30770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2420 +2820 +77A0 +D4A0 +57A0 +5440 +7420 +5420 +03E0 +ENDCHAR +STARTCHAR U_7833 +ENCODING 30771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +2100 +4100 +F9E0 +4B20 +4D20 +4920 +7920 +49E0 +0120 +ENDCHAR +STARTCHAR U_7834 +ENCODING 30772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +24A0 +7480 +D7E0 +5520 +5540 +7480 +0940 +1620 +ENDCHAR +STARTCHAR U_7835 +ENCODING 30773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +27E0 +2100 +7380 +5540 +D920 +5100 +77C0 +5100 +0100 +ENDCHAR +STARTCHAR U_7836 +ENCODING 30774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FD00 +23E0 +2220 +7A20 +4BE0 +CA20 +4A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_7837 +ENCODING 30775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +23E0 +22A0 +7BE0 +4AA0 +CAA0 +4BE0 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7838 +ENCODING 30776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2480 +2480 +77E0 +D6A0 +56A0 +56A0 +56E0 +7480 +4480 +07E0 +ENDCHAR +STARTCHAR U_7839 +ENCODING 30777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +4000 +7440 +D240 +5240 +5280 +7180 +5240 +0C20 +ENDCHAR +STARTCHAR U_783A +ENCODING 30778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC00 +2400 +47E0 +7500 +D5E0 +5520 +5520 +7520 +5AA0 +0440 +ENDCHAR +STARTCHAR U_783B +ENCODING 30779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0A80 +1320 +6DE0 +0000 +7FE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_783C +ENCODING 30780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2280 +2440 +7820 +D7C0 +5100 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_783D +ENCODING 30781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2520 +4520 +77E0 +D520 +5520 +57E0 +7520 +4920 +1060 +ENDCHAR +STARTCHAR U_783E +ENCODING 30782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +2780 +2400 +4480 +7480 +DFE0 +5080 +52C0 +74A0 +58A0 +11A0 +ENDCHAR +STARTCHAR U_783F +ENCODING 30783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +47E0 +4400 +7480 +D480 +5500 +7540 +5A20 +0BE0 +1020 +ENDCHAR +STARTCHAR U_7840 +ENCODING 30784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +22A0 +22A0 +7BE0 +C880 +4AA0 +4AA0 +7AA0 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7841 +ENCODING 30785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7C0 +2080 +4100 +7280 +DC60 +57C0 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7842 +ENCODING 30786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F980 +2240 +2420 +7BE0 +4900 +C900 +4BC0 +4900 +7900 +4FE0 +ENDCHAR +STARTCHAR U_7843 +ENCODING 30787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FD00 +27C0 +2900 +7100 +DFE0 +5100 +5380 +7540 +5920 +1120 +ENDCHAR +STARTCHAR U_7844 +ENCODING 30788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +2540 +4340 +7FE0 +4A80 +CA80 +4A80 +7AA0 +44A0 +0860 +ENDCHAR +STARTCHAR U_7845 +ENCODING 30789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4100 +7FE0 +D100 +5100 +57C0 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7846 +ENCODING 30790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2140 +2220 +45C0 +7800 +CBE0 +4A20 +4A20 +7BE0 +4220 +ENDCHAR +STARTCHAR U_7847 +ENCODING 30791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +2660 +75A0 +D4A0 +5560 +5620 +7420 +57E0 +0420 +ENDCHAR +STARTCHAR U_7848 +ENCODING 30792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +2080 +7BE0 +C800 +4BE0 +4A20 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7849 +ENCODING 30793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2140 +27E0 +7140 +D7C0 +5100 +57C0 +7100 +5FE0 +0100 +ENDCHAR +STARTCHAR U_784A +ENCODING 30794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +27E0 +7C00 +D5C0 +5540 +55C0 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_784B +ENCODING 30795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2220 +7B40 +4880 +C920 +4A40 +7880 +4940 +0620 +ENDCHAR +STARTCHAR U_784C +ENCODING 30796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2640 +2980 +7240 +D420 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_784D +ENCODING 30797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D540 +5520 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_784E +ENCODING 30798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F20 +FA20 +2AA0 +2AA0 +7FA0 +DAA0 +5AA0 +5AA0 +7A20 +5A20 +1260 +ENDCHAR +STARTCHAR U_784F +ENCODING 30799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +2440 +2440 +4440 +7EE0 +D440 +5440 +5440 +7840 +4840 +1040 +ENDCHAR +STARTCHAR U_7850 +ENCODING 30800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4BA0 +4820 +EBA0 +AAA0 +ABA0 +AAA0 +E820 +A820 +0860 +ENDCHAR +STARTCHAR U_7851 +ENCODING 30801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FA40 +27E0 +4240 +7A40 +CFE0 +4A40 +4A40 +7C40 +4440 +0840 +ENDCHAR +STARTCHAR U_7852 +ENCODING 30802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +4280 +4FE0 +EAA0 +AAA0 +AAA0 +ACE0 +E820 +AFE0 +0820 +ENDCHAR +STARTCHAR U_7853 +ENCODING 30803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBA0 +2120 +2140 +7FE0 +4900 +CA40 +4EC0 +4B00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_7854 +ENCODING 30804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +4FE0 +7A80 +CA80 +4FE0 +4800 +7A80 +4460 +0820 +ENDCHAR +STARTCHAR U_7855 +ENCODING 30805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +23E0 +2220 +7AA0 +CAA0 +4AA0 +4AA0 +7AA0 +4940 +0620 +ENDCHAR +STARTCHAR U_7856 +ENCODING 30806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2920 +7540 +D100 +5FE0 +5100 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7857 +ENCODING 30807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0260 +FF80 +22A0 +2120 +72E0 +D000 +5FC0 +5280 +72A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_7858 +ENCODING 30808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2820 +2820 +4BA0 +FAA0 +5AA0 +5BA0 +5820 +7820 +4FE0 +0820 +ENDCHAR +STARTCHAR U_7859 +ENCODING 30809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +22A0 +23E0 +7800 +4BE0 +C820 +4BE0 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_785A +ENCODING 30810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +2100 +47E0 +7280 +D440 +5AA0 +5280 +7280 +5480 +0880 +ENDCHAR +STARTCHAR U_785B +ENCODING 30811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +2FE0 +2280 +7280 +D6C0 +5AA0 +52A0 +7280 +5480 +0980 +ENDCHAR +STARTCHAR U_785C +ENCODING 30812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F000 +22A0 +2540 +7540 +D2A0 +5000 +57C0 +7100 +5100 +07E0 +ENDCHAR +STARTCHAR U_785D +ENCODING 30813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F4A0 +22C0 +2080 +77E0 +D420 +57E0 +5420 +77E0 +5420 +04E0 +ENDCHAR +STARTCHAR U_785E +ENCODING 30814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +23E0 +2480 +77E0 +D000 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_785F +ENCODING 30815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C60 +F7C0 +2540 +2560 +7D40 +5540 +D540 +57E0 +7400 +4B00 +10E0 +ENDCHAR +STARTCHAR U_7860 +ENCODING 30816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +27C0 +2440 +77C0 +D440 +57E0 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_7861 +ENCODING 30817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4920 +4100 +7FE0 +5200 +D280 +5500 +5A40 +77E0 +5220 +ENDCHAR +STARTCHAR U_7862 +ENCODING 30818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +2FE0 +7100 +DFE0 +5100 +5540 +7520 +5920 +0300 +ENDCHAR +STARTCHAR U_7863 +ENCODING 30819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2140 +27E0 +7900 +CBC0 +4C80 +4BE0 +7880 +4880 +0180 +ENDCHAR +STARTCHAR U_7864 +ENCODING 30820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2540 +7540 +DBA0 +5120 +5100 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7865 +ENCODING 30821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +2FE0 +2440 +7680 +D740 +56A0 +5740 +5AA0 +7B20 +15E0 +ENDCHAR +STARTCHAR U_7866 +ENCODING 30822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +27C0 +2100 +7FE0 +CA40 +4A40 +4FE0 +7A40 +4440 +0840 +ENDCHAR +STARTCHAR U_7867 +ENCODING 30823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +23E0 +42A0 +7BE0 +CAA0 +4BE0 +4AA0 +7AA0 +4AA0 +0240 +ENDCHAR +STARTCHAR U_7868 +ENCODING 30824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7540 +D7C0 +5540 +57C0 +7100 +5FE0 +0100 +ENDCHAR +STARTCHAR U_7869 +ENCODING 30825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +37E0 +E480 +2880 +FFE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_786A +ENCODING 30826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FEC0 +22A0 +2FE0 +7280 +D2A0 +53A0 +5EC0 +72A0 +5360 +0620 +ENDCHAR +STARTCHAR U_786B +ENCODING 30827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27C0 +7020 +D540 +5540 +5540 +7540 +5940 +1060 +ENDCHAR +STARTCHAR U_786C +ENCODING 30828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +27E0 +2520 +77E0 +D520 +57E0 +5900 +7500 +5300 +0CE0 +ENDCHAR +STARTCHAR U_786D +ENCODING 30829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +27E0 +2240 +7080 +D7E0 +5200 +5200 +7200 +5200 +03E0 +ENDCHAR +STARTCHAR U_786E +ENCODING 30830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +4FE0 +F520 +57E0 +5520 +57E0 +7520 +4520 +0860 +ENDCHAR +STARTCHAR U_786F +ENCODING 30831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +2440 +27C0 +7440 +D7C0 +5440 +57C0 +72A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_7870 +ENCODING 30832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +A920 +5140 +CF80 +4000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7871 +ENCODING 30833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +2520 +27E0 +7520 +D5A0 +5760 +5520 +7520 +57E0 +0420 +ENDCHAR +STARTCHAR U_7872 +ENCODING 30834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +2440 +2920 +4280 +7A40 +CC20 +4BC0 +4A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_7873 +ENCODING 30835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4FE0 +7280 +D6C0 +5AA0 +72A0 +5480 +0A80 +1100 +ENDCHAR +STARTCHAR U_7874 +ENCODING 30836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +2100 +7A80 +CEA0 +4AC0 +4B80 +7AA0 +4AA0 +02E0 +ENDCHAR +STARTCHAR U_7875 +ENCODING 30837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F8E0 +2080 +23E0 +7A20 +4B60 +CAA0 +4B60 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7876 +ENCODING 30838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +27E0 +2100 +7280 +5440 +D920 +57C0 +5040 +7080 +5100 +ENDCHAR +STARTCHAR U_7877 +ENCODING 30839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7BA0 +D000 +5A40 +5540 +7440 +5080 +0FE0 +ENDCHAR +STARTCHAR U_7878 +ENCODING 30840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +23E0 +2000 +77E0 +D400 +55C0 +5480 +77E0 +4880 +1080 +ENDCHAR +STARTCHAR U_7879 +ENCODING 30841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E940 +4940 +5F40 +EA20 +AEA0 +B880 +A880 +A900 +E940 +A920 +0BE0 +ENDCHAR +STARTCHAR U_787A +ENCODING 30842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +2220 +4540 +7D80 +D2C0 +55A0 +52A0 +7580 +4880 +0300 +ENDCHAR +STARTCHAR U_787B +ENCODING 30843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +F940 +A8C0 +F940 +A220 +FFE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_787C +ENCODING 30844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +4AA0 +4AA0 +EEE0 +AAA0 +AAA0 +AEE0 +AAA0 +EAA0 +B2A0 +2760 +ENDCHAR +STARTCHAR U_787D +ENCODING 30845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +2520 +7FC0 +5540 +D7C0 +5540 +77C0 +5120 +01E0 +ENDCHAR +STARTCHAR U_787E +ENCODING 30846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2540 +7540 +DFE0 +5540 +5540 +7FE0 +5100 +07C0 +ENDCHAR +STARTCHAR U_787F +ENCODING 30847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2280 +7440 +D000 +57C0 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7880 +ENCODING 30848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2480 +2100 +77C0 +D140 +5FE0 +5140 +77C0 +4100 +0300 +ENDCHAR +STARTCHAR U_7881 +ENCODING 30849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +1E80 +1780 +1080 +FFE0 +5040 +BFA0 +5080 +1F80 +ENDCHAR +STARTCHAR U_7882 +ENCODING 30850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2820 +27C0 +7800 +CFE0 +4900 +4B40 +7D20 +4920 +0300 +ENDCHAR +STARTCHAR U_7883 +ENCODING 30851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7100 +DFE0 +5440 +57C0 +7440 +57C0 +04C0 +ENDCHAR +STARTCHAR U_7884 +ENCODING 30852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2FE0 +2480 +76C0 +DDA0 +56A0 +54A0 +7480 +5480 +0480 +ENDCHAR +STARTCHAR U_7885 +ENCODING 30853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E8A0 +4B20 +4920 +EFE0 +A920 +ABA0 +AD60 +E920 +AFE0 +0820 +ENDCHAR +STARTCHAR U_7886 +ENCODING 30854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +2920 +CFC0 +4B00 +5480 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7887 +ENCODING 30855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2420 +2000 +77E0 +D080 +5480 +54E0 +7480 +5A80 +11E0 +ENDCHAR +STARTCHAR U_7888 +ENCODING 30856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA80 +23E0 +6280 +7B60 +CA20 +4BE0 +4A20 +7BE0 +4A20 +03E0 +ENDCHAR +STARTCHAR U_7889 +ENCODING 30857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +4BA0 +4920 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +B020 +2060 +ENDCHAR +STARTCHAR U_788A +ENCODING 30858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2280 +4120 +7AA0 +CCC0 +4FE0 +4A80 +7900 +4AA0 +0460 +ENDCHAR +STARTCHAR U_788B +ENCODING 30859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +27C0 +4000 +7FE0 +D040 +5740 +5540 +7740 +5040 +00C0 +ENDCHAR +STARTCHAR U_788C +ENCODING 30860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +27C0 +2040 +7FE0 +D920 +5540 +5380 +7540 +5920 +0300 +ENDCHAR +STARTCHAR U_788D +ENCODING 30861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D000 +57E0 +5080 +7FE0 +5480 +0380 +ENDCHAR +STARTCHAR U_788E +ENCODING 30862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +2440 +7AA0 +D120 +5100 +5FE0 +7100 +5100 +0100 +ENDCHAR +STARTCHAR U_788F +ENCODING 30863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +27E0 +7800 +CBE0 +4A20 +4BE0 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7890 +ENCODING 30864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2200 +4FE0 +7480 +DA40 +57E0 +5480 +7300 +44E0 +1840 +ENDCHAR +STARTCHAR U_7891 +ENCODING 30865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2520 +27E0 +7520 +D7E0 +5280 +5FE0 +7080 +5080 +0080 +ENDCHAR +STARTCHAR U_7892 +ENCODING 30866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7BA0 +5100 +DFC0 +5100 +5540 +7380 +4FE0 +ENDCHAR +STARTCHAR U_7893 +ENCODING 30867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +27E0 +2C80 +77E0 +D480 +5480 +57E0 +7480 +5480 +07E0 +ENDCHAR +STARTCHAR U_7894 +ENCODING 30868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +EEC0 +40A0 +5FE0 +E280 +AA80 +AB80 +AA80 +EAA0 +AF60 +1820 +ENDCHAR +STARTCHAR U_7895 +ENCODING 30869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2440 +7FE0 +D040 +5740 +5540 +7740 +5040 +01C0 +ENDCHAR +STARTCHAR U_7896 +ENCODING 30870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +F440 +4BA0 +4000 +EFE0 +AAA0 +AAA0 +AFE0 +EAA0 +AAA0 +0860 +ENDCHAR +STARTCHAR U_7897 +ENCODING 30871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A20 +27C0 +7540 +D540 +5340 +53C0 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7898 +ENCODING 30872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +2FE0 +2AA0 +7FE0 +DAA0 +5AA0 +5FE0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7899 +ENCODING 30873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F6A0 +2520 +27E0 +7520 +D560 +5560 +5560 +77E0 +5420 +0460 +ENDCHAR +STARTCHAR U_789A +ENCODING 30874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +2180 +77E0 +D000 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_789B +ENCODING 30875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7100 +DFE0 +5440 +5540 +7540 +5280 +0C60 +ENDCHAR +STARTCHAR U_789C +ENCODING 30876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +27A0 +2100 +7FE0 +D540 +5AA0 +5520 +7240 +5180 +0600 +ENDCHAR +STARTCHAR U_789D +ENCODING 30877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +4100 +4FE0 +8AA0 +EAA0 +AAA0 +AAA0 +A100 +EFE0 +8280 +0C60 +ENDCHAR +STARTCHAR U_789E +ENCODING 30878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +0000 +7BC0 +4A40 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_789F +ENCODING 30879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +25C0 +7400 +D7E0 +5100 +5FE0 +7580 +5940 +1120 +ENDCHAR +STARTCHAR U_78A0 +ENCODING 30880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +27C0 +7000 +DFE0 +5820 +57C0 +7100 +5500 +0200 +ENDCHAR +STARTCHAR U_78A1 +ENCODING 30881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7540 +D540 +5FE0 +5540 +77E0 +5040 +0180 +ENDCHAR +STARTCHAR U_78A2 +ENCODING 30882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +4740 +4540 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +A820 +0860 +ENDCHAR +STARTCHAR U_78A3 +ENCODING 30883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D200 +57E0 +5D20 +76A0 +57A0 +00C0 +ENDCHAR +STARTCHAR U_78A4 +ENCODING 30884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +2100 +77C0 +D540 +5540 +5FE0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_78A5 +ENCODING 30885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +4FE0 +E800 +AFE0 +AAA0 +AFE0 +EAA0 +BAA0 +0860 +ENDCHAR +STARTCHAR U_78A6 +ENCODING 30886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +4A20 +47C0 +7A40 +5180 +D640 +5820 +77C0 +5440 +07C0 +ENDCHAR +STARTCHAR U_78A7 +ENCODING 30887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +74A0 +2520 +FFE0 +0000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78A8 +ENCODING 30888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +27E0 +2520 +77E0 +D000 +5FE0 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_78A9 +ENCODING 30889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +23E0 +2220 +7BE0 +CA20 +4BE0 +4A20 +7BE0 +4940 +0620 +ENDCHAR +STARTCHAR U_78AA +ENCODING 30890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +23C0 +7240 +D3C0 +5240 +5FE0 +7540 +5620 +07E0 +ENDCHAR +STARTCHAR U_78AB +ENCODING 30891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06E0 +F4A0 +24A0 +2720 +7400 +D7E0 +54A0 +55A0 +7E40 +54A0 +0520 +ENDCHAR +STARTCHAR U_78AC +ENCODING 30892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +2520 +27E0 +7400 +D7E0 +54A0 +54A0 +7740 +54A0 +0520 +ENDCHAR +STARTCHAR U_78AD +ENCODING 30893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +7FE0 +D400 +57E0 +5AA0 +74A0 +5920 +0240 +ENDCHAR +STARTCHAR U_78AE +ENCODING 30894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +47C0 +4440 +F7C0 +5000 +5FE0 +5100 +75C0 +5700 +09E0 +ENDCHAR +STARTCHAR U_78AF +ENCODING 30895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +22A0 +43E0 +7A20 +CB60 +4AA0 +4B60 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_78B0 +ENCODING 30896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2280 +7AA0 +DAA0 +56C0 +56C0 +7280 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78B1 +ENCODING 30897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F0A0 +4FE0 +4880 +EF80 +A880 +AEA0 +AAA0 +EEC0 +A960 +1220 +ENDCHAR +STARTCHAR U_78B2 +ENCODING 30898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7920 +D7C0 +5540 +5540 +7540 +55C0 +0100 +ENDCHAR +STARTCHAR U_78B3 +ENCODING 30899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +2FE0 +4200 +7FE0 +D280 +52A0 +52C0 +5580 +7880 +0140 +0620 +ENDCHAR +STARTCHAR U_78B4 +ENCODING 30900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +2920 +77C0 +D440 +57C0 +5440 +77C0 +5000 +0FE0 +ENDCHAR +STARTCHAR U_78B5 +ENCODING 30901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F9E0 +2100 +47C0 +7440 +D7C0 +5440 +57C0 +7440 +57C0 +0820 +ENDCHAR +STARTCHAR U_78B6 +ENCODING 30902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +44A0 +4EA0 +74A0 +DFA0 +5500 +5FE0 +7100 +46C0 +0820 +ENDCHAR +STARTCHAR U_78B7 +ENCODING 30903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +4FE0 +4880 +EBE0 +AA20 +ABE0 +AA20 +EBE0 +9220 +23E0 +ENDCHAR +STARTCHAR U_78B8 +ENCODING 30904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFC0 +5040 +5F40 +F440 +BF40 +B540 +BF40 +F440 +9F40 +2020 +ENDCHAR +STARTCHAR U_78B9 +ENCODING 30905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2000 +7FE0 +D440 +57C0 +5440 +77C0 +5000 +0FE0 +ENDCHAR +STARTCHAR U_78BA +ENCODING 30906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A20 +2280 +77E0 +D480 +5FE0 +5480 +77E0 +5480 +07E0 +ENDCHAR +STARTCHAR U_78BB +ENCODING 30907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2240 +23C0 +7800 +CFE0 +4820 +4BA0 +7AA0 +4BA0 +0860 +ENDCHAR +STARTCHAR U_78BC +ENCODING 30908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD00 +27C0 +2500 +77C0 +D500 +57E0 +5020 +7560 +5AA0 +0AE0 +ENDCHAR +STARTCHAR U_78BD +ENCODING 30909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +4000 +F7C0 +5440 +57C0 +7440 +57C0 +0280 +0440 +ENDCHAR +STARTCHAR U_78BE +ENCODING 30910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2540 +77E0 +D540 +57E0 +5540 +7560 +55A0 +0920 +ENDCHAR +STARTCHAR U_78BF +ENCODING 30911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4FE0 +4880 +EAA0 +ABE0 +AA20 +ABE0 +EA20 +8BE0 +1220 +ENDCHAR +STARTCHAR U_78C0 +ENCODING 30912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +2BE0 +4480 +72A0 +DEA0 +57E0 +5480 +7500 +4600 +09E0 +ENDCHAR +STARTCHAR U_78C1 +ENCODING 30913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2480 +74A0 +DB20 +5FC0 +5240 +7480 +5B40 +1DA0 +ENDCHAR +STARTCHAR U_78C2 +ENCODING 30914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FDE0 +48A0 +4EA0 +7940 +D7C0 +5540 +57C0 +5540 +77C0 +0440 +ENDCHAR +STARTCHAR U_78C3 +ENCODING 30915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F4E0 +2480 +27E0 +74A0 +D7C0 +54A0 +55E0 +7540 +5540 +0A60 +ENDCHAR +STARTCHAR U_78C4 +ENCODING 30916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +27C0 +2540 +77E0 +D540 +57C0 +5500 +77C0 +4A40 +13C0 +ENDCHAR +STARTCHAR U_78C5 +ENCODING 30917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7920 +DFE0 +5200 +53E0 +7220 +5420 +08C0 +ENDCHAR +STARTCHAR U_78C6 +ENCODING 30918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +4740 +4540 +77E0 +D820 +57C0 +5440 +77C0 +5440 +0440 +ENDCHAR +STARTCHAR U_78C7 +ENCODING 30919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2540 +26C0 +7540 +57C0 +D480 +56A0 +74C0 +56A0 +0440 +ENDCHAR +STARTCHAR U_78C8 +ENCODING 30920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2520 +27E0 +7520 +D7E0 +5140 +51A0 +73E0 +5520 +08E0 +ENDCHAR +STARTCHAR U_78C9 +ENCODING 30921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +2140 +2280 +77E0 +D540 +52A0 +5500 +7FE0 +5540 +0920 +ENDCHAR +STARTCHAR U_78CA +ENCODING 30922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0000 +FBE0 +4100 +FBE0 +4920 +79E0 +ENDCHAR +STARTCHAR U_78CB +ENCODING 30923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2100 +73E0 +D100 +57E0 +5200 +77E0 +5880 +07E0 +ENDCHAR +STARTCHAR U_78CC +ENCODING 30924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7440 +D740 +55C0 +5440 +7FE0 +5280 +0C60 +ENDCHAR +STARTCHAR U_78CD +ENCODING 30925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2920 +27C0 +7100 +D7C0 +5100 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_78CE +ENCODING 30926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +FA20 +2540 +2280 +7740 +D220 +5FE0 +5100 +7FE0 +5280 +0C60 +ENDCHAR +STARTCHAR U_78CF +ENCODING 30927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2500 +2FC0 +7540 +DFE0 +5540 +5FC0 +7580 +5D40 +0520 +ENDCHAR +STARTCHAR U_78D0 +ENCODING 30928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D60 +57C0 +FD40 +5480 +4540 +7FE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78D1 +ENCODING 30929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F520 +27E0 +2000 +7FE0 +D000 +57C0 +5440 +77C0 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78D2 +ENCODING 30930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +07C0 +F440 +27C0 +4000 +77C0 +D440 +57C0 +5440 +77C0 +4280 +0440 +ENDCHAR +STARTCHAR U_78D3 +ENCODING 30931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F9E0 +2520 +21E0 +7D00 +D5E0 +5520 +55E0 +7520 +4600 +09E0 +ENDCHAR +STARTCHAR U_78D4 +ENCODING 30932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2940 +2540 +73E0 +D440 +5900 +5FE0 +7380 +5540 +0920 +ENDCHAR +STARTCHAR U_78D5 +ENCODING 30933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2FE0 +7240 +D7E0 +5020 +57C0 +7540 +5540 +0FE0 +ENDCHAR +STARTCHAR U_78D6 +ENCODING 30934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2660 +2AA0 +7120 +D7C0 +5440 +57C0 +7440 +47C0 +0440 +ENDCHAR +STARTCHAR U_78D7 +ENCODING 30935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFC0 +2100 +27C0 +7540 +D7C0 +5540 +7080 +5FE0 +0480 +0180 +ENDCHAR +STARTCHAR U_78D8 +ENCODING 30936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +44A0 +4240 +7400 +D7C0 +5900 +5FE0 +7100 +5540 +07C0 +ENDCHAR +STARTCHAR U_78D9 +ENCODING 30937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2280 +2540 +7220 +D7E0 +5280 +52A0 +7640 +5AA0 +0320 +ENDCHAR +STARTCHAR U_78DA +ENCODING 30938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27C0 +7540 +D7E0 +5040 +5FE0 +7440 +5240 +00C0 +ENDCHAR +STARTCHAR U_78DB +ENCODING 30939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +7DE0 +5540 +FD40 +1240 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78DC +ENCODING 30940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E6E0 +49A0 +5640 +74A0 +DBC0 +5000 +5FE0 +7540 +4920 +0200 +ENDCHAR +STARTCHAR U_78DD +ENCODING 30941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +44E0 +5F20 +E9A0 +BEA0 +A8A0 +AEA0 +EA40 +B2A0 +2520 +ENDCHAR +STARTCHAR U_78DE +ENCODING 30942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +4000 +4EE0 +EAA0 +AEE0 +AAA0 +AEE0 +EAA0 +AAA0 +1760 +ENDCHAR +STARTCHAR U_78DF +ENCODING 30943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F5A0 +2360 +25A0 +7140 +DEA0 +5340 +5080 +7320 +5040 +0780 +ENDCHAR +STARTCHAR U_78E0 +ENCODING 30944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F1E0 +2100 +27E0 +7520 +D660 +54A0 +5760 +75A0 +5660 +07E0 +ENDCHAR +STARTCHAR U_78E1 +ENCODING 30945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FF80 +4A80 +4FE0 +EAA0 +AEA0 +AAA0 +BFA0 +B2A0 +F5A0 +1F60 +ENDCHAR +STARTCHAR U_78E2 +ENCODING 30946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2BA0 +7540 +DBA0 +5540 +5BA0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_78E3 +ENCODING 30947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F3C0 +2440 +2AA0 +7FE0 +D280 +5D60 +5280 +7520 +5240 +0F80 +ENDCHAR +STARTCHAR U_78E4 +ENCODING 30948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FEE0 +4AA0 +4FA0 +EA00 +AEE0 +A8A0 +AEA0 +EA40 +9240 +24A0 +ENDCHAR +STARTCHAR U_78E5 +ENCODING 30949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +27E0 +2520 +77E0 +D240 +5580 +5220 +7FE0 +5540 +1920 +ENDCHAR +STARTCHAR U_78E6 +ENCODING 30950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +4FE0 +4AA0 +7FE0 +D000 +57C0 +5000 +7FE0 +4540 +0920 +ENDCHAR +STARTCHAR U_78E7 +ENCODING 30951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7440 +D7C0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_78E8 +ENCODING 30952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4400 +5FC0 +6840 +8FC0 +ENDCHAR +STARTCHAR U_78E9 +ENCODING 30953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +FFE0 +2480 +2780 +74A0 +DFA0 +54A0 +56C0 +7CA0 +5560 +0E20 +ENDCHAR +STARTCHAR U_78EA +ENCODING 30954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +FCA0 +27E0 +2480 +7FE0 +D480 +57C0 +5480 +77C0 +5480 +07E0 +ENDCHAR +STARTCHAR U_78EB +ENCODING 30955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E940 +5140 +46A0 +EC00 +B880 +AAC0 +AA80 +EA80 +8B80 +0CE0 +ENDCHAR +STARTCHAR U_78EC +ENCODING 30956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1260 +7DC0 +5540 +7C80 +4140 +BFE0 +1000 +3FC0 +5040 +1FC0 +ENDCHAR +STARTCHAR U_78ED +ENCODING 30957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC00 +27E0 +2540 +7520 +D7E0 +5620 +57E0 +7620 +5BE0 +0260 +ENDCHAR +STARTCHAR U_78EE +ENCODING 30958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +EFE0 +4380 +4440 +EBA0 +A000 +AFE0 +AAA0 +EFE0 +8AA0 +0820 +ENDCHAR +STARTCHAR U_78EF +ENCODING 30959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +F980 +2FE0 +2540 +7BE0 +DD40 +57E0 +5520 +76C0 +48A0 +1360 +ENDCHAR +STARTCHAR U_78F0 +ENCODING 30960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +4100 +47C0 +7100 +DFE0 +5280 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_78F1 +ENCODING 30961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F360 +26C0 +4240 +75A0 +D7E0 +5920 +57C0 +7240 +5240 +0480 +ENDCHAR +STARTCHAR U_78F2 +ENCODING 30962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F500 +29E0 +2720 +7DE0 +D500 +55E0 +5100 +7FE0 +5540 +0920 +ENDCHAR +STARTCHAR U_78F3 +ENCODING 30963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2AA0 +7FE0 +D000 +57C0 +5440 +77C0 +5440 +07C0 +ENDCHAR +STARTCHAR U_78F4 +ENCODING 30964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +F580 +22A0 +2240 +77A0 +D820 +57C0 +5440 +77C0 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78F5 +ENCODING 30965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +4AA0 +4EE0 +EAA0 +AEE0 +ABA0 +AAA0 +ABA0 +EAA0 +8BA0 +0840 +ENDCHAR +STARTCHAR U_78F6 +ENCODING 30966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FEE0 +2420 +46E0 +7420 +D7E0 +5200 +57E0 +7AA0 +5520 +0040 +ENDCHAR +STARTCHAR U_78F7 +ENCODING 30967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F340 +2FE0 +2340 +7520 +DA40 +57E0 +5940 +77E0 +5440 +0840 +ENDCHAR +STARTCHAR U_78F8 +ENCODING 30968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +4280 +4FE0 +EAA0 +AC60 +AFE0 +A100 +EFE0 +A280 +0C60 +ENDCHAR +STARTCHAR U_78F9 +ENCODING 30969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +2AA0 +7FE0 +D440 +57C0 +5440 +7FE0 +5100 +0100 +ENDCHAR +STARTCHAR U_78FA +ENCODING 30970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2FE0 +7000 +D7C0 +5540 +57C0 +7540 +57C0 +0C60 +ENDCHAR +STARTCHAR U_78FB +ENCODING 30971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F520 +2340 +2FE0 +7340 +D520 +5FE0 +5520 +77E0 +5520 +07E0 +ENDCHAR +STARTCHAR U_78FC +ENCODING 30972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F7E0 +2500 +2FC0 +7500 +D7E0 +5500 +5FE0 +7380 +5540 +0920 +ENDCHAR +STARTCHAR U_78FD +ENCODING 30973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2FE0 +7440 +D6E0 +5440 +5FE0 +7280 +54A0 +0860 +ENDCHAR +STARTCHAR U_78FE +ENCODING 30974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2EE0 +2540 +77C0 +D540 +57C0 +5100 +7FE0 +5100 +0100 +ENDCHAR +STARTCHAR U_78FF +ENCODING 30975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +58C0 +7BE0 +58C0 +75A0 +5280 +7FE0 +4800 +5FC0 +6840 +8FC0 +ENDCHAR +STARTCHAR U_7900 +ENCODING 30976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +4EE0 +4AA0 +EEE0 +ABA0 +AAA0 +ABA0 +EAA0 +8BA0 +0AA0 +ENDCHAR +STARTCHAR U_7901 +ENCODING 30977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F7E0 +2C80 +27E0 +7480 +D7E0 +5480 +57E0 +7540 +5AA0 +0AA0 +ENDCHAR +STARTCHAR U_7902 +ENCODING 30978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7440 +D7C0 +5280 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_7903 +ENCODING 30979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +4820 +47C0 +7440 +D7C0 +5100 +57C0 +7100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_7904 +ENCODING 30980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +F780 +2200 +2FE0 +7440 +DBA0 +5280 +5FE0 +7AA0 +5BA0 +0860 +ENDCHAR +STARTCHAR U_7905 +ENCODING 30981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +2AE0 +2EA0 +70A0 +DFA0 +52A0 +53A0 +7E40 +52A0 +0720 +ENDCHAR +STARTCHAR U_7906 +ENCODING 30982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +4440 +4BA0 +E000 +AEE0 +AAA0 +AEE0 +E440 +8AA0 +1120 +ENDCHAR +STARTCHAR U_7907 +ENCODING 30983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4560 +47A0 +F7E0 +55A0 +5560 +5100 +7FE0 +4280 +0C60 +ENDCHAR +STARTCHAR U_7908 +ENCODING 30984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +47E0 +5100 +EA80 +B960 +AAC0 +A940 +EAA0 +A900 +17E0 +ENDCHAR +STARTCHAR U_7909 +ENCODING 30985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FE80 +2AE0 +2EA0 +7AA0 +DFA0 +54A0 +57A0 +7540 +59A0 +1220 +ENDCHAR +STARTCHAR U_790A +ENCODING 30986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +5540 +7F60 +55C0 +7D40 +0080 +FFE0 +0F80 +3880 +0F80 +ENDCHAR +STARTCHAR U_790B +ENCODING 30987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +4FE0 +4100 +77C0 +D100 +5FE0 +5280 +77C0 +5100 +0100 +ENDCHAR +STARTCHAR U_790C +ENCODING 30988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +4100 +4FE0 +E920 +ABA0 +A540 +AFE0 +A920 +EFE0 +A920 +0FE0 +ENDCHAR +STARTCHAR U_790D +ENCODING 30989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +4280 +47C0 +7440 +D7C0 +5560 +54A0 +7D60 +47A0 +0040 +ENDCHAR +STARTCHAR U_790E +ENCODING 30990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +2EE0 +7540 +DFE0 +50A0 +5480 +74E0 +5A80 +11E0 +ENDCHAR +STARTCHAR U_790F +ENCODING 30991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAA0 +46C0 +4FE0 +7280 +D7C0 +5100 +7FE0 +4580 +4940 +0100 +ENDCHAR +STARTCHAR U_7910 +ENCODING 30992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +8020 +7FC0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7911 +ENCODING 30993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2AA0 +2380 +7000 +DFE0 +5920 +5FE0 +7920 +5FE0 +0820 +ENDCHAR +STARTCHAR U_7912 +ENCODING 30994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2100 +2FE0 +7780 +D2A0 +5FE0 +52A0 +7F40 +52A0 +0660 +ENDCHAR +STARTCHAR U_7913 +ENCODING 30995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F540 +27C0 +2540 +7FE0 +D000 +57C0 +5540 +77C0 +5540 +0FE0 +ENDCHAR +STARTCHAR U_7914 +ENCODING 30996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +FDE0 +2520 +27A0 +7440 +D7E0 +5540 +55E0 +7D40 +5740 +0040 +ENDCHAR +STARTCHAR U_7915 +ENCODING 30997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +4080 +BBE0 +A880 +7FE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7916 +ENCODING 30998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F760 +25A0 +4760 +75A0 +D6E0 +54A0 +57E0 +7240 +4420 +0820 +ENDCHAR +STARTCHAR U_7917 +ENCODING 30999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2FE0 +72A0 +D7C0 +5C40 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_7918 +ENCODING 31000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +47C0 +4440 +77C0 +DAA0 +5540 +5FE0 +5000 +7AA0 +0AA0 +ENDCHAR +STARTCHAR U_7919 +ENCODING 31001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +FCA0 +2940 +2FE0 +7060 +DE40 +5560 +5F40 +7540 +5B40 +04E0 +ENDCHAR +STARTCHAR U_791A +ENCODING 31002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4200 +4FC0 +E200 +A480 +AFC0 +A000 +EFE0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_791B +ENCODING 31003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +FAE0 +2F80 +2940 +7F20 +DA20 +5F80 +5000 +77C0 +5540 +0FE0 +ENDCHAR +STARTCHAR U_791C +ENCODING 31004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +7FC0 +4A40 +FFE0 +1100 +3F80 +D060 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_791D +ENCODING 31005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7280 +DFE0 +5100 +5FE0 +7AA0 +5AA0 +0860 +ENDCHAR +STARTCHAR U_791E +ENCODING 31006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +2FE0 +7820 +DFE0 +5A40 +5580 +7B80 +5540 +0B20 +ENDCHAR +STARTCHAR U_791F +ENCODING 31007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +EAA0 +4FA0 +4A40 +EFA0 +AA00 +AFA0 +AAA0 +F540 +2940 +02A0 +ENDCHAR +STARTCHAR U_7920 +ENCODING 31008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2440 +4880 +7EE0 +5440 +DEE0 +5000 +52A0 +7620 +49C0 +ENDCHAR +STARTCHAR U_7921 +ENCODING 31009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F2A0 +2FE0 +26A0 +7BE0 +D6A0 +53E0 +5440 +7FE0 +5540 +04C0 +ENDCHAR +STARTCHAR U_7922 +ENCODING 31010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +4100 +47E0 +7280 +D7C0 +5C60 +77C0 +5500 +44C0 +0660 +ENDCHAR +STARTCHAR U_7923 +ENCODING 31011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2280 +2FE0 +7AA0 +DFE0 +5520 +5540 +76A0 +54A0 +0B60 +ENDCHAR +STARTCHAR U_7924 +ENCODING 31012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2480 +26E0 +7AA0 +D440 +5BA0 +5000 +7FE0 +5540 +0B20 +ENDCHAR +STARTCHAR U_7925 +ENCODING 31013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FA0 +2940 +7AA0 +D7E0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_7926 +ENCODING 31014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2540 +27E0 +7540 +D7E0 +54A0 +57E0 +74A0 +5FE0 +0C20 +ENDCHAR +STARTCHAR U_7927 +ENCODING 31015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E540 +47C0 +8540 +E7C0 +A000 +AFE0 +AAA0 +AFE0 +EAA0 +0FE0 +ENDCHAR +STARTCHAR U_7928 +ENCODING 31016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_7929 +ENCODING 31017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F480 +27E0 +2540 +7940 +D7C0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_792A +ENCODING 31018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA80 +4FE0 +4A80 +EFC0 +A940 +AFC0 +A940 +EFE0 +A960 +17A0 +ENDCHAR +STARTCHAR U_792B +ENCODING 31019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +EBC0 +4EA0 +4BC0 +EAA0 +BFE0 +A100 +BFE0 +E580 +A940 +1120 +ENDCHAR +STARTCHAR U_792C +ENCODING 31020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +4A80 +E5C0 +4AA0 +FFE0 +2880 +D060 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_792D +ENCODING 31021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +4FE0 +4920 +EBA0 +A540 +AFE0 +B900 +EFE0 +A900 +0FE0 +ENDCHAR +STARTCHAR U_792E +ENCODING 31022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +EBE0 +4A00 +4FA0 +EAA0 +AF00 +AAA0 +AFA0 +E940 +9540 +03A0 +ENDCHAR +STARTCHAR U_792F +ENCODING 31023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FB60 +26C0 +2920 +7FE0 +DA20 +5780 +5240 +7FE0 +5940 +1320 +ENDCHAR +STARTCHAR U_7930 +ENCODING 31024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EA40 +4FE0 +4A40 +EBC0 +AE60 +AA40 +A880 +EAE0 +9280 +27E0 +ENDCHAR +STARTCHAR U_7931 +ENCODING 31025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5200 +FFC0 +8A00 +FBC0 +8A20 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7932 +ENCODING 31026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4A80 +4EE0 +E020 +AEE0 +AA80 +AEE0 +EA80 +AEA0 +0AE0 +ENDCHAR +STARTCHAR U_7933 +ENCODING 31027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4A40 +4FE0 +EA40 +AFE0 +A900 +ABC0 +EE40 +ABC0 +1240 +ENDCHAR +STARTCHAR U_7934 +ENCODING 31028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +4AA0 +47E0 +F2A0 +ABE0 +A6A0 +BFE0 +EA40 +A940 +0880 +ENDCHAR +STARTCHAR U_7935 +ENCODING 31029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7AA0 +DF60 +55E0 +5720 +7DE0 +5520 +05E0 +ENDCHAR +STARTCHAR U_7936 +ENCODING 31030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2AA0 +4EE0 +7480 +D7E0 +5C80 +57E0 +7480 +5480 +07E0 +ENDCHAR +STARTCHAR U_7937 +ENCODING 31031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +47C0 +7460 +D740 +5540 +55A0 +7FE0 +4AA0 +1FE0 +ENDCHAR +STARTCHAR U_7938 +ENCODING 31032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +5FE0 +4540 +FFE0 +AA60 +AFC0 +A840 +AFC0 +E840 +AFC0 +1860 +ENDCHAR +STARTCHAR U_7939 +ENCODING 31033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +5FE0 +5480 +FEE0 +AAA0 +AEA0 +AAC0 +EE40 +ABA0 +1EA0 +ENDCHAR +STARTCHAR U_793A +ENCODING 31034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +0000 +FFE0 +0400 +2480 +2440 +4420 +8420 +0C00 +ENDCHAR +STARTCHAR U_793B +ENCODING 31035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +F8 +08 +10 +30 +68 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR U_793C +ENCODING 31036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FA00 +0A00 +1200 +3200 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_793D +ENCODING 31037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +FA40 +0A80 +12E0 +3220 +6A20 +AA20 +2420 +2920 +30C0 +ENDCHAR +STARTCHAR U_793E +ENCODING 31038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +1100 +27C0 +3100 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_793F +ENCODING 31039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0C20 +1020 +3220 +6920 +A920 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_7940 +ENCODING 31040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +0A20 +13E0 +3220 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7941 +ENCODING 31041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +21E0 +F920 +0940 +1180 +3140 +6920 +A520 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_7942 +ENCODING 31042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +FAE0 +0BA0 +16A0 +32A0 +6AA0 +AA80 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7943 +ENCODING 31043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F240 +1240 +2240 +73E0 +A820 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_7944 +ENCODING 31044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +FA40 +0C20 +1240 +3240 +6A40 +AA40 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_7945 +ENCODING 31045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0900 +17E0 +3100 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7946 +ENCODING 31046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +0900 +17E0 +3100 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7947 +ENCODING 31047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +F480 +1480 +27E0 +2480 +7480 +AC80 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_7948 +ENCODING 31048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2380 +FA00 +0A00 +13E0 +3240 +6A40 +AA40 +2440 +2440 +2840 +ENDCHAR +STARTCHAR U_7949 +ENCODING 31049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F500 +1500 +25E0 +3500 +6D00 +A500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_794A +ENCODING 31050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +0900 +11E0 +3120 +6920 +AA20 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_794B +ENCODING 31051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +0C60 +1000 +37E0 +6A40 +A940 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_794C +ENCODING 31052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FBE0 +0AA0 +12A0 +32A0 +6BE0 +A880 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_794D +ENCODING 31053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +F100 +1100 +2100 +6FE0 +B100 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_794E +ENCODING 31054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +F200 +2FC0 +6200 +BFE0 +2220 +2220 +22A0 +2240 +2200 +ENDCHAR +STARTCHAR U_794F +ENCODING 31055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +0900 +1200 +37E0 +6A20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7950 +ENCODING 31056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0900 +1200 +33E0 +6E20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7951 +ENCODING 31057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2100 +37E0 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7952 +ENCODING 31058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +F920 +0920 +12A0 +3440 +6BE0 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7953 +ENCODING 31059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +0A00 +13C0 +3240 +6A40 +A540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_7954 +ENCODING 31060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +17E0 +2C40 +3640 +6D40 +A540 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_7955 +ENCODING 31061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +F8A0 +0A20 +1240 +3640 +6AA0 +AB20 +2200 +2620 +39E0 +ENDCHAR +STARTCHAR U_7956 +ENCODING 31062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +17C0 +FC40 +1440 +27C0 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7957 +ENCODING 31063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +FC80 +0C80 +17E0 +3480 +6C80 +ACA0 +25A0 +2760 +24A0 +ENDCHAR +STARTCHAR U_7958 +ENCODING 31064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0000 +FBE0 +1080 +5280 +5AC0 +56A0 +94A0 +90A0 +5280 +2100 +ENDCHAR +STARTCHAR U_7959 +ENCODING 31065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1100 +2FE0 +7100 +AB80 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_795A +ENCODING 31066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0D00 +1100 +31E0 +6900 +A9E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_795B +ENCODING 31067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0900 +1100 +37E0 +6900 +AA00 +2240 +2440 +27A0 +ENDCHAR +STARTCHAR U_795C +ENCODING 31068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +0880 +1080 +33E0 +6A20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_795D +ENCODING 31069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +0C40 +17C0 +3280 +6A80 +AA80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_795E +ENCODING 31070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +27E0 +34A0 +6CA0 +A7E0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_795F +ENCODING 31071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +3F80 +4440 +7FC0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7960 +ENCODING 31072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +F7A0 +1020 +27A0 +74A0 +ACA0 +27A0 +24A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_7961 +ENCODING 31073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +5A40 +53A0 +5220 +FBE0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7962 +ENCODING 31074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F3E0 +1520 +2940 +7100 +AD40 +2540 +2920 +2920 +2300 +ENDCHAR +STARTCHAR U_7963 +ENCODING 31075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +10C0 +2700 +7520 +AD40 +2480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_7964 +ENCODING 31076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +F220 +1AA0 +2660 +7220 +AA60 +26A0 +2B20 +2220 +2660 +ENDCHAR +STARTCHAR U_7965 +ENCODING 31077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_7966 +ENCODING 31078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2000 +77C0 +A100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7967 +ENCODING 31079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FAA0 +16C0 +2280 +76C0 +AAA0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7968 +ENCODING 31080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7969 +ENCODING 31081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2100 +7FE0 +A900 +2380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_796A +ENCODING 31082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +FFE0 +2800 +4BC0 +EA40 +5A40 +4AC0 +4A20 +5220 +61E0 +ENDCHAR +STARTCHAR U_796B +ENCODING 31083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +1820 +27C0 +7000 +AFC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_796C +ENCODING 31084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +17E0 +F900 +1240 +27E0 +7100 +A7C0 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_796D +ENCODING 31085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3E40 +4A80 +A900 +5080 +2F40 +4020 +BFC0 +1280 +2A40 +C420 +ENDCHAR +STARTCHAR U_796E +ENCODING 31086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +27C0 +7000 +AFC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_796F +ENCODING 31087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F900 +17E0 +2420 +7520 +AD20 +2520 +2520 +2280 +2C60 +ENDCHAR +STARTCHAR U_7970 +ENCODING 31088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2FE0 +7000 +AFE0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7971 +ENCODING 31089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2240 +FA80 +17C0 +2440 +77C0 +AA80 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7972 +ENCODING 31090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +F7C0 +1040 +27C0 +7000 +AFE0 +2AA0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7973 +ENCODING 31091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +FBC0 +1800 +2FE0 +3A80 +6AA0 +AA40 +2AC0 +3340 +2620 +ENDCHAR +STARTCHAR U_7974 +ENCODING 31092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +FFE0 +1080 +2A80 +7AA0 +AFA0 +2AC0 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_7975 +ENCODING 31093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F920 +2FE0 +6920 +BBA0 +2D60 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7976 +ENCODING 31094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F7C0 +1140 +27C0 +7500 +A7E0 +2320 +2520 +2540 +2900 +ENDCHAR +STARTCHAR U_7977 +ENCODING 31095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F100 +17C0 +2200 +77E0 +AC40 +27E0 +2940 +3040 +21C0 +ENDCHAR +STARTCHAR U_7978 +ENCODING 31096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2100 +7FE0 +A920 +2AA0 +2C60 +2820 +28E0 +ENDCHAR +STARTCHAR U_7979 +ENCODING 31097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FC20 +17A0 +2A20 +77A0 +AA20 +2AA0 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_797A +ENCODING 31098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F7E0 +1240 +23C0 +7240 +ABC0 +2240 +2FE0 +2240 +2420 +ENDCHAR +STARTCHAR U_797B +ENCODING 31099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F920 +1FE0 +2920 +7BA0 +AAA0 +2BA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_797C +ENCODING 31100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +1540 +27C0 +7100 +AFE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_797D +ENCODING 31101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F000 +1240 +2240 +75A0 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_797E +ENCODING 31102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +2FE0 +3440 +6A60 +B380 +2680 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_797F +ENCODING 31103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F7C0 +1080 +27E0 +7120 +AD40 +2380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_7980 +ENCODING 31104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5F40 +4040 +7FC0 +0000 +3FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7981 +ENCODING 31105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +71C0 +AAA0 +2080 +7FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7982 +ENCODING 31106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2520 +F7A0 +1520 +27E0 +7420 +AFA0 +26A0 +27A0 +2820 +3060 +ENDCHAR +STARTCHAR U_7983 +ENCODING 31107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7984 +ENCODING 31108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +F7C0 +1040 +2FE0 +7140 +AD80 +2340 +2520 +2920 +2300 +ENDCHAR +STARTCHAR U_7985 +ENCODING 31109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F7C0 +1540 +27C0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7986 +ENCODING 31110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +FFE0 +2920 +6FE0 +BA20 +2FE0 +2500 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7987 +ENCODING 31111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +F240 +2FE0 +3100 +67C0 +AC40 +37C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7988 +ENCODING 31112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +F100 +1FE0 +2540 +77C0 +AD40 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_7989 +ENCODING 31113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F280 +2FE0 +2AA0 +6EE0 +B820 +2FE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_798A +ENCODING 31114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +F4A0 +1EA0 +24A0 +6F60 +B500 +2FE0 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_798B +ENCODING 31115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +1AA0 +2AA0 +6FE0 +B100 +27C0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_798C +ENCODING 31116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +0220 +2440 +6AA0 +AEE0 +2240 +2480 +2920 +2FE0 +ENDCHAR +STARTCHAR U_798D +ENCODING 31117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F740 +1540 +2FE0 +2820 +7BA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_798E +ENCODING 31118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_798F +ENCODING 31119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +F440 +17C0 +2000 +3FE0 +6920 +AFE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_7990 +ENCODING 31120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +F540 +17E0 +2200 +6FE0 +B200 +27C0 +2A80 +3100 +2EE0 +ENDCHAR +STARTCHAR U_7991 +ENCODING 31121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +1540 +27C0 +7100 +AFE0 +2920 +2BA0 +28A0 +2840 +ENDCHAR +STARTCHAR U_7992 +ENCODING 31122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +F780 +1080 +2FE0 +7520 +AAC0 +2580 +22C0 +24A0 +2B20 +ENDCHAR +STARTCHAR U_7993 +ENCODING 31123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +2FE0 +6400 +B7E0 +2AA0 +22A0 +2D20 +22C0 +ENDCHAR +STARTCHAR U_7994 +ENCODING 31124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +27C0 +7000 +AFE0 +2100 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_7995 +ENCODING 31125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F140 +17E0 +2240 +73C0 +A880 +27E0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_7996 +ENCODING 31126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F440 +17C0 +2440 +77C0 +A900 +2FE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_7997 +ENCODING 31127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2540 +37C0 +6900 +A2C0 +2A20 +2A40 +31C0 +ENDCHAR +STARTCHAR U_7998 +ENCODING 31128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +1100 +2FE0 +3920 +6FC0 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_7999 +ENCODING 31129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +26E0 +F280 +16A0 +2040 +77C0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_799A +ENCODING 31130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +3100 +6900 +AFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_799B +ENCODING 31131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F900 +17C0 +2440 +3740 +6DC0 +A440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_799C +ENCODING 31132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +3F80 +0000 +FFC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_799D +ENCODING 31133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +2540 +47C0 +E280 +5440 +4BA0 +4680 +4100 +4EE0 +ENDCHAR +STARTCHAR U_799E +ENCODING 31134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F000 +27C0 +6440 +BFE0 +A820 +2BA0 +2AA0 +2BA0 +2840 +ENDCHAR +STARTCHAR U_799F +ENCODING 31135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +E900 +2FC0 +4940 +EBE0 +4940 +4FC0 +5440 +57C0 +4440 +ENDCHAR +STARTCHAR U_79A0 +ENCODING 31136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +F9E0 +1900 +2FE0 +6920 +BFC0 +2920 +2BE0 +3280 +2CE0 +ENDCHAR +STARTCHAR U_79A1 +ENCODING 31137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2500 +F7C0 +1500 +27C0 +7500 +AFE0 +2020 +2AA0 +3560 +2540 +ENDCHAR +STARTCHAR U_79A2 +ENCODING 31138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +27C0 +7000 +AFE0 +25A0 +2360 +2DA0 +26E0 +ENDCHAR +STARTCHAR U_79A3 +ENCODING 31139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +F100 +2FE0 +6920 +AFE0 +2920 +2080 +2FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_79A4 +ENCODING 31140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +1000 +2FE0 +7220 +AAA0 +2660 +2AA0 +3320 +2660 +ENDCHAR +STARTCHAR U_79A5 +ENCODING 31141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +F480 +2780 +4480 +6FE0 +C480 +4A40 +57A0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_79A6 +ENCODING 31142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +A4A0 +5FA0 +C4A0 +57E0 +5480 +3F80 +0000 +FFE0 +2280 +CE60 +ENDCHAR +STARTCHAR U_79A7 +ENCODING 31143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +1FE0 +2440 +37C0 +6A80 +AFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79A8 +ENCODING 31144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2BA0 +F540 +19A0 +2F60 +7540 +AFE0 +2540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_79A9 +ENCODING 31145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +0FE0 +F920 +2FE0 +6440 +AFE0 +2440 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_79AA +ENCODING 31146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FFE0 +1540 +27C0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_79AB +ENCODING 31147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +1AA0 +2FE0 +7440 +AFC0 +2440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_79AC +ENCODING 31148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F7C0 +1820 +2FE0 +7AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_79AD +ENCODING 31149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +2A80 +FFE0 +1220 +3D40 +6A80 +ADC0 +2AA0 +2CA0 +2980 +37E0 +ENDCHAR +STARTCHAR U_79AE +ENCODING 31150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FAA0 +1FE0 +2AA0 +7FE0 +A440 +27C0 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79AF +ENCODING 31151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +EAA0 +2FE0 +3AA0 +6FE0 +A800 +2FE0 +2A80 +2B60 +3240 +ENDCHAR +STARTCHAR U_79B0 +ENCODING 31152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +F920 +1FE0 +2DA0 +7B60 +ADA0 +2B60 +2DA0 +2920 +2960 +ENDCHAR +STARTCHAR U_79B1 +ENCODING 31153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +1FE0 +2120 +2FC0 +7040 +AFE0 +2B40 +2E40 +20C0 +ENDCHAR +STARTCHAR U_79B2 +ENCODING 31154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5280 +FFE0 +3280 +57C0 +77C0 +D540 +5FE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_79B3 +ENCODING 31155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +1EE0 +2280 +7FE0 +A280 +2FE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_79B4 +ENCODING 31156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +FFC0 +1020 +2FE0 +7AA0 +AFE0 +2AA0 +2FE0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_79B5 +ENCODING 31157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E00 +4AE0 +EE40 +2AE0 +4EA0 +60E0 +DEA0 +44E0 +5640 +5CA0 +67E0 +ENDCHAR +STARTCHAR U_79B6 +ENCODING 31158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +1FE0 +2540 +77E0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_79B7 +ENCODING 31159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +5C40 +3FE0 +E920 +5DE0 +6B20 +C9E0 +7F20 +49E0 +5540 +6220 +ENDCHAR +STARTCHAR U_79B8 +ENCODING 31160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +9080 +9480 +A280 +FE80 +8080 +8080 +8180 +ENDCHAR +STARTCHAR U_79B9 +ENCODING 31161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +FE00 +0800 +7F80 +4880 +7F80 +0800 +FFC0 +8A40 +BD40 +81C0 +ENDCHAR +STARTCHAR U_79BA +ENCODING 31162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0800 +FFC0 +8A40 +FD40 +8040 +81C0 +ENDCHAR +STARTCHAR U_79BB +ENCODING 31163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +2480 +2A80 +3F80 +0400 +7FC0 +4940 +5F40 +40C0 +ENDCHAR +STARTCHAR U_79BC +ENCODING 31164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0F00 +0800 +7F00 +5500 +4900 +7F00 +0800 +FF80 +9480 +BE80 +8180 +ENDCHAR +STARTCHAR U_79BD +ENCODING 31165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3580 +DF60 +2480 +2A80 +3F80 +0400 +7FC0 +4A40 +5F40 +40C0 +ENDCHAR +STARTCHAR U_79BE +ENCODING 31166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_79BF +ENCODING 31167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +1500 +2480 +C060 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_79C0 +ENCODING 31168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +DF60 +0900 +0BC0 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_79C1 +ENCODING 31169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E100 +2100 +F900 +2200 +7200 +6A00 +A440 +2FE0 +2420 +2000 +ENDCHAR +STARTCHAR U_79C2 +ENCODING 31170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0E00 +1580 +E060 +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_79C3 +ENCODING 31171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1500 +2480 +C060 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_79C4 +ENCODING 31172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7C0 +2040 +F880 +2100 +77E0 +6900 +A100 +A100 +2100 +2300 +ENDCHAR +STARTCHAR U_79C5 +ENCODING 31173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +E780 +2100 +2100 +F900 +27E0 +3100 +6900 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79C6 +ENCODING 31174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2100 +F900 +2FE0 +3100 +6900 +A900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79C7 +ENCODING 31175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E200 +2200 +2FC0 +F240 +2640 +7340 +AA40 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_79C8 +ENCODING 31176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +2080 +FAA0 +22A0 +32A0 +6AA0 +AAA0 +22A0 +23E0 +2220 +ENDCHAR +STARTCHAR U_79C9 +ENCODING 31177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +0480 +FFE0 +0480 +7F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_79CA +ENCODING 31178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +C360 +3C00 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_79CB +ENCODING 31179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2140 +FD40 +2580 +7500 +6900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_79CC +ENCODING 31180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2900 +6FE0 +7100 +A380 +2380 +5540 +5540 +8920 +0100 +ENDCHAR +STARTCHAR U_79CD +ENCODING 31181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27E0 +FD20 +2520 +3520 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79CE +ENCODING 31182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E280 +2240 +F440 +2820 +37C0 +6A40 +AA40 +2240 +2440 +2980 +ENDCHAR +STARTCHAR U_79CF +ENCODING 31183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +E700 +2100 +F9E0 +2700 +3100 +69E0 +AF00 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79D0 +ENCODING 31184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +63C0 +2000 +F800 +27E0 +7100 +6900 +A200 +2240 +27E0 +2240 +ENDCHAR +STARTCHAR U_79D1 +ENCODING 31185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1840 +E240 +2140 +F840 +2240 +3140 +6860 +A1C0 +2640 +2040 +2040 +ENDCHAR +STARTCHAR U_79D2 +ENCODING 31186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2540 +F520 +2520 +7500 +6920 +A040 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_79D3 +ENCODING 31187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6100 +27C0 +F900 +27C0 +7440 +6A80 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_79D4 +ENCODING 31188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E100 +2FE0 +F800 +2380 +7280 +6A80 +A280 +22A0 +2460 +2800 +ENDCHAR +STARTCHAR U_79D5 +ENCODING 31189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +E480 +2480 +FCA0 +27C0 +3480 +6C80 +A480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_79D6 +ENCODING 31190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E780 +2480 +FC80 +27E0 +3480 +6C80 +A480 +25A0 +2660 +2420 +ENDCHAR +STARTCHAR U_79D7 +ENCODING 31191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +6700 +2100 +F900 +27E0 +7100 +6A80 +A280 +2240 +2460 +2840 +ENDCHAR +STARTCHAR U_79D8 +ENCODING 31192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E140 +2240 +FA40 +2280 +3680 +6AA0 +AB20 +2240 +2640 +39C0 +ENDCHAR +STARTCHAR U_79D9 +ENCODING 31193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6100 +27E0 +F900 +2100 +77C0 +6C40 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79DA +ENCODING 31194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6540 +2380 +F100 +27C0 +7100 +6900 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79DB +ENCODING 31195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +6080 +27E0 +FCA0 +25C0 +7540 +6D40 +A480 +2880 +2940 +3220 +ENDCHAR +STARTCHAR U_79DC +ENCODING 31196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E420 +2420 +FFE0 +2400 +3520 +6D40 +A580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_79DD +ENCODING 31197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E700 +2100 +FFE0 +2100 +3180 +6B40 +A520 +A920 +2100 +2100 +ENDCHAR +STARTCHAR U_79DE +ENCODING 31198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +2080 +FFE0 +24A0 +34A0 +6FE0 +A4A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_79DF +ENCODING 31199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +2240 +FA40 +23C0 +3240 +6A40 +ABC0 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_79E0 +ENCODING 31200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +E7E0 +2080 +F880 +2100 +3340 +6D20 +A920 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79E1 +ENCODING 31201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +6240 +27E0 +FA00 +23C0 +7440 +6440 +AA80 +3100 +2280 +2460 +ENDCHAR +STARTCHAR U_79E2 +ENCODING 31202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2280 +F460 +2900 +7080 +67C0 +A040 +2280 +2100 +2100 +ENDCHAR +STARTCHAR U_79E3 +ENCODING 31203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2FE0 +F900 +27C0 +3100 +6B80 +A540 +2920 +3120 +2100 +ENDCHAR +STARTCHAR U_79E4 +ENCODING 31204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E080 +24A0 +FAA0 +22C0 +3080 +2FE0 +6880 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_79E5 +ENCODING 31205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2100 +F9E0 +2100 +77C0 +6C40 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79E6 +ENCODING 31206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0800 +FFE0 +2C80 +C460 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_79E7 +ENCODING 31207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +27C0 +FD40 +2540 +37E0 +2900 +6900 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_79E8 +ENCODING 31208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6400 +27E0 +FA00 +2BC0 +7200 +6A00 +A3C0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_79E9 +ENCODING 31209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E280 +23C0 +FC80 +2080 +37E0 +2880 +6880 +A140 +2220 +2C20 +ENDCHAR +STARTCHAR U_79EA +ENCODING 31210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +E780 +2480 +FC80 +27E0 +3480 +2C80 +64A0 +A5A0 +2760 +24A0 +ENDCHAR +STARTCHAR U_79EB +ENCODING 31211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1980 +E140 +27E0 +F900 +2380 +7380 +6D40 +A540 +A920 +2100 +2100 +ENDCHAR +STARTCHAR U_79EC +ENCODING 31212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E400 +2400 +FFC0 +2440 +3440 +2FC0 +6400 +A400 +2400 +27E0 +ENDCHAR +STARTCHAR U_79ED +ENCODING 31213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E0E0 +2780 +FC80 +2480 +37E0 +28A0 +69A0 +A2E0 +2480 +2880 +ENDCHAR +STARTCHAR U_79EE +ENCODING 31214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2240 +FFA0 +2020 +3000 +2BE0 +6220 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_79EF +ENCODING 31215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3E0 +2220 +FA20 +2220 +73E0 +6800 +A240 +A240 +2420 +2820 +ENDCHAR +STARTCHAR U_79F0 +ENCODING 31216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E200 +27E0 +F920 +2100 +7540 +6540 +A920 +3120 +2100 +2300 +ENDCHAR +STARTCHAR U_79F1 +ENCODING 31217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2420 +FFE0 +2420 +77A0 +6EA0 +A7A0 +2420 +24A0 +2440 +ENDCHAR +STARTCHAR U_79F2 +ENCODING 31218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +27C0 +F900 +27E0 +7080 +6FE0 +A480 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_79F3 +ENCODING 31219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +60C0 +2700 +F100 +2FE0 +7100 +6FC0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79F4 +ENCODING 31220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2280 +F440 +2BA0 +7000 +6FC0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79F5 +ENCODING 31221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2520 +FD20 +27E0 +7520 +6EA0 +A460 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_79F6 +ENCODING 31222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4FE0 +3240 +4500 +D8E0 +4000 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_79F7 +ENCODING 31223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E100 +2200 +FC40 +27A0 +3100 +2900 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79F8 +ENCODING 31224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +27E0 +F880 +23E0 +3000 +2BE0 +6220 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_79F9 +ENCODING 31225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +6260 +2580 +FC80 +2480 +77E0 +A480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_79FA +ENCODING 31226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +F8C0 +2700 +3100 +29E0 +6700 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79FB +ENCODING 31227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3E0 +2420 +FA40 +2180 +3680 +29E0 +6220 +A540 +2080 +2700 +ENDCHAR +STARTCHAR U_79FC +ENCODING 31228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6500 +27C0 +F900 +27E0 +7100 +6B80 +A340 +2520 +2900 +2100 +ENDCHAR +STARTCHAR U_79FD +ENCODING 31229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E4A0 +24A0 +27E0 +F900 +21E0 +3220 +6D40 +A080 +2300 +2C00 +ENDCHAR +STARTCHAR U_79FE +ENCODING 31230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2920 +2200 +FA00 +2540 +7540 +6C80 +A480 +2640 +2420 +ENDCHAR +STARTCHAR U_79FF +ENCODING 31231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +6FE0 +2100 +FFC0 +2540 +77C0 +6D40 +A7C0 +2540 +2540 +24C0 +ENDCHAR +STARTCHAR U_7A00 +ENCODING 31232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B60 +E080 +2360 +FC80 +27E0 +3280 +6FE0 +A6A0 +AAA0 +22E0 +2080 +ENDCHAR +STARTCHAR U_7A01 +ENCODING 31233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +2080 +FFE0 +8120 +3E00 +0400 +FFE0 +1500 +E4C0 +ENDCHAR +STARTCHAR U_7A02 +ENCODING 31234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2440 +FFC0 +2440 +37C0 +2D20 +6540 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7A03 +ENCODING 31235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E720 +2540 +FA80 +27C0 +7080 +6900 +AFE0 +A100 +2100 +2300 +ENDCHAR +STARTCHAR U_7A04 +ENCODING 31236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E240 +27A0 +FA40 +2420 +33C0 +2A40 +6640 +A980 +2240 +2C20 +ENDCHAR +STARTCHAR U_7A05 +ENCODING 31237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E240 +2420 +FFC0 +2440 +7440 +6FC0 +A280 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7A06 +ENCODING 31238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +E220 +2220 +FBE0 +2000 +3000 +2FE0 +6420 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A07 +ENCODING 31239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +6FE0 +2920 +FFE0 +2920 +7BA0 +6D60 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7A08 +ENCODING 31240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E440 +27C0 +FC40 +27C0 +3000 +2FC0 +6100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7A09 +ENCODING 31241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +6100 +27C0 +FD40 +27C0 +7540 +6FC0 +A100 +2500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_7A0A +ENCODING 31242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +E280 +27E0 +F920 +27E0 +3500 +2FE0 +6320 +A520 +2960 +2100 +ENDCHAR +STARTCHAR U_7A0B +ENCODING 31243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E440 +2440 +F7C0 +2000 +37C0 +6900 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A0C +ENCODING 31244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2440 +FFE0 +2100 +37C0 +2900 +6540 +A920 +3120 +2300 +ENDCHAR +STARTCHAR U_7A0D +ENCODING 31245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1920 +E540 +2100 +FFC0 +2440 +77C0 +6C40 +A7C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A0E +ENCODING 31246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +E280 +27C0 +FC40 +2440 +77C0 +6A80 +A280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_7A0F +ENCODING 31247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +EFE0 +2280 +FEE0 +2420 +7420 +6C20 +A6E0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_7A10 +ENCODING 31248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2440 +FBA0 +2000 +3FE0 +2AA0 +6FE0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7A11 +ENCODING 31249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2280 +3540 +2920 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A12 +ENCODING 31250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +2520 +FFE0 +2520 +37A0 +2EA0 +67A0 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A13 +ENCODING 31251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E7E0 +2240 +FA40 +27E0 +3000 +2BE0 +6220 +A3E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_7A14 +ENCODING 31252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2540 +F8A0 +27C0 +3040 +2880 +62A0 +AA20 +2A40 +31C0 +ENDCHAR +STARTCHAR U_7A15 +ENCODING 31253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2240 +FBC0 +2000 +37C0 +2880 +6100 +AFE0 +2100 +2700 +ENDCHAR +STARTCHAR U_7A16 +ENCODING 31254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67C0 +2000 +F440 +2280 +77E0 +6800 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A17 +ENCODING 31255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +24A0 +FFE0 +24A0 +37E0 +2AA0 +6480 +AFE0 +2080 +2080 +ENDCHAR +STARTCHAR U_7A18 +ENCODING 31256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E7E0 +2240 +FBC0 +2240 +33C0 +2A40 +6FE0 +A000 +2240 +2420 +ENDCHAR +STARTCHAR U_7A19 +ENCODING 31257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2440 +37C0 +2C40 +6740 +A5C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7A1A +ENCODING 31258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +E280 +27E0 +FC80 +27C0 +3480 +2C80 +67C0 +A480 +2480 +27E0 +ENDCHAR +STARTCHAR U_7A1B +ENCODING 31259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E4A0 +2720 +FD20 +27E0 +3520 +2DA0 +6760 +A520 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A1C +ENCODING 31260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2240 +3520 +2BC0 +6540 +A880 +2340 +2C20 +ENDCHAR +STARTCHAR U_7A1D +ENCODING 31261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +6EE0 +2AA0 +FEE0 +2AA0 +7AA0 +AEE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_7A1E +ENCODING 31262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E540 +27C0 +FD40 +27C0 +3100 +2FE0 +6100 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_7A1F +ENCODING 31263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2F40 +2040 +3FC0 +0080 +3F00 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_7A20 +ENCODING 31264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +27A0 +FD20 +27E0 +3420 +2FA0 +66A0 +A7A0 +2420 +2860 +ENDCHAR +STARTCHAR U_7A21 +ENCODING 31265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2000 +FA40 +2240 +75A0 +6900 +A7E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_7A22 +ENCODING 31266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E0A0 +2FE0 +F080 +2EA0 +3AA0 +6AA0 +AEC0 +A0A0 +2F60 +2220 +ENDCHAR +STARTCHAR U_7A23 +ENCODING 31267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9080 +FBE0 +A880 +F880 +A9C0 +AAA0 +FCA0 +0080 +F880 +ENDCHAR +STARTCHAR U_7A24 +ENCODING 31268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2000 +FFC0 +2440 +77C0 +6900 +A380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_7A25 +ENCODING 31269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +2480 +D660 +4940 +3FA0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7A26 +ENCODING 31270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2240 +FFE0 +2440 +37C0 +2880 +67E0 +A480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_7A27 +ENCODING 31271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +67E0 +22A0 +F7A0 +22A0 +7760 +6A80 +A7E0 +2100 +2280 +2460 +ENDCHAR +STARTCHAR U_7A28 +ENCODING 31272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2820 +FFE0 +2800 +3FE0 +6AA0 +AFE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_7A29 +ENCODING 31273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1FC0 +E540 +27C0 +FD40 +27C0 +7440 +6FC0 +A440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A2A +ENCODING 31274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +67E0 +2C40 +F7C0 +2440 +77C0 +6A00 +A7C0 +2280 +2100 +26E0 +ENDCHAR +STARTCHAR U_7A2B +ENCODING 31275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E000 +23C0 +F240 +23C0 +3000 +6FE0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_7A2C +ENCODING 31276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2100 +FFE0 +2AA0 +7AA0 +6900 +A7E0 +2100 +2280 +2460 +ENDCHAR +STARTCHAR U_7A2D +ENCODING 31277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +66A0 +24C0 +FEA0 +24E0 +7200 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A2E +ENCODING 31278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +27E0 +FD40 +27C0 +3540 +2FC0 +6100 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A2F +ENCODING 31279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +16A0 +E520 +26A0 +FFE0 +2240 +3520 +2BC0 +6640 +A980 +2240 +2420 +ENDCHAR +STARTCHAR U_7A30 +ENCODING 31280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E120 +25C0 +F500 +2BE0 +3440 +2FC0 +6440 +A7C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A31 +ENCODING 31281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E720 +2920 +F540 +27C0 +3540 +2FC0 +6540 +AFE0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A32 +ENCODING 31282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +67A0 +2520 +FAC0 +2000 +75E0 +6D20 +A520 +25E0 +2520 +25E0 +ENDCHAR +STARTCHAR U_7A33 +ENCODING 31283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E3C0 +2480 +FFC0 +2040 +37C0 +2840 +67C0 +AD40 +3420 +23C0 +ENDCHAR +STARTCHAR U_7A34 +ENCODING 31284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6FE0 +2280 +FFE0 +32A0 +6FE0 +62A0 +AFE0 +26C0 +2AA0 +2280 +ENDCHAR +STARTCHAR U_7A35 +ENCODING 31285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6280 +2FE0 +FA40 +2480 +7B20 +6FC0 +A480 +2B20 +3FE0 +2120 +ENDCHAR +STARTCHAR U_7A36 +ENCODING 31286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +60A0 +2FE0 +F080 +2EC0 +7BA0 +6AC0 +AFA0 +20C0 +2EA0 +2160 +ENDCHAR +STARTCHAR U_7A37 +ENCODING 31287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +27E0 +FD20 +27E0 +3440 +2BE0 +6240 +A580 +2240 +2420 +ENDCHAR +STARTCHAR U_7A38 +ENCODING 31288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2200 +FC80 +2300 +7440 +6FE0 +A540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_7A39 +ENCODING 31289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2440 +3740 +2DC0 +6440 +AFE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7A3A +ENCODING 31290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6420 +27E0 +FC80 +27E0 +7540 +6FE0 +A480 +2BE0 +2880 +3080 +ENDCHAR +STARTCHAR U_7A3B +ENCODING 31291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +E720 +2520 +FAC0 +2000 +36E0 +2C20 +6760 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A3C +ENCODING 31292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +FFE0 +2220 +3540 +2A80 +65C0 +AAA0 +24A0 +2B00 +ENDCHAR +STARTCHAR U_7A3D +ENCODING 31293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +2520 +F8E0 +27A0 +3420 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A3E +ENCODING 31294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +4940 +5F40 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7A3F +ENCODING 31295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7E0 +2240 +FBC0 +2000 +3FE0 +2820 +6BA0 +AAA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_7A40 +ENCODING 31296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +73E0 +2220 +F940 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_7A41 +ENCODING 31297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +6FE0 +2280 +FFE0 +2440 +77C0 +6C40 +A7C0 +2440 +2FE0 +2040 +ENDCHAR +STARTCHAR U_7A42 +ENCODING 31298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2100 +FFC0 +3540 +6FC0 +6540 +A7C0 +2220 +3540 +23C0 +ENDCHAR +STARTCHAR U_7A43 +ENCODING 31299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2820 +F440 +2920 +7280 +6C40 +BFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7A44 +ENCODING 31300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +E7E0 +29A0 +FE40 +2440 +3BA0 +2000 +6FE0 +A540 +2920 +3320 +ENDCHAR +STARTCHAR U_7A45 +ENCODING 31301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +CFE0 +4940 +FFE0 +4940 +6FC0 +D900 +CD40 +4B80 +5D60 +6300 +ENDCHAR +STARTCHAR U_7A46 +ENCODING 31302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +FFE0 +2520 +3340 +2DA0 +6040 +A7A0 +2040 +2780 +ENDCHAR +STARTCHAR U_7A47 +ENCODING 31303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +F7A0 +2440 +FAA0 +2FE0 +3280 +6540 +AAA0 +2540 +2280 +2F00 +ENDCHAR +STARTCHAR U_7A48 +ENCODING 31304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9080 +FFE0 +B5C0 +D2A0 +BF80 +8400 +FFE0 +9480 +E460 +ENDCHAR +STARTCHAR U_7A49 +ENCODING 31305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6820 +2FE0 +FAA0 +29C0 +7AA0 +6A80 +ABE0 +2C80 +2FE0 +3080 +ENDCHAR +STARTCHAR U_7A4A +ENCODING 31306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EA40 +2EC0 +FB40 +2FE0 +3A40 +2840 +6C40 +AAC0 +2D40 +2260 +ENDCHAR +STARTCHAR U_7A4B +ENCODING 31307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E120 +25A0 +FB60 +2480 +3340 +2C60 +6180 +A640 +2180 +2600 +ENDCHAR +STARTCHAR U_7A4C +ENCODING 31308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7380 +9080 +F880 +AFE0 +F880 +A9C0 +AAA0 +FCA0 +5480 +A880 +ENDCHAR +STARTCHAR U_7A4D +ENCODING 31309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2100 +2FE0 +3440 +6FC0 +A440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A4E +ENCODING 31310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6080 +4BE0 +3A20 +03E0 +FA20 +23E0 +FA20 +33E0 +6940 +A620 +ENDCHAR +STARTCHAR U_7A4F +ENCODING 31311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +6F40 +2580 +FFC0 +3040 +6FC0 +6040 +AFC0 +2240 +34A0 +3380 +ENDCHAR +STARTCHAR U_7A50 +ENCODING 31312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +6500 +27C0 +FD40 +37C0 +6D40 +67C0 +A540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_7A51 +ENCODING 31313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2920 +2540 +FFE0 +2000 +7FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_7A52 +ENCODING 31314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFC0 +3480 +7FC0 +A0A0 +3F80 +2080 +3FE0 +5540 +55C0 +ENDCHAR +STARTCHAR U_7A53 +ENCODING 31315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E940 +2FC0 +F940 +2FC0 +7480 +6FC0 +A480 +3FE0 +2480 +2840 +ENDCHAR +STARTCHAR U_7A54 +ENCODING 31316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +E7E0 +2280 +27E0 +F100 +27C0 +3540 +6FC0 +A540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A55 +ENCODING 31317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +6FE0 +3480 +FFC0 +3480 +6FE0 +6500 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_7A56 +ENCODING 31318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +E520 +2BC0 +2540 +FBE0 +2540 +7FE0 +A540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_7A57 +ENCODING 31319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2540 +F7C0 +2540 +37C0 +6140 +AFE0 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_7A58 +ENCODING 31320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2440 +3EE0 +6440 +AFE0 +2280 +24A0 +3860 +ENDCHAR +STARTCHAR U_7A59 +ENCODING 31321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1AA0 +66C0 +2FE0 +F240 +6FE0 +7100 +6FC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7A5A +ENCODING 31322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2FE0 +F240 +2FE0 +3240 +2FE0 +6820 +ABA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_7A5B +ENCODING 31323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3500 +E7E0 +2500 +FFC0 +2500 +37C0 +6D00 +A7E0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7A5C +ENCODING 31324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2280 +F100 +2FE0 +3540 +67C0 +A540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A5D +ENCODING 31325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +6440 +27C0 +F440 +3FE0 +6A00 +6FE0 +AB20 +2EC0 +3AC0 +2320 +ENDCHAR +STARTCHAR U_7A5E +ENCODING 31326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E480 +27C0 +FD40 +27C0 +7540 +AFE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A5F +ENCODING 31327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E980 +2FE0 +F120 +22C0 +3980 +6AC0 +A9A0 +2AA0 +2D00 +33E0 +ENDCHAR +STARTCHAR U_7A60 +ENCODING 31328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +2AA0 +FFE0 +2AA0 +3FE0 +6800 +AFE0 +2AA0 +2A40 +33A0 +ENDCHAR +STARTCHAR U_7A61 +ENCODING 31329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2540 +FBA0 +2FE0 +2000 +7FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_7A62 +ENCODING 31330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +E500 +2FE0 +F0A0 +2FE0 +3A80 +6FA0 +AAC0 +32A0 +2560 +2A20 +ENDCHAR +STARTCHAR U_7A63 +ENCODING 31331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2440 +FAA0 +2FC0 +7280 +6FE0 +A340 +2680 +3B60 +2240 +ENDCHAR +STARTCHAR U_7A64 +ENCODING 31332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6100 +2FE0 +FD60 +2380 +7560 +6FE0 +A200 +2FE0 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_7A65 +ENCODING 31333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +CDE0 +4920 +FDE0 +6AA0 +DEE0 +CAA0 +5FE0 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_7A66 +ENCODING 31334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2820 +FFC0 +3520 +6940 +67C0 +BD40 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A67 +ENCODING 31335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +26A0 +F540 +2D40 +3560 +6540 +A7C0 +A440 +27C0 +2840 +ENDCHAR +STARTCHAR U_7A68 +ENCODING 31336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +27E0 +7240 +ABC0 +7240 +53C0 +5640 +5BC0 +9660 +ENDCHAR +STARTCHAR U_7A69 +ENCODING 31337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E540 +2FE0 +F100 +2FE0 +3040 +6FE0 +A040 +2FC0 +3520 +27A0 +ENDCHAR +STARTCHAR U_7A6A +ENCODING 31338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +6540 +2920 +FFE0 +2D60 +7BA0 +6D60 +AD60 +2BA0 +2D60 +2860 +ENDCHAR +STARTCHAR U_7A6B +ENCODING 31339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +EFE0 +2440 +FFE0 +2480 +37E0 +2C80 +67E0 +A240 +2180 +2E60 +ENDCHAR +STARTCHAR U_7A6C +ENCODING 31340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2940 +FFE0 +2940 +3FE0 +2D40 +6FC0 +AD40 +33C0 +2660 +ENDCHAR +STARTCHAR U_7A6D +ENCODING 31341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1700 +E7C0 +2D40 +FFC0 +2540 +37E0 +6D40 +A460 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A6E +ENCODING 31342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2AA0 +FFE0 +2A80 +3BE0 +6A80 +ABE0 +2800 +3540 +2AA0 +ENDCHAR +STARTCHAR U_7A6F +ENCODING 31343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +FD60 +3100 +6FE0 +6820 +ABA0 +2AA0 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_7A70 +ENCODING 31344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2AA0 +FEE0 +2480 +3FE0 +6480 +BFE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_7A71 +ENCODING 31345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E940 +2FE0 +FAA0 +2FE0 +3A20 +6FE0 +AAA0 +2E60 +2A20 +2D60 +ENDCHAR +STARTCHAR U_7A72 +ENCODING 31346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +CAA0 +4AA0 +F100 +4FE0 +6AA0 +DFE0 +CC80 +56E0 +54A0 +6660 +ENDCHAR +STARTCHAR U_7A73 +ENCODING 31347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +6FE0 +2440 +FFE0 +26C0 +7B60 +6FC0 +A540 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A74 +ENCODING 31348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +8040 +9240 +1200 +1200 +2100 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_7A75 +ENCODING 31349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +9240 +2100 +4080 +BC00 +0800 +1000 +2080 +4080 +3F80 +ENDCHAR +STARTCHAR U_7A76 +ENCODING 31350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +4840 +0800 +3F00 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_7A77 +ENCODING 31351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +2080 +4440 +8420 +7FC0 +0840 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_7A78 +ENCODING 31352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +2100 +C8C0 +0F80 +1080 +6900 +0600 +1C00 +E000 +ENDCHAR +STARTCHAR U_7A79 +ENCODING 31353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7FC0 +0080 +3F80 +4000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_7A7A +ENCODING 31354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8900 +1080 +6040 +1F80 +0400 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_7A7B +ENCODING 31355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +A120 +4080 +BF40 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_7A7C +ENCODING 31356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4140 +1080 +2440 +7FC0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_7A7D +ENCODING 31357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5140 +9120 +7F80 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7A7E +ENCODING 31358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +5F40 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7A7F +ENCODING 31359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7F80 +2200 +7FC0 +0A00 +1200 +2200 +CE00 +ENDCHAR +STARTCHAR U_7A80 +ENCODING 31360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +FFE0 +0400 +2480 +2480 +3FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_7A81 +ENCODING 31361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +9080 +2540 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7A82 +ENCODING 31362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A120 +4480 +A460 +3F80 +4400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7A83 +ENCODING 31363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6080 +27E0 +2120 +F920 +2120 +2D20 +3220 +0CC0 +ENDCHAR +STARTCHAR U_7A84 +ENCODING 31364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +9240 +2100 +6080 +3FC0 +4800 +8F80 +0800 +0FC0 +0800 +ENDCHAR +STARTCHAR U_7A85 +ENCODING 31365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7A86 +ENCODING 31366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4340 +7C00 +0400 +7F80 +0200 +0C00 +3000 +CFE0 +ENDCHAR +STARTCHAR U_7A87 +ENCODING 31367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5040 +3F80 +4080 +9E80 +1280 +1FA0 +1020 +0FE0 +ENDCHAR +STARTCHAR U_7A88 +ENCODING 31368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2140 +4100 +9FE0 +E120 +5120 +8A20 +F520 +08C0 +ENDCHAR +STARTCHAR U_7A89 +ENCODING 31369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +3F80 +0400 +7FC0 +4440 +4A40 +5140 +40C0 +ENDCHAR +STARTCHAR U_7A8A +ENCODING 31370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +47C0 +3900 +2900 +2900 +4A80 +4D40 +8920 +ENDCHAR +STARTCHAR U_7A8B +ENCODING 31371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4440 +2480 +2480 +3F80 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7A8C +ENCODING 31372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +4840 +73C0 +4A40 +5A40 +6B40 +1280 +6200 +ENDCHAR +STARTCHAR U_7A8D +ENCODING 31373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +47E0 +F900 +23E0 +2020 +3820 +C120 +00C0 +ENDCHAR +STARTCHAR U_7A8E +ENCODING 31374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4880 +BF40 +2900 +2500 +3FC0 +0040 +7E40 +00C0 +ENDCHAR +STARTCHAR U_7A8F +ENCODING 31375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +2FC0 +8100 +7FE0 +2100 +C100 +4500 +4200 +ENDCHAR +STARTCHAR U_7A90 +ENCODING 31376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4440 +3F80 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7A91 +ENCODING 31377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +5040 +3FC0 +0400 +FFE0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7A92 +ENCODING 31378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7FC0 +1080 +3F40 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7A93 +ENCODING 31379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +8220 +2100 +C8C0 +1200 +3F00 +0800 +5440 +9120 +0F00 +ENDCHAR +STARTCHAR U_7A94 +ENCODING 31380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +FFE0 +1100 +20C0 +CA00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7A95 +ENCODING 31381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2040 +4A20 +2A80 +1B00 +2A80 +CA20 +1220 +61E0 +ENDCHAR +STARTCHAR U_7A96 +ENCODING 31382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6440 +3F80 +4400 +FFE0 +0000 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7A97 +ENCODING 31383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +A140 +4880 +FFC0 +4880 +5F80 +7280 +4C80 +5280 +7F80 +ENDCHAR +STARTCHAR U_7A98 +ENCODING 31384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +0880 +FFE0 +0880 +7FC0 +3040 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7A99 +ENCODING 31385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +BFA0 +0500 +7FE0 +0900 +1200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_7A9A +ENCODING 31386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2240 +C220 +7FE0 +4240 +7A40 +4980 +49A0 +9E60 +ENDCHAR +STARTCHAR U_7A9B +ENCODING 31387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +7C80 +03E0 +FD40 +2880 +2B60 +4820 +87E0 +ENDCHAR +STARTCHAR U_7A9C +ENCODING 31388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A4A0 +3FC0 +2480 +7FC0 +4440 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7A9D +ENCODING 31389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +BFA0 +6140 +3F00 +0400 +7FC0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_7A9E +ENCODING 31390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4840 +9F20 +2200 +7BC0 +2040 +3BC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7A9F +ENCODING 31391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +6040 +3FC0 +2A80 +2F80 +3240 +5240 +9FC0 +ENDCHAR +STARTCHAR U_7AA0 +ENCODING 31392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7AA1 +ENCODING 31393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A0A0 +7BC0 +1100 +6AC0 +0000 +7BC0 +4A40 +3180 +CA60 +ENDCHAR +STARTCHAR U_7AA2 +ENCODING 31394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +92A0 +6240 +FFC0 +0200 +7A40 +4A80 +7920 +02A0 +FC60 +ENDCHAR +STARTCHAR U_7AA3 +ENCODING 31395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A4A0 +7FC0 +1100 +2A80 +4440 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7AA4 +ENCODING 31396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7FC0 +A4A0 +2880 +3F80 +2240 +3B80 +2240 +31C0 +ENDCHAR +STARTCHAR U_7AA5 +ENCODING 31397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60A0 +27C0 +FC40 +2540 +FD40 +3180 +4AA0 +8CE0 +ENDCHAR +STARTCHAR U_7AA6 +ENCODING 31398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +5F40 +0400 +FFC0 +2A40 +1200 +FFE0 +0500 +78E0 +ENDCHAR +STARTCHAR U_7AA7 +ENCODING 31399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A0A0 +4740 +8420 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7AA8 +ENCODING 31400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2440 +7FC0 +0900 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7AA9 +ENCODING 31401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7F80 +A140 +3D00 +2500 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7AAA +ENCODING 31402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +0240 +4FC0 +A200 +5FE0 +2200 +CFC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_7AAB +ENCODING 31403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +1140 +7D40 +1440 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7AAC +ENCODING 31404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +64C0 +1B00 +FEE0 +4940 +7940 +4940 +7840 +49C0 +ENDCHAR +STARTCHAR U_7AAD +ENCODING 31405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +24A0 +5540 +7FC0 +1500 +2880 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7AAE +ENCODING 31406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7DE0 +4420 +7DE0 +4500 +FDE0 +2420 +CCC0 +ENDCHAR +STARTCHAR U_7AAF +ENCODING 31407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4A80 +7FC0 +0400 +3F80 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_7AB0 +ENCODING 31408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4740 +B8A0 +2900 +7FC0 +0400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7AB1 +ENCODING 31409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +47C0 +5A80 +D100 +5280 +5FE0 +4540 +5B20 +ENDCHAR +STARTCHAR U_7AB2 +ENCODING 31410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +21A0 +AA40 +7140 +2240 +F940 +37E0 +6840 +A440 +ENDCHAR +STARTCHAR U_7AB3 +ENCODING 31411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +5FE0 +E540 +A540 +A540 +AD40 +B5A0 +A960 +ENDCHAR +STARTCHAR U_7AB4 +ENCODING 31412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +7FC0 +2080 +3F80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7AB5 +ENCODING 31413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4840 +3F80 +2080 +3FC0 +2000 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_7AB6 +ENCODING 31414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +2480 +FFE0 +2480 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7AB7 +ENCODING 31415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +F2E0 +AEA0 +EAA0 +AAA0 +EEE0 +A280 +E480 +ENDCHAR +STARTCHAR U_7AB8 +ENCODING 31416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A3A0 +7C80 +1500 +FFC0 +2500 +54C0 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_7AB9 +ENCODING 31417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +97A0 +5200 +77C0 +1240 +7FE0 +5440 +97C0 +ENDCHAR +STARTCHAR U_7ABA +ENCODING 31418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6080 +27C0 +FC40 +27C0 +FC40 +27C0 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_7ABB +ENCODING 31419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +7FC0 +AAA0 +2E80 +3480 +3F80 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_7ABC +ENCODING 31420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B540 +4AA0 +BF80 +2480 +3F80 +2480 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_7ABD +ENCODING 31421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +6240 +BBE0 +2220 +3C80 +5080 +FC80 +2940 +4620 +ENDCHAR +STARTCHAR U_7ABE +ENCODING 31422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7A80 +13E0 +7E20 +00C0 +7C80 +1080 +5940 +B620 +ENDCHAR +STARTCHAR U_7ABF +ENCODING 31423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +E780 +AC80 +C300 +BCE0 +A900 +EFC0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_7AC0 +ENCODING 31424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4080 +FFE0 +2440 +BFC0 +A440 +BFC0 +E2A0 +0CE0 +ENDCHAR +STARTCHAR U_7AC1 +ENCODING 31425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +4840 +FFA0 +0820 +FFE0 +2100 +FFE0 +2520 +3DE0 +ENDCHAR +STARTCHAR U_7AC2 +ENCODING 31426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +7FC0 +AAA0 +1F00 +3580 +D960 +1F00 +2500 +4C80 +ENDCHAR +STARTCHAR U_7AC3 +ENCODING 31427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +7FC0 +0400 +3F80 +2480 +7FC0 +4440 +7FC0 +07E0 +ENDCHAR +STARTCHAR U_7AC4 +ENCODING 31428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +59C0 +2040 +3DC0 +2040 +3FC0 +3680 +2DA0 +7660 +ENDCHAR +STARTCHAR U_7AC5 +ENCODING 31429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7A80 +4BE0 +7A40 +2540 +F940 +4880 +4940 +B620 +ENDCHAR +STARTCHAR U_7AC6 +ENCODING 31430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7BC0 +CA60 +7BC0 +4800 +FBC0 +2A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_7AC7 +ENCODING 31431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7AC8 +ENCODING 31432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +5F40 +0400 +FFE0 +2A80 +7BC0 +4A40 +7BA0 +07E0 +ENDCHAR +STARTCHAR U_7AC9 +ENCODING 31433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +52A0 +FBC0 +2A00 +FFC0 +4840 +7BC0 +4A80 +7AA0 +4BE0 +ENDCHAR +STARTCHAR U_7ACA +ENCODING 31434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +61C0 +A900 +6FC0 +F540 +2FE0 +7AA0 +ABA0 +2860 +ENDCHAR +STARTCHAR U_7ACB +ENCODING 31435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +0000 +1080 +1080 +0900 +0900 +0A00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_7ACC +ENCODING 31436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2380 +FA80 +1280 +5280 +5280 +2280 +3AA0 +C4A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_7ACD +ENCODING 31437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FD00 +0900 +4FE0 +4900 +5100 +3900 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7ACE +ENCODING 31438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1080 +FFE0 +0000 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7ACF +ENCODING 31439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0100 +8900 +4FE0 +5100 +3900 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7AD0 +ENCODING 31440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +0A20 +8C00 +53C0 +5240 +3980 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_7AD1 +ENCODING 31441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +0100 +8A80 +8A80 +5480 +5500 +2540 +F920 +03E0 +ENDCHAR +STARTCHAR U_7AD2 +ENCODING 31442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0080 +0280 +0100 +ENDCHAR +STARTCHAR U_7AD3 +ENCODING 31443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +F900 +0100 +97C0 +5100 +5100 +2FE0 +3100 +C120 +00E0 +ENDCHAR +STARTCHAR U_7AD4 +ENCODING 31444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2640 +FA40 +1240 +5FE0 +5240 +2240 +3A40 +C240 +0440 +0840 +ENDCHAR +STARTCHAR U_7AD5 +ENCODING 31445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FA40 +1440 +9820 +57C0 +2240 +3240 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_7AD6 +ENCODING 31446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +5440 +5280 +5100 +5280 +1460 +0200 +7FC0 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7AD7 +ENCODING 31447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0540 +9920 +5140 +6140 +3880 +C100 +0600 +1800 +ENDCHAR +STARTCHAR U_7AD8 +ENCODING 31448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0420 +93A0 +52A0 +52A0 +23A0 +3820 +C120 +00C0 +ENDCHAR +STARTCHAR U_7AD9 +ENCODING 31449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F9E0 +0100 +9100 +57C0 +5440 +2440 +3440 +C440 +07C0 +ENDCHAR +STARTCHAR U_7ADA +ENCODING 31450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +1000 +9FE0 +5100 +6100 +3900 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_7ADB +ENCODING 31451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0500 +F480 +9A60 +5200 +6FC0 +3080 +C500 +0200 +0100 +ENDCHAR +STARTCHAR U_7ADC +ENCODING 31452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +0420 +03E0 +ENDCHAR +STARTCHAR U_7ADD +ENCODING 31453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0000 +F7E0 +8000 +5440 +5240 +2280 +3080 +C100 +0FE0 +ENDCHAR +STARTCHAR U_7ADE +ENCODING 31454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +1200 +FFC0 +0000 +3F00 +2100 +3F00 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_7ADF +ENCODING 31455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7AE0 +ENCODING 31456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7AE1 +ENCODING 31457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +FA00 +07C0 +9440 +9440 +67C0 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7AE2 +ENCODING 31458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +FFE0 +0400 +97C0 +5900 +5100 +2FE0 +3100 +C280 +0C60 +ENDCHAR +STARTCHAR U_7AE3 +ENCODING 31459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +F7A0 +1240 +9520 +53C0 +6640 +2A80 +F180 +0240 +0C20 +ENDCHAR +STARTCHAR U_7AE4 +ENCODING 31460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +27E0 +FD20 +0100 +97E0 +5280 +6280 +2280 +F520 +0920 +13E0 +ENDCHAR +STARTCHAR U_7AE5 +ENCODING 31461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7AE6 +ENCODING 31462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07E0 +9520 +57E0 +5100 +2380 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_7AE7 +ENCODING 31463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +FC40 +97C0 +5440 +67C0 +3460 +CFC0 +0240 +1D40 +0080 +ENDCHAR +STARTCHAR U_7AE8 +ENCODING 31464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F900 +17C0 +9440 +57C0 +6440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_7AE9 +ENCODING 31465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4100 +27E0 +FC20 +13C0 +9240 +53C0 +6240 +3BC0 +C240 +0FE0 +ENDCHAR +STARTCHAR U_7AEA +ENCODING 31466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +53C0 +7A40 +4980 +7980 +5260 +7C00 +0400 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_7AEB +ENCODING 31467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +FC80 +07C0 +9140 +9FE0 +6140 +27C0 +3900 +C100 +0700 +ENDCHAR +STARTCHAR U_7AEC +ENCODING 31468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2100 +F7C0 +1540 +9FC0 +5100 +6FE0 +3960 +CFE0 +0820 +0860 +ENDCHAR +STARTCHAR U_7AED +ENCODING 31469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +0440 +97C0 +5200 +1FE0 +24A0 +3560 +C7A0 +00C0 +ENDCHAR +STARTCHAR U_7AEE +ENCODING 31470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FFE0 +0620 +9540 +57E0 +5540 +27E0 +3540 +CA40 +1440 +ENDCHAR +STARTCHAR U_7AEF +ENCODING 31471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4520 +F7E0 +0000 +AFE0 +A100 +AFE0 +4AA0 +6AA0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_7AF0 +ENCODING 31472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +FBE0 +0AA0 +9BE0 +9AA0 +6BE0 +3880 +CBE0 +1080 +27E0 +ENDCHAR +STARTCHAR U_7AF1 +ENCODING 31473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F540 +07C0 +9540 +9FE0 +20A0 +3FE0 +C480 +0280 +0100 +ENDCHAR +STARTCHAR U_7AF2 +ENCODING 31474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +4280 +2FE0 +FD60 +0BA0 +9FE0 +5000 +27C0 +3540 +C540 +07C0 +ENDCHAR +STARTCHAR U_7AF3 +ENCODING 31475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4F40 +2AA0 +F440 +8BA0 +5000 +57C0 +2440 +37C0 +C280 +1FE0 +ENDCHAR +STARTCHAR U_7AF4 +ENCODING 31476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4FE0 +F280 +0FE0 +AAA0 +AFE0 +4820 +3FE0 +C240 +0240 +00C0 +ENDCHAR +STARTCHAR U_7AF5 +ENCODING 31477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2040 +FFE0 +0B40 +9FE0 +5040 +6FE0 +3AA0 +CFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_7AF6 +ENCODING 31478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5140 +FFE0 +0000 +FBE0 +8A20 +FBE0 +2180 +6AA0 +B4E0 +ENDCHAR +STARTCHAR U_7AF7 +ENCODING 31479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +5180 +FE40 +8BE0 +FA80 +8BE0 +FA20 +2640 +F980 +2660 +ENDCHAR +STARTCHAR U_7AF8 +ENCODING 31480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5280 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +5280 +5AA0 +9460 +ENDCHAR +STARTCHAR U_7AF9 +ENCODING 31481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +7BE0 +5280 +9480 +1080 +1080 +1080 +1080 +1080 +1380 +ENDCHAR +STARTCHAR U_7AFA +ENCODING 31482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8840 +0000 +3F80 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_7AFB +ENCODING 31483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8A40 +0400 +7FC0 +0440 +0440 +0840 +1240 +6180 +ENDCHAR +STARTCHAR U_7AFC +ENCODING 31484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +1F00 +1100 +1500 +1300 +1120 +2120 +40E0 +ENDCHAR +STARTCHAR U_7AFD +ENCODING 31485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1040 +3F80 +0400 +FFE0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_7AFE +ENCODING 31486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5140 +8A40 +0400 +2780 +3C80 +E480 +25A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7AFF +ENCODING 31487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +3F80 +0400 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7B00 +ENCODING 31488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8C40 +7FE0 +1000 +1000 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR U_7B01 +ENCODING 31489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +0000 +7FC0 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B02 +ENCODING 31490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5680 +9440 +3F00 +0900 +1900 +0D20 +0B20 +1120 +20E0 +ENDCHAR +STARTCHAR U_7B03 +ENCODING 31491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +7F00 +2100 +3FC0 +0040 +FF40 +0040 +0180 +ENDCHAR +STARTCHAR U_7B04 +ENCODING 31492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +9240 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B05 +ENCODING 31493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +3B80 +0400 +1B00 +60C0 +1200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_7B06 +ENCODING 31494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +3FC0 +2240 +2240 +3FC0 +2020 +2020 +3FE0 +ENDCHAR +STARTCHAR U_7B07 +ENCODING 31495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5500 +8C80 +0400 +7FE0 +0400 +0700 +0480 +0480 +0400 +ENDCHAR +STARTCHAR U_7B08 +ENCODING 31496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BF40 +1200 +13C0 +1880 +2500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_7B09 +ENCODING 31497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A840 +3FC0 +4840 +8440 +0040 +0640 +3840 +0180 +ENDCHAR +STARTCHAR U_7B0A +ENCODING 31498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +1080 +3F80 +2500 +2500 +2500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_7B0B +ENCODING 31499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5280 +BFC0 +0480 +FFE0 +0480 +3F80 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_7B0C +ENCODING 31500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +0200 +2200 +7FC0 +0A00 +1200 +E200 +0600 +ENDCHAR +STARTCHAR U_7B0D +ENCODING 31501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +0400 +7FC0 +4440 +4A40 +5140 +6040 +40C0 +ENDCHAR +STARTCHAR U_7B0E +ENCODING 31502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5280 +8C40 +3F80 +0000 +FFE0 +0900 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7B0F +ENCODING 31503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4200 +7BC0 +9500 +2000 +3F80 +4A80 +9280 +2480 +4880 +1080 +2300 +ENDCHAR +STARTCHAR U_7B10 +ENCODING 31504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +0400 +FFE0 +0000 +1F00 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_7B11 +ENCODING 31505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +0380 +3C00 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7B12 +ENCODING 31506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9280 +0E40 +3180 +C460 +0200 +3F80 +0100 +0200 +0400 +ENDCHAR +STARTCHAR U_7B13 +ENCODING 31507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +4200 +4240 +7A80 +4300 +4A20 +5220 +E1E0 +ENDCHAR +STARTCHAR U_7B14 +ENCODING 31508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8F40 +7800 +0F00 +7800 +0FC0 +F800 +0820 +07E0 +ENDCHAR +STARTCHAR U_7B15 +ENCODING 31509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +3F80 +2080 +2480 +2680 +0620 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_7B16 +ENCODING 31510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +2080 +2880 +2500 +2100 +3A80 +2440 +1820 +ENDCHAR +STARTCHAR U_7B17 +ENCODING 31511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +1F80 +E900 +0600 +1980 +E460 +0A00 +0400 +ENDCHAR +STARTCHAR U_7B18 +ENCODING 31512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8400 +07C0 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_7B19 +ENCODING 31513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0A40 +1200 +3FC0 +4200 +1F80 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_7B1A +ENCODING 31514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +3FC0 +2440 +3FC0 +2440 +3FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B1B +ENCODING 31515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7B1C +ENCODING 31516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5480 +8C00 +2480 +2480 +3F80 +0400 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7B1D +ENCODING 31517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +FFC0 +4040 +5F40 +4A40 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_7B1E +ENCODING 31518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0900 +1080 +3F40 +0000 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7B1F +ENCODING 31519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +5280 +CD40 +3E00 +2900 +2900 +2880 +4A80 +4E60 +9A40 +ENDCHAR +STARTCHAR U_7B20 +ENCODING 31520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +0400 +7FC0 +0100 +1100 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7B21 +ENCODING 31521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +C880 +1F00 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_7B22 +ENCODING 31522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9080 +7FC0 +4040 +7FC0 +4400 +7FE0 +4220 +5920 +60E0 +ENDCHAR +STARTCHAR U_7B23 +ENCODING 31523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9280 +2840 +3FC0 +4040 +BE40 +2240 +3E80 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7B24 +ENCODING 31524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +7FC0 +0440 +0940 +1080 +7FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_7B25 +ENCODING 31525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +8A80 +3FC0 +0040 +7F40 +0040 +3E40 +2240 +3E40 +00C0 +ENDCHAR +STARTCHAR U_7B26 +ENCODING 31526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8440 +1080 +2FE0 +6080 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_7B27 +ENCODING 31527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FBC0 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_7B28 +ENCODING 31528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +9440 +0400 +FFE0 +1500 +2480 +5F40 +8420 +0400 +ENDCHAR +STARTCHAR U_7B29 +ENCODING 31529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5080 +8D40 +1480 +27E0 +FC00 +2200 +2240 +2140 +2080 +ENDCHAR +STARTCHAR U_7B2A +ENCODING 31530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +0840 +1F80 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_7B2B +ENCODING 31531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8A40 +2380 +3E00 +2200 +3FE0 +1220 +22C0 +C200 +ENDCHAR +STARTCHAR U_7B2C +ENCODING 31532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +BFC0 +0440 +7FC0 +4400 +7FE0 +1420 +24C0 +C400 +ENDCHAR +STARTCHAR U_7B2D +ENCODING 31533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +1500 +2480 +7FC0 +0080 +0900 +0600 +0100 +ENDCHAR +STARTCHAR U_7B2E +ENCODING 31534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +1FE0 +2400 +47C0 +0400 +07C0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B2F +ENCODING 31535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2840 +FBE0 +5240 +5240 +5180 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_7B30 +ENCODING 31536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9240 +0920 +7FC0 +0940 +7FC0 +4900 +7FE0 +0920 +3140 +ENDCHAR +STARTCHAR U_7B31 +ENCODING 31537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2440 +3FC0 +4040 +9E40 +1240 +1E40 +0040 +0180 +ENDCHAR +STARTCHAR U_7B32 +ENCODING 31538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +1080 +3FC0 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B33 +ENCODING 31539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A040 +21E0 +7D20 +2520 +2520 +2520 +55E0 +8920 +ENDCHAR +STARTCHAR U_7B34 +ENCODING 31540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7FE0 +0080 +3C80 +2480 +3C80 +0280 +0100 +ENDCHAR +STARTCHAR U_7B35 +ENCODING 31541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A840 +17C0 +4C40 +3440 +1580 +6420 +2420 +23E0 +ENDCHAR +STARTCHAR U_7B36 +ENCODING 31542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +A440 +3FC0 +4400 +3FE0 +0A00 +0900 +10E0 +6040 +ENDCHAR +STARTCHAR U_7B37 +ENCODING 31543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +4840 +93C0 +6A40 +4A40 +5B40 +6A80 +1200 +6200 +ENDCHAR +STARTCHAR U_7B38 +ENCODING 31544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8800 +3FC0 +2000 +2F80 +2880 +2F80 +2000 +3FE0 +ENDCHAR +STARTCHAR U_7B39 +ENCODING 31545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2900 +C480 +1500 +FFE0 +1500 +1500 +1700 +1000 +1FC0 +ENDCHAR +STARTCHAR U_7B3A +ENCODING 31546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8940 +0FC0 +7C00 +07C0 +7C80 +0320 +0620 +79E0 +ENDCHAR +STARTCHAR U_7B3B +ENCODING 31547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +7FC0 +1240 +1240 +1240 +1EC0 +E200 +0200 +ENDCHAR +STARTCHAR U_7B3C +ENCODING 31548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0A40 +0900 +FFE0 +0A80 +0A80 +1320 +2620 +49E0 +ENDCHAR +STARTCHAR U_7B3D +ENCODING 31549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8840 +0000 +3F80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_7B3E +ENCODING 31550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +4200 +2FC0 +E240 +2240 +2540 +28C0 +7000 +8FE0 +ENDCHAR +STARTCHAR U_7B3F +ENCODING 31551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BC0 +5500 +9F80 +2900 +4600 +0900 +10E0 +FF40 +1100 +1F00 +ENDCHAR +STARTCHAR U_7B40 +ENCODING 31552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +9480 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B41 +ENCODING 31553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1840 +0A00 +7FC0 +4A40 +7FC0 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_7B42 +ENCODING 31554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +7FE0 +9480 +4900 +25C0 +4F40 +3540 +15C0 +6520 +23E0 +ENDCHAR +STARTCHAR U_7B43 +ENCODING 31555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +9280 +7FC0 +4440 +5F40 +4440 +4A40 +5140 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7B44 +ENCODING 31556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +4A80 +2B00 +1A80 +6A40 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7B45 +ENCODING 31557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1440 +3FC0 +4400 +FFE0 +0900 +0920 +1120 +60E0 +ENDCHAR +STARTCHAR U_7B46 +ENCODING 31558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9440 +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7B47 +ENCODING 31559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7DE0 +1120 +1140 +1140 +1D20 +61C0 +0100 +ENDCHAR +STARTCHAR U_7B48 +ENCODING 31560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A40 +8180 +3E00 +0200 +7FE0 +0200 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7B49 +ENCODING 31561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +0100 +7FC0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_7B4A +ENCODING 31562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +FFE0 +1080 +3140 +4A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7B4B +ENCODING 31563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8940 +7900 +4FE0 +7920 +4920 +7920 +4A20 +9CC0 +ENDCHAR +STARTCHAR U_7B4C +ENCODING 31564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +3300 +C0E0 +1F00 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B4D +ENCODING 31565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9440 +3FC0 +4040 +BE40 +2240 +3E40 +2240 +3E40 +0180 +ENDCHAR +STARTCHAR U_7B4E +ENCODING 31566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +11E0 +FD20 +2920 +4920 +3120 +49E0 +8520 +ENDCHAR +STARTCHAR U_7B4F +ENCODING 31567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +4C40 +9280 +1240 +23E0 +6E40 +A180 +2120 +22A0 +2C60 +ENDCHAR +STARTCHAR U_7B50 +ENCODING 31568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7FE0 +4200 +4F80 +4200 +5FC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_7B51 +ENCODING 31569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0000 +F780 +2480 +2680 +2580 +3480 +C8A0 +10E0 +ENDCHAR +STARTCHAR U_7B52 +ENCODING 31570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +7FC0 +4040 +5F40 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7B53 +ENCODING 31571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8840 +7BC0 +1100 +1100 +FBE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B54 +ENCODING 31572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5680 +8A40 +3180 +DF60 +0000 +1F80 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_7B55 +ENCODING 31573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9840 +23C0 +C800 +17E0 +3080 +D080 +1280 +1100 +ENDCHAR +STARTCHAR U_7B56 +ENCODING 31574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4E40 +5540 +2480 +C460 +ENDCHAR +STARTCHAR U_7B57 +ENCODING 31575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9940 +2100 +6FC0 +A940 +2940 +2FC0 +2100 +2100 +ENDCHAR +STARTCHAR U_7B58 +ENCODING 31576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +2000 +FBE0 +2220 +3A20 +E220 +23E0 +E220 +ENDCHAR +STARTCHAR U_7B59 +ENCODING 31577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BF40 +0400 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7B5A +ENCODING 31578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +4240 +7B80 +4220 +79E0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B5B +ENCODING 31579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0840 +AFE0 +A100 +AFE0 +A920 +2920 +4960 +8100 +ENDCHAR +STARTCHAR U_7B5C +ENCODING 31580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8840 +2480 +1500 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_7B5D +ENCODING 31581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +9140 +7F80 +0480 +FFE0 +0480 +3F80 +0400 +1C00 +ENDCHAR +STARTCHAR U_7B5E +ENCODING 31582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FE0 +8420 +7FE0 +0E00 +1580 +6460 +0400 +ENDCHAR +STARTCHAR U_7B5F +ENCODING 31583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +01E0 +7E40 +0A80 +3FC0 +0100 +FFE0 +0200 +0600 +ENDCHAR +STARTCHAR U_7B60 +ENCODING 31584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +A500 +0200 +27E0 +F820 +2720 +2020 +3920 +C620 +00C0 +ENDCHAR +STARTCHAR U_7B61 +ENCODING 31585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +1B00 +E0E0 +1F00 +0400 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7B62 +ENCODING 31586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +27C0 +FD40 +2540 +37C0 +E420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_7B63 +ENCODING 31587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7140 +1140 +FD40 +1940 +3540 +5240 +90C0 +ENDCHAR +STARTCHAR U_7B64 +ENCODING 31588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +3F80 +2080 +3F80 +2080 +3FA0 +2140 +38E0 +ENDCHAR +STARTCHAR U_7B65 +ENCODING 31589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +3F80 +2080 +3F80 +0000 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_7B66 +ENCODING 31590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A480 +7FE0 +4020 +1F80 +0000 +7FC0 +0900 +1120 +E0E0 +ENDCHAR +STARTCHAR U_7B67 +ENCODING 31591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5240 +BFA0 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7B68 +ENCODING 31592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +3580 +DF60 +0200 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7B69 +ENCODING 31593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7F80 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +ENDCHAR +STARTCHAR U_7B6A +ENCODING 31594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_7B6B +ENCODING 31595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7B6C +ENCODING 31596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +7FE0 +4200 +7A80 +4980 +4920 +52A0 +8460 +ENDCHAR +STARTCHAR U_7B6D +ENCODING 31597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +7FC0 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_7B6E +ENCODING 31598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +7FE0 +2480 +2480 +5540 +8E20 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B6F +ENCODING 31599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8940 +7900 +4BC0 +7940 +4940 +5A40 +E240 +0480 +ENDCHAR +STARTCHAR U_7B70 +ENCODING 31600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +4480 +9440 +27E0 +6A00 +A3C0 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_7B71 +ENCODING 31601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9240 +2A00 +2BE0 +6E80 +AA80 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_7B72 +ENCODING 31602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A440 +1480 +3FC0 +2040 +3FC0 +2040 +3FC0 +20C0 +ENDCHAR +STARTCHAR U_7B73 +ENCODING 31603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +F840 +1780 +2100 +37C0 +5100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7B74 +ENCODING 31604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +7FE0 +2480 +34C0 +4D20 +8A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7B75 +ENCODING 31605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +EF80 +4100 +F5E0 +5500 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7B76 +ENCODING 31606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2440 +3FC0 +4400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7B77 +ENCODING 31607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +A200 +2FC0 +B240 +A240 +BFE0 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_7B78 +ENCODING 31608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +3F80 +2080 +3F80 +2080 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7B79 +ENCODING 31609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +0800 +3F80 +1000 +FFE0 +2100 +7FE0 +9100 +0B00 +ENDCHAR +STARTCHAR U_7B7A +ENCODING 31610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8860 +7FC0 +4200 +5FC0 +4280 +5FC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_7B7B +ENCODING 31611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +1440 +FFE0 +4440 +7FC0 +4440 +7FC0 +1400 +0800 +F7E0 +ENDCHAR +STARTCHAR U_7B7C +ENCODING 31612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9F40 +1100 +3F80 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_7B7D +ENCODING 31613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +3F80 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7B7E +ENCODING 31614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8440 +0A00 +3180 +DF60 +2480 +2500 +1100 +7FE0 +ENDCHAR +STARTCHAR U_7B7F +ENCODING 31615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +6900 +0600 +79E0 +0400 +FFE0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7B80 +ENCODING 31616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +27C0 +5040 +4F40 +4940 +4F40 +4940 +4F40 +40C0 +ENDCHAR +STARTCHAR U_7B81 +ENCODING 31617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +8440 +3F80 +1100 +FFC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7B82 +ENCODING 31618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1440 +7FE0 +2480 +5540 +8E20 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7B83 +ENCODING 31619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FC40 +4BE0 +7A40 +4A40 +7940 +4880 +F940 +0E20 +ENDCHAR +STARTCHAR U_7B84 +ENCODING 31620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +2440 +3FC0 +2440 +3FC0 +1200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7B85 +ENCODING 31621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +BF80 +2480 +3F80 +2480 +FFE0 +1100 +1100 +6100 +ENDCHAR +STARTCHAR U_7B86 +ENCODING 31622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4440 +5B40 +0000 +4240 +7B80 +4220 +71E0 +ENDCHAR +STARTCHAR U_7B87 +ENCODING 31623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4200 +7BC0 +A500 +FFC0 +8840 +BF40 +8840 +9E40 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_7B88 +ENCODING 31624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5040 +2280 +9440 +67A0 +2000 +C7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_7B89 +ENCODING 31625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +27C0 +F440 +27C0 +3100 +EFE0 +2120 +2220 +6C60 +ENDCHAR +STARTCHAR U_7B8A +ENCODING 31626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FD80 +2240 +3D20 +24C0 +2400 +5580 +8840 +ENDCHAR +STARTCHAR U_7B8B +ENCODING 31627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +0A40 +7F80 +0520 +7FE0 +0900 +7FC0 +04A0 +0520 +7BE0 +ENDCHAR +STARTCHAR U_7B8C +ENCODING 31628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FE20 +2520 +7B20 +1120 +7D20 +1020 +FCE0 +ENDCHAR +STARTCHAR U_7B8D +ENCODING 31629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5280 +AA40 +2FE0 +F880 +2BE0 +3AA0 +EAA0 +2AE0 +2880 +EFE0 +ENDCHAR +STARTCHAR U_7B8E +ENCODING 31630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5480 +8FC0 +0400 +7FE0 +4420 +5F00 +4440 +4FC0 +4920 +B0E0 +ENDCHAR +STARTCHAR U_7B8F +ENCODING 31631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +2900 +7F80 +0480 +FFE0 +0480 +7F80 +0400 +0C00 +ENDCHAR +STARTCHAR U_7B90 +ENCODING 31632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_7B91 +ENCODING 31633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0480 +FFE0 +0480 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7B92 +ENCODING 31634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +0080 +FFE0 +8420 +3F80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_7B93 +ENCODING 31635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7F80 +0080 +FFE0 +2480 +1F00 +E480 +0860 +ENDCHAR +STARTCHAR U_7B94 +ENCODING 31636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A940 +47E0 +3420 +1420 +67E0 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_7B95 +ENCODING 31637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9500 +7FE0 +1100 +1D00 +1700 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7B96 +ENCODING 31638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +2100 +FFE0 +3180 +6B40 +A520 +2920 +2100 +ENDCHAR +STARTCHAR U_7B97 +ENCODING 31639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5240 +BF80 +2080 +3F80 +2080 +3F80 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_7B98 +ENCODING 31640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4140 +5E40 +4440 +7FC0 +4E40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_7B99 +ENCODING 31641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7BE0 +4A20 +7A40 +4BE0 +7AA0 +4A40 +9AA0 +ENDCHAR +STARTCHAR U_7B9A +ENCODING 31642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9840 +2540 +7D40 +8140 +7D40 +4540 +7C40 +44C0 +ENDCHAR +STARTCHAR U_7B9B +ENCODING 31643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +FFC0 +1540 +3D40 +E540 +2540 +25A0 +E920 +ENDCHAR +STARTCHAR U_7B9C +ENCODING 31644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +FFE0 +9120 +2080 +5F40 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B9D +ENCODING 31645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +A840 +2240 +FFE0 +2240 +3A40 +E3C0 +2240 +E3C0 +ENDCHAR +STARTCHAR U_7B9E +ENCODING 31646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +7FC0 +0800 +FFE0 +1280 +7660 +9080 +0F80 +ENDCHAR +STARTCHAR U_7B9F +ENCODING 31647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +3F80 +2080 +3F80 +2240 +3B80 +2220 +39E0 +ENDCHAR +STARTCHAR U_7BA0 +ENCODING 31648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +0400 +FFC0 +2480 +FFE0 +2480 +7FC0 +0400 +3F80 +ENDCHAR +STARTCHAR U_7BA1 +ENCODING 31649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FFE0 +8020 +3F80 +2080 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7BA2 +ENCODING 31650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +FFE0 +A020 +3FC0 +2A40 +5AC0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7BA3 +ENCODING 31651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BC40 +1140 +7D40 +5540 +5540 +3940 +5440 +10C0 +ENDCHAR +STARTCHAR U_7BA4 +ENCODING 31652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +7FC0 +2100 +5280 +8C40 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7BA5 +ENCODING 31653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A940 +2FE0 +C900 +2BC0 +AA40 +4980 +5260 +1440 +ENDCHAR +STARTCHAR U_7BA6 +ENCODING 31654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7BA7 +ENCODING 31655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9080 +7FE0 +4200 +5FC0 +4A80 +7FE0 +4500 +4880 +7FE0 +ENDCHAR +STARTCHAR U_7BA8 +ENCODING 31656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8FC0 +2240 +F780 +2160 +37C0 +E100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_7BA9 +ENCODING 31657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +5240 +7FC0 +0800 +1F80 +6900 +0E00 +7000 +ENDCHAR +STARTCHAR U_7BAA +ENCODING 31658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8940 +3F80 +2480 +3F80 +2480 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7BAB +ENCODING 31659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0440 +FFE0 +0440 +7FC0 +5540 +64C0 +8440 +ENDCHAR +STARTCHAR U_7BAC +ENCODING 31660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1140 +FFE0 +1500 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7BAD +ENCODING 31661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0A00 +FFE0 +4840 +7940 +4940 +7940 +4840 +59C0 +ENDCHAR +STARTCHAR U_7BAE +ENCODING 31662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7BAF +ENCODING 31663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +9FE0 +2940 +2FC0 +6940 +AFC0 +2900 +2600 +39E0 +ENDCHAR +STARTCHAR U_7BB0 +ENCODING 31664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4A80 +BFE0 +2520 +2920 +7F60 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7BB1 +ENCODING 31665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +9440 +7FC0 +1240 +3BC0 +5640 +93C0 +1240 +13C0 +ENDCHAR +STARTCHAR U_7BB2 +ENCODING 31666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +2FC0 +5200 +5FE0 +2500 +C500 +4920 +50E0 +ENDCHAR +STARTCHAR U_7BB3 +ENCODING 31667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +5080 +7FC0 +4900 +BFC0 +9100 +ENDCHAR +STARTCHAR U_7BB4 +ENCODING 31668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1140 +7FE0 +4100 +5D40 +4140 +5CA0 +9560 +9E20 +ENDCHAR +STARTCHAR U_7BB5 +ENCODING 31669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +0480 +1540 +6220 +1FC0 +F040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_7BB6 +ENCODING 31670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8BC0 +2240 +7BC0 +2240 +7BC0 +4A40 +7A40 +0480 +ENDCHAR +STARTCHAR U_7BB7 +ENCODING 31671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FBE0 +4500 +75C0 +5F40 +5540 +9420 +B3E0 +ENDCHAR +STARTCHAR U_7BB8 +ENCODING 31672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +8440 +3E80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_7BB9 +ENCODING 31673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +AA40 +43E0 +F420 +2220 +4920 +F520 +5020 +A8C0 +ENDCHAR +STARTCHAR U_7BBA +ENCODING 31674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8C40 +7FC0 +0400 +FFE0 +3180 +5F40 +9120 +1F00 +ENDCHAR +STARTCHAR U_7BBB +ENCODING 31675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8FC0 +2240 +5FE0 +A240 +4FC0 +C200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_7BBC +ENCODING 31676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +4900 +5F80 +4400 +8400 +BFE0 +ENDCHAR +STARTCHAR U_7BBD +ENCODING 31677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FC0 +4A80 +BF00 +0400 +FFE0 +2D80 +3680 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7BBE +ENCODING 31678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +5540 +7D40 +4540 +7D40 +4540 +7C40 +45C0 +ENDCHAR +STARTCHAR U_7BBF +ENCODING 31679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +7FE0 +2080 +3F80 +20E0 +FF80 +0080 +ENDCHAR +STARTCHAR U_7BC0 +ENCODING 31680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FDE0 +4520 +7D20 +4520 +7D20 +4920 +5560 +6500 +ENDCHAR +STARTCHAR U_7BC1 +ENCODING 31681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5500 +BF80 +2080 +3F80 +2080 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7BC2 +ENCODING 31682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +3F80 +2080 +3F80 +2400 +7F80 +8400 +FFE0 +ENDCHAR +STARTCHAR U_7BC3 +ENCODING 31683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_7BC4 +ENCODING 31684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5240 +FFE0 +5520 +7D20 +5520 +7D60 +1100 +FF20 +10E0 +ENDCHAR +STARTCHAR U_7BC5 +ENCODING 31685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +4840 +7FC0 +0000 +FFE0 +0400 +7FC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_7BC6 +ENCODING 31686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8F40 +1100 +FFE0 +2C80 +5700 +2A80 +1240 +6C20 +ENDCHAR +STARTCHAR U_7BC7 +ENCODING 31687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +2040 +3FC0 +2000 +3FE0 +3520 +5FE0 +9560 +ENDCHAR +STARTCHAR U_7BC8 +ENCODING 31688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +B840 +13E0 +FC40 +1240 +7D40 +1040 +1C40 +E080 +ENDCHAR +STARTCHAR U_7BC9 +ENCODING 31689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FF80 +24A0 +26A0 +F9E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7BCA +ENCODING 31690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +8480 +5FE0 +A480 +5FE0 +C480 +4840 +5020 +ENDCHAR +STARTCHAR U_7BCB +ENCODING 31691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4200 +7FE0 +5280 +6F40 +4500 +4880 +7FE0 +ENDCHAR +STARTCHAR U_7BCC +ENCODING 31692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +17C0 +2040 +6FE0 +A900 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7BCD +ENCODING 31693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +CA80 +7540 +2100 +F540 +2580 +7100 +AA80 +2440 +2820 +ENDCHAR +STARTCHAR U_7BCE +ENCODING 31694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +F100 +9540 +F520 +9940 +F040 +9180 +F600 +ENDCHAR +STARTCHAR U_7BCF +ENCODING 31695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +4BE0 +FA40 +4D00 +7900 +4A80 +7A80 +0C60 +ENDCHAR +STARTCHAR U_7BD0 +ENCODING 31696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A840 +FFE0 +2880 +7BE0 +6AA0 +AAA0 +2880 +2FE0 +ENDCHAR +STARTCHAR U_7BD1 +ENCODING 31697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +3F80 +2480 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7BD2 +ENCODING 31698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9A40 +6180 +BF60 +2100 +3F40 +2480 +2B00 +30C0 +ENDCHAR +STARTCHAR U_7BD3 +ENCODING 31699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9080 +2500 +FFE0 +2480 +4840 +FFE0 +1100 +0F00 +F0E0 +ENDCHAR +STARTCHAR U_7BD4 +ENCODING 31700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +1080 +3FC0 +2040 +3FC0 +2040 +3FC0 +E0E0 +ENDCHAR +STARTCHAR U_7BD5 +ENCODING 31701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +9FC0 +0400 +FFE0 +1100 +2080 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7BD6 +ENCODING 31702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FC0 +4480 +7FE0 +4480 +5F80 +9080 +9F80 +ENDCHAR +STARTCHAR U_7BD7 +ENCODING 31703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +3FC0 +E400 +3F80 +2400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7BD8 +ENCODING 31704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3FC0 +5540 +1F40 +0440 +3FC0 +5540 +1F40 +0840 +71C0 +ENDCHAR +STARTCHAR U_7BD9 +ENCODING 31705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +1100 +1F00 +0000 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7BDA +ENCODING 31706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +7FE0 +4500 +7DE0 +4500 +5DC0 +4500 +7DE0 +4500 +7FE0 +ENDCHAR +STARTCHAR U_7BDB +ENCODING 31707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +FBE0 +0820 +FBE0 +8200 +FBE0 +4920 +28A0 +F3C0 +ENDCHAR +STARTCHAR U_7BDC +ENCODING 31708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F20 +0540 +7480 +2440 +CC20 +3FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7BDD +ENCODING 31709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9540 +7FE0 +1100 +FFE0 +1500 +FFE0 +2480 +FFE0 +2180 +ENDCHAR +STARTCHAR U_7BDE +ENCODING 31710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FC0 +2440 +87C0 +5440 +27C0 +C100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_7BDF +ENCODING 31711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +1FE0 +2100 +2FC0 +6100 +BFE0 +2840 +2FC0 +2840 +28C0 +ENDCHAR +STARTCHAR U_7BE0 +ENCODING 31712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +23C0 +5680 +5900 +D6E0 +5100 +5FE0 +5540 +4B20 +ENDCHAR +STARTCHAR U_7BE1 +ENCODING 31713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +2080 +3F80 +2080 +FFE0 +2500 +4880 +9160 +3E80 +ENDCHAR +STARTCHAR U_7BE2 +ENCODING 31714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +0400 +7FE0 +2040 +3FC0 +2040 +3FC0 +E0E0 +ENDCHAR +STARTCHAR U_7BE3 +ENCODING 31715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +1100 +FFE0 +8420 +7FC0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_7BE4 +ENCODING 31716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5480 +BFE0 +2200 +3FC0 +2200 +3FC0 +2200 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_7BE5 +ENCODING 31717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +0A00 +7FC0 +4A40 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7BE6 +ENCODING 31718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4A40 +5540 +7FC0 +4280 +7B20 +4220 +79E0 +ENDCHAR +STARTCHAR U_7BE7 +ENCODING 31719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0840 +FFE0 +9220 +3FC0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7BE8 +ENCODING 31720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9240 +E700 +A8C0 +DFA0 +A200 +BFE0 +EA80 +9240 +A620 +ENDCHAR +STARTCHAR U_7BE9 +ENCODING 31721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A7E0 +7880 +4BE0 +7AA0 +42A0 +7AA0 +4AE0 +7880 +ENDCHAR +STARTCHAR U_7BEA +ENCODING 31722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +4400 +5FE0 +5420 +5F80 +5440 +A7C0 +A520 +D9E0 +ENDCHAR +STARTCHAR U_7BEB +ENCODING 31723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FF80 +26A0 +FDE0 +0400 +7FC0 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7BEC +ENCODING 31724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8E40 +9180 +6460 +BF80 +3080 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_7BED +ENCODING 31725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +1100 +FFE0 +2480 +2480 +3F80 +0420 +03E0 +ENDCHAR +STARTCHAR U_7BEE +ENCODING 31726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8A00 +53C0 +5280 +5440 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7BEF +ENCODING 31727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +B940 +47C0 +F900 +27E0 +F940 +2140 +30A0 +2760 +ENDCHAR +STARTCHAR U_7BF0 +ENCODING 31728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21E0 +FD20 +4940 +FDC0 +0120 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_7BF1 +ENCODING 31729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +2A80 +2480 +3F80 +0400 +7FC0 +4940 +5F40 +ENDCHAR +STARTCHAR U_7BF2 +ENCODING 31730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +1080 +FBE0 +1080 +7F80 +0080 +7F80 +0080 +7F80 +ENDCHAR +STARTCHAR U_7BF3 +ENCODING 31731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4440 +7FC0 +1500 +FFE0 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_7BF4 +ENCODING 31732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +4FE0 +2620 +EB40 +2580 +2B40 +2520 +7200 +8FE0 +ENDCHAR +STARTCHAR U_7BF5 +ENCODING 31733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A440 +4A40 +B3A0 +4100 +C5C0 +4500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_7BF6 +ENCODING 31734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2200 +FFE0 +2000 +3FC0 +0040 +5540 +8AC0 +ENDCHAR +STARTCHAR U_7BF7 +ENCODING 31735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5380 +0280 +5D60 +2100 +E7C0 +2100 +3FC0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_7BF8 +ENCODING 31736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +AC80 +1100 +3F80 +4A40 +FFC0 +1200 +2980 +D460 +1900 +0600 +ENDCHAR +STARTCHAR U_7BF9 +ENCODING 31737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3FC0 +2040 +3FC0 +2040 +FFE0 +1080 +3F40 +D2A0 +1F80 +ENDCHAR +STARTCHAR U_7BFA +ENCODING 31738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AFC0 +2540 +FFC0 +2540 +37C0 +E280 +2FE0 +6080 +ENDCHAR +STARTCHAR U_7BFB +ENCODING 31739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7BFC +ENCODING 31740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +5280 +8400 +6F60 +4920 +4F20 +6960 +0F00 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7BFD +ENCODING 31741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2840 +4FE0 +B4A0 +5FA0 +C4A0 +56E0 +5480 +5F80 +ENDCHAR +STARTCHAR U_7BFE +ENCODING 31742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4A40 +7FC0 +0480 +7FC0 +52A0 +4B20 +9CE0 +ENDCHAR +STARTCHAR U_7BFF +ENCODING 31743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +4440 +7FC0 +4440 +7FC0 +00A0 +FFE0 +1080 +0B80 +ENDCHAR +STARTCHAR U_7C00 +ENCODING 31744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7C01 +ENCODING 31745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2100 +45C0 +9500 +2FE0 +6100 +A5E0 +2500 +3BE0 +ENDCHAR +STARTCHAR U_7C02 +ENCODING 31746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +42A0 +7FE0 +4A20 +7AA0 +4120 +7AA0 +4460 +7FE0 +ENDCHAR +STARTCHAR U_7C03 +ENCODING 31747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9280 +F3C0 +2640 +F980 +23E0 +7440 +AA80 +A100 +2E00 +ENDCHAR +STARTCHAR U_7C04 +ENCODING 31748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5480 +BFC0 +2040 +3FC0 +2F80 +2A80 +2FA0 +4820 +87E0 +ENDCHAR +STARTCHAR U_7C05 +ENCODING 31749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0900 +7FE0 +5200 +5FC0 +6200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7C06 +ENCODING 31750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +8120 +79E0 +0100 +FFC0 +5280 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_7C07 +ENCODING 31751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2200 +FFE0 +4200 +73E0 +5500 +57E0 +5280 +AC60 +ENDCHAR +STARTCHAR U_7C08 +ENCODING 31752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +BFE0 +2020 +3FE0 +2440 +3EE0 +2440 +5EE0 +8840 +ENDCHAR +STARTCHAR U_7C09 +ENCODING 31753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0900 +8FC0 +5100 +EFE0 +2840 +2FC0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7C0A +ENCODING 31754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +1100 +1F00 +1100 +FFE0 +2480 +DF60 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7C0B +ENCODING 31755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +3F80 +2480 +3F80 +2280 +21E0 +7F80 +5280 +FFE0 +ENDCHAR +STARTCHAR U_7C0C +ENCODING 31756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1100 +FFE0 +5420 +7C80 +1080 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_7C0D +ENCODING 31757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +E4E0 +3F80 +2480 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_7C0E +ENCODING 31758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +2280 +F7E0 +2280 +3FE0 +E440 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_7C0F +ENCODING 31759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4A40 +7FC0 +4000 +5100 +5DA0 +9120 +9DE0 +ENDCHAR +STARTCHAR U_7C10 +ENCODING 31760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7D00 +55E0 +7E20 +5480 +7C80 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_7C11 +ENCODING 31761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +2080 +FFE0 +2080 +3FA0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_7C12 +ENCODING 31762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +BFC0 +3480 +2A80 +3F80 +0800 +FFE0 +5540 +AFA0 +ENDCHAR +STARTCHAR U_7C13 +ENCODING 31763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4880 +FE40 +7A80 +5220 +7A40 +4280 +7A20 +AA40 +BF80 +ENDCHAR +STARTCHAR U_7C14 +ENCODING 31764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5500 +FFE0 +1100 +7FC0 +1100 +FFE0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_7C15 +ENCODING 31765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FD40 +27E0 +3D20 +1120 +7D20 +5520 +FDA0 +1240 +ENDCHAR +STARTCHAR U_7C16 +ENCODING 31766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +D5C0 +B900 +91E0 +FD40 +B940 +D540 +9240 +FC40 +ENDCHAR +STARTCHAR U_7C17 +ENCODING 31767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AF80 +52C0 +0AA0 +7580 +2E00 +FFE0 +1480 +E460 +ENDCHAR +STARTCHAR U_7C18 +ENCODING 31768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +3FC0 +0440 +FFE0 +5540 +7FC0 +4E40 +5540 +A4C0 +ENDCHAR +STARTCHAR U_7C19 +ENCODING 31769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FE0 +4100 +FFE0 +4920 +4FE0 +4920 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_7C1A +ENCODING 31770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +BF80 +2A80 +FFE0 +1100 +7D40 +54A0 +5CA0 +1360 +ENDCHAR +STARTCHAR U_7C1B +ENCODING 31771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +FDC0 +2500 +3DE0 +3D40 +2540 +FF40 +2540 +C240 +ENDCHAR +STARTCHAR U_7C1C +ENCODING 31772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +47C0 +2440 +97C0 +6440 +2FE0 +D4A0 +4920 +42C0 +ENDCHAR +STARTCHAR U_7C1D +ENCODING 31773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFC0 +5240 +3F80 +60C0 +BFA0 +2080 +3F80 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7C1E +ENCODING 31774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7C1F +ENCODING 31775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7C20 +ENCODING 31776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7C21 +ENCODING 31777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_7C22 +ENCODING 31778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +7BE0 +4A20 +7BE0 +4A20 +7FE0 +4920 +4620 +59E0 +ENDCHAR +STARTCHAR U_7C23 +ENCODING 31779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4440 +FFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C24 +ENCODING 31780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2A40 +3FC0 +1080 +1F80 +1080 +1F80 +30C0 +ENDCHAR +STARTCHAR U_7C25 +ENCODING 31781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +0800 +7FC0 +2080 +5F40 +9120 +7FC0 +5140 +5F40 +ENDCHAR +STARTCHAR U_7C26 +ENCODING 31782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7900 +5240 +3F80 +4040 +9FA0 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_7C27 +ENCODING 31783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9500 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C28 +ENCODING 31784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +9480 +7BC0 +4A40 +7BC0 +4220 +7FE0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C29 +ENCODING 31785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5EE0 +5280 +2940 +FFE0 +8820 +3FC0 +0840 +F380 +ENDCHAR +STARTCHAR U_7C2A +ENCODING 31786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FBE0 +A280 +FBE0 +5100 +DFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7C2B +ENCODING 31787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +0480 +FFE0 +5540 +75C0 +7FC0 +5540 +9540 +ENDCHAR +STARTCHAR U_7C2C +ENCODING 31788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7BC0 +4A40 +7D80 +2240 +A7E0 +BA40 +A240 +FBC0 +ENDCHAR +STARTCHAR U_7C2D +ENCODING 31789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +2480 +5540 +FFE0 +2080 +5FC0 +90A0 +1F80 +ENDCHAR +STARTCHAR U_7C2E +ENCODING 31790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FBC0 +2100 +FFE0 +5240 +9FA0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_7C2F +ENCODING 31791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +27E0 +FA40 +23C0 +7240 +6FE0 +A240 +2420 +ENDCHAR +STARTCHAR U_7C30 +ENCODING 31792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +8A80 +57E0 +5520 +7FE0 +4520 +77E0 +5280 +57E0 +9080 +ENDCHAR +STARTCHAR U_7C31 +ENCODING 31793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +AA40 +17E0 +FA40 +23C0 +3A40 +2FE0 +4A40 +9420 +ENDCHAR +STARTCHAR U_7C32 +ENCODING 31794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +F7C0 +5540 +77C0 +5540 +77C0 +5500 +5FE0 +B100 +ENDCHAR +STARTCHAR U_7C33 +ENCODING 31795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FD80 +2240 +FC20 +8BC0 +F880 +23E0 +FC80 +2080 +ENDCHAR +STARTCHAR U_7C34 +ENCODING 31796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4820 +7F80 +4820 +47E0 +5540 +BFE0 +8840 +ENDCHAR +STARTCHAR U_7C35 +ENCODING 31797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +FDC0 +5740 +7C80 +5560 +7FC0 +1140 +FD40 +11C0 +ENDCHAR +STARTCHAR U_7C36 +ENCODING 31798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5500 +A7C0 +1040 +FFE0 +1100 +2540 +7380 +A540 +2B20 +ENDCHAR +STARTCHAR U_7C37 +ENCODING 31799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9E80 +2240 +7FE0 +AA40 +37A0 +2000 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7C38 +ENCODING 31800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5080 +FFE0 +52A0 +73E0 +5340 +FE80 +5540 +8A20 +ENDCHAR +STARTCHAR U_7C39 +ENCODING 31801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1500 +FFE0 +9120 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7C3A +ENCODING 31802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +7FE0 +4920 +1F80 +FFE0 +2480 +DF60 +0400 +7FC0 +ENDCHAR +STARTCHAR U_7C3B +ENCODING 31803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +47C0 +2440 +E740 +2FE0 +2AA0 +2BA0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_7C3C +ENCODING 31804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +2280 +FFE0 +2280 +3FE0 +E540 +2FE0 +2440 +64C0 +ENDCHAR +STARTCHAR U_7C3D +ENCODING 31805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0C40 +3300 +CCC0 +7BC0 +4A40 +7BC0 +2A80 +C460 +ENDCHAR +STARTCHAR U_7C3E +ENCODING 31806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +4A00 +7FC0 +4A40 +7FE0 +4A40 +BFC0 +2A80 +CA60 +ENDCHAR +STARTCHAR U_7C3F +ENCODING 31807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5FE0 +2920 +9FE0 +6920 +4FE0 +C8A0 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_7C40 +ENCODING 31808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +27E0 +2AA0 +FCA0 +2920 +3FE0 +E920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_7C41 +ENCODING 31809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +21C0 +FA40 +23E0 +FA20 +AAA0 +FAA0 +22A0 +7140 +AA20 +ENDCHAR +STARTCHAR U_7C42 +ENCODING 31810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +ABE0 +7C80 +CBE0 +7AA0 +4AA0 +7AA0 +52E0 +6880 +ENDCHAR +STARTCHAR U_7C43 +ENCODING 31811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7D00 +59E0 +4A80 +7840 +5040 +7F80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_7C44 +ENCODING 31812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5240 +EFA0 +4A80 +7FE0 +4C80 +4A80 +4F80 +58C0 +7FE0 +ENDCHAR +STARTCHAR U_7C45 +ENCODING 31813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +6EC0 +4840 +6EC0 +4240 +6AC0 +4A40 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C46 +ENCODING 31814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +4A40 +9FA0 +3200 +DFC0 +1200 +1FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_7C47 +ENCODING 31815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2100 +FFE0 +B4A0 +0D00 +7600 +0D00 +74E0 +ENDCHAR +STARTCHAR U_7C48 +ENCODING 31816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +7FE0 +2880 +FEE0 +AB20 +FFA0 +1160 +FF20 +11E0 +FF20 +ENDCHAR +STARTCHAR U_7C49 +ENCODING 31817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +7FC0 +1100 +FFE0 +8020 +7F80 +1100 +7F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7C4A +ENCODING 31818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +14A0 +3C60 +15A0 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7C4B +ENCODING 31819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2480 +FFE0 +6D40 +4440 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_7C4C +ENCODING 31820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +0420 +FFE0 +5080 +5FE0 +7580 +ENDCHAR +STARTCHAR U_7C4D +ENCODING 31821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2140 +FBE0 +2140 +FFE0 +2220 +FBE0 +6A20 +A7E0 +ENDCHAR +STARTCHAR U_7C4E +ENCODING 31822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A3C0 +3D40 +2080 +3FE0 +52A0 +BAC0 +1580 +6C60 +ENDCHAR +STARTCHAR U_7C4F +ENCODING 31823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +ABC0 +17E0 +FA40 +23C0 +3A40 +2FE0 +4A40 +9420 +ENDCHAR +STARTCHAR U_7C50 +ENCODING 31824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +E540 +AFE0 +E200 +AFE0 +F540 +ABA0 +A540 +A920 +ENDCHAR +STARTCHAR U_7C51 +ENCODING 31825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5440 +BFA0 +2A80 +FFE0 +3580 +DF60 +1500 +1280 +19C0 +ENDCHAR +STARTCHAR U_7C52 +ENCODING 31826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +AFE0 +F280 +2EE0 +3AA0 +EEE0 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_7C53 +ENCODING 31827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FC0 +2540 +8FE0 +6540 +27C0 +CD60 +47C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_7C54 +ENCODING 31828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +7D00 +55E0 +FEA0 +54A0 +FEA0 +2840 +10A0 +6D20 +ENDCHAR +STARTCHAR U_7C55 +ENCODING 31829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +A5E0 +FEA0 +2540 +77E0 +6D20 +A7E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_7C56 +ENCODING 31830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5240 +BD20 +1100 +FFE0 +6D40 +2940 +6DA0 +2AA0 +FC60 +ENDCHAR +STARTCHAR U_7C57 +ENCODING 31831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +D520 +A4A0 +7FC0 +A400 +3FC0 +2400 +3FE0 +ENDCHAR +STARTCHAR U_7C58 +ENCODING 31832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +FFA0 +5100 +7FE0 +5540 +7AA0 +5780 +5540 +BB20 +ENDCHAR +STARTCHAR U_7C59 +ENCODING 31833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +71C0 +8840 +77E0 +24A0 +FAC0 +A9A0 +76A0 +F980 +ENDCHAR +STARTCHAR U_7C5A +ENCODING 31834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +7FE0 +4220 +7FC0 +5260 +5FC0 +5240 +7FE0 +A520 +BFE0 +ENDCHAR +STARTCHAR U_7C5B +ENCODING 31835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +AC80 +5240 +8FE0 +F900 +26E0 +FA80 +AFE0 +7140 +21A0 +FEE0 +ENDCHAR +STARTCHAR U_7C5C +ENCODING 31836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +2840 +FFE0 +2AA0 +2FE0 +3280 +E7C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_7C5D +ENCODING 31837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +9480 +FFE0 +2000 +7FC0 +5B40 +75C0 +5B40 +5540 +BA60 +ENDCHAR +STARTCHAR U_7C5E +ENCODING 31838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +BFE0 +46A0 +D4E0 +5F80 +0000 +7FE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7C5F +ENCODING 31839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +FA40 +27E0 +FA20 +ABE0 +FA20 +6BE0 +A660 +ENDCHAR +STARTCHAR U_7C60 +ENCODING 31840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9340 +FDE0 +2900 +FFE0 +4820 +7BE0 +4A00 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_7C61 +ENCODING 31841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB80 +2440 +FBA0 +2EE0 +3AA0 +EEE0 +2440 +6AA0 +ENDCHAR +STARTCHAR U_7C62 +ENCODING 31842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A880 +7DE0 +8340 +7D40 +5540 +7C80 +2940 +D620 +ENDCHAR +STARTCHAR U_7C63 +ENCODING 31843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +7BE0 +4A20 +7BE0 +4A20 +7FE0 +6AA0 +7FA0 +5520 +64A0 +ENDCHAR +STARTCHAR U_7C64 +ENCODING 31844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A540 +3540 +4B20 +FFE0 +2900 +EF40 +2880 +EEA0 +2960 +FE20 +ENDCHAR +STARTCHAR U_7C65 +ENCODING 31845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9440 +FFE0 +4A40 +7FC0 +0000 +7FC0 +4A40 +7FC0 +4AC0 +ENDCHAR +STARTCHAR U_7C66 +ENCODING 31846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +53C0 +8880 +FBE0 +22A0 +FBE0 +AAA0 +77E0 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7C67 +ENCODING 31847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5480 +9FE0 +5220 +DFE0 +5500 +5B40 +6580 +4B40 +A520 +9FE0 +ENDCHAR +STARTCHAR U_7C68 +ENCODING 31848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A880 +7DE0 +8220 +7C80 +5480 +7C80 +2940 +D620 +ENDCHAR +STARTCHAR U_7C69 +ENCODING 31849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5480 +8440 +47C0 +2440 +EFE0 +2A20 +2FC0 +2280 +5480 +8FE0 +ENDCHAR +STARTCHAR U_7C6A +ENCODING 31850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +8A80 +A9E0 +D500 +A900 +FFE0 +D540 +AB40 +9540 +FE40 +ENDCHAR +STARTCHAR U_7C6B +ENCODING 31851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A540 +FBE0 +2A80 +44A0 +BFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C6C +ENCODING 31852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +FE80 +6D40 +57E0 +7D40 +11E0 +FD40 +A5E0 +B540 +8DE0 +ENDCHAR +STARTCHAR U_7C6D +ENCODING 31853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFE0 +6B40 +4A40 +7FC0 +4940 +5DE0 +5120 +9CE0 +ENDCHAR +STARTCHAR U_7C6E +ENCODING 31854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +C940 +7FC0 +2480 +5480 +E7E0 +5480 +FFE0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_7C6F +ENCODING 31855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +4000 +7FC0 +2080 +7FC0 +5140 +7FC0 +5540 +AA60 +ENDCHAR +STARTCHAR U_7C70 +ENCODING 31856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FE0 +5480 +FFE0 +4AA0 +7FE0 +3200 +5F80 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_7C71 +ENCODING 31857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFE0 +94A0 +2940 +7BE0 +D680 +7BC0 +5280 +7BE0 +ENDCHAR +STARTCHAR U_7C72 +ENCODING 31858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +29E0 +FEA0 +AAE0 +FEA0 +AAE0 +FEA0 +AAE0 +87A0 +ENDCHAR +STARTCHAR U_7C73 +ENCODING 31859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +1500 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_7C74 +ENCODING 31860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0600 +0900 +1080 +6460 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7C75 +ENCODING 31861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +7080 +23E0 +F880 +2080 +7080 +A880 +A880 +2080 +2080 +ENDCHAR +STARTCHAR U_7C76 +ENCODING 31862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A780 +7480 +2480 +FC80 +2480 +7480 +6C80 +A4A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7C77 +ENCODING 31863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A8C0 +7700 +2100 +F900 +27E0 +7100 +6900 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_7C78 +ENCODING 31864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7240 +2240 +FA40 +27C0 +7240 +AA40 +AA40 +2260 +2220 +ENDCHAR +STARTCHAR U_7C79 +ENCODING 31865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +FA40 +2280 +7480 +AB00 +A980 +2240 +2C20 +ENDCHAR +STARTCHAR U_7C7A +ENCODING 31866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73E0 +2400 +FBC0 +2040 +7080 +A900 +AA20 +2220 +21E0 +ENDCHAR +STARTCHAR U_7C7B +ENCODING 31867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +4040 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C7C +ENCODING 31868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +7080 +22A0 +FAA0 +22A0 +72A0 +AAA0 +AAA0 +23E0 +2220 +ENDCHAR +STARTCHAR U_7C7D +ENCODING 31869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +A840 +7080 +2080 +F880 +27E0 +7080 +A880 +AC80 +2280 +2100 +ENDCHAR +STARTCHAR U_7C7E +ENCODING 31870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +7120 +2520 +F520 +2520 +7120 +6A20 +A220 +24A0 +2440 +ENDCHAR +STARTCHAR U_7C7F +ENCODING 31871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +A840 +7040 +27E0 +F840 +2240 +7140 +A940 +AA40 +2140 +2080 +ENDCHAR +STARTCHAR U_7C80 +ENCODING 31872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +77E0 +2080 +FA80 +2280 +7280 +AA80 +A900 +2280 +2C60 +ENDCHAR +STARTCHAR U_7C81 +ENCODING 31873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AB80 +7080 +2080 +FFE0 +2080 +7080 +A880 +A880 +2080 +2080 +ENDCHAR +STARTCHAR U_7C82 +ENCODING 31874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +0400 +1B00 +E4E0 +1500 +FFE0 +1500 +E4E0 +0400 +ENDCHAR +STARTCHAR U_7C83 +ENCODING 31875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AC80 +74A0 +27C0 +FC80 +2480 +7480 +6C80 +A5A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_7C84 +ENCODING 31876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF00 +7400 +2400 +FFC0 +2540 +7540 +AD40 +A480 +2940 +3620 +ENDCHAR +STARTCHAR U_7C85 +ENCODING 31877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73E0 +26A0 +FAA0 +22A0 +72A0 +ACA0 +A920 +2220 +20C0 +ENDCHAR +STARTCHAR U_7C86 +ENCODING 31878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7180 +2540 +FD20 +2520 +7140 +6880 +A100 +2200 +2C00 +ENDCHAR +STARTCHAR U_7C87 +ENCODING 31879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A900 +77E0 +2000 +FB80 +2280 +7280 +6A80 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7C88 +ENCODING 31880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7240 +2240 +FA40 +27C0 +7240 +AA40 +AA40 +2240 +2FE0 +ENDCHAR +STARTCHAR U_7C89 +ENCODING 31881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AA80 +7240 +2420 +F800 +27C0 +7240 +6A40 +A240 +2440 +2980 +ENDCHAR +STARTCHAR U_7C8A +ENCODING 31882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A80 +4320 +7A20 +C1E0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7C8B +ENCODING 31883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +7780 +FA80 +22A0 +74A0 +6960 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7C8C +ENCODING 31884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +A8A0 +70A0 +23A0 +FC20 +27A0 +70A0 +A8A0 +A8A0 +24A0 +2320 +ENDCHAR +STARTCHAR U_7C8D +ENCODING 31885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AF00 +7100 +21C0 +FF00 +2100 +71E0 +AF00 +A920 +2120 +20E0 +ENDCHAR +STARTCHAR U_7C8E +ENCODING 31886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +7240 +FA40 +63C0 +7280 +AA80 +2280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_7C8F +ENCODING 31887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +F900 +3280 +6A80 +6440 +A640 +2920 +3120 +ENDCHAR +STARTCHAR U_7C90 +ENCODING 31888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +73E0 +2220 +FA20 +23E0 +7200 +6A00 +A200 +2400 +2400 +ENDCHAR +STARTCHAR U_7C91 +ENCODING 31889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +72A0 +22A0 +FAA0 +23E0 +7200 +AA00 +A220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7C92 +ENCODING 31890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2000 +FA40 +2240 +7140 +A980 +A880 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7C93 +ENCODING 31891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AA40 +7240 +27E0 +FA40 +2240 +73C0 +6A40 +A240 +A240 +23C0 +ENDCHAR +STARTCHAR U_7C94 +ENCODING 31892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +7200 +23E0 +FA20 +2220 +73E0 +AA00 +AA00 +2200 +23E0 +ENDCHAR +STARTCHAR U_7C95 +ENCODING 31893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A900 +73E0 +2220 +FA20 +23E0 +7220 +6A20 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7C96 +ENCODING 31894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77E0 +2100 +F900 +27C0 +7100 +AB80 +A540 +2920 +2100 +ENDCHAR +STARTCHAR U_7C97 +ENCODING 31895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +7240 +23C0 +FA40 +2240 +73C0 +6A40 +A240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_7C98 +ENCODING 31896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +71E0 +2100 +F900 +27E0 +7420 +AC20 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7C99 +ENCODING 31897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +A880 +73E0 +22A0 +FAA0 +23E0 +72A0 +6AA0 +A2A0 +23E0 +ENDCHAR +STARTCHAR U_7C9A +ENCODING 31898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +ABE0 +7400 +2900 +F5E0 +2720 +6D20 +7560 +AD00 +2420 +27E0 +ENDCHAR +STARTCHAR U_7C9B +ENCODING 31899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +1500 +4E40 +7FC0 +4E40 +9540 +ENDCHAR +STARTCHAR U_7C9C +ENCODING 31900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +3F80 +4440 +4440 +7FC0 +2480 +1500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7C9D +ENCODING 31901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC00 +7400 +27E0 +FD00 +25E0 +7520 +AD20 +A520 +2AA0 +3440 +ENDCHAR +STARTCHAR U_7C9E +ENCODING 31902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA80 +7280 +2FE0 +FAA0 +2AA0 +7AE0 +AC20 +A820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7C9F +ENCODING 31903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CA0 +ENCODING 31904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AA40 +7240 +27E0 +FA40 +2240 +7240 +77E0 +A000 +2240 +2420 +ENDCHAR +STARTCHAR U_7CA1 +ENCODING 31905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A820 +7BA0 +2820 +FBA0 +2AA0 +3AA0 +6BA0 +AAA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_7CA2 +ENCODING 31906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +6A20 +C500 +58E0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CA3 +ENCODING 31907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AAA0 +7AA0 +2AA0 +FFE0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_7CA4 +ENCODING 31908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +7FC0 +4E40 +5540 +FFE0 +0800 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_7CA5 +ENCODING 31909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +2420 +3520 +EEE0 +8580 +9F80 +E4E0 +2E20 +3520 +2520 +C4C0 +ENDCHAR +STARTCHAR U_7CA6 +ENCODING 31910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +E4E0 +1080 +3BE0 +4A80 +ABE0 +1080 +E080 +ENDCHAR +STARTCHAR U_7CA7 +ENCODING 31911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2400 +FC80 +2480 +77E0 +AC80 +A480 +2880 +2BE0 +ENDCHAR +STARTCHAR U_7CA8 +ENCODING 31912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +7100 +23E0 +FA20 +2220 +73E0 +AA20 +AA20 +23E0 +2220 +ENDCHAR +STARTCHAR U_7CA9 +ENCODING 31913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77A0 +F940 +27E0 +7080 +6B00 +A6C0 +2B00 +2220 +21E0 +ENDCHAR +STARTCHAR U_7CAA +ENCODING 31914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +D160 +7FC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7CAB +ENCODING 31915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +7200 +2FE0 +FAA0 +2AA0 +7AA0 +6AA0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7CAC +ENCODING 31916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AA80 +7280 +FFE0 +2AA0 +3AA0 +6FE0 +AAA0 +2AA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7CAD +ENCODING 31917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7280 +2440 +FBA0 +2000 +77C0 +6C40 +A440 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CAE +ENCODING 31918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A900 +77C0 +2440 +FFC0 +2440 +77E0 +AD40 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7CAF +ENCODING 31919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FC40 +27C0 +7440 +AFC0 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7CB0 +ENCODING 31920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +AB80 +72A0 +2120 +FBC0 +2040 +3080 +6BE0 +A080 +2080 +2180 +ENDCHAR +STARTCHAR U_7CB1 +ENCODING 31921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +A280 +6AC0 +D4A0 +4B80 +6480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CB2 +ENCODING 31922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C00 +23E0 +7A40 +C980 +3260 +C480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CB3 +ENCODING 31923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +77E0 +2520 +FFE0 +2520 +77E0 +AD00 +A500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_7CB4 +ENCODING 31924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ACA0 +74A0 +27E0 +FCA0 +27E0 +7080 +A880 +ABE0 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7CB5 +ENCODING 31925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +7FC0 +5540 +64C0 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_7CB6 +ENCODING 31926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A840 +77C0 +F840 +2FE0 +7120 +6D40 +A380 +2540 +2920 +2200 +ENDCHAR +STARTCHAR U_7CB7 +ENCODING 31927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +ABE0 +7420 +FD60 +23A0 +77E0 +6D20 +A3A0 +2360 +2520 +20C0 +ENDCHAR +STARTCHAR U_7CB8 +ENCODING 31928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AFE0 +7240 +23C0 +FA40 +23C0 +7240 +6A40 +AFE0 +2240 +2420 +ENDCHAR +STARTCHAR U_7CB9 +ENCODING 31929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7240 +2240 +FDA0 +2520 +7100 +6FE0 +A100 +2100 +2100 +ENDCHAR +STARTCHAR U_7CBA +ENCODING 31930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7520 +27E0 +FD20 +27E0 +75A0 +AA80 +AFE0 +2080 +2080 +ENDCHAR +STARTCHAR U_7CBB +ENCODING 31931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +73C0 +2200 +FBC0 +2200 +77E0 +AAA0 +AAC0 +2340 +2620 +ENDCHAR +STARTCHAR U_7CBC +ENCODING 31932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92A0 +54A0 +FEA0 +5540 +9340 +2540 +7D40 +94A0 +7EA0 +24A0 +C4A0 +ENDCHAR +STARTCHAR U_7CBD +ENCODING 31933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7420 +23C0 +F800 +27E0 +7100 +AD40 +A520 +2920 +2300 +ENDCHAR +STARTCHAR U_7CBE +ENCODING 31934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27C0 +F100 +2FE0 +7440 +6FC0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7CBF +ENCODING 31935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AD40 +77C0 +2540 +FFC0 +2100 +77E0 +A900 +AB80 +2540 +2920 +ENDCHAR +STARTCHAR U_7CC0 +ENCODING 31936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7480 +2280 +FAA0 +24C0 +7480 +6D80 +A6A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_7CC1 +ENCODING 31937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AFE0 +7100 +27E0 +FA80 +2540 +72A0 +AD00 +AA40 +2180 +2600 +ENDCHAR +STARTCHAR U_7CC2 +ENCODING 31938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AFE0 +7440 +27C0 +FC40 +27C0 +7440 +6FE0 +A680 +2440 +27E0 +ENDCHAR +STARTCHAR U_7CC3 +ENCODING 31939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +73C0 +2240 +FFE0 +2200 +77E0 +6AA0 +A520 +22A0 +2440 +ENDCHAR +STARTCHAR U_7CC4 +ENCODING 31940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7820 +2FE0 +F800 +2FE0 +7AA0 +6FE0 +AAA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_7CC5 +ENCODING 31941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A940 +7080 +27E0 +FAA0 +2580 +7100 +AFE0 +AB80 +2540 +2920 +ENDCHAR +STARTCHAR U_7CC6 +ENCODING 31942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A900 +7200 +2FE0 +FAA0 +2BA0 +7AA0 +6BA0 +AAA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7CC7 +ENCODING 31943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77E0 +2500 +FDE0 +2680 +77E0 +AC80 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7CC8 +ENCODING 31944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A920 +75C0 +2700 +F9E0 +2220 +73E0 +AA20 +ABE0 +2220 +2260 +ENDCHAR +STARTCHAR U_7CC9 +ENCODING 31945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AD20 +76A0 +27E0 +F280 +2D60 +73C0 +6A40 +A580 +2240 +2420 +ENDCHAR +STARTCHAR U_7CCA +ENCODING 31946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +A4A0 +7EA0 +24E0 +FEA0 +2AA0 +3AE0 +6AA0 +AEA0 +2120 +2260 +ENDCHAR +STARTCHAR U_7CCB +ENCODING 31947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +A280 +7FE0 +2000 +FE20 +2AA0 +3EA0 +6AA0 +AEA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_7CCC +ENCODING 31948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AF40 +7560 +2240 +FD00 +24E0 +73C0 +AA40 +ABC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_7CCD +ENCODING 31949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AA80 +77E0 +2240 +FA40 +25A0 +77E0 +AA40 +A240 +25A0 +2FE0 +ENDCHAR +STARTCHAR U_7CCE +ENCODING 31950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC00 +77E0 +26A0 +FFE0 +26A0 +77E0 +AC80 +A7E0 +2880 +37E0 +ENDCHAR +STARTCHAR U_7CCF +ENCODING 31951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A820 +7FE0 +2AA0 +F9C0 +2BE0 +6A20 +7BE0 +AA20 +2BE0 +3220 +ENDCHAR +STARTCHAR U_7CD0 +ENCODING 31952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +AFE0 +7520 +27E0 +FD20 +27E0 +7520 +A840 +AFE0 +2240 +21C0 +ENDCHAR +STARTCHAR U_7CD1 +ENCODING 31953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A920 +7760 +2880 +FFE0 +2120 +75A0 +AB60 +ADA0 +2120 +26C0 +ENDCHAR +STARTCHAR U_7CD2 +ENCODING 31954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27E0 +FA00 +23E0 +72A0 +ABE0 +AAA0 +27E0 +2AA0 +ENDCHAR +STARTCHAR U_7CD3 +ENCODING 31955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1380 +7A80 +1280 +FCE0 +8400 +7DC0 +5540 +FD40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_7CD4 +ENCODING 31956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AD40 +7280 +2360 +FD00 +27E0 +7520 +AFE0 +A900 +2140 +27A0 +ENDCHAR +STARTCHAR U_7CD5 +ENCODING 31957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AA80 +77E0 +2100 +F900 +27C0 +7100 +AFE0 +A540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7CD6 +ENCODING 31958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7940 +2FE0 +F940 +2FC0 +7900 +ABC0 +AA40 +2A40 +33C0 +ENDCHAR +STARTCHAR U_7CD7 +ENCODING 31959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFC0 +7440 +2740 +FDC0 +2440 +77C0 +A140 +AFE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CD8 +ENCODING 31960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +7820 +27C0 +F920 +2340 +7580 +6AC0 +A5A0 +22A0 +2500 +ENDCHAR +STARTCHAR U_7CD9 +ENCODING 31961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +AE80 +73E0 +2480 +FFE0 +2400 +75E0 +AD20 +A5E0 +2A00 +33E0 +ENDCHAR +STARTCHAR U_7CDA +ENCODING 31962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7480 +2240 +FA40 +2EE0 +7240 +6E40 +AA40 +33E0 +2200 +ENDCHAR +STARTCHAR U_7CDB +ENCODING 31963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +AB40 +77E0 +2420 +FBC0 +2240 +73C0 +6900 +A3C0 +2100 +27E0 +ENDCHAR +STARTCHAR U_7CDC +ENCODING 31964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9100 +FFE0 +BB40 +D560 +A480 +9500 +FFE0 +9500 +E4E0 +ENDCHAR +STARTCHAR U_7CDD +ENCODING 31965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +ABA0 +74A0 +27E0 +F880 +2760 +7280 +AD20 +A240 +2080 +2700 +ENDCHAR +STARTCHAR U_7CDE +ENCODING 31966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +1500 +7FC0 +A4A0 +3F80 +7FC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7CDF +ENCODING 31967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7AA0 +2AA0 +FFE0 +2AA0 +3FE0 +6440 +A7C0 +A440 +27C0 +ENDCHAR +STARTCHAR U_7CE0 +ENCODING 31968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27E0 +FD40 +27C0 +7520 +AFC0 +AB40 +3520 +2B20 +ENDCHAR +STARTCHAR U_7CE1 +ENCODING 31969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7280 +27E0 +F800 +27C0 +7540 +6CC0 +A7C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_7CE2 +ENCODING 31970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27C0 +FC40 +27C0 +3440 +6FE0 +A100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CE3 +ENCODING 31971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A240 +7B40 +2FE0 +F6C0 +2B60 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CE4 +ENCODING 31972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +BF80 +6A80 +FFE0 +21A0 +6EA0 +7AA0 +AE40 +AA40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_7CE5 +ENCODING 31973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +7FE0 +2AA0 +FAA0 +2FE0 +7100 +6FE0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7CE6 +ENCODING 31974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27C0 +FC40 +27C0 +7280 +6FE0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7CE7 +ENCODING 31975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFE0 +2540 +37C0 +6D40 +AFE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7CE8 +ENCODING 31976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA20 +73E0 +2C80 +FBE0 +2EA0 +77E0 +AEA0 +A480 +34A0 +2BE0 +ENDCHAR +STARTCHAR U_7CE9 +ENCODING 31977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AA80 +7440 +2FE0 +FD60 +2BA0 +6FE0 +7440 +A7C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CEA +ENCODING 31978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +A5E0 +BE80 +0A80 +7FE0 +1280 +E260 +ENDCHAR +STARTCHAR U_7CEB +ENCODING 31979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2000 +FFE0 +2440 +77C0 +6220 +A540 +2C80 +2660 +ENDCHAR +STARTCHAR U_7CEC +ENCODING 31980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2100 +FFA0 +2140 +77E0 +AA20 +A7E0 +2A20 +23E0 +ENDCHAR +STARTCHAR U_7CED +ENCODING 31981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AEC0 +7540 +27C0 +F440 +2A20 +73C0 +6E80 +A100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CEE +ENCODING 31982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +AA40 +7F60 +29C0 +FF20 +2A20 +7F80 +A800 +AFE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_7CEF +ENCODING 31983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +7FE0 +2920 +FBA0 +2540 +3FE0 +6200 +AFE0 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7CF0 +ENCODING 31984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A920 +7FE0 +2D60 +FFE0 +2D60 +3FE0 +68A0 +AFE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_7CF1 +ENCODING 31985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +F140 +93E0 +F880 +8BE0 +F880 +1500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7CF2 +ENCODING 31986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A940 +7FE0 +2940 +FBE0 +2AA0 +3FE0 +6CA0 +AFE0 +3420 +2460 +ENDCHAR +STARTCHAR U_7CF3 +ENCODING 31987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +FF40 +1160 +D700 +92C0 +FEC0 +1520 +7FC0 +0D00 +3480 +C460 +ENDCHAR +STARTCHAR U_7CF4 +ENCODING 31988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25A0 +5360 +8DA0 +23E0 +AE80 +73E0 +FA80 +23E0 +7280 +ABE0 +ENDCHAR +STARTCHAR U_7CF5 +ENCODING 31989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A80 +7FE0 +4940 +7BE0 +4C80 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_7CF6 +ENCODING 31990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +FDA0 +AB60 +FDA0 +23E0 +AA80 +77E0 +FA80 +23E0 +7280 +ABE0 +ENDCHAR +STARTCHAR U_7CF7 +ENCODING 31991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2EE0 +FAA0 +2EE0 +3FE0 +6AA0 +AFE0 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_7CF8 +ENCODING 31992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +2200 +7C00 +1100 +FE80 +4480 +2500 +2480 +4440 +9C40 +ENDCHAR +STARTCHAR U_7CF9 +ENCODING 31993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +20 +48 +F0 +20 +48 +FC +00 +A8 +A8 +80 +ENDCHAR +STARTCHAR U_7CFA +ENCODING 31994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +4A00 +F200 +2200 +4A00 +FA00 +0200 +AA20 +AA20 +81E0 +ENDCHAR +STARTCHAR U_7CFB +ENCODING 31995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0380 +FC00 +1100 +7E00 +0800 +1100 +FF80 +0880 +2A00 +4900 +9880 +ENDCHAR +STARTCHAR U_7CFC +ENCODING 31996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2100 +2100 +4900 +F3C0 +2140 +4940 +FA40 +0240 +AA40 +AD40 +8880 +ENDCHAR +STARTCHAR U_7CFD +ENCODING 31997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +8880 +F080 +2080 +4880 +F480 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7CFE +ENCODING 31998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2120 +4920 +F120 +2120 +4960 +FBA0 +0520 +5020 +A820 +A820 +ENDCHAR +STARTCHAR U_7CFF +ENCODING 31999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4920 +F120 +2120 +4920 +F920 +0120 +AA20 +AAA0 +8440 +ENDCHAR +STARTCHAR U_7D00 +ENCODING 32000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +4040 +F040 +2040 +4BC0 +FA00 +0200 +AA20 +AA20 +81E0 +ENDCHAR +STARTCHAR U_7D01 +ENCODING 32001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4C40 +F540 +2280 +5280 +E900 +0500 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D02 +ENCODING 32002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +4040 +F7E0 +2040 +5240 +E940 +0040 +5240 +A940 +A880 +ENDCHAR +STARTCHAR U_7D03 +ENCODING 32003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +42A0 +F2A0 +22A0 +52A0 +EAA0 +02A0 +52A0 +ACA0 +A820 +ENDCHAR +STARTCHAR U_7D04 +ENCODING 32004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +F420 +2020 +5220 +E920 +0120 +5020 +A920 +A8C0 +ENDCHAR +STARTCHAR U_7D05 +ENCODING 32005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +F100 +2100 +5100 +E900 +0100 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D06 +ENCODING 32006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +F080 +27E0 +5080 +E880 +0080 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D07 +ENCODING 32007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +57E0 +F800 +27C0 +5080 +E900 +0200 +5220 +AC20 +ABE0 +ENDCHAR +STARTCHAR U_7D08 +ENCODING 32008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FC0 +F140 +2540 +5340 +E940 +02C0 +5240 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D09 +ENCODING 32009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4120 +F120 +2320 +5520 +E920 +0120 +5120 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_7D0A +ENCODING 32010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3580 +C960 +3E00 +0880 +3F40 +2280 +C660 +ENDCHAR +STARTCHAR U_7D0B +ENCODING 32011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F240 +2240 +5240 +EA40 +0180 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D0C +ENCODING 32012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +57E0 +F100 +2100 +5180 +E980 +0180 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D0D +ENCODING 32013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +5520 +EDA0 +0660 +5420 +AC20 +A4E0 +ENDCHAR +STARTCHAR U_7D0E +ENCODING 32014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +5100 +F7E0 +2100 +5100 +E900 +0100 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D0F +ENCODING 32015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +5140 +F040 +2240 +5140 +E840 +00E0 +5740 +A840 +A840 +ENDCHAR +STARTCHAR U_7D10 +ENCODING 32016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5240 +F240 +2240 +57C0 +EA40 +0240 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7D11 +ENCODING 32017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +5080 +F100 +2340 +5520 +E920 +0100 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D12 +ENCODING 32018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +2240 +5240 +EA40 +0240 +5240 +AC40 +A840 +ENDCHAR +STARTCHAR U_7D13 +ENCODING 32019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +5140 +F080 +2FE0 +50A0 +E8C0 +0080 +5480 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D14 +ENCODING 32020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F100 +2540 +5540 +EFC0 +0540 +5120 +A920 +A8E0 +ENDCHAR +STARTCHAR U_7D15 +ENCODING 32021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5480 +F4A0 +27C0 +5480 +EC80 +0480 +55A0 +AEA0 +AC60 +ENDCHAR +STARTCHAR U_7D16 +ENCODING 32022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +20A0 +50A0 +F7A0 +2420 +57A0 +E8A0 +00A0 +50A0 +ACA0 +AB20 +ENDCHAR +STARTCHAR U_7D17 +ENCODING 32023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +52C0 +F2A0 +24A0 +5080 +E8A0 +0040 +5080 +A900 +AE00 +ENDCHAR +STARTCHAR U_7D18 +ENCODING 32024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F100 +2140 +5240 +EA80 +0280 +5540 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D19 +ENCODING 32025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +5480 +F480 +27E0 +5480 +EC80 +04A0 +55A0 +AE60 +AC20 +ENDCHAR +STARTCHAR U_7D1A +ENCODING 32026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +5240 +F280 +22E0 +5220 +EA40 +0540 +5480 +A940 +AA20 +ENDCHAR +STARTCHAR U_7D1B +ENCODING 32027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +5240 +F420 +2820 +57C0 +EA40 +0240 +5240 +AD40 +A880 +ENDCHAR +STARTCHAR U_7D1C +ENCODING 32028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +5000 +F000 +27E0 +5100 +E900 +0200 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D1D +ENCODING 32029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +5080 +F080 +2080 +57E0 +E880 +0080 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D1E +ENCODING 32030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +5180 +E980 +0180 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D1F +ENCODING 32031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F920 +2080 +5000 +EFE0 +0040 +5040 +A880 +A880 +ENDCHAR +STARTCHAR U_7D20 +ENCODING 32032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +0900 +3F80 +0840 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D21 +ENCODING 32033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +4FE0 +F100 +21E0 +5120 +E920 +0120 +5220 +AD20 +A8C0 +ENDCHAR +STARTCHAR U_7D22 +ENCODING 32034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +9120 +3E00 +0880 +7FC0 +0440 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D23 +ENCODING 32035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +47C0 +8240 +F240 +2440 +4960 +F900 +07E0 +A900 +A900 +8100 +ENDCHAR +STARTCHAR U_7D24 +ENCODING 32036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +2380 +4A00 +FA00 +23E0 +4A40 +FA40 +0240 +AA40 +AA40 +8440 +ENDCHAR +STARTCHAR U_7D25 +ENCODING 32037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +3120 +D4E0 +2900 +3F00 +0840 +3FC0 +0500 +54C0 +8800 +ENDCHAR +STARTCHAR U_7D26 +ENCODING 32038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9540 +F540 +2540 +57C0 +FC00 +0400 +AC20 +A420 +03E0 +ENDCHAR +STARTCHAR U_7D27 +ENCODING 32039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2FC0 +A480 +A300 +ACC0 +1100 +3E00 +1100 +7F00 +2A80 +4900 +9880 +ENDCHAR +STARTCHAR U_7D28 +ENCODING 32040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +5440 +F5E0 +2E40 +5540 +ED40 +0440 +5440 +AD40 +AC80 +ENDCHAR +STARTCHAR U_7D29 +ENCODING 32041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +53E0 +F280 +2480 +57E0 +E880 +0480 +5140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D2A +ENCODING 32042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4280 +AAA0 +EBA0 +4AC0 +FA80 +0A80 +ABA0 +AEA0 +8860 +ENDCHAR +STARTCHAR U_7D2B +ENCODING 32043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5140 +5D80 +5120 +FDE0 +0880 +3F00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D2C +ENCODING 32044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F4A0 +24A0 +54A0 +EFE0 +04A0 +54A0 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D2D +ENCODING 32045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4640 +9240 +F640 +4480 +9680 +FA80 +0280 +AB20 +ABE0 +8420 +ENDCHAR +STARTCHAR U_7D2E +ENCODING 32046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +3120 +6920 +A4E0 +0800 +3E00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D2F +ENCODING 32047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0900 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7D30 +ENCODING 32048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +5520 +F520 +2520 +57E0 +ED20 +0520 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D31 +ENCODING 32049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +57E0 +F100 +2100 +51C0 +EA40 +0340 +5480 +A940 +AA20 +ENDCHAR +STARTCHAR U_7D32 +ENCODING 32050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +5540 +FFE0 +2540 +5540 +ED40 +05C0 +5400 +AC00 +AFE0 +ENDCHAR +STARTCHAR U_7D33 +ENCODING 32051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F4A0 +27E0 +54A0 +EFE0 +04A0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7D34 +ENCODING 32052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97E0 +F520 +4540 +97C0 +F640 +0580 +AD80 +AA40 +9420 +ENDCHAR +STARTCHAR U_7D35 +ENCODING 32053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +2000 +57E0 +E880 +0480 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D36 +ENCODING 32054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57C0 +F100 +2100 +57E0 +E900 +0100 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D37 +ENCODING 32055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4280 +F240 +2520 +5100 +FFC0 +0040 +AA80 +A900 +8100 +ENDCHAR +STARTCHAR U_7D38 +ENCODING 32056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F080 +2080 +5080 +EBE0 +0080 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D39 +ENCODING 32057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +5120 +F220 +24C0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D3A +ENCODING 32058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +57E0 +F240 +2240 +5240 +EBC0 +0240 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_7D3B +ENCODING 32059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57C0 +F540 +2540 +5FE0 +E900 +0100 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D3C +ENCODING 32060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +57E0 +F2A0 +27E0 +5A80 +EFE0 +02A0 +52E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D3D +ENCODING 32061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +2200 +5240 +EA80 +0300 +5220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D3E +ENCODING 32062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +2100 +5600 +E880 +0300 +5040 +A980 +AE00 +ENDCHAR +STARTCHAR U_7D3F +ENCODING 32063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +F460 +27A0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D40 +ENCODING 32064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +54A0 +F4A0 +27E0 +54A0 +E880 +04A0 +54A0 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D41 +ENCODING 32065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5480 +FA80 +22E0 +53A0 +EEA0 +02E0 +5280 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D42 +ENCODING 32066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5440 +F280 +2100 +5280 +EC60 +0100 +5080 +AB00 +80C0 +ENDCHAR +STARTCHAR U_7D43 +ENCODING 32067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F100 +2240 +5780 +E880 +0100 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D44 +ENCODING 32068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5240 +F3C0 +2240 +5240 +EA40 +03C0 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7D45 +ENCODING 32069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +5820 +FBA0 +2AA0 +5AA0 +EBA0 +0AA0 +5820 +A820 +A860 +ENDCHAR +STARTCHAR U_7D46 +ENCODING 32070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +5540 +F100 +27C0 +5100 +E900 +0FE0 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D47 +ENCODING 32071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +F420 +2BA0 +52A0 +EAA0 +03A0 +5020 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7D48 +ENCODING 32072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4100 +8BE0 +F220 +2220 +4BE0 +FA20 +0220 +AA20 +ABE0 +8220 +ENDCHAR +STARTCHAR U_7D49 +ENCODING 32073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +4920 +F7E0 +2100 +4B80 +FB40 +0540 +AD20 +A920 +8100 +ENDCHAR +STARTCHAR U_7D4A +ENCODING 32074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5FE0 +F100 +2380 +5540 +E920 +07C0 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D4B +ENCODING 32075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4FE0 +F400 +2480 +4480 +FD00 +0540 +AE60 +ABA0 +8820 +ENDCHAR +STARTCHAR U_7D4C +ENCODING 32076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4440 +F280 +2380 +4440 +F920 +07C0 +A900 +A900 +87E0 +ENDCHAR +STARTCHAR U_7D4D +ENCODING 32077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2160 +43C0 +F640 +2A40 +53E0 +FA40 +0240 +AA40 +AA40 +03E0 +ENDCHAR +STARTCHAR U_7D4E +ENCODING 32078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +5800 +F200 +25E0 +5C40 +EC40 +0440 +5440 +AC40 +A4C0 +ENDCHAR +STARTCHAR U_7D4F +ENCODING 32079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5520 +F7E0 +2520 +57E0 +E900 +0140 +50A0 +A960 +AE20 +ENDCHAR +STARTCHAR U_7D50 +ENCODING 32080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F080 +23E0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D51 +ENCODING 32081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +57C0 +F900 +2100 +5FE0 +E900 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7D52 +ENCODING 32082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +52A0 +F6A0 +2BE0 +52A0 +EAA0 +02A0 +52A0 +ACA0 +A820 +ENDCHAR +STARTCHAR U_7D53 +ENCODING 32083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +F100 +2FE0 +5100 +E900 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D54 +ENCODING 32084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +5100 +F7E0 +2420 +5420 +EFE0 +0420 +5420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D55 +ENCODING 32085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +5480 +FFC0 +2540 +5540 +EFC0 +0400 +5420 +AC20 +ABE0 +ENDCHAR +STARTCHAR U_7D56 +ENCODING 32086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +5540 +F100 +2FE0 +5280 +EA80 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D57 +ENCODING 32087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4C20 +F5E0 +2560 +4560 +FD60 +05E0 +AC20 +AFE0 +0420 +ENDCHAR +STARTCHAR U_7D58 +ENCODING 32088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +55E0 +F220 +20A0 +5480 +EC80 +0480 +5540 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D59 +ENCODING 32089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +4BC0 +F240 +1240 +23C0 +4A40 +FE40 +03C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_7D5A +ENCODING 32090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +4A00 +F3C0 +1240 +23C0 +4A40 +FD40 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D5B +ENCODING 32091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5640 +5180 +DE60 +5100 +5780 +5240 +5FA0 +4940 +7320 +ENDCHAR +STARTCHAR U_7D5C +ENCODING 32092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +10A0 +7CA0 +1120 +FEC0 +0A00 +1480 +7F40 +1500 +2480 +DC60 +ENDCHAR +STARTCHAR U_7D5D +ENCODING 32093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A80 +F440 +1BA0 +2000 +4FE0 +FA00 +03C0 +A840 +A8C0 +ENDCHAR +STARTCHAR U_7D5E +ENCODING 32094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +5FE0 +F240 +2420 +5240 +EA40 +0240 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D5F +ENCODING 32095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +27C0 +5100 +E900 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D60 +ENCODING 32096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F200 +17C0 +2A40 +4BC0 +FA40 +03C0 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_7D61 +ENCODING 32097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5680 +F900 +2280 +5440 +EFE0 +0440 +5440 +AFC0 +AC40 +ENDCHAR +STARTCHAR U_7D62 +ENCODING 32098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5420 +FFA0 +24A0 +57A0 +ECA0 +07A0 +5020 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7D63 +ENCODING 32099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F280 +2280 +5FE0 +EA80 +0280 +5280 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D64 +ENCODING 32100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4280 +FFE0 +2AA0 +2AA0 +4AE0 +FC20 +0820 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D65 +ENCODING 32101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2540 +4920 +FFE0 +2900 +2900 +4900 +FA80 +0A80 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D66 +ENCODING 32102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +27C0 +5000 +F7C0 +0440 +5440 +AFC0 +8440 +ENDCHAR +STARTCHAR U_7D67 +ENCODING 32103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +FBA0 +2820 +4BA0 +FAA0 +0BA0 +5AA0 +A820 +A8E0 +ENDCHAR +STARTCHAR U_7D68 +ENCODING 32104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F280 +22A0 +57A0 +EAC0 +0280 +52A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_7D69 +ENCODING 32105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +56A0 +F2C0 +2280 +56C0 +EAA0 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D6A +ENCODING 32106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +5520 +EDA0 +0660 +5420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D6B +ENCODING 32107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +5140 +FBE0 +0900 +3E00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D6C +ENCODING 32108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +4900 +F7E0 +1100 +27C0 +4440 +FC40 +0440 +AFC0 +A440 +ENDCHAR +STARTCHAR U_7D6D +ENCODING 32109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7FC0 +1000 +FFE0 +2880 +5E40 +8920 +3F80 +0400 +3580 +CC60 +ENDCHAR +STARTCHAR U_7D6E +ENCODING 32110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FDE0 +2920 +69E0 +1520 +6900 +3E00 +0840 +7FA0 +1280 +EE60 +ENDCHAR +STARTCHAR U_7D6F +ENCODING 32111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F240 +2780 +5120 +EA40 +0480 +5140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D70 +ENCODING 32112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +5100 +F240 +27A0 +50A0 +E880 +03E0 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D71 +ENCODING 32113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F100 +2240 +57A0 +E800 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D72 +ENCODING 32114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +F780 +2140 +57E0 +E880 +02C0 +54A0 +A8A0 +A980 +ENDCHAR +STARTCHAR U_7D73 +ENCODING 32115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5240 +F580 +2260 +5080 +EFE0 +0480 +57E0 +A880 +A880 +ENDCHAR +STARTCHAR U_7D74 +ENCODING 32116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +F100 +17C0 +2100 +4900 +FFE0 +0100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D75 +ENCODING 32117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4A80 +FC60 +1380 +2000 +4FE0 +F100 +0240 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D76 +ENCODING 32118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +4A40 +F7E0 +1AA0 +22A0 +4BE0 +FA00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D77 +ENCODING 32119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +F3C0 +2160 +6A20 +3F00 +0480 +7FE0 +1280 +E660 +ENDCHAR +STARTCHAR U_7D78 +ENCODING 32120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +F440 +17C0 +2440 +4FC0 +FA80 +02A0 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_7D79 +ENCODING 32121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +53E0 +F000 +23E0 +5220 +EBE0 +0220 +53E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7D7A +ENCODING 32122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +5240 +F520 +27E0 +5280 +EFE0 +02A0 +52A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_7D7B +ENCODING 32123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5480 +FFE0 +2520 +5520 +EFE0 +0180 +5280 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_7D7C +ENCODING 32124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2740 +5220 +F2C0 +2140 +56A0 +E960 +06A0 +5120 +AEA0 +A840 +ENDCHAR +STARTCHAR U_7D7D +ENCODING 32125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5440 +F7C0 +2000 +5000 +EFE0 +0420 +5420 +AFE0 +8420 +ENDCHAR +STARTCHAR U_7D7E +ENCODING 32126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4FE0 +F500 +1740 +2540 +4540 +FF40 +05A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_7D7F +ENCODING 32127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F480 +22A0 +52A0 +E9C0 +02A0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7D80 +ENCODING 32128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +FFE0 +2920 +5FE0 +E920 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7D81 +ENCODING 32129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +22A0 +5FA0 +F2A0 +22C0 +57A0 +EAA0 +07A0 +52E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D82 +ENCODING 32130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +F000 +17C0 +2440 +4FC0 +FA80 +02A0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D83 +ENCODING 32131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +5080 +F7E0 +2420 +57E0 +EC20 +07E0 +5420 +AC20 +ACE0 +ENDCHAR +STARTCHAR U_7D84 +ENCODING 32132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +23C0 +5000 +EFE0 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D85 +ENCODING 32133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +57C0 +F040 +27C0 +5000 +EFE0 +0AA0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7D86 +ENCODING 32134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +57E0 +F4A0 +27E0 +54A0 +EFE0 +0280 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7D87 +ENCODING 32135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4280 +FFE0 +2AA0 +2CE0 +4820 +FFE0 +0820 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D88 +ENCODING 32136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F120 +27E0 +5500 +EFE0 +0120 +53E0 +AD40 +A900 +ENDCHAR +STARTCHAR U_7D89 +ENCODING 32137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +4100 +FFE0 +1540 +2920 +47C0 +FA40 +02E0 +AA20 +ACC0 +ENDCHAR +STARTCHAR U_7D8A +ENCODING 32138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F100 +1540 +2BA0 +4100 +F900 +0280 +AA40 +AC60 +ENDCHAR +STARTCHAR U_7D8B +ENCODING 32139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +47E0 +F520 +1100 +27E0 +4900 +FA80 +0280 +AD20 +ABE0 +ENDCHAR +STARTCHAR U_7D8C +ENCODING 32140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +5920 +F280 +2440 +5820 +EBC0 +0240 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_7D8D +ENCODING 32141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2820 +57C0 +E880 +07E0 +5100 +A900 +AB00 +ENDCHAR +STARTCHAR U_7D8E +ENCODING 32142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +22C0 +5240 +F440 +26E0 +5240 +EA40 +06E0 +5200 +AD00 +A8E0 +ENDCHAR +STARTCHAR U_7D8F +ENCODING 32143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +5940 +F480 +2100 +5FE0 +EA40 +0480 +5380 +A940 +AE20 +ENDCHAR +STARTCHAR U_7D90 +ENCODING 32144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FC0 +F440 +1440 +27C0 +4A80 +FA80 +02A0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D91 +ENCODING 32145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +55A0 +EF60 +0520 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D92 +ENCODING 32146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5540 +F280 +27E0 +5080 +E900 +07E0 +5100 +AD00 +AB00 +ENDCHAR +STARTCHAR U_7D93 +ENCODING 32147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5540 +FA80 +2540 +5540 +E800 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D94 +ENCODING 32148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +5100 +8BC0 +7520 +03E0 +F880 +21C0 +7AA0 +0CA0 +7180 +ENDCHAR +STARTCHAR U_7D95 +ENCODING 32149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F100 +1100 +27C0 +4800 +FAA0 +06A0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7D96 +ENCODING 32150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2FC0 +5240 +F440 +2760 +5340 +EB40 +05E0 +5400 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7D97 +ENCODING 32151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4AA0 +FC60 +2820 +2BA0 +4AA0 +FAA0 +0BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7D98 +ENCODING 32152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +4640 +FD80 +1240 +27E0 +4900 +FFE0 +0100 +AFE0 +A900 +ENDCHAR +STARTCHAR U_7D99 +ENCODING 32153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2100 +2900 +4D40 +FB80 +1900 +2FC0 +4900 +FB80 +0D40 +A900 +AFC0 +ENDCHAR +STARTCHAR U_7D9A +ENCODING 32154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +F7C0 +1000 +2FE0 +4820 +FA80 +0280 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D9B +ENCODING 32155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4D20 +F520 +1260 +2420 +4900 +FAA0 +06A0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7D9C +ENCODING 32156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F3C0 +2000 +57E0 +E880 +02C0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7D9D +ENCODING 32157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +5FE0 +F440 +26C0 +5560 +ED60 +0540 +5440 +AC40 +A440 +ENDCHAR +STARTCHAR U_7D9E +ENCODING 32158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +5100 +FFE0 +2540 +5540 +EFE0 +0540 +5FE0 +A900 +A7C0 +ENDCHAR +STARTCHAR U_7D9F +ENCODING 32159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F7E0 +24C0 +54A0 +EFE0 +0480 +5540 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7DA0 +ENCODING 32160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5120 +ED40 +0380 +5540 +A920 +AF20 +ENDCHAR +STARTCHAR U_7DA1 +ENCODING 32161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5000 +F3E0 +2220 +53E0 +E880 +02C0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7DA2 +ENCODING 32162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +4BA0 +F920 +2FE0 +5820 +FBA0 +0AA0 +5BA0 +A820 +A8E0 +ENDCHAR +STARTCHAR U_7DA3 +ENCODING 32163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +5FE0 +F200 +2FE0 +5240 +EFA0 +0280 +53A0 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7DA4 +ENCODING 32164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1540 +2580 +FD40 +2540 +3D00 +0600 +1880 +77C0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7DA5 +ENCODING 32165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +F540 +17C0 +2000 +4FE0 +FA80 +0280 +AA80 +AC80 +ENDCHAR +STARTCHAR U_7DA6 +ENCODING 32166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +1F80 +1080 +FFE0 +4A40 +94A0 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7DA7 +ENCODING 32167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F3C0 +2000 +57E0 +E880 +0100 +57E0 +A900 +AB00 +ENDCHAR +STARTCHAR U_7DA8 +ENCODING 32168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +47E0 +F280 +1380 +2280 +4B80 +FA80 +07E0 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DA9 +ENCODING 32169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5820 +F400 +27E0 +54A0 +EDA0 +02E0 +5280 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7DAA +ENCODING 32170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7C0 +2100 +5FE0 +EC40 +07C0 +5440 +AFC0 +ACC0 +ENDCHAR +STARTCHAR U_7DAB +ENCODING 32171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +4FE0 +F280 +1120 +26E0 +4240 +FFE0 +0240 +A9A0 +AE60 +ENDCHAR +STARTCHAR U_7DAC +ENCODING 32172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5540 +F280 +27E0 +5420 +EBC0 +0240 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7DAD +ENCODING 32173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2480 +57E0 +FC80 +27E0 +5480 +EC80 +07E0 +5480 +AFE0 +AC00 +ENDCHAR +STARTCHAR U_7DAE +ENCODING 32174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4A40 +7D80 +4640 +4520 +9F00 +0880 +3F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7DAF +ENCODING 32175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +4420 +F7A0 +2A20 +5FA0 +F220 +0AA0 +5FA0 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7DB0 +ENCODING 32176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F3C0 +2240 +53C0 +EA00 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DB1 +ENCODING 32177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +5560 +F4A0 +27E0 +54A0 +EEA0 +06A0 +57E0 +AC20 +A460 +ENDCHAR +STARTCHAR U_7DB2 +ENCODING 32178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +5560 +F4A0 +27E0 +54A0 +EFE0 +0520 +55E0 +AC20 +AC60 +ENDCHAR +STARTCHAR U_7DB3 +ENCODING 32179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4AA0 +FEE0 +2AA0 +2EE0 +4AA0 +FAA0 +0AA0 +AB60 +B620 +ENDCHAR +STARTCHAR U_7DB4 +ENCODING 32180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +56C0 +F240 +25A0 +57E0 +E920 +06C0 +5240 +ADA0 +A920 +ENDCHAR +STARTCHAR U_7DB5 +ENCODING 32181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5520 +F2C0 +2100 +57E0 +E900 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7DB6 +ENCODING 32182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +4FC0 +F540 +17C0 +2100 +4FE0 +F900 +0380 +AD40 +A920 +ENDCHAR +STARTCHAR U_7DB7 +ENCODING 32183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F240 +25A0 +5420 +E880 +07E0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7DB8 +ENCODING 32184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +4BA0 +F000 +2FE0 +5AA0 +FAA0 +0FE0 +5AA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_7DB9 +ENCODING 32185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2740 +5560 +FD40 +2240 +55E0 +E800 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DBA +ENCODING 32186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5280 +F440 +2FE0 +5040 +EF40 +0540 +5740 +A840 +A8C0 +ENDCHAR +STARTCHAR U_7DBB +ENCODING 32187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F000 +27E0 +5080 +EA80 +02E0 +5280 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7DBC +ENCODING 32188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5520 +F7E0 +2520 +57E0 +EA80 +07E0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7DBD +ENCODING 32189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +57C0 +F440 +27C0 +5440 +EFC0 +0100 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7DBE +ENCODING 32190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2440 +5A20 +EBC0 +0680 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DBF +ENCODING 32191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +F3C0 +2240 +53C0 +E900 +07E0 +5520 +AD60 +A900 +ENDCHAR +STARTCHAR U_7DC0 +ENCODING 32192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5140 +F7E0 +2140 +57C0 +E900 +07E0 +5240 +A980 +AE60 +ENDCHAR +STARTCHAR U_7DC1 +ENCODING 32193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +57C0 +F140 +2FE0 +5140 +EFC0 +0500 +55E0 +AB00 +A9E0 +ENDCHAR +STARTCHAR U_7DC2 +ENCODING 32194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22C0 +5480 +F140 +22A0 +5080 +EAA0 +04C0 +5080 +A940 +AE20 +ENDCHAR +STARTCHAR U_7DC3 +ENCODING 32195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +E940 +2A20 +5500 +F5C0 +0500 +A500 +A700 +98E0 +ENDCHAR +STARTCHAR U_7DC4 +ENCODING 32196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5480 +ECA0 +07C0 +5480 +ADA0 +AE60 +ENDCHAR +STARTCHAR U_7DC5 +ENCODING 32197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +4A00 +9FE0 +EAA0 +2AA0 +5EA0 +FAA0 +0B40 +5EA0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_7DC6 +ENCODING 32198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5200 +EFE0 +02A0 +5520 +AA20 +ACC0 +ENDCHAR +STARTCHAR U_7DC7 +ENCODING 32199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +5A80 +F540 +2540 +57E0 +ED20 +07E0 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7DC8 +ENCODING 32200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +EFE0 +2280 +47C0 +F100 +0FE0 +A100 +A900 +8100 +ENDCHAR +STARTCHAR U_7DC9 +ENCODING 32201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4100 +FFE0 +2920 +5DA0 +FB60 +0DA0 +5920 +A920 +A860 +ENDCHAR +STARTCHAR U_7DCA +ENCODING 32202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A280 +F900 +A280 +FC40 +1100 +3E00 +1080 +7F80 +2500 +DCC0 +ENDCHAR +STARTCHAR U_7DCB +ENCODING 32203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +5EE0 +F280 +2EE0 +5280 +EA80 +0EE0 +5280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_7DCC +ENCODING 32204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +5900 +FFE0 +2540 +5920 +EFE0 +0240 +5680 +A980 +AE60 +ENDCHAR +STARTCHAR U_7DCD +ENCODING 32205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2600 +5480 +F7E0 +2480 +5460 +F7C0 +0440 +57C0 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_7DCE +ENCODING 32206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +F080 +2E80 +5AA0 +FEA0 +00C0 +56A0 +A960 +AA20 +ENDCHAR +STARTCHAR U_7DCF +ENCODING 32207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +4440 +5520 +EA40 +27C0 +4000 +F440 +0AA0 +AA60 +A3C0 +ENDCHAR +STARTCHAR U_7DD0 +ENCODING 32208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7B80 +8100 +7FC0 +5480 +FFE0 +4480 +55C0 +7EA0 +04A0 +1900 +ENDCHAR +STARTCHAR U_7DD1 +ENCODING 32209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4040 +97C0 +E040 +2FE0 +4920 +E540 +0380 +A540 +A920 +8300 +ENDCHAR +STARTCHAR U_7DD2 +ENCODING 32210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +5140 +FFE0 +2100 +53E0 +EE20 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DD3 +ENCODING 32211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +5280 +D100 +67C0 +5540 +F540 +0FE0 +0100 +A280 +AC60 +ENDCHAR +STARTCHAR U_7DD4 +ENCODING 32212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +4540 +4100 +EFE0 +4820 +EBA0 +0AA0 +4AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_7DD5 +ENCODING 32213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4280 +F100 +2EE0 +4440 +F7C0 +0440 +A7C0 +8440 +0840 +ENDCHAR +STARTCHAR U_7DD6 +ENCODING 32214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2240 +57C0 +F280 +2FE0 +F240 +07E0 +AC40 +B7C0 +8440 +07C0 +ENDCHAR +STARTCHAR U_7DD7 +ENCODING 32215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +5F20 +F520 +25E0 +5720 +EDE0 +0520 +5520 +ADE0 +AD20 +ENDCHAR +STARTCHAR U_7DD8 +ENCODING 32216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F480 +2780 +54A0 +EFA0 +0540 +57A0 +A960 +AA20 +ENDCHAR +STARTCHAR U_7DD9 +ENCODING 32217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +5280 +F380 +2100 +57C0 +ED40 +07C0 +5900 +AFE0 +0100 +ENDCHAR +STARTCHAR U_7DDA +ENCODING 32218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5440 +F7C0 +2440 +57C0 +E920 +0740 +5380 +AD40 +AB20 +ENDCHAR +STARTCHAR U_7DDB +ENCODING 32219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +FAA0 +2AA0 +5AE0 +F100 +0FE0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DDC +ENCODING 32220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF00 +8900 +FBC0 +8900 +FA40 +27E0 +F880 +AAC0 +B4A0 +2100 +ENDCHAR +STARTCHAR U_7DDD +ENCODING 32221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +53C0 +F000 +27E0 +5240 +EBC0 +0240 +53C0 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7DDE +ENCODING 32222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +24A0 +54A0 +F700 +24E0 +57A0 +ECA0 +07A0 +5440 +ACA0 +AD20 +ENDCHAR +STARTCHAR U_7DDF +ENCODING 32223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +5FE0 +F540 +27C0 +5540 +EFC0 +0100 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7DE0 +ENCODING 32224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +FFE0 +2920 +57C0 +ED40 +0540 +5540 +ADC0 +A900 +ENDCHAR +STARTCHAR U_7DE1 +ENCODING 32225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F480 +27E0 +5440 +EFE0 +0240 +53C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_7DE2 +ENCODING 32226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +5FE0 +F240 +27E0 +54A0 +F4A0 +07E0 +54A0 +AFE0 +0420 +ENDCHAR +STARTCHAR U_7DE3 +ENCODING 32227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5520 +EAC0 +0580 +52C0 +ACA0 +0300 +ENDCHAR +STARTCHAR U_7DE4 +ENCODING 32228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +4540 +F5C0 +2400 +57E0 +F100 +0FE0 +5380 +B540 +0920 +ENDCHAR +STARTCHAR U_7DE5 +ENCODING 32229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4A40 +5BC0 +E900 +2FE0 +5900 +FB80 +0D40 +5920 +A900 +ENDCHAR +STARTCHAR U_7DE6 +ENCODING 32230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +57E0 +E900 +02C0 +5620 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_7DE7 +ENCODING 32231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +E280 +2FE0 +5AA0 +FCE0 +0820 +5FE0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_7DE8 +ENCODING 32232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5820 +FFE0 +2800 +5FE0 +EAA0 +0FE0 +5AA0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_7DE9 +ENCODING 32233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5280 +F7E0 +2100 +5FE0 +EA00 +03E0 +5540 +A880 +AB60 +ENDCHAR +STARTCHAR U_7DEA +ENCODING 32234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +5480 +EEE0 +2520 +55A0 +F560 +06A0 +5440 +AC40 +07E0 +ENDCHAR +STARTCHAR U_7DEB +ENCODING 32235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5AA0 +E6A0 +2D20 +52E0 +F000 +0A40 +5520 +AC40 +13C0 +ENDCHAR +STARTCHAR U_7DEC +ENCODING 32236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +5FE0 +EAA0 +2AA0 +5BA0 +FAA0 +0BA0 +5AA0 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7DED +ENCODING 32237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +57E0 +F520 +27E0 +5240 +FBC0 +0240 +53C0 +AA40 +02C0 +ENDCHAR +STARTCHAR U_7DEE +ENCODING 32238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5400 +FBC0 +2240 +53C0 +EA40 +07C0 +5A40 +A980 +0660 +ENDCHAR +STARTCHAR U_7DEF +ENCODING 32239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5240 +FFE0 +2440 +57C0 +E880 +07E0 +5480 +AFE0 +A880 +ENDCHAR +STARTCHAR U_7DF0 +ENCODING 32240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +4BA0 +F000 +2EA0 +5AA0 +FEA0 +0AA0 +5EA0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7DF1 +ENCODING 32241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2440 +57E0 +ED00 +25E0 +5680 +FC80 +07E0 +5480 +AD40 +A620 +ENDCHAR +STARTCHAR U_7DF2 +ENCODING 32242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +4A80 +5EC0 +EAA0 +2B80 +5EA0 +EAA0 +0A40 +5E80 +A900 +AA00 +ENDCHAR +STARTCHAR U_7DF3 +ENCODING 32243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5000 +7DE0 +50A0 +7D60 +5500 +4A80 +7FC0 +8A80 +B660 +ENDCHAR +STARTCHAR U_7DF4 +ENCODING 32244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_7DF5 +ENCODING 32245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2AA0 +4920 +5AA0 +EFE0 +2440 +5A20 +F3C0 +0640 +5180 +AE60 +ENDCHAR +STARTCHAR U_7DF6 +ENCODING 32246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4880 +9BE0 +EAA0 +2BE0 +4AA0 +FBE0 +0A80 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DF7 +ENCODING 32247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +5FE0 +E540 +27C0 +5540 +EFC0 +0100 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7DF8 +ENCODING 32248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4280 +5FE0 +EAA0 +2FE0 +5100 +F7C0 +0100 +5100 +AFE0 +ENDCHAR +STARTCHAR U_7DF9 +ENCODING 32249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5000 +EFE0 +0480 +54E0 +AA80 +A9E0 +ENDCHAR +STARTCHAR U_7DFA +ENCODING 32250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5740 +E540 +2FE0 +5820 +FBA0 +0AA0 +5BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7DFB +ENCODING 32251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4480 +9AE0 +EFA0 +44A0 +94A0 +FEA0 +04A0 +5440 +AEA0 +A920 +ENDCHAR +STARTCHAR U_7DFC +ENCODING 32252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +E440 +27C0 +5000 +FFE0 +0AA0 +AAA0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_7DFD +ENCODING 32253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +47E0 +F420 +27E0 +5420 +F7E0 +0420 +57E0 +5240 +8420 +ENDCHAR +STARTCHAR U_7DFE +ENCODING 32254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +5BE0 +EAA0 +2BE0 +5AA0 +FBE0 +0880 +ABE0 +A880 +13E0 +ENDCHAR +STARTCHAR U_7DFF +ENCODING 32255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +57C0 +F000 +27C0 +5440 +F7C0 +0200 +5560 +9440 +03C0 +ENDCHAR +STARTCHAR U_7E00 +ENCODING 32256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +4520 +5760 +E400 +27E0 +54A0 +FEA0 +0440 +54A0 +AD20 +ENDCHAR +STARTCHAR U_7E01 +ENCODING 32257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +57C0 +E040 +2FE0 +5300 +FDA0 +02C0 +ADC0 +D2A0 +0D80 +ENDCHAR +STARTCHAR U_7E02 +ENCODING 32258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47C0 +5440 +E440 +27C0 +5200 +F540 +0C20 +5440 +ABC0 +ENDCHAR +STARTCHAR U_7E03 +ENCODING 32259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2920 +55C0 +F700 +29E0 +5240 +FBC0 +0240 +ABC0 +AA40 +02C0 +ENDCHAR +STARTCHAR U_7E04 +ENCODING 32260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +47E0 +5520 +E7E0 +2520 +57E0 +FD20 +07E0 +5100 +A8E0 +ENDCHAR +STARTCHAR U_7E05 +ENCODING 32261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +4880 +5FA0 +EAA0 +2FA0 +4AA0 +FD40 +0A40 +ADA0 +5120 +ENDCHAR +STARTCHAR U_7E06 +ENCODING 32262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +4800 +FBC0 +2E40 +4BC0 +FA40 +0BC0 +A800 +AFE0 +0800 +ENDCHAR +STARTCHAR U_7E07 +ENCODING 32263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +4FE0 +A820 +E7C0 +4000 +97C0 +FC40 +07C0 +5440 +AFE0 +ENDCHAR +STARTCHAR U_7E08 +ENCODING 32264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5AE0 +9480 +2940 +FFE0 +8520 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7E09 +ENCODING 32265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +5AA0 +F6C0 +2FE0 +5000 +EFC0 +0440 +57C0 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_7E0A +ENCODING 32266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F280 +2440 +5820 +EFC0 +0540 +5540 +AD40 +AFE0 +ENDCHAR +STARTCHAR U_7E0B +ENCODING 32267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +5520 +F1E0 +2500 +55E0 +ED20 +0520 +55E0 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7E0C +ENCODING 32268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +4940 +8BE0 +E080 +3AA0 +4AA0 +EBE0 +0880 +5880 +A500 +ABE0 +ENDCHAR +STARTCHAR U_7E0D +ENCODING 32269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +8240 +FFE0 +2920 +5FE0 +F200 +03C0 +5240 +AC40 +A980 +ENDCHAR +STARTCHAR U_7E0E +ENCODING 32270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5740 +F540 +2FE0 +5440 +EFC0 +0440 +57C0 +AC40 +ACC0 +ENDCHAR +STARTCHAR U_7E0F +ENCODING 32271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA60 +AFC0 +FA40 +A980 +AA60 +3F00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7E10 +ENCODING 32272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +56A0 +F3E0 +22A0 +53C0 +ED20 +0560 +57E0 +A920 +AE40 +ENDCHAR +STARTCHAR U_7E11 +ENCODING 32273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FE0 +9500 +EFC0 +2540 +5FE0 +F540 +0FC0 +5580 +AD40 +B520 +ENDCHAR +STARTCHAR U_7E12 +ENCODING 32274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +F100 +27C0 +5100 +EFE0 +0200 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7E13 +ENCODING 32275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +4BE0 +FA20 +2BE0 +5A20 +FBE0 +0880 +59C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_7E14 +ENCODING 32276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5180 +FEE0 +2AA0 +5440 +EAA0 +0FE0 +5100 +AD40 +A920 +ENDCHAR +STARTCHAR U_7E15 +ENCODING 32277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +5540 +F6C0 +27C0 +5000 +FFE0 +0AA0 +5AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_7E16 +ENCODING 32278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +FFE0 +2100 +57C0 +F100 +0FE0 +5440 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E17 +ENCODING 32279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5000 +F3C0 +2240 +57E0 +EA40 +03C0 +56A0 +AB40 +AA20 +ENDCHAR +STARTCHAR U_7E18 +ENCODING 32280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2E40 +4A80 +5500 +EFC0 +4400 +EFC0 +0200 +BFE0 +8480 +1860 +ENDCHAR +STARTCHAR U_7E19 +ENCODING 32281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +4FE0 +F440 +27C0 +5440 +F7C0 +0440 +AFE0 +A040 +ENDCHAR +STARTCHAR U_7E1A +ENCODING 32282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +5520 +F2C0 +2200 +54E0 +EC20 +0760 +5420 +AC20 +AFE0 +ENDCHAR +STARTCHAR U_7E1B +ENCODING 32283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +4FE0 +5520 +E7E0 +2520 +57E0 +F520 +0040 +5FE0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7E1C +ENCODING 32284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +4FE0 +F420 +27E0 +5420 +FFE0 +0420 +57E0 +A940 +AE20 +ENDCHAR +STARTCHAR U_7E1D +ENCODING 32285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5440 +F7C0 +2440 +5740 +EDC0 +0440 +57E0 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7E1E +ENCODING 32286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F3C0 +2000 +5FE0 +E820 +0BA0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_7E1F +ENCODING 32287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +F800 +2FE0 +5AA0 +FB40 +2840 +57E0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7E20 +ENCODING 32288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FE60 +AA00 +73E0 +1540 +7F40 +1080 +5540 +9220 +ENDCHAR +STARTCHAR U_7E21 +ENCODING 32289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +FFE0 +2440 +5280 +FFE0 +0100 +57C0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E22 +ENCODING 32290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AA80 +BFE0 +E400 +BFE0 +AAC0 +F520 +AFE0 +A580 +A940 +B320 +ENDCHAR +STARTCHAR U_7E23 +ENCODING 32291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +7920 +4BC0 +7880 +4920 +FFE0 +1080 +5AC0 +94A0 +3180 +ENDCHAR +STARTCHAR U_7E24 +ENCODING 32292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +47C0 +F100 +2FE0 +4280 +FD40 +07A0 +5140 +AD20 +AB20 +ENDCHAR +STARTCHAR U_7E25 +ENCODING 32293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +FFE0 +2440 +4FA0 +F100 +07E0 +AB80 +A540 +0920 +ENDCHAR +STARTCHAR U_7E26 +ENCODING 32294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2620 +2520 +4840 +F3E0 +4480 +AA80 +FAE0 +0A80 +AA80 +AD80 +8C60 +ENDCHAR +STARTCHAR U_7E27 +ENCODING 32295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +25E0 +5540 +EA80 +2B40 +5AA0 +FBE0 +0880 +AAC0 +AAA0 +8DA0 +ENDCHAR +STARTCHAR U_7E28 +ENCODING 32296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5540 +F380 +0FE0 +B280 +A4A0 +08E0 +ENDCHAR +STARTCHAR U_7E29 +ENCODING 32297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +49A0 +F640 +2420 +5BC0 +F000 +0FE0 +A100 +A540 +0B20 +ENDCHAR +STARTCHAR U_7E2A +ENCODING 32298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +F540 +27C0 +5540 +FFE0 +0540 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E2B +ENCODING 32299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +5140 +E280 +2D40 +57E0 +FC80 +07E0 +5480 +AC80 +ABE0 +ENDCHAR +STARTCHAR U_7E2C +ENCODING 32300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +FA80 +2B80 +4AA0 +FFA0 +0AC0 +AFA0 +AA60 +9420 +ENDCHAR +STARTCHAR U_7E2D +ENCODING 32301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +E920 +2AA0 +5FE0 +F100 +0FE0 +5AA0 +AFA0 +A860 +ENDCHAR +STARTCHAR U_7E2E +ENCODING 32302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4420 +FBE0 +2480 +5DE0 +F520 +05E0 +5520 +ADE0 +A520 +ENDCHAR +STARTCHAR U_7E2F +ENCODING 32303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F7E0 +2100 +57C0 +ED40 +07C0 +5540 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E30 +ENCODING 32304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4A80 +92E0 +F680 +23E0 +5880 +FA80 +2AE0 +5A80 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7E31 +ENCODING 32305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +4940 +96A0 +E800 +2880 +4A80 +FAE0 +2A80 +5A80 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7E32 +ENCODING 32306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +57E0 +E4A0 +27E0 +4140 +F2A0 +0FE0 +5100 +AD40 +AB20 +ENDCHAR +STARTCHAR U_7E33 +ENCODING 32307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5540 +F7C0 +2540 +57C0 +E920 +07E0 +5480 +AA80 +A900 +ENDCHAR +STARTCHAR U_7E34 +ENCODING 32308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4280 +FFE0 +2AA0 +57C0 +F500 +07C0 +5900 +AFE0 +A900 +ENDCHAR +STARTCHAR U_7E35 +ENCODING 32309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +F440 +2FE0 +5AA0 +FFE0 +0440 +5280 +A900 +AEE0 +ENDCHAR +STARTCHAR U_7E36 +ENCODING 32310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5140 +FB40 +22E0 +FD20 +2A00 +1480 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7E37 +ENCODING 32311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4540 +FFE0 +2540 +5FE0 +F920 +0FE0 +5480 +AB80 +AE60 +ENDCHAR +STARTCHAR U_7E38 +ENCODING 32312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +F7C0 +2440 +57C0 +F440 +0FE0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7E39 +ENCODING 32313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +FAA0 +2FE0 +4000 +F7C0 +0000 +5FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_7E3A +ENCODING 32314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +4FE0 +82A0 +FBE0 +2AA0 +4BE0 +F880 +0BE0 +5880 +A880 +A7E0 +ENDCHAR +STARTCHAR U_7E3B +ENCODING 32315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4A80 +4540 +5FA0 +4A80 +B660 +ENDCHAR +STARTCHAR U_7E3C +ENCODING 32316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4900 +BDE0 +D200 +5DE0 +B440 +F540 +1560 +D540 +B6C0 +AE60 +ENDCHAR +STARTCHAR U_7E3D +ENCODING 32317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5560 +F6A0 +2520 +56A0 +EFE0 +0140 +56A0 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_7E3E +ENCODING 32318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7C0 +2100 +5FE0 +EC40 +07C0 +5440 +A7C0 +AC60 +ENDCHAR +STARTCHAR U_7E3F +ENCODING 32319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +5440 +EAA0 +2FE0 +5240 +FD20 +0280 +A940 +A880 +0300 +ENDCHAR +STARTCHAR U_7E40 +ENCODING 32320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +57E0 +F280 +27E0 +5480 +EFE0 +0480 +57E0 +AC80 +A7E0 +ENDCHAR +STARTCHAR U_7E41 +ENCODING 32321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +D540 +7E80 +5540 +7A20 +1F00 +0880 +7F40 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E42 +ENCODING 32322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +F6C0 +2300 +5540 +FBA0 +0100 +57E0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E43 +ENCODING 32323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +4FE0 +F000 +2EE0 +5AA0 +FEE0 +0AA0 +5EE0 +AAA0 +B760 +ENDCHAR +STARTCHAR U_7E44 +ENCODING 32324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9140 +FA20 +93E0 +A940 +FC80 +0B60 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E45 +ENCODING 32325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +5540 +F7C0 +2540 +57C0 +ED40 +0FE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_7E46 +ENCODING 32326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +4360 +FDA0 +2120 +46C0 +FAA0 +0500 +5240 +A880 +AF00 +ENDCHAR +STARTCHAR U_7E47 +ENCODING 32327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C60 +E780 +A880 +5140 +4380 +7D40 +93E0 +FC80 +55C0 +56A0 +7D80 +ENDCHAR +STARTCHAR U_7E48 +ENCODING 32328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +4520 +A7E0 +DC80 +53E0 +BEA0 +F6A0 +07E0 +D480 +B4A0 +8BE0 +ENDCHAR +STARTCHAR U_7E49 +ENCODING 32329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +52A0 +EEC0 +0280 +56C0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_7E4A +ENCODING 32330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +44A0 +FFE0 +2A80 +4AA0 +FBA0 +0AC0 +ABA0 +BD60 +0220 +ENDCHAR +STARTCHAR U_7E4B +ENCODING 32331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +AC20 +FBC0 +AA40 +FD80 +2A60 +1500 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E4C +ENCODING 32332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4D60 +F4A0 +27E0 +5240 +FD20 +03C0 +5540 +A880 +AF60 +ENDCHAR +STARTCHAR U_7E4D +ENCODING 32333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5140 +FFE0 +2540 +57E0 +F560 +05A0 +AFE0 +A5A0 +8960 +ENDCHAR +STARTCHAR U_7E4E +ENCODING 32334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +4AA0 +FFE0 +2A80 +5680 +F540 +0A20 +A000 +AAA0 +12A0 +ENDCHAR +STARTCHAR U_7E4F +ENCODING 32335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +E880 +2EE0 +5480 +FFC0 +0480 +AFE0 +A480 +0860 +ENDCHAR +STARTCHAR U_7E50 +ENCODING 32336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4540 +F7C0 +2540 +57C0 +F140 +0FA0 +5240 +AEA0 +AB80 +ENDCHAR +STARTCHAR U_7E51 +ENCODING 32337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +4FE0 +F440 +2BA0 +5280 +FFE0 +0AA0 +5BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7E52 +ENCODING 32338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +FAA0 +2FE0 +5820 +F7C0 +0440 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E53 +ENCODING 32339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +F440 +2FE0 +5A00 +FEE0 +0AA0 +5EA0 +AB40 +AEA0 +ENDCHAR +STARTCHAR U_7E54 +ENCODING 32340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +4A80 +EFE0 +2080 +5EA0 +FAA0 +0EC0 +5A40 +AEE0 +A120 +ENDCHAR +STARTCHAR U_7E55 +ENCODING 32341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4100 +F7C0 +2100 +5FE0 +F280 +0FE0 +B440 +AC40 +07C0 +ENDCHAR +STARTCHAR U_7E56 +ENCODING 32342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +8AE0 +FFA0 +40A0 +AEA0 +FAA0 +0EA0 +AA40 +AEA0 +0B20 +ENDCHAR +STARTCHAR U_7E57 +ENCODING 32343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FE0 +F540 +2920 +5440 +F7E0 +0A40 +5740 +A5E0 +A840 +ENDCHAR +STARTCHAR U_7E58 +ENCODING 32344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +4FE0 +F540 +2900 +5FE0 +FAA0 +2FE0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_7E59 +ENCODING 32345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +5540 +EFE0 +2540 +4920 +FFE0 +0520 +B7E0 +AD20 +07E0 +ENDCHAR +STARTCHAR U_7E5A +ENCODING 32346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +8AA0 +F7C0 +2C60 +57C0 +F440 +07C0 +5540 +A920 +AB20 +ENDCHAR +STARTCHAR U_7E5B +ENCODING 32347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7CE0 +1080 +FFE0 +2A20 +73E0 +2A20 +FFE0 +5480 +93E0 +3080 +ENDCHAR +STARTCHAR U_7E5C +ENCODING 32348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +EAA0 +2FE0 +5820 +FFE0 +0040 +AFE0 +A440 +02C0 +ENDCHAR +STARTCHAR U_7E5D +ENCODING 32349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +FAA0 +2FE0 +5AA0 +FBA0 +0AA0 +ABA0 +ACA0 +0860 +ENDCHAR +STARTCHAR U_7E5E +ENCODING 32350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +EFE0 +2440 +5EE0 +F440 +07E0 +5280 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_7E5F +ENCODING 32351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4FE0 +F540 +27C0 +5540 +F7C0 +0100 +B7E0 +A900 +0100 +ENDCHAR +STARTCHAR U_7E60 +ENCODING 32352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +5140 +9F00 +52A0 +CE40 +79C0 +0A00 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E61 +ENCODING 32353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +5140 +E7E0 +2140 +57C0 +FD20 +07E0 +AD20 +B7E0 +8920 +ENDCHAR +STARTCHAR U_7E62 +ENCODING 32354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +9540 +EFE0 +2440 +57C0 +EC40 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E63 +ENCODING 32355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +4FE0 +F140 +27E0 +5100 +FFE0 +2540 +57C0 +A540 +AFE0 +ENDCHAR +STARTCHAR U_7E64 +ENCODING 32356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +2A80 +D560 +3F80 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E65 +ENCODING 32357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4100 +97C0 +E440 +57C0 +F280 +0FE0 +A7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_7E66 +ENCODING 32358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3DE0 +4520 +BDE0 +D080 +5FE0 +A6A0 +E7E0 +0480 +B4A0 +ABE0 +ENDCHAR +STARTCHAR U_7E67 +ENCODING 32359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5920 +E540 +2920 +57C0 +F000 +0FE0 +B240 +AFE0 +ENDCHAR +STARTCHAR U_7E68 +ENCODING 32360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25C0 +5480 +F3E0 +2D40 +5480 +F7E0 +0480 +57E0 +AC80 +ABE0 +ENDCHAR +STARTCHAR U_7E69 +ENCODING 32361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4EE0 +F280 +2EE0 +5AA0 +FEE0 +0AA0 +5EE0 +AA80 +A9E0 +ENDCHAR +STARTCHAR U_7E6A +ENCODING 32362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +47C0 +F820 +2FE0 +4AA0 +FFE0 +0440 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E6B +ENCODING 32363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +5460 +FFC0 +5540 +7C80 +1260 +2480 +7F40 +2280 +CE60 +ENDCHAR +STARTCHAR U_7E6C +ENCODING 32364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5540 +FBA0 +2FE0 +5000 +F7E0 +0420 +57A0 +96A0 +07E0 +ENDCHAR +STARTCHAR U_7E6D +ENCODING 32365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFE0 +9520 +A7E0 +FD60 +97E0 +A520 +FD60 +AFA0 +D420 +ENDCHAR +STARTCHAR U_7E6E +ENCODING 32366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +47C0 +F540 +27C0 +5000 +FFE0 +0540 +A7C0 +A540 +0FE0 +ENDCHAR +STARTCHAR U_7E6F +ENCODING 32367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +5FE0 +F000 +2FE0 +5440 +EFC0 +02A0 +56C0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_7E70 +ENCODING 32368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4440 +FFE0 +2AA0 +5EE0 +F100 +0FE0 +5580 +A940 +A920 +ENDCHAR +STARTCHAR U_7E71 +ENCODING 32369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +57C0 +FAC0 +2540 +4240 +F580 +0E40 +ACA0 +B380 +ENDCHAR +STARTCHAR U_7E72 +ENCODING 32370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4EA0 +9520 +FF40 +5540 +9FE0 +F540 +1FE0 +5540 +B540 +A340 +ENDCHAR +STARTCHAR U_7E73 +ENCODING 32371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +AAE0 +EFA0 +4AA0 +AFA0 +F4A0 +1F40 +AA40 +AAA0 +16A0 +ENDCHAR +STARTCHAR U_7E74 +ENCODING 32372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +43E0 +7880 +ABE0 +3E80 +1500 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E75 +ENCODING 32373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9B40 +E840 +2FC0 +5000 +F7C0 +0440 +57C0 +AC40 +AFE0 +ENDCHAR +STARTCHAR U_7E76 +ENCODING 32374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4280 +FFE0 +2440 +57C0 +F440 +07C0 +5540 +AAA0 +ABA0 +ENDCHAR +STARTCHAR U_7E77 +ENCODING 32375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +FFE0 +2AA0 +4FE0 +F800 +0FE0 +5AA0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_7E78 +ENCODING 32376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +5480 +E5A0 +22A0 +4DC0 +F6A0 +05A0 +5680 +AD80 +ABE0 +ENDCHAR +STARTCHAR U_7E79 +ENCODING 32377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +8FE0 +F100 +27C0 +4100 +FFE0 +0280 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E7A +ENCODING 32378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4E80 +94E0 +EFA0 +42A0 +AF40 +F2C0 +0F20 +5000 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_7E7B +ENCODING 32379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +8FE0 +FBA0 +2540 +5FE0 +F100 +0FE0 +5AA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_7E7C +ENCODING 32380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4DA0 +8A40 +FDA0 +2800 +4FE0 +FA40 +0DA0 +5A40 +ADA0 +AFE0 +ENDCHAR +STARTCHAR U_7E7D +ENCODING 32381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +8820 +F780 +2540 +5BC0 +FC40 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E7E +ENCODING 32382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +4BE0 +92A0 +E7E0 +3D40 +5540 +F5E0 +0520 +55E0 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7E7F +ENCODING 32383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +2540 +4760 +9540 +E7A0 +4720 +F000 +0FE0 +AAA0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_7E80 +ENCODING 32384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4560 +4B40 +9FE0 +E940 +2BE0 +4880 +FBC0 +0880 +5FE0 +A940 +AE20 +ENDCHAR +STARTCHAR U_7E81 +ENCODING 32385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +9FE0 +EAA0 +2FE0 +5100 +F7C0 +0100 +5FE0 +A540 +AAA0 +ENDCHAR +STARTCHAR U_7E82 +ENCODING 32386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +2480 +FFE0 +4A40 +9520 +7FC0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7E83 +ENCODING 32387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +FD60 +2540 +4960 +F440 +07C0 +A440 +A7C0 +0840 +ENDCHAR +STARTCHAR U_7E84 +ENCODING 32388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +A480 +E7C0 +5280 +A900 +FEE0 +0900 +AFE0 +A900 +97E0 +ENDCHAR +STARTCHAR U_7E85 +ENCODING 32389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4BA0 +AAE0 +E7C0 +4AA0 +AFE0 +E100 +0FE0 +A540 +A520 +8920 +ENDCHAR +STARTCHAR U_7E86 +ENCODING 32390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +9FE0 +E100 +27C0 +5100 +FFE0 +0AA0 +5FE0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_7E87 +ENCODING 32391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95E0 +5880 +FFE0 +5520 +93E0 +7920 +25E0 +FF20 +11E0 +5540 +B620 +ENDCHAR +STARTCHAR U_7E88 +ENCODING 32392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +9FE0 +E520 +2FE0 +5120 +FFE0 +2B20 +5BE0 +AE40 +A0A0 +ENDCHAR +STARTCHAR U_7E89 +ENCODING 32393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4FE0 +E440 +3FE0 +4AA0 +A7C0 +F440 +07C0 +A440 +A7C0 +0C60 +ENDCHAR +STARTCHAR U_7E8A +ENCODING 32394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9A40 +EFE0 +2A40 +5FE0 +F940 +0FC0 +5940 +A7C0 +AC60 +ENDCHAR +STARTCHAR U_7E8B +ENCODING 32395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4440 +97C0 +E440 +4FE0 +9B20 +F640 +0BA0 +5640 +A980 +AE60 +ENDCHAR +STARTCHAR U_7E8C +ENCODING 32396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9100 +EFE0 +2AA0 +5FE0 +F440 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E8D +ENCODING 32397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E8E +ENCODING 32398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +5EA0 +8480 +FFE0 +4540 +ADC0 +E560 +0DE0 +A540 +AEA0 +0120 +ENDCHAR +STARTCHAR U_7E8F +ENCODING 32399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9940 +EFC0 +4940 +8FE0 +FA40 +2D20 +57E0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7E90 +ENCODING 32400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5E80 +8DE0 +F320 +55E0 +9520 +E9E0 +0920 +B5E0 +A2A0 +0120 +ENDCHAR +STARTCHAR U_7E91 +ENCODING 32401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +9FE0 +E920 +2FC0 +5920 +EBE0 +0AA0 +5FE0 +A540 +AFE0 +ENDCHAR +STARTCHAR U_7E92 +ENCODING 32402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4800 +8BE0 +EAA0 +2BE0 +4AA0 +EBE0 +0940 +ABE0 +A880 +13E0 +ENDCHAR +STARTCHAR U_7E93 +ENCODING 32403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +9EE0 +EAA0 +4EE0 +AA40 +F1A0 +07E0 +AA40 +A980 +0660 +ENDCHAR +STARTCHAR U_7E94 +ENCODING 32404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4880 +5FC0 +E840 +2FC0 +5920 +F7E0 +0940 +BFC0 +A520 +09E0 +ENDCHAR +STARTCHAR U_7E95 +ENCODING 32405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9AA0 +EEE0 +2480 +5FE0 +E480 +0FE0 +5CA0 +A640 +A420 +ENDCHAR +STARTCHAR U_7E96 +ENCODING 32406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +45A0 +9FE0 +EA80 +5BA0 +8AA0 +FBC0 +2A80 +4AA0 +BF60 +A020 +ENDCHAR +STARTCHAR U_7E97 +ENCODING 32407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +9900 +EFE0 +2900 +5FE0 +E900 +0FE0 +5AA0 +AEE0 +ABA0 +ENDCHAR +STARTCHAR U_7E98 +ENCODING 32408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4FE0 +9A40 +EFE0 +4960 +97C0 +F440 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E99 +ENCODING 32409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +AFE0 +E540 +4BE0 +A540 +FBE0 +0F40 +A1E0 +AB40 +81E0 +ENDCHAR +STARTCHAR U_7E9A +ENCODING 32410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4000 +8FE0 +FAA0 +2FE0 +5AA0 +FFE0 +0480 +57C0 +AC80 +A6E0 +ENDCHAR +STARTCHAR U_7E9B +ENCODING 32411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2480 +FFE0 +2480 +FFC0 +6940 +5BE0 +FDC0 +AAA0 +ENDCHAR +STARTCHAR U_7E9C +ENCODING 32412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +5F40 +EAE0 +2FE0 +5440 +F7C0 +0440 +57C0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7E9D +ENCODING 32413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4540 +87C0 +ED60 +4AA0 +8FE0 +E100 +07C0 +A280 +AFE0 +0540 +ENDCHAR +STARTCHAR U_7E9E +ENCODING 32414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +4BC0 +9C60 +EBA0 +5C20 +93E0 +F6A0 +03A0 +AA00 +AAA0 +11C0 +ENDCHAR +STARTCHAR U_7E9F +ENCODING 32415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 10 0 0 +BITMAP +20 +20 +40 +F0 +20 +40 +F0 +00 +30 +C0 +ENDCHAR +STARTCHAR U_7EA0 +ENCODING 32416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +2240 +4A40 +5240 +E240 +2240 +42C0 +F340 +0A40 +3040 +C040 +ENDCHAR +STARTCHAR U_7EA1 +ENCODING 32417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +F080 +2FE0 +4080 +F080 +0080 +3080 +C080 +0380 +ENDCHAR +STARTCHAR U_7EA2 +ENCODING 32418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +5100 +E100 +2100 +4100 +F100 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7EA3 +ENCODING 32419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +4840 +F7E0 +2040 +4440 +F240 +0240 +3040 +C040 +00C0 +ENDCHAR +STARTCHAR U_7EA4 +ENCODING 32420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +4900 +5100 +E100 +2FE0 +4100 +F100 +0900 +3100 +C100 +ENDCHAR +STARTCHAR U_7EA5 +ENCODING 32421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4BE0 +5400 +E3C0 +2040 +4080 +F100 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7EA6 +ENCODING 32422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4BE0 +5420 +E020 +2220 +4120 +F120 +0820 +3120 +C0C0 +ENDCHAR +STARTCHAR U_7EA7 +ENCODING 32423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +4A40 +5280 +E2E0 +2220 +4220 +F540 +0C80 +3540 +CA20 +ENDCHAR +STARTCHAR U_7EA8 +ENCODING 32424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47C0 +5140 +E540 +2340 +4140 +F2C0 +0A40 +3460 +C820 +ENDCHAR +STARTCHAR U_7EA9 +ENCODING 32425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +4FE0 +5400 +E400 +2400 +4400 +F400 +0400 +3400 +C800 +ENDCHAR +STARTCHAR U_7EAA +ENCODING 32426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4040 +F040 +2040 +47C0 +F400 +0400 +3420 +C420 +03E0 +ENDCHAR +STARTCHAR U_7EAB +ENCODING 32427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +20A0 +48A0 +52A0 +E2A0 +24A0 +40A0 +F0A0 +0920 +32A0 +C440 +ENDCHAR +STARTCHAR U_7EAC +ENCODING 32428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4900 +57C0 +E100 +2FE0 +4120 +F120 +0960 +3100 +C100 +ENDCHAR +STARTCHAR U_7EAD +ENCODING 32429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +4800 +5000 +EFE0 +2100 +4100 +F200 +0C40 +37A0 +C420 +ENDCHAR +STARTCHAR U_7EAE +ENCODING 32430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +57E0 +E200 +2280 +4480 +F500 +0940 +2A20 +D3E0 +ENDCHAR +STARTCHAR U_7EAF +ENCODING 32431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +5100 +E540 +2540 +47C0 +F100 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7EB0 +ENCODING 32432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4C80 +54A0 +E7C0 +2480 +4480 +F480 +0DA0 +36A0 +C460 +ENDCHAR +STARTCHAR U_7EB1 +ENCODING 32433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4540 +5520 +E520 +2900 +4120 +F040 +0080 +3300 +CC00 +ENDCHAR +STARTCHAR U_7EB2 +ENCODING 32434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +4E60 +5560 +E4A0 +24A0 +4560 +F620 +0C20 +3420 +C460 +ENDCHAR +STARTCHAR U_7EB3 +ENCODING 32435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5520 +E520 +25A0 +4560 +F620 +0C20 +3420 +C4E0 +ENDCHAR +STARTCHAR U_7EB4 +ENCODING 32436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +20C0 +4700 +5100 +E100 +2FE0 +4100 +F100 +0100 +3100 +C7C0 +ENDCHAR +STARTCHAR U_7EB5 +ENCODING 32437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +5480 +E480 +2680 +4580 +F880 +0940 +3220 +C420 +ENDCHAR +STARTCHAR U_7EB6 +ENCODING 32438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4C40 +5020 +E200 +2240 +4280 +F300 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7EB7 +ENCODING 32439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +4240 +5440 +E820 +27C0 +4240 +E240 +0A40 +3440 +C8C0 +ENDCHAR +STARTCHAR U_7EB8 +ENCODING 32440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +4C80 +5480 +E7E0 +2480 +4480 +F4A0 +0DA0 +3660 +C420 +ENDCHAR +STARTCHAR U_7EB9 +ENCODING 32441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E440 +2280 +4280 +F100 +0A80 +3440 +C820 +ENDCHAR +STARTCHAR U_7EBA +ENCODING 32442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5200 +E3C0 +2240 +4240 +F240 +0A40 +3540 +C880 +ENDCHAR +STARTCHAR U_7EBB +ENCODING 32443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +47E0 +5420 +E840 +2000 +4000 +F000 +0000 +3000 +C7E0 +ENDCHAR +STARTCHAR U_7EBC +ENCODING 32444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +20A0 +40A0 +57A0 +E420 +2420 +47A0 +F0A0 +00A0 +3520 +C220 +ENDCHAR +STARTCHAR U_7EBD +ENCODING 32445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4A40 +5240 +E240 +27C0 +4240 +F240 +0A40 +3240 +CFE0 +ENDCHAR +STARTCHAR U_7EBE +ENCODING 32446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +4980 +5080 +EFE0 +20A0 +40C0 +F080 +0880 +3080 +C380 +ENDCHAR +STARTCHAR U_7EBF +ENCODING 32447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +43C0 +4E00 +E3E0 +2E00 +4240 +F280 +0920 +32A0 +CC60 +ENDCHAR +STARTCHAR U_7EC0 +ENCODING 32448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +4FE0 +5240 +E240 +23C0 +4240 +F240 +0A40 +33C0 +C240 +ENDCHAR +STARTCHAR U_7EC1 +ENCODING 32449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +4540 +5FE0 +E540 +2540 +45C0 +F540 +0C00 +3400 +C7E0 +ENDCHAR +STARTCHAR U_7EC2 +ENCODING 32450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +4FE0 +5200 +E3E0 +2240 +4240 +F540 +0880 +3140 +C620 +ENDCHAR +STARTCHAR U_7EC3 +ENCODING 32451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A00 +5780 +E480 +27E0 +4080 +F2C0 +0CA0 +34A0 +C180 +ENDCHAR +STARTCHAR U_7EC4 +ENCODING 32452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4440 +5440 +E7C0 +2440 +4440 +F7C0 +0440 +3440 +CFE0 +ENDCHAR +STARTCHAR U_7EC5 +ENCODING 32453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47E0 +5520 +E7E0 +2520 +4520 +F7E0 +0900 +3100 +C100 +ENDCHAR +STARTCHAR U_7EC6 +ENCODING 32454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +44A0 +54A0 +E4A0 +27E0 +44A0 +F4A0 +04A0 +37E0 +C420 +ENDCHAR +STARTCHAR U_7EC7 +ENCODING 32455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4C40 +5440 +E440 +27C0 +4000 +F280 +0240 +3420 +C820 +ENDCHAR +STARTCHAR U_7EC8 +ENCODING 32456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5440 +EA80 +2100 +4280 +EC60 +0100 +30C0 +C300 +00C0 +ENDCHAR +STARTCHAR U_7EC9 +ENCODING 32457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4480 +5100 +E7E0 +2020 +43E0 +F020 +0020 +37E0 +C020 +ENDCHAR +STARTCHAR U_7ECA +ENCODING 32458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +4540 +5100 +E7C0 +2100 +5100 +EFE0 +0100 +3100 +C100 +ENDCHAR +STARTCHAR U_7ECB +ENCODING 32459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4FE0 +52A0 +EFE0 +2A80 +4FE0 +F2A0 +0AE0 +3480 +C880 +ENDCHAR +STARTCHAR U_7ECC +ENCODING 32460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +4540 +5540 +E7C0 +2540 +4100 +F520 +0D20 +37E0 +C420 +ENDCHAR +STARTCHAR U_7ECD +ENCODING 32461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4920 +5220 +E2A0 +2440 +4BE0 +F220 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7ECE +ENCODING 32462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +4100 +5280 +EC60 +2100 +47C0 +F100 +0FE0 +3100 +C100 +ENDCHAR +STARTCHAR U_7ECF +ENCODING 32463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +4900 +5280 +E440 +2820 +47C0 +F100 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7ED0 +ENCODING 32464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4A00 +5440 +EFA0 +2000 +47C0 +F440 +0C40 +37C0 +C440 +ENDCHAR +STARTCHAR U_7ED1 +ENCODING 32465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +4FA0 +54C0 +EEA0 +24A0 +4FA0 +F4E0 +0480 +3880 +C080 +ENDCHAR +STARTCHAR U_7ED2 +ENCODING 32466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4FE0 +5500 +E520 +2F20 +4540 +F480 +04A0 +3560 +CA20 +ENDCHAR +STARTCHAR U_7ED3 +ENCODING 32467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5100 +E7C0 +2000 +47C0 +F440 +0C40 +37C0 +C440 +ENDCHAR +STARTCHAR U_7ED4 +ENCODING 32468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5280 +E7C0 +2820 +57E0 +F200 +03C0 +3040 +C180 +ENDCHAR +STARTCHAR U_7ED5 +ENCODING 32469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4FE0 +5240 +E380 +2EA0 +5060 +E7C0 +0280 +32A0 +CCE0 +ENDCHAR +STARTCHAR U_7ED6 +ENCODING 32470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4200 +5440 +EFE0 +2120 +4100 +F7C0 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7ED7 +ENCODING 32471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +4800 +5200 +E5E0 +2C40 +4440 +F440 +0440 +3440 +C4C0 +ENDCHAR +STARTCHAR U_7ED8 +ENCODING 32472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4280 +5440 +EBA0 +2000 +57E0 +E100 +1240 +2440 +C7A0 +ENDCHAR +STARTCHAR U_7ED9 +ENCODING 32473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4280 +5440 +E820 +27C0 +4000 +F7C0 +0C40 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EDA +ENCODING 32474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +47E0 +5020 +E7A0 +24A0 +47A0 +F4A0 +0FA0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_7EDB +ENCODING 32475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +4C40 +F380 +2D60 +4100 +EFE0 +0900 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_7EDC +ENCODING 32476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4440 +5680 +E900 +2280 +4C60 +F7C0 +0440 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EDD +ENCODING 32477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4480 +57E0 +ECA0 +24A0 +47E0 +F400 +0420 +3420 +C3E0 +ENDCHAR +STARTCHAR U_7EDE +ENCODING 32478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E820 +2480 +4280 +F100 +0A80 +3440 +C820 +ENDCHAR +STARTCHAR U_7EDF +ENCODING 32479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +5440 +EFE0 +22A0 +4280 +F280 +02A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_7EE0 +ENCODING 32480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4FE0 +54A0 +E7E0 +24A0 +47E0 +F280 +0900 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EE1 +ENCODING 32481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +4880 +57E0 +E420 +27E0 +4420 +F7E0 +0C20 +3420 +C4E0 +ENDCHAR +STARTCHAR U_7EE2 +ENCODING 32482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5000 +E7E0 +2420 +47E0 +F420 +0FE0 +3420 +C460 +ENDCHAR +STARTCHAR U_7EE3 +ENCODING 32483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +4900 +57E0 +E540 +2920 +4780 +F280 +0AE0 +3420 +C8C0 +ENDCHAR +STARTCHAR U_7EE4 +ENCODING 32484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2420 +4920 +5100 +E280 +2440 +4820 +F7C0 +0440 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EE5 +ENCODING 32485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +4A20 +5540 +E100 +2200 +4FE0 +F240 +0480 +3380 +CC60 +ENDCHAR +STARTCHAR U_7EE6 +ENCODING 32486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4E40 +5180 +E660 +2100 +47E0 +F100 +0D40 +3120 +C320 +ENDCHAR +STARTCHAR U_7EE7 +ENCODING 32487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26A0 +45C0 +5480 +E7E0 +2480 +45C0 +F6A0 +0480 +3480 +C7E0 +ENDCHAR +STARTCHAR U_7EE8 +ENCODING 32488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5120 +E7E0 +2500 +47E0 +F120 +0BE0 +3540 +C900 +ENDCHAR +STARTCHAR U_7EE9 +ENCODING 32489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +57C0 +E100 +2FE0 +4440 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EEA +ENCODING 32490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +4940 +57E0 +E100 +23E0 +4620 +F3E0 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7EEB +ENCODING 32491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4900 +57E0 +E240 +2520 +43C0 +F640 +0980 +3240 +C420 +ENDCHAR +STARTCHAR U_7EEC +ENCODING 32492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4240 +5100 +E7C0 +2540 +4540 +F7E0 +0100 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EED +ENCODING 32493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +57E0 +E4A0 +2A80 +4480 +EFE0 +0100 +32C0 +CC20 +ENDCHAR +STARTCHAR U_7EEE +ENCODING 32494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A80 +5440 +EFE0 +2040 +4740 +F540 +0F40 +3040 +C1C0 +ENDCHAR +STARTCHAR U_7EEF +ENCODING 32495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4EE0 +5280 +E280 +2EE0 +4280 +F280 +0EE0 +3280 +C280 +ENDCHAR +STARTCHAR U_7EF0 +ENCODING 32496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +4900 +57C0 +E440 +27C0 +4440 +F7C0 +0100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_7EF1 +ENCODING 32497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4900 +5FE0 +E820 +2BA0 +4AA0 +FAA0 +0BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_7EF2 +ENCODING 32498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5440 +E7C0 +2080 +44A0 +F7C0 +0C80 +35A0 +C6E0 +ENDCHAR +STARTCHAR U_7EF3 +ENCODING 32499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5100 +EFC0 +2940 +4FC0 +F940 +0FC0 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7EF4 +ENCODING 32500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +4FE0 +5480 +E7C0 +2480 +4480 +F7C0 +0C80 +3480 +C7E0 +ENDCHAR +STARTCHAR U_7EF5 +ENCODING 32501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4C40 +57C0 +E440 +27C0 +4100 +F7E0 +0D20 +3560 +C100 +ENDCHAR +STARTCHAR U_7EF6 +ENCODING 32502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +4A20 +5540 +EFE0 +2820 +47C0 +F240 +0980 +3240 +CC20 +ENDCHAR +STARTCHAR U_7EF7 +ENCODING 32503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4AA0 +5EE0 +EAA0 +2AA0 +4EE0 +FAA0 +0AA0 +2AA0 +D760 +ENDCHAR +STARTCHAR U_7EF8 +ENCODING 32504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +4BA0 +5920 +EFE0 +2820 +4BA0 +FAA0 +0BA0 +2820 +D0E0 +ENDCHAR +STARTCHAR U_7EF9 +ENCODING 32505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +4420 +57A0 +EA20 +2FA0 +4220 +FAA0 +0FA0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_7EFA +ENCODING 32506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2740 +4D60 +5540 +E240 +25E0 +4800 +F7E0 +0C20 +3420 +C7E0 +ENDCHAR +STARTCHAR U_7EFB +ENCODING 32507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FC0 +5200 +E7E0 +2440 +4FA0 +F480 +0DA0 +3420 +C3E0 +ENDCHAR +STARTCHAR U_7EFC +ENCODING 32508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +57C0 +E000 +27E0 +4100 +F540 +0540 +3920 +C320 +ENDCHAR +STARTCHAR U_7EFD +ENCODING 32509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4C20 +5000 +E7E0 +2080 +4280 +F2E0 +0A80 +3580 +C8E0 +ENDCHAR +STARTCHAR U_7EFE +ENCODING 32510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4C20 +53C0 +E240 +23C0 +4200 +F3E0 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7EFF +ENCODING 32511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +43C0 +F040 +2FE0 +4120 +F540 +0380 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_7F00 +ENCODING 32512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4CC0 +5440 +EAA0 +2000 +4EE0 +EAA0 +0440 +36C0 +C920 +ENDCHAR +STARTCHAR U_7F01 +ENCODING 32513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +4D40 +52A0 +E2A0 +2000 +47E0 +F520 +0FE0 +3520 +C7E0 +ENDCHAR +STARTCHAR U_7F02 +ENCODING 32514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4240 +53C0 +E100 +27E0 +4520 +F7E0 +0100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_7F03 +ENCODING 32515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +4F20 +55E0 +E520 +2F20 +55E0 +E520 +0520 +35E0 +C520 +ENDCHAR +STARTCHAR U_7F04 +ENCODING 32516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +5880 +EF80 +28A0 +4EA0 +FAA0 +0E40 +28A0 +D320 +ENDCHAR +STARTCHAR U_7F05 +ENCODING 32517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4200 +5FE0 +EAA0 +2BA0 +4AA0 +FBA0 +0AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_7F06 +ENCODING 32518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +4B40 +5A20 +E7C0 +2440 +4540 +F540 +0900 +3320 +CDE0 +ENDCHAR +STARTCHAR U_7F07 +ENCODING 32519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2000 +4FE0 +F280 +02E0 +3580 +C8E0 +ENDCHAR +STARTCHAR U_7F08 +ENCODING 32520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +4AC0 +5FA0 +EA80 +2EA0 +4AA0 +FA40 +0E80 +3100 +C600 +ENDCHAR +STARTCHAR U_7F09 +ENCODING 32521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5000 +EFE0 +2440 +47C0 +F440 +0460 +3FC0 +C040 +ENDCHAR +STARTCHAR U_7F0A +ENCODING 32522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2000 +4FE0 +FAA0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_7F0B +ENCODING 32523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4D40 +5FE0 +E000 +27C0 +4540 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7F0C +ENCODING 32524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +4FE0 +5520 +E520 +27E0 +4140 +F2A0 +0E20 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_7F0D +ENCODING 32525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +4900 +5FE0 +E540 +27E0 +4540 +FFE0 +0900 +3100 +C7C0 +ENDCHAR +STARTCHAR U_7F0E +ENCODING 32526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +24A0 +4CA0 +5700 +E4E0 +27A0 +44A0 +F7A0 +0C40 +34A0 +C520 +ENDCHAR +STARTCHAR U_7F0F +ENCODING 32527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +4BE0 +5AA0 +EBE0 +2AA0 +4BE0 +FA80 +0980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_7F10 +ENCODING 32528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4440 +57C0 +E440 +27C0 +4120 +EDC0 +0540 +3920 +C300 +ENDCHAR +STARTCHAR U_7F11 +ENCODING 32529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2440 +4BE0 +5800 +EA00 +2BE0 +4880 +FBE0 +0880 +3940 +CA20 +ENDCHAR +STARTCHAR U_7F12 +ENCODING 32530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +4520 +51E0 +ED00 +25E0 +4520 +F520 +05E0 +3600 +C9E0 +ENDCHAR +STARTCHAR U_7F13 +ENCODING 32531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A20 +4540 +5FE0 +E200 +2FE0 +4200 +F3C0 +0640 +3980 +C660 +ENDCHAR +STARTCHAR U_7F14 +ENCODING 32532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A80 +5FE0 +E920 +27C0 +4540 +F540 +0D40 +35C0 +C100 +ENDCHAR +STARTCHAR U_7F15 +ENCODING 32533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FE0 +5380 +E540 +2920 +4FE0 +F240 +0C40 +3380 +CE60 +ENDCHAR +STARTCHAR U_7F16 +ENCODING 32534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +5FE0 +E800 +2FE0 +4AA0 +FFE0 +0AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_7F17 +ENCODING 32535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5500 +E7E0 +2440 +47E0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F18 +ENCODING 32536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4F80 +5080 +EFE0 +2520 +4B40 +F580 +0AC0 +34A0 +C300 +ENDCHAR +STARTCHAR U_7F19 +ENCODING 32537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4EC0 +5280 +EFE0 +2000 +47C0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F1A +ENCODING 32538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4D20 +57E0 +E520 +27E0 +4520 +FFE0 +0440 +3240 +C1C0 +ENDCHAR +STARTCHAR U_7F1B +ENCODING 32539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +5800 +EFE0 +2AA0 +4B40 +FFE0 +0A40 +2940 +D0C0 +ENDCHAR +STARTCHAR U_7F1C +ENCODING 32540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +57C0 +E440 +27C0 +4440 +F7C0 +0440 +3FE0 +C440 +ENDCHAR +STARTCHAR U_7F1D +ENCODING 32541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2A40 +4D80 +5240 +EFE0 +2480 +47E0 +F480 +07E0 +3C80 +C3E0 +ENDCHAR +STARTCHAR U_7F1E +ENCODING 32542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4000 +57C0 +E440 +2FE0 +4440 +F7C0 +0540 +3C80 +C760 +ENDCHAR +STARTCHAR U_7F1F +ENCODING 32543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A40 +53C0 +E000 +2FE0 +4820 +FBA0 +0AA0 +3BA0 +C860 +ENDCHAR +STARTCHAR U_7F20 +ENCODING 32544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4800 +5BE0 +EAA0 +2AA0 +4BE0 +F880 +0FE0 +2880 +D7E0 +ENDCHAR +STARTCHAR U_7F21 +ENCODING 32545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4D40 +56C0 +E540 +27C0 +4100 +FFE0 +0AA0 +3FE0 +C860 +ENDCHAR +STARTCHAR U_7F22 +ENCODING 32546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5280 +E440 +2820 +47C0 +F540 +0540 +3540 +CFE0 +ENDCHAR +STARTCHAR U_7F23 +ENCODING 32547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +52A0 +EFE0 +22A0 +4FE0 +F280 +0EC0 +3AA0 +C2A0 +ENDCHAR +STARTCHAR U_7F24 +ENCODING 32548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +5780 +E400 +27E0 +4480 +F480 +0FE0 +3480 +C860 +ENDCHAR +STARTCHAR U_7F25 +ENCODING 32549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EFE0 +2000 +47C0 +F000 +0FE0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F26 +ENCODING 32550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5440 +EFE0 +2AA0 +4FE0 +F440 +0A80 +3100 +CEE0 +ENDCHAR +STARTCHAR U_7F27 +ENCODING 32551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +4FE0 +5520 +E7E0 +2240 +4F80 +F220 +0FE0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F28 +ENCODING 32552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4AA0 +5AA0 +EAA0 +2540 +4A20 +FFE0 +0A80 +3180 +CE60 +ENDCHAR +STARTCHAR U_7F29 +ENCODING 32553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A20 +55E0 +E480 +2DE0 +4520 +F5E0 +0D20 +35E0 +C520 +ENDCHAR +STARTCHAR U_7F2A +ENCODING 32554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4660 +5AA0 +E300 +2480 +4A60 +F500 +0240 +3080 +C700 +ENDCHAR +STARTCHAR U_7F2B +ENCODING 32555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2280 +4D40 +57C0 +E540 +27C0 +4540 +FFE0 +0B80 +3540 +C920 +ENDCHAR +STARTCHAR U_7F2C +ENCODING 32556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4880 +7FE0 +8A20 +EAA0 +5EA0 +82A0 +FEA0 +16A0 +3D40 +C220 +ENDCHAR +STARTCHAR U_7F2D +ENCODING 32557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4AA0 +5440 +EFE0 +2440 +47C0 +F440 +0FC0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F2E +ENCODING 32558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4100 +F7C0 +2100 +4FE0 +F540 +0FE0 +3440 +C440 +07C0 +ENDCHAR +STARTCHAR U_7F2F +ENCODING 32559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5AA0 +EFE0 +2000 +47C0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F30 +ENCODING 32560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4FC0 +5540 +EFE0 +2000 +47C0 +F540 +0FC0 +3540 +CFE0 +ENDCHAR +STARTCHAR U_7F31 +ENCODING 32561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +4AA0 +57E0 +E120 +2D20 +45E0 +F500 +05E0 +3520 +CBE0 +ENDCHAR +STARTCHAR U_7F32 +ENCODING 32562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4440 +5FE0 +EAA0 +2EE0 +4100 +FFE0 +0B80 +3540 +C920 +ENDCHAR +STARTCHAR U_7F33 +ENCODING 32563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FE0 +5000 +EFE0 +2440 +47C0 +F520 +0CC0 +3540 +C620 +ENDCHAR +STARTCHAR U_7F34 +ENCODING 32564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +9280 +FFE0 +52A0 +9FA0 +E8A0 +1EA0 +2A40 +CAA0 +1720 +ENDCHAR +STARTCHAR U_7F35 +ENCODING 32565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +4240 +5FE0 +E540 +2FE0 +4440 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7F36 +ENCODING 32566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2400 +4400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7F37 +ENCODING 32567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +5120 +9120 +7D20 +1120 +5520 +55A0 +5540 +7D00 +0100 +ENDCHAR +STARTCHAR U_7F38 +ENCODING 32568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7880 +A080 +2080 +FC80 +2080 +A880 +A880 +A880 +FBE0 +ENDCHAR +STARTCHAR U_7F39 +ENCODING 32569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4400 +FFE0 +0400 +4440 +7FC0 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7F3A +ENCODING 32570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7BC0 +A140 +2140 +FFE0 +2100 +A900 +AA80 +FA40 +0420 +ENDCHAR +STARTCHAR U_7F3B +ENCODING 32571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +A200 +23C0 +2240 +FA40 +2340 +AAC0 +AA40 +FA40 +8B60 +ENDCHAR +STARTCHAR U_7F3C +ENCODING 32572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +A3E0 +2520 +F940 +2100 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_7F3D +ENCODING 32573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +A080 +2180 +FAC0 +24A0 +A880 +ABE0 +F880 +8880 +ENDCHAR +STARTCHAR U_7F3E +ENCODING 32574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +7FE0 +A140 +2140 +FFE0 +2140 +A940 +A940 +FA40 +8C40 +ENDCHAR +STARTCHAR U_7F3F +ENCODING 32575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7A00 +A3E0 +2200 +FA00 +22E0 +AAA0 +AAA0 +FAE0 +8CA0 +ENDCHAR +STARTCHAR U_7F40 +ENCODING 32576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +AAA0 +26C0 +FA80 +22C0 +AEA0 +AA80 +BAA0 +E4A0 +0860 +ENDCHAR +STARTCHAR U_7F41 +ENCODING 32577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A60 +79A0 +AFE0 +F920 +2D60 +AD60 +AFE0 +F820 +08A0 +0840 +ENDCHAR +STARTCHAR U_7F42 +ENCODING 32578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AAA0 +AA80 +5140 +9FA0 +2200 +FFE0 +2240 +2240 +3FC0 +ENDCHAR +STARTCHAR U_7F43 +ENCODING 32579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +B2C0 +5140 +8A20 +FFE0 +A020 +3F80 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F44 +ENCODING 32580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1140 +7E20 +57C0 +7C80 +5360 +9FC0 +2400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F45 +ENCODING 32581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +7FE0 +A520 +27C0 +FD20 +27E0 +AD40 +AFE0 +FC80 +8980 +ENDCHAR +STARTCHAR U_7F46 +ENCODING 32582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7540 +AFE0 +2540 +FFC0 +2440 +A7C0 +A440 +FFC0 +8440 +0820 +ENDCHAR +STARTCHAR U_7F47 +ENCODING 32583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A140 +27E0 +FDA0 +2660 +AFE0 +A880 +AFE0 +FA80 +0180 +ENDCHAR +STARTCHAR U_7F48 +ENCODING 32584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +AAA0 +2FE0 +F440 +27C0 +AC40 +AFE0 +F900 +8900 +ENDCHAR +STARTCHAR U_7F49 +ENCODING 32585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +AFE0 +2820 +FB80 +2280 +AFC0 +A900 +AFE0 +F900 +0300 +ENDCHAR +STARTCHAR U_7F4A +ENCODING 32586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +FA60 +AFC0 +F880 +A960 +FFC0 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F4B +ENCODING 32587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +47E0 +7480 +2FE0 +7480 +1FE0 +2400 +7FE0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7F4C +ENCODING 32588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +5540 +9FA0 +2400 +FFE0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7F4D +ENCODING 32589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +2400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F4E +ENCODING 32590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7640 +A540 +2FE0 +F920 +2540 +AFC0 +A800 +AFE0 +FA40 +07C0 +ENDCHAR +STARTCHAR U_7F4F +ENCODING 32591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +7FE0 +A520 +27E0 +FD40 +27C0 +AD40 +AFE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_7F50 +ENCODING 32592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +7A80 +AEE0 +2AA0 +FEE0 +27E0 +AC80 +AFE0 +FC80 +87E0 +ENDCHAR +STARTCHAR U_7F51 +ENCODING 32593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9140 +D540 +A240 +9240 +AD40 +C540 +8840 +8040 +81C0 +ENDCHAR +STARTCHAR U_7F52 +ENCODING 32594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +FFE0 +9120 +9120 +FFE0 +ENDCHAR +STARTCHAR U_7F53 +ENCODING 32595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +FF80 +9280 +8C80 +B280 +ENDCHAR +STARTCHAR U_7F54 +ENCODING 32596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A240 +9440 +BF40 +8840 +BF40 +9040 +9040 +9F40 +8040 +81C0 +ENDCHAR +STARTCHAR U_7F55 +ENCODING 32597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +3080 +4040 +3F80 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7F56 +ENCODING 32598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +5240 +7FC0 +0400 +0600 +0900 +3080 +C860 +0400 +0400 +ENDCHAR +STARTCHAR U_7F57 +ENCODING 32599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +1000 +1F80 +2100 +5200 +0C00 +1800 +E000 +ENDCHAR +STARTCHAR U_7F58 +ENCODING 32600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0000 +7FE0 +0400 +0C80 +3460 +C420 +0400 +ENDCHAR +STARTCHAR U_7F59 +ENCODING 32601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +2080 +C440 +0400 +FFC0 +1500 +2480 +C460 +0400 +0400 +ENDCHAR +STARTCHAR U_7F5A +ENCODING 32602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +2000 +1240 +E240 +2240 +2A40 +3040 +21C0 +ENDCHAR +STARTCHAR U_7F5B +ENCODING 32603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +0080 +7F80 +4880 +4880 +4A80 +4F40 +8920 +ENDCHAR +STARTCHAR U_7F5C +ENCODING 32604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0400 +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F5D +ENCODING 32605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4020 +1F80 +1080 +1F80 +1080 +1F80 +1080 +FFE0 +ENDCHAR +STARTCHAR U_7F5E +ENCODING 32606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +0880 +0500 +FFE0 +1220 +2240 +C600 +ENDCHAR +STARTCHAR U_7F5F +ENCODING 32607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0400 +FFE0 +0400 +3FC0 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_7F60 +ENCODING 32608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +0000 +7F80 +4080 +7F80 +4400 +7FC0 +4240 +71C0 +ENDCHAR +STARTCHAR U_7F61 +ENCODING 32609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +7FE0 +0200 +0200 +13C0 +1200 +1200 +FFE0 +ENDCHAR +STARTCHAR U_7F62 +ENCODING 32610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0400 +7FC0 +0400 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_7F63 +ENCODING 32611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F64 +ENCODING 32612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0A00 +7FC0 +0440 +7FC0 +4400 +7FE0 +1420 +E4C0 +ENDCHAR +STARTCHAR U_7F65 +ENCODING 32613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +2100 +7F80 +4080 +7F80 +4080 +7F80 +4080 +4380 +ENDCHAR +STARTCHAR U_7F66 +ENCODING 32614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0100 +7E80 +1500 +7FC0 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7F67 +ENCODING 32615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +1080 +1080 +7FE0 +1080 +39C0 +56A0 +94A0 +1080 +ENDCHAR +STARTCHAR U_7F68 +ENCODING 32616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0800 +FFE0 +2480 +7FC0 +A4A0 +3F80 +0420 +03E0 +ENDCHAR +STARTCHAR U_7F69 +ENCODING 32617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0400 +3FE0 +2080 +3F80 +2080 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F6A +ENCODING 32618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +1200 +F3C0 +1200 +F3C0 +1200 +F3C0 +1200 +1200 +ENDCHAR +STARTCHAR U_7F6B +ENCODING 32619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +1080 +7C80 +1080 +FEC0 +10A0 +7CA0 +1080 +FE80 +ENDCHAR +STARTCHAR U_7F6C +ENCODING 32620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +7BC0 +5280 +2940 +7BC0 +4A40 +3180 +CA60 +ENDCHAR +STARTCHAR U_7F6D +ENCODING 32621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0280 +FFE0 +0200 +7A40 +4A80 +7900 +02A0 +F460 +ENDCHAR +STARTCHAR U_7F6E +ENCODING 32622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7F6F +ENCODING 32623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +7FC0 +0A00 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7F70 +ENCODING 32624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +FFE0 +1000 +FD20 +0120 +7920 +0120 +7D20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_7F71 +ENCODING 32625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +5F40 +4440 +44C0 +ENDCHAR +STARTCHAR U_7F72 +ENCODING 32626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0440 +3F80 +0500 +FFE0 +3080 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7F73 +ENCODING 32627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2480 +3F80 +2480 +3F80 +0000 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_7F74 +ENCODING 32628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0400 +7FC0 +0400 +FFE0 +1080 +3FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7F75 +ENCODING 32629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +4400 +7F80 +4400 +7FE0 +4A20 +9540 +ENDCHAR +STARTCHAR U_7F76 +ENCODING 32630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +9480 +FF80 +1000 +EF80 +9480 +FF80 +4880 +7F80 +4880 +7F80 +ENDCHAR +STARTCHAR U_7F77 +ENCODING 32631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +4400 +9700 +FC40 +93C0 +F480 +9700 +F440 +B3C0 +ENDCHAR +STARTCHAR U_7F78 +ENCODING 32632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +1080 +FFE0 +0480 +7A80 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_7F79 +ENCODING 32633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2280 +A7E0 +BC80 +A7E0 +2480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_7F7A +ENCODING 32634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2480 +3F80 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7F7B +ENCODING 32635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4240 +7E40 +41E0 +5C40 +4140 +7EC0 +AA40 +C9C0 +ENDCHAR +STARTCHAR U_7F7C +ENCODING 32636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +FFE0 +2480 +3F80 +2480 +FFE0 +1500 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F7D +ENCODING 32637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4800 +6AA0 +54A0 +62A0 +48A0 +6AA0 +5420 +A260 +ENDCHAR +STARTCHAR U_7F7E +ENCODING 32638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2080 +FFE0 +9520 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7F7F +ENCODING 32639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F80 +ENCODING 32640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +FFE0 +0A00 +7BC0 +4A40 +7BC0 +0A00 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F81 +ENCODING 32641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +5000 +FFC0 +AA40 +FBE0 +2020 +FBA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_7F82 +ENCODING 32642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2240 +4BE0 +F220 +4BE0 +FE20 +03E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7F83 +ENCODING 32643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +FFE0 +2080 +3F80 +2080 +FFE0 +1500 +FFE0 +2480 +2580 +ENDCHAR +STARTCHAR U_7F84 +ENCODING 32644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2100 +51E0 +E7C0 +5440 +FFC0 +0100 +57E0 +A900 +ENDCHAR +STARTCHAR U_7F85 +ENCODING 32645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2480 +4FE0 +F480 +27E0 +5480 +FFE0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_7F86 +ENCODING 32646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2A80 +7F20 +4BE0 +7A00 +4BC0 +7A20 +4BE0 +8520 +ENDCHAR +STARTCHAR U_7F87 +ENCODING 32647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +D900 +57E0 +FA80 +AFE0 +FD40 +2740 +F840 +20C0 +ENDCHAR +STARTCHAR U_7F88 +ENCODING 32648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFE0 +5280 +FBE0 +AA80 +FBE0 +2280 +FBE0 +22A0 +2540 +ENDCHAR +STARTCHAR U_7F89 +ENCODING 32649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2440 +4EA0 +A1E0 +CE80 +50A0 +FFE0 +5B40 +AEA0 +ENDCHAR +STARTCHAR U_7F8A +ENCODING 32650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F8B +ENCODING 32651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +F5E0 +1500 +0000 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F8C +ENCODING 32652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0400 +3F80 +0400 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_7F8D +ENCODING 32653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3180 +CA60 +3F80 +0400 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7F8E +ENCODING 32654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7F8F +ENCODING 32655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2840 +7C80 +1120 +7C40 +1080 +1120 +FC20 +1040 +2080 +4300 +ENDCHAR +STARTCHAR U_7F90 +ENCODING 32656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1500 +7F80 +0400 +FFE0 +1000 +1F80 +6200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_7F91 +ENCODING 32657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +1F00 +6200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_7F92 +ENCODING 32658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +FA40 +2420 +2020 +FBC0 +2140 +F940 +2240 +4440 +9880 +ENDCHAR +STARTCHAR U_7F93 +ENCODING 32659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57C0 +FD40 +2540 +7D40 +27C0 +FC00 +2420 +2420 +43E0 +8000 +ENDCHAR +STARTCHAR U_7F94 +ENCODING 32660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +FFE0 +5240 +8920 +8920 +ENDCHAR +STARTCHAR U_7F95 +ENCODING 32661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0440 +FC80 +1700 +2480 +CC60 +ENDCHAR +STARTCHAR U_7F96 +ENCODING 32662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FA40 +2460 +2000 +FFC0 +2240 +FA80 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_7F97 +ENCODING 32663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0400 +3F80 +0400 +FFE0 +0D40 +15E0 +2420 +C3E0 +ENDCHAR +STARTCHAR U_7F98 +ENCODING 32664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7280 +5FE0 +7100 +5FC0 +7100 +5100 +5FE0 +5100 +5100 +B100 +ENDCHAR +STARTCHAR U_7F99 +ENCODING 32665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7F9A +ENCODING 32666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FA80 +2440 +2120 +F880 +27E0 +F840 +2380 +4080 +8040 +ENDCHAR +STARTCHAR U_7F9B +ENCODING 32667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFC0 +0400 +FFE0 +0940 +FFC0 +4900 +7FC0 +1140 +E1C0 +ENDCHAR +STARTCHAR U_7F9C +ENCODING 32668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FC20 +2000 +27E0 +F880 +2080 +F880 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_7F9D +ENCODING 32669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8860 +5780 +FC80 +2480 +27E0 +FC80 +2480 +FCA0 +2560 +46A0 +84A0 +ENDCHAR +STARTCHAR U_7F9E +ENCODING 32670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +5F80 +8480 +7FE0 +ENDCHAR +STARTCHAR U_7F9F +ENCODING 32671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5040 +F840 +2080 +7140 +2620 +FBE0 +2080 +2080 +4080 +87E0 +ENDCHAR +STARTCHAR U_7FA0 +ENCODING 32672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +F900 +27C0 +7140 +27C0 +FD00 +27E0 +2160 +4280 +8C60 +ENDCHAR +STARTCHAR U_7FA1 +ENCODING 32673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +4800 +2FE0 +3240 +C580 +5860 +ENDCHAR +STARTCHAR U_7FA2 +ENCODING 32674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2280 +72A0 +27A0 +FAA0 +22C0 +22A0 +4560 +8A20 +ENDCHAR +STARTCHAR U_7FA3 +ENCODING 32675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1080 +FFE0 +1F80 +3080 +5F80 +0A00 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7FA4 +ENCODING 32676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +2940 +FFE0 +2880 +7BE0 +2080 +7880 +AFE0 +2880 +2880 +3880 +ENDCHAR +STARTCHAR U_7FA5 +ENCODING 32677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5000 +FAA0 +2540 +7540 +22A0 +F800 +23E0 +2080 +4080 +8FE0 +ENDCHAR +STARTCHAR U_7FA6 +ENCODING 32678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5080 +FFE0 +2420 +73C0 +2000 +FFE0 +2280 +22A0 +44A0 +9860 +ENDCHAR +STARTCHAR U_7FA7 +ENCODING 32679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5240 +FFE0 +2240 +7520 +23C0 +FA40 +2640 +2980 +4240 +8C20 +ENDCHAR +STARTCHAR U_7FA8 +ENCODING 32680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +4400 +B7E0 +2940 +C280 +5C60 +ENDCHAR +STARTCHAR U_7FA9 +ENCODING 32681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +1240 +FFE0 +3940 +D1A0 +3660 +ENDCHAR +STARTCHAR U_7FAA +ENCODING 32682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +FC40 +27C0 +2440 +7FC0 +2520 +FD40 +2480 +4540 +8620 +ENDCHAR +STARTCHAR U_7FAB +ENCODING 32683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5080 +FFE0 +2420 +7240 +2420 +FFC0 +2100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7FAC +ENCODING 32684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2480 +77A0 +24A0 +FFA0 +2540 +2760 +48A0 +9320 +ENDCHAR +STARTCHAR U_7FAD +ENCODING 32685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8B80 +5440 +FBA0 +2000 +7E20 +2AA0 +FEA0 +2AA0 +2EA0 +4A20 +8AE0 +ENDCHAR +STARTCHAR U_7FAE +ENCODING 32686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +FFE0 +2940 +44A0 +FFE0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7FAF +ENCODING 32687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FBC0 +2240 +73C0 +2200 +FFE0 +24A0 +2560 +47A0 +80C0 +ENDCHAR +STARTCHAR U_7FB0 +ENCODING 32688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +54A0 +FFE0 +2100 +77E0 +2280 +FAA0 +25C0 +2480 +4940 +9220 +ENDCHAR +STARTCHAR U_7FB1 +ENCODING 32689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5480 +FDE0 +2520 +75E0 +2520 +FDE0 +2480 +25C0 +4AA0 +95A0 +ENDCHAR +STARTCHAR U_7FB2 +ENCODING 32690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +0400 +3F80 +0400 +FFE0 +1140 +FFE0 +3940 +4CA0 +3560 +ENDCHAR +STARTCHAR U_7FB3 +ENCODING 32691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +5720 +FD40 +27E0 +7340 +2520 +FFC0 +2540 +27C0 +4540 +87C0 +ENDCHAR +STARTCHAR U_7FB4 +ENCODING 32692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +3F80 +0400 +7FE0 +2A40 +FFE0 +1080 +7BC0 +1080 +FFE0 +1080 +ENDCHAR +STARTCHAR U_7FB5 +ENCODING 32693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +F540 +2FE0 +7440 +27C0 +FC40 +27C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_7FB6 +ENCODING 32694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FDA0 +2420 +77E0 +2000 +FBC0 +2240 +23C0 +4240 +8FE0 +ENDCHAR +STARTCHAR U_7FB7 +ENCODING 32695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +FC40 +2BA0 +7000 +2EE0 +FAA0 +2EE0 +2480 +4D40 +9220 +ENDCHAR +STARTCHAR U_7FB8 +ENCODING 32696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +70C0 +5F40 +7540 +5FC0 +7540 +9F40 +9560 +ENDCHAR +STARTCHAR U_7FB9 +ENCODING 32697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +7FC0 +0400 +FFE0 +4940 +FFE0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7FBA +ENCODING 32698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +FFE0 +2920 +7A80 +2FE0 +F100 +2FE0 +2AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_7FBB +ENCODING 32699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FD40 +27E0 +74A0 +2740 +FD20 +25E0 +2B40 +5480 +A760 +ENDCHAR +STARTCHAR U_7FBC +ENCODING 32700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FC0 +4200 +7FE0 +6540 +5080 +BFE0 +9080 +ENDCHAR +STARTCHAR U_7FBD +ENCODING 32701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +2920 +4A20 +8820 +28A0 +1040 +ENDCHAR +STARTCHAR U_7FBE +ENCODING 32702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +27E0 +B480 +6C80 +2480 +6C80 +B480 +A480 +2480 +2480 +6FE0 +ENDCHAR +STARTCHAR U_7FBF +ENCODING 32703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +2940 +18C0 +2940 +4A40 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7FC0 +ENCODING 32704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2480 +A7E0 +76A0 +2EA0 +26A0 +6FE0 +B6A0 +2480 +2480 +6C80 +ENDCHAR +STARTCHAR U_7FC1 +ENCODING 32705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2500 +4A80 +BF60 +0000 +FBC0 +4A40 +2940 +18C0 +EB40 +5AC0 +ENDCHAR +STARTCHAR U_7FC2 +ENCODING 32706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2540 +2540 +B620 +6C00 +27E0 +6D20 +B520 +2520 +2620 +6CC0 +ENDCHAR +STARTCHAR U_7FC3 +ENCODING 32707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +2920 +4B60 +55A0 +9120 +A120 +2920 +7B60 +ENDCHAR +STARTCHAR U_7FC4 +ENCODING 32708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2480 +B480 +6FE0 +2620 +6D40 +B480 +2540 +B520 +4A20 +ENDCHAR +STARTCHAR U_7FC5 +ENCODING 32709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +F360 +9360 +55A0 +5120 +2360 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7FC6 +ENCODING 32710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4A40 +2940 +4A40 +8C40 +7F00 +1120 +25E0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7FC7 +ENCODING 32711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4A40 +2940 +39C0 +CA40 +0900 +FFE0 +1080 +2900 +4600 +B9E0 +ENDCHAR +STARTCHAR U_7FC8 +ENCODING 32712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +ADA0 +FB60 +A920 +AB60 +FDA0 +2120 +2120 +25A0 +2240 +ENDCHAR +STARTCHAR U_7FC9 +ENCODING 32713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +3120 +6920 +A360 +25A0 +F920 +2120 +2360 +ENDCHAR +STARTCHAR U_7FCA +ENCODING 32714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +FDA0 +0360 +9120 +5320 +5560 +21A0 +3920 +E120 +0360 +ENDCHAR +STARTCHAR U_7FCB +ENCODING 32715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2480 +B7E0 +6C00 +2440 +6E40 +B540 +2540 +2540 +2480 +6FE0 +ENDCHAR +STARTCHAR U_7FCC +ENCODING 32716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +2940 +4A40 +0400 +7FE0 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7FCD +ENCODING 32717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +25E0 +B560 +6D40 +25E0 +6D20 +B5A0 +25A0 +2640 +24A0 +6D20 +ENDCHAR +STARTCHAR U_7FCE +ENCODING 32718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1760 +2920 +45A0 +A360 +1120 +7B20 +0D60 +51A0 +2120 +1120 +1360 +ENDCHAR +STARTCHAR U_7FCF +ENCODING 32719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +2940 +18C0 +EF40 +1100 +ECE0 +0200 +1C80 +0100 +FE00 +ENDCHAR +STARTCHAR U_7FD0 +ENCODING 32720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2680 +B7E0 +6E80 +2480 +27E0 +6C80 +B480 +2480 +2540 +6E20 +ENDCHAR +STARTCHAR U_7FD1 +ENCODING 32721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +25E0 +B620 +6C20 +27A0 +26A0 +6FA0 +B6A0 +2420 +24A0 +6C40 +ENDCHAR +STARTCHAR U_7FD2 +ENCODING 32722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +5960 +28A0 +CD20 +0800 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7FD3 +ENCODING 32723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +7360 +0120 +F360 +95A0 +9120 +F5A0 +9240 +ENDCHAR +STARTCHAR U_7FD4 +ENCODING 32724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5120 +F920 +25A0 +7360 +2120 +FB60 +25A0 +2120 +4120 +8360 +ENDCHAR +STARTCHAR U_7FD5 +ENCODING 32725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +0000 +3F80 +2080 +FFE0 +4920 +38E0 +CB20 +1860 +ENDCHAR +STARTCHAR U_7FD6 +ENCODING 32726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +5120 +8DA0 +7360 +0120 +7360 +55A0 +5120 +75A0 +5240 +ENDCHAR +STARTCHAR U_7FD7 +ENCODING 32727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3920 +4DA0 +AB60 +1120 +6120 +3B60 +4DA0 +A920 +1120 +E360 +ENDCHAR +STARTCHAR U_7FD8 +ENCODING 32728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F120 +55A0 +2B60 +D920 +0360 +FDA0 +5120 +5660 +5020 +8FE0 +ENDCHAR +STARTCHAR U_7FD9 +ENCODING 32729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFE0 +A920 +FDA0 +2360 +7920 +4B60 +ADA0 +1120 +25A0 +C240 +ENDCHAR +STARTCHAR U_7FDA +ENCODING 32730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +4A40 +FFE0 +8820 +7FC0 +1200 +3FC0 +0200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7FDB +ENCODING 32731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5540 +5080 +D760 +5000 +5FE0 +55A0 +5360 +4DA0 +4360 +ENDCHAR +STARTCHAR U_7FDC +ENCODING 32732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +CB20 +0400 +FFE0 +2480 +5B40 +8A20 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7FDD +ENCODING 32733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +A920 +25A0 +FB60 +2120 +5360 +55A0 +A920 +79A0 +0360 +ENDCHAR +STARTCHAR U_7FDE +ENCODING 32734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +27E0 +B400 +6DE0 +2520 +25E0 +6C80 +B5C0 +26A0 +24A0 +6D80 +ENDCHAR +STARTCHAR U_7FDF +ENCODING 32735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2940 +18C0 +EB40 +1400 +1200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7FE0 +ENCODING 32736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +6B40 +0840 +7FC0 +1100 +2A80 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7FE1 +ENCODING 32737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +FBE0 +4920 +38E0 +CB20 +ENDCHAR +STARTCHAR U_7FE2 +ENCODING 32738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +FDA0 +AB60 +F920 +8920 +BB60 +ADA0 +B920 +8920 +9B60 +ENDCHAR +STARTCHAR U_7FE3 +ENCODING 32739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +4920 +7FC0 +0900 +FFE0 +0400 +FFE0 +0900 +F6E0 +ENDCHAR +STARTCHAR U_7FE4 +ENCODING 32740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9120 +95A0 +F360 +0120 +FB60 +ADA0 +F920 +A920 +ADA0 +9A40 +ENDCHAR +STARTCHAR U_7FE5 +ENCODING 32741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1480 +1280 +FFC0 +2940 +18C0 +6B40 +18C0 +ENDCHAR +STARTCHAR U_7FE6 +ENCODING 32742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7940 +4940 +7940 +4840 +FFE0 +4A20 +29A0 +DA60 +ENDCHAR +STARTCHAR U_7FE7 +ENCODING 32743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +8920 +75A0 +0360 +7120 +5360 +55A0 +7120 +05A0 +FA40 +ENDCHAR +STARTCHAR U_7FE8 +ENCODING 32744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +CB20 +3F80 +2080 +FFE0 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7FE9 +ENCODING 32745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +8920 +FDA0 +8360 +F920 +AB60 +FDA0 +A920 +A920 +8B60 +ENDCHAR +STARTCHAR U_7FEA +ENCODING 32746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +26A0 +B760 +6FE0 +2540 +2620 +6DC0 +B740 +2480 +2540 +6E20 +ENDCHAR +STARTCHAR U_7FEB +ENCODING 32747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2400 +B400 +6FE0 +B540 +1540 +7D40 +4540 +7D40 +4540 +7E60 +ENDCHAR +STARTCHAR U_7FEC +ENCODING 32748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +39C0 +4A40 +FFE0 +A4A0 +3F80 +2480 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7FED +ENCODING 32749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCC0 +2540 +B640 +6FE0 +2500 +25E0 +6D40 +B5E0 +2540 +25A0 +6D20 +ENDCHAR +STARTCHAR U_7FEE +ENCODING 32750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4920 +7DA0 +0360 +FD20 +D760 +FDA0 +A520 +FD20 +A520 +8F60 +ENDCHAR +STARTCHAR U_7FEF +ENCODING 32751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4920 +38E0 +4920 +FFE0 +1080 +1F80 +0000 +7FE0 +5120 +5F60 +ENDCHAR +STARTCHAR U_7FF0 +ENCODING 32752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA40 +2420 +F000 +97E0 +F920 +95A0 +F360 +25A0 +F920 +2360 +ENDCHAR +STARTCHAR U_7FF1 +ENCODING 32753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +8DA0 +FB60 +8920 +F920 +2360 +FDA0 +A920 +F520 +2260 +ENDCHAR +STARTCHAR U_7FF2 +ENCODING 32754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +FDA0 +AB60 +FD20 +0120 +7B60 +05A0 +FD20 +5520 +B360 +ENDCHAR +STARTCHAR U_7FF3 +ENCODING 32755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FC60 +93C0 +A980 +C660 +FBC0 +4A40 +39C0 +CA40 +18C0 +ENDCHAR +STARTCHAR U_7FF4 +ENCODING 32756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2C80 +ABE0 +7AA0 +2FE0 +2AA0 +7BE0 +AA80 +2BE0 +2A80 +7DE0 +ENDCHAR +STARTCHAR U_7FF5 +ENCODING 32757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2BC0 +AA40 +7BC0 +2A40 +2BE0 +7A00 +ABE0 +2820 +2AA0 +7D60 +ENDCHAR +STARTCHAR U_7FF6 +ENCODING 32758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +8920 +FDA0 +8B60 +F920 +AB60 +75A0 +A920 +FDA0 +2240 +ENDCHAR +STARTCHAR U_7FF7 +ENCODING 32759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +54A0 +FEA0 +55E0 +90A0 +48A0 +7DE0 +AAA0 +7EA0 +48A0 +89E0 +ENDCHAR +STARTCHAR U_7FF8 +ENCODING 32760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +6DA0 +FB60 +4920 +7920 +4B60 +7DA0 +4920 +7920 +CF60 +ENDCHAR +STARTCHAR U_7FF9 +ENCODING 32761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +22E0 +F9A0 +48A0 +FDE0 +4AA0 +FCA0 +29E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_7FFA +ENCODING 32762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +A920 +DDA0 +AB60 +F920 +AB60 +75A0 +A920 +F9E0 +2340 +ENDCHAR +STARTCHAR U_7FFB +ENCODING 32763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +A920 +FDA0 +7360 +A920 +FB60 +ADA0 +F920 +A920 +FB60 +ENDCHAR +STARTCHAR U_7FFC +ENCODING 32764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +4920 +7FC0 +2480 +7FC0 +0900 +FFE0 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7FFD +ENCODING 32765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FDA0 +0B60 +FD20 +8920 +FB60 +ADA0 +E920 +B520 +C260 +ENDCHAR +STARTCHAR U_7FFE +ENCODING 32766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +FDA0 +0360 +FD20 +4920 +7B60 +25A0 +D920 +5920 +6760 +ENDCHAR +STARTCHAR U_7FFF +ENCODING 32767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +10A0 +FEE0 +11A0 +7CA0 +04A0 +FDE0 +A6A0 +BCA0 +E4A0 +0DE0 +ENDCHAR +STARTCHAR U_8000 +ENCODING 32768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +ADA0 +7360 +27E0 +FC80 +57E0 +5480 +57E0 +9C80 +97E0 +ENDCHAR +STARTCHAR U_8001 +ENCODING 32769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +3F80 +0500 +FFE0 +0800 +1980 +2E00 +C840 +0840 +07C0 +ENDCHAR +STARTCHAR U_8002 +ENCODING 32770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F40 +0840 +0880 +FFE0 +0200 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_8003 +ENCODING 32771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0900 +FFE0 +0400 +0FC0 +3400 +CF80 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_8004 +ENCODING 32772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +7F00 +0A00 +FFC0 +2820 +C7E0 +0300 +7C00 +07C0 +FC20 +03E0 +ENDCHAR +STARTCHAR U_8005 +ENCODING 32773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +0500 +FFE0 +0800 +3F80 +D080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8006 +ENCODING 32774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7E80 +0500 +FFC0 +1200 +F420 +1FE0 +1040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_8007 +ENCODING 32775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0900 +FFE0 +0800 +1FC0 +2040 +5E40 +1240 +1E40 +0180 +ENDCHAR +STARTCHAR U_8008 +ENCODING 32776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +7FE0 +0840 +37C0 +C800 +1FC0 +6940 +0F40 +00C0 +ENDCHAR +STARTCHAR U_8009 +ENCODING 32777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F40 +0480 +FFE0 +0800 +3FC0 +C800 +1FC0 +1240 +1240 +1EC0 +ENDCHAR +STARTCHAR U_800A +ENCODING 32778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +FFE0 +0600 +3900 +DF80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_800B +ENCODING 32779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0A00 +FFE0 +3200 +5420 +FFE0 +1100 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_800C +ENCODING 32780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +7FE0 +4920 +4920 +4920 +4920 +4920 +4920 +40E0 +ENDCHAR +STARTCHAR U_800D +ENCODING 32781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4A40 +4A40 +08C0 +FFE0 +1100 +1A00 +0700 +78E0 +ENDCHAR +STARTCHAR U_800E +ENCODING 32782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4A40 +4A40 +44C0 +0400 +7FE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_800F +ENCODING 32783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +1080 +2100 +FE20 +AA40 +AA80 +AB20 +AA20 +AA40 +AA80 +8700 +ENDCHAR +STARTCHAR U_8010 +ENCODING 32784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +1040 +21E0 +FE40 +AA40 +AB40 +AAC0 +AA40 +AA40 +A240 +86C0 +ENDCHAR +STARTCHAR U_8011 +ENCODING 32785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +FFE0 +0400 +7FC0 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_8012 +ENCODING 32786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8013 +ENCODING 32787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2080 +7080 +2080 +F880 +2080 +7080 +A880 +2080 +2180 +ENDCHAR +STARTCHAR U_8014 +ENCODING 32788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2040 +F880 +2080 +FBE0 +2080 +7080 +A880 +2080 +2180 +ENDCHAR +STARTCHAR U_8015 +ENCODING 32789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FA40 +27E0 +FA40 +2240 +FFE0 +2240 +3240 +6A40 +A440 +2840 +ENDCHAR +STARTCHAR U_8016 +ENCODING 32790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8C0 +22A0 +FAA0 +2480 +FCA0 +20A0 +7040 +A880 +A100 +2E00 +ENDCHAR +STARTCHAR U_8017 +ENCODING 32791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2100 +F9C0 +2700 +F960 +2780 +7100 +A920 +2120 +20E0 +ENDCHAR +STARTCHAR U_8018 +ENCODING 32792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F800 +2000 +F800 +27E0 +F900 +2100 +7200 +AA40 +A460 +27A0 +ENDCHAR +STARTCHAR U_8019 +ENCODING 32793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +22A0 +FAA0 +22A0 +FBE0 +2200 +7200 +AA20 +A220 +21E0 +ENDCHAR +STARTCHAR U_801A +ENCODING 32794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +27E0 +FCA0 +2480 +FFE0 +2520 +7540 +AC80 +2540 +2A20 +ENDCHAR +STARTCHAR U_801B +ENCODING 32795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2240 +FA60 +27A0 +F800 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_801C +ENCODING 32796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FBC0 +2240 +FA00 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_801D +ENCODING 32797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +7240 +23C0 +FA40 +3240 +6BC0 +A640 +2240 +27E0 +ENDCHAR +STARTCHAR U_801E +ENCODING 32798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FEE0 +2AA0 +FAA0 +2AA0 +FAA0 +2AA0 +7AA0 +AAA0 +AAE0 +34A0 +ENDCHAR +STARTCHAR U_801F +ENCODING 32799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FBE0 +2220 +FA20 +23E0 +7220 +AA00 +AA00 +23E0 +ENDCHAR +STARTCHAR U_8020 +ENCODING 32800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F980 +2240 +FC20 +25C0 +F800 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_8021 +ENCODING 32801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +FA80 +4BE0 +FEA0 +4AA0 +FAA0 +4EA0 +6AA0 +DAA0 +5F20 +4260 +ENDCHAR +STARTCHAR U_8022 +ENCODING 32802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F7E0 +2140 +FFE0 +2420 +F900 +27E0 +7120 +A920 +AA20 +24C0 +ENDCHAR +STARTCHAR U_8023 +ENCODING 32803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +7BA0 +2000 +FFE0 +2AA0 +7FE0 +AAA0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_8024 +ENCODING 32804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +2000 +FBC0 +2240 +73C0 +AA40 +ABC0 +2240 +ENDCHAR +STARTCHAR U_8025 +ENCODING 32805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +F520 +2340 +FFE0 +2820 +FBA0 +2AA0 +7BA0 +AAA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8026 +ENCODING 32806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +27C0 +F900 +27E0 +7560 +AFA0 +A420 +2460 +ENDCHAR +STARTCHAR U_8027 +ENCODING 32807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +27E0 +FB80 +2540 +F920 +2100 +77E0 +AA40 +2180 +2660 +ENDCHAR +STARTCHAR U_8028 +ENCODING 32808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +4BC0 +F800 +4FE0 +FAA0 +4B40 +6840 +DFE0 +5440 +62C0 +ENDCHAR +STARTCHAR U_8029 +ENCODING 32809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +2240 +FFE0 +2540 +77C0 +AD40 +AFE0 +24C0 +ENDCHAR +STARTCHAR U_802A +ENCODING 32810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2280 +FFE0 +2520 +FFE0 +2200 +73C0 +AA40 +A440 +2880 +ENDCHAR +STARTCHAR U_802B +ENCODING 32811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +77C0 +2100 +FFE0 +3440 +6FC0 +A440 +27C0 +2820 +ENDCHAR +STARTCHAR U_802C +ENCODING 32812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2540 +FFE0 +2540 +FFE0 +2520 +77E0 +AA40 +A180 +2E60 +ENDCHAR +STARTCHAR U_802D +ENCODING 32813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +FD40 +27A0 +7340 +25A0 +FFE0 +34A0 +6EC0 +A4A0 +2960 +3220 +ENDCHAR +STARTCHAR U_802E +ENCODING 32814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +75A0 +2FE0 +F820 +2100 +77E0 +A920 +2220 +2460 +ENDCHAR +STARTCHAR U_802F +ENCODING 32815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +2280 +77E0 +2480 +FFC0 +3480 +6FE0 +A480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_8030 +ENCODING 32816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA40 +23C0 +7240 +2FE0 +FAA0 +23C0 +7660 +A980 +AA40 +2420 +ENDCHAR +STARTCHAR U_8031 +ENCODING 32817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2A40 +FFE0 +2A40 +FF60 +2AC0 +7A40 +AFE0 +AA20 +33E0 +ENDCHAR +STARTCHAR U_8032 +ENCODING 32818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +77C0 +2540 +FB80 +3540 +6A20 +A540 +2C80 +3660 +ENDCHAR +STARTCHAR U_8033 +ENCODING 32819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2100 +2100 +3F00 +2100 +3F00 +2100 +21C0 +FF00 +0100 +0100 +ENDCHAR +STARTCHAR U_8034 +ENCODING 32820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +4900 +7900 +4900 +7900 +4900 +4D00 +F920 +0920 +08E0 +ENDCHAR +STARTCHAR U_8035 +ENCODING 32821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +4880 +7880 +4880 +7880 +4880 +4C80 +F880 +0A80 +0900 +ENDCHAR +STARTCHAR U_8036 +ENCODING 32822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4920 +4920 +7940 +4940 +7920 +4920 +4D20 +F9A0 +0940 +0900 +ENDCHAR +STARTCHAR U_8037 +ENCODING 32823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +FFE0 +2100 +3F00 +2100 +3F00 +21E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8038 +ENCODING 32824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2A80 +4440 +FFE0 +2100 +3F00 +2100 +3F00 +2100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_8039 +ENCODING 32825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4980 +4A40 +7D20 +4880 +7800 +4FE0 +4840 +FC80 +0880 +0900 +ENDCHAR +STARTCHAR U_803A +ENCODING 32826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +5000 +7000 +57E0 +7100 +5100 +5A40 +77E0 +D240 +1000 +ENDCHAR +STARTCHAR U_803B +ENCODING 32827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4880 +4880 +7A80 +4AE0 +7A80 +4A80 +4E80 +FA80 +0A80 +0FE0 +ENDCHAR +STARTCHAR U_803C +ENCODING 32828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +5240 +77E0 +5240 +7240 +57E0 +5A40 +F240 +1240 +12C0 +ENDCHAR +STARTCHAR U_803D +ENCODING 32829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57E0 +7520 +5100 +7280 +5280 +5280 +FAA0 +14A0 +1860 +ENDCHAR +STARTCHAR U_803E +ENCODING 32830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +4FE0 +7900 +4940 +7940 +4A40 +4A80 +FCA0 +0920 +09E0 +ENDCHAR +STARTCHAR U_803F +ENCODING 32831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4880 +4880 +7AA0 +4AC0 +7C80 +4880 +4880 +FD40 +0A20 +0C20 +ENDCHAR +STARTCHAR U_8040 +ENCODING 32832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +5120 +77E0 +5100 +7140 +5140 +5880 +70A0 +D160 +1220 +ENDCHAR +STARTCHAR U_8041 +ENCODING 32833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FA80 +5280 +7440 +5820 +77C0 +5240 +5A40 +7240 +D540 +1880 +ENDCHAR +STARTCHAR U_8042 +ENCODING 32834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +3F00 +2100 +FFE0 +0100 +FFC0 +4A40 +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_8043 +ENCODING 32835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57C0 +7540 +57C0 +7540 +5540 +5FE0 +F440 +1440 +14C0 +ENDCHAR +STARTCHAR U_8044 +ENCODING 32836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +5280 +7C60 +5100 +7640 +5080 +5920 +7640 +D080 +1700 +ENDCHAR +STARTCHAR U_8045 +ENCODING 32837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +57C0 +7500 +5900 +77E0 +5100 +5A80 +7280 +D440 +1820 +ENDCHAR +STARTCHAR U_8046 +ENCODING 32838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4980 +4A40 +7D20 +4880 +7800 +4FE0 +4840 +F980 +0880 +0840 +ENDCHAR +STARTCHAR U_8047 +ENCODING 32839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4880 +4880 +7880 +4A80 +7AE0 +4A80 +4E80 +FA80 +0A80 +0FE0 +ENDCHAR +STARTCHAR U_8048 +ENCODING 32840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +5480 +5880 +7BE0 +5EA0 +74A0 +54A0 +5AA0 +FEA0 +11A0 +1240 +ENDCHAR +STARTCHAR U_8049 +ENCODING 32841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +52A0 +72A0 +52A0 +73E0 +5080 +5AA0 +72A0 +D2A0 +13E0 +ENDCHAR +STARTCHAR U_804A +ENCODING 32842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +ACE0 +AAA0 +EAA0 +AAA0 +EAA0 +AAA0 +AEA0 +F2E0 +2480 +2880 +ENDCHAR +STARTCHAR U_804B +ENCODING 32843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +1480 +2520 +DFE0 +0000 +FFE0 +2100 +3F00 +2100 +FFE0 +ENDCHAR +STARTCHAR U_804C +ENCODING 32844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A20 +4A20 +7A20 +4A20 +7BE0 +4800 +4D40 +F940 +0A20 +0C20 +ENDCHAR +STARTCHAR U_804D +ENCODING 32845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4BE0 +4A20 +7800 +4FE0 +7880 +4880 +4C80 +F880 +0A80 +0900 +ENDCHAR +STARTCHAR U_804E +ENCODING 32846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +52A0 +76C0 +5280 +72C0 +56A0 +5A80 +72A0 +D2A0 +1460 +ENDCHAR +STARTCHAR U_804F +ENCODING 32847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +A200 +EFE0 +AAA0 +EAA0 +AAA0 +AAA0 +FAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_8050 +ENCODING 32848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +4880 +4FE0 +7880 +4BE0 +7800 +4BE0 +5E20 +EA20 +0BE0 +0A20 +ENDCHAR +STARTCHAR U_8051 +ENCODING 32849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +4A40 +7BC0 +4A40 +7BC0 +4A40 +4E60 +FBC0 +0840 +0840 +ENDCHAR +STARTCHAR U_8052 +ENCODING 32850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +5380 +5080 +77E0 +5080 +7080 +53E0 +5220 +FA20 +13E0 +1220 +ENDCHAR +STARTCHAR U_8053 +ENCODING 32851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +22A0 +3BA0 +E2E0 +0400 +7FC0 +1100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8054 +ENCODING 32852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +5280 +57E0 +7100 +5100 +7FE0 +5100 +5100 +FA80 +1440 +1820 +ENDCHAR +STARTCHAR U_8055 +ENCODING 32853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +53E0 +7480 +57E0 +7000 +53E0 +5A20 +7220 +D3E0 +1220 +ENDCHAR +STARTCHAR U_8056 +ENCODING 32854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +49E0 +7920 +4920 +FDE0 +0800 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8057 +ENCODING 32855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +57E0 +7540 +5540 +7BA0 +5100 +5A80 +7280 +D440 +1820 +ENDCHAR +STARTCHAR U_8058 +ENCODING 32856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +52A0 +73E0 +52A0 +77E0 +5100 +5BE0 +F020 +1020 +11C0 +ENDCHAR +STARTCHAR U_8059 +ENCODING 32857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5100 +77C0 +5100 +7FE0 +5440 +5FC0 +7440 +D7C0 +1440 +ENDCHAR +STARTCHAR U_805A +ENCODING 32858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4520 +7CC0 +44C0 +FF20 +05C0 +7E40 +0A80 +7700 +0A80 +7260 +ENDCHAR +STARTCHAR U_805B +ENCODING 32859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5520 +77E0 +5520 +77E0 +5280 +5C80 +77E0 +D080 +1080 +ENDCHAR +STARTCHAR U_805C +ENCODING 32860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5420 +7240 +5420 +7800 +57C0 +5900 +F100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_805D +ENCODING 32861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +50A0 +57E0 +7080 +5780 +75A0 +57A0 +50C0 +F960 +16A0 +1120 +ENDCHAR +STARTCHAR U_805E +ENCODING 32862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +FFC0 +9240 +9E40 +9240 +9FC0 +F240 +82C0 +ENDCHAR +STARTCHAR U_805F +ENCODING 32863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +5240 +FFC0 +2800 +7FC0 +9100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8060 +ENCODING 32864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FA40 +5240 +77E0 +5240 +7240 +57E0 +5A40 +7240 +D240 +1440 +ENDCHAR +STARTCHAR U_8061 +ENCODING 32865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +5540 +7920 +5240 +77C0 +5200 +5D40 +7520 +DC60 +13C0 +ENDCHAR +STARTCHAR U_8062 +ENCODING 32866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +57E0 +7420 +53C0 +7500 +55C0 +5D00 +7500 +D700 +18E0 +ENDCHAR +STARTCHAR U_8063 +ENCODING 32867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FEC0 +5440 +76C0 +5440 +77C0 +5280 +5A80 +7280 +D2A0 +1460 +ENDCHAR +STARTCHAR U_8064 +ENCODING 32868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +73C0 +5000 +77E0 +5420 +53C0 +F880 +1280 +1100 +ENDCHAR +STARTCHAR U_8065 +ENCODING 32869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +57C0 +7540 +57C0 +7100 +57E0 +5D20 +77E0 +D4A0 +1440 +ENDCHAR +STARTCHAR U_8066 +ENCODING 32870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +5560 +72A0 +55A0 +7160 +5200 +5D40 +7520 +DC60 +13C0 +ENDCHAR +STARTCHAR U_8067 +ENCODING 32871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +55A0 +52C0 +7440 +5420 +7BC0 +5100 +57E0 +F900 +1280 +1460 +ENDCHAR +STARTCHAR U_8068 +ENCODING 32872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FDA0 +56E0 +7240 +55A0 +76E0 +5240 +5FE0 +7240 +D240 +1440 +ENDCHAR +STARTCHAR U_8069 +ENCODING 32873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +5540 +7FE0 +5000 +77C0 +5440 +5540 +FD40 +1280 +1C60 +ENDCHAR +STARTCHAR U_806A +ENCODING 32874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +57C0 +5440 +7440 +57C0 +7100 +5AA0 +F6A0 +1A40 +11C0 +ENDCHAR +STARTCHAR U_806B +ENCODING 32875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +55A0 +76C0 +5240 +75A0 +56E0 +5100 +7FE0 +D280 +1460 +ENDCHAR +STARTCHAR U_806C +ENCODING 32876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +5520 +7240 +57E0 +7000 +57E0 +55A0 +FB60 +15A0 +1360 +ENDCHAR +STARTCHAR U_806D +ENCODING 32877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA00 +57C0 +7540 +57C0 +7540 +57C0 +5940 +73E0 +D520 +18E0 +ENDCHAR +STARTCHAR U_806E +ENCODING 32878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +55A0 +76E0 +5240 +75A0 +56E0 +5800 +7540 +DAA0 +12A0 +ENDCHAR +STARTCHAR U_806F +ENCODING 32879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A440 +AAA0 +E440 +AAA0 +A660 +EAA0 +AAA0 +AEE0 +F280 +2C80 +ENDCHAR +STARTCHAR U_8070 +ENCODING 32880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +56A0 +7520 +56A0 +77E0 +5100 +52C0 +FE20 +1260 +11C0 +ENDCHAR +STARTCHAR U_8071 +ENCODING 32881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +2340 +FC80 +4940 +FFE0 +2080 +3F80 +2080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_8072 +ENCODING 32882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +5620 +57C0 +7C80 +8140 +FFE0 +1080 +1F80 +1080 +FFE0 +ENDCHAR +STARTCHAR U_8073 +ENCODING 32883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AB40 +5220 +C9C0 +4D00 +53E0 +FF00 +2100 +3F00 +2100 +FFE0 +ENDCHAR +STARTCHAR U_8074 +ENCODING 32884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5100 +77E0 +55A0 +77E0 +5200 +5D40 +7520 +DC40 +13C0 +ENDCHAR +STARTCHAR U_8075 +ENCODING 32885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +5540 +7FE0 +5440 +77C0 +5440 +5FC0 +F440 +17C0 +1C60 +ENDCHAR +STARTCHAR U_8076 +ENCODING 32886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0880 +0F80 +0880 +7FE0 +0080 +7FE0 +4A40 +7BC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8077 +ENCODING 32887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +AFC0 +AAA0 +E480 +BFE0 +A080 +EEA0 +AAC0 +AEA0 +FB60 +2E20 +ENDCHAR +STARTCHAR U_8078 +ENCODING 32888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +57E0 +5D40 +76A0 +57E0 +7400 +55E0 +5400 +FDE0 +1520 +19E0 +ENDCHAR +STARTCHAR U_8079 +ENCODING 32889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +AD60 +E7C0 +A820 +EFE0 +AAA0 +AFE0 +F100 +2100 +2300 +ENDCHAR +STARTCHAR U_807A +ENCODING 32890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5420 +77E0 +5AA0 +7540 +5820 +5FE0 +7100 +D540 +1B20 +ENDCHAR +STARTCHAR U_807B +ENCODING 32891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +3F00 +A9E0 +7F40 +8940 +FFE0 +1100 +1F00 +1100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_807C +ENCODING 32892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +17E0 +F900 +5FE0 +7AA0 +5FE0 +7000 +5FE0 +7540 +DCA0 +1380 +ENDCHAR +STARTCHAR U_807D +ENCODING 32893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +5FE0 +7100 +5FE0 +FAA0 +1FE0 +F000 +5FE0 +F6A0 +5A40 +F1C0 +ENDCHAR +STARTCHAR U_807E +ENCODING 32894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2900 +FFE0 +4500 +7DC0 +4520 +FFE0 +1080 +1F80 +1080 +7FE0 +ENDCHAR +STARTCHAR U_807F +ENCODING 32895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8080 +ENCODING 32896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0440 +FFE0 +0440 +3FC0 +0440 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8081 +ENCODING 32897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4400 +5F80 +4480 +5FC0 +4480 +BFC0 +8400 +ENDCHAR +STARTCHAR U_8082 +ENCODING 32898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2140 +3FE0 +4940 +B7C0 +1100 +27C0 +4100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_8083 +ENCODING 32899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +5640 +5540 +6540 +8440 +ENDCHAR +STARTCHAR U_8084 +ENCODING 32900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +67C0 +4940 +7FE0 +8140 +F7C0 +A100 +FFC0 +2100 +5FE0 +8900 +ENDCHAR +STARTCHAR U_8085 +ENCODING 32901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +7FE0 +0440 +7FC0 +5540 +7FC0 +4440 +75C0 +9540 +ENDCHAR +STARTCHAR U_8086 +ENCODING 32902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77C0 +4140 +77E0 +4140 +77C0 +4100 +F7C0 +5100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_8087 +ENCODING 32903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4940 +7CC0 +8520 +7FE0 +0480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8088 +ENCODING 32904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7FE0 +4940 +7880 +4560 +BF80 +0480 +7FE0 +0480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8089 +ENCODING 32905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +9480 +E280 +8880 +8880 +9480 +E280 +8080 +8180 +ENDCHAR +STARTCHAR U_808A +ENCODING 32906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4FC0 +4840 +7840 +4880 +4880 +7900 +4900 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_808B +ENCODING 32907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4920 +4920 +7920 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_808C +ENCODING 32908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +9480 +F480 +9480 +9480 +F480 +9480 +94A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_808D +ENCODING 32909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +5780 +7280 +5280 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_808E +ENCODING 32910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8040 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_808F +ENCODING 32911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0A00 +3180 +C460 +7FC0 +4440 +4A40 +5540 +4A40 +5140 +61C0 +ENDCHAR +STARTCHAR U_8090 +ENCODING 32912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C00 +4BC0 +4840 +7880 +4900 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_8091 +ENCODING 32913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7420 +5820 +5220 +7120 +5120 +5020 +90A0 +B040 +ENDCHAR +STARTCHAR U_8092 +ENCODING 32914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +5F80 +7280 +5680 +5280 +7380 +5280 +54A0 +98A0 +B060 +ENDCHAR +STARTCHAR U_8093 +ENCODING 32915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8094 +ENCODING 32916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5500 +7FC0 +5540 +5540 +7540 +55C0 +5520 +9420 +B3E0 +ENDCHAR +STARTCHAR U_8095 +ENCODING 32917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5120 +5120 +7120 +5520 +5520 +7920 +5120 +5220 +92A0 +B440 +ENDCHAR +STARTCHAR U_8096 +ENCODING 32918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +4900 +2A00 +7F00 +4100 +7F00 +4100 +7F00 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_8097 +ENCODING 32919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5100 +7FE0 +5240 +5240 +7440 +5280 +5100 +9280 +B440 +ENDCHAR +STARTCHAR U_8098 +ENCODING 32920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +4840 +4840 +7FE0 +4840 +4A40 +7940 +4940 +4840 +8940 +9880 +ENDCHAR +STARTCHAR U_8099 +ENCODING 32921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7E +42 +7E +00 +FF +81 +FF +81 +FF +81 +87 +ENDCHAR +STARTCHAR U_809A +ENCODING 32922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7900 +4FC0 +4900 +7900 +4900 +4900 +8900 +9FE0 +ENDCHAR +STARTCHAR U_809B +ENCODING 32923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BE0 +4880 +7880 +4880 +4880 +7880 +4880 +4880 +8FE0 +9800 +ENDCHAR +STARTCHAR U_809C +ENCODING 32924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4880 +4900 +7A60 +4840 +4880 +7900 +4A60 +4840 +8880 +9B00 +ENDCHAR +STARTCHAR U_809D +ENCODING 32925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4880 +7880 +4880 +4FE0 +7880 +4880 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_809E +ENCODING 32926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5540 +7540 +5280 +5280 +7100 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_809F +ENCODING 32927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +4800 +7FE0 +4A00 +4FE0 +7820 +4820 +4820 +8920 +98C0 +ENDCHAR +STARTCHAR U_80A0 +ENCODING 32928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4880 +4900 +7A00 +4FE0 +4AA0 +7CA0 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_80A1 +ENCODING 32929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7C60 +4800 +4BE0 +7A20 +4940 +4880 +8940 +9E20 +ENDCHAR +STARTCHAR U_80A2 +ENCODING 32930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +4BE0 +4A20 +7A20 +4940 +4880 +8940 +9E20 +ENDCHAR +STARTCHAR U_80A3 +ENCODING 32931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4A80 +4C40 +7920 +4880 +4800 +7FE0 +4820 +4840 +8880 +9900 +ENDCHAR +STARTCHAR U_80A4 +ENCODING 32932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +4900 +4FE0 +7900 +4900 +4A80 +8C40 +9820 +ENDCHAR +STARTCHAR U_80A5 +ENCODING 32933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4AA0 +7AA0 +4BE0 +4A20 +7A00 +4A00 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_80A6 +ENCODING 32934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5280 +7440 +5820 +57C0 +7240 +5240 +5240 +9540 +B880 +ENDCHAR +STARTCHAR U_80A7 +ENCODING 32935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +7300 +5300 +5540 +7520 +5920 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80A8 +ENCODING 32936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7100 +5100 +57C0 +7100 +5FE0 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80A9 +ENCODING 32937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2000 +2FC0 +2840 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_80AA +ENCODING 32938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7900 +49E0 +4920 +7920 +4920 +4A20 +8A20 +9CC0 +ENDCHAR +STARTCHAR U_80AB +ENCODING 32939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +4AA0 +4AA0 +7BE0 +4880 +48A0 +88A0 +9860 +ENDCHAR +STARTCHAR U_80AC +ENCODING 32940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7280 +5240 +57E0 +7280 +5280 +7280 +5480 +54A0 +54A0 +B8E0 +ENDCHAR +STARTCHAR U_80AD +ENCODING 32941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4BE0 +7AA0 +4AA0 +4AA0 +7B60 +4A20 +4A20 +8A20 +9A60 +ENDCHAR +STARTCHAR U_80AE +ENCODING 32942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7000 +5780 +5480 +7480 +5480 +5480 +94A0 +B860 +ENDCHAR +STARTCHAR U_80AF +ENCODING 32943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_80B0 +ENCODING 32944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5140 +5120 +7FE0 +5100 +5100 +7100 +5280 +5240 +D440 +B820 +ENDCHAR +STARTCHAR U_80B1 +ENCODING 32945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FE0 +7900 +4940 +4A40 +7A80 +4A80 +4D40 +8FA0 +9820 +ENDCHAR +STARTCHAR U_80B2 +ENCODING 32946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +0040 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_80B3 +ENCODING 32947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7560 +5560 +5AA0 +72A0 +54A0 +5120 +9260 +B440 +ENDCHAR +STARTCHAR U_80B4 +ENCODING 32948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +0E00 +71C0 +0400 +FFE0 +1080 +3F80 +5080 +9F80 +1080 +1380 +ENDCHAR +STARTCHAR U_80B5 +ENCODING 32949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4A00 +7A00 +4BE0 +4A40 +7A40 +4A40 +4A40 +8C40 +9840 +ENDCHAR +STARTCHAR U_80B6 +ENCODING 32950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7480 +5480 +54A0 +77C0 +5480 +7480 +5480 +55A0 +96A0 +B4E0 +ENDCHAR +STARTCHAR U_80B7 +ENCODING 32951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C20 +4880 +4880 +7880 +4880 +4940 +8A20 +9C20 +ENDCHAR +STARTCHAR U_80B8 +ENCODING 32952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A80 +4C40 +7920 +4900 +4900 +7FE0 +4900 +4900 +8900 +9900 +ENDCHAR +STARTCHAR U_80B9 +ENCODING 32953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5440 +7440 +5FA0 +5200 +77C0 +5040 +5040 +9140 +B080 +ENDCHAR +STARTCHAR U_80BA +ENCODING 32954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +7100 +57E0 +5520 +7520 +5520 +5560 +9100 +B100 +ENDCHAR +STARTCHAR U_80BB +ENCODING 32955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_80BC +ENCODING 32956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4A40 +4FE0 +7A40 +4A40 +4FE0 +7A40 +4A40 +4A40 +8C40 +9840 +ENDCHAR +STARTCHAR U_80BD +ENCODING 32957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4900 +4900 +7900 +4980 +4A40 +8D60 +9920 +ENDCHAR +STARTCHAR U_80BE +ENCODING 32958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +9280 +9100 +96E0 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_80BF +ENCODING 32959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4BE0 +7AA0 +4AA0 +4AA0 +7BE0 +4AA0 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_80C0 +ENCODING 32960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4A40 +4A80 +7B00 +4A00 +4FE0 +7A80 +4A80 +4A80 +8B40 +9A20 +ENDCHAR +STARTCHAR U_80C1 +ENCODING 32961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +9FC0 +F140 +9540 +9540 +FA60 +9240 +9440 +9A40 +B180 +ENDCHAR +STARTCHAR U_80C2 +ENCODING 32962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5080 +57E0 +74A0 +57E0 +54A0 +77E0 +54A0 +5080 +9080 +B080 +ENDCHAR +STARTCHAR U_80C3 +ENCODING 32963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +4100 +4700 +ENDCHAR +STARTCHAR U_80C4 +ENCODING 32964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +4100 +ENDCHAR +STARTCHAR U_80C5 +ENCODING 32965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +57C0 +7900 +5100 +5FE0 +7100 +5280 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_80C6 +ENCODING 32966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BC0 +4A40 +7A40 +4BC0 +4A40 +7A40 +4BC0 +4800 +8800 +9FE0 +ENDCHAR +STARTCHAR U_80C7 +ENCODING 32967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +52A0 +77E0 +5A80 +5FE0 +72A0 +52A0 +52E0 +5480 +B880 +ENDCHAR +STARTCHAR U_80C8 +ENCODING 32968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +4FE0 +7900 +49C0 +4940 +7940 +4A80 +4AC0 +8D20 +9A20 +ENDCHAR +STARTCHAR U_80C9 +ENCODING 32969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4900 +4BE0 +7A20 +4A20 +4BE0 +7A20 +4A20 +4A20 +8BE0 +9A20 +ENDCHAR +STARTCHAR U_80CA +ENCODING 32970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C20 +4BA0 +4AA0 +7AA0 +4BA0 +4820 +8920 +98C0 +ENDCHAR +STARTCHAR U_80CB +ENCODING 32971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +51E0 +7100 +5100 +57E0 +7420 +5420 +5420 +97E0 +B420 +ENDCHAR +STARTCHAR U_80CC +ENCODING 32972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +F380 +1220 +33E0 +C000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_80CD +ENCODING 32973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7060 +57C0 +5540 +7540 +5540 +5540 +7540 +5540 +5540 +95E0 +9940 +ENDCHAR +STARTCHAR U_80CE +ENCODING 32974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4A40 +7FE0 +4820 +4BC0 +7A40 +4A40 +4A40 +8BC0 +9A40 +ENDCHAR +STARTCHAR U_80CF +ENCODING 32975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48A0 +4BC0 +7A80 +4C80 +4FE0 +79A0 +4AA0 +4CE0 +8880 +9880 +ENDCHAR +STARTCHAR U_80D0 +ENCODING 32976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5520 +5520 +7520 +57E0 +5100 +7520 +5520 +5520 +97E0 +B420 +ENDCHAR +STARTCHAR U_80D1 +ENCODING 32977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7A20 +4A20 +4BE0 +7800 +4800 +4A40 +8A20 +9C20 +ENDCHAR +STARTCHAR U_80D2 +ENCODING 32978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7400 +5500 +5540 +7580 +5500 +5500 +9520 +B8E0 +ENDCHAR +STARTCHAR U_80D3 +ENCODING 32979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5540 +7540 +5580 +7FE0 +5100 +5100 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80D4 +ENCODING 32980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D80 +5120 +FDE0 +0400 +7FC0 +4440 +4B40 +5440 +4A40 +51C0 +ENDCHAR +STARTCHAR U_80D5 +ENCODING 32981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5240 +5440 +75E0 +5C40 +5640 +7540 +5540 +5440 +9540 +B480 +ENDCHAR +STARTCHAR U_80D6 +ENCODING 32982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5520 +5540 +7100 +57C0 +5100 +7FE0 +5100 +5100 +9100 +9100 +ENDCHAR +STARTCHAR U_80D7 +ENCODING 32983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4A80 +4C40 +7920 +4A80 +4920 +7A40 +4880 +4900 +8A00 +9C00 +ENDCHAR +STARTCHAR U_80D8 +ENCODING 32984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7900 +4A40 +4F80 +7880 +4940 +4A20 +8FE0 +9820 +ENDCHAR +STARTCHAR U_80D9 +ENCODING 32985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7D00 +49E0 +4900 +7900 +49E0 +4900 +8900 +9900 +ENDCHAR +STARTCHAR U_80DA +ENCODING 32986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4900 +7900 +4B40 +4D20 +7920 +4900 +4900 +8800 +9FE0 +ENDCHAR +STARTCHAR U_80DB +ENCODING 32987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4AA0 +7BE0 +4AA0 +4AA0 +7BE0 +4880 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_80DC +ENCODING 32988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +5500 +77E0 +5900 +5100 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80DD +ENCODING 32989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7040 +5780 +5480 +7480 +57E0 +5480 +7480 +5580 +56A0 +9560 +B4A0 +ENDCHAR +STARTCHAR U_80DE +ENCODING 32990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53E0 +5420 +7FA0 +54A0 +54A0 +77A0 +54C0 +5420 +9420 +B3E0 +ENDCHAR +STARTCHAR U_80DF +ENCODING 32991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5540 +7540 +5FE0 +5440 +7540 +5540 +57E0 +9040 +B180 +ENDCHAR +STARTCHAR U_80E0 +ENCODING 32992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +4900 +4FE0 +7900 +4900 +4A40 +8C60 +9FA0 +ENDCHAR +STARTCHAR U_80E1 +ENCODING 32993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +FE20 +13E0 +1220 +7A20 +4BE0 +4A20 +7A20 +4C20 +08E0 +ENDCHAR +STARTCHAR U_80E2 +ENCODING 32994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5040 +5740 +7540 +5540 +5540 +7740 +5540 +5040 +9140 +B080 +ENDCHAR +STARTCHAR U_80E3 +ENCODING 32995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +4C80 +7AA0 +4AE0 +4FA0 +7AA0 +4AE0 +4A80 +8A20 +99E0 +ENDCHAR +STARTCHAR U_80E4 +ENCODING 32996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5C80 +4A80 +5F80 +4080 +5E80 +5280 +5E80 +52A0 +9EA0 +9260 +ENDCHAR +STARTCHAR U_80E5 +ENCODING 32997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2440 +2780 +5400 +BFE0 +2080 +3F80 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_80E6 +ENCODING 32998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7540 +5540 +5FE0 +7100 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_80E7 +ENCODING 32999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5240 +5FE0 +7280 +52A0 +52A0 +72C0 +5480 +55A0 +9AA0 +B0E0 +ENDCHAR +STARTCHAR U_80E8 +ENCODING 33000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4900 +7A80 +4A80 +4FE0 +7880 +4AC0 +4AA0 +8CA0 +9980 +ENDCHAR +STARTCHAR U_80E9 +ENCODING 33001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +49E0 +7900 +4FE0 +4900 +7980 +4940 +4920 +8920 +9900 +ENDCHAR +STARTCHAR U_80EA +ENCODING 33002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48E0 +4880 +7BE0 +4A20 +4A20 +7BE0 +4A00 +4A00 +8A00 +9C00 +ENDCHAR +STARTCHAR U_80EB +ENCODING 33003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5040 +5080 +7140 +5620 +5000 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80EC +ENCODING 33004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +5080 +3B60 +C400 +7FC0 +4A40 +5540 +4440 +4A40 +5140 +ENDCHAR +STARTCHAR U_80ED +ENCODING 33005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5520 +77E0 +5520 +5520 +75A0 +5660 +5420 +97E0 +9420 +ENDCHAR +STARTCHAR U_80EE +ENCODING 33006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4A20 +4940 +7880 +4B40 +4CA0 +7BE0 +4A80 +4FE0 +4880 +9880 +ENDCHAR +STARTCHAR U_80EF +ENCODING 33007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7BA0 +5000 +5FE0 +7200 +57C0 +5040 +9040 +B180 +ENDCHAR +STARTCHAR U_80F0 +ENCODING 33008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77E0 +5120 +57E0 +7500 +57E0 +5160 +9280 +B460 +ENDCHAR +STARTCHAR U_80F1 +ENCODING 33009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5920 +5540 +7100 +5FE0 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_80F2 +ENCODING 33010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7240 +5480 +5720 +7240 +5480 +5140 +9220 +B420 +ENDCHAR +STARTCHAR U_80F3 +ENCODING 33011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5680 +7900 +5280 +5440 +7BE0 +5240 +5240 +93C0 +B240 +ENDCHAR +STARTCHAR U_80F4 +ENCODING 33012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +55E0 +7420 +55E0 +5560 +7560 +55E0 +5420 +9420 +B460 +ENDCHAR +STARTCHAR U_80F5 +ENCODING 33013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5200 +7440 +57A0 +5100 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80F6 +ENCODING 33014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5280 +7440 +5820 +7480 +5280 +5100 +5280 +B440 +8820 +ENDCHAR +STARTCHAR U_80F7 +ENCODING 33015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A20 +A4A0 +2AA0 +3FC0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_80F8 +ENCODING 33016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53E0 +5420 +7920 +56A0 +55A0 +76A0 +54A0 +57A0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_80F9 +ENCODING 33017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +A200 +EFE0 +AAA0 +AAA0 +EAA0 +AAA0 +AAA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_80FA +ENCODING 33018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +7100 +57E0 +5240 +7240 +5680 +5180 +9240 +B420 +ENDCHAR +STARTCHAR U_80FB +ENCODING 33019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72E0 +5400 +5800 +7200 +55E0 +5440 +7C40 +5440 +5440 +9540 +B480 +ENDCHAR +STARTCHAR U_80FC +ENCODING 33020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +5FE0 +7280 +5280 +5FE0 +7280 +5280 +5280 +9480 +B880 +ENDCHAR +STARTCHAR U_80FD +ENCODING 33021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4940 +FD80 +0120 +7DE0 +4400 +7D40 +4580 +7D20 +4520 +4DE0 +ENDCHAR +STARTCHAR U_80FE +ENCODING 33022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD40 +1120 +FFE0 +1100 +FD20 +9520 +AD40 +D4A0 +AD60 +CE20 +ENDCHAR +STARTCHAR U_80FF +ENCODING 33023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7900 +4FE0 +4900 +7900 +4FC0 +4900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_8100 +ENCODING 33024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0120 +7640 +1480 +2C40 +7FA0 +A080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8101 +ENCODING 33025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5AA0 +56C0 +7280 +5280 +56C0 +7AA0 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_8102 +ENCODING 33026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A60 +4B80 +7A20 +49E0 +4800 +7BE0 +4A20 +4BE0 +8A20 +9BE0 +ENDCHAR +STARTCHAR U_8103 +ENCODING 33027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4C40 +7BE0 +4AA0 +4AA0 +7BE0 +4A00 +4A00 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8104 +ENCODING 33028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4900 +7900 +4A80 +4AA0 +7DC0 +4A80 +4940 +4A20 +9C20 +ENDCHAR +STARTCHAR U_8105 +ENCODING 33029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +2080 +FBE0 +4920 +BFE0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_8106 +ENCODING 33030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5480 +5FE0 +7400 +55C0 +5540 +7540 +55C0 +5520 +9520 +B8E0 +ENDCHAR +STARTCHAR U_8107 +ENCODING 33031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4940 +7A40 +4C40 +4A80 +7FE0 +4AA0 +4AA0 +4AA0 +9D60 +ENDCHAR +STARTCHAR U_8108 +ENCODING 33032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0E0 +AF00 +A860 +EB80 +AA80 +AAA0 +EAC0 +AA80 +AAC0 +AB40 +B220 +ENDCHAR +STARTCHAR U_8109 +ENCODING 33033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5080 +5700 +7120 +5D40 +5580 +7540 +5540 +5920 +9120 +B300 +ENDCHAR +STARTCHAR U_810A +ENCODING 33034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +C8C0 +2D00 +D2C0 +2100 +7F80 +A140 +3F00 +2100 +3F00 +2100 +2700 +ENDCHAR +STARTCHAR U_810B +ENCODING 33035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0880 +1100 +FFE0 +2520 +FFC0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_810C +ENCODING 33036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4C80 +7880 +4BE0 +4A80 +7A80 +4FE0 +4880 +4880 +9880 +ENDCHAR +STARTCHAR U_810D +ENCODING 33037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5280 +5440 +7820 +53C0 +5000 +77E0 +5100 +5200 +9440 +B7A0 +ENDCHAR +STARTCHAR U_810E +ENCODING 33038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E60 +4980 +4A40 +7CA0 +4880 +4FE0 +7880 +4AC0 +4CA0 +88A0 +B980 +ENDCHAR +STARTCHAR U_810F +ENCODING 33039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +5400 +7480 +5480 +57E0 +7480 +5480 +5480 +9880 +B3E0 +ENDCHAR +STARTCHAR U_8110 +ENCODING 33040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5240 +7180 +5240 +5C20 +7240 +5240 +5240 +9440 +B840 +ENDCHAR +STARTCHAR U_8111 +ENCODING 33041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5080 +57E0 +7000 +54A0 +56A0 +7520 +56A0 +5420 +97E0 +B420 +ENDCHAR +STARTCHAR U_8112 +ENCODING 33042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4D20 +4B40 +7900 +4FE0 +4900 +7980 +4B40 +4D20 +8920 +B900 +ENDCHAR +STARTCHAR U_8113 +ENCODING 33043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5920 +7100 +52A0 +56C0 +7A80 +5280 +52C0 +9320 +B220 +ENDCHAR +STARTCHAR U_8114 +ENCODING 33044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +8A20 +FFC0 +8A40 +9540 +A4C0 +8A40 +91C0 +ENDCHAR +STARTCHAR U_8115 +ENCODING 33045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5480 +7FE0 +5520 +5520 +77E0 +5280 +52A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_8116 +ENCODING 33046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5100 +7FE0 +5820 +57C0 +7080 +5FE0 +5100 +9100 +B300 +ENDCHAR +STARTCHAR U_8117 +ENCODING 33047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4D60 +7AA0 +4CA0 +4920 +7A40 +4BE0 +4A20 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8118 +ENCODING 33048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7C20 +4BC0 +4800 +7FE0 +4A80 +4AA0 +8CA0 +9860 +ENDCHAR +STARTCHAR U_8119 +ENCODING 33049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7180 +5140 +5FE0 +7100 +5920 +5540 +7380 +5540 +5920 +9120 +B300 +ENDCHAR +STARTCHAR U_811A +ENCODING 33050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74E0 +54A0 +5FA0 +74A0 +54A0 +5FA0 +74A0 +5AA0 +5FE0 +9080 +B080 +ENDCHAR +STARTCHAR U_811B +ENCODING 33051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5540 +5540 +7A80 +5540 +5540 +7000 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_811C +ENCODING 33052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4900 +7BE0 +4A20 +4BE0 +7A20 +4BE0 +4A20 +AA20 +93E0 +ENDCHAR +STARTCHAR U_811D +ENCODING 33053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4A40 +7BC0 +4800 +4FE0 +7840 +4880 +4880 +8880 +9980 +ENDCHAR +STARTCHAR U_811E +ENCODING 33054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5540 +5540 +7540 +5BA0 +5920 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_811F +ENCODING 33055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4BA0 +4D20 +7AC0 +4840 +4FE0 +7840 +4A40 +4940 +8840 +99C0 +ENDCHAR +STARTCHAR U_8120 +ENCODING 33056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7060 +5DC0 +5440 +7440 +5960 +5540 +7540 +5D40 +57E0 +5400 +9BE0 +ENDCHAR +STARTCHAR U_8121 +ENCODING 33057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7020 +5EC0 +5240 +7440 +57E0 +5240 +7A40 +57E0 +5200 +9500 +B8E0 +ENDCHAR +STARTCHAR U_8122 +ENCODING 33058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57E0 +5800 +77C0 +5540 +5FE0 +7540 +5540 +57E0 +9040 +B180 +ENDCHAR +STARTCHAR U_8123 +ENCODING 33059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +7FE0 +5280 +51E0 +5FC0 +9040 +9FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_8124 +ENCODING 33060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5400 +57C0 +7400 +57E0 +5540 +7540 +5560 +5540 +95A0 +9920 +ENDCHAR +STARTCHAR U_8125 +ENCODING 33061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +7540 +5540 +5BA0 +7120 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_8126 +ENCODING 33062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +50A0 +5FE0 +7080 +5480 +5280 +7580 +54A0 +5DA0 +9360 +B020 +ENDCHAR +STARTCHAR U_8127 +ENCODING 33063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5240 +57A0 +7240 +5520 +53C0 +7240 +5640 +5980 +9240 +B420 +ENDCHAR +STARTCHAR U_8128 +ENCODING 33064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77E0 +5520 +57E0 +7100 +5380 +5540 +9920 +B100 +ENDCHAR +STARTCHAR U_8129 +ENCODING 33065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +4A40 +5180 +D7C0 +5C60 +57C0 +5440 +57C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_812A +ENCODING 33066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4880 +4B60 +7900 +4FE0 +4A80 +7FE0 +4AA0 +4AA0 +4AA0 +8880 +ENDCHAR +STARTCHAR U_812B +ENCODING 33067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5440 +5FE0 +7440 +5440 +57C0 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_812C +ENCODING 33068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F20 +5A20 +7540 +5FC0 +5080 +7100 +5FE0 +5100 +9100 +B300 +ENDCHAR +STARTCHAR U_812D +ENCODING 33069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5440 +77C0 +5000 +5FE0 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_812E +ENCODING 33070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +4FA0 +4AA0 +7AC0 +4900 +4FE0 +7940 +4A40 +4980 +4980 +9E60 +ENDCHAR +STARTCHAR U_812F +ENCODING 33071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E140 +A120 +AFE0 +E100 +AFE0 +A920 +EFE0 +A920 +AFE0 +A920 +A960 +ENDCHAR +STARTCHAR U_8130 +ENCODING 33072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4800 +4BC0 +7A40 +4A40 +4BC0 +7A40 +4800 +4A40 +8980 +9FE0 +ENDCHAR +STARTCHAR U_8131 +ENCODING 33073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +57C0 +7440 +5440 +57C0 +7280 +5280 +52A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_8132 +ENCODING 33074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +54A0 +56A0 +75C0 +55A0 +56A0 +94A0 +B980 +ENDCHAR +STARTCHAR U_8133 +ENCODING 33075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D20 +4AA0 +4AC0 +7800 +4A20 +4B60 +7AA0 +4B60 +4A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8134 +ENCODING 33076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4900 +7B80 +4D40 +4920 +7900 +4BC0 +4A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_8135 +ENCODING 33077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7000 +57C0 +5100 +7FE0 +5100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_8136 +ENCODING 33078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +5240 +73C0 +5100 +57E0 +7520 +5520 +56A0 +9460 +9460 +ENDCHAR +STARTCHAR U_8137 +ENCODING 33079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B20 +4E20 +4A20 +7FA0 +4AA0 +4AA0 +7BA0 +4EA0 +4A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_8138 +ENCODING 33080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4940 +7A20 +4FC0 +4920 +7CA0 +4AA0 +4A40 +8840 +9FE0 +ENDCHAR +STARTCHAR U_8139 +ENCODING 33081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A00 +4BC0 +7A00 +4BC0 +4A00 +7FE0 +4AA0 +4A40 +8AA0 +9B20 +ENDCHAR +STARTCHAR U_813A +ENCODING 33082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7A40 +4B40 +4CA0 +7880 +4FE0 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_813B +ENCODING 33083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7FC0 +4940 +4FE0 +7940 +4FC0 +4900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_813C +ENCODING 33084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +77E0 +5520 +57A0 +7560 +57A0 +5520 +5520 +B560 +ENDCHAR +STARTCHAR U_813D +ENCODING 33085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5280 +57E0 +7480 +5FE0 +5480 +77E0 +5480 +5480 +97E0 +B400 +ENDCHAR +STARTCHAR U_813E +ENCODING 33086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5520 +77E0 +5520 +57E0 +7100 +5280 +57E0 +9080 +B080 +ENDCHAR +STARTCHAR U_813F +ENCODING 33087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7FC0 +4900 +4FE0 +7900 +4B20 +4EC0 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8140 +ENCODING 33088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4980 +4A40 +7FE0 +4800 +4FE0 +7AA0 +4FE0 +4AA0 +4AA0 +9860 +ENDCHAR +STARTCHAR U_8141 +ENCODING 33089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7220 +5440 +5EE0 +7440 +5440 +5440 +7EE0 +5440 +5440 +5440 +B840 +ENDCHAR +STARTCHAR U_8142 +ENCODING 33090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4BE0 +7AA0 +4BE0 +4880 +7FE0 +49C0 +4AA0 +4AA0 +9CA0 +ENDCHAR +STARTCHAR U_8143 +ENCODING 33091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +5680 +5FE0 +7200 +5FE0 +5440 +7FA0 +5480 +55A0 +9420 +B3E0 +ENDCHAR +STARTCHAR U_8144 +ENCODING 33092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7540 +5540 +5FE0 +7540 +5540 +5FE0 +9100 +B7C0 +ENDCHAR +STARTCHAR U_8145 +ENCODING 33093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +4AA0 +4880 +7940 +4A20 +4C80 +7AA0 +49C0 +4880 +4940 +9A20 +ENDCHAR +STARTCHAR U_8146 +ENCODING 33094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A280 +AFE0 +EAA0 +AAA0 +AFE0 +EAA0 +AAA0 +BFE0 +A280 +AC60 +ENDCHAR +STARTCHAR U_8147 +ENCODING 33095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7380 +5540 +5920 +7FE0 +5280 +5680 +9180 +BE60 +ENDCHAR +STARTCHAR U_8148 +ENCODING 33096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5100 +5FE0 +7440 +57C0 +5440 +97C0 +B4C0 +ENDCHAR +STARTCHAR U_8149 +ENCODING 33097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4AE0 +4A20 +7B60 +4A20 +4BE0 +7940 +4940 +4940 +4A40 +9460 +ENDCHAR +STARTCHAR U_814A +ENCODING 33098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +57C0 +7280 +5FE0 +5000 +77C0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_814B +ENCODING 33099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +74E0 +5D20 +56A0 +7560 +5540 +5480 +9540 +B620 +ENDCHAR +STARTCHAR U_814C +ENCODING 33100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7540 +5FE0 +5540 +77C0 +5540 +57C0 +9120 +B0E0 +ENDCHAR +STARTCHAR U_814D +ENCODING 33101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7380 +5440 +5A20 +7100 +5FC0 +5040 +7180 +5340 +56A0 +9A40 +B1C0 +ENDCHAR +STARTCHAR U_814E +ENCODING 33102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +F980 +FA40 +9420 +FF80 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_814F +ENCODING 33103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +56C0 +7240 +55A0 +5FE0 +7220 +54A0 +5240 +95C0 +B920 +ENDCHAR +STARTCHAR U_8150 +ENCODING 33104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4840 +5FE0 +6A40 +4940 +5FE0 +5220 +5520 +5AA0 +9560 +ENDCHAR +STARTCHAR U_8151 +ENCODING 33105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5480 +7520 +57E0 +5520 +75A0 +5560 +5520 +9520 +B960 +ENDCHAR +STARTCHAR U_8152 +ENCODING 33106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +57E0 +5480 +75E0 +5520 +5520 +95E0 +B920 +ENDCHAR +STARTCHAR U_8153 +ENCODING 33107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5EE0 +7280 +5280 +5EE0 +7280 +5280 +5EE0 +9280 +B280 +ENDCHAR +STARTCHAR U_8154 +ENCODING 33108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7280 +5440 +5820 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_8155 +ENCODING 33109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7200 +57E0 +58A0 +75A0 +52E0 +5280 +94A0 +B860 +ENDCHAR +STARTCHAR U_8156 +ENCODING 33110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +4880 +7BE0 +4AA0 +4BE0 +7AA0 +4BE0 +49C0 +AAA0 +94A0 +ENDCHAR +STARTCHAR U_8157 +ENCODING 33111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +77C0 +5540 +57C0 +7000 +5FE0 +5240 +5240 +B440 +ENDCHAR +STARTCHAR U_8158 +ENCODING 33112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7520 +57E0 +55A0 +7560 +57E0 +5420 +57E0 +B420 +ENDCHAR +STARTCHAR U_8159 +ENCODING 33113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +73C0 +5000 +57E0 +7080 +52C0 +54A0 +94A0 +B180 +ENDCHAR +STARTCHAR U_815A +ENCODING 33114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +77E0 +5100 +5500 +75E0 +5500 +5500 +9B00 +B1E0 +ENDCHAR +STARTCHAR U_815B +ENCODING 33115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7400 +57E0 +5540 +77E0 +5480 +57E0 +9480 +BBE0 +ENDCHAR +STARTCHAR U_815C +ENCODING 33116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4FE0 +4A40 +7BC0 +4A40 +4BC0 +7880 +4FE0 +4980 +8AC0 +9CA0 +ENDCHAR +STARTCHAR U_815D +ENCODING 33117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5200 +5FE0 +7AA0 +5AA0 +5260 +7FE0 +5300 +5280 +5460 +B840 +ENDCHAR +STARTCHAR U_815E +ENCODING 33118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +57C0 +7080 +5FE0 +5520 +72C0 +5580 +52C0 +94A0 +B320 +ENDCHAR +STARTCHAR U_815F +ENCODING 33119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7FE0 +5240 +5FE0 +7100 +57C0 +5100 +5100 +BFE0 +ENDCHAR +STARTCHAR U_8160 +ENCODING 33120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5200 +5FE0 +77C0 +5920 +5FE0 +9280 +9C60 +ENDCHAR +STARTCHAR U_8161 +ENCODING 33121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A740 +E540 +AFE0 +A820 +EBA0 +AAA0 +ABA0 +A820 +A860 +ENDCHAR +STARTCHAR U_8162 +ENCODING 33122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7540 +57C0 +5100 +77E0 +5560 +57A0 +9420 +B460 +ENDCHAR +STARTCHAR U_8163 +ENCODING 33123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5920 +77C0 +5540 +5540 +55C0 +B100 +ENDCHAR +STARTCHAR U_8164 +ENCODING 33124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5000 +77C0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_8165 +ENCODING 33125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4BE0 +7A20 +4BE0 +4A80 +7BE0 +4C80 +4BE0 +8880 +9FE0 +ENDCHAR +STARTCHAR U_8166 +ENCODING 33126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +5540 +52A0 +7200 +57E0 +5420 +76A0 +5520 +56A0 +97E0 +B420 +ENDCHAR +STARTCHAR U_8167 +ENCODING 33127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A280 +A440 +EBA0 +B000 +AEA0 +EAA0 +AEA0 +AAA0 +AE20 +AAE0 +ENDCHAR +STARTCHAR U_8168 +ENCODING 33128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5540 +5540 +77C0 +5000 +5FE0 +7000 +5FE0 +5AA0 +5AA0 +B860 +ENDCHAR +STARTCHAR U_8169 +ENCODING 33129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A100 +EFE0 +AAA0 +AFE0 +E920 +AFE0 +A920 +A920 +A860 +ENDCHAR +STARTCHAR U_816A +ENCODING 33130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5920 +57C0 +7100 +57C0 +5540 +77C0 +5540 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_816B +ENCODING 33131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7540 +57C0 +5540 +77C0 +5100 +57C0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_816C +ENCODING 33132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5280 +5100 +7FE0 +5540 +5B00 +7100 +5FE0 +5540 +5920 +B100 +ENDCHAR +STARTCHAR U_816D +ENCODING 33133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5AA0 +5EE0 +7000 +57C0 +5000 +7FE0 +5200 +57C0 +9040 +B380 +ENDCHAR +STARTCHAR U_816E +ENCODING 33134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +57E0 +7520 +57E0 +5420 +7140 +56A0 +5A20 +9240 +B1C0 +ENDCHAR +STARTCHAR U_816F +ENCODING 33135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5480 +57E0 +7480 +55E0 +5520 +75E0 +5520 +55E0 +9520 +B9E0 +ENDCHAR +STARTCHAR U_8170 +ENCODING 33136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A100 +EFE0 +A240 +A680 +A1C0 +AE20 +ENDCHAR +STARTCHAR U_8171 +ENCODING 33137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5FE0 +54A0 +75E0 +54A0 +5FE0 +7280 +5BE0 +5480 +9680 +B9E0 +ENDCHAR +STARTCHAR U_8172 +ENCODING 33138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +57E0 +7520 +57E0 +5000 +7FE0 +54A0 +54C0 +9540 +B620 +ENDCHAR +STARTCHAR U_8173 +ENCODING 33139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +AAA0 +B1A0 +E4A0 +AAA0 +B1A0 +E0A0 +AEA0 +AAE0 +AA80 +AE80 +ENDCHAR +STARTCHAR U_8174 +ENCODING 33140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AD60 +A920 +EFE0 +A920 +AFE0 +E920 +A100 +A280 +A440 +A820 +ENDCHAR +STARTCHAR U_8175 +ENCODING 33141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7760 +5520 +5520 +7760 +5400 +57E0 +74A0 +57A0 +5440 +54A0 +B520 +ENDCHAR +STARTCHAR U_8176 +ENCODING 33142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +76E0 +54A0 +54A0 +7720 +5400 +57E0 +74A0 +57A0 +5C40 +94A0 +B520 +ENDCHAR +STARTCHAR U_8177 +ENCODING 33143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5000 +53C0 +7240 +53C0 +5000 +77E0 +54A0 +57E0 +94A0 +B7E0 +ENDCHAR +STARTCHAR U_8178 +ENCODING 33144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +5FE0 +5400 +77E0 +5AA0 +52A0 +9520 +BAC0 +ENDCHAR +STARTCHAR U_8179 +ENCODING 33145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5C40 +77C0 +5440 +57C0 +7200 +57C0 +5A40 +9180 +B660 +ENDCHAR +STARTCHAR U_817A +ENCODING 33146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +5440 +77C0 +5440 +57C0 +7100 +5FA0 +5540 +9920 +B300 +ENDCHAR +STARTCHAR U_817B +ENCODING 33147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0A0 +BFE0 +A080 +EE80 +A080 +AF80 +EA80 +AA80 +AAA0 +A560 +A8A0 +ENDCHAR +STARTCHAR U_817C +ENCODING 33148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +EAA0 +ABA0 +AAA0 +EAA0 +ABA0 +AAA0 +AFE0 +A820 +ENDCHAR +STARTCHAR U_817D +ENCODING 33149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_817E +ENCODING 33150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5200 +7FE0 +5440 +5FA0 +7480 +57E0 +5020 +97A0 +B040 +ENDCHAR +STARTCHAR U_817F +ENCODING 33151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +5920 +55E0 +7120 +5DE0 +5500 +75A0 +5540 +5520 +9580 +BBE0 +ENDCHAR +STARTCHAR U_8180 +ENCODING 33152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5920 +7FE0 +5200 +53E0 +9420 +B9C0 +ENDCHAR +STARTCHAR U_8181 +ENCODING 33153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +5FC0 +5500 +7FC0 +5540 +5FE0 +7540 +5FC0 +5580 +5D40 +B520 +ENDCHAR +STARTCHAR U_8182 +ENCODING 33154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +2B20 +4AC0 +9240 +3FA0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_8183 +ENCODING 33155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A540 +A6C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_8184 +ENCODING 33156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7760 +5520 +5760 +7520 +57E0 +5100 +77E0 +5240 +5180 +5280 +BC60 +ENDCHAR +STARTCHAR U_8185 +ENCODING 33157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5500 +77C0 +5540 +57E0 +7500 +5500 +57C0 +5A40 +BBC0 +ENDCHAR +STARTCHAR U_8186 +ENCODING 33158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5100 +5FE0 +7280 +5540 +5FA0 +9540 +BB20 +ENDCHAR +STARTCHAR U_8187 +ENCODING 33159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +59E0 +5520 +71E0 +5D00 +55E0 +7520 +55E0 +5520 +9400 +BBE0 +ENDCHAR +STARTCHAR U_8188 +ENCODING 33160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A000 +A7C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AFE0 +A920 +B960 +ENDCHAR +STARTCHAR U_8189 +ENCODING 33161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +A280 +AFE0 +E280 +A440 +A820 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_818A +ENCODING 33162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +5FE0 +5520 +77E0 +5520 +57E0 +7520 +5FE0 +5440 +9240 +B0C0 +ENDCHAR +STARTCHAR U_818B +ENCODING 33163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +52A0 +94A0 +2940 +4620 +FFE0 +A0A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_818C +ENCODING 33164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +5580 +5340 +7EA0 +5440 +5FE0 +7440 +57C0 +5440 +97C0 +B4C0 +ENDCHAR +STARTCHAR U_818D +ENCODING 33165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +56A0 +7520 +56A0 +57E0 +7480 +57A0 +54C0 +97A0 +B460 +ENDCHAR +STARTCHAR U_818E +ENCODING 33166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F40 +5540 +7280 +5500 +57C0 +7140 +5FE0 +5280 +5460 +B840 +ENDCHAR +STARTCHAR U_818F +ENCODING 33167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +FFE0 +9120 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8190 +ENCODING 33168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA40 +2580 +3AA0 +4B60 +FFA0 +2480 +2A80 +2480 +2A80 +2180 +ENDCHAR +STARTCHAR U_8191 +ENCODING 33169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +5420 +7380 +5200 +53E0 +7280 +5280 +57E0 +9240 +B420 +ENDCHAR +STARTCHAR U_8192 +ENCODING 33170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5400 +55C0 +7540 +55C0 +5400 +77E0 +56A0 +57E0 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8193 +ENCODING 33171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5C40 +77C0 +5440 +5FE0 +7400 +57E0 +5AA0 +5520 +B2C0 +ENDCHAR +STARTCHAR U_8194 +ENCODING 33172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA80 +EFE0 +AAA0 +AFE0 +EA80 +ABA0 +AAC0 +B3A0 +B2E0 +ENDCHAR +STARTCHAR U_8195 +ENCODING 33173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A960 +AFE0 +E920 +AF20 +AB60 +EEA0 +A9E0 +AE60 +A820 +AFE0 +ENDCHAR +STARTCHAR U_8196 +ENCODING 33174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5BE0 +5540 +7480 +5F60 +7480 +57E0 +5480 +57E0 +5480 +BFE0 +ENDCHAR +STARTCHAR U_8197 +ENCODING 33175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7520 +5520 +57E0 +7280 +57E0 +5480 +7FE0 +5480 +57E0 +9480 +B7E0 +ENDCHAR +STARTCHAR U_8198 +ENCODING 33176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A000 +E7C0 +A000 +AFE0 +A540 +BB20 +ENDCHAR +STARTCHAR U_8199 +ENCODING 33177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +55E0 +7480 +5BE0 +5AA0 +7EA0 +57E0 +5480 +94A0 +BBE0 +ENDCHAR +STARTCHAR U_819A +ENCODING 33178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +5240 +5FC0 +5240 +5FC0 +5080 +5F80 +9080 +9180 +ENDCHAR +STARTCHAR U_819B +ENCODING 33179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7820 +57C0 +5440 +77C0 +5100 +57C0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_819C +ENCODING 33180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +77C0 +5440 +57C0 +7440 +5FE0 +5100 +9280 +BC60 +ENDCHAR +STARTCHAR U_819D +ENCODING 33181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +7920 +5380 +5540 +7D60 +5380 +5540 +9920 +B300 +ENDCHAR +STARTCHAR U_819E +ENCODING 33182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +77C0 +5540 +57C0 +7520 +5FE0 +5480 +9280 +B100 +ENDCHAR +STARTCHAR U_819F +ENCODING 33183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5920 +7740 +5140 +56A0 +7BC0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81A0 +ENCODING 33184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5AA0 +5660 +7AA0 +5100 +56C0 +7AA0 +5500 +5240 +9480 +B300 +ENDCHAR +STARTCHAR U_81A1 +ENCODING 33185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +57C0 +5100 +7FE0 +5280 +7440 +5FE0 +5440 +57C0 +5440 +B7C0 +ENDCHAR +STARTCHAR U_81A2 +ENCODING 33186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5D60 +77C0 +5540 +57C0 +7540 +5FE0 +5240 +9180 +BE60 +ENDCHAR +STARTCHAR U_81A3 +ENCODING 33187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +7440 +5FE0 +5440 +7FE0 +5100 +57C0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_81A4 +ENCODING 33188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5FE0 +7920 +5540 +7100 +57C0 +5040 +57C0 +9040 +B7C0 +ENDCHAR +STARTCHAR U_81A5 +ENCODING 33189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +FFE0 +2480 +FFA0 +7540 +AAA0 +7FC0 +4A40 +5540 +4A40 +51C0 +ENDCHAR +STARTCHAR U_81A6 +ENCODING 33190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7540 +5920 +5440 +77E0 +5D40 +53E0 +9440 +B840 +ENDCHAR +STARTCHAR U_81A7 +ENCODING 33191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5540 +77C0 +5540 +5FE0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_81A8 +ENCODING 33192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7220 +5FA0 +5240 +7780 +5020 +5740 +7580 +5700 +5520 +9240 +BF80 +ENDCHAR +STARTCHAR U_81A9 +ENCODING 33193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70A0 +5FE0 +5080 +7F80 +5480 +5780 +7480 +57A0 +55A0 +9760 +BDA0 +ENDCHAR +STARTCHAR U_81AA +ENCODING 33194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7FE0 +5920 +57C0 +7540 +5540 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_81AB +ENCODING 33195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +77C0 +5C60 +57C0 +7440 +57C0 +5580 +9940 +B320 +ENDCHAR +STARTCHAR U_81AC +ENCODING 33196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +57C0 +7100 +57C0 +5120 +7FE0 +5480 +5FE0 +94A0 +B360 +ENDCHAR +STARTCHAR U_81AD +ENCODING 33197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +7FE0 +5440 +77C0 +5440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81AE +ENCODING 33198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5100 +7FE0 +5440 +5EE0 +7440 +5FE0 +5280 +94A0 +B860 +ENDCHAR +STARTCHAR U_81AF +ENCODING 33199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7740 +52A0 +56C0 +7440 +5BA0 +5000 +77C0 +5440 +57C0 +5280 +B7E0 +ENDCHAR +STARTCHAR U_81B0 +ENCODING 33200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F20 +5540 +7FE0 +5540 +5920 +77C0 +5540 +57C0 +9540 +B7C0 +ENDCHAR +STARTCHAR U_81B1 +ENCODING 33201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFC0 +AAA0 +FFE0 +A080 +AEA0 +EAC0 +AE80 +AAA0 +AF60 +A220 +ENDCHAR +STARTCHAR U_81B2 +ENCODING 33202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5480 +7FE0 +5480 +57E0 +5480 +77E0 +5540 +9AA0 +B2A0 +ENDCHAR +STARTCHAR U_81B3 +ENCODING 33203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5100 +77C0 +5100 +5FE0 +7280 +5FE0 +5440 +97C0 +B440 +ENDCHAR +STARTCHAR U_81B4 +ENCODING 33204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +5FE0 +5540 +7540 +5FE0 +5540 +7540 +5FE0 +5000 +9540 +BAA0 +ENDCHAR +STARTCHAR U_81B5 +ENCODING 33205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7FE0 +5240 +5480 +7B40 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81B6 +ENCODING 33206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +ABA0 +E920 +ABA0 +A920 +ABA0 +A860 +ENDCHAR +STARTCHAR U_81B7 +ENCODING 33207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +ABA0 +B2A0 +FFC0 +AAC0 +ABA0 +FEA0 +A6A0 +AAC0 +AB80 +A880 +ENDCHAR +STARTCHAR U_81B8 +ENCODING 33208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +A100 +E3E0 +BC80 +ABE0 +E940 +A9C0 +A940 +AD40 +B3E0 +ENDCHAR +STARTCHAR U_81B9 +ENCODING 33209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +7FE0 +5440 +57C0 +7440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81BA +ENCODING 33210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5480 +77E0 +5C80 +57E0 +5480 +5FE0 +5040 +DFC0 +90C0 +ENDCHAR +STARTCHAR U_81BB +ENCODING 33211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AB40 +E840 +AFC0 +A000 +E7C0 +A440 +A7C0 +A440 +AFE0 +ENDCHAR +STARTCHAR U_81BC +ENCODING 33212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +AA40 +AB40 +E7E0 +BC20 +AFA0 +EEA0 +AFA0 +AC20 +AC60 +B3E0 +ENDCHAR +STARTCHAR U_81BD +ENCODING 33213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +AFE0 +BA40 +ECA0 +ABE0 +A800 +EBC0 +A800 +ABE0 +AA20 +B3E0 +ENDCHAR +STARTCHAR U_81BE +ENCODING 33214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5480 +5FC0 +7020 +5FE0 +5AA0 +7FE0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_81BF +ENCODING 33215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +E800 +AFE0 +AAA0 +AA40 +B320 +ENDCHAR +STARTCHAR U_81C0 +ENCODING 33216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FE20 +A9C0 +FC80 +AB60 +7F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_81C1 +ENCODING 33217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA80 +EFE0 +AAA0 +AFE0 +EAA0 +AFE0 +AA80 +B6C0 +AAA0 +ENDCHAR +STARTCHAR U_81C2 +ENCODING 33218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +4BE0 +4880 +BF80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_81C3 +ENCODING 33219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +54C0 +7B40 +5DE0 +5740 +79E0 +5F40 +53E0 +9540 +B9E0 +ENDCHAR +STARTCHAR U_81C4 +ENCODING 33220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +5100 +57E0 +7520 +57C0 +5520 +77E0 +5540 +5680 +99C0 +B6A0 +ENDCHAR +STARTCHAR U_81C5 +ENCODING 33221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E400 +A7E0 +BA20 +EFA0 +AAA0 +AFA0 +A2A0 +AF40 +ENDCHAR +STARTCHAR U_81C6 +ENCODING 33222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7FE0 +5440 +57C0 +7440 +57C0 +5340 +96A0 +BBA0 +ENDCHAR +STARTCHAR U_81C7 +ENCODING 33223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +AFE0 +A900 +FFE0 +A900 +AFE0 +E900 +AEE0 +AAA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_81C8 +ENCODING 33224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5240 +57C0 +7640 +5540 +57E0 +7920 +56A0 +97A0 +B060 +ENDCHAR +STARTCHAR U_81C9 +ENCODING 33225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5480 +5840 +77A0 +5000 +5EE0 +7AA0 +5EE0 +5440 +9AC0 +B120 +ENDCHAR +STARTCHAR U_81CA +ENCODING 33226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AEE0 +AAA0 +EEE0 +A100 +AFE0 +A540 +B920 +ENDCHAR +STARTCHAR U_81CB +ENCODING 33227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4540 +7E20 +51C0 +7C80 +A960 +7FC0 +4A40 +5540 +4A40 +5140 +ENDCHAR +STARTCHAR U_81CC +ENCODING 33228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +BF40 +A4E0 +FF40 +A0E0 +AEA0 +EAA0 +AEA0 +AA40 +A4A0 +BF20 +ENDCHAR +STARTCHAR U_81CD +ENCODING 33229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AAA0 +ED40 +B560 +A540 +EFC0 +A840 +AFC0 +A840 +B040 +ENDCHAR +STARTCHAR U_81CE +ENCODING 33230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5AA0 +5660 +7AA0 +5FE0 +5440 +7AA0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81CF +ENCODING 33231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +77C0 +5540 +5FC0 +7440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81D0 +ENCODING 33232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +76A0 +5520 +57E0 +7100 +5FC0 +5100 +9FE0 +BAA0 +ENDCHAR +STARTCHAR U_81D1 +ENCODING 33233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +E920 +A7C0 +A920 +EFE0 +A100 +AFE0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_81D2 +ENCODING 33234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5480 +7FE0 +5480 +57E0 +7480 +57E0 +5240 +9180 +B660 +ENDCHAR +STARTCHAR U_81D3 +ENCODING 33235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +77E0 +50A0 +57E0 +7540 +57A0 +54C0 +77A0 +5540 +97E0 +A920 +ENDCHAR +STARTCHAR U_81D4 +ENCODING 33236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +54A0 +5740 +75A0 +57E0 +5440 +77C0 +5440 +57C0 +5440 +B820 +ENDCHAR +STARTCHAR U_81D5 +ENCODING 33237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AAA0 +EFE0 +AA40 +ABE0 +EA40 +AB60 +A800 +AD40 +B2A0 +ENDCHAR +STARTCHAR U_81D6 +ENCODING 33238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4A40 +6EC0 +4A40 +6EC0 +FFE0 +2080 +7FC0 +A0A0 +3F80 +2080 +ENDCHAR +STARTCHAR U_81D7 +ENCODING 33239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +7FE0 +5280 +57C0 +7540 +5540 +57C0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_81D8 +ENCODING 33240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5A80 +5540 +7FE0 +5AA0 +5FE0 +77C0 +5540 +57C0 +9540 +B7A0 +ENDCHAR +STARTCHAR U_81D9 +ENCODING 33241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7380 +5440 +5F60 +7540 +5540 +5F60 +9540 +BAA0 +ENDCHAR +STARTCHAR U_81DA +ENCODING 33242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E3C0 +A200 +AFE0 +EA20 +AFE0 +A940 +EFC0 +A940 +B7E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_81DB +ENCODING 33243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +AFE0 +E920 +A540 +A920 +EFE0 +B900 +AFE0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_81DC +ENCODING 33244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5540 +7FE0 +5AA0 +77C0 +5440 +5540 +5540 +D280 +AC60 +ENDCHAR +STARTCHAR U_81DD +ENCODING 33245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7F80 +2080 +FFC0 +A540 +FF40 +A5C0 +FF40 +AD40 +B660 +ENDCHAR +STARTCHAR U_81DE +ENCODING 33246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +A500 +EFE0 +A900 +BFE0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_81DF +ENCODING 33247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFE0 +A4A0 +FFE0 +BA80 +AFA0 +F960 +BF40 +AA40 +AFA0 +B120 +ENDCHAR +STARTCHAR U_81E0 +ENCODING 33248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4040 +AEA0 +C0E0 +5E40 +AAA0 +7FC0 +4A40 +5540 +4AC0 +ENDCHAR +STARTCHAR U_81E1 +ENCODING 33249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FBE0 +5680 +FBE0 +AA80 +FBE0 +5480 +FFE0 +4A40 +5540 +4AC0 +ENDCHAR +STARTCHAR U_81E2 +ENCODING 33250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D540 +BFE0 +A540 +FFE0 +AAA0 +B7E0 +E440 +A7C0 +A440 +A7C0 +A820 +ENDCHAR +STARTCHAR U_81E3 +ENCODING 33251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 -1 +BITMAP +FF00 +8800 +8800 +FF00 +8100 +8100 +FF00 +8800 +8800 +FF80 +ENDCHAR +STARTCHAR U_81E4 +ENCODING 33252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +9240 +9240 +FA40 +8940 +F980 +9080 +9180 +FE40 +0420 +ENDCHAR +STARTCHAR U_81E5 +ENCODING 33253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +9080 +FC80 +8480 +8480 +FC80 +9140 +9140 +FA20 +0420 +ENDCHAR +STARTCHAR U_81E6 +ENCODING 33254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +2A80 +FBE0 +8A20 +8A20 +FBE0 +AAA0 +2A80 +2A80 +FBE0 +ENDCHAR +STARTCHAR U_81E7 +ENCODING 33255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +5FE0 +5080 +5F80 +74A0 +1EA0 +F2C0 +5E80 +54A0 +9F60 +2220 +ENDCHAR +STARTCHAR U_81E8 +ENCODING 33256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +A7E0 +A800 +F3C0 +9240 +93C0 +F000 +AEE0 +AAA0 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_81E9 +ENCODING 33257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +FBE0 +8A20 +FBE0 +2A80 +FFE0 +1100 +2980 +C960 +3100 +ENDCHAR +STARTCHAR U_81EA +ENCODING 33258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +FE +82 +82 +FE +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_81EB +ENCODING 33259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4400 +4400 +F400 +9400 +F400 +9400 +F400 +9400 +9400 +F440 +93C0 +ENDCHAR +STARTCHAR U_81EC +ENCODING 33260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_81ED +ENCODING 33261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0480 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_81EE +ENCODING 33262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +01C0 +7E00 +2480 +5540 +8E20 +ENDCHAR +STARTCHAR U_81EF +ENCODING 33263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +2480 +1500 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_81F0 +ENCODING 33264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +FFE0 +2200 +3A40 +EB80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_81F1 +ENCODING 33265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2880 +2480 +FFE0 +A4A0 +5F40 +0800 +0F80 +1080 +6380 +ENDCHAR +STARTCHAR U_81F2 +ENCODING 33266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +9480 +FFE0 +9400 +F5C0 +2540 +FD40 +25C0 +7520 +A9E0 +ENDCHAR +STARTCHAR U_81F3 +ENCODING 33267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +1100 +2080 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_81F4 +ENCODING 33268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2100 +29E0 +4A40 +7540 +1140 +7D40 +1140 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_81F5 +ENCODING 33269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2240 +4D80 +F980 +2240 +77E0 +2240 +3A40 +E3C0 +4240 +ENDCHAR +STARTCHAR U_81F6 +ENCODING 33270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2400 +57E0 +FC40 +2480 +FFE0 +2480 +2480 +3C80 +C580 +ENDCHAR +STARTCHAR U_81F7 +ENCODING 33271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +0100 +FD40 +2940 +7D40 +10A0 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_81F8 +ENCODING 33272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +4900 +F640 +23A0 +2080 +F880 +23E0 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_81F9 +ENCODING 33273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +40A0 +AFE0 +F880 +48A0 +4EA0 +FAC0 +4A80 +4EA0 +F960 +1220 +ENDCHAR +STARTCHAR U_81FA +ENCODING 33274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +1080 +FFE0 +8920 +1480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_81FB +ENCODING 33275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +57C0 +F100 +2FE0 +F540 +2FE0 +2380 +3540 +C920 +ENDCHAR +STARTCHAR U_81FC +ENCODING 33276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E3C0 +8040 +8040 +8040 +FBC0 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_81FD +ENCODING 33277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +3FC0 +4080 +8100 +0800 +71C0 +4040 +79C0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_81FE +ENCODING 33278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +4440 +7FC0 +4440 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_81FF +ENCODING 33279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +1400 +65C0 +4440 +75C0 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8200 +ENCODING 33280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +00C0 +FF00 +4840 +2480 +2500 +73C0 +4040 +7BC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8201 +ENCODING 33281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +4040 +7BC0 +4040 +7FC0 +4040 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_8202 +ENCODING 33282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0800 +FFE0 +2080 +5BC0 +A0A0 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8203 +ENCODING 33283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +73C0 +4040 +7DC0 +4040 +7FC0 +2000 +3FE0 +0020 +6AA0 +9560 +ENDCHAR +STARTCHAR U_8204 +ENCODING 33284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4040 +79C0 +4040 +7FC0 +1000 +3FE0 +C020 +2AA0 +4AA0 +0040 +ENDCHAR +STARTCHAR U_8205 +ENCODING 33285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F380 +8080 +FF80 +4900 +7F00 +4900 +FFC0 +1040 +E180 +ENDCHAR +STARTCHAR U_8206 +ENCODING 33286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6EC0 +4840 +74C0 +5E40 +4440 +6EC0 +4440 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8207 +ENCODING 33287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +6EC0 +4840 +7FC0 +4240 +4A40 +7BC0 +4A40 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_8208 +ENCODING 33288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +71C0 +5F40 +71C0 +5D40 +75C0 +5D40 +5140 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8209 +ENCODING 33289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +62C0 +4A40 +FFE0 +2480 +7FC0 +8420 +7FC0 +0400 +ENDCHAR +STARTCHAR U_820A +ENCODING 33290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0A80 +3FE0 +6200 +BFC0 +2200 +3FE0 +2040 +3DC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_820B +ENCODING 33291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5140 +5F40 +7FC0 +5540 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_820C +ENCODING 33292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C00 +0400 +FFC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_820D +ENCODING 33293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +3F80 +C460 +3F80 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_820E +ENCODING 33294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +64C0 +9F20 +0400 +7FE0 +0000 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_820F +ENCODING 33295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7D20 +1120 +FD20 +1120 +7D60 +45A0 +4520 +4420 +7C20 +4420 +ENDCHAR +STARTCHAR U_8210 +ENCODING 33296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +F3C0 +2280 +FA80 +23E0 +2280 +7A80 +4AA0 +4AA0 +7B60 +4A20 +ENDCHAR +STARTCHAR U_8211 +ENCODING 33297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +4540 +47C0 +F540 +4540 +FFE0 +9440 +9440 +F440 +94C0 +ENDCHAR +STARTCHAR U_8212 +ENCODING 33298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2840 +4580 +B880 +13E0 +FCA0 +10C0 +7C80 +4480 +4480 +7D80 +ENDCHAR +STARTCHAR U_8213 +ENCODING 33299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +6240 +23C0 +FA40 +23C0 +7A00 +4BE0 +4D60 +4AA0 +7920 +4A40 +ENDCHAR +STARTCHAR U_8214 +ENCODING 33300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2FE0 +2280 +F540 +2920 +F540 +95A0 +9560 +F900 +9300 +ENDCHAR +STARTCHAR U_8215 +ENCODING 33301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1520 +E540 +4900 +4180 +FA40 +4520 +F140 +9580 +9A80 +F440 +9820 +ENDCHAR +STARTCHAR U_8216 +ENCODING 33302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +F900 +27E0 +FD20 +27E0 +F520 +97E0 +F520 +9560 +ENDCHAR +STARTCHAR U_8217 +ENCODING 33303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +50A0 +ABE0 +F880 +23E0 +FAA0 +03E0 +FAA0 +8BE0 +FAA0 +8A60 +ENDCHAR +STARTCHAR U_8218 +ENCODING 33304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +FBC0 +2240 +FBC0 +2200 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_8219 +ENCODING 33305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +2080 +3F80 +0000 +FBE0 +2080 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_821A +ENCODING 33306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +C480 +47E0 +F540 +47E0 +F400 +97E0 +9400 +95E0 +F520 +99E0 +ENDCHAR +STARTCHAR U_821B +ENCODING 33307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +3BE0 +4880 +4A80 +BA80 +0FE0 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_821C +ENCODING 33308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E40 +2480 +FFE0 +A0A0 +3BE0 +4A80 +AA80 +17E0 +2080 +C080 +ENDCHAR +STARTCHAR U_821D +ENCODING 33309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +1080 +FFE0 +4900 +FFE0 +9120 +7FC0 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_821E +ENCODING 33310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +AA80 +FFE0 +2A80 +FFE0 +2080 +3BE0 +CA80 +37E0 +C080 +ENDCHAR +STARTCHAR U_821F +ENCODING 33311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1480 +1280 +FFE0 +1480 +1280 +2280 +4080 +8380 +ENDCHAR +STARTCHAR U_8220 +ENCODING 33312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +4920 +6920 +5920 +4920 +F920 +6920 +5920 +4AA0 +9C40 +ENDCHAR +STARTCHAR U_8221 +ENCODING 33313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4880 +6880 +5880 +4880 +F880 +6880 +5880 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8222 +ENCODING 33314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4880 +6AA0 +5AA0 +4AA0 +FAA0 +6AA0 +5AA0 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8223 +ENCODING 33315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7540 +5540 +7440 +5440 +F280 +5280 +7100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_8224 +ENCODING 33316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7780 +5480 +7480 +5680 +F580 +5480 +7480 +54A0 +54A0 +B860 +ENDCHAR +STARTCHAR U_8225 +ENCODING 33317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4AA0 +6AA0 +5AA0 +4BE0 +FA20 +6A00 +5A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8226 +ENCODING 33318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5100 +7FE0 +5100 +F100 +5280 +7280 +5240 +5540 +B820 +ENDCHAR +STARTCHAR U_8227 +ENCODING 33319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7780 +5480 +7480 +5480 +F680 +5580 +7480 +54A0 +54A0 +B860 +ENDCHAR +STARTCHAR U_8228 +ENCODING 33320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7BC0 +4A00 +6BE0 +5AA0 +4AA0 +FAA0 +6AA0 +5A40 +4CA0 +9920 +ENDCHAR +STARTCHAR U_8229 +ENCODING 33321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7280 +5280 +7280 +5440 +F540 +5920 +7200 +5440 +5FE0 +B440 +ENDCHAR +STARTCHAR U_822A +ENCODING 33322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6800 +5B80 +FA80 +4A80 +6A80 +5AA0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_822B +ENCODING 33323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6900 +59E0 +F920 +4920 +6920 +5A20 +4AA0 +9C40 +ENDCHAR +STARTCHAR U_822C +ENCODING 33324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7A40 +4A40 +6A60 +5C00 +FBE0 +4A20 +6940 +5880 +4940 +9A20 +ENDCHAR +STARTCHAR U_822D +ENCODING 33325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4A80 +6AA0 +5BC0 +4A80 +FA80 +6A80 +5AA0 +4BA0 +9AE0 +ENDCHAR +STARTCHAR U_822E +ENCODING 33326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4BE0 +7A20 +4A20 +FBE0 +4A20 +7A00 +4A00 +6C00 +9400 +ENDCHAR +STARTCHAR U_822F +ENCODING 33327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4BE0 +6AA0 +5AA0 +4AA0 +FBE0 +6AA0 +5880 +4880 +9880 +ENDCHAR +STARTCHAR U_8230 +ENCODING 33328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +5440 +7540 +5540 +F540 +5540 +7540 +52A0 +52A0 +BC60 +ENDCHAR +STARTCHAR U_8231 +ENCODING 33329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +4A20 +6C00 +5BC0 +4A40 +FA40 +6AC0 +5A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8232 +ENCODING 33330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5280 +7640 +5920 +F100 +5FE0 +7040 +5280 +5100 +B080 +ENDCHAR +STARTCHAR U_8233 +ENCODING 33331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4BE0 +6AA0 +5AA0 +4BE0 +FAA0 +6AA0 +5AA0 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8234 +ENCODING 33332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4BE0 +6D00 +5900 +49E0 +F900 +69E0 +5900 +4900 +9900 +ENDCHAR +STARTCHAR U_8235 +ENCODING 33333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6C20 +5920 +4940 +F980 +6900 +5920 +4920 +98E0 +ENDCHAR +STARTCHAR U_8236 +ENCODING 33334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7900 +4BE0 +6A20 +5A20 +4BE0 +FA20 +6A20 +5A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8237 +ENCODING 33335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6900 +5A40 +FFC0 +4880 +6900 +5A40 +4FE0 +9820 +ENDCHAR +STARTCHAR U_8238 +ENCODING 33336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +7040 +5040 +7740 +5540 +F540 +5740 +7540 +5040 +5040 +B0C0 +ENDCHAR +STARTCHAR U_8239 +ENCODING 33337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4A40 +6A40 +5A60 +4C00 +FBE0 +6A20 +5A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_823A +ENCODING 33338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7AA0 +4AA0 +6BE0 +5AA0 +4AA0 +FBE0 +6AA0 +5880 +4880 +9880 +ENDCHAR +STARTCHAR U_823B +ENCODING 33339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78E0 +4880 +6BE0 +5A20 +4A20 +FBE0 +6A20 +5A00 +4C00 +9800 +ENDCHAR +STARTCHAR U_823C +ENCODING 33340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7A40 +4A40 +6FE0 +5A40 +4A40 +FFE0 +6800 +5A40 +4C20 +9820 +ENDCHAR +STARTCHAR U_823D +ENCODING 33341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BC0 +4E40 +6980 +5A40 +4CA0 +FFE0 +6C80 +5FE0 +4880 +9880 +ENDCHAR +STARTCHAR U_823E +ENCODING 33342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7140 +5140 +77E0 +5560 +F560 +5560 +7660 +5420 +57E0 +B420 +ENDCHAR +STARTCHAR U_823F +ENCODING 33343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4A80 +6C40 +5BA0 +4800 +FFE0 +6900 +5BE0 +4820 +99C0 +ENDCHAR +STARTCHAR U_8240 +ENCODING 33344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7F80 +4AA0 +6940 +5BE0 +4840 +F880 +6FE0 +5880 +4880 +9980 +ENDCHAR +STARTCHAR U_8241 +ENCODING 33345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4BE0 +7A80 +4C80 +FFE0 +4800 +7BE0 +4A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8242 +ENCODING 33346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A40 +4D80 +6A40 +5CA0 +4BE0 +F880 +6BE0 +5880 +4FE0 +9880 +ENDCHAR +STARTCHAR U_8243 +ENCODING 33347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7AA0 +4AA0 +7BE0 +4AA0 +FBE0 +6880 +5BE0 +4880 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8244 +ENCODING 33348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +49C0 +6BE0 +5A20 +4BE0 +FA20 +6BE0 +5A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_8245 +ENCODING 33349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +4A20 +6DC0 +5880 +4FE0 +F880 +6AC0 +5AA0 +4CA0 +9980 +ENDCHAR +STARTCHAR U_8246 +ENCODING 33350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +FBC0 +4A20 +6B40 +5A80 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8247 +ENCODING 33351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7EE0 +5240 +7440 +5E40 +F2E0 +5A40 +7640 +52E0 +5500 +B8E0 +ENDCHAR +STARTCHAR U_8248 +ENCODING 33352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5200 +7440 +5FE0 +F000 +5540 +7540 +5540 +5540 +B960 +ENDCHAR +STARTCHAR U_8249 +ENCODING 33353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7420 +57E0 +7400 +57E0 +F480 +57E0 +7480 +57E0 +54A0 +B8E0 +ENDCHAR +STARTCHAR U_824A +ENCODING 33354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7BE0 +4A20 +FBE0 +4880 +6BE0 +5AA0 +4AE0 +9880 +ENDCHAR +STARTCHAR U_824B +ENCODING 33355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7840 +4880 +6FE0 +5880 +4980 +F800 +6FE0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_824C +ENCODING 33356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7280 +5640 +7920 +57C0 +F080 +5100 +7640 +5D20 +9440 +B3C0 +ENDCHAR +STARTCHAR U_824D +ENCODING 33357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5420 +77E0 +5480 +F7E0 +5480 +75E0 +5520 +7520 +9DE0 +ENDCHAR +STARTCHAR U_824E +ENCODING 33358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +4A20 +6BE0 +5A20 +4FE0 +F880 +6880 +5BE0 +4880 +9FE0 +ENDCHAR +STARTCHAR U_824F +ENCODING 33359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +7940 +4BE0 +6880 +5BE0 +4A20 +FBE0 +6A20 +5BE0 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8250 +ENCODING 33360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7D20 +4EA0 +6FE0 +5A40 +4A20 +FD20 +6BC0 +5E40 +4980 +9E60 +ENDCHAR +STARTCHAR U_8251 +ENCODING 33361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +4A20 +6BE0 +5A00 +4BE0 +FAA0 +6BE0 +5EA0 +4AA0 +9A60 +ENDCHAR +STARTCHAR U_8252 +ENCODING 33362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7C20 +4FE0 +6C20 +5FE0 +4A40 +FBC0 +6A40 +5BC0 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_8253 +ENCODING 33363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5540 +75C0 +5400 +F7E0 +5100 +7FE0 +5380 +9540 +B920 +ENDCHAR +STARTCHAR U_8254 +ENCODING 33364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +77E0 +5540 +77E0 +5540 +F5C0 +5400 +77E0 +5540 +5480 +BB60 +ENDCHAR +STARTCHAR U_8255 +ENCODING 33365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4A80 +6FE0 +5D20 +4880 +FFE0 +6A00 +5BE0 +4A20 +9CC0 +ENDCHAR +STARTCHAR U_8256 +ENCODING 33366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7FE0 +4880 +6BE0 +5880 +4FE0 +FA00 +6BE0 +5C80 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8257 +ENCODING 33367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +9000 +D7E0 +B240 +9420 +FFC0 +D540 +B540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_8258 +ENCODING 33368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +74E0 +54A0 +76E0 +54A0 +F7E0 +5080 +77E0 +5240 +5180 +B660 +ENDCHAR +STARTCHAR U_8259 +ENCODING 33369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7540 +5FE0 +7440 +57C0 +F440 +57C0 +7400 +57C0 +5A40 +B3C0 +ENDCHAR +STARTCHAR U_825A +ENCODING 33370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5280 +7FE0 +5AA0 +FFE0 +5440 +77C0 +5440 +57C0 +B440 +ENDCHAR +STARTCHAR U_825B +ENCODING 33371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5540 +7FE0 +5540 +F7C0 +5540 +7FE0 +5480 +5380 +BC60 +ENDCHAR +STARTCHAR U_825C +ENCODING 33372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5540 +7DE0 +5000 +FFE0 +5920 +77C0 +5540 +55C0 +B100 +ENDCHAR +STARTCHAR U_825D +ENCODING 33373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7100 +5FE0 +7560 +5540 +F000 +57C0 +7040 +57C0 +5040 +B7C0 +ENDCHAR +STARTCHAR U_825E +ENCODING 33374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5A40 +7280 +5AA0 +F6C0 +5280 +76C0 +5AA0 +52A0 +B4E0 +ENDCHAR +STARTCHAR U_825F +ENCODING 33375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +7FE0 +5540 +F540 +57C0 +7540 +5FE0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_8260 +ENCODING 33376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +7AA0 +5640 +77E0 +5800 +F7C0 +5440 +77C0 +5440 +5280 +BFE0 +ENDCHAR +STARTCHAR U_8261 +ENCODING 33377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +7540 +5FE0 +7820 +53C0 +F240 +57E0 +7520 +57E0 +5520 +B7E0 +ENDCHAR +STARTCHAR U_8262 +ENCODING 33378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5540 +7FE0 +5000 +F7E0 +5420 +75A0 +55A0 +9420 +B7E0 +ENDCHAR +STARTCHAR U_8263 +ENCODING 33379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7100 +57E0 +7520 +57C0 +F520 +57E0 +7540 +57E0 +5A20 +B4E0 +ENDCHAR +STARTCHAR U_8264 +ENCODING 33380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5100 +77C0 +5100 +FFE0 +54A0 +7FE0 +54C0 +5EA0 +B560 +ENDCHAR +STARTCHAR U_8265 +ENCODING 33381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +7560 +5740 +7040 +5FE0 +F540 +5740 +7560 +5540 +9FC0 +B120 +ENDCHAR +STARTCHAR U_8266 +ENCODING 33382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +7A40 +4F60 +6980 +5F40 +4A20 +FF00 +6800 +5FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_8267 +ENCODING 33383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7FE0 +5240 +77E0 +5C80 +F7E0 +5480 +7FE0 +5240 +9180 +B660 +ENDCHAR +STARTCHAR U_8268 +ENCODING 33384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5280 +7FE0 +5820 +F7C0 +5000 +7FE0 +5540 +9BC0 +B520 +ENDCHAR +STARTCHAR U_8269 +ENCODING 33385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5AA0 +7540 +5D60 +F540 +57C0 +5440 +77C0 +9440 +B840 +ENDCHAR +STARTCHAR U_826A +ENCODING 33386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7500 +5FC0 +7540 +57C0 +F540 +57C0 +7AA0 +57C0 +9540 +B7C0 +ENDCHAR +STARTCHAR U_826B +ENCODING 33387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7100 +57E0 +7520 +57E0 +F4A0 +57E0 +74A0 +57E0 +5AA0 +B7E0 +ENDCHAR +STARTCHAR U_826C +ENCODING 33388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7880 +57C0 +7440 +57C0 +F4A0 +5FE0 +7540 +57C0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_826D +ENCODING 33389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +9540 +DFE0 +B540 +FFE0 +9000 +D7E0 +B240 +9180 +9660 +ENDCHAR +STARTCHAR U_826E +ENCODING 33390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FE00 +8200 +FE00 +8200 +FE00 +9080 +9100 +8A00 +9400 +A380 +C100 +ENDCHAR +STARTCHAR U_826F +ENCODING 33391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +1000 +FE00 +8200 +FE00 +8200 +FE00 +9100 +8A00 +8400 +A200 +C180 +ENDCHAR +STARTCHAR U_8270 +ENCODING 33392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +17C0 +9440 +57C0 +2520 +1540 +3480 +4C80 +8540 +0620 +ENDCHAR +STARTCHAR U_8271 +ENCODING 33393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +2220 +FBE0 +AA80 +FEA0 +22A0 +FE40 +5340 +8A20 +ENDCHAR +STARTCHAR U_8272 +ENCODING 33394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +2200 +7FC0 +A440 +2440 +3FC0 +2000 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_8273 +ENCODING 33395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27E0 +FD20 +2520 +FFE0 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_8274 +ENCODING 33396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +51C0 +FE40 +57E0 +FEA0 +D2A0 +FFE0 +5600 +5E20 +5220 +91E0 +ENDCHAR +STARTCHAR U_8275 +ENCODING 33397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +51C0 +FA40 +57E0 +52A0 +FAA0 +53E0 +5200 +5220 +5220 +91E0 +ENDCHAR +STARTCHAR U_8276 +ENCODING 33398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +AA40 +FFE0 +02A0 +FEA0 +03E0 +7A00 +4A20 +3220 +FDE0 +ENDCHAR +STARTCHAR U_8277 +ENCODING 33399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +AA40 +FFE0 +AAA0 +FEA0 +4BE0 +7A00 +4A20 +3220 +FDE0 +ENDCHAR +STARTCHAR U_8278 +ENCODING 33400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +FBE0 +AAA0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_8279 +ENCODING 33401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +1100 +1100 +FFE0 +1100 +1100 +ENDCHAR +STARTCHAR U_827A +ENCODING 33402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0900 +3F80 +0100 +0600 +1800 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_827B +ENCODING 33403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0440 +0440 +0840 +1040 +2140 +4080 +ENDCHAR +STARTCHAR U_827C +ENCODING 33404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_827D +ENCODING 33405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +7F00 +0900 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_827E +ENCODING 33406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +2200 +2200 +1400 +1400 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_827F +ENCODING 33407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FE00 +1200 +1380 +1080 +2080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_8280 +ENCODING 33408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +FF80 +1080 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_8281 +ENCODING 33409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +1E00 +1200 +1200 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_8282 +ENCODING 33410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7F80 +0880 +0880 +0880 +0B80 +0800 +0800 +ENDCHAR +STARTCHAR U_8283 +ENCODING 33411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0000 +1F00 +1100 +1900 +1500 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_8284 +ENCODING 33412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0800 +FF00 +0900 +3900 +0900 +1540 +2140 +C0C0 +ENDCHAR +STARTCHAR U_8285 +ENCODING 33413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0900 +0880 +0FC0 +F800 +0800 +0440 +0240 +01C0 +ENDCHAR +STARTCHAR U_8286 +ENCODING 33414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7F80 +2480 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8287 +ENCODING 33415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +2480 +2480 +2480 +2580 +0400 +0400 +ENDCHAR +STARTCHAR U_8288 +ENCODING 33416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1500 +F5E0 +1500 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8289 +ENCODING 33417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_828A +ENCODING 33418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0400 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_828B +ENCODING 33419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +7F80 +0400 +FFC0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_828C +ENCODING 33420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0000 +FFE0 +1000 +3F80 +0080 +0080 +0300 +ENDCHAR +STARTCHAR U_828D +ENCODING 33421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2000 +3FC0 +4040 +8840 +0440 +0440 +0040 +0180 +ENDCHAR +STARTCHAR U_828E +ENCODING 33422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +1F80 +2000 +3FC0 +0040 +0240 +0180 +ENDCHAR +STARTCHAR U_828F +ENCODING 33423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +0400 +0400 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8290 +ENCODING 33424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +0400 +0600 +0580 +0480 +0400 +0400 +ENDCHAR +STARTCHAR U_8291 +ENCODING 33425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0080 +0080 +3F80 +2000 +2020 +2020 +3FE0 +ENDCHAR +STARTCHAR U_8292 +ENCODING 33426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0200 +FFE0 +2000 +2000 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_8293 +ENCODING 33427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3F80 +0200 +0400 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_8294 +ENCODING 33428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +3F80 +0400 +2080 +AAA0 +AAA0 +FBE0 +2080 +C080 +ENDCHAR +STARTCHAR U_8295 +ENCODING 33429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +0FC0 +1080 +2900 +0600 +0400 +1800 +6000 +ENDCHAR +STARTCHAR U_8296 +ENCODING 33430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0400 +7FC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_8297 +ENCODING 33431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1100 +7E00 +0840 +1080 +7F00 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_8298 +ENCODING 33432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +4240 +7A80 +4300 +4200 +4220 +5220 +61E0 +ENDCHAR +STARTCHAR U_8299 +ENCODING 33433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +FFE0 +0400 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_829A +ENCODING 33434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +2480 +3F80 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_829B +ENCODING 33435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7F00 +1100 +FFC0 +1100 +7F00 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_829C +ENCODING 33436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +0400 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_829D +ENCODING 33437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0800 +0400 +FF00 +0200 +0C00 +1000 +6000 +9FC0 +ENDCHAR +STARTCHAR U_829E +ENCODING 33438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7FC0 +8000 +3F00 +0000 +7F00 +0140 +00C0 +0040 +ENDCHAR +STARTCHAR U_829F +ENCODING 33439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +3E00 +2200 +C1C0 +7F00 +1200 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_82A0 +ENCODING 33440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +0400 +FFE0 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_82A1 +ENCODING 33441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2000 +3F80 +4900 +8800 +1400 +2200 +41C0 +8080 +ENDCHAR +STARTCHAR U_82A2 +ENCODING 33442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +1000 +1000 +27C0 +6000 +A000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_82A3 +ENCODING 33443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +0800 +1800 +2A00 +4980 +8880 +0800 +0800 +ENDCHAR +STARTCHAR U_82A4 +ENCODING 33444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7D00 +0900 +1100 +1D00 +F100 +1120 +1120 +30E0 +ENDCHAR +STARTCHAR U_82A5 +ENCODING 33445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0600 +0900 +30E0 +C940 +0900 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_82A6 +ENCODING 33446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0D00 +0200 +3FC0 +2040 +3FC0 +2040 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_82A7 +ENCODING 33447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +0900 +0600 +FFE0 +0240 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_82A8 +ENCODING 33448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F00 +1100 +13C0 +1840 +1480 +2300 +4500 +98E0 +ENDCHAR +STARTCHAR U_82A9 +ENCODING 33449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0C00 +3300 +C8C0 +0400 +7F00 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_82AA +ENCODING 33450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +3C00 +2400 +3FC0 +2200 +2100 +28A0 +3060 +ENDCHAR +STARTCHAR U_82AB +ENCODING 33451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +0000 +FFE0 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_82AC +ENCODING 33452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +1100 +2080 +5FC0 +88A0 +0880 +3480 +C300 +ENDCHAR +STARTCHAR U_82AD +ENCODING 33453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7F80 +4480 +4480 +7F80 +4000 +4040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_82AE +ENCODING 33454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0400 +7FC0 +4440 +4A40 +4940 +5140 +4040 +41C0 +ENDCHAR +STARTCHAR U_82AF +ENCODING 33455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +0800 +1480 +5440 +5040 +5100 +9100 +0F00 +ENDCHAR +STARTCHAR U_82B0 +ENCODING 33456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0400 +3F80 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_82B1 +ENCODING 33457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1240 +2280 +6300 +A600 +3A20 +2220 +21E0 +ENDCHAR +STARTCHAR U_82B2 +ENCODING 33458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +1100 +2080 +D360 +1C00 +7080 +1080 +0F80 +ENDCHAR +STARTCHAR U_82B3 +ENCODING 33459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0400 +FFC0 +1000 +1F80 +1080 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_82B4 +ENCODING 33460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +3FC0 +4A40 +9240 +2440 +4840 +1240 +2180 +ENDCHAR +STARTCHAR U_82B5 +ENCODING 33461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82B6 +ENCODING 33462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3FC0 +4840 +9040 +2240 +3F40 +0040 +0180 +ENDCHAR +STARTCHAR U_82B7 +ENCODING 33463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0200 +0200 +1200 +13C0 +1200 +1200 +1200 +FFE0 +ENDCHAR +STARTCHAR U_82B8 +ENCODING 33464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +0000 +FFE0 +0800 +1080 +2040 +3FC0 +ENDCHAR +STARTCHAR U_82B9 +ENCODING 33465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2000 +3FE0 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_82BA +ENCODING 33466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0400 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_82BB +ENCODING 33467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5520 +9F20 +08C0 +3000 +3FE0 +D520 +1F20 +0820 +70C0 +ENDCHAR +STARTCHAR U_82BC +ENCODING 33468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0380 +3C00 +0400 +7FC0 +0400 +FFC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_82BD +ENCODING 33469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +2100 +7FE0 +0500 +0900 +3100 +C300 +ENDCHAR +STARTCHAR U_82BE +ENCODING 33470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2480 +FFE0 +0400 +7FC0 +4440 +4440 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_82BF +ENCODING 33471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1FC0 +2240 +6280 +A2E0 +2220 +2420 +24A0 +2840 +ENDCHAR +STARTCHAR U_82C0 +ENCODING 33472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0000 +1F00 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_82C1 +ENCODING 33473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +2100 +2100 +2100 +3100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_82C2 +ENCODING 33474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +2440 +2480 +4500 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_82C3 +ENCODING 33475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +FFE0 +0800 +1F00 +2900 +4600 +9980 +6060 +ENDCHAR +STARTCHAR U_82C4 +ENCODING 33476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +FFE0 +0400 +0700 +04C0 +0440 +0400 +0400 +ENDCHAR +STARTCHAR U_82C5 +ENCODING 33477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0040 +4840 +2940 +1140 +2940 +4540 +8440 +00C0 +ENDCHAR +STARTCHAR U_82C6 +ENCODING 33478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +27C0 +F940 +2140 +2140 +3240 +2440 +08C0 +ENDCHAR +STARTCHAR U_82C7 +ENCODING 33479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +0400 +FFE0 +0420 +04E0 +0400 +ENDCHAR +STARTCHAR U_82C8 +ENCODING 33480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +4400 +7FC0 +4440 +4440 +4440 +8840 +B180 +ENDCHAR +STARTCHAR U_82C9 +ENCODING 33481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +4A00 +4A00 +5240 +61C0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_82CA +ENCODING 33482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +4000 +4F80 +4880 +4880 +4B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_82CB +ENCODING 33483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2480 +2480 +2680 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_82CC +ENCODING 33484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1080 +1300 +1C00 +FFE0 +1200 +1100 +1480 +1860 +ENDCHAR +STARTCHAR U_82CD +ENCODING 33485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +C060 +1F00 +1100 +1240 +1040 +0FC0 +ENDCHAR +STARTCHAR U_82CE +ENCODING 33486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +8020 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_82CF +ENCODING 33487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +7F80 +0880 +48C0 +48A0 +90A0 +2080 +C300 +ENDCHAR +STARTCHAR U_82D0 +ENCODING 33488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0440 +7FC0 +4400 +7FC0 +1440 +2540 +C480 +ENDCHAR +STARTCHAR U_82D1 +ENCODING 33489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3FC0 +2640 +6A40 +9A80 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_82D2 +ENCODING 33490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2440 +3FC0 +2440 +FFE0 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_82D3 +ENCODING 33491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +1100 +2480 +C260 +3F80 +0100 +0A00 +0400 +ENDCHAR +STARTCHAR U_82D4 +ENCODING 33492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82D5 +ENCODING 33493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FF80 +1080 +2280 +C100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82D6 +ENCODING 33494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +4440 +7FC0 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_82D7 +ENCODING 33495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +4440 +7FC0 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_82D8 +ENCODING 33496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +5140 +4040 +41C0 +ENDCHAR +STARTCHAR U_82D9 +ENCODING 33497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +7FC0 +1080 +1080 +0900 +0900 +0200 +FFE0 +ENDCHAR +STARTCHAR U_82DA +ENCODING 33498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +4440 +84C0 +ENDCHAR +STARTCHAR U_82DB +ENCODING 33499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +2480 +0080 +0180 +ENDCHAR +STARTCHAR U_82DC +ENCODING 33500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82DD +ENCODING 33501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1200 +F260 +1380 +1200 +3200 +D220 +11E0 +ENDCHAR +STARTCHAR U_82DE +ENCODING 33502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +BE40 +2240 +3E40 +20A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_82DF +ENCODING 33503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +9E40 +1240 +1E40 +1240 +0040 +0180 +ENDCHAR +STARTCHAR U_82E0 +ENCODING 33504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4080 +7F80 +4200 +7FE0 +4200 +5920 +E0E0 +ENDCHAR +STARTCHAR U_82E1 +ENCODING 33505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +4900 +4500 +4500 +4100 +5100 +6280 +C440 +1840 +ENDCHAR +STARTCHAR U_82E2 +ENCODING 33506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2040 +3FC0 +2000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_82E3 +ENCODING 33507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +7F80 +4080 +7F80 +4000 +4000 +7FC0 +ENDCHAR +STARTCHAR U_82E4 +ENCODING 33508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +0D00 +14C0 +6440 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_82E5 +ENCODING 33509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1100 +FFC0 +1100 +0800 +FFC0 +1000 +3F80 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_82E6 +ENCODING 33510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82E7 +ENCODING 33511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +7FC0 +0200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_82E8 +ENCODING 33512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2040 +3FC0 +2840 +2980 +2E20 +4820 +87E0 +ENDCHAR +STARTCHAR U_82E9 +ENCODING 33513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_82EA +ENCODING 33514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4640 +4940 +50C0 +6040 +41C0 +ENDCHAR +STARTCHAR U_82EB +ENCODING 33515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1500 +07C0 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_82EC +ENCODING 33516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +4440 +4640 +4940 +50C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_82ED +ENCODING 33517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +47E0 +F120 +2120 +4920 +F620 +44A0 +0840 +ENDCHAR +STARTCHAR U_82EE +ENCODING 33518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +2200 +6A40 +AA40 +2A40 +2A40 +2FC0 +2000 +ENDCHAR +STARTCHAR U_82EF +ENCODING 33519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +1500 +2480 +5F40 +8420 +0400 +ENDCHAR +STARTCHAR U_82F0 +ENCODING 33520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7880 +0880 +7900 +4100 +7A00 +0A40 +4FA0 +3220 +ENDCHAR +STARTCHAR U_82F1 +ENCODING 33521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +2480 +2480 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82F2 +ENCODING 33522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +1FE0 +2400 +47C0 +0400 +07E0 +0400 +0400 +ENDCHAR +STARTCHAR U_82F3 +ENCODING 33523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F80 +1900 +6600 +1980 +E660 +0100 +0C00 +0200 +ENDCHAR +STARTCHAR U_82F4 +ENCODING 33524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_82F5 +ENCODING 33525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +3FC0 +4400 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82F6 +ENCODING 33526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3180 +C460 +0400 +2480 +4440 +0C00 +ENDCHAR +STARTCHAR U_82F7 +ENCODING 33527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82F8 +ENCODING 33528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +1500 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_82F9 +ENCODING 33529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +1480 +1500 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_82FA +ENCODING 33530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2880 +2480 +FFE0 +4480 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_82FB +ENCODING 33531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +2FE0 +6080 +A880 +2480 +2480 +2080 +2180 +ENDCHAR +STARTCHAR U_82FC +ENCODING 33532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1100 +2400 +2400 +3FC0 +4400 +9F80 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_82FD +ENCODING 33533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +3D00 +2500 +2480 +2480 +2540 +46A0 +8480 +ENDCHAR +STARTCHAR U_82FE +ENCODING 33534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0480 +1280 +5100 +5240 +5420 +98A0 +1080 +6F80 +ENDCHAR +STARTCHAR U_82FF +ENCODING 33535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8300 +ENCODING 33536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +7FC0 +1240 +7FC0 +5200 +7FC0 +1240 +22C0 +4200 +ENDCHAR +STARTCHAR U_8301 +ENCODING 33537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +2480 +3F80 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8302 +ENCODING 33538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1080 +0440 +3FE0 +2400 +2480 +2500 +2220 +4520 +98E0 +ENDCHAR +STARTCHAR U_8303 +ENCODING 33539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +27C0 +9440 +5440 +2440 +E580 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_8304 +ENCODING 33540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FDE0 +2520 +2520 +2520 +2520 +45E0 +9920 +ENDCHAR +STARTCHAR U_8305 +ENCODING 33541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7F80 +0900 +0600 +FFE0 +0A20 +1240 +2200 +CE00 +ENDCHAR +STARTCHAR U_8306 +ENCODING 33542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0800 +71E0 +4920 +4920 +5920 +69E0 +1100 +6100 +ENDCHAR +STARTCHAR U_8307 +ENCODING 33543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0880 +FFE0 +0800 +0F80 +1500 +2200 +4D80 +B060 +ENDCHAR +STARTCHAR U_8308 +ENCODING 33544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +5120 +5D40 +5180 +5100 +5D20 +F120 +40E0 +ENDCHAR +STARTCHAR U_8309 +ENCODING 33545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +7FC0 +0E00 +1500 +24E0 +C440 +ENDCHAR +STARTCHAR U_830A +ENCODING 33546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0000 +03C0 +3C00 +2000 +3FC0 +2200 +2200 +FFE0 +ENDCHAR +STARTCHAR U_830B +ENCODING 33547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +4200 +7FC0 +4200 +5100 +58A0 +6460 +ENDCHAR +STARTCHAR U_830C +ENCODING 33548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1100 +1100 +2FE0 +6100 +A100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_830D +ENCODING 33549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +F3C0 +1200 +4000 +7F80 +8080 +3C80 +2480 +3C80 +0080 +0700 +ENDCHAR +STARTCHAR U_830E +ENCODING 33550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F00 +0600 +1980 +E060 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_830F +ENCODING 33551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0900 +FFE0 +0A00 +0A40 +0A80 +1320 +2220 +CDE0 +ENDCHAR +STARTCHAR U_8310 +ENCODING 33552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +1FC0 +3540 +4940 +1640 +6540 +0940 +3080 +ENDCHAR +STARTCHAR U_8311 +ENCODING 33553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2880 +2580 +2000 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_8312 +ENCODING 33554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +23C0 +3A40 +4A80 +AA40 +1220 +22A0 +4240 +0200 +ENDCHAR +STARTCHAR U_8313 +ENCODING 33555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +4040 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_8314 +ENCODING 33556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +7FE0 +4020 +8240 +0200 +3FC0 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_8315 +ENCODING 33557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7F80 +0880 +7E80 +08A0 +0860 +0820 +ENDCHAR +STARTCHAR U_8316 +ENCODING 33558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F80 +1900 +6600 +1980 +6060 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8317 +ENCODING 33559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +1F00 +3200 +CC00 +1FC0 +F040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_8318 +ENCODING 33560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0880 +1080 +7BC0 +2940 +2940 +6B40 +9480 +ENDCHAR +STARTCHAR U_8319 +ENCODING 33561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0480 +FFC0 +2400 +FC80 +2500 +2240 +4540 +98C0 +ENDCHAR +STARTCHAR U_831A +ENCODING 33562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BE0 +4220 +7A20 +4220 +4220 +5AE0 +E240 +4200 +ENDCHAR +STARTCHAR U_831B +ENCODING 33563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FC0 +2280 +2900 +30E0 +ENDCHAR +STARTCHAR U_831C +ENCODING 33564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +7FC0 +4A40 +5240 +63C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_831D +ENCODING 33565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +4200 +5F80 +5080 +5F80 +4200 +4200 +7FE0 +ENDCHAR +STARTCHAR U_831E +ENCODING 33566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4400 +7F80 +4080 +7F80 +4480 +4400 +7FE0 +ENDCHAR +STARTCHAR U_831F +ENCODING 33567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0480 +FFE0 +0480 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8320 +ENCODING 33568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +1100 +2FE0 +2100 +6300 +A580 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_8321 +ENCODING 33569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1500 +7FE0 +8040 +1F00 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8322 +ENCODING 33570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FC40 +2240 +7A40 +4A40 +AA40 +1240 +2040 +C1C0 +ENDCHAR +STARTCHAR U_8323 +ENCODING 33571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8324 +ENCODING 33572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0F80 +3100 +0E00 +13C0 +6C80 +1500 +0200 +7C00 +ENDCHAR +STARTCHAR U_8325 +ENCODING 33573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8326 +ENCODING 33574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4440 +4EC0 +1500 +24E0 +C440 +ENDCHAR +STARTCHAR U_8327 +ENCODING 33575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +4440 +4440 +7FC0 +0480 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8328 +ENCODING 33576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +8400 +57C0 +2840 +3280 +C200 +4500 +4880 +7040 +ENDCHAR +STARTCHAR U_8329 +ENCODING 33577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +3F80 +2000 +3FE0 +2000 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_832A +ENCODING 33578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0440 +2480 +1500 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_832B +ENCODING 33579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2200 +9100 +5FE0 +2400 +2400 +C400 +4400 +47E0 +ENDCHAR +STARTCHAR U_832C +ENCODING 33580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +FFE0 +1100 +3100 +57C0 +9100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_832D +ENCODING 33581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2080 +5140 +8A20 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_832E +ENCODING 33582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0780 +0400 +FFE0 +0400 +2480 +2440 +4C40 +ENDCHAR +STARTCHAR U_832F +ENCODING 33583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0180 +2140 +2FE0 +6100 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_8330 +ENCODING 33584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4440 +7FC0 +4440 +7FC0 +2400 +1C00 +E3E0 +ENDCHAR +STARTCHAR U_8331 +ENCODING 33585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1000 +2400 +3FC0 +4400 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_8332 +ENCODING 33586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1080 +2100 +4A40 +F380 +2100 +4A40 +FFE0 +0420 +ENDCHAR +STARTCHAR U_8333 +ENCODING 33587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +97C0 +5100 +2100 +2100 +C100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_8334 +ENCODING 33588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8335 +ENCODING 33589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +4440 +5F40 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8336 +ENCODING 33590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +C460 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8337 +ENCODING 33591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1280 +1240 +13E0 +2E00 +6240 +A280 +2120 +22A0 +2C60 +ENDCHAR +STARTCHAR U_8338 +ENCODING 33592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +2100 +3F00 +2100 +3F00 +21C0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8339 +ENCODING 33593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +FDE0 +2920 +2920 +4920 +3120 +19E0 +E520 +ENDCHAR +STARTCHAR U_833A +ENCODING 33594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0800 +1080 +3F40 +0900 +0920 +1120 +E0E0 +ENDCHAR +STARTCHAR U_833B +ENCODING 33595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +AAA0 +FBE0 +2080 +C000 +2080 +AAA0 +AAA0 +FBE0 +2080 +C080 +ENDCHAR +STARTCHAR U_833C +ENCODING 33596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_833D +ENCODING 33597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3100 +2FE0 +6920 +A920 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_833E +ENCODING 33598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_833F +ENCODING 33599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FF80 +2480 +2680 +2580 +3C80 +E4A0 +48A0 +1060 +ENDCHAR +STARTCHAR U_8340 +ENCODING 33600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +8040 +3E40 +2240 +3E40 +2240 +3E40 +0180 +ENDCHAR +STARTCHAR U_8341 +ENCODING 33601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +FFE0 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_8342 +ENCODING 33602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +2080 +DF60 +0800 +1F80 +0080 +0300 +ENDCHAR +STARTCHAR U_8343 +ENCODING 33603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +1100 +2080 +DF60 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8344 +ENCODING 33604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +3E00 +0480 +1900 +6200 +0D80 +7060 +ENDCHAR +STARTCHAR U_8345 +ENCODING 33605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0000 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_8346 +ENCODING 33606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +00A0 +7EA0 +24A0 +FFA0 +24A0 +2420 +4420 +84E0 +ENDCHAR +STARTCHAR U_8347 +ENCODING 33607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +23C0 +4000 +9000 +2FE0 +6080 +A080 +2080 +2180 +ENDCHAR +STARTCHAR U_8348 +ENCODING 33608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +3FE0 +4880 +AA80 +13E0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_8349 +ENCODING 33609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_834A +ENCODING 33610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0020 +7EA0 +14A0 +14A0 +FFA0 +14A0 +2420 +44E0 +ENDCHAR +STARTCHAR U_834B +ENCODING 33611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4A40 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_834C +ENCODING 33612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8820 +0800 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_834D +ENCODING 33613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +4BE0 +4A40 +4D40 +5940 +E880 +4940 +0A20 +ENDCHAR +STARTCHAR U_834E +ENCODING 33614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +1080 +3F40 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_834F +ENCODING 33615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +11C0 +1F00 +2100 +7FE0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8350 +ENCODING 33616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1000 +27C0 +6080 +BFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_8351 +ENCODING 33617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0480 +7F80 +4400 +7FC0 +04C0 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8352 +ENCODING 33618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2000 +3FC0 +0000 +2480 +2480 +44A0 +8460 +ENDCHAR +STARTCHAR U_8353 +ENCODING 33619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2080 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_8354 +ENCODING 33620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0880 +F700 +2080 +FBE0 +2920 +4A20 +B4C0 +ENDCHAR +STARTCHAR U_8355 +ENCODING 33621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4FC0 +7A40 +4A40 +7A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_8356 +ENCODING 33622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F40 +0480 +FFE0 +0C00 +1980 +EE20 +0820 +07E0 +ENDCHAR +STARTCHAR U_8357 +ENCODING 33623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0440 +7FE0 +4400 +4240 +6280 +5120 +82A0 +8C60 +ENDCHAR +STARTCHAR U_8358 +ENCODING 33624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +9100 +5100 +1FE0 +3100 +5100 +9100 +17C0 +ENDCHAR +STARTCHAR U_8359 +ENCODING 33625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2100 +0100 +EFE0 +2100 +2280 +2440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_835A +ENCODING 33626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +1500 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_835B +ENCODING 33627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0500 +3B40 +00C0 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_835C +ENCODING 33628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4240 +7B80 +4220 +73E0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_835D +ENCODING 33629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +4540 +5540 +5540 +5540 +5540 +2840 +C4C0 +ENDCHAR +STARTCHAR U_835E +ENCODING 33630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0800 +FFE0 +2080 +D160 +1100 +1100 +E100 +ENDCHAR +STARTCHAR U_835F +ENCODING 33631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0000 +7FC0 +1100 +2080 +7FC0 +ENDCHAR +STARTCHAR U_8360 +ENCODING 33632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +1100 +0E00 +F1E0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_8361 +ENCODING 33633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2780 +8A00 +57E0 +12A0 +24A0 +E920 +2220 +24C0 +ENDCHAR +STARTCHAR U_8362 +ENCODING 33634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +8020 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8363 +ENCODING 33635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8364 +ENCODING 33636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +7FC0 +1400 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8365 +ENCODING 33637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +0440 +F680 +1500 +2480 +4460 +8C20 +ENDCHAR +STARTCHAR U_8366 +ENCODING 33638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +2400 +3FC0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8367 +ENCODING 33639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +8420 +2440 +2480 +4500 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8368 +ENCODING 33640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0040 +7FC0 +0040 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_8369 +ENCODING 33641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +2040 +3FC0 +2100 +4C80 +8260 +1C00 +0300 +ENDCHAR +STARTCHAR U_836A +ENCODING 33642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F880 +1080 +2080 +3AC0 +E2A0 +24A0 +2080 +6180 +ENDCHAR +STARTCHAR U_836B +ENCODING 33643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +5240 +63C0 +5240 +4BC0 +6A40 +5440 +48C0 +ENDCHAR +STARTCHAR U_836C +ENCODING 33644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +1240 +4A00 +2200 +FFE0 +0200 +0D80 +F060 +ENDCHAR +STARTCHAR U_836D +ENCODING 33645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +97C0 +E100 +4100 +F100 +0100 +F100 +4FE0 +ENDCHAR +STARTCHAR U_836E +ENCODING 33646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +57E0 +E080 +4480 +F280 +0080 +3080 +C180 +ENDCHAR +STARTCHAR U_836F +ENCODING 33647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +47C0 +E440 +4A40 +A140 +C040 +3040 +C180 +ENDCHAR +STARTCHAR U_8370 +ENCODING 33648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +2000 +F900 +27C0 +7100 +6900 +A100 +2FE0 +ENDCHAR +STARTCHAR U_8371 +ENCODING 33649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +4040 +7FC0 +4700 +5C00 +4780 +5C20 +83E0 +ENDCHAR +STARTCHAR U_8372 +ENCODING 33650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8373 +ENCODING 33651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8374 +ENCODING 33652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFC0 +2100 +3100 +EFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_8375 +ENCODING 33653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +2440 +0840 +7180 +0400 +5240 +90A0 +0F80 +ENDCHAR +STARTCHAR U_8376 +ENCODING 33654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0100 +F280 +9440 +9920 +97C0 +F040 +0080 +0100 +ENDCHAR +STARTCHAR U_8377 +ENCODING 33655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2040 +6F40 +A940 +2940 +2F40 +2040 +21C0 +ENDCHAR +STARTCHAR U_8378 +ENCODING 33656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +8220 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8379 +ENCODING 33657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +2400 +FFE0 +0400 +2440 +4580 +0600 +F800 +ENDCHAR +STARTCHAR U_837A +ENCODING 33658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +27E0 +FC20 +2120 +20A0 +38A0 +E720 +40C0 +ENDCHAR +STARTCHAR U_837B +ENCODING 33659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +5100 +2100 +5520 +B940 +5100 +9280 +1440 +6820 +ENDCHAR +STARTCHAR U_837C +ENCODING 33660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0400 +7FC0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_837D +ENCODING 33661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7E40 +4880 +2500 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_837E +ENCODING 33662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +2080 +DF60 +3100 +4A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_837F +ENCODING 33663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +0240 +7FE0 +4200 +7A40 +4A80 +4920 +5AA0 +8460 +ENDCHAR +STARTCHAR U_8380 +ENCODING 33664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +5F80 +4000 +7FE0 +5240 +5580 +98E0 +ENDCHAR +STARTCHAR U_8381 +ENCODING 33665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +2480 +2480 +5540 +9640 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8382 +ENCODING 33666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7840 +4940 +7940 +2140 +FD40 +2540 +4440 +8CC0 +ENDCHAR +STARTCHAR U_8383 +ENCODING 33667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3580 +FFE0 +1400 +3FC0 +E440 +24C0 +0400 +ENDCHAR +STARTCHAR U_8384 +ENCODING 33668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +2400 +1800 +E7E0 +ENDCHAR +STARTCHAR U_8385 +ENCODING 33669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +1100 +2FE0 +2000 +6440 +A240 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8386 +ENCODING 33670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +44C0 +ENDCHAR +STARTCHAR U_8387 +ENCODING 33671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7900 +4FE0 +7920 +4920 +7920 +4A20 +FC20 +08C0 +ENDCHAR +STARTCHAR U_8388 +ENCODING 33672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4780 +2480 +8480 +6860 +2FC0 +C480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_8389 +ENCODING 33673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0C20 +7120 +1120 +FD20 +1120 +3920 +5420 +92E0 +ENDCHAR +STARTCHAR U_838A +ENCODING 33674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4880 +4880 +7FE0 +0880 +F880 +4880 +4880 +8BE0 +ENDCHAR +STARTCHAR U_838B +ENCODING 33675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1400 +27E0 +6A00 +B3C0 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_838C +ENCODING 33676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +3F80 +2080 +2080 +3F80 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_838D +ENCODING 33677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +0420 +FFE0 +2440 +1680 +0D00 +3500 +C4E0 +1C40 +ENDCHAR +STARTCHAR U_838E +ENCODING 33678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +A540 +4520 +2920 +C940 +4080 +4300 +4C00 +ENDCHAR +STARTCHAR U_838F +ENCODING 33679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FB40 +2520 +3920 +E940 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_8390 +ENCODING 33680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +2FE0 +9920 +5180 +2280 +E2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8391 +ENCODING 33681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F80 +7100 +1F00 +E4E0 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8392 +ENCODING 33682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0000 +7FC0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8393 +ENCODING 33683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7FC0 +A880 +2480 +FFE0 +2480 +3FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_8394 +ENCODING 33684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +5140 +60C0 +5F40 +5140 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8395 +ENCODING 33685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +2480 +C460 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_8396 +ENCODING 33686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +4900 +2480 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8397 +ENCODING 33687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8398 +ENCODING 33688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_8399 +ENCODING 33689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +FFE0 +1080 +7F80 +3080 +D080 +1F80 +ENDCHAR +STARTCHAR U_839A +ENCODING 33690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +2100 +71E0 +1500 +9500 +67E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_839B +ENCODING 33691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F0C0 +2700 +7100 +17C0 +5100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_839C +ENCODING 33692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +53E0 +D440 +5A40 +5140 +5080 +4140 +4620 +ENDCHAR +STARTCHAR U_839D +ENCODING 33693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +2480 +5540 +8420 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_839E +ENCODING 33694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +3F80 +0000 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_839F +ENCODING 33695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +DF60 +0200 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_83A0 +ENCODING 33696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0400 +FFE0 +2480 +DF60 +09C0 +3040 +C380 +ENDCHAR +STARTCHAR U_83A1 +ENCODING 33697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0400 +27C0 +2400 +5C00 +83E0 +ENDCHAR +STARTCHAR U_83A2 +ENCODING 33698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +2480 +5540 +8A20 +3180 +C060 +ENDCHAR +STARTCHAR U_83A3 +ENCODING 33699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2000 +3FC0 +0440 +5220 +9080 +0F80 +ENDCHAR +STARTCHAR U_83A4 +ENCODING 33700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +7FC0 +4A40 +51C0 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_83A5 +ENCODING 33701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +57C0 +2240 +5240 +B7C0 +5240 +9240 +1240 +6FE0 +ENDCHAR +STARTCHAR U_83A6 +ENCODING 33702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2480 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83A7 +ENCODING 33703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_83A8 +ENCODING 33704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3FA0 +2240 +2980 +7060 +ENDCHAR +STARTCHAR U_83A9 +ENCODING 33705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1480 +7F80 +0200 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_83AA +ENCODING 33706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A80 +1240 +FFE0 +1240 +1E80 +F120 +12A0 +3460 +ENDCHAR +STARTCHAR U_83AB +ENCODING 33707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_83AC +ENCODING 33708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3F80 +4200 +FFC0 +4440 +7FC0 +0C00 +3420 +C3E0 +ENDCHAR +STARTCHAR U_83AD +ENCODING 33709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7A40 +4A40 +7A40 +5340 +6A80 +4600 +ENDCHAR +STARTCHAR U_83AE +ENCODING 33710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +2440 +3FC0 +2440 +7FE0 +0420 +1820 +E1C0 +ENDCHAR +STARTCHAR U_83AF +ENCODING 33711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +2100 +8FE0 +6100 +2380 +C540 +4920 +4100 +ENDCHAR +STARTCHAR U_83B0 +ENCODING 33712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +23E0 +FC20 +2140 +3900 +E280 +4440 +1820 +ENDCHAR +STARTCHAR U_83B1 +ENCODING 33713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +2480 +1500 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_83B2 +ENCODING 33714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +5FC0 +0500 +EFC0 +2100 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_83B3 +ENCODING 33715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F080 +97E0 +9080 +F480 +9280 +9280 +F080 +0180 +ENDCHAR +STARTCHAR U_83B4 +ENCODING 33716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0400 +7FC0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_83B5 +ENCODING 33717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0800 +3FC0 +2440 +3FC0 +0A80 +0A60 +3220 +C1E0 +ENDCHAR +STARTCHAR U_83B6 +ENCODING 33718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0080 +4900 +2500 +1200 +FFE0 +ENDCHAR +STARTCHAR U_83B7 +ENCODING 33719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5180 +2140 +57E0 +9100 +3100 +5280 +1440 +6820 +ENDCHAR +STARTCHAR U_83B8 +ENCODING 33720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5180 +2940 +57E0 +B100 +5280 +92A0 +14A0 +6860 +ENDCHAR +STARTCHAR U_83B9 +ENCODING 33721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +3FC0 +0400 +3F80 +0500 +0480 +FFE0 +ENDCHAR +STARTCHAR U_83BA +ENCODING 33722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +3F80 +2500 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_83BB +ENCODING 33723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7F80 +09C0 +1040 +21C0 +7A00 +4BC0 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_83BC +ENCODING 33724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +9FE0 +E100 +2540 +57C0 +E100 +3120 +C0E0 +ENDCHAR +STARTCHAR U_83BD +ENCODING 33725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0880 +FFE0 +2080 +C960 +0900 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_83BE +ENCODING 33726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +DF60 +0400 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_83BF +ENCODING 33727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +7D40 +5540 +5D40 +3140 +5840 +95C0 +ENDCHAR +STARTCHAR U_83C0 +ENCODING 33728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +A020 +3FC0 +4640 +AA40 +12A0 +2220 +C1E0 +ENDCHAR +STARTCHAR U_83C1 +ENCODING 33729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83C2 +ENCODING 33730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +8C20 +8A20 +F920 +8920 +F820 +88C0 +ENDCHAR +STARTCHAR U_83C3 +ENCODING 33731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +27E0 +8400 +47C0 +1440 +27C0 +C400 +47E0 +ENDCHAR +STARTCHAR U_83C4 +ENCODING 33732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83C5 +ENCODING 33733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +FFC0 +8040 +3F00 +2100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83C6 +ENCODING 33734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC00 +4BC0 +7940 +4940 +7940 +4880 +FD40 +0A20 +ENDCHAR +STARTCHAR U_83C7 +ENCODING 33735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2100 +FFC0 +5100 +57C0 +D440 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_83C8 +ENCODING 33736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +F7E0 +2000 +3440 +E240 +2280 +2100 +6FE0 +ENDCHAR +STARTCHAR U_83C9 +ENCODING 33737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +FFE0 +4440 +2E80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_83CA +ENCODING 33738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FE0 +4420 +94A0 +0D20 +7FA0 +1620 +2520 +C4C0 +ENDCHAR +STARTCHAR U_83CB +ENCODING 33739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0100 +F7C0 +9100 +9FE0 +9100 +F380 +9540 +0920 +ENDCHAR +STARTCHAR U_83CC +ENCODING 33740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4140 +5E40 +4440 +7FC0 +5540 +64C0 +7FC0 +ENDCHAR +STARTCHAR U_83CD +ENCODING 33741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3180 +C460 +1F00 +0200 +54A0 +90A0 +0F00 +ENDCHAR +STARTCHAR U_83CE +ENCODING 33742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3F80 +2080 +3F80 +2080 +3FA0 +2140 +3D80 +2120 +3CE0 +ENDCHAR +STARTCHAR U_83CF +ENCODING 33743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2040 +8740 +6540 +2540 +C740 +4040 +41C0 +ENDCHAR +STARTCHAR U_83D0 +ENCODING 33744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +7FE0 +0400 +3F80 +0400 +7FE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_83D1 +ENCODING 33745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +4900 +2480 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_83D2 +ENCODING 33746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2480 +2280 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_83D3 +ENCODING 33747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83D4 +ENCODING 33748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7BC0 +4A40 +7A80 +4BE0 +7B40 +4A80 +4B40 +9A20 +ENDCHAR +STARTCHAR U_83D5 +ENCODING 33749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1B00 +2080 +DF60 +0000 +7FC0 +4A40 +7FC0 +4AC0 +ENDCHAR +STARTCHAR U_83D6 +ENCODING 33750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2880 +2480 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_83D7 +ENCODING 33751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2100 +FFE0 +2520 +3D20 +E7E0 +2520 +27E0 +E420 +ENDCHAR +STARTCHAR U_83D8 +ENCODING 33752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2100 +FD00 +2500 +3A80 +6A40 +A400 +2880 +2F40 +ENDCHAR +STARTCHAR U_83D9 +ENCODING 33753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +FFE0 +2480 +FFE0 +2480 +FFE0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_83DA +ENCODING 33754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +0900 +0600 +1940 +7FC0 +0900 +0640 +79C0 +ENDCHAR +STARTCHAR U_83DB +ENCODING 33755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_83DC +ENCODING 33756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +01C0 +7E80 +2880 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83DD +ENCODING 33757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2240 +FFE0 +2200 +3BC0 +E340 +2480 +2940 +D620 +ENDCHAR +STARTCHAR U_83DE +ENCODING 33758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7900 +11E0 +FEA0 +10A0 +3920 +5520 +92A0 +1440 +ENDCHAR +STARTCHAR U_83DF +ENCODING 33759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +FFC0 +2240 +3FC0 +0A20 +32A0 +C1E0 +ENDCHAR +STARTCHAR U_83E0 +ENCODING 33760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +27E0 +9520 +57C0 +2540 +E480 +2940 +3620 +ENDCHAR +STARTCHAR U_83E1 +ENCODING 33761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0200 +55A0 +4E20 +5520 +6CE0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_83E2 +ENCODING 33762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2400 +F7C0 +2840 +3740 +E540 +27A0 +2420 +63E0 +ENDCHAR +STARTCHAR U_83E3 +ENCODING 33763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +5220 +7E20 +4540 +4540 +7C80 +5140 +7E20 +ENDCHAR +STARTCHAR U_83E4 +ENCODING 33764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +FFE0 +2080 +DF60 +1100 +1240 +0FC0 +ENDCHAR +STARTCHAR U_83E5 +ENCODING 33765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FA00 +23E0 +3240 +6A40 +A240 +2440 +2840 +ENDCHAR +STARTCHAR U_83E6 +ENCODING 33766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +4040 +2780 +6400 +27E0 +2900 +2900 +5100 +8FE0 +ENDCHAR +STARTCHAR U_83E7 +ENCODING 33767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4080 +5F00 +5100 +5FE0 +5100 +54A0 +9A60 +ENDCHAR +STARTCHAR U_83E8 +ENCODING 33768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +7FC0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_83E9 +ENCODING 33769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_83EA +ENCODING 33770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +FFE0 +0800 +1FC0 +3040 +DFC0 +1040 +ENDCHAR +STARTCHAR U_83EB +ENCODING 33771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +2480 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_83EC +ENCODING 33772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4FE0 +2220 +9540 +5880 +27E0 +C420 +47E0 +4420 +ENDCHAR +STARTCHAR U_83ED +ENCODING 33773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4200 +2440 +8FE0 +6020 +2FC0 +C840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_83EE +ENCODING 33774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4440 +7FC0 +4460 +5FC0 +4600 +4900 +B0E0 +ENDCHAR +STARTCHAR U_83EF +ENCODING 33775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_83F0 +ENCODING 33776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F860 +17C0 +2540 +3D40 +E540 +2520 +25A0 +E9A0 +ENDCHAR +STARTCHAR U_83F1 +ENCODING 33777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2880 +DF60 +2900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_83F2 +ENCODING 33778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +0A00 +ENDCHAR +STARTCHAR U_83F3 +ENCODING 33779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_83F4 +ENCODING 33780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +3F80 +E4E0 +3F80 +24A0 +3FA0 +03E0 +ENDCHAR +STARTCHAR U_83F5 +ENCODING 33781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +4440 +7FC0 +5040 +5F40 +40C0 +ENDCHAR +STARTCHAR U_83F6 +ENCODING 33782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +7FC0 +2480 +DF60 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_83F7 +ENCODING 33783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +3F80 +0080 +FFE0 +8420 +BF80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_83F8 +ENCODING 33784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +FA80 +2440 +3920 +28C0 +4A00 +4900 +B0C0 +ENDCHAR +STARTCHAR U_83F9 +ENCODING 33785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +9440 +57C0 +2440 +27C0 +C440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_83FA +ENCODING 33786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2040 +3FC0 +2840 +2FC0 +2840 +4FC0 +88C0 +ENDCHAR +STARTCHAR U_83FB +ENCODING 33787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1080 +FFE0 +1080 +3980 +56C0 +94A0 +18A0 +1080 +ENDCHAR +STARTCHAR U_83FC +ENCODING 33788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2440 +4A80 +1180 +6440 +14A0 +6B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_83FD +ENCODING 33789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +13E0 +1D40 +1140 +FF40 +5540 +5280 +9140 +3620 +ENDCHAR +STARTCHAR U_83FE +ENCODING 33790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0800 +FFE0 +2440 +C6A0 +1540 +64A0 +0C00 +ENDCHAR +STARTCHAR U_83FF +ENCODING 33791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FE20 +24A0 +7AA0 +10A0 +7CA0 +10A0 +1E20 +F0E0 +ENDCHAR +STARTCHAR U_8400 +ENCODING 33792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4840 +7F00 +4880 +4F80 +4900 +8920 +B0E0 +ENDCHAR +STARTCHAR U_8401 +ENCODING 33793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1100 +1D00 +1700 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8402 +ENCODING 33794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7C00 +13C0 +7E40 +1240 +3A40 +57C0 +9240 +1000 +ENDCHAR +STARTCHAR U_8403 +ENCODING 33795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2100 +5280 +8C40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8404 +ENCODING 33796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +5020 +BF20 +0820 +FFA0 +4920 +7F20 +00C0 +ENDCHAR +STARTCHAR U_8405 +ENCODING 33797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFC0 +4480 +7F80 +0420 +03E0 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_8406 +ENCODING 33798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +7F80 +4880 +7F80 +4880 +7F80 +2400 +FFC0 +0400 +ENDCHAR +STARTCHAR U_8407 +ENCODING 33799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1FC0 +1000 +1F80 +1000 +FFE0 +1280 +1500 +18E0 +ENDCHAR +STARTCHAR U_8408 +ENCODING 33800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +3F80 +2080 +3F80 +2080 +3F80 +0A80 +1220 +61E0 +ENDCHAR +STARTCHAR U_8409 +ENCODING 33801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77C0 +5540 +7540 +5540 +77C0 +5420 +5420 +B3E0 +ENDCHAR +STARTCHAR U_840A +ENCODING 33802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +5540 +8E20 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_840B +ENCODING 33803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0480 +FFE0 +0480 +7FE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_840C +ENCODING 33804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_840D +ENCODING 33805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2FE0 +9920 +5540 +2540 +2FE0 +C100 +4100 +4100 +ENDCHAR +STARTCHAR U_840E +ENCODING 33806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0400 +FFE0 +2480 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_840F +ENCODING 33807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +1E00 +2400 +5780 +C080 +7780 +4080 +7F80 +4080 +ENDCHAR +STARTCHAR U_8410 +ENCODING 33808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0480 +7FE0 +0480 +3F80 +27E0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8411 +ENCODING 33809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_8412 +ENCODING 33810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2100 +4880 +9240 +3F00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_8413 +ENCODING 33811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +FFC0 +8040 +BF40 +2100 +3D00 +2F00 +2100 +FFC0 +ENDCHAR +STARTCHAR U_8414 +ENCODING 33812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2000 +F7C0 +2240 +3240 +E480 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_8415 +ENCODING 33813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +1100 +0E00 +3180 +DFE0 +1080 +1F80 +2080 +ENDCHAR +STARTCHAR U_8416 +ENCODING 33814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3780 +2080 +3B80 +2080 +3F80 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_8417 +ENCODING 33815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_8418 +ENCODING 33816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +2E80 +C060 +7FC0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8419 +ENCODING 33817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +27E0 +FD20 +2100 +7180 +AAA0 +22A0 +24E0 +ENDCHAR +STARTCHAR U_841A +ENCODING 33818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F440 +2380 +3D60 +E7C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_841B +ENCODING 33819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +3280 +2980 +3F80 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_841C +ENCODING 33820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +F8E0 +A880 +ABE0 +AA20 +B220 +23E0 +2220 +ENDCHAR +STARTCHAR U_841D +ENCODING 33821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +1000 +3F80 +5100 +0E00 +F800 +ENDCHAR +STARTCHAR U_841E +ENCODING 33822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7FC0 +4440 +4A40 +0000 +4AC0 +7320 +4220 +71E0 +ENDCHAR +STARTCHAR U_841F +ENCODING 33823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +2780 +FA80 +2680 +73A0 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8420 +ENCODING 33824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +4A40 +9480 +ENDCHAR +STARTCHAR U_8421 +ENCODING 33825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +4200 +27C0 +8440 +57C0 +2440 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8422 +ENCODING 33826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4400 +27C0 +0840 +6740 +1540 +6740 +24A0 +23E0 +ENDCHAR +STARTCHAR U_8423 +ENCODING 33827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +FFE0 +8020 +3F80 +1200 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8424 +ENCODING 33828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +7FC0 +4440 +7FC0 +0480 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8425 +ENCODING 33829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +8040 +BF00 +2100 +7F80 +4080 +4080 +7F80 +ENDCHAR +STARTCHAR U_8426 +ENCODING 33830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9120 +3E00 +0880 +7FC0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_8427 +ENCODING 33831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0480 +FFE0 +0480 +3F80 +5540 +64C0 +8440 +ENDCHAR +STARTCHAR U_8428 +ENCODING 33832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +A440 +C280 +A7E0 +9400 +E400 +8800 +9000 +ENDCHAR +STARTCHAR U_8429 +ENCODING 33833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F100 +2540 +F540 +2580 +7100 +AA80 +2440 +2820 +ENDCHAR +STARTCHAR U_842A +ENCODING 33834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7A40 +1140 +7A40 +1160 +39C0 +5640 +9040 +1040 +ENDCHAR +STARTCHAR U_842B +ENCODING 33835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7F80 +0400 +FFE0 +1480 +3FC0 +D0A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_842C +ENCODING 33836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFC0 +8540 +9F40 +80C0 +ENDCHAR +STARTCHAR U_842D +ENCODING 33837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7F80 +0400 +3F80 +2480 +7FC0 +4540 +5F40 +40C0 +ENDCHAR +STARTCHAR U_842E +ENCODING 33838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1A00 +2D80 +C060 +7D40 +4540 +7D40 +4440 +4C80 +ENDCHAR +STARTCHAR U_842F +ENCODING 33839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +7F80 +A080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8430 +ENCODING 33840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +5540 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_8431 +ENCODING 33841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +7FC0 +2080 +3F80 +2080 +3F80 +FFE0 +ENDCHAR +STARTCHAR U_8432 +ENCODING 33842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +2480 +7FE0 +0800 +FFE0 +2900 +4600 +B9E0 +ENDCHAR +STARTCHAR U_8433 +ENCODING 33843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +7FC0 +4440 +ENDCHAR +STARTCHAR U_8434 +ENCODING 33844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +4540 +7D40 +4540 +7D40 +4540 +7C40 +C6C0 +ENDCHAR +STARTCHAR U_8435 +ENCODING 33845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3C80 +2480 +FFE0 +9120 +9120 +9F60 +ENDCHAR +STARTCHAR U_8436 +ENCODING 33846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +FFE0 +1F80 +30C0 +DFA0 +1080 +1F80 +ENDCHAR +STARTCHAR U_8437 +ENCODING 33847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9220 +54A0 +7EA0 +42A0 +7EA0 +42A0 +7E20 +46E0 +ENDCHAR +STARTCHAR U_8438 +ENCODING 33848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +65C0 +4440 +75C0 +4440 +7FC0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8439 +ENCODING 33849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4040 +7FC0 +4000 +5FC0 +5540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_843A +ENCODING 33850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5F40 +4040 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_843B +ENCODING 33851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_843C +ENCODING 33852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +4A40 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_843D +ENCODING 33853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4780 +2C80 +8300 +5480 +2860 +C780 +4480 +4780 +ENDCHAR +STARTCHAR U_843E +ENCODING 33854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7F80 +1AC0 +2440 +CAC0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_843F +ENCODING 33855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +27C0 +9100 +5FE0 +2100 +E7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8440 +ENCODING 33856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +20C0 +FF00 +2100 +37E0 +E100 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_8441 +ENCODING 33857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_8442 +ENCODING 33858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7880 +53E0 +FCA0 +54A0 +7D20 +2AC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_8443 +ENCODING 33859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +4D00 +79E0 +4900 +49E0 +7900 +0100 +ENDCHAR +STARTCHAR U_8444 +ENCODING 33860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +7D00 +49C0 +7900 +49E0 +4900 +9900 +ENDCHAR +STARTCHAR U_8445 +ENCODING 33861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2440 +57C0 +A440 +27C0 +5440 +8440 +0FE0 +ENDCHAR +STARTCHAR U_8446 +ENCODING 33862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +17C0 +2440 +27C0 +6100 +BFE0 +2540 +2940 +3120 +ENDCHAR +STARTCHAR U_8447 +ENCODING 33863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0A00 +FFE0 +1440 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8448 +ENCODING 33864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +2080 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_8449 +ENCODING 33865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FFE0 +2900 +2F00 +3FC0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_844A +ENCODING 33866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3F80 +D160 +1F00 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_844B +ENCODING 33867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +7C20 +4BA0 +7AA0 +4BA0 +4820 +98C0 +ENDCHAR +STARTCHAR U_844C +ENCODING 33868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1080 +0F00 +78C0 +2100 +FFE0 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_844D +ENCODING 33869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +3F80 +2080 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_844E +ENCODING 33870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FC0 +4140 +8FE0 +2140 +6FE0 +A100 +3FE0 +2100 +ENDCHAR +STARTCHAR U_844F +ENCODING 33871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +4FC0 +A240 +5FE0 +2240 +2FC0 +C200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_8450 +ENCODING 33872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +DF60 +0900 +1200 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_8451 +ENCODING 33873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2040 +F840 +23E0 +FC40 +2240 +F940 +2040 +FDC0 +ENDCHAR +STARTCHAR U_8452 +ENCODING 33874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2000 +57C0 +E100 +4900 +F500 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_8453 +ENCODING 33875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2480 +8FE0 +2480 +2480 +DFE0 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_8454 +ENCODING 33876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +2F80 +2080 +5FE0 +C800 +4FC0 +5200 +5FE0 +4500 +58C0 +ENDCHAR +STARTCHAR U_8455 +ENCODING 33877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +24E0 +5200 +A9E0 +6240 +A440 +2C40 +2440 +20C0 +ENDCHAR +STARTCHAR U_8456 +ENCODING 33878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +64C0 +0500 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8457 +ENCODING 33879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +7F80 +0500 +FFE0 +1F80 +3080 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8458 +ENCODING 33880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1240 +2480 +FFE0 +1240 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_8459 +ENCODING 33881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +13E0 +FE20 +13E0 +3220 +5BE0 +9620 +13E0 +1220 +ENDCHAR +STARTCHAR U_845A +ENCODING 33882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +1100 +1F00 +1100 +FFE0 +2900 +3080 +3FC0 +ENDCHAR +STARTCHAR U_845B +ENCODING 33883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FE0 +6420 +AA20 +3F60 +ENDCHAR +STARTCHAR U_845C +ENCODING 33884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +F940 +2140 +FA40 +2480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_845D +ENCODING 33885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +57E0 +A920 +5520 +FD20 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_845E +ENCODING 33886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +1240 +73C0 +8240 +F3C0 +1240 +17E0 +6040 +ENDCHAR +STARTCHAR U_845F +ENCODING 33887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +3F80 +2080 +3F80 +2080 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8460 +ENCODING 33888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FC0 +4040 +4FC0 +C040 +5FE0 +54A0 +4300 +5CE0 +ENDCHAR +STARTCHAR U_8461 +ENCODING 33889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +4A20 +BFA0 +2920 +3F20 +2920 +3F20 +2940 +ENDCHAR +STARTCHAR U_8462 +ENCODING 33890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0A00 +3580 +C260 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_8463 +ENCODING 33891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8464 +ENCODING 33892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2940 +4040 +F7E0 +2840 +FA40 +0140 +A840 +A940 +8080 +ENDCHAR +STARTCHAR U_8465 +ENCODING 33893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4440 +7D40 +4540 +7D40 +4540 +5440 +49C0 +ENDCHAR +STARTCHAR U_8466 +ENCODING 33894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0880 +FFE0 +1080 +3FC0 +2200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_8467 +ENCODING 33895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7D00 +13E0 +FD20 +8D20 +1120 +FD20 +12A0 +7440 +ENDCHAR +STARTCHAR U_8468 +ENCODING 33896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFE0 +2280 +2900 +70E0 +ENDCHAR +STARTCHAR U_8469 +ENCODING 33897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4000 +F7C0 +9540 +9540 +F7C0 +9420 +F420 +03E0 +ENDCHAR +STARTCHAR U_846A +ENCODING 33898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A00 +3C40 +4940 +FD40 +5540 +7D40 +5540 +7C40 +94C0 +ENDCHAR +STARTCHAR U_846B +ENCODING 33899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FA40 +23C0 +7A40 +4BC0 +7A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_846C +ENCODING 33900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2A80 +D320 +21E0 +5100 +FFE0 +1100 +E100 +ENDCHAR +STARTCHAR U_846D +ENCODING 33901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4840 +7BC0 +4000 +7BC0 +4240 +7980 +4660 +ENDCHAR +STARTCHAR U_846E +ENCODING 33902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7B80 +4280 +74E0 +4000 +7FC0 +4280 +F900 +4EE0 +ENDCHAR +STARTCHAR U_846F +ENCODING 33903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +93E0 +E420 +4920 +F4A0 +5020 +A920 +A8C0 +ENDCHAR +STARTCHAR U_8470 +ENCODING 33904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2840 +3FA0 +6480 +AA40 +37A0 +2C80 +2300 +3CE0 +ENDCHAR +STARTCHAR U_8471 +ENCODING 33905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +7FC0 +9240 +1C40 +6640 +1B80 +4A40 +48A0 +87A0 +ENDCHAR +STARTCHAR U_8472 +ENCODING 33906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +3F80 +2480 +3F80 +0440 +7580 +2480 +CC60 +ENDCHAR +STARTCHAR U_8473 +ENCODING 33907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4100 +7F20 +4940 +7F40 +5580 +4CA0 +B360 +ENDCHAR +STARTCHAR U_8474 +ENCODING 33908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4100 +5D20 +4140 +5D80 +5520 +5EA0 +8460 +ENDCHAR +STARTCHAR U_8475 +ENCODING 33909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE80 +5340 +2180 +5E80 +8460 +7F80 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8476 +ENCODING 33910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +8020 +3F80 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_8477 +ENCODING 33911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8478 +ENCODING 33912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_8479 +ENCODING 33913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7BE0 +2480 +3AE0 +2BA0 +2EE0 +2A80 +4A20 +B1E0 +ENDCHAR +STARTCHAR U_847A +ENCODING 33914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +3F00 +2100 +FFC0 +2100 +3F00 +2100 +FF80 +0100 +ENDCHAR +STARTCHAR U_847B +ENCODING 33915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +5F40 +5540 +5F40 +4540 +5FA0 +80A0 +ENDCHAR +STARTCHAR U_847C +ENCODING 33916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4E40 +5140 +7FC0 +2880 +DF60 +2900 +4600 +39C0 +ENDCHAR +STARTCHAR U_847D +ENCODING 33917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4A40 +7FC0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_847E +ENCODING 33918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3BC0 +4A40 +AAC0 +1220 +E1E0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_847F +ENCODING 33919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3FC0 +2240 +3FC0 +2940 +2A40 +2CC0 +4940 +8FC0 +ENDCHAR +STARTCHAR U_8480 +ENCODING 33920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1F80 +1080 +1F80 +1080 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_8481 +ENCODING 33921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4240 +3FE0 +E700 +2A80 +3240 +2220 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8482 +ENCODING 33922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +8420 +3F80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_8483 +ENCODING 33923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0F80 +1100 +FFE0 +1480 +6B00 +1680 +0A60 +3600 +ENDCHAR +STARTCHAR U_8484 +ENCODING 33924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +80A0 +7BC0 +0480 +FA80 +2A80 +4920 +87E0 +ENDCHAR +STARTCHAR U_8485 +ENCODING 33925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +4200 +1780 +62A0 +2460 +7FC0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_8486 +ENCODING 33926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +77C0 +2540 +F860 +0400 +FFE0 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_8487 +ENCODING 33927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7FE0 +4100 +5F20 +5120 +5540 +54A0 +4B60 +B220 +ENDCHAR +STARTCHAR U_8488 +ENCODING 33928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5240 +7B80 +4220 +71E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8489 +ENCODING 33929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_848A +ENCODING 33930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1200 +32C0 +6700 +BA20 +21E0 +0200 +7B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_848B +ENCODING 33931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +AC80 +6300 +2480 +7FE0 +A480 +2280 +2180 +ENDCHAR +STARTCHAR U_848C +ENCODING 33932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +2480 +FFE0 +2480 +4C40 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_848D +ENCODING 33933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +2800 +FF80 +0900 +0FC0 +1080 +7FE0 +9520 +2AE0 +ENDCHAR +STARTCHAR U_848E +ENCODING 33934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2FC0 +8840 +4B80 +2AA0 +2AC0 +CA80 +4B40 +5620 +ENDCHAR +STARTCHAR U_848F +ENCODING 33935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8A20 +7FC0 +4A40 +5340 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8490 +ENCODING 33936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2440 +3FC0 +2440 +3FC0 +0B60 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_8491 +ENCODING 33937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7C20 +4BC0 +7D40 +4540 +4480 +9B60 +ENDCHAR +STARTCHAR U_8492 +ENCODING 33938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +77E0 +5100 +77C0 +4540 +7540 +5540 +7540 +0100 +ENDCHAR +STARTCHAR U_8493 +ENCODING 33939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +57C0 +7100 +2D40 +7FC0 +0100 +A920 +A8E0 +ENDCHAR +STARTCHAR U_8494 +ENCODING 33940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +9100 +9FE0 +F080 +9FE0 +9480 +F280 +0100 +ENDCHAR +STARTCHAR U_8495 +ENCODING 33941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2A80 +3180 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8496 +ENCODING 33942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +2A80 +3580 +2A80 +FFE0 +2080 +ENDCHAR +STARTCHAR U_8497 +ENCODING 33943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +2F80 +8880 +5F80 +2880 +CFA0 +4940 +4EE0 +ENDCHAR +STARTCHAR U_8498 +ENCODING 33944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +FBC0 +5240 +33C0 +C800 +3F80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_8499 +ENCODING 33945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7FC0 +D440 +2680 +CB00 +1280 +EC60 +ENDCHAR +STARTCHAR U_849A +ENCODING 33946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +1100 +1F00 +0000 +7FC0 +4A40 +7FC0 +4440 +ENDCHAR +STARTCHAR U_849B +ENCODING 33947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +FBC0 +2140 +F940 +AFE0 +A980 +FA40 +0420 +ENDCHAR +STARTCHAR U_849C +ENCODING 33948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +0000 +FBE0 +2080 +72C0 +AAA0 +24A0 +6180 +ENDCHAR +STARTCHAR U_849D +ENCODING 33949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +5040 +5FC0 +5040 +5FC0 +4A80 +9240 +A620 +ENDCHAR +STARTCHAR U_849E +ENCODING 33950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4480 +2FE0 +A800 +7A40 +2940 +C940 +4880 +4FE0 +ENDCHAR +STARTCHAR U_849F +ENCODING 33951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +0420 +53A0 +52A0 +2BA0 +F020 +00C0 +ENDCHAR +STARTCHAR U_84A0 +ENCODING 33952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_84A1 +ENCODING 33953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FE0 +0900 +FFE0 +8420 +FFE0 +0800 +1FC0 +2040 +C380 +ENDCHAR +STARTCHAR U_84A2 +ENCODING 33954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F100 +9280 +AFE0 +9100 +DFE0 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_84A3 +ENCODING 33955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +2300 +54C0 +ABA0 +6100 +AFE0 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_84A4 +ENCODING 33956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4300 +2480 +9FC0 +7120 +2FC0 +C580 +4940 +5720 +ENDCHAR +STARTCHAR U_84A5 +ENCODING 33957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +1900 +63C0 +5140 +6AC0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_84A6 +ENCODING 33958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2200 +7FC0 +A200 +3F80 +2200 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_84A7 +ENCODING 33959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4900 +4D40 +4940 +5CC0 +54A0 +9D60 +8220 +ENDCHAR +STARTCHAR U_84A8 +ENCODING 33960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2100 +7FE0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_84A9 +ENCODING 33961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +1240 +FBC0 +3240 +5BC0 +9640 +1240 +1FE0 +ENDCHAR +STARTCHAR U_84AA +ENCODING 33962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +3F80 +2480 +0100 +FFE0 +2100 +1300 +ENDCHAR +STARTCHAR U_84AB +ENCODING 33963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +0400 +3F80 +0400 +FFE0 +2200 +4200 +BFE0 +ENDCHAR +STARTCHAR U_84AC +ENCODING 33964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A220 +7FC0 +A440 +3FC0 +0A00 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_84AD +ENCODING 33965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FC0 +5540 +9F40 +2840 +3FC0 +D540 +1F40 +08C0 +ENDCHAR +STARTCHAR U_84AE +ENCODING 33966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8A20 +1200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_84AF +ENCODING 33967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +EEA0 +AAA0 +EEA0 +AAA0 +EEA0 +AA20 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_84B0 +ENCODING 33968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7DC0 +5540 +5660 +FC00 +57E0 +5540 +4480 +9F60 +ENDCHAR +STARTCHAR U_84B1 +ENCODING 33969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2140 +FFE0 +2540 +37C0 +E540 +27C0 +2540 +65C0 +ENDCHAR +STARTCHAR U_84B2 +ENCODING 33970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +5FE0 +2920 +8FE0 +6920 +2FE0 +C920 +4920 +4960 +ENDCHAR +STARTCHAR U_84B3 +ENCODING 33971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +57C0 +7540 +2D40 +FEC0 +0440 +AC40 +ACC0 +ENDCHAR +STARTCHAR U_84B4 +ENCODING 33972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +29E0 +FF20 +55E0 +5520 +7DE0 +1120 +2220 +C460 +ENDCHAR +STARTCHAR U_84B5 +ENCODING 33973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +1480 +0900 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_84B6 +ENCODING 33974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +2240 +5420 +FBE0 +2140 +5140 +F940 +5240 +ACC0 +ENDCHAR +STARTCHAR U_84B7 +ENCODING 33975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_84B8 +ENCODING 33976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0240 +F580 +2480 +4460 +BF80 +5240 +8920 +ENDCHAR +STARTCHAR U_84B9 +ENCODING 33977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +7FE0 +0A40 +7FE0 +0A40 +3FC0 +1A80 +2A40 +CA20 +ENDCHAR +STARTCHAR U_84BA +ENCODING 33978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +BFE0 +6800 +2FC0 +6200 +BFE0 +2500 +4880 +B060 +ENDCHAR +STARTCHAR U_84BB +ENCODING 33979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +0820 +79E0 +8200 +FBE0 +4920 +28A0 +D340 +ENDCHAR +STARTCHAR U_84BC +ENCODING 33980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1480 +3FC0 +D0A0 +1F80 +1080 +1FC0 +2840 +CFC0 +ENDCHAR +STARTCHAR U_84BD +ENCODING 33981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2240 +2FC0 +2540 +3FC0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_84BE +ENCODING 33982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +0A40 +E680 +3FE0 +2680 +2A40 +5200 +8FE0 +ENDCHAR +STARTCHAR U_84BF +ENCODING 33983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +1F00 +0000 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_84C0 +ENCODING 33984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1240 +2780 +3940 +E7E0 +2080 +24C0 +69A0 +ENDCHAR +STARTCHAR U_84C1 +ENCODING 33985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0800 +FFE0 +2E80 +C460 +3F80 +1500 +E4E0 +ENDCHAR +STARTCHAR U_84C2 +ENCODING 33986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A0A0 +3F80 +2080 +FFE0 +0000 +2080 +4040 +ENDCHAR +STARTCHAR U_84C3 +ENCODING 33987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +75C0 +4440 +75C0 +4440 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_84C4 +ENCODING 33988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1200 +2480 +7FC0 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_84C5 +ENCODING 33989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +A440 +5FA0 +2000 +2A80 +CA80 +52A0 +6260 +ENDCHAR +STARTCHAR U_84C6 +ENCODING 33990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_84C7 +ENCODING 33991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +A0A0 +BF80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_84C8 +ENCODING 33992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +7BC0 +4A40 +7A80 +4A40 +7A40 +5340 +6A80 +4A00 +ENDCHAR +STARTCHAR U_84C9 +ENCODING 33993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +6AC0 +1100 +3F80 +D160 +1100 +1F00 +ENDCHAR +STARTCHAR U_84CA +ENCODING 33994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1480 +2940 +DFA0 +0000 +FBE0 +4920 +28A0 +DB60 +ENDCHAR +STARTCHAR U_84CB +ENCODING 33995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0400 +FFE0 +1080 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_84CC +ENCODING 33996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +5540 +BFA0 +0400 +FFE0 +5100 +8E00 +F1E0 +ENDCHAR +STARTCHAR U_84CD +ENCODING 33997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +7F80 +0500 +FFE0 +3040 +DFC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_84CE +ENCODING 33998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FE0 +4240 +7FE0 +4240 +5FC0 +4200 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_84CF +ENCODING 33999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +0CE0 +7740 +5540 +5540 +5540 +5540 +5DA0 +9520 +ENDCHAR +STARTCHAR U_84D0 +ENCODING 34000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +7FE0 +5540 +5880 +7FE0 +5080 +8B80 +ENDCHAR +STARTCHAR U_84D1 +ENCODING 34001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +2080 +3FA0 +1140 +3480 +D860 +ENDCHAR +STARTCHAR U_84D2 +ENCODING 34002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5480 +7C80 +57E0 +7C80 +1080 +FE80 +1080 +ENDCHAR +STARTCHAR U_84D3 +ENCODING 34003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2480 +3FE0 +6000 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_84D4 +ENCODING 34004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +FFC0 +0400 +7F80 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_84D5 +ENCODING 34005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +F7C0 +2100 +77E0 +6900 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_84D6 +ENCODING 34006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5540 +4A40 +7FC0 +4200 +7BC0 +4220 +79E0 +ENDCHAR +STARTCHAR U_84D7 +ENCODING 34007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +47C0 +9100 +2FE0 +6500 +A5C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84D8 +ENCODING 34008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1500 +2A80 +7F40 +0A00 +3140 +D080 +1860 +ENDCHAR +STARTCHAR U_84D9 +ENCODING 34009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5480 +5480 +6D40 +4400 +5F80 +8400 +BFC0 +ENDCHAR +STARTCHAR U_84DA +ENCODING 34010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +25C0 +6A40 +A9A0 +2E40 +2980 +2A40 +2180 +2600 +ENDCHAR +STARTCHAR U_84DB +ENCODING 34011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +2340 +F940 +A940 +3080 +6940 +A620 +ENDCHAR +STARTCHAR U_84DC +ENCODING 34012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FBC0 +5040 +F840 +ABC0 +AA00 +DA20 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_84DD +ENCODING 34013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5200 +53C0 +5500 +1080 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_84DE +ENCODING 34014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7FC0 +2880 +1500 +73C0 +4040 +7BC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_84DF +ENCODING 34015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +30A0 +7CA0 +D4A0 +7CA0 +54A0 +7CA0 +0020 +7CE0 +ENDCHAR +STARTCHAR U_84E0 +ENCODING 34016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2A80 +2480 +2A80 +7FC0 +4A40 +5F40 +41C0 +ENDCHAR +STARTCHAR U_84E1 +ENCODING 34017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2040 +9FE0 +5020 +2F80 +C480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_84E2 +ENCODING 34018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +5240 +5A40 +6CC0 +ENDCHAR +STARTCHAR U_84E3 +ENCODING 34019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +5100 +23E0 +FA20 +2AA0 +22A0 +2140 +E620 +ENDCHAR +STARTCHAR U_84E4 +ENCODING 34020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +4FC0 +2200 +1FE0 +2A40 +D7A0 +4C80 +4300 +5CE0 +ENDCHAR +STARTCHAR U_84E5 +ENCODING 34021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8A20 +1100 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_84E6 +ENCODING 34022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +FFE0 +3140 +DFE0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_84E7 +ENCODING 34023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +4A80 +D180 +5660 +5100 +5FE0 +4940 +5720 +ENDCHAR +STARTCHAR U_84E8 +ENCODING 34024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23E0 +5640 +5980 +D660 +57C0 +5440 +57C0 +44C0 +ENDCHAR +STARTCHAR U_84E9 +ENCODING 34025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +5640 +F980 +2E60 +6100 +A7E0 +2220 +6CC0 +ENDCHAR +STARTCHAR U_84EA +ENCODING 34026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +4FC0 +0280 +EFC0 +2940 +2FC0 +2940 +58C0 +8FE0 +ENDCHAR +STARTCHAR U_84EB +ENCODING 34027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5FE0 +2520 +FAC0 +2580 +3AC0 +24A0 +5900 +8FE0 +ENDCHAR +STARTCHAR U_84EC +ENCODING 34028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +4480 +2380 +0D60 +E380 +2100 +27C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_84ED +ENCODING 34029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +7FE0 +4200 +7FC0 +4A80 +5FE0 +6A80 +8FA0 +81E0 +ENDCHAR +STARTCHAR U_84EE +ENCODING 34030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4940 +EFC0 +2940 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_84EF +ENCODING 34031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2440 +4440 +9BA0 +2100 +65E0 +A500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84F0 +ENCODING 34032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +45C0 +A500 +7FE0 +A500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84F1 +ENCODING 34033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2280 +9FE0 +6480 +2FE0 +C480 +4880 +5080 +ENDCHAR +STARTCHAR U_84F2 +ENCODING 34034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4900 +4900 +5FC0 +5540 +5DC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_84F3 +ENCODING 34035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +0A00 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_84F4 +ENCODING 34036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFC0 +2440 +3FC0 +2440 +7FC0 +0120 +FFE0 +1300 +ENDCHAR +STARTCHAR U_84F5 +ENCODING 34037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +F140 +27E0 +3140 +67C0 +A580 +2700 +69E0 +ENDCHAR +STARTCHAR U_84F6 +ENCODING 34038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7280 +57E0 +5C80 +57E0 +5480 +77E0 +5480 +07E0 +ENDCHAR +STARTCHAR U_84F7 +ENCODING 34039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +FFE0 +2480 +3FE0 +E480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_84F8 +ENCODING 34040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2A80 +FFE0 +4A40 +7FC0 +4A40 +7FC0 +2480 +2280 +3F80 +ENDCHAR +STARTCHAR U_84F9 +ENCODING 34041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +48E0 +AFA0 +44A0 +DFA0 +44A0 +57E0 +5480 +5F80 +ENDCHAR +STARTCHAR U_84FA +ENCODING 34042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F900 +23C0 +FD40 +4B40 +A5C0 +F940 +2220 +FC20 +ENDCHAR +STARTCHAR U_84FB +ENCODING 34043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +2140 +FF40 +5140 +FDC0 +2140 +FE20 +2420 +ENDCHAR +STARTCHAR U_84FC +ENCODING 34044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2940 +18C0 +2E40 +F1E0 +1E00 +00C0 +1F00 +ENDCHAR +STARTCHAR U_84FD +ENCODING 34045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +2480 +FFE0 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_84FE +ENCODING 34046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +07C0 +0400 +7FC0 +4A40 +5540 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_84FF +ENCODING 34047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +87E0 +2100 +67C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8500 +ENCODING 34048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4520 +2940 +FF40 +0120 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_8501 +ENCODING 34049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8502 +ENCODING 34050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4440 +7FC0 +4440 +7FC0 +0A00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8503 +ENCODING 34051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E780 +2480 +E780 +8FC0 +E940 +2FC0 +2140 +CFE0 +ENDCHAR +STARTCHAR U_8504 +ENCODING 34052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8505 +ENCODING 34053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4440 +5F40 +4A40 +4440 +5AC0 +ENDCHAR +STARTCHAR U_8506 +ENCODING 34054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +A100 +5FE0 +2A40 +D3A0 +4C80 +4300 +4CE0 +ENDCHAR +STARTCHAR U_8507 +ENCODING 34055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +9280 +F480 +97E0 +F080 +91A0 +9AA0 +EC60 +ENDCHAR +STARTCHAR U_8508 +ENCODING 34056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +4A40 +4A40 +7FC0 +0000 +7FE0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8509 +ENCODING 34057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +DF60 +1100 +1F40 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_850A +ENCODING 34058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2C40 +B7C0 +A440 +AFE0 +2100 +5FE0 +8900 +ENDCHAR +STARTCHAR U_850B +ENCODING 34059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +44E0 +A6A0 +44A0 +3EA0 +C4A0 +4E40 +55A0 +4D20 +ENDCHAR +STARTCHAR U_850C +ENCODING 34060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +11E0 +7E20 +5480 +7C80 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_850D +ENCODING 34061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4940 +7FC0 +5100 +5D40 +5180 +5520 +98E0 +ENDCHAR +STARTCHAR U_850E +ENCODING 34062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2380 +FA80 +02E0 +F400 +07C0 +F280 +9100 +FEE0 +ENDCHAR +STARTCHAR U_850F +ENCODING 34063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +7FC0 +4940 +5FC0 +4940 +4F40 +40C0 +ENDCHAR +STARTCHAR U_8510 +ENCODING 34064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +7FC0 +4440 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8511 +ENCODING 34065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FE0 +4200 +7240 +4A80 +8320 +9CE0 +ENDCHAR +STARTCHAR U_8512 +ENCODING 34066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +7FE0 +1080 +3FC0 +D040 +5FC0 +8920 +ENDCHAR +STARTCHAR U_8513 +ENCODING 34067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +4A40 +7FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_8514 +ENCODING 34068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FE0 +5220 +BF20 +2920 +3F20 +2920 +3F20 +00C0 +ENDCHAR +STARTCHAR U_8515 +ENCODING 34069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +FFE0 +2A80 +44E0 +FFE0 +8420 +3F80 +2480 +2580 +ENDCHAR +STARTCHAR U_8516 +ENCODING 34070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1780 +0400 +7FE0 +4420 +5FE0 +5040 +5FC0 +9040 +BFE0 +ENDCHAR +STARTCHAR U_8517 +ENCODING 34071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4900 +7FE0 +4900 +4F00 +5540 +94A0 +A4A0 +ENDCHAR +STARTCHAR U_8518 +ENCODING 34072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2940 +FBC0 +2C80 +D260 +0C80 +3300 +0C00 +ENDCHAR +STARTCHAR U_8519 +ENCODING 34073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +4400 +77E0 +52A0 +52E0 +9580 +A8E0 +ENDCHAR +STARTCHAR U_851A +ENCODING 34074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +45E0 +7C40 +4140 +7EC0 +4840 +AC40 +DAC0 +ENDCHAR +STARTCHAR U_851B +ENCODING 34075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +7A40 +9140 +7E40 +5540 +7C60 +57C0 +7C40 +9440 +ENDCHAR +STARTCHAR U_851C +ENCODING 34076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +11E0 +7F40 +1140 +FD40 +2880 +4940 +9620 +ENDCHAR +STARTCHAR U_851D +ENCODING 34077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1920 +F540 +9100 +FFE0 +9100 +F380 +9540 +F920 +0100 +ENDCHAR +STARTCHAR U_851E +ENCODING 34078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +E4E0 +3F80 +4440 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_851F +ENCODING 34079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +4500 +73E0 +5480 +57E0 +9140 +B620 +ENDCHAR +STARTCHAR U_8520 +ENCODING 34080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +4A80 +F100 +22C0 +5520 +F0C0 +5300 +A8C0 +ENDCHAR +STARTCHAR U_8521 +ENCODING 34081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +4940 +BE80 +2060 +DF80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8522 +ENCODING 34082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5200 +8FC0 +2A40 +CF80 +4900 +5680 +FFE0 +1200 +7F80 +ENDCHAR +STARTCHAR U_8523 +ENCODING 34083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +57C0 +5A80 +7500 +1280 +FFE0 +5480 +5280 +9100 +ENDCHAR +STARTCHAR U_8524 +ENCODING 34084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8920 +5640 +5CA0 +EFA0 +2440 +2440 +3FC0 +ENDCHAR +STARTCHAR U_8525 +ENCODING 34085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2580 +2A80 +2480 +3F80 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_8526 +ENCODING 34086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_8527 +ENCODING 34087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +1100 +FFE0 +3FC0 +0040 +3FC0 +0040 +3FC0 +ENDCHAR +STARTCHAR U_8528 +ENCODING 34088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5540 +7FC0 +5140 +7EC0 +5040 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8529 +ENCODING 34089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_852A +ENCODING 34090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5500 +7DE0 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_852B +ENCODING 34091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1200 +FFE0 +2000 +3FE0 +0020 +5520 +8AC0 +ENDCHAR +STARTCHAR U_852C +ENCODING 34092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1240 +27E0 +A000 +B540 +A540 +B540 +E960 +ENDCHAR +STARTCHAR U_852D +ENCODING 34093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +F540 +ABA0 +C080 +A7C0 +9000 +EFE0 +8440 +8FA0 +ENDCHAR +STARTCHAR U_852E +ENCODING 34094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4540 +7FC0 +5440 +72C0 +4940 +52C0 +7FC0 +ENDCHAR +STARTCHAR U_852F +ENCODING 34095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +9540 +A7C0 +9540 +97C0 +E380 +8540 +8920 +ENDCHAR +STARTCHAR U_8530 +ENCODING 34096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FC0 +4040 +7FC0 +4880 +5FC0 +5240 +5FC0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_8531 +ENCODING 34097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4BC0 +3240 +CA40 +2420 +FBC0 +2240 +7180 +AE60 +ENDCHAR +STARTCHAR U_8532 +ENCODING 34098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8120 +7BC0 +0680 +FA80 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_8533 +ENCODING 34099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2100 +8FE0 +6440 +27C0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8534 +ENCODING 34100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4900 +7FC0 +4900 +5D80 +6B40 +4D20 +8900 +ENDCHAR +STARTCHAR U_8535 +ENCODING 34101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +5100 +7D40 +4540 +7D40 +50A0 +7D60 +8220 +ENDCHAR +STARTCHAR U_8536 +ENCODING 34102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0400 +7FC0 +2880 +2480 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8537 +ENCODING 34103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2480 +1500 +FFE0 +2940 +2F40 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8538 +ENCODING 34104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +EEE0 +8A20 +9E20 +EAE0 +0E00 +1100 +1120 +E1E0 +ENDCHAR +STARTCHAR U_8539 +ENCODING 34105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3900 +45E0 +FA40 +2540 +A940 +4880 +5140 +FA20 +ENDCHAR +STARTCHAR U_853A +ENCODING 34106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +17E0 +4A20 +5220 +5FA0 +7220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_853B +ENCODING 34107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +8120 +79C0 +0100 +FFC0 +2A80 +2920 +4AA0 +87E0 +ENDCHAR +STARTCHAR U_853C +ENCODING 34108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2440 +E7C0 +2440 +2FE0 +2920 +3AA0 +2FA0 +ENDCHAR +STARTCHAR U_853D +ENCODING 34109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +9280 +55E0 +FEA0 +92A0 +9AA0 +B640 +D2A0 +9520 +ENDCHAR +STARTCHAR U_853E +ENCODING 34110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +73E0 +FD20 +3A20 +54C0 +9400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_853F +ENCODING 34111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +2480 +3F00 +2100 +3F80 +2080 +3FC0 +2140 +D4C0 +ENDCHAR +STARTCHAR U_8540 +ENCODING 34112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +2080 +FBE0 +AAA0 +BAE0 +2180 +72C0 +ACA0 +ENDCHAR +STARTCHAR U_8541 +ENCODING 34113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3FC0 +0040 +3FC0 +0040 +7FC0 +1240 +FFE0 +1080 +0B80 +ENDCHAR +STARTCHAR U_8542 +ENCODING 34114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7540 +57C0 +7100 +5FE0 +5540 +7BE0 +5140 +5240 +B4C0 +ENDCHAR +STARTCHAR U_8543 +ENCODING 34115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +1500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2080 +ENDCHAR +STARTCHAR U_8544 +ENCODING 34116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +79E0 +4920 +79E0 +4920 +79E0 +4CA0 +5B60 +6F60 +ENDCHAR +STARTCHAR U_8545 +ENCODING 34117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2940 +9FC0 +6940 +3FE0 +D160 +57A0 +5060 +ENDCHAR +STARTCHAR U_8546 +ENCODING 34118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +FFE0 +A500 +BD20 +A540 +BD40 +A4A0 +BD60 +E620 +ENDCHAR +STARTCHAR U_8547 +ENCODING 34119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8548 +ENCODING 34120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8549 +ENCODING 34121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2400 +7FC0 +A400 +3FC0 +2400 +7FE0 +8920 +ENDCHAR +STARTCHAR U_854A +ENCODING 34122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +5240 +50A0 +8FA0 +2080 +5180 +CB20 +5540 +71C0 +ENDCHAR +STARTCHAR U_854B +ENCODING 34123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2500 +1780 +1400 +7FC0 +1080 +1080 +5AE0 +5280 +FFE0 +ENDCHAR +STARTCHAR U_854C +ENCODING 34124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_854D +ENCODING 34125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4300 +2CC0 +9FA0 +52A0 +3EA0 +D2A0 +5E20 +5660 +ENDCHAR +STARTCHAR U_854E +ENCODING 34126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2080 +5F40 +9120 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_854F +ENCODING 34127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5100 +27A0 +D140 +3FE0 +5440 +9FC0 +1440 +77C0 +ENDCHAR +STARTCHAR U_8550 +ENCODING 34128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +5540 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8551 +ENCODING 34129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A20 +7BE0 +4F20 +79E0 +4F20 +4920 +4F20 +4920 +5360 +ENDCHAR +STARTCHAR U_8552 +ENCODING 34130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8553 +ENCODING 34131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +FFE0 +9520 +2480 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_8554 +ENCODING 34132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +1240 +FEC0 +2A00 +FFE0 +1340 +FE80 +1360 +ENDCHAR +STARTCHAR U_8555 +ENCODING 34133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +AFE0 +4280 +AFE0 +2AA0 +6CE0 +AFE0 +2820 +CFE0 +ENDCHAR +STARTCHAR U_8556 +ENCODING 34134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +AFC0 +5400 +27C0 +E7C0 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8557 +ENCODING 34135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +8E40 +F980 +2240 +BFE0 +A240 +A3C0 +FA40 +ENDCHAR +STARTCHAR U_8558 +ENCODING 34136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2080 +FBC0 +2080 +FFE0 +0900 +1120 +E0E0 +ENDCHAR +STARTCHAR U_8559 +ENCODING 34137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2440 +3FC0 +2440 +FFA0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_855A +ENCODING 34138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +1200 +3F00 +2100 +7F80 +5280 +FFC0 +1000 +3F80 +0080 +0380 +ENDCHAR +STARTCHAR U_855B +ENCODING 34139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7A80 +27E0 +F920 +27E0 +3500 +6FE0 +A520 +2960 +ENDCHAR +STARTCHAR U_855C +ENCODING 34140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_855D +ENCODING 34141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +21C0 +4A40 +F7E0 +4AA0 +FBE0 +5200 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_855E +ENCODING 34142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3F80 +2080 +3F80 +2080 +FFE0 +4A40 +7A40 +4980 +FE60 +ENDCHAR +STARTCHAR U_855F +ENCODING 34143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0100 +7A40 +2980 +2BE0 +FA80 +44C0 +7380 +1100 +36C0 +ENDCHAR +STARTCHAR U_8560 +ENCODING 34144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5240 +33C0 +CA00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8561 +ENCODING 34145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2480 +7FE0 +2040 +3FC0 +2040 +3FC0 +E060 +ENDCHAR +STARTCHAR U_8562 +ENCODING 34146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +F0E0 +ENDCHAR +STARTCHAR U_8563 +ENCODING 34147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +A0A0 +3BE0 +6A80 +33E0 +C080 +ENDCHAR +STARTCHAR U_8564 +ENCODING 34148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +2680 +EBE0 +3480 +5BE0 +B480 +5080 +67E0 +ENDCHAR +STARTCHAR U_8565 +ENCODING 34149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +53E0 +5480 +FFE0 +3480 +57E0 +9480 +37E0 +ENDCHAR +STARTCHAR U_8566 +ENCODING 34150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +4100 +97C0 +2440 +47C0 +9440 +27C0 +CC60 +ENDCHAR +STARTCHAR U_8567 +ENCODING 34151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27E0 +4C40 +A7C0 +6440 +A7C0 +2A40 +3180 +2E60 +ENDCHAR +STARTCHAR U_8568 +ENCODING 34152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9500 +FFE0 +8820 +AA80 +BE80 +8940 +B620 +ENDCHAR +STARTCHAR U_8569 +ENCODING 34153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +9440 +57C0 +2440 +2FE0 +D2A0 +4520 +42C0 +ENDCHAR +STARTCHAR U_856A +ENCODING 34154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +7FE0 +AA80 +2A80 +FFE0 +2A80 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_856B +ENCODING 34155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_856C +ENCODING 34156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +4920 +F3C0 +4920 +FBE0 +5080 +AAC0 +ADA0 +ENDCHAR +STARTCHAR U_856D +ENCODING 34157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0440 +FFE0 +5540 +7FC0 +4440 +B5C0 +9540 +ENDCHAR +STARTCHAR U_856E +ENCODING 34158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +39C0 +2040 +39C0 +2040 +7FE0 +9520 +2AA0 +4A40 +ENDCHAR +STARTCHAR U_856F +ENCODING 34159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0200 +77C0 +5100 +6EE0 +57C0 +5100 +77C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_8570 +ENCODING 34160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4F80 +A880 +4F80 +4880 +3FC0 +D540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_8571 +ENCODING 34161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1520 +F340 +27E0 +FC20 +27E0 +3420 +6FE0 +A420 +2460 +ENDCHAR +STARTCHAR U_8572 +ENCODING 34162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5480 +29E0 +7D00 +5500 +7DE0 +5540 +FF40 +1240 +1440 +ENDCHAR +STARTCHAR U_8573 +ENCODING 34163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7FC0 +5140 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8574 +ENCODING 34164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +5440 +E7C0 +2440 +4FE0 +EAA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_8575 +ENCODING 34165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +4540 +7FE0 +5440 +B7C0 +1440 +27E0 +44C0 +8620 +ENDCHAR +STARTCHAR U_8576 +ENCODING 34166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +94A0 +2440 +1B00 +E0E0 +3F80 +0900 +0600 +ENDCHAR +STARTCHAR U_8577 +ENCODING 34167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +5100 +23C0 +FA40 +2BC0 +2240 +23C0 +6E60 +ENDCHAR +STARTCHAR U_8578 +ENCODING 34168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2EE0 +0A20 +EEE0 +2800 +2EE0 +2840 +58A0 +8FE0 +ENDCHAR +STARTCHAR U_8579 +ENCODING 34169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2500 +5480 +EFE0 +5480 +F7E0 +2480 +47E0 +ENDCHAR +STARTCHAR U_857A +ENCODING 34170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4920 +FDE0 +4B20 +7940 +48A0 +FD60 +0A20 +ENDCHAR +STARTCHAR U_857B +ENCODING 34171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4140 +7BE0 +4140 +F940 +27E0 +5140 +EE20 +ENDCHAR +STARTCHAR U_857C +ENCODING 34172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +40A0 +7BE0 +40A0 +FFE0 +2080 +4FE0 +F880 +ENDCHAR +STARTCHAR U_857D +ENCODING 34173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3F80 +2A80 +2A80 +7FC0 +4000 +7FC0 +5280 +99E0 +ENDCHAR +STARTCHAR U_857E +ENCODING 34174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +0400 +FFE0 +94A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_857F +ENCODING 34175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +2F80 +B500 +AFC0 +A200 +2FC0 +2280 +5500 +8AC0 +ENDCHAR +STARTCHAR U_8580 +ENCODING 34176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +27C0 +9540 +66C0 +2440 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8581 +ENCODING 34177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5540 +7FC0 +4E40 +5540 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8582 +ENCODING 34178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +7D00 +45E0 +7EA0 +44A0 +FEA0 +2440 +24A0 +D920 +ENDCHAR +STARTCHAR U_8583 +ENCODING 34179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2FE0 +9440 +67C0 +2000 +DFE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_8584 +ENCODING 34180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9280 +5FC0 +9240 +7FC0 +3240 +D280 +7FE0 +4880 +4180 +ENDCHAR +STARTCHAR U_8585 +ENCODING 34181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +E800 +4FE0 +AAA0 +AB40 +6FE0 +6A80 +9180 +ENDCHAR +STARTCHAR U_8586 +ENCODING 34182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +B4A0 +1F80 +3100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_8587 +ENCODING 34183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0900 +6A80 +BE80 +42E0 +DF40 +4140 +5C80 +5540 +6220 +ENDCHAR +STARTCHAR U_8588 +ENCODING 34184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1B00 +64C0 +FFE0 +5540 +7FC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8589 +ENCODING 34185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1780 +2400 +FFE0 +0100 +7FE0 +4940 +5AA0 +6D60 +9620 +ENDCHAR +STARTCHAR U_858A +ENCODING 34186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3820 +7EA0 +AAA0 +3EA0 +2AA0 +7EA0 +6A20 +9560 +ENDCHAR +STARTCHAR U_858B +ENCODING 34187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +C7E0 +2A20 +C580 +68C0 +3FA0 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_858C +ENCODING 34188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +5EE0 +52A0 +FEC0 +52A0 +5EA0 +F4E0 +5680 +9A80 +ENDCHAR +STARTCHAR U_858D +ENCODING 34189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FA80 +5480 +7E80 +1480 +FE80 +AAA0 +92A0 +EEE0 +ENDCHAR +STARTCHAR U_858E +ENCODING 34190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5140 +FFE0 +92A0 +63C0 +AE40 +21A0 +2EE0 +ENDCHAR +STARTCHAR U_858F +ENCODING 34191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_8590 +ENCODING 34192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +2100 +FFE0 +2440 +73E0 +AE40 +2180 +2E60 +ENDCHAR +STARTCHAR U_8591 +ENCODING 34193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +2480 +FFE0 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_8592 +ENCODING 34194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53C0 +7880 +9340 +2C80 +D500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8593 +ENCODING 34195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +4780 +2080 +9FE0 +5120 +0FC0 +4540 +C7C0 +4280 +4FC0 +ENDCHAR +STARTCHAR U_8594 +ENCODING 34196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +5540 +FFE0 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8595 +ENCODING 34197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1500 +3FE0 +2540 +3FE0 +2540 +3FC0 +2D80 +5540 +A520 +ENDCHAR +STARTCHAR U_8596 +ENCODING 34198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4F80 +2880 +CE80 +5FC0 +5540 +5740 +B040 +9FE0 +ENDCHAR +STARTCHAR U_8597 +ENCODING 34199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +5F40 +4440 +7FC0 +4940 +5E40 +4940 +7FC0 +ENDCHAR +STARTCHAR U_8598 +ENCODING 34200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +97C0 +4100 +0FC0 +E480 +2FE0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8599 +ENCODING 34201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4280 +FFE0 +A480 +FFE0 +2480 +27E0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_859A +ENCODING 34202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1440 +F7C0 +4440 +7FE0 +9400 +D7E0 +2AA0 +4520 +8AC0 +ENDCHAR +STARTCHAR U_859B +ENCODING 34203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +F7C0 +9280 +FFE0 +8100 +F7E0 +9100 +F100 +ENDCHAR +STARTCHAR U_859C +ENCODING 34204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +4540 +7C80 +43E0 +7C80 +67E0 +A480 +BC80 +ENDCHAR +STARTCHAR U_859D +ENCODING 34205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +D480 +6240 +5FC0 +4000 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_859E +ENCODING 34206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +4540 +7FE0 +5440 +D7E0 +2540 +4480 +8660 +ENDCHAR +STARTCHAR U_859F +ENCODING 34207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3180 +CE60 +7BC0 +4A40 +7BC0 +2080 +DB60 +ENDCHAR +STARTCHAR U_85A0 +ENCODING 34208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2900 +B7C0 +A440 +27C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_85A1 +ENCODING 34209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5F40 +5140 +5F40 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_85A2 +ENCODING 34210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77E0 +9120 +FE60 +AA80 +FBE0 +AC80 +FFE0 +A880 +ENDCHAR +STARTCHAR U_85A3 +ENCODING 34211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +1080 +FFE0 +4940 +7940 +5080 +2140 +FA20 +ENDCHAR +STARTCHAR U_85A4 +ENCODING 34212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F280 +4EE0 +7280 +9EE0 +5280 +2EE0 +4280 +9FE0 +ENDCHAR +STARTCHAR U_85A5 +ENCODING 34213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FE0 +2420 +5F20 +9520 +1FA0 +3CE0 +ENDCHAR +STARTCHAR U_85A6 +ENCODING 34214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4A40 +7FC0 +4A40 +5FE0 +5000 +5FE0 +AAA0 +ENDCHAR +STARTCHAR U_85A7 +ENCODING 34215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +A220 +3A80 +6B20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_85A8 +ENCODING 34216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +FFE0 +A220 +3A40 +6B80 +1A20 +F1E0 +ENDCHAR +STARTCHAR U_85A9 +ENCODING 34217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +A280 +CFE0 +ABE0 +AD00 +CBC0 +9100 +AFE0 +ENDCHAR +STARTCHAR U_85AA +ENCODING 34218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FDE0 +2900 +FFE0 +1140 +FD40 +5940 +9540 +3240 +ENDCHAR +STARTCHAR U_85AB +ENCODING 34219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +3F80 +0400 +FFE0 +2480 +7FC0 +0400 +FFE0 +4A40 +ENDCHAR +STARTCHAR U_85AC +ENCODING 34220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1480 +4E40 +3B80 +2E80 +4A40 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_85AD +ENCODING 34221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +F7C0 +2540 +FFC0 +2540 +77C0 +A900 +3FE0 +2100 +ENDCHAR +STARTCHAR U_85AE +ENCODING 34222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +3900 +FDE0 +3A20 +5540 +FD40 +2880 +1140 +EE20 +ENDCHAR +STARTCHAR U_85AF +ENCODING 34223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4A40 +7FC0 +0480 +FFE0 +0840 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_85B0 +ENCODING 34224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +8920 +ENDCHAR +STARTCHAR U_85B1 +ENCODING 34225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5440 +FFE0 +2840 +FE40 +1140 +7D40 +1040 +FDC0 +ENDCHAR +STARTCHAR U_85B2 +ENCODING 34226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1080 +7FE0 +4AA0 +1300 +1F80 +7080 +1680 +1080 +1F80 +30C0 +ENDCHAR +STARTCHAR U_85B3 +ENCODING 34227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +4F80 +2200 +1FE0 +E480 +27A0 +2AC0 +5260 +8FE0 +ENDCHAR +STARTCHAR U_85B4 +ENCODING 34228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9420 +52C0 +BFA0 +2A80 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_85B5 +ENCODING 34229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0400 +FFE0 +04A0 +7FC0 +5480 +7280 +0100 +ENDCHAR +STARTCHAR U_85B6 +ENCODING 34230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +DD40 +27C0 +D540 +5FE0 +B100 +5100 +B7E0 +ENDCHAR +STARTCHAR U_85B7 +ENCODING 34231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +5140 +FFE0 +0800 +7FE0 +4920 +4960 +ENDCHAR +STARTCHAR U_85B8 +ENCODING 34232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4100 +3FE0 +8AA0 +5AA0 +2FE0 +2000 +CFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_85B9 +ENCODING 34233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0400 +7FC0 +2080 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_85BA +ENCODING 34234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +5B40 +5520 +A480 +3F80 +2080 +3F80 +C080 +ENDCHAR +STARTCHAR U_85BB +ENCODING 34235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +27C0 +8540 +57C0 +1540 +27C0 +E100 +4FE0 +4540 +ENDCHAR +STARTCHAR U_85BC +ENCODING 34236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4A80 +7F80 +59C0 +5500 +5FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_85BD +ENCODING 34237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FDE0 +2880 +FFE0 +A920 +FFA0 +1160 +7D20 +11A0 +FD20 +ENDCHAR +STARTCHAR U_85BE +ENCODING 34238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +2440 +FFE0 +6EC0 +5540 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_85BF +ENCODING 34239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +73E0 +4540 +7FE0 +90A0 +FE80 +22E0 +5280 +8DE0 +ENDCHAR +STARTCHAR U_85C0 +ENCODING 34240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5AC0 +5280 +2940 +FFE0 +94A0 +2500 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_85C1 +ENCODING 34241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1100 +7FC0 +5140 +5F40 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85C2 +ENCODING 34242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +4940 +7880 +4B40 +FC20 +2680 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85C3 +ENCODING 34243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FF00 +29E0 +FE20 +8280 +BA80 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_85C4 +ENCODING 34244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +FFE0 +4A40 +94A0 +7F80 +2500 +CCE0 +ENDCHAR +STARTCHAR U_85C5 +ENCODING 34245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +1020 +FF20 +3920 +7D20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_85C6 +ENCODING 34246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +7FC0 +1500 +EEE0 +0400 +7FC0 +0C00 +ENDCHAR +STARTCHAR U_85C7 +ENCODING 34247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +4840 +6EC0 +4A40 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_85C8 +ENCODING 34248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +E680 +AAA0 +E440 +ABA0 +E100 +AFE0 +E280 +1C60 +ENDCHAR +STARTCHAR U_85C9 +ENCODING 34249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2140 +FFE0 +2240 +FBC0 +6A40 +A7C0 +2240 +ENDCHAR +STARTCHAR U_85CA +ENCODING 34250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +77C0 +2440 +FFC0 +3400 +67E0 +A6A0 +2BE0 +2AA0 +ENDCHAR +STARTCHAR U_85CB +ENCODING 34251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFC0 +4A40 +39C0 +4A40 +3FC0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_85CC +ENCODING 34252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +5240 +EFC0 +3F80 +D480 +1F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_85CD +ENCODING 34253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +F9E0 +8A80 +FC40 +9000 +FFC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_85CE +ENCODING 34254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +3FC0 +0440 +FFE0 +0440 +7FE0 +4920 +3FC0 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_85CF +ENCODING 34255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +BFE0 +AA80 +EFA0 +28A0 +EFC0 +AAA0 +AFA0 +4160 +ENDCHAR +STARTCHAR U_85D0 +ENCODING 34256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +AC40 +57C0 +E440 +57C0 +B2A0 +52A0 +B460 +ENDCHAR +STARTCHAR U_85D1 +ENCODING 34257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4940 +7FC0 +2480 +3F80 +1880 +2700 +F8E0 +ENDCHAR +STARTCHAR U_85D2 +ENCODING 34258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +F7C0 +2440 +FFC0 +2240 +77E0 +ACA0 +2560 +27A0 +ENDCHAR +STARTCHAR U_85D3 +ENCODING 34259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1120 +7140 +7FC0 +D480 +7FC0 +5480 +7FE0 +0080 +FC80 +ENDCHAR +STARTCHAR U_85D4 +ENCODING 34260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8420 +7FE0 +34C0 +D2A0 +1F80 +1280 +6E60 +ENDCHAR +STARTCHAR U_85D5 +ENCODING 34261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +22A0 +73E0 +22A0 +FFE0 +24A0 +77E0 +AC60 +ENDCHAR +STARTCHAR U_85D6 +ENCODING 34262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +5680 +7900 +56E0 +7F80 +2A80 +3F80 +60C0 +ENDCHAR +STARTCHAR U_85D7 +ENCODING 34263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +9F80 +44E0 +1FC0 +D540 +5F40 +4EA0 +5520 +BFE0 +ENDCHAR +STARTCHAR U_85D8 +ENCODING 34264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +8420 +BF80 +8420 +BFE0 +A440 +BFC0 +AAA0 +CFA0 +ENDCHAR +STARTCHAR U_85D9 +ENCODING 34265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FB80 +52E0 +FC00 +ABC0 +5240 +3D80 +D240 +3420 +ENDCHAR +STARTCHAR U_85DA +ENCODING 34266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_85DB +ENCODING 34267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +A0A0 +3B80 +2080 +3FE0 +5520 +2AA0 +4AC0 +ENDCHAR +STARTCHAR U_85DC +ENCODING 34268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +79E0 +12A0 +FCA0 +5660 +8900 +3580 +C660 +1D00 +E4E0 +ENDCHAR +STARTCHAR U_85DD +ENCODING 34269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFC0 +5140 +F940 +22A0 +FFC0 +0000 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_85DE +ENCODING 34270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +3080 +DF80 +1080 +FFE0 +4B20 +FDE0 +4920 +ENDCHAR +STARTCHAR U_85DF +ENCODING 34271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_85E0 +ENCODING 34272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +3F80 +4080 +FBE0 +CB20 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_85E1 +ENCODING 34273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +9FE0 +4480 +1FE0 +E920 +2FE0 +2920 +2BA0 +7AA0 +8FE0 +ENDCHAR +STARTCHAR U_85E2 +ENCODING 34274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +2A80 +5FE0 +94A0 +6FA0 +A4A0 +3F40 +24A0 +3F20 +ENDCHAR +STARTCHAR U_85E3 +ENCODING 34275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4A40 +7FC0 +2A40 +FEA0 +4BE0 +7A40 +4B80 +7A20 +4BE0 +ENDCHAR +STARTCHAR U_85E4 +ENCODING 34276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +F280 +9FE0 +F200 +9FE0 +F540 +9B60 +9580 +B960 +ENDCHAR +STARTCHAR U_85E5 +ENCODING 34277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +AAA0 +4E40 +AAA0 +EEE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85E6 +ENCODING 34278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +9080 +FFE0 +BAC0 +D4A0 +BF80 +8200 +FFE0 +8E00 +ENDCHAR +STARTCHAR U_85E7 +ENCODING 34279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A00 +27E0 +5540 +77C0 +2100 +5FE0 +7640 +5980 +9660 +ENDCHAR +STARTCHAR U_85E8 +ENCODING 34280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9240 +FFC0 +A200 +BBC0 +A220 +BDE0 +A4A0 +ENDCHAR +STARTCHAR U_85E9 +ENCODING 34281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4B20 +2540 +1FE0 +6540 +2FE0 +D940 +4FC0 +4940 +4FC0 +ENDCHAR +STARTCHAR U_85EA +ENCODING 34282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +54E0 +FFA0 +54A0 +FEA0 +2440 +38A0 +C720 +ENDCHAR +STARTCHAR U_85EB +ENCODING 34283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9480 +5FE0 +14A0 +9FE0 +6840 +2FC0 +C840 +5FE0 +4200 +ENDCHAR +STARTCHAR U_85EC +ENCODING 34284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +F7C0 +A540 +CFE0 +A440 +97C0 +D440 +A7C0 +8C60 +ENDCHAR +STARTCHAR U_85ED +ENCODING 34285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +A0A0 +7BC0 +C8A0 +7B80 +4A00 +FBC0 +2840 +C980 +ENDCHAR +STARTCHAR U_85EE +ENCODING 34286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27E0 +FC80 +27C0 +7480 +6FC0 +A480 +27E0 +2AA0 +ENDCHAR +STARTCHAR U_85EF +ENCODING 34287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7C40 +47E0 +7D40 +ACC0 +5AC0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_85F0 +ENCODING 34288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +CE20 +AAA0 +D2A0 +6EA0 +12A0 +FEA0 +5420 +FEE0 +ENDCHAR +STARTCHAR U_85F1 +ENCODING 34289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +BFE0 +6A80 +2F80 +6A80 +AFC0 +26A0 +4A60 +B3E0 +ENDCHAR +STARTCHAR U_85F2 +ENCODING 34290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +F800 +29C0 +3940 +6BE0 +AAA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_85F3 +ENCODING 34291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0A00 +7FC0 +5F40 +0400 +FFE0 +1500 +E4C0 +ENDCHAR +STARTCHAR U_85F4 +ENCODING 34292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3100 +47C0 +9540 +E7C0 +5000 +EFE0 +0AA0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_85F5 +ENCODING 34293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +17C0 +2440 +7FE0 +A540 +2920 +7FE0 +2940 +CCE0 +ENDCHAR +STARTCHAR U_85F6 +ENCODING 34294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +83C0 +9200 +FFE0 +ENDCHAR +STARTCHAR U_85F7 +ENCODING 34295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1120 +F7A0 +0140 +FFE0 +0240 +F7C0 +9A40 +F3C0 +9240 +ENDCHAR +STARTCHAR U_85F8 +ENCODING 34296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFA0 +4940 +B7E0 +6240 +B7C0 +6A40 +A3C0 +6240 +ENDCHAR +STARTCHAR U_85F9 +ENCODING 34297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +F7C0 +0440 +F7C0 +0240 +FFE0 +94A0 +F560 +97A0 +ENDCHAR +STARTCHAR U_85FA +ENCODING 34298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4920 +79E0 +4920 +7BE0 +5FA0 +5220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_85FB +ENCODING 34299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +9440 +6FE0 +2AA0 +3FE0 +C540 +4520 +5920 +ENDCHAR +STARTCHAR U_85FC +ENCODING 34300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FFE0 +8420 +3F80 +0400 +3F80 +2A80 +3F80 +5540 +8F20 +ENDCHAR +STARTCHAR U_85FD +ENCODING 34301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FBE0 +5220 +FFA0 +22E0 +FE20 +73E0 +A940 +6660 +ENDCHAR +STARTCHAR U_85FE +ENCODING 34302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F9C0 +2240 +FBE0 +AA20 +FBE0 +7220 +ABE0 +2620 +ENDCHAR +STARTCHAR U_85FF +ENCODING 34303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +1480 +FFE0 +94A0 +3FC0 +6400 +BFC0 +2400 +3FE0 +ENDCHAR +STARTCHAR U_8600 +ENCODING 34304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +FAA0 +2FE0 +3100 +E7C0 +2280 +2FE0 +6100 +ENDCHAR +STARTCHAR U_8601 +ENCODING 34305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5540 +5540 +FFE0 +0400 +75C0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_8602 +ENCODING 34306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FE0 +0A00 +5540 +8F20 +26A0 +BBE0 +0400 +FFE0 +1480 +6460 +ENDCHAR +STARTCHAR U_8603 +ENCODING 34307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1080 +5AE0 +5280 +FFE0 +0400 +FFE0 +3500 +C4E0 +ENDCHAR +STARTCHAR U_8604 +ENCODING 34308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +AB00 +FFE0 +5540 +7D40 +5540 +FF40 +1240 +ENDCHAR +STARTCHAR U_8605 +ENCODING 34309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4EE0 +9200 +75E0 +5F40 +D540 +7FC0 +4A40 +71C0 +ENDCHAR +STARTCHAR U_8606 +ENCODING 34310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4420 +5FE0 +4A80 +5FC0 +5540 +9540 +FFE0 +ENDCHAR +STARTCHAR U_8607 +ENCODING 34311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +73C0 +7C80 +D7E0 +7C80 +55C0 +7EA0 +5480 +AA80 +ENDCHAR +STARTCHAR U_8608 +ENCODING 34312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BE0 +2080 +FBE0 +7220 +AAA0 +73E0 +5940 +9220 +ENDCHAR +STARTCHAR U_8609 +ENCODING 34313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +4A40 +FFE0 +A0A0 +4780 +C080 +5FC0 +5540 +4700 +58C0 +ENDCHAR +STARTCHAR U_860A +ENCODING 34314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +47C0 +5540 +E5C0 +4640 +FFE0 +0AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_860B +ENCODING 34315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53E0 +5D00 +53E0 +FE20 +53E0 +9A20 +13E0 +E620 +ENDCHAR +STARTCHAR U_860C +ENCODING 34316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +AFE0 +44A0 +D6E0 +5F80 +4000 +FFE0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_860D +ENCODING 34317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +1080 +FDE0 +54A0 +7CA0 +10A0 +FD20 +AA40 +ENDCHAR +STARTCHAR U_860E +ENCODING 34318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +9540 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +89E0 +ENDCHAR +STARTCHAR U_860F +ENCODING 34319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +43E0 +7900 +43E0 +7A20 +02A0 +FBE0 +7140 +AA20 +ENDCHAR +STARTCHAR U_8610 +ENCODING 34320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +F540 +0FE0 +F200 +0FE0 +F540 +9480 +F960 +ENDCHAR +STARTCHAR U_8611 +ENCODING 34321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0A80 +7FE0 +4880 +7FE0 +6AA0 +7FE0 +4840 +7840 +8FC0 +ENDCHAR +STARTCHAR U_8612 +ENCODING 34322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77C0 +2880 +FFC0 +3540 +6FC0 +6540 +A7E0 +21E0 +ENDCHAR +STARTCHAR U_8613 +ENCODING 34323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2480 +FFC0 +3540 +6FC0 +6540 +A7C0 +2AA0 +ENDCHAR +STARTCHAR U_8614 +ENCODING 34324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F3E0 +8900 +7BE0 +0220 +FAA0 +23E0 +FD40 +AA20 +ENDCHAR +STARTCHAR U_8615 +ENCODING 34325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +29E0 +5340 +FC80 +2760 +5480 +F7E0 +0480 +ABE0 +ENDCHAR +STARTCHAR U_8616 +ENCODING 34326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +F7E0 +9280 +FFE0 +8900 +FFE0 +0500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8617 +ENCODING 34327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7BE0 +4940 +7FE0 +C480 +7FE0 +0480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8618 +ENCODING 34328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +7BC0 +1100 +FFE0 +3120 +5540 +98E0 +ENDCHAR +STARTCHAR U_8619 +ENCODING 34329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9380 +FAE0 +9340 +FC80 +AB60 +FFC0 +4A40 +39C0 +5AC0 +ENDCHAR +STARTCHAR U_861A +ENCODING 34330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7080 +FFE0 +5480 +7FC0 +5480 +7FE0 +5480 +AA80 +ENDCHAR +STARTCHAR U_861B +ENCODING 34331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53E0 +F940 +53E0 +7220 +53E0 +FE20 +ABE0 +FE60 +ENDCHAR +STARTCHAR U_861C +ENCODING 34332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +FFE0 +5160 +FDA0 +AB20 +FFE0 +21A0 +FB60 +2540 +ENDCHAR +STARTCHAR U_861D +ENCODING 34333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +29E0 +D640 +0080 +EE80 +AA80 +EE80 +4540 +AA20 +ENDCHAR +STARTCHAR U_861E +ENCODING 34334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6D00 +B9E0 +0340 +FD40 +9580 +FC80 +4940 +B620 +ENDCHAR +STARTCHAR U_861F +ENCODING 34335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +A540 +CFE0 +A040 +AFE0 +E540 +8CA0 +97A0 +ENDCHAR +STARTCHAR U_8620 +ENCODING 34336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +AFE0 +A540 +EBA0 +3FE0 +EAA0 +ABA0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_8621 +ENCODING 34337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_8622 +ENCODING 34338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FDE0 +2BC0 +FC40 +45C0 +7D00 +45C0 +7D20 +4DE0 +ENDCHAR +STARTCHAR U_8623 +ENCODING 34339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7C80 +2BE0 +FE80 +5480 +7FE0 +5480 +7C80 +C7E0 +ENDCHAR +STARTCHAR U_8624 +ENCODING 34340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +EA40 +A580 +AFC0 +E240 +AFE0 +B560 +EAA0 +ENDCHAR +STARTCHAR U_8625 +ENCODING 34341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +4040 +F7E0 +5540 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_8626 +ENCODING 34342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9520 +2480 +EEE0 +AAA0 +AAA0 +EEE0 +AAA0 +ENDCHAR +STARTCHAR U_8627 +ENCODING 34343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +8200 +4FE0 +0A20 +EFE0 +2A20 +2DC0 +32A0 +65A0 +9FE0 +ENDCHAR +STARTCHAR U_8628 +ENCODING 34344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5100 +FBC0 +2080 +FBE0 +2080 +AAA0 +F900 +ENDCHAR +STARTCHAR U_8629 +ENCODING 34345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +FD00 +55E0 +7F20 +54C0 +7D20 +1200 +3FE0 +1280 +EE60 +ENDCHAR +STARTCHAR U_862A +ENCODING 34346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFC0 +9240 +FFC0 +A9A0 +BBE0 +9500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_862B +ENCODING 34347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9E80 +54E0 +9E80 +54C0 +1520 +DFC0 +9540 +BFE0 +ENDCHAR +STARTCHAR U_862C +ENCODING 34348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +F7C0 +9040 +FFC0 +8840 +FFE0 +2520 +BFC0 +A540 +FDC0 +ENDCHAR +STARTCHAR U_862D +ENCODING 34349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +8A20 +FBE0 +FFE0 +AAA0 +BFA0 +9520 +A4E0 +ENDCHAR +STARTCHAR U_862E +ENCODING 34350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4940 +FFE0 +B440 +D940 +A540 +B540 +D940 +A4C0 +ENDCHAR +STARTCHAR U_862F +ENCODING 34351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1100 +57C0 +2540 +8FE0 +1520 +4AE0 +BF80 +2A80 +7FE0 +ENDCHAR +STARTCHAR U_8630 +ENCODING 34352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +4540 +EFE0 +4AA0 +FFE0 +0440 +AB80 +8C60 +ENDCHAR +STARTCHAR U_8631 +ENCODING 34353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +A100 +6BE0 +FC80 +23E0 +7220 +ABE0 +FE20 +53E0 +8E60 +ENDCHAR +STARTCHAR U_8632 +ENCODING 34354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8633 +ENCODING 34355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC80 +53E0 +FC80 +ABE0 +F880 +ABE0 +F880 +CFE0 +ENDCHAR +STARTCHAR U_8634 +ENCODING 34356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8635 +ENCODING 34357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +F4C0 +BFA0 +EA80 +BFE0 +EAA0 +AEC0 +AA80 +FF60 +2220 +ENDCHAR +STARTCHAR U_8636 +ENCODING 34358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0880 +73E0 +12A0 +FFE0 +5AA0 +97E0 +FCA0 +29C0 +1AA0 +64E0 +ENDCHAR +STARTCHAR U_8637 +ENCODING 34359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +24A0 +BEE0 +AA80 +FFE0 +2900 +C600 +39E0 +ENDCHAR +STARTCHAR U_8638 +ENCODING 34360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FDE0 +2940 +FDE0 +AF40 +EDE0 +8540 +FDE0 +5240 +8920 +ENDCHAR +STARTCHAR U_8639 +ENCODING 34361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +BAA0 +AFE0 +A380 +2540 +3D20 +28C0 +2E60 +ENDCHAR +STARTCHAR U_863A +ENCODING 34362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FA80 +DBE0 +AA80 +FBE0 +2280 +FBE0 +CA80 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_863B +ENCODING 34363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FDC0 +A940 +FBE0 +AA40 +FD80 +AA60 +FFC0 +2520 +CCE0 +ENDCHAR +STARTCHAR U_863C +ENCODING 34364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +BDE0 +8500 +FDE0 +8500 +ENDCHAR +STARTCHAR U_863D +ENCODING 34365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +7FC0 +56C0 +6D40 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_863E +ENCODING 34366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2AA0 +FFE0 +2380 +2C60 +3940 +CE80 +0860 +ENDCHAR +STARTCHAR U_863F +ENCODING 34367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +2A80 +57E0 +FA80 +43E0 +FA80 +ABE0 +ENDCHAR +STARTCHAR U_8640 +ENCODING 34368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +5A80 +5540 +A520 +FBE0 +0A00 +FBE0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8641 +ENCODING 34369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +24A0 +BEE0 +EA80 +3FE0 +D100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_8642 +ENCODING 34370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +FFE0 +D4A0 +7300 +B7C0 +ACA0 +F780 +ENDCHAR +STARTCHAR U_8643 +ENCODING 34371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +8AC0 +55A0 +3FE0 +8A80 +7BA0 +2AA0 +DB40 +4A60 +5F20 +ENDCHAR +STARTCHAR U_8644 +ENCODING 34372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FE80 +AB80 +AD60 +F900 +27C0 +3900 +EFE0 +ENDCHAR +STARTCHAR U_8645 +ENCODING 34373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +77C0 +5280 +77C0 +5AA0 +73C0 +5280 +53E0 +9AA0 +ENDCHAR +STARTCHAR U_8646 +ENCODING 34374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +1480 +FFC0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8647 +ENCODING 34375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +17E0 +E240 +2FE0 +EAA0 +87E0 +EC80 +37E0 +2480 +C7E0 +ENDCHAR +STARTCHAR U_8648 +ENCODING 34376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +A4A0 +EEE0 +0A00 +EEE0 +AAA0 +EEE0 +1B00 +ENDCHAR +STARTCHAR U_8649 +ENCODING 34377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1280 +FBC0 +5240 +73C0 +0240 +FBE0 +AA00 +FFE0 +AAA0 +ENDCHAR +STARTCHAR U_864A +ENCODING 34378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1200 +4480 +AD40 +E1C0 +4C80 +A140 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_864B +ENCODING 34379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +52C0 +5240 +FFE0 +AAA0 +2A80 +3580 +7F80 +9160 +6700 +ENDCHAR +STARTCHAR U_864C +ENCODING 34380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +ABE0 +FD40 +A880 +FBE0 +8A40 +FBC0 +8BC0 +FA20 +0FE0 +ENDCHAR +STARTCHAR U_864D +ENCODING 34381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +7FE0 +4440 +4780 +7C40 +47C0 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_864E +ENCODING 34382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4840 +7F80 +4820 +4FE0 +4000 +4F00 +4920 +B0E0 +ENDCHAR +STARTCHAR U_864F +ENCODING 34383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4840 +7F80 +4820 +4FE0 +4400 +5FC0 +8440 +B980 +ENDCHAR +STARTCHAR U_8650 +ENCODING 34384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +4FE0 +4800 +7FE0 +4800 +8FC0 +ENDCHAR +STARTCHAR U_8651 +ENCODING 34385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +47E0 +4A00 +5940 +A8A0 +87A0 +ENDCHAR +STARTCHAR U_8652 +ENCODING 34386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +7F80 +4200 +5FE0 +5220 +5F80 +5220 +57E0 +9480 +A4A0 +D8E0 +ENDCHAR +STARTCHAR U_8653 +ENCODING 34387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +F7E0 +5520 +57C0 +5500 +5520 +5DE0 +5540 +4540 +8A60 +ENDCHAR +STARTCHAR U_8654 +ENCODING 34388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4500 +5E20 +43E0 +4200 +7FE0 +4480 +4300 +BCE0 +ENDCHAR +STARTCHAR U_8655 +ENCODING 34389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4540 +5E20 +57E0 +5C00 +55C0 +7560 +4E00 +B1E0 +ENDCHAR +STARTCHAR U_8656 +ENCODING 34390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +5FE0 +4A80 +7FE0 +4200 +8E00 +ENDCHAR +STARTCHAR U_8657 +ENCODING 34391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4440 +5F80 +4440 +4FC0 +4800 +4FC0 +4880 +BFE0 +ENDCHAR +STARTCHAR U_8658 +ENCODING 34392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4400 +7F80 +4420 +5FC0 +5080 +5480 +5280 +BFE0 +ENDCHAR +STARTCHAR U_8659 +ENCODING 34393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7FC0 +4420 +47E0 +5900 +6A40 +8C20 +B7C0 +ENDCHAR +STARTCHAR U_865A +ENCODING 34394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7F80 +4420 +47E0 +6940 +5980 +8900 +FFE0 +ENDCHAR +STARTCHAR U_865B +ENCODING 34395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +7F80 +4420 +57E0 +5540 +5DC0 +8500 +FFE0 +ENDCHAR +STARTCHAR U_865C +ENCODING 34396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FE0 +5240 +7FE0 +5240 +7FE0 +4420 +B9C0 +ENDCHAR +STARTCHAR U_865D +ENCODING 34397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +7DE0 +5AA0 +7560 +5D60 +42A0 +5CA0 +5520 +9440 +A7E0 +ENDCHAR +STARTCHAR U_865E +ENCODING 34398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4820 +5FE0 +6880 +7FC0 +4240 +7FE0 +4500 +B8E0 +ENDCHAR +STARTCHAR U_865F +ENCODING 34399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +F7E0 +0520 +FFC0 +4520 +F5E0 +1400 +1780 +9AA0 +64E0 +ENDCHAR +STARTCHAR U_8660 +ENCODING 34400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +5500 +8FC0 +5520 +55E0 +2400 +55C0 +4540 +8A60 +ENDCHAR +STARTCHAR U_8661 +ENCODING 34401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4440 +5FE0 +5540 +4D80 +4500 +7FE0 +4500 +B8E0 +ENDCHAR +STARTCHAR U_8662 +ENCODING 34402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F100 +4FE0 +B520 +57C0 +FD20 +15E0 +9400 +55C0 +1940 +6260 +ENDCHAR +STARTCHAR U_8663 +ENCODING 34403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +EC80 +0BE0 +FEA0 +2BE0 +AAA0 +BAE0 +AE00 +ABC0 +F540 +0A60 +ENDCHAR +STARTCHAR U_8664 +ENCODING 34404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38E0 +2080 +FBE0 +AAA0 +F3C0 +AAA0 +BAE0 +8200 +F3C0 +D540 +9A60 +ENDCHAR +STARTCHAR U_8665 +ENCODING 34405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A40 +23E0 +FE80 +A9A0 +F260 +AE80 +BA40 +87E0 +F280 +D1A0 +9E60 +ENDCHAR +STARTCHAR U_8666 +ENCODING 34406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +61C0 +5100 +FFE0 +5500 +27C0 +5520 +ADE0 +F400 +2DC0 +3540 +DE60 +ENDCHAR +STARTCHAR U_8667 +ENCODING 34407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +11E0 +FE00 +9200 +FFE0 +A880 +FEE0 +A820 +BE20 +A920 +BEC0 +ENDCHAR +STARTCHAR U_8668 +ENCODING 34408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1E40 +1080 +7E00 +5260 +7E40 +5480 +7E20 +5420 +BF40 +D580 +ENDCHAR +STARTCHAR U_8669 +ENCODING 34409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8E0 +7080 +23E0 +FAA0 +8BC0 +FAA0 +8AE0 +FA00 +75C0 +AD40 +6260 +ENDCHAR +STARTCHAR U_866A +ENCODING 34410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +2B20 +FEC0 +AB20 +FBE0 +AAA0 +BBE0 +8A80 +FBE0 +D940 +9AA0 +ENDCHAR +STARTCHAR U_866B +ENCODING 34411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +0400 +0480 +0440 +07E0 +F820 +ENDCHAR +STARTCHAR U_866C +ENCODING 34412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +AA00 +AA00 +AA00 +FA00 +2200 +2A20 +3A20 +C5E0 +ENDCHAR +STARTCHAR U_866D +ENCODING 34413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +A920 +A920 +A920 +F920 +2120 +2A20 +3CA0 +E840 +ENDCHAR +STARTCHAR U_866E +ENCODING 34414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +FA80 +AA80 +AA80 +AA80 +FA80 +2280 +2AA0 +3AA0 +EC60 +ENDCHAR +STARTCHAR U_866F +ENCODING 34415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2220 +FA20 +AA20 +AA20 +AA20 +FAE0 +2320 +2A20 +3820 +E820 +ENDCHAR +STARTCHAR U_8670 +ENCODING 34416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +A880 +A880 +A880 +F880 +2080 +2C80 +3A80 +E900 +ENDCHAR +STARTCHAR U_8671 +ENCODING 34417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +0080 +0C80 +F080 +1080 +FE80 +9280 +FEA0 +10A0 +1260 +FD20 +ENDCHAR +STARTCHAR U_8672 +ENCODING 34418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +5580 +5540 +7D60 +5140 +1500 +1D00 +F500 +0100 +ENDCHAR +STARTCHAR U_8673 +ENCODING 34419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AC20 +A820 +AA20 +F920 +2120 +2820 +3920 +E8C0 +ENDCHAR +STARTCHAR U_8674 +ENCODING 34420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +A900 +A900 +A9E0 +FF00 +2100 +2920 +3920 +E8E0 +ENDCHAR +STARTCHAR U_8675 +ENCODING 34421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2280 +FAE0 +ABA0 +AEA0 +FAA0 +22E0 +3A80 +EA20 +01E0 +ENDCHAR +STARTCHAR U_8676 +ENCODING 34422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2900 +3900 +C900 +0300 +ENDCHAR +STARTCHAR U_8677 +ENCODING 34423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +F880 +A880 +A880 +AFE0 +F880 +2080 +2880 +3880 +E880 +ENDCHAR +STARTCHAR U_8678 +ENCODING 34424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F880 +A900 +AFE0 +F900 +A100 +2900 +3900 +C900 +0200 +ENDCHAR +STARTCHAR U_8679 +ENCODING 34425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +A880 +A880 +A880 +F880 +2080 +2880 +3880 +EFE0 +ENDCHAR +STARTCHAR U_867A +ENCODING 34426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57C0 +5540 +5540 +57C0 +5140 +51C0 +5620 +9020 +8FE0 +ENDCHAR +STARTCHAR U_867B +ENCODING 34427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AA00 +AA00 +AA00 +FA00 +2200 +2A00 +3A40 +EBE0 +ENDCHAR +STARTCHAR U_867C +ENCODING 34428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AC00 +ABC0 +A840 +F880 +2100 +2A20 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_867D +ENCODING 34429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2480 +0400 +7FC0 +4440 +7FC0 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_867E +ENCODING 34430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +A900 +A980 +A940 +F920 +2100 +2900 +3900 +C500 +ENDCHAR +STARTCHAR U_867F +ENCODING 34431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0FC0 +0840 +3180 +C400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8680 +ENCODING 34432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +4D20 +9520 +27E0 +2520 +2100 +2940 +31E0 +2620 +ENDCHAR +STARTCHAR U_8681 +ENCODING 34433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +22A0 +22A0 +FA20 +AA20 +A940 +F940 +2080 +2940 +3A40 +CC20 +ENDCHAR +STARTCHAR U_8682 +ENCODING 34434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +AA40 +AA40 +ABE0 +F820 +27A0 +2820 +3920 +C8C0 +ENDCHAR +STARTCHAR U_8683 +ENCODING 34435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7F00 +0240 +3F80 +0400 +7FC0 +4440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8684 +ENCODING 34436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA00 +AA00 +ABC0 +FA40 +2240 +2A40 +3C40 +C8C0 +ENDCHAR +STARTCHAR U_8685 +ENCODING 34437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2400 +FDE0 +AD20 +AD20 +FD60 +2500 +2520 +3920 +C8E0 +ENDCHAR +STARTCHAR U_8686 +ENCODING 34438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +FAA0 +AAA0 +ABE0 +AA20 +FA00 +2200 +2A20 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_8687 +ENCODING 34439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +FA20 +ABE0 +AAA0 +FA80 +2240 +2A40 +3C20 +C820 +ENDCHAR +STARTCHAR U_8688 +ENCODING 34440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +27C0 +2280 +FA80 +AFC0 +AA80 +FA80 +2280 +2280 +3C80 +CC80 +ENDCHAR +STARTCHAR U_8689 +ENCODING 34441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3580 +C460 +3F80 +2480 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_868A +ENCODING 34442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AA40 +AA40 +AA40 +F940 +2080 +2980 +3A40 +EC20 +ENDCHAR +STARTCHAR U_868B +ENCODING 34443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AAA0 +AAA0 +FB60 +2220 +2A20 +3A20 +EA60 +ENDCHAR +STARTCHAR U_868C +ENCODING 34444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2080 +F880 +ABE0 +A880 +F880 +27E0 +2080 +3880 +C880 +ENDCHAR +STARTCHAR U_868D +ENCODING 34445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +AAA0 +ABC0 +AA80 +FA80 +2280 +2AA0 +3BA0 +EA60 +ENDCHAR +STARTCHAR U_868E +ENCODING 34446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +AA20 +AA20 +ABE0 +FA20 +2220 +2A20 +3BE0 +EA20 +ENDCHAR +STARTCHAR U_868F +ENCODING 34447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FA20 +ABE0 +AA20 +FBE0 +2220 +2A20 +3AA0 +CC40 +ENDCHAR +STARTCHAR U_8690 +ENCODING 34448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +A920 +A8A0 +F8E0 +2320 +2C20 +3920 +C8C0 +ENDCHAR +STARTCHAR U_8691 +ENCODING 34449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +A880 +ABE0 +F940 +2140 +2880 +3940 +CE20 +ENDCHAR +STARTCHAR U_8692 +ENCODING 34450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2340 +FAC0 +AA40 +AFE0 +FA40 +2240 +2A40 +3B40 +CC80 +ENDCHAR +STARTCHAR U_8693 +ENCODING 34451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23A0 +20A0 +20A0 +FBA0 +AA20 +ABA0 +F8A0 +20A0 +28A0 +38A0 +CB20 +ENDCHAR +STARTCHAR U_8694 +ENCODING 34452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2280 +FA80 +ABE0 +AA80 +FA80 +22A0 +2AA0 +3B60 +CA20 +ENDCHAR +STARTCHAR U_8695 +ENCODING 34453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +0800 +FFE0 +1480 +2440 +FFA0 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8696 +ENCODING 34454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +2000 +F800 +AFE0 +AA80 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_8697 +ENCODING 34455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +23C0 +F940 +A940 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8698 +ENCODING 34456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +FFE0 +A900 +A980 +F980 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_8699 +ENCODING 34457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FD20 +A880 +A800 +FFE0 +2040 +2880 +3880 +C900 +ENDCHAR +STARTCHAR U_869A +ENCODING 34458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23C0 +2200 +FA00 +ABE0 +AA40 +FA40 +2240 +2A40 +3A40 +CC40 +ENDCHAR +STARTCHAR U_869B +ENCODING 34459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AAA0 +AAA0 +FBE0 +2080 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_869C +ENCODING 34460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +2140 +FA40 +AFE0 +A840 +F8C0 +2140 +2A40 +3D40 +C880 +ENDCHAR +STARTCHAR U_869D +ENCODING 34461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F9E0 +AF00 +A900 +F9E0 +2700 +2920 +3920 +C8E0 +ENDCHAR +STARTCHAR U_869E +ENCODING 34462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F900 +A900 +A980 +FB40 +2540 +2920 +3920 +C900 +ENDCHAR +STARTCHAR U_869F +ENCODING 34463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2100 +F900 +A900 +AFC0 +F900 +2500 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86A0 +ENCODING 34464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +3F40 +C920 +1300 +2400 +7FC0 +4440 +7FC0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_86A1 +ENCODING 34465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2240 +FC20 +A800 +ABE0 +F920 +2120 +2920 +3AA0 +CC40 +ENDCHAR +STARTCHAR U_86A2 +ENCODING 34466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F800 +AB80 +AA80 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86A3 +ENCODING 34467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2240 +FA40 +AC20 +A900 +F900 +2200 +2A40 +3CE0 +CB20 +ENDCHAR +STARTCHAR U_86A4 +ENCODING 34468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2880 +1500 +0E00 +3180 +C460 +3FC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_86A5 +ENCODING 34469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2220 +2220 +FC00 +A940 +A940 +F940 +2140 +2880 +3940 +CA20 +ENDCHAR +STARTCHAR U_86A6 +ENCODING 34470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FFE0 +AA40 +AA40 +FFE0 +2240 +2A40 +3A40 +CAC0 +ENDCHAR +STARTCHAR U_86A7 +ENCODING 34471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FC20 +AA40 +AA40 +FA40 +2240 +2A40 +3C40 +C840 +ENDCHAR +STARTCHAR U_86A8 +ENCODING 34472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86A9 +ENCODING 34473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +FFE0 +0400 +3F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86AA +ENCODING 34474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +2140 +F940 +AA40 +A940 +F940 +20E0 +2F40 +3840 +C840 +ENDCHAR +STARTCHAR U_86AB +ENCODING 34475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2420 +FBA0 +AAA0 +AAA0 +FBA0 +2260 +2A00 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86AC +ENCODING 34476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2540 +FD40 +AD40 +AD40 +FDC0 +2580 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86AD +ENCODING 34477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FBE0 +AA00 +AAA0 +FAC0 +2280 +2AA0 +3AA0 +CCE0 +ENDCHAR +STARTCHAR U_86AE +ENCODING 34478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +22A0 +FA80 +AEE0 +AB80 +FA80 +22A0 +2AA0 +3A60 +CA20 +ENDCHAR +STARTCHAR U_86AF +ENCODING 34479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +ABE0 +AA40 +FA40 +2240 +2A40 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_86B0 +ENCODING 34480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AAA0 +AAA0 +FBE0 +22A0 +2AA0 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86B1 +ENCODING 34481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FD00 +A900 +A9E0 +F900 +21E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_86B2 +ENCODING 34482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2080 +FAA0 +A9C0 +AFE0 +F880 +2080 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_86B3 +ENCODING 34483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2280 +FA80 +ABE0 +AA80 +FA80 +22A0 +2AA0 +3B60 +CAA0 +ENDCHAR +STARTCHAR U_86B4 +ENCODING 34484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2480 +FFE0 +AAA0 +AAA0 +FCA0 +27A0 +2920 +3A20 +CCC0 +ENDCHAR +STARTCHAR U_86B5 +ENCODING 34485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2040 +FBC0 +AAC0 +AAC0 +FBC0 +2240 +2840 +3940 +C880 +ENDCHAR +STARTCHAR U_86B6 +ENCODING 34486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2240 +FFE0 +AA40 +AA40 +FBC0 +2240 +2A40 +3BC0 +CA40 +ENDCHAR +STARTCHAR U_86B7 +ENCODING 34487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +2200 +FBC0 +AA40 +AA40 +FBC0 +2240 +2A00 +3A00 +CBE0 +ENDCHAR +STARTCHAR U_86B8 +ENCODING 34488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23C0 +2200 +FBE0 +AA80 +AA80 +FB80 +22E0 +2AA0 +3C80 +C880 +ENDCHAR +STARTCHAR U_86B9 +ENCODING 34489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2240 +FDE0 +AC40 +AE40 +FD40 +2540 +2C40 +3D40 +CC80 +ENDCHAR +STARTCHAR U_86BA +ENCODING 34490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +FD40 +AD40 +AFC0 +FD40 +27E0 +2C40 +3C40 +CCC0 +ENDCHAR +STARTCHAR U_86BB +ENCODING 34491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +1100 +3920 +54E0 +9400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86BC +ENCODING 34492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +ABA0 +AAA0 +FAA0 +23A0 +2820 +3920 +C8C0 +ENDCHAR +STARTCHAR U_86BD +ENCODING 34493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +F980 +AAC0 +ACA0 +F8A0 +2080 +2880 +3800 +CFE0 +ENDCHAR +STARTCHAR U_86BE +ENCODING 34494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AA80 +ABE0 +FAA0 +22A0 +2A40 +3CA0 +C920 +ENDCHAR +STARTCHAR U_86BF +ENCODING 34495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F900 +AA40 +AFC0 +F880 +2100 +2A40 +3FE0 +CA20 +ENDCHAR +STARTCHAR U_86C0 +ENCODING 34496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F900 +A900 +A900 +FFC0 +2100 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86C1 +ENCODING 34497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +2120 +F920 +AAE0 +AC40 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C2 +ENCODING 34498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2220 +27E0 +FA00 +ABC0 +AA40 +FB40 +2280 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_86C3 +ENCODING 34499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +FBE0 +AAA0 +AAA0 +FB60 +2220 +2A20 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86C4 +ENCODING 34500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +A880 +ABE0 +FA20 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C5 +ENCODING 34501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +20E0 +F880 +A880 +ABE0 +FA20 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C6 +ENCODING 34502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FA40 +ABC0 +AA40 +FA40 +23C0 +2A40 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_86C7 +ENCODING 34503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC20 +AA00 +AA40 +FB80 +2200 +2A20 +3A20 +C9E0 +ENDCHAR +STARTCHAR U_86C8 +ENCODING 34504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86C9 +ENCODING 34505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +A880 +AFE0 +F840 +2280 +2900 +3880 +C880 +ENDCHAR +STARTCHAR U_86CA +ENCODING 34506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +0480 +FFE0 +0020 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_86CB +ENCODING 34507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0440 +2780 +3400 +4FE0 +8400 +3FC0 +2440 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_86CC +ENCODING 34508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23E0 +22A0 +FAA0 +AAA0 +AAA0 +FAA0 +22A0 +2AA0 +3CE0 +C8A0 +ENDCHAR +STARTCHAR U_86CD +ENCODING 34509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1240 +1280 +7FE0 +8440 +3F80 +2480 +3F80 +0440 +07C0 +7840 +ENDCHAR +STARTCHAR U_86CE +ENCODING 34510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +23E0 +FA80 +AA80 +AAE0 +FAA0 +22A0 +2AA0 +3D20 +CAC0 +ENDCHAR +STARTCHAR U_86CF +ENCODING 34511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2220 +2140 +F880 +A940 +AE20 +F880 +23E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86D0 +ENCODING 34512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +AAA0 +AAA0 +AFE0 +FAA0 +2AA0 +2AA0 +3FE0 +E820 +ENDCHAR +STARTCHAR U_86D1 +ENCODING 34513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +27A0 +F820 +AA80 +AFE0 +F880 +27E0 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_86D2 +ENCODING 34514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2520 +F940 +A880 +A940 +FE20 +23E0 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86D3 +ENCODING 34515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FD40 +2100 +FFE0 +2100 +F920 +A940 +F980 +28A0 +3560 +C220 +ENDCHAR +STARTCHAR U_86D4 +ENCODING 34516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23A0 +FAA0 +AAA0 +AAA0 +FBA0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86D5 +ENCODING 34517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FA00 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86D6 +ENCODING 34518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +27E0 +FA40 +ABA0 +AB40 +FDA0 +2540 +2DA0 +3920 +C8E0 +ENDCHAR +STARTCHAR U_86D7 +ENCODING 34519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3FC0 +2040 +3FC0 +2440 +2440 +3FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_86D8 +ENCODING 34520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +23E0 +F880 +A880 +ABE0 +F880 +2080 +2FE0 +3880 +C880 +ENDCHAR +STARTCHAR U_86D9 +ENCODING 34521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +F900 +AFE0 +A800 +F900 +27C0 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86DA +ENCODING 34522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2420 +24A0 +FFA0 +ADA0 +ADA0 +FBA0 +21A0 +2A20 +3C20 +C8E0 +ENDCHAR +STARTCHAR U_86DB +ENCODING 34523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +23E0 +FC80 +A880 +AFE0 +F880 +21C0 +2AA0 +3CA0 +C880 +ENDCHAR +STARTCHAR U_86DC +ENCODING 34524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +2540 +FFE0 +AD40 +AD40 +FFC0 +2500 +2D00 +3E00 +CC00 +ENDCHAR +STARTCHAR U_86DD +ENCODING 34525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +AA40 +ABC0 +FAA0 +22C0 +2A80 +3B60 +CE20 +ENDCHAR +STARTCHAR U_86DE +ENCODING 34526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2080 +F880 +AFE0 +A880 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86DF +ENCODING 34527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FA40 +AC20 +AA40 +FA40 +2140 +2880 +3940 +CE20 +ENDCHAR +STARTCHAR U_86E0 +ENCODING 34528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +FA40 +AC40 +AA80 +FFE0 +22A0 +2AA0 +3AA0 +CD60 +ENDCHAR +STARTCHAR U_86E1 +ENCODING 34529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FB60 +A920 +AB20 +FD60 +21A0 +2920 +3920 +CF60 +ENDCHAR +STARTCHAR U_86E2 +ENCODING 34530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +F940 +A940 +AFE0 +F940 +2140 +2940 +3A40 +CC40 +ENDCHAR +STARTCHAR U_86E3 +ENCODING 34531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +ABE0 +A800 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E4 +ENCODING 34532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FC20 +ABC0 +A800 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E5 +ENCODING 34533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2220 +2540 +F880 +A900 +ABE0 +FD20 +2220 +2940 +3880 +CF00 +ENDCHAR +STARTCHAR U_86E6 +ENCODING 34534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2080 +FBE0 +A8A0 +AFE0 +FC80 +27E0 +28A0 +3940 +CE20 +ENDCHAR +STARTCHAR U_86E7 +ENCODING 34535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +26A0 +FD20 +AD60 +AEA0 +FCA0 +2560 +2620 +3C20 +CC60 +ENDCHAR +STARTCHAR U_86E8 +ENCODING 34536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2100 +FBE0 +AA20 +AA20 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E9 +ENCODING 34537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2680 +25A0 +FCE0 +0400 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86EA +ENCODING 34538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2240 +FA40 +2240 +FD40 +2880 +7F80 +4880 +7F80 +0880 +FF40 +ENDCHAR +STARTCHAR U_86EB +ENCODING 34539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2240 +FFE0 +AA00 +AAE0 +FAA0 +22E0 +2A80 +3CA0 +C8E0 +ENDCHAR +STARTCHAR U_86EC +ENCODING 34540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1100 +FFE0 +2100 +64C0 +BFA0 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86ED +ENCODING 34541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +2200 +FA40 +AFA0 +A880 +F880 +23E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86EE +ENCODING 34542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3180 +5540 +8420 +3F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86EF +ENCODING 34543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +A880 +A900 +FA40 +2780 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86F0 +ENCODING 34544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +2140 +F340 +22C0 +6420 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86F1 +ENCODING 34545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AD20 +AB40 +FFE0 +2100 +2900 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_86F2 +ENCODING 34546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +2140 +F9A0 +AA60 +AC20 +FFE0 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86F3 +ENCODING 34547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2880 +2880 +FBE0 +AAA0 +AAA0 +FAA0 +2AA0 +2AE0 +3880 +D080 +ENDCHAR +STARTCHAR U_86F4 +ENCODING 34548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +F980 +AE60 +A800 +FA40 +2240 +2A40 +3C40 +C840 +ENDCHAR +STARTCHAR U_86F5 +ENCODING 34549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +22A0 +FD40 +AAA0 +AAA0 +F800 +27E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86F6 +ENCODING 34550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2520 +FAC0 +A840 +AFE0 +F840 +2240 +2940 +3840 +C9C0 +ENDCHAR +STARTCHAR U_86F7 +ENCODING 34551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +27E0 +F920 +ADC0 +AB80 +F940 +2340 +2D20 +3920 +CB00 +ENDCHAR +STARTCHAR U_86F8 +ENCODING 34552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +2080 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2A20 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86F9 +ENCODING 34553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +23E0 +FAA0 +ABE0 +AAA0 +FAA0 +23E0 +2AA0 +3AA0 +CAE0 +ENDCHAR +STARTCHAR U_86FA +ENCODING 34554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F940 +AB40 +AD40 +FBA0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86FB +ENCODING 34555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C40 +27E0 +FC40 +AC40 +AFC0 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86FC +ENCODING 34556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2080 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_86FD +ENCODING 34557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2940 +3A20 +CC20 +ENDCHAR +STARTCHAR U_86FE +ENCODING 34558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +26C0 +22A0 +FFE0 +AA80 +AA80 +FBA0 +26C0 +2AA0 +3B60 +CE20 +ENDCHAR +STARTCHAR U_86FF +ENCODING 34559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +AFC0 +A880 +F900 +23C0 +2A40 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_8700 +ENCODING 34560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +1000 +3FE0 +4420 +BFA0 +24A0 +3FA0 +04A0 +3F40 +ENDCHAR +STARTCHAR U_8701 +ENCODING 34561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2400 +FFE0 +A8A0 +A8C0 +FA80 +22E0 +2A80 +3D80 +C8E0 +ENDCHAR +STARTCHAR U_8702 +ENCODING 34562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2480 +FB60 +A880 +AFE0 +F880 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_8703 +ENCODING 34563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5FC0 +4000 +7FE0 +5180 +5260 +7FC0 +6240 +7FC0 +4240 +BFA0 +ENDCHAR +STARTCHAR U_8704 +ENCODING 34564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +25C0 +FC00 +AFE0 +AD40 +FD40 +2560 +2D40 +39A0 +CB20 +ENDCHAR +STARTCHAR U_8705 +ENCODING 34565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +27E0 +F880 +ABE0 +AAA0 +FBE0 +22A0 +2BE0 +3AA0 +CAE0 +ENDCHAR +STARTCHAR U_8706 +ENCODING 34566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +AA40 +ABC0 +FA40 +23C0 +29A0 +3AA0 +CCE0 +ENDCHAR +STARTCHAR U_8707 +ENCODING 34567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +3FE0 +E480 +2480 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8708 +ENCODING 34568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +A800 +ABC0 +A900 +FFE0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8709 +ENCODING 34569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +2520 +FAC0 +AFE0 +A840 +F880 +27E0 +2880 +3880 +C980 +ENDCHAR +STARTCHAR U_870A +ENCODING 34570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2620 +22A0 +FAA0 +AFA0 +AAA0 +FBA0 +26A0 +2A20 +3A20 +CAE0 +ENDCHAR +STARTCHAR U_870B +ENCODING 34571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA80 +22A0 +2A40 +3AA0 +CB20 +ENDCHAR +STARTCHAR U_870C +ENCODING 34572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +27C0 +F4A0 +94A0 +9660 +F100 +27C0 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_870D +ENCODING 34573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +FBE0 +A900 +AFE0 +F900 +2380 +2540 +3920 +C900 +ENDCHAR +STARTCHAR U_870E +ENCODING 34574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23E0 +F800 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_870F +ENCODING 34575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +FFE0 +AB80 +AD40 +FBA0 +2280 +2AE0 +3A20 +CC60 +ENDCHAR +STARTCHAR U_8710 +ENCODING 34576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2780 +2280 +FBE0 +AAA0 +AFA0 +FAA0 +24A0 +27A0 +38A0 +C960 +ENDCHAR +STARTCHAR U_8711 +ENCODING 34577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2100 +45E0 +A500 +5FE0 +8400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8712 +ENCODING 34578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +26C0 +2240 +FA40 +AF60 +AB40 +FB40 +2540 +2DE0 +3A00 +C9E0 +ENDCHAR +STARTCHAR U_8713 +ENCODING 34579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +21C0 +F940 +AA40 +ABE0 +F940 +2540 +2A40 +3AE0 +C500 +08E0 +ENDCHAR +STARTCHAR U_8714 +ENCODING 34580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2420 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2820 +38A0 +C840 +ENDCHAR +STARTCHAR U_8715 +ENCODING 34581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +FC20 +AC20 +AFE0 +FA80 +2280 +2AA0 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_8716 +ENCODING 34582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +FAA0 +ABA0 +AAA0 +FAA0 +2BA0 +2AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_8717 +ENCODING 34583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +FBE0 +A880 +ABE0 +FAA0 +22A0 +2B60 +3A20 +CA60 +ENDCHAR +STARTCHAR U_8718 +ENCODING 34584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +FAA0 +AAA0 +AAA0 +FFA0 +22A0 +2AA0 +3BE0 +CCA0 +ENDCHAR +STARTCHAR U_8719 +ENCODING 34585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +22C0 +27A0 +FA20 +AB40 +AE40 +FA40 +2240 +2AA0 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_871A +ENCODING 34586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1200 +F3C0 +1200 +F3E0 +1600 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_871B +ENCODING 34587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23E0 +FA80 +ABE0 +AA80 +FA80 +23E0 +2D20 +3920 +C9E0 +ENDCHAR +STARTCHAR U_871C +ENCODING 34588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +5540 +9F20 +6400 +BF80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_871D +ENCODING 34589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +1500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_871E +ENCODING 34590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FBC0 +AA40 +ABC0 +FA40 +27E0 +2940 +3A20 +CC20 +ENDCHAR +STARTCHAR U_871F +ENCODING 34591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FFE0 +A800 +ABC0 +FA40 +23C0 +2A40 +3BC0 +CA40 +ENDCHAR +STARTCHAR U_8720 +ENCODING 34592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2460 +27A0 +FCA0 +AFE0 +ACA0 +FDE0 +26A0 +2CA0 +3FE0 +CC20 +ENDCHAR +STARTCHAR U_8721 +ENCODING 34593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FA40 +AFE0 +A800 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8722 +ENCODING 34594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +FFE0 +A880 +A880 +FFE0 +2560 +2D60 +3D60 +CFE0 +ENDCHAR +STARTCHAR U_8723 +ENCODING 34595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +F880 +ABE0 +A880 +FFE0 +2180 +2980 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_8724 +ENCODING 34596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE00 +23E0 +7240 +AC40 +0400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8725 +ENCODING 34597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22C0 +2280 +FF80 +AAE0 +ABA0 +FEA0 +22A0 +2AA0 +3B20 +CA20 +ENDCHAR +STARTCHAR U_8726 +ENCODING 34598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +FC20 +ABC0 +A800 +AFE0 +FAA0 +2AA0 +2FE0 +3AA0 +E860 +ENDCHAR +STARTCHAR U_8727 +ENCODING 34599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2220 +FBE0 +AAC0 +AAA0 +FBE0 +2280 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_8728 +ENCODING 34600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2140 +FFE0 +A940 +AFC0 +F900 +25E0 +2D00 +3B00 +C9E0 +ENDCHAR +STARTCHAR U_8729 +ENCODING 34601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +27E0 +FD20 +AFE0 +AC20 +FDE0 +2560 +2DE0 +3C20 +C8E0 +ENDCHAR +STARTCHAR U_872A +ENCODING 34602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2620 +FBA0 +A920 +AFE0 +F920 +2560 +2FE0 +3820 +C8C0 +ENDCHAR +STARTCHAR U_872B +ENCODING 34603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFC0 +AC80 +FCA0 +27C0 +2480 +3EA0 +C4E0 +ENDCHAR +STARTCHAR U_872C +ENCODING 34604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +FCA0 +AEE0 +ADA0 +FDA0 +26E0 +2CA0 +3D20 +CFE0 +ENDCHAR +STARTCHAR U_872D +ENCODING 34605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2240 +FC80 +A960 +AE20 +FC20 +2760 +2C20 +3FE0 +CC20 +ENDCHAR +STARTCHAR U_872E +ENCODING 34606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +27E0 +F880 +ABA0 +AAA0 +FBA0 +2040 +2FE0 +38A0 +C920 +ENDCHAR +STARTCHAR U_872F +ENCODING 34607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFE0 +AA00 +AFE0 +F940 +23A0 +2900 +3FE0 +C900 +ENDCHAR +STARTCHAR U_8730 +ENCODING 34608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +7BE0 +4A20 +7BE0 +9400 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8731 +ENCODING 34609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FFE0 +AD20 +AFE0 +FA80 +27E0 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_8732 +ENCODING 34610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2100 +FFE0 +AB40 +AD20 +FFE0 +2240 +2B80 +3940 +CE20 +ENDCHAR +STARTCHAR U_8733 +ENCODING 34611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FBC0 +A800 +ABC0 +F840 +2080 +2FE0 +3880 +C980 +ENDCHAR +STARTCHAR U_8734 +ENCODING 34612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFC0 +AA00 +FFE0 +22A0 +2CA0 +3920 +CAC0 +ENDCHAR +STARTCHAR U_8735 +ENCODING 34613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2AA0 +2AA0 +FEE0 +A820 +AFE0 +F820 +2EE0 +2AA0 +3AA0 +D2A0 +ENDCHAR +STARTCHAR U_8736 +ENCODING 34614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FA40 +AEA0 +A900 +F900 +27E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_8737 +ENCODING 34615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +FFE0 +A900 +AFE0 +AA40 +FFA0 +2280 +2BA0 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_8738 +ENCODING 34616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5140 +7D40 +4480 +7F40 +5420 +7F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8739 +ENCODING 34617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +F880 +AFE0 +FCA0 +24A0 +2560 +3E20 +CCA0 +0440 +ENDCHAR +STARTCHAR U_873A +ENCODING 34618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +2420 +FF60 +AC20 +AFE0 +FA80 +2280 +2AA0 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_873B +ENCODING 34619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27C0 +F900 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3A40 +CAC0 +ENDCHAR +STARTCHAR U_873C +ENCODING 34620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +23E0 +FE80 +ABE0 +AA80 +FA80 +23E0 +2A80 +3A80 +CBE0 +ENDCHAR +STARTCHAR U_873D +ENCODING 34621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +FFE0 +A920 +FDA0 +2DA0 +2B60 +3920 +D920 +0960 +ENDCHAR +STARTCHAR U_873E +ENCODING 34622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +23E0 +FAA0 +ABE0 +A880 +FFE0 +2080 +29C0 +3AA0 +CCA0 +ENDCHAR +STARTCHAR U_873F +ENCODING 34623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FAE0 +ABA0 +ACA0 +FAA0 +21E0 +2A80 +3CA0 +C8E0 +ENDCHAR +STARTCHAR U_8740 +ENCODING 34624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFC0 +AD40 +AFC0 +FD40 +27C0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_8741 +ENCODING 34625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8742 +ENCODING 34626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2AC0 +FA80 +AFE0 +A8A0 +AFA0 +FAA0 +2AA0 +2B40 +3AA0 +E920 +ENDCHAR +STARTCHAR U_8743 +ENCODING 34627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FA40 +ADA0 +AFE0 +FAA0 +26A0 +2A40 +3DA0 +C8A0 +ENDCHAR +STARTCHAR U_8744 +ENCODING 34628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +AFE0 +A920 +FFE0 +2A20 +2BA0 +3820 +C8A0 +0840 +ENDCHAR +STARTCHAR U_8745 +ENCODING 34629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1080 +FFE0 +2940 +4620 +BF80 +2480 +3F80 +0480 +07C0 +7840 +ENDCHAR +STARTCHAR U_8746 +ENCODING 34630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2560 +FD40 +A900 +AFC0 +F900 +27E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_8747 +ENCODING 34631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F900 +AFE0 +AD20 +FFE0 +2520 +2FE0 +3920 +C9E0 +ENDCHAR +STARTCHAR U_8748 +ENCODING 34632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +F520 +97E0 +9520 +F5A0 +27E0 +2420 +37E0 +D420 +ENDCHAR +STARTCHAR U_8749 +ENCODING 34633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +23E0 +FAA0 +ABE0 +AAA0 +FBE0 +2080 +2FE0 +3880 +C880 +ENDCHAR +STARTCHAR U_874A +ENCODING 34634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +F800 +AFC0 +A900 +FD00 +25E0 +2D00 +3B00 +C9E0 +ENDCHAR +STARTCHAR U_874B +ENCODING 34635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2540 +2580 +FFC0 +AA40 +AFC0 +FA40 +2FC0 +3A60 +CA60 +1220 +ENDCHAR +STARTCHAR U_874C +ENCODING 34636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2640 +22C0 +FF40 +AA40 +ABC0 +FE40 +2260 +2BC0 +3A40 +CA40 +ENDCHAR +STARTCHAR U_874D +ENCODING 34637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +FEA0 +AAA0 +AEA0 +F8A0 +2AA0 +2EE0 +3A80 +C080 +ENDCHAR +STARTCHAR U_874E +ENCODING 34638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +ABC0 +AA00 +FFE0 +22A0 +2B60 +3BA0 +C840 +ENDCHAR +STARTCHAR U_874F +ENCODING 34639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FBC0 +A800 +AFE0 +FC20 +23C0 +2880 +3A80 +C900 +ENDCHAR +STARTCHAR U_8750 +ENCODING 34640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +25A0 +FC20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8751 +ENCODING 34641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25C0 +FB00 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_8752 +ENCODING 34642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2100 +FFE0 +AAA0 +ABA0 +FAA0 +23A0 +2AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_8753 +ENCODING 34643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +FBA0 +A800 +AEA0 +FAA0 +2EA0 +2AA0 +3E20 +CAE0 +ENDCHAR +STARTCHAR U_8754 +ENCODING 34644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +27C0 +FCA0 +AFE0 +A900 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8755 +ENCODING 34645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +ABE0 +7AA0 +4AA0 +7AA0 +4BE0 +7880 +50A0 +78E0 +CBA0 +ENDCHAR +STARTCHAR U_8756 +ENCODING 34646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +F800 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3800 +CFE0 +ENDCHAR +STARTCHAR U_8757 +ENCODING 34647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2220 +FBE0 +AA20 +AFE0 +F880 +2080 +2BE0 +3880 +CFE0 +ENDCHAR +STARTCHAR U_8758 +ENCODING 34648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +25C0 +FD40 +ADC0 +AC80 +FFE0 +2540 +2C80 +3D40 +CFE0 +ENDCHAR +STARTCHAR U_8759 +ENCODING 34649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFE0 +A800 +AFE0 +FAA0 +AFE0 +2AA0 +3AA0 +E860 +ENDCHAR +STARTCHAR U_875A +ENCODING 34650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +2080 +FFE0 +A9A0 +AE80 +F900 +27E0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_875B +ENCODING 34651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +F880 +AF80 +AAA0 +FFA0 +2AC0 +2940 +3AA0 +D520 +ENDCHAR +STARTCHAR U_875C +ENCODING 34652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +27E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3940 +CE20 +ENDCHAR +STARTCHAR U_875D +ENCODING 34653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +F880 +AFE0 +AAA0 +FDC0 +2280 +2DC0 +3AA0 +CDA0 +ENDCHAR +STARTCHAR U_875E +ENCODING 34654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +A800 +ABE0 +AA20 +FBE0 +2A20 +2BE0 +3A20 +EBE0 +ENDCHAR +STARTCHAR U_875F +ENCODING 34655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FFE0 +ACA0 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +EAE0 +ENDCHAR +STARTCHAR U_8760 +ENCODING 34656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +23E0 +FA20 +ABE0 +A800 +FBE0 +22A0 +2BE0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_8761 +ENCODING 34657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFE0 +AAA0 +AAA0 +AAA0 +F900 +27E0 +2900 +3A80 +EC60 +ENDCHAR +STARTCHAR U_8762 +ENCODING 34658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +23E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3940 +CE20 +ENDCHAR +STARTCHAR U_8763 +ENCODING 34659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +22E0 +FF00 +AAE0 +AF20 +AD40 +FDE0 +2540 +2D40 +3940 +EAC0 +ENDCHAR +STARTCHAR U_8764 +ENCODING 34660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +AA80 +AFE0 +ADA0 +FEE0 +2420 +2FE0 +3C20 +EFE0 +ENDCHAR +STARTCHAR U_8765 +ENCODING 34661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +FD40 +6980 +AE60 +6400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8766 +ENCODING 34662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +FA20 +AEE0 +A800 +AFE0 +F8A0 +2EA0 +2840 +38A0 +E920 +ENDCHAR +STARTCHAR U_8767 +ENCODING 34663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +F900 +AFC0 +AD40 +FFE0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8768 +ENCODING 34664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0880 +0880 +7EA0 +0860 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_8769 +ENCODING 34665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2080 +27E0 +FAA0 +ABE0 +AAA0 +FBE0 +2080 +2BE0 +3880 +CFE0 +ENDCHAR +STARTCHAR U_876A +ENCODING 34666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFE0 +AA00 +FFE0 +22A0 +2AA0 +3D20 +CAC0 +ENDCHAR +STARTCHAR U_876B +ENCODING 34667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +2140 +FFE0 +A900 +ABE0 +FE20 +23E0 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_876C +ENCODING 34668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +2520 +26A0 +FFE0 +AA40 +AD20 +FBC0 +2640 +2980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_876D +ENCODING 34669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +ABC0 +A800 +FFE0 +2280 +2AE0 +3D80 +C8E0 +ENDCHAR +STARTCHAR U_876E +ENCODING 34670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2620 +FBE0 +AA20 +ABE0 +F900 +23E0 +2E40 +3980 +CE60 +ENDCHAR +STARTCHAR U_876F +ENCODING 34671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +22C0 +FFE0 +A900 +AFE0 +F920 +21A0 +2A40 +3CA0 +CB20 +ENDCHAR +STARTCHAR U_8770 +ENCODING 34672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FD20 +ABC0 +A900 +FFE0 +2100 +2BC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_8771 +ENCODING 34673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +1080 +7FE0 +56A0 +7FE0 +1080 +1CE0 +E720 +ENDCHAR +STARTCHAR U_8772 +ENCODING 34674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +FAA0 +AFA0 +AAA0 +FFA0 +22A0 +2720 +3AA0 +CA20 +0260 +ENDCHAR +STARTCHAR U_8773 +ENCODING 34675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FBC0 +A900 +AFE0 +FAA0 +27E0 +2AA0 +3BE0 +C840 +ENDCHAR +STARTCHAR U_8774 +ENCODING 34676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +2FA0 +F4E0 +AEA0 +AAA0 +FAE0 +2AA0 +2EA0 +3920 +CA60 +ENDCHAR +STARTCHAR U_8775 +ENCODING 34677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +2540 +FD80 +3580 +6A40 +A420 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8776 +ENCODING 34678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +FDC0 +AC00 +AFE0 +F900 +27E0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_8777 +ENCODING 34679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +FA20 +A940 +ABE0 +A880 +FAA0 +22A0 +2BE0 +3900 +EE00 +ENDCHAR +STARTCHAR U_8778 +ENCODING 34680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +AD40 +AFE0 +A820 +FBA0 +2AA0 +2BA0 +3820 +E8E0 +ENDCHAR +STARTCHAR U_8779 +ENCODING 34681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +A800 +FFC0 +2540 +2D40 +3D40 +EFE0 +ENDCHAR +STARTCHAR U_877A +ENCODING 34682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +23E0 +FAA0 +ABE0 +A880 +FFE0 +24A0 +2FE0 +3C20 +CC60 +ENDCHAR +STARTCHAR U_877B +ENCODING 34683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +AAA0 +A920 +FFE0 +2920 +2FE0 +3920 +C960 +ENDCHAR +STARTCHAR U_877C +ENCODING 34684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +2100 +FFE0 +AB40 +AD20 +F900 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_877D +ENCODING 34685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +FA00 +AFE0 +AC40 +FBE0 +2240 +2BC0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_877E +ENCODING 34686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FFE0 +AC20 +A900 +FFE0 +2100 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_877F +ENCODING 34687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +AFE0 +A920 +FFE0 +2920 +2FE0 +3920 +C8E0 +ENDCHAR +STARTCHAR U_8780 +ENCODING 34688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +5680 +1980 +3FE0 +D480 +1280 +3F80 +2480 +3F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_8781 +ENCODING 34689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2520 +FBE0 +A920 +ADE0 +AD40 +FD60 +2540 +2DA0 +3C00 +EBE0 +ENDCHAR +STARTCHAR U_8782 +ENCODING 34690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +24E0 +FEA0 +AAA0 +AEC0 +AAA0 +FEA0 +28A0 +2AE0 +3E80 +E980 +ENDCHAR +STARTCHAR U_8783 +ENCODING 34691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +AFE0 +ACA0 +AFE0 +FA00 +23E0 +2A20 +3C20 +E8C0 +ENDCHAR +STARTCHAR U_8784 +ENCODING 34692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +FE80 +ABE0 +AEA0 +AAA0 +FEA0 +2AA0 +2AE0 +3E80 +E880 +ENDCHAR +STARTCHAR U_8785 +ENCODING 34693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2B40 +3D20 +C9C0 +ENDCHAR +STARTCHAR U_8786 +ENCODING 34694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +FA40 +AA40 +ADA0 +FEC0 +2440 +2AA0 +3FE0 +C920 +ENDCHAR +STARTCHAR U_8787 +ENCODING 34695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +2540 +FA40 +AF80 +A940 +FFE0 +2120 +2FE0 +3A80 +CC60 +ENDCHAR +STARTCHAR U_8788 +ENCODING 34696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +25E0 +FD20 +ADE0 +AD20 +FDE0 +2480 +29C0 +3AA0 +CDA0 +ENDCHAR +STARTCHAR U_8789 +ENCODING 34697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2520 +FA40 +AFA0 +A800 +AFE0 +F920 +25A0 +2B60 +3DA0 +EB60 +ENDCHAR +STARTCHAR U_878A +ENCODING 34698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +2280 +FFE0 +AAA0 +AFE0 +FAA0 +27E0 +2EC0 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_878B +ENCODING 34699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +26E0 +24A0 +FEE0 +ACA0 +AFE0 +F880 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_878C +ENCODING 34700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7940 +6A60 +FFC0 +4980 +9660 +3FC0 +2480 +3F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_878D +ENCODING 34701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +0080 +7BE0 +4AA0 +7AA0 +02A0 +FFE0 +D480 +FCA0 +A4E0 +AF20 +ENDCHAR +STARTCHAR U_878E +ENCODING 34702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +23C0 +FA40 +ABC0 +A800 +FFE0 +26A0 +27E0 +3D20 +C560 +ENDCHAR +STARTCHAR U_878F +ENCODING 34703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2400 +FD00 +ADE0 +AE80 +FC80 +27E0 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_8790 +ENCODING 34704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +AC00 +AFE0 +FC00 +27E0 +2AA0 +3D60 +CD40 +ENDCHAR +STARTCHAR U_8791 +ENCODING 34705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +AC40 +AFC0 +F920 +27E0 +2900 +3A80 +CC60 +ENDCHAR +STARTCHAR U_8792 +ENCODING 34706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FC80 +8BE0 +FAA0 +8AA0 +FBE0 +2080 +F8A0 +27E0 +ENDCHAR +STARTCHAR U_8793 +ENCODING 34707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27C0 +FA00 +AFE0 +AA40 +FFA0 +2100 +2FE0 +3D40 +C920 +ENDCHAR +STARTCHAR U_8794 +ENCODING 34708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +28E0 +F880 +ABE0 +AAA0 +ABC0 +FAA0 +22E0 +2D40 +3940 +EA60 +ENDCHAR +STARTCHAR U_8795 +ENCODING 34709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FAC0 +A940 +AAC0 +FFC0 +2900 +2DC0 +3900 +CD20 +08E0 +ENDCHAR +STARTCHAR U_8796 +ENCODING 34710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FB40 +AFE0 +AC20 +ABC0 +FA40 +23C0 +2A40 +3BC0 +EA40 +ENDCHAR +STARTCHAR U_8797 +ENCODING 34711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2480 +F7E0 +94A0 +97E0 +F480 +27E0 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8798 +ENCODING 34712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +27E0 +2000 +FFE0 +A800 +ABE0 +FA20 +23E0 +2940 +3880 +CFE0 +ENDCHAR +STARTCHAR U_8799 +ENCODING 34713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0E00 +1580 +6460 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_879A +ENCODING 34714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +4A20 +FBE0 +4A40 +7B80 +4A20 +7FE0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_879B +ENCODING 34715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FCA0 +AFE0 +A880 +FBE0 +2080 +2FE0 +3A20 +CA20 +03E0 +ENDCHAR +STARTCHAR U_879C +ENCODING 34716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2660 +FBC0 +8A40 +7180 +0660 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_879D +ENCODING 34717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F920 +AFE0 +A920 +FFE0 +2340 +2BA0 +3D60 +C920 +11E0 +ENDCHAR +STARTCHAR U_879E +ENCODING 34718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +FBE0 +AA80 +ABE0 +FA80 +23E0 +2820 +3AA0 +CAA0 +0060 +ENDCHAR +STARTCHAR U_879F +ENCODING 34719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FBC0 +AA40 +ABC0 +FA40 +23C0 +2900 +3FE0 +CA40 +0420 +ENDCHAR +STARTCHAR U_87A0 +ENCODING 34720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +FA80 +AC40 +A820 +FFC0 +2540 +3D40 +E540 +0FE0 +ENDCHAR +STARTCHAR U_87A1 +ENCODING 34721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0E00 +F1E0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_87A2 +ENCODING 34722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +59C0 +9140 +2A20 +FFE0 +8420 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87A3 +ENCODING 34723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA40 +A680 +BFE0 +E400 +BFE0 +AA40 +FFA0 +AA80 +AF80 +A240 +BFE0 +ENDCHAR +STARTCHAR U_87A4 +ENCODING 34724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +53E0 +22A0 +53E0 +AAA0 +FBE0 +A880 +F940 +2A20 +F420 +ENDCHAR +STARTCHAR U_87A5 +ENCODING 34725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2540 +FFE0 +A540 +A540 +FFC0 +2400 +27C0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_87A6 +ENCODING 34726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFC0 +A900 +AFE0 +FA40 +2780 +2D60 +3D40 +CB20 +ENDCHAR +STARTCHAR U_87A7 +ENCODING 34727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27C0 +F940 +AFE0 +AA00 +FFC0 +2220 +2BE0 +3A40 +CA40 +03C0 +ENDCHAR +STARTCHAR U_87A8 +ENCODING 34728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFE0 +AA80 +AFE0 +FAA0 +2BA0 +2CE0 +3920 +C860 +ENDCHAR +STARTCHAR U_87A9 +ENCODING 34729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +25E0 +2B40 +FA80 +AB60 +AA80 +FBE0 +2A80 +3BC0 +6AA0 +8880 +ENDCHAR +STARTCHAR U_87AA +ENCODING 34730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FC40 +AA80 +AFE0 +AAA0 +FC60 +2BA0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87AB +ENCODING 34731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1140 +FE80 +6D40 +AA20 +7FC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_87AC +ENCODING 34732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +AAA0 +AFE0 +AAA0 +FFE0 +2240 +2BC0 +3A40 +EBC0 +ENDCHAR +STARTCHAR U_87AD +ENCODING 34733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +A920 +AAA0 +AFE0 +F900 +AFE0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87AE +ENCODING 34734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +A800 +FFE0 +2920 +27C0 +3540 +CDC0 +0100 +ENDCHAR +STARTCHAR U_87AF +ENCODING 34735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +2540 +4A20 +BFC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_87B0 +ENCODING 34736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +FA80 +2AA0 +2BC0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_87B1 +ENCODING 34737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7D40 +5440 +D2C0 +0400 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87B2 +ENCODING 34738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +AFE0 +A240 +FFA0 +2100 +2FC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87B3 +ENCODING 34739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +27E0 +FC20 +ABC0 +AA40 +FBC0 +2100 +2BC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87B4 +ENCODING 34740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +C540 +A7C0 +E540 +8920 +BFE0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87B5 +ENCODING 34741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +AFE0 +A800 +FBC0 +2000 +2FE0 +3D40 +CB20 +ENDCHAR +STARTCHAR U_87B6 +ENCODING 34742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87B7 +ENCODING 34743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +5240 +5FC0 +4900 +7FE0 +5240 +5FC0 +8240 +BFE0 +ENDCHAR +STARTCHAR U_87B8 +ENCODING 34744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +B5E0 +4AA0 +FC80 +4940 +4A20 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87B9 +ENCODING 34745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F80 +F280 +AFE0 +AAA0 +AFA0 +FAA0 +2FA0 +2AA0 +3FA0 +EB20 +ENDCHAR +STARTCHAR U_87BA +ENCODING 34746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +27E0 +FCA0 +AFE0 +A940 +FF80 +2120 +2FE0 +3AC0 +CDA0 +ENDCHAR +STARTCHAR U_87BB +ENCODING 34747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +26A0 +FBE0 +AAA0 +AFE0 +FCA0 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_87BC +ENCODING 34748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +F900 +AFC0 +AD40 +FFE0 +2100 +2FC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87BD +ENCODING 34749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +7900 +0F00 +F2E0 +0900 +2480 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87BE +ENCODING 34750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FFE0 +A880 +ABE0 +FAA0 +23E0 +2AA0 +3BE0 +CC20 +ENDCHAR +STARTCHAR U_87BF +ENCODING 34751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +7A80 +1480 +FFE0 +5480 +9280 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87C0 +ENCODING 34752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2120 +FEC0 +AB00 +ACC0 +FBA0 +2100 +2FE0 +3900 +C900 +ENDCHAR +STARTCHAR U_87C1 +ENCODING 34753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7FE0 +4200 +71C0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_87C2 +ENCODING 34754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +FFC0 +AC40 +AFE0 +F920 +27E0 +2BA0 +3540 +C920 +ENDCHAR +STARTCHAR U_87C3 +ENCODING 34755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +FFE0 +2440 +2A80 +3900 +EEE0 +ENDCHAR +STARTCHAR U_87C4 +ENCODING 34756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +5340 +FAE0 +2420 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87C5 +ENCODING 34757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +AFE0 +AA40 +AA40 +FBC0 +2800 +2D40 +3AA0 +EAA0 +ENDCHAR +STARTCHAR U_87C6 +ENCODING 34758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +FBC0 +AA40 +ABC0 +FA40 +27E0 +2980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_87C7 +ENCODING 34759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +2480 +FFE0 +1500 +3FC0 +E4A0 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_87C8 +ENCODING 34760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +A8A0 +AEA0 +AAE0 +FEA0 +28A0 +2F60 +38A0 +EFE0 +ENDCHAR +STARTCHAR U_87C9 +ENCODING 34761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FB60 +ADA0 +AB80 +FD60 +2280 +2920 +3840 +CF80 +ENDCHAR +STARTCHAR U_87CA +ENCODING 34762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0500 +FFE0 +0A40 +7280 +2680 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87CB +ENCODING 34763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +2520 +FB40 +AFE0 +AB40 +FD20 +2340 +2EA0 +3A60 +C9C0 +ENDCHAR +STARTCHAR U_87CC +ENCODING 34764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +AAE0 +ADA0 +AAA0 +FFE0 +2340 +2AA0 +3E60 +E9C0 +ENDCHAR +STARTCHAR U_87CD +ENCODING 34765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2220 +27A0 +FB20 +AEA0 +AA60 +F900 +27E0 +2B80 +3540 +C920 +ENDCHAR +STARTCHAR U_87CE +ENCODING 34766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +2440 +FFC0 +A900 +AFE0 +F920 +25A0 +2B60 +3DA0 +C960 +ENDCHAR +STARTCHAR U_87CF +ENCODING 34767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2540 +FFC0 +A940 +AFE0 +F940 +27C0 +2940 +3FC0 +C940 +ENDCHAR +STARTCHAR U_87D0 +ENCODING 34768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2FE0 +FAA0 +AB80 +A900 +FFC0 +2540 +2540 +3DC0 +C100 +ENDCHAR +STARTCHAR U_87D1 +ENCODING 34769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FFE0 +AA40 +ABC0 +FA40 +23C0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_87D2 +ENCODING 34770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +F940 +AFE0 +AA40 +FCA0 +2280 +2FE0 +3A80 +CC80 +ENDCHAR +STARTCHAR U_87D3 +ENCODING 34771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +ACA0 +AFE0 +AA20 +FDC0 +2280 +29C0 +3EA0 +E920 +ENDCHAR +STARTCHAR U_87D4 +ENCODING 34772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +23E0 +FAA0 +ABE0 +A880 +FBE0 +2080 +2FE0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_87D5 +ENCODING 34773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2BE0 +2A80 +FEE0 +AB80 +AA80 +FFC0 +2540 +2FC0 +7540 +85C0 +ENDCHAR +STARTCHAR U_87D6 +ENCODING 34774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +2A80 +2F80 +FAE0 +AEA0 +AAA0 +FEA0 +2AA0 +2FA0 +7AA0 +9120 +ENDCHAR +STARTCHAR U_87D7 +ENCODING 34775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4440 +FFE0 +A4A0 +3F80 +4440 +7FC0 +0400 +7F80 +44C0 +FFA0 +ENDCHAR +STARTCHAR U_87D8 +ENCODING 34776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22E0 +FF80 +AA40 +ABE0 +AA40 +FB40 +23C0 +2A40 +3BC0 +EC60 +ENDCHAR +STARTCHAR U_87D9 +ENCODING 34777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FC0 +F5A0 +B280 +BFE0 +B080 +FEA0 +2AC0 +2EA0 +3B60 +EE20 +ENDCHAR +STARTCHAR U_87DA +ENCODING 34778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FF20 +44C0 +7D20 +44C0 +2900 +FFC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87DB +ENCODING 34779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FA0 +FA40 +AF80 +A820 +AF40 +F980 +2700 +2D20 +3A40 +EF80 +ENDCHAR +STARTCHAR U_87DC +ENCODING 34780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2100 +FFE0 +AA40 +AE60 +ABC0 +F800 +2FE0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87DD +ENCODING 34781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2280 +FDE0 +AAA0 +AEE0 +AA80 +FAE0 +2080 +2FE0 +3AC0 +ECA0 +ENDCHAR +STARTCHAR U_87DE +ENCODING 34782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FDE0 +A740 +B480 +ED40 +AA20 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87DF +ENCODING 34783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FD20 +ABC0 +AE60 +ABC0 +FA40 +23C0 +2880 +3AC0 +EDA0 +ENDCHAR +STARTCHAR U_87E0 +ENCODING 34784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +FAA0 +AFE0 +A9C0 +AAA0 +FFE0 +22A0 +2BE0 +3AA0 +EBE0 +ENDCHAR +STARTCHAR U_87E1 +ENCODING 34785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F940 +AFC0 +A840 +FFC0 +2840 +2FE0 +3AA0 +CD20 +1060 +ENDCHAR +STARTCHAR U_87E2 +ENCODING 34786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +ABC0 +AA40 +FBC0 +2240 +2980 +3FE0 +CA40 +03C0 +ENDCHAR +STARTCHAR U_87E3 +ENCODING 34787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +2540 +FFE0 +A940 +AFE0 +FCA0 +24C0 +2AA0 +3960 +CA20 +ENDCHAR +STARTCHAR U_87E4 +ENCODING 34788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +A880 +AEE0 +AA80 +FFE0 +2280 +2FE0 +3A80 +EC60 +ENDCHAR +STARTCHAR U_87E5 +ENCODING 34789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +2140 +FFE0 +A880 +ABE0 +FAA0 +23E0 +2AA0 +3BE0 +CE20 +ENDCHAR +STARTCHAR U_87E6 +ENCODING 34790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2540 +FFE0 +AC40 +AFC0 +FC40 +27C0 +2C40 +3FC0 +CC60 +ENDCHAR +STARTCHAR U_87E7 +ENCODING 34791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +25E0 +2540 +FAA0 +A800 +AFE0 +F920 +27C0 +2940 +3A40 +CCC0 +ENDCHAR +STARTCHAR U_87E8 +ENCODING 34792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +FDE0 +D6A0 +FC80 +9140 +BFA0 +A480 +BF80 +8440 +FFE0 +ENDCHAR +STARTCHAR U_87E9 +ENCODING 34793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2840 +FDE0 +AAA0 +AFC0 +FA40 +2FC0 +2A40 +7AA0 +9520 +ENDCHAR +STARTCHAR U_87EA +ENCODING 34794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +22A0 +FBE0 +AAA0 +ABE0 +F8A0 +27E0 +2B40 +3D20 +C9E0 +ENDCHAR +STARTCHAR U_87EB +ENCODING 34795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +FFE0 +AAA0 +AFE0 +FA40 +23C0 +2A40 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_87EC +ENCODING 34796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +27E0 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_87ED +ENCODING 34797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +23E0 +FE80 +ABE0 +AA80 +FBE0 +2280 +2BE0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_87EE +ENCODING 34798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +2080 +FBE0 +A880 +AFE0 +FAA0 +27E0 +2A40 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_87EF +ENCODING 34799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +AA40 +AFE0 +FA40 +27E0 +2A80 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_87F0 +ENCODING 34800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +A940 +AFC0 +FAA0 +2920 +2FE0 +7AA0 +92A0 +ENDCHAR +STARTCHAR U_87F1 +ENCODING 34801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +FAA0 +AAA0 +AFE0 +FAA0 +2FE0 +2540 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_87F2 +ENCODING 34802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0480 +7F40 +2080 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87F3 +ENCODING 34803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FFE0 +A820 +AFE0 +FAA0 +27E0 +2840 +3FE0 +C440 +02C0 +ENDCHAR +STARTCHAR U_87F4 +ENCODING 34804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A00 +7BE0 +4A40 +FE40 +4440 +3FC0 +2440 +3FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87F5 +ENCODING 34805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2840 +FE40 +A9E0 +AE40 +FB40 +2EC0 +2A40 +7F40 +90C0 +ENDCHAR +STARTCHAR U_87F6 +ENCODING 34806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +FEA0 +AAA0 +AEE0 +AF00 +FFC0 +2100 +27C0 +3100 +EFE0 +ENDCHAR +STARTCHAR U_87F7 +ENCODING 34807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +AAA0 +AB80 +A800 +FBE0 +22A0 +2BE0 +3AA0 +EBE0 +ENDCHAR +STARTCHAR U_87F8 +ENCODING 34808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +D900 +2E00 +D5C0 +2C80 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_87F9 +ENCODING 34809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4920 +FD60 +5480 +7FE0 +5480 +BFE0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87FA +ENCODING 34810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AAA0 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3800 +EFE0 +ENDCHAR +STARTCHAR U_87FB +ENCODING 34811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F900 +AFE0 +A900 +AFE0 +FCA0 +27E0 +2EA0 +34C0 +ED20 +ENDCHAR +STARTCHAR U_87FC +ENCODING 34812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +7F40 +D480 +7540 +0A20 +3FC0 +2240 +3FC0 +0240 +7FA0 +ENDCHAR +STARTCHAR U_87FD +ENCODING 34813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +25E0 +2280 +FBE0 +A940 +AE80 +FBE0 +2280 +2BE0 +3A80 +CDE0 +ENDCHAR +STARTCHAR U_87FE +ENCODING 34814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +AAA0 +AFE0 +A800 +FFE0 +2800 +2BE0 +3A20 +EBE0 +ENDCHAR +STARTCHAR U_87FF +ENCODING 34815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +FA60 +A9C0 +FC80 +AD40 +FFC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8800 +ENCODING 34816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +FAA0 +AC80 +A940 +FFC0 +2540 +26C0 +3D40 +C7C0 +0C60 +ENDCHAR +STARTCHAR U_8801 +ENCODING 34817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +AAA0 +5EC0 +EAA0 +2EE0 +CA80 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8802 +ENCODING 34818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +AFE0 +A540 +FFE0 +2100 +2FE0 +3380 +D540 +0920 +ENDCHAR +STARTCHAR U_8803 +ENCODING 34819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7F80 +2080 +FFC0 +A540 +FF40 +B5C0 +FF40 +A540 +AE60 +ENDCHAR +STARTCHAR U_8804 +ENCODING 34820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2540 +FFE0 +AD40 +F6C0 +2FE0 +2920 +3AA0 +CFA0 +0860 +ENDCHAR +STARTCHAR U_8805 +ENCODING 34821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEE0 +AA80 +AEE0 +FAA0 +2EE0 +2AA0 +3EE0 +CA80 +03E0 +ENDCHAR +STARTCHAR U_8806 +ENCODING 34822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +FFE0 +8420 +FFE0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8807 +ENCODING 34823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F900 +AFC0 +AD40 +FFC0 +2540 +2FE0 +3AA0 +CFA0 +0860 +ENDCHAR +STARTCHAR U_8808 +ENCODING 34824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F4A0 +9FC0 +F4A0 +5560 +BFC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8809 +ENCODING 34825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +A800 +AFE0 +FC40 +27C0 +2280 +36A0 +DA40 +0320 +ENDCHAR +STARTCHAR U_880A +ENCODING 34826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +AFE0 +AAA0 +FFE0 +2AA0 +2FE0 +3A80 +CEC0 +12A0 +ENDCHAR +STARTCHAR U_880B +ENCODING 34827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +FA00 +AFE0 +A920 +FFE0 +2560 +2FE0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_880C +ENCODING 34828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +A900 +AFE0 +FA80 +2100 +2FC0 +3100 +CFE0 +0100 +ENDCHAR +STARTCHAR U_880D +ENCODING 34829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2980 +FFE0 +A920 +AF40 +A440 +FF40 +2B40 +2940 +3DA0 +CB20 +ENDCHAR +STARTCHAR U_880E +ENCODING 34830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2100 +FFE0 +AA80 +FD40 +2BA0 +2540 +3FE0 +C440 +0840 +ENDCHAR +STARTCHAR U_880F +ENCODING 34831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +F2A0 +DF60 +D540 +FFE0 +5540 +5FE0 +7540 +9540 +2340 +ENDCHAR +STARTCHAR U_8810 +ENCODING 34832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AB40 +AD60 +F900 +2440 +27C0 +3440 +C7C0 +0840 +ENDCHAR +STARTCHAR U_8811 +ENCODING 34833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2560 +FD40 +AB40 +ACA0 +FFE0 +2120 +2FE0 +3B80 +C540 +0920 +ENDCHAR +STARTCHAR U_8812 +ENCODING 34834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +6EC0 +5540 +6EC0 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8813 +ENCODING 34835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +AFE0 +A820 +AFE0 +FAA0 +25C0 +2AA0 +39A0 +EE80 +ENDCHAR +STARTCHAR U_8814 +ENCODING 34836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +AFE0 +A820 +AFC0 +FD20 +22C0 +2D80 +3AC0 +ED20 +ENDCHAR +STARTCHAR U_8815 +ENCODING 34837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +FD20 +AB40 +AD20 +FFE0 +2100 +2FE0 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_8816 +ENCODING 34838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +AA80 +ABE0 +FA80 +27E0 +2A40 +3980 +EE60 +ENDCHAR +STARTCHAR U_8817 +ENCODING 34839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +ADA0 +AFE0 +AC80 +FFE0 +2480 +27E0 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_8818 +ENCODING 34840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +FAA0 +AFE0 +AA80 +FFA0 +2AA0 +2FC0 +3AA0 +CF60 +0820 +ENDCHAR +STARTCHAR U_8819 +ENCODING 34841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +ABE0 +AC80 +ABC0 +FE40 +23C0 +2A40 +3BC0 +EE60 +ENDCHAR +STARTCHAR U_881A +ENCODING 34842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +3080 +D080 +7FE0 +56A0 +7FE0 +14A0 +FFE0 +ENDCHAR +STARTCHAR U_881B +ENCODING 34843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +AFE0 +AAA0 +AFE0 +F940 +27E0 +24A0 +3640 +C9A0 +ENDCHAR +STARTCHAR U_881C +ENCODING 34844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +F5E0 +4A40 +E4E0 +5B40 +4440 +FFE0 +64C0 +BFA0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_881D +ENCODING 34845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +AD40 +AFC0 +A800 +FFE0 +2AA0 +2FE0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_881E +ENCODING 34846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +79E0 +4920 +7960 +5500 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_881F +ENCODING 34847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +AFE0 +AAA0 +AFE0 +FD20 +2BA0 +2D60 +3BA0 +ED20 +ENDCHAR +STARTCHAR U_8820 +ENCODING 34848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +5140 +5F40 +7FC0 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8821 +ENCODING 34849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +1100 +FFE0 +1500 +EAE0 +3680 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8822 +ENCODING 34850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +3180 +DF60 +1100 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8823 +ENCODING 34851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +FFE0 +A940 +AFC0 +A940 +FFE0 +2D20 +3DA0 +D760 +2420 +ENDCHAR +STARTCHAR U_8824 +ENCODING 34852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A40 +71C0 +5F40 +4040 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8825 +ENCODING 34853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +FA80 +57E0 +D100 +7FC0 +4900 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8826 +ENCODING 34854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +A920 +AFC0 +A920 +FFE0 +2940 +2FE0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_8827 +ENCODING 34855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +FFE0 +9020 +7F80 +2080 +FFC0 +AD40 +FFC0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_8828 +ENCODING 34856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +A940 +AFC0 +FAA0 +2FE0 +28A0 +2EE0 +FAA0 +ENDCHAR +STARTCHAR U_8829 +ENCODING 34857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +2FE0 +F0A0 +BFE0 +B040 +BE80 +F1E0 +2EA0 +2AE0 +3EA0 +EAE0 +ENDCHAR +STARTCHAR U_882A +ENCODING 34858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2A00 +FFE0 +4A00 +7BE0 +4A20 +7FE0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_882B +ENCODING 34859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1840 +6D40 +F940 +5540 +A540 +48C0 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_882C +ENCODING 34860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2F80 +FAE0 +BF20 +B0E0 +BE80 +FAE0 +2E80 +2AE0 +3EA0 +EAE0 +ENDCHAR +STARTCHAR U_882D +ENCODING 34861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +D880 +4700 +5AC0 +4F80 +A200 +FFC0 +AD40 +FFC0 +2920 +FFE0 +ENDCHAR +STARTCHAR U_882E +ENCODING 34862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +FFE0 +AAA0 +AF40 +A9A0 +FFE0 +25A0 +2B60 +3DA0 +EB60 +ENDCHAR +STARTCHAR U_882F +ENCODING 34863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A440 +BFC0 +A440 +FFE0 +9080 +FFE0 +D6A0 +FFE0 +94A0 +FBE0 +ENDCHAR +STARTCHAR U_8830 +ENCODING 34864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AEE0 +AA80 +AFE0 +FA80 +2FE0 +26A0 +3A40 +EB20 +ENDCHAR +STARTCHAR U_8831 +ENCODING 34865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0440 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8832 +ENCODING 34866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +FFE0 +2900 +53E0 +88A0 +FBE0 +AAA0 +ABE0 +FCA0 +03E0 +ENDCHAR +STARTCHAR U_8833 +ENCODING 34867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +AAA0 +AEE0 +AA40 +FCA0 +2FE0 +2940 +3980 +EE60 +ENDCHAR +STARTCHAR U_8834 +ENCODING 34868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +FFE0 +AAA0 +FFE0 +2940 +3FE0 +C540 +1CC0 +07C0 +ENDCHAR +STARTCHAR U_8835 +ENCODING 34869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +FFE0 +A900 +AFE0 +A900 +FFE0 +2AA0 +2FE0 +3AA0 +EBA0 +ENDCHAR +STARTCHAR U_8836 +ENCODING 34870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +5140 +BFE0 +2040 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8837 +ENCODING 34871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +AAA0 +AEE0 +A900 +FFE0 +2900 +2FE0 +3900 +EFE0 +ENDCHAR +STARTCHAR U_8838 +ENCODING 34872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FEE0 +AAA0 +AFE0 +A480 +FFE0 +2480 +27E0 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_8839 +ENCODING 34873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +90A0 +BFA0 +5080 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_883A +ENCODING 34874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2080 +FFE0 +4940 +BFA0 +2480 +FBE0 +AAA0 +FBE0 +24A0 +FFE0 +ENDCHAR +STARTCHAR U_883B +ENCODING 34875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +EEE0 +4040 +EEE0 +5AA0 +AF40 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_883C +ENCODING 34876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +AFE0 +A480 +FFE0 +2880 +2FE0 +3240 +C980 +0660 +ENDCHAR +STARTCHAR U_883D +ENCODING 34877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6940 +A520 +3FE0 +D140 +7C80 +5160 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_883E +ENCODING 34878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +AD40 +AFE0 +FAA0 +2BE0 +2D20 +3BA0 +C920 +17E0 +ENDCHAR +STARTCHAR U_883F +ENCODING 34879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5520 +2AA0 +FFE0 +2AA0 +5520 +2AA0 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_8840 +ENCODING 34880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1000 +7FC0 +4A40 +4A40 +4A40 +4A40 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8841 +ENCODING 34881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2000 +2000 +3FC0 +0400 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8842 +ENCODING 34882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +F920 +A920 +AB20 +AD20 +A920 +BD20 +C220 +02A0 +0440 +ENDCHAR +STARTCHAR U_8843 +ENCODING 34883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4080 +F880 +A880 +A9C0 +AAA0 +ACA0 +A880 +BC80 +C080 +0080 +ENDCHAR +STARTCHAR U_8844 +ENCODING 34884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4140 +F940 +A940 +A940 +ABC0 +A940 +A940 +BD40 +C140 +07E0 +ENDCHAR +STARTCHAR U_8845 +ENCODING 34885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +44A0 +FAC0 +A880 +ABE0 +A880 +ABE0 +A880 +BC80 +C080 +0080 +ENDCHAR +STARTCHAR U_8846 +ENCODING 34886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2A40 +FFE0 +0380 +7C40 +2680 +5500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8847 +ENCODING 34887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4700 +FCC0 +AD00 +AD40 +AD60 +AD40 +BD40 +C5A0 +0920 +1000 +ENDCHAR +STARTCHAR U_8848 +ENCODING 34888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4240 +FA40 +ABC0 +AA40 +ABC0 +AA40 +AA60 +BFC0 +C040 +0040 +ENDCHAR +STARTCHAR U_8849 +ENCODING 34889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +FBC0 +AE40 +A980 +A980 +AA40 +AFE0 +BA40 +C3C0 +0240 +ENDCHAR +STARTCHAR U_884A +ENCODING 34890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +47E0 +FA80 +AFE0 +AAA0 +AFE0 +A940 +AFE0 +AD40 +FAA0 +0B60 +ENDCHAR +STARTCHAR U_884B +ENCODING 34891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +7FE0 +0440 +FFE0 +2480 +5540 +75C0 +5540 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_884C +ENCODING 34892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_884D +ENCODING 34893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +25E0 +4000 +9000 +2BE0 +6240 +A440 +2C40 +2440 +2440 +25C0 +ENDCHAR +STARTCHAR U_884E +ENCODING 34894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +4E00 +8400 +1400 +3EE0 +6440 +A440 +2440 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_884F +ENCODING 34895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +4000 +A000 +5EE0 +CA40 +4A40 +4A40 +5340 +6240 +40C0 +ENDCHAR +STARTCHAR U_8850 +ENCODING 34896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +4800 +A9E0 +4E40 +CA40 +4A40 +4E40 +4840 +4E40 +40C0 +ENDCHAR +STARTCHAR U_8851 +ENCODING 34897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +5400 +B3E0 +4840 +DE40 +4240 +5440 +4840 +4540 +4080 +ENDCHAR +STARTCHAR U_8852 +ENCODING 34898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2200 +4F00 +A4E0 +2940 +5E40 +C240 +4440 +4940 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8853 +ENCODING 34899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4DE0 +8A00 +3E00 +49E0 +DC40 +5A40 +6A40 +4840 +4840 +49C0 +ENDCHAR +STARTCHAR U_8854 +ENCODING 34900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4E00 +B000 +2EE0 +4440 +DF40 +4440 +4440 +4640 +4440 +40C0 +ENDCHAR +STARTCHAR U_8855 +ENCODING 34901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +5F00 +9100 +3DE0 +5140 +DD40 +5540 +5540 +5D40 +5140 +52C0 +ENDCHAR +STARTCHAR U_8856 +ENCODING 34902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +4A00 +9F00 +2AE0 +4A40 +CA40 +5F40 +4040 +4A40 +5140 +6080 +ENDCHAR +STARTCHAR U_8857 +ENCODING 34903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5E00 +8400 +3F00 +44E0 +C440 +5F40 +4440 +4740 +5C40 +40C0 +ENDCHAR +STARTCHAR U_8858 +ENCODING 34904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2EE0 +5400 +A400 +5EE0 +C440 +5740 +5440 +5740 +7840 +40C0 +ENDCHAR +STARTCHAR U_8859 +ENCODING 34905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +4400 +9E00 +2AE0 +4A40 +DF40 +4040 +5E40 +5240 +5E40 +52C0 +ENDCHAR +STARTCHAR U_885A +ENCODING 34906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +5500 +9500 +3FE0 +5540 +FD40 +6F40 +6D40 +7D40 +4540 +4BC0 +ENDCHAR +STARTCHAR U_885B +ENCODING 34907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +5E00 +8A00 +3FE0 +5240 +DE40 +4440 +5F40 +5440 +7F40 +44C0 +ENDCHAR +STARTCHAR U_885C +ENCODING 34908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +4CE0 +BE00 +49E0 +DE40 +5A40 +5640 +5A40 +5640 +5F40 +4080 +ENDCHAR +STARTCHAR U_885D +ENCODING 34909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +4400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +4E40 +4440 +5FC0 +ENDCHAR +STARTCHAR U_885E +ENCODING 34910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FE0 +4500 +BFE0 +5140 +DF40 +4440 +5F40 +5540 +5540 +44C0 +ENDCHAR +STARTCHAR U_885F +ENCODING 34911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +34E0 +4A00 +A000 +5FE0 +C840 +5E40 +5240 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_8860 +ENCODING 34912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3EE0 +4800 +BFE0 +5240 +DE40 +5240 +5E40 +5240 +7F40 +52C0 +ENDCHAR +STARTCHAR U_8861 +ENCODING 34913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +5F40 +4A40 +51C0 +ENDCHAR +STARTCHAR U_8862 +ENCODING 34914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5500 +9F00 +35E0 +5F40 +5240 +FF40 +5240 +5F40 +5240 +5FC0 +ENDCHAR +STARTCHAR U_8863 +ENCODING 34915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0A40 +1280 +3100 +5100 +9480 +1840 +1020 +ENDCHAR +STARTCHAR U_8864 +ENCODING 34916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +F8 +10 +28 +70 +A8 +28 +20 +20 +20 +ENDCHAR +STARTCHAR U_8865 +ENCODING 34917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +1100 +2980 +7160 +A920 +2900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_8866 +ENCODING 34918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +1100 +2900 +77E0 +A900 +2900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_8867 +ENCODING 34919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +F880 +1080 +2FE0 +7080 +A880 +2880 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_8868 +ENCODING 34920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +0A40 +1280 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8869 +ENCODING 34921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +FD40 +1540 +2A40 +7280 +AA80 +2900 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_886A +ENCODING 34922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FAA0 +12E0 +2FA0 +72A0 +AAA0 +2AC0 +2280 +2220 +21E0 +ENDCHAR +STARTCHAR U_886B +ENCODING 34923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2080 +FB00 +1020 +2840 +7080 +AB00 +2820 +2040 +2180 +2600 +ENDCHAR +STARTCHAR U_886C +ENCODING 34924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +FFE0 +1040 +2A40 +7140 +A940 +2840 +2040 +2040 +21C0 +ENDCHAR +STARTCHAR U_886D +ENCODING 34925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1100 +2900 +77E0 +A900 +2900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_886E +ENCODING 34926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +2440 +48A0 +3F00 +0C40 +3280 +D100 +14E0 +1840 +ENDCHAR +STARTCHAR U_886F +ENCODING 34927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +F440 +1440 +2820 +77C0 +A940 +2940 +2240 +2440 +2980 +ENDCHAR +STARTCHAR U_8870 +ENCODING 34928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +2080 +FFE0 +2080 +3FA0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8871 +ENCODING 34929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +FA80 +12E0 +2A40 +7240 +AA40 +2B40 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_8872 +ENCODING 34930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1520 +2D20 +75A0 +B660 +2C20 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_8873 +ENCODING 34931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +F280 +1440 +2540 +2920 +7200 +AA00 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_8874 +ENCODING 34932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1520 +2900 +7180 +A980 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8875 +ENCODING 34933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +1220 +2A20 +73E0 +AA20 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8876 +ENCODING 34934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +2CA0 +74A0 +AFE0 +24A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_8877 +ENCODING 34935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +0A20 +1140 +3080 +D440 +1820 +ENDCHAR +STARTCHAR U_8878 +ENCODING 34936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1240 +2420 +6A40 +B240 +2A40 +2A40 +2240 +2440 +ENDCHAR +STARTCHAR U_8879 +ENCODING 34937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +27C0 +FC80 +1480 +2FE0 +7480 +AC80 +2C80 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_887A +ENCODING 34938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +7FC0 +4200 +7FC0 +1240 +E680 +1B00 +6880 +0E60 +ENDCHAR +STARTCHAR U_887B +ENCODING 34939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +1440 +2FE0 +7440 +AFE0 +2C40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_887C +ENCODING 34940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +1080 +2880 +73E0 +A940 +2940 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_887D +ENCODING 34941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +27C0 +F900 +1100 +2900 +77E0 +A900 +2900 +2100 +2100 +27E0 +ENDCHAR +STARTCHAR U_887E +ENCODING 34942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1500 +2480 +DF60 +0900 +0600 +FFE0 +1440 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_887F +ENCODING 34943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +1640 +2920 +7000 +AFE0 +2840 +2080 +2080 +2100 +ENDCHAR +STARTCHAR U_8880 +ENCODING 34944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +1420 +2120 +28A0 +7020 +A8A0 +2320 +2020 +20C0 +ENDCHAR +STARTCHAR U_8881 +ENCODING 34945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +2080 +3F80 +0C40 +1280 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8882 +ENCODING 34946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1140 +2140 +2FE0 +7100 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_8883 +ENCODING 34947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F920 +4120 +5A20 +6460 +0400 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8884 +ENCODING 34948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +1100 +27E0 +2900 +7100 +A900 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_8885 +ENCODING 34949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4880 +4500 +7FE0 +0440 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8886 +ENCODING 34950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +17C0 +2900 +77E0 +A920 +2920 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_8887 +ENCODING 34951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F640 +1540 +2D40 +77E0 +AC40 +2440 +2440 +2440 +28C0 +ENDCHAR +STARTCHAR U_8888 +ENCODING 34952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2A40 +4BC0 +9400 +0200 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8889 +ENCODING 34953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +1420 +2200 +2A40 +7380 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_888A +ENCODING 34954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1440 +2920 +7100 +AFE0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_888B +ENCODING 34955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +7FE0 +A100 +24A0 +2260 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_888C +ENCODING 34956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +4280 +BE80 +2120 +3FE0 +3240 +D580 +18E0 +ENDCHAR +STARTCHAR U_888D +ENCODING 34957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC20 +13A0 +22A0 +2AA0 +73A0 +AA40 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_888E +ENCODING 34958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +F5E0 +14A0 +2AA0 +2EA0 +74A0 +AAA0 +2FA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_888F +ENCODING 34959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7E0 +1100 +2200 +2BE0 +7480 +A880 +3080 +27E0 +2000 +ENDCHAR +STARTCHAR U_8890 +ENCODING 34960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F2A0 +1220 +2A40 +6A80 +B340 +2A20 +2640 +2A40 +33C0 +ENDCHAR +STARTCHAR U_8891 +ENCODING 34961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +F920 +1220 +24E0 +2840 +77E0 +AC20 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_8892 +ENCODING 34962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +1240 +2BC0 +7240 +AA40 +2BC0 +2240 +2000 +2FE0 +ENDCHAR +STARTCHAR U_8893 +ENCODING 34963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +1240 +2BC0 +7240 +AA40 +2BC0 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_8894 +ENCODING 34964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F040 +1040 +2740 +2D40 +7540 +AF40 +2840 +2040 +20C0 +ENDCHAR +STARTCHAR U_8895 +ENCODING 34965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +1420 +2880 +7280 +AA80 +2A40 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_8896 +ENCODING 34966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +17E0 +2D20 +7520 +AFE0 +2D20 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_8897 +ENCODING 34967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +FC40 +1120 +2A00 +7480 +A920 +2A40 +2080 +2100 +2600 +ENDCHAR +STARTCHAR U_8898 +ENCODING 34968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC80 +12A0 +2AE0 +77A0 +AAA0 +2AC0 +22A0 +2220 +21E0 +ENDCHAR +STARTCHAR U_8899 +ENCODING 34969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2100 +FBE0 +1220 +2A20 +7220 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_889A +ENCODING 34970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +1200 +2A00 +73C0 +AA40 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_889B +ENCODING 34971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2780 +FC80 +1480 +2FE0 +7480 +AC80 +2CA0 +2560 +2720 +24A0 +ENDCHAR +STARTCHAR U_889C +ENCODING 34972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2FC0 +7100 +A980 +2B40 +2520 +2920 +3100 +ENDCHAR +STARTCHAR U_889D +ENCODING 34973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +17E0 +2440 +6E40 +B540 +2D40 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_889E +ENCODING 34974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +A0A0 +3F80 +0C40 +3280 +D100 +1480 +1860 +ENDCHAR +STARTCHAR U_889F +ENCODING 34975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +FFC0 +1100 +2900 +77E0 +A900 +2900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_88A0 +ENCODING 34976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2400 +3F80 +4400 +FFE0 +2080 +CC60 +1A80 +E980 +0C60 +ENDCHAR +STARTCHAR U_88A1 +ENCODING 34977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1540 +2FC0 +7540 +AFE0 +2C40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_88A2 +ENCODING 34978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +FB40 +1100 +2FE0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_88A3 +ENCODING 34979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +F540 +1FE0 +2540 +6D40 +B540 +2DC0 +2400 +27E0 +2000 +ENDCHAR +STARTCHAR U_88A4 +ENCODING 34980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +7FC0 +0A40 +F200 +0640 +1980 +E880 +0C60 +ENDCHAR +STARTCHAR U_88A5 +ENCODING 34981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +1200 +2400 +6FC0 +B440 +2C40 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_88A6 +ENCODING 34982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F520 +1520 +27E0 +7100 +A900 +2520 +2520 +2520 +27E0 +ENDCHAR +STARTCHAR U_88A7 +ENCODING 34983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC20 +1020 +2BA0 +72A0 +AAA0 +2BA0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_88A8 +ENCODING 34984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2100 +FFE0 +1100 +2A40 +7780 +A880 +2900 +2240 +2FA0 +2420 +ENDCHAR +STARTCHAR U_88A9 +ENCODING 34985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F1E0 +1100 +2900 +77C0 +AC40 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_88AA +ENCODING 34986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2900 +77E0 +A900 +2A00 +2440 +2FA0 +2420 +ENDCHAR +STARTCHAR U_88AB +ENCODING 34987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +2C80 +77E0 +AD40 +2540 +2480 +2940 +3620 +ENDCHAR +STARTCHAR U_88AC +ENCODING 34988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +1240 +3580 +D8E0 +ENDCHAR +STARTCHAR U_88AD +ENCODING 34989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +0A80 +1320 +6DE0 +0400 +FFE0 +1240 +3280 +D900 +10E0 +ENDCHAR +STARTCHAR U_88AE +ENCODING 34990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F7E0 +1400 +2900 +7100 +AD40 +2520 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_88AF +ENCODING 34991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +F520 +17E0 +2900 +73C0 +AA40 +2540 +2480 +2940 +2220 +ENDCHAR +STARTCHAR U_88B0 +ENCODING 34992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +FFE0 +2240 +3FE0 +0440 +FFE0 +0A80 +3100 +D4E0 +1840 +ENDCHAR +STARTCHAR U_88B1 +ENCODING 34993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22C0 +F4A0 +1480 +27E0 +6C80 +B480 +2C80 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_88B2 +ENCODING 34994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3100 +0E00 +77C0 +1880 +0500 +7E40 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_88B3 +ENCODING 34995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23E0 +F220 +1540 +2880 +73E0 +AD20 +2AA0 +2040 +2180 +2600 +ENDCHAR +STARTCHAR U_88B4 +ENCODING 34996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +17C0 +2820 +77C0 +AA00 +23C0 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_88B5 +ENCODING 34997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2260 +F380 +1480 +2C80 +77E0 +AC80 +2480 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_88B6 +ENCODING 34998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FE40 +1180 +2E60 +7080 +AFE0 +2C80 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_88B7 +ENCODING 34999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +FA40 +1420 +2BC0 +7000 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88B8 +ENCODING 35000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +FA00 +13E0 +2A40 +7480 +AFE0 +2480 +2480 +2480 +2580 +ENDCHAR +STARTCHAR U_88B9 +ENCODING 35001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2080 +F900 +13E0 +2A20 +7220 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88BA +ENCODING 35002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +1080 +2BE0 +7000 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88BB +ENCODING 35003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +1FE0 +2AA0 +7AA0 +AAA0 +3AA0 +2AA0 +2860 +2000 +ENDCHAR +STARTCHAR U_88BC +ENCODING 35004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F440 +1A40 +2980 +7240 +AC20 +2BC0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_88BD +ENCODING 35005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +FFA0 +1AA0 +2AA0 +2AA0 +7AA0 +AAA0 +24A0 +2AE0 +31A0 +ENDCHAR +STARTCHAR U_88BE +ENCODING 35006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +FFC0 +1500 +2900 +77E0 +A900 +2B80 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_88BF +ENCODING 35007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1100 +2FE0 +7100 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88C0 +ENCODING 35008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FD20 +17E0 +2D20 +7520 +ADA0 +2660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_88C1 +ENCODING 35009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +1100 +FF20 +2540 +7880 +A5A0 +3260 +2420 +ENDCHAR +STARTCHAR U_88C2 +ENCODING 35010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +7D20 +A920 +10E0 +2400 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88C3 +ENCODING 35011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F200 +17E0 +2800 +77E0 +AA00 +2280 +2240 +2240 +2200 +ENDCHAR +STARTCHAR U_88C4 +ENCODING 35012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +22E0 +F400 +1A00 +25E0 +2C40 +7440 +AC40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_88C5 +ENCODING 35013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9FE0 +5100 +3100 +D7C0 +1200 +FFE0 +0C40 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_88C6 +ENCODING 35014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +FD40 +1100 +2FE0 +7020 +A820 +2FE0 +2020 +27E0 +2020 +ENDCHAR +STARTCHAR U_88C7 +ENCODING 35015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +FFE0 +1AA0 +2AA0 +7AA0 +AAA0 +3AA0 +2AA0 +3FE0 +2000 +ENDCHAR +STARTCHAR U_88C8 +ENCODING 35016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F900 +17C0 +2B00 +7500 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_88C9 +ENCODING 35017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7500 +AD20 +24C0 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_88CA +ENCODING 35018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F00 +2100 +3F00 +2100 +3FE0 +0820 +FFE0 +3500 +D200 +19C0 +ENDCHAR +STARTCHAR U_88CB +ENCODING 35019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F800 +13C0 +2A40 +7240 +ABC0 +2000 +2240 +2080 +2FE0 +ENDCHAR +STARTCHAR U_88CC +ENCODING 35020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2D40 +7540 +ABA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_88CD +ENCODING 35021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FCA0 +17E0 +2CA0 +74E0 +ADA0 +26A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_88CE +ENCODING 35022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +17C0 +2800 +77E0 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88CF +ENCODING 35023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_88D0 +ENCODING 35024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7E0 +1000 +2FE0 +7420 +AFE0 +2420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_88D1 +ENCODING 35025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +FC40 +17C0 +2440 +6FE0 +B440 +2FC0 +2140 +2240 +2CC0 +ENDCHAR +STARTCHAR U_88D2 +ENCODING 35026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3BC0 +2040 +3BC0 +2040 +3FC0 +1940 +2880 +CC60 +ENDCHAR +STARTCHAR U_88D3 +ENCODING 35027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +20A0 +FFE0 +1080 +2AA0 +7FA0 +AAC0 +3A80 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_88D4 +ENCODING 35028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1240 +F580 +1860 +7FC0 +4A40 +71C0 +4E40 +4A40 +4EC0 +ENDCHAR +STARTCHAR U_88D5 +ENCODING 35029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2240 +F420 +1180 +2A40 +7420 +ABC0 +2240 +2240 +23C0 +2240 +ENDCHAR +STARTCHAR U_88D6 +ENCODING 35030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +F7C0 +1400 +2FE0 +7680 +AEA0 +26C0 +2A80 +2B40 +3220 +ENDCHAR +STARTCHAR U_88D7 +ENCODING 35031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F200 +1440 +2FE0 +7020 +AD40 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_88D8 +ENCODING 35032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +1700 +3580 +CC40 +0420 +FFE0 +3240 +D580 +1860 +ENDCHAR +STARTCHAR U_88D9 +ENCODING 35033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +FFE0 +1240 +2FC0 +7400 +AFC0 +2440 +2C40 +37C0 +2440 +ENDCHAR +STARTCHAR U_88DA +ENCODING 35034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +27E0 +F480 +2480 +4480 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_88DB +ENCODING 35035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_88DC +ENCODING 35036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +27E0 +F900 +17E0 +2D20 +77E0 +AD20 +27E0 +2520 +2520 +2560 +ENDCHAR +STARTCHAR U_88DD +ENCODING 35037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FE0 +1100 +F100 +57C0 +8400 +FFE0 +1480 +3300 +D580 +1860 +ENDCHAR +STARTCHAR U_88DE +ENCODING 35038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFC0 +1440 +2C40 +77C0 +AA80 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_88DF +ENCODING 35039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +8920 +2140 +C080 +5F00 +0400 +FFE0 +1A40 +E980 +0C60 +ENDCHAR +STARTCHAR U_88E0 +ENCODING 35040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0880 +FFE0 +1080 +7F80 +3080 +DF80 +0400 +FFE0 +3280 +D9E0 +ENDCHAR +STARTCHAR U_88E1 +ENCODING 35041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FD40 +17C0 +2D40 +77C0 +A900 +2FC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88E2 +ENCODING 35042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +4880 +E3E0 +3900 +4A80 +5BE0 +E880 +5BE0 +4880 +5480 +63E0 +ENDCHAR +STARTCHAR U_88E3 +ENCODING 35043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1440 +2BA0 +6800 +B240 +2D40 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_88E4 +ENCODING 35044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F900 +2FE0 +4900 +DA80 +6BE0 +5880 +4FE0 +5080 +5080 +ENDCHAR +STARTCHAR U_88E5 +ENCODING 35045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +45E0 +E820 +2BA0 +5AA0 +6BA0 +DAA0 +4BA0 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_88E6 +ENCODING 35046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3280 +4100 +6FE0 +4540 +6B00 +1480 +3300 +D4E0 +1840 +ENDCHAR +STARTCHAR U_88E7 +ENCODING 35047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4520 +F540 +2980 +4240 +5D20 +E120 +5540 +4980 +4240 +4C20 +ENDCHAR +STARTCHAR U_88E8 +ENCODING 35048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FD20 +17E0 +2520 +2FE0 +7100 +AA80 +2FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_88E9 +ENCODING 35049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +2FC0 +7000 +AC80 +26E0 +2480 +26A0 +24E0 +ENDCHAR +STARTCHAR U_88EA +ENCODING 35050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +F420 +17A0 +2A20 +77E0 +AA20 +2AA0 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_88EB +ENCODING 35051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +4AA0 +FAA0 +2EE0 +5820 +6FE0 +D820 +4EE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_88EC +ENCODING 35052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +17E0 +2A40 +7520 +ABC0 +2A40 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_88ED +ENCODING 35053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +1520 +2FC0 +7520 +ADE0 +2400 +25C0 +2940 +3260 +ENDCHAR +STARTCHAR U_88EE +ENCODING 35054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FBC0 +1240 +2BC0 +7000 +AFE0 +2C20 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_88EF +ENCODING 35055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4920 +FBA0 +2920 +4BA0 +5820 +EBA0 +5AA0 +4BA0 +4820 +50E0 +ENDCHAR +STARTCHAR U_88F0 +ENCODING 35056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +29A0 +F540 +12A0 +2D20 +7000 +AFE0 +2AA0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_88F1 +ENCODING 35057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F100 +17C0 +2100 +2FE0 +7320 +ACC0 +3480 +2640 +2420 +ENDCHAR +STARTCHAR U_88F2 +ENCODING 35058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +F100 +1FE0 +2920 +7DA0 +AB60 +3DA0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_88F3 +ENCODING 35059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +50A0 +1F80 +0400 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_88F4 +ENCODING 35060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0920 +3940 +CA80 +0C60 +ENDCHAR +STARTCHAR U_88F5 +ENCODING 35061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +7BC0 +0A00 +7BC0 +0400 +1AC0 +2900 +CCE0 +0840 +ENDCHAR +STARTCHAR U_88F6 +ENCODING 35062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FEE0 +1280 +2EE0 +7280 +AA80 +2EE0 +2280 +2280 +2280 +ENDCHAR +STARTCHAR U_88F7 +ENCODING 35063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1200 +2FE0 +7440 +AFA0 +2480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_88F8 +ENCODING 35064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2FC0 +7100 +AFE0 +2900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_88F9 +ENCODING 35065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +2480 +CD60 +3200 +D900 +10E0 +ENDCHAR +STARTCHAR U_88FA +ENCODING 35066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FA80 +1540 +2FE0 +7540 +AFC0 +2540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_88FB +ENCODING 35067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +13E0 +FD40 +5880 +9540 +2620 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88FC +ENCODING 35068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2AA0 +2D20 +2220 +24C0 +ENDCHAR +STARTCHAR U_88FD +ENCODING 35069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +7D20 +9120 +FD20 +1120 +7C60 +5400 +FFE0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88FE +ENCODING 35070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FFE0 +1480 +2FE0 +7480 +AC80 +27E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_88FF +ENCODING 35071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +1280 +2FE0 +7040 +A740 +3540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_8900 +ENCODING 35072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27E0 +FA40 +13C0 +2A40 +73C0 +AA40 +2FE0 +2000 +2240 +2420 +ENDCHAR +STARTCHAR U_8901 +ENCODING 35073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +1A80 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8902 +ENCODING 35074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2F80 +F280 +12C0 +2FA0 +72A0 +AF80 +2A80 +2280 +2380 +2C80 +ENDCHAR +STARTCHAR U_8903 +ENCODING 35075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +25C0 +F500 +1FE0 +2800 +77C0 +AC40 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8904 +ENCODING 35076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F140 +17E0 +2940 +77C0 +A900 +2FE0 +2240 +2180 +2660 +ENDCHAR +STARTCHAR U_8905 +ENCODING 35077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F440 +2280 +4FE0 +5920 +E7C0 +5540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_8906 +ENCODING 35078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_8907 +ENCODING 35079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F800 +17C0 +2C40 +77C0 +AC40 +27C0 +2C40 +3380 +2C60 +ENDCHAR +STARTCHAR U_8908 +ENCODING 35080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +1100 +2FC0 +7540 +AFC0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8909 +ENCODING 35081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4FE0 +F4A0 +2EA0 +44A0 +5F60 +E500 +5FE0 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_890A +ENCODING 35082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F820 +2FE0 +4800 +5FE0 +EAA0 +5FE0 +4AA0 +5AA0 +6860 +ENDCHAR +STARTCHAR U_890B +ENCODING 35083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +27E0 +FD40 +15C0 +2C00 +77E0 +A900 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_890C +ENCODING 35084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F7C0 +1100 +2FC0 +7540 +AFC0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_890D +ENCODING 35085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FD40 +17C0 +3000 +6FE0 +B200 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_890E +ENCODING 35086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +47E0 +7380 +4540 +7D20 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_890F +ENCODING 35087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3100 +47C0 +7540 +4540 +77C0 +1C80 +3300 +D8E0 +1040 +ENDCHAR +STARTCHAR U_8910 +ENCODING 35088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2CA0 +2560 +27A0 +2040 +ENDCHAR +STARTCHAR U_8911 +ENCODING 35089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80C0 +4F20 +F540 +2FE0 +5200 +6FE0 +D400 +47C0 +4A40 +5180 +4660 +ENDCHAR +STARTCHAR U_8912 +ENCODING 35090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1440 +27C0 +7100 +AFE0 +2540 +0920 +3480 +D300 +18E0 +ENDCHAR +STARTCHAR U_8913 +ENCODING 35091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F540 +1DC0 +2480 +6FE0 +B480 +2DC0 +26A0 +2480 +2480 +ENDCHAR +STARTCHAR U_8914 +ENCODING 35092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2000 +FBC0 +1240 +2BC0 +7000 +AFE0 +2520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_8915 +ENCODING 35093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8380 +4440 +FBA0 +2000 +4EA0 +5AA0 +EEA0 +5AA0 +4EA0 +4A20 +4A60 +ENDCHAR +STARTCHAR U_8916 +ENCODING 35094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83C0 +4440 +F780 +2080 +5FE0 +6220 +DD40 +4280 +4DC0 +42A0 +4D80 +ENDCHAR +STARTCHAR U_8917 +ENCODING 35095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4A40 +FBC0 +2A40 +4BC0 +5900 +EFE0 +5A40 +4980 +4A40 +4FE0 +ENDCHAR +STARTCHAR U_8918 +ENCODING 35096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F940 +17E0 +2240 +2BC0 +7080 +AFE0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_8919 +ENCODING 35097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +2EC0 +F280 +16E0 +2800 +77C0 +AC40 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_891A +ENCODING 35098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2120 +F7C0 +1140 +2FE0 +7100 +ABC0 +2640 +3BC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_891B +ENCODING 35099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1380 +2D40 +7120 +AFE0 +2240 +2680 +2140 +2620 +ENDCHAR +STARTCHAR U_891C +ENCODING 35100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +7D40 +5740 +74A0 +9BE0 +0400 +FFE0 +3240 +D580 +1860 +ENDCHAR +STARTCHAR U_891D +ENCODING 35101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +2540 +F7C0 +1540 +2FC0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_891E +ENCODING 35102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_891F +ENCODING 35103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_8920 +ENCODING 35104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +17E0 +2280 +6FE0 +B540 +2FC0 +2540 +3FE0 +2440 +ENDCHAR +STARTCHAR U_8921 +ENCODING 35105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1100 +2A80 +7440 +ABA0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8922 +ENCODING 35106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3FC0 +1220 +EDE0 +1A80 +E900 +0CE0 +ENDCHAR +STARTCHAR U_8923 +ENCODING 35107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +1440 +29A0 +7240 +AC20 +2FC0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8924 +ENCODING 35108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +1FE0 +2000 +77C0 +A440 +37E0 +2D40 +3680 +2460 +ENDCHAR +STARTCHAR U_8925 +ENCODING 35109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25C0 +FC00 +17E0 +2DA0 +7540 +AD20 +2FE0 +2640 +2940 +3080 +ENDCHAR +STARTCHAR U_8926 +ENCODING 35110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +84A0 +4AC0 +FF80 +20A0 +4EE0 +5A00 +EEA0 +5AC0 +4E80 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8927 +ENCODING 35111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4AA0 +7AC0 +4C80 +7940 +4A20 +FFE0 +1220 +3140 +D680 +1860 +ENDCHAR +STARTCHAR U_8928 +ENCODING 35112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +AFE0 +3200 +27C0 +2900 +37E0 +ENDCHAR +STARTCHAR U_8929 +ENCODING 35113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4C20 +4BC0 +FE40 +4980 +8A40 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_892A +ENCODING 35114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +4A40 +E3C0 +3A40 +4BC0 +DA80 +6AA0 +5A40 +4B20 +5400 +63E0 +ENDCHAR +STARTCHAR U_892B +ENCODING 35115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80E0 +4F80 +F880 +2BE0 +4AA0 +5BC0 +EAA0 +5AE0 +4B40 +5540 +6A60 +ENDCHAR +STARTCHAR U_892C +ENCODING 35116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4240 +F180 +2EE0 +5AA0 +6440 +DAA0 +4100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_892D +ENCODING 35117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4400 +7F80 +4400 +7FC0 +5540 +8AC0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_892E +ENCODING 35118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +4200 +FFE0 +8420 +7FC0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_892F +ENCODING 35119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +FA40 +2FE0 +4A40 +5BC0 +E880 +5BE0 +4AA0 +4AE0 +5080 +ENDCHAR +STARTCHAR U_8930 +ENCODING 35120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +7FC0 +0900 +FFE0 +2480 +7F40 +9AA0 +2900 +4CE0 +ENDCHAR +STARTCHAR U_8931 +ENCODING 35121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +7FC0 +2480 +1500 +6CC0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_8932 +ENCODING 35122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F880 +2FE0 +4AA0 +5BE0 +EAA0 +5BE0 +4880 +4FE0 +5080 +ENDCHAR +STARTCHAR U_8933 +ENCODING 35123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +57E0 +EAA0 +23E0 +5EA0 +57E0 +E480 +57E0 +4480 +4480 +4BE0 +ENDCHAR +STARTCHAR U_8934 +ENCODING 35124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4A80 +EAE0 +2B00 +4A40 +5220 +E000 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8935 +ENCODING 35125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FA80 +1520 +2EA0 +77E0 +A900 +2FE0 +2AA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_8936 +ENCODING 35126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4220 +FAA0 +2660 +4AA0 +5100 +E7E0 +5420 +47E0 +4420 +47E0 +ENDCHAR +STARTCHAR U_8937 +ENCODING 35127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4880 +F2E0 +2280 +4FE0 +5880 +EA80 +5AE0 +4A80 +4A80 +4DE0 +ENDCHAR +STARTCHAR U_8938 +ENCODING 35128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +F540 +2FE0 +5540 +6FE0 +D920 +4FE0 +4440 +4380 +4C60 +ENDCHAR +STARTCHAR U_8939 +ENCODING 35129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5D00 +EBC0 +3D40 +5540 +EB40 +5D40 +49C0 +4E60 +5260 +4420 +ENDCHAR +STARTCHAR U_893A +ENCODING 35130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7780 +2280 +FEA0 +52A0 +FD60 +2400 +FFC0 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_893B +ENCODING 35131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +FBC0 +5140 +ABC0 +2560 +FA20 +1940 +2A80 +CC60 +ENDCHAR +STARTCHAR U_893C +ENCODING 35132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +FFE0 +2AA0 +4FE0 +5440 +EFA0 +5480 +57A0 +4420 +43E0 +ENDCHAR +STARTCHAR U_893D +ENCODING 35133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4240 +BD40 +54C0 +FFE0 +0A20 +1940 +EA80 +0C60 +ENDCHAR +STARTCHAR U_893E +ENCODING 35134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +FFE0 +2AA0 +4FE0 +5000 +E7C0 +5000 +4FE0 +4540 +5B20 +ENDCHAR +STARTCHAR U_893F +ENCODING 35135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1FE0 +2AA0 +7AA0 +AFE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8940 +ENCODING 35136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FC0 +7100 +AFE0 +2540 +26C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_8941 +ENCODING 35137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8DE0 +4520 +F5E0 +2C80 +4BE0 +5AA0 +EEA0 +57E0 +4480 +44A0 +5BE0 +ENDCHAR +STARTCHAR U_8942 +ENCODING 35138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +47C0 +F440 +2AA0 +4FE0 +5280 +E560 +5A80 +4540 +4280 +4700 +ENDCHAR +STARTCHAR U_8943 +ENCODING 35139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2440 +47C0 +7100 +47E0 +6B40 +1560 +3280 +D900 +10C0 +ENDCHAR +STARTCHAR U_8944 +ENCODING 35140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +7BC0 +1100 +7FC0 +1100 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_8945 +ENCODING 35141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +FFE0 +1920 +2FE0 +7540 +AFE0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_8946 +ENCODING 35142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +46C0 +FFE0 +2280 +4FE0 +5100 +E7C0 +5100 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_8947 +ENCODING 35143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6AA0 +BBA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8948 +ENCODING 35144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2B40 +FFC0 +1920 +2FE0 +7280 +AFE0 +2280 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_8949 +ENCODING 35145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4AA0 +EEE0 +2AA0 +4FE0 +5AA0 +EBA0 +5AA0 +4BA0 +4AA0 +4DE0 +ENDCHAR +STARTCHAR U_894A +ENCODING 35146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +2440 +5FE0 +DA00 +6FE0 +5B20 +4EC0 +5AC0 +4320 +ENDCHAR +STARTCHAR U_894B +ENCODING 35147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +E480 +3FE0 +55A0 +55A0 +F5E0 +4EC0 +55A0 +66A0 +4480 +ENDCHAR +STARTCHAR U_894C +ENCODING 35148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FFE0 +1540 +2FC0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_894D +ENCODING 35149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27C0 +FD00 +17C0 +2D00 +77C0 +AD00 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_894E +ENCODING 35150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F40 +FA80 +2FC0 +3680 +6A60 +AFC0 +2A40 +2FC0 +2A40 +2FC0 +ENDCHAR +STARTCHAR U_894F +ENCODING 35151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F40 +4A80 +E4A0 +2840 +5DC0 +5560 +EC00 +5BC0 +4D40 +4480 +5B60 +ENDCHAR +STARTCHAR U_8950 +ENCODING 35152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83C0 +4480 +FFE0 +2920 +4FE0 +5220 +ED40 +5280 +4DC0 +42A0 +4D20 +ENDCHAR +STARTCHAR U_8951 +ENCODING 35153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4040 +F7C0 +2040 +4FE0 +5520 +EFE0 +5080 +4FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_8952 +ENCODING 35154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9540 +4E40 +E440 +3F60 +55A0 +7520 +DFA0 +7540 +5540 +55A0 +5120 +ENDCHAR +STARTCHAR U_8953 +ENCODING 35155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +E100 +2FE0 +4440 +5EE0 +E440 +5FE0 +4280 +44A0 +5860 +ENDCHAR +STARTCHAR U_8954 +ENCODING 35156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +F240 +23C0 +3100 +6FE0 +B920 +2DA0 +2B60 +2920 +2960 +ENDCHAR +STARTCHAR U_8955 +ENCODING 35157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +23E0 +F920 +1FE0 +2920 +7FE0 +AD60 +2FE0 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_8956 +ENCODING 35158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +ED40 +2B40 +4FC0 +5B40 +EDC0 +5940 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_8957 +ENCODING 35159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +17C0 +3100 +6FE0 +B280 +2FE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_8958 +ENCODING 35160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +FBA0 +1000 +2FE0 +7AA0 +AFE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8959 +ENCODING 35161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F7C0 +2000 +4EE0 +5AA0 +EEE0 +5100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_895A +ENCODING 35162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +4A80 +E7E0 +2120 +52C0 +5D80 +EAC0 +4DA0 +4AA0 +5500 +63E0 +ENDCHAR +STARTCHAR U_895B +ENCODING 35163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +EAA0 +2FE0 +4AA0 +5FE0 +E800 +5FE0 +4AA0 +4A40 +5720 +ENDCHAR +STARTCHAR U_895C +ENCODING 35164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +F7E0 +1D40 +27E0 +6C00 +B7E0 +2C00 +27E0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_895D +ENCODING 35165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8300 +4480 +E840 +37A0 +4000 +5EE0 +EAA0 +5EE0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_895E +ENCODING 35166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +7BE0 +A880 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_895F +ENCODING 35167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4FE0 +E440 +2EE0 +5540 +57C0 +E000 +5FE0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_8960 +ENCODING 35168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1AA0 +2380 +6800 +B7E0 +2D20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_8961 +ENCODING 35169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +FFC0 +2400 +47E0 +5A20 +EFA0 +5AA0 +4FA0 +42A0 +4FC0 +ENDCHAR +STARTCHAR U_8962 +ENCODING 35170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +FBA0 +2820 +4FE0 +5000 +E7C0 +5440 +47C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_8963 +ENCODING 35171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +F440 +2FE0 +4920 +5FE0 +E920 +5FE0 +5240 +4440 +4840 +ENDCHAR +STARTCHAR U_8964 +ENCODING 35172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4A80 +FEE0 +2980 +4F40 +5A20 +EA00 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8965 +ENCODING 35173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +2EC0 +EFE0 +3A80 +5FC0 +E900 +5BC0 +4900 +4FE0 +4A80 +4C60 +ENDCHAR +STARTCHAR U_8966 +ENCODING 35174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4100 +EFE0 +2920 +4540 +5920 +EFE0 +5200 +4FE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8967 +ENCODING 35175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +F920 +2FE0 +5D60 +EBA0 +5D60 +4BA0 +4D60 +4920 +4860 +ENDCHAR +STARTCHAR U_8968 +ENCODING 35176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +5B20 +EA20 +3FE0 +4A20 +DFA0 +6460 +5F20 +4420 +47A0 +5840 +ENDCHAR +STARTCHAR U_8969 +ENCODING 35177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F100 +2FE0 +4AA0 +5FE0 +E440 +57C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_896A +ENCODING 35178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +F280 +2FE0 +4AA0 +5FE0 +E140 +5FE0 +4D40 +4AA0 +5360 +ENDCHAR +STARTCHAR U_896B +ENCODING 35179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F540 +2FE0 +4920 +5FE0 +E920 +5FE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_896C +ENCODING 35180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +FFE0 +24A0 +4AC0 +5FA0 +EAE0 +5EA0 +4AC0 +4EA0 +4AE0 +ENDCHAR +STARTCHAR U_896D +ENCODING 35181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4E80 +F5E0 +2520 +4FE0 +5120 +EFE0 +5B20 +4BE0 +4EC0 +4920 +ENDCHAR +STARTCHAR U_896E +ENCODING 35182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F7C0 +2440 +4FE0 +5280 +EFE0 +5540 +5BA0 +4540 +4B20 +ENDCHAR +STARTCHAR U_896F +ENCODING 35183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4F20 +EBE0 +2520 +5FE0 +5520 +EFE0 +5440 +4EC0 +5540 +6E60 +ENDCHAR +STARTCHAR U_8970 +ENCODING 35184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5EE0 +E540 +3FE0 +55A0 +FFE0 +44A0 +4EE0 +55A0 +64E0 +44A0 +ENDCHAR +STARTCHAR U_8971 +ENCODING 35185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +84E0 +4E80 +FAE0 +2420 +4EE0 +5A80 +EEE0 +5A80 +4EE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8972 +ENCODING 35186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53E0 +FC20 +4BE0 +7A00 +4A20 +FFE0 +3140 +DC80 +1060 +ENDCHAR +STARTCHAR U_8973 +ENCODING 35187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +FFE0 +2A80 +5B80 +4AA0 +FBA0 +4AA0 +5BC0 +4AA0 +5F60 +ENDCHAR +STARTCHAR U_8974 +ENCODING 35188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4AA0 +EEE0 +2AA0 +4EE0 +5920 +EFE0 +5AA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_8975 +ENCODING 35189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +22C0 +F340 +1FE0 +2040 +7FE0 +AAA0 +2EE0 +2AA0 +3FE0 +2220 +ENDCHAR +STARTCHAR U_8976 +ENCODING 35190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +22A0 +FFE0 +2A80 +4F80 +DAA0 +6FA0 +5AC0 +4FA0 +4AE0 +5120 +ENDCHAR +STARTCHAR U_8977 +ENCODING 35191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +2B60 +FA20 +1D60 +2920 +7FE0 +A540 +2FE0 +3100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_8978 +ENCODING 35192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +2FE0 +5AA0 +E7C0 +5540 +46C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_8979 +ENCODING 35193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4000 +FFE0 +2AA0 +5FE0 +54A0 +FFE0 +5480 +56E0 +5480 +6EE0 +ENDCHAR +STARTCHAR U_897A +ENCODING 35194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +F280 +2FE0 +4B20 +5DE0 +EB20 +5DE0 +4F60 +4DE0 +4B20 +ENDCHAR +STARTCHAR U_897B +ENCODING 35195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +5D60 +EAC0 +3D60 +4AC0 +5FE0 +E540 +5FE0 +4100 +5FE0 +4300 +ENDCHAR +STARTCHAR U_897C +ENCODING 35196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4480 +FFE0 +24A0 +4FA0 +5560 +EFA0 +5000 +5FE0 +4240 +4FA0 +ENDCHAR +STARTCHAR U_897D +ENCODING 35197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +FAA0 +1EE0 +2AA0 +7FE0 +AD60 +2FE0 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_897E +ENCODING 35198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +0900 +7FE0 +4920 +4920 +4920 +4F20 +4920 +4020 +4020 +ENDCHAR +STARTCHAR U_897F +ENCODING 35199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +5240 +61C0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8980 +ENCODING 35200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 4 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_8981 +ENCODING 35201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0800 +FFE0 +1100 +3A00 +0F00 +70C0 +ENDCHAR +STARTCHAR U_8982 +ENCODING 35202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0080 +7F00 +0400 +7F80 +1800 +E7E0 +ENDCHAR +STARTCHAR U_8983 +ENCODING 35203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8984 +ENCODING 35204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +1500 +2480 +7FE0 +A600 +2980 +3060 +ENDCHAR +STARTCHAR U_8985 +ENCODING 35205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2900 +FFE0 +AAA0 +FEA0 +2120 +FE60 +4460 +28A0 +1920 +E6C0 +ENDCHAR +STARTCHAR U_8986 +ENCODING 35206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FE0 +CD40 +3540 +E7C0 +2A80 +3100 +2EE0 +ENDCHAR +STARTCHAR U_8987 +ENCODING 35207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2800 +FFC0 +2A40 +7FC0 +5640 +FFC0 +1240 +14C0 +ENDCHAR +STARTCHAR U_8988 +ENCODING 35208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2100 +7BE0 +4D40 +7940 +2080 +FC80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8989 +ENCODING 35209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2900 +FFE0 +2A80 +7FE0 +5740 +7D40 +FF40 +10C0 +ENDCHAR +STARTCHAR U_898A +ENCODING 35210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +5000 +FFC0 +5480 +FFC0 +AC80 +FFE0 +FAA0 +2560 +ENDCHAR +STARTCHAR U_898B +ENCODING 35211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_898C +ENCODING 35212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +17C0 +9440 +57C0 +2440 +57C0 +4A80 +8280 +04A0 +0860 +ENDCHAR +STARTCHAR U_898D +ENCODING 35213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4440 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_898E +ENCODING 35214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8840 +F880 +8880 +FBE0 +8880 +F880 +5280 +5120 +5020 +8FC0 +ENDCHAR +STARTCHAR U_898F +ENCODING 35215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +FC40 +27C0 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_8990 +ENCODING 35216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4540 +7C80 +4540 +7E20 +4540 +7C80 +2940 +2A20 +47E0 +8000 +ENDCHAR +STARTCHAR U_8991 +ENCODING 35217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5440 +57C0 +7C40 +47C0 +7440 +57C0 +5280 +5280 +94A0 +0860 +ENDCHAR +STARTCHAR U_8992 +ENCODING 35218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +3FC0 +E440 +3FC0 +E440 +27C0 +2280 +3280 +24A0 +0860 +ENDCHAR +STARTCHAR U_8993 +ENCODING 35219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +FE40 +4480 +3F80 +2080 +3E80 +2F80 +2080 +3FA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_8994 +ENCODING 35220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0E00 +3580 +C460 +3F80 +2A80 +3480 +3F80 +0A00 +1220 +61E0 +ENDCHAR +STARTCHAR U_8995 +ENCODING 35221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1A20 +2BE0 +2A20 +ABE0 +AE20 +B3E0 +2540 +2540 +5940 +8660 +ENDCHAR +STARTCHAR U_8996 +ENCODING 35222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +27C0 +7440 +AFC0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8997 +ENCODING 35223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A20 +EBE0 +0A20 +EA20 +ABE0 +AA20 +EBE0 +0940 +3940 +1660 +ENDCHAR +STARTCHAR U_8998 +ENCODING 35224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7FC0 +4440 +47C0 +F440 +97C0 +9280 +F280 +94A0 +0860 +ENDCHAR +STARTCHAR U_8999 +ENCODING 35225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7E40 +4BC0 +9240 +13C0 +5A40 +97C0 +1280 +1280 +54A0 +2860 +ENDCHAR +STARTCHAR U_899A +ENCODING 35226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +7FE0 +8020 +3F80 +2580 +2A80 +3480 +3F80 +1220 +61E0 +ENDCHAR +STARTCHAR U_899B +ENCODING 35227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E220 +8BE0 +B220 +A3E0 +B620 +AA20 +ABE0 +A540 +B140 +A660 +ENDCHAR +STARTCHAR U_899C +ENCODING 35228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +AA20 +6FE0 +2A20 +2BE0 +6E20 +AA20 +2BE0 +2D40 +4940 +8260 +ENDCHAR +STARTCHAR U_899D +ENCODING 35229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FFE0 +2220 +23E0 +0220 +A7E0 +A880 +3180 +4AA0 +84E0 +ENDCHAR +STARTCHAR U_899E +ENCODING 35230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +5080 +54A0 +59A0 +96E0 +ENDCHAR +STARTCHAR U_899F +ENCODING 35231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +FFE0 +1220 +7FE0 +1220 +2BE0 +A680 +A880 +39A0 +06E0 +ENDCHAR +STARTCHAR U_89A0 +ENCODING 35232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2A40 +FFC0 +2A40 +7BC0 +2240 +7BC0 +AA80 +2AA0 +3CA0 +0860 +ENDCHAR +STARTCHAR U_89A1 +ENCODING 35233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +1120 +55E0 +5520 +55E0 +BB20 +1120 +11E0 +1CC0 +E140 +4260 +ENDCHAR +STARTCHAR U_89A2 +ENCODING 35234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +B240 +A3C0 +5240 +ABC0 +2240 +2BC0 +B080 +A1A0 +52A0 +8C60 +ENDCHAR +STARTCHAR U_89A3 +ENCODING 35235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +FBC0 +2240 +73C0 +AA40 +23C0 +FC80 +49A0 +32A0 +CC60 +ENDCHAR +STARTCHAR U_89A4 +ENCODING 35236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +1120 +7DE0 +5520 +79E0 +5520 +5DE0 +4040 +B8C0 +AD40 +4A60 +ENDCHAR +STARTCHAR U_89A5 +ENCODING 35237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2A40 +FFC0 +AA40 +FFC0 +AA40 +FFC0 +0180 +52A0 +4AA0 +8460 +ENDCHAR +STARTCHAR U_89A6 +ENCODING 35238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +4920 +B5E0 +0120 +E5E0 +AD20 +EDE0 +AC40 +E4C0 +A540 +AE60 +ENDCHAR +STARTCHAR U_89A7 +ENCODING 35239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FA00 +A3C0 +F200 +9500 +FE80 +A200 +FE00 +2200 +3E00 +1480 +E780 +ENDCHAR +STARTCHAR U_89A8 +ENCODING 35240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +B640 +FFC0 +0240 +7BC0 +0240 +FFC0 +2180 +3980 +0AA0 +34E0 +ENDCHAR +STARTCHAR U_89A9 +ENCODING 35241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7E40 +2BC0 +FE40 +23C0 +7A40 +CBC0 +7980 +4AA0 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_89AA +ENCODING 35242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE20 +4BE0 +2A20 +FFE0 +1220 +7FE0 +1080 +39A0 +56A0 +B460 +ENDCHAR +STARTCHAR U_89AB +ENCODING 35243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7E40 +2BC0 +FE40 +93C0 +7E40 +23C0 +3980 +2A80 +6AA0 +9460 +ENDCHAR +STARTCHAR U_89AC +ENCODING 35244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +FA20 +03E0 +FA20 +03E0 +FA20 +8BE0 +F940 +8940 +5240 +FC60 +ENDCHAR +STARTCHAR U_89AD +ENCODING 35245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8620 +7BE0 +4A20 +7BE0 +4A20 +7BE0 +20C0 +FD40 +5240 +8C60 +ENDCHAR +STARTCHAR U_89AE +ENCODING 35246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +1080 +2940 +FFE0 +A0A0 +3F80 +2080 +3F80 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_89AF +ENCODING 35247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +FE20 +53E0 +FE20 +ABE0 +F940 +A940 +FE40 +8C60 +ENDCHAR +STARTCHAR U_89B0 +ENCODING 35248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +13C0 +7E40 +53C0 +7E40 +57C0 +7A40 +6BC0 +7980 +AAA0 +7C60 +ENDCHAR +STARTCHAR U_89B1 +ENCODING 35249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +ABE0 +FA40 +AA40 +FFC0 +2080 +3F80 +2080 +3FA0 +E1E0 +ENDCHAR +STARTCHAR U_89B2 +ENCODING 35250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +2220 +FBE0 +AA20 +FBE0 +2080 +F980 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_89B3 +ENCODING 35251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9240 +FFC0 +2240 +4BC0 +FE40 +4BC0 +7D80 +4AA0 +7CE0 +ENDCHAR +STARTCHAR U_89B4 +ENCODING 35252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBC0 +AE40 +47C0 +BA40 +03C0 +7A40 +4BC0 +7A80 +4A80 +34A0 +C860 +ENDCHAR +STARTCHAR U_89B5 +ENCODING 35253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEE0 +AAA0 +FEE0 +AAA0 +BAE0 +AA40 +BAC0 +CB40 +8660 +ENDCHAR +STARTCHAR U_89B6 +ENCODING 35254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F520 +A9E0 +FD20 +51E0 +FD20 +A5E0 +F440 +D4C0 +A540 +D660 +ENDCHAR +STARTCHAR U_89B7 +ENCODING 35255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +2120 +FDE0 +A520 +F9E0 +A520 +BDE0 +A840 +ECC0 +A940 +FE60 +ENDCHAR +STARTCHAR U_89B8 +ENCODING 35256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEE0 +AAA0 +FEE0 +AAA0 +BAE0 +AA40 +BAC0 +8340 +8660 +ENDCHAR +STARTCHAR U_89B9 +ENCODING 35257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BA80 +EFE0 +B8A0 +EFA0 +A8A0 +EFA0 +4DA0 +5D40 +E9A0 +48A0 +ENDCHAR +STARTCHAR U_89BA +ENCODING 35258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +A0A0 +3E80 +2F80 +20A0 +3FA0 +F1E0 +ENDCHAR +STARTCHAR U_89BB +ENCODING 35259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1240 +7FC0 +5240 +7BC0 +5640 +7FC0 +6980 +7AA0 +92A0 +BC60 +ENDCHAR +STARTCHAR U_89BC +ENCODING 35260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +92E0 +FEA0 +D6E0 +BAA0 +D6E0 +BA40 +D6C0 +9340 +9660 +ENDCHAR +STARTCHAR U_89BD +ENCODING 35261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE00 +A3E0 +FC80 +ABE0 +FFA0 +20E0 +3F80 +2080 +3FA0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_89BE +ENCODING 35262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +55E0 +FF20 +55E0 +9320 +7DE0 +5440 +7CC0 +5540 +7E60 +ENDCHAR +STARTCHAR U_89BF +ENCODING 35263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +11E0 +FF20 +ABE0 +FF20 +45E0 +7C40 +44C0 +7D40 +C660 +ENDCHAR +STARTCHAR U_89C0 +ENCODING 35264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A20 +EFE0 +AA20 +EFE0 +5220 +7FE0 +D140 +7D40 +5140 +7E60 +ENDCHAR +STARTCHAR U_89C1 +ENCODING 35265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2480 +2480 +2480 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_89C2 +ENCODING 35266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +1540 +9540 +5540 +2540 +2540 +5180 +52A0 +84A0 +1860 +ENDCHAR +STARTCHAR U_89C3 +ENCODING 35267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5480 +57E0 +5480 +5480 +3080 +2A80 +4920 +4820 +87E0 +ENDCHAR +STARTCHAR U_89C4 +ENCODING 35268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2540 +FD40 +2540 +3180 +2AA0 +44A0 +9860 +ENDCHAR +STARTCHAR U_89C5 +ENCODING 35269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C40 +2480 +1500 +3F80 +2080 +2480 +2680 +26A0 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_89C6 +ENCODING 35270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F540 +1540 +2540 +7540 +A540 +2100 +2320 +2520 +28E0 +ENDCHAR +STARTCHAR U_89C7 +ENCODING 35271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7540 +4540 +4540 +F540 +9540 +9180 +F2A0 +94A0 +0860 +ENDCHAR +STARTCHAR U_89C8 +ENCODING 35272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +5480 +5040 +3F80 +2080 +2480 +2480 +24A0 +1A20 +E3E0 +ENDCHAR +STARTCHAR U_89C9 +ENCODING 35273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1280 +7FE0 +4020 +9F80 +1080 +1480 +1480 +14A0 +0A20 +73E0 +ENDCHAR +STARTCHAR U_89CA +ENCODING 35274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +AA20 +FAA0 +02A0 +FAA0 +0AA0 +7AA0 +4080 +51A0 +62A0 +44E0 +ENDCHAR +STARTCHAR U_89CB +ENCODING 35275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1220 +56A0 +56A0 +5AA0 +B2A0 +92A0 +1280 +1DA0 +E2A0 +4460 +ENDCHAR +STARTCHAR U_89CC +ENCODING 35276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE20 +12A0 +FEA0 +56A0 +B2A0 +52A0 +F880 +11A0 +2AA0 +C4E0 +ENDCHAR +STARTCHAR U_89CD +ENCODING 35277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2BE0 +FE20 +AAA0 +FEA0 +AAA0 +FEA0 +0180 +4980 +86A0 +0460 +ENDCHAR +STARTCHAR U_89CE +ENCODING 35278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4620 +BAA0 +02A0 +EAA0 +AAA0 +EAA0 +AA80 +EBA0 +A2A0 +A6E0 +ENDCHAR +STARTCHAR U_89CF +ENCODING 35279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +52A0 +FAA0 +52A0 +FEA0 +AAA0 +F880 +A9A0 +FEA0 +98E0 +ENDCHAR +STARTCHAR U_89D0 +ENCODING 35280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +52A0 +22A0 +FAA0 +AAA0 +FAA0 +2080 +F8A0 +21A0 +FEE0 +ENDCHAR +STARTCHAR U_89D1 +ENCODING 35281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2220 +FEA0 +A2A0 +FAA0 +A6A0 +BAA0 +AC80 +E9A0 +BAA0 +E4E0 +ENDCHAR +STARTCHAR U_89D2 +ENCODING 35282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +2440 +4540 +8080 +ENDCHAR +STARTCHAR U_89D3 +ENCODING 35283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7920 +5120 +FD20 +5520 +7D20 +5560 +7FA0 +5520 +5420 +9420 +ENDCHAR +STARTCHAR U_89D4 +ENCODING 35284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +4880 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +5520 +9E60 +ENDCHAR +STARTCHAR U_89D5 +ENCODING 35285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A3C0 +A480 +FFE0 +A4A0 +37E0 +64A0 +A7E0 +24A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_89D6 +ENCODING 35286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +53C0 +FD40 +5540 +7FE0 +5500 +7D80 +5540 +5620 +8C20 +ENDCHAR +STARTCHAR U_89D7 +ENCODING 35287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9280 +FA80 +ABE0 +FA80 +AA80 +FA80 +AAA0 +AB60 +9220 +ENDCHAR +STARTCHAR U_89D8 +ENCODING 35288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9140 +FB20 +AB20 +FD40 +A940 +F880 +A900 +AA00 +9400 +ENDCHAR +STARTCHAR U_89D9 +ENCODING 35289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7920 +5140 +FD40 +5560 +7D20 +5520 +7DA0 +5640 +54A0 +9520 +ENDCHAR +STARTCHAR U_89DA +ENCODING 35290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7FC0 +5540 +FD40 +5540 +7D40 +5540 +7D40 +55A0 +55E0 +9540 +ENDCHAR +STARTCHAR U_89DB +ENCODING 35291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +5220 +FE20 +57E0 +7E20 +5620 +7FE0 +5400 +5400 +9FE0 +ENDCHAR +STARTCHAR U_89DC +ENCODING 35292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FFE0 +1100 +3FC0 +2440 +3FC0 +2440 +7FC0 +84C0 +ENDCHAR +STARTCHAR U_89DD +ENCODING 35293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8020 +F3C0 +A280 +FA80 +ABE0 +FA80 +AA80 +FAA0 +AB60 +AAA0 +9CA0 +ENDCHAR +STARTCHAR U_89DE +ENCODING 35294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +F3E0 +A400 +FBC0 +A880 +FBE0 +A960 +FAA0 +AD20 +AA20 +9CC0 +ENDCHAR +STARTCHAR U_89DF +ENCODING 35295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +53E0 +FC80 +57E0 +7C80 +5480 +7FE0 +5480 +5480 +8FE0 +ENDCHAR +STARTCHAR U_89E0 +ENCODING 35296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FE0 +0800 +FFE0 +5240 +BFE0 +6440 +3FC0 +2440 +7FC0 +84C0 +ENDCHAR +STARTCHAR U_89E1 +ENCODING 35297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +5120 +FEC0 +5540 +7E20 +55E0 +7D20 +5520 +55E0 +8D20 +ENDCHAR +STARTCHAR U_89E2 +ENCODING 35298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2220 +FEC0 +2900 +3FC0 +6440 +3FC0 +2440 +3FC0 +C4C0 +ENDCHAR +STARTCHAR U_89E3 +ENCODING 35299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7920 +5220 +FCC0 +5680 +7FE0 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89E4 +ENCODING 35300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +5240 +FFE0 +5400 +7DE0 +5520 +7D60 +5500 +5520 +8CE0 +ENDCHAR +STARTCHAR U_89E5 +ENCODING 35301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +7AA0 +52C0 +FC80 +57E0 +7D40 +5540 +7D40 +5540 +5640 +9460 +ENDCHAR +STARTCHAR U_89E6 +ENCODING 35302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +F880 +A8A0 +A8E0 +9BA0 +ENDCHAR +STARTCHAR U_89E7 +ENCODING 35303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3D40 +4BE0 +FC80 +55C0 +7C80 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89E8 +ENCODING 35304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4880 +FC80 +57E0 +7C80 +57A0 +7DC0 +56A0 +54A0 +8D80 +ENDCHAR +STARTCHAR U_89E9 +ENCODING 35305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +38A0 +53E0 +FC80 +56A0 +7DA0 +54C0 +7DC0 +56A0 +54A0 +8D80 +ENDCHAR +STARTCHAR U_89EA +ENCODING 35306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3FE0 +4A20 +FD40 +57E0 +7C80 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89EB +ENCODING 35307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3BE0 +5080 +FFE0 +54A0 +7FE0 +5480 +7DC0 +56A0 +54A0 +8C80 +ENDCHAR +STARTCHAR U_89EC +ENCODING 35308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3A60 +5220 +FF60 +5620 +7E20 +57E0 +7D40 +5540 +5540 +8E60 +ENDCHAR +STARTCHAR U_89ED +ENCODING 35309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9140 +FA20 +AFE0 +F820 +ABA0 +FAA0 +ABA0 +A820 +A860 +ENDCHAR +STARTCHAR U_89EE +ENCODING 35310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +F900 +AD40 +FB80 +AD40 +A920 +9B00 +ENDCHAR +STARTCHAR U_89EF +ENCODING 35311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +53E0 +FEA0 +57E0 +7EA0 +57E0 +7E80 +57E0 +5480 +8C80 +ENDCHAR +STARTCHAR U_89F0 +ENCODING 35312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +7BE0 +50A0 +FFE0 +5480 +7DE0 +5720 +7DE0 +5520 +55E0 +8D20 +ENDCHAR +STARTCHAR U_89F1 +ENCODING 35313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +5500 +5D40 +41A0 +9EE0 +2420 +FFC0 +2240 +3FC0 +C2C0 +ENDCHAR +STARTCHAR U_89F2 +ENCODING 35314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +5080 +FDE0 +5480 +7DE0 +5680 +7FE0 +5680 +57E0 +8C80 +ENDCHAR +STARTCHAR U_89F3 +ENCODING 35315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8660 +F800 +49C0 +7D40 +D540 +7C80 +5540 +8E20 +ENDCHAR +STARTCHAR U_89F4 +ENCODING 35316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +A640 +FBC0 +AA40 +FFE0 +AA00 +FFE0 +AAA0 +AD20 +9AC0 +ENDCHAR +STARTCHAR U_89F5 +ENCODING 35317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9140 +FFE0 +A880 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +9620 +ENDCHAR +STARTCHAR U_89F6 +ENCODING 35318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F5A0 +A7E0 +FAA0 +ABE0 +FAA0 +ABE0 +F880 +AFE0 +A880 +9880 +ENDCHAR +STARTCHAR U_89F7 +ENCODING 35319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +FFE0 +9220 +3FC0 +6440 +3FC0 +2440 +3FC0 +44C0 +ENDCHAR +STARTCHAR U_89F8 +ENCODING 35320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +7D40 +AFC0 +F200 +AFE0 +F920 +AFE0 +FD60 +AFE0 +A920 +9FE0 +ENDCHAR +STARTCHAR U_89F9 +ENCODING 35321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3BE0 +5480 +FFE0 +5480 +7FE0 +5400 +7F60 +55A0 +5420 +9460 +ENDCHAR +STARTCHAR U_89FA +ENCODING 35322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73E0 +4940 +7FE0 +A280 +FAE0 +5780 +8960 +7FC0 +2440 +3FC0 +C440 +ENDCHAR +STARTCHAR U_89FB +ENCODING 35323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7BC0 +AEA0 +FBC0 +AEA0 +FBE0 +A900 +FFE0 +AB80 +AD40 +9920 +ENDCHAR +STARTCHAR U_89FC +ENCODING 35324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +77E0 +A6A0 +FFE0 +AA40 +FBC0 +AA40 +FBE0 +AE40 +A980 +AE60 +ENDCHAR +STARTCHAR U_89FD +ENCODING 35325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5BE0 +9280 +27E0 +FA80 +ABE0 +F800 +AB60 +FAA0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_89FE +ENCODING 35326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A240 +FBC0 +A800 +FFE0 +A940 +FFE0 +AD40 +AAA0 +9AA0 +ENDCHAR +STARTCHAR U_89FF +ENCODING 35327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +77E0 +A280 +FBE0 +AE80 +FBE0 +AA80 +FFE0 +AE60 +ADA0 +9DA0 +ENDCHAR +STARTCHAR U_8A00 +ENCODING 35328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A01 +ENCODING 35329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +10 +FC +00 +78 +00 +78 +00 +78 +48 +78 +ENDCHAR +STARTCHAR U_8A02 +ENCODING 35330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +0080 +F080 +0080 +F080 +0080 +F080 +9080 +F080 +9380 +ENDCHAR +STARTCHAR U_8A03 +ENCODING 35331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +0100 +7900 +0180 +7940 +0120 +7920 +4900 +7900 +4900 +ENDCHAR +STARTCHAR U_8A04 +ENCODING 35332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F800 +2BC0 +2800 +2BC0 +2A40 +2BC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_8A05 +ENCODING 35333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FA00 +0780 +7280 +0280 +7280 +0280 +7280 +54A0 +7860 +ENDCHAR +STARTCHAR U_8A06 +ENCODING 35334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +2120 +FD20 +0120 +7920 +0120 +79E0 +0120 +7820 +4820 +7820 +ENDCHAR +STARTCHAR U_8A07 +ENCODING 35335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8420 +3F20 +0020 +3F20 +0020 +3F20 +2120 +3FC0 +ENDCHAR +STARTCHAR U_8A08 +ENCODING 35336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8A09 +ENCODING 35337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2380 +FE80 +0280 +7A80 +0380 +7A80 +0280 +7AA0 +4AA0 +7C60 +ENDCHAR +STARTCHAR U_8A0A +ENCODING 35338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F240 +0240 +F240 +0240 +FFC0 +0240 +F240 +9260 +F260 +9220 +ENDCHAR +STARTCHAR U_8A0B +ENCODING 35339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0420 +7820 +0220 +7920 +0120 +7820 +4820 +78C0 +ENDCHAR +STARTCHAR U_8A0C +ENCODING 35340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +0100 +F100 +0100 +F100 +0100 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A0D +ENCODING 35341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA20 +0320 +7AA0 +0140 +7940 +0080 +7980 +4A40 +7C20 +ENDCHAR +STARTCHAR U_8A0E +ENCODING 35342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +1040 +FC40 +03E0 +7840 +0240 +7940 +0040 +7840 +4840 +78C0 +ENDCHAR +STARTCHAR U_8A0F +ENCODING 35343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1080 +F880 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_8A10 +ENCODING 35344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2080 +F880 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8A11 +ENCODING 35345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F2A0 +02E0 +F3A0 +0EA0 +F2A0 +02E0 +F280 +9220 +F220 +91E0 +ENDCHAR +STARTCHAR U_8A12 +ENCODING 35346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F0A0 +00A0 +F2A0 +02A0 +F2A0 +04A0 +F120 +9120 +F2E0 +9440 +ENDCHAR +STARTCHAR U_8A13 +ENCODING 35347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F2A0 +02A0 +F2A0 +02A0 +F2A0 +02A0 +F2A0 +92A0 +F420 +9820 +ENDCHAR +STARTCHAR U_8A14 +ENCODING 35348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8A15 +ENCODING 35349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +0080 +F4A0 +04A0 +F4A0 +04A0 +F4A0 +94A0 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8A16 +ENCODING 35350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3E0 +0400 +F800 +07C0 +F080 +0100 +F200 +9420 +F420 +93E0 +ENDCHAR +STARTCHAR U_8A17 +ENCODING 35351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +F100 +01E0 +F700 +0100 +F100 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A18 +ENCODING 35352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7C0 +0040 +F040 +07C0 +F440 +0400 +F400 +9420 +F420 +93E0 +ENDCHAR +STARTCHAR U_8A19 +ENCODING 35353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FF80 +0280 +7A80 +0680 +7B80 +0280 +7AA0 +4C60 +7820 +ENDCHAR +STARTCHAR U_8A1A +ENCODING 35354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +BF80 +0880 +BE80 +8080 +BE80 +8080 +BE80 +8080 +BE80 +A280 +BF80 +ENDCHAR +STARTCHAR U_8A1B +ENCODING 35355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +04A0 +F4A0 +0CC0 +F480 +0580 +F680 +94A0 +F4A0 +9460 +ENDCHAR +STARTCHAR U_8A1C +ENCODING 35356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FA40 +0440 +F820 +07C0 +F240 +0240 +F240 +9440 +F8C0 +ENDCHAR +STARTCHAR U_8A1D +ENCODING 35357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F040 +0240 +F240 +07E0 +F0C0 +0140 +F240 +9440 +F940 +9080 +ENDCHAR +STARTCHAR U_8A1E +ENCODING 35358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F780 +0100 +F100 +0FE0 +F100 +0100 +F280 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A1F +ENCODING 35359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F280 +0280 +F440 +0440 +F920 +0100 +F200 +9240 +F440 +9FE0 +ENDCHAR +STARTCHAR U_8A20 +ENCODING 35360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4720 +2120 +F920 +0720 +7420 +0420 +7720 +0120 +7120 +5520 +7220 +ENDCHAR +STARTCHAR U_8A21 +ENCODING 35361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +7920 +0080 +77E0 +0040 +7080 +5080 +7100 +ENDCHAR +STARTCHAR U_8A22 +ENCODING 35362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +F780 +0400 +F400 +07E0 +F480 +0480 +F480 +9480 +F880 +9080 +ENDCHAR +STARTCHAR U_8A23 +ENCODING 35363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07C0 +F140 +0140 +F7E0 +0100 +F100 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A24 +ENCODING 35364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F900 +0280 +7460 +0000 +7C40 +0280 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_8A25 +ENCODING 35365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07E0 +F520 +0520 +F5A0 +0560 +F620 +9420 +F420 +94E0 +ENDCHAR +STARTCHAR U_8A26 +ENCODING 35366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0920 +7100 +0280 +7280 +0280 +74A0 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8A27 +ENCODING 35367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F120 +0100 +FFE0 +0100 +F180 +0180 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8A28 +ENCODING 35368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0500 +7500 +05E0 +7500 +0500 +7500 +5500 +7FE0 +ENDCHAR +STARTCHAR U_8A29 +ENCODING 35369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2420 +FC60 +06A0 +7520 +0520 +76A0 +0460 +7420 +57E0 +7420 +ENDCHAR +STARTCHAR U_8A2A +ENCODING 35370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F080 +0FE0 +F200 +0200 +F3C0 +0240 +F240 +9240 +F540 +9880 +ENDCHAR +STARTCHAR U_8A2B +ENCODING 35371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2100 +F880 +0080 +7200 +0240 +7620 +0A20 +7240 +5240 +71C0 +ENDCHAR +STARTCHAR U_8A2C +ENCODING 35372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +02C0 +F2A0 +04A0 +F480 +00A0 +F040 +9080 +F300 +9C00 +ENDCHAR +STARTCHAR U_8A2D +ENCODING 35373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F480 +0480 +F4E0 +0800 +F7C0 +0440 +F280 +9100 +F280 +9C60 +ENDCHAR +STARTCHAR U_8A2E +ENCODING 35374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2240 +FA40 +0FE0 +7240 +0240 +7240 +0240 +7240 +5440 +7840 +ENDCHAR +STARTCHAR U_8A2F +ENCODING 35375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA20 +0240 +7A80 +02E0 +7B20 +02A0 +7A40 +4CA0 +7D20 +ENDCHAR +STARTCHAR U_8A30 +ENCODING 35376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +0540 +F540 +07C0 +F100 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A31 +ENCODING 35377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +03E0 +F480 +0080 +F7E0 +0080 +F080 +9080 +F080 +9080 +ENDCHAR +STARTCHAR U_8A32 +ENCODING 35378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4100 +2100 +F900 +07C0 +7540 +0540 +77C0 +0100 +7100 +5100 +7100 +ENDCHAR +STARTCHAR U_8A33 +ENCODING 35379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +0440 +F7C0 +0500 +F500 +0480 +F480 +9440 +F820 +ENDCHAR +STARTCHAR U_8A34 +ENCODING 35380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +F700 +0400 +F400 +07E0 +F480 +0480 +F4C0 +94A0 +F480 +9880 +ENDCHAR +STARTCHAR U_8A35 +ENCODING 35381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +EAA0 +0AA0 +EAA0 +0AA0 +EAA0 +0AA0 +EC60 +A820 +EFE0 +ENDCHAR +STARTCHAR U_8A36 +ENCODING 35382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F040 +0040 +F740 +0540 +F540 +0740 +F540 +9040 +F140 +9080 +ENDCHAR +STARTCHAR U_8A37 +ENCODING 35383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +07E0 +7520 +07E0 +7520 +07E0 +7100 +5100 +7100 +ENDCHAR +STARTCHAR U_8A38 +ENCODING 35384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0100 +7FE0 +0380 +7380 +0540 +7540 +5920 +7100 +ENDCHAR +STARTCHAR U_8A39 +ENCODING 35385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F120 +0FE0 +F100 +0380 +F380 +0540 +F540 +9920 +F100 +9100 +ENDCHAR +STARTCHAR U_8A3A +ENCODING 35386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F920 +0200 +F480 +0120 +F640 +9080 +F100 +9600 +ENDCHAR +STARTCHAR U_8A3B +ENCODING 35387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F100 +0100 +F100 +07C0 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A3C +ENCODING 35388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0100 +F100 +0500 +F5E0 +0500 +F500 +9500 +F500 +9FE0 +ENDCHAR +STARTCHAR U_8A3D +ENCODING 35389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FA20 +0420 +73A0 +02A0 +72A0 +02A0 +73A0 +5020 +70E0 +ENDCHAR +STARTCHAR U_8A3E +ENCODING 35390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5320 +FFE0 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A3F +ENCODING 35391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +0280 +FAA0 +0BC0 +FA80 +0A80 +FA80 +9BA0 +FEA0 +9060 +ENDCHAR +STARTCHAR U_8A40 +ENCODING 35392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +00E0 +7880 +0080 +7BE0 +0220 +7A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_8A41 +ENCODING 35393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0100 +FFE0 +0100 +F100 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A42 +ENCODING 35394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +0DE0 +7440 +0540 +74C0 +0440 +7440 +5440 +74C0 +ENDCHAR +STARTCHAR U_8A43 +ENCODING 35395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +0100 +7200 +0440 +7780 +0100 +7240 +5420 +77E0 +ENDCHAR +STARTCHAR U_8A44 +ENCODING 35396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +FFE0 +0100 +F100 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A45 +ENCODING 35397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0280 +F440 +0920 +F080 +07E0 +F040 +9280 +F100 +9080 +ENDCHAR +STARTCHAR U_8A46 +ENCODING 35398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F780 +0480 +F480 +07E0 +F480 +0480 +F480 +95A0 +F760 +94A0 +ENDCHAR +STARTCHAR U_8A47 +ENCODING 35399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0540 +7540 +0540 +7FE0 +0100 +7280 +5440 +7820 +ENDCHAR +STARTCHAR U_8A48 +ENCODING 35400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +0000 +3FC0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8A49 +ENCODING 35401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25C0 +FF40 +0540 +7540 +0540 +7540 +0580 +7280 +5540 +7A20 +ENDCHAR +STARTCHAR U_8A4A +ENCODING 35402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +F540 +0100 +F7C0 +0100 +F100 +0FE0 +F100 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A4B +ENCODING 35403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +0440 +7440 +07C0 +7280 +0280 +7280 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8A4C +ENCODING 35404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F240 +07E0 +F240 +0240 +F240 +03C0 +F240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8A4D +ENCODING 35405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +F540 +0540 +FFE0 +0540 +F540 +0540 +F5C0 +9400 +F400 +97E0 +ENDCHAR +STARTCHAR U_8A4E +ENCODING 35406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +0400 +F7C0 +0440 +F440 +07C0 +F440 +9400 +F400 +97E0 +ENDCHAR +STARTCHAR U_8A4F +ENCODING 35407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F280 +0480 +F9E0 +0EA0 +F4A0 +0AA0 +FFA0 +9120 +F220 +94C0 +ENDCHAR +STARTCHAR U_8A50 +ENCODING 35408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +03E0 +F500 +09E0 +F100 +0100 +F1E0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A51 +ENCODING 35409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F820 +0200 +F240 +0280 +F300 +9220 +F220 +91E0 +ENDCHAR +STARTCHAR U_8A52 +ENCODING 35410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0200 +F440 +0FE0 +F000 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A53 +ENCODING 35411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0100 +7100 +0FE0 +7100 +0100 +7240 +5420 +77E0 +ENDCHAR +STARTCHAR U_8A54 +ENCODING 35412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F120 +0120 +F220 +04E0 +F040 +03E0 +F220 +9220 +F3E0 +9220 +ENDCHAR +STARTCHAR U_8A55 +ENCODING 35413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F100 +0520 +F340 +0100 +FFE0 +0100 +F100 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A56 +ENCODING 35414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07E0 +F520 +0500 +F7E0 +0640 +F540 +9480 +F940 +9620 +ENDCHAR +STARTCHAR U_8A57 +ENCODING 35415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +0820 +FBA0 +0AA0 +FAA0 +0BA0 +FAA0 +9820 +F820 +98E0 +ENDCHAR +STARTCHAR U_8A58 +ENCODING 35416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +04A0 +F4A0 +07E0 +F080 +04A0 +F4A0 +94A0 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8A59 +ENCODING 35417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F240 +0FE0 +F200 +0200 +F3C0 +0240 +F540 +9480 +F940 +9220 +ENDCHAR +STARTCHAR U_8A5A +ENCODING 35418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +FA40 +0240 +73C0 +0240 +7240 +03C0 +7240 +5000 +77E0 +ENDCHAR +STARTCHAR U_8A5B +ENCODING 35419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F240 +0240 +F240 +03C0 +F240 +0240 +F3C0 +9240 +F240 +9FE0 +ENDCHAR +STARTCHAR U_8A5C +ENCODING 35420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FD40 +07C0 +7100 +07C0 +7440 +0280 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_8A5D +ENCODING 35421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +0420 +7000 +07E0 +7080 +0080 +7080 +5080 +7380 +ENDCHAR +STARTCHAR U_8A5E +ENCODING 35422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F020 +07A0 +F020 +07A0 +F4A0 +04A0 +F7A0 +94A0 +F020 +9060 +ENDCHAR +STARTCHAR U_8A5F +ENCODING 35423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +7FE0 +0A80 +1320 +25E0 +C200 +7FC0 +0000 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8A60 +ENCODING 35424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F700 +0120 +FF40 +0380 +F580 +0540 +F940 +9120 +F300 +ENDCHAR +STARTCHAR U_8A61 +ENCODING 35425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F120 +05A0 +F360 +0120 +F160 +03A0 +F520 +9120 +F120 +9360 +ENDCHAR +STARTCHAR U_8A62 +ENCODING 35426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0820 +F7A0 +04A0 +F7A0 +04A0 +F4A0 +97A0 +F020 +9060 +ENDCHAR +STARTCHAR U_8A63 +ENCODING 35427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F480 +0720 +F420 +03E0 +F000 +07E0 +F420 +97E0 +F420 +97E0 +ENDCHAR +STARTCHAR U_8A64 +ENCODING 35428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +FD40 +0400 +77E0 +0000 +7540 +0540 +7540 +5540 +7960 +ENDCHAR +STARTCHAR U_8A65 +ENCODING 35429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +7820 +07C0 +7000 +07C0 +7440 +5440 +77C0 +ENDCHAR +STARTCHAR U_8A66 +ENCODING 35430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F080 +0780 +F280 +0280 +F280 +93A0 +FC60 +9020 +ENDCHAR +STARTCHAR U_8A67 +ENCODING 35431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4A40 +A940 +5480 +2F40 +4020 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A68 +ENCODING 35432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +0240 +F420 +0A40 +F240 +0180 +F180 +9240 +FC20 +ENDCHAR +STARTCHAR U_8A69 +ENCODING 35433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F7E0 +0040 +F040 +07E0 +F240 +9140 +F040 +90C0 +ENDCHAR +STARTCHAR U_8A6A +ENCODING 35434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +07C0 +7440 +07C0 +7520 +0540 +7480 +5540 +7620 +ENDCHAR +STARTCHAR U_8A6B +ENCODING 35435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0420 +F0C0 +0700 +F100 +01E0 +F700 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A6C +ENCODING 35436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +F700 +0400 +F7E0 +0400 +F400 +05E0 +F520 +9520 +F5E0 +9920 +ENDCHAR +STARTCHAR U_8A6D +ENCODING 35437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +0480 +FFE0 +0400 +F5C0 +0540 +F5C0 +9520 +F520 +98E0 +ENDCHAR +STARTCHAR U_8A6E +ENCODING 35438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F820 +07C0 +F100 +0100 +F7C0 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A6F +ENCODING 35439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0220 +7BE0 +0220 +7A20 +03E0 +7A20 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_8A70 +ENCODING 35440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +07C0 +F000 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A71 +ENCODING 35441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +FFE0 +0100 +F100 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A72 +ENCODING 35442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0200 +F440 +0E80 +F120 +0240 +FC80 +9180 +F260 +9C20 +ENDCHAR +STARTCHAR U_8A73 +ENCODING 35443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0FE0 +F100 +07C0 +F100 +0100 +FFE0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A74 +ENCODING 35444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0200 +F3E0 +0620 +FBE0 +0220 +F3E0 +9220 +F220 +9260 +ENDCHAR +STARTCHAR U_8A75 +ENCODING 35445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07E0 +F900 +0100 +FFE0 +0280 +F280 +92A0 +F2A0 +9460 +ENDCHAR +STARTCHAR U_8A76 +ENCODING 35446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F2A0 +02A0 +F2A0 +07E0 +FAA0 +02A0 +F2A0 +92A0 +F4A0 +98A0 +ENDCHAR +STARTCHAR U_8A77 +ENCODING 35447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +0BA0 +F820 +0BA0 +FAA0 +0AA0 +FBA0 +9820 +F820 +9860 +ENDCHAR +STARTCHAR U_8A78 +ENCODING 35448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FB80 +0100 +FFE0 +0100 +F380 +0380 +F540 +9920 +F100 +ENDCHAR +STARTCHAR U_8A79 +ENCODING 35449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +3FE0 +6A40 +BFE0 +2000 +2FC0 +2000 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_8A7A +ENCODING 35450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F1E0 +0220 +F540 +0080 +F100 +07E0 +F220 +9220 +F3E0 +9220 +ENDCHAR +STARTCHAR U_8A7B +ENCODING 35451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +0640 +F980 +0180 +F240 +07E0 +F240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8A7C +ENCODING 35452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +0FE0 +F280 +0280 +F2A0 +05C0 +F480 +9940 +F240 +9420 +ENDCHAR +STARTCHAR U_8A7D +ENCODING 35453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +F440 +0440 +7EE0 +0440 +7440 +0440 +7440 +5440 +7840 +ENDCHAR +STARTCHAR U_8A7E +ENCODING 35454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FDE0 +0020 +7660 +05A0 +75A0 +0660 +77E0 +5020 +7060 +ENDCHAR +STARTCHAR U_8A7F +ENCODING 35455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F100 +0FE0 +F100 +0100 +F7C0 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A80 +ENCODING 35456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA40 +03C0 +7A40 +0240 +7BC0 +0240 +7BE0 +4E40 +7840 +ENDCHAR +STARTCHAR U_8A81 +ENCODING 35457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0FE0 +F280 +0280 +FFE0 +0280 +F280 +9280 +F480 +9880 +ENDCHAR +STARTCHAR U_8A82 +ENCODING 35458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F2A0 +0AC0 +F680 +0280 +F6C0 +0AA0 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8A83 +ENCODING 35459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F3E0 +0540 +F080 +0180 +F6E0 +0120 +F6A0 +9040 +F180 +9600 +ENDCHAR +STARTCHAR U_8A84 +ENCODING 35460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0100 +F380 +9540 +F920 +9120 +ENDCHAR +STARTCHAR U_8A85 +ENCODING 35461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +FFE0 +0100 +F380 +9540 +F920 +9100 +ENDCHAR +STARTCHAR U_8A86 +ENCODING 35462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BE0 +F880 +0880 +FBE0 +0880 +F880 +9BE0 +F800 +9FE0 +ENDCHAR +STARTCHAR U_8A87 +ENCODING 35463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +F440 +0BA0 +F000 +0FE0 +F200 +97C0 +F040 +9380 +ENDCHAR +STARTCHAR U_8A88 +ENCODING 35464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +0240 +77E0 +0100 +7100 +07E0 +7100 +5100 +77E0 +ENDCHAR +STARTCHAR U_8A89 +ENCODING 35465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +2500 +7FC0 +8020 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A8A +ENCODING 35466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +2480 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A8B +ENCODING 35467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F040 +07C0 +F400 +0420 +F3E0 +0100 +F2C0 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8C +ENCODING 35468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +07C0 +F100 +0080 +F220 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8D +ENCODING 35469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F920 +0520 +F520 +02E0 +F440 +0300 +F2A0 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8E +ENCODING 35470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0100 +77C0 +0540 +77C0 +0100 +7380 +5540 +7920 +ENDCHAR +STARTCHAR U_8A8F +ENCODING 35471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0440 +F7C0 +0440 +F7C0 +0520 +F540 +9480 +F540 +9620 +ENDCHAR +STARTCHAR U_8A90 +ENCODING 35472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +26C0 +FAA0 +0FE0 +7280 +03A0 +76A0 +0AC0 +7280 +5AC0 +7520 +ENDCHAR +STARTCHAR U_8A91 +ENCODING 35473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +F640 +0440 +FA40 +0240 +F7E0 +0A40 +F240 +9240 +F240 +9DE0 +ENDCHAR +STARTCHAR U_8A92 +ENCODING 35474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F200 +0440 +FFA0 +0400 +F7E0 +0900 +FFE0 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A93 +ENCODING 35475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2400 +F7E0 +2880 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A94 +ENCODING 35476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2E60 +FB80 +0280 +75E0 +0E80 +7280 +0A80 +77E0 +5400 +7BE0 +ENDCHAR +STARTCHAR U_8A95 +ENCODING 35477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +FDC0 +0440 +F540 +0960 +F540 +0540 +F7E0 +9C00 +F600 +99E0 +ENDCHAR +STARTCHAR U_8A96 +ENCODING 35478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +FFE0 +0820 +F7C0 +0080 +FFE0 +9100 +F100 +9300 +ENDCHAR +STARTCHAR U_8A97 +ENCODING 35479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8320 +5CA0 +E4A0 +1FA0 +E4A0 +0EA0 +EDA0 +14A0 +E420 +A420 +E460 +ENDCHAR +STARTCHAR U_8A98 +ENCODING 35480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F700 +0100 +FFE0 +0540 +F920 +07C0 +F280 +92E0 +F420 +98C0 +ENDCHAR +STARTCHAR U_8A99 +ENCODING 35481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F000 +0540 +FA80 +0540 +F000 +0FE0 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A9A +ENCODING 35482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +F540 +0100 +F7E0 +0420 +F7E0 +0420 +F7E0 +9420 +F420 +94E0 +ENDCHAR +STARTCHAR U_8A9B +ENCODING 35483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +FBC0 +0040 +7FE0 +0820 +77C0 +0440 +7280 +5100 +7EE0 +ENDCHAR +STARTCHAR U_8A9C +ENCODING 35484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +F7E0 +0280 +7440 +0A20 +73C0 +0640 +7980 +5180 +7660 +ENDCHAR +STARTCHAR U_8A9D +ENCODING 35485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0540 +7BA0 +0080 +7100 +07C0 +7440 +57C0 +7440 +ENDCHAR +STARTCHAR U_8A9E +ENCODING 35486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F100 +07C0 +F240 +0240 +F7E0 +0000 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A9F +ENCODING 35487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +27A0 +F940 +07E0 +7100 +03C0 +7440 +0880 +77E0 +5080 +7180 +ENDCHAR +STARTCHAR U_8AA0 +ENCODING 35488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F880 +0880 +FEA0 +0AA0 +FAC0 +9A80 +FD60 +9220 +ENDCHAR +STARTCHAR U_8AA1 +ENCODING 35489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F080 +0A80 +FAA0 +0FA0 +FAC0 +9AA0 +F160 +9220 +ENDCHAR +STARTCHAR U_8AA2 +ENCODING 35490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +0440 +77C0 +0440 +77C0 +0280 +72A0 +54A0 +7860 +ENDCHAR +STARTCHAR U_8AA3 +ENCODING 35491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0540 +F540 +0540 +F540 +0BA0 +F920 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AA4 +ENCODING 35492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +0440 +F7C0 +0000 +F7C0 +0100 +FFE0 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8AA5 +ENCODING 35493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +F7E0 +0000 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8AA6 +ENCODING 35494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F240 +0180 +F7E0 +04A0 +F7E0 +04A0 +F7E0 +94A0 +F4A0 +9460 +ENDCHAR +STARTCHAR U_8AA7 +ENCODING 35495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +0100 +F7E0 +0520 +F7E0 +0520 +F7E0 +9520 +F520 +9560 +ENDCHAR +STARTCHAR U_8AA8 +ENCODING 35496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0800 +F7C0 +0540 +FFE0 +0540 +F540 +97E0 +F040 +9180 +ENDCHAR +STARTCHAR U_8AA9 +ENCODING 35497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FBE0 +0000 +7BC0 +0000 +7BC0 +0000 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_8AAA +ENCODING 35498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F280 +0440 +FFE0 +0440 +F440 +07C0 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8AAB +ENCODING 35499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BC0 +F800 +0FE0 +FA80 +0AA0 +FAC0 +9A80 +F340 +9220 +ENDCHAR +STARTCHAR U_8AAC +ENCODING 35500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFC0 +0440 +7440 +07C0 +7280 +0280 +72A0 +54A0 +7860 +ENDCHAR +STARTCHAR U_8AAD +ENCODING 35501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +0380 +7000 +0FE0 +7820 +0280 +7280 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8AAE +ENCODING 35502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +0280 +7400 +0CA0 +74C0 +0580 +7480 +54A0 +74E0 +ENDCHAR +STARTCHAR U_8AAF +ENCODING 35503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FBC0 +0240 +73C0 +0000 +77E0 +0420 +77E0 +5420 +77E0 +ENDCHAR +STARTCHAR U_8AB0 +ENCODING 35504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +F480 +07E0 +F480 +0FE0 +F480 +0480 +F7E0 +9480 +F7E0 +9400 +ENDCHAR +STARTCHAR U_8AB1 +ENCODING 35505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +07C0 +7140 +07E0 +7140 +07C0 +7500 +5700 +7DE0 +ENDCHAR +STARTCHAR U_8AB2 +ENCODING 35506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +07E0 +F520 +07E0 +F100 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8AB3 +ENCODING 35507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2220 +FFE0 +0280 +7AA0 +03E0 +7A80 +02A0 +7AA0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_8AB4 +ENCODING 35508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +07C0 +7000 +07C0 +7100 +0380 +7540 +5920 +7300 +ENDCHAR +STARTCHAR U_8AB5 +ENCODING 35509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2180 +FA40 +0100 +77E0 +0220 +77E0 +0A20 +73E0 +5220 +7220 +ENDCHAR +STARTCHAR U_8AB6 +ENCODING 35510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F440 +0AA0 +F920 +0100 +FFE0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8AB7 +ENCODING 35511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2660 +FDA0 +07E0 +74A0 +07E0 +7520 +0520 +75E0 +5420 +7460 +ENDCHAR +STARTCHAR U_8AB8 +ENCODING 35512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +F240 +03E0 +FE40 +0880 +FFA0 +0240 +F240 +92A0 +FFE0 +9420 +ENDCHAR +STARTCHAR U_8AB9 +ENCODING 35513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +0EE0 +F280 +0EE0 +F280 +0280 +FEE0 +9280 +F280 +9280 +ENDCHAR +STARTCHAR U_8ABA +ENCODING 35514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F540 +0540 +FBA0 +0120 +F380 +9540 +F920 +9120 +ENDCHAR +STARTCHAR U_8ABB +ENCODING 35515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +FF40 +0580 +F540 +0920 +F7C0 +0440 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8ABC +ENCODING 35516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +07E0 +F420 +03C0 +F240 +03C0 +F240 +93C0 +F240 +9FE0 +ENDCHAR +STARTCHAR U_8ABD +ENCODING 35517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FCE0 +0820 +FEE0 +0820 +FFE0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8ABE +ENCODING 35518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8020 +9F20 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_8ABF +ENCODING 35519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +0520 +F7A0 +0520 +F7E0 +0420 +F7A0 +96A0 +F7A0 +9860 +ENDCHAR +STARTCHAR U_8AC0 +ENCODING 35520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0520 +F7E0 +0520 +F7E0 +0280 +FFE0 +9080 +F080 +9080 +ENDCHAR +STARTCHAR U_8AC1 +ENCODING 35521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +FAA0 +0440 +7AA0 +0000 +7EE0 +0AA0 +7AA0 +5440 +7AA0 +ENDCHAR +STARTCHAR U_8AC2 +ENCODING 35522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3E0 +0240 +F480 +0900 +F660 +0420 +F6E0 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8AC3 +ENCODING 35523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F480 +0FE0 +F480 +0480 +FEC0 +0DA0 +F6A0 +9480 +F480 +9480 +ENDCHAR +STARTCHAR U_8AC4 +ENCODING 35524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F7C0 +0000 +F7C0 +0080 +F100 +9FE0 +F100 +9300 +ENDCHAR +STARTCHAR U_8AC5 +ENCODING 35525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1300 +FFE0 +2480 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AC6 +ENCODING 35526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0240 +F3C0 +0240 +F3C0 +0240 +FFE0 +9000 +F240 +9420 +ENDCHAR +STARTCHAR U_8AC7 +ENCODING 35527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +F540 +0580 +F980 +0240 +F520 +0520 +F540 +9A80 +F440 +9820 +ENDCHAR +STARTCHAR U_8AC8 +ENCODING 35528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF00 +0100 +FFE0 +0540 +FFE0 +0540 +FFE0 +9100 +F100 +97C0 +ENDCHAR +STARTCHAR U_8AC9 +ENCODING 35529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +FFE0 +0540 +F920 +0FE0 +F240 +9480 +F380 +9C60 +ENDCHAR +STARTCHAR U_8ACA +ENCODING 35530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F920 +0560 +F3A0 +07E0 +F120 +03A0 +F560 +9920 +F160 +ENDCHAR +STARTCHAR U_8ACB +ENCODING 35531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0440 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8ACC +ENCODING 35532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +07C0 +F540 +07C0 +F540 +07C0 +F380 +9540 +F920 +ENDCHAR +STARTCHAR U_8ACD +ENCODING 35533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F480 +0900 +F7C0 +0140 +FFE0 +0140 +F7C0 +9100 +F100 +9300 +ENDCHAR +STARTCHAR U_8ACE +ENCODING 35534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +27C0 +FA80 +0280 +FFE0 +0000 +F7C0 +0440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_8ACF +ENCODING 35535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +EAE0 +0AA0 +EEA0 +0AA0 +EEA0 +0AA0 +EB40 +AE40 +FAA0 +A320 +ENDCHAR +STARTCHAR U_8AD0 +ENCODING 35536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5040 +DFC0 +4A80 +4AA0 +5260 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AD1 +ENCODING 35537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F200 +0500 +F920 +0AC0 +F480 +0580 +F2C0 +94A0 +F8A0 +9300 +ENDCHAR +STARTCHAR U_8AD2 +ENCODING 35538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0000 +F7C0 +0440 +F7C0 +0100 +F540 +9520 +F920 +9300 +ENDCHAR +STARTCHAR U_8AD3 +ENCODING 35539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0240 +F1A0 +0660 +F280 +0240 +FFE0 +9240 +F1A0 +9660 +ENDCHAR +STARTCHAR U_8AD4 +ENCODING 35540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F4E0 +07A0 +F4A0 +0FA0 +F4A0 +0EA0 +F5A0 +9440 +F4A0 +9D20 +ENDCHAR +STARTCHAR U_8AD5 +ENCODING 35541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +07E0 +F520 +07C0 +F520 +05E0 +F400 +95C0 +F940 +9660 +ENDCHAR +STARTCHAR U_8AD6 +ENCODING 35542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +0440 +EBA0 +0000 +EFE0 +0AA0 +EFE0 +AAA0 +EAA0 +A860 +ENDCHAR +STARTCHAR U_8AD7 +ENCODING 35543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F920 +07C0 +F080 +0100 +F2A0 +96A0 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8AD8 +ENCODING 35544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0220 +F540 +9C80 +F540 +9620 +ENDCHAR +STARTCHAR U_8AD9 +ENCODING 35545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F480 +07E0 +F480 +0740 +F020 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8ADA +ENCODING 35546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +07C0 +7100 +0500 +75E0 +0500 +7700 +5500 +78E0 +ENDCHAR +STARTCHAR U_8ADB +ENCODING 35547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F560 +0920 +FFE0 +0920 +FFE0 +0100 +F280 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8ADC +ENCODING 35548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +0540 +F5C0 +0400 +F7E0 +0100 +FFE0 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8ADD +ENCODING 35549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F520 +05C0 +F500 +0BE0 +F7C0 +0440 +F7C0 +9440 +F7C0 +94C0 +ENDCHAR +STARTCHAR U_8ADE +ENCODING 35550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +FFE0 +0820 +FFE0 +0800 +FFE0 +0AA0 +FFE0 +9AA0 +FAA0 +9A60 +ENDCHAR +STARTCHAR U_8ADF +ENCODING 35551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F000 +0FE0 +F100 +95E0 +FB00 +91E0 +ENDCHAR +STARTCHAR U_8AE0 +ENCODING 35552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F820 +0FE0 +F440 +07C0 +F440 +97C0 +F000 +9FE0 +ENDCHAR +STARTCHAR U_8AE1 +ENCODING 35553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F440 +0BA0 +F100 +07C0 +F040 +0380 +F000 +9FE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8AE2 +ENCODING 35554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F540 +07C0 +F540 +07C0 +F100 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8AE3 +ENCODING 35555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F740 +0540 +EFE0 +0820 +EBA0 +0AA0 +EBA0 +A820 +E860 +ENDCHAR +STARTCHAR U_8AE4 +ENCODING 35556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +F000 +07C0 +F000 +0FE0 +F200 +97E0 +F020 +91C0 +ENDCHAR +STARTCHAR U_8AE5 +ENCODING 35557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +0540 +77C0 +0540 +77C0 +0100 +77C0 +5100 +7FE0 +ENDCHAR +STARTCHAR U_8AE6 +ENCODING 35558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +F7C0 +0540 +F540 +9540 +F5C0 +9100 +ENDCHAR +STARTCHAR U_8AE7 +ENCODING 35559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F4A0 +07C0 +F4A0 +06E0 +F100 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8AE8 +ENCODING 35560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F000 +03C0 +F240 +03C0 +F000 +07E0 +F520 +97E0 +F520 +97E0 +ENDCHAR +STARTCHAR U_8AE9 +ENCODING 35561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +0280 +7280 +0AA0 +76C0 +0280 +7280 +5280 +7FE0 +ENDCHAR +STARTCHAR U_8AEA +ENCODING 35562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F800 +0380 +7280 +0FE0 +7820 +07C0 +7100 +5100 +7300 +ENDCHAR +STARTCHAR U_8AEB +ENCODING 35563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +EFE0 +0D60 +FBA0 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8AEC +ENCODING 35564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +27E0 +FA80 +72A0 +AC60 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AED +ENCODING 35565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +F440 +0BA0 +F000 +0E20 +FAA0 +0EA0 +FAA0 +9EA0 +FA20 +9AE0 +ENDCHAR +STARTCHAR U_8AEE +ENCODING 35566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +F5E0 +0220 +F480 +0C80 +F540 +0620 +F7E0 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8AEF +ENCODING 35567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +F520 +07E0 +F000 +0FE0 +F100 +0FE0 +FAA0 +9AA0 +FAA0 +9860 +ENDCHAR +STARTCHAR U_8AF0 +ENCODING 35568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +0520 +F7E0 +0520 +F7E0 +0100 +F280 +9620 +FA60 +93C0 +ENDCHAR +STARTCHAR U_8AF1 +ENCODING 35569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0240 +FFE0 +0440 +F7C0 +0080 +FFE0 +9480 +F7E0 +9080 +ENDCHAR +STARTCHAR U_8AF2 +ENCODING 35570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0AA0 +FFE0 +0100 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AF3 +ENCODING 35571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F280 +0FE0 +F000 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8AF4 +ENCODING 35572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +E0A0 +0FE0 +E880 +0F80 +E8A0 +0EA0 +EAA0 +AEC0 +E8A0 +B320 +ENDCHAR +STARTCHAR U_8AF5 +ENCODING 35573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0100 +EFE0 +0AA0 +E920 +0FE0 +E920 +AFE0 +A920 +E960 +ENDCHAR +STARTCHAR U_8AF6 +ENCODING 35574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0240 +F3C0 +0240 +F3C0 +0240 +FFE0 +9540 +F620 +97E0 +ENDCHAR +STARTCHAR U_8AF7 +ENCODING 35575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F540 +07C0 +F540 +0540 +F7C0 +9540 +F560 +9BA0 +ENDCHAR +STARTCHAR U_8AF8 +ENCODING 35576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F7A0 +0240 +FFE0 +0100 +F3C0 +0640 +FBC0 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8AF9 +ENCODING 35577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F3C0 +0240 +FFE0 +0200 +F7E0 +0AA0 +F4A0 +9120 +F660 +ENDCHAR +STARTCHAR U_8AFA +ENCODING 35578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0840 +FB80 +0840 +FBA0 +9840 +F180 +9E00 +ENDCHAR +STARTCHAR U_8AFB +ENCODING 35579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0440 +F7C0 +0440 +FFE0 +0100 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AFC +ENCODING 35580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F520 +0240 +F7E0 +0100 +FFE0 +0200 +F3E0 +9540 +F880 +9360 +ENDCHAR +STARTCHAR U_8AFD +ENCODING 35581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FA80 +0380 +7100 +07C0 +7540 +07C0 +7100 +5FE0 +7100 +ENDCHAR +STARTCHAR U_8AFE +ENCODING 35582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0480 +F200 +0FE0 +F200 +07C0 +FC40 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8AFF +ENCODING 35583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F000 +0FE0 +F540 +04C0 +F640 +9540 +FFE0 +9040 +ENDCHAR +STARTCHAR U_8B00 +ENCODING 35584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27E0 +FA40 +03C0 +7240 +03C0 +7100 +07E0 +7380 +5540 +7920 +ENDCHAR +STARTCHAR U_8B01 +ENCODING 35585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F200 +07E0 +FCA0 +9560 +F7A0 +90C0 +ENDCHAR +STARTCHAR U_8B02 +ENCODING 35586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F920 +0FE0 +F440 +07C0 +F440 +97C0 +F440 +94C0 +ENDCHAR +STARTCHAR U_8B03 +ENCODING 35587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2220 +FBE0 +0220 +73E0 +0480 +7BE0 +0080 +73E0 +5080 +77E0 +ENDCHAR +STARTCHAR U_8B04 +ENCODING 35588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9200 +FFE0 +9440 +9920 +F7C0 +9000 +97C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_8B05 +ENCODING 35589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0D20 +F7E0 +0120 +F640 +0BE0 +F520 +97E0 +F220 +9CC0 +ENDCHAR +STARTCHAR U_8B06 +ENCODING 35590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0820 +FFE0 +0800 +FFE0 +0DA0 +FB60 +9DA0 +F920 +9360 +ENDCHAR +STARTCHAR U_8B07 +ENCODING 35591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +1100 +FFE0 +2480 +DF60 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B08 +ENCODING 35592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +1100 +FFE0 +1100 +FFE0 +2480 +DF60 +1100 +1F00 +ENDCHAR +STARTCHAR U_8B09 +ENCODING 35593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FC0 +FA40 +0FC0 +FA40 +0FC0 +F280 +0340 +F5E0 +9520 +F9E0 +ENDCHAR +STARTCHAR U_8B0A +ENCODING 35594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0540 +FFE0 +0400 +F7C0 +0000 +F540 +9540 +F540 +9960 +ENDCHAR +STARTCHAR U_8B0B +ENCODING 35595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F7E0 +0D40 +F3E0 +0440 +F940 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8B0C +ENCODING 35596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2040 +F740 +0540 +7740 +0000 +77E0 +0540 +7740 +5040 +70C0 +ENDCHAR +STARTCHAR U_8B0D +ENCODING 35597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +1080 +2940 +FFE0 +8420 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B0E +ENCODING 35598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +F6A0 +01C0 +F080 +0FE0 +F480 +05C0 +F6A0 +94A0 +FA00 +91E0 +ENDCHAR +STARTCHAR U_8B0F +ENCODING 35599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +F5E0 +0520 +F7E0 +0520 +F7E0 +0100 +F7E0 +9240 +F180 +9660 +ENDCHAR +STARTCHAR U_8B10 +ENCODING 35600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +F240 +0AA0 +FB20 +05C0 +F800 +07C0 +F540 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B11 +ENCODING 35601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +FE20 +0540 +F280 +0500 +F240 +07E0 +F100 +9FE0 +F280 +9C60 +ENDCHAR +STARTCHAR U_8B12 +ENCODING 35602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +F540 +0FE0 +F440 +07C0 +F440 +07C0 +F400 +97C0 +FA40 +93C0 +ENDCHAR +STARTCHAR U_8B13 +ENCODING 35603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0200 +F7C0 +0440 +F7C0 +0440 +F7C0 +9440 +FFE0 +9440 +ENDCHAR +STARTCHAR U_8B14 +ENCODING 35604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +07E0 +F520 +07C0 +F520 +05E0 +F500 +97E0 +F500 +99E0 +ENDCHAR +STARTCHAR U_8B15 +ENCODING 35605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +EF00 +09C0 +E900 +0FE0 +E920 +0FC0 +E920 +ABE0 +EA80 +B4E0 +ENDCHAR +STARTCHAR U_8B16 +ENCODING 35606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F920 +0FE0 +F440 +0A20 +F7C0 +9A40 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B17 +ENCODING 35607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +FFE0 +0200 +F3C0 +9240 +F540 +9880 +ENDCHAR +STARTCHAR U_8B18 +ENCODING 35608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +07E0 +F480 +07E0 +F540 +07E0 +F480 +97E0 +F480 +9880 +ENDCHAR +STARTCHAR U_8B19 +ENCODING 35609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0280 +F7E0 +02A0 +FFE0 +02A0 +F7E0 +9280 +F6C0 +9AA0 +ENDCHAR +STARTCHAR U_8B1A +ENCODING 35610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0100 +FFE0 +0440 +F820 +0FC0 +F540 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B1B +ENCODING 35611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +07C0 +F280 +0FE0 +F540 +07C0 +F540 +9FE0 +F440 +94C0 +ENDCHAR +STARTCHAR U_8B1C +ENCODING 35612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F900 +0BE0 +FA20 +0BE0 +FA20 +0BE0 +F880 +99C0 +FAA0 +95A0 +ENDCHAR +STARTCHAR U_8B1D +ENCODING 35613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FE40 +0A40 +FFE0 +0A40 +FF40 +0AC0 +FE40 +9640 +FA40 +96C0 +ENDCHAR +STARTCHAR U_8B1E +ENCODING 35614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0240 +F3C0 +0000 +FFE0 +0820 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B1F +ENCODING 35615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2720 +F520 +02C0 +F100 +0660 +F420 +0760 +F420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_8B20 +ENCODING 35616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F3E0 +0D40 +F580 +0E00 +F3E0 +0480 +F7E0 +9080 +F4A0 +97E0 +ENDCHAR +STARTCHAR U_8B21 +ENCODING 35617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2620 +F940 +0540 +7400 +0BE0 +7080 +07E0 +7080 +54A0 +77E0 +ENDCHAR +STARTCHAR U_8B22 +ENCODING 35618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +0480 +FFE0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B23 +ENCODING 35619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0FE0 +FAA0 +07C0 +F000 +0FE0 +F200 +97C0 +F040 +9380 +ENDCHAR +STARTCHAR U_8B24 +ENCODING 35620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0FE0 +F000 +07C0 +F000 +9FE0 +F540 +9B20 +ENDCHAR +STARTCHAR U_8B25 +ENCODING 35621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FFE0 +0920 +FAE0 +0920 +FAA0 +0FE0 +F100 +96A0 +FA60 +91C0 +ENDCHAR +STARTCHAR U_8B26 +ENCODING 35622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +7E20 +57C0 +7D40 +8480 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B27 +ENCODING 35623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +F6C0 +07C0 +F100 +0FE0 +F920 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B28 +ENCODING 35624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F7C0 +0440 +F7C0 +0440 +FFE0 +9100 +F280 +9C60 +ENDCHAR +STARTCHAR U_8B29 +ENCODING 35625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3F80 +2480 +FFE0 +1900 +2480 +DF60 +1100 +1F00 +ENDCHAR +STARTCHAR U_8B2A +ENCODING 35626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F280 +0FE0 +FAA0 +0C60 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B2B +ENCODING 35627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +FFE0 +0920 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B2C +ENCODING 35628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0660 +FAA0 +0300 +F480 +0B60 +F000 +9740 +F080 +9700 +ENDCHAR +STARTCHAR U_8B2D +ENCODING 35629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5FE0 +EA20 +0EA0 +EAA0 +0E60 +E000 +0FE0 +E220 +A4A0 +E840 +ENDCHAR +STARTCHAR U_8B2E +ENCODING 35630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_8B2F +ENCODING 35631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +0FE0 +F920 +0FC0 +F920 +0BE0 +FA40 +9BC0 +FA40 +97E0 +ENDCHAR +STARTCHAR U_8B30 +ENCODING 35632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +E880 +0BE0 +E2A0 +1BE0 +EAA0 +0BE0 +E880 +ABE0 +F480 +A3E0 +ENDCHAR +STARTCHAR U_8B31 +ENCODING 35633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0540 +FFE0 +0540 +FFE0 +0920 +FFE0 +9480 +F380 +9C60 +ENDCHAR +STARTCHAR U_8B32 +ENCODING 35634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +FFC0 +0540 +7FE0 +02A0 +7540 +0AA0 +7140 +5080 +7700 +ENDCHAR +STARTCHAR U_8B33 +ENCODING 35635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BC0 +FA40 +0BC0 +F800 +0EE0 +FAA0 +9EE0 +F800 +9FE0 +ENDCHAR +STARTCHAR U_8B34 +ENCODING 35636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F540 +0FE0 +7540 +07C0 +7000 +07C0 +7540 +56C0 +77C0 +0C60 +ENDCHAR +STARTCHAR U_8B35 +ENCODING 35637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +F220 +0AA0 +F660 +0AA0 +F100 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B36 +ENCODING 35638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F7E0 +0400 +F540 +07E0 +F540 +05C0 +F400 +9940 +F2A0 +92A0 +ENDCHAR +STARTCHAR U_8B37 +ENCODING 35639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +2760 +4800 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B38 +ENCODING 35640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EE80 +0480 +EFE0 +0540 +FF40 +0940 +EE80 +AA80 +EB40 +B520 +ENDCHAR +STARTCHAR U_8B39 +ENCODING 35641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F100 +07C0 +F540 +0FE0 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8B3A +ENCODING 35642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +F940 +5340 +FAC0 +2420 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B3B +ENCODING 35643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FCE0 +0520 +FEC0 +0480 +F760 +0CA0 +F520 +96C0 +F480 +9700 +ENDCHAR +STARTCHAR U_8B3C +ENCODING 35644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +F100 +0FE0 +F920 +0FC0 +F920 +0FE0 +FAA0 +9FE0 +F880 +9180 +ENDCHAR +STARTCHAR U_8B3D +ENCODING 35645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +F7E0 +8520 +F7E0 +1520 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B3E +ENCODING 35646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +0FE0 +FAA0 +0FE0 +F440 +9280 +F100 +9EE0 +ENDCHAR +STARTCHAR U_8B3F +ENCODING 35647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2EE0 +F4A0 +0EE0 +7AA0 +0EA0 +74E0 +0EA0 +74A0 +5520 +7660 +ENDCHAR +STARTCHAR U_8B40 +ENCODING 35648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D00 +F500 +0FE0 +FAA0 +0EA0 +FAA0 +0AA0 +FEA0 +9B40 +FEA0 +9320 +ENDCHAR +STARTCHAR U_8B41 +ENCODING 35649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +FFE0 +0540 +FFE0 +0540 +FFE0 +9100 +F7C0 +9100 +ENDCHAR +STARTCHAR U_8B42 +ENCODING 35650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0FE0 +F540 +07C0 +F540 +07C0 +F100 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8B43 +ENCODING 35651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +0520 +77C0 +0520 +74E0 +0540 +7760 +5940 +77E0 +ENDCHAR +STARTCHAR U_8B44 +ENCODING 35652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFE0 +0D60 +7BA0 +0FE0 +7000 +07C0 +7440 +57C0 +7440 +57C0 +ENDCHAR +STARTCHAR U_8B45 +ENCODING 35653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +EAA0 +1BA0 +E2A0 +0D40 +E440 +0440 +F760 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B46 +ENCODING 35654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0440 +F7C0 +0280 +FFE0 +9440 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B47 +ENCODING 35655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +FBA0 +0140 +FFE0 +0240 +F7C0 +9A40 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8B48 +ENCODING 35656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FE80 +0BE0 +FEA0 +00A0 +FEA0 +02A0 +F4A0 +9E40 +F4A0 +9D20 +ENDCHAR +STARTCHAR U_8B49 +ENCODING 35657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +F580 +02A0 +F240 +07C0 +F820 +07C0 +F440 +97C0 +F280 +9FE0 +ENDCHAR +STARTCHAR U_8B4A +ENCODING 35658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +FFE0 +0440 +FEE0 +0440 +FFE0 +9280 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8B4B +ENCODING 35659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +FAA0 +0FE0 +FAA0 +0BA0 +FAA0 +9BA0 +FAA0 +9DE0 +ENDCHAR +STARTCHAR U_8B4C +ENCODING 35660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +EFC0 +0540 +EFC0 +0880 +EFC0 +0840 +EFE0 +A820 +EAA0 +B540 +ENDCHAR +STARTCHAR U_8B4D +ENCODING 35661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +57E0 +7C80 +57E0 +5480 +7FE0 +4840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_8B4E +ENCODING 35662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F280 +0FE0 +F540 +0900 +FFE0 +0AA0 +FFE0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B4F +ENCODING 35663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +F5A0 +0B40 +FDE0 +0340 +FFE0 +0500 +F540 +96A0 +F960 +9220 +ENDCHAR +STARTCHAR U_8B50 +ENCODING 35664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +FFE0 +0AA0 +FCE0 +0BA0 +F8A0 +9FE0 +F480 +9380 +ENDCHAR +STARTCHAR U_8B51 +ENCODING 35665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F200 +0FE0 +FCC0 +07A0 +F000 +0FE0 +F820 +9BA0 +FAA0 +9BE0 +ENDCHAR +STARTCHAR U_8B52 +ENCODING 35666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF20 +0540 +FFE0 +0380 +F540 +0FE0 +F540 +97C0 +F540 +97C0 +ENDCHAR +STARTCHAR U_8B53 +ENCODING 35667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +F7C0 +0540 +F7C0 +0140 +FFA0 +9540 +FC60 +97C0 +ENDCHAR +STARTCHAR U_8B54 +ENCODING 35668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +F880 +0EE0 +F240 +07E0 +F240 +9FE0 +F240 +9C20 +ENDCHAR +STARTCHAR U_8B55 +ENCODING 35669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0D40 +F540 +0FE0 +F540 +0540 +FFE0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B56 +ENCODING 35670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +F540 +1FE0 +ECC0 +1760 +E000 +07C0 +E440 +A7C0 +E440 +A7C0 +ENDCHAR +STARTCHAR U_8B57 +ENCODING 35671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0A40 +F120 +0280 +F440 +0BA0 +F000 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B58 +ENCODING 35672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFC0 +0AA0 +E480 +0FE0 +E080 +0EA0 +EAC0 +AEA0 +EB60 +AE20 +ENDCHAR +STARTCHAR U_8B59 +ENCODING 35673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0C80 +F7C0 +0480 +F7C0 +0480 +F7E0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B5A +ENCODING 35674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0FE0 +F440 +07C0 +F440 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8B5B +ENCODING 35675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2EE0 +F440 +0FE0 +76C0 +0920 +77C0 +0440 +77C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_8B5C +ENCODING 35676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0AA0 +F6C0 +0FE0 +F000 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B5D +ENCODING 35677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FAA0 +0EE0 +F280 +0EE0 +FAA0 +0EE0 +FAA0 +9EE0 +F2A0 +93E0 +ENDCHAR +STARTCHAR U_8B5E +ENCODING 35678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +0000 +77C0 +0440 +77C0 +0320 +76C0 +5A40 +7320 +ENDCHAR +STARTCHAR U_8B5F +ENCODING 35679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F000 +0EE0 +FAA0 +0EE0 +F100 +9FE0 +F540 +9920 +ENDCHAR +STARTCHAR U_8B60 +ENCODING 35680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0BA0 +F820 +0FE0 +F440 +07C0 +F440 +97C0 +F000 +9FE0 +ENDCHAR +STARTCHAR U_8B61 +ENCODING 35681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +0820 +7380 +0280 +77E0 +0520 +77E0 +5520 +77E0 +ENDCHAR +STARTCHAR U_8B62 +ENCODING 35682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0900 +E2A0 +1DC0 +EA80 +0DC0 +EAA0 +A880 +ED00 +B3E0 +ENDCHAR +STARTCHAR U_8B63 +ENCODING 35683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +FBA0 +0000 +FEE0 +0AA0 +FEE0 +9440 +FAA0 +9120 +ENDCHAR +STARTCHAR U_8B64 +ENCODING 35684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4E80 +FA80 +0EE0 +EB20 +0F20 +E4A0 +1F40 +E440 +AAA0 +F520 +ENDCHAR +STARTCHAR U_8B65 +ENCODING 35685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +A940 +FC80 +5140 +8A20 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B66 +ENCODING 35686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +49E0 +FE80 +5540 +FFE0 +0000 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B67 +ENCODING 35687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0A80 +EFE0 +0AA0 +EFE0 +0AA0 +EFE0 +AA80 +EEC0 +B2A0 +ENDCHAR +STARTCHAR U_8B68 +ENCODING 35688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0AA0 +FFE0 +0AA0 +FFE0 +0800 +FFE0 +9AA0 +FA40 +9720 +ENDCHAR +STARTCHAR U_8B69 +ENCODING 35689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F240 +0FE0 +7440 +07C0 +7440 +07C0 +7520 +5A40 +73C0 +ENDCHAR +STARTCHAR U_8B6A +ENCODING 35690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0440 +F7C0 +0440 +F7E0 +0520 +FEA0 +9460 +F7A0 +9040 +ENDCHAR +STARTCHAR U_8B6B +ENCODING 35691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +E480 +0FE0 +EA40 +0DA0 +E800 +0BC0 +E800 +ABC0 +EA40 +B3C0 +ENDCHAR +STARTCHAR U_8B6C +ENCODING 35692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A80 +FFC0 +9100 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B6D +ENCODING 35693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +F2A0 +1EA0 +F2A0 +1F00 +E0E0 +1FA0 +E4A0 +A440 +E6A0 +B920 +ENDCHAR +STARTCHAR U_8B6E +ENCODING 35694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +0FE0 +7D60 +0BA0 +7FE0 +0440 +77C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_8B6F +ENCODING 35695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FAA0 +0FE0 +F7C0 +0100 +FFE0 +0280 +FFE0 +9100 +FFE0 +9100 +ENDCHAR +STARTCHAR U_8B70 +ENCODING 35696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0100 +F7C0 +0100 +FFE0 +04A0 +FFE0 +94A0 +FE40 +95A0 +ENDCHAR +STARTCHAR U_8B71 +ENCODING 35697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +FFE0 +75C0 +5540 +75C0 +ENDCHAR +STARTCHAR U_8B72 +ENCODING 35698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0440 +EAA0 +0FC0 +E280 +1FE0 +E540 +AC80 +F640 +0420 +ENDCHAR +STARTCHAR U_8B73 +ENCODING 35699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4100 +FFE0 +0BA0 +E540 +0FE0 +E200 +0FE0 +EAA0 +AAA0 +E860 +ENDCHAR +STARTCHAR U_8B74 +ENCODING 35700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +EBE0 +06A0 +F2A0 +0FE0 +F520 +05E0 +F500 +95E0 +F520 +9BE0 +ENDCHAR +STARTCHAR U_8B75 +ENCODING 35701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +EAA0 +1B20 +FFE0 +0A20 +EEA0 +0460 +EE20 +A420 +E6A0 +1840 +ENDCHAR +STARTCHAR U_8B76 +ENCODING 35702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0000 +3F80 +2080 +3F80 +2100 +FFE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_8B77 +ENCODING 35703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F240 +0480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B78 +ENCODING 35704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0100 +EFE0 +0120 +EFC0 +0040 +EFE0 +AB40 +EEC0 +A0C0 +ENDCHAR +STARTCHAR U_8B79 +ENCODING 35705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +FFE0 +0820 +FFE0 +0520 +FAC0 +9580 +FAC0 +9520 +ENDCHAR +STARTCHAR U_8B7A +ENCODING 35706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +F8A0 +1240 +FFE0 +0860 +FF40 +0940 +FF60 +A940 +F540 +A2E0 +ENDCHAR +STARTCHAR U_8B7B +ENCODING 35707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +FFE0 +0000 +7FC0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B7C +ENCODING 35708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5500 +7BE0 +52A0 +7FE0 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B7D +ENCODING 35709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +7FC0 +4A40 +FFE0 +4040 +BFA0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B7E +ENCODING 35710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0A20 +FEA0 +0AA0 +FA60 +0FE0 +FAA0 +9660 +FBA0 +9660 +ENDCHAR +STARTCHAR U_8B7F +ENCODING 35711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +E440 +0EE0 +E440 +0EE0 +E7C0 +0040 +EFC0 +A520 +ECA0 +B7C0 +ENDCHAR +STARTCHAR U_8B80 +ENCODING 35712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_8B81 +ENCODING 35713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F7E0 +0940 +E3E0 +1AA0 +EBE0 +0AA0 +EBE0 +AB60 +EAA0 +17E0 +ENDCHAR +STARTCHAR U_8B82 +ENCODING 35714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F480 +0FE0 +FAA0 +07C0 +F640 +0540 +F7C0 +9C40 +F380 +9C60 +ENDCHAR +STARTCHAR U_8B83 +ENCODING 35715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +0440 +7FE0 +0AA0 +77C0 +0540 +76C0 +5540 +77C0 +0C60 +ENDCHAR +STARTCHAR U_8B84 +ENCODING 35716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +07C0 +F540 +07C0 +F000 +0FE0 +FAA0 +9FE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8B85 +ENCODING 35717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0920 +F540 +0FE0 +F540 +0FE0 +F540 +97C0 +F540 +97C0 +ENDCHAR +STARTCHAR U_8B86 +ENCODING 35718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +4A00 +BFE0 +6A40 +3F40 +22C0 +7FE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B87 +ENCODING 35719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +0EE0 +EAA0 +0FE0 +E920 +0AA0 +EAA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_8B88 +ENCODING 35720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FEC0 +0A40 +FFE0 +0A40 +FFE0 +0A40 +F880 +92E0 +F280 +9FE0 +ENDCHAR +STARTCHAR U_8B89 +ENCODING 35721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E7C0 +1540 +EFE0 +0240 +FBC0 +0A40 +EBC0 +AA40 +EC20 +17E0 +ENDCHAR +STARTCHAR U_8B8A +ENCODING 35722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4040 +AEA0 +EAE0 +5E40 +A0A0 +1FC0 +6900 +0600 +79E0 +ENDCHAR +STARTCHAR U_8B8B +ENCODING 35723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5200 +FBE0 +4A00 +7BC0 +4A20 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B8C +ENCODING 35724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F380 +0440 +FFE0 +0440 +FFE0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B8D +ENCODING 35725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +E200 +0EE0 +EAA0 +0EE0 +E200 +1FE0 +EAA0 +AEE0 +E200 +BFE0 +ENDCHAR +STARTCHAR U_8B8E +ENCODING 35726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AF40 +F1E0 +AF40 +A140 +FFE0 +A140 +FFE0 +A940 +AF40 +F1E0 +ENDCHAR +STARTCHAR U_8B8F +ENCODING 35727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4F60 +A500 +5FE0 +C540 +4940 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B90 +ENCODING 35728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7BE0 +D680 +5280 +7BE0 +0400 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B91 +ENCODING 35729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +0440 +EFE0 +0AA0 +EFE0 +0000 +EFE0 +AAA0 +EFE0 +AAA0 +ENDCHAR +STARTCHAR U_8B92 +ENCODING 35730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +FFC0 +0440 +F7C0 +0480 +F7A0 +0FE0 +F540 +97C0 +F2A0 +9CE0 +ENDCHAR +STARTCHAR U_8B93 +ENCODING 35731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0AA0 +FEE0 +0280 +FFE0 +0280 +FFE0 +96A0 +FA40 +9320 +ENDCHAR +STARTCHAR U_8B94 +ENCODING 35732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +FAA0 +0BE0 +FC20 +0BE0 +FA20 +0BE0 +FC80 +9B20 +FD40 +99C0 +ENDCHAR +STARTCHAR U_8B95 +ENCODING 35733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +FAA0 +0EE0 +FFE0 +0AA0 +FFE0 +9BA0 +FD60 +9960 +ENDCHAR +STARTCHAR U_8B96 +ENCODING 35734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +F5A0 +1FE0 +EA80 +1B80 +EAA0 +1BA0 +EAC0 +AAA0 +FF60 +A220 +ENDCHAR +STARTCHAR U_8B97 +ENCODING 35735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +EFE0 +0900 +EFC0 +1900 +EFE0 +0000 +EFE0 +AAA0 +EBA0 +A860 +ENDCHAR +STARTCHAR U_8B98 +ENCODING 35736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F440 +07C0 +F440 +0FE0 +F040 +0FE0 +FAA0 +9EE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8B99 +ENCODING 35737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0EE0 +FAA0 +0EE0 +F480 +0FE0 +F480 +97E0 +F480 +97E0 +ENDCHAR +STARTCHAR U_8B9A +ENCODING 35738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +EFE0 +0240 +EFE0 +0540 +EFE0 +0440 +E7C0 +A440 +E7C0 +AC60 +ENDCHAR +STARTCHAR U_8B9B +ENCODING 35739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFE0 +0480 +EFE0 +0AA0 +E5A0 +0EE0 +E000 +AFE0 +E280 +A7C0 +ENDCHAR +STARTCHAR U_8B9C +ENCODING 35740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +EFE0 +0AA0 +EFE0 +0AA0 +EFE0 +0100 +E7C0 +A100 +EFE0 +AAA0 +ENDCHAR +STARTCHAR U_8B9D +ENCODING 35741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +0FE0 +E940 +0940 +EFE0 +0AA0 +EBA0 +AAA0 +EFC0 +90A0 +ENDCHAR +STARTCHAR U_8B9E +ENCODING 35742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +E460 +1F40 +F5E0 +1F40 +F040 +1740 +F540 +9F40 +F5A0 +9520 +ENDCHAR +STARTCHAR U_8B9F +ENCODING 35743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0400 +FFE0 +1500 +FFE0 +0A00 +EEE0 +AAA0 +EEE0 +BBA0 +ENDCHAR +STARTCHAR U_8BA0 +ENCODING 35744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 10 0 0 +BITMAP +40 +20 +20 +00 +E0 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_8BA1 +ENCODING 35745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0FE0 +E100 +2100 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BA2 +ENCODING 35746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +0080 +0080 +E080 +2080 +2080 +2080 +2880 +3080 +2380 +ENDCHAR +STARTCHAR U_8BA3 +ENCODING 35747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0100 +E180 +2140 +2120 +2920 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BA4 +ENCODING 35748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0100 +E100 +2100 +2280 +2A80 +3440 +2840 +1020 +ENDCHAR +STARTCHAR U_8BA5 +ENCODING 35749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +0480 +E480 +2480 +2480 +2C80 +34A0 +28A0 +1060 +ENDCHAR +STARTCHAR U_8BA6 +ENCODING 35750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0100 +0100 +EFE0 +2100 +2100 +2100 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_8BA7 +ENCODING 35751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +2FE0 +0100 +0100 +E100 +2100 +2100 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_8BA8 +ENCODING 35752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +0040 +E7E0 +2040 +2240 +2140 +2140 +2840 +3040 +21C0 +ENDCHAR +STARTCHAR U_8BA9 +ENCODING 35753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2100 +0100 +E1E0 +2100 +2100 +2100 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_8BAA +ENCODING 35754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0520 +E520 +2520 +2520 +2D20 +3520 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BAB +ENCODING 35755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +0400 +0800 +E7C0 +2080 +2100 +2A00 +3420 +2420 +03E0 +ENDCHAR +STARTCHAR U_8BAC +ENCODING 35756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +41C0 +4E00 +0200 +E200 +23C0 +2E00 +2200 +2220 +3220 +21E0 +ENDCHAR +STARTCHAR U_8BAD +ENCODING 35757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +2520 +0520 +E520 +2520 +2520 +2520 +2D20 +3520 +2420 +0820 +ENDCHAR +STARTCHAR U_8BAE +ENCODING 35758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2140 +0540 +0440 +E440 +2280 +2280 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BAF +ENCODING 35759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F80 +4480 +4480 +0480 +C480 +5F80 +4480 +54A0 +64A0 +4460 +0420 +ENDCHAR +STARTCHAR U_8BB0 +ENCODING 35760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +0040 +0040 +E040 +27C0 +2400 +2400 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_8BB1 +ENCODING 35761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FE0 +2120 +0120 +E520 +2520 +2920 +2220 +2220 +3540 +2880 +ENDCHAR +STARTCHAR U_8BB2 +ENCODING 35762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4480 +1FE0 +C480 +4480 +5FE0 +4480 +5480 +6480 +4880 +1080 +ENDCHAR +STARTCHAR U_8BB3 +ENCODING 35763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +07C0 +E100 +2FE0 +2120 +2920 +31A0 +2140 +0100 +ENDCHAR +STARTCHAR U_8BB4 +ENCODING 35764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +0440 +0640 +E540 +2480 +2480 +2D40 +3640 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BB5 +ENCODING 35765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +0400 +E7C0 +2440 +2440 +27C0 +2C40 +3400 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BB6 +ENCODING 35766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +0480 +C480 +4FE0 +4080 +4180 +5280 +6480 +4A80 +1100 +ENDCHAR +STARTCHAR U_8BB7 +ENCODING 35767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07E0 +0520 +E520 +25A0 +2660 +2C20 +3420 +2420 +0460 +ENDCHAR +STARTCHAR U_8BB8 +ENCODING 35768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07C0 +0900 +E100 +2FE0 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BB9 +ENCODING 35769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +4500 +0920 +C940 +5980 +4900 +4B00 +5900 +6920 +4920 +09E0 +ENDCHAR +STARTCHAR U_8BBA +ENCODING 35770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0280 +0440 +E820 +2240 +2280 +2300 +2A20 +3220 +23E0 +ENDCHAR +STARTCHAR U_8BBB +ENCODING 35771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4440 +4AA0 +0AA0 +C920 +4920 +4AA0 +5C60 +6820 +4FE0 +0820 +ENDCHAR +STARTCHAR U_8BBC +ENCODING 35772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +0240 +0440 +E420 +2900 +2100 +2A40 +3240 +27A0 +0420 +ENDCHAR +STARTCHAR U_8BBD +ENCODING 35773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +04C0 +E6C0 +2540 +2540 +2540 +2EC0 +3440 +2820 +1020 +ENDCHAR +STARTCHAR U_8BBE +ENCODING 35774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +08E0 +E000 +2FC0 +2440 +2280 +3100 +2280 +1C60 +ENDCHAR +STARTCHAR U_8BBF +ENCODING 35775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +0200 +E3C0 +2240 +2240 +2A40 +3240 +2440 +0980 +ENDCHAR +STARTCHAR U_8BC0 +ENCODING 35776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +0140 +E140 +2FE0 +2100 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BC1 +ENCODING 35777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2100 +0100 +E500 +25C0 +2500 +2D00 +3500 +2500 +1FE0 +ENDCHAR +STARTCHAR U_8BC2 +ENCODING 35778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8200 +4200 +1FE0 +C200 +4200 +4FC0 +4840 +5840 +6FC0 +4840 +ENDCHAR +STARTCHAR U_8BC3 +ENCODING 35779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2040 +0040 +E740 +2540 +2540 +2740 +2D40 +3040 +2140 +0080 +ENDCHAR +STARTCHAR U_8BC4 +ENCODING 35780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0920 +0540 +E100 +2FE0 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BC5 +ENCODING 35781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +0440 +E7C0 +2440 +2440 +2FC0 +3440 +6440 +0FE0 +ENDCHAR +STARTCHAR U_8BC6 +ENCODING 35782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +0420 +0420 +E420 +27E0 +2420 +2A80 +3240 +2420 +0820 +ENDCHAR +STARTCHAR U_8BC7 +ENCODING 35783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4820 +0820 +CBA0 +4AA0 +4AA0 +4AA0 +4BA0 +6820 +48A0 +0840 +ENDCHAR +STARTCHAR U_8BC8 +ENCODING 35784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +03E0 +0500 +E900 +21E0 +2100 +2100 +29E0 +3100 +2100 +ENDCHAR +STARTCHAR U_8BC9 +ENCODING 35785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0400 +07E0 +E480 +2580 +24C0 +2CA0 +34A0 +2480 +0880 +ENDCHAR +STARTCHAR U_8BCA +ENCODING 35786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0920 +E200 +2480 +2120 +2A40 +3080 +6100 +0600 +ENDCHAR +STARTCHAR U_8BCB +ENCODING 35787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +0480 +E480 +27E0 +2480 +2480 +2CA0 +35A0 +2660 +0520 +ENDCHAR +STARTCHAR U_8BCC +ENCODING 35788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +0440 +0FE0 +E020 +2020 +27E0 +2820 +3020 +27E0 +0020 +ENDCHAR +STARTCHAR U_8BCD +ENCODING 35789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +0FA0 +E020 +2720 +2520 +2520 +2720 +3020 +20A0 +0040 +ENDCHAR +STARTCHAR U_8BCE +ENCODING 35790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +0520 +0520 +E7E0 +2100 +2520 +2D20 +3520 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BCF +ENCODING 35791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +2120 +0220 +E4A0 +2840 +27E0 +2420 +3420 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BD0 +ENCODING 35792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +0FE0 +C920 +4900 +4FE0 +4A40 +4980 +6980 +5240 +2420 +ENDCHAR +STARTCHAR U_8BD1 +ENCODING 35793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0280 +0380 +EC60 +2100 +27C0 +2100 +37E0 +2100 +0100 +ENDCHAR +STARTCHAR U_8BD2 +ENCODING 35794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +0440 +0FE0 +E020 +2000 +27C0 +2C40 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BD3 +ENCODING 35795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +07E0 +0480 +E480 +25C0 +2480 +2480 +37E0 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BD4 +ENCODING 35796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +07C0 +E100 +2FE0 +2100 +2B80 +3540 +6920 +1120 +ENDCHAR +STARTCHAR U_8BD5 +ENCODING 35797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +1FE0 +0100 +EF00 +2500 +2500 +24A0 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_8BD6 +ENCODING 35798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +E100 +2FE0 +2000 +2100 +2FC0 +3100 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8BD7 +ENCODING 35799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +0100 +DFE0 +4080 +4FE0 +4080 +5480 +6280 +4080 +0180 +ENDCHAR +STARTCHAR U_8BD8 +ENCODING 35800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +0100 +E7C0 +2000 +27C0 +2440 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BD9 +ENCODING 35801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0200 +0280 +E4A0 +2AA0 +22C0 +2880 +3140 +6220 +0420 +ENDCHAR +STARTCHAR U_8BDA +ENCODING 35802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +1FE0 +D100 +5100 +5D40 +5540 +5480 +74A0 +5960 +2220 +ENDCHAR +STARTCHAR U_8BDB +ENCODING 35803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +07E0 +C900 +4100 +5FE0 +4100 +5380 +6540 +4920 +0100 +ENDCHAR +STARTCHAR U_8BDC +ENCODING 35804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +07C0 +0900 +E100 +2FE0 +2280 +2280 +32A0 +24A0 +0860 +ENDCHAR +STARTCHAR U_8BDD +ENCODING 35805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +EFE0 +2100 +2100 +27C0 +2440 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BDE +ENCODING 35806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +5B80 +0880 +C880 +52E0 +4A80 +4A80 +5A80 +6BE0 +5400 +23E0 +ENDCHAR +STARTCHAR U_8BDF +ENCODING 35807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +0400 +07E0 +E400 +2400 +25E0 +2D20 +3520 +29E0 +1120 +ENDCHAR +STARTCHAR U_8BE0 +ENCODING 35808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0820 +E7C0 +2100 +2100 +2FC0 +3100 +6100 +0FE0 +ENDCHAR +STARTCHAR U_8BE1 +ENCODING 35809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4780 +0900 +1FE0 +C800 +4BC0 +4A40 +5AC0 +6A20 +5220 +23E0 +ENDCHAR +STARTCHAR U_8BE2 +ENCODING 35810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0820 +F7A0 +24A0 +27A0 +24A0 +24A0 +37A0 +2020 +00C0 +ENDCHAR +STARTCHAR U_8BE3 +ENCODING 35811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +24C0 +0700 +E420 +23E0 +2000 +27E0 +2C20 +37E0 +6420 +07E0 +ENDCHAR +STARTCHAR U_8BE4 +ENCODING 35812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +2480 +0FC0 +E140 +2FE0 +2140 +27C0 +3100 +2100 +0300 +ENDCHAR +STARTCHAR U_8BE5 +ENCODING 35813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +E100 +2240 +2780 +2120 +2A40 +3480 +2140 +0620 +ENDCHAR +STARTCHAR U_8BE6 +ENCODING 35814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +E100 +27C0 +2100 +2100 +2FE0 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BE7 +ENCODING 35815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1020 +0180 +EE00 +2260 +2380 +2E00 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_8BE8 +ENCODING 35816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0200 +EFE0 +2200 +2500 +2FC0 +2100 +3FE0 +2100 +0100 +ENDCHAR +STARTCHAR U_8BE9 +ENCODING 35817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +25A0 +0360 +E120 +2360 +25A0 +2920 +3120 +25A0 +0240 +ENDCHAR +STARTCHAR U_8BEA +ENCODING 35818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0200 +CFC0 +4200 +5FE0 +4440 +4FE0 +6A40 +5140 +2080 +ENDCHAR +STARTCHAR U_8BEB +ENCODING 35819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80C0 +40A0 +1FE0 +CA80 +4A80 +5FA0 +4AC0 +5A80 +6AA0 +4960 +1220 +ENDCHAR +STARTCHAR U_8BEC +ENCODING 35820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0540 +E540 +2540 +2540 +2BA0 +2920 +3100 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8BED +ENCODING 35821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +07C0 +E240 +2240 +2FE0 +2000 +2FC0 +3440 +2440 +07C0 +ENDCHAR +STARTCHAR U_8BEE +ENCODING 35822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0100 +07E0 +E420 +27E0 +2420 +2FE0 +3420 +2420 +0460 +ENDCHAR +STARTCHAR U_8BEF +ENCODING 35823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +07C0 +E000 +27C0 +2100 +2FE0 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BF0 +ENCODING 35824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +27C0 +0900 +F100 +2FE0 +2000 +2FC0 +3440 +2440 +07C0 +ENDCHAR +STARTCHAR U_8BF1 +ENCODING 35825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +0100 +EFE0 +2540 +2920 +27C0 +2A80 +32E0 +2420 +08C0 +ENDCHAR +STARTCHAR U_8BF2 +ENCODING 35826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0800 +E7C0 +2540 +2FE0 +2540 +2D40 +37E0 +2040 +0180 +ENDCHAR +STARTCHAR U_8BF3 +ENCODING 35827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +4880 +1480 +0480 +E480 +2FE0 +3480 +2C80 +3480 +2480 +0FE0 +ENDCHAR +STARTCHAR U_8BF4 +ENCODING 35828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +07C0 +0440 +E440 +27C0 +2280 +2A80 +32A0 +24A0 +08E0 +ENDCHAR +STARTCHAR U_8BF5 +ENCODING 35829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2240 +0180 +EFE0 +2920 +2FE0 +2920 +2FE0 +3920 +2920 +0860 +ENDCHAR +STARTCHAR U_8BF6 +ENCODING 35830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4440 +2FC0 +2400 +07C0 +E900 +2100 +2FE0 +3280 +2440 +1820 +ENDCHAR +STARTCHAR U_8BF7 +ENCODING 35831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2100 +07C0 +E100 +2FE0 +2440 +27C0 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_8BF8 +ENCODING 35832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27A0 +0240 +EFE0 +2200 +27C0 +2440 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BF9 +ENCODING 35833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +2A00 +0BE0 +EEA0 +2AA0 +2EA0 +2AA0 +2BA0 +3E40 +62A0 +0320 +ENDCHAR +STARTCHAR U_8BFA +ENCODING 35834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +0100 +EFE0 +2200 +23E0 +2E20 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_8BFB +ENCODING 35835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +EFE0 +22A0 +2580 +2280 +2FE0 +3180 +2240 +0C20 +ENDCHAR +STARTCHAR U_8BFC +ENCODING 35836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +0420 +0A40 +FB80 +2580 +2D40 +2B40 +3520 +6920 +0600 +ENDCHAR +STARTCHAR U_8BFD +ENCODING 35837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0EE0 +E280 +2EE0 +2280 +2280 +2EE0 +3280 +2280 +0280 +ENDCHAR +STARTCHAR U_8BFE +ENCODING 35838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +C940 +4FC0 +4100 +5FE0 +4300 +6580 +4940 +1120 +ENDCHAR +STARTCHAR U_8BFF +ENCODING 35839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +0FE0 +E540 +2920 +2200 +2FE0 +3480 +2300 +0CE0 +ENDCHAR +STARTCHAR U_8C00 +ENCODING 35840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2D60 +0920 +EFE0 +2920 +2FE0 +2100 +2280 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8C01 +ENCODING 35841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2480 +0FE0 +F480 +27E0 +2480 +27E0 +2C80 +3480 +27E0 +0400 +ENDCHAR +STARTCHAR U_8C02 +ENCODING 35842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0920 +F7C0 +2080 +2100 +2AA0 +36A0 +2A40 +01C0 +ENDCHAR +STARTCHAR U_8C03 +ENCODING 35843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0BA0 +E920 +2FE0 +2820 +2BA0 +2AA0 +3BA0 +2820 +10E0 +ENDCHAR +STARTCHAR U_8C04 +ENCODING 35844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +0480 +0900 +E6E0 +2820 +2820 +2EE0 +3820 +2FE0 +0820 +ENDCHAR +STARTCHAR U_8C05 +ENCODING 35845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +E7C0 +2440 +27C0 +2100 +2100 +3540 +2920 +0300 +ENDCHAR +STARTCHAR U_8C06 +ENCODING 35846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +E7C0 +2000 +2FC0 +2080 +2100 +3FE0 +2100 +0300 +ENDCHAR +STARTCHAR U_8C07 +ENCODING 35847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +0440 +E6A0 +2920 +2100 +2FE0 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8C08 +ENCODING 35848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +2540 +2980 +0240 +EC20 +2100 +2520 +3540 +2980 +2240 +0C20 +ENDCHAR +STARTCHAR U_8C09 +ENCODING 35849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1220 +CFC0 +4A40 +4FC0 +4A40 +4FC0 +6200 +4200 +0200 +ENDCHAR +STARTCHAR U_8C0A +ENCODING 35850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +E7C0 +2440 +2440 +27C0 +2C40 +37C0 +2440 +1FE0 +ENDCHAR +STARTCHAR U_8C0B +ENCODING 35851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +E7C0 +2440 +27C0 +2100 +2FE0 +3380 +2540 +0920 +ENDCHAR +STARTCHAR U_8C0C +ENCODING 35852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +03C0 +E240 +23C0 +2240 +2FE0 +3540 +2620 +07E0 +ENDCHAR +STARTCHAR U_8C0D +ENCODING 35853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0540 +E5C0 +2400 +27E0 +2100 +2FE0 +3380 +2540 +0920 +ENDCHAR +STARTCHAR U_8C0E +ENCODING 35854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +EFE0 +2400 +27E0 +2000 +2D40 +3540 +2540 +0960 +ENDCHAR +STARTCHAR U_8C0F +ENCODING 35855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +EFE0 +2AA0 +2920 +2FE0 +2900 +3380 +2540 +1920 +ENDCHAR +STARTCHAR U_8C10 +ENCODING 35856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +24A0 +07C0 +E4A0 +2E60 +2100 +27C0 +2C40 +37C0 +2440 +07C0 +ENDCHAR +STARTCHAR U_8C11 +ENCODING 35857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +07E0 +E520 +27C0 +2520 +25E0 +2D00 +37E0 +2900 +11E0 +ENDCHAR +STARTCHAR U_8C12 +ENCODING 35858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +0440 +E7C0 +2200 +27E0 +2CA0 +3560 +27A0 +0040 +ENDCHAR +STARTCHAR U_8C13 +ENCODING 35859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +E920 +2FE0 +2440 +27C0 +2C40 +37C0 +2440 +04C0 +ENDCHAR +STARTCHAR U_8C14 +ENCODING 35860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +0000 +E7C0 +2000 +2FE0 +2A00 +33C0 +2040 +0380 +ENDCHAR +STARTCHAR U_8C15 +ENCODING 35861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +0BA0 +E000 +2E20 +2AA0 +2EA0 +2AA0 +3EA0 +6A20 +0A60 +ENDCHAR +STARTCHAR U_8C16 +ENCODING 35862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0540 +EFE0 +2200 +2FE0 +2200 +2FC0 +3640 +2980 +0660 +ENDCHAR +STARTCHAR U_8C17 +ENCODING 35863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2900 +1FC0 +0A40 +EFC0 +22A0 +24E0 +2B00 +3080 +2600 +0180 +ENDCHAR +STARTCHAR U_8C18 +ENCODING 35864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +25E0 +0220 +EC80 +2540 +2620 +2000 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8C19 +ENCODING 35865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E000 +27C0 +2440 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8C1A +ENCODING 35866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +07E0 +E440 +2480 +2760 +2C80 +3720 +2840 +1380 +ENDCHAR +STARTCHAR U_8C1B +ENCODING 35867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E920 +27C0 +2540 +2D40 +3540 +25C0 +0100 +ENDCHAR +STARTCHAR U_8C1C +ENCODING 35868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2AA0 +05C0 +E080 +3FE0 +2480 +25C0 +2EA0 +3480 +2A00 +11E0 +ENDCHAR +STARTCHAR U_8C1D +ENCODING 35869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +EFE0 +2800 +2FE0 +2AA0 +2FE0 +3AA0 +2AA0 +1060 +ENDCHAR +STARTCHAR U_8C1E +ENCODING 35870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4520 +05C0 +CB00 +57E0 +4440 +47C0 +5440 +67C0 +4440 +04C0 +ENDCHAR +STARTCHAR U_8C1F +ENCODING 35871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +E7C0 +2440 +27C0 +2440 +2FE0 +3100 +6280 +0C60 +ENDCHAR +STARTCHAR U_8C20 +ENCODING 35872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +5FE0 +1020 +CF80 +4880 +4880 +5F80 +6520 +4920 +10E0 +ENDCHAR +STARTCHAR U_8C21 +ENCODING 35873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +0540 +E7C0 +2440 +2A20 +23C0 +3640 +2180 +0E60 +ENDCHAR +STARTCHAR U_8C22 +ENCODING 35874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +5E40 +1240 +DFE0 +5240 +5F40 +52C0 +5E40 +6A40 +5240 +26C0 +ENDCHAR +STARTCHAR U_8C23 +ENCODING 35875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0A20 +0540 +E7C0 +2900 +2FE0 +2100 +2520 +3520 +27E0 +ENDCHAR +STARTCHAR U_8C24 +ENCODING 35876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E920 +2FE0 +2200 +2BC0 +3240 +2440 +1980 +ENDCHAR +STARTCHAR U_8C25 +ENCODING 35877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +0FE0 +0280 +E440 +2820 +2FE0 +2AA0 +3AA0 +2AA0 +1FE0 +ENDCHAR +STARTCHAR U_8C26 +ENCODING 35878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0500 +CFC0 +4540 +5FE0 +4540 +5FC0 +6D80 +5540 +2520 +ENDCHAR +STARTCHAR U_8C27 +ENCODING 35879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8320 +4A40 +0AA0 +CB60 +55C0 +4000 +4FE0 +5AA0 +6AA0 +CAA0 +1FE0 +ENDCHAR +STARTCHAR U_8C28 +ENCODING 35880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +E100 +27C0 +2540 +2FE0 +2900 +37C0 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8C29 +ENCODING 35881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +E440 +2FE0 +2AA0 +2FE0 +2C40 +3280 +6100 +0EE0 +ENDCHAR +STARTCHAR U_8C2A +ENCODING 35882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +EFE0 +2920 +2FE0 +2920 +2BA0 +3AA0 +6BA0 +0860 +ENDCHAR +STARTCHAR U_8C2B +ENCODING 35883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0A20 +EEA0 +2AA0 +2EA0 +2A60 +2FE0 +3120 +6220 +0CC0 +ENDCHAR +STARTCHAR U_8C2C +ENCODING 35884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0660 +EAA0 +2300 +2480 +3A60 +2500 +3240 +2180 +0E00 +ENDCHAR +STARTCHAR U_8C2D +ENCODING 35885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +EAA0 +2FE0 +2440 +27C0 +3440 +2FE0 +2100 +0100 +ENDCHAR +STARTCHAR U_8C2E +ENCODING 35886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5540 +1FE0 +0CC0 +D760 +4000 +4FC0 +4840 +6FC0 +4840 +0FC0 +ENDCHAR +STARTCHAR U_8C2F +ENCODING 35887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +27E0 +0480 +0FC0 +E480 +27C0 +2480 +2FE0 +3540 +2AA0 +0AA0 +ENDCHAR +STARTCHAR U_8C30 +ENCODING 35888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +2520 +0FE0 +0920 +EFE0 +2AA0 +2FE0 +2920 +3BA0 +6D60 +0860 +ENDCHAR +STARTCHAR U_8C31 +ENCODING 35889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0AA0 +06C0 +EFE0 +2000 +27C0 +2C40 +37C0 +2440 +07C0 +ENDCHAR +STARTCHAR U_8C32 +ENCODING 35890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +E520 +2900 +2FE0 +2AA0 +2C60 +3BA0 +2AA0 +0BE0 +ENDCHAR +STARTCHAR U_8C33 +ENCODING 35891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5F60 +0440 +DFE0 +5B40 +5540 +5F40 +5540 +7F40 +D5A0 +1320 +ENDCHAR +STARTCHAR U_8C34 +ENCODING 35892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +0AA0 +E7E0 +3A40 +2A40 +2BE0 +2A20 +3BE0 +2C00 +13E0 +ENDCHAR +STARTCHAR U_8C35 +ENCODING 35893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +0FE0 +06A0 +E7E0 +2400 +25E0 +2C00 +35E0 +2520 +09E0 +ENDCHAR +STARTCHAR U_8C36 +ENCODING 35894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +1FE0 +CA80 +5B80 +4AA0 +5BA0 +4A40 +7BE0 +CAA0 +1F20 +ENDCHAR +STARTCHAR U_8C37 +ENCODING 35895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +2440 +4620 +0900 +1080 +3FC0 +D0A0 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_8C38 +ENCODING 35896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E240 +2420 +2120 +FA80 +2440 +2FE0 +2440 +4440 +47C0 +8440 +ENDCHAR +STARTCHAR U_8C39 +ENCODING 35897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4900 +87E0 +3100 +4940 +8640 +7A80 +4A80 +4D20 +7BE0 +4920 +ENDCHAR +STARTCHAR U_8C3A +ENCODING 35898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +8840 +2240 +57E0 +88C0 +7140 +5140 +5240 +7440 +0940 +0080 +ENDCHAR +STARTCHAR U_8C3B +ENCODING 35899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +8940 +1140 +33C0 +4940 +8940 +7BC0 +4940 +4940 +7920 +4920 +ENDCHAR +STARTCHAR U_8C3C +ENCODING 35900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +4940 +83E0 +3140 +4940 +8540 +7BE0 +4800 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_8C3D +ENCODING 35901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +4A40 +8520 +3080 +4BE0 +8440 +7880 +4BE0 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_8C3E +ENCODING 35902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4FE0 +8420 +3140 +4A20 +8400 +7BE0 +4880 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_8C3F +ENCODING 35903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +9520 +5200 +28C0 +5520 +7E00 +11E0 +FD20 +1120 +29E0 +C520 +ENDCHAR +STARTCHAR U_8C40 +ENCODING 35904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5520 +8AC0 +A100 +5240 +8FE0 +7100 +5FE0 +5280 +7440 +5820 +ENDCHAR +STARTCHAR U_8C41 +ENCODING 35905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +9600 +78C0 +1120 +7A00 +11E0 +FD20 +4920 +49E0 +7920 +ENDCHAR +STARTCHAR U_8C42 +ENCODING 35906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4DA0 +8360 +35A0 +4B00 +8480 +7A60 +4D00 +4A40 +7880 +4F00 +ENDCHAR +STARTCHAR U_8C43 +ENCODING 35907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6E80 +9480 +2FE0 +5AA0 +8EA0 +0AA0 +EEA0 +AAA0 +BF40 +E2A0 +A320 +ENDCHAR +STARTCHAR U_8C44 +ENCODING 35908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4FE0 +A100 +2FE0 +5AA0 +8FE0 +7440 +57C0 +5440 +77C0 +5820 +ENDCHAR +STARTCHAR U_8C45 +ENCODING 35909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64E0 +9E80 +0AE0 +6F20 +90E0 +0E80 +EAE0 +AE80 +AAE0 +EE80 +AAE0 +ENDCHAR +STARTCHAR U_8C46 +ENCODING 35910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C47 +ENCODING 35911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +03E0 +0080 +7C80 +4480 +7C80 +0080 +4480 +2880 +1C80 +E3E0 +ENDCHAR +STARTCHAR U_8C48 +ENCODING 35912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8C49 +ENCODING 35913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +03E0 +F880 +8880 +8BE0 +FA20 +0140 +8940 +5080 +3940 +C620 +ENDCHAR +STARTCHAR U_8C4A +ENCODING 35914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FC0 +4A40 +7FC0 +4A40 +FFE0 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C4B +ENCODING 35915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3DE0 +4540 +A880 +5FC0 +2020 +DF80 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_8C4C +ENCODING 35916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +07E0 +F420 +9200 +93E0 +F4A0 +02A0 +91E0 +6280 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_8C4D +ENCODING 35917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +07E0 +F520 +97E0 +9520 +F7E0 +1280 +9FE0 +6080 +3880 +C080 +ENDCHAR +STARTCHAR U_8C4E +ENCODING 35918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +FA40 +8980 +FA40 +A420 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8C4F +ENCODING 35919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F500 +0FE0 +F540 +9FE0 +9540 +FFC0 +9500 +6D80 +3540 +C520 +ENDCHAR +STARTCHAR U_8C50 +ENCODING 35920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FC0 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C51 +ENCODING 35921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +A8A0 +FBE0 +0280 +FFE0 +49A0 +7AA0 +4AE0 +3480 +F880 +ENDCHAR +STARTCHAR U_8C52 +ENCODING 35922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +FFE0 +A8A0 +FBE0 +0280 +FFE0 +48A0 +79A0 +4EE0 +3080 +F880 +ENDCHAR +STARTCHAR U_8C53 +ENCODING 35923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +A900 +FA80 +0540 +F8A0 +57C0 +7540 +5540 +2540 +FFE0 +ENDCHAR +STARTCHAR U_8C54 +ENCODING 35924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D480 +FFE0 +D480 +FFE0 +D540 +FFE0 +4800 +7BE0 +4AA0 +32A0 +FFE0 +ENDCHAR +STARTCHAR U_8C55 +ENCODING 35925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1880 +6500 +0A00 +1300 +6680 +0A40 +7220 +0C00 +ENDCHAR +STARTCHAR U_8C56 +ENCODING 35926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1480 +7700 +0A00 +1B00 +6680 +0A60 +7200 +0C00 +ENDCHAR +STARTCHAR U_8C57 +ENCODING 35927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5120 +5340 +5580 +52C0 +55A0 +52A0 +5480 +5320 +5020 +8FE0 +ENDCHAR +STARTCHAR U_8C58 +ENCODING 35928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2900 +D540 +3540 +D7C0 +3900 +D520 +5120 +20E0 +ENDCHAR +STARTCHAR U_8C59 +ENCODING 35929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +1080 +6900 +1600 +6D00 +14E0 +6440 +0800 +ENDCHAR +STARTCHAR U_8C5A +ENCODING 35930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5100 +5220 +7C40 +5380 +5580 +7940 +5340 +5520 +9920 +B600 +ENDCHAR +STARTCHAR U_8C5B +ENCODING 35931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +D460 +2800 +DBC0 +2E40 +C980 +0980 +5260 +2440 +ENDCHAR +STARTCHAR U_8C5C +ENCODING 35932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +6540 +9940 +37E0 +5940 +B540 +5140 +9140 +1240 +6440 +ENDCHAR +STARTCHAR U_8C5D +ENCODING 35933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +22A0 +66A0 +AAA0 +33E0 +5A20 +B600 +5200 +9220 +5220 +21E0 +ENDCHAR +STARTCHAR U_8C5E +ENCODING 35934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +D420 +3BA0 +D2A0 +3AA0 +D7A0 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_8C5F +ENCODING 35935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +6620 +ABE0 +3200 +5BE0 +B640 +5280 +9520 +7520 +29E0 +ENDCHAR +STARTCHAR U_8C60 +ENCODING 35936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2BC0 +6A40 +B240 +5BC0 +B640 +5240 +9240 +5FE0 +2000 +ENDCHAR +STARTCHAR U_8C61 +ENCODING 35937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +A440 +3FC0 +1440 +6E80 +1300 +6680 +1A60 +E600 +ENDCHAR +STARTCHAR U_8C62 +ENCODING 35938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +2040 +DFA0 +0880 +7500 +0A80 +7240 +0C20 +ENDCHAR +STARTCHAR U_8C63 +ENCODING 35939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6E0 +4240 +4A40 +AA40 +56E0 +B240 +5A40 +9640 +1240 +5440 +2840 +ENDCHAR +STARTCHAR U_8C64 +ENCODING 35940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2240 +67C0 +AA40 +33C0 +5A80 +B6A0 +5240 +9240 +5320 +2200 +ENDCHAR +STARTCHAR U_8C65 +ENCODING 35941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +6480 +A920 +33C0 +5880 +B520 +5240 +9080 +5140 +2620 +ENDCHAR +STARTCHAR U_8C66 +ENCODING 35942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7F80 +4420 +7FE0 +4A40 +7580 +8940 +B620 +ENDCHAR +STARTCHAR U_8C67 +ENCODING 35943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +27E0 +6100 +BFE0 +5520 +B7E0 +5D20 +97E0 +5520 +2560 +ENDCHAR +STARTCHAR U_8C68 +ENCODING 35944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +21C0 +6620 +A900 +37E0 +5A80 +B7E0 +52A0 +92A0 +52E0 +2080 +ENDCHAR +STARTCHAR U_8C69 +ENCODING 35945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +6320 +AD40 +3180 +5AC0 +B5A0 +52A0 +9480 +5380 +2100 +ENDCHAR +STARTCHAR U_8C6A +ENCODING 35946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8020 +3F80 +1400 +6A80 +1700 +0A80 +7460 +ENDCHAR +STARTCHAR U_8C6B +ENCODING 35947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +1480 +AFE0 +4920 +FFE0 +5220 +4540 +5B80 +4540 +5920 +C600 +ENDCHAR +STARTCHAR U_8C6C +ENCODING 35948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7A0 +2140 +6FE0 +B100 +5BC0 +B640 +5BC0 +9240 +13C0 +6240 +ENDCHAR +STARTCHAR U_8C6D +ENCODING 35949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +2520 +6520 +AF60 +3400 +5FE0 +B4A0 +57A0 +9440 +54A0 +2520 +ENDCHAR +STARTCHAR U_8C6E +ENCODING 35950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +6FE0 +AC40 +57C0 +B440 +5D40 +9540 +5280 +2460 +ENDCHAR +STARTCHAR U_8C6F +ENCODING 35951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2520 +62C0 +A900 +3340 +58A0 +B7E0 +5100 +9FE0 +7280 +2C60 +ENDCHAR +STARTCHAR U_8C70 +ENCODING 35952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8660 +FC00 +27E0 +5940 +9140 +3880 +D540 +3220 +ENDCHAR +STARTCHAR U_8C71 +ENCODING 35953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +6FC0 +B440 +27C0 +7000 +AFE0 +6AA0 +AAA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_8C72 +ENCODING 35954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +65E0 +AD20 +35E0 +5D20 +B5E0 +5480 +95C0 +76A0 +29A0 +ENDCHAR +STARTCHAR U_8C73 +ENCODING 35955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +A520 +EF60 +B5A0 +D6A0 +BDE0 +D6A0 +94A0 +B5A0 +FFE0 +8020 +ENDCHAR +STARTCHAR U_8C74 +ENCODING 35956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4240 +4FE0 +B920 +6FE0 +A920 +7BA0 +AAA0 +2BA0 +6860 +ENDCHAR +STARTCHAR U_8C75 +ENCODING 35957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +4940 +D6A0 +2A20 +6880 +B880 +2A80 +6AE0 +AA80 +2D80 +C8E0 +ENDCHAR +STARTCHAR U_8C76 +ENCODING 35958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +6D40 +AFE0 +3440 +5FC0 +B440 +57C0 +9440 +77C0 +2C60 +ENDCHAR +STARTCHAR U_8C77 +ENCODING 35959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +67E0 +AC20 +37E0 +5800 +B7C0 +5440 +97C0 +7280 +2FE0 +ENDCHAR +STARTCHAR U_8C78 +ENCODING 35960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +0E +30 +CB +2C +36 +CA +36 +CA +32 +C2 +0C +ENDCHAR +STARTCHAR U_8C79 +ENCODING 35961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D100 +59E0 +6220 +D520 +28A0 +58A0 +A820 +4820 +A920 +10C0 +ENDCHAR +STARTCHAR U_8C7A +ENCODING 35962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3040 +D040 +5840 +67E0 +D040 +28C0 +5940 +AA40 +4C40 +A940 +1080 +ENDCHAR +STARTCHAR U_8C7B +ENCODING 35963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D080 +5880 +6080 +D080 +2FE0 +5880 +A880 +4880 +A880 +1080 +ENDCHAR +STARTCHAR U_8C7C +ENCODING 35964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E480 +5C80 +24E0 +D780 +3480 +D480 +3480 +D6A0 +54E0 +2000 +ENDCHAR +STARTCHAR U_8C7D +ENCODING 35965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +E880 +5FE0 +24A0 +D4A0 +34A0 +5560 +B620 +5420 +9420 +2460 +ENDCHAR +STARTCHAR U_8C7E +ENCODING 35966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +E7E0 +5080 +2100 +D380 +2D40 +D920 +2900 +C900 +2FE0 +1000 +ENDCHAR +STARTCHAR U_8C7F +ENCODING 35967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F100 +4BE0 +3420 +D3A0 +2AA0 +DAA0 +2BA0 +C820 +28A0 +1040 +ENDCHAR +STARTCHAR U_8C80 +ENCODING 35968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3080 +D2A0 +5AA0 +62A0 +D3E0 +2880 +5AA0 +AAA0 +4AA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C81 +ENCODING 35969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +E100 +5FE0 +6820 +A280 +3280 +D280 +3280 +D440 +1440 +6820 +ENDCHAR +STARTCHAR U_8C82 +ENCODING 35970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +D120 +5920 +62E0 +D440 +2800 +5BE0 +AA20 +4A20 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C83 +ENCODING 35971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +F100 +4BE0 +3220 +D220 +2BE0 +DA20 +2A20 +CA20 +2BE0 +1000 +ENDCHAR +STARTCHAR U_8C84 +ENCODING 35972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7C0 +5940 +67E0 +D140 +2FC0 +5900 +AFC0 +4900 +AFE0 +1100 +ENDCHAR +STARTCHAR U_8C85 +ENCODING 35973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +A480 +47E0 +AC80 +54C0 +B5C0 +56A0 +94A0 +1480 +6480 +ENDCHAR +STARTCHAR U_8C86 +ENCODING 35974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +D000 +5800 +63C0 +D240 +2BC0 +5A40 +ABC0 +4A40 +A800 +17E0 +ENDCHAR +STARTCHAR U_8C87 +ENCODING 35975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +5FC0 +3240 +D3C0 +2A20 +DB40 +2A80 +CA40 +2B60 +1200 +ENDCHAR +STARTCHAR U_8C88 +ENCODING 35976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F3C0 +4A40 +3340 +D240 +2FE0 +DA40 +2B40 +CA40 +2A40 +14C0 +ENDCHAR +STARTCHAR U_8C89 +ENCODING 35977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +D3C0 +5D40 +6080 +D140 +2A20 +5BC0 +AA40 +4A40 +ABC0 +1240 +ENDCHAR +STARTCHAR U_8C8A +ENCODING 35978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D080 +5900 +63E0 +D220 +2A20 +5BE0 +AA20 +4A20 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C8B +ENCODING 35979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +5FC0 +2440 +D7C0 +2800 +DFC0 +2900 +CFE0 +2900 +1100 +ENDCHAR +STARTCHAR U_8C8C +ENCODING 35980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5C20 +67E0 +D420 +2FE0 +5A80 +AA80 +4A80 +AAA0 +1460 +ENDCHAR +STARTCHAR U_8C8D +ENCODING 35981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D2A0 +5AA0 +63E0 +D2A0 +2BE0 +5880 +ABE0 +4880 +A880 +17E0 +ENDCHAR +STARTCHAR U_8C8E +ENCODING 35982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A00 +E4C0 +5C40 +26C0 +D440 +37C0 +D280 +3280 +D2A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_8C8F +ENCODING 35983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5D20 +67E0 +D520 +2FE0 +5A80 +AFE0 +4880 +A880 +1080 +ENDCHAR +STARTCHAR U_8C90 +ENCODING 35984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +E440 +5BA0 +2000 +CE20 +2AA0 +6EA0 +AAA0 +6EA0 +AA20 +6A60 +ENDCHAR +STARTCHAR U_8C91 +ENCODING 35985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +E520 +5D20 +2760 +D400 +36E0 +54A0 +B4A0 +5740 +94A0 +6520 +ENDCHAR +STARTCHAR U_8C92 +ENCODING 35986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3520 +D520 +5FE0 +6000 +DFE0 +2200 +5FE0 +AAA0 +4AA0 +AAA0 +1060 +ENDCHAR +STARTCHAR U_8C93 +ENCODING 35987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +D240 +5FE0 +6240 +D3E0 +2AA0 +5AA0 +ABE0 +4AA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C94 +ENCODING 35988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5D20 +66A0 +D520 +2FE0 +5AA0 +ABC0 +4A80 +ABA0 +12E0 +ENDCHAR +STARTCHAR U_8C95 +ENCODING 35989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +D4A0 +5D40 +6380 +D140 +2FE0 +5900 +AFE0 +4900 +AA80 +1460 +ENDCHAR +STARTCHAR U_8C96 +ENCODING 35990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E240 +5080 +2FE0 +D440 +3820 +D7C0 +3540 +D540 +5FE0 +2000 +ENDCHAR +STARTCHAR U_8C97 +ENCODING 35991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7C0 +5D40 +67E0 +D540 +2FE0 +5920 +AFE0 +4C80 +AB80 +1460 +ENDCHAR +STARTCHAR U_8C98 +ENCODING 35992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +A280 +47C0 +A440 +57C0 +B440 +5FE0 +9100 +1280 +6C60 +ENDCHAR +STARTCHAR U_8C99 +ENCODING 35993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +6800 +DBC0 +2A40 +DBC0 +2800 +DFE0 +2920 +CFE0 +3800 +17E0 +ENDCHAR +STARTCHAR U_8C9A +ENCODING 35994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +6AA0 +9FE0 +6540 +D7C0 +2D40 +5FC0 +A900 +4FE0 +A900 +1100 +ENDCHAR +STARTCHAR U_8C9B +ENCODING 35995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E7E0 +5A40 +2EE0 +DAA0 +3EE0 +D7E0 +3C80 +D7C0 +5480 +27E0 +ENDCHAR +STARTCHAR U_8C9C +ENCODING 35996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +EAA0 +5AA0 +2FE0 +D480 +3FE0 +5480 +B7E0 +5240 +9180 +2660 +ENDCHAR +STARTCHAR U_8C9D +ENCODING 35997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +4100 +4100 +7F00 +2200 +4100 +8080 +ENDCHAR +STARTCHAR U_8C9E +ENCODING 35998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +7F00 +4100 +7F00 +4100 +7F00 +4100 +7F00 +C180 +ENDCHAR +STARTCHAR U_8C9F +ENCODING 35999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +4100 +FF80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +2200 +C180 +ENDCHAR +STARTCHAR U_8CA0 +ENCODING 36000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1F00 +2200 +FF80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CA1 +ENCODING 36001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7840 +4FE0 +7840 +48C0 +7940 +4A40 +7C40 +0040 +4940 +8480 +ENDCHAR +STARTCHAR U_8CA2 +ENCODING 36002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +4040 +ENDCHAR +STARTCHAR U_8CA3 +ENCODING 36003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0BE0 +FC00 +0320 +00E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CA4 +ENCODING 36004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4A80 +7AE0 +4BA0 +7EA0 +4AA0 +7AE0 +4A80 +3220 +4A20 +81E0 +ENDCHAR +STARTCHAR U_8CA5 +ENCODING 36005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +FFE0 +9000 +F380 +9280 +9280 +F280 +02A0 +94A0 +8860 +ENDCHAR +STARTCHAR U_8CA6 +ENCODING 36006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +7800 +4FE0 +7A80 +4A80 +7A80 +02A0 +4AA0 +8460 +0800 +ENDCHAR +STARTCHAR U_8CA7 +ENCODING 36007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +FFE0 +1100 +FF80 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CA8 +ENCODING 36008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2280 +6320 +ADE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CA9 +ENCODING 36009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +F400 +9400 +F7E0 +9420 +9640 +F540 +0480 +A940 +9220 +ENDCHAR +STARTCHAR U_8CAA +ENCODING 36010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +DF60 +0200 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CAB +ENCODING 36011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +3F80 +2080 +3F80 +2080 +3F80 +1100 +2080 +ENDCHAR +STARTCHAR U_8CAC +ENCODING 36012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CAD +ENCODING 36013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4200 +7FE0 +4200 +5FC0 +5040 +5FC0 +5040 +5FC0 +4880 +9040 +ENDCHAR +STARTCHAR U_8CAE +ENCODING 36014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +0200 +FFE0 +4A00 +7A00 +4900 +7900 +4880 +78A0 +8460 +ENDCHAR +STARTCHAR U_8CAF +ENCODING 36015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +F420 +9000 +F7E0 +9080 +9080 +F080 +0080 +A080 +9180 +ENDCHAR +STARTCHAR U_8CB0 +ENCODING 36016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +FFE0 +2500 +2700 +2000 +3FC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB1 +ENCODING 36017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +77E0 +54A0 +7480 +57E0 +7620 +5540 +7540 +0480 +5540 +8A20 +ENDCHAR +STARTCHAR U_8CB2 +ENCODING 36018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D80 +5120 +5DE0 +E000 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8CB3 +ENCODING 36019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +0100 +7D00 +0100 +FF00 +4500 +7D20 +44A0 +7C60 +C620 +ENDCHAR +STARTCHAR U_8CB4 +ENCODING 36020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CB5 +ENCODING 36021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2080 +7EC0 +AFA0 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB6 +ENCODING 36022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F020 +97C0 +F100 +9080 +F7E0 +9040 +9080 +F100 +0200 +5500 +88E0 +ENDCHAR +STARTCHAR U_8CB7 +ENCODING 36023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB8 +ENCODING 36024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +7FE0 +A100 +20E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB9 +ENCODING 36025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +F3E0 +9480 +F880 +9080 +93E0 +F080 +2080 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8CBA +ENCODING 36026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +F420 +9420 +F7E0 +9280 +9280 +F280 +22A0 +54A0 +9860 +ENDCHAR +STARTCHAR U_8CBB +ENCODING 36027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7FC0 +1240 +FFE0 +2220 +FFE0 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CBC +ENCODING 36028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +48E0 +7880 +4880 +7BE0 +4A20 +7A20 +3220 +4BE0 +8620 +ENDCHAR +STARTCHAR U_8CBD +ENCODING 36029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +F240 +9420 +FFE0 +9000 +97C0 +F440 +0440 +57C0 +8C40 +ENDCHAR +STARTCHAR U_8CBE +ENCODING 36030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9780 +F480 +9480 +F7E0 +9480 +9480 +F480 +0540 +A740 +94A0 +ENDCHAR +STARTCHAR U_8CBF +ENCODING 36031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +EF80 +8480 +A480 +D880 +7F00 +4100 +7F00 +4100 +7F00 +2200 +C180 +ENDCHAR +STARTCHAR U_8CC0 +ENCODING 36032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +4BE0 +9000 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CC1 +ENCODING 36033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1500 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CC2 +ENCODING 36034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9440 +FA80 +9100 +F280 +9C60 +F7C0 +0440 +A440 +97C0 +ENDCHAR +STARTCHAR U_8CC3 +ENCODING 36035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +7FE0 +A200 +3FE0 +2080 +3C80 +2780 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CC4 +ENCODING 36036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F200 +93E0 +F620 +9BE0 +9220 +F3E0 +0220 +A220 +9260 +ENDCHAR +STARTCHAR U_8CC5 +ENCODING 36037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F240 +9780 +F120 +9240 +F480 +0140 +6220 +9420 +ENDCHAR +STARTCHAR U_8CC6 +ENCODING 36038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +8940 +FFE0 +8A40 +FA40 +8A40 +FFE0 +0240 +5240 +8A40 +8C40 +ENDCHAR +STARTCHAR U_8CC7 +ENCODING 36039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8800 +5FC0 +2240 +FF00 +61C0 +3F00 +2100 +3F00 +2100 +3F00 +E1C0 +ENDCHAR +STARTCHAR U_8CC8 +ENCODING 36040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3C80 +2780 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CC9 +ENCODING 36041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +97C0 +F540 +9540 +F540 +9540 +F540 +0540 +6540 +9FE0 +ENDCHAR +STARTCHAR U_8CCA +ENCODING 36042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +90A0 +FFE0 +9280 +F2A0 +9FA0 +92C0 +F2A0 +2260 +54A0 +8920 +ENDCHAR +STARTCHAR U_8CCB +ENCODING 36043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8880 +FFE0 +8A40 +FC20 +8A40 +FA40 +0180 +5180 +8A40 +8C20 +ENDCHAR +STARTCHAR U_8CCC +ENCODING 36044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +3C80 +0B80 +1C40 +E080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CCD +ENCODING 36045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +FA80 +8A80 +FA80 +8BE0 +FA80 +8A80 +5280 +4C80 +8BE0 +ENDCHAR +STARTCHAR U_8CCE +ENCODING 36046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +93C0 +FE00 +93C0 +9E00 +F3C0 +9E00 +F240 +5180 +56A0 +8860 +ENDCHAR +STARTCHAR U_8CCF +ENCODING 36047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +8A20 +FBE0 +8A20 +FBE0 +8A20 +8A20 +FBE0 +5140 +8E20 +ENDCHAR +STARTCHAR U_8CD0 +ENCODING 36048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +97E0 +F240 +9520 +F1C0 +9240 +F640 +0140 +6180 +9660 +ENDCHAR +STARTCHAR U_8CD1 +ENCODING 36049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +97E0 +F540 +9540 +F560 +2540 +55A0 +8920 +ENDCHAR +STARTCHAR U_8CD2 +ENCODING 36050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9820 +F380 +9000 +FFE0 +9100 +F540 +2940 +5120 +8B20 +ENDCHAR +STARTCHAR U_8CD3 +ENCODING 36051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2500 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CD4 +ENCODING 36052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +4440 +7FC0 +5040 +5FC0 +5040 +5FC0 +8880 +ENDCHAR +STARTCHAR U_8CD5 +ENCODING 36053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8920 +8FE0 +F900 +8D40 +FB80 +8B40 +FD40 +2920 +5720 +8A00 +ENDCHAR +STARTCHAR U_8CD6 +ENCODING 36054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +FE20 +8BC0 +F880 +8FE0 +F880 +8AC0 +54A0 +4880 +8580 +ENDCHAR +STARTCHAR U_8CD7 +ENCODING 36055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +F4A0 +97E0 +9080 +F7E0 +94A0 +F7E0 +24A0 +5080 +8880 +ENDCHAR +STARTCHAR U_8CD8 +ENCODING 36056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +E900 +A900 +EFC0 +A900 +E940 +4920 +5100 +AFE0 +ENDCHAR +STARTCHAR U_8CD9 +ENCODING 36057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9520 +F7E0 +9520 +F7E0 +9420 +97A0 +F6A0 +27A0 +5420 +9860 +ENDCHAR +STARTCHAR U_8CDA +ENCODING 36058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CDB +ENCODING 36059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BC0 +2080 +7BC0 +2080 +DB60 +3F80 +2280 +2C80 +3F80 +71C0 +ENDCHAR +STARTCHAR U_8CDC +ENCODING 36060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +F200 +97E0 +FAA0 +24A0 +5120 +8AC0 +ENDCHAR +STARTCHAR U_8CDD +ENCODING 36061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9820 +9280 +F440 +9900 +FFE0 +9100 +F380 +2540 +5920 +8920 +ENDCHAR +STARTCHAR U_8CDE +ENCODING 36062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9120 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CDF +ENCODING 36063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +EAA0 +AAA0 +EFE0 +AAA0 +AAA0 +EFE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_8CE0 +ENCODING 36064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F440 +9280 +FFE0 +9000 +F3C0 +9240 +2240 +53C0 +8A40 +ENDCHAR +STARTCHAR U_8CE1 +ENCODING 36065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4440 +7FE0 +4840 +7FC0 +5080 +7FC0 +50A0 +9F80 +70E0 +ENDCHAR +STARTCHAR U_8CE2 +ENCODING 36066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +F980 +8A40 +FC20 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CE3 +ENCODING 36067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +F0E0 +ENDCHAR +STARTCHAR U_8CE4 +ENCODING 36068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +F140 +90A0 +F760 +9280 +9240 +FFE0 +2140 +50A0 +9F60 +ENDCHAR +STARTCHAR U_8CE5 +ENCODING 36069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F440 +9440 +FAA0 +9120 +9100 +FFE0 +2100 +5100 +9100 +ENDCHAR +STARTCHAR U_8CE6 +ENCODING 36070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9EC0 +F0A0 +9FE0 +F280 +9280 +9B80 +FAA0 +2AA0 +5F60 +9020 +ENDCHAR +STARTCHAR U_8CE7 +ENCODING 36071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9540 +F980 +9140 +F220 +9D00 +9520 +F540 +2980 +5240 +8C20 +ENDCHAR +STARTCHAR U_8CE8 +ENCODING 36072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +FFE0 +2480 +7FC0 +A0A0 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CE9 +ENCODING 36073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7A20 +49C0 +4800 +7BE0 +4880 +49C0 +7AA0 +4880 +8580 +ENDCHAR +STARTCHAR U_8CEA +ENCODING 36074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4200 +7FE0 +5280 +9480 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CEB +ENCODING 36075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +5540 +FFE0 +A0A0 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CEC +ENCODING 36076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9400 +F7C0 +9400 +9FE0 +F540 +2480 +5540 +8E20 +ENDCHAR +STARTCHAR U_8CED +ENCODING 36077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9120 +F7A0 +9140 +FFE0 +9200 +97C0 +FA40 +23C0 +5240 +8BC0 +ENDCHAR +STARTCHAR U_8CEE +ENCODING 36078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0880 +FFE0 +5240 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CEF +ENCODING 36079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +F3A0 +92A0 +F3A0 +97C0 +F080 +0FE0 +5100 +9300 +ENDCHAR +STARTCHAR U_8CF0 +ENCODING 36080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F100 +97C0 +F200 +9FE0 +9660 +FBC0 +2240 +53C0 +9A40 +ENDCHAR +STARTCHAR U_8CF1 +ENCODING 36081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +FFE0 +9540 +F7C0 +9540 +97C0 +F100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_8CF2 +ENCODING 36082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +2480 +EFE0 +2380 +2540 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8CF3 +ENCODING 36083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94C0 +FEA0 +9480 +FFE0 +9080 +9EA0 +FAA0 +2EC0 +5120 +8A20 +ENDCHAR +STARTCHAR U_8CF4 +ENCODING 36084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA40 +27E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +73E0 +A940 +2620 +ENDCHAR +STARTCHAR U_8CF5 +ENCODING 36085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +F5A0 +9420 +F3C0 +9240 +93C0 +F240 +23C0 +5240 +9BC0 +ENDCHAR +STARTCHAR U_8CF6 +ENCODING 36086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +F920 +97E0 +F520 +94A0 +F7E0 +0540 +5540 +99C0 +ENDCHAR +STARTCHAR U_8CF7 +ENCODING 36087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5540 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CF8 +ENCODING 36088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7200 +5FE0 +5440 +7F60 +55C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_8CF9 +ENCODING 36089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +F7E0 +9280 +F440 +9820 +97C0 +F540 +2540 +5540 +9FE0 +ENDCHAR +STARTCHAR U_8CFA +ENCODING 36090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +F280 +9FE0 +F2A0 +9FE0 +92A0 +FFE0 +0280 +56C0 +8AA0 +ENDCHAR +STARTCHAR U_8CFB +ENCODING 36091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F520 +97E0 +F520 +97E0 +9040 +FFE0 +2240 +5140 +9880 +ENDCHAR +STARTCHAR U_8CFC +ENCODING 36092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +F280 +97C0 +9280 +FFE0 +9540 +97C0 +F540 +6FE0 +9440 +ENDCHAR +STARTCHAR U_8CFD +ENCODING 36093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +7FC0 +1200 +FFC0 +2080 +7FC0 +A0A0 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CFE +ENCODING 36094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +A100 +F7C0 +D100 +D7E0 +F440 +A7C0 +A440 +FFC0 +0C60 +ENDCHAR +STARTCHAR U_8CFF +ENCODING 36095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +95A0 +F360 +95A0 +F240 +9D20 +9280 +F120 +0640 +6080 +9700 +ENDCHAR +STARTCHAR U_8D00 +ENCODING 36096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9360 +F940 +9080 +F960 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8D01 +ENCODING 36097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +79E0 +4940 +7A40 +9140 +7940 +4880 +7880 +5140 +8A20 +ENDCHAR +STARTCHAR U_8D02 +ENCODING 36098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97A0 +F540 +97E0 +9180 +F660 +9140 +F6A0 +2120 +5040 +8B80 +ENDCHAR +STARTCHAR U_8D03 +ENCODING 36099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +F7C0 +9100 +F7E0 +9520 +F7E0 +0140 +66A0 +9BC0 +ENDCHAR +STARTCHAR U_8D04 +ENCODING 36100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5140 +FB40 +22A0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D05 +ENCODING 36101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1340 +FC80 +4940 +BFA0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D06 +ENCODING 36102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F100 +9280 +9C60 +F280 +95A0 +FFE0 +2480 +5B40 +8920 +ENDCHAR +STARTCHAR U_8D07 +ENCODING 36103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +F0A0 +AFE0 +4A80 +ABE0 +3FA0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D08 +ENCODING 36104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +FFE0 +9AA0 +9FE0 +F000 +97C0 +F440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_8D09 +ENCODING 36105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +FFE0 +9AA0 +9FE0 +F440 +97C0 +F440 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_8D0A +ENCODING 36106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +FFC0 +A500 +FFE0 +5A80 +BFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D0B +ENCODING 36107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +7FE0 +5480 +57E0 +5400 +4FC0 +4840 +4FC0 +4480 +9860 +ENDCHAR +STARTCHAR U_8D0C +ENCODING 36108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F6C0 +9FE0 +F280 +97C0 +F100 +97C0 +F100 +0FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_8D0D +ENCODING 36109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9480 +F7E0 +9CA0 +97E0 +F400 +97C0 +F400 +2BC0 +5240 +93C0 +ENDCHAR +STARTCHAR U_8D0E +ENCODING 36110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +F7C0 +9540 +F7C0 +9540 +FFE0 +0920 +6BA0 +9860 +ENDCHAR +STARTCHAR U_8D0F +ENCODING 36111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +2080 +7FC0 +4940 +7F40 +49C0 +7F40 +8A60 +ENDCHAR +STARTCHAR U_8D10 +ENCODING 36112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +F160 +97C0 +9140 +FFE0 +9280 +F540 +2FE0 +5AA0 +8FE0 +ENDCHAR +STARTCHAR U_8D11 +ENCODING 36113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5080 +FFE0 +8A40 +FBC0 +8A40 +FBC0 +2240 +FBC0 +2420 +ENDCHAR +STARTCHAR U_8D12 +ENCODING 36114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A2A0 +FBE0 +8920 +FFE0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D13 +ENCODING 36115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +A0A0 +EFE0 +BA80 +AF80 +F9A0 +AFA0 +EAC0 +4F60 +A8A0 +B120 +ENDCHAR +STARTCHAR U_8D14 +ENCODING 36116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +7BC0 +CA60 +7BC0 +4A40 +7BC0 +CE60 +ENDCHAR +STARTCHAR U_8D15 +ENCODING 36117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +AFE0 +A880 +BFE0 +EAA0 +AFE0 +AA40 +EBC0 +2240 +63C0 +A660 +ENDCHAR +STARTCHAR U_8D16 +ENCODING 36118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F100 +9FE0 +9AA0 +FFE0 +9440 +F7C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_8D17 +ENCODING 36119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AFC0 +E840 +AFE0 +AAA0 +BFE0 +9040 +9FC0 +9040 +9FC0 +B060 +ENDCHAR +STARTCHAR U_8D18 +ENCODING 36120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +9AA0 +F7C0 +9540 +F4C0 +9640 +F540 +07C0 +5280 +9440 +ENDCHAR +STARTCHAR U_8D19 +ENCODING 36121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CE0 +1080 +FFE0 +92A0 +BFE0 +A940 +3FE0 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D1A +ENCODING 36122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EEE0 +AA80 +FFE0 +A020 +EEE0 +AA80 +EEE0 +0A80 +AEA0 +AAE0 +ENDCHAR +STARTCHAR U_8D1B +ENCODING 36123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +5540 +FFE0 +4880 +7FE0 +4A40 +7BC0 +2240 +FBC0 +2420 +ENDCHAR +STARTCHAR U_8D1C +ENCODING 36124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A080 +E7E0 +B480 +FFA0 +A5A0 +FFC0 +1540 +B7C0 +A8A0 +ENDCHAR +STARTCHAR U_8D1D +ENCODING 36125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +7F +41 +49 +49 +49 +49 +49 +49 +14 +23 +C1 +ENDCHAR +STARTCHAR U_8D1E +ENCODING 36126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +3F80 +2080 +2480 +2480 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D1F +ENCODING 36127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F00 +2200 +7F80 +A080 +2480 +2480 +2480 +2480 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_8D20 +ENCODING 36128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +3200 +4100 +FF80 +0100 +7F00 +4900 +4900 +5500 +2200 +C180 +ENDCHAR +STARTCHAR U_8D21 +ENCODING 36129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0000 +3F80 +2080 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D22 +ENCODING 36130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +AFE0 +A880 +A980 +A980 +AA80 +2280 +5480 +4880 +8180 +ENDCHAR +STARTCHAR U_8D23 +ENCODING 36131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2080 +2480 +2480 +0900 +F0E0 +ENDCHAR +STARTCHAR U_8D24 +ENCODING 36132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +9240 +9180 +9240 +3FA0 +2080 +2480 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D25 +ENCODING 36133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +A9E0 +A940 +AB40 +AD40 +A940 +2140 +5080 +4940 +8A20 +ENDCHAR +STARTCHAR U_8D26 +ENCODING 36134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +8A40 +AA80 +AB00 +AA00 +AFE0 +AA80 +2280 +5240 +4B40 +8A20 +ENDCHAR +STARTCHAR U_8D27 +ENCODING 36135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2380 +6E20 +A1E0 +0000 +3F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D28 +ENCODING 36136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4200 +7FE0 +4200 +5FC0 +5040 +5240 +5240 +8500 +B8E0 +ENDCHAR +STARTCHAR U_8D29 +ENCODING 36137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F820 +8BC0 +AA00 +ABE0 +AAA0 +AAA0 +AAA0 +22A0 +5240 +4CA0 +8920 +ENDCHAR +STARTCHAR U_8D2A +ENCODING 36138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +DF60 +0100 +3F80 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D2B +ENCODING 36139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +DFE0 +0880 +1100 +7F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D2C +ENCODING 36140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8F80 +A900 +A880 +AFE0 +A840 +A880 +A900 +5200 +4D00 +88E0 +ENDCHAR +STARTCHAR U_8D2D +ENCODING 36141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +ABE0 +AC20 +A920 +AA20 +AAA0 +2760 +5020 +4820 +88C0 +ENDCHAR +STARTCHAR U_8D2E +ENCODING 36142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8880 +ABE0 +AA20 +AA20 +A800 +A800 +2000 +5000 +4BE0 +8800 +ENDCHAR +STARTCHAR U_8D2F +ENCODING 36143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +3F80 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D30 +ENCODING 36144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0140 +FFE0 +0100 +7D00 +0100 +7D00 +5520 +54A0 +2860 +C620 +ENDCHAR +STARTCHAR U_8D31 +ENCODING 36145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8A40 +AFC0 +AA00 +AA60 +AF80 +A920 +2140 +50A0 +4960 +8620 +ENDCHAR +STARTCHAR U_8D32 +ENCODING 36146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1500 +FFE0 +1100 +3F80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D33 +ENCODING 36147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +2780 +2000 +3FE0 +2080 +2480 +2480 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D34 +ENCODING 36148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +A8E0 +A880 +A880 +ABE0 +AA20 +AA20 +2220 +53E0 +8A20 +ENDCHAR +STARTCHAR U_8D35 +ENCODING 36149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +3F80 +0400 +FFE0 +2080 +2480 +2480 +0B00 +F0E0 +ENDCHAR +STARTCHAR U_8D36 +ENCODING 36150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AA20 +AA20 +AA20 +ABE0 +A940 +A940 +3140 +4A40 +8460 +ENDCHAR +STARTCHAR U_8D37 +ENCODING 36151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +24E0 +6F00 +A120 +20E0 +3F80 +2080 +2480 +2480 +1900 +E0E0 +ENDCHAR +STARTCHAR U_8D38 +ENCODING 36152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4120 +5120 +FAC0 +0800 +3F80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D39 +ENCODING 36153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FF80 +1280 +FF80 +9200 +FFC0 +4140 +4900 +4900 +1600 +E180 +ENDCHAR +STARTCHAR U_8D3A +ENCODING 36154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +25E0 +4400 +9FC0 +1040 +1240 +1240 +1240 +0D80 +7060 +ENDCHAR +STARTCHAR U_8D3B +ENCODING 36155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +AA40 +AFE0 +A820 +A800 +ABE0 +2220 +5220 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_8D3C +ENCODING 36156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +88A0 +AFE0 +AA80 +AAA0 +AFA0 +AAC0 +A280 +54A0 +4960 +9220 +ENDCHAR +STARTCHAR U_8D3D +ENCODING 36157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FF80 +2280 +F780 +22A0 +6460 +3F80 +2080 +2480 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D3E +ENCODING 36158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D3F +ENCODING 36159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +ABE0 +AA20 +AFE0 +AA20 +23E0 +5220 +4A20 +8A60 +ENDCHAR +STARTCHAR U_8D40 +ENCODING 36160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +BA80 +A320 +FBE0 +0000 +3F80 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8D41 +ENCODING 36161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4200 +DFE0 +4200 +4FC0 +0000 +3F80 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8D42 +ENCODING 36162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +AA40 +AD80 +AA40 +AC20 +ABC0 +2240 +5240 +4BC0 +8A40 +ENDCHAR +STARTCHAR U_8D43 +ENCODING 36163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +AA00 +AA80 +AA80 +ABE0 +AA80 +2280 +5480 +4880 +8BE0 +ENDCHAR +STARTCHAR U_8D44 +ENCODING 36164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +D240 +4500 +48C0 +3F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D45 +ENCODING 36165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +A900 +AA40 +ABC0 +A880 +A920 +2640 +5080 +4940 +8E20 +ENDCHAR +STARTCHAR U_8D46 +ENCODING 36166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AA20 +ABE0 +AA40 +AA20 +AA80 +2460 +5580 +4840 +8820 +ENDCHAR +STARTCHAR U_8D47 +ENCODING 36167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +88A0 +AFE0 +A880 +ACA0 +AAC0 +A9C0 +22A0 +54A0 +4AA0 +8900 +ENDCHAR +STARTCHAR U_8D48 +ENCODING 36168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +ABE0 +A800 +AFE0 +AA80 +AAA0 +AA40 +2A40 +5AA0 +8B20 +ENDCHAR +STARTCHAR U_8D49 +ENCODING 36169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1480 +FFE0 +2480 +7FC0 +A0A0 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D4A +ENCODING 36170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +AA20 +ADC0 +A800 +AFE0 +A880 +22C0 +54A0 +4CA0 +8980 +ENDCHAR +STARTCHAR U_8D4B +ENCODING 36171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8EC0 +A8A0 +AFE0 +AA80 +AA80 +AB80 +AAA0 +2AA0 +5B60 +8C20 +ENDCHAR +STARTCHAR U_8D4C +ENCODING 36172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FA0 +A940 +AFE0 +A900 +ABC0 +AA40 +27C0 +5240 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_8D4D +ENCODING 36173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +FFE0 +8020 +3F80 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D4E +ENCODING 36174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +AFE0 +AAA0 +AD80 +AA80 +A7E0 +3100 +4A80 +8C60 +ENDCHAR +STARTCHAR U_8D4F +ENCODING 36175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +9120 +1F00 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D50 +ENCODING 36176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +ABC0 +AA40 +ABC0 +AA00 +AFE0 +A2A0 +24A0 +5120 +8AC0 +ENDCHAR +STARTCHAR U_8D51 +ENCODING 36177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +0A00 +1100 +FBE0 +AAA0 +AAA0 +2080 +5140 +8A20 +ENDCHAR +STARTCHAR U_8D52 +ENCODING 36178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +AAA0 +ABE0 +AAA0 +ABE0 +AA20 +ABA0 +52A0 +4BA0 +8460 +ENDCHAR +STARTCHAR U_8D53 +ENCODING 36179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4240 +7FE0 +4240 +5FC0 +4880 +5AC0 +6AA0 +8500 +98E0 +ENDCHAR +STARTCHAR U_8D54 +ENCODING 36180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +8FE0 +AA40 +A980 +AFE0 +A800 +23C0 +5240 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_8D55 +ENCODING 36181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +8AC0 +AC80 +A940 +AAA0 +AC80 +AAA0 +22C0 +5580 +4A40 +8C20 +ENDCHAR +STARTCHAR U_8D56 +ENCODING 36182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2240 +FFE0 +AA20 +AAA0 +FAA0 +22A0 +7080 +A940 +2620 +ENDCHAR +STARTCHAR U_8D57 +ENCODING 36183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AAA0 +AA20 +AAA0 +A800 +ABE0 +22A0 +5360 +4AA0 +8BE0 +ENDCHAR +STARTCHAR U_8D58 +ENCODING 36184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FF40 +2480 +4960 +BF80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D59 +ENCODING 36185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8FE0 +AAA0 +ABE0 +AAA0 +ABE0 +AAA0 +2040 +57E0 +4A40 +89C0 +ENDCHAR +STARTCHAR U_8D5A +ENCODING 36186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +8A80 +AFE0 +AAA0 +AFE0 +AAA0 +2FE0 +5280 +56C0 +8AA0 +ENDCHAR +STARTCHAR U_8D5B +ENCODING 36187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +7FC0 +1200 +FFE0 +3180 +D560 +1500 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D5C +ENCODING 36188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +97E0 +9080 +BBE0 +A880 +ABE0 +BA20 +92A0 +92A0 +9140 +FE20 +ENDCHAR +STARTCHAR U_8D5D +ENCODING 36189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +EFC0 +A900 +AFC0 +A900 +BFC0 +9040 +9240 +8500 +F8E0 +ENDCHAR +STARTCHAR U_8D5E +ENCODING 36190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7BC0 +9480 +FFE0 +35A0 +5AE0 +BF80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D5F +ENCODING 36191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +F880 +57E0 +2280 +5B40 +8A40 +3FA0 +2480 +2480 +0A00 +3180 +ENDCHAR +STARTCHAR U_8D60 +ENCODING 36192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8FE0 +A920 +ADA0 +AFE0 +A800 +A7C0 +2440 +57C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_8D61 +ENCODING 36193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +AFE0 +AA40 +ABE0 +AA00 +AAE0 +A200 +35E0 +4D20 +89E0 +ENDCHAR +STARTCHAR U_8D62 +ENCODING 36194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +1080 +7FC0 +5140 +7540 +55C0 +7540 +9A60 +ENDCHAR +STARTCHAR U_8D63 +ENCODING 36195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FA80 +5140 +FFE0 +9080 +F7E0 +9220 +F2A0 +22A0 +F940 +2620 +ENDCHAR +STARTCHAR U_8D64 +ENCODING 36196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0900 +2940 +2920 +4920 +1500 +6200 +ENDCHAR +STARTCHAR U_8D65 +ENCODING 36197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +2420 +F940 +5100 +5900 +D680 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_8D66 +ENCODING 36198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +11E0 +1340 +FD40 +2940 +6D40 +AB40 +2A80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8D67 +ENCODING 36199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1160 +1100 +FFE0 +2920 +6D20 +ABA0 +A940 +49A0 +9920 +ENDCHAR +STARTCHAR U_8D68 +ENCODING 36200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +13E0 +FEA0 +2AA0 +6EA0 +ABE0 +AA80 +28A0 +48A0 +9BE0 +ENDCHAR +STARTCHAR U_8D69 +ENCODING 36201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DC0 +1280 +FFE0 +2AA0 +2AA0 +6FE0 +AA00 +2A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8D6A +ENCODING 36202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +2080 +FFE0 +5220 +5AA0 +D6A0 +52A0 +52A0 +9140 +B220 +ENDCHAR +STARTCHAR U_8D6B +ENCODING 36203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +FFE0 +2940 +6D40 +AB60 +AD60 +2940 +4A40 +98C0 +ENDCHAR +STARTCHAR U_8D6C +ENCODING 36204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +7C80 +13E0 +FE20 +2BE0 +2A20 +6FE0 +AA20 +2BE0 +4940 +9A20 +ENDCHAR +STARTCHAR U_8D6D +ENCODING 36205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +7FA0 +1140 +13E0 +FD00 +2BE0 +6E20 +ABE0 +2A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8D6E +ENCODING 36206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +FD20 +2520 +FF60 +5400 +57E0 +DCA0 +57A0 +5440 +94A0 +3520 +ENDCHAR +STARTCHAR U_8D6F +ENCODING 36207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +12A0 +13E0 +FEA0 +2BE0 +6E80 +ABE0 +2A20 +4FE0 +9A20 +ENDCHAR +STARTCHAR U_8D70 +ENCODING 36208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0400 +2400 +27C0 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8D71 +ENCODING 36209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +FFE0 +2080 +1100 +0600 +1800 +E600 +41E0 +ENDCHAR +STARTCHAR U_8D72 +ENCODING 36210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FE0 +1120 +FD20 +1120 +5D20 +5220 +54C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D73 +ENCODING 36211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1140 +7D40 +1140 +FF40 +11C0 +5F40 +5040 +7040 +9840 +87E0 +ENDCHAR +STARTCHAR U_8D74 +ENCODING 36212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7C80 +10C0 +FEA0 +10A0 +5E80 +5080 +7080 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D75 +ENCODING 36213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1240 +7D40 +1080 +FE80 +1080 +5D40 +5140 +7240 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D76 +ENCODING 36214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7C80 +1080 +FFE0 +1080 +5C80 +5080 +5080 +7080 +8FE0 +ENDCHAR +STARTCHAR U_8D77 +ENCODING 36215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13C0 +7C40 +1040 +FFC0 +1200 +5220 +5E20 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D78 +ENCODING 36216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7EA0 +12A0 +FEA0 +12A0 +5EA0 +53E0 +7220 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D79 +ENCODING 36217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +7E20 +1120 +FCA0 +1060 +5FA0 +5120 +70C0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7A +ENCODING 36218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F940 +2220 +FCA0 +5080 +5BE0 +5040 +5080 +B100 +8FE0 +ENDCHAR +STARTCHAR U_8D7B +ENCODING 36219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +10C0 +7DA0 +12A0 +FC80 +10A0 +5C40 +5080 +7300 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7C +ENCODING 36220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7BE0 +1420 +F940 +1100 +5E80 +5240 +5460 +7440 +8FE0 +ENDCHAR +STARTCHAR U_8D7D +ENCODING 36221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +7D40 +1140 +FD40 +13E0 +5D00 +5280 +7460 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7E +ENCODING 36222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7980 +1100 +11E0 +FF40 +1140 +5D40 +5240 +5240 +7400 +8FE0 +ENDCHAR +STARTCHAR U_8D7F +ENCODING 36223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1380 +7A80 +1280 +FFE0 +1280 +5A80 +52A0 +5360 +7220 +8FC0 +ENDCHAR +STARTCHAR U_8D80 +ENCODING 36224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +13E0 +7E80 +1280 +FFE0 +10A0 +5DA0 +52E0 +7480 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D81 +ENCODING 36225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7E20 +1080 +FD20 +1240 +5C80 +5120 +7040 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D82 +ENCODING 36226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7A00 +17E0 +14A0 +FC80 +12C0 +5AA0 +54A0 +5280 +7100 +8FE0 +ENDCHAR +STARTCHAR U_8D83 +ENCODING 36227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7880 +1280 +13C0 +FC80 +57E0 +5080 +5D40 +5140 +7220 +8FE0 +ENDCHAR +STARTCHAR U_8D84 +ENCODING 36228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +13C0 +FE40 +13C0 +5E40 +5240 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D85 +ENCODING 36229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1140 +7D40 +12C0 +FC00 +13C0 +5E40 +5240 +73C0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D86 +ENCODING 36230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +F780 +2480 +2480 +FFE0 +2480 +BCA0 +A560 +E6A0 +9040 +8FE0 +ENDCHAR +STARTCHAR U_8D87 +ENCODING 36231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F080 +27E0 +2000 +FA40 +2140 +B940 +A080 +E7E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D88 +ENCODING 36232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F100 +21E0 +2100 +FFC0 +2440 +BC40 +A440 +E7C0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D89 +ENCODING 36233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +12A0 +7EA0 +13E0 +FC80 +12A0 +5EA0 +53E0 +7220 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8A +ENCODING 36234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +10A0 +7FE0 +1280 +FEA0 +12A0 +5E40 +52A0 +7120 +9A00 +87E0 +ENDCHAR +STARTCHAR U_8D8B +ENCODING 36235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11C0 +7E40 +1080 +FFE0 +1020 +5DE0 +5020 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8C +ENCODING 36236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1080 +FDC0 +1000 +5FE0 +5220 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8D +ENCODING 36237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11C0 +7A40 +1580 +FD00 +12E0 +5D20 +5340 +7480 +9100 +8FE0 +ENDCHAR +STARTCHAR U_8D8E +ENCODING 36238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +7FE0 +1080 +FFE0 +1080 +5DC0 +52A0 +74A0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8F +ENCODING 36239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +13C0 +7C80 +13E0 +FC80 +13E0 +5E20 +5220 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D90 +ENCODING 36240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +F920 +2360 +BDA0 +A120 +E360 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D91 +ENCODING 36241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1180 +7CE0 +11A0 +FE40 +1240 +5E40 +52A0 +7120 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D92 +ENCODING 36242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1140 +7D60 +1340 +FD40 +1360 +5D40 +5240 +7060 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D93 +ENCODING 36243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +1260 +FC80 +13E0 +5D80 +52C0 +74A0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D94 +ENCODING 36244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +22A0 +FBA0 +24A0 +FEA0 +29A0 +BAA0 +A420 +E8E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D95 +ENCODING 36245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7FE0 +1220 +FFE0 +1000 +5FE0 +5080 +77E0 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D96 +ENCODING 36246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +7D40 +17A0 +F920 +1100 +5FC0 +5100 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D97 +ENCODING 36247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FA20 +1220 +13E0 +FC80 +12E0 +5A80 +5380 +74E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D98 +ENCODING 36248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +2480 +FF00 +25C0 +BF00 +A5C0 +E720 +98E0 +8FE0 +ENDCHAR +STARTCHAR U_8D99 +ENCODING 36249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +11C0 +7C80 +13E0 +FE20 +13E0 +5E20 +53E0 +7220 +9A20 +87E0 +ENDCHAR +STARTCHAR U_8D9A +ENCODING 36250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +2100 +27C0 +FD40 +27C0 +BB80 +A540 +E540 +9120 +8FE0 +ENDCHAR +STARTCHAR U_8D9B +ENCODING 36251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7E20 +11C0 +FC80 +13E0 +5CA0 +52C0 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D9C +ENCODING 36252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7D60 +13A0 +F920 +17E0 +59A0 +5360 +7520 +9840 +87E0 +ENDCHAR +STARTCHAR U_8D9D +ENCODING 36253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F280 +2D60 +2380 +F880 +2140 +BAA0 +AA40 +E1C0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D9E +ENCODING 36254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F7C0 +2280 +2FE0 +F800 +27C0 +BC40 +A7C0 +E440 +97C0 +8FE0 +ENDCHAR +STARTCHAR U_8D9F +ENCODING 36255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F100 +2FE0 +F820 +2BA0 +BAA0 +ABA0 +E860 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA0 +ENCODING 36256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1080 +7FE0 +1220 +FFE0 +1220 +5FE0 +5080 +77E0 +9880 +87E0 +ENDCHAR +STARTCHAR U_8DA1 +ENCODING 36257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +1280 +7FE0 +1280 +FFE0 +1280 +5FE0 +5280 +73E0 +9A00 +87E0 +ENDCHAR +STARTCHAR U_8DA2 +ENCODING 36258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F840 +23C0 +2040 +FBE0 +2080 +BAA0 +A1C0 +E2A0 +94A0 +8FE0 +ENDCHAR +STARTCHAR U_8DA3 +ENCODING 36259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2500 +F7E0 +2520 +F720 +25A0 +B540 +AF40 +E1A0 +B100 +8FE0 +ENDCHAR +STARTCHAR U_8DA4 +ENCODING 36260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7E0 +2420 +23C0 +F900 +23E0 +B620 +AA20 +E3E0 +9220 +8FE0 +ENDCHAR +STARTCHAR U_8DA5 +ENCODING 36261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +13E0 +7D40 +17E0 +FD60 +1620 +5FE0 +5420 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA6 +ENCODING 36262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +F5E0 +22A0 +2480 +F940 +2220 +BBE0 +A220 +E3E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8DA7 +ENCODING 36263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7FC0 +1240 +FFE0 +1080 +5EE0 +5280 +75E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA8 +ENCODING 36264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7FE0 +11A0 +FD40 +13E0 +5EA0 +53E0 +70A0 +9940 +87E0 +ENDCHAR +STARTCHAR U_8DA9 +ENCODING 36265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +2540 +FFC0 +2280 +BFE0 +A280 +EFE0 +9440 +8FE0 +ENDCHAR +STARTCHAR U_8DAA +ENCODING 36266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +27E0 +FAA0 +23E0 +BAA0 +A3E0 +E140 +B220 +8FE0 +ENDCHAR +STARTCHAR U_8DAB +ENCODING 36267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +FBA0 +2280 +BFE0 +AAA0 +EBA0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_8DAC +ENCODING 36268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +27E0 +FA40 +27E0 +B240 +AFE0 +E280 +B460 +8FE0 +ENDCHAR +STARTCHAR U_8DAD +ENCODING 36269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +FE80 +23E0 +FE80 +23E0 +BA80 +A7E0 +E540 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_8DAE +ENCODING 36270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2EE0 +FAA0 +2EE0 +A100 +BFE0 +E540 +A920 +9FE0 +ENDCHAR +STARTCHAR U_8DAF +ENCODING 36271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +FB60 +25A0 +FFE0 +2480 +BFE0 +A480 +E7E0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_8DB0 +ENCODING 36272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F540 +2920 +FFE0 +2920 +ABA0 +BD60 +ABA0 +ED60 +B920 +8FE0 +ENDCHAR +STARTCHAR U_8DB1 +ENCODING 36273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +FAA0 +27E0 +A520 +B5A0 +E240 +B420 +8FE0 +ENDCHAR +STARTCHAR U_8DB2 +ENCODING 36274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +F520 +27C0 +A640 +BD40 +E7C0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_8DB3 +ENCODING 36275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +2400 +27C0 +2400 +5400 +4C00 +83E0 +ENDCHAR +STARTCHAR U_8DB4 +ENCODING 36276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9280 +9280 +F280 +2280 +BA80 +A280 +A440 +B440 +C820 +1020 +ENDCHAR +STARTCHAR U_8DB5 +ENCODING 36277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7A00 +4BE0 +4C20 +7820 +1220 +5920 +5120 +5020 +5820 +E0C0 +ENDCHAR +STARTCHAR U_8DB6 +ENCODING 36278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4880 +7880 +17E0 +5080 +5880 +5080 +5880 +E280 +0100 +ENDCHAR +STARTCHAR U_8DB7 +ENCODING 36279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7BE0 +4C00 +4800 +7BC0 +1080 +5900 +5200 +5420 +5C20 +E3E0 +ENDCHAR +STARTCHAR U_8DB8 +ENCODING 36280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0F80 +1080 +3FC0 +E040 +3FC0 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DB9 +ENCODING 36281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4FC0 +4940 +7940 +17E0 +5900 +5100 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DBA +ENCODING 36282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +1100 +5FE0 +5100 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DBB +ENCODING 36283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4A80 +4C40 +7A20 +1100 +5FE0 +5040 +5880 +E080 +0100 +ENDCHAR +STARTCHAR U_8DBC +ENCODING 36284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +4A40 +7A40 +1240 +5FE0 +5240 +5240 +5A40 +E440 +0840 +ENDCHAR +STARTCHAR U_8DBD +ENCODING 36285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7880 +4FE0 +4900 +7900 +11E0 +5920 +5120 +5220 +5A20 +E4C0 +ENDCHAR +STARTCHAR U_8DBE +ENCODING 36286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4880 +4A80 +7AE0 +1280 +5A80 +5280 +5280 +5A80 +E7E0 +ENDCHAR +STARTCHAR U_8DBF +ENCODING 36287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7A80 +12E0 +5A20 +5220 +5340 +5C80 +E540 +0A20 +ENDCHAR +STARTCHAR U_8DC0 +ENCODING 36288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7BE0 +1220 +5A20 +53E0 +5220 +5A20 +E420 +0860 +ENDCHAR +STARTCHAR U_8DC1 +ENCODING 36289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +7AA0 +4AA0 +4AA0 +7BE0 +1220 +5A00 +5200 +5220 +5A20 +E1E0 +ENDCHAR +STARTCHAR U_8DC2 +ENCODING 36290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4FE0 +4880 +7880 +17E0 +5A20 +5240 +5180 +5A40 +E420 +ENDCHAR +STARTCHAR U_8DC3 +ENCODING 36291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4F00 +4900 +7900 +17E0 +5100 +5900 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DC4 +ENCODING 36292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4C40 +4820 +7BC0 +1240 +5A40 +52C0 +5220 +5E20 +E3E0 +ENDCHAR +STARTCHAR U_8DC5 +ENCODING 36293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4A00 +7BE0 +1240 +5240 +5AC0 +5260 +5A40 +E440 +0840 +ENDCHAR +STARTCHAR U_8DC6 +ENCODING 36294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4940 +4A20 +7BE0 +1000 +5BE0 +5220 +5220 +5A20 +E3E0 +ENDCHAR +STARTCHAR U_8DC7 +ENCODING 36295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +7D40 +4D40 +4FE0 +7D40 +1540 +5DC0 +5540 +5400 +5C00 +E7E0 +ENDCHAR +STARTCHAR U_8DC8 +ENCODING 36296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4C40 +48A0 +7900 +1240 +5880 +5320 +5040 +5980 +E600 +ENDCHAR +STARTCHAR U_8DC9 +ENCODING 36297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4A80 +7C40 +1120 +5880 +57E0 +5040 +5A80 +E100 +0080 +ENDCHAR +STARTCHAR U_8DCA +ENCODING 36298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4900 +7900 +17E0 +5100 +5B80 +5540 +5920 +E100 +0100 +ENDCHAR +STARTCHAR U_8DCB +ENCODING 36299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +4FE0 +4A00 +7BC0 +1240 +5B40 +5540 +5480 +5940 +E620 +ENDCHAR +STARTCHAR U_8DCC +ENCODING 36300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +4BE0 +4C80 +7880 +17E0 +5880 +5140 +5140 +5A20 +E420 +ENDCHAR +STARTCHAR U_8DCD +ENCODING 36301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +1080 +5BE0 +5220 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DCE +ENCODING 36302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4C20 +7800 +1200 +5240 +5B80 +5200 +5A20 +E220 +01E0 +ENDCHAR +STARTCHAR U_8DCF +ENCODING 36303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +9FA0 +F4A0 +24A0 +A4A0 +B4A0 +A4A0 +B4A0 +CAE0 +1120 +ENDCHAR +STARTCHAR U_8DD0 +ENCODING 36304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +9280 +F2A0 +2BC0 +AA80 +BA80 +AA80 +ABA0 +BEA0 +E460 +ENDCHAR +STARTCHAR U_8DD1 +ENCODING 36305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9840 +9740 +F540 +2540 +B740 +A4A0 +A420 +B420 +C3E0 +ENDCHAR +STARTCHAR U_8DD2 +ENCODING 36306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +7820 +4BA0 +4AA0 +7AA0 +12A0 +5AA0 +53A0 +5020 +5820 +E0E0 +ENDCHAR +STARTCHAR U_8DD3 +ENCODING 36307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7880 +4FE0 +4880 +7880 +1080 +5BE0 +5080 +5080 +5880 +E7E0 +ENDCHAR +STARTCHAR U_8DD4 +ENCODING 36308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +4C20 +7BA0 +12A0 +52A0 +5AA0 +53A0 +5820 +E0A0 +0040 +ENDCHAR +STARTCHAR U_8DD5 +ENCODING 36309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +48E0 +7880 +1080 +5BE0 +5220 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DD6 +ENCODING 36310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +4900 +7A00 +13E0 +5620 +5A20 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DD7 +ENCODING 36311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +9440 +FDE0 +2440 +A640 +B540 +A440 +A440 +B440 +C4C0 +ENDCHAR +STARTCHAR U_8DD8 +ENCODING 36312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4CA0 +4AC0 +7880 +13E0 +5880 +5080 +57E0 +5880 +E080 +0080 +ENDCHAR +STARTCHAR U_8DD9 +ENCODING 36313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +1240 +5240 +5A40 +53C0 +5A40 +E240 +07E0 +ENDCHAR +STARTCHAR U_8DDA +ENCODING 36314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +9AA0 +9AA0 +FAA0 +2AA0 +AFE0 +BAA0 +AAA0 +BAA0 +CAA0 +1560 +ENDCHAR +STARTCHAR U_8DDB +ENCODING 36315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +94A0 +F480 +27E0 +A640 +B540 +A540 +B480 +C940 +1220 +ENDCHAR +STARTCHAR U_8DDC +ENCODING 36316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +97E0 +F400 +2520 +BD40 +A580 +A520 +B920 +C8E0 +ENDCHAR +STARTCHAR U_8DDD +ENCODING 36317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A00 +4A00 +7BE0 +1220 +5220 +5A20 +53E0 +5200 +5E00 +E3E0 +ENDCHAR +STARTCHAR U_8DDE +ENCODING 36318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +9480 +9480 +F7E0 +2080 +B2C0 +A2A0 +B4A0 +C080 +0180 +ENDCHAR +STARTCHAR U_8DDF +ENCODING 36319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2500 +B520 +A4C0 +A480 +B540 +C620 +ENDCHAR +STARTCHAR U_8DE0 +ENCODING 36320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2140 +A7C0 +B500 +A7E0 +A120 +B280 +CC60 +ENDCHAR +STARTCHAR U_8DE1 +ENCODING 36321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9280 +F280 +26C0 +BAA0 +A2A0 +B280 +C480 +0980 +ENDCHAR +STARTCHAR U_8DE2 +ENCODING 36322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9440 +9A80 +F100 +2680 +B1E0 +A620 +A140 +B180 +CE00 +ENDCHAR +STARTCHAR U_8DE3 +ENCODING 36323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +7D00 +4FE0 +4900 +7900 +17E0 +5A80 +5280 +52A0 +5CA0 +E460 +ENDCHAR +STARTCHAR U_8DE4 +ENCODING 36324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7900 +4FE0 +4A40 +7C20 +1240 +5A40 +5180 +5180 +5A40 +E420 +ENDCHAR +STARTCHAR U_8DE5 +ENCODING 36325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +8A40 +8A60 +FA20 +2560 +2100 +BFE0 +A380 +A540 +B540 +C920 +ENDCHAR +STARTCHAR U_8DE6 +ENCODING 36326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9500 +97E0 +F900 +2100 +AFE0 +B100 +A380 +B540 +C920 +0100 +ENDCHAR +STARTCHAR U_8DE7 +ENCODING 36327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9820 +F7C0 +2100 +B100 +A7C0 +A100 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8DE8 +ENCODING 36328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +F440 +2BA0 +B000 +AFE0 +A200 +B7C0 +C040 +0180 +ENDCHAR +STARTCHAR U_8DE9 +ENCODING 36329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +4D20 +4FE0 +7D20 +17E0 +5920 +5140 +50A0 +5960 +E620 +ENDCHAR +STARTCHAR U_8DEA +ENCODING 36330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9240 +9FE0 +9400 +F5E0 +2520 +BD20 +A560 +A500 +BD20 +E0E0 +ENDCHAR +STARTCHAR U_8DEB +ENCODING 36331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +2280 +3BA0 +C4E0 +3F80 +2080 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DEC +ENCODING 36332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4BE0 +4880 +7880 +17E0 +5880 +53E0 +5080 +5880 +E7E0 +ENDCHAR +STARTCHAR U_8DED +ENCODING 36333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8C40 +8A80 +F900 +26E0 +2080 +BFE0 +A280 +A7E0 +B880 +C080 +ENDCHAR +STARTCHAR U_8DEE +ENCODING 36334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +9100 +9240 +F7A0 +2120 +B900 +A7C0 +A100 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8DEF +ENCODING 36335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +9440 +9A80 +F100 +2280 +B440 +AFE0 +A440 +B440 +C7C0 +ENDCHAR +STARTCHAR U_8DF0 +ENCODING 36336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F420 +9240 +97E0 +9240 +F240 +27E0 +BA40 +A240 +A240 +BC40 +E840 +ENDCHAR +STARTCHAR U_8DF1 +ENCODING 36337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9100 +F7E0 +2040 +BFE0 +A240 +A140 +B840 +E1C0 +ENDCHAR +STARTCHAR U_8DF2 +ENCODING 36338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9820 +F7C0 +2000 +BBC0 +A240 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_8DF3 +ENCODING 36339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9AA0 +96C0 +F280 +2280 +26C0 +BAA0 +A280 +BAA0 +C4A0 +0860 +ENDCHAR +STARTCHAR U_8DF4 +ENCODING 36340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9280 +9FE0 +FAA0 +2AA0 +BAE0 +AC20 +A820 +BFE0 +E820 +ENDCHAR +STARTCHAR U_8DF5 +ENCODING 36341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9240 +9FE0 +F200 +2FE0 +A220 +B240 +A140 +B0A0 +C360 +0C20 +ENDCHAR +STARTCHAR U_8DF6 +ENCODING 36342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9480 +93E0 +FC80 +2480 +2480 +B540 +A540 +B620 +CA00 +11E0 +ENDCHAR +STARTCHAR U_8DF7 +ENCODING 36343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +9240 +9180 +F2A0 +2460 +BFE0 +A280 +A2A0 +BCA0 +E860 +ENDCHAR +STARTCHAR U_8DF8 +ENCODING 36344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94A0 +97C0 +9480 +F5A0 +26E0 +B880 +A7E0 +A080 +B880 +E080 +ENDCHAR +STARTCHAR U_8DF9 +ENCODING 36345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F020 +99C0 +9480 +9080 +FC80 +27E0 +BC80 +A480 +A480 +BA00 +E9E0 +ENDCHAR +STARTCHAR U_8DFA +ENCODING 36346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9280 +9280 +94E0 +F100 +27E0 +B900 +A380 +A540 +B920 +E100 +ENDCHAR +STARTCHAR U_8DFB +ENCODING 36347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9240 +9180 +F660 +2000 +BA40 +A240 +A240 +B440 +E840 +ENDCHAR +STARTCHAR U_8DFC +ENCODING 36348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +9400 +F7E0 +2420 +BDE0 +A560 +A5E0 +B820 +E0C0 +ENDCHAR +STARTCHAR U_8DFD +ENCODING 36349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +9400 +F420 +27E0 +B940 +A2A0 +A620 +BA40 +E3C0 +ENDCHAR +STARTCHAR U_8DFE +ENCODING 36350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5A40 +D180 +5260 +7F80 +2080 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DFF +ENCODING 36351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9100 +F7E0 +2100 +BDE0 +A500 +A500 +BB00 +E1E0 +ENDCHAR +STARTCHAR U_8E00 +ENCODING 36352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +9440 +F7C0 +2100 +A500 +B5E0 +A500 +B700 +E900 +90E0 +ENDCHAR +STARTCHAR U_8E01 +ENCODING 36353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +8AA0 +FD40 +22A0 +22A0 +B800 +A3E0 +A080 +B880 +C7E0 +ENDCHAR +STARTCHAR U_8E02 +ENCODING 36354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +9740 +F540 +2540 +A740 +BD40 +A5C0 +AF40 +B160 +E160 +ENDCHAR +STARTCHAR U_8E03 +ENCODING 36355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9340 +9100 +97E0 +F420 +27E0 +BC20 +A7E0 +A420 +BC20 +E4E0 +ENDCHAR +STARTCHAR U_8E04 +ENCODING 36356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +92E0 +9280 +9280 +F7E0 +2080 +BAA0 +A4A0 +A040 +B980 +E600 +ENDCHAR +STARTCHAR U_8E05 +ENCODING 36357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +27E0 +F480 +2880 +3F80 +2080 +3F80 +23C0 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8E06 +ENCODING 36358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9240 +97C0 +9120 +F240 +2520 +BBC0 +A640 +A180 +BA40 +E420 +ENDCHAR +STARTCHAR U_8E07 +ENCODING 36359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9800 +97C0 +F540 +2540 +BFE0 +A540 +A7E0 +B840 +E180 +ENDCHAR +STARTCHAR U_8E08 +ENCODING 36360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +8900 +FFC0 +2540 +27C0 +BB80 +A540 +A540 +B920 +C120 +ENDCHAR +STARTCHAR U_8E09 +ENCODING 36361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9440 +97C0 +F440 +27C0 +BD20 +A4C0 +A480 +BD40 +E620 +ENDCHAR +STARTCHAR U_8E0A +ENCODING 36362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9280 +9100 +97E0 +F520 +27E0 +BD20 +A7E0 +A520 +BD20 +E560 +ENDCHAR +STARTCHAR U_8E0B +ENCODING 36363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +9FA0 +F4A0 +24A0 +A4A0 +BFE0 +A4A0 +AA80 +BF80 +E080 +ENDCHAR +STARTCHAR U_8E0C +ENCODING 36364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2200 +AFE0 +B440 +A7E0 +AA40 +B940 +E080 +ENDCHAR +STARTCHAR U_8E0D +ENCODING 36365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +97A0 +9140 +97E0 +F100 +23E0 +BA40 +A7E0 +A080 +BA80 +E100 +ENDCHAR +STARTCHAR U_8E0E +ENCODING 36366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8900 +FB40 +2520 +2120 +B900 +A7E0 +A420 +BC20 +C7E0 +ENDCHAR +STARTCHAR U_8E0F +ENCODING 36367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +9F40 +9380 +9540 +F920 +27C0 +BC40 +A7C0 +A440 +BFC0 +E440 +ENDCHAR +STARTCHAR U_8E10 +ENCODING 36368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +97E0 +92A0 +91A0 +F660 +2280 +BFE0 +A240 +A2A0 +B9A0 +E660 +ENDCHAR +STARTCHAR U_8E11 +ENCODING 36369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97E0 +9240 +93C0 +F240 +2240 +BBC0 +A240 +A7E0 +BA40 +E420 +ENDCHAR +STARTCHAR U_8E12 +ENCODING 36370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9080 +97E0 +92C0 +F4A0 +2100 +BFE0 +A240 +A240 +B980 +E660 +ENDCHAR +STARTCHAR U_8E13 +ENCODING 36371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9280 +93E0 +9680 +FBE0 +2280 +BA80 +A3E0 +A280 +BBE0 +E200 +ENDCHAR +STARTCHAR U_8E14 +ENCODING 36372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +97C0 +9440 +F7C0 +2440 +BFC0 +A100 +AFE0 +B900 +E100 +ENDCHAR +STARTCHAR U_8E15 +ENCODING 36373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +97C0 +9140 +F7E0 +2140 +BFC0 +A500 +A5E0 +BB00 +E9E0 +ENDCHAR +STARTCHAR U_8E16 +ENCODING 36374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +97E0 +9240 +F7E0 +2000 +BBE0 +A220 +A3E0 +BA20 +E3E0 +ENDCHAR +STARTCHAR U_8E17 +ENCODING 36375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9540 +98A0 +F7C0 +2080 +B900 +A2A0 +A620 +BA40 +E1C0 +ENDCHAR +STARTCHAR U_8E18 +ENCODING 36376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9960 +95A0 +F320 +2FE0 +B920 +A3A0 +A560 +B920 +E0C0 +ENDCHAR +STARTCHAR U_8E19 +ENCODING 36377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +9BE0 +9AA0 +FEA0 +2AA0 +AEA0 +BAA0 +AAA0 +AF40 +B2A0 +E320 +ENDCHAR +STARTCHAR U_8E1A +ENCODING 36378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9BA0 +F000 +2FE0 +BAA0 +AFE0 +AAA0 +BAA0 +E860 +ENDCHAR +STARTCHAR U_8E1B +ENCODING 36379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9FE0 +F280 +2440 +B920 +A7C0 +A100 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8E1C +ENCODING 36380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +2240 +A520 +BBC0 +A440 +BA80 +C180 +0E60 +ENDCHAR +STARTCHAR U_8E1D +ENCODING 36381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +9540 +F7C0 +2100 +BFE0 +A100 +A380 +B540 +E920 +ENDCHAR +STARTCHAR U_8E1E +ENCODING 36382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +9480 +F480 +27E0 +BC80 +A7E0 +A620 +BBE0 +E220 +ENDCHAR +STARTCHAR U_8E1F +ENCODING 36383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +97A0 +FAA0 +22A0 +AFA0 +B2A0 +A2A0 +B5E0 +E8A0 +1000 +ENDCHAR +STARTCHAR U_8E20 +ENCODING 36384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9820 +9400 +F7E0 +24A0 +BAA0 +A1E0 +A280 +BCA0 +E0E0 +ENDCHAR +STARTCHAR U_8E21 +ENCODING 36385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +9100 +FFE0 +2440 +BBA0 +A280 +A3A0 +BA20 +E1E0 +ENDCHAR +STARTCHAR U_8E22 +ENCODING 36386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2200 +BFE0 +A2A0 +A520 +BA20 +E4C0 +ENDCHAR +STARTCHAR U_8E23 +ENCODING 36387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9440 +9280 +F7E0 +2000 +BBE0 +A220 +A220 +BBE0 +E220 +ENDCHAR +STARTCHAR U_8E24 +ENCODING 36388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9240 +9240 +F5A0 +2900 +B900 +AFE0 +A100 +B900 +E100 +ENDCHAR +STARTCHAR U_8E25 +ENCODING 36389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9440 +9280 +F7E0 +2100 +BFE0 +A240 +A680 +B940 +E620 +ENDCHAR +STARTCHAR U_8E26 +ENCODING 36390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9280 +9440 +FFE0 +2040 +BF40 +A540 +A740 +B840 +E1C0 +ENDCHAR +STARTCHAR U_8E27 +ENCODING 36391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +92A0 +92A0 +FFA0 +22A0 +B7A0 +AAA0 +A240 +BAA0 +E720 +ENDCHAR +STARTCHAR U_8E28 +ENCODING 36392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9440 +9AA0 +F120 +2100 +2500 +BD00 +A5C0 +A500 +BB00 +C9E0 +ENDCHAR +STARTCHAR U_8E29 +ENCODING 36393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9540 +F280 +2100 +BFE0 +A100 +A380 +B540 +E920 +8100 +ENDCHAR +STARTCHAR U_8E2A +ENCODING 36394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9420 +9380 +F000 +27C0 +B900 +A540 +A520 +B920 +E300 +ENDCHAR +STARTCHAR U_8E2B +ENCODING 36395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +97E0 +9280 +F280 +2AA0 +BAA0 +A6C0 +A280 +BA80 +EFE0 +ENDCHAR +STARTCHAR U_8E2C +ENCODING 36396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +8F80 +8880 +FFE0 +2880 +ABE0 +BA20 +AAA0 +AAA0 +B940 +CA20 +ENDCHAR +STARTCHAR U_8E2D +ENCODING 36397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9480 +FFC0 +2140 +AFE0 +B140 +AFC0 +B100 +C100 +0300 +ENDCHAR +STARTCHAR U_8E2E +ENCODING 36398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9480 +F4E0 +2480 +A480 +B7E0 +AA20 +AA20 +F3E0 +ENDCHAR +STARTCHAR U_8E2F +ENCODING 36399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F5E0 +92A0 +9FA0 +F2A0 +2FC0 +22A0 +BAA0 +A2A0 +A5E0 +B880 +C080 +ENDCHAR +STARTCHAR U_8E30 +ENCODING 36400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9BA0 +F000 +2E20 +AAA0 +BEA0 +AAA0 +AEA0 +BA20 +CAE0 +ENDCHAR +STARTCHAR U_8E31 +ENCODING 36401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F080 +97C0 +9540 +F7C0 +2540 +A5C0 +BC00 +A7C0 +A540 +B880 +CB40 +ENDCHAR +STARTCHAR U_8E32 +ENCODING 36402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +97E0 +F480 +25E0 +A520 +BDE0 +A520 +A5E0 +BD20 +E9E0 +ENDCHAR +STARTCHAR U_8E33 +ENCODING 36403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2200 +AFE0 +B440 +AC60 +A7C0 +BC40 +C7C0 +ENDCHAR +STARTCHAR U_8E34 +ENCODING 36404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9140 +97E0 +94A0 +F7E0 +24A0 +BFE0 +A100 +A7E0 +BA20 +E4C0 +ENDCHAR +STARTCHAR U_8E35 +ENCODING 36405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +9540 +F7C0 +2540 +BFC0 +A100 +A7C0 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8E36 +ENCODING 36406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2000 +BFE0 +A500 +A5E0 +BB00 +E1E0 +ENDCHAR +STARTCHAR U_8E37 +ENCODING 36407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +97E0 +9140 +FFE0 +2100 +BBC0 +A640 +ABC0 +A240 +BA40 +C3C0 +ENDCHAR +STARTCHAR U_8E38 +ENCODING 36408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97E0 +9240 +93C0 +F240 +23C0 +BA40 +A7E0 +A540 +BE20 +E7E0 +ENDCHAR +STARTCHAR U_8E39 +ENCODING 36409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9520 +97E0 +9000 +FFE0 +2100 +BFE0 +AAA0 +AAA0 +BAA0 +C820 +ENDCHAR +STARTCHAR U_8E3A +ENCODING 36410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +93E0 +92A0 +95E0 +FEA0 +23E0 +B280 +ABE0 +A480 +BA80 +C1E0 +ENDCHAR +STARTCHAR U_8E3B +ENCODING 36411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +9740 +F540 +2FE0 +A820 +BBA0 +AAA0 +ABA0 +B820 +E860 +ENDCHAR +STARTCHAR U_8E3C +ENCODING 36412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7E0 +2200 +BFE0 +AAA0 +A2A0 +B520 +CAC0 +ENDCHAR +STARTCHAR U_8E3D +ENCODING 36413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +97C0 +9540 +F7C0 +2100 +BFE0 +A520 +A560 +BFA0 +E460 +ENDCHAR +STARTCHAR U_8E3E +ENCODING 36414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9000 +93C0 +9240 +F3C0 +2000 +BFE0 +A520 +A7E0 +BD20 +E7E0 +ENDCHAR +STARTCHAR U_8E3F +ENCODING 36415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9C40 +9540 +FF60 +2540 +A440 +BE40 +A540 +A4A0 +B520 +C620 +ENDCHAR +STARTCHAR U_8E40 +ENCODING 36416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9540 +F5C0 +2400 +A7E0 +B100 +AFE0 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E41 +ENCODING 36417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +9FE0 +9820 +FFE0 +2800 +AFE0 +BAA0 +AFE0 +AAA0 +BAA0 +C860 +ENDCHAR +STARTCHAR U_8E42 +ENCODING 36418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9280 +9FE0 +F2A0 +2D80 +A100 +BFE0 +A100 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E43 +ENCODING 36419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +F100 +2FE0 +A200 +B7C0 +AA40 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_8E44 +ENCODING 36420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +FFE0 +2920 +A7C0 +B540 +A540 +A540 +BDC0 +C100 +ENDCHAR +STARTCHAR U_8E45 +ENCODING 36421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9380 +F540 +2FE0 +A440 +B7C0 +A440 +A7C0 +B000 +CFE0 +ENDCHAR +STARTCHAR U_8E46 +ENCODING 36422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +9520 +95E0 +FD20 +25E0 +A540 +B560 +A540 +A5A0 +BA00 +E9E0 +ENDCHAR +STARTCHAR U_8E47 +ENCODING 36423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +3140 +DF20 +2480 +3500 +CFE0 +ENDCHAR +STARTCHAR U_8E48 +ENCODING 36424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9520 +9040 +F6E0 +2420 +BC20 +A6E0 +A420 +BFE0 +E420 +ENDCHAR +STARTCHAR U_8E49 +ENCODING 36425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +9140 +97E0 +F080 +23E0 +A080 +BFE0 +A200 +A7C0 +B880 +C7E0 +ENDCHAR +STARTCHAR U_8E4A +ENCODING 36426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +9FA0 +9940 +F500 +22C0 +A520 +BFE0 +A100 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E4B +ENCODING 36427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2000 +BFE0 +AAA0 +A660 +BAA0 +E660 +ENDCHAR +STARTCHAR U_8E4C +ENCODING 36428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9920 +F7C0 +2440 +A7C0 +BC40 +A7E0 +AA20 +BBE0 +C220 +ENDCHAR +STARTCHAR U_8E4D +ENCODING 36429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F540 +27E0 +A540 +BFE0 +A540 +A560 +BDC0 +C920 +ENDCHAR +STARTCHAR U_8E4E +ENCODING 36430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2440 +A740 +B5C0 +A440 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E4F +ENCODING 36431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9500 +97E0 +F520 +27C0 +3500 +A5E0 +A400 +B5C0 +E940 +1260 +ENDCHAR +STARTCHAR U_8E50 +ENCODING 36432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9380 +9540 +FAA0 +2440 +AFE0 +B440 +A7C0 +A440 +B7C0 +C440 +ENDCHAR +STARTCHAR U_8E51 +ENCODING 36433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9240 +93C0 +F240 +27E0 +A040 +BFE0 +A5A0 +A240 +BDA0 +C520 +ENDCHAR +STARTCHAR U_8E52 +ENCODING 36434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +9FE0 +F280 +2FE0 +BAA0 +ABA0 +ACE0 +B920 +C8E0 +ENDCHAR +STARTCHAR U_8E53 +ENCODING 36435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6E0 +94A0 +96A0 +95A0 +F6A0 +2540 +B7E0 +A520 +A7E0 +B520 +C7E0 +ENDCHAR +STARTCHAR U_8E54 +ENCODING 36436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +FFC0 +1080 +1F80 +13E0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8E55 +ENCODING 36437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +9FE0 +9920 +FFE0 +2540 +BFE0 +A540 +BFE0 +C100 +0100 +ENDCHAR +STARTCHAR U_8E56 +ENCODING 36438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +97C0 +F200 +2FE0 +A440 +BEE0 +A440 +A6C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_8E57 +ENCODING 36439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9A80 +FFE0 +2AA0 +AFE0 +BAA0 +ABC0 +AA80 +BBA0 +CAE0 +ENDCHAR +STARTCHAR U_8E58 +ENCODING 36440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +A660 +EAA0 +2300 +3480 +AA60 +A540 +B280 +E100 +8E00 +ENDCHAR +STARTCHAR U_8E59 +ENCODING 36441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +9100 +FF40 +94A0 +BFA0 +A0E0 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8E5A +ENCODING 36442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +9820 +FFC0 +2440 +A7C0 +B900 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8E5B +ENCODING 36443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +FFE0 +2000 +2FE0 +B920 +A7C0 +B540 +C5C0 +0100 +ENDCHAR +STARTCHAR U_8E5C +ENCODING 36444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9820 +97E0 +F480 +25E0 +BD20 +A5E0 +A520 +BDE0 +E520 +ENDCHAR +STARTCHAR U_8E5D +ENCODING 36445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9A80 +92E0 +F680 +2BE0 +A880 +BAE0 +AA80 +AA80 +BD80 +C8E0 +ENDCHAR +STARTCHAR U_8E5E +ENCODING 36446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9480 +95E0 +F720 +25E0 +BD20 +A5E0 +A720 +B5E0 +C140 +0220 +ENDCHAR +STARTCHAR U_8E5F +ENCODING 36447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2100 +B7E0 +A440 +A7C0 +B440 +C7C0 +0820 +ENDCHAR +STARTCHAR U_8E60 +ENCODING 36448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +9400 +F540 +27E0 +A540 +BDC0 +A400 +AD40 +BAA0 +CAA0 +ENDCHAR +STARTCHAR U_8E61 +ENCODING 36449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2E0 +92A0 +9360 +FEA0 +2240 +BEA0 +ABE0 +AAA0 +BA60 +CA20 +1260 +ENDCHAR +STARTCHAR U_8E62 +ENCODING 36450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +FFE0 +2920 +AFE0 +B920 +ABA0 +AAA0 +BBA0 +C860 +ENDCHAR +STARTCHAR U_8E63 +ENCODING 36451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +9240 +F3C0 +2100 +AFE0 +B920 +ADA0 +AB60 +BDA0 +C960 +ENDCHAR +STARTCHAR U_8E64 +ENCODING 36452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9940 +96A0 +FA80 +2880 +AA80 +BAE0 +AA80 +AA80 +BD80 +C8E0 +ENDCHAR +STARTCHAR U_8E65 +ENCODING 36453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9BE0 +9480 +F3E0 +2AA0 +ABE0 +BAA0 +AFE0 +B880 +CC80 +13E0 +ENDCHAR +STARTCHAR U_8E66 +ENCODING 36454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A920 +AFE0 +E000 +2EE0 +AAA0 +BEE0 +AAA0 +AEE0 +BAA0 +C760 +ENDCHAR +STARTCHAR U_8E67 +ENCODING 36455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9AA0 +FFE0 +2AA0 +AFE0 +BC40 +A7C0 +A440 +BFC0 +C440 +ENDCHAR +STARTCHAR U_8E68 +ENCODING 36456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +FE80 +8BE0 +F680 +2A80 +A540 +B540 +AA20 +A000 +BAA0 +CAA0 +ENDCHAR +STARTCHAR U_8E69 +ENCODING 36457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBE0 +AE40 +F980 +BFE0 +2080 +3F80 +0400 +2780 +3400 +CFE0 +ENDCHAR +STARTCHAR U_8E6A +ENCODING 36458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9540 +FFE0 +2440 +A7C0 +B440 +A7C0 +B440 +C7C0 +0820 +ENDCHAR +STARTCHAR U_8E6B +ENCODING 36459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9280 +9FE0 +F340 +2500 +AFE0 +BAA0 +AFE0 +AAA0 +BBA0 +C860 +ENDCHAR +STARTCHAR U_8E6C +ENCODING 36460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F740 +95A0 +9240 +F7A0 +2800 +A7C0 +BC40 +A7C0 +A440 +B280 +CFE0 +ENDCHAR +STARTCHAR U_8E6D +ENCODING 36461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +9AA0 +F920 +2FE0 +A000 +B7C0 +A440 +B7C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_8E6E +ENCODING 36462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +9FE0 +FAA0 +2FE0 +2100 +BFE0 +A440 +BFA0 +C440 +07C0 +ENDCHAR +STARTCHAR U_8E6F +ENCODING 36463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9540 +FFE0 +2540 +A920 +BFE0 +A520 +A7E0 +B520 +C7E0 +ENDCHAR +STARTCHAR U_8E70 +ENCODING 36464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9800 +9F40 +F840 +2FE0 +AD40 +BFC0 +AD40 +AA40 +BA40 +C7C0 +ENDCHAR +STARTCHAR U_8E71 +ENCODING 36465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +F280 +2FE0 +2540 +B7C0 +A540 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8E72 +ENCODING 36466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A280 +EFE0 +2AA0 +ABE0 +BFE0 +A080 +AFE0 +B480 +C380 +ENDCHAR +STARTCHAR U_8E73 +ENCODING 36467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +95A0 +9240 +FDE0 +2540 +AE60 +B9C0 +AF40 +A280 +B340 +CC20 +ENDCHAR +STARTCHAR U_8E74 +ENCODING 36468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9F60 +9040 +FFE0 +2940 +AF40 +BA40 +A740 +AAC0 +B340 +C660 +ENDCHAR +STARTCHAR U_8E75 +ENCODING 36469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FEA0 +45E0 +7C80 +5540 +B260 +1F80 +1080 +1FC0 +1200 +6FE0 +ENDCHAR +STARTCHAR U_8E76 +ENCODING 36470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +96C0 +9540 +F7E0 +2520 +A540 +BFC0 +A940 +A940 +BAA0 +C520 +ENDCHAR +STARTCHAR U_8E77 +ENCODING 36471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A80 +7EE0 +5540 +5C40 +4FA0 +4880 +4F80 +43C0 +8A00 +B7E0 +ENDCHAR +STARTCHAR U_8E78 +ENCODING 36472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F540 +2920 +A440 +B7E0 +AD40 +A3E0 +B240 +CC40 +ENDCHAR +STARTCHAR U_8E79 +ENCODING 36473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +8C40 +FBA0 +2000 +B7C0 +A440 +A7E0 +BAA0 +E660 +0AA0 +ENDCHAR +STARTCHAR U_8E7A +ENCODING 36474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +2440 +AEE0 +B440 +AFE0 +A280 +B4A0 +C8E0 +ENDCHAR +STARTCHAR U_8E7B +ENCODING 36475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +F440 +2BA0 +A280 +BFE0 +AAA0 +ABA0 +B820 +C860 +ENDCHAR +STARTCHAR U_8E7C +ENCODING 36476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +96C0 +9FE0 +F280 +2FE0 +A100 +B7C0 +A100 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E7D +ENCODING 36477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +F280 +27C0 +AC60 +B7C0 +A440 +B7C0 +C540 +0B20 +ENDCHAR +STARTCHAR U_8E7E +ENCODING 36478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AA80 +AEE0 +E140 +2F40 +B540 +AE80 +B480 +C540 +8E20 +ENDCHAR +STARTCHAR U_8E7F +ENCODING 36479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9AA0 +F540 +2FE0 +A540 +BFE0 +A920 +AFE0 +B920 +C100 +ENDCHAR +STARTCHAR U_8E80 +ENCODING 36480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +9FE0 +F540 +27C0 +2440 +B7C0 +A440 +A7C0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E81 +ENCODING 36481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +FEE0 +2AA0 +AEE0 +B100 +AFE0 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E82 +ENCODING 36482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +95E0 +9080 +F3E0 +2D40 +A7E0 +BC80 +A7E0 +A480 +BA80 +D1E0 +ENDCHAR +STARTCHAR U_8E83 +ENCODING 36483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +97E0 +95A0 +F540 +27E0 +BC40 +A740 +A5E0 +BD40 +CF40 +1540 +ENDCHAR +STARTCHAR U_8E84 +ENCODING 36484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4540 +7FE0 +6880 +BFE0 +1040 +1FC0 +1200 +13E0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8E85 +ENCODING 36485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9540 +9FC0 +F400 +2FE0 +AA20 +BFA0 +AAA0 +AFA0 +B2A0 +CF40 +ENDCHAR +STARTCHAR U_8E86 +ENCODING 36486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +9FE0 +F920 +2FE0 +AA00 +BD60 +AA80 +A9C0 +BEA0 +C920 +ENDCHAR +STARTCHAR U_8E87 +ENCODING 36487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +9540 +FFA0 +2140 +AFE0 +B180 +A240 +AFC0 +B240 +C3C0 +ENDCHAR +STARTCHAR U_8E88 +ENCODING 36488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AE80 +AAE0 +EFA0 +2AA0 +BEA0 +A4A0 +BFA0 +AA40 +AAC0 +D520 +ENDCHAR +STARTCHAR U_8E89 +ENCODING 36489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2480 +FFE0 +A4A0 +BFA0 +A0A0 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8E8A +ENCODING 36490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +FFE0 +2120 +AFC0 +B040 +AFE0 +AB40 +BEC0 +C0C0 +ENDCHAR +STARTCHAR U_8E8B +ENCODING 36491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +92A0 +FD40 +25A0 +A520 +BFC0 +A440 +A7C0 +B440 +C840 +ENDCHAR +STARTCHAR U_8E8C +ENCODING 36492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9AA0 +F7E0 +22A0 +A7E0 +B440 +AFE0 +A540 +BBE0 +C440 +ENDCHAR +STARTCHAR U_8E8D +ENCODING 36493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9AA0 +9660 +FAA0 +27E0 +AC80 +B7E0 +A480 +A7E0 +BC80 +C7E0 +ENDCHAR +STARTCHAR U_8E8E +ENCODING 36494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A540 +A920 +EFE0 +2920 +ADA0 +BB60 +ADA0 +AB60 +BDA0 +C960 +ENDCHAR +STARTCHAR U_8E8F +ENCODING 36495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +9240 +F9E0 +24A0 +AAA0 +BFE0 +AAA0 +ABE0 +BAA0 +CBE0 +ENDCHAR +STARTCHAR U_8E90 +ENCODING 36496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +9540 +92A0 +FFE0 +2AA0 +AFE0 +BDA0 +AB60 +ADA0 +BB60 +CDA0 +ENDCHAR +STARTCHAR U_8E91 +ENCODING 36497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +BFA0 +A4A0 +EFA0 +2AC0 +ADA0 +BAA0 +AFA0 +A2E0 +B680 +C980 +ENDCHAR +STARTCHAR U_8E92 +ENCODING 36498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9BC0 +96A0 +FBA0 +2AC0 +AFE0 +B100 +AFE0 +A380 +BD40 +C920 +ENDCHAR +STARTCHAR U_8E93 +ENCODING 36499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +A880 +AFE0 +EAA0 +2AA0 +A7C0 +BC40 +A7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_8E94 +ENCODING 36500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9AA0 +FBE0 +2AA0 +AFE0 +B940 +AAA0 +AFE0 +B880 +DFE0 +ENDCHAR +STARTCHAR U_8E95 +ENCODING 36501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA20 +EF20 +2AE0 +AF20 +B9A0 +AF60 +BD20 +CA20 +1760 +ENDCHAR +STARTCHAR U_8E96 +ENCODING 36502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB60 +94A0 +9B60 +F4A0 +2FE0 +A4A0 +BB60 +A4A0 +AB60 +B4A0 +CFE0 +ENDCHAR +STARTCHAR U_8E97 +ENCODING 36503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +8A00 +7FE0 +D440 +5F40 +44C0 +3F80 +2080 +3F80 +3400 +CFE0 +ENDCHAR +STARTCHAR U_8E98 +ENCODING 36504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +FF20 +2AE0 +AE80 +BAE0 +AE80 +AAE0 +BAA0 +CEE0 +ENDCHAR +STARTCHAR U_8E99 +ENCODING 36505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +EAA0 +2EE0 +B920 +AFE0 +AAA0 +BBE0 +CAA0 +0BE0 +ENDCHAR +STARTCHAR U_8E9A +ENCODING 36506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A940 +A7E0 +E560 +3FE0 +A940 +BFE0 +AA40 +AA20 +A9E0 +D7E0 +ENDCHAR +STARTCHAR U_8E9B +ENCODING 36507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5E00 +AAE0 +7F40 +D540 +44C0 +3F80 +2080 +3F80 +2400 +DFE0 +ENDCHAR +STARTCHAR U_8E9C +ENCODING 36508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +9FE0 +9240 +FFE0 +2540 +AFE0 +B440 +A540 +A540 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E9D +ENCODING 36509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2FE0 +A920 +BFE0 +AAA0 +AFE0 +BBA0 +CD60 +ENDCHAR +STARTCHAR U_8E9E +ENCODING 36510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +97C0 +9C60 +F7C0 +2440 +ABA0 +B280 +AFE0 +A240 +B980 +C660 +ENDCHAR +STARTCHAR U_8E9F +ENCODING 36511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AAA0 +EEE0 +2280 +AFE0 +B280 +AFE0 +A4A0 +BD40 +C620 +ENDCHAR +STARTCHAR U_8EA0 +ENCODING 36512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2900 +7BE0 +4940 +7FE0 +4880 +7F80 +2480 +3FC0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8EA1 +ENCODING 36513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9240 +93C0 +F240 +27E0 +A040 +BFE0 +A540 +A7C0 +B540 +CFE0 +ENDCHAR +STARTCHAR U_8EA2 +ENCODING 36514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +9EE0 +FBA0 +2EE0 +BBA0 +A820 +AEE0 +BAA0 +EE60 +0AA0 +ENDCHAR +STARTCHAR U_8EA3 +ENCODING 36515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2EE0 +A480 +BFE0 +A480 +A7E0 +BC80 +C7E0 +ENDCHAR +STARTCHAR U_8EA4 +ENCODING 36516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +92A0 +FFE0 +24A0 +BFE0 +A400 +BFE0 +A4A0 +AEA0 +D5E0 +ENDCHAR +STARTCHAR U_8EA5 +ENCODING 36517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AEC0 +E840 +2EC0 +A840 +BFC0 +AD40 +ABC0 +BD40 +CFA0 +ENDCHAR +STARTCHAR U_8EA6 +ENCODING 36518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9540 +FFE0 +2540 +AFE0 +B440 +A7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_8EA7 +ENCODING 36519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06E0 +F000 +96E0 +F4A0 +2100 +BFE0 +AAA0 +AFE0 +BA80 +EAA0 +13E0 +ENDCHAR +STARTCHAR U_8EA8 +ENCODING 36520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +ABE0 +EEA0 +2B80 +AEE0 +B240 +A7A0 +AA80 +B380 +CC60 +ENDCHAR +STARTCHAR U_8EA9 +ENCODING 36521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2FE0 +A7C0 +BC80 +A7E0 +A440 +B380 +CC60 +ENDCHAR +STARTCHAR U_8EAA +ENCODING 36522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EEE0 +2AA0 +AEE0 +BAA0 +AFE0 +AAA0 +BBE0 +CA60 +ENDCHAR +STARTCHAR U_8EAB +ENCODING 36523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +3F00 +2100 +3F00 +2140 +3F80 +2100 +FF00 +0900 +3500 +C200 +ENDCHAR +STARTCHAR U_8EAC +ENCODING 36524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7C20 +4420 +7DE0 +4500 +7D00 +45E0 +FC20 +1420 +2520 +DCC0 +ENDCHAR +STARTCHAR U_8EAD +ENCODING 36525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4FE0 +7D20 +4900 +7980 +4980 +FA80 +2A80 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_8EAE +ENCODING 36526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4A40 +7A40 +4C20 +7BC0 +4940 +F940 +2A40 +4A40 +9480 +ENDCHAR +STARTCHAR U_8EAF +ENCODING 36527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +9440 +F640 +9540 +F480 +9480 +F540 +3620 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8EB0 +ENCODING 36528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4FE0 +7900 +4B80 +7B80 +4D40 +FD40 +2BA0 +4900 +9900 +ENDCHAR +STARTCHAR U_8EB1 +ENCODING 36529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +4940 +7960 +4A20 +7880 +4BE0 +F880 +29C0 +4AA0 +9080 +ENDCHAR +STARTCHAR U_8EB2 +ENCODING 36530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4A40 +7C60 +4880 +7FE0 +4880 +F980 +2AC0 +4CA0 +9880 +ENDCHAR +STARTCHAR U_8EB3 +ENCODING 36531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BE0 +4A20 +7A20 +4BE0 +7800 +4BE0 +FA20 +2A20 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8EB4 +ENCODING 36532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4B20 +FAC0 +2A80 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8EB5 +ENCODING 36533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4940 +7D40 +4B40 +7C80 +4800 +F940 +2AA0 +4E40 +99C0 +ENDCHAR +STARTCHAR U_8EB6 +ENCODING 36534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +57C0 +7540 +57C0 +7100 +5FE0 +F380 +3540 +5920 +B100 +ENDCHAR +STARTCHAR U_8EB7 +ENCODING 36535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7900 +4FE0 +7B40 +4D20 +7900 +4FE0 +FA40 +2B80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8EB8 +ENCODING 36536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4900 +7A80 +4C40 +7FE0 +4840 +FF40 +2D40 +4F40 +98C0 +ENDCHAR +STARTCHAR U_8EB9 +ENCODING 36537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4C20 +7D60 +4BA0 +7FE0 +4BA0 +FD60 +2920 +49A0 +9840 +ENDCHAR +STARTCHAR U_8EBA +ENCODING 36538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +7540 +5100 +77E0 +5420 +77A0 +56A0 +F7A0 +3420 +5420 +B460 +ENDCHAR +STARTCHAR U_8EBB +ENCODING 36539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4C20 +7A80 +4C40 +7820 +4FC0 +F900 +2900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_8EBC +ENCODING 36540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A00 +7BC0 +4A00 +7FE0 +4B00 +FAA0 +2A40 +4B20 +9A00 +ENDCHAR +STARTCHAR U_8EBD +ENCODING 36541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +95E0 +F520 +95E0 +F480 +97E0 +F540 +3480 +5540 +B7E0 +ENDCHAR +STARTCHAR U_8EBE +ENCODING 36542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7FE0 +4900 +7BC0 +4900 +7FE0 +4900 +FFE0 +2980 +4A40 +9C20 +ENDCHAR +STARTCHAR U_8EBF +ENCODING 36543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5540 +77E0 +5540 +77C0 +5540 +F740 +5580 +9F60 +3100 +ENDCHAR +STARTCHAR U_8EC0 +ENCODING 36544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +95C0 +F540 +95C0 +F400 +97E0 +F6A0 +37E0 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8EC1 +ENCODING 36545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +5FE0 +7540 +57C0 +7540 +57C0 +F100 +5FE0 +9280 +2D60 +ENDCHAR +STARTCHAR U_8EC2 +ENCODING 36546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +EBE0 +B240 +E5A0 +AFE0 +E820 +A100 +E7C0 +2240 +6440 +A980 +ENDCHAR +STARTCHAR U_8EC3 +ENCODING 36547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +7AA0 +5EE0 +7000 +57C0 +7540 +57C0 +F540 +5FE0 +9100 +3100 +ENDCHAR +STARTCHAR U_8EC4 +ENCODING 36548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7EC0 +5AA0 +7FE0 +5080 +7EA0 +5AA0 +FEC0 +3AA0 +5F60 +B220 +ENDCHAR +STARTCHAR U_8EC5 +ENCODING 36549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +EFE0 +AD40 +ED40 +AFE0 +ED40 +ADE0 +ED40 +6DE0 +AD40 +75E0 +ENDCHAR +STARTCHAR U_8EC6 +ENCODING 36550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5AA0 +7FE0 +5AA0 +7FE0 +5240 +F3C0 +3240 +5180 +B7E0 +ENDCHAR +STARTCHAR U_8EC7 +ENCODING 36551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5100 +7FE0 +5120 +77E0 +5040 +FFE0 +3540 +5740 +B0C0 +ENDCHAR +STARTCHAR U_8EC8 +ENCODING 36552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +A940 +EDE0 +AF40 +EDE0 +AD40 +EDE0 +6940 +B660 +69C0 +ENDCHAR +STARTCHAR U_8EC9 +ENCODING 36553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +B520 +EFE0 +A540 +EFE0 +A440 +E7C0 +6440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_8ECA +ENCODING 36554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8ECB +ENCODING 36555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +1100 +7D00 +5500 +7D00 +5500 +7D00 +1120 +FF20 +10E0 +ENDCHAR +STARTCHAR U_8ECC +ENCODING 36556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +2780 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_8ECD +ENCODING 36557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8ECE +ENCODING 36558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_8ECF +ENCODING 36559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2280 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_8ED0 +ENCODING 36560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FF80 +2280 +FA80 +AA80 +FF80 +AA80 +FA80 +22A0 +FA60 +2220 +ENDCHAR +STARTCHAR U_8ED1 +ENCODING 36561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2100 +FFE0 +A900 +F900 +A900 +FA80 +2280 +F440 +2820 +ENDCHAR +STARTCHAR U_8ED2 +ENCODING 36562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +2080 +F880 +A880 +FBE0 +A880 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_8ED3 +ENCODING 36563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA40 +AB40 +FAC0 +AA40 +FA40 +2240 +FC40 +2860 +ENDCHAR +STARTCHAR U_8ED4 +ENCODING 36564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +20A0 +F8A0 +AAA0 +FAA0 +ACA0 +F8A0 +2120 +FA20 +24C0 +ENDCHAR +STARTCHAR U_8ED5 +ENCODING 36565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +2080 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +22A0 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8ED6 +ENCODING 36566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +A900 +FBC0 +A900 +F900 +2100 +FFE0 +2000 +ENDCHAR +STARTCHAR U_8ED7 +ENCODING 36567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +AC00 +FFC0 +AA40 +FA40 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_8ED8 +ENCODING 36568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +20A0 +F8A0 +2060 +ENDCHAR +STARTCHAR U_8ED9 +ENCODING 36569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +2080 +F880 +AFE0 +FA20 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_8EDA +ENCODING 36570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27E0 +F900 +A900 +F900 +AA80 +FA80 +2640 +F540 +2920 +ENDCHAR +STARTCHAR U_8EDB +ENCODING 36571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FAE0 +AAA0 +FAA0 +AAE0 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8EDC +ENCODING 36572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +AB60 +FA20 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_8EDD +ENCODING 36573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2280 +FA80 +ABE0 +FA80 +AA80 +FA80 +22A0 +FB60 +2220 +ENDCHAR +STARTCHAR U_8EDE +ENCODING 36574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2100 +F900 +AFE0 +F900 +A900 +FFE0 +2100 +F920 +20E0 +ENDCHAR +STARTCHAR U_8EDF +ENCODING 36575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FD20 +A940 +F900 +A900 +F980 +2280 +FA40 +2420 +ENDCHAR +STARTCHAR U_8EE0 +ENCODING 36576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2080 +F880 +A880 +FFE0 +A880 +F880 +2080 +F880 +23E0 +ENDCHAR +STARTCHAR U_8EE1 +ENCODING 36577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2280 +FC40 +A920 +F880 +AFE0 +F840 +2080 +F880 +2100 +ENDCHAR +STARTCHAR U_8EE2 +ENCODING 36578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2000 +F800 +AFE0 +F900 +AA00 +FA40 +2420 +FFE0 +2020 +ENDCHAR +STARTCHAR U_8EE3 +ENCODING 36579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +FFE0 +2480 +1100 +60C0 +ENDCHAR +STARTCHAR U_8EE4 +ENCODING 36580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2080 +FAA0 +A9C0 +F880 +AFE0 +F880 +2080 +F880 +2180 +ENDCHAR +STARTCHAR U_8EE5 +ENCODING 36581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FC20 +ABA0 +FAA0 +AAA0 +FBA0 +22A0 +F820 +20C0 +ENDCHAR +STARTCHAR U_8EE6 +ENCODING 36582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +2440 +FC40 +AC40 +FFC0 +AA80 +FA80 +22A0 +FCA0 +28E0 +ENDCHAR +STARTCHAR U_8EE7 +ENCODING 36583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FBC0 +2280 +FA80 +ABE0 +FA80 +AA80 +FA80 +22A0 +FB60 +22A0 +ENDCHAR +STARTCHAR U_8EE8 +ENCODING 36584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F980 +2240 +FC20 +A900 +F880 +AFE0 +F840 +2180 +F880 +2040 +ENDCHAR +STARTCHAR U_8EE9 +ENCODING 36585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2240 +FA20 +AFE0 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EEA +ENCODING 36586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +2480 +FFE0 +AAA0 +FAA0 +ADA0 +FFA0 +2120 +FAA0 +2440 +ENDCHAR +STARTCHAR U_8EEB +ENCODING 36587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FC80 +A900 +FA40 +AC80 +F920 +2240 +F880 +2300 +ENDCHAR +STARTCHAR U_8EEC +ENCODING 36588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +0400 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8EED +ENCODING 36589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2400 +FFC0 +AC80 +FDC0 +AC80 +FC80 +27E0 +FC00 +27E0 +ENDCHAR +STARTCHAR U_8EEE +ENCODING 36590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +AFE0 +F880 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_8EEF +ENCODING 36591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +24A0 +FAA0 +AAC0 +F880 +AFE0 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_8EF0 +ENCODING 36592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +7B80 +0A20 +79E0 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8EF1 +ENCODING 36593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +2540 +FD40 +AD40 +FD40 +AD40 +FD40 +2520 +FDE0 +2940 +ENDCHAR +STARTCHAR U_8EF2 +ENCODING 36594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +AA20 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EF3 +ENCODING 36595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2420 +FBA0 +AAA0 +FBA0 +AAA0 +FA40 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_8EF4 +ENCODING 36596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +F880 +A880 +F880 +ABE0 +F880 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8EF5 +ENCODING 36597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F940 +2240 +FFE0 +AA40 +FB40 +AAC0 +FA40 +2240 +FA40 +22C0 +ENDCHAR +STARTCHAR U_8EF6 +ENCODING 36598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +FBE0 +AA00 +FBE0 +AA40 +FA80 +22A0 +FD20 +25E0 +ENDCHAR +STARTCHAR U_8EF7 +ENCODING 36599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +27E0 +F900 +A900 +F9E0 +A920 +FAA0 +2240 +FCA0 +2320 +ENDCHAR +STARTCHAR U_8EF8 +ENCODING 36600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +ABE0 +FAA0 +22A0 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EF9 +ENCODING 36601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2220 +FA20 +AA20 +FBE0 +A800 +F940 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_8EFA +ENCODING 36602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2120 +F920 +AAE0 +FC40 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EFB +ENCODING 36603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC20 +2020 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +2020 +FC20 +2060 +ENDCHAR +STARTCHAR U_8EFC +ENCODING 36604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FA80 +2280 +FBE0 +AC80 +F880 +AFE0 +F880 +2080 +F940 +2620 +ENDCHAR +STARTCHAR U_8EFD +ENCODING 36605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +2240 +F980 +AA80 +FD60 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_8EFE +ENCODING 36606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +27E0 +F880 +AF80 +FA80 +AA80 +FAA0 +23A0 +FE60 +2020 +ENDCHAR +STARTCHAR U_8EFF +ENCODING 36607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +27E0 +F940 +A940 +F940 +AFE0 +F940 +2140 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F00 +ENCODING 36608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FA00 +AFE0 +FAA0 +AAA0 +FAA0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F01 +ENCODING 36609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FA40 +27E0 +FA40 +AA40 +FA40 +AFE0 +F800 +2240 +FC20 +2420 +ENDCHAR +STARTCHAR U_8F02 +ENCODING 36610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +2480 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F03 +ENCODING 36611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +FA40 +AC20 +FA40 +AA40 +F980 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_8F04 +ENCODING 36612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F920 +2540 +FB80 +A900 +FFE0 +AA80 +FA80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_8F05 +ENCODING 36613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2140 +FA80 +A940 +FA20 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F06 +ENCODING 36614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +F920 +AB40 +F880 +A920 +FA40 +2080 +FD40 +2220 +ENDCHAR +STARTCHAR U_8F07 +ENCODING 36615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +F820 +AFC0 +F900 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_8F08 +ENCODING 36616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2220 +FB20 +AAA0 +FFE0 +AA20 +FB20 +22A0 +FC20 +20E0 +ENDCHAR +STARTCHAR U_8F09 +ENCODING 36617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +7D40 +1100 +FFE0 +1100 +FF20 +5540 +7C80 +54A0 +FF60 +1220 +ENDCHAR +STARTCHAR U_8F0A +ENCODING 36618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FA40 +AFA0 +F820 +A880 +FBE0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8F0B +ENCODING 36619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +FFE0 +4440 +BFA0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F0C +ENCODING 36620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FFE0 +A920 +FD60 +AD60 +FFE0 +2820 +F8A0 +2840 +ENDCHAR +STARTCHAR U_8F0D +ENCODING 36621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FA20 +2080 +F940 +AA20 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F0E +ENCODING 36622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +FAC0 +2080 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_8F0F +ENCODING 36623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2180 +FFE0 +ADA0 +FDA0 +AEE0 +FC20 +27E0 +FC20 +27E0 +ENDCHAR +STARTCHAR U_8F10 +ENCODING 36624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FBC0 +A800 +FFE0 +AA80 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F11 +ENCODING 36625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F940 +27E0 +F940 +AFC0 +F940 +AA00 +FFE0 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F12 +ENCODING 36626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FD40 +2540 +FF40 +AD40 +FF40 +AD40 +FD40 +27C0 +F940 +2160 +ENDCHAR +STARTCHAR U_8F13 +ENCODING 36627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +2240 +FFE0 +AAA0 +FAA0 +ABE0 +F880 +21A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F14 +ENCODING 36628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +23E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +23E0 +FAA0 +22E0 +ENDCHAR +STARTCHAR U_8F15 +ENCODING 36629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F800 +22A0 +FD40 +AD40 +FAA0 +A800 +FBC0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8F16 +ENCODING 36630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FD20 +27A0 +FD20 +AFE0 +FC20 +AFA0 +FEA0 +27A0 +FC20 +2460 +ENDCHAR +STARTCHAR U_8F17 +ENCODING 36631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FEE0 +2420 +FEE0 +AC20 +FC20 +AFE0 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F18 +ENCODING 36632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +A940 +FA20 +ADC0 +FB40 +2480 +F940 +2620 +ENDCHAR +STARTCHAR U_8F19 +ENCODING 36633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FF80 +2500 +FDE0 +A720 +FDA0 +A740 +FD40 +27A0 +F920 +2100 +ENDCHAR +STARTCHAR U_8F1A +ENCODING 36634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA40 +27E0 +F940 +A9A0 +FE60 +AA80 +FFE0 +2280 +F9A0 +2660 +ENDCHAR +STARTCHAR U_8F1B +ENCODING 36635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +2100 +FFE0 +A920 +FDA0 +AB60 +FDA0 +2920 +F920 +2960 +ENDCHAR +STARTCHAR U_8F1C +ENCODING 36636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +2540 +FAA0 +AAA0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F1D +ENCODING 36637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ACA0 +73C0 +2080 +FBE0 +52A0 +53E0 +52A0 +57E0 +5880 +9080 +ENDCHAR +STARTCHAR U_8F1E +ENCODING 36638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +26A0 +FFE0 +AD20 +FFE0 +AD20 +FD20 +25E0 +FC20 +2460 +ENDCHAR +STARTCHAR U_8F1F +ENCODING 36639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +23C0 +FAA0 +AD00 +FFE0 +A920 +FDA0 +2240 +FAA0 +25A0 +ENDCHAR +STARTCHAR U_8F20 +ENCODING 36640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +23E0 +FAA0 +ABE0 +F880 +AFE0 +F880 +21C0 +FAA0 +2480 +ENDCHAR +STARTCHAR U_8F21 +ENCODING 36641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2120 +FA40 +A900 +FAE0 +AA20 +FB60 +2220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_8F22 +ENCODING 36642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2100 +FA80 +AFE0 +F840 +AF40 +FD40 +2740 +F840 +20C0 +ENDCHAR +STARTCHAR U_8F23 +ENCODING 36643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +FAA0 +2AA0 +FEE0 +AAA0 +FAA0 +AEE0 +FAA0 +2AA0 +FAA0 +2B60 +ENDCHAR +STARTCHAR U_8F24 +ENCODING 36644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +A880 +FFE0 +AA20 +FBE0 +2220 +FBE0 +2260 +ENDCHAR +STARTCHAR U_8F25 +ENCODING 36645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +23E0 +FA20 +ABE0 +FA80 +AAA0 +FBC0 +22A0 +FBA0 +22E0 +ENDCHAR +STARTCHAR U_8F26 +ENCODING 36646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +5540 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F27 +ENCODING 36647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +FA40 +27E0 +FA40 +AA40 +FFE0 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F28 +ENCODING 36648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FBC0 +AA40 +FBC0 +AA00 +FBC0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_8F29 +ENCODING 36649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +F1E0 +1500 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F2A +ENCODING 36650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +FBA0 +A800 +FFE0 +AAA0 +FFE0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F2B +ENCODING 36651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +2EE0 +FA80 +AEE0 +FA80 +AA80 +FEE0 +2280 +FA80 +2280 +ENDCHAR +STARTCHAR U_8F2C +ENCODING 36652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2000 +FBE0 +AA20 +FA20 +ABE0 +F880 +22C0 +FAA0 +25A0 +ENDCHAR +STARTCHAR U_8F2D +ENCODING 36653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F900 +27E0 +FAA0 +AAA0 +FAA0 +A900 +FFE0 +2280 +FC60 +2840 +ENDCHAR +STARTCHAR U_8F2E +ENCODING 36654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +AFC0 +F800 +AFE0 +FAA0 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F2F +ENCODING 36655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +F800 +AFE0 +FA40 +ABC0 +FA40 +22E0 +FF40 +2040 +ENDCHAR +STARTCHAR U_8F30 +ENCODING 36656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +AFE0 +FA00 +AFE0 +FAA0 +2520 +FAA0 +2440 +ENDCHAR +STARTCHAR U_8F31 +ENCODING 36657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +27E0 +FC80 +AFA0 +FCA0 +AFA0 +FD40 +2760 +F4A0 +2920 +ENDCHAR +STARTCHAR U_8F32 +ENCODING 36658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FD40 +27C0 +F800 +AFE0 +F900 +AFE0 +FAA0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F33 +ENCODING 36659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +27C0 +F900 +AFE0 +FA40 +AFA0 +F900 +27C0 +FA80 +2460 +ENDCHAR +STARTCHAR U_8F34 +ENCODING 36660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC80 +27E0 +FC80 +ADE0 +FD20 +ADE0 +FD20 +25E0 +FD20 +21E0 +ENDCHAR +STARTCHAR U_8F35 +ENCODING 36661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +AFC0 +FA00 +ABE0 +FCA0 +2560 +FFA0 +20C0 +ENDCHAR +STARTCHAR U_8F36 +ENCODING 36662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FA80 +27E0 +FA80 +AFE0 +FAA0 +ACE0 +F820 +2FE0 +F820 +2FE0 +ENDCHAR +STARTCHAR U_8F37 +ENCODING 36663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2520 +FFE0 +A820 +FBA0 +A820 +FBA0 +22A0 +FBA0 +2040 +ENDCHAR +STARTCHAR U_8F38 +ENCODING 36664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2460 +FB80 +AE20 +FAA0 +AEA0 +FAA0 +2EA0 +FA20 +2A60 +ENDCHAR +STARTCHAR U_8F39 +ENCODING 36665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2640 +FBC0 +AA40 +FBC0 +A900 +FBE0 +2640 +F980 +2660 +ENDCHAR +STARTCHAR U_8F3A +ENCODING 36666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +2540 +FFE0 +AD40 +FAA0 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F3B +ENCODING 36667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +21C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F3C +ENCODING 36668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +ABC0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F3D +ENCODING 36669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFC0 +2100 +FFE0 +AA80 +FC40 +AFE0 +FD40 +27C0 +FD40 +27C0 +ENDCHAR +STARTCHAR U_8F3E +ENCODING 36670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +27E0 +FD40 +AFE0 +FD40 +AFE0 +FD00 +25A0 +FD40 +25A0 +ENDCHAR +STARTCHAR U_8F3F +ENCODING 36671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64C0 +5F40 +64C0 +5F40 +75C0 +5540 +7FC0 +4440 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_8F40 +ENCODING 36672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +22A0 +FB60 +ABE0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F41 +ENCODING 36673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +FF20 +2520 +FAC0 +A900 +FE60 +AC20 +FEE0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_8F42 +ENCODING 36674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +1140 +FF60 +9200 +FDE0 +5620 +7D40 +5480 +FD40 +1220 +ENDCHAR +STARTCHAR U_8F43 +ENCODING 36675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FFE0 +AA40 +FFA0 +A900 +FFE0 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_8F44 +ENCODING 36676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2520 +FFC0 +A900 +FFC0 +A900 +FFE0 +2440 +FC40 +27C0 +ENDCHAR +STARTCHAR U_8F45 +ENCODING 36677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2100 +FFE0 +A800 +FBC0 +AA40 +FBC0 +26A0 +FA40 +2720 +ENDCHAR +STARTCHAR U_8F46 +ENCODING 36678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2A80 +FFE0 +AAA0 +FFE0 +A800 +FAA0 +2BC0 +FAA0 +37E0 +ENDCHAR +STARTCHAR U_8F47 +ENCODING 36679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +25A0 +FB60 +ADA0 +FA80 +AD40 +FAA0 +2140 +F880 +2700 +ENDCHAR +STARTCHAR U_8F48 +ENCODING 36680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FD40 +22A0 +FBE0 +AAA0 +FBE0 +AAA0 +FFE0 +2180 +FAC0 +24A0 +ENDCHAR +STARTCHAR U_8F49 +ENCODING 36681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +FFC0 +AD40 +FFC0 +A960 +FFE0 +2440 +FA40 +20C0 +ENDCHAR +STARTCHAR U_8F4A +ENCODING 36682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +AA40 +FA40 +AFE0 +F820 +27E0 +F820 +27E0 +ENDCHAR +STARTCHAR U_8F4B +ENCODING 36683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +22A0 +FBE0 +AEA0 +FFE0 +AC80 +FFE0 +2480 +FC00 +23E0 +ENDCHAR +STARTCHAR U_8F4C +ENCODING 36684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +27E0 +FD20 +AB40 +FD20 +AFE0 +F820 +27E0 +F820 +27E0 +ENDCHAR +STARTCHAR U_8F4D +ENCODING 36685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FF80 +2AE0 +FFA0 +A9A0 +FEA0 +AAA0 +FEA0 +2A40 +FEA0 +2B20 +ENDCHAR +STARTCHAR U_8F4E +ENCODING 36686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F900 +27E0 +FA40 +AFE0 +FA40 +AFE0 +FAA0 +2BA0 +F820 +2860 +ENDCHAR +STARTCHAR U_8F4F +ENCODING 36687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F820 +2FE0 +F900 +AFC0 +F900 +AFE0 +FA40 +2FE0 +FA40 +26C0 +ENDCHAR +STARTCHAR U_8F50 +ENCODING 36688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +FAC0 +2FE0 +FA80 +AFE0 +F900 +AFC0 +F900 +27E0 +FA80 +2C60 +ENDCHAR +STARTCHAR U_8F51 +ENCODING 36689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7E0 +25A0 +FBC0 +AE60 +FBC0 +AA40 +FBC0 +2580 +F940 +2320 +ENDCHAR +STARTCHAR U_8F52 +ENCODING 36690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +22A0 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +2240 +FBC0 +2660 +ENDCHAR +STARTCHAR U_8F53 +ENCODING 36691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F920 +2540 +FFE0 +A940 +FFE0 +AD40 +FFC0 +2540 +FFC0 +2440 +ENDCHAR +STARTCHAR U_8F54 +ENCODING 36692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +27E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +25E0 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F55 +ENCODING 36693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +23C0 +FA40 +ABC0 +FA40 +AFE0 +FCA0 +2560 +FFA0 +2040 +ENDCHAR +STARTCHAR U_8F56 +ENCODING 36694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +FFC0 +A920 +FFE0 +ADA0 +FDA0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_8F57 +ENCODING 36695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +FFE0 +2880 +FFA0 +A8A0 +FEC0 +AA60 +FE80 +22A0 +F660 +2BC0 +ENDCHAR +STARTCHAR U_8F58 +ENCODING 36696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +2FE0 +F800 +AFE0 +FA40 +ABC0 +FA80 +26A0 +FB40 +2220 +ENDCHAR +STARTCHAR U_8F59 +ENCODING 36697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFC0 +2100 +FFE0 +AAC0 +FAA0 +AFE0 +FAA0 +2740 +FAE0 +2720 +ENDCHAR +STARTCHAR U_8F5A +ENCODING 36698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +AA60 +FFC0 +A940 +FC80 +7FE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F5B +ENCODING 36699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +F720 +2720 +F9E0 +AA20 +FF20 +AAA0 +FF60 +2220 +FB20 +26E0 +ENDCHAR +STARTCHAR U_8F5C +ENCODING 36700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F900 +27E0 +FD60 +AB80 +FD40 +AFE0 +FA00 +27E0 +FD20 +2560 +ENDCHAR +STARTCHAR U_8F5D +ENCODING 36701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6DC0 +4E40 +4A40 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F5E +ENCODING 36702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +FA40 +2F60 +F940 +AF40 +FAA0 +AFA0 +F000 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F5F +ENCODING 36703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +3F80 +2480 +FFE0 +5540 +7FC0 +5540 +FFE0 +1080 +ENDCHAR +STARTCHAR U_8F60 +ENCODING 36704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +AFC0 +F800 +AFE0 +FAA0 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F61 +ENCODING 36705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +B5A0 +5F40 +F5E0 +5F40 +A4A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8F62 +ENCODING 36706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FBA0 +26C0 +FBA0 +AAC0 +FFE0 +A900 +FFE0 +2380 +F540 +2920 +ENDCHAR +STARTCHAR U_8F63 +ENCODING 36707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FEC0 +2A40 +FFE0 +AA40 +FEE0 +AA40 +F880 +2AE0 +FA80 +2FE0 +ENDCHAR +STARTCHAR U_8F64 +ENCODING 36708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F100 +2FE0 +F920 +AFE0 +FD40 +AFC0 +FD40 +2FE0 +FAA0 +27E0 +ENDCHAR +STARTCHAR U_8F65 +ENCODING 36709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +2AA0 +FEE0 +AAA0 +FEE0 +AAA0 +FFE0 +2AA0 +FBE0 +2A60 +ENDCHAR +STARTCHAR U_8F66 +ENCODING 36710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7FC0 +1000 +2400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8F67 +ENCODING 36711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FD00 +2100 +5100 +7D00 +1100 +1D00 +F120 +1120 +10E0 +ENDCHAR +STARTCHAR U_8F68 +ENCODING 36712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +F280 +4FC0 +A280 +F280 +2280 +34A0 +E4A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_8F69 +ENCODING 36713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F100 +4100 +AFE0 +F100 +2100 +3100 +E100 +2100 +2100 +ENDCHAR +STARTCHAR U_8F6A +ENCODING 36714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +4100 +67C0 +A100 +F900 +2280 +3A80 +E240 +2460 +2840 +ENDCHAR +STARTCHAR U_8F6B +ENCODING 36715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +40A0 +62A0 +A2A0 +FD20 +2120 +3920 +E220 +22A0 +2440 +ENDCHAR +STARTCHAR U_8F6C +ENCODING 36716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +4100 +6FE0 +A200 +F7C0 +2040 +3A80 +E100 +2080 +2080 +ENDCHAR +STARTCHAR U_8F6D +ENCODING 36717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC00 +4400 +65E0 +A520 +FD20 +2560 +3D00 +E500 +2520 +28E0 +ENDCHAR +STARTCHAR U_8F6E +ENCODING 36718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +4240 +6420 +A000 +FA40 +2280 +3B00 +E220 +2220 +21E0 +ENDCHAR +STARTCHAR U_8F6F +ENCODING 36719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +FBE0 +4220 +A540 +F900 +2100 +3A80 +E280 +2440 +2820 +ENDCHAR +STARTCHAR U_8F70 +ENCODING 36720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +2400 +3F80 +0400 +FFE0 +0400 +FBC0 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_8F71 +ENCODING 36721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +47E0 +6080 +A080 +FBE0 +2220 +3A20 +E220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8F72 +ENCODING 36722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F840 +4040 +6740 +A540 +FD40 +2740 +3840 +E040 +2140 +2080 +ENDCHAR +STARTCHAR U_8F73 +ENCODING 36723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +4100 +67E0 +A420 +FC20 +27E0 +3C00 +E400 +2400 +2800 +ENDCHAR +STARTCHAR U_8F74 +ENCODING 36724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +47E0 +64A0 +A4A0 +FCA0 +27E0 +3CA0 +E4A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_8F75 +ENCODING 36725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +4220 +6220 +A220 +FBE0 +2220 +3940 +E240 +2420 +2820 +ENDCHAR +STARTCHAR U_8F76 +ENCODING 36726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +43E0 +6480 +A080 +FFE0 +2080 +3880 +E140 +2220 +2420 +ENDCHAR +STARTCHAR U_8F77 +ENCODING 36727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +44A0 +62A0 +A2C0 +F880 +27E0 +2080 +F880 +2080 +2180 +ENDCHAR +STARTCHAR U_8F78 +ENCODING 36728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +4240 +64A0 +A100 +FA40 +2080 +3920 +E040 +2180 +2600 +ENDCHAR +STARTCHAR U_8F79 +ENCODING 36729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +4200 +6280 +A280 +FFE0 +2080 +3AC0 +E2A0 +24A0 +2180 +ENDCHAR +STARTCHAR U_8F7A +ENCODING 36730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +4120 +6120 +A2A0 +FC40 +23E0 +3A20 +E220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8F7B +ENCODING 36731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F840 +4080 +6140 +A620 +F800 +23E0 +3880 +E080 +2080 +27E0 +ENDCHAR +STARTCHAR U_8F7C +ENCODING 36732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +47E0 +6080 +A780 +FA80 +2280 +3AA0 +E3A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_8F7D +ENCODING 36733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2100 +FD20 +5140 +7C80 +10A0 +FD60 +1220 +ENDCHAR +STARTCHAR U_8F7E +ENCODING 36734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +4100 +6240 +A7E0 +F920 +2100 +3FC0 +E100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8F7F +ENCODING 36735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +4100 +67E0 +A240 +FC20 +2240 +3A40 +E240 +2440 +2840 +ENDCHAR +STARTCHAR U_8F80 +ENCODING 36736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +4640 +A540 +FFE0 +2440 +3640 +6540 +A440 +28C0 +ENDCHAR +STARTCHAR U_8F81 +ENCODING 36737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +4440 +6020 +A7C0 +F900 +2100 +3FC0 +E100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8F82 +ENCODING 36738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBC0 +4640 +6240 +A180 +FA40 +27E0 +3A40 +E240 +23C0 +2240 +ENDCHAR +STARTCHAR U_8F83 +ENCODING 36739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +47E0 +6240 +A420 +FA40 +2240 +3980 +E080 +2140 +2620 +ENDCHAR +STARTCHAR U_8F84 +ENCODING 36740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A00 +FA80 +4E80 +AA80 +FE80 +2A80 +3B80 +EEA0 +22A0 +22E0 +ENDCHAR +STARTCHAR U_8F85 +ENCODING 36741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FFE0 +4100 +67E0 +A520 +FFE0 +2520 +3FE0 +E520 +2520 +2560 +ENDCHAR +STARTCHAR U_8F86 +ENCODING 36742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +4280 +6FE0 +AAA0 +FAA0 +2BE0 +3CA0 +E920 +2820 +2860 +ENDCHAR +STARTCHAR U_8F87 +ENCODING 36743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +4B40 +BFE0 +1400 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F88 +ENCODING 36744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +FBE0 +0A00 +7FC0 +1400 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_8F89 +ENCODING 36745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC20 +7100 +27E0 +FA00 +5480 +57C0 +5080 +5FE0 +5080 +8080 +ENDCHAR +STARTCHAR U_8F8A +ENCODING 36746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +47E0 +6420 +A7E0 +F880 +24A0 +3FC0 +E480 +25A0 +2660 +ENDCHAR +STARTCHAR U_8F8B +ENCODING 36747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F820 +4AA0 +6920 +AFE0 +F920 +2FE0 +3A20 +EBA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8F8C +ENCODING 36748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +4000 +A7C0 +F440 +27C0 +3100 +6540 +A920 +2300 +ENDCHAR +STARTCHAR U_8F8D +ENCODING 36749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FDA0 +4240 +65A0 +A500 +FFE0 +2120 +3DA0 +E240 +25A0 +2920 +ENDCHAR +STARTCHAR U_8F8E +ENCODING 36750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +4540 +62A0 +A2A0 +FFE0 +2520 +3FE0 +E520 +27E0 +2420 +ENDCHAR +STARTCHAR U_8F8F +ENCODING 36751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +47C0 +6100 +A7E0 +FC40 +23A0 +3900 +E7E0 +2280 +2C60 +ENDCHAR +STARTCHAR U_8F90 +ENCODING 36752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4000 +F3C0 +4240 +A3C0 +F800 +27E0 +3CA0 +E7E0 +24A0 +27E0 +ENDCHAR +STARTCHAR U_8F91 +ENCODING 36753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +43C0 +6000 +A7E0 +FA40 +2340 +3AC0 +E260 +2FC0 +2040 +ENDCHAR +STARTCHAR U_8F92 +ENCODING 36754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +4440 +A7C0 +F000 +27C0 +3540 +6540 +A540 +2FE0 +ENDCHAR +STARTCHAR U_8F93 +ENCODING 36755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +F440 +4BA0 +A000 +FE20 +2AA0 +3EA0 +EAA0 +2EA0 +2A60 +ENDCHAR +STARTCHAR U_8F94 +ENCODING 36756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +9E80 +F5E0 +3E40 +E5E0 +3F20 +C4C0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8F95 +ENCODING 36757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4100 +67E0 +A000 +FFC0 +2440 +3FC0 +E6A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_8F96 +ENCODING 36758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4920 +67C0 +A100 +F7C0 +2900 +3FE0 +E440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8F97 +ENCODING 36759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FFE0 +4940 +AFE0 +F940 +2FE0 +3AA0 +EA40 +2B20 +3220 +ENDCHAR +STARTCHAR U_8F98 +ENCODING 36760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA80 +4FE0 +AAA0 +FFE0 +2AA0 +3BC0 +EA80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_8F99 +ENCODING 36761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4F80 +FAE0 +4FA0 +A0A0 +FEA0 +2AA0 +3EA0 +EA40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_8F9A +ENCODING 36762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +47E0 +6340 +A520 +FC40 +27E0 +3D40 +E3E0 +2240 +2440 +ENDCHAR +STARTCHAR U_8F9B +ENCODING 36763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +1900 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8F9C +ENCODING 36764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0400 +7FC0 +0A00 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8F9D +ENCODING 36765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +9440 +FA80 +0FE0 +F100 +97C0 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_8F9E +ENCODING 36766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E7E0 +2220 +F940 +27E0 +2080 +F880 +8BE0 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_8F9F +ENCODING 36767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +27E0 +2620 +3D40 +2080 +3FE0 +5480 +57E0 +5480 +9C80 +0080 +ENDCHAR +STARTCHAR U_8FA0 +ENCODING 36768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8FA1 +ENCODING 36769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1080 +7BE0 +2940 +1080 +FBE0 +1080 +7BE0 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_8FA2 +ENCODING 36770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2140 +F880 +AFE0 +F880 +23E0 +7080 +A880 +2080 +ENDCHAR +STARTCHAR U_8FA3 +ENCODING 36771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +57E0 +2520 +FFE0 +2100 +FB80 +2540 +4920 +8100 +ENDCHAR +STARTCHAR U_8FA4 +ENCODING 36772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +C080 +AFE0 +5140 +F880 +8FE0 +7080 +13E0 +6080 +5080 +8880 +ENDCHAR +STARTCHAR U_8FA5 +ENCODING 36773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +FFE0 +5140 +F880 +4FE0 +7880 +43E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8FA6 +ENCODING 36774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +F5E0 +54A0 +2F40 +F5E0 +2540 +2540 +F5E0 +2540 +4940 +9240 +ENDCHAR +STARTCHAR U_8FA7 +ENCODING 36775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +4040 +FFE0 +AAA0 +4A40 +FBE0 +4A40 +EAE0 +4A40 +5240 +A640 +ENDCHAR +STARTCHAR U_8FA8 +ENCODING 36776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FBE0 +52A0 +2A40 +FBE0 +2A40 +3A40 +E3E0 +2440 +4840 +9040 +ENDCHAR +STARTCHAR U_8FA9 +ENCODING 36777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FBE0 +52A0 +2C40 +F5E0 +2440 +3C40 +E5E0 +2640 +4440 +8040 +ENDCHAR +STARTCHAR U_8FAA +ENCODING 36778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5C80 +53E0 +5140 +FC80 +4BE0 +7880 +43E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8FAB +ENCODING 36779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FCE0 +55A0 +2640 +FBE0 +2440 +3E40 +E1E0 +2640 +4840 +8040 +ENDCHAR +STARTCHAR U_8FAC +ENCODING 36780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4440 +F5E0 +A0A0 +4F40 +F1E0 +4A40 +E5E0 +4A40 +5040 +8040 +ENDCHAR +STARTCHAR U_8FAD +ENCODING 36781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F7E0 +5540 +7C80 +2BE0 +FE80 +AA80 +BBE0 +AA80 +9280 +AE80 +ENDCHAR +STARTCHAR U_8FAE +ENCODING 36782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +F9E0 +5EA0 +2440 +FBE0 +2E40 +3440 +E5E0 +2E40 +5540 +8C40 +ENDCHAR +STARTCHAR U_8FAF +ENCODING 36783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +50A0 +2740 +F8E0 +2740 +2040 +FFE0 +2540 +4740 +8540 +ENDCHAR +STARTCHAR U_8FB0 +ENCODING 36784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A00 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_8FB1 +ENCODING 36785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +5F80 +4000 +7FE0 +5240 +9980 +9140 +FFE0 +1100 +0B00 +ENDCHAR +STARTCHAR U_8FB2 +ENCODING 36786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +3FC0 +2940 +3FC0 +2940 +3FE0 +2000 +3FE0 +2A80 +4900 +8EE0 +ENDCHAR +STARTCHAR U_8FB3 +ENCODING 36787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +9120 +7FE0 +4000 +5F80 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_8FB4 +ENCODING 36788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA00 +FAC0 +AA00 +FBE0 +AA80 +FAA0 +22C0 +FA40 +26A0 +2B20 +ENDCHAR +STARTCHAR U_8FB5 +ENCODING 36789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +03C0 +3C00 +03C0 +7C00 +0400 +27C0 +2400 +5C00 +83E0 +ENDCHAR +STARTCHAR U_8FB6 +ENCODING 36790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2000 +0000 +E000 +2000 +2000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FB7 +ENCODING 36791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4000 +4000 +0000 +EFC0 +2000 +2000 +2000 +5000 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FB8 +ENCODING 36792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +5FC0 +4480 +0500 +E5E0 +2420 +2820 +2940 +3080 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FB9 +ENCODING 36793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0120 +E120 +2120 +2220 +2420 +28C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBA +ENCODING 36794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4FC0 +4240 +0240 +E240 +2440 +2440 +2940 +3080 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBB +ENCODING 36795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +4100 +0FE0 +E100 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBC +ENCODING 36796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4200 +4100 +0100 +E280 +2280 +2460 +2840 +5000 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FBD +ENCODING 36797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +2080 +0100 +E100 +2100 +2100 +2500 +2200 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBE +ENCODING 36798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2100 +0FE0 +E100 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBF +ENCODING 36799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2520 +0520 +E520 +2520 +2520 +27E0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC0 +ENCODING 36800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC1 +ENCODING 36801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +2100 +0100 +EFE0 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC2 +ENCODING 36802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2100 +2100 +2500 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FC3 +ENCODING 36803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4FC0 +4000 +1FE0 +E400 +2FC0 +2040 +2040 +2140 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FC4 +ENCODING 36804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2800 +07C0 +E080 +2100 +2220 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC5 +ENCODING 36805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +2280 +2280 +0280 +EF80 +2280 +22A0 +2260 +2220 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC6 +ENCODING 36806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +2560 +07A0 +ED20 +25A0 +2540 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC7 +ENCODING 36807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +2FE0 +0080 +E480 +2280 +2080 +2080 +2180 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC8 +ENCODING 36808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +2200 +03C0 +E240 +2240 +2440 +2540 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC9 +ENCODING 36809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +2420 +07E0 +E420 +2400 +2400 +2400 +2800 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCA +ENCODING 36810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2100 +0FE0 +E920 +2920 +2920 +2960 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCB +ENCODING 36811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2100 +0100 +E7C0 +2100 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCC +ENCODING 36812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2440 +07C0 +E440 +2440 +27C0 +2440 +2940 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FCD +ENCODING 36813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2100 +0940 +E940 +2FC0 +2120 +2120 +20E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCE +ENCODING 36814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +2920 +0920 +E920 +2920 +2B20 +2D60 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCF +ENCODING 36815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2200 +1FE0 +E200 +2500 +2480 +2A40 +3120 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD0 +ENCODING 36816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +2000 +0FE0 +E200 +2280 +2440 +2FA0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD1 +ENCODING 36817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +2400 +07E0 +E480 +2480 +2480 +2480 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD2 +ENCODING 36818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2000 +0780 +E480 +2480 +24A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD3 +ENCODING 36819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +2480 +0480 +EFE0 +2280 +2480 +2880 +2280 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FD4 +ENCODING 36820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +2400 +07E0 +E620 +2540 +2480 +2940 +2620 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD5 +ENCODING 36821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +2900 +0100 +E100 +2FE0 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD6 +ENCODING 36822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2140 +2100 +0FE0 +E100 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD7 +ENCODING 36823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD8 +ENCODING 36824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +2100 +0100 +E340 +2520 +2920 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD9 +ENCODING 36825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +E080 +2480 +2280 +2100 +2280 +2C40 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FDA +ENCODING 36826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +4FE0 +0920 +E920 +2FE0 +2100 +2100 +5100 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FDB +ENCODING 36827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +2FC0 +0480 +E480 +3FE0 +2480 +2480 +2880 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FDC +ENCODING 36828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +2000 +0FE0 +E280 +2280 +22A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FDD +ENCODING 36829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2100 +07C0 +E100 +2FE0 +2120 +21A0 +2140 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FDE +ENCODING 36830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +2200 +0500 +EFC0 +2100 +2FE0 +2100 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FDF +ENCODING 36831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2440 +07C0 +E400 +2500 +2480 +2840 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE0 +ENCODING 36832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +21E0 +0100 +E100 +27E0 +2420 +27E0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE1 +ENCODING 36833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +27E0 +0400 +E520 +2540 +25A0 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE2 +ENCODING 36834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2220 +2220 +04A0 +E840 +37E0 +2420 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE3 +ENCODING 36835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +2540 +0FE0 +E540 +2540 +25C0 +2400 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE4 +ENCODING 36836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2900 +15C0 +EF40 +2540 +25C0 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE5 +ENCODING 36837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2820 +0BA0 +EAA0 +2AA0 +2BA0 +2820 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE6 +ENCODING 36838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +3EE0 +0AA0 +EAA0 +2AA0 +2AA0 +32A0 +26E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE7 +ENCODING 36839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2FC0 +0A40 +EFC0 +2A40 +2FC0 +2200 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FE8 +ENCODING 36840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +2440 +0FE0 +E020 +27C0 +2440 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE9 +ENCODING 36841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2820 +0940 +E100 +2540 +2520 +2920 +2500 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FEA +ENCODING 36842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0920 +E920 +2FE0 +2920 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEB +ENCODING 36843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +27C0 +0440 +E440 +27C0 +2440 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEC +ENCODING 36844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4100 +4FE0 +0100 +E100 +27C0 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FED +ENCODING 36845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +27C0 +0900 +E100 +2FE0 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEE +ENCODING 36846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +27E0 +0A00 +E3C0 +2200 +2200 +23E0 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FEF +ENCODING 36847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +2880 +0EC0 +EAA0 +36A0 +2480 +2480 +2880 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FF0 +ENCODING 36848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +2FE0 +0100 +E380 +2540 +2540 +2920 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF1 +ENCODING 36849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FC0 +5040 +2880 +C9C0 +4E00 +4840 +4840 +47C0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_8FF2 +ENCODING 36850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8200 +4FC0 +0200 +DFE0 +4200 +4480 +4440 +4FE0 +A040 +9FE0 +ENDCHAR +STARTCHAR U_8FF3 +ENCODING 36851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +2180 +0240 +EC20 +27C0 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF4 +ENCODING 36852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0AA0 +EAA0 +2BA0 +2820 +2FE0 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF5 +ENCODING 36853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0820 +EBA0 +2AA0 +2BA0 +2820 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF6 +ENCODING 36854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +2200 +07C0 +E440 +2FC0 +3440 +27C0 +2440 +5440 +8FE0 +ENDCHAR +STARTCHAR U_8FF7 +ENCODING 36855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +2540 +0100 +EFE0 +2100 +2380 +2540 +2920 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FF8 +ENCODING 36856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0280 +E280 +2FE0 +2280 +2480 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF9 +ENCODING 36857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0280 +EAC0 +2AA0 +32A0 +2480 +2980 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFA +ENCODING 36858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2280 +0FE0 +EAA0 +2AE0 +2C20 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFB +ENCODING 36859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2880 +0500 +E200 +2FE0 +2440 +2A80 +2100 +5600 +8FE0 +ENDCHAR +STARTCHAR U_8FFC +ENCODING 36860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0100 +E7C0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFD +ENCODING 36861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2440 +07C0 +E400 +27E0 +2420 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFE +ENCODING 36862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +24A0 +24A0 +07A0 +E9A0 +36A0 +2220 +24A0 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFF +ENCODING 36863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2820 +17A0 +E4A0 +27A0 +24A0 +27A0 +20A0 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9000 +ENCODING 36864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +4FC0 +0840 +CFC0 +4800 +4B40 +4880 +4E40 +B000 +8FE0 +ENDCHAR +STARTCHAR U_9001 +ENCODING 36865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +27C0 +0100 +E100 +2FE0 +2100 +2280 +2440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_9002 +ENCODING 36866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +2100 +0FE0 +E100 +27C0 +2440 +27C0 +2440 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9003 +ENCODING 36867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22A0 +2AC0 +0680 +E2C0 +26A0 +2A80 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9004 +ENCODING 36868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2C40 +0380 +EC60 +2100 +27C0 +2900 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9005 +ENCODING 36869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +2800 +0FE0 +E800 +2BC0 +2A40 +2A40 +2BC0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9006 +ENCODING 36870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0100 +E920 +2920 +2FE0 +2100 +2200 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9007 +ENCODING 36871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +8880 +5EE0 +0BA0 +CEA0 +4AA0 +4A80 +4E20 +53E0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9008 +ENCODING 36872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8400 +5FC0 +1040 +D740 +5540 +5740 +5040 +5140 +A080 +9FE0 +ENDCHAR +STARTCHAR U_9009 +ENCODING 36873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +27C0 +0900 +EFE0 +2280 +22A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900A +ENCODING 36874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2280 +2480 +05C0 +E6A0 +3CA0 +2480 +2480 +3D80 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900B +ENCODING 36875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +2100 +0FE0 +E920 +2FE0 +2920 +2FE0 +2920 +5060 +8FE0 +ENDCHAR +STARTCHAR U_900C +ENCODING 36876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +2FE0 +0820 +EFA0 +28A0 +2FA0 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900D +ENCODING 36877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +27C0 +0440 +E7C0 +2440 +27C0 +2440 +25C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_900E +ENCODING 36878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +8500 +5FC0 +1540 +DDC0 +5040 +5FC0 +5040 +5FC0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_900F +ENCODING 36879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +3FE0 +0540 +EFA0 +3280 +22C0 +2440 +2940 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9010 +ENCODING 36880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2200 +0D20 +E2C0 +2D80 +22C0 +2CA0 +2300 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9011 +ENCODING 36881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2140 +3FE0 +0920 +E540 +2380 +2540 +3920 +2300 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9012 +ENCODING 36882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0120 +E7E0 +2900 +2FE0 +2320 +2560 +5900 +8FE0 +ENDCHAR +STARTCHAR U_9013 +ENCODING 36883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +8900 +4FC0 +0900 +CFE0 +4900 +57C0 +5540 +5540 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9014 +ENCODING 36884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +0BA0 +E100 +2FE0 +2540 +2920 +3520 +5200 +8FE0 +ENDCHAR +STARTCHAR U_9015 +ENCODING 36885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +2540 +0A80 +E540 +2000 +2FE0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9016 +ENCODING 36886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +2C80 +2DA0 +15C0 +E680 +2C80 +34C0 +2520 +2E20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9017 +ENCODING 36887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +27C0 +0440 +E7C0 +2000 +2440 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9018 +ENCODING 36888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8440 +4FC0 +0400 +CFE0 +5100 +4FE0 +4100 +4280 +A440 +9FE0 +ENDCHAR +STARTCHAR U_9019 +ENCODING 36889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0000 +E7C0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901A +ENCODING 36890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +2FE0 +0920 +EFE0 +2920 +2FE0 +2920 +2960 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901B +ENCODING 36891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2C80 +2C80 +1480 +E5E0 +2C80 +3480 +2480 +2BE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901C +ENCODING 36892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +27C0 +0240 +EFE0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901D +ENCODING 36893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +3F00 +05E0 +E740 +2D40 +3540 +2540 +2E40 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901E +ENCODING 36894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0000 +EFC0 +2100 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901F +ENCODING 36895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2100 +0FE0 +E920 +2FE0 +2380 +2540 +2920 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9020 +ENCODING 36896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +27C0 +0900 +EFE0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9021 +ENCODING 36897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +2FE0 +0440 +E920 +23C0 +2640 +2980 +2240 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9022 +ENCODING 36898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +2B00 +0FE0 +E100 +27C0 +2100 +2FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9023 +ENCODING 36899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2540 +07C0 +E540 +27C0 +2100 +2FE0 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9024 +ENCODING 36900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +48C0 +42A0 +1AA0 +CC80 +50A0 +7040 +5080 +5300 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9025 +ENCODING 36901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FC0 +5540 +1740 +D540 +5740 +5540 +5FC0 +5040 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9026 +ENCODING 36902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +2FE0 +0920 +EDA0 +2B60 +2920 +2920 +2B60 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9027 +ENCODING 36903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +8440 +4820 +1300 +C480 +4840 +5FE0 +4840 +4FC0 +A840 +9FE0 +ENDCHAR +STARTCHAR U_9028 +ENCODING 36904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FC0 +4A80 +0A80 +D740 +6220 +4700 +4A80 +5260 +A200 +9FE0 +ENDCHAR +STARTCHAR U_9029 +ENCODING 36905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2280 +0540 +EBA0 +2100 +2440 +3FE0 +2440 +5840 +8FE0 +ENDCHAR +STARTCHAR U_902A +ENCODING 36906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +8FC0 +4480 +1FE0 +C000 +4FC0 +4AC0 +4D40 +4FC0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_902B +ENCODING 36907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +9320 +4CC0 +1320 +C000 +5FE0 +5320 +4CC0 +5320 +A000 +9FE0 +ENDCHAR +STARTCHAR U_902C +ENCODING 36908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +8880 +5DE0 +0880 +C880 +5DE0 +4880 +4880 +5080 +A080 +9FE0 +ENDCHAR +STARTCHAR U_902D +ENCODING 36909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +0780 +E480 +27C0 +2440 +27C0 +2440 +5000 +8FE0 +ENDCHAR +STARTCHAR U_902E +ENCODING 36910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2140 +0FE0 +E140 +27C0 +2920 +2540 +2B20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_902F +ENCODING 36911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +27C0 +0040 +EFE0 +2920 +2540 +2380 +2540 +5920 +8FE0 +ENDCHAR +STARTCHAR U_9030 +ENCODING 36912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +89E0 +5E00 +0BC0 +CC40 +5880 +4BE0 +4880 +5A80 +A900 +9FE0 +ENDCHAR +STARTCHAR U_9031 +ENCODING 36913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +2BA0 +0920 +EBA0 +2820 +2BA0 +2AA0 +2BA0 +5060 +8FE0 +ENDCHAR +STARTCHAR U_9032 +ENCODING 36914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +27E0 +0C80 +F7E0 +2480 +27E0 +2480 +27E0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9033 +ENCODING 36915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8FC0 +4480 +1FE0 +C000 +4FC0 +4840 +4FC0 +4840 +A880 +9FE0 +ENDCHAR +STARTCHAR U_9034 +ENCODING 36916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +27C0 +0440 +E7C0 +2440 +27C0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9035 +ENCODING 36917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +2100 +0FE0 +E440 +2920 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9036 +ENCODING 36918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2F80 +2100 +0FE0 +E540 +2920 +2FE0 +2280 +2340 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9037 +ENCODING 36919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4F80 +0880 +CF80 +4800 +5FC0 +6540 +4A40 +A480 +9FE0 +ENDCHAR +STARTCHAR U_9038 +ENCODING 36920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2780 +2900 +1FC0 +EA40 +2FC0 +2540 +2520 +29E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9039 +ENCODING 36921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8F80 +4200 +1FC0 +C500 +5FC0 +4200 +5FC0 +4200 +A200 +9FE0 +ENDCHAR +STARTCHAR U_903A +ENCODING 36922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8F80 +4200 +1FC0 +C480 +4F40 +4280 +4540 +5C80 +A640 +9FE0 +ENDCHAR +STARTCHAR U_903B +ENCODING 36923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0200 +E7C0 +2840 +2480 +2300 +2C00 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903C +ENCODING 36924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +27C0 +0000 +EFE0 +2920 +2FE0 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903D +ENCODING 36925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +2480 +0200 +EFE0 +2400 +2FC0 +3440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903E +ENCODING 36926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +1BA0 +EE00 +2AA0 +2EA0 +2AA0 +2EA0 +5A40 +8FE0 +ENDCHAR +STARTCHAR U_903F +ENCODING 36927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +EFE0 +2400 +27E0 +2AA0 +2520 +5A40 +8FE0 +ENDCHAR +STARTCHAR U_9040 +ENCODING 36928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8FC0 +4400 +0FC0 +D100 +4FE0 +4440 +47C0 +4440 +A440 +9FE0 +ENDCHAR +STARTCHAR U_9041 +ENCODING 36929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +2880 +0FE0 +EA20 +2BE0 +2A20 +2BE0 +2A20 +53E0 +8FE0 +ENDCHAR +STARTCHAR U_9042 +ENCODING 36930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +3FE0 +0620 +E940 +2280 +2DC0 +22A0 +2CA0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9043 +ENCODING 36931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8FE0 +4280 +0FE0 +C900 +4AA0 +4D20 +4A40 +5480 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9044 +ENCODING 36932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2FE0 +2000 +1FE0 +E200 +2FE0 +2AA0 +2AA0 +2AE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9045 +ENCODING 36933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +8840 +4FC0 +0A80 +CFE0 +4900 +57C0 +5100 +6FE0 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9046 +ENCODING 36934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8FE0 +4280 +1FE0 +D120 +4FE0 +4920 +4920 +4960 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9047 +ENCODING 36935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +8A40 +4FC0 +0A40 +CFC0 +4200 +5FE0 +52A0 +57A0 +B040 +9FE0 +ENDCHAR +STARTCHAR U_9048 +ENCODING 36936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4F80 +0880 +DFC0 +4200 +4B80 +4E00 +53C0 +6000 +9FE0 +ENDCHAR +STARTCHAR U_9049 +ENCODING 36937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +27C0 +0440 +E7C0 +2440 +27C0 +2440 +27C0 +5C60 +8FE0 +ENDCHAR +STARTCHAR U_904A +ENCODING 36938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24E0 +3F00 +08E0 +EE40 +2BE0 +2A40 +2A40 +36C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_904B +ENCODING 36939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +2FE0 +0540 +E7C0 +2540 +27C0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_904C +ENCODING 36940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +CAA0 +4EE0 +0000 +C7C0 +4000 +4FE0 +4200 +4380 +6080 +9FE0 +ENDCHAR +STARTCHAR U_904D +ENCODING 36941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +0FE0 +E800 +2FE0 +3AA0 +2FE0 +2AA0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_904E +ENCODING 36942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2740 +0540 +EFE0 +2820 +2BA0 +2AA0 +2BA0 +5860 +8FE0 +ENDCHAR +STARTCHAR U_904F +ENCODING 36943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +E7E0 +2920 +3AA0 +2820 +2FA0 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9050 +ENCODING 36944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2A20 +2EE0 +0800 +EEE0 +28A0 +2F40 +28A0 +2920 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9051 +ENCODING 36945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2440 +07C0 +E440 +2FE0 +2100 +27C0 +2100 +57E0 +8FE0 +ENDCHAR +STARTCHAR U_9052 +ENCODING 36946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +2280 +0FE0 +EAA0 +2CE0 +2BA0 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9053 +ENCODING 36947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0100 +E7C0 +2440 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9054 +ENCODING 36948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E280 +2FE0 +2100 +2FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9055 +ENCODING 36949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +2FE0 +0440 +E7C0 +2100 +27E0 +2500 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9056 +ENCODING 36950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FE0 +4400 +1FC0 +D540 +5FC0 +5240 +5FC0 +5240 +72C0 +9FE0 +ENDCHAR +STARTCHAR U_9057 +ENCODING 36951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +2940 +1FE0 +E000 +2FC0 +2940 +2940 +2280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_9058 +ENCODING 36952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +2280 +0FE0 +E540 +27C0 +2540 +2FE0 +2440 +54C0 +8FE0 +ENDCHAR +STARTCHAR U_9059 +ENCODING 36953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +2A80 +0500 +EFE0 +2500 +2FE0 +2540 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_905A +ENCODING 36954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AC0 +5240 +5AC0 +1240 +DFC0 +4200 +5F80 +4500 +4200 +6D80 +9FE0 +ENDCHAR +STARTCHAR U_905B +ENCODING 36955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +28A0 +2AA0 +0D60 +EFE0 +2920 +2FE0 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_905C +ENCODING 36956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2540 +26A0 +09C0 +EAA0 +3FE0 +2880 +2AC0 +3CA0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_905D +ENCODING 36957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0100 +E540 +2920 +2580 +2940 +2120 +5100 +8FE0 +ENDCHAR +STARTCHAR U_905E +ENCODING 36958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2880 +2BE0 +0AA0 +EBC0 +2AA0 +2AE0 +3540 +2940 +5220 +8FE0 +ENDCHAR +STARTCHAR U_905F +ENCODING 36959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +0FC0 +C900 +4FC0 +4A80 +57E0 +5100 +57C0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_9060 +ENCODING 36960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E440 +27C0 +2320 +26C0 +2A40 +5220 +8FE0 +ENDCHAR +STARTCHAR U_9061 +ENCODING 36961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A2E0 +54A0 +7EE0 +08A0 +EAE0 +6AA0 +7EA0 +48A0 +5140 +7000 +9FE0 +ENDCHAR +STARTCHAR U_9062 +ENCODING 36962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +EFE0 +2AA0 +2660 +2AA0 +3320 +5660 +8FE0 +ENDCHAR +STARTCHAR U_9063 +ENCODING 36963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2540 +1FE0 +E7C0 +2440 +27E0 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9064 +ENCODING 36964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2900 +0FC0 +0900 +EFC0 +2900 +2FE0 +2AA0 +2D60 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9065 +ENCODING 36965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2F20 +2540 +07E0 +E900 +3FE0 +2100 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9066 +ENCODING 36966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +CA40 +5FE0 +0A40 +CFC0 +4000 +4FC0 +4940 +4FC0 +6480 +9FE0 +ENDCHAR +STARTCHAR U_9067 +ENCODING 36967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +2280 +0100 +EFE0 +2440 +27C0 +2440 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9068 +ENCODING 36968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +2480 +2EE0 +04A0 +FFA0 +28A0 +2EA0 +2A40 +2AA0 +5320 +8FE0 +ENDCHAR +STARTCHAR U_9069 +ENCODING 36969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2280 +0FE0 +E920 +2FE0 +2AA0 +2BA0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_906A +ENCODING 36970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +8FC0 +4480 +0B40 +DFE0 +4A80 +5560 +4A80 +4500 +6200 +9FE0 +ENDCHAR +STARTCHAR U_906B +ENCODING 36971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +24E0 +1FA0 +F5A0 +3FA0 +24A0 +2E40 +34A0 +5520 +8FE0 +ENDCHAR +STARTCHAR U_906C +ENCODING 36972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9E80 +44E0 +5F20 +1540 +FF40 +2440 +2C40 +36A0 +6520 +9FE0 +ENDCHAR +STARTCHAR U_906D +ENCODING 36973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +7FE0 +5540 +1FC0 +D540 +5FC0 +4880 +4F80 +4880 +AF80 +9FE0 +ENDCHAR +STARTCHAR U_906E +ENCODING 36974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2A40 +0FE0 +EA40 +2BC0 +2800 +3540 +2AA0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_906F +ENCODING 36975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5480 +5520 +1EC0 +D580 +5680 +5DC0 +56A0 +57A0 +AD00 +9FE0 +ENDCHAR +STARTCHAR U_9070 +ENCODING 36976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +3FE0 +2AA0 +13A0 +EFE0 +2920 +27C0 +2540 +25C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9071 +ENCODING 36977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +4A40 +1FE0 +0A40 +CFC0 +4200 +5FE0 +4480 +6300 +9FE0 +ENDCHAR +STARTCHAR U_9072 +ENCODING 36978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2FE0 +0AA0 +E9C0 +2AA0 +2BE0 +2A80 +37E0 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9073 +ENCODING 36979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +2440 +0540 +EBA0 +2100 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9074 +ENCODING 36980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +2FE0 +0540 +E920 +26E0 +2B40 +35E0 +2840 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9075 +ENCODING 36981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +2280 +0FE0 +EAA0 +2FE0 +28A0 +3FE0 +2280 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9076 +ENCODING 36982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E440 +2FE0 +2440 +2FE0 +2280 +54E0 +8FE0 +ENDCHAR +STARTCHAR U_9077 +ENCODING 36983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2FE0 +0AA0 +FFE0 +2440 +2FA0 +24A0 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9078 +ENCODING 36984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +0880 +EAA0 +2FE0 +2280 +2FE0 +2240 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9079 +ENCODING 36985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +2FE0 +02A0 +E480 +2FE0 +2AA0 +2C60 +2BA0 +5AA0 +87E0 +ENDCHAR +STARTCHAR U_907A +ENCODING 36986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2540 +0FE0 +E440 +27C0 +2440 +27C0 +2280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_907B +ENCODING 36987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +0280 +EFE0 +2540 +2540 +27C0 +2200 +5400 +8FE0 +ENDCHAR +STARTCHAR U_907C +ENCODING 36988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2AA0 +07C0 +EC60 +37C0 +2440 +27C0 +2940 +5320 +8FE0 +ENDCHAR +STARTCHAR U_907D +ENCODING 36989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +2FE0 +0A20 +EFE0 +2D40 +2A80 +2DC0 +32A0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_907E +ENCODING 36990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +3540 +0FE0 +E100 +2540 +2BA0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_907F +ENCODING 36991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9C80 +57E0 +1540 +1C80 +D3E0 +5C80 +77E0 +5480 +5C80 +A080 +9FE0 +ENDCHAR +STARTCHAR U_9080 +ENCODING 36992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5E80 +52E0 +1FA0 +D2A0 +7FA0 +48A0 +4E40 +52A0 +A520 +9FE0 +ENDCHAR +STARTCHAR U_9081 +ENCODING 36993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +2540 +07C0 +E540 +2FE0 +2960 +2FE0 +2820 +5060 +8FE0 +ENDCHAR +STARTCHAR U_9082 +ENCODING 36994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +5FA0 +1540 +DF40 +55E0 +5F40 +55E0 +5540 +B340 +8FE0 +ENDCHAR +STARTCHAR U_9083 +ENCODING 36995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +0440 +EFE0 +2500 +2AA0 +25C0 +2AA0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_9084 +ENCODING 36996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +5FC0 +0000 +FFE0 +2880 +2FA0 +2740 +2A80 +5240 +8FE0 +ENDCHAR +STARTCHAR U_9085 +ENCODING 36997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +4BA0 +0820 +EFE0 +2440 +27C0 +2440 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9086 +ENCODING 36998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +2AA0 +27C0 +0820 +E7C0 +2440 +27C0 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9087 +ENCODING 36999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4540 +4FE0 +1920 +EDA0 +2B60 +2DA0 +2B60 +2DA0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_9088 +ENCODING 37000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +35E0 +2B20 +0DE0 +F720 +2BE0 +3680 +2AA0 +3360 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9089 +ENCODING 37001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +CFC0 +4840 +0FC0 +C840 +5FE0 +54A0 +4FC0 +54A0 +6480 +9FE0 +ENDCHAR +STARTCHAR U_908A +ENCODING 37002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +2840 +1FE0 +F4A0 +2940 +3FE0 +2200 +27C0 +58C0 +8FE0 +ENDCHAR +STARTCHAR U_908B +ENCODING 37003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2A80 +2540 +0FE0 +EAA0 +2FE0 +2DC0 +2B40 +2DC0 +5320 +8FE0 +ENDCHAR +STARTCHAR U_908C +ENCODING 37004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9E80 +44E0 +5F60 +0EA0 +D520 +4740 +4A80 +7AE0 +4700 +6A80 +9FE0 +ENDCHAR +STARTCHAR U_908D +ENCODING 37005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5C80 +47C0 +1D60 +E7C0 +2040 +3FE0 +2540 +2380 +5540 +8FE0 +ENDCHAR +STARTCHAR U_908E +ENCODING 37006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8860 +4D80 +5480 +0940 +DF80 +6120 +5FE0 +5480 +5DC0 +62A0 +9FE0 +ENDCHAR +STARTCHAR U_908F +ENCODING 37007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0440 +EBE0 +3D40 +25E0 +2940 +2FE0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_9090 +ENCODING 37008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2000 +2EE0 +0AA0 +EFE0 +2AA0 +2FE0 +2C80 +27E0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_9091 +ENCODING 37009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7E00 +4200 +7E00 +0000 +FF00 +8900 +FF00 +8000 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_9092 +ENCODING 37010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1220 +1240 +1280 +1280 +1240 +1220 +1220 +12A0 +5240 +2200 +ENDCHAR +STARTCHAR U_9093 +ENCODING 37011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +0A40 +8A40 +4A80 +3240 +1220 +2A20 +4AA0 +8240 +0200 +ENDCHAR +STARTCHAR U_9094 +ENCODING 37012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +0A40 +0A80 +0A80 +FB00 +8280 +8240 +8A40 +9340 +A280 +C200 +ENDCHAR +STARTCHAR U_9095 +ENCODING 37013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2480 +4900 +2480 +7F00 +4100 +FF80 +8880 +FF80 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_9096 +ENCODING 37014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2240 +AA80 +AA80 +AA40 +AA20 +AA20 +FAA0 +0240 +0200 +ENDCHAR +STARTCHAR U_9097 +ENCODING 37015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +1140 +1140 +FF80 +1140 +1120 +1120 +11A0 +1140 +1100 +ENDCHAR +STARTCHAR U_9098 +ENCODING 37016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +1140 +1140 +FD80 +1140 +1120 +1120 +11A0 +5140 +2100 +ENDCHAR +STARTCHAR U_9099 +ENCODING 37017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF40 +4140 +4180 +4140 +4120 +4120 +41A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_909A +ENCODING 37018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FF20 +2540 +2580 +4540 +2920 +1120 +19A0 +2540 +C100 +ENDCHAR +STARTCHAR U_909B +ENCODING 37019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +2240 +2240 +2280 +2240 +2220 +3A20 +E2A0 +0240 +0200 +ENDCHAR +STARTCHAR U_909C +ENCODING 37020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +3E40 +4A80 +6A80 +9A40 +1220 +1220 +22A0 +4240 +8200 +ENDCHAR +STARTCHAR U_909D +ENCODING 37021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +7F40 +4140 +4180 +4140 +4120 +4120 +41A0 +8140 +8100 +ENDCHAR +STARTCHAR U_909E +ENCODING 37022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +7D40 +1140 +1180 +7F40 +1120 +1920 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_909F +ENCODING 37023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +0140 +3D40 +2580 +2540 +2520 +2520 +27A0 +4540 +8100 +ENDCHAR +STARTCHAR U_90A0 +ENCODING 37024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2520 +4340 +8140 +7D80 +1540 +1520 +1520 +25A0 +5540 +8900 +ENDCHAR +STARTCHAR U_90A1 +ENCODING 37025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF40 +2140 +3D80 +2540 +2520 +2520 +45A0 +5540 +8900 +ENDCHAR +STARTCHAR U_90A2 +ENCODING 37026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2920 +2940 +2940 +FF80 +2940 +2920 +2920 +29E0 +4940 +8900 +ENDCHAR +STARTCHAR U_90A3 +ENCODING 37027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2540 +FD40 +2540 +2520 +FD20 +25A0 +2540 +4500 +8D00 +ENDCHAR +STARTCHAR U_90A4 +ENCODING 37028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +4240 +7E80 +4A80 +4A40 +4A20 +4A20 +4AA0 +8A40 +8A00 +ENDCHAR +STARTCHAR U_90A5 +ENCODING 37029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +7F40 +5540 +1180 +1940 +2920 +2920 +2BA0 +4D40 +8900 +ENDCHAR +STARTCHAR U_90A6 +ENCODING 37030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1140 +1140 +7D80 +1140 +FF20 +1120 +11A0 +2140 +C100 +ENDCHAR +STARTCHAR U_90A7 +ENCODING 37031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0120 +0140 +FF40 +2980 +2940 +2920 +2B20 +2DE0 +4940 +8100 +ENDCHAR +STARTCHAR U_90A8 +ENCODING 37032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11E0 +FF20 +1140 +5580 +5540 +7D20 +11A0 +1540 +1900 +0100 +ENDCHAR +STARTCHAR U_90A9 +ENCODING 37033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +1240 +5680 +5A80 +9240 +1220 +2AA0 +2640 +4200 +8200 +ENDCHAR +STARTCHAR U_90AA +ENCODING 37034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0920 +2940 +4940 +7D80 +0940 +1920 +2920 +49A0 +A940 +1100 +ENDCHAR +STARTCHAR U_90AB +ENCODING 37035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +27C0 +7800 +27C0 +FD40 +27C0 +2400 +4420 +83E0 +ENDCHAR +STARTCHAR U_90AC +ENCODING 37036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7D20 +4540 +4540 +5980 +4140 +7D20 +0520 +35A0 +C540 +1900 +ENDCHAR +STARTCHAR U_90AD +ENCODING 37037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +8540 +7580 +5540 +5520 +7520 +05A0 +3540 +0900 +0100 +ENDCHAR +STARTCHAR U_90AE +ENCODING 37038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA40 +AA40 +AA80 +FA40 +AA20 +AA20 +FAA0 +8A40 +0200 +ENDCHAR +STARTCHAR U_90AF +ENCODING 37039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FF40 +2540 +2580 +3D40 +2520 +2520 +25A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90B0 +ENCODING 37040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2120 +4540 +FB40 +0180 +7D40 +4520 +4520 +45E0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90B1 +ENCODING 37041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +7120 +4140 +4140 +7F80 +4940 +4920 +4920 +5FA0 +E140 +0100 +ENDCHAR +STARTCHAR U_90B2 +ENCODING 37042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D20 +0540 +2540 +2580 +6540 +6B20 +AB20 +35E0 +2540 +DD00 +0100 +ENDCHAR +STARTCHAR U_90B3 +ENCODING 37043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +FD20 +1140 +1940 +3580 +5540 +9120 +1120 +1DA0 +E140 +4100 +ENDCHAR +STARTCHAR U_90B4 +ENCODING 37044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +2140 +FD40 +A580 +A540 +B520 +CD20 +85E0 +8540 +8D00 +ENDCHAR +STARTCHAR U_90B5 +ENCODING 37045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2540 +2540 +5580 +8940 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90B6 +ENCODING 37046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2920 +2940 +EB40 +2D80 +2940 +2920 +2B20 +EDA0 +2940 +2100 +ENDCHAR +STARTCHAR U_90B7 +ENCODING 37047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +3940 +4980 +6940 +5920 +4920 +49A0 +6B40 +4700 +0100 +ENDCHAR +STARTCHAR U_90B8 +ENCODING 37048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F120 +9140 +9140 +FD80 +9140 +9120 +B520 +CDE0 +A540 +1100 +ENDCHAR +STARTCHAR U_90B9 +ENCODING 37049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +3D20 +4940 +BD40 +0580 +0540 +7D20 +0520 +05A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_90BA +ENCODING 37050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2920 +A940 +AB40 +6D80 +2940 +2920 +2920 +2FA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90BB +ENCODING 37051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1920 +2540 +5340 +8980 +0140 +7F20 +0520 +29E0 +1140 +0900 +ENDCHAR +STARTCHAR U_90BC +ENCODING 37052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8120 +FD40 +9180 +FD40 +9120 +FD20 +81A0 +FD40 +0100 +0100 +ENDCHAR +STARTCHAR U_90BD +ENCODING 37053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1140 +1140 +FF80 +1140 +7D20 +1120 +1FE0 +F140 +4100 +ENDCHAR +STARTCHAR U_90BE +ENCODING 37054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +5120 +7D20 +9140 +FF20 +1120 +3920 +55A0 +9340 +1100 +1100 +ENDCHAR +STARTCHAR U_90BF +ENCODING 37055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +0980 +FF40 +8920 +4920 +09A0 +2940 +1100 +ENDCHAR +STARTCHAR U_90C0 +ENCODING 37056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7F20 +2920 +4540 +BB80 +0140 +FF20 +2120 +3DA0 +0540 +1900 +ENDCHAR +STARTCHAR U_90C1 +ENCODING 37057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +2120 +3D40 +6580 +BD40 +2520 +3D20 +25A0 +2540 +2D00 +ENDCHAR +STARTCHAR U_90C2 +ENCODING 37058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +2120 +4940 +7980 +1140 +2920 +D120 +29A0 +C540 +0100 +ENDCHAR +STARTCHAR U_90C3 +ENCODING 37059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +4520 +8340 +7D80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90C4 +ENCODING 37060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +1920 +1520 +6340 +1180 +7F40 +2120 +2920 +51A0 +A540 +3F00 +ENDCHAR +STARTCHAR U_90C5 +ENCODING 37061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +4920 +FD40 +1580 +1140 +7D20 +1120 +1DA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90C6 +ENCODING 37062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FF20 +1140 +7D80 +0140 +7D20 +4520 +45A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_90C7 +ENCODING 37063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7D20 +8520 +7540 +5580 +7540 +5520 +7520 +55A0 +0540 +1900 +ENDCHAR +STARTCHAR U_90C8 +ENCODING 37064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F120 +8120 +FD40 +8180 +BD40 +A520 +A520 +A5A0 +BD40 +A500 +ENDCHAR +STARTCHAR U_90C9 +ENCODING 37065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDE0 +4920 +4920 +4940 +FF80 +4940 +4920 +4920 +49A0 +8940 +8900 +ENDCHAR +STARTCHAR U_90CA +ENCODING 37066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF20 +2540 +4380 +A540 +1920 +0920 +15A0 +2340 +C100 +ENDCHAR +STARTCHAR U_90CB +ENCODING 37067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +23C0 +4240 +FA40 +8A80 +FB00 +8A80 +8A40 +FA40 +8B40 +FA80 +8A00 +ENDCHAR +STARTCHAR U_90CC +ENCODING 37068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +27C0 +F800 +27C0 +2540 +F540 +27C0 +3400 +C420 +03E0 +ENDCHAR +STARTCHAR U_90CD +ENCODING 37069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +3D20 +2520 +3540 +2D80 +FF40 +2520 +3520 +2DA0 +4540 +8D00 +ENDCHAR +STARTCHAR U_90CE +ENCODING 37070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +23C0 +FA40 +8A40 +FA80 +8A80 +FA40 +A240 +9240 +AB40 +CA80 +0200 +ENDCHAR +STARTCHAR U_90CF +ENCODING 37071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +9340 +5580 +FF40 +1120 +1120 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90D0 +ENCODING 37072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +4520 +BB40 +0180 +FD40 +2120 +2120 +49A0 +FD40 +0300 +ENDCHAR +STARTCHAR U_90D1 +ENCODING 37073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +29E0 +7D20 +1140 +1180 +FD40 +1120 +2920 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_90D2 +ENCODING 37074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +97C0 +F000 +97C0 +F540 +8540 +A7C0 +B400 +D420 +83E0 +ENDCHAR +STARTCHAR U_90D3 +ENCODING 37075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8520 +2120 +FD40 +5180 +FD40 +1120 +1D20 +F1A0 +1140 +1100 +ENDCHAR +STARTCHAR U_90D4 +ENCODING 37076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +C3E0 +5D20 +4520 +8540 +D780 +5540 +5520 +D520 +5FA0 +A140 +9F00 +ENDCHAR +STARTCHAR U_90D5 +ENCODING 37077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +0B20 +FF20 +8940 +E980 +A940 +AB20 +AD20 +E9A0 +9540 +A300 +ENDCHAR +STARTCHAR U_90D6 +ENCODING 37078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0120 +7D20 +4540 +4580 +7D40 +0520 +4920 +2DA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90D7 +ENCODING 37079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CDE0 +3120 +CD20 +2140 +FF80 +5140 +7D20 +D520 +55A0 +5D40 +1100 +ENDCHAR +STARTCHAR U_90D8 +ENCODING 37080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4920 +7940 +0180 +0140 +FD20 +8520 +85A0 +FD40 +8500 +ENDCHAR +STARTCHAR U_90D9 +ENCODING 37081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +FF20 +1120 +FD40 +9580 +FD40 +9520 +FD20 +95A0 +9540 +9D00 +ENDCHAR +STARTCHAR U_90DA +ENCODING 37082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1120 +7D20 +2540 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90DB +ENCODING 37083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F520 +A520 +5940 +FD80 +0940 +1D20 +F120 +11A0 +5140 +2100 +ENDCHAR +STARTCHAR U_90DC +ENCODING 37084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +7D20 +9120 +1140 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90DD +ENCODING 37085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +2980 +AD40 +AB20 +A920 +29A0 +4940 +9900 +ENDCHAR +STARTCHAR U_90DE +ENCODING 37086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +8A20 +FA40 +8A80 +FA40 +AA20 +9220 +AB20 +CAC0 +0200 +ENDCHAR +STARTCHAR U_90DF +ENCODING 37087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +5540 +5580 +BB40 +9120 +1120 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90E0 +ENCODING 37088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +1120 +FD20 +9540 +FD80 +9540 +FD20 +5120 +21A0 +5140 +8D00 +ENDCHAR +STARTCHAR U_90E1 +ENCODING 37089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2520 +FF20 +2540 +7D80 +2140 +3D20 +6520 +A5A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90E2 +ENCODING 37090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +8920 +F940 +0180 +F940 +2120 +F920 +21A0 +3940 +C100 +ENDCHAR +STARTCHAR U_90E3 +ENCODING 37091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +8380 +7D40 +0920 +FD20 +11A0 +1140 +3100 +ENDCHAR +STARTCHAR U_90E4 +ENCODING 37092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +4520 +8320 +1140 +2980 +4540 +FF20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90E5 +ENCODING 37093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +4520 +7D40 +4580 +7D40 +4520 +7D20 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90E6 +ENCODING 37094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +00A0 +FEA0 +92A0 +92C0 +DAA0 +B6A0 +92A0 +92E0 +9280 +B680 +ENDCHAR +STARTCHAR U_90E7 +ENCODING 37095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +0140 +7D80 +4540 +5520 +5520 +55A0 +2940 +C700 +ENDCHAR +STARTCHAR U_90E8 +ENCODING 37096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +4520 +2940 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90E9 +ENCODING 37097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +3120 +4920 +FF40 +2180 +7D40 +C520 +7D20 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90EA +ENCODING 37098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FF20 +2520 +FF40 +2580 +FD40 +2120 +FF20 +49A0 +3140 +CD00 +ENDCHAR +STARTCHAR U_90EB +ENCODING 37099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD20 +9520 +FD40 +9580 +FD40 +2920 +4920 +FFA0 +0940 +0900 +ENDCHAR +STARTCHAR U_90EC +ENCODING 37100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +7D40 +1180 +FF40 +4520 +7D20 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90ED +ENCODING 37101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +4520 +7D40 +0180 +7D40 +0920 +1F20 +F120 +11C0 +3100 +ENDCHAR +STARTCHAR U_90EE +ENCODING 37102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +92A0 +FEA0 +92A0 +FEC0 +82A0 +BAA0 +AAA0 +BAE0 +8280 +8680 +ENDCHAR +STARTCHAR U_90EF +ENCODING 37103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5320 +9520 +1140 +2980 +C740 +1120 +5520 +95A0 +2940 +C700 +ENDCHAR +STARTCHAR U_90F0 +ENCODING 37104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +50A0 +5FA0 +71C0 +55A0 +72A0 +56A0 +FDA0 +18E0 +1080 +1080 +ENDCHAR +STARTCHAR U_90F1 +ENCODING 37105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7D20 +2940 +2980 +FF40 +2920 +2920 +29A0 +4940 +8900 +ENDCHAR +STARTCHAR U_90F2 +ENCODING 37106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +5540 +5580 +BB40 +1120 +3920 +55A0 +9340 +1100 +ENDCHAR +STARTCHAR U_90F3 +ENCODING 37107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +9D20 +8520 +DD40 +8580 +FD40 +5120 +5120 +55A0 +5940 +9100 +ENDCHAR +STARTCHAR U_90F4 +ENCODING 37108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FF20 +2540 +3780 +6D40 +B520 +A520 +25A0 +2540 +2500 +ENDCHAR +STARTCHAR U_90F5 +ENCODING 37109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +7920 +1120 +FF40 +5580 +FF40 +5520 +FF20 +11A0 +1D40 +E100 +ENDCHAR +STARTCHAR U_90F6 +ENCODING 37110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +4BE0 +5000 +FBE0 +02A0 +7AA0 +4BE0 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_90F7 +ENCODING 37111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EA0 +9AC0 +EAA0 +4EA0 +98A0 +EAA0 +2DE0 +4880 +8080 +ENDCHAR +STARTCHAR U_90F8 +ENCODING 37112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7D20 +5540 +7D80 +5540 +7D20 +1120 +FFA0 +1140 +1100 +ENDCHAR +STARTCHAR U_90F9 +ENCODING 37113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +4540 +7D80 +4540 +7D20 +1520 +FFA0 +2940 +C700 +ENDCHAR +STARTCHAR U_90FA +ENCODING 37114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3D40 +4AA0 +D7C0 +2440 +57E0 +BD20 +4FE0 +3400 +2420 +C3E0 +ENDCHAR +STARTCHAR U_90FB +ENCODING 37115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +A520 +BD20 +A540 +BD80 +A540 +FF20 +5520 +A9A0 +A940 +5500 +ENDCHAR +STARTCHAR U_90FC +ENCODING 37116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +2520 +FF40 +4580 +7D40 +1120 +FD20 +51A0 +7F40 +1100 +ENDCHAR +STARTCHAR U_90FD +ENCODING 37117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7D20 +1540 +FF80 +2140 +3D20 +6520 +BD20 +25A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90FE +ENCODING 37118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +BD20 +A540 +BD80 +9140 +FF20 +A520 +99A0 +A540 +FF00 +ENDCHAR +STARTCHAR U_90FF +ENCODING 37119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +7D20 +4140 +5D80 +5540 +5D20 +5520 +5DA0 +5540 +9D00 +ENDCHAR +STARTCHAR U_9100 +ENCODING 37120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FF20 +2520 +1140 +FF80 +2140 +7D20 +A520 +25A0 +3D40 +0100 +ENDCHAR +STARTCHAR U_9101 +ENCODING 37121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +ED20 +2920 +EF40 +0180 +7D40 +4520 +7D20 +45A0 +7D40 +4D00 +ENDCHAR +STARTCHAR U_9102 +ENCODING 37122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AB20 +EF20 +0140 +7D80 +0140 +FF20 +2120 +3DA0 +0540 +3900 +ENDCHAR +STARTCHAR U_9103 +ENCODING 37123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +28A0 +44A0 +BAA0 +00C0 +E2A0 +AAA0 +EAA0 +AAA0 +EAC0 +A680 +ENDCHAR +STARTCHAR U_9104 +ENCODING 37124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +FF20 +AB40 +AB80 +FF40 +1120 +7D20 +11A0 +1D40 +E100 +ENDCHAR +STARTCHAR U_9105 +ENCODING 37125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F120 +1120 +FD40 +9580 +FD40 +1120 +FD20 +95A0 +FD40 +8D00 +ENDCHAR +STARTCHAR U_9106 +ENCODING 37126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +82A0 +10A0 +FEA0 +54C0 +7CA0 +54A0 +7CA0 +10E0 +FE80 +1080 +ENDCHAR +STARTCHAR U_9107 +ENCODING 37127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +22A0 +42A0 +5FA0 +C8C0 +5EA0 +44A0 +5FA0 +44A0 +4AE0 +5180 +ENDCHAR +STARTCHAR U_9108 +ENCODING 37128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAE0 +95A0 +66A0 +42A0 +BDC0 +10A0 +FEA0 +10A0 +18A0 +24E0 +C280 +ENDCHAR +STARTCHAR U_9109 +ENCODING 37129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EE0 +4AA0 +9EA0 +EAC0 +4EA0 +9CA0 +EAA0 +2DE0 +4880 +8080 +ENDCHAR +STARTCHAR U_910A +ENCODING 37130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5FE0 +9AA0 +EEC0 +4AA0 +9EA0 +EBA0 +2EA0 +52C0 +8280 +0280 +ENDCHAR +STARTCHAR U_910B +ENCODING 37131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +DD20 +9520 +FD40 +9580 +FD40 +1120 +FD20 +49A0 +3140 +CD00 +ENDCHAR +STARTCHAR U_910C +ENCODING 37132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7F20 +5120 +7D40 +5580 +7F40 +5520 +7D20 +65A0 +A540 +3D00 +ENDCHAR +STARTCHAR U_910D +ENCODING 37133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8320 +7D20 +4540 +7D80 +4540 +7D20 +1120 +FFA0 +2940 +C700 +ENDCHAR +STARTCHAR U_910E +ENCODING 37134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4520 +7D40 +4580 +7D40 +4520 +7D20 +2BA0 +6540 +BD00 +ENDCHAR +STARTCHAR U_910F +ENCODING 37135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +80A0 +BCA0 +80A0 +FEC0 +AAA0 +B4A0 +A6A0 +FEE0 +A480 +9C80 +ENDCHAR +STARTCHAR U_9110 +ENCODING 37136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +2920 +5540 +FB80 +0140 +7D20 +5520 +7DA0 +5540 +7D00 +ENDCHAR +STARTCHAR U_9111 +ENCODING 37137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +6D20 +2940 +FF80 +0140 +7D20 +4520 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9112 +ENCODING 37138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7D20 +D520 +7D40 +2580 +4940 +3D20 +D520 +7DA0 +2540 +C900 +ENDCHAR +STARTCHAR U_9113 +ENCODING 37139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4520 +7D40 +4580 +7D40 +1520 +FF20 +11A0 +2940 +C500 +ENDCHAR +STARTCHAR U_9114 +ENCODING 37140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +F920 +8920 +F940 +8180 +FD40 +8120 +FD20 +55A0 +AD40 +0900 +ENDCHAR +STARTCHAR U_9115 +ENCODING 37141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +4EA0 +AAA0 +EEC0 +4AC0 +AEA0 +E8A0 +2EA0 +48E0 +4680 +8080 +ENDCHAR +STARTCHAR U_9116 +ENCODING 37142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +8A40 +FA40 +0280 +FB00 +8A80 +FA40 +8A40 +FB40 +5280 +8A00 +ENDCHAR +STARTCHAR U_9117 +ENCODING 37143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FEA0 +24A0 +3CA0 +00C0 +FEA0 +82A0 +BAA0 +AAE0 +BA80 +8680 +ENDCHAR +STARTCHAR U_9118 +ENCODING 37144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +FFA0 +8AA0 +FFA0 +8AC0 +FEA0 +AAA0 +BEA0 +AAE0 +BE80 +AE80 +ENDCHAR +STARTCHAR U_9119 +ENCODING 37145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +44A0 +7CA0 +10C0 +FEA0 +10A0 +FEA0 +AAA0 +BAE0 +8280 +FE80 +ENDCHAR +STARTCHAR U_911A +ENCODING 37146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +7D40 +4580 +7D40 +4520 +FF20 +11A0 +2940 +C500 +ENDCHAR +STARTCHAR U_911B +ENCODING 37147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +A920 +5520 +7D40 +5580 +7D40 +5520 +FF20 +39A0 +5540 +9300 +ENDCHAR +STARTCHAR U_911C +ENCODING 37148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +54A0 +7F80 +54C0 +7FA0 +54A0 +5FA0 +54E0 +5D80 +9680 +ENDCHAR +STARTCHAR U_911D +ENCODING 37149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +B540 +6D40 +B580 +5540 +AB20 +5520 +29E0 +1140 +E100 +ENDCHAR +STARTCHAR U_911E +ENCODING 37150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +1140 +7D80 +5540 +7D20 +1120 +7DA0 +1140 +FD00 +ENDCHAR +STARTCHAR U_911F +ENCODING 37151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +9520 +FD40 +9580 +FD40 +1520 +FF20 +49A0 +2940 +1900 +ENDCHAR +STARTCHAR U_9120 +ENCODING 37152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +FF40 +B540 +7D80 +0140 +FF20 +1120 +3DE0 +0540 +1900 +ENDCHAR +STARTCHAR U_9121 +ENCODING 37153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +4540 +7F80 +4140 +7F20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9122 +ENCODING 37154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +10A0 +5EA0 +50A0 +FFC0 +40A0 +7EA0 +40A0 +7EE0 +5280 +AE80 +ENDCHAR +STARTCHAR U_9123 +ENCODING 37155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +2940 +FF40 +4580 +7D40 +4520 +7D20 +11A0 +FF40 +1100 +ENDCHAR +STARTCHAR U_9124 +ENCODING 37156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +4540 +FF80 +AB40 +AB20 +FF20 +25A0 +1940 +E700 +ENDCHAR +STARTCHAR U_9125 +ENCODING 37157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7D20 +4520 +7D40 +4580 +7F40 +4120 +7DA0 +0540 +A500 +0D00 +ENDCHAR +STARTCHAR U_9126 +ENCODING 37158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7F20 +D540 +5540 +FF80 +5540 +5520 +FF20 +01A0 +AB40 +A900 +ENDCHAR +STARTCHAR U_9127 +ENCODING 37159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +5320 +2D20 +4540 +BB80 +0140 +7D20 +4520 +7DA0 +2940 +FF00 +ENDCHAR +STARTCHAR U_9128 +ENCODING 37160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +B540 +EC80 +BF60 +2100 +7F80 +4480 +7FA0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_9129 +ENCODING 37161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0520 +7D20 +0540 +FD80 +5540 +FD20 +0520 +FFA0 +4540 +2D00 +ENDCHAR +STARTCHAR U_912A +ENCODING 37162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +FEA0 +AAA0 +FFA0 +49C0 +FFA0 +42A0 +7EA0 +42E0 +7E80 +C380 +ENDCHAR +STARTCHAR U_912B +ENCODING 37163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +28A0 +FEA0 +AAA0 +FEC0 +00A0 +7CA0 +44A0 +7CE0 +4480 +7C80 +ENDCHAR +STARTCHAR U_912C +ENCODING 37164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +E520 +A920 +F940 +8980 +FD40 +8520 +FF20 +83A0 +AB40 +0D00 +ENDCHAR +STARTCHAR U_912D +ENCODING 37165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +FFA0 +28A0 +7EA0 +5AC0 +66A0 +5AA0 +42A0 +FFE0 +2480 +C380 +ENDCHAR +STARTCHAR U_912E +ENCODING 37166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +DEA0 +AAA0 +D2A0 +04C0 +7CA0 +44A0 +7CA0 +44E0 +7C80 +C680 +ENDCHAR +STARTCHAR U_912F +ENCODING 37167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +1140 +7D40 +1180 +FF40 +2920 +FF20 +45A0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9130 +ENCODING 37168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +5520 +FF20 +5540 +9380 +4540 +7F20 +5520 +BFA0 +4540 +8500 +ENDCHAR +STARTCHAR U_9131 +ENCODING 37169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F320 +5540 +FF40 +5580 +9340 +7D20 +5520 +7DA0 +5540 +7D00 +ENDCHAR +STARTCHAR U_9132 +ENCODING 37170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +FEA0 +54A0 +7CC0 +54A0 +7CA0 +10A0 +FEE0 +1080 +1080 +ENDCHAR +STARTCHAR U_9133 +ENCODING 37171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +EEA0 +28A0 +EEC0 +AAA0 +EEA0 +AAA0 +EEE0 +2880 +1F80 +ENDCHAR +STARTCHAR U_9134 +ENCODING 37172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +6D20 +FF20 +4940 +FF80 +1140 +FD20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9135 +ENCODING 37173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +0140 +EF80 +AB40 +EF20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9136 +ENCODING 37174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +7D40 +8340 +FF80 +AB40 +FF20 +4520 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9137 +ENCODING 37175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +AB20 +FF40 +A980 +FF40 +4520 +7D20 +49A0 +2D40 +F100 +ENDCHAR +STARTCHAR U_9138 +ENCODING 37176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +FF40 +AB80 +FF40 +A320 +3D20 +69A0 +1140 +E100 +ENDCHAR +STARTCHAR U_9139 +ENCODING 37177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +5720 +7B20 +5540 +FB80 +1140 +FF20 +5520 +B9A0 +5540 +9300 +ENDCHAR +STARTCHAR U_913A +ENCODING 37178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +54A0 +7FA0 +54C0 +7FA0 +4AA0 +7EA0 +4AE0 +7E80 +A280 +ENDCHAR +STARTCHAR U_913B +ENCODING 37179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +44A0 +EFA0 +44A0 +AAC0 +FFA0 +4AA0 +7EA0 +5AE0 +FF80 +0880 +ENDCHAR +STARTCHAR U_913C +ENCODING 37180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FD20 +2920 +FF40 +5580 +FF40 +5520 +55A0 +7D40 +4500 +8300 +ENDCHAR +STARTCHAR U_913D +ENCODING 37181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +6AA0 +7EA0 +48C0 +7FA0 +52A0 +6AE0 +5D80 +8880 +3E80 +ENDCHAR +STARTCHAR U_913E +ENCODING 37182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +44A0 +7CA0 +44A0 +FFC0 +A5A0 +52A0 +FEA0 +68E0 +1080 +EE80 +ENDCHAR +STARTCHAR U_913F +ENCODING 37183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2940 +EF40 +AB80 +FF40 +5520 +7D20 +55A0 +FF40 +1100 +ENDCHAR +STARTCHAR U_9140 +ENCODING 37184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +FFA0 +24A0 +3CA0 +45C0 +DEA0 +54A0 +DCA0 +47E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9141 +ENCODING 37185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +88A0 +7EA0 +42A0 +7EC0 +49A0 +7FA0 +D2A0 +7EE0 +2A80 +CF80 +ENDCHAR +STARTCHAR U_9142 +ENCODING 37186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A800 +FFE0 +2920 +FF40 +5580 +AB40 +7D20 +45A0 +5560 +2900 +C500 +ENDCHAR +STARTCHAR U_9143 +ENCODING 37187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +10A0 +FEA0 +92A0 +54C0 +92A0 +00A0 +FEA0 +AAE0 +AA80 +FE80 +ENDCHAR +STARTCHAR U_9144 +ENCODING 37188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +28A0 +EEA0 +AAA0 +EEC0 +48A0 +FFA0 +48A0 +7EE0 +4880 +7F80 +ENDCHAR +STARTCHAR U_9145 +ENCODING 37189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92E0 +FEA0 +48A0 +FEA0 +48C0 +FEA0 +AAA0 +FEA0 +AAE0 +BA80 +8680 +ENDCHAR +STARTCHAR U_9146 +ENCODING 37190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAE0 +FEA0 +AAA0 +FEA0 +AAC0 +FFA0 +44A0 +7CA0 +44E0 +2880 +FE80 +ENDCHAR +STARTCHAR U_9147 +ENCODING 37191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A4E0 +FFA0 +24A0 +FFA0 +4AC0 +FFA0 +42A0 +7EA0 +42E0 +7E80 +8180 +ENDCHAR +STARTCHAR U_9148 +ENCODING 37192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +EEA0 +AAA0 +FEC0 +AAA0 +FEA0 +AAA0 +BCE0 +A880 +BE80 +ENDCHAR +STARTCHAR U_9149 +ENCODING 37193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7FC0 +4A40 +4A40 +71C0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_914A +ENCODING 37194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2840 +2840 +FE40 +AA40 +CE40 +8240 +FE40 +8240 +FE40 +82C0 +ENDCHAR +STARTCHAR U_914B +ENCODING 37195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0A00 +7FC0 +4A40 +73C0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_914C +ENCODING 37196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +2900 +29E0 +FE20 +AA20 +CF20 +82A0 +FEA0 +8220 +FE20 +82C0 +ENDCHAR +STARTCHAR U_914D +ENCODING 37197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5020 +5020 +F820 +ABE0 +DA00 +8A00 +FA00 +8A20 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_914E +ENCODING 37198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +5040 +53E0 +FC40 +B640 +DD40 +8540 +FC40 +8440 +FD40 +8480 +ENDCHAR +STARTCHAR U_914F +ENCODING 37199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +52A0 +FAE0 +AFA0 +DAA0 +8AE0 +FA80 +8A20 +FA20 +89E0 +ENDCHAR +STARTCHAR U_9150 +ENCODING 37200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +5080 +F880 +A880 +DFE0 +8880 +F880 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_9151 +ENCODING 37201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +F880 +A880 +AFE0 +D880 +8880 +F880 +8880 +F880 +0180 +ENDCHAR +STARTCHAR U_9152 +ENCODING 37202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +8280 +5FE0 +2AA0 +2CE0 +2820 +CFE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_9153 +ENCODING 37203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1900 +2480 +DF60 +0200 +FFE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9154 +ENCODING 37204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FF80 +5280 +FAA0 +AAA0 +FD60 +8900 +FFE0 +8900 +F900 +8900 +ENDCHAR +STARTCHAR U_9155 +ENCODING 37205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +5700 +5100 +F900 +AFE0 +D900 +8900 +FFE0 +8900 +F920 +88E0 +ENDCHAR +STARTCHAR U_9156 +ENCODING 37206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +53E0 +FAA0 +AC80 +D880 +8980 +F980 +8AA0 +FAA0 +8C60 +ENDCHAR +STARTCHAR U_9157 +ENCODING 37207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +5140 +52A0 +FAA0 +AAA0 +DAA0 +8B60 +FB20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9158 +ENCODING 37208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +5240 +FA60 +AC00 +DFC0 +8A40 +F940 +8880 +F940 +8E20 +ENDCHAR +STARTCHAR U_9159 +ENCODING 37209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +2240 +F940 +A840 +AA40 +D940 +8840 +FFE0 +8840 +8840 +F840 +ENDCHAR +STARTCHAR U_915A +ENCODING 37210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +5240 +FA40 +AC20 +DBC0 +8940 +F940 +8A40 +FD40 +8880 +ENDCHAR +STARTCHAR U_915B +ENCODING 37211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5000 +5000 +FFE0 +AA80 +FA80 +8A80 +FA80 +8AA0 +FCA0 +8860 +ENDCHAR +STARTCHAR U_915C +ENCODING 37212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +FFC0 +A900 +A900 +DFE0 +8900 +FA80 +8A80 +FC40 +8820 +ENDCHAR +STARTCHAR U_915D +ENCODING 37213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +53E0 +5000 +F800 +AFE0 +D900 +8900 +F940 +8A20 +FFE0 +8820 +ENDCHAR +STARTCHAR U_915E +ENCODING 37214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +5100 +FFE0 +A900 +D900 +8900 +FA80 +8A80 +8D40 +F820 +ENDCHAR +STARTCHAR U_915F +ENCODING 37215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +50E0 +F880 +A880 +DBE0 +8A20 +FA20 +8A20 +8BE0 +FA20 +ENDCHAR +STARTCHAR U_9160 +ENCODING 37216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5020 +5020 +FBA0 +AAA0 +DAA0 +8BA0 +F820 +8820 +8820 +F860 +ENDCHAR +STARTCHAR U_9161 +ENCODING 37217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +5220 +F900 +A920 +A940 +D980 +8900 +F920 +8920 +F8E0 +ENDCHAR +STARTCHAR U_9162 +ENCODING 37218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5100 +51E0 +FB00 +ADE0 +A900 +D900 +89E0 +F900 +8900 +F900 +ENDCHAR +STARTCHAR U_9163 +ENCODING 37219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +5240 +5240 +FFE0 +AA40 +DA40 +8BC0 +8A40 +FA40 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_9164 +ENCODING 37220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +53E0 +F880 +A880 +DBE0 +8A20 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9165 +ENCODING 37221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +5380 +5080 +F880 +AFE0 +D880 +89C0 +FAC0 +8CA0 +F8A0 +8880 +ENDCHAR +STARTCHAR U_9166 +ENCODING 37222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAC0 +52A0 +FFE0 +A900 +A9E0 +DB20 +8D40 +F880 +8940 +FE20 +ENDCHAR +STARTCHAR U_9167 +ENCODING 37223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5420 +F840 +AFE0 +F840 +8A40 +F940 +8840 +F840 +88C0 +ENDCHAR +STARTCHAR U_9168 +ENCODING 37224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +10A0 +FFE0 +2880 +FEA0 +AAA0 +EEA0 +8240 +FE40 +83A0 +FE20 +ENDCHAR +STARTCHAR U_9169 +ENCODING 37225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5220 +FD40 +A880 +D900 +8BE0 +FD20 +8920 +F9E0 +8920 +ENDCHAR +STARTCHAR U_916A +ENCODING 37226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5340 +FC80 +A940 +DA20 +8FE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_916B +ENCODING 37227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +5280 +FC40 +AFE0 +A900 +D900 +8BC0 +F900 +8900 +FFE0 +ENDCHAR +STARTCHAR U_916C +ENCODING 37228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +52A0 +52A0 +FAA0 +ABE0 +DEA0 +8AA0 +FAA0 +8AA0 +FAA0 +8C20 +ENDCHAR +STARTCHAR U_916D +ENCODING 37229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5100 +FBE0 +AE20 +ABE0 +DA20 +8BE0 +FA20 +8A20 +FA60 +ENDCHAR +STARTCHAR U_916E +ENCODING 37230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABA0 +DAA0 +8AA0 +FBA0 +8A20 +FA20 +8A60 +ENDCHAR +STARTCHAR U_916F +ENCODING 37231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +5260 +5380 +FA20 +A9E0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_9170 +ENCODING 37232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5280 +53E0 +FC80 +A880 +DFE0 +8940 +F940 +8940 +FA40 +8C60 +ENDCHAR +STARTCHAR U_9171 +ENCODING 37233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +37C0 +DC80 +1300 +FFE0 +0A00 +7FC0 +4A40 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9172 +ENCODING 37234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +5220 +FBE0 +A800 +ABE0 +D880 +8BE0 +F880 +8880 +FFE0 +ENDCHAR +STARTCHAR U_9173 +ENCODING 37235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5140 +5280 +F920 +ABE0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8A60 +ENDCHAR +STARTCHAR U_9174 +ENCODING 37236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +5240 +5420 +FBE0 +A880 +DFE0 +8880 +FAC0 +8CA0 +F880 +8980 +ENDCHAR +STARTCHAR U_9175 +ENCODING 37237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57A0 +5140 +FFE0 +A900 +DFE0 +8A40 +FC80 +8FE0 +F880 +8980 +ENDCHAR +STARTCHAR U_9176 +ENCODING 37238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +5400 +FFC0 +AD40 +DFE0 +8D40 +FD40 +8FE0 +F840 +8980 +ENDCHAR +STARTCHAR U_9177 +ENCODING 37239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +53E0 +FC80 +A880 +DBE0 +8800 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9178 +ENCODING 37240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5240 +57A0 +FA40 +AC20 +D9C0 +8940 +FB40 +8C80 +F940 +8A20 +ENDCHAR +STARTCHAR U_9179 +ENCODING 37241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +57A0 +5520 +FAC0 +A840 +DFE0 +8A40 +F940 +8840 +F940 +8880 +ENDCHAR +STARTCHAR U_917A +ENCODING 37242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +53E0 +5080 +FBE0 +AAA0 +DBE0 +8AA0 +FBE0 +8AA0 +FAA0 +8AE0 +ENDCHAR +STARTCHAR U_917B +ENCODING 37243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FBA0 +2520 +FAC0 +A800 +ABC0 +D880 +8FE0 +F880 +8880 +F980 +ENDCHAR +STARTCHAR U_917C +ENCODING 37244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +FA40 +AFE0 +A820 +DD40 +8D40 +FD40 +8D40 +F960 +ENDCHAR +STARTCHAR U_917D +ENCODING 37245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5540 +5360 +F940 +ABE0 +DA00 +8A00 +FA00 +8A00 +FA00 +8C00 +ENDCHAR +STARTCHAR U_917E +ENCODING 37246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5000 +53E0 +FAA0 +AAA0 +DBA0 +8AE0 +FAA0 +8AA0 +FAA0 +8AE0 +ENDCHAR +STARTCHAR U_917F +ENCODING 37247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +53C0 +5240 +FBC0 +AA40 +DBC0 +8AA0 +FAC0 +8A40 +FAA0 +8B20 +ENDCHAR +STARTCHAR U_9180 +ENCODING 37248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +57E0 +FA80 +ABE0 +DA80 +8A80 +FBE0 +8A80 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_9181 +ENCODING 37249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +53C0 +F840 +AFE0 +DCA0 +8AC0 +F980 +8AC0 +FCA0 +8980 +ENDCHAR +STARTCHAR U_9182 +ENCODING 37250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +5240 +57E0 +FA40 +AA40 +DB40 +8EE0 +FB60 +8A40 +FA40 +8A40 +ENDCHAR +STARTCHAR U_9183 +ENCODING 37251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5280 +FD40 +AFE0 +DD40 +8FC0 +FD40 +8FC0 +F920 +88E0 +ENDCHAR +STARTCHAR U_9184 +ENCODING 37252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +5420 +FBA0 +AD20 +DFE0 +8920 +FD60 +8FE0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9185 +ENCODING 37253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5220 +F940 +AFE0 +D800 +8BE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9186 +ENCODING 37254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +57C0 +F940 +A9A0 +DE60 +8A80 +FFE0 +8940 +F9A0 +8E60 +ENDCHAR +STARTCHAR U_9187 +ENCODING 37255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FBC0 +A800 +DBE0 +8840 +FFE0 +8880 +F880 +8B80 +ENDCHAR +STARTCHAR U_9188 +ENCODING 37256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +2380 +FA80 +AC60 +A900 +DD40 +8B80 +F980 +8A60 +FC40 +ENDCHAR +STARTCHAR U_9189 +ENCODING 37257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FA40 +ADA0 +D880 +8880 +FFE0 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_918A +ENCODING 37258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +55A0 +5240 +FDA0 +A800 +DFE0 +8DA0 +FDA0 +8A40 +FA40 +8DA0 +ENDCHAR +STARTCHAR U_918B +ENCODING 37259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +5140 +57E0 +F940 +AFE0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_918C +ENCODING 37260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABE0 +DA80 +8BA0 +FAC0 +8A80 +FBA0 +8AE0 +ENDCHAR +STARTCHAR U_918D +ENCODING 37261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +53C0 +FA40 +ABC0 +D800 +8FE0 +F880 +8AE0 +FD80 +88E0 +ENDCHAR +STARTCHAR U_918E +ENCODING 37262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F8A0 +27E0 +F880 +AF80 +A8A0 +DFA0 +89C0 +FFC0 +88A0 +F920 +ENDCHAR +STARTCHAR U_918F +ENCODING 37263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +53E0 +5140 +FFE0 +A900 +DBE0 +8E20 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9190 +ENCODING 37264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAE0 +52A0 +57A0 +FAE0 +AAA0 +DFA0 +8CE0 +FCA0 +8FA0 +F920 +8A60 +ENDCHAR +STARTCHAR U_9191 +ENCODING 37265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5120 +55C0 +FD00 +ABE0 +DA40 +8BC0 +FA40 +8BC0 +FA40 +8AC0 +ENDCHAR +STARTCHAR U_9192 +ENCODING 37266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABE0 +DA80 +8BE0 +FC80 +8BE0 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9193 +ENCODING 37267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5520 +F980 +AAA0 +DCE0 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_9194 +ENCODING 37268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1380 +7D00 +3A80 +5440 +FFE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9195 +ENCODING 37269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2000 +F9C0 +A940 +A940 +DBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_9196 +ENCODING 37270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +FBC0 +AA40 +ABC0 +D800 +8FE0 +FAA0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_9197 +ENCODING 37271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7A0 +2540 +FA40 +AC20 +AFC0 +DA80 +8FC0 +FA80 +8AA0 +FC60 +ENDCHAR +STARTCHAR U_9198 +ENCODING 37272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2100 +FFE0 +AA40 +AFE0 +D800 +8FE0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_9199 +ENCODING 37273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +56E0 +54A0 +FFE0 +ACA0 +DFE0 +8880 +FFE0 +8A40 +F980 +8E60 +ENDCHAR +STARTCHAR U_919A +ENCODING 37274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +55A0 +52C0 +FE80 +ABE0 +DA80 +8AC0 +FBA0 +8A80 +FA80 +8DE0 +ENDCHAR +STARTCHAR U_919B +ENCODING 37275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +57E0 +5240 +F980 +AA40 +DC20 +8BE0 +F880 +8BE0 +F880 +8FE0 +ENDCHAR +STARTCHAR U_919C +ENCODING 37276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5520 +FFE0 +AD20 +DFE0 +8940 +F9A0 +8AE0 +FAA0 +8CE0 +ENDCHAR +STARTCHAR U_919D +ENCODING 37277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +53E0 +5080 +FBE0 +A880 +DFE0 +8900 +FBE0 +8C80 +F880 +8FE0 +ENDCHAR +STARTCHAR U_919E +ENCODING 37278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +52A0 +52A0 +FB60 +ABE0 +A800 +DFE0 +8AA0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_919F +ENCODING 37279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +2980 +4640 +FFE0 +8A20 +7FC0 +5240 +61C0 +4E40 +7FC0 +ENDCHAR +STARTCHAR U_91A0 +ENCODING 37280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +52A0 +FFE0 +A880 +D940 +8A20 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_91A1 +ENCODING 37281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +55A0 +FA40 +ABE0 +DD00 +89E0 +F900 +89E0 +F900 +8900 +ENDCHAR +STARTCHAR U_91A2 +ENCODING 37282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5100 +FBC0 +AE40 +ABC0 +D800 +8FE0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_91A3 +ENCODING 37283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5540 +FFE0 +AD40 +DFC0 +8D00 +FFC0 +8A40 +FBC0 +8A40 +ENDCHAR +STARTCHAR U_91A4 +ENCODING 37284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5540 +3FE0 +D240 +11C0 +7FE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_91A5 +ENCODING 37285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +57E0 +FAA0 +AFE0 +A800 +DBC0 +8800 +FFE0 +8AC0 +FDA0 +ENDCHAR +STARTCHAR U_91A6 +ENCODING 37286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +27C0 +FA40 +ADA0 +AFE0 +DA40 +8D20 +FA80 +8940 +F880 +8B00 +ENDCHAR +STARTCHAR U_91A7 +ENCODING 37287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5200 +53C0 +FA40 +ABC0 +DA00 +8BE0 +FAA0 +8BE0 +FA00 +8BE0 +ENDCHAR +STARTCHAR U_91A8 +ENCODING 37288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +5360 +FAA0 +AB60 +DBE0 +8880 +FBE0 +8AA0 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_91A9 +ENCODING 37289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA80 +2FE0 +FAA0 +AFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_91AA +ENCODING 37290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +55A0 +5360 +FCA0 +A980 +DA40 +8D20 +FA80 +8940 +F880 +8F00 +ENDCHAR +STARTCHAR U_91AB +ENCODING 37291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9140 +FFE0 +9940 +A480 +FFE0 +4A40 +71C0 +4E40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_91AC +ENCODING 37292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +7540 +1D40 +F7E0 +5240 +FFE0 +4A40 +73C0 +5E40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_91AD +ENCODING 37293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +52C0 +57E0 +FA40 +AFE0 +D900 +8FE0 +F900 +8FE0 +FA40 +8C20 +ENDCHAR +STARTCHAR U_91AE +ENCODING 37294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +53E0 +5680 +FBE0 +AA80 +DBE0 +8A80 +FBE0 +8D40 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91AF +ENCODING 37295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FFE0 +AB40 +DB40 +8D60 +F800 +8FE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_91B0 +ENCODING 37296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +5FE0 +FAA0 +AFE0 +DA40 +8BC0 +FA40 +8FE0 +F880 +8880 +ENDCHAR +STARTCHAR U_91B1 +ENCODING 37297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +55A0 +52C0 +FC40 +AEE0 +D920 +8FE0 +FCA0 +8E40 +FAA0 +8D20 +ENDCHAR +STARTCHAR U_91B2 +ENCODING 37298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8800 +FFE0 +8AA0 +FA40 +8B20 +ENDCHAR +STARTCHAR U_91B3 +ENCODING 37299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +52A0 +56A0 +FFE0 +A880 +DFE0 +8A40 +FFE0 +8880 +FFE0 +8880 +ENDCHAR +STARTCHAR U_91B4 +ENCODING 37300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +F980 +8FE0 +ENDCHAR +STARTCHAR U_91B5 +ENCODING 37301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +5100 +57E0 +FD20 +AFC0 +DD20 +8FE0 +FD00 +8EA0 +FDC0 +8AA0 +ENDCHAR +STARTCHAR U_91B6 +ENCODING 37302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA40 +2420 +FBC0 +A800 +AFE0 +DDA0 +8FE0 +FA40 +8A40 +FDA0 +ENDCHAR +STARTCHAR U_91B7 +ENCODING 37303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FFE0 +AA40 +DBC0 +8A40 +FBC0 +8AA0 +FE40 +89C0 +ENDCHAR +STARTCHAR U_91B8 +ENCODING 37304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +FAA0 +AFC0 +DA80 +8FE0 +FA80 +8EA0 +FB40 +8A20 +ENDCHAR +STARTCHAR U_91B9 +ENCODING 37305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +57E0 +FD20 +ABA0 +DD40 +8FE0 +F900 +8FE0 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91BA +ENCODING 37306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +57E0 +FAA0 +AFE0 +D880 +8BE0 +F880 +8FE0 +F940 +8AA0 +ENDCHAR +STARTCHAR U_91BB +ENCODING 37307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2100 +FFE0 +A940 +D900 +8FE0 +F840 +8FE0 +FA40 +88C0 +ENDCHAR +STARTCHAR U_91BC +ENCODING 37308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +5280 +FB80 +AA40 +DFE0 +8A40 +FFE0 +8800 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91BD +ENCODING 37309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +57E0 +FD20 +AB40 +DD20 +8FE0 +FAA0 +8AA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_91BE +ENCODING 37310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5540 +FFE0 +AD40 +DFE0 +8EA0 +FDC0 +8FE0 +F9C0 +8AA0 +ENDCHAR +STARTCHAR U_91BF +ENCODING 37311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A40 +FFE0 +AAC0 +DD20 +8BC0 +FA40 +8FE0 +F540 +1920 +ENDCHAR +STARTCHAR U_91C0 +ENCODING 37312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +55A0 +FFE0 +AA80 +DFE0 +8A80 +FFE0 +8AA0 +FE40 +8B20 +ENDCHAR +STARTCHAR U_91C1 +ENCODING 37313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5140 +7FC0 +5540 +FFE0 +AAA0 +3F80 +1080 +3F80 +C960 +3300 +ENDCHAR +STARTCHAR U_91C2 +ENCODING 37314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +52A0 +57E0 +FAA0 +AFE0 +D920 +8FE0 +F920 +8FA0 +FA20 +8D60 +ENDCHAR +STARTCHAR U_91C3 +ENCODING 37315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5000 +57E0 +FD20 +AFE0 +DAA0 +8FE0 +FAA0 +8BC0 +FAA0 +8BE0 +ENDCHAR +STARTCHAR U_91C4 +ENCODING 37316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +2540 +F7E0 +B540 +B760 +D400 +9760 +F540 +9760 +F940 +ENDCHAR +STARTCHAR U_91C5 +ENCODING 37317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +5AA0 +5FE0 +FA80 +AFE0 +D920 +8F20 +F9A0 +8F40 +F940 +89A0 +ENDCHAR +STARTCHAR U_91C6 +ENCODING 37318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C40 +2480 +1500 +7FE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_91C7 +ENCODING 37319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +7840 +2480 +1100 +0400 +FFE0 +0E00 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_91C8 +ENCODING 37320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +EBC0 +AA40 +7240 +FBC0 +2300 +7280 +AA80 +A440 +2460 +2840 +ENDCHAR +STARTCHAR U_91C9 +ENCODING 37321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +A900 +77E0 +FD20 +6520 +77E0 +AD20 +A520 +27E0 +2420 +ENDCHAR +STARTCHAR U_91CA +ENCODING 37322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E280 +A900 +7280 +FD60 +3100 +6FC0 +A100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_91CB +ENCODING 37323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2AA0 +AFE0 +7100 +FFE0 +2280 +77E0 +6900 +A7E0 +A100 +2100 +ENDCHAR +STARTCHAR U_91CC +ENCODING 37324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91CD +ENCODING 37325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91CE +ENCODING 37326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A840 +F980 +A880 +AFE0 +F8A0 +2080 +F880 +2080 +3880 +C380 +ENDCHAR +STARTCHAR U_91CF +ENCODING 37327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91D0 +ENCODING 37328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FC80 +A940 +FFE0 +5240 +5FC0 +5240 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_91D1 +ENCODING 37329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +7FC0 +0400 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91D2 +ENCODING 37330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 0 -1 +BITMAP +10 +28 +44 +FE +10 +7C +10 +54 +38 +1C +E0 +ENDCHAR +STARTCHAR U_91D3 +ENCODING 37331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +7900 +2100 +F900 +2100 +A900 +7120 +3920 +C0E0 +ENDCHAR +STARTCHAR U_91D4 +ENCODING 37332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5020 +8840 +F840 +2080 +F880 +2100 +A900 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91D5 +ENCODING 37333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5040 +8880 +7880 +2080 +F880 +2080 +A880 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91D6 +ENCODING 37334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +44A0 +BCA0 +10A0 +7CA0 +1120 +5520 +3A20 +1AA0 +6440 +ENDCHAR +STARTCHAR U_91D7 +ENCODING 37335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +4520 +BD20 +1120 +7D20 +1120 +5520 +3920 +1C20 +E060 +ENDCHAR +STARTCHAR U_91D8 +ENCODING 37336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7880 +2080 +F880 +2080 +A880 +7080 +3880 +C380 +ENDCHAR +STARTCHAR U_91D9 +ENCODING 37337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +FD80 +2140 +F920 +2120 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_91DA +ENCODING 37338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8F80 +FA80 +2280 +FA80 +2280 +AA80 +72A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_91DB +ENCODING 37339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +4500 +BBE0 +1120 +7920 +1520 +5920 +3220 +1AA0 +6440 +ENDCHAR +STARTCHAR U_91DC +ENCODING 37340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +5240 +0C00 +1300 +E0E0 +3F80 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91DD +ENCODING 37341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8880 +7880 +27E0 +F880 +2080 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_91DE +ENCODING 37342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4900 +F100 +2100 +F900 +2280 +AA80 +7240 +3460 +C840 +ENDCHAR +STARTCHAR U_91DF +ENCODING 37343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3280 +4A80 +F680 +2280 +FE80 +2280 +AA80 +7440 +3440 +C820 +ENDCHAR +STARTCHAR U_91E0 +ENCODING 37344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1380 +2A80 +4680 +FA80 +1280 +7A80 +1680 +5AA0 +34A0 +C860 +ENDCHAR +STARTCHAR U_91E1 +ENCODING 37345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +64C0 +0A40 +1100 +2080 +DF60 +0400 +1F00 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91E2 +ENCODING 37346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5240 +8A40 +7A80 +22E0 +FA20 +2220 +AA20 +7220 +3CA0 +E840 +ENDCHAR +STARTCHAR U_91E3 +ENCODING 37347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +89E0 +7A20 +2420 +F920 +20A0 +A8A0 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_91E4 +ENCODING 37348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5080 +8900 +7A20 +2040 +F880 +2300 +A820 +7040 +3880 +C300 +ENDCHAR +STARTCHAR U_91E5 +ENCODING 37349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F880 +22C0 +FAA0 +24A0 +A8A0 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91E6 +ENCODING 37350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +FA20 +2220 +FA20 +2220 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_91E7 +ENCODING 37351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +52A0 +8AA0 +7AA0 +22A0 +FAA0 +22A0 +AAA0 +72A0 +3C20 +E020 +ENDCHAR +STARTCHAR U_91E8 +ENCODING 37352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4880 +F880 +2080 +FFE0 +2080 +A880 +7080 +3880 +C380 +ENDCHAR +STARTCHAR U_91E9 +ENCODING 37353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +3480 +4C80 +FC80 +2680 +FD80 +2480 +AC80 +74A0 +38A0 +D060 +ENDCHAR +STARTCHAR U_91EA +ENCODING 37354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3080 +4880 +F880 +27E0 +F880 +2080 +A880 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91EB +ENCODING 37355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3000 +4800 +FFE0 +2200 +FA00 +23E0 +A820 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_91EC +ENCODING 37356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4880 +F880 +2080 +FFE0 +2080 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_91ED +ENCODING 37357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4880 +F880 +2080 +FC80 +2080 +A880 +7080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_91EE +ENCODING 37358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3040 +4840 +FFE0 +2040 +FCC0 +2140 +AA40 +7440 +3940 +C080 +ENDCHAR +STARTCHAR U_91EF +ENCODING 37359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4FE0 +F200 +2200 +FA00 +2200 +AA00 +7200 +3A00 +C3E0 +ENDCHAR +STARTCHAR U_91F0 +ENCODING 37360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +48A0 +F0A0 +22A0 +FAA0 +2120 +A920 +7220 +3AA0 +C440 +ENDCHAR +STARTCHAR U_91F1 +ENCODING 37361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FBE0 +2080 +F880 +2080 +A880 +7140 +3A20 +E420 +ENDCHAR +STARTCHAR U_91F2 +ENCODING 37362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +FA40 +2240 +FBC0 +2200 +AA00 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91F3 +ENCODING 37363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31E0 +4A00 +FC00 +23C0 +F880 +2100 +A900 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91F4 +ENCODING 37364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5140 +8920 +7BE0 +2100 +FD00 +2100 +A8A0 +70A0 +3860 +C020 +ENDCHAR +STARTCHAR U_91F5 +ENCODING 37365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8A20 +7B20 +22A0 +F940 +2140 +A880 +7140 +3A40 +C420 +ENDCHAR +STARTCHAR U_91F6 +ENCODING 37366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4D00 +FFC0 +2540 +FD40 +2540 +ADC0 +7500 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_91F7 +ENCODING 37367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8880 +7880 +23E0 +FC80 +2080 +A880 +7080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_91F8 +ENCODING 37368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F920 +2220 +FD40 +2140 +A880 +7100 +3A00 +C400 +ENDCHAR +STARTCHAR U_91F9 +ENCODING 37369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +7BE0 +2140 +FA40 +2240 +A940 +7080 +3940 +C620 +ENDCHAR +STARTCHAR U_91FA +ENCODING 37370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3300 +4900 +F100 +27E0 +F900 +2100 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_91FB +ENCODING 37371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4A00 +F780 +2280 +FA80 +2680 +AA80 +73A0 +3CA0 +C060 +ENDCHAR +STARTCHAR U_91FC +ENCODING 37372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4A40 +F240 +2640 +FA40 +2340 +AAC0 +7460 +3D40 +C080 +ENDCHAR +STARTCHAR U_91FD +ENCODING 37373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +5740 +8D40 +7D40 +2540 +FD40 +2540 +AD40 +7520 +3920 +C920 +ENDCHAR +STARTCHAR U_91FE +ENCODING 37374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4A80 +F480 +27E0 +F980 +2280 +AA80 +7480 +3A80 +C100 +ENDCHAR +STARTCHAR U_91FF +ENCODING 37375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +8A00 +7A00 +23E0 +FA40 +2240 +AA40 +7240 +3440 +C840 +ENDCHAR +STARTCHAR U_9200 +ENCODING 37376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4D40 +F540 +2540 +FFC0 +2400 +AC00 +7420 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_9201 +ENCODING 37377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A00 +2200 +FBE0 +2220 +AA20 +7220 +3C20 +C8C0 +ENDCHAR +STARTCHAR U_9202 +ENCODING 37378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FE0 +7D20 +2100 +F980 +2180 +AA80 +72A0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_9203 +ENCODING 37379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3240 +4A40 +FA40 +27E0 +FA40 +2240 +AA40 +7240 +3C40 +C840 +ENDCHAR +STARTCHAR U_9204 +ENCODING 37380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3240 +4940 +F840 +2240 +F940 +20E0 +AF40 +7040 +3840 +C040 +ENDCHAR +STARTCHAR U_9205 +ENCODING 37381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3420 +C860 +ENDCHAR +STARTCHAR U_9206 +ENCODING 37382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5280 +8A40 +7A40 +2420 +F900 +2100 +AA00 +7240 +3C40 +C7E0 +ENDCHAR +STARTCHAR U_9207 +ENCODING 37383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F880 +2080 +FFE0 +2080 +A940 +7140 +3A40 +C420 +ENDCHAR +STARTCHAR U_9208 +ENCODING 37384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4900 +F100 +2380 +FB40 +2520 +A920 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_9209 +ENCODING 37385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +FD20 +25A0 +AE60 +7420 +3C20 +C460 +ENDCHAR +STARTCHAR U_920A +ENCODING 37386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8880 +7200 +2240 +F220 +2A20 +BA00 +6A40 +3240 +C1C0 +ENDCHAR +STARTCHAR U_920B +ENCODING 37387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A80 +F2A0 +26A0 +FAC0 +2280 +AB80 +72A0 +3AA0 +C260 +ENDCHAR +STARTCHAR U_920C +ENCODING 37388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FC0 +F940 +2140 +FFE0 +2100 +A900 +7280 +3440 +C820 +ENDCHAR +STARTCHAR U_920D +ENCODING 37389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4880 +FAA0 +22A0 +FAA0 +23E0 +A880 +70A0 +38A0 +C060 +ENDCHAR +STARTCHAR U_920E +ENCODING 37390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F620 +2120 +F920 +22A0 +ABA0 +7020 +38A0 +C040 +ENDCHAR +STARTCHAR U_920F +ENCODING 37391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23A0 +30A0 +48A0 +FBA0 +2220 +FBA0 +20A0 +A8A0 +70A0 +3AA0 +C120 +ENDCHAR +STARTCHAR U_9210 +ENCODING 37392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4940 +FA20 +2480 +F840 +23E0 +A840 +7040 +3880 +C080 +ENDCHAR +STARTCHAR U_9211 +ENCODING 37393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A00 +FA00 +23E0 +FA20 +2220 +AB40 +7280 +3540 +CA20 +ENDCHAR +STARTCHAR U_9212 +ENCODING 37394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3240 +4A40 +FA80 +22E0 +FA20 +2220 +AB40 +7280 +3540 +CA20 +ENDCHAR +STARTCHAR U_9213 +ENCODING 37395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3700 +4900 +F100 +2100 +FFE0 +2100 +A900 +7100 +3900 +C7C0 +ENDCHAR +STARTCHAR U_9214 +ENCODING 37396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FAC0 +22A0 +FC80 +20A0 +A840 +7080 +3900 +C600 +ENDCHAR +STARTCHAR U_9215 +ENCODING 37397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3140 +4940 +F940 +2140 +FFC0 +2240 +AA40 +7240 +3A40 +C7E0 +ENDCHAR +STARTCHAR U_9216 +ENCODING 37398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A40 +FA40 +2420 +FBC0 +2140 +A940 +7140 +3A40 +C4C0 +ENDCHAR +STARTCHAR U_9217 +ENCODING 37399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A40 +FFE0 +2000 +FA80 +2280 +AA80 +72A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_9218 +ENCODING 37400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F100 +2100 +FFC0 +2440 +AA80 +7100 +3AE0 +C440 +ENDCHAR +STARTCHAR U_9219 +ENCODING 37401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F900 +27C0 +FA40 +2240 +AA80 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_921A +ENCODING 37402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5480 +F4A0 +27C0 +FC80 +2480 +AC80 +75A0 +36A0 +C460 +ENDCHAR +STARTCHAR U_921B +ENCODING 37403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3280 +4A40 +F7E0 +2200 +FA40 +2140 +A980 +71A0 +3A60 +C420 +ENDCHAR +STARTCHAR U_921C +ENCODING 37404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +FFE0 +2200 +FA80 +2280 +AD00 +7540 +3A20 +C7E0 +ENDCHAR +STARTCHAR U_921D +ENCODING 37405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3500 +4D00 +F7C0 +2100 +F900 +27E0 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_921E +ENCODING 37406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BE0 +FC20 +2220 +F920 +20A0 +A920 +7620 +3820 +C0C0 +ENDCHAR +STARTCHAR U_921F +ENCODING 37407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4940 +F140 +27C0 +FD00 +27E0 +A920 +71A0 +3940 +C100 +ENDCHAR +STARTCHAR U_9220 +ENCODING 37408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4A40 +F240 +2420 +FBC0 +2240 +A980 +7180 +3A40 +C420 +ENDCHAR +STARTCHAR U_9221 +ENCODING 37409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F7E0 +24A0 +FCA0 +27E0 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_9222 +ENCODING 37410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7E0 +2100 +FB80 +2340 +AD20 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_9223 +ENCODING 37411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3080 +4880 +FAE0 +2280 +FA80 +23E0 +A820 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_9224 +ENCODING 37412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +FA20 +2220 +FBE0 +2220 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_9225 +ENCODING 37413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4AA0 +FAA0 +22C0 +F880 +2080 +A940 +7140 +3A20 +C420 +ENDCHAR +STARTCHAR U_9226 +ENCODING 37414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +FFE0 +2100 +F900 +2280 +AA80 +7540 +3540 +C820 +ENDCHAR +STARTCHAR U_9227 +ENCODING 37415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F800 +2380 +FA80 +2280 +AA80 +72A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_9228 +ENCODING 37416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4800 +F000 +27C0 +FA80 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_9229 +ENCODING 37417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4BE0 +F220 +23E0 +FA00 +2200 +AA00 +7200 +3C00 +C000 +ENDCHAR +STARTCHAR U_922A +ENCODING 37418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4C00 +F5C0 +2540 +FD40 +25C0 +AD00 +7520 +3D20 +C0E0 +ENDCHAR +STARTCHAR U_922B +ENCODING 37419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2440 +FA80 +2280 +A900 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_922C +ENCODING 37420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +F240 +23C0 +FA00 +2300 +B280 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_922D +ENCODING 37421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1160 +5D80 +5120 +59E0 +E600 +1980 +6F60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_922E +ENCODING 37422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +FBE0 +2200 +FA80 +22A0 +AAC0 +72A0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_922F +ENCODING 37423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4AA0 +F2A0 +22A0 +FBE0 +2080 +ACA0 +74A0 +3CA0 +C7E0 +ENDCHAR +STARTCHAR U_9230 +ENCODING 37424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F900 +27E0 +FD20 +2520 +AD20 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_9231 +ENCODING 37425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3420 +4FE0 +FC80 +2480 +FFE0 +2480 +AC80 +74A0 +3E60 +C420 +ENDCHAR +STARTCHAR U_9232 +ENCODING 37426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +3740 +4D40 +FD40 +2540 +FD40 +2540 +AD40 +7540 +35A0 +C960 +ENDCHAR +STARTCHAR U_9233 +ENCODING 37427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4840 +FF40 +2540 +FD40 +2740 +A840 +7040 +3940 +C080 +ENDCHAR +STARTCHAR U_9234 +ENCODING 37428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4940 +FB20 +24A0 +F800 +23E0 +A840 +7180 +3880 +C040 +ENDCHAR +STARTCHAR U_9235 +ENCODING 37429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4900 +F7E0 +2520 +FD20 +26A0 +AE60 +7420 +3CA0 +C440 +ENDCHAR +STARTCHAR U_9236 +ENCODING 37430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +FA20 +27E0 +F800 +23E0 +AA20 +7220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9237 +ENCODING 37431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FBE0 +2080 +F880 +23E0 +AA20 +7220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9238 +ENCODING 37432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4FE0 +FA00 +2200 +FBC0 +2240 +AB40 +7480 +3540 +CA20 +ENDCHAR +STARTCHAR U_9239 +ENCODING 37433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4FE0 +FCA0 +2480 +FFE0 +2520 +AD40 +7480 +3940 +CA20 +ENDCHAR +STARTCHAR U_923A +ENCODING 37434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4900 +F900 +2100 +FFC0 +2100 +A940 +7120 +3900 +CFE0 +ENDCHAR +STARTCHAR U_923B +ENCODING 37435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +F240 +23C0 +FA00 +23E0 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_923C +ENCODING 37436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4FE0 +F200 +23C0 +FA00 +2200 +ABE0 +7200 +3A00 +C200 +ENDCHAR +STARTCHAR U_923D +ENCODING 37437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4900 +FA80 +27E0 +FAA0 +22A0 +AAA0 +72A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_923E +ENCODING 37438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +FAA0 +22A0 +FAA0 +23E0 +AAA0 +72A0 +3BE0 +C220 +ENDCHAR +STARTCHAR U_923F +ENCODING 37439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +8AA0 +7AA0 +22A0 +FBE0 +22A0 +AAA0 +72A0 +3BE0 +C220 +ENDCHAR +STARTCHAR U_9240 +ENCODING 37440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8AA0 +7BE0 +22A0 +FAA0 +23E0 +AAA0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_9241 +ENCODING 37441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F4C0 +2120 +FE80 +2100 +AE40 +7080 +3900 +C600 +ENDCHAR +STARTCHAR U_9242 +ENCODING 37442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FC0 +F540 +2540 +FFC0 +2500 +AB00 +7100 +3A80 +CC60 +ENDCHAR +STARTCHAR U_9243 +ENCODING 37443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BC0 +F500 +2100 +FFE0 +2100 +AA80 +7280 +3C40 +C820 +ENDCHAR +STARTCHAR U_9244 +ENCODING 37444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A80 +F7E0 +2080 +FFE0 +2080 +A940 +7140 +3A20 +C420 +ENDCHAR +STARTCHAR U_9245 +ENCODING 37445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5200 +8A00 +7BE0 +2220 +FA20 +23E0 +AA20 +7200 +3A00 +E3E0 +ENDCHAR +STARTCHAR U_9246 +ENCODING 37446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +88E0 +7880 +2080 +FBE0 +2220 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9247 +ENCODING 37447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +37E0 +4C00 +F100 +25C0 +FF40 +2540 +AD40 +7580 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_9248 +ENCODING 37448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7C20 +2200 +FA40 +2280 +AB00 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_9249 +ENCODING 37449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7900 +2240 +FB80 +2080 +A900 +7240 +3FA0 +E220 +ENDCHAR +STARTCHAR U_924A +ENCODING 37450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5120 +8920 +7920 +22E0 +FC40 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_924B +ENCODING 37451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C20 +7BA0 +22A0 +FAA0 +23A0 +AA40 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_924C +ENCODING 37452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +8880 +7BE0 +2080 +F980 +22C0 +ACA0 +70A0 +3880 +E080 +ENDCHAR +STARTCHAR U_924D +ENCODING 37453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +50A0 +8A20 +7A40 +2640 +FAC0 +22A0 +AB20 +7240 +3A40 +E5C0 +ENDCHAR +STARTCHAR U_924E +ENCODING 37454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5280 +8A80 +7BE0 +2480 +F880 +23E0 +A880 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_924F +ENCODING 37455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7A40 +23C0 +FA40 +2240 +ABC0 +7240 +3A40 +E7E0 +ENDCHAR +STARTCHAR U_9250 +ENCODING 37456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7900 +2100 +FBE0 +2520 +A920 +7120 +39E0 +E120 +ENDCHAR +STARTCHAR U_9251 +ENCODING 37457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5100 +8BE0 +7A20 +2220 +FBE0 +2220 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9252 +ENCODING 37458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8BE0 +7880 +2080 +F880 +23E0 +A880 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_9253 +ENCODING 37459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7C80 +23E0 +FAA0 +22A0 +AAA0 +72E0 +3880 +E080 +ENDCHAR +STARTCHAR U_9254 +ENCODING 37460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8C80 +77E0 +26A0 +FEA0 +26A0 +AEE0 +7480 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_9255 +ENCODING 37461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4C00 +F5C0 +2540 +FD40 +2540 +ADC0 +7400 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_9256 +ENCODING 37462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8B40 +7C80 +2140 +FA20 +2520 +A880 +7040 +3B00 +E0C0 +ENDCHAR +STARTCHAR U_9257 +ENCODING 37463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8A40 +7FE0 +2240 +FA40 +23C0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_9258 +ENCODING 37464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3280 +4FE0 +F2A0 +27E0 +FE80 +27E0 +AAA0 +72A0 +3AE0 +C480 +ENDCHAR +STARTCHAR U_9259 +ENCODING 37465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +F220 +2220 +FBE0 +2000 +A940 +7120 +3A20 +C420 +ENDCHAR +STARTCHAR U_925A +ENCODING 37466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5AE0 +8AA0 +7AA0 +2AA0 +FAA0 +2EA0 +B2A0 +62E0 +3480 +C880 +ENDCHAR +STARTCHAR U_925B +ENCODING 37467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7A40 +2460 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_925C +ENCODING 37468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3240 +4A40 +F7E0 +2440 +FE40 +2540 +AD40 +7440 +3D40 +C480 +ENDCHAR +STARTCHAR U_925D +ENCODING 37469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3100 +4880 +F7E0 +2000 +FA20 +2120 +A940 +7140 +3800 +C7E0 +ENDCHAR +STARTCHAR U_925E +ENCODING 37470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7C80 +24A0 +FCA0 +24A0 +ACC0 +76A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_925F +ENCODING 37471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4880 +F500 +2100 +FB80 +2540 +A920 +7100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_9260 +ENCODING 37472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8BE0 +7AA0 +22A0 +FAA0 +27E0 +A880 +7140 +3A20 +E420 +ENDCHAR +STARTCHAR U_9261 +ENCODING 37473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +23E0 +F880 +23E0 +A880 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_9262 +ENCODING 37474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7C0 +2100 +FB80 +2540 +A940 +73A0 +3900 +C100 +ENDCHAR +STARTCHAR U_9263 +ENCODING 37475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +2080 +FFE0 +2100 +A900 +7240 +3FA0 +E420 +ENDCHAR +STARTCHAR U_9264 +ENCODING 37476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7C20 +23A0 +FAA0 +22A0 +ABA0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_9265 +ENCODING 37477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +F900 +2380 +FB80 +2540 +AD40 +7520 +3900 +E100 +ENDCHAR +STARTCHAR U_9266 +ENCODING 37478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7880 +2280 +FAE0 +2280 +AA80 +7280 +3A80 +E7E0 +ENDCHAR +STARTCHAR U_9267 +ENCODING 37479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8D40 +7D40 +27E0 +FC40 +2540 +AD40 +77E0 +3840 +E180 +ENDCHAR +STARTCHAR U_9268 +ENCODING 37480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BE0 +F440 +2100 +F540 +2540 +A920 +7120 +3900 +C300 +ENDCHAR +STARTCHAR U_9269 +ENCODING 37481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F460 +2100 +F540 +2540 +A920 +7120 +3900 +C300 +ENDCHAR +STARTCHAR U_926A +ENCODING 37482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3540 +4D40 +F540 +2FE0 +F540 +2540 +ADC0 +7400 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_926B +ENCODING 37483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3400 +4CE0 +FFA0 +25A0 +F5A0 +25A0 +ADA0 +75A0 +39E0 +CB00 +ENDCHAR +STARTCHAR U_926C +ENCODING 37484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_926D +ENCODING 37485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +8A20 +7A20 +23E0 +FA20 +2220 +ABE0 +7220 +3800 +E7E0 +ENDCHAR +STARTCHAR U_926E +ENCODING 37486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4FE0 +F4A0 +27E0 +FCA0 +27E0 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_926F +ENCODING 37487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5440 +8D40 +7CC0 +2440 +FC40 +2540 +AE40 +74C0 +3920 +E220 +ENDCHAR +STARTCHAR U_9270 +ENCODING 37488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +8BA0 +7820 +23A0 +FAA0 +22A0 +ABA0 +7020 +3820 +E0E0 +ENDCHAR +STARTCHAR U_9271 +ENCODING 37489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4FE0 +F400 +2480 +FC80 +2480 +AD00 +7540 +3BE0 +C820 +ENDCHAR +STARTCHAR U_9272 +ENCODING 37490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +89E0 +7900 +27E0 +F900 +2100 +A980 +7140 +3920 +E100 +ENDCHAR +STARTCHAR U_9273 +ENCODING 37491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3280 +4A80 +F6E0 +2280 +FA80 +2280 +AA80 +7680 +3AA0 +C260 +ENDCHAR +STARTCHAR U_9274 +ENCODING 37492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +93E0 +9500 +9480 +0A00 +3180 +DF60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9275 +ENCODING 37493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7C0 +2540 +FD40 +27C0 +A900 +7140 +39E0 +C620 +ENDCHAR +STARTCHAR U_9276 +ENCODING 37494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +5A20 +8AA0 +FAA0 +4FA0 +FAA0 +4AA0 +5AA0 +EA20 +4A20 +F260 +ENDCHAR +STARTCHAR U_9277 +ENCODING 37495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3240 +4A40 +F7E0 +2240 +FA40 +27E0 +A800 +7240 +3A20 +C420 +ENDCHAR +STARTCHAR U_9278 +ENCODING 37496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A40 +2420 +FA40 +2140 +A880 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_9279 +ENCODING 37497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8A20 +7940 +2080 +FB80 +20E0 +AB20 +70A0 +3C40 +E380 +ENDCHAR +STARTCHAR U_927A +ENCODING 37498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8A40 +7BC0 +2240 +FBC0 +2240 +AA60 +77C0 +3840 +E040 +ENDCHAR +STARTCHAR U_927B +ENCODING 37499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8C40 +7A80 +2180 +FA40 +27E0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_927C +ENCODING 37500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +5140 +8FE0 +7940 +2140 +F940 +27E0 +A940 +7140 +3A40 +E440 +ENDCHAR +STARTCHAR U_927D +ENCODING 37501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7880 +2780 +FA80 +2280 +AAA0 +73A0 +3C60 +E020 +ENDCHAR +STARTCHAR U_927E +ENCODING 37502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +8FA0 +7820 +2280 +FBE0 +2480 +AFE0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_927F +ENCODING 37503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +8A20 +7C00 +23E0 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9280 +ENCODING 37504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FD00 +2520 +AD40 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_9281 +ENCODING 37505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33E0 +4C20 +F3A0 +22A0 +FBA0 +22A0 +ABA0 +7020 +3CA0 +C040 +ENDCHAR +STARTCHAR U_9282 +ENCODING 37506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +52A0 +8AA0 +7AA0 +27E0 +FAA0 +22A0 +AAA0 +72A0 +3CA0 +E0A0 +ENDCHAR +STARTCHAR U_9283 +ENCODING 37507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7A40 +27A0 +F800 +2280 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_9284 +ENCODING 37508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3200 +4FE0 +F420 +25E0 +FD60 +2560 +ADE0 +7420 +3C20 +C460 +ENDCHAR +STARTCHAR U_9285 +ENCODING 37509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FA0 +7C20 +27A0 +FEA0 +26A0 +AFA0 +7420 +3C20 +E460 +ENDCHAR +STARTCHAR U_9286 +ENCODING 37510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8900 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9287 +ENCODING 37511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8880 +7BE0 +2080 +FFE0 +2080 +A9C0 +72A0 +3CA0 +E080 +ENDCHAR +STARTCHAR U_9288 +ENCODING 37512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FC0 +7900 +27E0 +F900 +2100 +AFC0 +7100 +3900 +E7E0 +ENDCHAR +STARTCHAR U_9289 +ENCODING 37513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4940 +F7E0 +2140 +FBC0 +2100 +ABC0 +7100 +3BE0 +C100 +ENDCHAR +STARTCHAR U_928A +ENCODING 37514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7C80 +24A0 +FEA0 +24C0 +AC80 +74A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_928B +ENCODING 37515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5220 +8DC0 +7C80 +2480 +FFE0 +2480 +AC80 +7480 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_928C +ENCODING 37516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7AE0 +2220 +FA40 +23E0 +AA40 +7240 +3A40 +E2C0 +ENDCHAR +STARTCHAR U_928D +ENCODING 37517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5100 +8900 +7A40 +27A0 +F920 +2100 +AFC0 +7100 +3900 +E7E0 +ENDCHAR +STARTCHAR U_928E +ENCODING 37518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +2480 +3EA0 +E5A0 +06E0 +3180 +DF60 +0400 +7FC0 +2480 +FFE0 +ENDCHAR +STARTCHAR U_928F +ENCODING 37519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +5AA0 +FAA0 +2AA0 +FFE0 +2AA0 +BAA0 +6AA0 +3AA0 +D760 +ENDCHAR +STARTCHAR U_9290 +ENCODING 37520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +2140 +7940 +A940 +3440 +CAC0 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9291 +ENCODING 37521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5500 +8FC0 +7900 +2100 +FFE0 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_9292 +ENCODING 37522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +36E0 +4C40 +F440 +2EE0 +FC40 +2440 +A440 +7440 +3C40 +C840 +ENDCHAR +STARTCHAR U_9293 +ENCODING 37523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3280 +4C40 +F820 +27C0 +F900 +2100 +B7C0 +6100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_9294 +ENCODING 37524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +89C0 +7AA0 +24A0 +F800 +2080 +B7E0 +6080 +3880 +C080 +ENDCHAR +STARTCHAR U_9295 +ENCODING 37525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2120 +FFE0 +2500 +AFE0 +7160 +3A80 +EC60 +ENDCHAR +STARTCHAR U_9296 +ENCODING 37526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7C80 +2080 +FFE0 +2180 +AAC0 +74A0 +38A0 +E080 +ENDCHAR +STARTCHAR U_9297 +ENCODING 37527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +8A00 +7BE0 +2200 +FA00 +23E0 +AB20 +7520 +3DE0 +E120 +ENDCHAR +STARTCHAR U_9298 +ENCODING 37528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8A20 +7D40 +2080 +F900 +23E0 +AE20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9299 +ENCODING 37529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7DA0 +2000 +FBE0 +2100 +ABE0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_929A +ENCODING 37530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +52A0 +8EA0 +7AC0 +2280 +FAC0 +26A0 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_929B +ENCODING 37531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +8880 +7BE0 +2080 +F880 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_929C +ENCODING 37532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +4A00 +9F00 +24E0 +5F40 +4440 +D540 +4E40 +4440 +4740 +58C0 +ENDCHAR +STARTCHAR U_929D +ENCODING 37533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8C80 +7FE0 +2480 +FC80 +25C0 +AEA0 +74A0 +3C80 +E480 +ENDCHAR +STARTCHAR U_929E +ENCODING 37534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +6140 +BF40 +2140 +3F40 +0AC0 +1F00 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_929F +ENCODING 37535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4AA0 +F3E0 +2080 +FBE0 +22A0 +AAA0 +72A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_92A0 +ENCODING 37536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57A0 +8940 +7980 +27E0 +FA00 +2240 +AF80 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_92A1 +ENCODING 37537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +23E0 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92A2 +ENCODING 37538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5000 +8FE0 +7800 +20A0 +FFC0 +2280 +AAC0 +74A0 +3AA0 +E100 +ENDCHAR +STARTCHAR U_92A3 +ENCODING 37539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +64E0 +9FA0 +EAA0 +4AA0 +FAA0 +4AA0 +E4A0 +46A0 +75E0 +88A0 +ENDCHAR +STARTCHAR U_92A4 +ENCODING 37540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +27E0 +F880 +21C0 +AAA0 +74A0 +3880 +E080 +ENDCHAR +STARTCHAR U_92A5 +ENCODING 37541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7880 +21A0 +FAC0 +2680 +AA40 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92A6 +ENCODING 37542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8CA0 +7FE0 +24A0 +FCA0 +24A0 +AD60 +7620 +3FE0 +E420 +ENDCHAR +STARTCHAR U_92A7 +ENCODING 37543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5520 +8B40 +7900 +27E0 +FA80 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_92A8 +ENCODING 37544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7D20 +2100 +FFE0 +2240 +AA40 +7180 +3940 +E620 +ENDCHAR +STARTCHAR U_92A9 +ENCODING 37545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5780 +8880 +7BE0 +2080 +FFE0 +2080 +A900 +7240 +3CE0 +E720 +ENDCHAR +STARTCHAR U_92AA +ENCODING 37546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FE0 +7A00 +23E0 +FE20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_92AB +ENCODING 37547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8A80 +7FE0 +22A0 +FAA0 +23E0 +AA00 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_92AC +ENCODING 37548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53A0 +8940 +7FE0 +2100 +FBE0 +2500 +A9E0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_92AD +ENCODING 37549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4BE0 +F600 +23E0 +F600 +23E0 +AE80 +7120 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92AE +ENCODING 37550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +4620 +0900 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92AF +ENCODING 37551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A40 +F7C0 +2100 +FA40 +27E0 +A920 +7540 +3520 +CB20 +ENDCHAR +STARTCHAR U_92B0 +ENCODING 37552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3240 +4FE0 +F240 +2000 +FA40 +2240 +A940 +7080 +3940 +C620 +ENDCHAR +STARTCHAR U_92B1 +ENCODING 37553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2100 +FFE0 +2520 +AD20 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_92B2 +ENCODING 37554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8BE0 +7A20 +23E0 +F800 +23E0 +A880 +77E0 +3880 +E080 +ENDCHAR +STARTCHAR U_92B3 +ENCODING 37555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5440 +8FE0 +7C40 +2440 +FFC0 +2280 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_92B4 +ENCODING 37556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +23E0 +F280 +2480 +6A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92B5 +ENCODING 37557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53E0 +8A20 +7BE0 +2220 +FBE0 +2220 +AFE0 +7120 +3A20 +E4E0 +ENDCHAR +STARTCHAR U_92B6 +ENCODING 37558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +7900 +2520 +FB40 +2180 +AB40 +7540 +3920 +E320 +ENDCHAR +STARTCHAR U_92B7 +ENCODING 37559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +23E0 +FA20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_92B8 +ENCODING 37560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4A00 +FA80 +2E80 +FA80 +2E80 +BB80 +6EA0 +32A0 +C2E0 +ENDCHAR +STARTCHAR U_92B9 +ENCODING 37561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +7980 +2340 +FD20 +27C0 +AA40 +72E0 +3A20 +E4C0 +ENDCHAR +STARTCHAR U_92BA +ENCODING 37562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2900 +7FE0 +0900 +7BC0 +2C00 +DF00 +24E0 +DF80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_92BB +ENCODING 37563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +7920 +27E0 +FD00 +27E0 +A920 +7360 +3D00 +E100 +ENDCHAR +STARTCHAR U_92BC +ENCODING 37564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5540 +8D40 +7D40 +23A0 +F920 +2100 +AFC0 +7100 +3900 +EFE0 +ENDCHAR +STARTCHAR U_92BD +ENCODING 37565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3780 +4C80 +F7E0 +2480 +FE60 +2020 +AFC0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_92BE +ENCODING 37566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F000 +2100 +F740 +2380 +AB40 +7520 +3900 +C300 +ENDCHAR +STARTCHAR U_92BF +ENCODING 37567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3280 +4900 +F7E0 +2520 +FFE0 +2520 +AFE0 +7520 +3D20 +C440 +ENDCHAR +STARTCHAR U_92C0 +ENCODING 37568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5000 +8BC0 +7A40 +2240 +FBC0 +2000 +AA20 +7140 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92C1 +ENCODING 37569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2000 +F800 +27E0 +AC20 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_92C2 +ENCODING 37570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C00 +7BE0 +22A0 +FFE0 +22A0 +AAA0 +77E0 +3820 +E0C0 +ENDCHAR +STARTCHAR U_92C3 +ENCODING 37571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8A20 +7BE0 +2220 +FBE0 +2280 +AAA0 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92C4 +ENCODING 37572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8AA0 +7CC0 +2180 +FA40 +2420 +ABE0 +7240 +3980 +E660 +ENDCHAR +STARTCHAR U_92C5 +ENCODING 37573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A20 +2140 +FFE0 +2080 +ABE0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_92C6 +ENCODING 37574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2520 +20A0 +F720 +0A40 +7FE0 +0400 +3FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92C7 +ENCODING 37575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FBE0 +2220 +ABE0 +7080 +3940 +E620 +ENDCHAR +STARTCHAR U_92C8 +ENCODING 37576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A200 +5FE0 +C500 +58E0 +4A00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92C9 +ENCODING 37577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2520 +FFE0 +2520 +A900 +7380 +3D40 +E520 +ENDCHAR +STARTCHAR U_92CA +ENCODING 37578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5240 +8C20 +7980 +2240 +FC20 +23C0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_92CB +ENCODING 37579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +52C0 +8A40 +7440 +2F60 +F340 +2540 +AD40 +75E0 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_92CC +ENCODING 37580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +53C0 +8A40 +FA40 +27E0 +FA40 +2240 +AFE0 +7200 +2500 +F8E0 +ENDCHAR +STARTCHAR U_92CD +ENCODING 37581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2820 +FBC0 +2040 +AFE0 +7080 +3A80 +E100 +ENDCHAR +STARTCHAR U_92CE +ENCODING 37582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2000 +FFE0 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_92CF +ENCODING 37583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8940 +7D40 +2540 +FBA0 +2100 +A900 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_92D0 +ENCODING 37584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7900 +27E0 +F900 +2140 +AA40 +7280 +3D20 +E3E0 +ENDCHAR +STARTCHAR U_92D1 +ENCODING 37585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +8FE0 +7940 +2220 +F900 +23C0 +AD40 +7080 +3940 +E620 +ENDCHAR +STARTCHAR U_92D2 +ENCODING 37586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5340 +8C80 +7B60 +2080 +FFE0 +2080 +ABE0 +7080 +3FE0 +E080 +ENDCHAR +STARTCHAR U_92D3 +ENCODING 37587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +5620 +8AA0 +7AA0 +27A0 +FAA0 +27A0 +AAA0 +7220 +3A20 +E260 +ENDCHAR +STARTCHAR U_92D4 +ENCODING 37588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33C0 +4C80 +F7E0 +2520 +FFE0 +2280 +AA80 +72A0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_92D5 +ENCODING 37589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +2080 +FBE0 +2080 +A940 +7320 +3D40 +E1C0 +ENDCHAR +STARTCHAR U_92D6 +ENCODING 37590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4AC0 +F100 +2100 +FFE0 +2240 +AC40 +7280 +3900 +C6E0 +ENDCHAR +STARTCHAR U_92D7 +ENCODING 37591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7800 +27E0 +FC20 +27E0 +AC20 +77E0 +3C20 +E460 +ENDCHAR +STARTCHAR U_92D8 +ENCODING 37592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7BC0 +2000 +FBC0 +2100 +AFE0 +7100 +3A80 +E460 +ENDCHAR +STARTCHAR U_92D9 +ENCODING 37593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BC0 +7940 +2140 +FFE0 +2000 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92DA +ENCODING 37594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5640 +D980 +5660 +5900 +EEE0 +0400 +3F80 +1500 +FFC0 +ENDCHAR +STARTCHAR U_92DB +ENCODING 37595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4D40 +F7C0 +2100 +FFE0 +2520 +AD20 +77E0 +3900 +C100 +ENDCHAR +STARTCHAR U_92DC +ENCODING 37596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2100 +F900 +25C0 +AD00 +7500 +3B00 +C8E0 +ENDCHAR +STARTCHAR U_92DD +ENCODING 37597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +57A0 +8D20 +7AC0 +2040 +FFE0 +2440 +AA40 +7240 +3940 +E080 +ENDCHAR +STARTCHAR U_92DE +ENCODING 37598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +8AA0 +7D40 +22A0 +FAA0 +2000 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92DF +ENCODING 37599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5040 +8BC0 +7840 +27E0 +FC20 +23C0 +AA40 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_92E0 +ENCODING 37600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8DC0 +7C00 +27E0 +FD00 +25A0 +AD40 +7540 +3DA0 +E520 +ENDCHAR +STARTCHAR U_92E1 +ENCODING 37601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8D40 +78A0 +27C0 +F840 +2080 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92E2 +ENCODING 37602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3720 +4D40 +F280 +27C0 +F880 +2100 +AFE0 +7100 +3900 +C300 +ENDCHAR +STARTCHAR U_92E3 +ENCODING 37603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +52A0 +FAA0 +2FC0 +F2A0 +2AA0 +B6A0 +6AC0 +2A80 +D680 +ENDCHAR +STARTCHAR U_92E4 +ENCODING 37604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +5A80 +8A80 +7FE0 +2AA0 +FEA0 +2AA0 +ABA0 +7EA0 +3920 +E240 +ENDCHAR +STARTCHAR U_92E5 +ENCODING 37605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2000 +F7C0 +2100 +B7C0 +6100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_92E6 +ENCODING 37606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C00 +27E0 +FC20 +27A0 +AEA0 +77A0 +3C20 +E0C0 +ENDCHAR +STARTCHAR U_92E7 +ENCODING 37607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FC40 +27C0 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_92E8 +ENCODING 37608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +56C0 +8AA0 +7FE0 +2280 +FAA0 +23A0 +AEC0 +72A0 +3B60 +E620 +ENDCHAR +STARTCHAR U_92E9 +ENCODING 37609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7900 +2080 +FFE0 +2200 +AA00 +7200 +3A00 +E3E0 +ENDCHAR +STARTCHAR U_92EA +ENCODING 37610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +7900 +27E0 +FD20 +27E0 +AD20 +77E0 +3D20 +E560 +ENDCHAR +STARTCHAR U_92EB +ENCODING 37611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +1140 +FD40 +3940 +D4C0 +3B00 +CEE0 +0400 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92EC +ENCODING 37612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F400 +27C0 +F540 +2480 +6B60 +1E80 +E460 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_92ED +ENCODING 37613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FC0 +F440 +2440 +FFC0 +2280 +B280 +62A0 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92EE +ENCODING 37614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +5FE0 +F880 +2880 +FEA0 +2AA0 +BAC0 +6AA0 +3D60 +D220 +ENDCHAR +STARTCHAR U_92EF +ENCODING 37615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7C80 +2080 +FFE0 +2000 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92F0 +ENCODING 37616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8AA0 +7BE0 +22A0 +FBE0 +2080 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92F1 +ENCODING 37617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5040 +8FE0 +7A40 +2140 +FA40 +22C0 +AA40 +7640 +3AA0 +E3A0 +ENDCHAR +STARTCHAR U_92F2 +ENCODING 37618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3700 +4C00 +F400 +27C0 +FC80 +2480 +AFE0 +7280 +3440 +C820 +ENDCHAR +STARTCHAR U_92F3 +ENCODING 37619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2200 +FFE0 +2280 +AFE0 +7480 +3A80 +C100 +ENDCHAR +STARTCHAR U_92F4 +ENCODING 37620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2440 +FFC0 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92F5 +ENCODING 37621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3700 +4900 +F7E0 +2380 +F540 +2920 +B780 +64A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_92F6 +ENCODING 37622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F200 +2480 +FFC0 +2A80 +BA80 +6AA0 +32A0 +D060 +ENDCHAR +STARTCHAR U_92F7 +ENCODING 37623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +AA00 +1FE0 +FAA0 +4AA0 +FEA0 +4AA0 +5BA0 +EE40 +42A0 +F320 +ENDCHAR +STARTCHAR U_92F8 +ENCODING 37624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FE0 +7C80 +2480 +FFE0 +2480 +B7E0 +6A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_92F9 +ENCODING 37625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5200 +8BC0 +7A00 +23C0 +FA00 +27E0 +AAA0 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92FA +ENCODING 37626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A20 +27C0 +FD40 +2740 +B9C0 +6280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92FB +ENCODING 37627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +F940 +8880 +FD60 +AA00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92FC +ENCODING 37628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8920 +FFE0 +2920 +FD60 +2D60 +BFE0 +6820 +2820 +F860 +ENDCHAR +STARTCHAR U_92FD +ENCODING 37629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31C0 +4900 +F7C0 +2440 +F7C0 +2440 +B7C0 +6100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_92FE +ENCODING 37630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C20 +7A20 +23E0 +FD20 +27E0 +AD60 +77E0 +3820 +E0C0 +ENDCHAR +STARTCHAR U_92FF +ENCODING 37631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +52C0 +8880 +7FE0 +2420 +FDE0 +2560 +ADE0 +7420 +3C20 +E460 +ENDCHAR +STARTCHAR U_9300 +ENCODING 37632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +FBA0 +2000 +FFE0 +2AA0 +BFE0 +6AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9301 +ENCODING 37633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8FE0 +7CA0 +27E0 +F880 +27E0 +A880 +71C0 +3AA0 +E4A0 +ENDCHAR +STARTCHAR U_9302 +ENCODING 37634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +77E0 +2240 +F520 +23C0 +AE40 +7180 +3180 +C660 +ENDCHAR +STARTCHAR U_9303 +ENCODING 37635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +17E0 +44A0 +17C0 +6540 +2C80 +1B40 +E4E0 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_9304 +ENCODING 37636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7840 +27E0 +F880 +22A0 +A9C0 +72A0 +3CA0 +E180 +ENDCHAR +STARTCHAR U_9305 +ENCODING 37637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FEA0 +38A0 +5520 +9B60 +3E80 +C460 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_9306 +ENCODING 37638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FC0 +2100 +FFE0 +2440 +AFC0 +7440 +3FC0 +E4C0 +ENDCHAR +STARTCHAR U_9307 +ENCODING 37639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2280 +FFE0 +2000 +AFC0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9308 +ENCODING 37640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +7900 +27E0 +FA40 +27E0 +AA40 +72C0 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_9309 +ENCODING 37641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5480 +8FE0 +7C80 +2540 +FE20 +23E0 +AA20 +73E0 +3A20 +E3E0 +ENDCHAR +STARTCHAR U_930A +ENCODING 37642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2440 +FAA0 +2100 +AFE0 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_930B +ENCODING 37643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8AA0 +FEE0 +2AA0 +FAA0 +2EE0 +BAA0 +6AA0 +2AA0 +F560 +ENDCHAR +STARTCHAR U_930C +ENCODING 37644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +8BE0 +7800 +27E0 +FC00 +25C0 +AC80 +77E0 +3C80 +E480 +ENDCHAR +STARTCHAR U_930D +ENCODING 37645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8CA0 +7FE0 +24A0 +FFE0 +2280 +AC80 +77E0 +3880 +E080 +ENDCHAR +STARTCHAR U_930E +ENCODING 37646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C40 +7880 +2360 +FC20 +2420 +AF60 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_930F +ENCODING 37647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5280 +8A80 +7EE0 +2420 +FC20 +2420 +AEE0 +7280 +3A80 +EFE0 +ENDCHAR +STARTCHAR U_9310 +ENCODING 37648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8FE0 +7A80 +23E0 +FA80 +2280 +ABE0 +7280 +3A80 +E3E0 +ENDCHAR +STARTCHAR U_9311 +ENCODING 37649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F7E0 +2540 +FD20 +27E0 +B500 +6900 +2A80 +D460 +ENDCHAR +STARTCHAR U_9312 +ENCODING 37650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5A20 +8A20 +7DE0 +2B60 +FB60 +2B60 +ADE0 +7820 +3820 +E860 +ENDCHAR +STARTCHAR U_9313 +ENCODING 37651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +7900 +27E0 +F900 +27E0 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_9314 +ENCODING 37652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57A0 +8AC0 +7AA0 +24A0 +FBE0 +2220 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9315 +ENCODING 37653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FC80 +24A0 +AFC0 +74A0 +3DA0 +E6E0 +ENDCHAR +STARTCHAR U_9316 +ENCODING 37654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2120 +FCC0 +6940 +AE20 +3100 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9317 +ENCODING 37655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F380 +2540 +F920 +27E0 +AA40 +7680 +3980 +C660 +ENDCHAR +STARTCHAR U_9318 +ENCODING 37656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5780 +8900 +7FE0 +2540 +FFE0 +2540 +AD40 +77E0 +3900 +E7C0 +ENDCHAR +STARTCHAR U_9319 +ENCODING 37657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +52A0 +8D40 +7AA0 +22A0 +FFE0 +24A0 +AFE0 +74A0 +3FE0 +E420 +ENDCHAR +STARTCHAR U_931A +ENCODING 37658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8480 +77C0 +2140 +FFE0 +2140 +B7C0 +6100 +3900 +C300 +ENDCHAR +STARTCHAR U_931B +ENCODING 37659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7D20 +27C0 +F900 +2240 +AFE0 +7240 +3A40 +E440 +ENDCHAR +STARTCHAR U_931C +ENCODING 37660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F560 +2080 +F7C0 +2080 +A940 +7220 +3640 +C9C0 +ENDCHAR +STARTCHAR U_931D +ENCODING 37661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2000 +FFE0 +2100 +AB40 +7520 +3920 +E300 +ENDCHAR +STARTCHAR U_931E +ENCODING 37662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7BC0 +2000 +FFE0 +2040 +A880 +77E0 +3880 +E180 +ENDCHAR +STARTCHAR U_931F +ENCODING 37663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +52C0 +8C80 +7940 +22A0 +FC80 +22A0 +AAC0 +7480 +3940 +E620 +ENDCHAR +STARTCHAR U_9320 +ENCODING 37664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7800 +27E0 +F880 +2280 +AAE0 +7280 +3D80 +E0E0 +ENDCHAR +STARTCHAR U_9321 +ENCODING 37665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7C40 +27E0 +F840 +2740 +AD40 +7740 +3840 +E1C0 +ENDCHAR +STARTCHAR U_9322 +ENCODING 37666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4FC0 +F940 +21A0 +FE60 +2A40 +B7E0 +6140 +39A0 +C660 +ENDCHAR +STARTCHAR U_9323 +ENCODING 37667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8AC0 +7A40 +25A0 +FFE0 +2120 +ADA0 +7240 +3DA0 +E120 +ENDCHAR +STARTCHAR U_9324 +ENCODING 37668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8FE0 +7A40 +23C0 +FA40 +23C0 +AA40 +77E0 +3A40 +E420 +ENDCHAR +STARTCHAR U_9325 +ENCODING 37669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8940 +7BE0 +2000 +FBC0 +2240 +B3C0 +6240 +3BC0 +C240 +ENDCHAR +STARTCHAR U_9326 +ENCODING 37670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8A20 +7BE0 +2220 +FBE0 +2080 +AFE0 +74A0 +3CE0 +E080 +ENDCHAR +STARTCHAR U_9327 +ENCODING 37671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2240 +FBC0 +2200 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9328 +ENCODING 37672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8FE0 +7A40 +27E0 +FCA0 +24A0 +AFE0 +74A0 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9329 +ENCODING 37673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7A40 +23C0 +F800 +27E0 +AC20 +77E0 +3C20 +E7E0 +ENDCHAR +STARTCHAR U_932A +ENCODING 37674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8FE0 +FAA0 +2FE0 +FAA0 +2AA0 +BFE0 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_932B +ENCODING 37675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FA00 +27E0 +AAA0 +74A0 +3920 +E240 +ENDCHAR +STARTCHAR U_932C +ENCODING 37676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2540 +FFC0 +2540 +B7C0 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_932D +ENCODING 37677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FA0 +7D20 +27E0 +FC20 +27A0 +AEA0 +77A0 +3C20 +E060 +ENDCHAR +STARTCHAR U_932E +ENCODING 37678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5820 +8920 +FFE0 +2920 +FBA0 +2AA0 +BBA0 +6820 +2FE0 +F820 +ENDCHAR +STARTCHAR U_932F +ENCODING 37679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7A40 +27E0 +F800 +23E0 +AA20 +73E0 +3A20 +E3E0 +ENDCHAR +STARTCHAR U_9330 +ENCODING 37680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F100 +2380 +FD40 +2920 +B100 +6540 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_9331 +ENCODING 37681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +1500 +7FC0 +0000 +FBC0 +2100 +7BC0 +2100 +FBE0 +ENDCHAR +STARTCHAR U_9332 +ENCODING 37682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +F040 +2FE0 +F120 +2540 +B380 +6540 +3520 +CB00 +ENDCHAR +STARTCHAR U_9333 +ENCODING 37683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5040 +8880 +7FE0 +2080 +FB80 +2100 +AFE0 +7AA0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_9334 +ENCODING 37684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8880 +7FE0 +2140 +FA20 +2480 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_9335 +ENCODING 37685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7800 +2280 +FAA0 +26C0 +AB80 +72A0 +3AA0 +E260 +ENDCHAR +STARTCHAR U_9336 +ENCODING 37686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FC0 +2100 +FFE0 +22A0 +AE40 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_9337 +ENCODING 37687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +A440 +FF40 +5540 +FF40 +5540 +7F40 +C440 +6F40 +8460 +ENDCHAR +STARTCHAR U_9338 +ENCODING 37688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +F540 +2540 +FBA0 +2100 +B380 +6540 +2920 +F100 +ENDCHAR +STARTCHAR U_9339 +ENCODING 37689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +5280 +8FE0 +7800 +23E0 +FA20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_933A +ENCODING 37690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4A80 +F100 +2FE0 +F200 +23C0 +AA40 +7240 +3540 +C880 +ENDCHAR +STARTCHAR U_933B +ENCODING 37691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +36C0 +48A0 +FFE0 +2280 +F380 +2A80 +BAA0 +6BA0 +2C60 +C020 +ENDCHAR +STARTCHAR U_933C +ENCODING 37692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7C40 +23A0 +F800 +27E0 +A900 +7540 +3920 +E320 +ENDCHAR +STARTCHAR U_933D +ENCODING 37693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4940 +F580 +2240 +F420 +23C0 +B440 +6A80 +3100 +CEE0 +ENDCHAR +STARTCHAR U_933E +ENCODING 37694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A200 +FBE0 +2240 +F640 +1980 +EF60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_933F +ENCODING 37695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3100 +4FE0 +FA40 +2F80 +FA40 +2BC0 +B800 +6BA0 +2AA0 +D460 +ENDCHAR +STARTCHAR U_9340 +ENCODING 37696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +27C0 +F800 +27C0 +B080 +6FE0 +3280 +C180 +ENDCHAR +STARTCHAR U_9341 +ENCODING 37697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3C80 +48E0 +F920 +2F00 +FA80 +2A80 +BA80 +6A80 +2B40 +D220 +ENDCHAR +STARTCHAR U_9342 +ENCODING 37698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F460 +27C0 +F900 +27C0 +B100 +6540 +3B80 +C7E0 +ENDCHAR +STARTCHAR U_9343 +ENCODING 37699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33E0 +4AA0 +F560 +22A0 +F160 +2000 +B240 +65A0 +34A0 +C380 +ENDCHAR +STARTCHAR U_9344 +ENCODING 37700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +5000 +F7C0 +2440 +F7C0 +2100 +B580 +6540 +2920 +C300 +ENDCHAR +STARTCHAR U_9345 +ENCODING 37701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3280 +4880 +F5C0 +2480 +F3E0 +2480 +B500 +6D40 +37E0 +C520 +ENDCHAR +STARTCHAR U_9346 +ENCODING 37702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +6AA0 +9EE0 +FAA0 +2EE0 +F820 +2820 +B820 +6820 +2820 +F8E0 +ENDCHAR +STARTCHAR U_9347 +ENCODING 37703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +54A0 +8EC0 +7DA0 +26E0 +F900 +27C0 +AC40 +77C0 +3C40 +E7C0 +ENDCHAR +STARTCHAR U_9348 +ENCODING 37704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FE0 +4440 +F100 +27C0 +FD40 +2540 +BFE0 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_9349 +ENCODING 37705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8BE0 +7A20 +23E0 +F800 +27E0 +AA80 +72E0 +3D80 +E0E0 +ENDCHAR +STARTCHAR U_934A +ENCODING 37706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2AA0 +F920 +2FE0 +B100 +6380 +3D40 +C920 +ENDCHAR +STARTCHAR U_934B +ENCODING 37707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8B40 +7B40 +27E0 +FC20 +27A0 +B6A0 +67A0 +3C20 +C460 +ENDCHAR +STARTCHAR U_934C +ENCODING 37708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +B7C0 +4900 +EFE0 +4500 +58E0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_934D +ENCODING 37709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8D40 +7FE0 +2540 +FDC0 +2400 +AFE0 +7540 +3C80 +E360 +ENDCHAR +STARTCHAR U_934E +ENCODING 37710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5480 +8FE0 +7C80 +25E0 +FD20 +25E0 +AD20 +75E0 +3D20 +E5E0 +ENDCHAR +STARTCHAR U_934F +ENCODING 37711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +8940 +7FE0 +2240 +FBC0 +2080 +AFE0 +7280 +3FE0 +E080 +ENDCHAR +STARTCHAR U_9350 +ENCODING 37712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +5520 +8EA0 +7FE0 +2240 +FC20 +23C0 +AA40 +7580 +3A40 +E420 +ENDCHAR +STARTCHAR U_9351 +ENCODING 37713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8E40 +7BC0 +2240 +FBC0 +2200 +ABC0 +7640 +3980 +E660 +ENDCHAR +STARTCHAR U_9352 +ENCODING 37714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5140 +8FE0 +7AA0 +24C0 +FB80 +2100 +AFE0 +7380 +3D40 +E120 +ENDCHAR +STARTCHAR U_9353 +ENCODING 37715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4BC0 +F000 +27E0 +FA40 +23C0 +B240 +62E0 +3740 +C040 +ENDCHAR +STARTCHAR U_9354 +ENCODING 37716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7800 +23C0 +F800 +27E0 +A900 +73E0 +3820 +E1C0 +ENDCHAR +STARTCHAR U_9355 +ENCODING 37717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FE0 +7D40 +27C0 +FD40 +27C0 +A900 +77E0 +3900 +E100 +ENDCHAR +STARTCHAR U_9356 +ENCODING 37718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7BC0 +2240 +FBC0 +2240 +AFE0 +7540 +3E20 +E7E0 +ENDCHAR +STARTCHAR U_9357 +ENCODING 37719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7FE0 +2520 +FFC0 +2540 +AD40 +7540 +3DC0 +E100 +ENDCHAR +STARTCHAR U_9358 +ENCODING 37720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +5A20 +8EA0 +FAA0 +2EA0 +FAA0 +2AA0 +AEA0 +7020 +2A20 +F160 +ENDCHAR +STARTCHAR U_9359 +ENCODING 37721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AFE0 +4480 +DFE0 +4680 +4940 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_935A +ENCODING 37722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7A40 +27E0 +FA00 +27E0 +AAA0 +74A0 +3920 +E6C0 +ENDCHAR +STARTCHAR U_935B +ENCODING 37723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +8F40 +7C20 +25E0 +FF40 +2540 +AF40 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_935C +ENCODING 37724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8D20 +7FE0 +2400 +FFE0 +24A0 +AFA0 +7440 +3CA0 +E520 +ENDCHAR +STARTCHAR U_935D +ENCODING 37725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3540 +4FC0 +F540 +27C0 +F900 +27E0 +AD60 +77E0 +3C20 +C460 +ENDCHAR +STARTCHAR U_935E +ENCODING 37726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FC0 +7C40 +27C0 +FC40 +27C0 +AC40 +77C0 +3A80 +EC60 +ENDCHAR +STARTCHAR U_935F +ENCODING 37727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +27C0 +F500 +27E0 +B900 +67C0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9360 +ENCODING 37728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +8A40 +7BC0 +2240 +FFE0 +2100 +A900 +73C0 +3900 +E7E0 +ENDCHAR +STARTCHAR U_9361 +ENCODING 37729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8BE0 +7AA0 +23E0 +F800 +27E0 +AAA0 +7240 +3B40 +E220 +ENDCHAR +STARTCHAR U_9362 +ENCODING 37730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3000 +4BC0 +F240 +23C0 +F800 +27E0 +B520 +67E0 +3520 +C7E0 +ENDCHAR +STARTCHAR U_9363 +ENCODING 37731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7FE0 +2120 +FAA0 +2440 +AFE0 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9364 +ENCODING 37732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5700 +8900 +7FE0 +2100 +FF60 +2520 +AFE0 +7520 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9365 +ENCODING 37733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5FE0 +84A0 +FEA0 +24A0 +FF20 +2540 +AFE0 +7280 +2440 +F820 +ENDCHAR +STARTCHAR U_9366 +ENCODING 37734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +55E0 +FE80 +28A0 +FEE0 +2BA0 +BAE0 +6A80 +2AA0 +D660 +ENDCHAR +STARTCHAR U_9367 +ENCODING 37735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8D20 +7FE0 +2020 +FBA0 +2020 +ABA0 +72A0 +3BA0 +E0C0 +ENDCHAR +STARTCHAR U_9368 +ENCODING 37736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3680 +4AA0 +F440 +2820 +F7E0 +2100 +B7E0 +6100 +3A80 +C460 +ENDCHAR +STARTCHAR U_9369 +ENCODING 37737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +37E0 +4C40 +F100 +27E0 +F900 +23C0 +B640 +6A40 +33C0 +C240 +ENDCHAR +STARTCHAR U_936A +ENCODING 37738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2FE0 +FA80 +5180 +9E40 +3100 +FFE0 +0400 +7F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_936B +ENCODING 37739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6520 +2540 +FA80 +7440 +AB20 +3E80 +C460 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_936C +ENCODING 37740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +5480 +85A0 +FEC0 +2480 +F680 +2D80 +A480 +7540 +2620 +F420 +ENDCHAR +STARTCHAR U_936D +ENCODING 37741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5440 +8FE0 +7D00 +25E0 +FE80 +27E0 +AC80 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_936E +ENCODING 37742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3280 +4C40 +F7A0 +2000 +FEA0 +2AA0 +BEA0 +6AA0 +3E20 +CAE0 +ENDCHAR +STARTCHAR U_936F +ENCODING 37743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5AA0 +F7A0 +2520 +FAC0 +2140 +B2A0 +6620 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9370 +ENCODING 37744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +5280 +FFE0 +2100 +F7E0 +2200 +B3C0 +6640 +3980 +C660 +ENDCHAR +STARTCHAR U_9371 +ENCODING 37745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +57E0 +8AA0 +FAE0 +2200 +FBE0 +2080 +AFE0 +7180 +22C0 +FCA0 +ENDCHAR +STARTCHAR U_9372 +ENCODING 37746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7D00 +27E0 +FC80 +27E0 +AC60 +77C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9373 +ENCODING 37747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7D00 +5080 +7E80 +0900 +3F80 +C460 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_9374 +ENCODING 37748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +5540 +FFC0 +2000 +FFE0 +2200 +BFE0 +6AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9375 +ENCODING 37749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C80 +25E0 +54A0 +FBE0 +2CA0 +F7E0 +2480 +B7E0 +6C80 +3480 +CBE0 +ENDCHAR +STARTCHAR U_9376 +ENCODING 37750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5D20 +8520 +FFE0 +2520 +FFE0 +2140 +AAA0 +7620 +2A40 +F1C0 +ENDCHAR +STARTCHAR U_9377 +ENCODING 37751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +FD20 +27C0 +F900 +27E0 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_9378 +ENCODING 37752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +34E0 +4CA0 +FFA0 +24E0 +FCA0 +2EE0 +BAA0 +7EA0 +C120 +0260 +ENDCHAR +STARTCHAR U_9379 +ENCODING 37753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +F000 +27E0 +FA40 +23C0 +AA40 +73C0 +2000 +FFE0 +ENDCHAR +STARTCHAR U_937A +ENCODING 37754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53A0 +8940 +FFE0 +2100 +FBE0 +2220 +AFE0 +7220 +23E0 +FA20 +ENDCHAR +STARTCHAR U_937B +ENCODING 37755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +FC40 +23C0 +FA00 +27E0 +AD20 +76A0 +27A0 +F840 +ENDCHAR +STARTCHAR U_937C +ENCODING 37756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +F880 +2F80 +F8A0 +2EA0 +AAC0 +7EA0 +2960 +F220 +ENDCHAR +STARTCHAR U_937D +ENCODING 37757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4C40 +FFC0 +2400 +FFE0 +2EA0 +B7E0 +7AA0 +CAA0 +1260 +ENDCHAR +STARTCHAR U_937E +ENCODING 37758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +FD40 +27C0 +FD40 +27C0 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_937F +ENCODING 37759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +22A0 +57E0 +FAA0 +2140 +F7E0 +2520 +AFE0 +7520 +3FE0 +C420 +ENDCHAR +STARTCHAR U_9380 +ENCODING 37760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +54E0 +88A0 +FB40 +2AA0 +FB40 +2AA0 +AA40 +7AA0 +2A40 +F980 +ENDCHAR +STARTCHAR U_9381 +ENCODING 37761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +FEA0 +2AC0 +FEA0 +2AA0 +BEE0 +6A80 +F280 +0280 +ENDCHAR +STARTCHAR U_9382 +ENCODING 37762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +F900 +27C0 +F900 +27E0 +A900 +77E0 +2280 +FC60 +ENDCHAR +STARTCHAR U_9383 +ENCODING 37763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +5700 +8420 +75C0 +2D40 +F560 +2540 +B540 +6520 +39A0 +C920 +ENDCHAR +STARTCHAR U_9384 +ENCODING 37764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4800 +F7C0 +2440 +F7C0 +2280 +B2A0 +7640 +CB20 +0200 +ENDCHAR +STARTCHAR U_9385 +ENCODING 37765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +57C0 +FD40 +27C0 +F280 +2C60 +B280 +7280 +C280 +0480 +ENDCHAR +STARTCHAR U_9386 +ENCODING 37766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +F020 +2EA0 +FAA0 +2EA0 +BAA0 +6EA0 +FA20 +0A60 +ENDCHAR +STARTCHAR U_9387 +ENCODING 37767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4FE0 +FC00 +27E0 +FE20 +2FE0 +B620 +7BE0 +CA20 +13E0 +ENDCHAR +STARTCHAR U_9388 +ENCODING 37768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +5140 +8BE0 +F880 +23E0 +FC80 +23E0 +AA00 +77E0 +2880 +F7E0 +ENDCHAR +STARTCHAR U_9389 +ENCODING 37769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +FC40 +27C0 +F800 +27E0 +ADA0 +7360 +25A0 +FA60 +ENDCHAR +STARTCHAR U_938A +ENCODING 37770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +77E0 +2920 +F7E0 +2100 +B1E0 +6220 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_938B +ENCODING 37771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D20 +FBC0 +2100 +FBC0 +2100 +AFE0 +73C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_938C +ENCODING 37772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FAA0 +27E0 +FAA0 +27E0 +AA80 +76C0 +2AA0 +F2A0 +ENDCHAR +STARTCHAR U_938D +ENCODING 37773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8100 +FFE0 +2AA0 +F700 +2140 +AFE0 +7380 +2540 +FB20 +ENDCHAR +STARTCHAR U_938E +ENCODING 37774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +57E0 +8800 +FFC0 +2AC0 +F740 +2240 +AFC0 +7240 +2720 +FAA0 +ENDCHAR +STARTCHAR U_938F +ENCODING 37775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +6480 +CFC0 +4AA0 +56E0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9390 +ENCODING 37776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3640 +4D40 +FA80 +23C0 +FD00 +27E0 +B100 +6540 +3D40 +C7C0 +ENDCHAR +STARTCHAR U_9391 +ENCODING 37777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2480 +FFC0 +2040 +AFE0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_9392 +ENCODING 37778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +8FE0 +FAA0 +2A40 +FB20 +2A40 +AFE0 +7A40 +2940 +F880 +ENDCHAR +STARTCHAR U_9393 +ENCODING 37779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3540 +4AA0 +F7C0 +2000 +FEE0 +2AA0 +B660 +6AA0 +3AA0 +C440 +ENDCHAR +STARTCHAR U_9394 +ENCODING 37780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +FA40 +2520 +FA40 +27E0 +AA40 +7240 +23C0 +FA40 +ENDCHAR +STARTCHAR U_9395 +ENCODING 37781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFE0 +2540 +FFC0 +2500 +AFE0 +7620 +2BE0 +FA20 +ENDCHAR +STARTCHAR U_9396 +ENCODING 37782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +52C0 +8BE0 +FA20 +23E0 +FA20 +23E0 +AA20 +73E0 +2140 +FE20 +ENDCHAR +STARTCHAR U_9397 +ENCODING 37783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +5240 +8D20 +FFC0 +2440 +FFC0 +2440 +AFE0 +7620 +23E0 +FA20 +ENDCHAR +STARTCHAR U_9398 +ENCODING 37784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5240 +8BC0 +F000 +27E0 +FEA0 +2520 +AFE0 +7520 +2520 +FC60 +ENDCHAR +STARTCHAR U_9399 +ENCODING 37785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +52A0 +8FA0 +F2E0 +2BA0 +FBA0 +2FE0 +AAA0 +72A0 +24A0 +F960 +ENDCHAR +STARTCHAR U_939A +ENCODING 37786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +52E0 +8AA0 +F8E0 +2680 +FAE0 +22A0 +AAA0 +72E0 +2500 +F8E0 +ENDCHAR +STARTCHAR U_939B +ENCODING 37787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +57E0 +8AA0 +FBE0 +22A0 +FBE0 +22A0 +AFE0 +7240 +2140 +F880 +ENDCHAR +STARTCHAR U_939C +ENCODING 37788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4C60 +FBC0 +6E80 +9140 +2E80 +C460 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_939D +ENCODING 37789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +FB80 +2440 +FBA0 +2000 +AFC0 +7440 +27C0 +FC40 +ENDCHAR +STARTCHAR U_939E +ENCODING 37790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8EA0 +FD20 +26A0 +FFE0 +2480 +AFA0 +74C0 +27A0 +FCE0 +ENDCHAR +STARTCHAR U_939F +ENCODING 37791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5280 +8140 +FFE0 +25A0 +F240 +25A0 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_93A0 +ENCODING 37792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +8FE0 +F000 +2FE0 +F100 +2DC0 +B500 +7500 +CFE0 +ENDCHAR +STARTCHAR U_93A1 +ENCODING 37793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FA40 +2240 +FCA0 +27E0 +AA40 +74A0 +27E0 +F920 +ENDCHAR +STARTCHAR U_93A2 +ENCODING 37794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2400 +FFE0 +2400 +AFE0 +7560 +2AA0 +FAC0 +ENDCHAR +STARTCHAR U_93A3 +ENCODING 37795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +B580 +4A40 +FFE0 +8420 +0A00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93A4 +ENCODING 37796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FE0 +FC20 +27E0 +FD20 +2340 +AFE0 +7180 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_93A5 +ENCODING 37797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5A80 +D540 +5FE0 +5540 +0A20 +7FE0 +0400 +7FC0 +1480 +FFE0 +ENDCHAR +STARTCHAR U_93A6 +ENCODING 37798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +58A0 +8AA0 +FAA0 +2D20 +F240 +27E0 +AD20 +77E0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_93A7 +ENCODING 37799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8800 +FFE0 +2000 +FFC0 +2440 +AFC0 +7440 +2280 +FFE0 +ENDCHAR +STARTCHAR U_93A8 +ENCODING 37800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +AFE0 +7100 +2FE0 +F900 +ENDCHAR +STARTCHAR U_93A9 +ENCODING 37801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +52A0 +8DA0 +FAA0 +2700 +FAE0 +23A0 +AEA0 +7240 +22A0 +FB20 +ENDCHAR +STARTCHAR U_93AA +ENCODING 37802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +55E0 +8D20 +FFE0 +2520 +FFE0 +2100 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_93AB +ENCODING 37803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D60 +FCA0 +2340 +FC20 +23C0 +AA40 +7580 +3980 +C660 +ENDCHAR +STARTCHAR U_93AC +ENCODING 37804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +FBC0 +2000 +FFE0 +2420 +AFA0 +76A0 +27A0 +FC60 +ENDCHAR +STARTCHAR U_93AD +ENCODING 37805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2300 +53E0 +8800 +75C0 +2540 +F5C0 +2540 +B7E0 +7A40 +C420 +ENDCHAR +STARTCHAR U_93AE +ENCODING 37806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +FFC0 +2440 +FF40 +25C0 +AC40 +7FE0 +2280 +FC60 +ENDCHAR +STARTCHAR U_93AF +ENCODING 37807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5EA0 +8AA0 +FAA0 +2EC0 +FAA0 +2EA0 +A8A0 +7AE0 +2D80 +F880 +ENDCHAR +STARTCHAR U_93B0 +ENCODING 37808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +F280 +2440 +F820 +2FE0 +AAA0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_93B1 +ENCODING 37809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2000 +FFC0 +2440 +AFC0 +72A0 +2640 +FB20 +ENDCHAR +STARTCHAR U_93B2 +ENCODING 37810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5540 +8FE0 +F820 +27C0 +FC40 +27C0 +AA80 +72A0 +24A0 +F860 +ENDCHAR +STARTCHAR U_93B3 +ENCODING 37811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2440 +FFC0 +2100 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_93B4 +ENCODING 37812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2440 +FFC0 +2440 +AFC0 +7280 +2660 +FBC0 +ENDCHAR +STARTCHAR U_93B5 +ENCODING 37813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +F7C0 +2220 +FD40 +2280 +AD80 +72C0 +24A0 +FB20 +ENDCHAR +STARTCHAR U_93B6 +ENCODING 37814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4F40 +F540 +2FE0 +F040 +2F40 +B540 +7F40 +C140 +0080 +ENDCHAR +STARTCHAR U_93B7 +ENCODING 37815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5480 +8FE0 +FC80 +27E0 +FC80 +27E0 +A820 +7560 +2AA0 +FAE0 +ENDCHAR +STARTCHAR U_93B8 +ENCODING 37816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4C80 +FFC0 +2480 +FFE0 +2000 +AFC0 +72E0 +3A20 +C460 +ENDCHAR +STARTCHAR U_93B9 +ENCODING 37817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3220 +4940 +8BE0 +F480 +23E0 +FC80 +3540 +A620 +7600 +C9E0 +ENDCHAR +STARTCHAR U_93BA +ENCODING 37818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +65C0 +9D40 +E5C0 +4940 +ED40 +5BC0 +E940 +6940 +CBE0 +0800 +ENDCHAR +STARTCHAR U_93BB +ENCODING 37819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3540 +4AA0 +FFC0 +2540 +FCC0 +2E40 +B540 +7FC0 +C440 +0820 +ENDCHAR +STARTCHAR U_93BC +ENCODING 37820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3100 +4FE0 +FD20 +27E0 +FD20 +25E0 +B480 +67E0 +3880 +C980 +ENDCHAR +STARTCHAR U_93BD +ENCODING 37821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +37C0 +4A00 +F7C0 +2280 +F560 +2900 +A380 +7100 +3FC0 +C100 +ENDCHAR +STARTCHAR U_93BE +ENCODING 37822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +8C40 +FFC0 +2000 +FFE0 +3AA0 +AAA0 +7AA0 +CFE0 +ENDCHAR +STARTCHAR U_93BF +ENCODING 37823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +3240 +4FE0 +FA40 +23C0 +F880 +23C0 +A880 +77E0 +3880 +C180 +ENDCHAR +STARTCHAR U_93C0 +ENCODING 37824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +F920 +2D60 +FAA0 +2D60 +AAA0 +7D60 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_93C1 +ENCODING 37825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +5540 +FFC0 +2540 +FFC0 +2540 +BFE0 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_93C2 +ENCODING 37826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +8BC0 +FA40 +2BC0 +F800 +2BE0 +AAA0 +7BE0 +2800 +FFE0 +ENDCHAR +STARTCHAR U_93C3 +ENCODING 37827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5FE0 +8440 +F4E0 +2F40 +F540 +25E0 +A540 +7540 +29A0 +F320 +ENDCHAR +STARTCHAR U_93C4 +ENCODING 37828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFC0 +2540 +FFC0 +2120 +AFE0 +7440 +2240 +F9C0 +ENDCHAR +STARTCHAR U_93C5 +ENCODING 37829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +35E0 +4940 +F880 +2F60 +FDC0 +2D40 +BDC0 +6D40 +39C0 +C940 +ENDCHAR +STARTCHAR U_93C6 +ENCODING 37830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3540 +4FE0 +F540 +27C0 +F800 +2FC0 +B540 +76C0 +C7C0 +0C60 +ENDCHAR +STARTCHAR U_93C7 +ENCODING 37831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5EE0 +8900 +F9E0 +2EA0 +FA80 +2AE0 +AA80 +7A80 +2B80 +F4E0 +ENDCHAR +STARTCHAR U_93C8 +ENCODING 37832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +57E0 +8AA0 +FBE0 +26A0 +FFE0 +2480 +AFE0 +7480 +2480 +FBE0 +ENDCHAR +STARTCHAR U_93C9 +ENCODING 37833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +AE80 +F5E0 +5F20 +F580 +5F80 +E480 +6F40 +9540 +0620 +ENDCHAR +STARTCHAR U_93CA +ENCODING 37834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FF40 +2880 +4F60 +9100 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93CB +ENCODING 37835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +5240 +8BC0 +7100 +2FE0 +F920 +2DA0 +BB60 +7920 +C860 +ENDCHAR +STARTCHAR U_93CC +ENCODING 37836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8A40 +FFC0 +2440 +FFC0 +2440 +AFE0 +7100 +2280 +FC60 +ENDCHAR +STARTCHAR U_93CD +ENCODING 37837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FE0 +FD20 +27E0 +FA40 +2780 +A920 +77E0 +2540 +FB20 +ENDCHAR +STARTCHAR U_93CE +ENCODING 37838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +87E0 +F520 +27E0 +F540 +2FE0 +A540 +7FE0 +2100 +F100 +ENDCHAR +STARTCHAR U_93CF +ENCODING 37839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8FE0 +FA40 +27E0 +FA40 +23E0 +A820 +77E0 +2020 +FBE0 +ENDCHAR +STARTCHAR U_93D0 +ENCODING 37840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +55A0 +8B60 +FDA0 +2120 +FA80 +2560 +AA80 +7140 +2080 +FF00 +ENDCHAR +STARTCHAR U_93D1 +ENCODING 37841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8280 +FFE0 +2920 +FBA0 +2920 +ABA0 +7AA0 +2BA0 +F860 +ENDCHAR +STARTCHAR U_93D2 +ENCODING 37842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57A0 +84A0 +FFE0 +2300 +F480 +2AC0 +A520 +7240 +2080 +F700 +ENDCHAR +STARTCHAR U_93D3 +ENCODING 37843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +5540 +8DC0 +76C0 +2540 +F7C0 +2A00 +B540 +7C60 +CBC0 +ENDCHAR +STARTCHAR U_93D4 +ENCODING 37844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +FFE0 +2100 +FFC0 +2540 +AFC0 +7540 +27C0 +F820 +ENDCHAR +STARTCHAR U_93D5 +ENCODING 37845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A80 +FFE0 +2AA0 +FFE0 +2A80 +BBA0 +6AC0 +3BA0 +D2E0 +ENDCHAR +STARTCHAR U_93D6 +ENCODING 37846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +4920 +5FC0 +6220 +5FC0 +8A80 +BFE0 +ENDCHAR +STARTCHAR U_93D7 +ENCODING 37847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FA0 +F9A0 +2F40 +FAA0 +2F20 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_93D8 +ENCODING 37848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5AE0 +8B20 +FEA0 +2240 +F2A0 +2FE0 +AB20 +7AA0 +2A20 +F2E0 +ENDCHAR +STARTCHAR U_93D9 +ENCODING 37849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +54A0 +8FE0 +FA80 +23E0 +FE80 +23E0 +AA80 +73E0 +2280 +FBE0 +ENDCHAR +STARTCHAR U_93DA +ENCODING 37850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +FA80 +2B80 +FA80 +2FA0 +AAA0 +7F40 +2AE0 +F720 +ENDCHAR +STARTCHAR U_93DB +ENCODING 37851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +37E0 +4C20 +F3C0 +2240 +FBC0 +2100 +AFE0 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_93DC +ENCODING 37852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +FC20 +23C0 +FA40 +23C0 +A900 +73C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_93DD +ENCODING 37853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +87C0 +F440 +2FE0 +FAA0 +2FE0 +AA40 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_93DE +ENCODING 37854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8940 +FFE0 +2940 +FFE0 +2D20 +AFE0 +7520 +27E0 +F560 +ENDCHAR +STARTCHAR U_93DF +ENCODING 37855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8940 +FFE0 +2400 +FE80 +27E0 +AC80 +75E0 +2480 +FBE0 +ENDCHAR +STARTCHAR U_93E0 +ENCODING 37856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33E0 +4A40 +F580 +2240 +FCA0 +25C0 +AC80 +77E0 +3C80 +CBE0 +ENDCHAR +STARTCHAR U_93E1 +ENCODING 37857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +7280 +22A0 +FC60 +ENDCHAR +STARTCHAR U_93E2 +ENCODING 37858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +FAA0 +2FE0 +F000 +27C0 +A000 +77E0 +2940 +F320 +ENDCHAR +STARTCHAR U_93E3 +ENCODING 37859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8D40 +FFE0 +2540 +FD40 +25C0 +AC00 +7540 +26A0 +FAA0 +ENDCHAR +STARTCHAR U_93E4 +ENCODING 37860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8540 +FFE0 +2540 +FFE0 +2920 +AFE0 +7240 +2380 +FC60 +ENDCHAR +STARTCHAR U_93E5 +ENCODING 37861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +4A20 +F3E0 +2480 +FDE0 +2520 +ADE0 +7520 +3D20 +C5E0 +ENDCHAR +STARTCHAR U_93E6 +ENCODING 37862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5940 +81C0 +F220 +2C80 +F880 +2A80 +AAE0 +7A80 +2D80 +F8E0 +ENDCHAR +STARTCHAR U_93E7 +ENCODING 37863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1160 +7E00 +55C0 +7E80 +8940 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93E8 +ENCODING 37864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA00 +FBE0 +AA80 +FE80 +2900 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93E9 +ENCODING 37865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2F60 +5280 +FF80 +2AE0 +FFA0 +2AA0 +BFA0 +62A0 +3FA0 +C2A0 +ENDCHAR +STARTCHAR U_93EA +ENCODING 37866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4A80 +FFE0 +2AA0 +FFE0 +2AA0 +BFE0 +6540 +3CC0 +C7C0 +ENDCHAR +STARTCHAR U_93EB +ENCODING 37867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +34A0 +4FA0 +F6A0 +2DA0 +F560 +2FE0 +A900 +7380 +3D40 +C920 +ENDCHAR +STARTCHAR U_93EC +ENCODING 37868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +F920 +2FC0 +F920 +2FE0 +AAA0 +7FE0 +2880 +F980 +ENDCHAR +STARTCHAR U_93ED +ENCODING 37869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3520 +4B40 +F7E0 +2380 +FD40 +2220 +A940 +72A0 +36A0 +CB80 +ENDCHAR +STARTCHAR U_93EE +ENCODING 37870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8900 +FFC0 +2940 +FFE0 +2940 +BFC0 +6B20 +3D40 +D320 +ENDCHAR +STARTCHAR U_93EF +ENCODING 37871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +FBA0 +2540 +FBA0 +2540 +ABA0 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_93F0 +ENCODING 37872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3520 +4FE0 +F000 +2EE0 +FAA0 +2EE0 +BAA0 +6EE0 +3AA0 +D560 +ENDCHAR +STARTCHAR U_93F1 +ENCODING 37873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +7100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_93F2 +ENCODING 37874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4A00 +FFE0 +2AA0 +FBC0 +2280 +ABC0 +7480 +37E0 +C080 +ENDCHAR +STARTCHAR U_93F3 +ENCODING 37875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +F660 +25A0 +FFE0 +2240 +AA40 +73C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_93F4 +ENCODING 37876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +6AE0 +9BA0 +EEA0 +4440 +E5A0 +5600 +D4E0 +74A0 +56A0 +F8E0 +ENDCHAR +STARTCHAR U_93F5 +ENCODING 37877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +8280 +FFE0 +2540 +FFE0 +2540 +AFE0 +7100 +27C0 +F900 +ENDCHAR +STARTCHAR U_93F6 +ENCODING 37878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +B7E0 +6180 +3AC0 +C4A0 +ENDCHAR +STARTCHAR U_93F7 +ENCODING 37879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +56C0 +8FE0 +F280 +2FE0 +F100 +27C0 +A900 +77E0 +2280 +FC60 +ENDCHAR +STARTCHAR U_93F8 +ENCODING 37880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8540 +F7C0 +2540 +F7C0 +2940 +AFA0 +76A0 +2A40 +F3C0 +ENDCHAR +STARTCHAR U_93F9 +ENCODING 37881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +5520 +85E0 +FC80 +2BE0 +FAA0 +2EA0 +ABE0 +7280 +22A0 +FDE0 +ENDCHAR +STARTCHAR U_93FA +ENCODING 37882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +55A0 +8240 +FDE0 +2540 +FE60 +29C0 +AE40 +7280 +2340 +FC20 +ENDCHAR +STARTCHAR U_93FB +ENCODING 37883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +FB40 +2520 +FA40 +27E0 +A940 +75E0 +2240 +FC40 +ENDCHAR +STARTCHAR U_93FC +ENCODING 37884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +5940 +F7E0 +2100 +F7E0 +2520 +B560 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_93FD +ENCODING 37885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5140 +8FE0 +F140 +27C0 +FBA0 +2D60 +ABA0 +7D60 +2BA0 +F120 +ENDCHAR +STARTCHAR U_93FE +ENCODING 37886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +5F80 +8AE0 +FAA0 +2FA0 +FAA0 +2EA0 +AAA0 +7E40 +2AA0 +FB20 +ENDCHAR +STARTCHAR U_93FF +ENCODING 37887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +8820 +F7C0 +2440 +F7C0 +2100 +AFE0 +7580 +2940 +F120 +ENDCHAR +STARTCHAR U_9400 +ENCODING 37888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4D40 +F7C0 +2000 +FFE0 +2540 +B4C0 +67C0 +3280 +CC60 +ENDCHAR +STARTCHAR U_9401 +ENCODING 37889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +5F20 +AAC0 +EE80 +4A80 +EEE0 +4AA0 +6AA0 +DFA0 +6AA0 +D120 +ENDCHAR +STARTCHAR U_9402 +ENCODING 37890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +3280 +4EE0 +FAA0 +2EE0 +F280 +2FE0 +B920 +6FE0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_9403 +ENCODING 37891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2440 +FEE0 +2440 +AFE0 +7280 +22A0 +FC60 +ENDCHAR +STARTCHAR U_9404 +ENCODING 37892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37C0 +4A80 +FFE0 +2100 +FFC0 +2540 +AFC0 +7540 +37C0 +CC60 +ENDCHAR +STARTCHAR U_9405 +ENCODING 37893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +AA00 +73C0 +FC40 +AA80 +FD00 +AAC0 +3F00 +C4C0 +3F80 +1500 +FFC0 +ENDCHAR +STARTCHAR U_9406 +ENCODING 37894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +C540 +AB80 +E540 +8A20 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9407 +ENCODING 37895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5920 +8540 +FFE0 +2540 +F920 +27C0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9408 +ENCODING 37896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F280 +27C0 +FAA0 +2FE0 +B820 +6BA0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_9409 +ENCODING 37897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8FE0 +FC80 +27E0 +FA40 +27E0 +AA40 +77E0 +2240 +FC20 +ENDCHAR +STARTCHAR U_940A +ENCODING 37898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +5B40 +8BC0 +FB40 +2DE0 +FA80 +2BE0 +ADA0 +7EA0 +2920 +F860 +ENDCHAR +STARTCHAR U_940B +ENCODING 37899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +5640 +87C0 +FA40 +27E0 +F900 +2BE0 +AD60 +7AA0 +2D20 +FAC0 +ENDCHAR +STARTCHAR U_940C +ENCODING 37900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5480 +8FE0 +FD20 +27E0 +FA40 +2580 +AA80 +75C0 +22A0 +FD80 +ENDCHAR +STARTCHAR U_940D +ENCODING 37901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5140 +8FE0 +F2A0 +2480 +FFE0 +2AA0 +AC60 +7BA0 +2AA0 +FBE0 +ENDCHAR +STARTCHAR U_940E +ENCODING 37902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +AFE0 +7540 +2AA0 +FAA0 +ENDCHAR +STARTCHAR U_940F +ENCODING 37903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8280 +FFE0 +2AA0 +FC60 +2FE0 +A040 +7FE0 +2440 +F2C0 +ENDCHAR +STARTCHAR U_9410 +ENCODING 37904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F440 +27E0 +FC40 +27C0 +AC40 +77C0 +2540 +FB20 +ENDCHAR +STARTCHAR U_9411 +ENCODING 37905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5440 +89E0 +FA40 +2DE0 +F400 +2AE0 +AFA0 +74A0 +2BE0 +FAA0 +ENDCHAR +STARTCHAR U_9412 +ENCODING 37906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F5C0 +2920 +FFE0 +2220 +AFC0 +7240 +2540 +F880 +ENDCHAR +STARTCHAR U_9413 +ENCODING 37907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +8AE0 +FEA0 +21A0 +FEA0 +22A0 +A440 +7E40 +24A0 +FD20 +ENDCHAR +STARTCHAR U_9414 +ENCODING 37908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +FAA0 +2FE0 +F440 +27C0 +AC40 +7FE0 +2100 +F900 +ENDCHAR +STARTCHAR U_9415 +ENCODING 37909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5540 +8FE0 +FA40 +26C0 +FB60 +27C0 +AC40 +77C0 +2440 +FFC0 +ENDCHAR +STARTCHAR U_9416 +ENCODING 37910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2320 +5540 +8FE0 +F540 +2FE0 +F900 +27E0 +ACA0 +7640 +24A0 +FB20 +ENDCHAR +STARTCHAR U_9417 +ENCODING 37911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3AA0 +4EE0 +FAA0 +2EE0 +FBA0 +2AA0 +BBA0 +6AA0 +3DA0 +C860 +ENDCHAR +STARTCHAR U_9418 +ENCODING 37912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8C40 +FA80 +27E0 +FD40 +27C0 +B540 +6FE0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9419 +ENCODING 37913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +55A0 +8A40 +FBA0 +2420 +FFC0 +2440 +AFC0 +7440 +2280 +FFE0 +ENDCHAR +STARTCHAR U_941A +ENCODING 37914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3280 +4EE0 +F420 +26E0 +FA80 +27E0 +A940 +7620 +3A60 +C1C0 +ENDCHAR +STARTCHAR U_941B +ENCODING 37915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +2FE0 +F800 +27C0 +AC40 +77C0 +3540 +CB20 +ENDCHAR +STARTCHAR U_941C +ENCODING 37916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +2640 +7D40 +0880 +7560 +1F00 +3480 +DF60 +1500 +7FE0 +ENDCHAR +STARTCHAR U_941D +ENCODING 37917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4D40 +FA40 +2FE0 +FAA0 +2FC0 +BA40 +6A40 +3AA0 +D520 +ENDCHAR +STARTCHAR U_941E +ENCODING 37918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +F040 +27E0 +FAA0 +27E0 +A840 +77E0 +3A40 +C0C0 +ENDCHAR +STARTCHAR U_941F +ENCODING 37919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5440 +FEE0 +2440 +FAA0 +27C0 +AC40 +77C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9420 +ENCODING 37920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FAA0 +26C0 +FA80 +2FE0 +AC40 +77C0 +2440 +FFC0 +ENDCHAR +STARTCHAR U_9421 +ENCODING 37921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +54A0 +FFE0 +2080 +FEA0 +2AC0 +BE80 +6AA0 +3560 +CE20 +ENDCHAR +STARTCHAR U_9422 +ENCODING 37922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +2880 +75C0 +6AA0 +A4A0 +3B80 +C4E0 +1F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_9423 +ENCODING 37923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +3540 +4FE0 +FAA0 +2380 +F900 +27C0 +A900 +77E0 +3900 +C300 +ENDCHAR +STARTCHAR U_9424 +ENCODING 37924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +3280 +4BA0 +FAA0 +2BA0 +F820 +2EE0 +A280 +7EE0 +2AA0 +D2A0 +ENDCHAR +STARTCHAR U_9425 +ENCODING 37925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37C0 +4900 +F7C0 +2100 +FFE0 +2540 +AFE0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9426 +ENCODING 37926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3AA0 +4EE0 +FAA0 +2FE0 +FAA0 +2FE0 +BAA0 +6AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_9427 +ENCODING 37927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +5EE0 +FAA0 +2FE0 +FAA0 +2BA0 +BAA0 +6BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9428 +ENCODING 37928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8A80 +FFE0 +24A0 +FFE0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_9429 +ENCODING 37929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +5540 +8BE0 +F920 +26C0 +FD80 +26C0 +ADA0 +76A0 +2500 +FBE0 +ENDCHAR +STARTCHAR U_942A +ENCODING 37930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD40 +27E0 +AD40 +77E0 +2520 +FA40 +ENDCHAR +STARTCHAR U_942B +ENCODING 37931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +57E0 +8C80 +F7E0 +2480 +F7E0 +2400 +AEE0 +7BA0 +2820 +F860 +ENDCHAR +STARTCHAR U_942C +ENCODING 37932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +5500 +8FE0 +F0A0 +2FE0 +F880 +2FA0 +AAA0 +7F40 +2AA0 +F520 +ENDCHAR +STARTCHAR U_942D +ENCODING 37933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4DA0 +F7E0 +27A0 +FD60 +2100 +B7E0 +6100 +3A80 +C460 +ENDCHAR +STARTCHAR U_942E +ENCODING 37934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A80 +FFE0 +2AA0 +FFE0 +2AA0 +AFE0 +7A80 +2EC0 +F2A0 +ENDCHAR +STARTCHAR U_942F +ENCODING 37935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +37E0 +4A40 +F100 +27E0 +F900 +27E0 +B240 +67C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_9430 +ENCODING 37936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +83C0 +F800 +2EE0 +FAA0 +2EE0 +A100 +7FE0 +2540 +F920 +ENDCHAR +STARTCHAR U_9431 +ENCODING 37937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8440 +FBA0 +2000 +FEE0 +2AA0 +AEE0 +7440 +2AA0 +F120 +ENDCHAR +STARTCHAR U_9432 +ENCODING 37938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F400 +27E0 +F920 +27E0 +AD60 +77E0 +2120 +F7C0 +ENDCHAR +STARTCHAR U_9433 +ENCODING 37939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +F920 +2BA0 +FD60 +27C0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9434 +ENCODING 37940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4D00 +F5A0 +2740 +FCE0 +2740 +ADE0 +7540 +3F40 +C840 +ENDCHAR +STARTCHAR U_9435 +ENCODING 37941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +54A0 +8FE0 +FA80 +2E80 +F0A0 +2FA0 +A4C0 +7EA0 +2560 +FE20 +ENDCHAR +STARTCHAR U_9436 +ENCODING 37942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F000 +2FE0 +FC40 +27C0 +A920 +76C0 +2240 +F320 +ENDCHAR +STARTCHAR U_9437 +ENCODING 37943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +FFE0 +2540 +FDC0 +27E0 +A900 +77E0 +2540 +F920 +ENDCHAR +STARTCHAR U_9438 +ENCODING 37944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F900 +27E0 +FA80 +27C0 +A900 +77E0 +2100 +F900 +ENDCHAR +STARTCHAR U_9439 +ENCODING 37945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +3640 +4B40 +F7E0 +2420 +FFA0 +26A0 +B7A0 +6460 +3800 +C7E0 +ENDCHAR +STARTCHAR U_943A +ENCODING 37946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5540 +8FE0 +FAA0 +2380 +F800 +27E0 +AD20 +77E0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_943B +ENCODING 37947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD00 +26A0 +ADC0 +7680 +25C0 +FAA0 +ENDCHAR +STARTCHAR U_943C +ENCODING 37948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFE0 +2440 +FFC0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_943D +ENCODING 37949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +57E0 +8880 +FBE0 +2540 +FFE0 +2480 +AFE0 +7480 +2C80 +F3E0 +ENDCHAR +STARTCHAR U_943E +ENCODING 37950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +CBE0 +7C80 +0A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_943F +ENCODING 37951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +72A0 +2660 +F9C0 +ENDCHAR +STARTCHAR U_9440 +ENCODING 37952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +5540 +8FE0 +F520 +2C40 +F7A0 +2200 +A7C0 +7C80 +2300 +FCE0 +ENDCHAR +STARTCHAR U_9441 +ENCODING 37953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26A0 +5560 +FCA0 +27E0 +FA40 +23A0 +B4A0 +6300 +3980 +C660 +ENDCHAR +STARTCHAR U_9442 +ENCODING 37954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +5100 +FFE0 +2540 +FEC0 +27C0 +B100 +67E0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_9443 +ENCODING 37955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +25A0 +5360 +FCA0 +27E0 +FC80 +27E0 +B480 +67E0 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_9444 +ENCODING 37956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8100 +FFE0 +2120 +FFC0 +2040 +AFE0 +7B40 +2EC0 +F0C0 +ENDCHAR +STARTCHAR U_9445 +ENCODING 37957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5EE0 +8540 +FAA0 +2FE0 +F920 +2FE0 +A900 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_9446 +ENCODING 37958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2B40 +5A40 +8F40 +FAE0 +2440 +FF40 +24C0 +AF40 +7440 +2740 +FCC0 +ENDCHAR +STARTCHAR U_9447 +ENCODING 37959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +82A0 +FD40 +2560 +FD40 +27C0 +AC40 +77C0 +2840 +F040 +ENDCHAR +STARTCHAR U_9448 +ENCODING 37960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5540 +8FE0 +F920 +2DA0 +FB60 +2DA0 +AB60 +7DA0 +2920 +F960 +ENDCHAR +STARTCHAR U_9449 +ENCODING 37961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8540 +FFE0 +2100 +FFE0 +2440 +BFE0 +6AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_944A +ENCODING 37962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8240 +FFE0 +2480 +FFE0 +2480 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_944B +ENCODING 37963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A940 +FAA0 +A940 +FFE0 +2A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_944C +ENCODING 37964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +FFE0 +2540 +F7C0 +2C40 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_944D +ENCODING 37965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +AAA0 +FBE0 +5540 +8A20 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_944E +ENCODING 37966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +55C0 +FD40 +27E0 +FD40 +25C0 +B540 +6480 +3D40 +C7E0 +ENDCHAR +STARTCHAR U_944F +ENCODING 37967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F5E0 +2000 +FFE0 +2AA0 +AFE0 +77C0 +2100 +F300 +ENDCHAR +STARTCHAR U_9450 +ENCODING 37968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +F920 +2BA0 +FD60 +2FE0 +A100 +7FE0 +2AA0 +FAE0 +ENDCHAR +STARTCHAR U_9451 +ENCODING 37969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +5A40 +8F60 +F940 +2FA0 +FA20 +2A00 +AFE0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_9452 +ENCODING 37970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FD00 +8880 +FFE0 +AAA0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9453 +ENCODING 37971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +52A0 +FFE0 +2A40 +FA80 +2BE0 +BA20 +6BE0 +3800 +D7E0 +ENDCHAR +STARTCHAR U_9454 +ENCODING 37972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +FFE0 +2540 +FB80 +2440 +BFE0 +6100 +3540 +CB20 +ENDCHAR +STARTCHAR U_9455 +ENCODING 37973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5880 +8FE0 +FAA0 +2AA0 +FFC0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_9456 +ENCODING 37974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +5240 +FFE0 +2520 +FFE0 +2140 +BFE0 +6540 +3EA0 +C960 +ENDCHAR +STARTCHAR U_9457 +ENCODING 37975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +54E0 +8FA0 +F4A0 +2FA0 +F440 +2920 +AD40 +7380 +2D40 +F320 +ENDCHAR +STARTCHAR U_9458 +ENCODING 37976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +5540 +FFC0 +2540 +FFE0 +2AA0 +BFE0 +6AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_9459 +ENCODING 37977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2CA0 +55E0 +FE80 +25A0 +FD40 +27E0 +B420 +67E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_945A +ENCODING 37978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5440 +FFE0 +2AA0 +FFE0 +2440 +B7C0 +6440 +37C0 +CC60 +ENDCHAR +STARTCHAR U_945B +ENCODING 37979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +5540 +FFE0 +2540 +FFE0 +2540 +B7C0 +6540 +3BC0 +CA20 +ENDCHAR +STARTCHAR U_945C +ENCODING 37980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +5AA0 +F380 +2000 +FFC0 +2540 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_945D +ENCODING 37981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F9E0 +2540 +FCA0 +27E0 +AC80 +77E0 +2A80 +F1E0 +ENDCHAR +STARTCHAR U_945E +ENCODING 37982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5540 +8AA0 +FFE0 +2AA0 +FFE0 +2540 +AFC0 +7540 +25C0 +FF20 +ENDCHAR +STARTCHAR U_945F +ENCODING 37983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2AA0 +FFE0 +2540 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_9460 +ENCODING 37984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5BC0 +86A0 +FBA0 +2AC0 +FFA0 +2100 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_9461 +ENCODING 37985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +25E0 +5500 +FFE0 +2000 +FFE0 +2AA0 +BFE0 +6AA0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_9462 +ENCODING 37986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD40 +27C0 +AD40 +77C0 +2AA0 +F5C0 +ENDCHAR +STARTCHAR U_9463 +ENCODING 37987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +FFE0 +2A00 +FAA0 +2BC0 +AAA0 +7BE0 +2540 +FAA0 +ENDCHAR +STARTCHAR U_9464 +ENCODING 37988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +87C0 +F440 +2FE0 +F280 +2FE0 +A540 +7BA0 +2540 +FB20 +ENDCHAR +STARTCHAR U_9465 +ENCODING 37989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +57E0 +FCA0 +27E0 +FCA0 +27E0 +BC20 +67E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_9466 +ENCODING 37990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +5FA0 +EA40 +2FA0 +F000 +27C0 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_9467 +ENCODING 37991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5AA0 +F7C0 +2280 +F7C0 +2640 +B540 +67C0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_9468 +ENCODING 37992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5F80 +8AE0 +F420 +2FE0 +FA80 +2EE0 +AA80 +7EE0 +2A80 +FAE0 +ENDCHAR +STARTCHAR U_9469 +ENCODING 37993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +FBA0 +2FE0 +F100 +2FE0 +ABA0 +7FE0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_946A +ENCODING 37994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +FD20 +27E0 +FD40 +27C0 +AD40 +77E0 +24A0 +FFE0 +ENDCHAR +STARTCHAR U_946B +ENCODING 37995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1500 +7FC0 +1500 +FFE0 +2080 +5140 +AAA0 +FFE0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_946C +ENCODING 37996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +5F40 +EA20 +2FC0 +F540 +26C0 +B540 +67C0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_946D +ENCODING 37997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +FAA0 +2FE0 +F920 +2FE0 +AAA0 +7FE0 +2BA0 +FD60 +ENDCHAR +STARTCHAR U_946E +ENCODING 37998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F7E0 +2AA0 +F7E0 +2AA0 +AC40 +77E0 +2540 +F4C0 +ENDCHAR +STARTCHAR U_946F +ENCODING 37999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +55A0 +8FE0 +FA80 +2BA0 +FAA0 +2BC0 +AA80 +7AA0 +2B60 +FE20 +ENDCHAR +STARTCHAR U_9470 +ENCODING 38000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5440 +8BA0 +F000 +2FE0 +FAA0 +2FE0 +AAA0 +7FE0 +2AA0 +FAA0 +ENDCHAR +STARTCHAR U_9471 +ENCODING 38001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +57C0 +8C40 +F7C0 +24C0 +F4A0 +27E0 +AD40 +77C0 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_9472 +ENCODING 38002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +FEE0 +2280 +FFE0 +2280 +AFE0 +72A0 +2640 +FB20 +ENDCHAR +STARTCHAR U_9473 +ENCODING 38003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F7C0 +2280 +FFE0 +2440 +AFC0 +75E0 +2500 +FBE0 +ENDCHAR +STARTCHAR U_9474 +ENCODING 38004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8D00 +FFE0 +2480 +F7E0 +2480 +AFE0 +7BA0 +2EE0 +FBA0 +ENDCHAR +STARTCHAR U_9475 +ENCODING 38005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +8280 +FEE0 +2AA0 +FFE0 +2480 +AFE0 +7480 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9476 +ENCODING 38006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8AA0 +F7E0 +5440 +FFC0 +4540 +DFE0 +7540 +57C0 +ECA0 +ENDCHAR +STARTCHAR U_9477 +ENCODING 38007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8BC0 +FA60 +27C0 +F840 +27E0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9478 +ENCODING 38008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +87C0 +F540 +2FE0 +FAA0 +2FE0 +AAA0 +7FE0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_9479 +ENCODING 38009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5AA0 +F540 +2C60 +F7C0 +2540 +B7C0 +6540 +3FC0 +C560 +ENDCHAR +STARTCHAR U_947A +ENCODING 38010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +5EE0 +EAA0 +2EE0 +F500 +2FE0 +B900 +6FE0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_947B +ENCODING 38011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5540 +FEE0 +2540 +F7C0 +2540 +B920 +67C0 +3100 +C300 +ENDCHAR +STARTCHAR U_947C +ENCODING 38012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F540 +2BE0 +FF40 +25E0 +A940 +7FE0 +2B40 +F5E0 +ENDCHAR +STARTCHAR U_947D +ENCODING 38013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +8440 +FFE0 +2A40 +FFE0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_947E +ENCODING 38014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +A0A0 +4E40 +E0E0 +4E40 +AAA0 +1F00 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_947F +ENCODING 38015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29C0 +FD40 +2A60 +FDC0 +A480 +FF40 +1520 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9480 +ENCODING 38016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +A460 +1F40 +F5E0 +5F40 +F040 +5E40 +DA40 +FF40 +55A0 +F520 +ENDCHAR +STARTCHAR U_9481 +ENCODING 38017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +FAA0 +2FE0 +F7E0 +2480 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_9482 +ENCODING 38018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +84A0 +FFE0 +2AA0 +FFE0 +2100 +AFC0 +7100 +2FE0 +FAA0 +ENDCHAR +STARTCHAR U_9483 +ENCODING 38019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5820 +8FE0 +F900 +2FE0 +FAA0 +2FE0 +AD60 +7FA0 +2920 +FFC0 +ENDCHAR +STARTCHAR U_9484 +ENCODING 38020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +5440 +FEE0 +2AA0 +FEE0 +2AA0 +BFE0 +6920 +3BA0 +CD60 +ENDCHAR +STARTCHAR U_9485 +ENCODING 38021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +20 +7C +80 +78 +20 +FC +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_9486 +ENCODING 38022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7A00 +8200 +FA00 +2200 +FA00 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_9487 +ENCODING 38023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43C0 +7840 +8080 +F880 +2100 +F900 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_9488 +ENCODING 38024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7880 +8080 +FBE0 +2080 +F880 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_9489 +ENCODING 38025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +8080 +F880 +2080 +F880 +2080 +2880 +3080 +2380 +ENDCHAR +STARTCHAR U_948A +ENCODING 38026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +4020 +7920 +8120 +F920 +2120 +F920 +2120 +2820 +3020 +20E0 +ENDCHAR +STARTCHAR U_948B +ENCODING 38027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +8100 +F980 +2140 +F920 +2120 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_948C +ENCODING 38028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4020 +7840 +8080 +F880 +2080 +F880 +2080 +2C80 +3280 +2100 +ENDCHAR +STARTCHAR U_948D +ENCODING 38029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7880 +8080 +FBE0 +2080 +F880 +2080 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_948E +ENCODING 38030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7880 +8080 +F880 +27E0 +F880 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_948F +ENCODING 38031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4220 +7AA0 +82A0 +FAA0 +22A0 +FAA0 +22A0 +2AA0 +34A0 +2820 +ENDCHAR +STARTCHAR U_9490 +ENCODING 38032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4080 +7900 +8220 +F840 +2080 +F920 +2040 +2880 +3100 +2600 +ENDCHAR +STARTCHAR U_9491 +ENCODING 38033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7A40 +4240 +FA80 +22E0 +2240 +FB40 +2280 +2C80 +3540 +2A20 +ENDCHAR +STARTCHAR U_9492 +ENCODING 38034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FB40 +22C0 +FA40 +2240 +2A40 +3440 +2860 +ENDCHAR +STARTCHAR U_9493 +ENCODING 38035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F820 +2220 +F920 +2120 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_9494 +ENCODING 38036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +42E0 +7820 +8420 +FC20 +2420 +FC20 +2420 +2C20 +3420 +2460 +ENDCHAR +STARTCHAR U_9495 +ENCODING 38037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +87E0 +FA40 +2240 +FC40 +2280 +2980 +3140 +2620 +ENDCHAR +STARTCHAR U_9496 +ENCODING 38038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7880 +4100 +FA00 +27E0 +22A0 +FCA0 +2120 +2A20 +34A0 +2040 +ENDCHAR +STARTCHAR U_9497 +ENCODING 38039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7AA0 +82A0 +FA40 +2240 +F940 +2080 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_9498 +ENCODING 38040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7A40 +4240 +FA40 +2FE0 +2240 +FA40 +2240 +2A40 +3440 +2840 +ENDCHAR +STARTCHAR U_9499 +ENCODING 38041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4080 +7A80 +82E0 +FC80 +27E0 +F820 +2020 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_949A +ENCODING 38042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +8080 +F9C0 +22A0 +FCA0 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_949B +ENCODING 38043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +87E0 +F900 +2100 +F900 +2180 +2A40 +3560 +2920 +ENDCHAR +STARTCHAR U_949C +ENCODING 38044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4200 +7A00 +83E0 +FA20 +2220 +FBE0 +2220 +2A00 +3200 +23E0 +ENDCHAR +STARTCHAR U_949D +ENCODING 38045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8540 +FD40 +2540 +FFC0 +2100 +2920 +3120 +20E0 +ENDCHAR +STARTCHAR U_949E +ENCODING 38046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7AC0 +82A0 +FAA0 +2480 +F8A0 +2020 +2840 +3180 +2600 +ENDCHAR +STARTCHAR U_949F +ENCODING 38047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8520 +7520 +2520 +FFE0 +2100 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_94A0 +ENCODING 38048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +84A0 +FCA0 +24A0 +FD60 +2620 +2C20 +3420 +2460 +ENDCHAR +STARTCHAR U_94A1 +ENCODING 38049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7D40 +8540 +FD40 +2540 +FD40 +2540 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94A2 +ENCODING 38050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7CA0 +86A0 +FD20 +2520 +FDA0 +2660 +2C20 +3420 +24E0 +ENDCHAR +STARTCHAR U_94A3 +ENCODING 38051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4380 +7A00 +83E0 +FA20 +2220 +FB40 +22C0 +2A80 +3540 +2A20 +ENDCHAR +STARTCHAR U_94A4 +ENCODING 38052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7C40 +8120 +F880 +2000 +FFC0 +2080 +2880 +3100 +2100 +ENDCHAR +STARTCHAR U_94A5 +ENCODING 38053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +FA20 +2220 +FBE0 +2220 +2A20 +34A0 +2840 +ENDCHAR +STARTCHAR U_94A6 +ENCODING 38054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8220 +FD40 +2100 +F900 +2280 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94A7 +ENCODING 38055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F920 +20A0 +F8A0 +2720 +2A20 +3020 +20C0 +ENDCHAR +STARTCHAR U_94A8 +ENCODING 38056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +8440 +FD80 +2400 +FFE0 +2020 +2FA0 +3020 +20C0 +ENDCHAR +STARTCHAR U_94A9 +ENCODING 38057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F920 +2120 +FAA0 +27E0 +2820 +3020 +20C0 +ENDCHAR +STARTCHAR U_94AA +ENCODING 38058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8000 +FB80 +2280 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94AB +ENCODING 38059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8100 +F9E0 +2120 +F920 +2120 +2A20 +34E0 +2840 +ENDCHAR +STARTCHAR U_94AC +ENCODING 38060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7AA0 +82A0 +FAC0 +2480 +F880 +2080 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_94AD +ENCODING 38061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4240 +7940 +8040 +FA40 +2140 +F8E0 +2740 +2840 +3040 +2040 +ENDCHAR +STARTCHAR U_94AE +ENCODING 38062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7940 +8140 +F940 +27C0 +FA40 +2240 +2A40 +3240 +2FE0 +ENDCHAR +STARTCHAR U_94AF +ENCODING 38063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7CA0 +84A0 +FCA0 +27E0 +FC00 +2400 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_94B0 +ENCODING 38064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7900 +8100 +F900 +27C0 +F900 +2140 +2920 +3100 +2FE0 +ENDCHAR +STARTCHAR U_94B1 +ENCODING 38065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +72E0 +8700 +F260 +2780 +F240 +2280 +2120 +32A0 +2C60 +ENDCHAR +STARTCHAR U_94B2 +ENCODING 38066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4080 +7880 +8080 +FA80 +22E0 +FA80 +2280 +2A80 +3280 +2FE0 +ENDCHAR +STARTCHAR U_94B3 +ENCODING 38067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4240 +7FE0 +8240 +FA40 +23C0 +FA40 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94B4 +ENCODING 38068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +8080 +F880 +23E0 +FA20 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94B5 +ENCODING 38069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8100 +FB80 +2540 +F920 +2100 +2FC0 +3100 +2100 +ENDCHAR +STARTCHAR U_94B6 +ENCODING 38070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4040 +7840 +8740 +FD40 +2540 +FF40 +2540 +2840 +3140 +2080 +ENDCHAR +STARTCHAR U_94B7 +ENCODING 38071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +7C00 +85C0 +FD40 +2540 +FDC0 +2540 +2C00 +3400 +27E0 +ENDCHAR +STARTCHAR U_94B8 +ENCODING 38072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43E0 +7900 +8280 +FBE0 +26A0 +FAA0 +22A0 +2AA0 +32E0 +2080 +ENDCHAR +STARTCHAR U_94B9 +ENCODING 38073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +7FE0 +8200 +FBC0 +2240 +FA40 +2340 +2C80 +3940 +2620 +ENDCHAR +STARTCHAR U_94BA +ENCODING 38074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +7FE0 +8480 +FCA0 +24A0 +FCA0 +24C0 +2EA0 +3560 +2220 +ENDCHAR +STARTCHAR U_94BB +ENCODING 38075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +79E0 +8100 +F900 +27E0 +FC20 +2420 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_94BC +ENCODING 38076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +FA20 +2220 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94BD +ENCODING 38077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FBC0 +2240 +FA40 +23C0 +2A40 +3000 +27E0 +ENDCHAR +STARTCHAR U_94BE +ENCODING 38078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +7CA0 +87E0 +FCA0 +24A0 +FFE0 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_94BF +ENCODING 38079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7CA0 +84A0 +FCA0 +27E0 +FCA0 +24A0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_94C0 +ENCODING 38080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +84A0 +FCA0 +24A0 +FFE0 +24A0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_94C1 +ENCODING 38081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7500 +47C0 +7900 +A100 +2FE0 +F100 +2280 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94C2 +ENCODING 38082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4100 +7BE0 +8220 +FA20 +23E0 +FA20 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94C3 +ENCODING 38083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4180 +7A40 +8520 +F880 +2000 +FBE0 +2040 +2A80 +3100 +2080 +ENDCHAR +STARTCHAR U_94C4 +ENCODING 38084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7A00 +8280 +FA80 +27E0 +F880 +22C0 +2AA0 +34A0 +2980 +ENDCHAR +STARTCHAR U_94C5 +ENCODING 38085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FC60 +2000 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94C6 +ENCODING 38086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4CE0 +78A0 +8AA0 +FAA0 +2AA0 +FEA0 +2AA0 +2AE0 +3480 +2880 +ENDCHAR +STARTCHAR U_94C7 +ENCODING 38087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +77C0 +8840 +7740 +2540 +F740 +24C0 +2420 +3420 +23E0 +ENDCHAR +STARTCHAR U_94C8 +ENCODING 38088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7880 +83E0 +FAA0 +22A0 +FAA0 +22A0 +2AA0 +32E0 +2080 +ENDCHAR +STARTCHAR U_94C9 +ENCODING 38089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +8100 +FA20 +27C0 +F880 +2100 +2A40 +37A0 +2020 +ENDCHAR +STARTCHAR U_94CA +ENCODING 38090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7C20 +8000 +FA00 +2240 +FA80 +2300 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94CB +ENCODING 38091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +40A0 +78A0 +8140 +F940 +2560 +FDA0 +2100 +2B20 +3520 +28E0 +ENDCHAR +STARTCHAR U_94CC +ENCODING 38092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7C20 +87E0 +FC00 +2520 +FD40 +2580 +2D20 +3520 +28E0 +ENDCHAR +STARTCHAR U_94CD +ENCODING 38093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +43E0 +7AA0 +8280 +FA80 +23E0 +FA40 +2340 +2A80 +3540 +2A20 +ENDCHAR +STARTCHAR U_94CE +ENCODING 38094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7980 +8660 +F880 +2080 +FBE0 +2080 +2FE0 +3080 +2080 +ENDCHAR +STARTCHAR U_94CF +ENCODING 38095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +6AA0 +8AA0 +FFA0 +4AA0 +EAA0 +4AA0 +4A20 +6A20 +5260 +ENDCHAR +STARTCHAR U_94D0 +ENCODING 38096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +47A0 +7940 +87E0 +F900 +23E0 +FD00 +23E0 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_94D1 +ENCODING 38097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +7FA0 +8140 +FFE0 +2100 +FA40 +2680 +2B20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94D2 +ENCODING 38098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7A40 +83C0 +FA40 +23C0 +FA40 +2260 +2FC0 +3040 +2040 +ENDCHAR +STARTCHAR U_94D3 +ENCODING 38099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7240 +8240 +7100 +2FE0 +F200 +2200 +2200 +3200 +23C0 +ENDCHAR +STARTCHAR U_94D4 +ENCODING 38100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7280 +8280 +7AA0 +26A0 +F6C0 +2280 +2A80 +37E0 +2000 +ENDCHAR +STARTCHAR U_94D5 +ENCODING 38101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +83E0 +FA20 +27E0 +FA20 +23E0 +2A20 +3220 +2260 +ENDCHAR +STARTCHAR U_94D6 +ENCODING 38102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +7FE0 +8880 +FE80 +4AA0 +FAA0 +4A40 +5EC0 +6960 +5220 +ENDCHAR +STARTCHAR U_94D7 +ENCODING 38103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8520 +FB40 +2100 +FFE0 +2100 +2980 +3240 +2C20 +ENDCHAR +STARTCHAR U_94D8 +ENCODING 38104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +42A0 +7AA0 +8AC0 +FFA0 +22A0 +FAA0 +26A0 +2AE0 +3280 +2680 +ENDCHAR +STARTCHAR U_94D9 +ENCODING 38105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47E0 +7A80 +8120 +FAA0 +2440 +FFE0 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94DA +ENCODING 38106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7100 +8240 +F7E0 +4100 +F100 +47C0 +5100 +6100 +4FE0 +ENDCHAR +STARTCHAR U_94DB +ENCODING 38107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +42A0 +7AC0 +8080 +FBE0 +2020 +F820 +23E0 +2820 +37E0 +2020 +ENDCHAR +STARTCHAR U_94DC +ENCODING 38108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +7820 +8BA0 +F820 +4BA0 +FAA0 +4BA0 +5820 +6820 +48E0 +ENDCHAR +STARTCHAR U_94DD +ENCODING 38109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +83C0 +FA40 +2000 +FFE0 +2420 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_94DE +ENCODING 38110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +F880 +27E0 +FCA0 +24A0 +2CA0 +34E0 +2080 +ENDCHAR +STARTCHAR U_94DF +ENCODING 38111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +7920 +8FE0 +F920 +4920 +F9A0 +4A60 +5C20 +6FE0 +4820 +ENDCHAR +STARTCHAR U_94E0 +ENCODING 38112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +44A0 +7FE0 +8000 +FFE0 +2020 +FBE0 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94E1 +ENCODING 38113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +5120 +7520 +95A0 +F5A0 +55A0 +F5A0 +5520 +4420 +6A20 +5160 +ENDCHAR +STARTCHAR U_94E2 +ENCODING 38114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +77E0 +8900 +F100 +2FE0 +F100 +2380 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_94E3 +ENCODING 38115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +7FE0 +8500 +F900 +27E0 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94E4 +ENCODING 38116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +43C0 +7240 +8440 +FFE0 +2240 +FA40 +25E0 +2A00 +3500 +28E0 +ENDCHAR +STARTCHAR U_94E5 +ENCODING 38117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +43C0 +7880 +83E0 +F880 +27E0 +F880 +2100 +2A40 +37A0 +2220 +ENDCHAR +STARTCHAR U_94E6 +ENCODING 38118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7700 +8100 +7100 +2FE0 +2100 +F7C0 +2440 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_94E7 +ENCODING 38119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +42A0 +7EC0 +8380 +FAA0 +22E0 +F880 +27E0 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_94E8 +ENCODING 38120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7C40 +8020 +FFC0 +2100 +F900 +27C0 +2900 +3100 +27E0 +ENDCHAR +STARTCHAR U_94E9 +ENCODING 38121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +4240 +7980 +8660 +F880 +27E0 +F880 +22C0 +2AA0 +34A0 +2180 +ENDCHAR +STARTCHAR U_94EA +ENCODING 38122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4180 +7240 +8420 +FBC0 +2000 +FBC0 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94EB +ENCODING 38123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +7AA0 +86C0 +FA80 +22C0 +FEA0 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94EC +ENCODING 38124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7A40 +8580 +FA40 +2420 +FBE0 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94ED +ENCODING 38125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41E0 +7A20 +8540 +F880 +2100 +FBE0 +2620 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94EE +ENCODING 38126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4380 +7500 +8FC0 +F140 +2FE0 +F140 +27C0 +2100 +3100 +2300 +ENDCHAR +STARTCHAR U_94EF +ENCODING 38127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7A80 +87E0 +FAA0 +22A0 +FBE0 +2220 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_94F0 +ENCODING 38128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8240 +FC20 +2040 +FA40 +2180 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_94F1 +ENCODING 38129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +8100 +FA80 +26A0 +FAC0 +2280 +2A40 +3320 +2620 +ENDCHAR +STARTCHAR U_94F2 +ENCODING 38130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7A20 +8140 +FFE0 +2400 +FC00 +2400 +2C00 +3400 +2800 +ENDCHAR +STARTCHAR U_94F3 +ENCODING 38131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8240 +FFA0 +2000 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94F4 +ENCODING 38132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4440 +7080 +8900 +F7E0 +42A0 +F520 +4E60 +54A0 +6520 +46C0 +ENDCHAR +STARTCHAR U_94F5 +ENCODING 38133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +8100 +FFE0 +2140 +F940 +2240 +2A80 +3140 +2620 +ENDCHAR +STARTCHAR U_94F6 +ENCODING 38134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7C40 +87C0 +FC40 +27C0 +FD20 +2540 +2C80 +3540 +2620 +ENDCHAR +STARTCHAR U_94F7 +ENCODING 38135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4400 +7FE0 +8AA0 +FAA0 +2AA0 +FAA0 +2AA0 +26A0 +35E0 +28A0 +ENDCHAR +STARTCHAR U_94F8 +ENCODING 38136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7100 +87E0 +F200 +2FE0 +F440 +27E0 +2C40 +3240 +20C0 +ENDCHAR +STARTCHAR U_94F9 +ENCODING 38137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8FE0 +F820 +2100 +FFE0 +2120 +2920 +32E0 +2C40 +ENDCHAR +STARTCHAR U_94FA +ENCODING 38138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4140 +7FE0 +8100 +FFE0 +2520 +FFE0 +2520 +2FE0 +3520 +2560 +ENDCHAR +STARTCHAR U_94FB +ENCODING 38139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +77C0 +8140 +7140 +27E0 +F000 +23C0 +2A40 +3240 +23C0 +ENDCHAR +STARTCHAR U_94FC +ENCODING 38140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8540 +FB80 +27E0 +F900 +2380 +2B40 +3520 +2100 +ENDCHAR +STARTCHAR U_94FD +ENCODING 38141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +8FE0 +F280 +2580 +2680 +FD80 +24A0 +2DA0 +3760 +2020 +ENDCHAR +STARTCHAR U_94FE +ENCODING 38142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4BE0 +7500 +8280 +FFE0 +2480 +FFE0 +2480 +2480 +3A00 +29E0 +ENDCHAR +STARTCHAR U_94FF +ENCODING 38143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4AE0 +7AA0 +8AA0 +FA40 +22A0 +F120 +2100 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_9500 +ENCODING 38144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4520 +7B40 +87E0 +FC20 +27E0 +FC20 +27E0 +2C20 +3420 +24E0 +ENDCHAR +STARTCHAR U_9501 +ENCODING 38145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4100 +77C0 +8440 +7540 +2540 +F540 +2540 +3280 +2C60 +ENDCHAR +STARTCHAR U_9502 +ENCODING 38146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +42A0 +7AA0 +83E0 +FAA0 +23E0 +F880 +23E0 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_9503 +ENCODING 38147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +F800 +27E0 +F880 +23E0 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_9504 +ENCODING 38148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4E80 +7BE0 +8EA0 +FAA0 +4AA0 +FEA0 +4AA0 +5AA0 +6F20 +42C0 +ENDCHAR +STARTCHAR U_9505 +ENCODING 38149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +83C0 +F900 +27E0 +FD20 +25A0 +2E60 +3420 +2460 +ENDCHAR +STARTCHAR U_9506 +ENCODING 38150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +7BE0 +8480 +F880 +27E0 +F800 +23E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9507 +ENCODING 38151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +46C0 +7AA0 +87E0 +FA80 +23A0 +FEA0 +22C0 +2A80 +3360 +2620 +ENDCHAR +STARTCHAR U_9508 +ENCODING 38152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +8FE0 +F540 +2920 +F7C0 +2280 +22E0 +2A20 +3420 +28C0 +ENDCHAR +STARTCHAR U_9509 +ENCODING 38153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7D40 +8540 +FBA0 +2120 +F900 +27C0 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_950A +ENCODING 38154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +47A0 +7D20 +82C0 +F840 +27E0 +F840 +2240 +2940 +3040 +20C0 +ENDCHAR +STARTCHAR U_950B +ENCODING 38155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4640 +7980 +8660 +F900 +27E0 +F900 +23C0 +2900 +37E0 +2100 +ENDCHAR +STARTCHAR U_950C +ENCODING 38156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4220 +F940 +27E0 +F880 +2080 +23E0 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_950D +ENCODING 38157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8240 +FFA0 +2000 +FD40 +2540 +2D40 +3540 +2960 +ENDCHAR +STARTCHAR U_950E +ENCODING 38158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4220 +7820 +8FE0 +FAA0 +4FE0 +FAA0 +4AA0 +5AA0 +6CA0 +4860 +ENDCHAR +STARTCHAR U_950F +ENCODING 38159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +4220 +7820 +8BA0 +FAA0 +4BA0 +FAA0 +4BA0 +5820 +6820 +4860 +ENDCHAR +STARTCHAR U_9510 +ENCODING 38160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +77C0 +8440 +F440 +27C0 +F280 +2280 +2AA0 +34A0 +28E0 +ENDCHAR +STARTCHAR U_9511 +ENCODING 38161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +7FE0 +8120 +FFE0 +2500 +FFE0 +2120 +2B20 +3560 +2900 +ENDCHAR +STARTCHAR U_9512 +ENCODING 38162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +FD20 +2540 +2C80 +3540 +2620 +ENDCHAR +STARTCHAR U_9513 +ENCODING 38163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +7BC0 +8040 +FFE0 +2420 +FBC0 +2240 +2980 +3180 +2660 +ENDCHAR +STARTCHAR U_9514 +ENCODING 38164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +8400 +FFE0 +2420 +FFA0 +26A0 +2FA0 +3420 +28C0 +ENDCHAR +STARTCHAR U_9515 +ENCODING 38165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5440 +7440 +99C0 +F540 +5540 +F5C0 +5C40 +5040 +7040 +50C0 +ENDCHAR +STARTCHAR U_9516 +ENCODING 38166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +77C0 +8100 +FFE0 +2240 +FBC0 +2240 +2BC0 +3240 +22C0 +ENDCHAR +STARTCHAR U_9517 +ENCODING 38167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47A0 +7940 +87E0 +F900 +23C0 +FE40 +23C0 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_9518 +ENCODING 38168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +8100 +FFE0 +2100 +FBE0 +2620 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9519 +ENCODING 38169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8280 +EFE0 +4000 +F7C0 +4440 +47C0 +5440 +67C0 +ENDCHAR +STARTCHAR U_951A +ENCODING 38170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +8000 +FFE0 +24A0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_951B +ENCODING 38171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8540 +FFE0 +2100 +F240 +2FE0 +2240 +3440 +2840 +ENDCHAR +STARTCHAR U_951C +ENCODING 38172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +4280 +F440 +2FE0 +F040 +2F40 +2540 +3740 +2140 +0080 +ENDCHAR +STARTCHAR U_951D +ENCODING 38173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7BC0 +8240 +FBC0 +2000 +FBE0 +2040 +2FE0 +3240 +21C0 +ENDCHAR +STARTCHAR U_951E +ENCODING 38174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +7FC0 +8540 +FFC0 +2100 +FFE0 +2180 +2B40 +3520 +2920 +ENDCHAR +STARTCHAR U_951F +ENCODING 38175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +8420 +FFE0 +2480 +FCA0 +27C0 +2C80 +35A0 +2660 +ENDCHAR +STARTCHAR U_9520 +ENCODING 38176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +3BC0 +4240 +FBC0 +2000 +FFE0 +2420 +27E0 +3420 +27E0 +ENDCHAR +STARTCHAR U_9521 +ENCODING 38177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +8440 +FFC0 +2400 +F7E0 +2AA0 +22A0 +3520 +22C0 +ENDCHAR +STARTCHAR U_9522 +ENCODING 38178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +7920 +8FE0 +F920 +4BA0 +FAA0 +4BA0 +5820 +6FE0 +4820 +ENDCHAR +STARTCHAR U_9523 +ENCODING 38179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7AA0 +8FE0 +F900 +21E0 +F220 +2540 +2880 +3300 +2C00 +ENDCHAR +STARTCHAR U_9524 +ENCODING 38180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7100 +8FE0 +F540 +2FE0 +F540 +2540 +2FE0 +3100 +27C0 +ENDCHAR +STARTCHAR U_9525 +ENCODING 38181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4480 +7FE0 +8480 +FFE0 +2480 +FFE0 +2480 +2C80 +37E0 +2400 +ENDCHAR +STARTCHAR U_9526 +ENCODING 38182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +F900 +2FE0 +2920 +3960 +2100 +ENDCHAR +STARTCHAR U_9527 +ENCODING 38183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6880 +8FE0 +E880 +4BE0 +EA20 +4AA0 +4AA0 +6AA0 +5140 +2220 +ENDCHAR +STARTCHAR U_9528 +ENCODING 38184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4C80 +78E0 +8920 +FE80 +4A80 +FA80 +4A80 +5A80 +6B40 +5220 +ENDCHAR +STARTCHAR U_9529 +ENCODING 38185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +7FE0 +8100 +FFE0 +2240 +FFE0 +2240 +2AC0 +3220 +21E0 +ENDCHAR +STARTCHAR U_952A +ENCODING 38186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +7AA0 +84A0 +F920 +22C0 +F900 +22C0 +2A20 +3660 +29C0 +ENDCHAR +STARTCHAR U_952B +ENCODING 38187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7A20 +8140 +FFE0 +2000 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_952C +ENCODING 38188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +42C0 +7A80 +8540 +FAA0 +2080 +FAA0 +22C0 +2C80 +3140 +2620 +ENDCHAR +STARTCHAR U_952D +ENCODING 38189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +8000 +FFE0 +2080 +FAE0 +2280 +2A80 +3580 +28E0 +ENDCHAR +STARTCHAR U_952E +ENCODING 38190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +47E0 +68A0 +8BE0 +FCA0 +47E0 +E480 +57E0 +4880 +6C80 +53E0 +ENDCHAR +STARTCHAR U_952F +ENCODING 38191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7C20 +87E0 +FC80 +27E0 +FC80 +27E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9530 +ENCODING 38192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4080 +7100 +8FE0 +F100 +4300 +F000 +4FE0 +5AA0 +6AA0 +5FE0 +ENDCHAR +STARTCHAR U_9531 +ENCODING 38193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +42A0 +7D40 +82A0 +FAA0 +27E0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_9532 +ENCODING 38194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4FE0 +74A0 +8EA0 +F4A0 +4EA0 +F540 +4FE0 +5100 +6280 +4C60 +ENDCHAR +STARTCHAR U_9533 +ENCODING 38195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +7280 +4100 +F7C0 +2540 +F540 +2FE0 +2280 +3440 +2820 +ENDCHAR +STARTCHAR U_9534 +ENCODING 38196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44A0 +7FC0 +84A0 +FEE0 +2080 +FBE0 +2220 +2BE0 +3220 +23E0 +ENDCHAR +STARTCHAR U_9535 +ENCODING 38197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +42E0 +7B20 +86A0 +FA40 +22C0 +FBE0 +2740 +2AC0 +3240 +22C0 +ENDCHAR +STARTCHAR U_9536 +ENCODING 38198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +7CA0 +87E0 +FCA0 +27E0 +F900 +22C0 +2A20 +3640 +29C0 +ENDCHAR +STARTCHAR U_9537 +ENCODING 38199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7EE0 +8000 +F7C0 +2000 +FFE0 +2200 +27C0 +3040 +2180 +ENDCHAR +STARTCHAR U_9538 +ENCODING 38200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7080 +87E0 +F880 +22E0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_9539 +ENCODING 38201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4C40 +7540 +8F60 +F540 +2640 +F540 +2C40 +2CA0 +3520 +2620 +ENDCHAR +STARTCHAR U_953A +ENCODING 38202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +7FE0 +8540 +FFC0 +2540 +FFC0 +2100 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_953B +ENCODING 38203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7D40 +4940 +8E60 +F800 +4FE0 +F940 +4F40 +5880 +6940 +4A20 +ENDCHAR +STARTCHAR U_953C +ENCODING 38204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4D60 +7920 +8FE0 +F920 +4FE0 +F100 +47E0 +5240 +6180 +4E60 +ENDCHAR +STARTCHAR U_953D +ENCODING 38205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +7440 +87C0 +7440 +27C0 +F900 +2100 +27C0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_953E +ENCODING 38206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4520 +7AC0 +87E0 +F900 +27E0 +FA00 +23E0 +2D40 +3880 +2360 +ENDCHAR +STARTCHAR U_953F +ENCODING 38207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7800 +83C0 +FA40 +23C0 +F900 +22A0 +2E40 +3320 +2220 +ENDCHAR +STARTCHAR U_9540 +ENCODING 38208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7D40 +87E0 +FD40 +25C0 +FC00 +27E0 +2D40 +3480 +2B60 +ENDCHAR +STARTCHAR U_9541 +ENCODING 38209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7100 +87C0 +F900 +27E0 +F900 +27E0 +2980 +3240 +2C20 +ENDCHAR +STARTCHAR U_9542 +ENCODING 38210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +42C0 +77E0 +8080 +F9C0 +26A0 +F900 +27E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_9543 +ENCODING 38211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4480 +7FE0 +8440 +E880 +4AA0 +FFE0 +4440 +4AA0 +7FE0 +4220 +ENDCHAR +STARTCHAR U_9544 +ENCODING 38212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +72A0 +87C0 +FAA0 +24A0 +FFE0 +2540 +2D40 +3280 +2460 +ENDCHAR +STARTCHAR U_9545 +ENCODING 38213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +77E0 +8400 +FDE0 +2520 +FDE0 +2520 +2DE0 +3520 +29E0 +ENDCHAR +STARTCHAR U_9546 +ENCODING 38214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +87C0 +FC40 +27C0 +FC40 +27E0 +2900 +3280 +2C60 +ENDCHAR +STARTCHAR U_9547 +ENCODING 38215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7100 +87C0 +FC40 +2740 +FDC0 +2440 +2FE0 +3280 +2C60 +ENDCHAR +STARTCHAR U_9548 +ENCODING 38216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FE0 +8540 +F7C0 +4540 +F7C0 +4540 +5FE0 +6240 +4340 +0080 +ENDCHAR +STARTCHAR U_9549 +ENCODING 38217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4000 +73C0 +8240 +FA40 +27E0 +FD60 +24A0 +2FE0 +34A0 +24E0 +ENDCHAR +STARTCHAR U_954A +ENCODING 38218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4240 +73C0 +8240 +FFE0 +4040 +FEE0 +4AA0 +5440 +6AA0 +5120 +ENDCHAR +STARTCHAR U_954B +ENCODING 38219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7FE0 +9020 +E780 +4480 +E780 +4300 +5520 +6520 +48E0 +ENDCHAR +STARTCHAR U_954C +ENCODING 38220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +7FE0 +8480 +FFE0 +2480 +FFE0 +2280 +2AE0 +3420 +28E0 +ENDCHAR +STARTCHAR U_954D +ENCODING 38221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +F900 +27E0 +2B80 +3540 +2920 +ENDCHAR +STARTCHAR U_954E +ENCODING 38222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +46C0 +79A0 +87C0 +F440 +27C0 +F900 +27C0 +2900 +37E0 +2300 +ENDCHAR +STARTCHAR U_954F +ENCODING 38223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +45E0 +74A0 +86A0 +FDE0 +2240 +FFE0 +2520 +2FE0 +3520 +27E0 +ENDCHAR +STARTCHAR U_9550 +ENCODING 38224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4FE0 +7240 +83C0 +F000 +4FE0 +F820 +4BA0 +5AA0 +6BA0 +4860 +ENDCHAR +STARTCHAR U_9551 +ENCODING 38225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7280 +8FE0 +F920 +2FE0 +FA00 +23C0 +2A40 +3440 +2980 +ENDCHAR +STARTCHAR U_9552 +ENCODING 38226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4A80 +77E0 +8800 +F280 +4440 +F820 +4FE0 +5AA0 +6AA0 +4FE0 +ENDCHAR +STARTCHAR U_9553 +ENCODING 38227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8FE0 +F220 +4D40 +F280 +4D40 +52A0 +6CA0 +4300 +ENDCHAR +STARTCHAR U_9554 +ENCODING 38228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7420 +81C0 +FA00 +23E0 +FA40 +27E0 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_9555 +ENCODING 38229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8440 +7920 +2280 +F440 +2FE0 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_9556 +ENCODING 38230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +8AA0 +FFE0 +4000 +F7C0 +4000 +5FE0 +6940 +5320 +ENDCHAR +STARTCHAR U_9557 +ENCODING 38231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +7FE0 +8820 +F7C0 +4440 +F7C0 +4100 +57C0 +6100 +4FE0 +ENDCHAR +STARTCHAR U_9558 +ENCODING 38232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +8440 +FFE0 +4AA0 +FFE0 +4440 +5280 +6100 +4EE0 +ENDCHAR +STARTCHAR U_9559 +ENCODING 38233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4520 +77E0 +8520 +F7E0 +4240 +F780 +4240 +5FE0 +6540 +4B20 +ENDCHAR +STARTCHAR U_955A +ENCODING 38234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +6FE0 +8000 +EEE0 +4AA0 +EEE0 +4AA0 +4EE0 +6AA0 +5360 +ENDCHAR +STARTCHAR U_955B +ENCODING 38235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7940 +8FE0 +F940 +4FE0 +F920 +4FE0 +5920 +6FE0 +4920 +ENDCHAR +STARTCHAR U_955C +ENCODING 38236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F440 +27C0 +F440 +27C0 +2A80 +32A0 +2C60 +ENDCHAR +STARTCHAR U_955D +ENCODING 38237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F920 +4FE0 +F920 +4BA0 +5AA0 +6BA0 +4AE0 +ENDCHAR +STARTCHAR U_955E +ENCODING 38238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44E0 +7F00 +8880 +FEE0 +4B40 +FBE0 +4A40 +5A40 +6EA0 +5520 +ENDCHAR +STARTCHAR U_955F +ENCODING 38239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +44E0 +7F00 +89E0 +FC60 +5540 +F560 +5540 +5540 +76C0 +5C60 +ENDCHAR +STARTCHAR U_9560 +ENCODING 38240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7660 +8AA0 +7100 +2280 +FD60 +2280 +2140 +3080 +2700 +ENDCHAR +STARTCHAR U_9561 +ENCODING 38241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +8AA0 +FFE0 +4440 +F7C0 +4440 +5FE0 +6100 +4100 +ENDCHAR +STARTCHAR U_9562 +ENCODING 38242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4D40 +7A40 +8FE0 +FAA0 +4AC0 +FFC0 +4A40 +5A40 +6CA0 +4920 +ENDCHAR +STARTCHAR U_9563 +ENCODING 38243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7B40 +8480 +FFE0 +2440 +FFC0 +2440 +2FC0 +3540 +2B20 +ENDCHAR +STARTCHAR U_9564 +ENCODING 38244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +46C0 +7FE0 +8280 +FFE0 +2100 +F7C0 +2100 +2FE0 +3280 +2C60 +ENDCHAR +STARTCHAR U_9565 +ENCODING 38245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +7FC0 +8540 +FFC0 +2540 +FFE0 +2440 +27C0 +2C40 +37C0 +ENDCHAR +STARTCHAR U_9566 +ENCODING 38246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4F80 +7AE0 +8EA0 +F0A0 +4FA0 +F2A0 +44A0 +5E40 +64A0 +4D20 +ENDCHAR +STARTCHAR U_9567 +ENCODING 38247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4420 +7920 +8FE0 +F920 +4FE0 +FAA0 +4FE0 +5920 +6BA0 +4D60 +ENDCHAR +STARTCHAR U_9568 +ENCODING 38248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7AA0 +86C0 +FFE0 +2000 +F7C0 +2440 +2FC0 +3440 +27C0 +ENDCHAR +STARTCHAR U_9569 +ENCODING 38249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7AA0 +8540 +F7C0 +4540 +FFE0 +4920 +5FE0 +6100 +4100 +ENDCHAR +STARTCHAR U_956A +ENCODING 38250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DE0 +4520 +7DE0 +8880 +FBE0 +2EA0 +F2A0 +23E0 +2A80 +32A0 +2DE0 +ENDCHAR +STARTCHAR U_956B +ENCODING 38251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4AA0 +7440 +87A0 +F800 +47C0 +F440 +47C0 +5440 +6280 +4FE0 +ENDCHAR +STARTCHAR U_956C +ENCODING 38252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7240 +87E0 +FC80 +27E0 +FC80 +27E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_956D +ENCODING 38253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +7FE0 +8920 +FBA0 +2540 +FFE0 +2520 +2FE0 +3520 +27E0 +ENDCHAR +STARTCHAR U_956E +ENCODING 38254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +77C0 +8000 +FFE0 +4000 +F7C0 +4440 +47C0 +6C80 +5660 +ENDCHAR +STARTCHAR U_956F +ENCODING 38255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7FE0 +8400 +FBE0 +4220 +FFA0 +4AA0 +5FA0 +62A0 +4FC0 +ENDCHAR +STARTCHAR U_9570 +ENCODING 38256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7A80 +8FE0 +FAA0 +4FE0 +FAA0 +4FE0 +5A80 +66C0 +4AA0 +ENDCHAR +STARTCHAR U_9571 +ENCODING 38257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F440 +47C0 +F440 +47C0 +52A0 +6660 +49C0 +ENDCHAR +STARTCHAR U_9572 +ENCODING 38258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +87E0 +FAA0 +4A40 +F7E0 +4800 +5FE0 +6540 +4B20 +ENDCHAR +STARTCHAR U_9573 +ENCODING 38259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7A80 +8FE0 +FAA0 +4FE0 +FA80 +4BA0 +5BE0 +6D40 +4AA0 +ENDCHAR +STARTCHAR U_9574 +ENCODING 38260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4A80 +7540 +8FC0 +FAC0 +4F40 +FAC0 +4F40 +4AC0 +6F60 +4A20 +ENDCHAR +STARTCHAR U_9575 +ENCODING 38261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4FC0 +7440 +87C0 +F6C0 +44A0 +F7E0 +4D40 +47C0 +62A0 +4CE0 +ENDCHAR +STARTCHAR U_9576 +ENCODING 38262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7AA0 +8EE0 +F280 +4FE0 +F280 +4FE0 +54A0 +6D40 +4620 +ENDCHAR +STARTCHAR U_9577 +ENCODING 38263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F00 +2000 +FFC0 +2480 +2300 +2900 +30C0 +ENDCHAR +STARTCHAR U_9578 +ENCODING 38264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1000 +1F80 +1000 +1FC0 +1000 +FFE0 +0800 +1080 +3FC0 +0040 +ENDCHAR +STARTCHAR U_9579 +ENCODING 38265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4100 +79C0 +4240 +7C40 +4080 +FC80 +2140 +4940 +FE20 +0420 +ENDCHAR +STARTCHAR U_957A +ENCODING 38266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7880 +4080 +7BE0 +4080 +FC80 +2880 +4540 +FA20 +0420 +ENDCHAR +STARTCHAR U_957B +ENCODING 38267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4280 +7BE0 +4480 +7880 +43E0 +FC80 +2880 +4540 +FA20 +0420 +ENDCHAR +STARTCHAR U_957C +ENCODING 38268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +F7E0 +8480 +F6A0 +86A0 +FFE0 +4480 +96A0 +FFE0 +0A20 +ENDCHAR +STARTCHAR U_957D +ENCODING 38269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +47E0 +7CA0 +43C0 +7E60 +43C0 +FA40 +23C0 +4B40 +F520 +0B20 +ENDCHAR +STARTCHAR U_957E +ENCODING 38270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4540 +7920 +4FE0 +7BA0 +4D60 +FBA0 +2D60 +5BA0 +F920 +0840 +ENDCHAR +STARTCHAR U_957F +ENCODING 38271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2200 +2400 +2800 +3000 +FFC0 +2800 +2400 +2200 +2900 +30C0 +ENDCHAR +STARTCHAR U_9580 +ENCODING 38272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_9581 +ENCODING 38273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +F9E0 +8920 +F9E0 +8020 +8220 +8220 +8420 +88A0 +8040 +ENDCHAR +STARTCHAR U_9582 +ENCODING 38274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +BF40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_9583 +ENCODING 38275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8840 +8840 +8840 +9440 +A340 +80C0 +ENDCHAR +STARTCHAR U_9584 +ENCODING 38276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AA80 +EE80 +AA80 +EE80 +8280 +8280 +8280 +8340 +8240 +8620 +ENDCHAR +STARTCHAR U_9585 +ENCODING 38277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +F9E0 +8920 +F9E0 +8020 +BFA0 +8420 +9420 +88A0 +8040 +ENDCHAR +STARTCHAR U_9586 +ENCODING 38278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BF20 +8020 +9E20 +8020 +BF60 +ENDCHAR +STARTCHAR U_9587 +ENCODING 38279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8820 +8A20 +8920 +8860 +ENDCHAR +STARTCHAR U_9588 +ENCODING 38280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +8420 +BFA0 +8420 +8460 +ENDCHAR +STARTCHAR U_9589 +ENCODING 38281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8220 +BFA0 +8A20 +9220 +A220 +86E0 +ENDCHAR +STARTCHAR U_958A +ENCODING 38282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9520 +9520 +9F20 +80A0 +8040 +ENDCHAR +STARTCHAR U_958B +ENCODING 38283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +8A20 +BFA0 +8A20 +92E0 +ENDCHAR +STARTCHAR U_958C +ENCODING 38284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8020 +9E20 +92A0 +A3E0 +ENDCHAR +STARTCHAR U_958D +ENCODING 38285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8820 +8F20 +9120 +A660 +ENDCHAR +STARTCHAR U_958E +ENCODING 38286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8A20 +9420 +A920 +8EE0 +ENDCHAR +STARTCHAR U_958F +ENCODING 38287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_9590 +ENCODING 38288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8820 +BF20 +8820 +BF20 +88A0 +8FA0 +ENDCHAR +STARTCHAR U_9591 +ENCODING 38289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8420 +8E20 +9520 +A4E0 +ENDCHAR +STARTCHAR U_9592 +ENCODING 38290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +9120 +A360 +ENDCHAR +STARTCHAR U_9593 +ENCODING 38291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +9F20 +9120 +9F20 +80E0 +ENDCHAR +STARTCHAR U_9594 +ENCODING 38292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8A20 +8420 +8A20 +B160 +ENDCHAR +STARTCHAR U_9595 +ENCODING 38293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8F20 +9220 +9F20 +8620 +8A20 +9640 +ENDCHAR +STARTCHAR U_9596 +ENCODING 38294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +84A0 +B520 +9620 +9520 +A4A0 +8860 +ENDCHAR +STARTCHAR U_9597 +ENCODING 38295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +9620 +8A20 +BFA0 +8220 +8240 +ENDCHAR +STARTCHAR U_9598 +ENCODING 38296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +9F20 +9520 +9F20 +8420 +8460 +ENDCHAR +STARTCHAR U_9599 +ENCODING 38297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8420 +BFE0 +8420 +BFA0 +A4A0 +A4A0 +A5A0 +8460 +ENDCHAR +STARTCHAR U_959A +ENCODING 38298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FBC0 +8A40 +FBC0 +8A40 +FBC0 +8440 +BF40 +9140 +8A40 +BF40 +80C0 +ENDCHAR +STARTCHAR U_959B +ENCODING 38299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +BFA0 +A4A0 +9520 +BFA0 +8420 +8460 +ENDCHAR +STARTCHAR U_959C +ENCODING 38300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +BFA0 +8120 +9D20 +9520 +9D20 +8360 +ENDCHAR +STARTCHAR U_959D +ENCODING 38301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +8A20 +9520 +EEE0 +8220 +8C20 +8440 +ENDCHAR +STARTCHAR U_959E +ENCODING 38302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +9F20 +9220 +BFA0 +9220 +A260 +ENDCHAR +STARTCHAR U_959F +ENCODING 38303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8D20 +AAA0 +AC60 +8920 +B720 +8060 +ENDCHAR +STARTCHAR U_95A0 +ENCODING 38304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +8420 +9F20 +8520 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95A1 +ENCODING 38305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +9520 +8A20 +9520 +8960 +ENDCHAR +STARTCHAR U_95A2 +ENCODING 38306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +FBE0 +8A20 +FBE0 +9120 +BFA0 +8420 +BFA0 +8A20 +B1A0 +8040 +ENDCHAR +STARTCHAR U_95A3 +ENCODING 38307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +9E40 +9440 +8A40 +BF40 +9240 +9EC0 +ENDCHAR +STARTCHAR U_95A4 +ENCODING 38308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8E20 +9520 +E0E0 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95A5 +ENCODING 38309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +BFA0 +D520 +92A0 +95A0 +98E0 +ENDCHAR +STARTCHAR U_95A6 +ENCODING 38310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BBA0 +9220 +9220 +ADA0 +8040 +ENDCHAR +STARTCHAR U_95A7 +ENCODING 38311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +8A20 +9F20 +8A20 +BFA0 +9120 +A0E0 +ENDCHAR +STARTCHAR U_95A8 +ENCODING 38312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +BFA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_95A9 +ENCODING 38313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +A4A0 +BFA0 +8520 +BEE0 +ENDCHAR +STARTCHAR U_95AA +ENCODING 38314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +9F20 +8A20 +BFA0 +AAA0 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95AB +ENCODING 38315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +A4A0 +BFA0 +A4A0 +AEA0 +B5A0 +BFE0 +ENDCHAR +STARTCHAR U_95AC +ENCODING 38316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +92A0 +99E0 +ENDCHAR +STARTCHAR U_95AD +ENCODING 38317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_95AE +ENCODING 38318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +9BA0 +A920 +97A0 +A820 +C7E0 +ENDCHAR +STARTCHAR U_95AF +ENCODING 38319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +A220 +DAA0 +AA60 +9120 +E220 +AC40 +ENDCHAR +STARTCHAR U_95B0 +ENCODING 38320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8820 +B3A0 +A0A0 +BBA0 +A0A0 +BFE0 +ENDCHAR +STARTCHAR U_95B1 +ENCODING 38321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +BFA0 +9120 +9F20 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_95B2 +ENCODING 38322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +9F20 +8AA0 +B3A0 +8060 +ENDCHAR +STARTCHAR U_95B3 +ENCODING 38323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +BFA0 +9520 +9F20 +9520 +BFA0 +8440 +ENDCHAR +STARTCHAR U_95B4 +ENCODING 38324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +8A20 +9140 +ENDCHAR +STARTCHAR U_95B5 +ENCODING 38325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9220 +BFA0 +D220 +9FA0 +9220 +9FE0 +ENDCHAR +STARTCHAR U_95B6 +ENCODING 38326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +A4A0 +BFA0 +ENDCHAR +STARTCHAR U_95B7 +ENCODING 38327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AEE0 +4AA0 +AEE0 +5AA0 +4EE0 +F920 +4920 +E9A0 +5A60 +4C20 +4860 +ENDCHAR +STARTCHAR U_95B8 +ENCODING 38328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +BFA0 +8A20 +9120 +8A20 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95B9 +ENCODING 38329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +BFA0 +D560 +9F20 +84A0 +83A0 +ENDCHAR +STARTCHAR U_95BA +ENCODING 38330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +FFA0 +9220 +8C20 +B360 +ENDCHAR +STARTCHAR U_95BB +ENCODING 38331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BB20 +9120 +9B20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95BC +ENCODING 38332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +FEA0 +9160 +9CA0 +A520 +CCE0 +ENDCHAR +STARTCHAR U_95BD +ENCODING 38333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9220 +9FA0 +9120 +9FA0 +9120 +9F60 +ENDCHAR +STARTCHAR U_95BE +ENCODING 38334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8520 +BFA0 +AB20 +BAA0 +83A0 +BCE0 +ENDCHAR +STARTCHAR U_95BF +ENCODING 38335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +94A0 +8B20 +BFA0 +AAA0 +8620 +B9A0 +ENDCHAR +STARTCHAR U_95C0 +ENCODING 38336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +FFA0 +AAA0 +CE60 +88A0 +87E0 +ENDCHAR +STARTCHAR U_95C1 +ENCODING 38337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BBA0 +AAA0 +BBA0 +A0A0 +8060 +ENDCHAR +STARTCHAR U_95C2 +ENCODING 38338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +BFA0 +8420 +FFE0 +99A0 +AF60 +ENDCHAR +STARTCHAR U_95C3 +ENCODING 38339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_95C4 +ENCODING 38340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9F20 +9520 +BFA0 +8A20 +8420 +9B60 +ENDCHAR +STARTCHAR U_95C5 +ENCODING 38341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +9520 +9FA0 +8420 +BFA0 +8920 +8620 +B9A0 +ENDCHAR +STARTCHAR U_95C6 +ENCODING 38342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +8020 +BBA0 +AAA0 +BBE0 +ENDCHAR +STARTCHAR U_95C7 +ENCODING 38343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BFA0 +9120 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95C8 +ENCODING 38344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +8920 +BFA0 +9120 +BFA0 +9420 +BFA0 +8460 +ENDCHAR +STARTCHAR U_95C9 +ENCODING 38345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +AAA0 +B1A0 +BFA0 +8420 +9F20 +8420 +BFA0 +ENDCHAR +STARTCHAR U_95CA +ENCODING 38346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9220 +AFA0 +9220 +B7A0 +94A0 +97E0 +ENDCHAR +STARTCHAR U_95CB +ENCODING 38347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AAA0 +AF20 +94A0 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_95CC +ENCODING 38348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +FFE0 +AAA0 +BFA0 +9520 +E4E0 +ENDCHAR +STARTCHAR U_95CD +ENCODING 38349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BFA0 +9920 +AF20 +8920 +8F60 +ENDCHAR +STARTCHAR U_95CE +ENCODING 38350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +F780 +9480 +F780 +9480 +FF80 +AA80 +BE80 +8B80 +EC80 +AA80 +D900 +ENDCHAR +STARTCHAR U_95CF +ENCODING 38351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8020 +BFA0 +A4A0 +BFA0 +B5A0 +BFA0 +A4A0 +DF60 +ENDCHAR +STARTCHAR U_95D0 +ENCODING 38352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +9120 +9D20 +9720 +9120 +BFA0 +8A20 +B1A0 +ENDCHAR +STARTCHAR U_95D1 +ENCODING 38353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +9520 +E4E0 +ENDCHAR +STARTCHAR U_95D2 +ENCODING 38354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +BFA0 +AAA0 +99A0 +AAE0 +ENDCHAR +STARTCHAR U_95D3 +ENCODING 38355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +A4A0 +BFA0 +9120 +9F20 +8A20 +BFA0 +ENDCHAR +STARTCHAR U_95D4 +ENCODING 38356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +BFA0 +9120 +BFA0 +AAA0 +BFA0 +ENDCHAR +STARTCHAR U_95D5 +ENCODING 38357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AA20 +FFE0 +9560 +FD20 +92A0 +A460 +ENDCHAR +STARTCHAR U_95D6 +ENCODING 38358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9420 +9F20 +9420 +9FA0 +AAA0 +D560 +ENDCHAR +STARTCHAR U_95D7 +ENCODING 38359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +88A0 +9120 +BBE0 +9120 +A260 +BBA0 +AAA0 +D560 +ENDCHAR +STARTCHAR U_95D8 +ENCODING 38360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8020 +BCA0 +83E0 +BCA0 +A7A0 +BCA0 +95A0 +BE60 +ENDCHAR +STARTCHAR U_95D9 +ENCODING 38361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9220 +BBA0 +AEA0 +B920 +A2A0 +DF60 +9120 +9F60 +ENDCHAR +STARTCHAR U_95DA +ENCODING 38362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +94A0 +BFA0 +94A0 +FFA0 +AAA0 +C4E0 +ENDCHAR +STARTCHAR U_95DB +ENCODING 38363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9520 +BFA0 +A0A0 +9F20 +9120 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_95DC +ENCODING 38364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +AAA0 +BBA0 +AAA0 +BBA0 +8A20 +B260 +ENDCHAR +STARTCHAR U_95DD +ENCODING 38365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AA20 +BBA0 +AEA0 +B920 +92A0 +AC60 +ENDCHAR +STARTCHAR U_95DE +ENCODING 38366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9220 +FFA0 +AAA0 +B920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_95DF +ENCODING 38367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +9120 +BFA0 +D160 +9F20 +BFA0 +AAA0 +99A0 +AAE0 +ENDCHAR +STARTCHAR U_95E0 +ENCODING 38368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +9520 +BFA0 +9120 +9F20 +9120 +9F20 +F1E0 +ENDCHAR +STARTCHAR U_95E1 +ENCODING 38369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BBA0 +AAA0 +BFA0 +A4A0 +BFA0 +A4A0 +FFE0 +8420 +ENDCHAR +STARTCHAR U_95E2 +ENCODING 38370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8120 +BBA0 +AAA0 +B920 +EFE0 +A920 +ABA0 +B960 +ENDCHAR +STARTCHAR U_95E3 +ENCODING 38371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +A4A0 +9520 +BFA0 +AAA0 +8A20 +9F20 +9520 +9F60 +ENDCHAR +STARTCHAR U_95E4 +ENCODING 38372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +AAA0 +BFA0 +9120 +9F20 +8AA0 +B920 +8CE0 +ENDCHAR +STARTCHAR U_95E5 +ENCODING 38373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8220 +AFA0 +9520 +FFA0 +9220 +9FA0 +9220 +AFA0 +ENDCHAR +STARTCHAR U_95E6 +ENCODING 38374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8A20 +BF60 +ENDCHAR +STARTCHAR U_95E7 +ENCODING 38375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8720 +A220 +9FA0 +B2A0 +9720 +9AA0 +AFA0 +8060 +ENDCHAR +STARTCHAR U_95E8 +ENCODING 38376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95E9 +ENCODING 38377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +8040 +8040 +BF40 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EA +ENCODING 38378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8840 +8840 +8840 +8C40 +9240 +A140 +C040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EB +ENCODING 38379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +5FC0 +2040 +8040 +BF40 +8040 +8040 +9E40 +8040 +8040 +BF40 +80C0 +ENDCHAR +STARTCHAR U_95EC +ENCODING 38380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4000 +2F80 +8080 +BE80 +8880 +8880 +BE80 +8880 +8880 +8880 +8180 +ENDCHAR +STARTCHAR U_95ED +ENCODING 38381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +8220 +8220 +BFA0 +8620 +8A20 +9220 +A220 +8620 +80E0 +ENDCHAR +STARTCHAR U_95EE +ENCODING 38382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +9E40 +9240 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EF +ENCODING 38383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8FC0 +4040 +BE40 +9240 +9240 +9F40 +8140 +BD40 +8140 +8640 +80C0 +ENDCHAR +STARTCHAR U_95F0 +ENCODING 38384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8020 +9F20 +8420 +8420 +9F20 +8420 +8420 +BFA0 +80E0 +ENDCHAR +STARTCHAR U_95F1 +ENCODING 38385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +84A0 +85A0 +80E0 +ENDCHAR +STARTCHAR U_95F2 +ENCODING 38386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +8420 +BFA0 +8420 +8E20 +9520 +A4A0 +8420 +80E0 +ENDCHAR +STARTCHAR U_95F3 +ENCODING 38387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +8420 +BFA0 +8A20 +9220 +A520 +8FA0 +80A0 +8060 +ENDCHAR +STARTCHAR U_95F4 +ENCODING 38388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +9E40 +9240 +9E40 +9240 +9240 +9E40 +8040 +81C0 +ENDCHAR +STARTCHAR U_95F5 +ENCODING 38389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8420 +BFA0 +8220 +8A20 +8420 +8A20 +9120 +A120 +8060 +ENDCHAR +STARTCHAR U_95F6 +ENCODING 38390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8020 +8E20 +8A20 +8AA0 +92A0 +A1A0 +8060 +ENDCHAR +STARTCHAR U_95F7 +ENCODING 38391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +1020 +8420 +8A20 +8820 +A920 +A8A0 +C920 +8720 +8020 +80E0 +ENDCHAR +STARTCHAR U_95F8 +ENCODING 38392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +BF40 +A940 +BF40 +A940 +BF40 +A940 +8840 +8840 +80C0 +ENDCHAR +STARTCHAR U_95F9 +ENCODING 38393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8420 +BFA0 +A4A0 +A4A0 +A5A0 +8420 +8060 +ENDCHAR +STARTCHAR U_95FA +ENCODING 38394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +9F20 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_95FB +ENCODING 38395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +BF40 +9240 +9E40 +9240 +9E40 +9340 +BE40 +8240 +80C0 +ENDCHAR +STARTCHAR U_95FC +ENCODING 38396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +C240 +AF40 +8240 +F240 +9540 +98C0 +A840 +C740 +80C0 +ENDCHAR +STARTCHAR U_95FD +ENCODING 38397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8840 +BF40 +A940 +A940 +BF40 +8840 +8940 +BF40 +80C0 +ENDCHAR +STARTCHAR U_95FE +ENCODING 38398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +9E40 +9240 +9E40 +8040 +BF40 +A140 +BF40 +8040 +80C0 +ENDCHAR +STARTCHAR U_95FF +ENCODING 38399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +BF80 +0080 +AA80 +BE80 +8080 +BC80 +8480 +BC80 +A280 +9E80 +8180 +ENDCHAR +STARTCHAR U_9600 +ENCODING 38400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8D20 +94A0 +9FE0 +B420 +D520 +92A0 +95A0 +98A0 +8060 +ENDCHAR +STARTCHAR U_9601 +ENCODING 38401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4820 +0F20 +9920 +A620 +8920 +BFA0 +9120 +9F20 +9120 +8060 +ENDCHAR +STARTCHAR U_9602 +ENCODING 38402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8420 +BFA0 +8920 +9E20 +84A0 +9920 +8620 +99A0 +8060 +ENDCHAR +STARTCHAR U_9603 +ENCODING 38403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +BFA0 +A4A0 +BFA0 +A4A0 +AEA0 +B5A0 +A4A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_9604 +ENCODING 38404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +A040 +9C40 +A440 +FE40 +AA40 +BE40 +AA40 +BE40 +8940 +87C0 +ENDCHAR +STARTCHAR U_9605 +ENCODING 38405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +9120 +8A20 +9F20 +9120 +9F20 +8A20 +8AA0 +B1A0 +8060 +ENDCHAR +STARTCHAR U_9606 +ENCODING 38406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +5FC0 +2040 +8840 +BE40 +A240 +BE40 +A240 +BE40 +A940 +B640 +81C0 +ENDCHAR +STARTCHAR U_9607 +ENCODING 38407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +44A0 +9FA0 +8520 +BFE0 +8820 +9F20 +A920 +8F20 +8920 +8F60 +ENDCHAR +STARTCHAR U_9608 +ENCODING 38408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1120 +82A0 +BFE0 +8220 +BAA0 +AAA0 +B920 +8120 +BAA0 +8460 +ENDCHAR +STARTCHAR U_9609 +ENCODING 38409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1420 +FFA0 +8920 +BFA0 +D560 +9F20 +9520 +9F20 +84A0 +83E0 +ENDCHAR +STARTCHAR U_960A +ENCODING 38410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9120 +9F20 +9120 +BFA0 +A0A0 +BFA0 +A0A0 +BFE0 +ENDCHAR +STARTCHAR U_960B +ENCODING 38411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8820 +B3A0 +A0A0 +BBA0 +A0A0 +BFA0 +8A20 +8AA0 +B1E0 +ENDCHAR +STARTCHAR U_960C +ENCODING 38412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9FA0 +A4A0 +9520 +BFA0 +A0A0 +9F20 +9220 +8C20 +B360 +ENDCHAR +STARTCHAR U_960D +ENCODING 38413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +20A0 +9F20 +9220 +9FA0 +9120 +9FA0 +9120 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_960E +ENCODING 38414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8820 +9F20 +A220 +9BA0 +A0A0 +BBA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_960F +ENCODING 38415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1020 +8920 +BDA0 +9260 +9D20 +94A0 +9420 +9520 +A4A0 +C860 +ENDCHAR +STARTCHAR U_9610 +ENCODING 38416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9120 +BFA0 +A4A0 +BFA0 +A4A0 +BFA0 +8420 +BFA0 +8420 +8060 +ENDCHAR +STARTCHAR U_9611 +ENCODING 38417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2420 +BFA0 +8420 +BFA0 +AAA0 +BFA0 +8E20 +9520 +A4A0 +8060 +ENDCHAR +STARTCHAR U_9612 +ENCODING 38418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9120 +9F20 +9120 +9F20 +8520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_9613 +ENCODING 38419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4420 +1F20 +9520 +FFE0 +8020 +9F20 +9520 +9520 +8A20 +B160 +ENDCHAR +STARTCHAR U_9614 +ENCODING 38420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +A1A0 +9620 +C220 +AFA0 +9220 +AFA0 +E8A0 +AFA0 +A060 +ENDCHAR +STARTCHAR U_9615 +ENCODING 38421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +AAA0 +9120 +9EA0 +A460 +BFA0 +8420 +8A20 +9160 +ENDCHAR +STARTCHAR U_9616 +ENCODING 38422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +9420 +9F20 +8420 +BFA0 +8920 +9FA0 +8020 +BFA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_9617 +ENCODING 38423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +9420 +BFA0 +8420 +9F20 +9120 +9F20 +9120 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_9618 +ENCODING 38424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9520 +9F20 +8020 +BFA0 +96A0 +8DA0 +96A0 +ADE0 +ENDCHAR +STARTCHAR U_9619 +ENCODING 38425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +AA20 +9220 +FFE0 +9560 +D520 +FD20 +92A0 +A4A0 +C060 +ENDCHAR +STARTCHAR U_961A +ENCODING 38426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +BA20 +8A20 +BFE0 +AAA0 +BAA0 +AAA0 +B920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_961B +ENCODING 38427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4020 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8D20 +9A20 +EDA0 +8860 +ENDCHAR +STARTCHAR U_961C +ENCODING 38428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4000 +7FC0 +4040 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_961D +ENCODING 38429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +F8 +88 +90 +A0 +90 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR U_961E +ENCODING 38430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +AFE0 +C120 +A120 +9120 +9120 +D220 +A220 +84A0 +9840 +ENDCHAR +STARTCHAR U_961F +ENCODING 38431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A100 +C100 +A100 +9100 +9100 +D280 +A280 +8440 +9820 +ENDCHAR +STARTCHAR U_9620 +ENCODING 38432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +9280 +A280 +C280 +A280 +9F80 +9280 +F2A0 +A2A0 +8260 +8220 +ENDCHAR +STARTCHAR U_9621 +ENCODING 38433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9700 +A100 +C100 +AFE0 +9100 +9100 +F100 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_9622 +ENCODING 38434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +A280 +C280 +A280 +9280 +9280 +F280 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_9623 +ENCODING 38435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +9400 +A7E0 +C800 +A780 +9080 +9100 +F200 +A420 +8420 +83E0 +ENDCHAR +STARTCHAR U_9624 +ENCODING 38436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9520 +A560 +C5A0 +A720 +9D20 +9560 +F500 +A420 +8420 +83E0 +ENDCHAR +STARTCHAR U_9625 +ENCODING 38437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A200 +A240 +DB80 +AB00 +AA80 +AA80 +CA40 +9220 +A200 +8600 +ENDCHAR +STARTCHAR U_9626 +ENCODING 38438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +A240 +CA80 +AB00 +9200 +D200 +A500 +8500 +8880 +9060 +ENDCHAR +STARTCHAR U_9627 +ENCODING 38439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9480 +A280 +C880 +A480 +94E0 +D380 +AC80 +8080 +8080 +8080 +ENDCHAR +STARTCHAR U_9628 +ENCODING 38440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +A5E0 +C520 +A520 +9520 +9560 +F500 +A520 +8920 +90E0 +ENDCHAR +STARTCHAR U_9629 +ENCODING 38441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9C80 +A480 +C480 +AFE0 +9480 +D480 +A480 +8480 +8880 +9080 +ENDCHAR +STARTCHAR U_962A +ENCODING 38442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +A400 +C7E0 +A540 +9540 +9540 +F540 +A480 +8940 +9220 +ENDCHAR +STARTCHAR U_962B +ENCODING 38443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +9FE0 +A080 +A100 +9300 +D580 +A960 +9120 +8100 +8100 +8100 +ENDCHAR +STARTCHAR U_962C +ENCODING 38444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C000 +A780 +9480 +9480 +F480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_962D +ENCODING 38445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9200 +A440 +CFA0 +A020 +9480 +9480 +F480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_962E +ENCODING 38446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A280 +9280 +9280 +F280 +A2A0 +84A0 +9860 +ENDCHAR +STARTCHAR U_962F +ENCODING 38447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9080 +A080 +C480 +A4E0 +9480 +9480 +F480 +A480 +8480 +9FE0 +ENDCHAR +STARTCHAR U_9630 +ENCODING 38448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9480 +A480 +C4A0 +A7C0 +9480 +9480 +F480 +A5A0 +86A0 +8C60 +ENDCHAR +STARTCHAR U_9631 +ENCODING 38449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +A7E0 +C240 +A240 +9240 +9FE0 +F240 +A240 +8440 +8840 +ENDCHAR +STARTCHAR U_9632 +ENCODING 38450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C200 +A3C0 +9240 +9240 +D240 +A440 +8840 +9180 +ENDCHAR +STARTCHAR U_9633 +ENCODING 38451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A420 +C420 +A7E0 +9420 +9420 +D420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_9634 +ENCODING 38452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9220 +A220 +C3E0 +A220 +9220 +93E0 +D220 +A220 +8420 +88E0 +ENDCHAR +STARTCHAR U_9635 +ENCODING 38453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A400 +C500 +AFC0 +9100 +9100 +DFE0 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_9636 +ENCODING 38454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A280 +C440 +A820 +9240 +9240 +D240 +A240 +8440 +8840 +ENDCHAR +STARTCHAR U_9637 +ENCODING 38455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +A100 +C100 +A9C0 +A900 +A900 +C900 +8900 +BFE0 +8000 +ENDCHAR +STARTCHAR U_9638 +ENCODING 38456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFC0 +A840 +CFC0 +A800 +AFC0 +A880 +C900 +9220 +9420 +A3E0 +ENDCHAR +STARTCHAR U_9639 +ENCODING 38457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7C0 +C100 +A100 +9FE0 +9200 +F200 +A440 +8FA0 +8420 +ENDCHAR +STARTCHAR U_963A +ENCODING 38458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +A480 +C480 +A7E0 +9480 +9480 +F4A0 +A560 +8EA0 +84A0 +ENDCHAR +STARTCHAR U_963B +ENCODING 38459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A440 +C7C0 +A440 +9440 +9440 +D7C0 +A440 +8440 +9FE0 +ENDCHAR +STARTCHAR U_963C +ENCODING 38460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +A3E0 +C500 +A9E0 +9100 +9100 +F1E0 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_963D +ENCODING 38461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A1E0 +C100 +A100 +97E0 +9420 +F420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_963E +ENCODING 38462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A200 +A500 +C880 +B260 +A200 +AFC0 +C080 +8500 +8200 +8100 +ENDCHAR +STARTCHAR U_963F +ENCODING 38463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9040 +A040 +A740 +A540 +9540 +9540 +D740 +A040 +8040 +80C0 +ENDCHAR +STARTCHAR U_9640 +ENCODING 38464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C820 +A200 +9240 +9280 +D300 +A220 +8220 +81E0 +ENDCHAR +STARTCHAR U_9641 +ENCODING 38465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E800 +AFE0 +B000 +C240 +ABC0 +AE40 +BB40 +AA80 +CA20 +8820 +87E0 +ENDCHAR +STARTCHAR U_9642 +ENCODING 38466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7E0 +C520 +A500 +97C0 +9540 +F540 +A480 +8940 +9620 +ENDCHAR +STARTCHAR U_9643 +ENCODING 38467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +A100 +C7E0 +A520 +95A0 +9560 +F620 +A420 +8420 +84E0 +ENDCHAR +STARTCHAR U_9644 +ENCODING 38468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +A440 +C7E0 +AC40 +9540 +94C0 +D440 +A440 +8440 +84C0 +ENDCHAR +STARTCHAR U_9645 +ENCODING 38469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A100 +9540 +9540 +D520 +A920 +8100 +8300 +ENDCHAR +STARTCHAR U_9646 +ENCODING 38470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +C100 +AFE0 +9100 +9520 +F520 +A520 +87E0 +8420 +ENDCHAR +STARTCHAR U_9647 +ENCODING 38471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9240 +AFE0 +C200 +A300 +9540 +9540 +D580 +A920 +8B20 +94E0 +ENDCHAR +STARTCHAR U_9648 +ENCODING 38472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A400 +C500 +AFE0 +9100 +9580 +F540 +A920 +9520 +8200 +ENDCHAR +STARTCHAR U_9649 +ENCODING 38473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A080 +C140 +A620 +9000 +97C0 +F100 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_964A +ENCODING 38474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93E0 +A440 +CA80 +A100 +9700 +91E0 +F640 +A180 +8100 +8E00 +ENDCHAR +STARTCHAR U_964B +ENCODING 38475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7E0 +A080 +A3E0 +AAA0 +CAA0 +AB60 +AA20 +AA20 +EA60 +8800 +8FE0 +ENDCHAR +STARTCHAR U_964C +ENCODING 38476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9080 +A100 +C7E0 +A420 +9420 +97E0 +F420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_964D +ENCODING 38477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A640 +C180 +A660 +9100 +97E0 +D500 +AFE0 +8100 +8100 +ENDCHAR +STARTCHAR U_964E +ENCODING 38478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9500 +A7C0 +C900 +A100 +9FE0 +9100 +F380 +A540 +8920 +9120 +ENDCHAR +STARTCHAR U_964F +ENCODING 38479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A200 +C3E0 +A620 +9BE0 +9220 +F3E0 +A220 +8220 +8260 +ENDCHAR +STARTCHAR U_9650 +ENCODING 38480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +A7C0 +9500 +9520 +D540 +A480 +8540 +8620 +ENDCHAR +STARTCHAR U_9651 +ENCODING 38481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +A200 +CFE0 +AAA0 +9AA0 +9AA0 +FAA0 +AAA0 +8A20 +8860 +ENDCHAR +STARTCHAR U_9652 +ENCODING 38482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A3C0 +C480 +BFE0 +A800 +AFC0 +EA40 +8AC0 +8A00 +9220 +A1E0 +ENDCHAR +STARTCHAR U_9653 +ENCODING 38483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A480 +CB40 +A020 +9FE0 +9200 +F7C0 +A040 +8240 +8180 +ENDCHAR +STARTCHAR U_9654 +ENCODING 38484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9100 +AFE0 +C200 +A440 +9780 +9120 +F240 +AC80 +8160 +8E20 +ENDCHAR +STARTCHAR U_9655 +ENCODING 38485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A920 +C540 +A580 +9FE0 +D100 +A280 +8280 +8440 +8820 +ENDCHAR +STARTCHAR U_9656 +ENCODING 38486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A480 +CFC0 +A480 +AA40 +B3A0 +E480 +8A80 +8100 +8280 +8C60 +ENDCHAR +STARTCHAR U_9657 +ENCODING 38487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +AA40 +A680 +CFC0 +A840 +AFC0 +A840 +EFC0 +8840 +8940 +8880 +ENDCHAR +STARTCHAR U_9658 +ENCODING 38488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +A540 +CA80 +A540 +9540 +97C0 +F100 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_9659 +ENCODING 38489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +ABC0 +C800 +AFE0 +AA80 +AAA0 +EA40 +8A40 +9340 +A220 +ENDCHAR +STARTCHAR U_965A +ENCODING 38490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +AEC0 +C0A0 +BFE0 +A280 +AB80 +AA80 +EA80 +8BA0 +9C60 +8020 +ENDCHAR +STARTCHAR U_965B +ENCODING 38491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94A0 +A7C0 +C480 +A5A0 +96E0 +9100 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_965C +ENCODING 38492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C540 +A540 +9BA0 +9100 +F100 +A280 +8440 +8820 +ENDCHAR +STARTCHAR U_965D +ENCODING 38493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C980 +A540 +9BA0 +9100 +F100 +A280 +8440 +8820 +ENDCHAR +STARTCHAR U_965E +ENCODING 38494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9640 +A240 +CFE0 +A240 +9440 +9100 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_965F +ENCODING 38495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +95E0 +A500 +C500 +AFE0 +9100 +9520 +F540 +A880 +8300 +8C00 +ENDCHAR +STARTCHAR U_9660 +ENCODING 38496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +BFE0 +C200 +AFC0 +AA40 +AFC0 +AA40 +EFC0 +8A40 +8A40 +8AC0 +ENDCHAR +STARTCHAR U_9661 +ENCODING 38497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7C0 +C100 +AFE0 +9100 +95E0 +F500 +A500 +8B00 +91E0 +ENDCHAR +STARTCHAR U_9662 +ENCODING 38498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C820 +A7C0 +9000 +9FE0 +D480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_9663 +ENCODING 38499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C7E0 +A520 +97E0 +9520 +F7E0 +A100 +8FE0 +8100 +ENDCHAR +STARTCHAR U_9664 +ENCODING 38500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +A440 +CBA0 +A100 +9FE0 +9100 +E540 +8920 +9120 +8300 +ENDCHAR +STARTCHAR U_9665 +ENCODING 38501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +91E0 +A240 +C480 +A000 +95E0 +D520 +A5E0 +8520 +85E0 +8520 +ENDCHAR +STARTCHAR U_9666 +ENCODING 38502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +C200 +A7C0 +A200 +BFE0 +C440 +8FE0 +9240 +A140 +8080 +ENDCHAR +STARTCHAR U_9667 +ENCODING 38503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +C420 +A7E0 +9420 +9100 +F7E0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9668 +ENCODING 38504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C000 +A7E0 +9420 +9520 +D520 +A520 +8280 +8C60 +ENDCHAR +STARTCHAR U_9669 +ENCODING 38505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +A440 +C820 +A7C0 +9000 +9A40 +D540 +A540 +8080 +8FE0 +ENDCHAR +STARTCHAR U_966A +ENCODING 38506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C280 +AFE0 +A000 +A7C0 +C440 +8440 +87C0 +8440 +ENDCHAR +STARTCHAR U_966B +ENCODING 38507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9EE0 +A280 +C280 +AEE0 +9280 +9280 +FEE0 +A280 +8280 +8280 +ENDCHAR +STARTCHAR U_966C +ENCODING 38508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +ABE0 +AEA0 +AAA0 +CAA0 +AEA0 +AAA0 +AAA0 +EF40 +9AA0 +8320 +ENDCHAR +STARTCHAR U_966D +ENCODING 38509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A280 +C440 +AFE0 +9040 +9740 +F540 +A740 +8040 +81C0 +ENDCHAR +STARTCHAR U_966E +ENCODING 38510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +A480 +AFE0 +C900 +BFC0 +A900 +AFC0 +E900 +8900 +8FE0 +8800 +ENDCHAR +STARTCHAR U_966F +ENCODING 38511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +A840 +B7A0 +C000 +AFE0 +AAA0 +AFE0 +EAA0 +8AA0 +8860 +ENDCHAR +STARTCHAR U_9670 +ENCODING 38512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9480 +AA40 +D120 +A780 +9100 +9FE0 +F000 +AFE0 +8440 +8FA0 +ENDCHAR +STARTCHAR U_9671 +ENCODING 38513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +A920 +C560 +A3A0 +97E0 +9320 +F5A0 +A960 +9120 +80C0 +ENDCHAR +STARTCHAR U_9672 +ENCODING 38514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9100 +AFE0 +C540 +A540 +9FE0 +9540 +F540 +AFE0 +8100 +87C0 +ENDCHAR +STARTCHAR U_9673 +ENCODING 38515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +CFE0 +A920 +9FE0 +9920 +FFE0 +A540 +8920 +9120 +ENDCHAR +STARTCHAR U_9674 +ENCODING 38516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97E0 +A520 +C7E0 +A520 +97E0 +9280 +F480 +AFE0 +8080 +8080 +ENDCHAR +STARTCHAR U_9675 +ENCODING 38517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9A20 +9380 +D480 +AB00 +8280 +8C60 +ENDCHAR +STARTCHAR U_9676 +ENCODING 38518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A7E0 +A820 +D7A0 +AA20 +AFA0 +A220 +EAA0 +8FA0 +8020 +80C0 +ENDCHAR +STARTCHAR U_9677 +ENCODING 38519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A440 +C880 +A200 +94E0 +9420 +D6E0 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_9678 +ENCODING 38520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A240 +9420 +9900 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9679 +ENCODING 38521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A480 +DFE0 +A480 +A480 +A880 +EFC0 +8840 +8FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_967A +ENCODING 38522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A500 +A880 +DFE0 +A200 +AF80 +AA80 +CF80 +8200 +8500 +98C0 +ENDCHAR +STARTCHAR U_967B +ENCODING 38523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +CAA0 +AAA0 +AFE0 +A100 +E7C0 +8100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_967C +ENCODING 38524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97A0 +9120 +A140 +AFE0 +9100 +93E0 +F620 +ABE0 +8220 +83E0 +ENDCHAR +STARTCHAR U_967D +ENCODING 38525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +AFE0 +9400 +97E0 +FAA0 +A4A0 +8920 +86C0 +ENDCHAR +STARTCHAR U_967E +ENCODING 38526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9200 +AFE0 +CAA0 +AAA0 +9860 +9100 +FFE0 +A100 +8280 +8C60 +ENDCHAR +STARTCHAR U_967F +ENCODING 38527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +B100 +BFE0 +D540 +B540 +BBA0 +B100 +D280 +9440 +9820 +9FE0 +ENDCHAR +STARTCHAR U_9680 +ENCODING 38528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +AFE0 +C540 +A7C0 +9540 +97C0 +F100 +A7C0 +8100 +8FE0 +ENDCHAR +STARTCHAR U_9681 +ENCODING 38529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9440 +B7C0 +D440 +B7C0 +9100 +9FC0 +F280 +9100 +9280 +9FE0 +ENDCHAR +STARTCHAR U_9682 +ENCODING 38530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AFE0 +D400 +A780 +A400 +A780 +E400 +9FE0 +8480 +8FC0 +ENDCHAR +STARTCHAR U_9683 +ENCODING 38531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +ABA0 +C000 +AE20 +9AA0 +9EA0 +FAA0 +AEA0 +8A20 +8AE0 +ENDCHAR +STARTCHAR U_9684 +ENCODING 38532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +A7C0 +9000 +9FE0 +F500 +A5E0 +8B00 +91E0 +ENDCHAR +STARTCHAR U_9685 +ENCODING 38533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +C540 +A7C0 +9100 +9FE0 +D960 +AFE0 +8820 +8860 +ENDCHAR +STARTCHAR U_9686 +ENCODING 38534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +AC40 +C380 +AC60 +9500 +97E0 +F900 +A7C0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9687 +ENCODING 38535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0A0 +9FE0 +A880 +CF80 +AAA0 +AFA0 +ADA0 +ADC0 +EAA0 +9560 +A920 +ENDCHAR +STARTCHAR U_9688 +ENCODING 38536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +C540 +A7C0 +9000 +9FE0 +F520 +A4C0 +8540 +8E20 +ENDCHAR +STARTCHAR U_9689 +ENCODING 38537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9CE0 +A820 +CEE0 +A820 +9FE0 +9000 +D7C0 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_968A +ENCODING 38538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +AFE0 +C620 +A940 +9380 +9580 +FB40 +A540 +8920 +8620 +ENDCHAR +STARTCHAR U_968B +ENCODING 38539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +A200 +C3E0 +A480 +9BE0 +9220 +D3E0 +A220 +83E0 +8220 +ENDCHAR +STARTCHAR U_968C +ENCODING 38540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C280 +BFE0 +A000 +A7C0 +E440 +87C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_968D +ENCODING 38541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +A440 +A7C0 +C440 +AFE0 +9100 +97C0 +E100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_968E +ENCODING 38542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +98A0 +AEC0 +C8A0 +AEE0 +9200 +97C0 +F440 +A7C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_968F +ENCODING 38543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +B7E0 +AA00 +C7C0 +A240 +BBC0 +AA40 +CBC0 +8A40 +8C00 +93E0 +ENDCHAR +STARTCHAR U_9690 +ENCODING 38544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +AFC0 +D040 +A7C0 +9040 +97C0 +D200 +AD40 +94A0 +8780 +ENDCHAR +STARTCHAR U_9691 +ENCODING 38545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9520 +A7E0 +C000 +AFE0 +9000 +97C0 +F440 +A7C0 +8280 +9FE0 +ENDCHAR +STARTCHAR U_9692 +ENCODING 38546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +A280 +CFE0 +A2A0 +9FE0 +92A0 +FFE0 +A680 +8AC0 +92A0 +ENDCHAR +STARTCHAR U_9693 +ENCODING 38547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9200 +A5C0 +C880 +A7E0 +9200 +9FE0 +F200 +A7C0 +8880 +97E0 +ENDCHAR +STARTCHAR U_9694 +ENCODING 38548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A440 +A7C0 +C000 +AFE0 +AAA0 +A920 +AFE0 +E920 +8920 +8860 +ENDCHAR +STARTCHAR U_9695 +ENCODING 38549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C000 +A7C0 +9440 +9740 +F5C0 +A440 +87C0 +8C60 +ENDCHAR +STARTCHAR U_9696 +ENCODING 38550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFC0 +A840 +CFC0 +A800 +AFE0 +A800 +EFE0 +8AA0 +9560 +8060 +ENDCHAR +STARTCHAR U_9697 +ENCODING 38551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A540 +C7C0 +A540 +97C0 +9140 +F1A0 +A3E0 +8520 +98E0 +ENDCHAR +STARTCHAR U_9698 +ENCODING 38552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E880 +A500 +BFE0 +C500 +A880 +9040 +BFE0 +D540 +9540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_9699 +ENCODING 38553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9540 +A920 +D7C0 +A440 +97C0 +9440 +F7C0 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_969A +ENCODING 38554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +A700 +DFE0 +D020 +AF80 +A880 +AF80 +C200 +9FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_969B +ENCODING 38555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +95A0 +AAC0 +C440 +ABA0 +9000 +9FE0 +D100 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_969C +ENCODING 38556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A480 +CFE0 +A440 +97C0 +9440 +F7C0 +A100 +8FE0 +8100 +ENDCHAR +STARTCHAR U_969D +ENCODING 38557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EF80 +A880 +CF80 +A880 +AFE0 +E800 +8FC0 +8040 +9540 +8080 +ENDCHAR +STARTCHAR U_969E +ENCODING 38558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +A4E0 +CEA0 +A4A0 +BFA0 +A8A0 +EEA0 +8A40 +92A0 +A520 +ENDCHAR +STARTCHAR U_969F +ENCODING 38559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AA80 +A540 +CFC0 +AA40 +AFC0 +AA40 +DFE0 +8700 +8A80 +B260 +ENDCHAR +STARTCHAR U_96A0 +ENCODING 38560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE40 +AA80 +CFC0 +A040 +AFC0 +A040 +DFC0 +8540 +94A0 +9380 +ENDCHAR +STARTCHAR U_96A1 +ENCODING 38561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A240 +C180 +AFE0 +9A80 +9BE0 +FC80 +ABE0 +9080 +A7E0 +ENDCHAR +STARTCHAR U_96A2 +ENCODING 38562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9EE0 +9440 +FFE0 +A280 +84A0 +9860 +ENDCHAR +STARTCHAR U_96A3 +ENCODING 38563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +E700 +BFE0 +C700 +AAC0 +B240 +DFE0 +9540 +B5E0 +8840 +B040 +ENDCHAR +STARTCHAR U_96A4 +ENCODING 38564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A540 +CFE0 +A440 +97C0 +9440 +F7C0 +A440 +87C0 +8C60 +ENDCHAR +STARTCHAR U_96A5 +ENCODING 38565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +B540 +A880 +D740 +A020 +AF80 +A880 +CF80 +8880 +8500 +BFE0 +ENDCHAR +STARTCHAR U_96A6 +ENCODING 38566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +ABE0 +AA20 +CEA0 +A840 +AFE0 +BA40 +DBE0 +AA40 +8E40 +8040 +ENDCHAR +STARTCHAR U_96A7 +ENCODING 38567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +A500 +C2A0 +ADC0 +96C0 +95A0 +F6A0 +A580 +8A00 +91E0 +ENDCHAR +STARTCHAR U_96A8 +ENCODING 38568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9BE0 +A480 +C7E0 +A140 +9DC0 +9540 +F5C0 +A540 +8A40 +91E0 +ENDCHAR +STARTCHAR U_96A9 +ENCODING 38569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +AD60 +CBA0 +AFE0 +9920 +9BA0 +F560 +AFE0 +8280 +8C60 +ENDCHAR +STARTCHAR U_96AA +ENCODING 38570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9480 +A840 +C7A0 +A000 +9EE0 +9AA0 +FEE0 +A440 +8AA0 +9120 +ENDCHAR +STARTCHAR U_96AB +ENCODING 38571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A540 +DFE0 +A440 +A7C0 +A540 +C6C0 +8540 +87C0 +8820 +ENDCHAR +STARTCHAR U_96AC +ENCODING 38572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A540 +A920 +BFE0 +C920 +ADA0 +AB60 +ADA0 +EB60 +8DA0 +8960 +ENDCHAR +STARTCHAR U_96AD +ENCODING 38573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A200 +DFE0 +D2A0 +AB00 +B280 +AFC0 +C400 +9FC0 +9540 +95C0 +ENDCHAR +STARTCHAR U_96AE +ENCODING 38574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A2A0 +AD40 +D560 +A540 +A440 +A7C0 +E440 +87C0 +9840 +ENDCHAR +STARTCHAR U_96AF +ENCODING 38575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +DFE0 +A220 +BFE0 +A040 +DFE0 +9540 +9D40 +80C0 +ENDCHAR +STARTCHAR U_96B0 +ENCODING 38576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +C420 +A7E0 +9240 +95A0 +F2A0 +A7E0 +8540 +8AA0 +ENDCHAR +STARTCHAR U_96B1 +ENCODING 38577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +9FE0 +A100 +CFE0 +A040 +9FC0 +9200 +F540 +ACA0 +93A0 +ENDCHAR +STARTCHAR U_96B2 +ENCODING 38578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AAC0 +B300 +CFE0 +B900 +AFC0 +A900 +CFE0 +8020 +95A0 +8060 +ENDCHAR +STARTCHAR U_96B3 +ENCODING 38579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +A500 +CFE0 +A440 +E7C0 +8C40 +BB00 +C8E0 +2A80 +5940 +ENDCHAR +STARTCHAR U_96B4 +ENCODING 38580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +C420 +BFE0 +AA80 +AEE0 +EA80 +8EE0 +8AA0 +8AE0 +ENDCHAR +STARTCHAR U_96B5 +ENCODING 38581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A4C0 +DFA0 +D4E0 +BF80 +B4A0 +DFA0 +9AA0 +9E40 +AAC0 +DF20 +ENDCHAR +STARTCHAR U_96B6 +ENCODING 38582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +7FE0 +0480 +7F80 +2640 +1D80 +1480 +E460 +0C20 +ENDCHAR +STARTCHAR U_96B7 +ENCODING 38583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +77E0 +0140 +77C0 +2540 +FB80 +7540 +A960 +6300 +ENDCHAR +STARTCHAR U_96B8 +ENCODING 38584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +77E0 +A940 +77C0 +0120 +FDC0 +2B40 +A520 +6320 +ENDCHAR +STARTCHAR U_96B9 +ENCODING 38585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +3FE0 +2200 +7FC0 +A200 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_96BA +ENCODING 38586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4840 +1200 +3FC0 +E200 +3F80 +2200 +3F80 +2200 +3FC0 +ENDCHAR +STARTCHAR U_96BB +ENCODING 38587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FE0 +2200 +7FE0 +A200 +3FE0 +2200 +7FE0 +10C0 +0F00 +F1E0 +ENDCHAR +STARTCHAR U_96BC +ENCODING 38588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +0200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_96BD +ENCODING 38589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +3FE0 +6200 +BFC0 +2200 +7FE0 +0880 +09E0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_96BE +ENCODING 38590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +17E0 +9C80 +5480 +27E0 +2480 +57E0 +5480 +8480 +07E0 +ENDCHAR +STARTCHAR U_96BF +ENCODING 38591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6300 +5480 +47E0 +7C80 +C480 +47E0 +4480 +57E0 +5480 +37E0 +1400 +ENDCHAR +STARTCHAR U_96C0 +ENCODING 38592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2560 +4620 +8500 +1FE0 +3200 +DFC0 +1200 +1FC0 +1200 +1FE0 +ENDCHAR +STARTCHAR U_96C1 +ENCODING 38593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A00 +4A80 +53E0 +5680 +7BC0 +5280 +53C0 +5280 +93E0 +9200 +ENDCHAR +STARTCHAR U_96C2 +ENCODING 38594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3280 +6BE0 +9680 +03E0 +FA80 +0BE0 +1280 +13E0 +2200 +ENDCHAR +STARTCHAR U_96C3 +ENCODING 38595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +5280 +53E0 +5680 +53E0 +FE80 +53E0 +5280 +5280 +53E0 +9200 +ENDCHAR +STARTCHAR U_96C4 +ENCODING 38596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +FFE0 +2280 +2680 +53E0 +5280 +93E0 +A280 +2A80 +7BE0 +ENDCHAR +STARTCHAR U_96C5 +ENCODING 38597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +1280 +53E0 +5680 +FBE0 +1280 +3280 +53E0 +9280 +1280 +73E0 +ENDCHAR +STARTCHAR U_96C6 +ENCODING 38598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +7FE0 +A400 +3FC0 +2400 +3FC0 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_96C7 +ENCODING 38599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4A00 +4900 +5FE0 +6900 +4FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_96C8 +ENCODING 38600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F9E0 +0900 +1200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_96C9 +ENCODING 38601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4280 +7BE0 +A680 +2280 +FBE0 +2280 +23E0 +3280 +4A80 +83E0 +ENDCHAR +STARTCHAR U_96CA +ENCODING 38602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4280 +7BE0 +8E80 +EA80 +ABE0 +AA80 +EBE0 +0A80 +0BE0 +3200 +ENDCHAR +STARTCHAR U_96CB +ENCODING 38603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FE0 +2200 +7FC0 +A200 +3FE0 +2000 +79E0 +4920 +4F20 +4060 +ENDCHAR +STARTCHAR U_96CC +ENCODING 38604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2A80 +2BE0 +BE80 +ABE0 +AA80 +ABE0 +AA80 +BE80 +CBE0 +0200 +ENDCHAR +STARTCHAR U_96CD +ENCODING 38605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +57E0 +E480 +2FC0 +4C80 +F7C0 +1480 +27E0 +C400 +ENDCHAR +STARTCHAR U_96CE +ENCODING 38606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B00 +4A80 +4BE0 +7E80 +4BE0 +4A80 +7BE0 +4E80 +FA80 +43E0 +0200 +ENDCHAR +STARTCHAR U_96CF +ENCODING 38607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +7A80 +4BE0 +9680 +FA80 +0BE0 +0A80 +7BE0 +0A80 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_96D0 +ENCODING 38608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +5F00 +5440 +5FC0 +7200 +5FC0 +9200 +9FC0 +ENDCHAR +STARTCHAR U_96D1 +ENCODING 38609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7A80 +2BE0 +2A80 +4E80 +13C0 +FE80 +13C0 +5A80 +97E0 +3200 +ENDCHAR +STARTCHAR U_96D2 +ENCODING 38610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +7280 +93E0 +6680 +2BE0 +5280 +F280 +53E0 +5280 +73E0 +5200 +ENDCHAR +STARTCHAR U_96D3 +ENCODING 38611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +5480 +8FE0 +7480 +2480 +FFE0 +2480 +77E0 +AC80 +27E0 +6400 +ENDCHAR +STARTCHAR U_96D4 +ENCODING 38612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6100 +9280 +FFE0 +9280 +9280 +FFE0 +9280 +FFE0 +9280 +FFE0 +8200 +ENDCHAR +STARTCHAR U_96D5 +ENCODING 38613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +AA40 +FBE0 +AE40 +FBE0 +8A40 +FA40 +DBE0 +FA40 +8A40 +9BE0 +ENDCHAR +STARTCHAR U_96D6 +ENCODING 38614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8A80 +FBE0 +2680 +FBE0 +AA80 +AA80 +FBE0 +2A80 +3A80 +C7E0 +ENDCHAR +STARTCHAR U_96D7 +ENCODING 38615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2480 +FA40 +8BE0 +FE80 +8BE0 +FA80 +23E0 +FA80 +23E0 +ENDCHAR +STARTCHAR U_96D8 +ENCODING 38616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4FE0 +6A40 +5FE0 +4A80 +FBE0 +4A80 +4FE0 +4A40 +8980 +9E60 +ENDCHAR +STARTCHAR U_96D9 +ENCODING 38617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3FE0 +6A80 +BFC0 +2A80 +3FE0 +0000 +3FC0 +0880 +0700 +78E0 +ENDCHAR +STARTCHAR U_96DA +ENCODING 38618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7BC0 +4A40 +7BC0 +2200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_96DB +ENCODING 38619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FA80 +ABE0 +FE80 +2A80 +CBE0 +7A80 +ABE0 +FA80 +2BE0 +D200 +ENDCHAR +STARTCHAR U_96DC +ENCODING 38620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FE80 +4BE0 +4A80 +B7E0 +1280 +FE80 +13E0 +3A80 +5680 +93E0 +ENDCHAR +STARTCHAR U_96DD +ENCODING 38621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +AA80 +57E0 +FE80 +8BE0 +FA80 +AA80 +ABE0 +FA80 +87E0 +7E00 +ENDCHAR +STARTCHAR U_96DE +ENCODING 38622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1980 +EA80 +A7E0 +5280 +23E0 +CA80 +7280 +23E0 +FA80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_96DF +ENCODING 38623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1200 +3FC0 +6200 +BFC0 +2200 +7FE0 +59A0 +6F60 +4060 +ENDCHAR +STARTCHAR U_96E0 +ENCODING 38624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +F5E0 +A140 +AD40 +F5E0 +A540 +A540 +F5E0 +A740 +A540 +F1E0 +ENDCHAR +STARTCHAR U_96E1 +ENCODING 38625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +B540 +6FE0 +B540 +25E0 +3940 +4540 +93E0 +6940 +1140 +61E0 +ENDCHAR +STARTCHAR U_96E2 +ENCODING 38626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +FD40 +55E0 +6F40 +55E0 +7D40 +2140 +FDE0 +AD40 +B540 +8DE0 +ENDCHAR +STARTCHAR U_96E3 +ENCODING 38627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FE80 +53E0 +2680 +FBC0 +AA80 +FA80 +23C0 +FE80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_96E4 +ENCODING 38628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +4440 +7BC0 +4440 +FFE0 +A420 +7FC0 +C400 +7FC0 +4400 +7FC0 +ENDCHAR +STARTCHAR U_96E5 +ENCODING 38629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +6200 +BFC0 +2200 +3FE0 +5280 +7FE0 +D280 +7BC0 +5280 +7FE0 +ENDCHAR +STARTCHAR U_96E6 +ENCODING 38630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CCC0 +AAA0 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +AAA0 +AAA0 +FFE0 +8880 +ENDCHAR +STARTCHAR U_96E7 +ENCODING 38631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3F80 +1200 +7FC0 +5280 +FFC0 +5280 +FFE0 +0E00 +1500 +64C0 +ENDCHAR +STARTCHAR U_96E8 +ENCODING 38632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +5540 +4CC0 +6640 +5540 +4440 +44C0 +ENDCHAR +STARTCHAR U_96E9 +ENCODING 38633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +0000 +FFE0 +1000 +3F80 +0080 +0300 +ENDCHAR +STARTCHAR U_96EA +ENCODING 38634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0000 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_96EB +ENCODING 38635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +FFE0 +0600 +0580 +0480 +0400 +ENDCHAR +STARTCHAR U_96EC +ENCODING 38636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2080 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_96ED +ENCODING 38637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +7F80 +1100 +1380 +2900 +4600 +99C0 +ENDCHAR +STARTCHAR U_96EE +ENCODING 38638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +0780 +7C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_96EF +ENCODING 38639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0400 +FFE0 +1100 +0A00 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_96F0 +ENCODING 38640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1100 +2080 +7FC0 +88A0 +1080 +6300 +ENDCHAR +STARTCHAR U_96F1 +ENCODING 38641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +0400 +FFE0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_96F2 +ENCODING 38642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7F80 +0000 +FFE0 +1100 +FF80 +6040 +ENDCHAR +STARTCHAR U_96F3 +ENCODING 38643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +4200 +5FC0 +4440 +4840 +B180 +ENDCHAR +STARTCHAR U_96F4 +ENCODING 38644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +A4A0 +1500 +2880 +0400 +7FC0 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_96F5 +ENCODING 38645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +4440 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_96F6 +ENCODING 38646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0E00 +3180 +C460 +3F80 +0100 +0E00 +0300 +ENDCHAR +STARTCHAR U_96F7 +ENCODING 38647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_96F8 +ENCODING 38648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1080 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_96F9 +ENCODING 38649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3FC0 +4040 +BE40 +2240 +3EA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_96FA +ENCODING 38650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7F80 +0900 +FFE0 +0A40 +1200 +6E00 +ENDCHAR +STARTCHAR U_96FB +ENCODING 38651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_96FC +ENCODING 38652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2080 +FFE0 +0800 +1F80 +F080 +1F80 +ENDCHAR +STARTCHAR U_96FD +ENCODING 38653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +01C0 +7E80 +2500 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_96FE +ENCODING 38654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +5200 +1F00 +E4E0 +3F80 +0880 +7300 +ENDCHAR +STARTCHAR U_96FF +ENCODING 38655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +2A40 +1A80 +3B00 +CAA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_9700 +ENCODING 38656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +B5A0 +0400 +FFE0 +0800 +7FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_9701 +ENCODING 38657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +1100 +0E00 +F1E0 +1100 +6100 +ENDCHAR +STARTCHAR U_9702 +ENCODING 38658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +9100 +6FC0 +2300 +C580 +4940 +5120 +ENDCHAR +STARTCHAR U_9703 +ENCODING 38659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2480 +0200 +2FC0 +4A40 +1200 +6540 +29C0 +ENDCHAR +STARTCHAR U_9704 +ENCODING 38660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_9705 +ENCODING 38661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9706 +ENCODING 38662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +F7C0 +2100 +77C0 +1100 +5FE0 +2000 +DFE0 +ENDCHAR +STARTCHAR U_9707 +ENCODING 38663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +94A0 +7FC0 +4000 +7FC0 +5280 +9100 +98E0 +ENDCHAR +STARTCHAR U_9708 +ENCODING 38664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4200 +BFE0 +6200 +2FC0 +CA40 +4AC0 +4200 +ENDCHAR +STARTCHAR U_9709 +ENCODING 38665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9520 +7FE0 +2880 +FFE0 +2480 +3FE0 +0100 +ENDCHAR +STARTCHAR U_970A +ENCODING 38666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +7FC0 +0000 +7FC0 +4A40 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_970B +ENCODING 38667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFC0 +0480 +7FC0 +0480 +FFE0 +1200 +FDC0 +ENDCHAR +STARTCHAR U_970C +ENCODING 38668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5540 +7FC0 +4440 +5F40 +4E40 +4A40 +8EC0 +ENDCHAR +STARTCHAR U_970D +ENCODING 38669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +3FE0 +1200 +3FC0 +5200 +9FC0 +1200 +1FE0 +ENDCHAR +STARTCHAR U_970E +ENCODING 38670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +0900 +FFE0 +0400 +7FC0 +1200 +FDC0 +ENDCHAR +STARTCHAR U_970F +ENCODING 38671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_9710 +ENCODING 38672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +AE40 +4280 +BE80 +5080 +DD00 +4520 +4DE0 +ENDCHAR +STARTCHAR U_9711 +ENCODING 38673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +4100 +A9E0 +5100 +E7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_9712 +ENCODING 38674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FF40 +9220 +6C80 +3840 +03E0 +FC20 +2840 +FC40 +4480 +ENDCHAR +STARTCHAR U_9713 +ENCODING 38675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +73C0 +4040 +7BC0 +4040 +7FC0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_9714 +ENCODING 38676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +A4A0 +5540 +4100 +2FE0 +8100 +2FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_9715 +ENCODING 38677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +FFE0 +A900 +7540 +AD40 +FD40 +07C0 +F920 +5120 +F8E0 +ENDCHAR +STARTCHAR U_9716 +ENCODING 38678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1100 +FBE0 +1100 +3B80 +5540 +9120 +ENDCHAR +STARTCHAR U_9717 +ENCODING 38679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +94A0 +2500 +4280 +2D40 +87E0 +2080 +4300 +4100 +ENDCHAR +STARTCHAR U_9718 +ENCODING 38680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +4FE0 +2820 +ABA0 +4820 +CBA0 +4AA0 +4BA0 +ENDCHAR +STARTCHAR U_9719 +ENCODING 38681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +1100 +3F80 +2480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_971A +ENCODING 38682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2480 +7A00 +13E0 +7A40 +3580 +5180 +B660 +ENDCHAR +STARTCHAR U_971B +ENCODING 38683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +6EC0 +2240 +4480 +66C0 +2240 +66C0 +ENDCHAR +STARTCHAR U_971C +ENCODING 38684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +23C0 +FA40 +23C0 +3240 +6BC0 +AA40 +23C0 +ENDCHAR +STARTCHAR U_971D +ENCODING 38685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A0A0 +0000 +EEE0 +AAA0 +AAA0 +EEE0 +AAA0 +ENDCHAR +STARTCHAR U_971E +ENCODING 38686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBC0 +4840 +7FC0 +4240 +7A40 +4180 +4E60 +ENDCHAR +STARTCHAR U_971F +ENCODING 38687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4480 +2FC0 +A480 +4480 +DFE0 +4480 +5860 +ENDCHAR +STARTCHAR U_9720 +ENCODING 38688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2500 +1280 +FD40 +9120 +57C0 +2080 +F100 +ENDCHAR +STARTCHAR U_9721 +ENCODING 38689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +2540 +7300 +5140 +7D80 +5580 +7960 +9340 +ENDCHAR +STARTCHAR U_9722 +ENCODING 38690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +F7C0 +9440 +F580 +9540 +F580 +9540 +B920 +ENDCHAR +STARTCHAR U_9723 +ENCODING 38691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +2080 +7FC0 +4040 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_9724 +ENCODING 38692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +73C0 +4940 +7540 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_9725 +ENCODING 38693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +8020 +7FC0 +1480 +6F00 +1500 +6CE0 +ENDCHAR +STARTCHAR U_9726 +ENCODING 38694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2440 +FE80 +2520 +6E40 +B5A0 +2440 +2580 +ENDCHAR +STARTCHAR U_9727 +ENCODING 38695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBE0 +5540 +FC80 +2940 +6FE0 +A120 +6260 +ENDCHAR +STARTCHAR U_9728 +ENCODING 38696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7C40 +47E0 +7C40 +4240 +7D40 +5840 +B4C0 +ENDCHAR +STARTCHAR U_9729 +ENCODING 38697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FDE0 +4920 +7D40 +0940 +FD20 +11A0 +7140 +ENDCHAR +STARTCHAR U_972A +ENCODING 38698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4FE0 +AA40 +47C0 +6100 +DFE0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_972B +ENCODING 38699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +1540 +0CC0 +7540 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_972C +ENCODING 38700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +4440 +7FC0 +1100 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_972D +ENCODING 38701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +27C0 +1540 +E440 +27E0 +2D20 +36A0 +27C0 +ENDCHAR +STARTCHAR U_972E +ENCODING 38702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +9FE0 +4480 +A780 +4480 +DFE0 +4A80 +4FE0 +ENDCHAR +STARTCHAR U_972F +ENCODING 38703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7A80 +5120 +3FC0 +60A0 +BF80 +1200 +FFC0 +ENDCHAR +STARTCHAR U_9730 +ENCODING 38704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FDE0 +5140 +FF40 +4940 +7880 +4940 +5A20 +ENDCHAR +STARTCHAR U_9731 +ENCODING 38705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +FFC0 +1480 +FFC0 +5B40 +6EC0 +40C0 +ENDCHAR +STARTCHAR U_9732 +ENCODING 38706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F3C0 +9640 +F180 +2660 +BBC0 +A240 +F3C0 +ENDCHAR +STARTCHAR U_9733 +ENCODING 38707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7380 +5280 +6D60 +5500 +67C0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_9734 +ENCODING 38708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FD40 +AFE0 +7140 +AFE0 +F540 +0380 +FD60 +5140 +FB00 +ENDCHAR +STARTCHAR U_9735 +ENCODING 38709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FCA0 +4940 +FD20 +8BE0 +F940 +88A0 +FD60 +ENDCHAR +STARTCHAR U_9736 +ENCODING 38710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +4FE0 +8280 +2FE0 +CA20 +43C0 +4C40 +ENDCHAR +STARTCHAR U_9737 +ENCODING 38711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +2500 +77C0 +5540 +7FE0 +5400 +57E0 +7AA0 +ENDCHAR +STARTCHAR U_9738 +ENCODING 38712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFC0 +4A40 +FBC0 +AA40 +FFC0 +2240 +24C0 +ENDCHAR +STARTCHAR U_9739 +ENCODING 38713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7BE0 +4940 +7880 +47E0 +7880 +ABE0 +3880 +ENDCHAR +STARTCHAR U_973A +ENCODING 38714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +6AE0 +BFA0 +40A0 +FEA0 +5440 +54A0 +6720 +ENDCHAR +STARTCHAR U_973B +ENCODING 38715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +4A40 +FFE0 +2080 +3F80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_973C +ENCODING 38716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FC00 +ABC0 +7000 +AFC0 +7AC0 +0740 +FFC0 +5720 +FAA0 +ENDCHAR +STARTCHAR U_973D +ENCODING 38717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +5A80 +94C0 +3FA0 +2080 +3F80 +4080 +ENDCHAR +STARTCHAR U_973E +ENCODING 38718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +57C0 +A540 +57C0 +B540 +57C0 +9100 +2FE0 +ENDCHAR +STARTCHAR U_973F +ENCODING 38719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F9C0 +5280 +FFE0 +6A40 +A3C0 +2240 +63C0 +ENDCHAR +STARTCHAR U_9740 +ENCODING 38720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5540 +7FC0 +1100 +FFE0 +2D00 +D600 +2DC0 +ENDCHAR +STARTCHAR U_9741 +ENCODING 38721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_9742 +ENCODING 38722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +9080 +FBC0 +D4A0 +97C0 +A400 +FFE0 +ENDCHAR +STARTCHAR U_9743 +ENCODING 38723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +A280 +FFE0 +A280 +FBC0 +A280 +FBE0 +ENDCHAR +STARTCHAR U_9744 +ENCODING 38724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F7C0 +0440 +F3E0 +0CA0 +F560 +9720 +F0C0 +ENDCHAR +STARTCHAR U_9745 +ENCODING 38725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +27E0 +FAA0 +AFE0 +72A0 +ACE0 +77C0 +0340 +FAC0 +53C0 +FE60 +ENDCHAR +STARTCHAR U_9746 +ENCODING 38726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +F8A0 +ABE0 +FCA0 +AFE0 +76A0 +05C0 +FEA0 +4D80 +FBE0 +ENDCHAR +STARTCHAR U_9747 +ENCODING 38727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBE0 +5200 +FBC0 +8840 +FBC0 +8A20 +9BE0 +ENDCHAR +STARTCHAR U_9748 +ENCODING 38728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_9749 +ENCODING 38729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +22A0 +FFE0 +AAA0 +FAC0 +8D20 +73C0 +0640 +F980 +5240 +FC20 +ENDCHAR +STARTCHAR U_974A +ENCODING 38730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +5540 +FFE0 +2040 +3FC0 +0900 +FFE0 +ENDCHAR +STARTCHAR U_974B +ENCODING 38731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9FC0 +5480 +BFE0 +54A0 +D5C0 +6900 +9FE0 +ENDCHAR +STARTCHAR U_974C +ENCODING 38732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +5540 +1540 +3F80 +2A80 +3F80 +1100 +ENDCHAR +STARTCHAR U_974D +ENCODING 38733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +3BE0 +52A0 +FBE0 +5200 +7BE0 +52A0 +7D60 +ENDCHAR +STARTCHAR U_974E +ENCODING 38734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2BE0 +7EA0 +93E0 +7E00 +57E0 +3AA0 +F960 +ENDCHAR +STARTCHAR U_974F +ENCODING 38735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +A6A0 +7BE0 +D200 +7BE0 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9750 +ENCODING 38736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +3F80 +2480 +FFE0 +2080 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_9751 +ENCODING 38737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +0400 +FFE0 +2480 +3F80 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_9752 +ENCODING 38738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +1080 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_9753 +ENCODING 38739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +2540 +FD40 +2540 +FD40 +5540 +7280 +52A0 +74A0 +58E0 +ENDCHAR +STARTCHAR U_9754 +ENCODING 38740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2400 +FBC0 +2000 +FFC0 +4840 +7840 +4840 +7820 +4820 +ENDCHAR +STARTCHAR U_9755 +ENCODING 38741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +27C0 +2100 +BFE0 +A440 +A7C0 +B440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_9756 +ENCODING 38742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07C0 +9100 +5FE0 +5440 +27C0 +3440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_9757 +ENCODING 38743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F140 +2540 +F380 +27E0 +FA80 +5280 +7280 +52A0 +74A0 +5860 +ENDCHAR +STARTCHAR U_9758 +ENCODING 38744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +2280 +FBE0 +26A0 +FAA0 +8BE0 +FA00 +8A20 +FA20 +99E0 +ENDCHAR +STARTCHAR U_9759 +ENCODING 38745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDC0 +2280 +7BC0 +2140 +FFE0 +4940 +6BC0 +5900 +4900 +5B00 +ENDCHAR +STARTCHAR U_975A +ENCODING 38746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FBE0 +2220 +FFE0 +4A20 +7BE0 +4940 +7940 +4A40 +5C60 +ENDCHAR +STARTCHAR U_975B +ENCODING 38747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +7800 +23E0 +FC80 +4A80 +7AE0 +4A80 +7B80 +4CE0 +ENDCHAR +STARTCHAR U_975C +ENCODING 38748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2520 +FAC0 +27C0 +F940 +97E0 +F140 +97C0 +F100 +9500 +B200 +ENDCHAR +STARTCHAR U_975D +ENCODING 38749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7E0 +2800 +F780 +2000 +FFC0 +5AC0 +7740 +5FC0 +7760 +5AA0 +ENDCHAR +STARTCHAR U_975E +ENCODING 38750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +FBE0 +0A00 +0A00 +7BC0 +0A00 +0A00 +FBE0 +0A00 +0A00 +ENDCHAR +STARTCHAR U_975F +ENCODING 38751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BE0 +0A00 +03C0 +7C00 +0400 +7FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9760 +ENCODING 38752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +FFE0 +2080 +3F80 +0A00 +FBE0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_9761 +ENCODING 38753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +FBE0 +8A00 +BBC0 +8A00 +FBE0 +ENDCHAR +STARTCHAR U_9762 +ENCODING 38754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +1000 +FFC0 +9240 +9E40 +9240 +9E40 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_9763 +ENCODING 38755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +7FC0 +4040 +5F40 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9764 +ENCODING 38756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FDE0 +2220 +FDA0 +A6A0 +B5A0 +A520 +B560 +A500 +A520 +FDE0 +ENDCHAR +STARTCHAR U_9765 +ENCODING 38757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4280 +7FE0 +4500 +7FE0 +4200 +5FE0 +5520 +5720 +9520 +9FE0 +ENDCHAR +STARTCHAR U_9766 +ENCODING 38758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2120 +FFE0 +AB20 +BBE0 +AB20 +BBE0 +AA40 +AAC0 +FF40 +8260 +ENDCHAR +STARTCHAR U_9767 +ENCODING 38759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +4540 +FFE0 +A800 +BBC0 +AB40 +BAC0 +AB40 +FBC0 +0660 +ENDCHAR +STARTCHAR U_9768 +ENCODING 38760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BC80 +A540 +FFE0 +2940 +2F40 +2940 +3FC0 +ENDCHAR +STARTCHAR U_9769 +ENCODING 38761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_976A +ENCODING 38762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC40 +2840 +3840 +1040 +7C40 +5440 +7C40 +1240 +FD40 +1080 +ENDCHAR +STARTCHAR U_976B +ENCODING 38763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFC0 +5440 +7640 +2540 +FA80 +AA80 +F900 +2280 +FC60 +2840 +ENDCHAR +STARTCHAR U_976C +ENCODING 38764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC80 +2880 +3880 +1080 +7FE0 +5480 +7C80 +1080 +FC80 +1080 +ENDCHAR +STARTCHAR U_976D +ENCODING 38765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FDE0 +28A0 +38A0 +11A0 +7EA0 +54A0 +7D20 +1120 +FEA0 +1440 +ENDCHAR +STARTCHAR U_976E +ENCODING 38766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +53E0 +7420 +2120 +F8A0 +A8A0 +F820 +2020 +F920 +20C0 +ENDCHAR +STARTCHAR U_976F +ENCODING 38767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +7100 +27C0 +F900 +A900 +F900 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_9770 +ENCODING 38768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA80 +5280 +7280 +2280 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_9771 +ENCODING 38769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5140 +7140 +2540 +FB40 +A940 +FAC0 +2260 +FD40 +2080 +ENDCHAR +STARTCHAR U_9772 +ENCODING 38770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F980 +5240 +7520 +2080 +F800 +ABE0 +F840 +2040 +F880 +2080 +ENDCHAR +STARTCHAR U_9773 +ENCODING 38771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2860 +FF80 +2900 +3900 +11E0 +7D40 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_9774 +ENCODING 38772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FA80 +5280 +76A0 +22C0 +FA80 +AB80 +FA80 +26A0 +FAA0 +2260 +ENDCHAR +STARTCHAR U_9775 +ENCODING 38773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5140 +7140 +23C0 +F940 +A940 +F940 +2140 +FFE0 +2000 +ENDCHAR +STARTCHAR U_9776 +ENCODING 38774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +52A0 +72A0 +22A0 +FBE0 +AA00 +FA00 +2220 +FE20 +23E0 +ENDCHAR +STARTCHAR U_9777 +ENCODING 38775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53A0 +F8A0 +50A0 +73A0 +2220 +FBA0 +A8A0 +F8A0 +20A0 +FCA0 +2320 +ENDCHAR +STARTCHAR U_9778 +ENCODING 38776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +FA40 +5240 +7280 +22E0 +FA20 +AA40 +FB40 +2480 +F940 +2A20 +ENDCHAR +STARTCHAR U_9779 +ENCODING 38777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +73E0 +22A0 +FAA0 +AB60 +FA20 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_977A +ENCODING 38778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5080 +7080 +23E0 +F880 +A880 +F9C0 +22A0 +FCA0 +2080 +ENDCHAR +STARTCHAR U_977B +ENCODING 38779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +5240 +7240 +23C0 +FA40 +AA40 +FBC0 +2240 +FA40 +27E0 +ENDCHAR +STARTCHAR U_977C +ENCODING 38780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5240 +7240 +23C0 +FA40 +AA40 +FBC0 +2240 +F800 +27E0 +ENDCHAR +STARTCHAR U_977D +ENCODING 38781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FEA0 +51C0 +7080 +23E0 +F880 +A880 +FFE0 +2080 +FC80 +2080 +ENDCHAR +STARTCHAR U_977E +ENCODING 38782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAA0 +52A0 +77E0 +22A0 +FAA0 +AAA0 +FAE0 +2200 +FA00 +23E0 +ENDCHAR +STARTCHAR U_977F +ENCODING 38783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA80 +5480 +75E0 +22A0 +FAA0 +AAA0 +FDA0 +26A0 +F920 +2240 +ENDCHAR +STARTCHAR U_9780 +ENCODING 38784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F920 +5120 +7120 +22E0 +FC40 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_9781 +ENCODING 38785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +7280 +23E0 +FA40 +AA40 +FB40 +2280 +FD40 +2A20 +ENDCHAR +STARTCHAR U_9782 +ENCODING 38786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +FB80 +5080 +77E0 +2080 +F880 +A9C0 +FAA0 +24A0 +F880 +2080 +ENDCHAR +STARTCHAR U_9783 +ENCODING 38787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5740 +F940 +5140 +7740 +2440 +FE40 +AA80 +FAA0 +22A0 +FAA0 +25E0 +ENDCHAR +STARTCHAR U_9784 +ENCODING 38788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5420 +73A0 +22A0 +FAA0 +ABA0 +FA60 +2200 +FA20 +21E0 +ENDCHAR +STARTCHAR U_9785 +ENCODING 38789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +72A0 +22A0 +FAA0 +AFE0 +F880 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_9786 +ENCODING 38790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +5100 +77C0 +2540 +FD40 +AEC0 +FC40 +2440 +FC40 +24C0 +ENDCHAR +STARTCHAR U_9787 +ENCODING 38791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +5520 +77E0 +2520 +FD20 +ADA0 +FE60 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_9788 +ENCODING 38792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F980 +5240 +7420 +23C0 +F800 +ABC0 +FA40 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_9789 +ENCODING 38793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA80 +52A0 +7AC0 +2680 +FAC0 +AAA0 +FE80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_978A +ENCODING 38794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +57E0 +7080 +23E0 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_978B +ENCODING 38795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +7080 +27E0 +F880 +A880 +FBE0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_978C +ENCODING 38796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +1F00 +6A80 +3FC0 +0A00 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_978D +ENCODING 38797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +7100 +2100 +FFE0 +A940 +FA40 +2180 +F940 +2620 +ENDCHAR +STARTCHAR U_978E +ENCODING 38798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +FA80 +AAA0 +FAC0 +2240 +FAA0 +2320 +ENDCHAR +STARTCHAR U_978F +ENCODING 38799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +24A0 +3EA0 +E5E0 +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9790 +ENCODING 38800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FDC0 +5100 +77E0 +2000 +FFE0 +A900 +F940 +2120 +F900 +2100 +ENDCHAR +STARTCHAR U_9791 +ENCODING 38801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5280 +71E0 +2E80 +FA80 +AAC0 +FB20 +2200 +FD00 +28E0 +ENDCHAR +STARTCHAR U_9792 +ENCODING 38802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FB80 +5100 +77E0 +2140 +FE20 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_9793 +ENCODING 38803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7000 +27C0 +F900 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_9794 +ENCODING 38804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F9C0 +5240 +77E0 +22A0 +FAA0 +ABE0 +F880 +21A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_9795 +ENCODING 38805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F900 +57C0 +7540 +27C0 +FD40 +AFC0 +FD00 +2300 +FA80 +2460 +ENDCHAR +STARTCHAR U_9796 +ENCODING 38806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FF40 +5540 +7280 +2100 +FFE0 +A940 +FA40 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_9797 +ENCODING 38807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5A40 +5180 +D240 +5FE0 +5280 +57C0 +5540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_9798 +ENCODING 38808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FAA0 +51C0 +7080 +23E0 +FA20 +ABE0 +FA20 +23E0 +FA20 +2260 +ENDCHAR +STARTCHAR U_9799 +ENCODING 38809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7000 +23E0 +FA20 +ABE0 +FA20 +23E0 +FA20 +2260 +ENDCHAR +STARTCHAR U_979A +ENCODING 38810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5420 +7140 +2220 +F800 +ABC0 +F880 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_979B +ENCODING 38811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5040 +7240 +2180 +FFE0 +A800 +FBC0 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_979C +ENCODING 38812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F8A0 +57C0 +72A0 +24A0 +F980 +ABE0 +FA20 +23E0 +FA20 +23E0 +ENDCHAR +STARTCHAR U_979D +ENCODING 38813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5520 +FB40 +5100 +7FE0 +2820 +FBA0 +AAA0 +FAA0 +2BA0 +F820 +2860 +ENDCHAR +STARTCHAR U_979E +ENCODING 38814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5520 +77E0 +2520 +FFE0 +A980 +FA80 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_979F +ENCODING 38815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5000 +73C0 +2240 +FBC0 +A880 +FBE0 +2080 +FA80 +2100 +ENDCHAR +STARTCHAR U_97A0 +ENCODING 38816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5560 +75A0 +2320 +FFE0 +A920 +FBA0 +2560 +F920 +21C0 +ENDCHAR +STARTCHAR U_97A1 +ENCODING 38817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA40 +57E0 +7200 +2220 +FBA0 +AEA0 +FAA0 +2240 +FA40 +27E0 +ENDCHAR +STARTCHAR U_97A2 +ENCODING 38818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +FFE0 +5540 +75C0 +2400 +FFE0 +A900 +FFE0 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97A3 +ENCODING 38819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F940 +57E0 +72A0 +2580 +F900 +AFE0 +F900 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97A4 +ENCODING 38820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2140 +F8C0 +2900 +FFC0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97A5 +ENCODING 38821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FA40 +55A0 +7000 +23C0 +FA40 +ABC0 +FA40 +27E0 +FA40 +2440 +ENDCHAR +STARTCHAR U_97A6 +ENCODING 38822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FE40 +5240 +72C0 +2F60 +FA40 +AB40 +FEC0 +2240 +FAA0 +2320 +ENDCHAR +STARTCHAR U_97A7 +ENCODING 38823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5280 +77E0 +26A0 +FEE0 +AC20 +FFE0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_97A8 +ENCODING 38824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +F900 +AFE0 +FAA0 +2360 +FFA0 +2040 +ENDCHAR +STARTCHAR U_97A9 +ENCODING 38825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +FAA0 +5720 +7F60 +2960 +FF60 +A960 +FF60 +2920 +F920 +2B60 +ENDCHAR +STARTCHAR U_97AA +ENCODING 38826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +F940 +6880 +A940 +FFE0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97AB +ENCODING 38827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5520 +77E0 +2020 +FBA0 +A820 +FBA0 +22A0 +FBA0 +2040 +ENDCHAR +STARTCHAR U_97AC +ENCODING 38828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FAA0 +53E0 +74A0 +27E0 +FA80 +ABE0 +FA80 +27E0 +FA80 +29E0 +ENDCHAR +STARTCHAR U_97AD +ENCODING 38829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA80 +53E0 +76A0 +27E0 +FEA0 +AFE0 +FC80 +2580 +FD40 +2620 +ENDCHAR +STARTCHAR U_97AE +ENCODING 38830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +F800 +AFE0 +FA80 +22E0 +FD80 +24E0 +ENDCHAR +STARTCHAR U_97AF +ENCODING 38831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FFE0 +5140 +77E0 +2100 +FAE0 +AE40 +FBE0 +2240 +FA40 +22C0 +ENDCHAR +STARTCHAR U_97B0 +ENCODING 38832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7240 +23C0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_97B1 +ENCODING 38833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FF20 +52A0 +7140 +2100 +FA60 +AA20 +FB60 +2220 +FFE0 +2220 +ENDCHAR +STARTCHAR U_97B2 +ENCODING 38834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +77C0 +2280 +FFE0 +AD40 +FFC0 +2540 +FFE0 +24C0 +ENDCHAR +STARTCHAR U_97B3 +ENCODING 38835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FBE0 +5240 +7180 +2240 +FDA0 +A800 +FBC0 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_97B4 +ENCODING 38836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FBE0 +5140 +77E0 +2200 +FBE0 +AEA0 +FBE0 +22A0 +FBE0 +22A0 +ENDCHAR +STARTCHAR U_97B5 +ENCODING 38837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51C0 +FE40 +5540 +7280 +2780 +F940 +AFC0 +F900 +27E0 +FA80 +2460 +ENDCHAR +STARTCHAR U_97B6 +ENCODING 38838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE60 +AB80 +F900 +AA80 +7FE0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97B7 +ENCODING 38839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +7FC0 +4A40 +4440 +FFE0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97B8 +ENCODING 38840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +53E0 +72A0 +23E0 +FAA0 +AFE0 +FAA0 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_97B9 +ENCODING 38841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52E0 +FFA0 +55A0 +77C0 +20A0 +FFA0 +AAA0 +FAA0 +27E0 +FA80 +2680 +ENDCHAR +STARTCHAR U_97BA +ENCODING 38842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +FB80 +57E0 +7820 +2380 +FA80 +AB80 +F900 +27C0 +F900 +27E0 +ENDCHAR +STARTCHAR U_97BB +ENCODING 38843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5540 +77E0 +2540 +FFE0 +A920 +FFE0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_97BC +ENCODING 38844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5540 +77E0 +2000 +FBC0 +AB40 +FAC0 +2340 +FBC0 +2660 +ENDCHAR +STARTCHAR U_97BD +ENCODING 38845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +F900 +5FE0 +7280 +27E0 +FA80 +AFE0 +FEA0 +27A0 +FC20 +2460 +ENDCHAR +STARTCHAR U_97BE +ENCODING 38846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +77E0 +2540 +FFE0 +AD40 +FFE0 +2100 +FFE0 +2100 +ENDCHAR +STARTCHAR U_97BF +ENCODING 38847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +F5A0 +5FC0 +7540 +2FE0 +F920 +AFE0 +FB40 +22A0 +FD60 +2220 +ENDCHAR +STARTCHAR U_97C0 +ENCODING 38848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5540 +77E0 +2560 +FFE0 +AD00 +FDE0 +2500 +FDE0 +2AA0 +ENDCHAR +STARTCHAR U_97C1 +ENCODING 38849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FAA0 +53E0 +72A0 +27E0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +27E0 +ENDCHAR +STARTCHAR U_97C2 +ENCODING 38850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBC0 +5480 +77E0 +2540 +FEA0 +ADC0 +FC00 +25C0 +F940 +29C0 +ENDCHAR +STARTCHAR U_97C3 +ENCODING 38851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FDC0 +5280 +71E0 +2740 +FBE0 +AA80 +FBE0 +2280 +FA80 +25E0 +ENDCHAR +STARTCHAR U_97C4 +ENCODING 38852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FFE0 +5140 +73E0 +2680 +FBE0 +AA80 +FBE0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_97C5 +ENCODING 38853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FC20 +57E0 +7420 +27E0 +FA40 +ADA0 +FA40 +27E0 +F540 +2AA0 +ENDCHAR +STARTCHAR U_97C6 +ENCODING 38854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA80 +57E0 +7EA0 +27E0 +F940 +AFE0 +FD40 +2520 +FDE0 +2BE0 +ENDCHAR +STARTCHAR U_97C7 +ENCODING 38855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5080 +7FE0 +2AA0 +FFE0 +AA40 +FBC0 +2240 +FBC0 +2660 +ENDCHAR +STARTCHAR U_97C8 +ENCODING 38856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5280 +FFE0 +AAA0 +FFE0 +24A0 +FEA0 +24C0 +2760 +2820 +ENDCHAR +STARTCHAR U_97C9 +ENCODING 38857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA40 +5FE0 +7AA0 +2FE0 +FA00 +ABE0 +FA00 +2BE0 +FAA0 +2D60 +ENDCHAR +STARTCHAR U_97CA +ENCODING 38858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5AA0 +7EE0 +2AA0 +FFE0 +A920 +FFE0 +2D60 +FBA0 +2D60 +ENDCHAR +STARTCHAR U_97CB +ENCODING 38859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0880 +FFE0 +2080 +3F80 +0400 +7FC0 +2400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_97CC +ENCODING 38860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +50A0 +FAA0 +52A0 +74A0 +20A0 +F920 +A120 +FA20 +24C0 +ENDCHAR +STARTCHAR U_97CD +ENCODING 38861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +F140 +57E0 +F900 +91C0 +F240 +2340 +FAC0 +A280 +FD40 +2A20 +ENDCHAR +STARTCHAR U_97CE +ENCODING 38862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +2BE0 +FC80 +4880 +7BE0 +1080 +FDC0 +52A0 +FCA0 +1080 +ENDCHAR +STARTCHAR U_97CF +ENCODING 38863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FE0 +0800 +FFE0 +4940 +BFA0 +1100 +7FC0 +2200 +7FC0 +0200 +ENDCHAR +STARTCHAR U_97D0 +ENCODING 38864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +2A20 +FE20 +49C0 +7800 +13E0 +FE20 +5220 +FFE0 +1220 +ENDCHAR +STARTCHAR U_97D1 +ENCODING 38865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +A940 +77E0 +FA40 +53C0 +5FE0 +5280 +53C0 +50A0 +8FE0 +ENDCHAR +STARTCHAR U_97D2 +ENCODING 38866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +29C0 +FFE0 +4A20 +7BE0 +1220 +FBE0 +5220 +7E20 +1260 +ENDCHAR +STARTCHAR U_97D3 +ENCODING 38867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +FFE0 +8A40 +FBC0 +8880 +FFE0 +2280 +FFE0 +2080 +ENDCHAR +STARTCHAR U_97D4 +ENCODING 38868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A00 +2BC0 +FE00 +4BC0 +7A00 +13E0 +FE80 +52A0 +FE40 +1320 +ENDCHAR +STARTCHAR U_97D5 +ENCODING 38869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +2A40 +FFC0 +4800 +7BE0 +1040 +FC80 +53E0 +FC80 +1180 +ENDCHAR +STARTCHAR U_97D6 +ENCODING 38870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F140 +57E0 +FAA0 +9480 +F100 +27E0 +F900 +A380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97D7 +ENCODING 38871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +5080 +FFE0 +92A0 +F3E0 +22A0 +FBE0 +A080 +FFE0 +2080 +ENDCHAR +STARTCHAR U_97D8 +ENCODING 38872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +5540 +FDC0 +9400 +F7E0 +2100 +FFE0 +A380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97D9 +ENCODING 38873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +7FE0 +4A40 +7BC0 +0080 +FFE0 +5280 +5FE0 +B080 +9FE0 +ENDCHAR +STARTCHAR U_97DA +ENCODING 38874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +2940 +F9C0 +4880 +7BE0 +12A0 +FBE0 +5080 +7FE0 +1080 +ENDCHAR +STARTCHAR U_97DB +ENCODING 38875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +2940 +FFE0 +4900 +7BE0 +16A0 +FFE0 +52A0 +7BE0 +12A0 +ENDCHAR +STARTCHAR U_97DC +ENCODING 38876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F7A0 +5520 +FAC0 +9000 +F660 +2420 +FF60 +A420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_97DD +ENCODING 38877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F7E0 +5280 +FFE0 +9280 +FFE0 +2540 +FFC0 +A540 +FFE0 +24C0 +ENDCHAR +STARTCHAR U_97DE +ENCODING 38878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +2BC0 +FE40 +4BC0 +7800 +13E0 +FEA0 +52A0 +FEA0 +17E0 +ENDCHAR +STARTCHAR U_97DF +ENCODING 38879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +5440 +FFC0 +9440 +F7C0 +2100 +FFE0 +A540 +FBA0 +2100 +ENDCHAR +STARTCHAR U_97E0 +ENCODING 38880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +57C0 +FD40 +97C0 +F540 +2FE0 +F540 +AFE0 +F100 +2100 +ENDCHAR +STARTCHAR U_97E1 +ENCODING 38881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +5280 +FFE0 +9540 +FFE0 +2540 +FFE0 +A100 +FFC0 +2100 +ENDCHAR +STARTCHAR U_97E2 +ENCODING 38882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +5100 +FFC0 +9540 +F7C0 +2560 +FFE0 +A540 +FA60 +23C0 +ENDCHAR +STARTCHAR U_97E3 +ENCODING 38883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +4FE0 +F200 +93E0 +F520 +27E0 +FD60 +A7E0 +F920 +27C0 +ENDCHAR +STARTCHAR U_97E4 +ENCODING 38884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +5240 +FFE0 +9AA0 +FFE0 +2140 +F7E0 +A540 +F6A0 +2960 +ENDCHAR +STARTCHAR U_97E5 +ENCODING 38885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +5100 +FFE0 +9AA0 +FFE0 +2240 +FBC0 +A240 +FBC0 +2E60 +ENDCHAR +STARTCHAR U_97E6 +ENCODING 38886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +0800 +0800 +FFC0 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_97E7 +ENCODING 38887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +20A0 +FAA0 +22A0 +FCA0 +28A0 +2920 +3920 +2220 +24C0 +ENDCHAR +STARTCHAR U_97E8 +ENCODING 38888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA40 +27E0 +7A00 +23C0 +FA40 +2A40 +2D80 +3980 +2260 +2440 +ENDCHAR +STARTCHAR U_97E9 +ENCODING 38889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FFC0 +8900 +F900 +8FE0 +F920 +2120 +F960 +2100 +ENDCHAR +STARTCHAR U_97EA +ENCODING 38890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7880 +4BE0 +7880 +03E0 +FCA0 +50E0 +5C80 +7000 +9FE0 +ENDCHAR +STARTCHAR U_97EB +ENCODING 38891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +47C0 +F440 +47C0 +F000 +5FE0 +5AA0 +7AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_97EC +ENCODING 38892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF20 +4520 +F2C0 +4000 +F760 +5420 +5760 +7420 +47E0 +4420 +ENDCHAR +STARTCHAR U_97ED +ENCODING 38893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +F3C0 +1200 +1200 +7380 +1200 +F3C0 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR U_97EE +ENCODING 38894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97EF +ENCODING 38895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2900 +6D20 +2920 +6CC0 +28A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_97F0 +ENCODING 38896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1140 +3C80 +E940 +3220 +EA00 +7BC0 +0A00 +7BE0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97F1 +ENCODING 38897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +7520 +9500 +FFE0 +2900 +EF20 +2940 +EE80 +28A0 +FD60 +0220 +ENDCHAR +STARTCHAR U_97F2 +ENCODING 38898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A40 +F580 +5540 +9520 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97F3 +ENCODING 38899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_97F4 +ENCODING 38900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +4880 +33E0 +FEA0 +02A0 +7AA0 +4AE0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_97F5 +ENCODING 38901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +8BE0 +5420 +FA20 +0120 +F820 +89A0 +FE20 +8820 +F8C0 +ENDCHAR +STARTCHAR U_97F6 +ENCODING 38902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +8920 +51E0 +FA40 +0400 +FBE0 +8A20 +FA20 +8BE0 +FA20 +ENDCHAR +STARTCHAR U_97F7 +ENCODING 38903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +5520 +2520 +FD20 +07E0 +7100 +5520 +7520 +57E0 +7420 +ENDCHAR +STARTCHAR U_97F8 +ENCODING 38904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +8E40 +5180 +FB40 +07E0 +F900 +8FC0 +F900 +8FE0 +F900 +ENDCHAR +STARTCHAR U_97F9 +ENCODING 38905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDE0 +4520 +29E0 +FD20 +03E0 +7880 +4880 +7BE0 +4880 +7FE0 +ENDCHAR +STARTCHAR U_97FA +ENCODING 38906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +8A40 +5080 +FFE0 +02A0 +7FE0 +4880 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_97FB +ENCODING 38907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +8BC0 +5000 +F7C0 +0440 +F7C0 +9440 +F7C0 +9280 +FC60 +ENDCHAR +STARTCHAR U_97FC +ENCODING 38908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +5740 +2480 +FB60 +0C80 +75C0 +5480 +77E0 +5480 +7BE0 +ENDCHAR +STARTCHAR U_97FD +ENCODING 38909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +ABE0 +7540 +1080 +FFE0 +5000 +FDE0 +9520 +FDE0 +8520 +FDE0 +ENDCHAR +STARTCHAR U_97FE +ENCODING 38910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1220 +FDC0 +5540 +7FE0 +8900 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_97FF +ENCODING 38911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +AEA0 +4AC0 +EEA0 +2AC0 +FFE0 +0900 +FFE0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_9800 +ENCODING 38912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFE0 +5280 +27C0 +FC80 +07C0 +7480 +57C0 +7280 +5100 +76C0 +ENDCHAR +STARTCHAR U_9801 +ENCODING 38913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0900 +70E0 +ENDCHAR +STARTCHAR U_9802 +ENCODING 38914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +27E0 +2420 +27E0 +2420 +27E0 +A280 +4C60 +ENDCHAR +STARTCHAR U_9803 +ENCODING 38915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +47C0 +7440 +47C0 +4440 +47C0 +5440 +67C0 +C280 +0C60 +ENDCHAR +STARTCHAR U_9804 +ENCODING 38916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +F3E0 +5220 +53E0 +5220 +53E0 +5620 +5BE0 +5140 +8620 +ENDCHAR +STARTCHAR U_9805 +ENCODING 38917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +27E0 +2420 +3FE0 +C420 +07E0 +0240 +0C20 +ENDCHAR +STARTCHAR U_9806 +ENCODING 38918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5480 +55E0 +5520 +55E0 +5520 +55E0 +5520 +45E0 +8540 +8620 +ENDCHAR +STARTCHAR U_9807 +ENCODING 38919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +23E0 +2220 +FBE0 +2220 +23E0 +2220 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_9808 +ENCODING 38920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2100 +47C0 +9440 +27C0 +4440 +97C0 +1440 +27C0 +4280 +9C60 +ENDCHAR +STARTCHAR U_9809 +ENCODING 38921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +53C0 +5E40 +53C0 +5240 +53C0 +5E40 +E3C0 +0240 +0420 +ENDCHAR +STARTCHAR U_980A +ENCODING 38922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +77E0 +2420 +27E0 +3C20 +E7E0 +4240 +0420 +ENDCHAR +STARTCHAR U_980B +ENCODING 38923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8100 +FBC0 +AA40 +ABC0 +BA40 +ABC0 +A240 +B3C0 +A240 +0420 +ENDCHAR +STARTCHAR U_980C +ENCODING 38924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5100 +4BE0 +8A20 +23E0 +2220 +43E0 +4A20 +FBE0 +0240 +0C20 +ENDCHAR +STARTCHAR U_980D +ENCODING 38925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +FFE0 +1220 +FFE0 +4A20 +2BE0 +1220 +33E0 +4940 +8620 +ENDCHAR +STARTCHAR U_980E +ENCODING 38926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +7080 +43E0 +7A20 +53E0 +5220 +53E0 +5220 +53E0 +5140 +9620 +ENDCHAR +STARTCHAR U_980F +ENCODING 38927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2100 +FFE0 +0220 +73E0 +5220 +53E0 +5620 +5BE0 +5240 +8C20 +ENDCHAR +STARTCHAR U_9810 +ENCODING 38928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +67C0 +2440 +FFC0 +2440 +27C0 +2440 +27C0 +2280 +EC60 +ENDCHAR +STARTCHAR U_9811 +ENCODING 38929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +0080 +03E0 +FA20 +53E0 +5220 +53E0 +5620 +5BE0 +9240 +8C20 +ENDCHAR +STARTCHAR U_9812 +ENCODING 38930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5080 +8BE0 +8A20 +03E0 +F220 +53E0 +5220 +53E0 +9240 +2C20 +ENDCHAR +STARTCHAR U_9813 +ENCODING 38931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +23E0 +AA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3240 +2420 +ENDCHAR +STARTCHAR U_9814 +ENCODING 38932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +AA40 +ABC0 +FA40 +ABC0 +AA40 +FBC0 +8A40 +0420 +ENDCHAR +STARTCHAR U_9815 +ENCODING 38933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4200 +77C0 +4440 +47C0 +F440 +97C0 +9440 +F7C0 +9440 +0820 +ENDCHAR +STARTCHAR U_9816 +ENCODING 38934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +73E0 +2220 +FBE0 +2220 +23E0 +FA20 +23E0 +4240 +8420 +ENDCHAR +STARTCHAR U_9817 +ENCODING 38935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +FBE0 +AA20 +A3E0 +FA20 +ABE0 +AA20 +93E0 +AA40 +C420 +ENDCHAR +STARTCHAR U_9818 +ENCODING 38936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +3080 +4BE0 +A620 +13E0 +FA20 +0BE0 +5220 +23E0 +1240 +1420 +ENDCHAR +STARTCHAR U_9819 +ENCODING 38937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +13C0 +1240 +5BC0 +5240 +53C0 +5E40 +E3C0 +0240 +0420 +ENDCHAR +STARTCHAR U_981A +ENCODING 38938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4900 +33C0 +4A40 +87C0 +2240 +7BC0 +2240 +3BC0 +C240 +0420 +ENDCHAR +STARTCHAR U_981B +ENCODING 38939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +FBE0 +2220 +FBE0 +2220 +FBE0 +2220 +73E0 +AA40 +2420 +ENDCHAR +STARTCHAR U_981C +ENCODING 38940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BE0 +7220 +03E0 +7A20 +4BE0 +4A20 +7BE0 +4A40 +0420 +ENDCHAR +STARTCHAR U_981D +ENCODING 38941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1080 +FFE0 +4A20 +87E0 +2A20 +2BE0 +1220 +33E0 +4A40 +8420 +ENDCHAR +STARTCHAR U_981E +ENCODING 38942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +FC80 +87E0 +2220 +FFE0 +2A20 +4BE0 +4A20 +33E0 +4A40 +8420 +ENDCHAR +STARTCHAR U_981F +ENCODING 38943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3900 +4BC0 +B240 +33C0 +4A40 +FFC0 +4A40 +4BC0 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9820 +ENCODING 38944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +93E0 +FE20 +83E0 +BA20 +ABE0 +BA20 +A3E0 +BA40 +A420 +ENDCHAR +STARTCHAR U_9821 +ENCODING 38945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +23E0 +2220 +FBE0 +0220 +7BE0 +4A20 +7BE0 +4A40 +0420 +ENDCHAR +STARTCHAR U_9822 +ENCODING 38946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E100 +23C0 +FA40 +23C0 +2240 +FBC0 +8A40 +8BC0 +F940 +8A20 +ENDCHAR +STARTCHAR U_9823 +ENCODING 38947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +A7C0 +F440 +97C0 +F440 +A7C0 +A440 +A7C0 +FC40 +0820 +ENDCHAR +STARTCHAR U_9824 +ENCODING 38948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9080 +93E0 +BA20 +ABE0 +AA20 +BBE0 +9220 +93E0 +FA40 +0420 +ENDCHAR +STARTCHAR U_9825 +ENCODING 38949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87E0 +BD00 +ABC0 +AA40 +BFC0 +A640 +BFC0 +AA40 +ABC0 +BA40 +8420 +ENDCHAR +STARTCHAR U_9826 +ENCODING 38950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1080 +FFE0 +2620 +7BE0 +1220 +27E0 +4A20 +1BE0 +2940 +C620 +ENDCHAR +STARTCHAR U_9827 +ENCODING 38951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +F100 +97C0 +9440 +F7C0 +8440 +F7C0 +9440 +97C0 +F480 +8840 +ENDCHAR +STARTCHAR U_9828 +ENCODING 38952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +B5E0 +6D20 +25E0 +2520 +6DE0 +B520 +25E0 +2540 +4E20 +ENDCHAR +STARTCHAR U_9829 +ENCODING 38953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5080 +FFE0 +2A20 +2BE0 +FE20 +2BE0 +2A20 +4BE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_982A +ENCODING 38954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +6BC0 +3240 +FBC0 +2240 +73C0 +6A40 +A3C0 +2240 +2420 +ENDCHAR +STARTCHAR U_982B +ENCODING 38955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +ABE0 +6E20 +2BE0 +6E20 +ABE0 +2A20 +2FE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_982C +ENCODING 38956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +AA40 +73C0 +FE40 +23C0 +3240 +4BC0 +8240 +0420 +ENDCHAR +STARTCHAR U_982D +ENCODING 38957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0080 +7BE0 +4A20 +4BE0 +7A20 +8BE0 +5220 +3BE0 +C140 +0220 +ENDCHAR +STARTCHAR U_982E +ENCODING 38958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +D500 +5BC0 +9640 +33C0 +4A40 +4BC0 +FE40 +4BC0 +4A40 +8C20 +ENDCHAR +STARTCHAR U_982F +ENCODING 38959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3880 +EBE0 +5A20 +23E0 +EA20 +2BE0 +FE20 +2BE0 +4940 +8A20 +ENDCHAR +STARTCHAR U_9830 +ENCODING 38960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +13E0 +5620 +5BE0 +B620 +93E0 +2A20 +27E0 +4140 +8620 +ENDCHAR +STARTCHAR U_9831 +ENCODING 38961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E900 +ABC0 +5240 +13C0 +FA40 +93C0 +5240 +13C0 +5240 +2420 +ENDCHAR +STARTCHAR U_9832 +ENCODING 38962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E5E0 +3880 +29E0 +4920 +FFE0 +2920 +A9E0 +7F20 +41E0 +A140 +9E20 +ENDCHAR +STARTCHAR U_9833 +ENCODING 38963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7900 +13C0 +FE40 +2BC0 +AA40 +AFC0 +2A40 +4BC0 +AA40 +1420 +ENDCHAR +STARTCHAR U_9834 +ENCODING 38964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +43C0 +3A40 +03C0 +7A40 +03C0 +FE40 +23C0 +AA40 +A420 +ENDCHAR +STARTCHAR U_9835 +ENCODING 38965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2880 +FFE0 +2A20 +7BE0 +2220 +7BE0 +AA20 +2BE0 +3940 +2E20 +ENDCHAR +STARTCHAR U_9836 +ENCODING 38966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5100 +7BC0 +9240 +FFC0 +0240 +7BC0 +4A40 +4BC0 +7A40 +0420 +ENDCHAR +STARTCHAR U_9837 +ENCODING 38967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +ABE0 +1220 +FBE0 +1220 +7BE0 +4A20 +4BE0 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9838 +ENCODING 38968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5480 +ABE0 +AA20 +57E0 +5220 +FBE0 +2220 +3FE0 +E240 +4420 +ENDCHAR +STARTCHAR U_9839 +ENCODING 38969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +13E0 +FE20 +5BE0 +9620 +2BE0 +2A20 +2FE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_983A +ENCODING 38970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2100 +FBC0 +7240 +AFC0 +FA40 +53C0 +5A40 +4BC0 +6A40 +9420 +ENDCHAR +STARTCHAR U_983B +ENCODING 38971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FFE0 +1220 +57E0 +5A20 +93E0 +2140 +C620 +ENDCHAR +STARTCHAR U_983C +ENCODING 38972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +23C0 +FA40 +ABC0 +FA40 +63C0 +7240 +ABC0 +A240 +2420 +ENDCHAR +STARTCHAR U_983D +ENCODING 38973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FFC0 +3A40 +57C0 +9240 +3BC0 +2A40 +2FC0 +4A40 +8420 +ENDCHAR +STARTCHAR U_983E +ENCODING 38974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +C200 +37C0 +C540 +37C0 +C280 +1640 +5A40 +5380 +5A20 +E1E0 +ENDCHAR +STARTCHAR U_983F +ENCODING 38975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E100 +1BC0 +E240 +1BC0 +EA40 +2FC0 +BA40 +AFC0 +BA40 +E420 +ENDCHAR +STARTCHAR U_9840 +ENCODING 38976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5100 +7BC0 +D240 +7BC0 +5240 +7BC0 +5240 +53C0 +7A40 +0420 +ENDCHAR +STARTCHAR U_9841 +ENCODING 38977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +87E0 +0220 +FFE0 +1220 +5FE0 +5220 +53E0 +B140 +8E20 +ENDCHAR +STARTCHAR U_9842 +ENCODING 38978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +23C0 +6A40 +6BC0 +B640 +23C0 +7240 +AFC0 +2240 +2420 +ENDCHAR +STARTCHAR U_9843 +ENCODING 38979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5880 +53E0 +AA20 +47E0 +9220 +57E0 +5A20 +93E0 +2940 +C620 +ENDCHAR +STARTCHAR U_9844 +ENCODING 38980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +0880 +11E0 +9520 +DDE0 +B520 +DDE0 +9520 +A5E0 +FD40 +0220 +ENDCHAR +STARTCHAR U_9845 +ENCODING 38981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +85E0 +FD20 +81E0 +BD20 +A5E0 +BD20 +A5E0 +BD40 +A620 +ENDCHAR +STARTCHAR U_9846 +ENCODING 38982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FBE0 +2220 +FBE0 +2220 +73E0 +A940 +A620 +ENDCHAR +STARTCHAR U_9847 +ENCODING 38983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +53C0 +5240 +ABC0 +2240 +FFC0 +2240 +23C0 +2240 +2420 +ENDCHAR +STARTCHAR U_9848 +ENCODING 38984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83E0 +F080 +83E0 +FA20 +4BE0 +F220 +4BE0 +FA20 +27E0 +7140 +AA20 +ENDCHAR +STARTCHAR U_9849 +ENCODING 38985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5080 +8BE0 +FA20 +23E0 +FA20 +ABE0 +7220 +3BE0 +E140 +4620 +ENDCHAR +STARTCHAR U_984A +ENCODING 38986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F080 +93E0 +FA20 +8BE0 +FA20 +23E0 +FE20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_984B +ENCODING 38987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A900 +FBC0 +AA40 +FBC0 +4240 +2BC0 +D640 +CBC0 +4A40 +7420 +ENDCHAR +STARTCHAR U_984C +ENCODING 38988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7BE0 +0220 +FFE0 +5220 +5FE0 +B140 +8FE0 +ENDCHAR +STARTCHAR U_984D +ENCODING 38989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +A7E0 +3A20 +4BE0 +B220 +4BE0 +FE20 +4BE0 +7940 +4E20 +ENDCHAR +STARTCHAR U_984E +ENCODING 38990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +0220 +7BE0 +0220 +FBE0 +2220 +7BE0 +0940 +3620 +ENDCHAR +STARTCHAR U_984F +ENCODING 38991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +2220 +FBE0 +9220 +EBE0 +9220 +EBE0 +9140 +E620 +ENDCHAR +STARTCHAR U_9850 +ENCODING 38992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +FFE0 +AA20 +FBE0 +AA20 +FBE0 +2220 +FFE0 +2140 +2620 +ENDCHAR +STARTCHAR U_9851 +ENCODING 38993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +1480 +FFE0 +9220 +F3E0 +9620 +EBE0 +AA20 +EFE0 +9140 +A620 +ENDCHAR +STARTCHAR U_9852 +ENCODING 38994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FBE0 +2220 +FBE0 +AA20 +BBE0 +C940 +8E20 +ENDCHAR +STARTCHAR U_9853 +ENCODING 38995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FBE0 +2220 +FBE0 +AA20 +ABE0 +A940 +8E20 +ENDCHAR +STARTCHAR U_9854 +ENCODING 38996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7900 +4BC0 +3240 +7FC0 +5240 +6BC0 +5240 +6BC0 +9240 +E420 +ENDCHAR +STARTCHAR U_9855 +ENCODING 38997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8900 +FBC0 +8A40 +FBC0 +5240 +DBC0 +5240 +7FC0 +C240 +0420 +ENDCHAR +STARTCHAR U_9856 +ENCODING 38998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F900 +DBC0 +AA40 +DBC0 +FA40 +03C0 +2A40 +47C0 +CA40 +3C20 +ENDCHAR +STARTCHAR U_9857 +ENCODING 38999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FBE0 +4A20 +7BE0 +0A20 +53E0 +3940 +E620 +ENDCHAR +STARTCHAR U_9858 +ENCODING 39000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +9080 +BDE0 +A520 +BDE0 +A520 +BDE0 +8920 +ADE0 +CB40 +9A20 +ENDCHAR +STARTCHAR U_9859 +ENCODING 39001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +23E0 +DA20 +4BE0 +DA20 +A7E0 +FA20 +23E0 +7140 +AE20 +ENDCHAR +STARTCHAR U_985A +ENCODING 39002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4100 +7BC0 +0240 +BBC0 +AA40 +BBC0 +AA40 +FFC0 +5240 +8C20 +ENDCHAR +STARTCHAR U_985B +ENCODING 39003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +FA20 +8BE0 +EA20 +BBE0 +8A20 +FFE0 +5140 +8E20 +ENDCHAR +STARTCHAR U_985C +ENCODING 39004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FC80 +53E0 +FA20 +53E0 +FE20 +ABE0 +FA20 +ABE0 +FD40 +9A20 +ENDCHAR +STARTCHAR U_985D +ENCODING 39005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6BE0 +FE20 +87E0 +7A20 +4BE0 +7A20 +4BE0 +7940 +5E20 +ENDCHAR +STARTCHAR U_985E +ENCODING 39006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +7080 +23E0 +FA20 +73E0 +AA20 +23E0 +FA20 +23E0 +5140 +8E20 +ENDCHAR +STARTCHAR U_985F +ENCODING 39007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B480 +6DE0 +B520 +35E0 +4920 +A5E0 +5120 +29E0 +1140 +E220 +ENDCHAR +STARTCHAR U_9860 +ENCODING 39008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2880 +FFE0 +AB20 +FFE0 +0120 +79E0 +0120 +FDE0 +5540 +B220 +ENDCHAR +STARTCHAR U_9861 +ENCODING 39009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +53C0 +FE40 +23C0 +5A40 +B3C0 +5A40 +B7C0 +5240 +B420 +ENDCHAR +STARTCHAR U_9862 +ENCODING 39010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FC80 +49E0 +7920 +21E0 +FD20 +A5E0 +F520 +ADE0 +F540 +AE20 +ENDCHAR +STARTCHAR U_9863 +ENCODING 39011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +FE80 +A5E0 +BD20 +A5E0 +FD20 +A5E0 +B720 +EDE0 +A540 +BA20 +ENDCHAR +STARTCHAR U_9864 +ENCODING 39012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +13E0 +FE20 +4BE0 +FE20 +4BE0 +FE20 +2BE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_9865 +ENCODING 39013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +7DE0 +4520 +7DE0 +1120 +FFE0 +4520 +7DE0 +5540 +B220 +ENDCHAR +STARTCHAR U_9866 +ENCODING 39014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5100 +7FC0 +D240 +7FC0 +5240 +7FC0 +5240 +7FC0 +AA40 +D420 +ENDCHAR +STARTCHAR U_9867 +ENCODING 39015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +87E0 +FE20 +ABE0 +AA20 +FFE0 +AA20 +BFE0 +A940 +BE20 +ENDCHAR +STARTCHAR U_9868 +ENCODING 39016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2100 +7BC0 +6B40 +5AC0 +7BC0 +4A40 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_9869 +ENCODING 39017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4480 +B9E0 +0120 +EFE0 +AB20 +EFE0 +4520 +45E0 +AD40 +9220 +ENDCHAR +STARTCHAR U_986A +ENCODING 39018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5080 +FFE0 +1220 +FFE0 +8A20 +FBE0 +AE20 +FBE0 +AD40 +D620 +ENDCHAR +STARTCHAR U_986B +ENCODING 39019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +B5E0 +8520 +FDE0 +4920 +79E0 +4920 +79E0 +0140 +FE20 +ENDCHAR +STARTCHAR U_986C +ENCODING 39020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FFC0 +D640 +3BC0 +5640 +FFC0 +2240 +FFC0 +AA40 +AA20 +ENDCHAR +STARTCHAR U_986D +ENCODING 39021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +4BC0 +FE40 +ABC0 +FE40 +A7C0 +3A40 +6BC0 +1240 +6420 +ENDCHAR +STARTCHAR U_986E +ENCODING 39022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD00 +87C0 +7A40 +ABC0 +7A40 +EBC0 +5A40 +6BC0 +7A40 +8C20 +ENDCHAR +STARTCHAR U_986F +ENCODING 39023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +7DE0 +4520 +7DE0 +4B20 +35E0 +5520 +6FE0 +5540 +AA20 +ENDCHAR +STARTCHAR U_9870 +ENCODING 39024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +FE40 +57C0 +AA40 +7FE0 +2440 +3FC0 +0A00 +FFE0 +0200 +ENDCHAR +STARTCHAR U_9871 +ENCODING 39025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2080 +FBE0 +AA20 +FFE0 +AA20 +FBE0 +AA20 +FFE0 +9540 +FE20 +ENDCHAR +STARTCHAR U_9872 +ENCODING 39026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +9080 +29E0 +DF20 +51E0 +A920 +45E0 +FF20 +BBE0 +82C0 +FF20 +ENDCHAR +STARTCHAR U_9873 +ENCODING 39027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4880 +79E0 +4920 +FDE0 +0920 +FFE0 +A520 +FDE0 +A540 +FE20 +ENDCHAR +STARTCHAR U_9874 +ENCODING 39028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +EFE0 +AB20 +EFE0 +4920 +FFE0 +4920 +7DE0 +4940 +7E20 +ENDCHAR +STARTCHAR U_9875 +ENCODING 39029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +2480 +2480 +2480 +2680 +0900 +10C0 +6040 +ENDCHAR +STARTCHAR U_9876 +ENCODING 39030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +2520 +2520 +2520 +2520 +2180 +6240 +0C20 +ENDCHAR +STARTCHAR U_9877 +ENCODING 39031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +9FC0 +8200 +8F80 +E880 +8A80 +8A80 +8A80 +AA80 +C200 +8580 +1840 +ENDCHAR +STARTCHAR U_9878 +ENCODING 39032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +23E0 +2220 +FEA0 +22A0 +22A0 +22A0 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_9879 +ENCODING 39033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +2520 +2520 +2520 +3D20 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_987A +ENCODING 39034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +A880 +ABE0 +AA20 +AAA0 +AAA0 +AAA0 +AAA0 +A880 +8940 +8A20 +ENDCHAR +STARTCHAR U_987B +ENCODING 39035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4100 +87C0 +1440 +2540 +4540 +8540 +1540 +2180 +4240 +8C20 +ENDCHAR +STARTCHAR U_987C +ENCODING 39036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +74A0 +24A0 +24A0 +3CA0 +E180 +4240 +0C20 +ENDCHAR +STARTCHAR U_987D +ENCODING 39037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +0080 +0100 +FFE0 +5220 +52A0 +52A0 +56A0 +5AA0 +5140 +8620 +ENDCHAR +STARTCHAR U_987E +ENCODING 39038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8100 +BBE0 +AA20 +AAA0 +AAA0 +BAA0 +A2A0 +A880 +B360 +AC20 +ENDCHAR +STARTCHAR U_987F +ENCODING 39039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FBE0 +2220 +AAA0 +AAA0 +FAA0 +22A0 +2880 +3140 +0620 +ENDCHAR +STARTCHAR U_9880 +ENCODING 39040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +7080 +43E0 +7E20 +52A0 +52A0 +52A0 +52A0 +52A0 +5140 +8620 +ENDCHAR +STARTCHAR U_9881 +ENCODING 39041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5080 +4BE0 +8620 +7AA0 +2AA0 +2AA0 +2AA0 +2AA0 +4940 +9620 +ENDCHAR +STARTCHAR U_9882 +ENCODING 39042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5080 +4900 +8BE0 +A220 +22A0 +42A0 +52A0 +FAA0 +0940 +0620 +ENDCHAR +STARTCHAR U_9883 +ENCODING 39043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +03E0 +7220 +52A0 +52A0 +52A0 +52A0 +56A0 +9940 +8620 +ENDCHAR +STARTCHAR U_9884 +ENCODING 39044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +63E0 +2220 +FAA0 +2AA0 +22A0 +22A0 +22A0 +2140 +6620 +ENDCHAR +STARTCHAR U_9885 +ENCODING 39045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3880 +23E0 +7E20 +46A0 +7EA0 +42A0 +42A0 +42A0 +8140 +8620 +ENDCHAR +STARTCHAR U_9886 +ENCODING 39046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +2900 +67E0 +9220 +02A0 +7AA0 +0AA0 +1080 +2140 +1220 +ENDCHAR +STARTCHAR U_9887 +ENCODING 39047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +57E0 +5220 +7AA0 +4AA0 +6AA0 +52A0 +5880 +6540 +8220 +ENDCHAR +STARTCHAR U_9888 +ENCODING 39048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +3100 +4BE0 +8620 +FAA0 +22A0 +22A0 +3A80 +E140 +4620 +ENDCHAR +STARTCHAR U_9889 +ENCODING 39049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FBE0 +2220 +7AA0 +02A0 +7AA0 +4AA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_988A +ENCODING 39050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +13E0 +9620 +5AA0 +FEA0 +12A0 +12A0 +2AA0 +4540 +8220 +ENDCHAR +STARTCHAR U_988B +ENCODING 39051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +2BE0 +4A20 +FEA0 +2AA0 +AAA0 +7EA0 +22A0 +5140 +8E20 +ENDCHAR +STARTCHAR U_988C +ENCODING 39052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +2880 +47E0 +8220 +7AA0 +02A0 +7AA0 +4AA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_988D +ENCODING 39053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +5080 +67E0 +4220 +7EA0 +12A0 +F6A0 +3AA0 +5EA0 +9140 +3220 +ENDCHAR +STARTCHAR U_988E +ENCODING 39054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +E100 +97C0 +7440 +0540 +2540 +AD40 +B540 +2100 +5280 +8C40 +ENDCHAR +STARTCHAR U_988F +ENCODING 39055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +FBE0 +4220 +92A0 +E2A0 +2AA0 +4AA0 +9280 +2940 +C620 +ENDCHAR +STARTCHAR U_9890 +ENCODING 39056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9080 +93E0 +BA20 +AAA0 +AAA0 +BAA0 +92A0 +92A0 +FD40 +0220 +ENDCHAR +STARTCHAR U_9891 +ENCODING 39057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FEA0 +12A0 +56A0 +5AA0 +92A0 +2140 +C620 +ENDCHAR +STARTCHAR U_9892 +ENCODING 39058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +D7E0 +5880 +97E0 +3220 +4AA0 +4AA0 +FEA0 +4AA0 +4940 +8A20 +ENDCHAR +STARTCHAR U_9893 +ENCODING 39059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2080 +FBE0 +3220 +6AA0 +A2A0 +72A0 +52A0 +56A0 +5940 +8620 +ENDCHAR +STARTCHAR U_9894 +ENCODING 39060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +4900 +A7E0 +1220 +7AA0 +0AA0 +12A0 +7AA0 +4AA0 +7940 +4A20 +ENDCHAR +STARTCHAR U_9895 +ENCODING 39061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6100 +47C0 +7440 +0540 +7540 +0540 +FD40 +7100 +AAC0 +2440 +ENDCHAR +STARTCHAR U_9896 +ENCODING 39062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +E080 +8BE0 +FA20 +0AA0 +F2A0 +22A0 +FEA0 +32A0 +6940 +A620 +ENDCHAR +STARTCHAR U_9897 +ENCODING 39063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FAA0 +22A0 +FAA0 +22A0 +72A0 +A940 +2620 +ENDCHAR +STARTCHAR U_9898 +ENCODING 39064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7AA0 +02A0 +FEA0 +5280 +5D40 +B220 +8FE0 +ENDCHAR +STARTCHAR U_9899 +ENCODING 39065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FA20 +22A0 +FEA0 +A6A0 +FEA0 +8540 +8E20 +ENDCHAR +STARTCHAR U_989A +ENCODING 39066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +0220 +7AA0 +02A0 +FAA0 +22A0 +7AA0 +0940 +3220 +ENDCHAR +STARTCHAR U_989B +ENCODING 39067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FAA0 +22A0 +FAA0 +AAA0 +AAA0 +A940 +8A20 +ENDCHAR +STARTCHAR U_989C +ENCODING 39068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +FA20 +8AA0 +92A0 +EAA0 +92A0 +EAA0 +9140 +E620 +ENDCHAR +STARTCHAR U_989D +ENCODING 39069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +87E0 +7A20 +CAA0 +32A0 +4AA0 +FEA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_989E +ENCODING 39070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4880 +7BE0 +4A20 +FEA0 +0AA0 +FEA0 +B6A0 +6AA0 +9540 +2620 +ENDCHAR +STARTCHAR U_989F +ENCODING 39071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC80 +2BE0 +FE20 +52A0 +FAA0 +BAA0 +AAA0 +D880 +A940 +8A20 +ENDCHAR +STARTCHAR U_98A0 +ENCODING 39072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +23E0 +FA20 +8AA0 +EAA0 +BAA0 +8AA0 +FE80 +4940 +8620 +ENDCHAR +STARTCHAR U_98A1 +ENCODING 39073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +23E0 +FE20 +4AA0 +B6A0 +FAA0 +22A0 +72A0 +A940 +2620 +ENDCHAR +STARTCHAR U_98A2 +ENCODING 39074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7AA0 +22A0 +FEA0 +4AA0 +7AA0 +5540 +B620 +ENDCHAR +STARTCHAR U_98A3 +ENCODING 39075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +3880 +FFE0 +3A20 +56A0 +2AA0 +16A0 +7EA0 +52A0 +9540 +3220 +ENDCHAR +STARTCHAR U_98A4 +ENCODING 39076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FD00 +BBE0 +8A20 +FAA0 +4AA0 +7AA0 +4AA0 +7A80 +0140 +FE20 +ENDCHAR +STARTCHAR U_98A5 +ENCODING 39077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +AA20 +FAA0 +AAA0 +FEA0 +22A0 +FA80 +A940 +AE20 +ENDCHAR +STARTCHAR U_98A6 +ENCODING 39078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5080 +FFE0 +6AA0 +A940 +7FE0 +2440 +3FC0 +2A40 +FFE0 +0200 +ENDCHAR +STARTCHAR U_98A7 +ENCODING 39079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2900 +EFE0 +AA20 +EEA0 +52A0 +FEA0 +52A0 +7EA0 +5140 +7E20 +ENDCHAR +STARTCHAR U_98A8 +ENCODING 39080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2140 +2E40 +2440 +3F40 +3540 +3F40 +2540 +2760 +5CA0 +8820 +ENDCHAR +STARTCHAR U_98A9 +ENCODING 39081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4C80 +7520 +5440 +7C80 +5520 +7C40 +5480 +5520 +5620 +B9E0 +ENDCHAR +STARTCHAR U_98AA +ENCODING 39082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0500 +0480 +7FC0 +4040 +7FC0 +5540 +5F40 +4560 +7F60 +80A0 +ENDCHAR +STARTCHAR U_98AB +ENCODING 39083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7FC0 +5480 +7FE0 +5480 +7D40 +5620 +5400 +7A20 +81E0 +ENDCHAR +STARTCHAR U_98AC +ENCODING 39084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4C40 +7540 +57E0 +7C40 +54C0 +7D40 +5640 +54C0 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98AD +ENCODING 39085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4C80 +74E0 +5480 +7DE0 +5520 +7D20 +55E0 +5520 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98AE +ENCODING 39086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +9BE0 +EC20 +ABA0 +FAA0 +ABC0 +FA20 +ABE0 +A800 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98AF +ENCODING 39087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +24C0 +FF40 +1540 +97C0 +5540 +57C0 +2940 +F940 +57A0 +2020 +ENDCHAR +STARTCHAR U_98B0 +ENCODING 39088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +4520 +7FE0 +5500 +7DC0 +5540 +7E80 +5540 +5620 +7E20 +81E0 +ENDCHAR +STARTCHAR U_98B1 +ENCODING 39089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9880 +E920 +ABE0 +F800 +A9E0 +F920 +A920 +A9E0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B2 +ENCODING 39090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFA0 +9A20 +EBA0 +AAA0 +FDA0 +A8A0 +F920 +AA60 +A800 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B3 +ENCODING 39091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4DC0 +7480 +55E0 +7C80 +55E0 +7D20 +55E0 +5400 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98B4 +ENCODING 39092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +45E0 +7E00 +57E0 +7CA0 +54C0 +7E80 +5780 +7C60 +4200 +81E0 +ENDCHAR +STARTCHAR U_98B5 +ENCODING 39093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +89C0 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +AA20 +AA60 +F400 +8BE0 +ENDCHAR +STARTCHAR U_98B6 +ENCODING 39094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9A40 +EB40 +AAC0 +FA40 +ABC0 +FA40 +AFE0 +A940 +A620 +FBE0 +ENDCHAR +STARTCHAR U_98B7 +ENCODING 39095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EA0 +45C0 +7D40 +5620 +7EA0 +55C0 +7C80 +5540 +5620 +7A20 +81E0 +ENDCHAR +STARTCHAR U_98B8 +ENCODING 39096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9AA0 +EBE0 +AAA0 +FBE0 +A940 +FB20 +AD40 +A9C0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B9 +ENCODING 39097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +F940 +AFE0 +FA40 +ABC0 +FFE0 +AA80 +ABE0 +F880 +87E0 +ENDCHAR +STARTCHAR U_98BA +ENCODING 39098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9A40 +EBC0 +AA40 +FFE0 +A900 +FFE0 +AAA0 +AD40 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98BB +ENCODING 39099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +C260 +ABA0 +52A0 +43E0 +7AA0 +A3E0 +FAA0 +22A0 +ABE0 +FC20 +ENDCHAR +STARTCHAR U_98BC +ENCODING 39100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +9AA0 +EBE0 +AAA0 +FBE0 +A880 +FBE0 +A940 +A880 +F660 +83E0 +ENDCHAR +STARTCHAR U_98BD +ENCODING 39101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +FA60 +03A0 +FAA0 +03E0 +FAA0 +8BE0 +FAA0 +8CA0 +57E0 +F420 +ENDCHAR +STARTCHAR U_98BE +ENCODING 39102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9AA0 +E9C0 +AAA0 +FBE0 +AAA0 +FBE0 +A880 +ABE0 +B420 +EBE0 +ENDCHAR +STARTCHAR U_98BF +ENCODING 39103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A460 +F7A0 +A4A0 +F7E0 +A6A0 +FFE0 +5CA0 +ACA0 +AFE0 +1020 +ENDCHAR +STARTCHAR U_98C0 +ENCODING 39104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +9AE0 +EBA0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98C1 +ENCODING 39105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA60 +67A0 +AAA0 +13E0 +7AA0 +4BE0 +7AA0 +4AA0 +7BE0 +4C20 +ENDCHAR +STARTCHAR U_98C2 +ENCODING 39106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9DA0 +EB60 +ADA0 +F940 +AAA0 +FD20 +AA40 +A880 +A520 +FBE0 +ENDCHAR +STARTCHAR U_98C3 +ENCODING 39107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8940 +FBE0 +AAA0 +FBE0 +A800 +FBE0 +A8C0 +AAA0 +F4A0 +83E0 +ENDCHAR +STARTCHAR U_98C4 +ENCODING 39108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A60 +FFA0 +AAA0 +FFE0 +02A0 +7BE0 +02A0 +FEA0 +57E0 +B420 +ENDCHAR +STARTCHAR U_98C5 +ENCODING 39109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8940 +FB60 +AA20 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +FC00 +83E0 +ENDCHAR +STARTCHAR U_98C6 +ENCODING 39110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2660 +FFA0 +32A0 +CBE0 +6EA0 +4BE0 +FEA0 +4AA0 +B7E0 +A420 +ENDCHAR +STARTCHAR U_98C7 +ENCODING 39111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8FE0 +F980 +AE60 +FA40 +AFE0 +FA40 +ADA0 +A800 +FC20 +83E0 +ENDCHAR +STARTCHAR U_98C8 +ENCODING 39112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EA0 +45C0 +7C80 +5540 +7E20 +5540 +7FE0 +5540 +56A0 +BE00 +81E0 +ENDCHAR +STARTCHAR U_98C9 +ENCODING 39113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9BE0 +ED40 +ABE0 +FE40 +ABC0 +F880 +AAC0 +ADA0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98CA +ENCODING 39114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +B440 +27C0 +5540 +8FC0 +5540 +FFC0 +5540 +AFC0 +4860 +1020 +ENDCHAR +STARTCHAR U_98CB +ENCODING 39115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9A40 +EFE0 +AA40 +FFE0 +AB40 +FDA0 +A920 +ABC0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98CC +ENCODING 39116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5260 +EFA0 +AAA0 +EFE0 +52A0 +FFE0 +52A0 +7EA0 +53E0 +7C20 +ENDCHAR +STARTCHAR U_98CD +ENCODING 39117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +5F40 +84A0 +7FC0 +4440 +7FC0 +5540 +7FC0 +D520 +7BE0 +ENDCHAR +STARTCHAR U_98CE +ENCODING 39118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +4280 +5280 +4C80 +4480 +4C80 +5280 +62A0 +8060 +8020 +ENDCHAR +STARTCHAR U_98CF +ENCODING 39119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4880 +4900 +4BC0 +6940 +5AC0 +6D40 +4A40 +48C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_98D0 +ENCODING 39120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7C80 +44E0 +4480 +6C80 +55C0 +5540 +6D40 +45C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_98D1 +ENCODING 39121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +DC20 +ABA0 +AAA0 +ABC0 +DA20 +8BE0 +8800 +8420 +83E0 +ENDCHAR +STARTCHAR U_98D2 +ENCODING 39122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +16C0 +9540 +5540 +66C0 +3C40 +C440 +0820 +1020 +ENDCHAR +STARTCHAR U_98D3 +ENCODING 39123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +DB40 +AAC0 +AA40 +ABC0 +DA40 +8FE0 +8940 +8620 +83E0 +ENDCHAR +STARTCHAR U_98D4 +ENCODING 39124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +8BE0 +DAA0 +ABE0 +A940 +DAA0 +8E40 +89C0 +8420 +83E0 +ENDCHAR +STARTCHAR U_98D5 +ENCODING 39125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F960 +8AA0 +DBE0 +AAA0 +ABE0 +A880 +DBE0 +8940 +8880 +8560 +83E0 +ENDCHAR +STARTCHAR U_98D6 +ENCODING 39126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7C0 +A440 +5C40 +FEC0 +2540 +FD40 +26C0 +AC40 +AC60 +F820 +ENDCHAR +STARTCHAR U_98D7 +ENCODING 39127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8AE0 +FBA0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +F420 +8BE0 +ENDCHAR +STARTCHAR U_98D8 +ENCODING 39128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A20 +FE20 +AB60 +FEA0 +02A0 +7BA0 +0260 +FE20 +5420 +B420 +ENDCHAR +STARTCHAR U_98D9 +ENCODING 39129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +FC40 +2440 +56C0 +8D40 +5540 +FD40 +56C0 +5440 +6C40 +A860 +ENDCHAR +STARTCHAR U_98DA +ENCODING 39130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +8AC0 +9940 +EE20 +AA40 +AFE0 +DA40 +8A40 +8DA0 +8420 +83E0 +ENDCHAR +STARTCHAR U_98DB +ENCODING 39131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +0140 +1580 +6540 +24A0 +FF60 +2540 +2580 +2540 +44A0 +8460 +ENDCHAR +STARTCHAR U_98DC +ENCODING 39132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +AA60 +7540 +FD60 +7540 +AFC0 +FD60 +AD40 +FD60 +AD40 +F920 +ENDCHAR +STARTCHAR U_98DD +ENCODING 39133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F40 +1580 +FF60 +2540 +44C0 +FFE0 +AB40 +FFE0 +AB40 +AB40 +2520 +ENDCHAR +STARTCHAR U_98DE +ENCODING 39134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +0440 +0480 +0500 +0700 +0480 +0440 +0200 +0220 +0120 +00E0 +ENDCHAR +STARTCHAR U_98DF +ENCODING 39135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +3FE0 +D080 +1F80 +1080 +1F80 +1240 +1580 +1860 +ENDCHAR +STARTCHAR U_98E0 +ENCODING 39136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +30 +48 +A0 +78 +48 +78 +48 +78 +50 +78 +ENDCHAR +STARTCHAR U_98E1 +ENCODING 39137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8280 +4540 +2FE0 +2440 +17C0 +2440 +C7C0 +4520 +44C0 +0760 +ENDCHAR +STARTCHAR U_98E2 +ENCODING 39138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5280 +AA80 +FA80 +8A80 +FA80 +8A80 +FA80 +92A0 +ACA0 +C860 +ENDCHAR +STARTCHAR U_98E3 +ENCODING 39139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +A880 +F880 +8880 +F880 +8880 +F880 +9480 +AA80 +C900 +ENDCHAR +STARTCHAR U_98E4 +ENCODING 39140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5500 +F900 +4900 +7900 +4A80 +7A80 +5240 +6C60 +4440 +ENDCHAR +STARTCHAR U_98E5 +ENCODING 39141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5780 +A900 +F900 +8960 +FF80 +8900 +F900 +9120 +A920 +C8E0 +ENDCHAR +STARTCHAR U_98E6 +ENCODING 39142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +5500 +F900 +4900 +7FE0 +4900 +7900 +5100 +6900 +4100 +ENDCHAR +STARTCHAR U_98E7 +ENCODING 39143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +7920 +57C0 +5440 +B7C0 +1440 +27C0 +24A0 +4540 +8620 +ENDCHAR +STARTCHAR U_98E8 +ENCODING 39144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +5920 +E7C0 +2440 +57C0 +F440 +17C0 +24A0 +4640 +8420 +ENDCHAR +STARTCHAR U_98E9 +ENCODING 39145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FAA0 +8AA0 +FAA0 +8BE0 +F880 +90A0 +A8A0 +C860 +ENDCHAR +STARTCHAR U_98EA +ENCODING 39146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +F880 +8880 +FFE0 +8880 +F880 +9080 +A880 +CBE0 +ENDCHAR +STARTCHAR U_98EB +ENCODING 39147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +F880 +8BE0 +F880 +8880 +F880 +9140 +AA20 +CC20 +ENDCHAR +STARTCHAR U_98EC +ENCODING 39148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +1100 +3F80 +D160 +1F00 +1480 +1300 +18C0 +ENDCHAR +STARTCHAR U_98ED +ENCODING 39149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +AA00 +FD00 +8900 +FBE0 +8920 +F920 +9220 +ACA0 +C840 +ENDCHAR +STARTCHAR U_98EE +ENCODING 39150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +53E0 +FA40 +4D00 +7900 +4900 +7A80 +4280 +7A40 +4420 +ENDCHAR +STARTCHAR U_98EF +ENCODING 39151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A00 +FFE0 +4A20 +7A20 +4B40 +7AC0 +5280 +6D40 +4620 +ENDCHAR +STARTCHAR U_98F0 +ENCODING 39152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +F900 +4900 +7980 +4960 +7920 +5100 +5900 +6900 +ENDCHAR +STARTCHAR U_98F1 +ENCODING 39153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +4540 +4FE0 +7440 +97C0 +5440 +27C0 +2540 +4680 +8460 +ENDCHAR +STARTCHAR U_98F2 +ENCODING 39154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +ABE0 +FC20 +88A0 +F880 +8880 +F880 +9140 +AA20 +CC20 +ENDCHAR +STARTCHAR U_98F3 +ENCODING 39155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +F900 +4900 +7900 +4BC0 +7900 +5100 +5900 +6FE0 +ENDCHAR +STARTCHAR U_98F4 +ENCODING 39156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +A900 +F940 +8BA0 +F800 +8BE0 +FA20 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_98F5 +ENCODING 39157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2A00 +53E0 +FD00 +4900 +79E0 +4900 +79E0 +5100 +5900 +6900 +ENDCHAR +STARTCHAR U_98F6 +ENCODING 39158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +50A0 +AA20 +FA40 +8A40 +FEA0 +8AA0 +FB00 +9220 +AE20 +C9E0 +ENDCHAR +STARTCHAR U_98F7 +ENCODING 39159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +5640 +FA40 +4BC0 +7A40 +4A40 +7BC0 +5240 +5A40 +6FE0 +ENDCHAR +STARTCHAR U_98F8 +ENCODING 39160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4D40 +7BE0 +0240 +FFC0 +2240 +7BE0 +0B40 +2A80 +1360 +ENDCHAR +STARTCHAR U_98F9 +ENCODING 39161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5CE0 +AAA0 +7AA0 +4AA0 +7AA0 +4AA0 +7EA0 +52E0 +7480 +4880 +ENDCHAR +STARTCHAR U_98FA +ENCODING 39162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +5120 +FDE0 +0400 +3B80 +E4E0 +3F80 +2080 +3FA0 +2240 +39E0 +ENDCHAR +STARTCHAR U_98FB +ENCODING 39163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5280 +FC60 +4900 +7A80 +4900 +7A40 +5080 +5900 +6E00 +ENDCHAR +STARTCHAR U_98FC +ENCODING 39164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +ABA0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +92A0 +A820 +C8E0 +ENDCHAR +STARTCHAR U_98FD +ENCODING 39165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +ABE0 +FC20 +8BA0 +FAA0 +8BA0 +FA40 +9220 +AA20 +C9E0 +ENDCHAR +STARTCHAR U_98FE +ENCODING 39166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +ABE0 +FC80 +8BE0 +FAA0 +8AA0 +FAA0 +92A0 +AAE0 +C880 +ENDCHAR +STARTCHAR U_98FF +ENCODING 39167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2AA0 +56A0 +FAA0 +4BE0 +7880 +4AA0 +7AA0 +52A0 +5AA0 +6BE0 +ENDCHAR +STARTCHAR U_9900 +ENCODING 39168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2A80 +57E0 +FA80 +4800 +7C40 +4A40 +7A80 +5100 +5A80 +6C60 +ENDCHAR +STARTCHAR U_9901 +ENCODING 39169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2A60 +5780 +FA80 +4E80 +7BE0 +4A80 +7A80 +5280 +5BE0 +6A00 +ENDCHAR +STARTCHAR U_9902 +ENCODING 39170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +FBE0 +8880 +F880 +8BE0 +FA20 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_9903 +ENCODING 39171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +AFE0 +FA40 +8C20 +FA40 +8940 +F880 +9180 +AA40 +CC20 +ENDCHAR +STARTCHAR U_9904 +ENCODING 39172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2980 +5640 +FC20 +4BC0 +7800 +4BC0 +7A40 +5240 +5BC0 +6A40 +ENDCHAR +STARTCHAR U_9905 +ENCODING 39173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +FA40 +8A40 +FFE0 +8A40 +FA40 +9240 +AC40 +C840 +ENDCHAR +STARTCHAR U_9906 +ENCODING 39174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2A80 +56A0 +FAC0 +4E80 +7AC0 +4EA0 +7A80 +5280 +5AA0 +6C60 +ENDCHAR +STARTCHAR U_9907 +ENCODING 39175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +ADE0 +F420 +95E0 +F560 +9560 +F5E0 +8420 +A420 +D460 +ENDCHAR +STARTCHAR U_9908 +ENCODING 39176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +37E0 +E940 +46E0 +1F00 +E4E0 +3F80 +2080 +3FA0 +2140 +38E0 +ENDCHAR +STARTCHAR U_9909 +ENCODING 39177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5200 +AFE0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +9820 +A820 +C860 +ENDCHAR +STARTCHAR U_990A +ENCODING 39178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +FFE0 +1500 +62C0 +BFA0 +2080 +3FA0 +2240 +39E0 +ENDCHAR +STARTCHAR U_990B +ENCODING 39179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0400 +FFE0 +2A80 +D560 +3F80 +D160 +1F40 +1280 +19E0 +ENDCHAR +STARTCHAR U_990C +ENCODING 39180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +AA40 +FBC0 +8A40 +FBC0 +8A40 +FA60 +97C0 +A840 +C840 +ENDCHAR +STARTCHAR U_990D +ENCODING 39181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8500 +BFE0 +9280 +AF40 +90E0 +FF80 +9080 +9FA0 +9140 +9CE0 +ENDCHAR +STARTCHAR U_990E +ENCODING 39182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +55E0 +FE20 +4940 +7880 +4940 +7FE0 +5240 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_990F +ENCODING 39183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2880 +57E0 +F900 +4A00 +7EA0 +4AC0 +7A80 +5240 +5B40 +6A20 +ENDCHAR +STARTCHAR U_9910 +ENCODING 39184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2240 +7580 +AA40 +5FC0 +B0A0 +5F80 +1080 +1FA0 +1540 +18E0 +ENDCHAR +STARTCHAR U_9911 +ENCODING 39185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FFE0 +8C20 +FBE0 +8840 +FFE0 +9080 +A880 +C980 +ENDCHAR +STARTCHAR U_9912 +ENCODING 39186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5720 +ACA0 +FA40 +8900 +FFE0 +8940 +FA40 +9180 +A940 +CE20 +ENDCHAR +STARTCHAR U_9913 +ENCODING 39187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +56C0 +AAA0 +FA80 +8FE0 +FA80 +8BA0 +FEA0 +9240 +AAE0 +CF20 +ENDCHAR +STARTCHAR U_9914 +ENCODING 39188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +AFE0 +F880 +8BE0 +FAA0 +8BE0 +FAA0 +93E0 +AAA0 +CA60 +ENDCHAR +STARTCHAR U_9915 +ENCODING 39189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +AFA0 +F940 +8A20 +F900 +8BC0 +FD40 +9080 +A940 +CE20 +ENDCHAR +STARTCHAR U_9916 +ENCODING 39190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5000 +ABC0 +FA40 +8A40 +FBC0 +8A40 +FC20 +9240 +AA80 +CFE0 +ENDCHAR +STARTCHAR U_9917 +ENCODING 39191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FBE0 +8AA0 +FBE0 +8880 +F9C0 +92A0 +ACA0 +C880 +ENDCHAR +STARTCHAR U_9918 +ENCODING 39192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +AC40 +F820 +8FC0 +F900 +8FE0 +F900 +9540 +B920 +CB00 +ENDCHAR +STARTCHAR U_9919 +ENCODING 39193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2980 +5660 +F880 +4FE0 +7980 +4BE0 +7EA0 +52A0 +5AE0 +6880 +ENDCHAR +STARTCHAR U_991A +ENCODING 39194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2360 +5080 +AB60 +F900 +8FE0 +FA20 +8BE0 +FE20 +93E0 +AA20 +CA60 +ENDCHAR +STARTCHAR U_991B +ENCODING 39195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +AFC0 +FC40 +8FC0 +FC80 +8CA0 +FFC0 +94A0 +ADA0 +CEE0 +ENDCHAR +STARTCHAR U_991C +ENCODING 39196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2AA0 +57E0 +FAA0 +4BE0 +7880 +4FE0 +7980 +52C0 +5CA0 +6880 +ENDCHAR +STARTCHAR U_991D +ENCODING 39197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2FE0 +5280 +F900 +4880 +7FE0 +4900 +79C0 +5240 +5A40 +6CC0 +ENDCHAR +STARTCHAR U_991E +ENCODING 39198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5240 +AFE0 +FA40 +89A0 +FE60 +8A40 +FFE0 +9280 +AB20 +CCE0 +ENDCHAR +STARTCHAR U_991F +ENCODING 39199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +AAA0 +FB40 +8CA0 +F900 +8FE0 +FD20 +92A0 +AD40 +C9A0 +ENDCHAR +STARTCHAR U_9920 +ENCODING 39200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +2A40 +57E0 +FA40 +4A40 +7FE0 +4A40 +7A40 +5240 +5A40 +6C40 +ENDCHAR +STARTCHAR U_9921 +ENCODING 39201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +AA40 +FC00 +8960 +FA20 +8A20 +FB60 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_9922 +ENCODING 39202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +FA40 +4A80 +7FE0 +4800 +7BC0 +5240 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_9923 +ENCODING 39203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2FE0 +5140 +FEA0 +4BE0 +7AA0 +4BE0 +7AA0 +53E0 +5880 +68E0 +ENDCHAR +STARTCHAR U_9924 +ENCODING 39204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +AAC0 +FC80 +8940 +FEA0 +8AA0 +FAC0 +9080 +A940 +CA20 +ENDCHAR +STARTCHAR U_9925 +ENCODING 39205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FFE0 +1580 +7F60 +A100 +3F40 +2280 +79C0 +ENDCHAR +STARTCHAR U_9926 +ENCODING 39206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2A00 +57C0 +FA00 +4BC0 +7A00 +4FE0 +7B40 +5280 +5A40 +6B20 +ENDCHAR +STARTCHAR U_9927 +ENCODING 39207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5080 +AFE0 +FAC0 +8CA0 +F900 +8FE0 +FA40 +9180 +A940 +CE20 +ENDCHAR +STARTCHAR U_9928 +ENCODING 39208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8A00 +FBC0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_9929 +ENCODING 39209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5220 +AC80 +FBE0 +8900 +FA40 +8B80 +F920 +9240 +A8A0 +CB20 +ENDCHAR +STARTCHAR U_992A +ENCODING 39210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5100 +AFE0 +FAA0 +8AA0 +FAA0 +8900 +FFE0 +9100 +AA80 +CC60 +ENDCHAR +STARTCHAR U_992B +ENCODING 39211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +AFE0 +FAA0 +8BE0 +FAA0 +8BE0 +F880 +97E0 +A880 +C880 +ENDCHAR +STARTCHAR U_992C +ENCODING 39212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +52A0 +AFA0 +F2E0 +92A0 +F7A0 +95E0 +F7A0 +94A0 +A920 +CA60 +ENDCHAR +STARTCHAR U_992D +ENCODING 39213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +AA40 +FBC0 +8A40 +FFE0 +8880 +F880 +93E0 +A880 +CFE0 +ENDCHAR +STARTCHAR U_992E +ENCODING 39214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +4540 +72A0 +9540 +3B00 +6480 +FF60 +2100 +3F40 +2280 +79C0 +ENDCHAR +STARTCHAR U_992F +ENCODING 39215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +F880 +8FE0 +FA00 +8DA0 +FAC0 +95A0 +AEA0 +C900 +ENDCHAR +STARTCHAR U_9930 +ENCODING 39216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74E0 +8800 +2200 +F6E0 +9D20 +F520 +9520 +F720 +A520 +F5E0 +9540 +ENDCHAR +STARTCHAR U_9931 +ENCODING 39217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +AFE0 +FA00 +8BE0 +FA40 +8BE0 +FA40 +9240 +AAA0 +CB20 +ENDCHAR +STARTCHAR U_9932 +ENCODING 39218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +FA40 +8BC0 +F900 +8BE0 +FCA0 +9560 +AFA0 +C840 +ENDCHAR +STARTCHAR U_9933 +ENCODING 39219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +FA40 +8FE0 +FC00 +8FE0 +FAA0 +92A0 +AD20 +CA40 +ENDCHAR +STARTCHAR U_9934 +ENCODING 39220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2BE0 +5540 +FAA0 +4BC0 +7880 +4AA0 +7FE0 +5220 +5A20 +6C20 +ENDCHAR +STARTCHAR U_9935 +ENCODING 39221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +AFC0 +F540 +97C0 +F000 +9FE0 +F500 +8540 +A480 +D660 +ENDCHAR +STARTCHAR U_9936 +ENCODING 39222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +53C0 +FAC0 +4FE0 +7C20 +4BC0 +7A40 +53C0 +5A40 +6EC0 +ENDCHAR +STARTCHAR U_9937 +ENCODING 39223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +5380 +FD40 +4BE0 +7A40 +4BC0 +7A40 +53C0 +5800 +6FE0 +ENDCHAR +STARTCHAR U_9938 +ENCODING 39224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +2940 +5600 +FBE0 +4880 +7FE0 +4A80 +7A80 +5340 +5A20 +6DE0 +ENDCHAR +STARTCHAR U_9939 +ENCODING 39225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2BE0 +5680 +FBE0 +4AA0 +7BE0 +4BE0 +7A80 +53E0 +5D20 +69E0 +ENDCHAR +STARTCHAR U_993A +ENCODING 39226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +57E0 +AAA0 +FBE0 +8AA0 +FBE0 +8AA0 +F840 +97E0 +AA40 +C9C0 +ENDCHAR +STARTCHAR U_993B +ENCODING 39227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2A80 +57E0 +F900 +4BC0 +7900 +4FE0 +7800 +5540 +5AA0 +6AA0 +ENDCHAR +STARTCHAR U_993C +ENCODING 39228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +AC00 +FBE0 +8D60 +FBA0 +8920 +FFE0 +93A0 +AD60 +C920 +ENDCHAR +STARTCHAR U_993D +ENCODING 39229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AD20 +FFE0 +8D20 +FFE0 +8940 +F980 +93E0 +AD20 +C8E0 +ENDCHAR +STARTCHAR U_993E +ENCODING 39230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +54A0 +ACA0 +FDA0 +8E40 +FBE0 +8AA0 +FBE0 +92A0 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_993F +ENCODING 39231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51E0 +AAA0 +FBE0 +8AA0 +FBE0 +8880 +FFE0 +9240 +A980 +CE60 +ENDCHAR +STARTCHAR U_9940 +ENCODING 39232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +2B00 +54A0 +FAA0 +4940 +7AE0 +4A20 +7B60 +5220 +5A20 +6BE0 +ENDCHAR +STARTCHAR U_9941 +ENCODING 39233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +A900 +F7E0 +9240 +F7A0 +9000 +FFE0 +AAA0 +BAA0 +DFE0 +ENDCHAR +STARTCHAR U_9942 +ENCODING 39234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +57C0 +FA40 +4BC0 +7800 +4BE0 +7AA0 +52A0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_9943 +ENCODING 39235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +AA40 +F7C0 +9440 +F7C0 +9440 +FFE0 +9100 +B280 +CC60 +ENDCHAR +STARTCHAR U_9944 +ENCODING 39236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1520 +2B40 +57E0 +FC20 +4BC0 +7A40 +4BC0 +7880 +53C0 +5880 +6FE0 +ENDCHAR +STARTCHAR U_9945 +ENCODING 39237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +F240 +9FE0 +FAA0 +9FE0 +F440 +A280 +F100 +8EE0 +ENDCHAR +STARTCHAR U_9946 +ENCODING 39238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2AA0 +57E0 +FAA0 +4BE0 +7AA0 +4FE0 +7AA0 +57E0 +5880 +6880 +ENDCHAR +STARTCHAR U_9947 +ENCODING 39239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +ABC0 +FA40 +8BC0 +F800 +8BE0 +FAA0 +ABE0 +A800 +DFE0 +ENDCHAR +STARTCHAR U_9948 +ENCODING 39240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F880 +8FE0 +FA00 +8BE0 +FCA0 +93E0 +A8A0 +CFE0 +ENDCHAR +STARTCHAR U_9949 +ENCODING 39241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +57E0 +A940 +F880 +8BE0 +FAA0 +8FE0 +F880 +93E0 +A880 +CFE0 +ENDCHAR +STARTCHAR U_994A +ENCODING 39242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FC0 +A540 +FFE0 +9020 +F7A0 +9540 +F740 +A540 +B7A0 +D520 +ENDCHAR +STARTCHAR U_994B +ENCODING 39243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +AD40 +FFE0 +8A40 +FBC0 +8A40 +FBC0 +9240 +ABC0 +CE60 +ENDCHAR +STARTCHAR U_994C +ENCODING 39244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +AEE0 +F880 +9EE0 +F280 +97C0 +F280 +97E0 +BA80 +CC60 +ENDCHAR +STARTCHAR U_994D +ENCODING 39245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2FE0 +5100 +FFC0 +4900 +7FE0 +4D40 +7B80 +57E0 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_994E +ENCODING 39246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FFE0 +8A40 +FBC0 +8A80 +FFE0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_994F +ENCODING 39247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +0900 +FFE0 +2A40 +FD80 +0A60 +3F80 +D560 +1F00 +1200 +1980 +ENDCHAR +STARTCHAR U_9950 +ENCODING 39248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +A900 +FFE0 +8C20 +FFE0 +8A40 +FBC0 +9140 +A880 +CFE0 +ENDCHAR +STARTCHAR U_9951 +ENCODING 39249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5BA0 +AD40 +F520 +9FE0 +F140 +9FE0 +F4A0 +A4C0 +FAA0 +9360 +ENDCHAR +STARTCHAR U_9952 +ENCODING 39250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +A900 +FFE0 +8A40 +FFE0 +8A40 +FFE0 +9280 +ACA0 +C860 +ENDCHAR +STARTCHAR U_9953 +ENCODING 39251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8900 +FFE0 +9380 +AD40 +C920 +ENDCHAR +STARTCHAR U_9954 +ENCODING 39252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +5FC0 +F500 +2FE0 +D200 +3FE0 +E100 +3F00 +2480 +7BC0 +ENDCHAR +STARTCHAR U_9955 +ENCODING 39253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +9100 +FFE0 +4520 +7DC0 +1560 +7FC0 +A100 +3F40 +2280 +39E0 +ENDCHAR +STARTCHAR U_9956 +ENCODING 39254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +5500 +AFE0 +F8A0 +8FE0 +F880 +8FA0 +FAA0 +9F40 +AAA0 +CD20 +ENDCHAR +STARTCHAR U_9957 +ENCODING 39255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +BEA0 +52C0 +BEA0 +54E0 +8E80 +3F80 +E160 +3F40 +2680 +39C0 +ENDCHAR +STARTCHAR U_9958 +ENCODING 39256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +ABA0 +F820 +9FE0 +F440 +97C0 +F440 +97C0 +B000 +CFE0 +ENDCHAR +STARTCHAR U_9959 +ENCODING 39257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +AAA0 +FFE0 +8A20 +FBC0 +8A40 +FBC0 +9240 +ABC0 +CE60 +ENDCHAR +STARTCHAR U_995A +ENCODING 39258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2FE0 +5540 +FFE0 +4900 +7FE0 +4A40 +7BE0 +52A0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_995B +ENCODING 39259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +A280 +FFE0 +9820 +F7E0 +9540 +FB80 +A5C0 +FAA0 +9520 +ENDCHAR +STARTCHAR U_995C +ENCODING 39260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BC80 +AB40 +9FC0 +F0A0 +9FA0 +9240 +99E0 +ENDCHAR +STARTCHAR U_995D +ENCODING 39261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +DA40 +EFE0 +AAC0 +EF60 +AFE0 +EA00 +CFC0 +AA40 +D3C0 +ENDCHAR +STARTCHAR U_995E +ENCODING 39262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +5480 +AFE0 +F420 +97E0 +F480 +9FE0 +F540 +A7C0 +F2A0 +8CE0 +ENDCHAR +STARTCHAR U_995F +ENCODING 39263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +AAA0 +FEE0 +9240 +FFE0 +9240 +FFE0 +A2A0 +F640 +8B20 +ENDCHAR +STARTCHAR U_9960 +ENCODING 39264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +AFE0 +7480 +55E0 +7B40 +55E0 +7940 +6FE0 +5540 +6BE0 +ENDCHAR +STARTCHAR U_9961 +ENCODING 39265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +A540 +FFE0 +9540 +FFE0 +9440 +F7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_9962 +ENCODING 39266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A540 +7FE0 +5560 +7FC0 +5540 +7FE0 +6540 +5D80 +6660 +ENDCHAR +STARTCHAR U_9963 +ENCODING 39267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +40 +40 +7C +48 +80 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_9964 +ENCODING 39268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +4880 +B080 +2080 +2080 +2080 +2880 +3280 +2100 +ENDCHAR +STARTCHAR U_9965 +ENCODING 39269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +4480 +7C80 +4C80 +A480 +2480 +2480 +2C80 +34A0 +28A0 +1060 +ENDCHAR +STARTCHAR U_9966 +ENCODING 39270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4600 +7A00 +5200 +83E0 +2E00 +2200 +2200 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_9967 +ENCODING 39271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4100 +7A00 +9400 +87E0 +22A0 +22A0 +24A0 +2920 +3220 +04C0 +ENDCHAR +STARTCHAR U_9968 +ENCODING 39272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8900 +A520 +2520 +27E0 +2900 +3120 +2120 +00E0 +ENDCHAR +STARTCHAR U_9969 +ENCODING 39273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7C00 +93C0 +8000 +2780 +2080 +2880 +30A0 +2060 +0020 +ENDCHAR +STARTCHAR U_996A +ENCODING 39274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +5100 +8100 +27E0 +2100 +2100 +2900 +3100 +27E0 +ENDCHAR +STARTCHAR U_996B +ENCODING 39275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +9100 +A7E0 +2100 +2100 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_996C +ENCODING 39276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +4D00 +A100 +27E0 +2120 +2120 +3220 +2420 +08C0 +ENDCHAR +STARTCHAR U_996D +ENCODING 39277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7C00 +4FC0 +A440 +2640 +2540 +2D40 +3480 +2940 +1620 +ENDCHAR +STARTCHAR U_996E +ENCODING 39278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +4A20 +A540 +2100 +2100 +2100 +2280 +3440 +2820 +ENDCHAR +STARTCHAR U_996F +ENCODING 39279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +7BE0 +4E00 +A2E0 +2F00 +2120 +2940 +30A0 +2360 +0C20 +ENDCHAR +STARTCHAR U_9970 +ENCODING 39280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7C80 +4880 +A7E0 +24A0 +24A0 +2CA0 +34A0 +24E0 +0080 +ENDCHAR +STARTCHAR U_9971 +ENCODING 39281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47C0 +7C40 +9740 +AD40 +2540 +2740 +24C0 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_9972 +ENCODING 39282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4020 +7BA0 +8820 +A3A0 +22A0 +22A0 +23A0 +2AA0 +3020 +2060 +ENDCHAR +STARTCHAR U_9973 +ENCODING 39283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7540 +9540 +6540 +47C0 +4100 +4920 +5920 +6FE0 +4820 +ENDCHAR +STARTCHAR U_9974 +ENCODING 39284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A40 +97A0 +8020 +2000 +23E0 +2A20 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_9975 +ENCODING 39285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7A40 +8BC0 +A240 +23C0 +2240 +2A60 +37C0 +2040 +0040 +ENDCHAR +STARTCHAR U_9976 +ENCODING 39286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47E0 +7A80 +9120 +AEE0 +2000 +27E0 +2A80 +32A0 +24A0 +0860 +ENDCHAR +STARTCHAR U_9977 +ENCODING 39287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4200 +7FE0 +9820 +0BA0 +4AA0 +4BA0 +4AA0 +6820 +4820 +08E0 +ENDCHAR +STARTCHAR U_9978 +ENCODING 39288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A80 +5440 +A820 +2780 +2000 +27C0 +2C40 +3440 +27C0 +ENDCHAR +STARTCHAR U_9979 +ENCODING 39289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7C40 +9280 +6900 +4280 +4C60 +47C0 +5440 +6440 +47C0 +ENDCHAR +STARTCHAR U_997A +ENCODING 39290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +4A40 +A420 +2A80 +2280 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_997B +ENCODING 39291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +9200 +4600 +4540 +4D40 +5480 +4480 +6640 +4420 +ENDCHAR +STARTCHAR U_997C +ENCODING 39292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4140 +7FE0 +8940 +A140 +27E0 +2140 +2940 +3240 +2440 +0840 +ENDCHAR +STARTCHAR U_997D +ENCODING 39293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8FE0 +A420 +23C0 +2080 +2FE0 +3100 +2500 +0200 +ENDCHAR +STARTCHAR U_997E +ENCODING 39294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7000 +97C0 +6440 +4440 +47C0 +4440 +5240 +6280 +4FE0 +ENDCHAR +STARTCHAR U_997F +ENCODING 39295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +46C0 +7AA0 +8FE0 +A280 +22A0 +27A0 +2AC0 +22A0 +3360 +2620 +ENDCHAR +STARTCHAR U_9980 +ENCODING 39296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7440 +5820 +A7C0 +2100 +2FE0 +2900 +3540 +2920 +1320 +ENDCHAR +STARTCHAR U_9981 +ENCODING 39297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4780 +7D20 +4AA0 +A140 +2FE0 +2140 +2A40 +3180 +2340 +0C20 +ENDCHAR +STARTCHAR U_9982 +ENCODING 39298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7240 +97E0 +6440 +4A20 +47C0 +4A40 +4180 +6180 +4660 +ENDCHAR +STARTCHAR U_9983 +ENCODING 39299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +7FC0 +9540 +67C0 +4100 +4FE0 +4380 +6540 +4920 +0100 +ENDCHAR +STARTCHAR U_9984 +ENCODING 39300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +9420 +A7E0 +2480 +24A0 +2FC0 +34A0 +25A0 +0660 +ENDCHAR +STARTCHAR U_9985 +ENCODING 39301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7A40 +9480 +A200 +24E0 +2420 +2760 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_9986 +ENCODING 39302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +53C0 +A240 +23C0 +2200 +2BE0 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_9987 +ENCODING 39303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7540 +5920 +87C0 +2440 +27C0 +2C40 +37C0 +2000 +0FE0 +ENDCHAR +STARTCHAR U_9988 +ENCODING 39304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7540 +9FE0 +A000 +27C0 +2440 +2D40 +3540 +2280 +0C60 +ENDCHAR +STARTCHAR U_9989 +ENCODING 39305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7740 +9540 +6FE0 +4820 +47C0 +4440 +57C0 +6440 +44C0 +ENDCHAR +STARTCHAR U_998A +ENCODING 39306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4760 +7D20 +4F60 +A520 +27E0 +2100 +2FE0 +3240 +2180 +0E60 +ENDCHAR +STARTCHAR U_998B +ENCODING 39307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +7FE0 +5520 +A7E0 +2280 +24E0 +2900 +2080 +3300 +20C0 +ENDCHAR +STARTCHAR U_998C +ENCODING 39308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7100 +9FE0 +6240 +4FE0 +4000 +47C0 +5540 +6540 +4FE0 +ENDCHAR +STARTCHAR U_998D +ENCODING 39309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +7A80 +57C0 +A440 +27C0 +2440 +2FE0 +3100 +2280 +0C60 +ENDCHAR +STARTCHAR U_998E +ENCODING 39310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +7540 +57C0 +A540 +47C0 +4540 +5FE0 +4440 +6240 +40C0 +ENDCHAR +STARTCHAR U_998F +ENCODING 39311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +7AA0 +5AA0 +8D20 +4240 +47E0 +4520 +57E0 +6520 +47E0 +ENDCHAR +STARTCHAR U_9990 +ENCODING 39312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4140 +7FE0 +5100 +8FE0 +2100 +27E0 +2D40 +33C0 +2140 +0FE0 +ENDCHAR +STARTCHAR U_9991 +ENCODING 39313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +4BC0 +A7E0 +2520 +27E0 +2900 +37C0 +2100 +0FE0 +ENDCHAR +STARTCHAR U_9992 +ENCODING 39314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +5440 +AFE0 +2AA0 +2FE0 +2C40 +3280 +2100 +0EE0 +ENDCHAR +STARTCHAR U_9993 +ENCODING 39315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +9F80 +EAE0 +BFA0 +8AA0 +4EA0 +4AA0 +5EA0 +6A40 +4AA0 +0D20 +ENDCHAR +STARTCHAR U_9994 +ENCODING 39316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +7FE0 +5880 +AFE0 +2240 +27E0 +2240 +3FE0 +2440 +0820 +ENDCHAR +STARTCHAR U_9995 +ENCODING 39317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +7FE0 +AB40 +4FC0 +4280 +4FE0 +5280 +6FE0 +4D40 +06E0 +ENDCHAR +STARTCHAR U_9996 +ENCODING 39318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0800 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9997 +ENCODING 39319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +4100 +F7C0 +5440 +5740 +55C0 +5440 +57E0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9998 +ENCODING 39320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2080 +FEA0 +9AA0 +FEA0 +90C0 +FEA0 +9160 +F220 +ENDCHAR +STARTCHAR U_9999 +ENCODING 39321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_999A +ENCODING 39322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +2280 +FA40 +7440 +A820 +27C0 +7A40 +4A40 +7A40 +4B40 +7C80 +ENDCHAR +STARTCHAR U_999B +ENCODING 39323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +2120 +FFE0 +7100 +A900 +21C0 +7240 +5340 +7480 +5540 +7A20 +ENDCHAR +STARTCHAR U_999C +ENCODING 39324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F220 +1220 +FFE0 +5A80 +96A0 +7AC0 +4A80 +7AA0 +4AA0 +7CE0 +ENDCHAR +STARTCHAR U_999D +ENCODING 39325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +2140 +FE80 +2A80 +66C0 +A2A0 +7AA0 +4A80 +7B40 +4A40 +7DC0 +ENDCHAR +STARTCHAR U_999E +ENCODING 39326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +67E0 +2080 +FFE0 +3420 +6BC0 +F840 +4FE0 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_999F +ENCODING 39327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +2720 +FAA0 +7140 +ABC0 +2080 +7080 +57E0 +7080 +5280 +7100 +ENDCHAR +STARTCHAR U_99A0 +ENCODING 39328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2280 +FA40 +7520 +ABC0 +2080 +7100 +57C0 +7440 +57C0 +7440 +ENDCHAR +STARTCHAR U_99A1 +ENCODING 39329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +6280 +26E0 +FA80 +3280 +6EE0 +FA80 +4A80 +7EE0 +4A80 +7A80 +ENDCHAR +STARTCHAR U_99A2 +ENCODING 39330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +2240 +FFC0 +7140 +A8A0 +2360 +7A80 +4FC0 +7940 +48A0 +7B60 +ENDCHAR +STARTCHAR U_99A3 +ENCODING 39331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2280 +FD40 +37E0 +6D40 +FFC0 +4D40 +7FC0 +4920 +78E0 +ENDCHAR +STARTCHAR U_99A4 +ENCODING 39332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +2540 +FCC0 +77C0 +AC00 +77E0 +5920 +7520 +56A0 +77A0 +0060 +ENDCHAR +STARTCHAR U_99A5 +ENCODING 39333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +63E0 +2620 +FBE0 +3220 +6BE0 +F900 +4BE0 +7D40 +4880 +7B60 +ENDCHAR +STARTCHAR U_99A6 +ENCODING 39334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6280 +27E0 +FAA0 +37E0 +6AA0 +FFE0 +4A80 +7EC0 +4AA0 +7AA0 +ENDCHAR +STARTCHAR U_99A7 +ENCODING 39335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +6240 +23C0 +FA40 +33C0 +6800 +FFE0 +4AA0 +7AA0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_99A8 +ENCODING 39336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1140 +7FE0 +5540 +7C80 +8540 +FFE0 +1480 +7FE0 +1080 +1F80 +ENDCHAR +STARTCHAR U_99A9 +ENCODING 39337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +27E0 +FA40 +77E0 +AA40 +7BC0 +4B40 +7AC0 +4B40 +7BC0 +0660 +ENDCHAR +STARTCHAR U_99AA +ENCODING 39338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +27E0 +F820 +77E0 +AD40 +7BC0 +4E40 +7BC0 +4A40 +7BC0 +4E60 +ENDCHAR +STARTCHAR U_99AB +ENCODING 39339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +FFE0 +2480 +FFE0 +2080 +3F80 +FBE0 +2AC0 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_99AC +ENCODING 39340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_99AD +ENCODING 39341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +7D20 +5120 +7D40 +5140 +7CC0 +5480 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99AE +ENCODING 39342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2500 +17C0 +1500 +27C0 +2500 +C7E0 +4020 +4560 +4AA0 +0AC0 +ENDCHAR +STARTCHAR U_99AF +ENCODING 39343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5080 +7880 +5080 +7BE0 +5080 +7C80 +5480 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_99B0 +ENCODING 39344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5100 +7FE0 +5220 +7C20 +5120 +7CA0 +54A0 +AC20 +A520 +18C0 +ENDCHAR +STARTCHAR U_99B1 +ENCODING 39345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5080 +7880 +53E0 +7880 +5080 +7C80 +5480 +AD40 +A620 +1820 +ENDCHAR +STARTCHAR U_99B2 +ENCODING 39346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5380 +7900 +5100 +7960 +5380 +7D00 +5500 +AD20 +A520 +18E0 +ENDCHAR +STARTCHAR U_99B3 +ENCODING 39347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A2A0 +FAE0 +A3A0 +FEA0 +A2A0 +FAE0 +5A80 +AA20 +AA20 +11E0 +ENDCHAR +STARTCHAR U_99B4 +ENCODING 39348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +A2A0 +F2A0 +A2A0 +F2A0 +A2A0 +FAA0 +5AA0 +AAA0 +AA20 +1420 +ENDCHAR +STARTCHAR U_99B5 +ENCODING 39349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3FC0 +2400 +3FE0 +2A20 +5540 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_99B6 +ENCODING 39350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5100 +7BC0 +5240 +7A40 +0980 +D900 +AAE0 +1C40 +ENDCHAR +STARTCHAR U_99B7 +ENCODING 39351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7880 +53E0 +7AA0 +52A0 +7AA0 +0AA0 +DAE0 +A880 +1880 +ENDCHAR +STARTCHAR U_99B8 +ENCODING 39352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +7A00 +5200 +7BE0 +5240 +7A40 +0A40 +DA40 +AC40 +1440 +ENDCHAR +STARTCHAR U_99B9 +ENCODING 39353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +7A20 +5220 +7BE0 +5220 +7E20 +5620 +AE20 +A7E0 +1A20 +ENDCHAR +STARTCHAR U_99BA +ENCODING 39354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5120 +7920 +5140 +7960 +5120 +7D20 +5540 +AE80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99BB +ENCODING 39355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F240 +A420 +F7E0 +A280 +FA80 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99BC +ENCODING 39356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5080 +7FE0 +5040 +7A40 +5240 +7980 +0980 +D980 +AA40 +1420 +ENDCHAR +STARTCHAR U_99BD +ENCODING 39357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4400 +7F80 +4400 +7FC0 +4A40 +A540 +7FC0 +4440 +7FC0 +0400 +ENDCHAR +STARTCHAR U_99BE +ENCODING 39358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5520 +7940 +5100 +7980 +0A80 +5AA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99BF +ENCODING 39359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5080 +7BE0 +5220 +7BE0 +5200 +7A00 +0A00 +DA00 +AC00 +1400 +ENDCHAR +STARTCHAR U_99C0 +ENCODING 39360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +5240 +7A00 +57E0 +7A80 +5280 +7A80 +0A80 +DAA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99C1 +ENCODING 39361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +5140 +7C80 +5140 +7E20 +5040 +7E40 +5580 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99C2 +ENCODING 39362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83E0 +9280 +E280 +8BE0 +7A80 +23E0 +FE80 +23E0 +22A0 +2560 +2940 +ENDCHAR +STARTCHAR U_99C3 +ENCODING 39363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +FBC0 +A140 +F940 +A140 +FFE0 +5900 +AA80 +AC40 +1020 +ENDCHAR +STARTCHAR U_99C4 +ENCODING 39364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7900 +57E0 +7900 +5100 +7A80 +0A80 +DD40 +A960 +1000 +ENDCHAR +STARTCHAR U_99C5 +ENCODING 39365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7A40 +5240 +7BC0 +5300 +7B00 +0A80 +DA80 +AC60 +1840 +ENDCHAR +STARTCHAR U_99C6 +ENCODING 39366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5200 +7A00 +5320 +7AC0 +5240 +7EA0 +0720 +AE00 +D7E0 +0800 +ENDCHAR +STARTCHAR U_99C7 +ENCODING 39367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5100 +79E0 +5140 +7B40 +5140 +7D40 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99C8 +ENCODING 39368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +7A00 +5200 +7BE0 +5240 +7A40 +0A40 +DA40 +AFE0 +1000 +ENDCHAR +STARTCHAR U_99C9 +ENCODING 39369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A420 +F420 +A7A0 +F6A0 +A6A0 +FFA0 +5EA0 +AC20 +AC20 +3460 +ENDCHAR +STARTCHAR U_99CA +ENCODING 39370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5540 +7D00 +57C0 +7E40 +0580 +AD80 +D640 +0820 +ENDCHAR +STARTCHAR U_99CB +ENCODING 39371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5120 +7920 +5120 +7AE0 +5440 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_99CC +ENCODING 39372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7E40 +CAC0 +3220 +3FE0 +C400 +7F80 +4400 +7FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_99CD +ENCODING 39373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7AA0 +51C0 +7880 +5080 +7FE0 +5480 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_99CE +ENCODING 39374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A080 +FBE0 +A2A0 +FAA0 +A3E0 +FAA0 +5AA0 +AAA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_99CF +ENCODING 39375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5100 +7D00 +51E0 +7D20 +5120 +7DE0 +5500 +AD00 +A500 +19E0 +ENDCHAR +STARTCHAR U_99D0 +ENCODING 39376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5080 +7880 +5080 +7FE0 +5480 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99D1 +ENCODING 39377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +4A40 +3180 +3FE0 +E400 +3F80 +2400 +3FE0 +6A20 +95C0 +ENDCHAR +STARTCHAR U_99D2 +ENCODING 39378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FC20 +A3A0 +FAA0 +A2A0 +FBA0 +5AA0 +A820 +A920 +30C0 +ENDCHAR +STARTCHAR U_99D3 +ENCODING 39379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7880 +5080 +79C0 +52A0 +7CA0 +0480 +5480 +AC00 +1BE0 +ENDCHAR +STARTCHAR U_99D4 +ENCODING 39380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +F240 +A240 +F3C0 +A240 +FA40 +2BC0 +5A40 +AA40 +B7E0 +ENDCHAR +STARTCHAR U_99D5 +ENCODING 39381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2BC0 +5000 +BFC0 +2400 +3F80 +2400 +3FE0 +6A20 +95C0 +ENDCHAR +STARTCHAR U_99D6 +ENCODING 39382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5180 +7A40 +5520 +7880 +53E0 +7C40 +0480 +5500 +AC80 +1840 +ENDCHAR +STARTCHAR U_99D7 +ENCODING 39383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5140 +7E20 +5080 +7D20 +5040 +7C80 +0520 +5440 +AC80 +BB00 +ENDCHAR +STARTCHAR U_99D8 +ENCODING 39384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5100 +7940 +5220 +7BE0 +5000 +7DE0 +0520 +5520 +ADE0 +AD20 +ENDCHAR +STARTCHAR U_99D9 +ENCODING 39385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A240 +F240 +A7E0 +FA40 +A340 +FAC0 +5A40 +AA40 +AA40 +32C0 +ENDCHAR +STARTCHAR U_99DA +ENCODING 39386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FC0 +5540 +7D40 +5540 +7FE0 +0900 +DA80 +AA40 +1420 +ENDCHAR +STARTCHAR U_99DB +ENCODING 39387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A080 +FBE0 +A2A0 +FAA0 +A3E0 +F880 +5A80 +A900 +AA80 +3460 +ENDCHAR +STARTCHAR U_99DC +ENCODING 39388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +A0A0 +FA40 +A240 +FAA0 +A6A0 +FA80 +5B00 +AA20 +AA20 +35E0 +ENDCHAR +STARTCHAR U_99DD +ENCODING 39389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5220 +7900 +5140 +7D80 +5500 +AD20 +A520 +18E0 +ENDCHAR +STARTCHAR U_99DE +ENCODING 39390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7A00 +5480 +7A80 +57E0 +7AA0 +0AE0 +DA80 +AA20 +11E0 +ENDCHAR +STARTCHAR U_99DF +ENCODING 39391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +AFE0 +FAA0 +AAA0 +FAA0 +AAA0 +FAE0 +5C20 +A820 +AFE0 +3820 +ENDCHAR +STARTCHAR U_99E0 +ENCODING 39392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +ACE0 +FAA0 +AAA0 +FAA0 +AEA0 +FAE0 +1280 +B280 +D280 +3480 +ENDCHAR +STARTCHAR U_99E1 +ENCODING 39393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3FC0 +2400 +3F80 +2400 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_99E2 +ENCODING 39394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +5140 +7FE0 +5140 +7940 +53E0 +7D40 +5540 +AD40 +A540 +1A40 +ENDCHAR +STARTCHAR U_99E3 +ENCODING 39395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A2A0 +FAC0 +A680 +FA80 +A6C0 +FAA0 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99E4 +ENCODING 39396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7940 +53E0 +7820 +5080 +7C80 +57E0 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99E5 +ENCODING 39397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A0A0 +FFE0 +A080 +FAA0 +A7A0 +FAA0 +5AC0 +AAA0 +AD60 +3220 +ENDCHAR +STARTCHAR U_99E6 +ENCODING 39398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +3F80 +0800 +FFE0 +2080 +FF60 +2400 +3F00 +2400 +3FC0 +5540 +ENDCHAR +STARTCHAR U_99E7 +ENCODING 39399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A820 +F820 +ABA0 +F820 +ABA0 +FAA0 +4AA0 +ABA0 +A820 +1860 +ENDCHAR +STARTCHAR U_99E8 +ENCODING 39400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7C20 +53A0 +7AA0 +53A0 +7EA0 +07A0 +AC20 +D4A0 +0840 +ENDCHAR +STARTCHAR U_99E9 +ENCODING 39401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D80 +5240 +7C20 +53C0 +7C80 +5080 +7FE0 +5480 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99EA +ENCODING 39402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A500 +FFC0 +A500 +F900 +AFE0 +FA80 +5A80 +AAA0 +ACA0 +3060 +ENDCHAR +STARTCHAR U_99EB +ENCODING 39403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5140 +7D40 +5380 +7FE0 +5280 +7A80 +0A80 +DAA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99EC +ENCODING 39404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A240 +F240 +A3C0 +F240 +A3C0 +FA40 +5A60 +AFC0 +A840 +3040 +ENDCHAR +STARTCHAR U_99ED +ENCODING 39405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +5120 +7BC0 +5040 +7CA0 +5540 +AEC0 +A520 +1A20 +ENDCHAR +STARTCHAR U_99EE +ENCODING 39406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7D40 +5220 +7D40 +5140 +7D40 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99EF +ENCODING 39407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5500 +7FC0 +5100 +7FE0 +5100 +7B80 +0B40 +DD60 +A900 +1100 +ENDCHAR +STARTCHAR U_99F0 +ENCODING 39408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F520 +A7E0 +F520 +A520 +FDA0 +5660 +AC20 +A7E0 +0C20 +ENDCHAR +STARTCHAR U_99F1 +ENCODING 39409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +53E0 +7E20 +5140 +7C80 +5340 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_99F2 +ENCODING 39410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +52A0 +7AA0 +52A0 +7FA0 +52E0 +7AA0 +0AA0 +DAA0 +ACA0 +1820 +ENDCHAR +STARTCHAR U_99F3 +ENCODING 39411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +ADC0 +F440 +A440 +F960 +AD40 +F540 +1540 +BDE0 +D600 +29E0 +ENDCHAR +STARTCHAR U_99F4 +ENCODING 39412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +A040 +FFE0 +A040 +FD40 +A7C0 +FD60 +5540 +A540 +A4A0 +3920 +ENDCHAR +STARTCHAR U_99F5 +ENCODING 39413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FEE0 +AAA0 +FAA0 +AAA0 +FEE0 +0A80 +DA80 +AA80 +1480 +ENDCHAR +STARTCHAR U_99F6 +ENCODING 39414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A420 +F7E0 +A400 +F7E0 +A420 +FFA0 +56A0 +ABA0 +A820 +30C0 +ENDCHAR +STARTCHAR U_99F7 +ENCODING 39415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +53E0 +7AA0 +53E0 +7C80 +55C0 +AEA0 +A4A0 +1880 +ENDCHAR +STARTCHAR U_99F8 +ENCODING 39416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5040 +7BC0 +5040 +7FE0 +5220 +7DC0 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99F9 +ENCODING 39417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A120 +FFE0 +A2A0 +FAC0 +A2A0 +FAC0 +4AA0 +AAC0 +ABA0 +34E0 +ENDCHAR +STARTCHAR U_99FA +ENCODING 39418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7A20 +53E0 +7A20 +53E0 +7AA0 +5AC0 +AA80 +AA40 +3320 +ENDCHAR +STARTCHAR U_99FB +ENCODING 39419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +FBE0 +A220 +FBE0 +A000 +FBE0 +5880 +AFE0 +A880 +3080 +ENDCHAR +STARTCHAR U_99FC +ENCODING 39420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +A240 +FC20 +A7C0 +F900 +A7E0 +F900 +5B40 +AD20 +A920 +3300 +ENDCHAR +STARTCHAR U_99FD +ENCODING 39421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5120 +79E0 +5000 +79E0 +5120 +7DE0 +5520 +ADE0 +A520 +1960 +ENDCHAR +STARTCHAR U_99FE +ENCODING 39422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +A280 +FFC0 +A440 +FC40 +A7C0 +FA80 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99FF +ENCODING 39423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5240 +7FE0 +5240 +7C20 +5200 +7BC0 +4E80 +A980 +A940 +1620 +ENDCHAR +STARTCHAR U_9A00 +ENCODING 39424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F180 +A6C0 +F2A0 +AFE0 +F280 +A3A0 +FEC0 +0A80 +ABA0 +5E60 +2220 +ENDCHAR +STARTCHAR U_9A01 +ENCODING 39425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7AA0 +53E0 +7AA0 +53E0 +7D00 +55E0 +AC20 +A520 +18C0 +ENDCHAR +STARTCHAR U_9A02 +ENCODING 39426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5220 +7940 +53E0 +7C80 +57E0 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_9A03 +ENCODING 39427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5240 +7FE0 +5020 +7A00 +53C0 +7C80 +57E0 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_9A04 +ENCODING 39428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +5040 +7BC0 +5040 +7BE0 +50A0 +7EC0 +55C0 +AEA0 +A4A0 +1980 +ENDCHAR +STARTCHAR U_9A05 +ENCODING 39429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A280 +F3E0 +A680 +F3E0 +A280 +FA80 +5BE0 +AA80 +AA80 +33E0 +ENDCHAR +STARTCHAR U_9A06 +ENCODING 39430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F7E0 +A520 +F7E0 +A420 +FFA0 +5EA0 +AAA0 +ABA0 +3060 +ENDCHAR +STARTCHAR U_9A07 +ENCODING 39431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5140 +7A20 +57E0 +7880 +53E0 +7C80 +55E0 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_9A08 +ENCODING 39432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +A240 +F7E0 +A240 +F240 +A240 +FFE0 +0A40 +DA40 +AA40 +1440 +ENDCHAR +STARTCHAR U_9A09 +ENCODING 39433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +F3E0 +A220 +F3E0 +A280 +FAA0 +5BC0 +AA80 +ABA0 +36E0 +ENDCHAR +STARTCHAR U_9A0A +ENCODING 39434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7D20 +55E0 +7AA0 +53E0 +78A0 +5AA0 +ABE0 +A820 +10C0 +ENDCHAR +STARTCHAR U_9A0B +ENCODING 39435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F100 +A540 +F740 +A9A0 +F980 +4B40 +AD20 +A920 +3100 +ENDCHAR +STARTCHAR U_9A0C +ENCODING 39436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +A7E0 +F420 +A3C0 +F000 +A7E0 +F880 +0AC0 +DAA0 +ACA0 +1100 +ENDCHAR +STARTCHAR U_9A0D +ENCODING 39437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F7E0 +A520 +F7E0 +A100 +FFE0 +5980 +AB40 +AD20 +1120 +ENDCHAR +STARTCHAR U_9A0E +ENCODING 39438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7980 +5240 +7FE0 +5020 +7BA0 +5AA0 +ABA0 +A820 +10E0 +ENDCHAR +STARTCHAR U_9A0F +ENCODING 39439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +5240 +7FE0 +5240 +7BC0 +5240 +7BC0 +5A40 +AFE0 +AA40 +1420 +ENDCHAR +STARTCHAR U_9A10 +ENCODING 39440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A100 +F280 +AD60 +F3C0 +A080 +F900 +0940 +DEA0 +AA40 +11C0 +ENDCHAR +STARTCHAR U_9A11 +ENCODING 39441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +56E0 +7A80 +5280 +7EE0 +5280 +7A80 +5EE0 +AA80 +AA80 +1280 +ENDCHAR +STARTCHAR U_9A12 +ENCODING 39442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A240 +F180 +A280 +FD60 +A7C0 +FD40 +0FC0 +D940 +A9E0 +1620 +ENDCHAR +STARTCHAR U_9A13 +ENCODING 39443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A280 +F440 +ABA0 +F100 +A7C0 +FD40 +0FC0 +D900 +AA80 +1440 +ENDCHAR +STARTCHAR U_9A14 +ENCODING 39444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7BC0 +5240 +7BC0 +5100 +7BE0 +5EA0 +AB60 +ABA0 +1040 +ENDCHAR +STARTCHAR U_9A15 +ENCODING 39445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5280 +7FE0 +52A0 +7FE0 +5100 +7FE0 +5A40 +AA80 +A940 +1620 +ENDCHAR +STARTCHAR U_9A16 +ENCODING 39446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +FD40 +5480 +9160 +7FC0 +4400 +7F80 +4400 +7FC0 +AAC0 +ENDCHAR +STARTCHAR U_9A17 +ENCODING 39447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A80 +4BC0 +7A80 +43C0 +7E80 +57E0 +7C20 +5560 +D6A0 +4C40 +ENDCHAR +STARTCHAR U_9A18 +ENCODING 39448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F560 +A3A0 +FDA0 +A260 +F800 +0B40 +DCA0 +AA40 +11C0 +ENDCHAR +STARTCHAR U_9A19 +ENCODING 39449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F420 +A7E0 +F400 +A7E0 +FAA0 +5BE0 +AAA0 +AAA0 +1260 +ENDCHAR +STARTCHAR U_9A1A +ENCODING 39450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A280 +F7E0 +A020 +FEA0 +AAA0 +FEA0 +5AA0 +AEA0 +AA20 +3A60 +ENDCHAR +STARTCHAR U_9A1B +ENCODING 39451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +A0A0 +FEC0 +A5A0 +F540 +AFE0 +F560 +5540 +B560 +9540 +2920 +ENDCHAR +STARTCHAR U_9A1C +ENCODING 39452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +53C0 +7A40 +53C0 +7A40 +57E0 +7880 +5880 +ABE0 +A880 +17E0 +ENDCHAR +STARTCHAR U_9A1D +ENCODING 39453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52A0 +7BE0 +54A0 +7FE0 +5280 +7BE0 +5A80 +AFE0 +AA80 +15E0 +ENDCHAR +STARTCHAR U_9A1E +ENCODING 39454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A080 +F3E0 +A080 +F7E0 +A080 +FFE0 +5A00 +AFE0 +AA20 +13E0 +ENDCHAR +STARTCHAR U_9A1F +ENCODING 39455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A280 +F440 +ABA0 +F000 +A720 +F5A0 +17A0 +B5A0 +D7A0 +2560 +ENDCHAR +STARTCHAR U_9A20 +ENCODING 39456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7BC0 +5240 +7BC0 +5000 +7FE0 +5A80 +AAE0 +AD80 +14E0 +ENDCHAR +STARTCHAR U_9A21 +ENCODING 39457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +A7C0 +F440 +A7C0 +F440 +A7C0 +F900 +0F40 +DB80 +AD40 +1A20 +ENDCHAR +STARTCHAR U_9A22 +ENCODING 39458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +A520 +F520 +A760 +F400 +A4E0 +F720 +54A0 +B740 +94A0 +2520 +ENDCHAR +STARTCHAR U_9A23 +ENCODING 39459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B60 +52A0 +7B60 +53E0 +7940 +5620 +79E0 +5B40 +A880 +A940 +1620 +ENDCHAR +STARTCHAR U_9A24 +ENCODING 39460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F40 +5580 +7AA0 +5440 +7BE0 +5080 +7FE0 +5880 +A940 +AA20 +1420 +ENDCHAR +STARTCHAR U_9A25 +ENCODING 39461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5140 +7FE0 +52A0 +7CC0 +5180 +7900 +5FE0 +AB80 +AD40 +1120 +ENDCHAR +STARTCHAR U_9A26 +ENCODING 39462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +52A0 +7AA0 +53E0 +7880 +0AA0 +DD20 +A940 +19C0 +ENDCHAR +STARTCHAR U_9A27 +ENCODING 39463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A440 +F740 +A540 +FFE0 +A820 +FBA0 +5AA0 +ABA0 +8AA0 +3060 +ENDCHAR +STARTCHAR U_9A28 +ENCODING 39464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D20 +52C0 +7BE0 +52A0 +7BE0 +52A0 +7BE0 +0880 +DFE0 +A880 +1080 +ENDCHAR +STARTCHAR U_9A29 +ENCODING 39465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57E0 +7D20 +57E0 +7D20 +57E0 +7940 +59A0 +ABE0 +AD20 +11E0 +ENDCHAR +STARTCHAR U_9A2A +ENCODING 39466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +52E0 +7AA0 +53E0 +7AA0 +53E0 +7880 +5BE0 +A940 +A880 +1760 +ENDCHAR +STARTCHAR U_9A2B +ENCODING 39467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +7F80 +1200 +7FE0 +2480 +7F40 +A420 +3FC0 +5540 +ENDCHAR +STARTCHAR U_9A2C +ENCODING 39468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A100 +FFE0 +A540 +FD60 +A540 +FD60 +5100 +B380 +9540 +2920 +ENDCHAR +STARTCHAR U_9A2D +ENCODING 39469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F5C0 +A500 +DFE0 +A540 +A980 +FFC0 +4400 +7F80 +4400 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_9A2E +ENCODING 39470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A8A0 +FAA0 +AEA0 +F140 +A7E0 +F520 +57E0 +B520 +97E0 +2420 +ENDCHAR +STARTCHAR U_9A2F +ENCODING 39471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7E0 +F240 +A280 +FFE0 +A920 +F7C0 +1200 +B3C0 +9240 +34C0 +ENDCHAR +STARTCHAR U_9A30 +ENCODING 39472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +A200 +EFE0 +A540 +AFE0 +F500 +A7C0 +A500 +A7E0 +AAA0 +ENDCHAR +STARTCHAR U_9A31 +ENCODING 39473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +57A0 +7AA0 +5340 +7AA0 +53E0 +7880 +5FE0 +A880 +A940 +1620 +ENDCHAR +STARTCHAR U_9A32 +ENCODING 39474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +53E0 +7940 +53E0 +7A20 +53E0 +7A20 +5BE0 +A880 +ABE0 +1080 +ENDCHAR +STARTCHAR U_9A33 +ENCODING 39475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +A280 +FBE0 +A280 +FBE0 +0820 +AAE0 +8A20 +30C0 +ENDCHAR +STARTCHAR U_9A34 +ENCODING 39476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5220 +7BE0 +5220 +7FE0 +5420 +7900 +5FE0 +A940 +A880 +1760 +ENDCHAR +STARTCHAR U_9A35 +ENCODING 39477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +F5E0 +A520 +F5E0 +A520 +FDE0 +5480 +ADC0 +AEA0 +11A0 +ENDCHAR +STARTCHAR U_9A36 +ENCODING 39478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7EA0 +53E0 +78A0 +5140 +7FE0 +5AA0 +ABE0 +A920 +1640 +ENDCHAR +STARTCHAR U_9A37 +ENCODING 39479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52A0 +7940 +5180 +7A40 +54A0 +7BE0 +5AA0 +ABE0 +A8A0 +17E0 +ENDCHAR +STARTCHAR U_9A38 +ENCODING 39480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7A20 +53E0 +7A00 +53E0 +7AA0 +5BE0 +AAA0 +ABE0 +14A0 +ENDCHAR +STARTCHAR U_9A39 +ENCODING 39481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +57E0 +7940 +53E0 +7AA0 +52A0 +7BE0 +5880 +ABE0 +A880 +17E0 +ENDCHAR +STARTCHAR U_9A3A +ENCODING 39482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5140 +FBC0 +2240 +FFE0 +4400 +7F80 +4400 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9A3B +ENCODING 39483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57E0 +7BA0 +5540 +7BA0 +53A0 +7D40 +0BA0 +5980 +AA60 +1C40 +ENDCHAR +STARTCHAR U_9A3C +ENCODING 39484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +AFE0 +FA80 +AFE0 +FAA0 +AFE0 +FA80 +0BE0 +DA80 +ABA0 +1260 +ENDCHAR +STARTCHAR U_9A3D +ENCODING 39485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +7DA0 +5360 +7DA0 +5080 +7BE0 +5A20 +ABE0 +AA20 +13E0 +ENDCHAR +STARTCHAR U_9A3E +ENCODING 39486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +52A0 +7BE0 +5120 +7BC0 +5A20 +AFE0 +AAC0 +15A0 +ENDCHAR +STARTCHAR U_9A3F +ENCODING 39487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7940 +57E0 +7A20 +53E0 +7A20 +5BE0 +A880 +ABE0 +1080 +ENDCHAR +STARTCHAR U_9A40 +ENCODING 39488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +FFE0 +2480 +7FC0 +A420 +3FE0 +4AA0 +ENDCHAR +STARTCHAR U_9A41 +ENCODING 39489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2140 +FC80 +4940 +FFC0 +4400 +7F80 +4400 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9A42 +ENCODING 39490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A7C0 +F440 +AAA0 +FFE0 +A240 +F520 +5280 +B340 +9080 +2700 +ENDCHAR +STARTCHAR U_9A43 +ENCODING 39491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A280 +FFE0 +AAA0 +FFE0 +A000 +F7C0 +5000 +BFE0 +92C0 +2DA0 +ENDCHAR +STARTCHAR U_9A44 +ENCODING 39492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F560 +A6A0 +F5A0 +A660 +F7E0 +5340 +B6A0 +9A40 +21C0 +ENDCHAR +STARTCHAR U_9A45 +ENCODING 39493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5400 +7DC0 +5540 +7DC0 +5400 +7FE0 +5EA0 +AFE0 +AC00 +17E0 +ENDCHAR +STARTCHAR U_9A46 +ENCODING 39494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A540 +F7C0 +A540 +F7C0 +A540 +FFE0 +5540 +BFE0 +9100 +2100 +ENDCHAR +STARTCHAR U_9A47 +ENCODING 39495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +A940 +F760 +22A0 +FFE0 +2400 +3FC0 +2400 +3FE0 +52A0 +ENDCHAR +STARTCHAR U_9A48 +ENCODING 39496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +A280 +F7E0 +A2A0 +F480 +AFE0 +FAA0 +5FE0 +AAA0 +ABA0 +3820 +ENDCHAR +STARTCHAR U_9A49 +ENCODING 39497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A100 +F7E0 +A520 +F7C0 +A520 +F5E0 +5540 +B760 +9540 +2BE0 +ENDCHAR +STARTCHAR U_9A4A +ENCODING 39498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A7E0 +FA80 +A7E0 +FD40 +A7E0 +FD40 +57E0 +B100 +97C0 +2100 +ENDCHAR +STARTCHAR U_9A4B +ENCODING 39499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6A0 +A2C0 +F6A0 +A440 +F820 +A6E0 +FAA0 +0C00 +DAE0 +AA40 +16A0 +ENDCHAR +STARTCHAR U_9A4C +ENCODING 39500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F140 +A7E0 +F140 +A7E0 +F9A0 +5FE0 +A920 +AFE0 +39A0 +ENDCHAR +STARTCHAR U_9A4D +ENCODING 39501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7880 +53E0 +7A40 +57E0 +7A40 +5FE0 +AA80 +AAA0 +1460 +ENDCHAR +STARTCHAR U_9A4E +ENCODING 39502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CA0 +52C0 +7FE0 +52C0 +7CA0 +5240 +7BE0 +5D40 +ABE0 +AA40 +1440 +ENDCHAR +STARTCHAR U_9A4F +ENCODING 39503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A420 +F7E0 +A480 +F7E0 +A480 +FFE0 +5A40 +AFE0 +AA40 +36C0 +ENDCHAR +STARTCHAR U_9A50 +ENCODING 39504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +AF80 +FAE0 +AEA0 +F0A0 +AEA0 +F2A0 +54A0 +BE40 +94A0 +2520 +ENDCHAR +STARTCHAR U_9A51 +ENCODING 39505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FEE0 +AAA0 +FEE0 +A280 +F7E0 +1520 +B7E0 +5520 +27E0 +ENDCHAR +STARTCHAR U_9A52 +ENCODING 39506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +5000 +7BE0 +52A0 +7BE0 +5AA0 +AFE0 +A880 +1080 +ENDCHAR +STARTCHAR U_9A53 +ENCODING 39507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +AFE0 +F920 +ABA0 +FFE0 +A000 +FBC0 +0A40 +ABC0 +8A40 +33C0 +ENDCHAR +STARTCHAR U_9A54 +ENCODING 39508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FFE0 +AAA0 +FFE0 +A440 +F7C0 +5440 +BFE0 +9100 +2100 +ENDCHAR +STARTCHAR U_9A55 +ENCODING 39509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A100 +F7E0 +A240 +FFE0 +A240 +FFE0 +5820 +ABA0 +AAA0 +3BE0 +ENDCHAR +STARTCHAR U_9A56 +ENCODING 39510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +52A0 +7FE0 +5580 +7FA0 +50A0 +7FA0 +5AC0 +AF40 +AAA0 +1720 +ENDCHAR +STARTCHAR U_9A57 +ENCODING 39511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5280 +7C40 +53A0 +7800 +57E0 +7D20 +5FE0 +AA40 +ADA0 +1120 +ENDCHAR +STARTCHAR U_9A58 +ENCODING 39512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1000 +3FC0 +2040 +7FC0 +5540 +7F40 +55C0 +7F40 +9560 +ENDCHAR +STARTCHAR U_9A59 +ENCODING 39513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +FBA0 +A820 +FFE0 +A440 +F7C0 +5440 +B7C0 +9000 +2FE0 +ENDCHAR +STARTCHAR U_9A5A +ENCODING 39514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +53E0 +FD40 +56A0 +7FE0 +2400 +3FC0 +2400 +3FE0 +4A20 +9540 +ENDCHAR +STARTCHAR U_9A5B +ENCODING 39515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +FFE0 +A100 +F7E0 +A100 +FFE0 +4A80 +AFE0 +A900 +1100 +ENDCHAR +STARTCHAR U_9A5C +ENCODING 39516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +5360 +7FE0 +5140 +7FE0 +5080 +7BE0 +0880 +DFE0 +AAC0 +14A0 +ENDCHAR +STARTCHAR U_9A5D +ENCODING 39517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57C0 +7900 +57E0 +7A20 +57C0 +7A40 +0FE0 +DB80 +AD40 +1120 +ENDCHAR +STARTCHAR U_9A5E +ENCODING 39518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7C20 +53E0 +7AA0 +53C0 +7E40 +5BC0 +AA40 +ABC0 +1660 +ENDCHAR +STARTCHAR U_9A5F +ENCODING 39519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F740 +A5A0 +F740 +A1A0 +F340 +5580 +BB40 +9520 +2920 +ENDCHAR +STARTCHAR U_9A60 +ENCODING 39520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AFE0 +F240 +A3C0 +F440 +ADE0 +F540 +1DE0 +B000 +9540 +3AA0 +ENDCHAR +STARTCHAR U_9A61 +ENCODING 39521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7E00 +2BC0 +FC40 +57C0 +6EA0 +55E0 +3F80 +2400 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9A62 +ENCODING 39522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +A100 +F7E0 +A540 +F7E0 +A540 +F7C0 +5540 +B7E0 +9AA0 +27E0 +ENDCHAR +STARTCHAR U_9A63 +ENCODING 39523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +A7C0 +F200 +AFE0 +F440 +AFE0 +FA80 +0BC0 +DA80 +ABE0 +1520 +ENDCHAR +STARTCHAR U_9A64 +ENCODING 39524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7DA0 +57E0 +7940 +53E0 +7940 +5BE0 +AEA0 +AA40 +1320 +ENDCHAR +STARTCHAR U_9A65 +ENCODING 39525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +AEC0 +F280 +AFE0 +F540 +A7C0 +F540 +5FE0 +B280 +9FE0 +2440 +ENDCHAR +STARTCHAR U_9A66 +ENCODING 39526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A100 +FFE0 +A920 +F2E0 +AFA0 +F2E0 +53A0 +B6E0 +9AA0 +22E0 +ENDCHAR +STARTCHAR U_9A67 +ENCODING 39527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AF80 +FAE0 +AEA0 +F5E0 +AEA0 +FBE0 +5EA0 +B5E0 +9EA0 +2440 +ENDCHAR +STARTCHAR U_9A68 +ENCODING 39528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +A7E0 +F280 +A7E0 +FC80 +A7E0 +FC80 +5FE0 +ABA0 +AEE0 +1BA0 +ENDCHAR +STARTCHAR U_9A69 +ENCODING 39529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5240 +7FE0 +55A0 +7FE0 +5280 +7BE0 +5E80 +ABE0 +AA80 +13E0 +ENDCHAR +STARTCHAR U_9A6A +ENCODING 39530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +A000 +FEE0 +AAA0 +FFE0 +AAA0 +FFE0 +5AA0 +ABC0 +AAA0 +13E0 +ENDCHAR +STARTCHAR U_9A6B +ENCODING 39531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2400 +3F80 +2400 +3FC0 +5540 +FBE0 +A280 +FBE0 +5520 +AAE0 +ENDCHAR +STARTCHAR U_9A6C +ENCODING 39532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +1080 +1100 +2100 +3FE0 +0020 +0020 +FF20 +0020 +00C0 +ENDCHAR +STARTCHAR U_9A6D +ENCODING 39533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1220 +5220 +5220 +5240 +7940 +0940 +E880 +0980 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A6E +ENCODING 39534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5100 +57E0 +5100 +7900 +0900 +E900 +0A80 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A6F +ENCODING 39535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +12A0 +52A0 +52A0 +52A0 +7AA0 +0AA0 +EAA0 +0AA0 +0A20 +3420 +ENDCHAR +STARTCHAR U_9A70 +ENCODING 39536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +12A0 +52E0 +53A0 +56A0 +7AA0 +0AC0 +EA80 +0A20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9A71 +ENCODING 39537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1200 +5220 +5320 +52A0 +7A40 +0A40 +EAA0 +0B20 +0A00 +33E0 +ENDCHAR +STARTCHAR U_9A72 +ENCODING 39538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1220 +5220 +5220 +5220 +7BE0 +0A20 +EA20 +0A20 +0BE0 +3220 +ENDCHAR +STARTCHAR U_9A73 +ENCODING 39539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +1280 +5100 +5280 +5440 +7820 +0C40 +EA80 +0980 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A74 +ENCODING 39540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +53E0 +5220 +5220 +7BE0 +0A00 +EA00 +0A00 +0C00 +3000 +ENDCHAR +STARTCHAR U_9A75 +ENCODING 39541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +5240 +53C0 +5240 +7A40 +0A40 +EBC0 +0A40 +0A40 +37E0 +ENDCHAR +STARTCHAR U_9A76 +ENCODING 39542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +57E0 +54A0 +54A0 +7FE0 +08A0 +EA80 +0900 +0A80 +3460 +ENDCHAR +STARTCHAR U_9A77 +ENCODING 39543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E000 +27E0 +A520 +A520 +A520 +F520 +16E0 +F420 +1420 +17E0 +6020 +ENDCHAR +STARTCHAR U_9A78 +ENCODING 39544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +1240 +5240 +57E0 +5240 +7B40 +0AC0 +EA40 +0A40 +0A40 +32C0 +ENDCHAR +STARTCHAR U_9A79 +ENCODING 39545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +53E0 +5420 +53A0 +7AA0 +0AA0 +EBA0 +0AA0 +0820 +30C0 +ENDCHAR +STARTCHAR U_9A7A +ENCODING 39546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +11E0 +5240 +5480 +57E0 +7820 +0820 +EBE0 +0820 +0BE0 +3020 +ENDCHAR +STARTCHAR U_9A7B +ENCODING 39547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +57E0 +5080 +5080 +7880 +0BE0 +E880 +0880 +0880 +37E0 +ENDCHAR +STARTCHAR U_9A7C +ENCODING 39548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5420 +5000 +5220 +7A40 +0B80 +EA00 +0A20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9A7D +ENCODING 39549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +5180 +3140 +4A20 +FF80 +1100 +3FC0 +0040 +7E40 +0080 +ENDCHAR +STARTCHAR U_9A7E +ENCODING 39550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +5DE0 +8000 +7F80 +1080 +1FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9A7F +ENCODING 39551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1280 +5100 +5280 +5560 +7900 +0BC0 +2900 +CFE0 +0900 +3100 +ENDCHAR +STARTCHAR U_9A80 +ENCODING 39552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1140 +5220 +57E0 +5000 +7BE0 +0A20 +EA20 +0A20 +0BE0 +3220 +ENDCHAR +STARTCHAR U_9A81 +ENCODING 39553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +17E0 +5240 +51A0 +5660 +7820 +0FE0 +EA80 +0AA0 +0CA0 +3060 +ENDCHAR +STARTCHAR U_9A82 +ENCODING 39554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +7F80 +1080 +1FE0 +0020 +FFA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_9A83 +ENCODING 39555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +52A0 +52A0 +53E0 +52A0 +7AA0 +0AA0 +2B60 +CA20 +2BE0 +1220 +ENDCHAR +STARTCHAR U_9A84 +ENCODING 39556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +1700 +5100 +57E0 +5240 +7C20 +0A40 +EA40 +0A40 +0A40 +3440 +ENDCHAR +STARTCHAR U_9A85 +ENCODING 39557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F180 +12A0 +56C0 +53A0 +52A0 +7A60 +0880 +EFE0 +0880 +0880 +3080 +ENDCHAR +STARTCHAR U_9A86 +ENCODING 39558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +13C0 +5640 +5180 +5240 +7C20 +0BC0 +EA40 +0A40 +0BC0 +3240 +ENDCHAR +STARTCHAR U_9A87 +ENCODING 39559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5100 +5240 +5780 +78A0 +0920 +EA40 +0C80 +0940 +3220 +ENDCHAR +STARTCHAR U_9A88 +ENCODING 39560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +1140 +57E0 +5140 +5140 +7FE0 +0940 +E940 +0940 +0A40 +3440 +ENDCHAR +STARTCHAR U_9A89 +ENCODING 39561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1080 +1FC0 +0040 +FE80 +73C0 +5240 +7BE0 +0820 +EBA0 +1860 +ENDCHAR +STARTCHAR U_9A8A +ENCODING 39562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2000 +AEE0 +AAA0 +AAA0 +EAA0 +2EE0 +6AA0 +AAA0 +2AA0 +6AA0 +ENDCHAR +STARTCHAR U_9A8B +ENCODING 39563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +13E0 +52A0 +53E0 +52A0 +7FE0 +0900 +EBE0 +0820 +0920 +30C0 +ENDCHAR +STARTCHAR U_9A8C +ENCODING 39564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5280 +5C60 +5380 +7800 +0A40 +3D40 +CA80 +0900 +37E0 +ENDCHAR +STARTCHAR U_9A8D +ENCODING 39565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +5440 +5280 +57E0 +7900 +0900 +EFC0 +0900 +0900 +3100 +ENDCHAR +STARTCHAR U_9A8E +ENCODING 39566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +5040 +53C0 +5040 +57E0 +7C20 +0BC0 +2A40 +C980 +2980 +1660 +ENDCHAR +STARTCHAR U_9A8F +ENCODING 39567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1240 +57E0 +5240 +5420 +7900 +0BE0 +ED40 +0880 +0940 +3620 +ENDCHAR +STARTCHAR U_9A90 +ENCODING 39568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +17E0 +5240 +53C0 +5240 +7BC0 +0A40 +EFE0 +0A80 +0C40 +3020 +ENDCHAR +STARTCHAR U_9A91 +ENCODING 39569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5140 +5220 +57E0 +7820 +0BA0 +EAA0 +0BA0 +0820 +3060 +ENDCHAR +STARTCHAR U_9A92 +ENCODING 39570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1540 +57C0 +5540 +57C0 +7900 +0FE0 +E900 +0B80 +0D40 +3120 +ENDCHAR +STARTCHAR U_9A93 +ENCODING 39571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +1280 +53E0 +5680 +53C0 +7A80 +0A80 +EBC0 +0A80 +0A80 +33E0 +ENDCHAR +STARTCHAR U_9A94 +ENCODING 39572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +5820 +57C0 +5000 +7FC0 +0900 +E940 +0D20 +0920 +3300 +ENDCHAR +STARTCHAR U_9A95 +ENCODING 39573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A140 +AFE0 +A140 +F7C0 +1540 +57C0 +9540 +5540 +2940 +ENDCHAR +STARTCHAR U_9A96 +ENCODING 39574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +17A0 +5100 +57E0 +5140 +7AA0 +0D40 +EA80 +0920 +0840 +3180 +ENDCHAR +STARTCHAR U_9A97 +ENCODING 39575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5420 +57E0 +5400 +7FE0 +0AA0 +EFE0 +0AA0 +0AA0 +3060 +ENDCHAR +STARTCHAR U_9A98 +ENCODING 39576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +75C0 +5500 +6FE0 +5540 +7980 +7F80 +2100 +3FC0 +0040 +FF40 +0180 +ENDCHAR +STARTCHAR U_9A99 +ENCODING 39577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +15A0 +5240 +5420 +5BC0 +7900 +0FE0 +2900 +CA80 +2C40 +1020 +ENDCHAR +STARTCHAR U_9A9A +ENCODING 39578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1540 +5280 +5180 +5760 +7900 +0FE0 +E920 +0FE0 +0940 +37E0 +ENDCHAR +STARTCHAR U_9A9B +ENCODING 39579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +57E0 +FA40 +6980 +A660 +7F80 +1100 +3FC0 +0040 +FE40 +0180 +ENDCHAR +STARTCHAR U_9A9C +ENCODING 39580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +4940 +BFA0 +1100 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_9A9D +ENCODING 39581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +2DE0 +A8A0 +AAA0 +ACA0 +F140 +17E0 +3520 +D7E0 +1520 +67E0 +ENDCHAR +STARTCHAR U_9A9E +ENCODING 39582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +3080 +DFE0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_9A9F +ENCODING 39583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +27E0 +A420 +A7E0 +A400 +F7E0 +14A0 +F6E0 +15A0 +1AE0 +61A0 +ENDCHAR +STARTCHAR U_9AA0 +ENCODING 39584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +AFE0 +AAA0 +AFE0 +F000 +17C0 +F000 +1FE0 +1540 +6B20 +ENDCHAR +STARTCHAR U_9AA1 +ENCODING 39585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +14A0 +57E0 +54A0 +57E0 +7900 +0FC0 +EA20 +0FE0 +0940 +3320 +ENDCHAR +STARTCHAR U_9AA2 +ENCODING 39586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5520 +56A0 +5560 +7E20 +0FE0 +EB40 +0EA0 +0A40 +31C0 +ENDCHAR +STARTCHAR U_9AA3 +ENCODING 39587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1420 +57E0 +5480 +57E0 +7C80 +0FE0 +EA40 +0FE0 +0A40 +36C0 +ENDCHAR +STARTCHAR U_9AA4 +ENCODING 39588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1520 +57A0 +5540 +57A0 +79C0 +0B20 +ED40 +0B80 +0D40 +3120 +ENDCHAR +STARTCHAR U_9AA5 +ENCODING 39589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +1140 +5760 +5000 +53E0 +7AA0 +0BE0 +E940 +0FE0 +0940 +3220 +ENDCHAR +STARTCHAR U_9AA6 +ENCODING 39590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +5FE0 +5D60 +5380 +7D40 +0AE0 +2FA0 +CAE0 +57A0 +2AE0 +ENDCHAR +STARTCHAR U_9AA7 +ENCODING 39591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +55A0 +57E0 +5140 +7FE0 +0940 +EFE0 +0AA0 +0E40 +3320 +ENDCHAR +STARTCHAR U_9AA8 +ENCODING 39592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_9AA9 +ENCODING 39593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6900 +5900 +FFC0 +8540 +7940 +4940 +7940 +4940 +7A60 +4C60 +ENDCHAR +STARTCHAR U_9AAA +ENCODING 39594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +6A80 +5A80 +FE80 +8680 +7B80 +4A80 +7A80 +4AA0 +7CA0 +48E0 +ENDCHAR +STARTCHAR U_9AAB +ENCODING 39595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +6BC0 +FD40 +8540 +7B40 +49C0 +7940 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_9AAC +ENCODING 39596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +6BC0 +5880 +FC80 +87E0 +7880 +4880 +7880 +4880 +7A80 +4900 +ENDCHAR +STARTCHAR U_9AAD +ENCODING 39597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6880 +FC80 +87E0 +7880 +4880 +7880 +4880 +7880 +4880 +ENDCHAR +STARTCHAR U_9AAE +ENCODING 39598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6980 +5940 +FDE0 +8700 +7900 +4900 +7880 +48A0 +7860 +4820 +ENDCHAR +STARTCHAR U_9AAF +ENCODING 39599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +6BE0 +FC00 +85C0 +7940 +4940 +7940 +4940 +7A40 +4C60 +ENDCHAR +STARTCHAR U_9AB0 +ENCODING 39600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4940 +6940 +FD60 +8600 +79C0 +4940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_9AB1 +ENCODING 39601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4940 +6A20 +FC00 +8540 +7940 +4940 +7940 +4940 +7A40 +4840 +ENDCHAR +STARTCHAR U_9AB2 +ENCODING 39602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6900 +5BE0 +FC20 +87A0 +7AA0 +4BA0 +7A40 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_9AB3 +ENCODING 39603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FEA0 +8680 +7BE0 +4A40 +7B40 +4A80 +7D40 +4A20 +ENDCHAR +STARTCHAR U_9AB4 +ENCODING 39604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4940 +6940 +FD60 +85C0 +7D40 +4D40 +7D40 +4D40 +7FC0 +4860 +ENDCHAR +STARTCHAR U_9AB5 +ENCODING 39605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FC80 +81C0 +79C0 +4AA0 +7FE0 +4880 +7880 +4880 +ENDCHAR +STARTCHAR U_9AB6 +ENCODING 39606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +6A80 +FE80 +87E0 +7A80 +4A80 +7A80 +4AA0 +7B60 +4AA0 +ENDCHAR +STARTCHAR U_9AB7 +ENCODING 39607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6BE0 +FC80 +8480 +7BE0 +4A20 +7A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_9AB8 +ENCODING 39608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6900 +FD40 +8780 +7920 +4A40 +7C80 +4940 +7A20 +4820 +ENDCHAR +STARTCHAR U_9AB9 +ENCODING 39609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6940 +FE20 +8540 +7940 +4940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_9ABA +ENCODING 39610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +6A00 +FFE0 +8600 +7AE0 +4AA0 +7AA0 +4AA0 +7AE0 +4CA0 +ENDCHAR +STARTCHAR U_9ABB +ENCODING 39611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6940 +FE20 +85C0 +7800 +4FE0 +7900 +4BE0 +7820 +49C0 +ENDCHAR +STARTCHAR U_9ABC +ENCODING 39612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +49C0 +6B40 +FC80 +8540 +7A20 +4FC0 +7A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_9ABD +ENCODING 39613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +6B20 +5940 +FE80 +8500 +7900 +4FE0 +7940 +4A80 +7940 +4E20 +ENDCHAR +STARTCHAR U_9ABE +ENCODING 39614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6BE0 +FEA0 +87E0 +7AA0 +4BE0 +7A80 +4900 +7A80 +4C60 +ENDCHAR +STARTCHAR U_9ABF +ENCODING 39615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4940 +6BE0 +FD40 +8540 +7BE0 +4940 +7940 +4940 +7A40 +4C40 +ENDCHAR +STARTCHAR U_9AC0 +ENCODING 39616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7940 +4FE0 +7840 +4840 +ENDCHAR +STARTCHAR U_9AC1 +ENCODING 39617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +6BE0 +FEA0 +87E0 +7880 +4BE0 +7880 +49C0 +7AA0 +4CA0 +ENDCHAR +STARTCHAR U_9AC2 +ENCODING 39618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6B20 +FDE0 +8640 +7980 +4A60 +7FC0 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_9AC3 +ENCODING 39619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6AA0 +5BE0 +FEA0 +87E0 +7880 +4BE0 +7AA0 +4BE0 +7A20 +4A60 +ENDCHAR +STARTCHAR U_9AC4 +ENCODING 39620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5900 +FFC0 +8540 +71C0 +5D40 +75C0 +5540 +7600 +59E0 +ENDCHAR +STARTCHAR U_9AC5 +ENCODING 39621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +49C0 +6BE0 +FC80 +85C0 +7AA0 +4FE0 +7940 +4940 +7880 +4B60 +ENDCHAR +STARTCHAR U_9AC6 +ENCODING 39622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78A0 +4FE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7FE0 +4A40 +7940 +4880 +ENDCHAR +STARTCHAR U_9AC7 +ENCODING 39623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +6940 +FDC0 +8400 +77E0 +5420 +75A0 +55A0 +7420 +5460 +ENDCHAR +STARTCHAR U_9AC8 +ENCODING 39624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5A40 +FD80 +87E0 +7CA0 +4FC0 +7900 +49C0 +7A40 +4C80 +ENDCHAR +STARTCHAR U_9AC9 +ENCODING 39625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5D20 +FA80 +87E0 +7A80 +4BC0 +7A80 +4BC0 +7A80 +4BE0 +ENDCHAR +STARTCHAR U_9ACA +ENCODING 39626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4940 +6BE0 +FC80 +85E0 +7880 +4FE0 +7A00 +4FC0 +7880 +4FE0 +ENDCHAR +STARTCHAR U_9ACB +ENCODING 39627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +8540 +7BE0 +4A20 +7AA0 +4A80 +79A0 +4AE0 +ENDCHAR +STARTCHAR U_9ACC +ENCODING 39628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +6820 +FFC0 +8600 +7BE0 +4A40 +7FE0 +4800 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9ACD +ENCODING 39629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +6A40 +FFE0 +8640 +7A40 +4F60 +7AE0 +4A40 +7A40 +4A40 +ENDCHAR +STARTCHAR U_9ACE +ENCODING 39630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +6DA0 +5B60 +FDA0 +8580 +7A40 +4D20 +7A80 +4940 +7880 +4B00 +ENDCHAR +STARTCHAR U_9ACF +ENCODING 39631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7FE0 +4940 +78C0 +4B20 +ENDCHAR +STARTCHAR U_9AD0 +ENCODING 39632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6880 +FFE0 +8640 +7BE0 +4A40 +7FE0 +4A80 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_9AD1 +ENCODING 39633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +6BE0 +FE00 +87E0 +78A0 +4BE0 +7AA0 +4BE0 +78A0 +4FC0 +ENDCHAR +STARTCHAR U_9AD2 +ENCODING 39634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4FE0 +6940 +FBE0 +86C0 +7D60 +4A60 +7940 +4FE0 +7940 +4A40 +ENDCHAR +STARTCHAR U_9AD3 +ENCODING 39635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6A40 +FDE0 +80A0 +7EE0 +4AA0 +7AE0 +4AA0 +7AA0 +4DE0 +ENDCHAR +STARTCHAR U_9AD4 +ENCODING 39636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +6BE0 +5AA0 +FFE0 +86A0 +7FE0 +4A40 +7BC0 +4A40 +7980 +4FE0 +ENDCHAR +STARTCHAR U_9AD5 +ENCODING 39637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6A20 +FFE0 +82A0 +7FC0 +4A40 +7BC0 +4A40 +7BC0 +4E60 +ENDCHAR +STARTCHAR U_9AD6 +ENCODING 39638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4EA0 +6BC0 +FE80 +87E0 +7A40 +4BC0 +7A40 +4BC0 +7AA0 +4CE0 +ENDCHAR +STARTCHAR U_9AD7 +ENCODING 39639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +6900 +5FE0 +FD20 +87E0 +7D20 +4EC0 +7D40 +4FE0 +7AA0 +4FE0 +ENDCHAR +STARTCHAR U_9AD8 +ENCODING 39640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +1F00 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_9AD9 +ENCODING 39641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +1F00 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_9ADA +ENCODING 39642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F900 +57E0 +5000 +FB80 +8A80 +EA80 +AA80 +EAA0 +8AA0 +9C60 +ENDCHAR +STARTCHAR U_9ADB +ENCODING 39643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +0440 +77C0 +5500 +FD00 +8FC0 +ED40 +A940 +EA40 +9C60 +ENDCHAR +STARTCHAR U_9ADC +ENCODING 39644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +53E0 +7220 +03E0 +F940 +8E40 +EA40 +AFE0 +EA40 +9C40 +ENDCHAR +STARTCHAR U_9ADD +ENCODING 39645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FAE0 +0740 +7340 +54A0 +FFE0 +8920 +EFC0 +A940 +EA40 +9CC0 +ENDCHAR +STARTCHAR U_9ADE +ENCODING 39646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +03C0 +77E0 +55A0 +FFE0 +8900 +EFE0 +AB80 +ED40 +9920 +ENDCHAR +STARTCHAR U_9ADF +ENCODING 39647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4080 +7D00 +4020 +7C40 +4080 +FF00 +2820 +4840 +F480 +0300 +ENDCHAR +STARTCHAR U_9AE0 +ENCODING 39648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +60C0 +FB00 +48C0 +FF00 +1000 +7F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_9AE1 +ENCODING 39649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FFE0 +0900 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_9AE2 +ENCODING 39650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +5300 +68C0 +FF00 +48C0 +FF00 +25C0 +FE40 +24C0 +2420 +1FE0 +ENDCHAR +STARTCHAR U_9AE3 +ENCODING 39651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_9AE4 +ENCODING 39652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FF00 +48C0 +FF00 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_9AE5 +ENCODING 39653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +48C0 +7F80 +2080 +7FC0 +2080 +7FC0 +2080 +ENDCHAR +STARTCHAR U_9AE6 +ENCODING 39654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2B80 +7C00 +07C0 +7C20 +0420 +03E0 +ENDCHAR +STARTCHAR U_9AE7 +ENCODING 39655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +8A20 +0A00 +1220 +E1E0 +ENDCHAR +STARTCHAR U_9AE8 +ENCODING 39656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +4CC0 +FB00 +0000 +7FC0 +1100 +2120 +40E0 +ENDCHAR +STARTCHAR U_9AE9 +ENCODING 39657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +48C0 +FFE0 +0400 +27C0 +2440 +3FC0 +0040 +ENDCHAR +STARTCHAR U_9AEA +ENCODING 39658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +5300 +68C0 +FF00 +48C0 +FFE0 +0800 +1F80 +2900 +C600 +39C0 +ENDCHAR +STARTCHAR U_9AEB +ENCODING 39659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7CC0 +4300 +78C0 +4300 +FCC0 +2900 +FF80 +2100 +FF80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AEC +ENCODING 39660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +4400 +FFE0 +1500 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9AED +ENCODING 39661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +F240 +5E80 +5320 +5E20 +E1E0 +ENDCHAR +STARTCHAR U_9AEE +ENCODING 39662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4A80 +FFE0 +1000 +2F80 +4500 +BAE0 +ENDCHAR +STARTCHAR U_9AEF +ENCODING 39663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4980 +5060 +FD80 +4860 +3F80 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9AF0 +ENCODING 39664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +5080 +FB00 +2500 +FFE0 +2500 +2700 +3FC0 +ENDCHAR +STARTCHAR U_9AF1 +ENCODING 39665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +78C0 +4300 +FCC0 +2900 +7FC0 +A240 +3EA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_9AF2 +ENCODING 39666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C60 +2180 +FC60 +29A0 +4440 +3FE0 +2220 +3FC0 +2480 +2300 +5CE0 +ENDCHAR +STARTCHAR U_9AF3 +ENCODING 39667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +0500 +FFE0 +1240 +E600 +ENDCHAR +STARTCHAR U_9AF4 +ENCODING 39668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +4A80 +7FC0 +0A40 +7FE0 +0A20 +1260 +2200 +ENDCHAR +STARTCHAR U_9AF5 +ENCODING 39669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6820 +FDC0 +2800 +FFE0 +0400 +7FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_9AF6 +ENCODING 39670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_9AF7 +ENCODING 39671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +4A40 +7FC0 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_9AF8 +ENCODING 39672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6840 +FDA0 +4840 +FD80 +1100 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9AF9 +ENCODING 39673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7900 +6FE0 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_9AFA +ENCODING 39674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FFE0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AFB +ENCODING 39675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4580 +FFE0 +0400 +7FC0 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AFC +ENCODING 39676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4660 +3D00 +E4E0 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9AFD +ENCODING 39677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FC80 +5540 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9AFE +ENCODING 39678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +4040 +7FC0 +4040 +41C0 +ENDCHAR +STARTCHAR U_9AFF +ENCODING 39679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6840 +FDA0 +4840 +F980 +2540 +8920 +2160 +C180 +4E00 +ENDCHAR +STARTCHAR U_9B00 +ENCODING 39680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +FC40 +4980 +FFC0 +0440 +7FC0 +4400 +7FE0 +14A0 +6440 +ENDCHAR +STARTCHAR U_9B01 +ENCODING 39681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7C40 +1140 +FF40 +5540 +92C0 +ENDCHAR +STARTCHAR U_9B02 +ENCODING 39682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +51A0 +6840 +FDA0 +4840 +FF80 +1000 +1F80 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9B03 +ENCODING 39683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FE0 +4020 +3FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_9B04 +ENCODING 39684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FFE0 +4080 +FF80 +1080 +7FC0 +1240 +6CC0 +ENDCHAR +STARTCHAR U_9B05 +ENCODING 39685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_9B06 +ENCODING 39686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FA80 +2440 +F920 +7240 +ABC0 +ENDCHAR +STARTCHAR U_9B07 +ENCODING 39687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +51A0 +6840 +FDA0 +4840 +FF80 +1100 +3F80 +44E0 +3F80 +0400 +ENDCHAR +STARTCHAR U_9B08 +ENCODING 39688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +7FC0 +1000 +FFE0 +52C0 +9FA0 +ENDCHAR +STARTCHAR U_9B09 +ENCODING 39689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5380 +6840 +FF80 +4840 +FF80 +4A40 +7FC0 +5140 +AE20 +3180 +ENDCHAR +STARTCHAR U_9B0A +ENCODING 39690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4460 +FF80 +1100 +FFE0 +5F40 +9120 +1F00 +ENDCHAR +STARTCHAR U_9B0B +ENCODING 39691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +29A0 +4440 +FFE0 +4440 +7D40 +4540 +7D40 +4CC0 +ENDCHAR +STARTCHAR U_9B0C +ENCODING 39692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4980 +F460 +3FC0 +4400 +BFE0 +9040 +1FC0 +10C0 +ENDCHAR +STARTCHAR U_9B0D +ENCODING 39693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +41A0 +FC40 +4BE0 +FE20 +13E0 +7A20 +4BE0 +7A60 +ENDCHAR +STARTCHAR U_9B0E +ENCODING 39694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FE20 +54A0 +7CA0 +3820 +D6E0 +ENDCHAR +STARTCHAR U_9B0F +ENCODING 39695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +72A0 +FAC0 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_9B10 +ENCODING 39696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +2420 +7FE0 +A080 +3F80 +ENDCHAR +STARTCHAR U_9B11 +ENCODING 39697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +C980 +3FC0 +0A80 +FFE0 +0A80 +7F80 +2A80 +CA60 +ENDCHAR +STARTCHAR U_9B12 +ENCODING 39698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4460 +FFC0 +2100 +3F00 +2100 +FFE0 +6180 +ENDCHAR +STARTCHAR U_9B13 +ENCODING 39699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4980 +FC60 +4580 +FFE0 +A120 +FFE0 +1100 +60C0 +ENDCHAR +STARTCHAR U_9B14 +ENCODING 39700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +4480 +2FC0 +7380 +2D60 +27C0 +3100 +4FE0 +ENDCHAR +STARTCHAR U_9B15 +ENCODING 39701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4B00 +FFE0 +0A00 +3F80 +2080 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_9B16 +ENCODING 39702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4B00 +7F80 +2940 +7FE0 +1500 +6AE0 +0500 +7E00 +ENDCHAR +STARTCHAR U_9B17 +ENCODING 39703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +FFE0 +1100 +7FC0 +5540 +6EC0 +45C0 +ENDCHAR +STARTCHAR U_9B18 +ENCODING 39704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7F80 +2080 +7FC0 +5240 +3F80 +0900 +76E0 +ENDCHAR +STARTCHAR U_9B19 +ENCODING 39705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7FC0 +5540 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B1A +ENCODING 39706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +7FE0 +2440 +57C0 +2440 +17C0 +EC60 +ENDCHAR +STARTCHAR U_9B1B +ENCODING 39707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5580 +6840 +FDA0 +4840 +FF80 +2A80 +3F80 +3680 +2DA0 +3760 +ENDCHAR +STARTCHAR U_9B1C +ENCODING 39708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +5180 +FC60 +4980 +FFE0 +AAA0 +FFE0 +9520 +9B20 +95A0 +A340 +ENDCHAR +STARTCHAR U_9B1D +ENCODING 39709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +FCA0 +4B40 +FBE0 +AAA0 +FFE0 +9920 +9520 +9FA0 +8040 +ENDCHAR +STARTCHAR U_9B1E +ENCODING 39710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +4B20 +7FC0 +4A40 +7FE0 +4000 +7FE0 +5140 +98E0 +ENDCHAR +STARTCHAR U_9B1F +ENCODING 39711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +7FC0 +4A40 +FFE0 +2080 +3F80 +E280 +39E0 +ENDCHAR +STARTCHAR U_9B20 +ENCODING 39712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +7CC0 +1B00 +FFE0 +5540 +7FC0 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B21 +ENCODING 39713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +FC60 +4B80 +FA00 +FFE0 +AAA0 +3F80 +2A80 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9B22 +ENCODING 39714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +FFE0 +9520 +7F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_9B23 +ENCODING 39715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7FC0 +5240 +7FC0 +4480 +7680 +45A0 +7E60 +ENDCHAR +STARTCHAR U_9B24 +ENCODING 39716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4700 +FFE0 +4A40 +FFE0 +1100 +FFE0 +5140 +B8E0 +ENDCHAR +STARTCHAR U_9B25 +ENCODING 39717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8020 +8020 +8020 +8020 +8020 +8060 +ENDCHAR +STARTCHAR U_9B26 +ENCODING 39718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +A620 +9220 +BFA0 +82A0 +8240 +ENDCHAR +STARTCHAR U_9B27 +ENCODING 39719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BFA0 +8420 +BFA0 +8420 +BFA0 +A5A0 +8460 +ENDCHAR +STARTCHAR U_9B28 +ENCODING 39720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +BFA0 +8A20 +BFA0 +8A20 +9160 +ENDCHAR +STARTCHAR U_9B29 +ENCODING 39721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +9120 +9B20 +9120 +9F20 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_9B2A +ENCODING 39722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +80A0 +FFE0 +A8A0 +BAA0 +A8A0 +FDE0 +ENDCHAR +STARTCHAR U_9B2B +ENCODING 39723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +FFA0 +AAA0 +B920 +AAA0 +FCE0 +ENDCHAR +STARTCHAR U_9B2C +ENCODING 39724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +AA20 +93E0 +AAA0 +AAA0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_9B2D +ENCODING 39725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +FFA0 +AA20 +EFE0 +AAA0 +EEA0 +AAA0 +FCE0 +ENDCHAR +STARTCHAR U_9B2E +ENCODING 39726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9220 +BFA0 +AAA0 +BBA0 +BAA0 +8BA0 +B8A0 +8FE0 +ENDCHAR +STARTCHAR U_9B2F +ENCODING 39727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +AA80 +D480 +AD80 +BA80 +C480 +FF80 +4000 +4700 +7880 +4080 +3F80 +ENDCHAR +STARTCHAR U_9B30 +ENCODING 39728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +6AC0 +A4A0 +FFE0 +A840 +5580 +7C40 +21A0 +2C40 +3380 +ENDCHAR +STARTCHAR U_9B31 +ENCODING 39729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +F5E0 +6EC0 +D540 +FFE0 +A820 +5640 +6AA0 +7F40 +40A0 +7E40 +ENDCHAR +STARTCHAR U_9B32 +ENCODING 39730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +2080 +3F80 +0000 +7FC0 +4A40 +5F40 +4440 +44C0 +ENDCHAR +STARTCHAR U_9B33 +ENCODING 39731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4240 +7FE0 +4840 +7FE0 +6520 +6FA0 +A220 +A260 +ENDCHAR +STARTCHAR U_9B34 +ENCODING 39732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +03E0 +7080 +53E0 +72A0 +03E0 +FAA0 +DBE0 +FAA0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9B35 +ENCODING 39733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +A500 +FFC0 +6340 +B540 +FFC0 +4100 +FF80 +A280 +FF80 +8B80 +ENDCHAR +STARTCHAR U_9B36 +ENCODING 39734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +2540 +F2A0 +54E0 +FFE0 +1080 +7FE0 +4920 +7FA0 +4460 +ENDCHAR +STARTCHAR U_9B37 +ENCODING 39735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +02A0 +7B60 +4A20 +79E0 +0140 +FEA0 +D5E0 +FF40 +A480 +A760 +ENDCHAR +STARTCHAR U_9B38 +ENCODING 39736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +76A0 +55A0 +76A0 +0560 +F800 +DBE0 +FAA0 +ABE0 +AAA0 +9BE0 +ENDCHAR +STARTCHAR U_9B39 +ENCODING 39737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FAC0 +2340 +FBE0 +5260 +FFC0 +1100 +7FC0 +4A40 +5F40 +44C0 +ENDCHAR +STARTCHAR U_9B3A +ENCODING 39738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +07E0 +7A40 +4BC0 +7A40 +03E0 +FEA0 +D520 +FE60 +A4A0 +AD40 +ENDCHAR +STARTCHAR U_9B3B +ENCODING 39739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D560 +4E20 +DF60 +6E20 +D560 +FFE0 +2080 +7FC0 +4A40 +7FC0 +4440 +ENDCHAR +STARTCHAR U_9B3C +ENCODING 39740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4880 +7F80 +4880 +7F80 +1480 +1540 +25C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_9B3D +ENCODING 39741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7C40 +5480 +7F20 +5440 +7D80 +2420 +2A40 +5F80 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9B3E +ENCODING 39742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +ABE0 +F880 +ABE0 +A940 +F940 +2880 +3D60 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B3F +ENCODING 39743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +F9C0 +A900 +F9E0 +A940 +F940 +2940 +3540 +2D60 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B40 +ENCODING 39744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +A980 +FA40 +AC20 +F940 +2540 +2B40 +5D40 +5260 +8FE0 +ENDCHAR +STARTCHAR U_9B41 +ENCODING 39745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FA40 +A940 +FA40 +A940 +F860 +2BC0 +3440 +2C60 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B42 +ENCODING 39746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +77C0 +0540 +07C0 +FD40 +27C0 +5200 +7B40 +C5E0 +0520 +09E0 +ENDCHAR +STARTCHAR U_9B43 +ENCODING 39747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +ABE0 +F900 +A9E0 +F920 +2AA0 +3440 +3CA0 +5120 +9FE0 +ENDCHAR +STARTCHAR U_9B44 +ENCODING 39748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +47C0 +F540 +97C0 +9540 +F7C0 +9200 +9340 +F5E0 +0520 +09E0 +ENDCHAR +STARTCHAR U_9B45 +ENCODING 39749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +ABE0 +F880 +ABE0 +F880 +29C0 +36A0 +2C80 +50A0 +9FE0 +ENDCHAR +STARTCHAR U_9B46 +ENCODING 39750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +ABE0 +FAA0 +AAA0 +FA40 +2A40 +36A0 +2F20 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B47 +ENCODING 39751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8500 +FFE0 +9480 +FFE0 +9480 +9F80 +9480 +9FA0 +8AA0 +F3E0 +ENDCHAR +STARTCHAR U_9B48 +ENCODING 39752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +F9C0 +A880 +FBE0 +AA20 +FBE0 +2A20 +37E0 +2A20 +5060 +9FE0 +ENDCHAR +STARTCHAR U_9B49 +ENCODING 39753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F940 +AFE0 +FD60 +AD60 +FEA0 +2D60 +3620 +2840 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4A +ENCODING 39754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +AFE0 +F880 +AEA0 +FAA0 +3640 +28A0 +3B20 +6020 +BFE0 +ENDCHAR +STARTCHAR U_9B4B +ENCODING 39755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +FA80 +ABE0 +FE80 +ABC0 +FA80 +2BC0 +3680 +2FE0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4C +ENCODING 39756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +2A40 +37E0 +2940 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B4D +ENCODING 39757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FEA0 +AD20 +FFE0 +AD20 +FFE0 +2D20 +35A0 +2C60 +5420 +9FE0 +ENDCHAR +STARTCHAR U_9B4E +ENCODING 39758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +AFE0 +FCA0 +AEE0 +FDA0 +2EE0 +34A0 +2CA0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4F +ENCODING 39759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27C0 +FD40 +67C0 +B540 +27C0 +F900 +4940 +53C0 +2520 +49E0 +ENDCHAR +STARTCHAR U_9B50 +ENCODING 39760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA80 +FFE0 +AAA0 +FFE0 +2AA0 +37E0 +7EC0 +6AA0 +9FE0 +ENDCHAR +STARTCHAR U_9B51 +ENCODING 39761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +AAA0 +FB60 +ABE0 +F880 +2FE0 +3560 +2FE0 +5420 +9FE0 +ENDCHAR +STARTCHAR U_9B52 +ENCODING 39762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +AFE0 +FAA0 +AFE0 +F800 +2FE0 +35C0 +2AA0 +50A0 +9FE0 +ENDCHAR +STARTCHAR U_9B53 +ENCODING 39763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +ABE0 +FAA0 +AFE0 +FAA0 +27E0 +2A80 +5FE0 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9B54 +ENCODING 39764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5240 +5FC0 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_9B55 +ENCODING 39765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FBA0 +AD40 +FBA0 +AD40 +FFE0 +2D20 +34C0 +2EC0 +5520 +9FE0 +ENDCHAR +STARTCHAR U_9B56 +ENCODING 39766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F100 +D7E0 +B520 +D7C0 +F540 +5760 +6D40 +57E0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_9B57 +ENCODING 39767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFC0 +2540 +FFC0 +2540 +FFC0 +0940 +FDA0 +AAE0 +EA80 +1C60 +ENDCHAR +STARTCHAR U_9B58 +ENCODING 39768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BD40 +A620 +9FC0 +9240 +9FC0 +8AA0 +F3E0 +ENDCHAR +STARTCHAR U_9B59 +ENCODING 39769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +BF00 +55E0 +3F40 +C540 +7F80 +2A80 +2480 +3F80 +1540 +E7E0 +ENDCHAR +STARTCHAR U_9B5A +ENCODING 39770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_9B5B +ENCODING 39771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +9120 +F920 +A920 +F920 +A920 +F920 +0220 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9B5C +ENCODING 39772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9100 +F900 +A900 +FA80 +AA80 +FA80 +0240 +AA60 +AC40 +ENDCHAR +STARTCHAR U_9B5D +ENCODING 39773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3C20 +48A0 +FCA0 +54A0 +7CA0 +54A0 +7CA0 +0020 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_9B5E +ENCODING 39774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7B00 +9080 +F880 +A880 +F880 +A880 +F940 +0140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_9B5F +ENCODING 39775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +F880 +A880 +F880 +A880 +F880 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9B60 +ENCODING 39776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7F00 +9100 +F900 +A9E0 +FF00 +A900 +F900 +0100 +A920 +A8E0 +ENDCHAR +STARTCHAR U_9B61 +ENCODING 39777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +A820 +FA20 +A920 +F920 +0020 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9B62 +ENCODING 39778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9040 +F840 +A840 +FBC0 +AA00 +FA00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B63 +ENCODING 39779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9280 +F900 +AFE0 +F920 +A940 +F900 +0100 +A900 +AB00 +ENDCHAR +STARTCHAR U_9B64 +ENCODING 39780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +92A0 +FAA0 +AEC0 +FA80 +AB80 +FA80 +02A0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_9B65 +ENCODING 39781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9240 +FA80 +AB00 +FAC0 +AA40 +FB40 +0280 +A540 +AA20 +ENDCHAR +STARTCHAR U_9B66 +ENCODING 39782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90C0 +FAA0 +AAA0 +FC80 +A8A0 +F840 +0080 +A900 +AE00 +ENDCHAR +STARTCHAR U_9B67 +ENCODING 39783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F800 +AB80 +FA80 +AA80 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B68 +ENCODING 39784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +00A0 +A8A0 +A860 +ENDCHAR +STARTCHAR U_9B69 +ENCODING 39785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FD20 +A960 +FAA0 +A8A0 +F920 +0120 +AAA0 +A840 +ENDCHAR +STARTCHAR U_9B6A +ENCODING 39786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +AAA0 +FA80 +AA80 +FA80 +0280 +AA80 +AC80 +ENDCHAR +STARTCHAR U_9B6B +ENCODING 39787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FD20 +A940 +F980 +A980 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B6C +ENCODING 39788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9200 +FA00 +ABE0 +FA20 +AB20 +FAC0 +0280 +AD40 +AA20 +ENDCHAR +STARTCHAR U_9B6D +ENCODING 39789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9000 +F800 +AFE0 +FA80 +AA80 +FA80 +0280 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B6E +ENCODING 39790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +9280 +FA80 +ABA0 +FAC0 +AA80 +FA80 +02A0 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_9B6F +ENCODING 39791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +C440 +7FC0 +4440 +7FC0 +A0A0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B70 +ENCODING 39792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AA40 +FA40 +A980 +F900 +0180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9B71 +ENCODING 39793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +9100 +FBC0 +AA40 +FA40 +AA40 +FBC0 +0040 +A840 +AFE0 +ENDCHAR +STARTCHAR U_9B72 +ENCODING 39794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +93E0 +FA20 +AA20 +FBE0 +AA00 +FA00 +0200 +AA00 +AC00 +ENDCHAR +STARTCHAR U_9B73 +ENCODING 39795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +FBE0 +AAA0 +FAA0 +AAA0 +FAA0 +02E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9B74 +ENCODING 39796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F900 +A9E0 +F920 +A920 +F920 +0220 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9B75 +ENCODING 39797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9240 +FC40 +A820 +FFC0 +A940 +F940 +0140 +AA40 +AC80 +ENDCHAR +STARTCHAR U_9B76 +ENCODING 39798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AAA0 +FAA0 +AB60 +FA20 +0220 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9B77 +ENCODING 39799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7940 +9120 +FFE0 +A900 +F980 +A980 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B78 +ENCODING 39800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7A40 +9240 +FBE0 +AA00 +FA00 +ABC0 +FA40 +0240 +AA40 +AC40 +ENDCHAR +STARTCHAR U_9B79 +ENCODING 39801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +78C0 +9700 +F900 +A9E0 +FF00 +A9E0 +FF00 +0120 +A920 +A8E0 +ENDCHAR +STARTCHAR U_9B7A +ENCODING 39802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9020 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +0020 +A820 +A8E0 +ENDCHAR +STARTCHAR U_9B7B +ENCODING 39803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FAA0 +ABE0 +F880 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_9B7C +ENCODING 39804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +A880 +FFE0 +A880 +F900 +0140 +AA20 +AFE0 +ENDCHAR +STARTCHAR U_9B7D +ENCODING 39805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A40 +9240 +FFE0 +AA40 +FA40 +ABC0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9B7E +ENCODING 39806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +9080 +F980 +AAC0 +FCA0 +A8A0 +F880 +0080 +A800 +AFE0 +ENDCHAR +STARTCHAR U_9B7F +ENCODING 39807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +AA20 +F900 +AFE0 +F840 +0280 +A900 +A880 +ENDCHAR +STARTCHAR U_9B80 +ENCODING 39808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FC20 +AA00 +FA40 +AA80 +FB00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B81 +ENCODING 39809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A40 +9200 +FFE0 +AA00 +FBC0 +AA40 +FD40 +0480 +A940 +AA20 +ENDCHAR +STARTCHAR U_9B82 +ENCODING 39810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FAA0 +AAA0 +FAA0 +AAA0 +FB60 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B83 +ENCODING 39811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9100 +FD40 +AB80 +F900 +AFE0 +F900 +0100 +AD00 +A900 +ENDCHAR +STARTCHAR U_9B84 +ENCODING 39812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +97E0 +FAA0 +AFE0 +FA80 +AFE0 +FAA0 +02E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_9B85 +ENCODING 39813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +78C0 +9240 +FA40 +AE80 +FAA0 +AB20 +FA00 +0620 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B86 +ENCODING 39814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FFE0 +1200 +3F80 +E480 +3F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9B87 +ENCODING 39815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +A880 +FFE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_9B88 +ENCODING 39816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +ABA0 +FAA0 +AAA0 +FBA0 +0020 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9B89 +ENCODING 39817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9120 +F920 +AAA0 +FC40 +ABE0 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8A +ENCODING 39818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +93E0 +FA20 +AA20 +FBE0 +AA20 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8B +ENCODING 39819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +FAA0 +02A0 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8C +ENCODING 39820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +F900 +AA40 +FFC0 +A880 +F900 +0240 +AFE0 +AA20 +ENDCHAR +STARTCHAR U_9B8D +ENCODING 39821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AAC0 +FA80 +ABE0 +FA20 +0540 +A480 +AB60 +ENDCHAR +STARTCHAR U_9B8E +ENCODING 39822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9100 +F9E0 +A900 +F900 +ABC0 +FA40 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9B8F +ENCODING 39823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9280 +FBE0 +AC80 +F880 +ABE0 +F880 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9B90 +ENCODING 39824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9200 +FA40 +AFE0 +F800 +ABC0 +FA40 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9B91 +ENCODING 39825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +ABA0 +FAA0 +ABA0 +FA40 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B92 +ENCODING 39826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +9240 +FFE0 +AA40 +FB40 +AAC0 +FA40 +0240 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_9B93 +ENCODING 39827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FD00 +A9C0 +F900 +A900 +F9C0 +0100 +A900 +A900 +ENDCHAR +STARTCHAR U_9B94 +ENCODING 39828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9200 +FA00 +ABC0 +FA40 +AA40 +FBC0 +0200 +AA00 +ABE0 +ENDCHAR +STARTCHAR U_9B95 +ENCODING 39829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +A880 +FBE0 +AA20 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B96 +ENCODING 39830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9100 +F900 +AA00 +FBC0 +AE40 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9B97 +ENCODING 39831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +9440 +FA80 +A900 +FA80 +AC60 +F900 +0080 +A900 +A880 +ENDCHAR +STARTCHAR U_9B98 +ENCODING 39832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AC0 +92A0 +FA80 +ABE0 +FE80 +AA80 +FA80 +02A0 +AA60 +AA20 +ENDCHAR +STARTCHAR U_9B99 +ENCODING 39833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7F60 +9120 +FDA0 +AB60 +F920 +AB60 +FDA0 +0120 +AD20 +AB60 +ENDCHAR +STARTCHAR U_9B9A +ENCODING 39834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +F800 +ABE0 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B9B +ENCODING 39835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90E0 +F880 +AFE0 +F880 +AAC0 +FAA0 +04A0 +A880 +A980 +ENDCHAR +STARTCHAR U_9B9C +ENCODING 39836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9200 +FBE0 +AA00 +FA00 +ABE0 +FD20 +0520 +A5E0 +A920 +ENDCHAR +STARTCHAR U_9B9D +ENCODING 39837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +7FC0 +0400 +FFE0 +2080 +DF60 +2200 +7F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9B9E +ENCODING 39838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +9100 +FFE0 +AAA0 +FAA0 +AAA0 +FAA0 +0AA0 +DA20 +A860 +ENDCHAR +STARTCHAR U_9B9F +ENCODING 39839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +FC20 +A900 +FFE0 +AA40 +FE80 +0100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_9BA0 +ENCODING 39840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FBE0 +AA00 +FAE0 +AAA0 +FAE0 +0280 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_9BA1 +ENCODING 39841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AA0 +96A0 +FAC0 +AA80 +FEC0 +AAA0 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BA2 +ENCODING 39842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_9BA3 +ENCODING 39843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7AE0 +92A0 +FAA0 +ABA0 +FAA0 +AAA0 +FBA0 +06E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9BA4 +ENCODING 39844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F20 +10A0 +1EA0 +64A0 +1820 +EF60 +1200 +7FC0 +2440 +3FC0 +D220 +ENDCHAR +STARTCHAR U_9BA5 +ENCODING 39845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FD40 +A980 +FA40 +AFE0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BA6 +ENCODING 39846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7820 +ABA0 +F820 +ABA0 +FAA0 +AAA0 +FBA0 +0820 +D820 +A860 +ENDCHAR +STARTCHAR U_9BA7 +ENCODING 39847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FBE0 +A8A0 +FBE0 +AA80 +FBE0 +00A0 +A940 +AA20 +ENDCHAR +STARTCHAR U_9BA8 +ENCODING 39848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A60 +9380 +FA20 +A9E0 +F800 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BA9 +ENCODING 39849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7A40 +97E0 +FA40 +AA40 +FFE0 +AA40 +FA40 +0240 +A440 +A840 +ENDCHAR +STARTCHAR U_9BAA +ENCODING 39850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FA00 +ABC0 +FE40 +ABC0 +FA40 +03C0 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_9BAB +ENCODING 39851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AC20 +FA40 +AA40 +F980 +0180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9BAC +ENCODING 39852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9240 +FDA0 +A800 +FFE0 +A900 +FBC0 +0040 +A940 +A880 +ENDCHAR +STARTCHAR U_9BAD +ENCODING 39853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +ABE0 +F880 +A880 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BAE +ENCODING 39854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +F880 +ABE0 +F880 +A880 +FBE0 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_9BAF +ENCODING 39855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7980 +9240 +FC20 +ABC0 +F800 +ABC0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BB0 +ENCODING 39856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FA20 +ABA0 +FAA0 +AAA0 +FBA0 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9BB1 +ENCODING 39857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9120 +F940 +AFE0 +F900 +AA40 +FF80 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9BB2 +ENCODING 39858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AC0 +92A0 +FA80 +ABE0 +FE80 +AA80 +FA80 +0340 +AB40 +AA20 +ENDCHAR +STARTCHAR U_9BB3 +ENCODING 39859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9140 +FFE0 +A900 +FBC0 +AE00 +FBC0 +0040 +A940 +A880 +ENDCHAR +STARTCHAR U_9BB4 +ENCODING 39860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +9280 +FBE0 +AA80 +FEC0 +AAA0 +FBA0 +0280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9BB5 +ENCODING 39861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +FA20 +AA20 +FBE0 +A940 +F940 +0140 +AA40 +AC60 +ENDCHAR +STARTCHAR U_9BB6 +ENCODING 39862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7940 +97E0 +F940 +ABC0 +F900 +ABE0 +FE20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9BB7 +ENCODING 39863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77C0 +9140 +FFC0 +AD00 +FFE0 +A920 +FB20 +05A0 +A940 +A900 +ENDCHAR +STARTCHAR U_9BB8 +ENCODING 39864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5240 +FC80 +ABE0 +FAA0 +ABE0 +F980 +0180 +AAA0 +A4E0 +ENDCHAR +STARTCHAR U_9BB9 +ENCODING 39865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +91C0 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +0220 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9BBA +ENCODING 39866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +0400 +FFE0 +1800 +2F00 +D200 +3FC0 +5240 +1FC0 +6520 +ENDCHAR +STARTCHAR U_9BBB +ENCODING 39867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +97E0 +FA40 +AD20 +FBE0 +AA40 +FD40 +0080 +A940 +AE20 +ENDCHAR +STARTCHAR U_9BBC +ENCODING 39868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FC20 +ABC0 +F940 +0140 +A880 +AB60 +ENDCHAR +STARTCHAR U_9BBD +ENCODING 39869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7940 +9220 +FFE0 +A880 +FBE0 +A880 +F9C0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BBE +ENCODING 39870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E00 +94A0 +FAA0 +A940 +FFE0 +AA40 +FA80 +0100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_9BBF +ENCODING 39871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7540 +9540 +FF40 +AD40 +FF40 +AD40 +FD40 +07C0 +A940 +A960 +ENDCHAR +STARTCHAR U_9BC0 +ENCODING 39872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7F80 +9100 +FA40 +AB80 +F920 +AFE0 +F880 +02C0 +ACA0 +A9A0 +ENDCHAR +STARTCHAR U_9BC1 +ENCODING 39873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +93E0 +FAA0 +ABE0 +FAA0 +ABE0 +FA80 +0180 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BC2 +ENCODING 39874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +9080 +FBE0 +AAA0 +FB60 +AA20 +FBE0 +0220 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BC3 +ENCODING 39875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +97C0 +FA40 +AA40 +FFE0 +A800 +FBC0 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9BC4 +ENCODING 39876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7920 +97E0 +F900 +AD20 +FB40 +A980 +FB40 +0520 +A920 +AB00 +ENDCHAR +STARTCHAR U_9BC5 +ENCODING 39877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +7BC0 +9240 +FA40 +AC60 +FB40 +AB40 +FB40 +05E0 +A400 +ABE0 +ENDCHAR +STARTCHAR U_9BC6 +ENCODING 39878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +03E0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_9BC7 +ENCODING 39879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FFE0 +AA80 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BC8 +ENCODING 39880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +4640 +5980 +D660 +53C0 +5480 +5FE0 +5520 +47E0 +4AA0 +ENDCHAR +STARTCHAR U_9BC9 +ENCODING 39881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BCA +ENCODING 39882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +A920 +4180 +DE00 +5100 +3FC0 +6440 +3FC0 +2440 +3FC0 +C920 +ENDCHAR +STARTCHAR U_9BCB +ENCODING 39883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7480 +90C0 +F9A0 +ADA0 +FA80 +AAA0 +FC40 +0480 +A900 +AA00 +ENDCHAR +STARTCHAR U_9BCC +ENCODING 39884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A800 +FBE0 +0220 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BCD +ENCODING 39885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +F900 +AA40 +FFE0 +A800 +FD40 +0540 +A540 +A960 +ENDCHAR +STARTCHAR U_9BCE +ENCODING 39886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +78C0 +90A0 +FFE0 +A880 +FEA0 +AAA0 +FAC0 +0EA0 +A960 +B220 +ENDCHAR +STARTCHAR U_9BCF +ENCODING 39887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4320 +7620 +92A0 +FFA0 +AAA0 +FBA0 +AEA0 +FAA0 +0220 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_9BD0 +ENCODING 39888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93C0 +F900 +A900 +FFE0 +A900 +F9C0 +0500 +A700 +A8E0 +ENDCHAR +STARTCHAR U_9BD1 +ENCODING 39889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7880 +9360 +F880 +AFE0 +F900 +ABE0 +FEA0 +02A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_9BD2 +ENCODING 39890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7940 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9BD3 +ENCODING 39891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBC0 +AA60 +FFC0 +0140 +AA40 +ACC0 +ENDCHAR +STARTCHAR U_9BD4 +ENCODING 39892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7AA0 +9540 +FAA0 +AAA0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9BD5 +ENCODING 39893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A40 +97E0 +FA40 +ABC0 +FA40 +ABC0 +FA40 +07E0 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9BD6 +ENCODING 39894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9100 +FBC0 +A900 +FFE0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BD7 +ENCODING 39895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +FFE0 +2880 +4F40 +9220 +7FC0 +2440 +3FC0 +C920 +ENDCHAR +STARTCHAR U_9BD8 +ENCODING 39896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7B00 +9100 +FFE0 +AB80 +FD40 +A920 +FFE0 +0240 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BD9 +ENCODING 39897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9240 +FBC0 +A800 +FBE0 +A840 +F880 +07E0 +A880 +A980 +ENDCHAR +STARTCHAR U_9BDA +ENCODING 39898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +97E0 +F9C0 +AAA0 +FC80 +ABE0 +F880 +07E0 +A880 +A980 +ENDCHAR +STARTCHAR U_9BDB +ENCODING 39899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +ABA0 +F920 +AFE0 +F820 +ABA0 +FAA0 +0BA0 +A820 +B060 +ENDCHAR +STARTCHAR U_9BDC +ENCODING 39900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9220 +F940 +AFE0 +F880 +AFE0 +F940 +0240 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BDD +ENCODING 39901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +94A0 +FFE0 +ACA0 +FDE0 +AD60 +FDE0 +0420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_9BDE +ENCODING 39902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FCA0 +ABE0 +FAA0 +02A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_9BDF +ENCODING 39903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +01C0 +AAA0 +ACA0 +ENDCHAR +STARTCHAR U_9BE0 +ENCODING 39904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +FAA0 +AAC0 +FDA0 +A8A0 +F980 +02C0 +ACA0 +A8A0 +ENDCHAR +STARTCHAR U_9BE1 +ENCODING 39905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +96E0 +FA80 +AA80 +FEE0 +AA80 +FA80 +06E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9BE2 +ENCODING 39906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7EE0 +9420 +FC20 +AEE0 +FC20 +AFE0 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BE3 +ENCODING 39907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7C40 +97C0 +FC40 +AFC0 +FA00 +AFE0 +FAA0 +0520 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9BE4 +ENCODING 39908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +F800 +AAA0 +FBC0 +02A0 +ABA0 +AAE0 +ENDCHAR +STARTCHAR U_9BE5 +ENCODING 39909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FFE0 +A940 +FA20 +AC80 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BE6 +ENCODING 39910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7740 +9560 +FD40 +AA40 +FDE0 +A800 +FFC0 +0440 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_9BE7 +ENCODING 39911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FC20 +07E0 +AC20 +A7E0 +ENDCHAR +STARTCHAR U_9BE8 +ENCODING 39912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9000 +FBE0 +AA20 +FBE0 +A880 +FAC0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BE9 +ENCODING 39913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9140 +FA20 +ADC0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_9BEA +ENCODING 39914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +9100 +FFE0 +AA40 +FD20 +A9C0 +FB40 +0480 +A940 +AE20 +ENDCHAR +STARTCHAR U_9BEB +ENCODING 39915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +6A00 +ABE0 +FEA0 +AAA0 +FAA0 +AEA0 +FB40 +0E40 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9BEC +ENCODING 39916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FEA0 +6920 +A440 +1F80 +2100 +FFC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9BED +ENCODING 39917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +9080 +FFE0 +A880 +FA80 +A900 +FBE0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9BEE +ENCODING 39918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9420 +FBC0 +A800 +FFE0 +A880 +FAC0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BEF +ENCODING 39919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7220 +97A0 +FA20 +AFA0 +FA20 +AFA0 +FAA0 +0AA0 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_9BF0 +ENCODING 39920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9340 +FCA0 +AFE0 +F840 +A980 +FA80 +0620 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_9BF1 +ENCODING 39921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7900 +97E0 +FD20 +AFC0 +FD20 +ACE0 +FC00 +05C0 +A940 +AA60 +ENDCHAR +STARTCHAR U_9BF2 +ENCODING 39922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7A40 +90A0 +FF00 +AA40 +FA20 +AB80 +FA80 +02C0 +AAA0 +AD20 +ENDCHAR +STARTCHAR U_9BF3 +ENCODING 39923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9200 +FA60 +AB80 +FA80 +ABE0 +FA80 +02A0 +AB60 +ACA0 +ENDCHAR +STARTCHAR U_9BF4 +ENCODING 39924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77C0 +9040 +FFC0 +A940 +FFC0 +A940 +FFC0 +0140 +A9E0 +AE20 +ENDCHAR +STARTCHAR U_9BF5 +ENCODING 39925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77C0 +9100 +FFE0 +AA80 +FD60 +AA80 +FD40 +0280 +A900 +AE00 +ENDCHAR +STARTCHAR U_9BF6 +ENCODING 39926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7CA0 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +07E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9BF7 +ENCODING 39927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FA80 +02E0 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_9BF8 +ENCODING 39928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +97E0 +FD00 +ADE0 +FE80 +AC80 +FFE0 +0480 +AD40 +A620 +ENDCHAR +STARTCHAR U_9BF9 +ENCODING 39929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +FA80 +ABE0 +FC80 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BFA +ENCODING 39930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +F940 +AFE0 +F900 +ABE0 +FE20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BFB +ENCODING 39931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FA0 +9220 +FFA0 +AAA0 +FFA0 +AAA0 +FBA0 +06A0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9BFC +ENCODING 39932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +74A0 +9760 +FC20 +AFE0 +FA80 +AD60 +FBC0 +0540 +A880 +AB60 +ENDCHAR +STARTCHAR U_9BFD +ENCODING 39933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +7AA0 +AAA0 +FEA0 +AAA0 +FEA0 +A8A0 +FCA0 +0AC0 +AD80 +A880 +ENDCHAR +STARTCHAR U_9BFE +ENCODING 39934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7A80 +93E0 +FAA0 +AFE0 +FAA0 +ABE0 +FA80 +0380 +AA80 +AB60 +ENDCHAR +STARTCHAR U_9BFF +ENCODING 39935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9820 +FFE0 +A800 +FFE0 +AAA0 +FFE0 +0AA0 +AAA0 +B260 +ENDCHAR +STARTCHAR U_9C00 +ENCODING 39936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7F20 +9540 +FBE0 +A880 +FFE0 +A900 +F9E0 +02A0 +AA40 +ADA0 +ENDCHAR +STARTCHAR U_9C01 +ENCODING 39937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A880 +FBA0 +01C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_9C02 +ENCODING 39938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7E20 +9AA0 +FEA0 +AAA0 +FEA0 +AAA0 +FAA0 +0E20 +A420 +AA60 +ENDCHAR +STARTCHAR U_9C03 +ENCODING 39939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9C04 +ENCODING 39940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +AFE0 +F880 +AA80 +FFA0 +AAA0 +FD40 +0A40 +AD60 +B0A0 +ENDCHAR +STARTCHAR U_9C05 +ENCODING 39941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F880 +AFE0 +FCA0 +07E0 +AC20 +A460 +ENDCHAR +STARTCHAR U_9C06 +ENCODING 39942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +93C0 +F900 +AFE0 +FA40 +AFE0 +FA40 +03C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C07 +ENCODING 39943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7A80 +97E0 +FAA0 +AC80 +F900 +AFE0 +F900 +0380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C08 +ENCODING 39944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7FE0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +01C0 +AAA0 +ACA0 +ENDCHAR +STARTCHAR U_9C09 +ENCODING 39945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FFE0 +A880 +F880 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9C0A +ENCODING 39946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9100 +FFE0 +AD60 +FBA0 +AFE0 +F980 +0340 +AD20 +A900 +ENDCHAR +STARTCHAR U_9C0B +ENCODING 39947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7D40 +95C0 +FD40 +ADC0 +FC80 +AFE0 +FD40 +0480 +AD40 +A7E0 +ENDCHAR +STARTCHAR U_9C0C +ENCODING 39948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +F880 +ABE0 +FAA0 +AB60 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C0D +ENCODING 39949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7E40 +9240 +FF40 +AAE0 +FB40 +AEC0 +FA40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9C0E +ENCODING 39950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +7BE0 +92A0 +FDE0 +AEA0 +FBE0 +AA80 +FFE0 +0280 +AE00 +A9E0 +ENDCHAR +STARTCHAR U_9C0F +ENCODING 39951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7800 +91C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C10 +ENCODING 39952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +75A0 +97E0 +F800 +ABC0 +F800 +AFE0 +F900 +03C0 +A840 +A980 +ENDCHAR +STARTCHAR U_9C11 +ENCODING 39953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FA00 +ABE0 +FAA0 +0520 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9C12 +ENCODING 39954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9640 +FBC0 +AA40 +FBC0 +A900 +FBE0 +0640 +A980 +AE60 +ENDCHAR +STARTCHAR U_9C13 +ENCODING 39955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +A940 +FAA0 +5620 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C14 +ENCODING 39956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +78A0 +97E0 +FC80 +AF80 +FCA0 +AFA0 +FD40 +07A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_9C15 +ENCODING 39957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +7A20 +AA20 +FEE0 +A800 +FEE0 +A8A0 +F8A0 +0E40 +A8A0 +A920 +ENDCHAR +STARTCHAR U_9C16 +ENCODING 39958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9200 +FBC0 +AC80 +FFE0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C17 +ENCODING 39959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +7AA0 +97A0 +FAE0 +AFA0 +FDA0 +ADE0 +FFA0 +00A0 +A8A0 +A960 +ENDCHAR +STARTCHAR U_9C18 +ENCODING 39960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A900 +FA40 +ABC0 +F900 +03C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_9C19 +ENCODING 39961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +97E0 +FA80 +A900 +FFE0 +AA00 +FBC0 +0640 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C1A +ENCODING 39962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AFE0 +ENDCHAR +STARTCHAR U_9C1B +ENCODING 39963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +ABE0 +FAA0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C1C +ENCODING 39964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +9280 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +0280 +AEC0 +AAA0 +ENDCHAR +STARTCHAR U_9C1D +ENCODING 39965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9240 +FBC0 +A800 +FFE0 +A820 +FBA0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_9C1E +ENCODING 39966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA00 +FBE0 +AA00 +FBE0 +02A0 +AD60 +A860 +ENDCHAR +STARTCHAR U_9C1F +ENCODING 39967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9280 +FFE0 +A920 +FFC0 +AA00 +FBC0 +0240 +A540 +A880 +ENDCHAR +STARTCHAR U_9C20 +ENCODING 39968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7D40 +9280 +F900 +AEE0 +F900 +AFC0 +FD40 +07C0 +A920 +AFE0 +ENDCHAR +STARTCHAR U_9C21 +ENCODING 39969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7AE0 +93A0 +FAA0 +AB60 +F800 +ABE0 +FAA0 +53E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C22 +ENCODING 39970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A80 +93C0 +FA80 +ABC0 +FA80 +ABE0 +FAA0 +0560 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9C23 +ENCODING 39971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9A80 +FBE0 +AE40 +FBE0 +AA40 +FB40 +0EC0 +5040 +A8C0 +ENDCHAR +STARTCHAR U_9C24 +ENCODING 39972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +7E80 +9A80 +FBE0 +AEA0 +FAA0 +AEA0 +FAA0 +5AE0 +AE80 +A080 +ENDCHAR +STARTCHAR U_9C25 +ENCODING 39973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +9FE0 +F900 +AB40 +FD20 +A900 +FB40 +5520 +A920 +A900 +ENDCHAR +STARTCHAR U_9C26 +ENCODING 39974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7A80 +9000 +FFE0 +AA40 +FC80 +AFE0 +FA40 +04A0 +AFE0 +A920 +ENDCHAR +STARTCHAR U_9C27 +ENCODING 39975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +AFC0 +A200 +FFE0 +A880 +B760 +E900 +AF80 +AA80 +AF80 +B540 +ENDCHAR +STARTCHAR U_9C28 +ENCODING 39976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FDA0 +5360 +ADA0 +AA60 +ENDCHAR +STARTCHAR U_9C29 +ENCODING 39977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7BA0 +92A0 +F940 +AA00 +FBE0 +AC80 +FFE0 +5080 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C2A +ENCODING 39978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9100 +FFE0 +AA40 +FFE0 +A820 +FBE0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C2B +ENCODING 39979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FA40 +ADA0 +FA40 +AC20 +FBC0 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C2C +ENCODING 39980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7880 +93E0 +FAA0 +ABE0 +FA80 +ABE0 +FB40 +5540 +AC80 +AB60 +ENDCHAR +STARTCHAR U_9C2D +ENCODING 39981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FA0 +9140 +FFE0 +AA80 +FF20 +ABE0 +FA20 +53E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C2E +ENCODING 39982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +9360 +FA20 +ABE0 +F800 +ABE0 +FAA0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C2F +ENCODING 39983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +9120 +FBE0 +AA80 +FBE0 +A920 +FDA0 +0360 +ADA0 +AB60 +ENDCHAR +STARTCHAR U_9C30 +ENCODING 39984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7280 +9FE0 +FAA0 +ABE0 +FEA0 +ABE0 +FA80 +0280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9C31 +ENCODING 39985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +96A0 +FBE0 +AEA0 +FBE0 +AA80 +FBE0 +5280 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_9C32 +ENCODING 39986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FF40 +4880 +9340 +3FE0 +6240 +BFC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9C33 +ENCODING 39987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7F80 +9480 +FFE0 +AAA0 +FFA0 +AAA0 +FFA0 +52A0 +AF20 +AA60 +ENDCHAR +STARTCHAR U_9C34 +ENCODING 39988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6A80 +BE80 +00E0 +7EA0 +D2A0 +7EA0 +6AA0 +7EA0 +6A40 +7EA0 +5520 +ENDCHAR +STARTCHAR U_9C35 +ENCODING 39989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3D00 +55E0 +FE40 +5580 +7E60 +1700 +0A00 +3F80 +1480 +1F80 +6AC0 +ENDCHAR +STARTCHAR U_9C36 +ENCODING 39990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +96A0 +FD40 +AA20 +FDC0 +A800 +FFE0 +5080 +AAC0 +ADA0 +ENDCHAR +STARTCHAR U_9C37 +ENCODING 39991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +75E0 +9B40 +FAC0 +AB20 +FA80 +ABE0 +FA80 +59C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_9C38 +ENCODING 39992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7400 +95C0 +FD40 +ADC0 +FC00 +AFE0 +FEA0 +07E0 +A400 +A7E0 +ENDCHAR +STARTCHAR U_9C39 +ENCODING 39993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FE0 +AAA0 +FFA0 +A9A0 +FF40 +AA40 +FFA0 +0920 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_9C3A +ENCODING 39994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FC0 +9240 +FCA0 +AFE0 +FA40 +AD20 +FA80 +0140 +A880 +AF00 +ENDCHAR +STARTCHAR U_9C3B +ENCODING 39995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FAA0 +AFE0 +FA40 +5180 +A980 +AE60 +ENDCHAR +STARTCHAR U_9C3C +ENCODING 39996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7920 +95A0 +FB60 +ADA0 +F900 +ABE0 +FA20 +53E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C3D +ENCODING 39997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77E0 +9280 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C3E +ENCODING 39998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7280 +9FE0 +FAA0 +AFE0 +F800 +AFC0 +F800 +57E0 +AD40 +AB20 +ENDCHAR +STARTCHAR U_9C3F +ENCODING 39999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9080 +FBE0 +A880 +FFE0 +AA40 +FBC0 +5240 +ABC0 +AE60 +ENDCHAR +STARTCHAR U_9C40 +ENCODING 40000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +F7E0 +9120 +EDE0 +1FC0 +6440 +BFC0 +2440 +7FC0 +9120 +ENDCHAR +STARTCHAR U_9C41 +ENCODING 40001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +7A80 +92A0 +F940 +AEC0 +FB40 +AAE0 +FB40 +5240 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_9C42 +ENCODING 40002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +72E0 +AB20 +FAC0 +AE80 +FB40 +AFE0 +FA40 +0B40 +AA40 +B2C0 +ENDCHAR +STARTCHAR U_9C43 +ENCODING 40003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9100 +FFC0 +A900 +FFE0 +ABC0 +FD40 +07C0 +A940 +A7E0 +ENDCHAR +STARTCHAR U_9C44 +ENCODING 40004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9540 +FFC0 +AD40 +FFC0 +A920 +FFE0 +5440 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C45 +ENCODING 40005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +92A0 +FBE0 +AAA0 +FBE0 +AA80 +FBE0 +06A0 +A7E0 +AAA0 +ENDCHAR +STARTCHAR U_9C46 +ENCODING 40006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9140 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +5080 +AFE0 +A880 +ENDCHAR +STARTCHAR U_9C47 +ENCODING 40007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9280 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +A5C0 +AAA0 +ENDCHAR +STARTCHAR U_9C48 +ENCODING 40008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +97E0 +FD20 +AB40 +FD20 +AFE0 +F820 +53E0 +A820 +ABE0 +ENDCHAR +STARTCHAR U_9C49 +ENCODING 40009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +B740 +DC80 +8960 +1FC0 +6240 +BFC0 +2240 +3FC0 +4920 +ENDCHAR +STARTCHAR U_9C4A +ENCODING 40010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7140 +97E0 +FAA0 +AC80 +FFE0 +AAA0 +FC60 +5BA0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C4B +ENCODING 40011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7900 +97E0 +FD20 +AFC0 +FD20 +ADE0 +FD40 +5760 +A940 +AFE0 +ENDCHAR +STARTCHAR U_9C4C +ENCODING 40012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7240 +97E0 +FAA0 +ABE0 +F900 +AAA0 +FD40 +52E0 +A960 +AAC0 +ENDCHAR +STARTCHAR U_9C4D +ENCODING 40013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +75A0 +9240 +FFE0 +A940 +FB60 +AA80 +FBE0 +51A0 +A940 +AEA0 +ENDCHAR +STARTCHAR U_9C4E +ENCODING 40014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7900 +97E0 +FA40 +AFA0 +FA80 +AFE0 +F820 +5BA0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C4F +ENCODING 40015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7280 +AFE0 +F2A0 +BFE0 +D640 +B540 +F7C0 +0100 +DFE0 +A100 +ENDCHAR +STARTCHAR U_9C50 +ENCODING 40016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7940 +97E0 +F940 +AFE0 +F920 +AFE0 +F920 +57E0 +A920 +A920 +ENDCHAR +STARTCHAR U_9C51 +ENCODING 40017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9140 +FFE0 +A880 +FBE0 +AAA0 +FBE0 +02A0 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9C52 +ENCODING 40018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +77E0 +9140 +FBE0 +AAA0 +FB60 +ABE0 +F840 +57E0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C53 +ENCODING 40019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +F800 +ABE0 +FAA0 +ABE0 +FAA0 +07E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9C54 +ENCODING 40020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9080 +FBE0 +A880 +FFE0 +A940 +FFE0 +5240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C55 +ENCODING 40021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +91C0 +FFE0 +AAC0 +FCA0 +ABE0 +FAA0 +53E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C56 +ENCODING 40022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6D40 +AA40 +FFE0 +AAA0 +FAC0 +AFC0 +FA40 +5A40 +AAA0 +B520 +ENDCHAR +STARTCHAR U_9C57 +ENCODING 40023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +53E0 +AA40 +AC40 +ENDCHAR +STARTCHAR U_9C58 +ENCODING 40024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FAA0 +AFE0 +F840 +57E0 +A940 +A8C0 +ENDCHAR +STARTCHAR U_9C59 +ENCODING 40025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9100 +FFE0 +AA40 +FFE0 +AA40 +FFE0 +5280 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_9C5A +ENCODING 40026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9080 +FFE0 +AA20 +FBE0 +AA20 +F940 +07E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C5B +ENCODING 40027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +96A0 +FDA0 +AFE0 +F800 +ABC0 +FA40 +03C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C5C +ENCODING 40028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7780 +AAE0 +FBA0 +AEA0 +FBC0 +AAA0 +FEA0 +07E0 +AA80 +B080 +ENDCHAR +STARTCHAR U_9C5D +ENCODING 40029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9540 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AE60 +ENDCHAR +STARTCHAR U_9C5E +ENCODING 40030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6AA0 +BFE0 +F800 +AFE0 +FA40 +ABC0 +F920 +56C0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_9C5F +ENCODING 40031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +FFE0 +9220 +3FC0 +6440 +3FC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9C60 +ENCODING 40032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +7440 +9BA0 +F800 +AFE0 +FAA0 +AFE0 +FC40 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_9C61 +ENCODING 40033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +6E60 +AA40 +FFE0 +AA40 +FF40 +ABE0 +FF40 +0540 +AAA0 +A120 +ENDCHAR +STARTCHAR U_9C62 +ENCODING 40034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7240 +9240 +FFE0 +AAA0 +FEE0 +A900 +FFE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C63 +ENCODING 40035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +95A0 +FC20 +AFE0 +FA40 +ABC0 +FA40 +53C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_9C64 +ENCODING 40036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7BE0 +9240 +FBC0 +AA60 +FBC0 +AAC0 +FBA0 +0280 +A560 +AAC0 +ENDCHAR +STARTCHAR U_9C65 +ENCODING 40037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AE0 +9280 +FFE0 +A880 +FFE0 +ACA0 +FF40 +0540 +ABA0 +AD20 +ENDCHAR +STARTCHAR U_9C66 +ENCODING 40038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +9FE0 +F280 +AEE0 +FAA0 +AEE0 +FAA0 +56E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C67 +ENCODING 40039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +6FE0 +AAA0 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +5240 +A980 +AFE0 +ENDCHAR +STARTCHAR U_9C68 +ENCODING 40040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +6FE0 +AAA0 +FBA0 +AA80 +FB20 +ABE0 +FA40 +53C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C69 +ENCODING 40041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +97E0 +FCA0 +AAC0 +FCA0 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C6A +ENCODING 40042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +F900 +AFE0 +F940 +AFE0 +FA40 +07C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C6B +ENCODING 40043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7F20 +9540 +FFE0 +ACA0 +FBC0 +AD20 +FBC0 +0680 +A900 +AEE0 +ENDCHAR +STARTCHAR U_9C6C +ENCODING 40044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +AFE0 +F920 +AB80 +FD40 +AFE0 +F900 +0FE0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9C6D +ENCODING 40045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +92A0 +FD40 +AB60 +FD40 +A940 +FFC0 +5440 +A7C0 +A840 +ENDCHAR +STARTCHAR U_9C6E +ENCODING 40046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D60 +69A0 +AD60 +F9A0 +AAA0 +FEE0 +AAA0 +FFE0 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_9C6F +ENCODING 40047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBE0 +AA80 +FFE0 +AA80 +FBE0 +0140 +A880 +AB60 +ENDCHAR +STARTCHAR U_9C70 +ENCODING 40048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7CA0 +97E0 +F900 +AFE0 +F940 +AFE0 +FA40 +07C0 +AE40 +ABC0 +ENDCHAR +STARTCHAR U_9C71 +ENCODING 40049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6A80 +AFE0 +FA80 +AFC0 +F940 +AFE0 +F920 +59E0 +AF20 +A860 +ENDCHAR +STARTCHAR U_9C72 +ENCODING 40050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7D40 +92A0 +F800 +ABE0 +FAA0 +ABE0 +FAC0 +03A0 +AAE0 +ABA0 +ENDCHAR +STARTCHAR U_9C73 +ENCODING 40051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +6BC0 +AEA0 +FBE0 +AAC0 +FFE0 +A900 +FFE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C74 +ENCODING 40052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FFE0 +AAA0 +FFE0 +A8A0 +FFE0 +54C0 +AEA0 +A960 +ENDCHAR +STARTCHAR U_9C75 +ENCODING 40053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +77E0 +9AA0 +FFE0 +A880 +FFA0 +A8A0 +FEA0 +5A40 +AEC0 +B120 +ENDCHAR +STARTCHAR U_9C76 +ENCODING 40054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77E0 +9100 +FBE0 +A900 +FFE0 +AA40 +FFE0 +0640 +ABC0 +AA60 +ENDCHAR +STARTCHAR U_9C77 +ENCODING 40055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +93E0 +FAA0 +AFE0 +F880 +ABE0 +FAA0 +53E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9C78 +ENCODING 40056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7100 +97E0 +FD20 +AFE0 +FD40 +AFC0 +FD40 +57E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C79 +ENCODING 40057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7940 +97E0 +FD20 +AFE0 +FA80 +AFE0 +FA80 +53E0 +AA80 +ABE0 +ENDCHAR +STARTCHAR U_9C7A +ENCODING 40058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +6000 +AFE0 +FAA0 +AFE0 +FAA0 +AFE0 +FCA0 +5FC0 +A4A0 +A7E0 +ENDCHAR +STARTCHAR U_9C7B +ENCODING 40059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1200 +3F80 +5480 +1FC0 +65A0 +A280 +FBE0 +AAA0 +FBE0 +A520 +ENDCHAR +STARTCHAR U_9C7C +ENCODING 40060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A240 +3FC0 +2240 +3FC0 +2040 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C7D +ENCODING 40061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9120 +F920 +A920 +F920 +A920 +F920 +0220 +1AA0 +E440 +ENDCHAR +STARTCHAR U_9C7E +ENCODING 40062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9040 +F840 +ABC0 +FA00 +AA00 +FA00 +0220 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C7F +ENCODING 40063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7920 +9100 +FFE0 +A900 +F900 +A980 +F980 +02A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_9C80 +ENCODING 40064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +00A0 +18A0 +E060 +ENDCHAR +STARTCHAR U_9C81 +ENCODING 40065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_9C82 +ENCODING 40066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F900 +A9E0 +F920 +A920 +F920 +0220 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_9C83 +ENCODING 40067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +92A0 +FAA0 +AAA0 +FBE0 +AA00 +FA00 +0220 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C84 +ENCODING 40068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9040 +F840 +AF40 +FD40 +AF40 +F840 +0040 +3940 +C080 +ENDCHAR +STARTCHAR U_9C85 +ENCODING 40069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A40 +9200 +FFE0 +AA00 +FBC0 +AA40 +FB40 +0480 +3940 +CA20 +ENDCHAR +STARTCHAR U_9C86 +ENCODING 40070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +94A0 +FAA0 +AAC0 +F880 +AFE0 +F880 +0080 +3880 +C080 +ENDCHAR +STARTCHAR U_9C87 +ENCODING 40071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90E0 +F880 +A880 +FBE0 +AA20 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C88 +ENCODING 40072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9100 +FBE0 +AA20 +FA20 +ABE0 +FA00 +0200 +3400 +C800 +ENDCHAR +STARTCHAR U_9C89 +ENCODING 40073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +FAA0 +02A0 +3AA0 +C3E0 +ENDCHAR +STARTCHAR U_9C8A +ENCODING 40074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FD00 +A900 +F9E0 +A900 +F9E0 +0100 +1900 +E100 +ENDCHAR +STARTCHAR U_9C8B +ENCODING 40075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +9240 +FBE0 +AE40 +FB40 +AAC0 +FA40 +0240 +3A40 +C2C0 +ENDCHAR +STARTCHAR U_9C8C +ENCODING 40076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +93E0 +FA20 +AA20 +FA20 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C8D +ENCODING 40077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9420 +FBA0 +AAA0 +FAA0 +ABA0 +FA60 +0200 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C8E +ENCODING 40078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1280 +FFE0 +9120 +3F80 +6480 +BF80 +2480 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C8F +ENCODING 40079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AA80 +FBE0 +AA20 +FB40 +0280 +3AC0 +C520 +ENDCHAR +STARTCHAR U_9C90 +ENCODING 40080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9240 +FA20 +AFE0 +F800 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C91 +ENCODING 40081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AFE0 +F880 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9C92 +ENCODING 40082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +F800 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C93 +ENCODING 40083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9140 +FFE0 +A900 +FBE0 +AD00 +F9E0 +0020 +38A0 +C040 +ENDCHAR +STARTCHAR U_9C94 +ENCODING 40084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FA00 +AFC0 +FA40 +ABC0 +FA40 +03C0 +3A40 +C2C0 +ENDCHAR +STARTCHAR U_9C95 +ENCODING 40085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +9200 +FFE0 +AAA0 +FAA0 +AAA0 +FAA0 +0AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9C96 +ENCODING 40086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93A0 +FA20 +ABA0 +FAA0 +ABA0 +FA20 +0220 +3A20 +C260 +ENDCHAR +STARTCHAR U_9C97 +ENCODING 40087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7FA0 +98A0 +FAA0 +AAA0 +FAA0 +AAA0 +FA20 +0220 +3520 +C860 +ENDCHAR +STARTCHAR U_9C98 +ENCODING 40088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +7B00 +9400 +FC00 +AFE0 +FC00 +AFE0 +FE20 +0620 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_9C99 +ENCODING 40089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9240 +FC20 +ABC0 +F800 +AFE0 +F900 +0200 +1C40 +E7E0 +ENDCHAR +STARTCHAR U_9C9A +ENCODING 40090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9240 +F980 +A980 +FE60 +AA40 +FA40 +0240 +3A40 +C440 +ENDCHAR +STARTCHAR U_9C9B +ENCODING 40091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AC20 +FA40 +AA40 +F980 +0180 +1A40 +E420 +ENDCHAR +STARTCHAR U_9C9C +ENCODING 40092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +F880 +ABE0 +F880 +A880 +FFE0 +0080 +3880 +C080 +ENDCHAR +STARTCHAR U_9C9D +ENCODING 40093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F00 +0800 +FFE0 +2900 +5200 +BF80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9C9E +ENCODING 40094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FC0 +0800 +FFE0 +2A80 +52C0 +BFA0 +2480 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C9F +ENCODING 40095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7820 +93E0 +F820 +ABE0 +F840 +AFE0 +FA40 +0140 +3840 +C0C0 +ENDCHAR +STARTCHAR U_9CA0 +ENCODING 40096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +93E0 +FAA0 +ABE0 +FAA0 +ABE0 +FA80 +0180 +3A40 +C420 +ENDCHAR +STARTCHAR U_9CA1 +ENCODING 40097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93E0 +FAA0 +AAA0 +FBA0 +AAE0 +FAA0 +02A0 +3AA0 +C2A0 +ENDCHAR +STARTCHAR U_9CA2 +ENCODING 40098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7DE0 +9280 +F940 +AFE0 +FA40 +ABE0 +FA40 +0240 +3B40 +C4E0 +ENDCHAR +STARTCHAR U_9CA3 +ENCODING 40099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7AE0 +AAA0 +FAA0 +AA40 +FAA0 +A900 +F7C0 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9CA4 +ENCODING 40100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9CA5 +ENCODING 40101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7E40 +9A40 +FBE0 +AE40 +FB40 +AAC0 +FA40 +0E40 +3040 +C0C0 +ENDCHAR +STARTCHAR U_9CA6 +ENCODING 40102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9540 +F880 +AB60 +F880 +AFE0 +F880 +02C0 +3CA0 +C180 +ENDCHAR +STARTCHAR U_9CA7 +ENCODING 40103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7F80 +9100 +FA40 +AF80 +F940 +AFA0 +F880 +02C0 +34A0 +C9A0 +ENDCHAR +STARTCHAR U_9CA8 +ENCODING 40104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +5920 +2FC0 +D200 +7FC0 +2440 +7FC0 +2440 +3FC0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9CA9 +ENCODING 40105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FFE0 +AA80 +FA80 +0280 +34A0 +C860 +ENDCHAR +STARTCHAR U_9CAA +ENCODING 40106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9140 +FFE0 +A940 +FFC0 +AA00 +FFC0 +0240 +1A40 +E3C0 +ENDCHAR +STARTCHAR U_9CAB +ENCODING 40107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +6EE0 +AAA0 +FEA0 +AAA0 +FEA0 +A8A0 +FAA0 +0DE0 +3880 +C080 +ENDCHAR +STARTCHAR U_9CAC +ENCODING 40108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7940 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +1AA0 +E260 +ENDCHAR +STARTCHAR U_9CAD +ENCODING 40109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9100 +FFC0 +A900 +FFE0 +AA40 +FBC0 +0240 +3BC0 +C240 +ENDCHAR +STARTCHAR U_9CAE +ENCODING 40110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +9100 +FFE0 +AA40 +FC20 +ABC0 +FE40 +0180 +3980 +C660 +ENDCHAR +STARTCHAR U_9CAF +ENCODING 40111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBC0 +AA40 +FBC0 +AA40 +FFE0 +0000 +3A40 +C420 +ENDCHAR +STARTCHAR U_9CB0 +ENCODING 40112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +6A00 +ABE0 +FEA0 +AAA0 +FAA0 +AEA0 +FA40 +0F40 +32A0 +C320 +ENDCHAR +STARTCHAR U_9CB1 +ENCODING 40113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +96E0 +FA80 +AA80 +FEE0 +AA80 +FA80 +06E0 +3A80 +C280 +ENDCHAR +STARTCHAR U_9CB2 +ENCODING 40114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +FA80 +AAA0 +FBC0 +02A0 +3BA0 +C2E0 +ENDCHAR +STARTCHAR U_9CB3 +ENCODING 40115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FC20 +07E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_9CB4 +ENCODING 40116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +A920 +FFE0 +A920 +FBA0 +AAA0 +FAA0 +0BA0 +3820 +CFE0 +ENDCHAR +STARTCHAR U_9CB5 +ENCODING 40117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7EE0 +9420 +FEE0 +AC20 +FFE0 +AA80 +FA80 +0480 +34A0 +C860 +ENDCHAR +STARTCHAR U_9CB6 +ENCODING 40118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7940 +9320 +FC80 +ABE0 +F840 +A880 +FB40 +06A0 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9CB7 +ENCODING 40119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +ABA0 +F920 +AFE0 +F820 +ABA0 +FAA0 +0BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9CB8 +ENCODING 40120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9000 +FBE0 +AA20 +FBE0 +A880 +FAC0 +02A0 +3CA0 +C180 +ENDCHAR +STARTCHAR U_9CB9 +ENCODING 40121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +97C0 +F900 +AFE0 +FA40 +AD20 +FA80 +0140 +3880 +C700 +ENDCHAR +STARTCHAR U_9CBA +ENCODING 40122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7840 +97C0 +F940 +AFC0 +FD40 +AFC0 +F940 +0140 +39A0 +C620 +ENDCHAR +STARTCHAR U_9CBB +ENCODING 40123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7AA0 +9540 +FD40 +AAA0 +F800 +AFE0 +FD20 +07E0 +3D20 +C7E0 +ENDCHAR +STARTCHAR U_9CBC +ENCODING 40124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9140 +FFE0 +A940 +FBE0 +AAA0 +FAA0 +02A0 +3940 +C620 +ENDCHAR +STARTCHAR U_9CBD +ENCODING 40125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7FE0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +01C0 +3AA0 +C4A0 +ENDCHAR +STARTCHAR U_9CBE +ENCODING 40126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93C0 +FA40 +ABC0 +F800 +AFE0 +FD20 +07E0 +1D20 +E7E0 +ENDCHAR +STARTCHAR U_9CBF +ENCODING 40127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D20 +9340 +FFE0 +AC20 +FBC0 +A800 +FFE0 +0100 +1A40 +E7E0 +ENDCHAR +STARTCHAR U_9CC0 +ENCODING 40128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +F900 +05C0 +3500 +CBE0 +ENDCHAR +STARTCHAR U_9CC1 +ENCODING 40129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FAA0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_9CC2 +ENCODING 40130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +0240 +1B40 +E220 +ENDCHAR +STARTCHAR U_9CC3 +ENCODING 40131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +A900 +FAC0 +0620 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9CC4 +ENCODING 40132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7DA0 +97E0 +F800 +ABC0 +F800 +AFE0 +F900 +03E0 +3820 +C1C0 +ENDCHAR +STARTCHAR U_9CC5 +ENCODING 40133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7E40 +9240 +FFE0 +AA40 +FF40 +AAC0 +FA40 +0240 +3AA0 +C320 +ENDCHAR +STARTCHAR U_9CC6 +ENCODING 40134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9640 +FBC0 +AA40 +FBC0 +AA00 +FBC0 +0640 +3980 +C660 +ENDCHAR +STARTCHAR U_9CC7 +ENCODING 40135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FFE0 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9CC8 +ENCODING 40136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A880 +FEA0 +02C0 +3AA0 +C5A0 +ENDCHAR +STARTCHAR U_9CC9 +ENCODING 40137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AE0 +93A0 +FF40 +AAA0 +FBE0 +AE20 +FAA0 +02A0 +1A20 +E260 +ENDCHAR +STARTCHAR U_9CCA +ENCODING 40138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9820 +FFE0 +A800 +FFE0 +AAA0 +FFE0 +0AA0 +3AA0 +D060 +ENDCHAR +STARTCHAR U_9CCB +ENCODING 40139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7D40 +9280 +F980 +AE60 +F900 +AFC0 +FD40 +07C0 +3120 +CFE0 +ENDCHAR +STARTCHAR U_9CCC +ENCODING 40140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +21E0 +FA40 +2180 +7940 +8A20 +3F80 +6480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CCD +ENCODING 40141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +7FA0 +9140 +FFE0 +AA40 +FEA0 +ABE0 +FA20 +03E0 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9CCE +ENCODING 40142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FDA0 +0360 +3DA0 +C360 +ENDCHAR +STARTCHAR U_9CCF +ENCODING 40143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7AA0 +97E0 +F800 +A900 +FB40 +AD20 +FB40 +0520 +3920 +C100 +ENDCHAR +STARTCHAR U_9CD0 +ENCODING 40144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7F20 +9520 +FAC0 +AA00 +FBE0 +AC80 +FFE0 +0080 +3CA0 +C7E0 +ENDCHAR +STARTCHAR U_9CD1 +ENCODING 40145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9240 +FFE0 +A920 +F880 +AFE0 +F900 +01E0 +3A20 +C460 +ENDCHAR +STARTCHAR U_9CD2 +ENCODING 40146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +9280 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +0280 +36C0 +CAA0 +ENDCHAR +STARTCHAR U_9CD3 +ENCODING 40147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +7F80 +AA80 +EFE0 +A4A0 +FFA0 +A4A0 +FFA0 +04A0 +3FA0 +C540 +ENDCHAR +STARTCHAR U_9CD4 +ENCODING 40148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7280 +AFE0 +FAA0 +AFE0 +F800 +ABC0 +F800 +07E0 +3940 +CB20 +ENDCHAR +STARTCHAR U_9CD5 +ENCODING 40149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +9FE0 +F920 +ABA0 +FD40 +AFE0 +F820 +03E0 +3020 +C7E0 +ENDCHAR +STARTCHAR U_9CD6 +ENCODING 40150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +69E0 +FF40 +B540 +EC80 +A560 +7F80 +A480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CD7 +ENCODING 40151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FAA0 +AFE0 +FC20 +0240 +3980 +C660 +ENDCHAR +STARTCHAR U_9CD8 +ENCODING 40152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +AB40 +FC80 +A940 +FE20 +7F80 +A480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CD9 +ENCODING 40153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9540 +FFE0 +AD40 +FFE0 +AD20 +FFE0 +0D20 +37E0 +D520 +ENDCHAR +STARTCHAR U_9CDA +ENCODING 40154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +7920 +9F20 +F8E0 +AF20 +F8A0 +AF60 +FA20 +0F20 +3AA0 +D660 +ENDCHAR +STARTCHAR U_9CDB +ENCODING 40155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7DA0 +9360 +FDA0 +A920 +FA00 +AFE0 +FC20 +07E0 +1C20 +E7E0 +ENDCHAR +STARTCHAR U_9CDC +ENCODING 40156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AC0 +9940 +FFE0 +A920 +F940 +AD40 +FFC0 +0940 +32A0 +C520 +ENDCHAR +STARTCHAR U_9CDD +ENCODING 40157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9100 +FFE0 +A900 +FFE0 +AD40 +FFE0 +0440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9CDE +ENCODING 40158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7B40 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +0BE0 +3240 +C440 +ENDCHAR +STARTCHAR U_9CDF +ENCODING 40159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9280 +FFE0 +AAA0 +FCE0 +AFE0 +F840 +07E0 +1A40 +E1C0 +ENDCHAR +STARTCHAR U_9CE0 +ENCODING 40160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBE0 +AE40 +FBE0 +AA40 +FBE0 +0240 +1980 +E660 +ENDCHAR +STARTCHAR U_9CE1 +ENCODING 40161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +7FE0 +9480 +FF80 +ACA0 +FFA0 +AD40 +FAA0 +0540 +3A60 +CBC0 +ENDCHAR +STARTCHAR U_9CE2 +ENCODING 40162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7FE0 +9AA0 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +0440 +3280 +CFE0 +ENDCHAR +STARTCHAR U_9CE3 +ENCODING 40163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +92A0 +FAA0 +ABA0 +F820 +AFE0 +FA40 +03C0 +3A40 +C7E0 +ENDCHAR +STARTCHAR U_9CE4 +ENCODING 40164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7BE0 +96C0 +F920 +AFE0 +FC20 +ABC0 +FA40 +03E0 +1A20 +E3E0 +ENDCHAR +STARTCHAR U_9CE5 +ENCODING 40165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +5520 +4AA0 +8040 +ENDCHAR +STARTCHAR U_9CE6 +ENCODING 40166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8840 +F840 +8880 +FC80 +8100 +FD00 +0620 +AE20 +A9E0 +ENDCHAR +STARTCHAR U_9CE7 +ENCODING 40167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +52A0 +9F40 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_9CE8 +ENCODING 40168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4900 +7BE0 +4920 +7D20 +4120 +7D20 +0520 +D6A0 +AA40 +ENDCHAR +STARTCHAR U_9CE9 +ENCODING 40169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +57C0 +5440 +57E0 +5400 +5FE0 +5560 +8AA0 +0040 +ENDCHAR +STARTCHAR U_9CEA +ENCODING 40170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8200 +8F80 +8880 +CF80 +A880 +8FC0 +8800 +8FC0 +9540 +AAC0 +8080 +ENDCHAR +STARTCHAR U_9CEB +ENCODING 40171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FE0 +2800 +4FE0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_9CEC +ENCODING 40172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F80 +4000 +7F80 +2480 +2440 +C3C0 +ENDCHAR +STARTCHAR U_9CED +ENCODING 40173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +4A40 +4BC0 +4A40 +4BE0 +4A00 +4BE0 +4AA0 +6D60 +9040 +ENDCHAR +STARTCHAR U_9CEE +ENCODING 40174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +1440 +97C0 +5440 +27E0 +2400 +57E0 +9020 +0AA0 +0D40 +ENDCHAR +STARTCHAR U_9CEF +ENCODING 40175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4840 +5E40 +5240 +5E40 +5240 +5F40 +5040 +5F40 +5560 +AB20 +ENDCHAR +STARTCHAR U_9CF0 +ENCODING 40176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +2440 +27C0 +2440 +57E0 +5400 +4FE0 +8820 +82A0 +0540 +ENDCHAR +STARTCHAR U_9CF1 +ENCODING 40177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +27C0 +FC40 +27E0 +2400 +27E0 +2AA0 +2DA0 +2040 +ENDCHAR +STARTCHAR U_9CF2 +ENCODING 40178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4BC0 +7A40 +43E0 +4200 +43E0 +42A0 +8560 +8040 +ENDCHAR +STARTCHAR U_9CF3 +ENCODING 40179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +8880 +BE80 +A280 +BE80 +A280 +BF80 +A0A0 +BFA0 +D560 +AB20 +ENDCHAR +STARTCHAR U_9CF4 +ENCODING 40180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +97C0 +9440 +97E0 +F400 +07E0 +0AA0 +1560 +0040 +ENDCHAR +STARTCHAR U_9CF5 +ENCODING 40181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +53C0 +5240 +53C0 +F240 +53E0 +5600 +53E0 +52A0 +4D60 +4840 +ENDCHAR +STARTCHAR U_9CF6 +ENCODING 40182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0400 +0A20 +3FE0 +2100 +3F00 +2100 +3FC0 +5540 +8AC0 +ENDCHAR +STARTCHAR U_9CF7 +ENCODING 40183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +13C0 +FE40 +4BE0 +4A00 +2BE0 +12A0 +2D60 +C540 +ENDCHAR +STARTCHAR U_9CF8 +ENCODING 40184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4400 +5FC0 +5240 +5FE0 +5000 +9FE0 +AAA0 +ENDCHAR +STARTCHAR U_9CF9 +ENCODING 40185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +2640 +13E0 +FA00 +0BE0 +12A0 +1560 +2040 +ENDCHAR +STARTCHAR U_9CFA +ENCODING 40186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +2240 +FFE0 +2200 +33E0 +2AA0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9CFB +ENCODING 40187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +4A40 +8BC0 +0640 +FBE0 +2A00 +2BE0 +2AA0 +6D60 +9040 +ENDCHAR +STARTCHAR U_9CFC +ENCODING 40188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FE40 +0BC0 +4A40 +2BE0 +1200 +13E0 +2AA0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9CFD +ENCODING 40189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +53C0 +5240 +FBE0 +5200 +53E0 +5AA0 +5560 +9040 +ENDCHAR +STARTCHAR U_9CFE +ENCODING 40190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +FBC0 +AA40 +ABE0 +AA00 +ABE0 +B820 +26A0 +2540 +ENDCHAR +STARTCHAR U_9CFF +ENCODING 40191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +2240 +FBE0 +2200 +23E0 +3AA0 +C560 +0040 +ENDCHAR +STARTCHAR U_9D00 +ENCODING 40192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +1440 +27C0 +2440 +77E0 +6C00 +A7E0 +2520 +2AA0 +2040 +ENDCHAR +STARTCHAR U_9D01 +ENCODING 40193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +2240 +23C0 +FA40 +23E0 +2200 +53E0 +4820 +82A0 +0540 +ENDCHAR +STARTCHAR U_9D02 +ENCODING 40194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +2BC0 +2A40 +FFE0 +2200 +33E0 +4820 +46A0 +8540 +ENDCHAR +STARTCHAR U_9D03 +ENCODING 40195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +93C0 +F140 +9140 +FFE0 +8100 +F900 +5A80 +AA40 +9420 +ENDCHAR +STARTCHAR U_9D04 +ENCODING 40196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +AA40 +ABC0 +AA40 +ABE0 +AA00 +CFE0 +82A0 +FD60 +0040 +ENDCHAR +STARTCHAR U_9D05 +ENCODING 40197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5BC0 +4A40 +FFE0 +4A00 +4BE0 +4AA0 +4D60 +9840 +ENDCHAR +STARTCHAR U_9D06 +ENCODING 40198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +ABC0 +2240 +33E0 +3200 +37E0 +3AA0 +5560 +8040 +ENDCHAR +STARTCHAR U_9D07 +ENCODING 40199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +6240 +4BC0 +7A40 +23E0 +FA00 +23E0 +22A0 +2560 +2040 +ENDCHAR +STARTCHAR U_9D08 +ENCODING 40200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +4BC0 +5240 +53C0 +7240 +53E0 +5200 +53E0 +92A0 +9560 +ENDCHAR +STARTCHAR U_9D09 +ENCODING 40201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +93C0 +FE40 +33E0 +3200 +53E0 +92A0 +5560 +2040 +ENDCHAR +STARTCHAR U_9D0A +ENCODING 40202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +1440 +57C0 +5C40 +57E0 +5400 +57E0 +5820 +E6A0 +0540 +ENDCHAR +STARTCHAR U_9D0B +ENCODING 40203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +FC40 +47C0 +7440 +57E0 +5400 +57E0 +5020 +9AA0 +3540 +ENDCHAR +STARTCHAR U_9D0C +ENCODING 40204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2880 +FFE0 +2880 +2480 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9D0D +ENCODING 40205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +F1E0 +0800 +3F80 +2480 +2280 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D0E +ENCODING 40206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +8A40 +CBC0 +B240 +93E0 +AA00 +CBE0 +F820 +06A0 +0540 +ENDCHAR +STARTCHAR U_9D0F +ENCODING 40207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +7AA0 +4A80 +7FE0 +4A80 +7E80 +4280 +7AA0 +0AA0 +AA60 +5A20 +ENDCHAR +STARTCHAR U_9D10 +ENCODING 40208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +2520 +49E0 +BF80 +2080 +3F80 +2080 +3FE0 +5520 +92A0 +ENDCHAR +STARTCHAR U_9D11 +ENCODING 40209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5240 +3180 +CA60 +3F80 +2480 +3FE0 +2000 +3FE0 +D560 +ENDCHAR +STARTCHAR U_9D12 +ENCODING 40210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +4BC0 +A640 +13E0 +FE00 +0BE0 +52A0 +2560 +1040 +ENDCHAR +STARTCHAR U_9D13 +ENCODING 40211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2BC0 +4A40 +4BC0 +5240 +D7E0 +E600 +63E0 +4820 +BAA0 +0560 +ENDCHAR +STARTCHAR U_9D14 +ENCODING 40212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F3C0 +2240 +13C0 +FA40 +0BE0 +1200 +23E0 +4020 +A2A0 +1D60 +ENDCHAR +STARTCHAR U_9D15 +ENCODING 40213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7800 +4900 +7D20 +4140 +7D80 +5520 +AD20 +08E0 +ENDCHAR +STARTCHAR U_9D16 +ENCODING 40214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +8A40 +FBC0 +A240 +FBE0 +A200 +A3E0 +A820 +DAA0 +8D40 +ENDCHAR +STARTCHAR U_9D17 +ENCODING 40215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +03C0 +4A40 +4BE0 +3200 +23E0 +1AA0 +E560 +0060 +ENDCHAR +STARTCHAR U_9D18 +ENCODING 40216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +4A40 +FFC0 +5240 +53E0 +FE00 +53E0 +52A0 +5560 +9040 +ENDCHAR +STARTCHAR U_9D19 +ENCODING 40217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A3C0 +2240 +FBE0 +2200 +23E0 +32A0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9D1A +ENCODING 40218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4820 +7BA0 +4AA0 +7EA0 +43A0 +7C20 +0420 +D420 +AC60 +ENDCHAR +STARTCHAR U_9D1B +ENCODING 40219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +D2A0 +2A60 +7F80 +A080 +3F80 +2080 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_9D1C +ENCODING 40220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5BC0 +5220 +F9E0 +0800 +3F80 +2480 +3FC0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_9D1D +ENCODING 40221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +FA40 +0BC0 +EA40 +ABE0 +AA00 +EBE0 +0AA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D1E +ENCODING 40222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93C0 +9240 +F3C0 +0240 +FBE0 +4200 +73E0 +12A0 +5560 +2040 +ENDCHAR +STARTCHAR U_9D1F +ENCODING 40223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F3C0 +9240 +93C0 +FE40 +93E0 +9200 +93E0 +AAA0 +ED60 +9440 +ENDCHAR +STARTCHAR U_9D20 +ENCODING 40224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4BC0 +7A40 +4BE0 +7A00 +03E0 +1AA0 +E560 +0040 +ENDCHAR +STARTCHAR U_9D21 +ENCODING 40225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +4BE0 +5C20 +E2A0 +0560 +ENDCHAR +STARTCHAR U_9D22 +ENCODING 40226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57C0 +7C40 +97C0 +B440 +F7E0 +5400 +97E0 +F420 +26A0 +4D60 +ENDCHAR +STARTCHAR U_9D23 +ENCODING 40227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +2240 +FBE0 +8A00 +8BE0 +FAA0 +0560 +0060 +ENDCHAR +STARTCHAR U_9D24 +ENCODING 40228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +4A20 +7D40 +4880 +7D40 +4220 +7C80 +0440 +5480 +AC40 +ENDCHAR +STARTCHAR U_9D25 +ENCODING 40229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FBE0 +8A20 +F800 +8940 +FD40 +8140 +F940 +5A20 +AA20 +1C20 +ENDCHAR +STARTCHAR U_9D26 +ENCODING 40230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2880 +7FC0 +A0A0 +3F80 +2080 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9D27 +ENCODING 40231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +03C0 +7240 +53E0 +5200 +57E0 +5820 +92A0 +0560 +ENDCHAR +STARTCHAR U_9D28 +ENCODING 40232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +FBC0 +AA40 +FBE0 +2200 +23E0 +22A0 +2560 +2040 +ENDCHAR +STARTCHAR U_9D29 +ENCODING 40233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A3C0 +A240 +FBC0 +2240 +23E0 +FE00 +23E0 +32A0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9D2A +ENCODING 40234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +8BC0 +0240 +53E0 +4A00 +4BE0 +8020 +8AA0 +0540 +ENDCHAR +STARTCHAR U_9D2B +ENCODING 40235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +ABC0 +FA40 +ABE0 +AA00 +FBE0 +0020 +06A0 +0540 +ENDCHAR +STARTCHAR U_9D2C +ENCODING 40236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +FFE0 +8840 +3F80 +2480 +3FC0 +2000 +3FC0 +5540 +8AC0 +ENDCHAR +STARTCHAR U_9D2D +ENCODING 40237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +9440 +97C0 +F440 +87E0 +F400 +97E0 +9020 +FAA0 +0540 +ENDCHAR +STARTCHAR U_9D2E +ENCODING 40238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +FFC0 +0240 +FFE0 +2200 +7BE0 +0AA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D2F +ENCODING 40239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2240 +FFC0 +AA40 +ABE0 +AA00 +ABE0 +AAA0 +AD60 +9840 +ENDCHAR +STARTCHAR U_9D30 +ENCODING 40240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E3C0 +2240 +FFC0 +2240 +23E0 +FA00 +8BE0 +8AA0 +FD60 +8840 +ENDCHAR +STARTCHAR U_9D31 +ENCODING 40241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFC0 +2A40 +03C0 +0240 +4BE0 +2A00 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D32 +ENCODING 40242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +B7C0 +C440 +97C0 +7440 +07E0 +F400 +97E0 +F020 +92A0 +F540 +ENDCHAR +STARTCHAR U_9D33 +ENCODING 40243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +ABC0 +2240 +FBE0 +4A00 +4BE0 +32A0 +2D60 +C040 +ENDCHAR +STARTCHAR U_9D34 +ENCODING 40244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5BC0 +8240 +7FC0 +4A40 +CBE0 +4A00 +4BE0 +4820 +6AA0 +5540 +ENDCHAR +STARTCHAR U_9D35 +ENCODING 40245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BC0 +AE40 +6BC0 +2A40 +6FE0 +AA00 +2BE0 +2820 +4EA0 +8540 +ENDCHAR +STARTCHAR U_9D36 +ENCODING 40246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +FE40 +13C0 +7E40 +03E0 +7A00 +4BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D37 +ENCODING 40247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2140 +3D40 +C940 +3440 +FFC0 +2080 +3F80 +2080 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9D38 +ENCODING 40248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +7A40 +93C0 +1240 +FFE0 +1200 +3BE0 +56A0 +9560 +1040 +ENDCHAR +STARTCHAR U_9D39 +ENCODING 40249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FBC0 +2240 +7BC0 +2240 +FBE0 +2200 +23E0 +42A0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D3A +ENCODING 40250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +FBC0 +2A40 +FBE0 +A200 +FBE0 +2820 +52A0 +8D60 +ENDCHAR +STARTCHAR U_9D3B +ENCODING 40251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FC0 +0A40 +ABC0 +6A40 +2BE0 +2E00 +DBE0 +42A0 +4560 +4040 +ENDCHAR +STARTCHAR U_9D3C +ENCODING 40252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79C0 +4E40 +7980 +4A40 +7C20 +43C0 +7A40 +0A40 +AA40 +5BC0 +ENDCHAR +STARTCHAR U_9D3D +ENCODING 40253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +4A40 +33C0 +CC00 +3F80 +2080 +3F80 +2080 +3FE0 +CAA0 +ENDCHAR +STARTCHAR U_9D3E +ENCODING 40254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +13C0 +5240 +7FE0 +9200 +FFE0 +12A0 +1560 +1040 +ENDCHAR +STARTCHAR U_9D3F +ENCODING 40255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +7240 +03E0 +7A00 +4BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D40 +ENCODING 40256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4200 +DFE0 +4200 +4FC0 +1000 +3F80 +2480 +2280 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D41 +ENCODING 40257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +2BC0 +4640 +ABE0 +2A00 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D42 +ENCODING 40258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BC0 +4A40 +5FC0 +CA40 +4FE0 +5A00 +6BE0 +4AA0 +4D60 +4D40 +ENDCHAR +STARTCHAR U_9D43 +ENCODING 40259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BC0 +4A40 +6BC0 +5A40 +FBE0 +4A00 +6BE0 +5AA0 +4D60 +5D40 +ENDCHAR +STARTCHAR U_9D44 +ENCODING 40260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +53C0 +FA40 +23E0 +FA00 +23E0 +3820 +C6A0 +0540 +ENDCHAR +STARTCHAR U_9D45 +ENCODING 40261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4A40 +ABC0 +3240 +4BE0 +FA00 +4BE0 +4AA0 +7D60 +4D40 +ENDCHAR +STARTCHAR U_9D46 +ENCODING 40262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EC0 +4A00 +AFE0 +2A40 +4F40 +C840 +4F40 +4140 +5540 +6BC0 +ENDCHAR +STARTCHAR U_9D47 +ENCODING 40263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +5240 +93C0 +7A40 +53E0 +5200 +FBE0 +1020 +12A0 +1540 +ENDCHAR +STARTCHAR U_9D48 +ENCODING 40264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +4FE0 +F820 +0AA0 +0D40 +ENDCHAR +STARTCHAR U_9D49 +ENCODING 40265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5280 +9A40 +7F80 +4480 +7FC0 +4000 +7FC0 +AA40 +9540 +ENDCHAR +STARTCHAR U_9D4A +ENCODING 40266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +57C0 +5A40 +B7E0 +1200 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D4B +ENCODING 40267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +0A40 +7BC0 +4640 +7FE0 +1200 +2BE0 +6420 +AAA0 +1D40 +ENDCHAR +STARTCHAR U_9D4C +ENCODING 40268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +8A20 +FDC0 +8880 +FFE0 +8080 +FDC0 +56A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9D4D +ENCODING 40269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +73C0 +0240 +FFE0 +5200 +53E0 +5820 +5560 +82A0 +ENDCHAR +STARTCHAR U_9D4E +ENCODING 40270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +E7C0 +AA40 +53C0 +1240 +FFE0 +2A00 +6BE0 +1020 +2D60 +C2A0 +ENDCHAR +STARTCHAR U_9D4F +ENCODING 40271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +2BC0 +FA40 +23C0 +FA40 +ABE0 +FA00 +ABE0 +FAA0 +AD60 +B940 +ENDCHAR +STARTCHAR U_9D50 +ENCODING 40272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +6BC0 +6A40 +6BE0 +B600 +23E0 +3820 +E560 +02A0 +ENDCHAR +STARTCHAR U_9D51 +ENCODING 40273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +03C0 +FA40 +8BE0 +FA00 +8BE0 +FAA0 +8D60 +9840 +ENDCHAR +STARTCHAR U_9D52 +ENCODING 40274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +8640 +23C0 +4A40 +87E0 +7A00 +4BE0 +4AA0 +7D60 +4D40 +ENDCHAR +STARTCHAR U_9D53 +ENCODING 40275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +8A40 +FBE0 +1200 +23E0 +FAA0 +2560 +6060 +ENDCHAR +STARTCHAR U_9D54 +ENCODING 40276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7A40 +4FA0 +7940 +4A20 +7D00 +43C0 +7D40 +5480 +AD40 +AA20 +ENDCHAR +STARTCHAR U_9D55 +ENCODING 40277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +4BC0 +A640 +7BE0 +4A00 +ABE0 +1020 +2D60 +CAA0 +ENDCHAR +STARTCHAR U_9D56 +ENCODING 40278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +F7C0 +9440 +F7E0 +8400 +A7E0 +B2A0 +D5A0 +8060 +ENDCHAR +STARTCHAR U_9D57 +ENCODING 40279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +33C0 +4A40 +23C0 +FE40 +53E0 +7E00 +D7E0 +5420 +5EA0 +1560 +ENDCHAR +STARTCHAR U_9D58 +ENCODING 40280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2BC0 +FE40 +2BC0 +7A40 +23E0 +7A00 +CBE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D59 +ENCODING 40281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +7BE0 +22A0 +5560 +8D40 +ENDCHAR +STARTCHAR U_9D5A +ENCODING 40282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13C0 +FE40 +33C0 +5A40 +97E0 +7A00 +4BE0 +4AA0 +4D60 +8540 +ENDCHAR +STARTCHAR U_9D5B +ENCODING 40283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +AA40 +ABC0 +5640 +03E0 +FA00 +23E0 +22A0 +3D60 +C040 +ENDCHAR +STARTCHAR U_9D5C +ENCODING 40284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +53C0 +FA40 +2BC0 +FA40 +A3E0 +FA00 +2BE0 +6AA0 +BD60 +2540 +ENDCHAR +STARTCHAR U_9D5D +ENCODING 40285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +DBC0 +5640 +FFC0 +5240 +73E0 +D600 +5BE0 +52A0 +6D60 +C540 +ENDCHAR +STARTCHAR U_9D5E +ENCODING 40286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +1240 +FFE0 +1140 +F4A0 +3FA0 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D5F +ENCODING 40287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +3100 +5FC0 +3100 +D5E0 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D60 +ENCODING 40288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +7A40 +93C0 +FE40 +03E0 +7A00 +4BE0 +4AA0 +7D60 +0040 +ENDCHAR +STARTCHAR U_9D61 +ENCODING 40289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +EFC0 +0A40 +FFC0 +2A40 +2BE0 +BA00 +ABE0 +AAA0 +A560 +F540 +ENDCHAR +STARTCHAR U_9D62 +ENCODING 40290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7FE0 +4A00 +FBE0 +2820 +CD60 +1AA0 +ENDCHAR +STARTCHAR U_9D63 +ENCODING 40291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +7FC0 +5640 +7FE0 +1200 +3BE0 +5420 +9560 +12A0 +ENDCHAR +STARTCHAR U_9D64 +ENCODING 40292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +A820 +AD60 +9AA0 +ENDCHAR +STARTCHAR U_9D65 +ENCODING 40293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5420 +FEA0 +10A0 +FE20 +2860 +7F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D66 +ENCODING 40294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F080 +9780 +F080 +9FE0 +F100 +8540 +FB80 +0D40 +D920 +AB00 +ENDCHAR +STARTCHAR U_9D67 +ENCODING 40295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +53C0 +FE40 +53C0 +5240 +FFE0 +5200 +53E0 +52A0 +5560 +9040 +ENDCHAR +STARTCHAR U_9D68 +ENCODING 40296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4BC0 +8640 +7BC0 +1240 +FFE0 +1200 +7BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D69 +ENCODING 40297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +A240 +BFE0 +E600 +BBE0 +AAA0 +B560 +A440 +ENDCHAR +STARTCHAR U_9D6A +ENCODING 40298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +2A40 +47C0 +FA40 +ABE0 +FA00 +ABE0 +FAA0 +2D60 +3040 +ENDCHAR +STARTCHAR U_9D6B +ENCODING 40299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +2240 +FBC0 +8A40 +FBE0 +8A00 +FBE0 +22A0 +FD60 +2040 +ENDCHAR +STARTCHAR U_9D6C +ENCODING 40300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +AA40 +FBE0 +AA00 +ABE0 +AAA0 +AD60 +5840 +ENDCHAR +STARTCHAR U_9D6D +ENCODING 40301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +7FC0 +9240 +7FE0 +1600 +5BE0 +3020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_9D6E +ENCODING 40302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +9240 +43C0 +9A40 +8BE0 +DA00 +8BE0 +8820 +FD60 +02A0 +ENDCHAR +STARTCHAR U_9D6F +ENCODING 40303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +AA40 +FBC0 +AA40 +FBE0 +2200 +53E0 +FEA0 +1560 +1040 +ENDCHAR +STARTCHAR U_9D70 +ENCODING 40304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +8BE0 +BA00 +ABE0 +BAA0 +8D60 +9840 +ENDCHAR +STARTCHAR U_9D71 +ENCODING 40305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1240 +FFC0 +2A40 +47E0 +9200 +7BE0 +12A0 +1D60 +E040 +ENDCHAR +STARTCHAR U_9D72 +ENCODING 40306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5240 +FFC0 +0240 +7BE0 +4A00 +7BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D73 +ENCODING 40307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +FBC0 +8240 +BBE0 +AA00 +BBE0 +AAA0 +BD60 +A840 +ENDCHAR +STARTCHAR U_9D74 +ENCODING 40308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +AA40 +7BC0 +2A40 +FBE0 +2A00 +7BE0 +AAA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D75 +ENCODING 40309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +3200 +3BE0 +36A0 +5D60 +9040 +ENDCHAR +STARTCHAR U_9D76 +ENCODING 40310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +53C0 +DA40 +8BE0 +DA00 +53E0 +5820 +E560 +02A0 +ENDCHAR +STARTCHAR U_9D77 +ENCODING 40311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +8640 +43C0 +7E40 +97E0 +5600 +3FE0 +32A0 +5D60 +9040 +ENDCHAR +STARTCHAR U_9D78 +ENCODING 40312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +3240 +4BC0 +FE40 +0BE0 +EA00 +ABE0 +EAA0 +0D60 +1840 +ENDCHAR +STARTCHAR U_9D79 +ENCODING 40313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FEA0 +6920 +BFC0 +2080 +3F80 +2080 +3FE0 +5520 +94C0 +ENDCHAR +STARTCHAR U_9D7A +ENCODING 40314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +53C0 +5E40 +67E0 +DE00 +4BE0 +5420 +6560 +42A0 +ENDCHAR +STARTCHAR U_9D7B +ENCODING 40315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +7940 +49E0 +7B40 +49E0 +7D40 +4140 +7DE0 +5540 +AD40 +A9E0 +ENDCHAR +STARTCHAR U_9D7C +ENCODING 40316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +8BC0 +5240 +8BE0 +7200 +23E0 +2820 +3560 +E2A0 +ENDCHAR +STARTCHAR U_9D7D +ENCODING 40317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A7C0 +5640 +ABC0 +9640 +03E0 +FE00 +27E0 +B820 +4AA0 +B560 +ENDCHAR +STARTCHAR U_9D7E +ENCODING 40318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +93E0 +FE00 +93E0 +B020 +DD60 +92A0 +ENDCHAR +STARTCHAR U_9D7F +ENCODING 40319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A20 +4BE0 +7A20 +4BE0 +7F40 +4140 +7FE0 +5540 +AD40 +AA40 +ENDCHAR +STARTCHAR U_9D80 +ENCODING 40320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +F240 +97E0 +F240 +93C0 +FA40 +83C0 +FA40 +0FE0 +AA40 +5C20 +ENDCHAR +STARTCHAR U_9D81 +ENCODING 40321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +0240 +73C0 +5240 +73E0 +2200 +73E0 +AAA0 +2560 +6040 +ENDCHAR +STARTCHAR U_9D82 +ENCODING 40322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +DBC0 +8A40 +8BC0 +DA40 +8BE0 +FA00 +53E0 +5560 +5AA0 +92C0 +ENDCHAR +STARTCHAR U_9D83 +ENCODING 40323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F660 +9420 +F6E0 +9420 +F7E0 +8280 +FA80 +0AA0 +DAA0 +AC60 +ENDCHAR +STARTCHAR U_9D84 +ENCODING 40324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23C0 +FA40 +23C0 +FE40 +4BE0 +7A00 +4BE0 +7D60 +4AA0 +5840 +ENDCHAR +STARTCHAR U_9D85 +ENCODING 40325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57C0 +AA40 +ABC0 +5640 +03E0 +FA00 +ABE0 +F960 +AAA0 +F840 +ENDCHAR +STARTCHAR U_9D86 +ENCODING 40326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +1240 +57C0 +5A40 +B7E0 +1200 +3BE0 +5560 +92A0 +1060 +ENDCHAR +STARTCHAR U_9D87 +ENCODING 40327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +2240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2160 +72A0 +AAC0 +ENDCHAR +STARTCHAR U_9D88 +ENCODING 40328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +2A40 +FFC0 +2A40 +FBE0 +2A00 +FFE0 +5160 +32A0 +CAC0 +ENDCHAR +STARTCHAR U_9D89 +ENCODING 40329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +4A40 +7BC0 +0240 +7BE0 +0A00 +13E0 +FAA0 +1560 +7540 +ENDCHAR +STARTCHAR U_9D8A +ENCODING 40330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +A240 +FBC0 +AE40 +FBE0 +AA00 +FBE0 +A2A0 +B560 +CD40 +ENDCHAR +STARTCHAR U_9D8B +ENCODING 40331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +FA40 +93C0 +FE40 +93E0 +9200 +BBE0 +AAA0 +AD60 +B860 +ENDCHAR +STARTCHAR U_9D8C +ENCODING 40332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +FA40 +A3C0 +AA40 +ABE0 +FA00 +A3E0 +AAA0 +AD60 +F840 +ENDCHAR +STARTCHAR U_9D8D +ENCODING 40333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +43E0 +FA00 +5BE0 +A820 +4D60 +12A0 +ENDCHAR +STARTCHAR U_9D8E +ENCODING 40334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +73C0 +0240 +FFE0 +2200 +73E0 +A820 +2D60 +62A0 +ENDCHAR +STARTCHAR U_9D8F +ENCODING 40335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +AA40 +53C0 +FA40 +23E0 +FE00 +23E0 +2020 +5560 +8AA0 +ENDCHAR +STARTCHAR U_9D90 +ENCODING 40336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8C80 +4BC0 +3F40 +09C0 +C940 +5FE0 +6B00 +49E0 +4820 +4AA0 +BD40 +ENDCHAR +STARTCHAR U_9D91 +ENCODING 40337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +C620 +3F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D92 +ENCODING 40338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BC0 +FE40 +2BC0 +FA40 +ABE0 +FA00 +2BE0 +7AA0 +AB60 +3660 +ENDCHAR +STARTCHAR U_9D93 +ENCODING 40339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +FA40 +ABE0 +AA00 +FBE0 +A820 +AD60 +FAA0 +ENDCHAR +STARTCHAR U_9D94 +ENCODING 40340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2BC0 +FE40 +37C0 +5240 +B3E0 +1200 +FFE0 +3AA0 +5560 +9260 +ENDCHAR +STARTCHAR U_9D95 +ENCODING 40341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +4640 +2BC0 +FE40 +03E0 +7A00 +4BE0 +7820 +4D60 +7AA0 +ENDCHAR +STARTCHAR U_9D96 +ENCODING 40342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +2540 +FD80 +7280 +AC60 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D97 +ENCODING 40343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +03E0 +FA00 +A3E0 +BAA0 +E540 +BFE0 +ENDCHAR +STARTCHAR U_9D98 +ENCODING 40344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +55C0 +F540 +5DC0 +5540 +F5E0 +9500 +9DE0 +F560 +16A0 +2C60 +ENDCHAR +STARTCHAR U_9D99 +ENCODING 40345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +5240 +FFC0 +A640 +FBE0 +AA00 +ABE0 +AAA0 +BD60 +2060 +ENDCHAR +STARTCHAR U_9D9A +ENCODING 40346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +03C0 +FA40 +03E0 +FE00 +23E0 +7AA0 +0D60 +3040 +ENDCHAR +STARTCHAR U_9D9B +ENCODING 40347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +FBC0 +9240 +DFC0 +2240 +FBE0 +8A00 +FBE0 +8AA0 +FD60 +0040 +ENDCHAR +STARTCHAR U_9D9C +ENCODING 40348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFC0 +2A40 +FFC0 +2A40 +13E0 +FE00 +37E0 +52A0 +95A0 +3060 +ENDCHAR +STARTCHAR U_9D9D +ENCODING 40349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +03C0 +7A40 +4BC0 +7A40 +03E0 +FA00 +ABE0 +FAA0 +AD60 +F940 +ENDCHAR +STARTCHAR U_9D9E +ENCODING 40350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +93C0 +FA40 +93C0 +BA40 +ABE0 +BA00 +ABE0 +BAA0 +AD60 +B840 +ENDCHAR +STARTCHAR U_9D9F +ENCODING 40351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +8640 +2BC0 +4640 +ABE0 +2600 +FFE0 +22A0 +5560 +8D20 +ENDCHAR +STARTCHAR U_9DA0 +ENCODING 40352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +BA40 +ABC0 +BA40 +93E0 +FE00 +ABE0 +9AA0 +A560 +FD20 +ENDCHAR +STARTCHAR U_9DA1 +ENCODING 40353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +23E0 +7E00 +D7E0 +6EA0 +7560 +0860 +ENDCHAR +STARTCHAR U_9DA2 +ENCODING 40354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7C0 +AA40 +FBC0 +2240 +FFE0 +2200 +7BE0 +CAA0 +3560 +CC60 +ENDCHAR +STARTCHAR U_9DA3 +ENCODING 40355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +8BC0 +FA40 +83E0 +FE00 +ABE0 +FEA0 +AB60 +8460 +ENDCHAR +STARTCHAR U_9DA4 +ENCODING 40356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A7C0 +FE40 +ABC0 +FA40 +ABE0 +FA00 +23E0 +FAA0 +2560 +2060 +ENDCHAR +STARTCHAR U_9DA5 +ENCODING 40357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +57C0 +7E40 +43C0 +7A40 +6BE0 +7A00 +ABE0 +B820 +AD60 +BAA0 +ENDCHAR +STARTCHAR U_9DA6 +ENCODING 40358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE40 +23C0 +7A40 +4CC0 +7F00 +2100 +3F00 +2100 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DA7 +ENCODING 40359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +23C0 +FA40 +ABE0 +FE00 +23E0 +32A0 +4D60 +8520 +ENDCHAR +STARTCHAR U_9DA8 +ENCODING 40360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +0BC0 +FE40 +53E0 +B600 +5BE0 +B6A0 +5560 +A520 +ENDCHAR +STARTCHAR U_9DA9 +ENCODING 40361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +5480 +9140 +3FA0 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DAA +ENCODING 40362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +4BE0 +7A00 +2BE0 +FC20 +52A0 +8D60 +ENDCHAR +STARTCHAR U_9DAB +ENCODING 40363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +FBC0 +AA40 +ABE0 +FA00 +23E0 +7020 +AD60 +22A0 +ENDCHAR +STARTCHAR U_9DAC +ENCODING 40364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +6BC0 +9640 +7BC0 +4A40 +7BE0 +4A00 +7BE0 +6AA0 +AD60 +3860 +ENDCHAR +STARTCHAR U_9DAD +ENCODING 40365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +DFE0 +2100 +FBE0 +5420 +BFC0 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DAE +ENCODING 40366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +0240 +73C0 +5240 +FBE0 +8A00 +EBE0 +A820 +ED60 +9AA0 +ENDCHAR +STARTCHAR U_9DAF +ENCODING 40367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD40 +2100 +5280 +7FE0 +8840 +BF80 +2080 +3F80 +2080 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DB0 +ENCODING 40368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +03C0 +FA40 +8BE0 +FA00 +8BE0 +F820 +5560 +8AA0 +ENDCHAR +STARTCHAR U_9DB1 +ENCODING 40369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +2840 +7FA0 +A480 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DB2 +ENCODING 40370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +47C0 +AA40 +7FC0 +0240 +EFE0 +2600 +B7E0 +6C20 +B6A0 +6D60 +ENDCHAR +STARTCHAR U_9DB3 +ENCODING 40371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +9480 +F7E0 +96A0 +FEA0 +92A0 +FEA0 +56E0 +B480 +3C80 +ENDCHAR +STARTCHAR U_9DB4 +ENCODING 40372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +53C0 +FA40 +53E0 +7A00 +53E0 +7C20 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9DB5 +ENCODING 40373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BC0 +AA40 +FBC0 +2A40 +53E0 +FA00 +ABE0 +FAA0 +2D60 +D540 +ENDCHAR +STARTCHAR U_9DB6 +ENCODING 40374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +AA40 +FFC0 +AA40 +FBE0 +A200 +FBE0 +CAA0 +FD60 +8D40 +ENDCHAR +STARTCHAR U_9DB7 +ENCODING 40375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +FBC0 +2240 +FBE0 +2200 +FFE0 +8820 +8AA0 +FD60 +ENDCHAR +STARTCHAR U_9DB8 +ENCODING 40376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EC80 +25C0 +ED40 +89C0 +ED40 +25E0 +B500 +6DE0 +B420 +26A0 +6D60 +ENDCHAR +STARTCHAR U_9DB9 +ENCODING 40377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +BBC0 +AA40 +EBC0 +AA40 +53E0 +FA00 +ABE0 +F820 +AAA0 +FD40 +ENDCHAR +STARTCHAR U_9DBA +ENCODING 40378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73C0 +AA40 +53C0 +FE40 +4BE0 +7A00 +4BE0 +7AA0 +4D60 +5D40 +ENDCHAR +STARTCHAR U_9DBB +ENCODING 40379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +FFC0 +CA40 +7BE0 +4A00 +7BE0 +4D20 +4AA0 +5840 +ENDCHAR +STARTCHAR U_9DBC +ENCODING 40380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFC0 +5240 +FBC0 +5A40 +FFE0 +5A00 +FBE0 +52A0 +DD60 +5540 +ENDCHAR +STARTCHAR U_9DBD +ENCODING 40381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7BC0 +D240 +7BC0 +5240 +7BE0 +1200 +FFE0 +1020 +12A0 +1560 +ENDCHAR +STARTCHAR U_9DBE +ENCODING 40382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2500 +FBC0 +9240 +F3E0 +9240 +F3E0 +22A0 +FD60 +2520 +ENDCHAR +STARTCHAR U_9DBF +ENCODING 40383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +7380 +2940 +FFE0 +2080 +3F80 +2080 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9DC0 +ENCODING 40384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +4BC0 +9240 +FFE0 +4A00 +4BE0 +B420 +FEA0 +0560 +ENDCHAR +STARTCHAR U_9DC1 +ENCODING 40385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +2BC0 +4640 +83E0 +7E00 +57E0 +5420 +56A0 +FD60 +ENDCHAR +STARTCHAR U_9DC2 +ENCODING 40386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +AA40 +53C0 +7A40 +A3E0 +FA00 +23E0 +AAA0 +AD60 +F840 +ENDCHAR +STARTCHAR U_9DC3 +ENCODING 40387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +FE40 +8BE0 +2200 +FFE0 +5020 +22A0 +DD40 +ENDCHAR +STARTCHAR U_9DC4 +ENCODING 40388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +5A40 +23C0 +5240 +2BE0 +7E00 +13E0 +FC20 +2AA0 +C540 +ENDCHAR +STARTCHAR U_9DC5 +ENCODING 40389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +FE40 +13E0 +FE00 +33E0 +5820 +56A0 +9560 +ENDCHAR +STARTCHAR U_9DC6 +ENCODING 40390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +63C0 +4A40 +7BC0 +AA40 +BBE0 +AA00 +BBE0 +A820 +FAA0 +4D60 +ENDCHAR +STARTCHAR U_9DC7 +ENCODING 40391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FF60 +9200 +7DC0 +4540 +7D40 +4480 +7F40 +AA20 +ENDCHAR +STARTCHAR U_9DC8 +ENCODING 40392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F480 +94E0 +F480 +97E0 +FCA0 +87C0 +FCA0 +0DE0 +A940 +5A60 +ENDCHAR +STARTCHAR U_9DC9 +ENCODING 40393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +F3C0 +9E40 +93C0 +FE40 +93E0 +FE00 +93E0 +9420 +BAA0 +AD40 +ENDCHAR +STARTCHAR U_9DCA +ENCODING 40394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +03C0 +7240 +53C0 +7240 +03E0 +FA00 +DBE0 +AAA0 +FD60 +A940 +ENDCHAR +STARTCHAR U_9DCB +ENCODING 40395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FFC0 +4A40 +33C0 +4A40 +FFE0 +1200 +FFE0 +1020 +5AA0 +B540 +ENDCHAR +STARTCHAR U_9DCC +ENCODING 40396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F280 +93C0 +F280 +93C0 +FA80 +83E0 +F820 +5AA0 +AD60 +A940 +ENDCHAR +STARTCHAR U_9DCD +ENCODING 40397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +1200 +FFE0 +3820 +56A0 +9560 +ENDCHAR +STARTCHAR U_9DCE +ENCODING 40398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +CA40 +ABC0 +FA40 +23E0 +FA00 +53E0 +A820 +76A0 +2560 +ENDCHAR +STARTCHAR U_9DCF +ENCODING 40399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +7BC0 +4A40 +6BE0 +5A00 +4BE0 +FC20 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DD0 +ENCODING 40400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +FE40 +83E0 +FE00 +83E0 +FC20 +AAA0 +B560 +ENDCHAR +STARTCHAR U_9DD1 +ENCODING 40401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4BC0 +7E40 +ABC0 +2640 +13E0 +FE00 +4BE0 +2820 +12A0 +FD40 +ENDCHAR +STARTCHAR U_9DD2 +ENCODING 40402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +AA40 +FBC0 +AA40 +FFE0 +1200 +FFE0 +5020 +12A0 +3540 +ENDCHAR +STARTCHAR U_9DD3 +ENCODING 40403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +AA40 +ABC0 +FE40 +ABE0 +BA00 +83E0 +AAA0 +D560 +9540 +ENDCHAR +STARTCHAR U_9DD4 +ENCODING 40404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2640 +F980 +5260 +BF80 +2080 +3F80 +2080 +3FE0 +5520 +ENDCHAR +STARTCHAR U_9DD5 +ENCODING 40405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +EFE0 +B900 +EFC0 +0900 +3FE0 +2480 +3FC0 +2000 +3FC0 +D540 +ENDCHAR +STARTCHAR U_9DD6 +ENCODING 40406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +FFE0 +9240 +A980 +FE60 +0800 +3F80 +2480 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DD7 +ENCODING 40407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +83C0 +BA40 +ABC0 +BA40 +83E0 +FA00 +ABE0 +FAA0 +8560 +FD40 +ENDCHAR +STARTCHAR U_9DD8 +ENCODING 40408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +AB40 +F880 +6940 +BFA0 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DD9 +ENCODING 40409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5540 +FA40 +2520 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DDA +ENCODING 40410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +B7C0 +6E40 +B7C0 +3240 +4BE0 +A600 +53E0 +2820 +12A0 +6540 +ENDCHAR +STARTCHAR U_9DDB +ENCODING 40411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FC0 +5540 +7FC0 +5540 +7DE0 +5500 +7DE0 +5420 +7EA0 +9560 +ENDCHAR +STARTCHAR U_9DDC +ENCODING 40412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +AA40 +FFC0 +AA40 +FBE0 +AA00 +FFE0 +4820 +32A0 +CD40 +ENDCHAR +STARTCHAR U_9DDD +ENCODING 40413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +ABE0 +FE00 +ABE0 +FC20 +22A0 +2540 +ENDCHAR +STARTCHAR U_9DDE +ENCODING 40414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +1140 +BBC0 +5540 +BBE0 +5500 +BBE0 +3020 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DDF +ENCODING 40415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FD00 +43E0 +7480 +57E0 +9240 +3FA0 +2480 +2280 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DE0 +ENCODING 40416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +0020 +AAA0 +AD40 +ENDCHAR +STARTCHAR U_9DE1 +ENCODING 40417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +AA40 +ABC0 +FE40 +ABE0 +AA00 +FFE0 +0020 +56A0 +AD40 +ENDCHAR +STARTCHAR U_9DE2 +ENCODING 40418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7DE0 +56A0 +FD40 +A220 +3F80 +2880 +2480 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DE3 +ENCODING 40419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +FE40 +4BE0 +7A00 +4BE0 +FC20 +12A0 +1540 +ENDCHAR +STARTCHAR U_9DE4 +ENCODING 40420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +03C0 +FA40 +ABE0 +FA00 +ABE0 +FC20 +22A0 +2560 +ENDCHAR +STARTCHAR U_9DE5 +ENCODING 40421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +75C0 +2940 +FBE0 +AAA0 +3F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DE6 +ENCODING 40422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FC0 +D240 +7FC0 +5240 +7FE0 +5200 +7FE0 +5020 +AAA0 +AD40 +ENDCHAR +STARTCHAR U_9DE7 +ENCODING 40423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FFC0 +8640 +7BE0 +4A00 +7BE0 +5020 +3D60 +C2A0 +ENDCHAR +STARTCHAR U_9DE8 +ENCODING 40424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FFC0 +2940 +FFC0 +5540 +FFE0 +5500 +FFE0 +1160 +FEA0 +12A0 +ENDCHAR +STARTCHAR U_9DE9 +ENCODING 40425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +69E0 +FF40 +A480 +ED40 +BF20 +2100 +3F00 +2100 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DEA +ENCODING 40426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0400 +FFE0 +8820 +3F80 +2480 +3FE0 +6A40 +95C0 +ENDCHAR +STARTCHAR U_9DEB +ENCODING 40427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +1540 +FFC0 +9540 +FDE0 +9500 +FDE0 +9560 +DEA0 +D4A0 +ENDCHAR +STARTCHAR U_9DEC +ENCODING 40428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +FFC0 +2240 +FBE0 +AA00 +FBE0 +AAA0 +FD60 +8860 +ENDCHAR +STARTCHAR U_9DED +ENCODING 40429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7C0 +6A40 +FFC0 +6A40 +A7E0 +FA00 +ABE0 +F820 +AAA0 +FD60 +ENDCHAR +STARTCHAR U_9DEE +ENCODING 40430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FE40 +4BC0 +BE40 +2BE0 +FE00 +87E0 +BEA0 +A560 +BD20 +ENDCHAR +STARTCHAR U_9DEF +ENCODING 40431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +AB40 +7DC0 +C740 +7DE0 +4500 +7DE0 +5820 +96A0 +3540 +ENDCHAR +STARTCHAR U_9DF0 +ENCODING 40432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +1F00 +EAE0 +2E80 +E8E0 +1000 +3F80 +2480 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DF1 +ENCODING 40433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +3A00 +57E0 +FC20 +12A0 +1560 +ENDCHAR +STARTCHAR U_9DF2 +ENCODING 40434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +4BE0 +7A80 +54E0 +BF00 +2100 +3F00 +2100 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DF3 +ENCODING 40435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +EE40 +ABC0 +EE40 +BBE0 +AA00 +BBE0 +AA20 +BAA0 +CB60 +ENDCHAR +STARTCHAR U_9DF4 +ENCODING 40436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +ABC0 +EE40 +ABC0 +EE40 +93E0 +FE00 +93E0 +BA20 +D6A0 +9360 +ENDCHAR +STARTCHAR U_9DF5 +ENCODING 40437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +97C0 +FE40 +93E0 +FE00 +ABE0 +F820 +AAA0 +BD40 +ENDCHAR +STARTCHAR U_9DF6 +ENCODING 40438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +4BC0 +7A40 +4BE0 +7A00 +4BE0 +7820 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DF7 +ENCODING 40439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5240 +FBC0 +AA40 +DBE0 +8A00 +FBE0 +9020 +52A0 +3540 +ENDCHAR +STARTCHAR U_9DF8 +ENCODING 40440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +29C0 +FD40 +55C0 +9140 +FFE0 +AB00 +FFE0 +AA20 +BAA0 +8760 +ENDCHAR +STARTCHAR U_9DF9 +ENCODING 40441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5500 +5FE0 +7500 +5FE0 +5040 +5FC0 +5040 +9FE0 +6AA0 +ENDCHAR +STARTCHAR U_9DFA +ENCODING 40442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9680 +F140 +27E0 +AA40 +FFC0 +4480 +7FE0 +4000 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9DFB +ENCODING 40443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EF80 +AAE0 +EEA0 +A0A0 +FFA0 +82A0 +FBA0 +4E40 +BAA0 +AF20 +ENDCHAR +STARTCHAR U_9DFC +ENCODING 40444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +ABC0 +FA40 +ABE0 +BA00 +ABE0 +B820 +8AA0 +8D60 +ENDCHAR +STARTCHAR U_9DFD +ENCODING 40445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +75C0 +4A40 +75C0 +4A40 +FFE0 +A520 +3FC0 +2000 +3FE0 +5520 +94C0 +ENDCHAR +STARTCHAR U_9DFE +ENCODING 40446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5240 +FFC0 +4A40 +7BE0 +4A00 +7BE0 +3020 +6AA0 +BD40 +ENDCHAR +STARTCHAR U_9DFF +ENCODING 40447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +67E0 +A480 +3FC0 +2040 +3FC0 +2040 +3FE0 +CAA0 +ENDCHAR +STARTCHAR U_9E00 +ENCODING 40448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +43C0 +FA40 +2BE0 +FA00 +ABE0 +F820 +2AA0 +D560 +ENDCHAR +STARTCHAR U_9E01 +ENCODING 40449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7FC0 +2080 +FF80 +95E0 +FEA0 +90E0 +FFA0 +95A0 +BAA0 +ENDCHAR +STARTCHAR U_9E02 +ENCODING 40450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +35C0 +8940 +4FC0 +2540 +3FE0 +2900 +FFE0 +4960 +56A0 +6440 +ENDCHAR +STARTCHAR U_9E03 +ENCODING 40451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +9080 +F7E0 +9100 +FAA0 +87E0 +FAA0 +0FC0 +5AA0 +AF60 +ENDCHAR +STARTCHAR U_9E04 +ENCODING 40452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +4B40 +FC80 +4940 +9FA0 +2480 +3FE0 +2000 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9E05 +ENCODING 40453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +23C0 +FE40 +23E0 +FA00 +53E0 +FC20 +22A0 +2560 +ENDCHAR +STARTCHAR U_9E06 +ENCODING 40454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +23C0 +FE40 +A7C0 +FA40 +A7E0 +BE00 +93E0 +FEA0 +A960 +C420 +ENDCHAR +STARTCHAR U_9E07 +ENCODING 40455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +A540 +95C0 +FD40 +49E0 +7900 +49E0 +7AA0 +0560 +FC20 +ENDCHAR +STARTCHAR U_9E08 +ENCODING 40456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD00 +6BC0 +FE40 +2BC0 +7A40 +13E0 +7A00 +13E0 +FC20 +3AA0 +5560 +ENDCHAR +STARTCHAR U_9E09 +ENCODING 40457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +37E0 +6AA0 +BFC0 +2080 +3F80 +2080 +3FE0 +5520 +92C0 +ENDCHAR +STARTCHAR U_9E0A +ENCODING 40458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFC0 +A240 +B7C0 +EA40 +9FE0 +EA00 +BFE0 +A820 +EAA0 +8D40 +ENDCHAR +STARTCHAR U_9E0B +ENCODING 40459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +AA40 +57C0 +FE40 +ABE0 +FE00 +03E0 +FAA0 +1560 +3520 +ENDCHAR +STARTCHAR U_9E0C +ENCODING 40460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +9280 +F7E0 +9480 +FFC0 +8480 +FFE0 +0A40 +D980 +AE60 +ENDCHAR +STARTCHAR U_9E0D +ENCODING 40461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +57C0 +9240 +FFC0 +DA40 +B7E0 +DA00 +B7E0 +DA20 +92A0 +8760 +ENDCHAR +STARTCHAR U_9E0E +ENCODING 40462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +BFA0 +2080 +3F80 +2080 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9E0F +ENCODING 40463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +FBC0 +8A40 +FBE0 +5600 +BBE0 +5AA0 +9560 +2520 +ENDCHAR +STARTCHAR U_9E10 +ENCODING 40464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4BC0 +EA40 +5BC0 +EA40 +93E0 +FA00 +93E0 +FAA0 +9560 +FD20 +ENDCHAR +STARTCHAR U_9E11 +ENCODING 40465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A4C0 +5EA0 +A1E0 +3E80 +6340 +BFA0 +2080 +3FE0 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9E12 +ENCODING 40466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +4A40 +FFE0 +4840 +BFA0 +2480 +2280 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_9E13 +ENCODING 40467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +55C0 +7D40 +55C0 +7D40 +01E0 +FF00 +ABE0 +FE20 +AAA0 +FF60 +ENDCHAR +STARTCHAR U_9E14 +ENCODING 40468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +97E0 +F240 +97E0 +FA40 +87E0 +FD40 +5BA0 +AD40 +AB20 +ENDCHAR +STARTCHAR U_9E15 +ENCODING 40469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +23C0 +FE40 +A7C0 +FA40 +ABE0 +FA00 +ABE0 +FEA0 +9560 +FD20 +ENDCHAR +STARTCHAR U_9E16 +ENCODING 40470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13C0 +FE40 +D7C0 +3A40 +57E0 +7A00 +D3E0 +7820 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E17 +ENCODING 40471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE00 +53C0 +FC40 +4BC0 +4A20 +3FE0 +2080 +3F80 +2080 +3FE0 +4AA0 +ENDCHAR +STARTCHAR U_9E18 +ENCODING 40472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FE40 +ABC0 +7240 +ABE0 +5E00 +F7E0 +5C20 +F560 +5EA0 +ENDCHAR +STARTCHAR U_9E19 +ENCODING 40473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4BC0 +B640 +FFC0 +AA40 +FFE0 +0200 +FFE0 +AB60 +FEA0 +AA40 +ENDCHAR +STARTCHAR U_9E1A +ENCODING 40474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +53E0 +AA00 +FBE0 +5020 +26A0 +D960 +ENDCHAR +STARTCHAR U_9E1B +ENCODING 40475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +FA40 +ABC0 +FA40 +53E0 +7E00 +D3E0 +7C20 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E1C +ENCODING 40476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +53E0 +FA00 +53E0 +7820 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E1D +ENCODING 40477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +01C0 +EF40 +ABC0 +FD40 +95E0 +FF00 +95E0 +FE20 +A960 +BEA0 +ENDCHAR +STARTCHAR U_9E1E +ENCODING 40478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +50E0 +EE40 +4AE0 +BFA0 +2080 +3FE0 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9E1F +ENCODING 40479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +5100 +4900 +4200 +7FC0 +0040 +FF40 +0040 +0380 +ENDCHAR +STARTCHAR U_9E20 +ENCODING 40480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +5540 +5540 +5480 +57E0 +5020 +5FA0 +9020 +80C0 +ENDCHAR +STARTCHAR U_9E21 +ENCODING 40481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +1440 +9540 +5540 +2480 +27E0 +5020 +4FA0 +8020 +00C0 +ENDCHAR +STARTCHAR U_9E22 +ENCODING 40482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +1200 +3FA0 +2960 +2500 +2200 +3FC0 +0040 +FF40 +00C0 +ENDCHAR +STARTCHAR U_9E23 +ENCODING 40483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +9540 +9540 +9480 +F7E0 +0020 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_9E24 +ENCODING 40484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4B40 +7AC0 +4200 +43E0 +4020 +47A0 +80A0 +8040 +ENDCHAR +STARTCHAR U_9E25 +ENCODING 40485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +87C0 +9440 +D540 +A540 +A480 +D7E0 +9020 +87A0 +F820 +00C0 +ENDCHAR +STARTCHAR U_9E26 +ENCODING 40486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5440 +9540 +FD40 +3480 +37E0 +5020 +57A0 +9020 +3060 +ENDCHAR +STARTCHAR U_9E27 +ENCODING 40487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +46C0 +FA40 +4BE0 +5820 +47A0 +4820 +38A0 +0040 +ENDCHAR +STARTCHAR U_9E28 +ENCODING 40488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +4440 +5540 +7540 +2480 +FFE0 +2020 +27A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_9E29 +ENCODING 40489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +AD40 +2540 +3480 +37E0 +3020 +5FA0 +5020 +80C0 +ENDCHAR +STARTCHAR U_9E2A +ENCODING 40490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FD40 +2540 +2480 +FFE0 +8820 +8FA0 +F820 +00C0 +ENDCHAR +STARTCHAR U_9E2B +ENCODING 40491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2440 +5540 +9540 +FC80 +17E0 +5820 +97A0 +1020 +30C0 +ENDCHAR +STARTCHAR U_9E2C +ENCODING 40492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +2240 +FB40 +8AC0 +8A00 +FBE0 +8020 +87A0 +8020 +80C0 +ENDCHAR +STARTCHAR U_9E2D +ENCODING 40493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +FB40 +AAC0 +AA00 +FBE0 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_9E2E +ENCODING 40494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +7AC0 +0240 +FBE0 +2020 +3BA0 +0820 +28A0 +1040 +ENDCHAR +STARTCHAR U_9E2F +ENCODING 40495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +DF60 +1900 +1500 +1FC0 +0040 +7F40 +0080 +ENDCHAR +STARTCHAR U_9E30 +ENCODING 40496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +5740 +92C0 +7A00 +0BE0 +5020 +27A0 +10A0 +0040 +ENDCHAR +STARTCHAR U_9E31 +ENCODING 40497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F3C0 +9240 +9340 +FAC0 +9200 +93E0 +9020 +8FA0 +A8A0 +D440 +ENDCHAR +STARTCHAR U_9E32 +ENCODING 40498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +8A40 +0B40 +EAC0 +AA00 +ABE0 +E820 +0FA0 +2820 +10C0 +ENDCHAR +STARTCHAR U_9E33 +ENCODING 40499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4A40 +B2A0 +25E0 +7F80 +A880 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E34 +ENCODING 40500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +FFE0 +9040 +3F80 +2880 +2480 +3FC0 +0040 +FF40 +0080 +ENDCHAR +STARTCHAR U_9E35 +ENCODING 40501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +9420 +D000 +B200 +8240 +FA80 +0B00 +EA20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9E36 +ENCODING 40502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +5280 +FBE0 +0000 +FFE0 +2900 +2500 +3FC0 +0040 +FF40 +00C0 +ENDCHAR +STARTCHAR U_9E37 +ENCODING 40503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F780 +2A80 +F4A0 +2A60 +7F80 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E38 +ENCODING 40504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +23C0 +4240 +FB40 +AAC0 +AA00 +ABE0 +A820 +AFA0 +A820 +98C0 +ENDCHAR +STARTCHAR U_9E39 +ENCODING 40505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7C0 +2440 +FD40 +2540 +2480 +FFE0 +8820 +8FA0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9E3A +ENCODING 40506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +4A20 +5EA0 +CAA0 +4E40 +5BE0 +6820 +4BA0 +4820 +48C0 +ENDCHAR +STARTCHAR U_9E3B +ENCODING 40507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5BC0 +8240 +4340 +7EC0 +CA00 +4BE0 +4820 +4FA0 +48A0 +5840 +ENDCHAR +STARTCHAR U_9E3C +ENCODING 40508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +6B40 +5A40 +FFE0 +4820 +6FE0 +5820 +48A0 +9840 +ENDCHAR +STARTCHAR U_9E3D +ENCODING 40509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5440 +8D40 +F540 +0480 +F7E0 +9020 +97A0 +F020 +00C0 +ENDCHAR +STARTCHAR U_9E3E +ENCODING 40510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4940 +8920 +3F80 +2880 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E3F +ENCODING 40511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FC0 +8A40 +4B40 +2AC0 +2A80 +2FE0 +D820 +47A0 +4020 +40C0 +ENDCHAR +STARTCHAR U_9E40 +ENCODING 40512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +2B40 +6AC0 +6BE0 +B420 +27E0 +2020 +F8A0 +0040 +ENDCHAR +STARTCHAR U_9E41 +ENCODING 40513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +2240 +FB40 +8AC0 +FA00 +13E0 +2020 +FFA0 +2020 +6060 +ENDCHAR +STARTCHAR U_9E42 +ENCODING 40514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +0240 +FB40 +AAC0 +AA00 +FBE0 +A820 +AFA0 +A820 +A8C0 +ENDCHAR +STARTCHAR U_9E43 +ENCODING 40515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +F440 +0540 +F540 +9480 +F7E0 +9020 +FFA0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_9E44 +ENCODING 40516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +7E40 +9340 +12C0 +FE00 +03E0 +7C20 +47A0 +7C20 +44C0 +ENDCHAR +STARTCHAR U_9E45 +ENCODING 40517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +DBC0 +5640 +FF40 +52C0 +7200 +D7E0 +5420 +4BA0 +5620 +E2C0 +ENDCHAR +STARTCHAR U_9E46 +ENCODING 40518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +8640 +3340 +4AC0 +8600 +7BE0 +4820 +4FA0 +7820 +48C0 +ENDCHAR +STARTCHAR U_9E47 +ENCODING 40519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5BC0 +8A40 +AB40 +FAC0 +AA00 +BBE0 +E820 +AFA0 +A820 +98C0 +ENDCHAR +STARTCHAR U_9E48 +ENCODING 40520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +23C0 +FA40 +2B40 +FAC0 +A200 +FBE0 +6820 +6FA0 +B820 +A0C0 +ENDCHAR +STARTCHAR U_9E49 +ENCODING 40521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +EFC0 +0A40 +FF40 +2AC0 +BA00 +ABE0 +A820 +ABA0 +B420 +C260 +ENDCHAR +STARTCHAR U_9E4A +ENCODING 40522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +5340 +FAC0 +0200 +7BE0 +4820 +7FA0 +4820 +78C0 +ENDCHAR +STARTCHAR U_9E4B +ENCODING 40523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +0340 +FAC0 +AA00 +FBE0 +A820 +AFA0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9E4C +ENCODING 40524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5240 +AB40 +FEC0 +AA80 +FBE0 +A820 +FFA0 +2020 +30C0 +ENDCHAR +STARTCHAR U_9E4D +ENCODING 40525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8B40 +FAC0 +9200 +FFE0 +9020 +97A0 +D820 +9060 +ENDCHAR +STARTCHAR U_9E4E +ENCODING 40526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FBC0 +AA40 +FB40 +AAC0 +FA80 +23E0 +5020 +FFA0 +1020 +10C0 +ENDCHAR +STARTCHAR U_9E4F +ENCODING 40527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +AA40 +EF40 +AAC0 +AA00 +EFE0 +AA20 +ABA0 +AA20 +B6C0 +ENDCHAR +STARTCHAR U_9E50 +ENCODING 40528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +4A40 +9340 +42C0 +9A00 +8BE0 +D820 +8BA0 +F820 +0060 +ENDCHAR +STARTCHAR U_9E51 +ENCODING 40529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +7B40 +02C0 +7A00 +13E0 +1020 +FBA0 +1020 +30C0 +ENDCHAR +STARTCHAR U_9E52 +ENCODING 40530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +A240 +FB40 +AAC0 +FE00 +ABE0 +F820 +A7A0 +D020 +8860 +ENDCHAR +STARTCHAR U_9E53 +ENCODING 40531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +8640 +7F40 +5AC0 +9A00 +6FE0 +2820 +4BA0 +4C20 +8860 +ENDCHAR +STARTCHAR U_9E54 +ENCODING 40532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2A40 +FF40 +2AC0 +FA00 +ABE0 +F820 +AFA0 +A820 +A860 +ENDCHAR +STARTCHAR U_9E55 +ENCODING 40533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5DC0 +5540 +F5C0 +5D40 +F500 +9DE0 +9420 +F7A0 +2420 +4C60 +ENDCHAR +STARTCHAR U_9E56 +ENCODING 40534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4B40 +7A40 +23E0 +7C20 +D7E0 +6C20 +74A0 +0840 +ENDCHAR +STARTCHAR U_9E57 +ENCODING 40535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +EE40 +0340 +7AC0 +0200 +FFE0 +2020 +7BA0 +0820 +30C0 +ENDCHAR +STARTCHAR U_9E58 +ENCODING 40536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5B40 +FEC0 +8600 +7BE0 +4820 +7FA0 +4820 +58C0 +ENDCHAR +STARTCHAR U_9E59 +ENCODING 40537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +22A0 +FC80 +7140 +AA20 +3F80 +2480 +3FE0 +0020 +FF20 +0060 +ENDCHAR +STARTCHAR U_9E5A +ENCODING 40538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +4B40 +4AC0 +B600 +4BE0 +4820 +B7A0 +FC20 +00C0 +ENDCHAR +STARTCHAR U_9E5B +ENCODING 40539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +97C0 +FE40 +8340 +BEC0 +A600 +BFE0 +A420 +BFA0 +A420 +BCC0 +ENDCHAR +STARTCHAR U_9E5C +ENCODING 40540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +2BE0 +FC80 +3540 +5FA0 +9480 +1280 +1FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_9E5D +ENCODING 40541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5240 +7340 +02C0 +FA00 +DBE0 +F820 +AFA0 +A820 +A860 +ENDCHAR +STARTCHAR U_9E5E +ENCODING 40542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F5E0 +A520 +59A0 +7D60 +9100 +FDE0 +1020 +57A0 +5420 +7C60 +ENDCHAR +STARTCHAR U_9E5F +ENCODING 40543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +AFC0 +5240 +FB40 +02C0 +FFE0 +2420 +B7A0 +6C20 +B4A0 +6C40 +ENDCHAR +STARTCHAR U_9E60 +ENCODING 40544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +DDC0 +9540 +D5C0 +AD40 +01E0 +FC20 +A7A0 +FC20 +A4A0 +FC40 +ENDCHAR +STARTCHAR U_9E61 +ENCODING 40545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3BC0 +D640 +2B40 +4680 +FBE0 +4820 +7FA0 +4820 +78A0 +4840 +ENDCHAR +STARTCHAR U_9E62 +ENCODING 40546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +4BC0 +3240 +FF40 +4AC0 +8600 +7FE0 +5420 +5FA0 +F020 +0060 +ENDCHAR +STARTCHAR U_9E63 +ENCODING 40547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +51C0 +FF40 +55C0 +FF40 +5500 +FDE0 +5020 +DBE0 +5420 +5060 +ENDCHAR +STARTCHAR U_9E64 +ENCODING 40548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +A640 +5340 +7EC0 +D280 +7BE0 +5020 +7BE0 +5020 +7C60 +ENDCHAR +STARTCHAR U_9E65 +ENCODING 40549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8140 +FBE0 +A880 +FF60 +0800 +3F80 +2480 +3FC0 +0040 +FF40 +ENDCHAR +STARTCHAR U_9E66 +ENCODING 40550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +AA40 +AB40 +44C0 +AA00 +13E0 +FC20 +2BA0 +1020 +6C60 +ENDCHAR +STARTCHAR U_9E67 +ENCODING 40551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +8120 +A9A0 +FF60 +A900 +B9E0 +8020 +ABA0 +D420 +8060 +ENDCHAR +STARTCHAR U_9E68 +ENCODING 40552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +25E0 +B520 +6DA0 +9560 +2900 +D5E0 +2020 +4BE0 +1020 +60C0 +ENDCHAR +STARTCHAR U_9E69 +ENCODING 40553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +5640 +7B40 +CEC0 +7A00 +4BE0 +7820 +5BA0 +9420 +3060 +ENDCHAR +STARTCHAR U_9E6A +ENCODING 40554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +7DC0 +5140 +FDC0 +5140 +7D00 +51E0 +7C20 +55E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9E6B +ENCODING 40555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FFE0 +4900 +79A0 +56E0 +BF00 +2500 +3FC0 +0040 +FF40 +0080 +ENDCHAR +STARTCHAR U_9E6C +ENCODING 40556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +29C0 +FD40 +35C0 +5140 +FF00 +ABE0 +C620 +BBE0 +AA20 +BA60 +ENDCHAR +STARTCHAR U_9E6D +ENCODING 40557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4D40 +7BC0 +A660 +BBC0 +FF00 +2900 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E6E +ENCODING 40558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +0340 +FE80 +4BE0 +7820 +67E0 +D820 +48A0 +6440 +ENDCHAR +STARTCHAR U_9E6F +ENCODING 40559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +AB40 +BAC0 +8240 +FFE0 +4820 +7BE0 +4820 +FCA0 +0040 +ENDCHAR +STARTCHAR U_9E70 +ENCODING 40560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5500 +7FC0 +5500 +5FE0 +5280 +5FE0 +4020 +BF20 +80C0 +ENDCHAR +STARTCHAR U_9E71 +ENCODING 40561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +9140 +D7E0 +B280 +83E0 +FA80 +0BE0 +E940 +0880 +3360 +ENDCHAR +STARTCHAR U_9E72 +ENCODING 40562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FFC0 +4A40 +FF40 +86C0 +7A40 +67E0 +B820 +5BA0 +9420 +30C0 +ENDCHAR +STARTCHAR U_9E73 +ENCODING 40563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +EE40 +AB40 +EEC0 +5200 +7FE0 +D020 +7FA0 +5020 +7E60 +ENDCHAR +STARTCHAR U_9E74 +ENCODING 40564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +13C0 +FF40 +D6C0 +3A40 +57E0 +FC20 +57E0 +7C20 +D4A0 +5C40 +ENDCHAR +STARTCHAR U_9E75 +ENCODING 40565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0FC0 +0800 +FF80 +C980 +A280 +D480 +AD80 +8C80 +9A80 +A580 +FF80 +ENDCHAR +STARTCHAR U_9E76 +ENCODING 40566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +2280 +FC40 +A920 +D880 +ABC0 +A840 +D880 +A880 +F900 +ENDCHAR +STARTCHAR U_9E77 +ENCODING 40567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +2140 +FF20 +AC80 +D400 +BFE0 +D440 +AD80 +D480 +FC40 +ENDCHAR +STARTCHAR U_9E78 +ENCODING 40568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3940 +2220 +FDC0 +A880 +DBE0 +AAA0 +DBE0 +A880 +F940 +0620 +ENDCHAR +STARTCHAR U_9E79 +ENCODING 40569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +30A0 +2FE0 +F880 +AE80 +D8A0 +AEA0 +DAC0 +AEA0 +D960 +FA20 +ENDCHAR +STARTCHAR U_9E7A +ENCODING 40570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3FE0 +2080 +FBE0 +A880 +DFE0 +A900 +DBE0 +AC80 +8880 +FBE0 +ENDCHAR +STARTCHAR U_9E7B +ENCODING 40571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FE0 +2280 +FFE0 +AAA0 +DFE0 +AAA0 +FFE0 +AAC0 +DEA0 +FA80 +ENDCHAR +STARTCHAR U_9E7C +ENCODING 40572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +3A40 +25A0 +F800 +ABE0 +DAA0 +ABE0 +D940 +A940 +8AA0 +FCA0 +ENDCHAR +STARTCHAR U_9E7D +ENCODING 40573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +AD00 +F7E0 +9540 +F6C0 +A540 +F7C0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_9E7E +ENCODING 40574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3940 +23E0 +F880 +89C0 +D880 +AFE0 +A900 +DBC0 +8C80 +FBE0 +ENDCHAR +STARTCHAR U_9E7F +ENCODING 40575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_9E80 +ENCODING 40576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +7FE0 +5540 +59A0 +5DE0 +5000 +5F20 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9E81 +ENCODING 40577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +3200 +0C00 +7FE0 +4A40 +7FC0 +5200 +5AC0 +5300 +5A20 +91E0 +ENDCHAR +STARTCHAR U_9E82 +ENCODING 40578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +5DC0 +5120 +5FE0 +5100 +9120 +A0E0 +ENDCHAR +STARTCHAR U_9E83 +ENCODING 40579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +4920 +7FE0 +5140 +5DA0 +5120 +9DE0 +A940 +ENDCHAR +STARTCHAR U_9E84 +ENCODING 40580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3E80 +CA60 +1200 +7FE0 +5240 +7FC0 +5240 +5B80 +5220 +99E0 +ENDCHAR +STARTCHAR U_9E85 +ENCODING 40581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5280 +5B20 +51E0 +5F80 +7280 +5220 +8FE0 +ENDCHAR +STARTCHAR U_9E86 +ENCODING 40582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5500 +5920 +5FE0 +5080 +5F80 +9080 +7FE0 +ENDCHAR +STARTCHAR U_9E87 +ENCODING 40583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5540 +59A0 +5FE0 +4200 +7FE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_9E88 +ENCODING 40584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5540 +59A0 +7FE0 +4200 +5FC0 +8200 +FFE0 +ENDCHAR +STARTCHAR U_9E89 +ENCODING 40585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +2480 +7FE0 +4A40 +7FC0 +6240 +7BA0 +A220 +B9E0 +ENDCHAR +STARTCHAR U_9E8A +ENCODING 40586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FE0 +1500 +2480 +7FE0 +4A40 +7FC0 +5140 +5D80 +9120 +9CE0 +ENDCHAR +STARTCHAR U_9E8B +ENCODING 40587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5120 +5DE0 +6480 +5500 +7FE0 +9500 +A4C0 +ENDCHAR +STARTCHAR U_9E8C +ENCODING 40588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +7FE0 +5100 +7FC0 +4400 +BFE0 +9080 +ENDCHAR +STARTCHAR U_9E8D +ENCODING 40589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +5520 +7FE0 +4840 +7F80 +9520 +A5E0 +ENDCHAR +STARTCHAR U_9E8E +ENCODING 40590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4920 +5FE0 +5000 +5FE0 +5940 +A880 +AC60 +ENDCHAR +STARTCHAR U_9E8F +ENCODING 40591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4440 +7FE0 +4440 +7FC0 +5880 +A880 +CF80 +ENDCHAR +STARTCHAR U_9E90 +ENCODING 40592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FC0 +5220 +5BE0 +4200 +5FC0 +4700 +B8E0 +8F80 +ENDCHAR +STARTCHAR U_9E91 +ENCODING 40593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +AA40 +B2A0 +BBE0 +A040 +BFC0 +8A20 +33E0 +ENDCHAR +STARTCHAR U_9E92 +ENCODING 40594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD40 +ABE0 +FD40 +A9C0 +FD40 +A9C0 +BD40 +ABE0 +B940 +AE20 +ENDCHAR +STARTCHAR U_9E93 +ENCODING 40595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +6AC0 +A4A0 +7FE0 +4A40 +7FC0 +6240 +7FA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_9E94 +ENCODING 40596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +FFE0 +AA80 +B320 +FFE0 +AA80 +D240 +BFE0 +A080 +BF80 +ENDCHAR +STARTCHAR U_9E95 +ENCODING 40597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4920 +5FE0 +5240 +5FC0 +5740 +9AC0 +1FC0 +ENDCHAR +STARTCHAR U_9E96 +ENCODING 40598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +7FC0 +4920 +4DE0 +7FC0 +4880 +4F80 +8A80 +1240 +ENDCHAR +STARTCHAR U_9E97 +ENCODING 40599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A40 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +6240 +BFA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_9E98 +ENCODING 40600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +5FE0 +4200 +7FE0 +4F80 +7AE0 +8F80 +ENDCHAR +STARTCHAR U_9E99 +ENCODING 40601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A220 +BBE0 +A280 +FFE0 +8240 +BD80 +A520 +BEE0 +ENDCHAR +STARTCHAR U_9E9A +ENCODING 40602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A280 +BB20 +A3E0 +B840 +ABC0 +BA40 +A180 +BE60 +ENDCHAR +STARTCHAR U_9E9B +ENCODING 40603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +AA80 +B320 +FFE0 +8A40 +FBC0 +8A40 +B7E0 +ENDCHAR +STARTCHAR U_9E9C +ENCODING 40604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A200 +BBC0 +A200 +FFE0 +AA40 +FFE0 +8E00 +F5C0 +ENDCHAR +STARTCHAR U_9E9D +ENCODING 40605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5220 +5FE0 +5440 +57E0 +7E40 +9540 +ACC0 +ENDCHAR +STARTCHAR U_9E9E +ENCODING 40606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5220 +5FE0 +4880 +4F80 +4880 +7FE0 +8200 +ENDCHAR +STARTCHAR U_9E9F +ENCODING 40607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +FDC0 +ABE0 +FCC0 +ADA0 +FD40 +ABE0 +BD40 +ABE0 +BA40 +2C40 +ENDCHAR +STARTCHAR U_9EA0 +ENCODING 40608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4920 +7FE0 +5540 +5980 +7FE0 +5240 +7FE0 +9240 +FFE0 +ENDCHAR +STARTCHAR U_9EA1 +ENCODING 40609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +7FC0 +5680 +5B20 +7FE0 +4A80 +5540 +5480 +9F80 +A080 +ENDCHAR +STARTCHAR U_9EA2 +ENCODING 40610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5220 +5FE0 +6AA0 +5740 +5FC0 +5540 +9FC0 +ENDCHAR +STARTCHAR U_9EA3 +ENCODING 40611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +AFE0 +F840 +AF40 +FA60 +AFA0 +BD20 +EB40 +BFA0 +0920 +ENDCHAR +STARTCHAR U_9EA4 +ENCODING 40612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A80 +7FC0 +5200 +5F80 +9220 +FBE0 +AAA0 +FBE0 +AB40 +BD60 +ENDCHAR +STARTCHAR U_9EA5 +ENCODING 40613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +9520 +2880 +CF60 +1100 +6E00 +0500 +78C0 +ENDCHAR +STARTCHAR U_9EA6 +ENCODING 40614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +0800 +1F80 +6900 +0600 +79E0 +ENDCHAR +STARTCHAR U_9EA7 +ENCODING 40615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +55E0 +BA00 +3BE0 +5440 +BA80 +2900 +5220 +2A20 +C1E0 +ENDCHAR +STARTCHAR U_9EA8 +ENCODING 40616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +5500 +5540 +AB20 +4520 +B940 +4880 +B100 +3200 +CC00 +ENDCHAR +STARTCHAR U_9EA9 +ENCODING 40617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +55E0 +7A80 +9080 +3BE0 +5480 +BC80 +6940 +1240 +6C20 +ENDCHAR +STARTCHAR U_9EAA +ENCODING 40618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5480 +5480 +AAE0 +46A0 +BBE0 +6820 +9020 +28A0 +C040 +ENDCHAR +STARTCHAR U_9EAB +ENCODING 40619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5480 +56E0 +AA80 +47E0 +B820 +6820 +9020 +28A0 +C040 +ENDCHAR +STARTCHAR U_9EAC +ENCODING 40620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +57E0 +56A0 +BA80 +4BC0 +A740 +3A80 +5480 +2540 +DA20 +ENDCHAR +STARTCHAR U_9EAD +ENCODING 40621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +5420 +BBA0 +12A0 +3AA0 +57A0 +BE60 +6A00 +1220 +69E0 +ENDCHAR +STARTCHAR U_9EAE +ENCODING 40622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +55E0 +5480 +BA80 +3BE0 +5480 +BC80 +6900 +1220 +6BE0 +ENDCHAR +STARTCHAR U_9EAF +ENCODING 40623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +5480 +57E0 +BAA0 +4AA0 +A7E0 +7AA0 +D2A0 +22A0 +D3E0 +ENDCHAR +STARTCHAR U_9EB0 +ENCODING 40624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +5520 +7BE0 +9280 +3BE0 +5480 +BFE0 +6880 +1080 +6880 +ENDCHAR +STARTCHAR U_9EB1 +ENCODING 40625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FCA0 +57E0 +5480 +BBE0 +4AA0 +A7E0 +3AA0 +6BE0 +12A0 +EA60 +ENDCHAR +STARTCHAR U_9EB2 +ENCODING 40626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FA40 +57C0 +5640 +BBC0 +4A40 +A7C0 +7A80 +D280 +24A0 +D860 +ENDCHAR +STARTCHAR U_9EB3 +ENCODING 40627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +AD40 +AD40 +73A0 +5100 +8B80 +7340 +D560 +2900 +D100 +ENDCHAR +STARTCHAR U_9EB4 +ENCODING 40628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FBE0 +5520 +7D60 +93A0 +2FE0 +D5A0 +3B60 +6D20 +1120 +6860 +ENDCHAR +STARTCHAR U_9EB5 +ENCODING 40629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FD00 +57E0 +7AA0 +92A0 +3BA0 +56A0 +BFA0 +6AA0 +12A0 +6BE0 +ENDCHAR +STARTCHAR U_9EB6 +ENCODING 40630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +AB60 +FAA0 +27E0 +7080 +AFE0 +7CA0 +D560 +27E0 +D420 +ENDCHAR +STARTCHAR U_9EB7 +ENCODING 40631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +FFE0 +AAA0 +FFE0 +2AA0 +7AA0 +AFE0 +7A60 +D3E0 +3140 +CFE0 +ENDCHAR +STARTCHAR U_9EB8 +ENCODING 40632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27E0 +F900 +2100 +FFE0 +2100 +3A80 +D280 +2440 +D820 +ENDCHAR +STARTCHAR U_9EB9 +ENCODING 40633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FE00 +23E0 +7D20 +2560 +FBA0 +27E0 +7BA0 +D560 +21A0 +D040 +ENDCHAR +STARTCHAR U_9EBA +ENCODING 40634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +7200 +2FE0 +FAA0 +4BA0 +7AA0 +DBA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_9EBB +ENCODING 40635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +4880 +7FE0 +4880 +5DC0 +6AC0 +4CA0 +8880 +8880 +ENDCHAR +STARTCHAR U_9EBC +ENCODING 40636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4DC0 +5AA0 +6AA0 +4480 +4F00 +8240 +9FE0 +ENDCHAR +STARTCHAR U_9EBD +ENCODING 40637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5080 +7FE0 +5180 +7AC0 +54A0 +4A00 +5400 +A880 +9FC0 +ENDCHAR +STARTCHAR U_9EBE +ENCODING 40638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5F80 +4400 +7FC0 +8420 +83E0 +ENDCHAR +STARTCHAR U_9EBF +ENCODING 40639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4F80 +4880 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_9EC0 +ENCODING 40640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8880 +FFE0 +ADC0 +CAA0 +FFE0 +A540 +BC80 +A540 +FE20 +ENDCHAR +STARTCHAR U_9EC1 +ENCODING 40641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FC0 +5DC0 +6AA0 +5FC0 +4A80 +7FE0 +8880 +8F80 +ENDCHAR +STARTCHAR U_9EC2 +ENCODING 40642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4A80 +7FE0 +5080 +5F80 +5080 +9F80 +B0C0 +ENDCHAR +STARTCHAR U_9EC3 +ENCODING 40643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0000 +FFE0 +2480 +3F80 +2480 +3F80 +C060 +ENDCHAR +STARTCHAR U_9EC4 +ENCODING 40644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +60C0 +ENDCHAR +STARTCHAR U_9EC5 +ENCODING 40645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5280 +FA40 +2520 +F880 +ABC0 +F840 +A880 +F880 +8500 +ENDCHAR +STARTCHAR U_9EC6 +ENCODING 40646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57E0 +FD20 +2140 +F900 +A980 +F980 +AA80 +FAA0 +8C60 +ENDCHAR +STARTCHAR U_9EC7 +ENCODING 40647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +51E0 +FD00 +2100 +FBC0 +AA40 +FA40 +AA40 +FA40 +8FC0 +ENDCHAR +STARTCHAR U_9EC8 +ENCODING 40648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +53E0 +F880 +2080 +F880 +ABE0 +F880 +A880 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9EC9 +ENCODING 40649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9220 +7F80 +1200 +FFE0 +2480 +3F80 +2480 +3F80 +C060 +ENDCHAR +STARTCHAR U_9ECA +ENCODING 40650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +F880 +27E0 +F880 +A880 +FBE0 +A880 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9ECB +ENCODING 40651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFC0 +7280 +27E0 +FD40 +57C0 +5540 +57C0 +5440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_9ECC +ENCODING 40652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +75C0 +4A40 +FFE0 +9120 +FFE0 +4440 +7FC0 +4440 +7FC0 +C060 +ENDCHAR +STARTCHAR U_9ECD +ENCODING 40653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +CE60 +1500 +74E0 +0F00 +3480 +CC60 +ENDCHAR +STARTCHAR U_9ECE +ENCODING 40654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23E0 +FCA0 +70A0 +AD20 +2AC0 +1500 +F5E0 +0E00 +75C0 +0C00 +ENDCHAR +STARTCHAR U_9ECF +ENCODING 40655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FEE0 +5480 +9280 +29E0 +D720 +5520 +3920 +5520 +B3E0 +ENDCHAR +STARTCHAR U_9ED0 +ENCODING 40656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +FEA0 +7520 +AEA0 +77E0 +A900 +AFE0 +7560 +AFA0 +6460 +ENDCHAR +STARTCHAR U_9ED1 +ENCODING 40657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +5540 +4E40 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9ED2 +ENCODING 40658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9ED3 +ENCODING 40659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A920 +F900 +AFE0 +F900 +2100 +F900 +20A0 +F8A0 +D460 +A820 +ENDCHAR +STARTCHAR U_9ED4 +ENCODING 40660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +FA80 +AC40 +F920 +2080 +FBE0 +2040 +FC80 +6880 +9500 +ENDCHAR +STARTCHAR U_9ED5 +ENCODING 40661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +FBE0 +AAA0 +FAA0 +2080 +F880 +2080 +F9A0 +56A0 +9460 +ENDCHAR +STARTCHAR U_9ED6 +ENCODING 40662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FA80 +AA80 +FFE0 +2080 +F880 +2180 +FAA0 +54A0 +9460 +ENDCHAR +STARTCHAR U_9ED7 +ENCODING 40663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +FFE0 +A900 +FD40 +2540 +F7C0 +2100 +F900 +5120 +A8E0 +ENDCHAR +STARTCHAR U_9ED8 +ENCODING 40664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A980 +F940 +AFE0 +F900 +2100 +F900 +2280 +FA80 +5440 +A820 +ENDCHAR +STARTCHAR U_9ED9 +ENCODING 40665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A940 +F920 +AFE0 +F900 +2280 +F280 +2460 +F800 +5240 +8920 +ENDCHAR +STARTCHAR U_9EDA +ENCODING 40666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +AA40 +FFE0 +AA40 +FA40 +23C0 +FA40 +2240 +FA40 +6A40 +97C0 +ENDCHAR +STARTCHAR U_9EDB +ENCODING 40667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +C120 +7FE0 +2A80 +3F80 +0400 +3F80 +0400 +FFE0 +4A40 +ENDCHAR +STARTCHAR U_9EDC +ENCODING 40668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AAA0 +FAA0 +AAA0 +FBE0 +2080 +F880 +22A0 +FAA0 +52A0 +ABE0 +ENDCHAR +STARTCHAR U_9EDD +ENCODING 40669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AA80 +FC80 +ADE0 +FAA0 +22A0 +FDA0 +27A0 +F8A0 +5120 +AAC0 +ENDCHAR +STARTCHAR U_9EDE +ENCODING 40670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +F8E0 +A880 +F880 +23E0 +FA20 +2220 +FA20 +5220 +ABE0 +ENDCHAR +STARTCHAR U_9EDF +ENCODING 40671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A9E0 +FA20 +A940 +F880 +23E0 +F920 +22A0 +F840 +5080 +AB00 +ENDCHAR +STARTCHAR U_9EE0 +ENCODING 40672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +FFE0 +A880 +FBE0 +2000 +FBE0 +2220 +FA20 +5220 +ABE0 +ENDCHAR +STARTCHAR U_9EE1 +ENCODING 40673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4240 +7FE0 +4880 +7FE0 +5AC0 +5740 +5FC0 +4200 +BFE0 +94A0 +ENDCHAR +STARTCHAR U_9EE2 +ENCODING 40674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AA40 +FFE0 +A940 +FA20 +2500 +F9E0 +2340 +FC80 +5140 +AE20 +ENDCHAR +STARTCHAR U_9EE3 +ENCODING 40675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FC00 +AFC0 +FD40 +27E0 +FC40 +2540 +FFE0 +A940 +A880 +ENDCHAR +STARTCHAR U_9EE4 +ENCODING 40676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AFE0 +F940 +AAA0 +FFE0 +22A0 +FBE0 +22A0 +FBE0 +50A0 +A8E0 +ENDCHAR +STARTCHAR U_9EE5 +ENCODING 40677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F800 +ABE0 +FA20 +23E0 +F880 +22C0 +FAA0 +54A0 +A980 +ENDCHAR +STARTCHAR U_9EE6 +ENCODING 40678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +FC20 +AA00 +FBE0 +22A0 +FCA0 +22E0 +F980 +52A0 +ACE0 +ENDCHAR +STARTCHAR U_9EE7 +ENCODING 40679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD20 +6A20 +A440 +7FC0 +5540 +7FC0 +0400 +FFC0 +8920 +ENDCHAR +STARTCHAR U_9EE8 +ENCODING 40680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +7FC0 +4A40 +7FC0 +0400 +7FC0 +0400 +FFE0 +9220 +ENDCHAR +STARTCHAR U_9EE9 +ENCODING 40681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABE0 +F880 +AFE0 +FA20 +2580 +FA80 +27E0 +F880 +5140 +AE20 +ENDCHAR +STARTCHAR U_9EEA +ENCODING 40682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AA40 +FFE0 +A880 +FFE0 +2280 +FD40 +22A0 +FD40 +5280 +A900 +ENDCHAR +STARTCHAR U_9EEB +ENCODING 40683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +FFE0 +AAA0 +FAA0 +22A0 +FFE0 +2080 +FBE0 +5080 +AFE0 +ENDCHAR +STARTCHAR U_9EEC +ENCODING 40684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A8A0 +FFE0 +AC80 +FF80 +24A0 +FFA0 +2540 +FFC0 +D560 +AA20 +ENDCHAR +STARTCHAR U_9EED +ENCODING 40685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A940 +FBE0 +AC00 +FBE0 +2220 +FBE0 +2240 +FFE0 +5240 +AC40 +ENDCHAR +STARTCHAR U_9EEE +ENCODING 40686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +AFE0 +FA40 +ABC0 +FA40 +23C0 +FA40 +27E0 +FD40 +5620 +AFE0 +ENDCHAR +STARTCHAR U_9EEF +ENCODING 40687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +FA20 +A940 +FFE0 +2000 +FBE0 +2220 +FBE0 +0220 +ABE0 +ENDCHAR +STARTCHAR U_9EF0 +ENCODING 40688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AFE0 +F900 +ABC0 +FA40 +23C0 +FA40 +23C0 +FA40 +57E0 +AA40 +ENDCHAR +STARTCHAR U_9EF1 +ENCODING 40689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +77C0 +5100 +5FE0 +7440 +5FE0 +7540 +57C0 +5100 +9FE0 +2AA0 +ENDCHAR +STARTCHAR U_9EF2 +ENCODING 40690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A940 +FBE0 +AAA0 +FFE0 +2240 +FD20 +22A0 +F940 +5080 +AB00 +ENDCHAR +STARTCHAR U_9EF3 +ENCODING 40691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9260 +FFC0 +A940 +FFE0 +5540 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9EF4 +ENCODING 40692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +5F80 +80E0 +3FA0 +55A0 +DFA0 +44A0 +5FA0 +4440 +5FA0 +5520 +ENDCHAR +STARTCHAR U_9EF5 +ENCODING 40693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +ABE0 +FEA0 +AB40 +FBE0 +2200 +FBE0 +2200 +FDE0 +5120 +A9E0 +ENDCHAR +STARTCHAR U_9EF6 +ENCODING 40694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +BFE0 +B480 +AD40 +BFE0 +AAA0 +BFE0 +8200 +FFE0 +A920 +ENDCHAR +STARTCHAR U_9EF7 +ENCODING 40695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F880 +AFE0 +FAA0 +2FE0 +FA40 +23C0 +FA40 +53C0 +AC20 +ENDCHAR +STARTCHAR U_9EF8 +ENCODING 40696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A900 +FFE0 +AD40 +FF80 +2520 +FCE0 +26A0 +FFE0 +AAA0 +B7E0 +ENDCHAR +STARTCHAR U_9EF9 +ENCODING 40697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +2480 +1500 +7FC0 +4640 +4D40 +54C0 +6440 +44C0 +ENDCHAR +STARTCHAR U_9EFA +ENCODING 40698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +6D40 +2920 +FE20 +5400 +FFE0 +9520 +B520 +DD20 +95A0 +9640 +ENDCHAR +STARTCHAR U_9EFB +ENCODING 40699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +6D20 +2BE0 +FD00 +5500 +FDC0 +9540 +B740 +DE80 +9540 +9620 +ENDCHAR +STARTCHAR U_9EFC +ENCODING 40700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAC0 +6CA0 +29E0 +FE80 +55E0 +FEA0 +93E0 +BAA0 +D7E0 +92A0 +96E0 +ENDCHAR +STARTCHAR U_9EFD +ENCODING 40701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +F3C0 +1200 +F3C0 +9240 +F3C0 +9240 +F3C0 +1220 +0FE0 +ENDCHAR +STARTCHAR U_9EFE +ENCODING 40702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +0800 +FF80 +8880 +FF80 +8880 +FF80 +0840 +07C0 +ENDCHAR +STARTCHAR U_9EFF +ENCODING 40703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFC0 +1220 +FFE0 +4A40 +FBC0 +8A40 +FBC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F00 +ENCODING 40704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +4040 +BFA0 +2A80 +7BC0 +4A40 +7BC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F01 +ENCODING 40705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +7FC0 +4A40 +FBC0 +8A40 +FBC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F02 +ENCODING 40706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +0000 +3F80 +2A80 +FBE0 +AAA0 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F03 +ENCODING 40707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0000 +FFE0 +4A40 +FBE0 +AAA0 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F04 +ENCODING 40708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4400 +FFE0 +2480 +7FC0 +AAA0 +7BC0 +4A40 +7BC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F05 +ENCODING 40709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9120 +FFE0 +4400 +BF80 +2A80 +7BC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F06 +ENCODING 40710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +86A0 +7BE0 +4880 +7BE0 +4AA0 +7BE0 +12A0 +FFE0 +28A0 +44E0 +ENDCHAR +STARTCHAR U_9F07 +ENCODING 40711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD40 +4880 +FFE0 +4A80 +FBC0 +8A40 +FBC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F08 +ENCODING 40712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FD40 +A880 +A960 +3F80 +2A80 +7BC0 +4A40 +7BA0 +07E0 +ENDCHAR +STARTCHAR U_9F09 +ENCODING 40713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +4440 +FFE0 +4A40 +FFC0 +8A40 +8BC0 +FA20 +0FE0 +ENDCHAR +STARTCHAR U_9F0A +ENCODING 40714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4940 +7FE0 +A480 +7FC0 +4A40 +FBE0 +8A20 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F0B +ENCODING 40715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +7FC0 +2220 +FFE0 +2080 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0C +ENCODING 40716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2500 +FFE0 +2080 +7FC0 +4440 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0D +ENCODING 40717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FC0 +2480 +FFE0 +2100 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0E +ENCODING 40718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +50A0 +5FA0 +50A0 +7FE0 +0900 +F9E0 +4920 +8920 +ENDCHAR +STARTCHAR U_9F0F +ENCODING 40719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +1F00 +5140 +5F40 +5140 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_9F10 +ENCODING 40720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +11E0 +2020 +DF60 +1100 +5F40 +5140 +7FC0 +0A00 +7BE0 +8A20 +ENDCHAR +STARTCHAR U_9F11 +ENCODING 40721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +5F40 +5540 +5B40 +5540 +7FC0 +0900 +F9E0 +4920 +8920 +ENDCHAR +STARTCHAR U_9F12 +ENCODING 40722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +0A00 +7F00 +1100 +5F40 +5140 +7FC0 +0A00 +7BE0 +8A40 +ENDCHAR +STARTCHAR U_9F13 +ENCODING 40723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +23E0 +7880 +03E0 +7A20 +4940 +7940 +4880 +3D40 +C620 +ENDCHAR +STARTCHAR U_9F14 +ENCODING 40724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7900 +07E0 +7C40 +4A40 +7980 +2980 +3260 +CC40 +ENDCHAR +STARTCHAR U_9F15 +ENCODING 40725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBC0 +8940 +FE80 +5140 +FE20 +1100 +E4E0 +0A00 +0400 +ENDCHAR +STARTCHAR U_9F16 +ENCODING 40726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1500 +FFE0 +2080 +FFE0 +2080 +FBE0 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_9F17 +ENCODING 40727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +5B40 +F9E0 +2080 +FFE0 +2080 +FBE0 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_9F18 +ENCODING 40728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5360 +FA40 +7FC0 +4040 +7BC0 +8A40 +ENDCHAR +STARTCHAR U_9F19 +ENCODING 40729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F8C0 +FFA0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9F1A +ENCODING 40730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5160 +FF80 +2000 +FFE0 +2280 +39E0 +ENDCHAR +STARTCHAR U_9F1B +ENCODING 40731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5760 +F980 +5140 +3FE0 +E080 +3F80 +ENDCHAR +STARTCHAR U_9F1C +ENCODING 40732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5360 +FF80 +2A00 +7FC0 +A4A0 +FFC0 +ENDCHAR +STARTCHAR U_9F1D +ENCODING 40733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +AEE0 +4820 +CEE0 +52A0 +FFE0 +2900 +3BC0 +2A40 +1980 +E660 +ENDCHAR +STARTCHAR U_9F1E +ENCODING 40734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +FC80 +5540 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9F1F +ENCODING 40735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +2A80 +3900 +2A80 +FE80 +2940 +3F80 +D160 +0E00 +7FC0 +ENDCHAR +STARTCHAR U_9F20 +ENCODING 40736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F780 +8080 +FF80 +0000 +CD00 +AB00 +CD40 +AAC0 +EE40 +ENDCHAR +STARTCHAR U_9F21 +ENCODING 40737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +0100 +3FC0 +2440 +3FC0 +2440 +3FC0 +2440 +4440 +8420 +ENDCHAR +STARTCHAR U_9F22 +ENCODING 40738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8940 +D940 +8A20 +FC20 +ABE0 +F920 +A920 +FA20 +A4A0 +F240 +ENDCHAR +STARTCHAR U_9F23 +ENCODING 40739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +88C0 +D8A0 +8880 +FFE0 +A880 +F880 +A940 +F940 +A620 +F220 +ENDCHAR +STARTCHAR U_9F24 +ENCODING 40740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8880 +DFE0 +8A40 +FA40 +AA40 +F980 +A880 +F940 +A640 +F220 +ENDCHAR +STARTCHAR U_9F25 +ENCODING 40741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5940 +8920 +DFE0 +8900 +F900 +A9E0 +FA20 +AD40 +F880 +A540 +F220 +ENDCHAR +STARTCHAR U_9F26 +ENCODING 40742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8920 +D920 +8920 +FAC0 +AC00 +F9E0 +A920 +F920 +AD20 +E5E0 +ENDCHAR +STARTCHAR U_9F27 +ENCODING 40743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8880 +DFE0 +8C20 +FA00 +AA40 +FB80 +AA00 +FA20 +AE20 +F5E0 +ENDCHAR +STARTCHAR U_9F28 +ENCODING 40744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8900 +D9E0 +8A20 +FD40 +A880 +F940 +AEA0 +F840 +A480 +F240 +ENDCHAR +STARTCHAR U_9F29 +ENCODING 40745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5A00 +8A00 +DBE0 +8C20 +FBA0 +AAA0 +FBA0 +A820 +F820 +AAA0 +F640 +ENDCHAR +STARTCHAR U_9F2A +ENCODING 40746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8A80 +DBE0 +8C80 +F880 +A880 +FBE0 +A880 +F880 +A880 +F7E0 +ENDCHAR +STARTCHAR U_9F2B +ENCODING 40747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8880 +D880 +8900 +F9E0 +AB20 +FD20 +A920 +FD20 +AD20 +F5E0 +ENDCHAR +STARTCHAR U_9F2C +ENCODING 40748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8880 +DBE0 +8AA0 +FAA0 +AAA0 +FBE0 +AAA0 +FEA0 +AEA0 +F7E0 +ENDCHAR +STARTCHAR U_9F2D +ENCODING 40749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8BE0 +D880 +8FE0 +F840 +AFE0 +F840 +AA40 +F940 +AC40 +F4C0 +ENDCHAR +STARTCHAR U_9F2E +ENCODING 40750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E00 +8AE0 +DA40 +8A40 +FCE0 +AA40 +FA40 +AE40 +FAE0 +AB00 +F4E0 +ENDCHAR +STARTCHAR U_9F2F +ENCODING 40751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +8900 +DBC0 +8940 +F940 +AFE0 +F800 +ABC0 +FA40 +AA40 +F7C0 +ENDCHAR +STARTCHAR U_9F30 +ENCODING 40752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A20 +DA20 +8BE0 +FA20 +ABE0 +FA20 +AA20 +FBE0 +A940 +F620 +ENDCHAR +STARTCHAR U_9F31 +ENCODING 40753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8BE0 +D880 +8BE0 +F880 +AFE0 +FA20 +ABE0 +FA20 +ABE0 +F620 +ENDCHAR +STARTCHAR U_9F32 +ENCODING 40754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8CA0 +DBE0 +8AA0 +FBE0 +AAA0 +FBE0 +A880 +FFE0 +A880 +F480 +ENDCHAR +STARTCHAR U_9F33 +ENCODING 40755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A20 +DBE0 +8A20 +FBE0 +A940 +F920 +AFE0 +F900 +AA80 +F460 +ENDCHAR +STARTCHAR U_9F34 +ENCODING 40756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8AA0 +DAE0 +8AA0 +FAE0 +AA40 +FBE0 +AAA0 +FA40 +AAA0 +F7E0 +ENDCHAR +STARTCHAR U_9F35 +ENCODING 40757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8FE0 +DC20 +8A40 +FD20 +A940 +FFE0 +A900 +F980 +AA40 +F420 +ENDCHAR +STARTCHAR U_9F36 +ENCODING 40758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A80 +DAE0 +8A80 +FBE0 +AAA0 +FBE0 +AA80 +FBE0 +AB40 +F560 +ENDCHAR +STARTCHAR U_9F37 +ENCODING 40759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +58C0 +8F20 +DAA0 +8940 +FB80 +A940 +FFE0 +A880 +FBE0 +A940 +F620 +ENDCHAR +STARTCHAR U_9F38 +ENCODING 40760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5A40 +8FE0 +DA80 +8FE0 +FAA0 +AFE0 +FAA0 +AFE0 +FE80 +AAC0 +F6A0 +ENDCHAR +STARTCHAR U_9F39 +ENCODING 40761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DBC0 +8A40 +FFE0 +AD20 +FBE0 +A940 +FA40 +A980 +F660 +ENDCHAR +STARTCHAR U_9F3A +ENCODING 40762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8AA0 +DBE0 +8AA0 +FBE0 +A800 +FFE0 +AAA0 +FFE0 +AAA0 +E7E0 +ENDCHAR +STARTCHAR U_9F3B +ENCODING 40763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +2280 +7FC0 +4440 +7FC0 +4440 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_9F3C +ENCODING 40764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +3C20 +24A0 +7EA0 +52A0 +7EA0 +52E0 +FEA0 +2420 +2420 +4420 +ENDCHAR +STARTCHAR U_9F3D +ENCODING 40765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4900 +7BC0 +4940 +F940 +A940 +D940 +FE40 +5240 +9460 +ENDCHAR +STARTCHAR U_9F3E +ENCODING 40766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BE0 +4880 +7880 +4880 +FFE0 +D480 +AC80 +FE80 +4880 +8880 +ENDCHAR +STARTCHAR U_9F3F +ENCODING 40767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5280 +5280 +FA80 +AA80 +FA80 +AAA0 +FAA0 +54A0 +98E0 +ENDCHAR +STARTCHAR U_9F40 +ENCODING 40768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7100 +5100 +5380 +FA80 +AB80 +FA80 +AA80 +FEA0 +52A0 +9360 +ENDCHAR +STARTCHAR U_9F41 +ENCODING 40769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7200 +53E0 +5420 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +50A0 +9040 +ENDCHAR +STARTCHAR U_9F42 +ENCODING 40770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5140 +57E0 +F940 +AFC0 +F900 +AD40 +FB80 +5560 +9300 +ENDCHAR +STARTCHAR U_9F43 +ENCODING 40771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7240 +53C0 +5240 +FBC0 +A900 +FBE0 +ADA0 +FA60 +53A0 +9060 +ENDCHAR +STARTCHAR U_9F44 +ENCODING 40772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +73E0 +51C0 +52A0 +FFE0 +AA20 +FBE0 +AA20 +FBE0 +5000 +93E0 +ENDCHAR +STARTCHAR U_9F45 +ENCODING 40773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7BE0 +4A20 +FFE0 +A4A0 +97E0 +FC80 +4940 +8A20 +ENDCHAR +STARTCHAR U_9F46 +ENCODING 40774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +7D40 +4AA0 +7BC0 +4A40 +FBE0 +AAA0 +DBE0 +FE00 +4A20 +89E0 +ENDCHAR +STARTCHAR U_9F47 +ENCODING 40775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7100 +57E0 +7520 +57C0 +FD20 +DFE0 +AA40 +FBC0 +5240 +97E0 +ENDCHAR +STARTCHAR U_9F48 +ENCODING 40776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +4AA0 +7FE0 +4AA0 +FFE0 +A800 +DFE0 +FAA0 +4A40 +8B20 +ENDCHAR +STARTCHAR U_9F49 +ENCODING 40777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7240 +57E0 +75A0 +5240 +FFE0 +DA40 +AFE0 +FAA0 +5640 +9B20 +ENDCHAR +STARTCHAR U_9F4A +ENCODING 40778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +95A0 +2080 +3F80 +2080 +3F80 +C080 +ENDCHAR +STARTCHAR U_9F4B +ENCODING 40779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +A020 +3FC0 +2040 +3FC0 +5540 +A4C0 +ENDCHAR +STARTCHAR U_9F4C +ENCODING 40780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +B5A0 +4040 +7FC0 +5540 +4A40 +9140 +ENDCHAR +STARTCHAR U_9F4D +ENCODING 40781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +A520 +7FC0 +4040 +FFC0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_9F4E +ENCODING 40782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +FFE0 +4040 +7FC0 +5540 +5F40 +B1C0 +ENDCHAR +STARTCHAR U_9F4F +ENCODING 40783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +B5A0 +7FC0 +4A40 +7BC0 +4A40 +BFC0 +ENDCHAR +STARTCHAR U_9F50 +ENCODING 40784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +0900 +0600 +1980 +E060 +0900 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_9F51 +ENCODING 40785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +0600 +F9E0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +BFC0 +ENDCHAR +STARTCHAR U_9F52 +ENCODING 40786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5140 +6AC0 +4440 +7FC0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_9F53 +ENCODING 40787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5100 +FF00 +0100 +AD00 +D500 +FD00 +AD00 +D520 +FCE0 +ENDCHAR +STARTCHAR U_9F54 +ENCODING 40788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5100 +FD20 +D540 +AD80 +FD00 +8500 +D520 +AD20 +FCE0 +ENDCHAR +STARTCHAR U_9F55 +ENCODING 40789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +BD00 +A1E0 +FE00 +85E0 +D440 +AC80 +FD00 +D520 +AE20 +FDE0 +ENDCHAR +STARTCHAR U_9F56 +ENCODING 40790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BC40 +A140 +FD40 +87E0 +D440 +ACC0 +FD40 +D640 +AC40 +FCC0 +ENDCHAR +STARTCHAR U_9F57 +ENCODING 40791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +5D80 +5100 +FD00 +85E0 +D540 +AD40 +FD40 +D540 +AE40 +FE40 +ENDCHAR +STARTCHAR U_9F58 +ENCODING 40792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FE20 +8540 +D540 +AD40 +FD40 +D540 +AD40 +FE40 +ENDCHAR +STARTCHAR U_9F59 +ENCODING 40793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5FE0 +5420 +FFA0 +84A0 +D4A0 +AFA0 +FC20 +D4C0 +AC20 +FFE0 +ENDCHAR +STARTCHAR U_9F5A +ENCODING 40794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5900 +53E0 +FD00 +0100 +ADE0 +D500 +FDE0 +AD00 +D500 +FD00 +ENDCHAR +STARTCHAR U_9F5B +ENCODING 40795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D40 +5540 +FFE0 +8540 +D540 +AD40 +FD40 +D5C0 +AC00 +FFE0 +ENDCHAR +STARTCHAR U_9F5C +ENCODING 40796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D40 +5140 +FD60 +85C0 +D540 +AD40 +FD40 +D540 +ADC0 +FE60 +ENDCHAR +STARTCHAR U_9F5D +ENCODING 40797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5080 +FD20 +87E0 +AC00 +D5E0 +FD20 +D520 +AD20 +FDE0 +ENDCHAR +STARTCHAR U_9F5E +ENCODING 40798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5D20 +5120 +FD20 +8520 +ADE0 +D400 +FC00 +D540 +AD20 +FE20 +ENDCHAR +STARTCHAR U_9F5F +ENCODING 40799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5D40 +5140 +FF40 +85C0 +AD40 +D540 +FDC0 +D540 +AD40 +FFE0 +ENDCHAR +STARTCHAR U_9F60 +ENCODING 40800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5D20 +5120 +FD20 +86C0 +AC00 +D5E0 +FD20 +D520 +AD20 +FDE0 +ENDCHAR +STARTCHAR U_9F61 +ENCODING 40801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FE20 +8500 +D480 +AFE0 +FC40 +D580 +AC40 +FC40 +ENDCHAR +STARTCHAR U_9F62 +ENCODING 40802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5980 +5240 +FD20 +0080 +D800 +AFE0 +F840 +AA80 +D900 +F880 +ENDCHAR +STARTCHAR U_9F63 +ENCODING 40803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +51E0 +FE20 +8420 +AFA0 +D6A0 +FEA0 +D7A0 +AC20 +FCC0 +ENDCHAR +STARTCHAR U_9F64 +ENCODING 40804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FC0 +0800 +FFE0 +5240 +FFA0 +5540 +7FC0 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_9F65 +ENCODING 40805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BFE0 +A2A0 +FFE0 +D6A0 +AFE0 +A480 +FCA0 +D440 +ACA0 +FD20 +ENDCHAR +STARTCHAR U_9F66 +ENCODING 40806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +BD20 +A120 +FDE0 +D520 +ADE0 +A5A0 +FD40 +D540 +ADA0 +FD20 +ENDCHAR +STARTCHAR U_9F67 +ENCODING 40807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2120 +FE40 +2400 +FFE0 +0A00 +5540 +7FC0 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_9F68 +ENCODING 40808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5A60 +5220 +FE20 +0220 +AB60 +DA20 +FA20 +AA20 +DBE0 +FA20 +ENDCHAR +STARTCHAR U_9F69 +ENCODING 40809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5BE0 +5140 +FE20 +0140 +AD40 +D540 +FC80 +AC80 +D540 +FE20 +ENDCHAR +STARTCHAR U_9F6A +ENCODING 40810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +BD20 +A120 +FFE0 +D440 +AD40 +A560 +FD40 +D540 +AD40 +FEE0 +ENDCHAR +STARTCHAR U_9F6B +ENCODING 40811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +BC20 +A4A0 +FFE0 +84A0 +D5E0 +AEA0 +FCA0 +D4A0 +AC20 +FFE0 +ENDCHAR +STARTCHAR U_9F6C +ENCODING 40812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BC80 +A3E0 +FD20 +87E0 +D400 +ADE0 +FD20 +D520 +ADE0 +FD20 +ENDCHAR +STARTCHAR U_9F6D +ENCODING 40813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +5AC0 +5280 +FBE0 +02A0 +ABA0 +DAA0 +FAA0 +AAA0 +DAA0 +FD20 +ENDCHAR +STARTCHAR U_9F6E +ENCODING 40814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BBE0 +A080 +FD40 +87E0 +D420 +AFA0 +FEA0 +D7A0 +AC20 +FC60 +ENDCHAR +STARTCHAR U_9F6F +ENCODING 40815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BB60 +A220 +FF60 +D620 +AE20 +A7E0 +FD40 +D540 +AD40 +FE60 +ENDCHAR +STARTCHAR U_9F70 +ENCODING 40816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5BE0 +5140 +FFE0 +8400 +D5E0 +AD20 +FDE0 +D520 +ADE0 +FD20 +ENDCHAR +STARTCHAR U_9F71 +ENCODING 40817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +BD00 +A5E0 +FF20 +8520 +D5A0 +AFA0 +FD40 +D740 +ADA0 +FD20 +ENDCHAR +STARTCHAR U_9F72 +ENCODING 40818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +B880 +A3E0 +FAA0 +03E0 +A880 +DBE0 +FAA0 +ABE0 +DA20 +FA60 +ENDCHAR +STARTCHAR U_9F73 +ENCODING 40819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5CA0 +57E0 +F880 +03E0 +AAA0 +DBE0 +FAA0 +AFE0 +D880 +F880 +ENDCHAR +STARTCHAR U_9F74 +ENCODING 40820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BBE0 +A140 +FBE0 +8A20 +AA40 +DAA0 +FA40 +AAA0 +DA40 +FD80 +ENDCHAR +STARTCHAR U_9F75 +ENCODING 40821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BAA0 +A3E0 +FEA0 +03E0 +A880 +DBE0 +FAA0 +ABE0 +DA20 +FA60 +ENDCHAR +STARTCHAR U_9F76 +ENCODING 40822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BAA0 +A3E0 +FC00 +01E0 +D400 +AFE0 +FC80 +D5E0 +AC20 +FCC0 +ENDCHAR +STARTCHAR U_9F77 +ENCODING 40823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +BC20 +A7E0 +FC00 +07E0 +D540 +AFE0 +FC80 +D7E0 +AC80 +FFE0 +ENDCHAR +STARTCHAR U_9F78 +ENCODING 40824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +B940 +A3E0 +FC00 +0140 +D620 +AFE0 +FCA0 +D4A0 +ACA0 +FFE0 +ENDCHAR +STARTCHAR U_9F79 +ENCODING 40825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +FFE0 +1200 +FFC0 +2400 +FFE0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_9F7A +ENCODING 40826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5BE0 +52A0 +FFE0 +84A0 +D740 +ADE0 +FEA0 +D7E0 +ACA0 +FD40 +ENDCHAR +STARTCHAR U_9F7B +ENCODING 40827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5DE0 +5080 +FDE0 +D520 +ADE0 +8520 +FDE0 +D520 +AFE0 +FD20 +ENDCHAR +STARTCHAR U_9F7C +ENCODING 40828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5FE0 +5280 +FFC0 +02A0 +AFE0 +D880 +FAC0 +AA80 +DB80 +FCE0 +ENDCHAR +STARTCHAR U_9F7D +ENCODING 40829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +B7E0 +A2C0 +FF60 +0240 +ABE0 +D800 +FFE0 +A9C0 +DAA0 +F980 +ENDCHAR +STARTCHAR U_9F7E +ENCODING 40830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +FCA0 +A7E0 +FC80 +AD40 +9620 +FFE0 +4940 +7FC0 +5240 +7FC0 +ENDCHAR +STARTCHAR U_9F7F +ENCODING 40831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0000 +4440 +4440 +4A40 +5140 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9F80 +ENCODING 40832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5120 +FD40 +0180 +9500 +9700 +AD00 +C520 +8520 +FCE0 +ENDCHAR +STARTCHAR U_9F81 +ENCODING 40833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5200 +FC00 +01C0 +A440 +A480 +B500 +CD20 +8620 +FDE0 +ENDCHAR +STARTCHAR U_9F82 +ENCODING 40834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +5D80 +5100 +FDE0 +0140 +5540 +5540 +6D40 +4540 +7D40 +0240 +ENDCHAR +STARTCHAR U_9F83 +ENCODING 40835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5D40 +5140 +FFC0 +0140 +9540 +95C0 +AD40 +C540 +8540 +FFE0 +ENDCHAR +STARTCHAR U_9F84 +ENCODING 40836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FD20 +02A0 +9480 +97E0 +AC40 +C580 +9C80 +E440 +ENDCHAR +STARTCHAR U_9F85 +ENCODING 40837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5A00 +53E0 +FC20 +03A0 +AAA0 +ABA0 +DA60 +8A00 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_9F86 +ENCODING 40838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5920 +5120 +FA20 +04C0 +A800 +ABE0 +AA20 +DA20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_9F87 +ENCODING 40839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +5940 +5540 +FD40 +05E0 +A540 +A540 +DD40 +85C0 +FF40 +8460 +ENDCHAR +STARTCHAR U_9F88 +ENCODING 40840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5A20 +53E0 +FA20 +03E0 +AA80 +AAA0 +AAC0 +DA40 +8AA0 +FB20 +ENDCHAR +STARTCHAR U_9F89 +ENCODING 40841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +B900 +A3C0 +F940 +07E0 +A800 +ABE0 +DA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9F8A +ENCODING 40842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5A20 +5220 +FFE0 +0080 +AA80 +AAE0 +AA80 +DA80 +8D80 +F8E0 +ENDCHAR +STARTCHAR U_9F8B +ENCODING 40843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5880 +53E0 +FAA0 +03E0 +A880 +ABE0 +AAA0 +DBE0 +8A20 +FA60 +ENDCHAR +STARTCHAR U_9F8C +ENCODING 40844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BA20 +A3E0 +FA00 +03E0 +AB40 +ABE0 +DA80 +8DE0 +8880 +FBE0 +ENDCHAR +STARTCHAR U_9F8D +ENCODING 40845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD00 +29E0 +FE20 +01E0 +7D00 +45E0 +7D00 +45E0 +7D20 +45E0 +ENDCHAR +STARTCHAR U_9F8E +ENCODING 40846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7FC0 +5500 +7FC0 +5440 +5DC0 +5500 +5DC0 +5520 +95E0 +ENDCHAR +STARTCHAR U_9F8F +ENCODING 40847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7FC0 +2A00 +FFC0 +2840 +3BC0 +2A20 +2BE0 +1100 +FFE0 +2100 +ENDCHAR +STARTCHAR U_9F90 +ENCODING 40848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9100 +FFE0 +A900 +FFE0 +A420 +BDE0 +A500 +BD20 +A5E0 +ENDCHAR +STARTCHAR U_9F91 +ENCODING 40849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53C0 +FC40 +53C0 +5220 +7FE0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_9F92 +ENCODING 40850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +4BC0 +FC40 +6BC0 +5A20 +7FE0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_9F93 +ENCODING 40851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44E0 +FF80 +8AE0 +FF20 +AAE0 +EE80 +AAE0 +EE80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9F94 +ENCODING 40852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53C0 +FC40 +5BC0 +6A20 +7FE0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_9F95 +ENCODING 40853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +D160 +1F00 +2200 +FBE0 +5200 +FFC0 +4840 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_9F96 +ENCODING 40854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +EFE0 +AAC0 +EFE0 +0420 +FF60 +B540 +FF60 +B540 +FF40 +AD60 +ENDCHAR +STARTCHAR U_9F97 +ENCODING 40855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +0400 +FFE0 +AAA0 +3BC0 +1100 +7DC0 +2840 +FDC0 +6920 +59E0 +ENDCHAR +STARTCHAR U_9F98 +ENCODING 40856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +FFC0 +6A20 +5BE0 +E780 +BAE0 +E780 +BAE0 +E380 +BAE0 +ENDCHAR +STARTCHAR U_9F99 +ENCODING 40857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +0800 +FFE0 +0A00 +0A40 +1280 +1300 +2220 +4620 +99E0 +ENDCHAR +STARTCHAR U_9F9A +ENCODING 40858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0A80 +3320 +CDE0 +0900 +7FC0 +0900 +FFE0 +0900 +70E0 +ENDCHAR +STARTCHAR U_9F9B +ENCODING 40859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E0E0 +3F80 +2080 +3F80 +0900 +FFE0 +1280 +2320 +DDE0 +ENDCHAR +STARTCHAR U_9F9C +ENCODING 40860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +4040 +7FC0 +2A40 +FB40 +2AC0 +FB40 +2BC0 +6A20 +07E0 +ENDCHAR +STARTCHAR U_9F9D +ENCODING 40861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +CFC0 +4840 +FEC0 +4280 +FAE0 +CEE0 +5AA0 +4AE0 +4EA0 +59E0 +ENDCHAR +STARTCHAR U_9F9E +ENCODING 40862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3BE0 +FE40 +B580 +D640 +1FE0 +7540 +1540 +FDE0 +1520 +73E0 +ENDCHAR +STARTCHAR U_9F9F +ENCODING 40863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +0400 +0420 +03E0 +ENDCHAR +STARTCHAR U_9FA0 +ENCODING 40864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +EEE0 +AAA0 +EEE0 +0000 +FFE0 +9120 +FFE0 +9120 +ENDCHAR +STARTCHAR U_9FA1 +ENCODING 40865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +FE20 +AAC0 +FE80 +0080 +FE80 +AA80 +FF40 +AA20 +ENDCHAR +STARTCHAR U_9FA2 +ENCODING 40866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3840 +4580 +BA80 +01E0 +FE80 +AA80 +FFC0 +AAA0 +FEA0 +AA80 +AE80 +ENDCHAR +STARTCHAR U_9FA3 +ENCODING 40867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +FC40 +ABE0 +F8A0 +02C0 +F980 +AAC0 +FCA0 +A900 +ENDCHAR +STARTCHAR U_9FA4 +ENCODING 40868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +32A0 +4BC0 +B6A0 +FBE0 +A880 +F900 +03E0 +FA20 +ABE0 +FA20 +ABE0 +ENDCHAR +STARTCHAR U_9FA5 +ENCODING 40869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BC0 +FE40 +ABC0 +FA40 +03C0 +FA40 +ABC0 +F980 +AE60 +ENDCHAR +STARTCHAR U_9FA6 +ENCODING 40870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2820 +B7C0 +A440 +27C0 +2100 +27E0 +5520 +5560 +8100 +ENDCHAR +STARTCHAR U_9FA7 +ENCODING 40871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +AFC0 +A240 +EFE0 +A280 +BFE0 +A440 +EFC0 +1440 +07C0 +ENDCHAR +STARTCHAR U_9FA8 +ENCODING 40872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9400 +BF80 +A400 +FF80 +A400 +BF80 +A400 +BF80 +A000 +FFC0 +ENDCHAR +STARTCHAR U_9FA9 +ENCODING 40873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +5080 +FC60 +5380 +FA00 +ABE0 +FA40 +2240 +FC40 +2440 +ENDCHAR +STARTCHAR U_9FAA +ENCODING 40874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2100 +F900 +2280 +3A80 +A440 +A820 +E000 +9FE0 +ENDCHAR +STARTCHAR U_9FAB +ENCODING 40875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2280 +FC40 +ABA0 +F900 +A900 +FFE0 +2100 +F900 +2100 +ENDCHAR +STARTCHAR U_9FAC +ENCODING 40876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +F920 +2FE0 +F920 +2FE0 +BA20 +6BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9FAD +ENCODING 40877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F3E0 +A2A0 +F3E0 +A140 +FBE0 +0940 +ABE0 +8940 +3220 +ENDCHAR +STARTCHAR U_9FAE +ENCODING 40878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +F660 +AAA0 +F7C0 +A540 +FFC0 +0A80 +AFE0 +8A80 +3440 +ENDCHAR +STARTCHAR U_9FAF +ENCODING 40879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +F500 +2520 +FD20 +2CC0 +B480 +64A0 +3560 +CA20 +ENDCHAR +STARTCHAR U_9FB0 +ENCODING 40880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +0400 +0400 +0400 +0780 +2400 +2400 +3400 +4C00 +83E0 +ENDCHAR +STARTCHAR U_9FB1 +ENCODING 40881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8040 +A140 +9140 +8A40 +8440 +8A40 +9140 +A140 +8040 +FFC0 +ENDCHAR +STARTCHAR U_9FB2 +ENCODING 40882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5880 +FFE0 +2AA0 +FBE0 +2AA0 +BBE0 +6880 +3FE0 +D080 +ENDCHAR +STARTCHAR U_9FB3 +ENCODING 40883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BC0 +2080 +FBE0 +5140 +AAA0 +2080 +FBE0 +2080 +2080 +FBE0 +ENDCHAR +STARTCHAR U_9FB4 +ENCODING 40884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 6 1 1 +BITMAP +FF80 +0100 +0A00 +0400 +0200 +0200 +ENDCHAR +STARTCHAR U_9FB5 +ENCODING 40885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 1 +BITMAP +0380 +3C00 +0400 +7FC0 +0800 +FFE0 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_9FB6 +ENCODING 40886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0400 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9FB7 +ENCODING 40887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +1100 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_9FB8 +ENCODING 40888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +0400 +2480 +1500 +7FE0 +4040 +8000 +ENDCHAR +STARTCHAR U_9FB9 +ENCODING 40889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 1 +BITMAP +2480 +1500 +7FC0 +0400 +0800 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_9FBA +ENCODING 40890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +F8 +20 +F8 +88 +F8 +88 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR U_9FBB +ENCODING 40891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +2440 +4E80 +F1E0 +4E80 +F1E0 +0E00 +AAA0 +AEA0 +ENDCHAR +STARTCHAR U_9FBC +ENCODING 40892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +F540 +2AA0 +2440 +2FE0 +3440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_9FBD +ENCODING 40893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +AFE0 +B4A0 +A7E0 +24A0 +37E0 +4800 +46A0 +8AA0 +ENDCHAR +STARTCHAR U_9FBE +ENCODING 40894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +7FE0 +5520 +5360 +79A0 +4FE0 +6BA0 +5560 +A920 +C060 +ENDCHAR +STARTCHAR U_9FBF +ENCODING 40895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +27C0 +6100 +AFE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_9FC0 +ENCODING 40896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7EC0 +4960 +7E80 +5540 +FFE0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9FC1 +ENCODING 40897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +0280 +F280 +0280 +FFE0 +0000 +F440 +9420 +F820 +ENDCHAR +STARTCHAR U_9FC2 +ENCODING 40898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2020 +FAA0 +2560 +ENDCHAR +STARTCHAR U_9FC3 +ENCODING 40899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F980 +9540 +FBA0 +9100 +9280 +F440 +0820 +ENDCHAR +STARTCHAR U_9FC4 +ENCODING 40900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A240 +4E40 +2340 +C440 +4980 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_9FC5 +ENCODING 40901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +FFE0 +1120 +27C0 +7100 +A280 +2FE0 +2080 +2300 +2080 +ENDCHAR +STARTCHAR U_9FC6 +ENCODING 40902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7E0 +1100 +2200 +73C0 +A240 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_9FC7 +ENCODING 40903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1780 +2900 +6FC0 +A240 +3FE0 +2240 +2FC0 +2200 +2200 +2600 +ENDCHAR +STARTCHAR U_9FC8 +ENCODING 40904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +9440 +27C0 +6500 +A500 +2480 +2880 +2840 +3020 +ENDCHAR +STARTCHAR U_9FC9 +ENCODING 40905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +4100 +9100 +2100 +67C0 +A240 +2240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_9FCA +ENCODING 40906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +2100 +8500 +55E0 +2500 +C500 +4500 +4FE0 +ENDCHAR +STARTCHAR U_9FCB +ENCODING 40907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FE0 +3440 +67C0 +B280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_EEFF +ENCODING 61183 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 5 2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_F6B1 +ENCODING 63153 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4440 +8C20 +8420 +8420 +8420 +8420 +4E40 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B2 +ENCODING 63154 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8120 +8220 +8420 +8920 +4F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B3 +ENCODING 63155 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8120 +8220 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B4 +ENCODING 63156 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4240 +8620 +8A20 +9220 +9F20 +8220 +4740 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B5 +ENCODING 63157 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4E40 +8820 +8820 +8620 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B6 +ENCODING 63158 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8820 +8E20 +8920 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B7 +ENCODING 63159 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4F40 +8920 +8220 +8220 +8420 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B8 +ENCODING 63160 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8920 +8620 +8920 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B9 +ENCODING 63161 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8920 +8720 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6BA +ENCODING 63162 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +5140 +B2A0 +92A0 +92A0 +92A0 +92A0 +7140 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6BB +ENCODING 63163 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8C20 +8420 +8420 +8420 +8420 +8420 +8420 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6BC +ENCODING 63164 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +8120 +8220 +8420 +8820 +9120 +5F40 +2080 +ENDCHAR +STARTCHAR U_F6BD +ENCODING 63165 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +8120 +8220 +8620 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6BE +ENCODING 63166 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4240 +8620 +8620 +8A20 +8A20 +9220 +9F20 +8220 +4740 +2080 +ENDCHAR +STARTCHAR U_F6BF +ENCODING 63167 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +9020 +9020 +9020 +9E20 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C0 +ENCODING 63168 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9020 +9020 +9620 +9920 +9120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C1 +ENCODING 63169 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +9120 +8120 +8220 +8220 +8420 +8420 +8420 +4440 +2080 +ENDCHAR +STARTCHAR U_F6C2 +ENCODING 63170 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +9120 +8E20 +9120 +9120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C3 +ENCODING 63171 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +9120 +8F20 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C4 +ENCODING 63172 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5240 +B520 +9520 +9520 +9520 +9520 +9520 +9520 +7A40 +2080 +ENDCHAR +STARTCHAR U_F6C5 +ENCODING 63173 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +40 +00 +00 +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F6C6 +ENCODING 63174 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +44 +00 +00 +44 +CC +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F6C7 +ENCODING 63175 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +4900 +0000 +0000 +4900 +DB00 +4900 +4900 +4900 +4900 +FF80 +ENDCHAR +STARTCHAR U_F6C8 +ENCODING 63176 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +4000 +0000 +0000 +5DC0 +C880 +4880 +4500 +4500 +4200 +E200 +ENDCHAR +STARTCHAR U_F6C9 +ENCODING 63177 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 0 +BITMAP +EE +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR U_F6CA +ENCODING 63178 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +0000 +0000 +EE80 +4580 +4480 +2880 +2880 +1080 +11C0 +ENDCHAR +STARTCHAR U_F6CB +ENCODING 63179 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0480 +0000 +0000 +A480 +AD80 +A480 +A480 +4480 +4480 +4FC0 +ENDCHAR +STARTCHAR U_F6CC +ENCODING 63180 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0540 +0000 +0000 +A540 +AFC0 +A540 +A540 +4540 +4540 +4FE0 +ENDCHAR +STARTCHAR U_F6CD +ENCODING 63181 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +0000 +0000 +4EE0 +C440 +4280 +4100 +4280 +4440 +EEE0 +ENDCHAR +STARTCHAR U_F6CE +ENCODING 63182 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 0 +BITMAP +EE +44 +28 +10 +28 +44 +EE +ENDCHAR +STARTCHAR U_F6CF +ENCODING 63183 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_F6D0 +ENCODING 63184 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 11 3 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_F6D1 +ENCODING 63185 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +40 +ENDCHAR +STARTCHAR U_F6D2 +ENCODING 63186 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 4 +BITMAP +0400 +0200 +0040 +FFE0 +ENDCHAR +STARTCHAR U_F6D3 +ENCODING 63187 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8380 +8100 +ENDCHAR +STARTCHAR U_F6D4 +ENCODING 63188 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 5 +BITMAP +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_F6D5 +ENCODING 63189 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 10 1 0 +BITMAP +80 +40 +40 +10 +20 +20 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR U_F6D6 +ENCODING 63190 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0440 +0380 +0100 +ENDCHAR +STARTCHAR U_F6D7 +ENCODING 63191 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +0040 +FFE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4040 +7FE0 +ENDCHAR +STARTCHAR U_F6D8 +ENCODING 63192 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +84 +FE +84 +84 +84 +84 +9C +88 +80 +80 +80 +ENDCHAR +STARTCHAR U_F6D9 +ENCODING 63193 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1000 +2100 +2080 +47C0 +F820 +4020 +ENDCHAR +STARTCHAR U_F6DA +ENCODING 63194 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +2900 +2F80 +1100 +3100 +5200 +8C00 +0C00 +1200 +21C0 +C080 +ENDCHAR +STARTCHAR U_F6DB +ENCODING 63195 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0800 +0400 +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_F6DC +ENCODING 63196 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_F6DD +ENCODING 63197 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +1100 +1200 +2400 +7C00 +0800 +1100 +2780 +F840 +4040 +ENDCHAR +STARTCHAR U_F6DE +ENCODING 63198 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_F6DF +ENCODING 63199 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +1000 +2000 +2000 +7800 +0800 +4800 +5000 +2000 +5060 +8FC0 +ENDCHAR +STARTCHAR U_F6E0 +ENCODING 63200 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0040 +7FE0 +0040 +0040 +0040 +3FC0 +0040 +0040 +0040 +FFE0 +ENDCHAR +STARTCHAR U_F6E1 +ENCODING 63201 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +18 +10 +26 +44 +88 +13 +22 +44 +08 +10 +60 +ENDCHAR +STARTCHAR U_F6E2 +ENCODING 63202 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +0800 +7F80 +2100 +1100 +0E00 +0400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_F6E3 +ENCODING 63203 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_F6E4 +ENCODING 63204 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +A000 +6000 +2000 +6000 +A000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_F6E5 +ENCODING 63205 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +FC80 +4B20 +3140 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_F6E6 +ENCODING 63206 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +1980 +6600 +18C0 +0700 +7A00 +2200 +23C0 +3200 +4E00 +83E0 +ENDCHAR +STARTCHAR U_F6E7 +ENCODING 63207 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +0480 +7F80 +2680 +1D00 +1480 +E440 +5C20 +ENDCHAR +STARTCHAR U_F6E8 +ENCODING 63208 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 1 4 7 +BITMAP +90 +ENDCHAR +STARTCHAR U_F6E9 +ENCODING 63209 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 2 3 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR U_F6EA +ENCODING 63210 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 3 1 +BITMAP +80 +40 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR U_F6EB +ENCODING 63211 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +02 +89 +44 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR U_F6EC +ENCODING 63212 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 0 +BITMAP +80 +40 +20 +10 +08 +04 +03 +1C +ENDCHAR +STARTCHAR U_F6ED +ENCODING 63213 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0500 +8280 +4000 +2000 +1000 +0800 +0400 +0300 +0C00 +ENDCHAR +STARTCHAR U_F6EE +ENCODING 63214 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 2 +BITMAP +22 +22 +22 +22 +22 +44 +88 +ENDCHAR +STARTCHAR U_F6EF +ENCODING 63215 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +0800 +1400 +2200 +C180 +3E00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F6F0 +ENCODING 63216 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +10 +20 +7F +82 +04 +18 +04 +04 +ENDCHAR +STARTCHAR U_F6F1 +ENCODING 63217 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +01 +01 +32 +4A +84 +8C +92 +61 +ENDCHAR +STARTCHAR U_F6F2 +ENCODING 63218 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +3C +42 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR U_F6F3 +ENCODING 63219 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 4 +BITMAP +FFC0 +ENDCHAR +STARTCHAR U_F6F4 +ENCODING 63220 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR U_F6F5 +ENCODING 63221 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR U_F6F6 +ENCODING 63222 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +10 +92 +54 +38 +54 +92 +10 +ENDCHAR +STARTCHAR U_F6F7 +ENCODING 63223 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +10 +A8 +70 +3C +6A +B2 +A4 +D8 +ENDCHAR +STARTCHAR U_F6F8 +ENCODING 63224 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +1000 +0800 +0A00 +7C00 +1000 +1E00 +3580 +5880 +9880 +9880 +E100 +0E00 +ENDCHAR +STARTCHAR U_F6F9 +ENCODING 63225 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +88 +84 +82 +86 +C0 +40 +ENDCHAR +STARTCHAR U_F6FA +ENCODING 63226 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +8000 +8200 +8100 +8080 +8080 +C180 +C000 +4000 +ENDCHAR +STARTCHAR U_F6FB +ENCODING 63227 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +60 +20 +D0 +10 +10 +20 +ENDCHAR +STARTCHAR U_F6FC +ENCODING 63228 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 11 3 0 +BITMAP +40 +38 +20 +00 +B8 +C4 +04 +04 +08 +08 +10 +ENDCHAR +STARTCHAR U_F6FD +ENCODING 63229 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 6 3 2 +BITMAP +38 +10 +70 +30 +50 +9C +ENDCHAR +STARTCHAR U_F6FE +ENCODING 63230 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +40 +38 +00 +18 +F0 +20 +30 +D0 +90 +0E +ENDCHAR +STARTCHAR U_F6FF +ENCODING 63231 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 2 +BITMAP +40 +44 +E8 +48 +74 +D4 +58 +ENDCHAR +STARTCHAR U_F700 +ENCODING 63232 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +2000 +2980 +F000 +2700 +3880 +6880 +A880 +E700 +ENDCHAR +STARTCHAR U_F701 +ENCODING 63233 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1000 +1000 +FD00 +2480 +6580 +4400 +8800 +9800 +ENDCHAR +STARTCHAR U_F702 +ENCODING 63234 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +1100 +1000 +1900 +E480 +2480 +4400 +8800 +9800 +ENDCHAR +STARTCHAR U_F703 +ENCODING 63235 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +14 +F8 +14 +F8 +08 +7C +80 +80 +7C +ENDCHAR +STARTCHAR U_F704 +ENCODING 63236 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0100 +3280 +1500 +F800 +0E00 +F800 +0400 +7C00 +8000 +8000 +7C00 +ENDCHAR +STARTCHAR U_F705 +ENCODING 63237 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 3 0 +BITMAP +08 +08 +10 +20 +C0 +80 +60 +10 +08 +08 +ENDCHAR +STARTCHAR U_F706 +ENCODING 63238 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +09 +12 +21 +C0 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_F707 +ENCODING 63239 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +8200 +4200 +4380 +8E00 +8200 +8200 +C200 +C200 +4400 +0400 +ENDCHAR +STARTCHAR U_F708 +ENCODING 63240 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0080 +8300 +4280 +4280 +9F00 +8200 +8200 +C200 +C200 +4400 +0400 +ENDCHAR +STARTCHAR U_F709 +ENCODING 63241 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +7E +08 +00 +00 +00 +80 +80 +7E +ENDCHAR +STARTCHAR U_F70A +ENCODING 63242 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +7F +08 +10 +00 +00 +80 +80 +80 +7E +ENDCHAR +STARTCHAR U_F70B +ENCODING 63243 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +24 +18 +F0 +08 +3C +C0 +80 +80 +7C +ENDCHAR +STARTCHAR U_F70C +ENCODING 63244 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 0 +BITMAP +02 +06 +20 +2C +10 +F0 +08 +7C +80 +80 +78 +ENDCHAR +STARTCHAR U_F70D +ENCODING 63245 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 9 3 1 +BITMAP +80 +80 +80 +80 +80 +80 +84 +8C +70 +ENDCHAR +STARTCHAR U_F70E +ENCODING 63246 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +04 +8C +82 +80 +80 +80 +80 +84 +8C +70 +ENDCHAR +STARTCHAR U_F70F +ENCODING 63247 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0FC0 +F400 +0C00 +1400 +1400 +0C00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F710 +ENCODING 63248 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 12 1 -1 +BITMAP +00C0 +0480 +0400 +07C0 +FC00 +0C00 +1400 +1400 +0C00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F711 +ENCODING 63249 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 0 +BITMAP +0200 +2200 +23C0 +3E00 +E200 +2600 +2000 +2000 +1F00 +ENDCHAR +STARTCHAR U_F712 +ENCODING 63250 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +0140 +1100 +11C0 +1F00 +F100 +1300 +1000 +1000 +0F80 +ENDCHAR +STARTCHAR U_F713 +ENCODING 63251 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +04 +3C +08 +33 +7C +88 +10 +10 +10 +0E +ENDCHAR +STARTCHAR U_F714 +ENCODING 63252 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0680 +3D40 +0800 +1100 +3E00 +C800 +1000 +1000 +1000 +0E00 +ENDCHAR +STARTCHAR U_F715 +ENCODING 63253 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +1000 +2C00 +F700 +2980 +4000 +4000 +5000 +9000 +8F80 +ENDCHAR +STARTCHAR U_F716 +ENCODING 63254 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2080 +1140 +1080 +1800 +EF80 +4200 +4000 +4000 +9000 +8F00 +ENDCHAR +STARTCHAR U_F717 +ENCODING 63255 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +20 +2C +38 +C0 +4C +72 +C2 +02 +04 +18 +ENDCHAR +STARTCHAR U_F718 +ENCODING 63256 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +0100 +0080 +1000 +1400 +E800 +2000 +2E00 +7100 +0100 +0100 +0600 +3800 +ENDCHAR +STARTCHAR U_F719 +ENCODING 63257 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 6 2 2 +BITMAP +0E +71 +81 +01 +02 +0C +ENDCHAR +STARTCHAR U_F71A +ENCODING 63258 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 7 1 1 +BITMAP +0F80 +B040 +4040 +0040 +0040 +0080 +0700 +ENDCHAR +STARTCHAR U_F71B +ENCODING 63259 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0020 +0040 +0720 +1880 +E040 +0040 +0040 +0080 +0300 +0400 +ENDCHAR +STARTCHAR U_F71C +ENCODING 63260 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1F80 +E400 +0800 +1000 +1000 +1000 +1800 +0E00 +ENDCHAR +STARTCHAR U_F71D +ENCODING 63261 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1F80 +E480 +0900 +1080 +1000 +1000 +1800 +0E00 +ENDCHAR +STARTCHAR U_F71E +ENCODING 63262 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +40 +20 +20 +20 +2E +30 +C0 +80 +80 +7E +ENDCHAR +STARTCHAR U_F71F +ENCODING 63263 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +2280 +2100 +2000 +2600 +3800 +4000 +8000 +8000 +7E00 +ENDCHAR +STARTCHAR U_F720 +ENCODING 63264 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +10 +10 +78 +21 +26 +44 +44 +9C +27 +1C +ENDCHAR +STARTCHAR U_F721 +ENCODING 63265 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4000 +4E00 +8000 +8000 +8000 +C000 +9000 +8F80 +ENDCHAR +STARTCHAR U_F722 +ENCODING 63266 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +8800 +4E00 +7900 +5080 +5080 +A080 +B780 +C780 +ENDCHAR +STARTCHAR U_F723 +ENCODING 63267 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2000 +2000 +3300 +FC80 +3080 +2080 +6080 +AF80 +A980 +2640 +ENDCHAR +STARTCHAR U_F724 +ENCODING 63268 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +3F00 +4880 +9080 +9080 +9080 +A080 +4100 +0600 +ENDCHAR +STARTCHAR U_F725 +ENCODING 63269 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +4200 +4280 +4F00 +8200 +8200 +C200 +8F00 +9280 +8C00 +ENDCHAR +STARTCHAR U_F726 +ENCODING 63270 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +0080 +0040 +4200 +4200 +4380 +8E00 +8200 +8200 +CE00 +9380 +0E00 +ENDCHAR +STARTCHAR U_F727 +ENCODING 63271 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +42C0 +4200 +4380 +8E00 +8200 +8200 +CE00 +9380 +8E00 +ENDCHAR +STARTCHAR U_F728 +ENCODING 63272 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 1 +BITMAP +1300 +F100 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F729 +ENCODING 63273 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +3240 +D100 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F72A +ENCODING 63274 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +00C0 +10A0 +F340 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F72B +ENCODING 63275 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +0800 +0400 +1800 +1000 +0F00 +3480 +C480 +BC00 +ENDCHAR +STARTCHAR U_F72C +ENCODING 63276 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0080 +0960 +0CA0 +1000 +1000 +0E00 +3980 +C480 +C580 +3C00 +ENDCHAR +STARTCHAR U_F72D +ENCODING 63277 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0880 +0D40 +10C0 +1000 +0F00 +3880 +C480 +C500 +3C00 +ENDCHAR +STARTCHAR U_F72E +ENCODING 63278 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 1 2 +BITMAP +1800 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F72F +ENCODING 63279 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +0180 +0140 +1880 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F730 +ENCODING 63280 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 2 1 +BITMAP +0180 +0280 +1100 +6800 +4400 +8200 +0180 +00C0 +ENDCHAR +STARTCHAR U_F731 +ENCODING 63281 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4F00 +4200 +8F80 +8200 +8200 +CE00 +9380 +9E00 +ENDCHAR +STARTCHAR U_F732 +ENCODING 63282 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 1 +BITMAP +4FE0 +4240 +8F80 +8200 +8200 +CE00 +9380 +9E40 +ENDCHAR +STARTCHAR U_F733 +ENCODING 63283 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 1 +BITMAP +0020 +0040 +4F60 +4200 +9F80 +8200 +8200 +CE00 +9380 +8C00 +ENDCHAR +STARTCHAR U_F734 +ENCODING 63284 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +16 +F8 +14 +78 +10 +78 +96 +60 +ENDCHAR +STARTCHAR U_F735 +ENCODING 63285 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +0400 +3C00 +0800 +0900 +1100 +7D00 +A300 +C2C0 +8400 +1800 +ENDCHAR +STARTCHAR U_F736 +ENCODING 63286 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +2000 +1000 +9880 +6140 +31C0 +E100 +6100 +6100 +4100 +3E00 +ENDCHAR +STARTCHAR U_F737 +ENCODING 63287 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0400 +4400 +4E00 +7900 +4880 +B080 +B080 +B080 +C100 +0E00 +ENDCHAR +STARTCHAR U_F738 +ENCODING 63288 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +20 +78 +A0 +C0 +78 +42 +42 +3C +ENDCHAR +STARTCHAR U_F739 +ENCODING 63289 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 6 3 2 +BITMAP +7E +21 +EE +10 +10 +10 +ENDCHAR +STARTCHAR U_F73A +ENCODING 63290 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0800 +6B00 +5C80 +3080 +E880 +1700 +1000 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F73B +ENCODING 63291 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +18 +5E +96 +B5 +D5 +56 +0C +10 +ENDCHAR +STARTCHAR U_F73C +ENCODING 63292 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0C00 +5200 +5F00 +B280 +D280 +D280 +D280 +4F00 +0800 +1000 +ENDCHAR +STARTCHAR U_F73D +ENCODING 63293 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +20 +10 +1C +10 +10 +78 +94 +60 +ENDCHAR +STARTCHAR U_F73E +ENCODING 63294 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +08 +08 +0E +08 +08 +08 +7E +8B +78 +ENDCHAR +STARTCHAR U_F73F +ENCODING 63295 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +38 +40 +40 +9C +A2 +C2 +02 +04 +78 +ENDCHAR +STARTCHAR U_F740 +ENCODING 63296 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +40 +58 +64 +C4 +C4 +C4 +C4 +44 +08 +10 +ENDCHAR +STARTCHAR U_F741 +ENCODING 63297 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +08 +78 +10 +20 +5C +E2 +82 +32 +4C +38 +ENDCHAR +STARTCHAR U_F742 +ENCODING 63298 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2000 +4000 +5000 +7600 +FA00 +4200 +4200 +C240 +4380 +4000 +ENDCHAR +STARTCHAR U_F743 +ENCODING 63299 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +04 +3C +08 +10 +2E +71 +C1 +81 +02 +0C +ENDCHAR +STARTCHAR U_F744 +ENCODING 63300 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +20 +20 +FC +22 +62 +E2 +2C +ENDCHAR +STARTCHAR U_F745 +ENCODING 63301 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2000 +2000 +2000 +3600 +F980 +2080 +6080 +A080 +A100 +6300 +2C00 +ENDCHAR +STARTCHAR U_F746 +ENCODING 63302 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0C00 +3800 +0800 +1600 +1980 +6080 +A080 +A480 +CB00 +4600 +ENDCHAR +STARTCHAR U_F747 +ENCODING 63303 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0400 +3C00 +1E00 +3100 +5900 +2A00 +1C00 +3700 +C880 +8980 +ENDCHAR +STARTCHAR U_F748 +ENCODING 63304 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 3 0 +BITMAP +10 +2C +F0 +40 +79 +8E +98 +68 +40 +3E +ENDCHAR +STARTCHAR U_F749 +ENCODING 63305 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +0800 +1000 +1000 +2000 +5C00 +6400 +4480 +8480 +8700 +ENDCHAR +STARTCHAR U_F74A +ENCODING 63306 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 3 +BITMAP +F8 +30 +20 +40 +40 +ENDCHAR +STARTCHAR U_F74B +ENCODING 63307 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +9F +61 +0E +08 +08 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F74C +ENCODING 63308 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR U_F74D +ENCODING 63309 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 3 0 +BITMAP +08 +08 +10 +30 +30 +D0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_F74E +ENCODING 63310 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 4 1 +BITMAP +20 +F8 +88 +90 +10 +20 +40 +ENDCHAR +STARTCHAR U_F74F +ENCODING 63311 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +1E +E2 +82 +84 +04 +08 +10 +20 +ENDCHAR +STARTCHAR U_F750 +ENCODING 63312 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 5 3 3 +BITMAP +0C +30 +10 +10 +FE +ENDCHAR +STARTCHAR U_F751 +ENCODING 63313 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +7F00 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F752 +ENCODING 63314 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 2 2 +BITMAP +08 +7E +08 +18 +28 +D8 +ENDCHAR +STARTCHAR U_F753 +ENCODING 63315 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0800 +0400 +0400 +7F80 +0C00 +1400 +2400 +4400 +8C00 +0400 +ENDCHAR +STARTCHAR U_F754 +ENCODING 63316 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +10 +20 +FC +24 +24 +44 +48 +88 +ENDCHAR +STARTCHAR U_F755 +ENCODING 63317 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 3 1 +BITMAP +03 +12 +20 +FC +24 +24 +44 +48 +88 +ENDCHAR +STARTCHAR U_F756 +ENCODING 63318 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +1000 +0800 +0F00 +7800 +0F80 +F800 +0800 +0400 +0400 +ENDCHAR +STARTCHAR U_F757 +ENCODING 63319 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +2380 +1000 +1600 +F800 +1000 +1F00 +E800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F758 +ENCODING 63320 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +10 +12 +3E +44 +04 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR U_F759 +ENCODING 63321 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +0180 +1200 +3E00 +4400 +0400 +0800 +1800 +2000 +C000 +ENDCHAR +STARTCHAR U_F75A +ENCODING 63322 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +20 +7F +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F75B +ENCODING 63323 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 3 0 +BITMAP +02 +05 +22 +20 +7F +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F75C +ENCODING 63324 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +FE +02 +02 +04 +04 +FE +ENDCHAR +STARTCHAR U_F75D +ENCODING 63325 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 2 +BITMAP +0080 +0100 +0080 +FF00 +0200 +0200 +0200 +0200 +FE00 +ENDCHAR +STARTCHAR U_F75E +ENCODING 63326 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0400 +2400 +2400 +FF80 +2400 +2400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F75F +ENCODING 63327 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0100 +0A80 +2500 +2400 +3F00 +E400 +2400 +2400 +0800 +0800 +1000 +ENDCHAR +STARTCHAR U_F760 +ENCODING 63328 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +20 +00 +C1 +01 +02 +04 +18 +60 +ENDCHAR +STARTCHAR U_F761 +ENCODING 63329 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +6100 +0000 +8100 +4100 +0200 +0C00 +1000 +6000 +ENDCHAR +STARTCHAR U_F762 +ENCODING 63330 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +04 +7C +08 +08 +10 +3C +42 +82 +ENDCHAR +STARTCHAR U_F763 +ENCODING 63331 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +02 +05 +7C +04 +08 +08 +14 +22 +C0 +ENDCHAR +STARTCHAR U_F764 +ENCODING 63332 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +20 +20 +23 +3E +E4 +20 +20 +1E +ENDCHAR +STARTCHAR U_F765 +ENCODING 63333 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0180 +0100 +1000 +1100 +1F00 +F200 +1000 +1000 +1000 +0F00 +ENDCHAR +STARTCHAR U_F766 +ENCODING 63334 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +04 +82 +44 +04 +04 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR U_F767 +ENCODING 63335 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +0140 +0080 +C100 +2100 +2200 +0200 +0400 +0400 +0800 +3000 +ENDCHAR +STARTCHAR U_F768 +ENCODING 63336 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +10 +2E +44 +74 +08 +18 +20 +40 +80 +ENDCHAR +STARTCHAR U_F769 +ENCODING 63337 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +1100 +1E80 +2200 +3400 +4C00 +0C00 +1400 +2000 +C000 +ENDCHAR +STARTCHAR U_F76A +ENCODING 63338 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0200 +0C00 +7400 +0780 +FC00 +0400 +0800 +0800 +1000 +ENDCHAR +STARTCHAR U_F76B +ENCODING 63339 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 1 +BITMAP +03E0 +7C40 +0400 +FF80 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F76C +ENCODING 63340 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 5 4 2 +BITMAP +A4 +08 +08 +10 +20 +ENDCHAR +STARTCHAR U_F76D +ENCODING 63341 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 7 2 1 +BITMAP +91 +49 +42 +02 +04 +08 +10 +ENDCHAR +STARTCHAR U_F76E +ENCODING 63342 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0180 +2100 +9100 +4200 +0200 +0400 +0400 +1800 +2000 +ENDCHAR +STARTCHAR U_F76F +ENCODING 63343 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 3 0 +BITMAP +7C +00 +3F +D0 +10 +10 +20 +20 +C0 +ENDCHAR +STARTCHAR U_F770 +ENCODING 63344 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +7F00 +0000 +0F00 +F800 +0800 +0800 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F771 +ENCODING 63345 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 9 5 0 +BITMAP +80 +80 +80 +E0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F772 +ENCODING 63346 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +08 +90 +88 +80 +E0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F773 +ENCODING 63347 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +0800 +0800 +FF80 +0800 +0800 +1000 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F774 +ENCODING 63348 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +4E00 +3000 +0000 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_F775 +ENCODING 63349 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +0C +7C +08 +48 +30 +28 +44 +80 +ENDCHAR +STARTCHAR U_F776 +ENCODING 63350 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +18 +00 +5E +24 +08 +1A +29 +C9 +08 +08 +ENDCHAR +STARTCHAR U_F777 +ENCODING 63351 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +08 +04 +08 +08 +10 +30 +60 +80 +ENDCHAR +STARTCHAR U_F778 +ENCODING 63352 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 2 2 +BITMAP +1200 +1100 +2080 +2040 +4040 +8000 +ENDCHAR +STARTCHAR U_F779 +ENCODING 63353 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +00C0 +0080 +1200 +1100 +2080 +2040 +4040 +8000 +ENDCHAR +STARTCHAR U_F77A +ENCODING 63354 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 2 2 +BITMAP +0080 +0140 +4080 +2200 +4100 +4080 +8080 +0080 +ENDCHAR +STARTCHAR U_F77B +ENCODING 63355 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +84 +8C +B0 +C0 +80 +80 +7E +ENDCHAR +STARTCHAR U_F77C +ENCODING 63356 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 3 0 +BITMAP +03 +06 +80 +84 +98 +E0 +80 +80 +80 +7C +ENDCHAR +STARTCHAR U_F77D +ENCODING 63357 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +8280 +4100 +4600 +4800 +7000 +4000 +4000 +3E00 +ENDCHAR +STARTCHAR U_F77E +ENCODING 63358 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 0 +BITMAP +FE +04 +04 +04 +08 +10 +20 +40 +ENDCHAR +STARTCHAR U_F77F +ENCODING 63359 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +0100 +FE80 +0200 +0400 +0400 +0800 +1800 +2000 +4000 +ENDCHAR +STARTCHAR U_F780 +ENCODING 63360 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +0180 +0140 +FE80 +0600 +0400 +0400 +0800 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F781 +ENCODING 63361 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 1 2 +BITMAP +1800 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F782 +ENCODING 63362 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +0180 +0140 +1880 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F783 +ENCODING 63363 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 2 +BITMAP +0080 +0140 +1880 +2400 +4200 +C100 +0080 +0060 +ENDCHAR +STARTCHAR U_F784 +ENCODING 63364 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +08 +08 +08 +FF +08 +0A +49 +88 +08 +ENDCHAR +STARTCHAR U_F785 +ENCODING 63365 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0180 +0900 +0800 +1F00 +E800 +0800 +4A00 +C900 +9800 +0800 +ENDCHAR +STARTCHAR U_F786 +ENCODING 63366 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 2 0 +BITMAP +0080 +1140 +0980 +0800 +1F00 +E800 +0800 +4A00 +8900 +9800 +0800 +ENDCHAR +STARTCHAR U_F787 +ENCODING 63367 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +0F80 +F100 +0200 +1400 +0800 +0800 +ENDCHAR +STARTCHAR U_F788 +ENCODING 63368 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 4 1 +BITMAP +70 +00 +00 +F0 +00 +00 +E0 +18 +ENDCHAR +STARTCHAR U_F789 +ENCODING 63369 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +08 +08 +10 +20 +22 +41 +FF +81 +ENDCHAR +STARTCHAR U_F78A +ENCODING 63370 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +04 +06 +24 +18 +0C +14 +20 +C0 +ENDCHAR +STARTCHAR U_F78B +ENCODING 63371 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +0300 +3C00 +0800 +0F80 +F800 +0800 +0800 +0F80 +ENDCHAR +STARTCHAR U_F78C +ENCODING 63372 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +20 +2E +F4 +20 +10 +10 +ENDCHAR +STARTCHAR U_F78D +ENCODING 63373 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1000 +1000 +1F80 +F100 +1200 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F78E +ENCODING 63374 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 4 3 3 +BITMAP +38 +08 +08 +FE +ENDCHAR +STARTCHAR U_F78F +ENCODING 63375 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +3E00 +0200 +0200 +0400 +0400 +FF80 +ENDCHAR +STARTCHAR U_F790 +ENCODING 63376 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +30 +D0 +30 +D0 +10 +F0 +ENDCHAR +STARTCHAR U_F791 +ENCODING 63377 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 1 +BITMAP +FC +04 +04 +FC +04 +08 +FC +ENDCHAR +STARTCHAR U_F792 +ENCODING 63378 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 0 +BITMAP +9C +60 +00 +FE +02 +04 +04 +08 +10 +20 +40 +ENDCHAR +STARTCHAR U_F793 +ENCODING 63379 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +10 +88 +88 +88 +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F794 +ENCODING 63380 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4000 +2800 +2800 +2800 +2800 +4980 +4E00 +8000 +ENDCHAR +STARTCHAR U_F795 +ENCODING 63381 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +80 +80 +82 +84 +98 +E0 +80 +ENDCHAR +STARTCHAR U_F796 +ENCODING 63382 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +0E +F2 +84 +84 +84 +FC +C0 +ENDCHAR +STARTCHAR U_F797 +ENCODING 63383 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 6 3 2 +BITMAP +80 +7C +48 +48 +08 +10 +ENDCHAR +STARTCHAR U_F798 +ENCODING 63384 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +80 +7F +42 +42 +02 +04 +04 +08 +30 +ENDCHAR +STARTCHAR U_F799 +ENCODING 63385 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +0400 +0400 +0400 +7F00 +2400 +3F80 +C400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_F79A +ENCODING 63386 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +3F00 +0200 +0C00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F79B +ENCODING 63387 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +FA +04 +FE +04 +08 +10 +20 +ENDCHAR +STARTCHAR U_F79C +ENCODING 63388 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +40 +02 +04 +04 +08 +30 +C0 +ENDCHAR +STARTCHAR U_F79D +ENCODING 63389 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +1280 +1100 +FE00 +8200 +8400 +0400 +0800 +1000 +2000 +ENDCHAR +STARTCHAR U_F79E +ENCODING 63390 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 4 1 +BITMAP +10 +9C +64 +24 +24 +58 +88 +ENDCHAR +STARTCHAR U_F79F +ENCODING 63391 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +20 +7E +88 +90 +10 +20 +40 +ENDCHAR +STARTCHAR U_F7A0 +ENCODING 63392 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +1400 +1400 +2200 +3E00 +2200 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_F7A1 +ENCODING 63393 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FC +44 +40 +40 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_F7A2 +ENCODING 63394 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +FC +42 +42 +44 +7C +42 +42 +42 +FC +ENDCHAR +STARTCHAR U_F7A3 +ENCODING 63395 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +42 +42 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7A4 +ENCODING 63396 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7F +22 +22 +22 +22 +42 +42 +42 +42 +FF +81 +ENDCHAR +STARTCHAR U_F7A5 +ENCODING 63397 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +42 +40 +48 +78 +48 +40 +40 +42 +FE +ENDCHAR +STARTCHAR U_F7A6 +ENCODING 63398 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +44 +00 +FE +42 +40 +48 +78 +48 +40 +42 +FE +ENDCHAR +STARTCHAR U_F7A7 +ENCODING 63399 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8E20 +4440 +4440 +2480 +2480 +1F00 +2480 +2480 +4440 +4440 +8E20 +ENDCHAR +STARTCHAR U_F7A8 +ENCODING 63400 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +B8 +C4 +84 +04 +38 +04 +84 +84 +48 +30 +ENDCHAR +STARTCHAR U_F7A9 +ENCODING 63401 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +E7 +43 +45 +45 +49 +51 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7AA +ENCODING 63402 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 0 +BITMAP +3C +E7 +43 +45 +45 +49 +51 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7AB +ENCODING 63403 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 0 +BITMAP +02 +E5 +44 +44 +48 +78 +44 +44 +44 +44 +E2 +ENDCHAR +STARTCHAR U_F7AC +ENCODING 63404 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +7F00 +2100 +2100 +2100 +2100 +2100 +2100 +2100 +A100 +4380 +ENDCHAR +STARTCHAR U_F7AD +ENCODING 63405 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +C0C0 +4180 +6280 +6280 +5280 +5480 +5480 +4C80 +4880 +E1C0 +ENDCHAR +STARTCHAR U_F7AE +ENCODING 63406 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +E380 +4100 +4100 +4100 +7F00 +4100 +4100 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_F7AF +ENCODING 63407 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +18 +24 +42 +81 +81 +81 +81 +42 +24 +18 +ENDCHAR +STARTCHAR U_F7B0 +ENCODING 63408 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +FE +44 +44 +44 +44 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F7B1 +ENCODING 63409 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 1 +BITMAP +FC +42 +42 +42 +7C +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7B2 +ENCODING 63410 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +46 +82 +80 +80 +80 +80 +82 +64 +18 +ENDCHAR +STARTCHAR U_F7B3 +ENCODING 63411 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +FF00 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_F7B4 +ENCODING 63412 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +E380 +4200 +2200 +2400 +1400 +1800 +1000 +1000 +6000 +ENDCHAR +STARTCHAR U_F7B5 +ENCODING 63413 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +1C00 +0800 +3E00 +4900 +8880 +8880 +4900 +3E00 +0800 +1C00 +ENDCHAR +STARTCHAR U_F7B6 +ENCODING 63414 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +E700 +6200 +2400 +1800 +1800 +1800 +2400 +2400 +4200 +E780 +ENDCHAR +STARTCHAR U_F7B7 +ENCODING 63415 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +EE +44 +44 +44 +44 +44 +44 +44 +44 +FE +ENDCHAR +STARTCHAR U_F7B8 +ENCODING 63416 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +CC +84 +84 +84 +8C +74 +04 +04 +04 +0C +ENDCHAR +STARTCHAR U_F7B9 +ENCODING 63417 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +EDC0 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +FFC0 +ENDCHAR +STARTCHAR U_F7BA +ENCODING 63418 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +EDC0 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +FFE0 +0020 +ENDCHAR +STARTCHAR U_F7BB +ENCODING 63419 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +7800 +9000 +9000 +1000 +1E00 +1100 +1080 +1080 +1100 +3E00 +ENDCHAR +STARTCHAR U_F7BC +ENCODING 63420 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +61C0 +4080 +4080 +4080 +7880 +4480 +4280 +4280 +4480 +F9C0 +ENDCHAR +STARTCHAR U_F7BD +ENCODING 63421 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +E0 +40 +40 +40 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_F7BE +ENCODING 63422 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +C4 +04 +02 +3E +02 +82 +84 +44 +38 +ENDCHAR +STARTCHAR U_F7BF +ENCODING 63423 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +0200 +E580 +4880 +5040 +5040 +7040 +5040 +5040 +4880 +4880 +E700 +ENDCHAR +STARTCHAR U_F7C0 +ENCODING 63424 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +7E +84 +84 +44 +3C +44 +44 +44 +44 +8E +ENDCHAR +STARTCHAR U_F7C1 +ENCODING 63425 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 3 0 +BITMAP +30 +48 +08 +18 +68 +88 +88 +70 +ENDCHAR +STARTCHAR U_F7C2 +ENCODING 63426 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +08 +30 +60 +D0 +88 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR U_F7C3 +ENCODING 63427 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +F8 +44 +44 +78 +44 +42 +42 +FC +ENDCHAR +STARTCHAR U_F7C4 +ENCODING 63428 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +FC +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7C5 +ENCODING 63429 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +7E +44 +44 +44 +44 +44 +84 +7E +82 +ENDCHAR +STARTCHAR U_F7C6 +ENCODING 63430 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 4 0 +BITMAP +20 +50 +88 +F8 +80 +80 +C8 +30 +ENDCHAR +STARTCHAR U_F7C7 +ENCODING 63431 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 9 4 0 +BITMAP +48 +20 +50 +88 +F8 +80 +80 +C8 +30 +ENDCHAR +STARTCHAR U_F7C8 +ENCODING 63432 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +9C80 +4900 +4900 +3E00 +4900 +4900 +4900 +9C80 +ENDCHAR +STARTCHAR U_F7C9 +ENCODING 63433 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +78 +44 +04 +18 +04 +C4 +84 +78 +ENDCHAR +STARTCHAR U_F7CA +ENCODING 63434 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +43 +45 +49 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7CB +ENCODING 63435 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +3C +E7 +43 +45 +49 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7CC +ENCODING 63436 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +CC +48 +50 +70 +48 +48 +48 +CC +ENDCHAR +STARTCHAR U_F7CD +ENCODING 63437 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +7E +22 +22 +22 +22 +22 +A2 +C7 +ENDCHAR +STARTCHAR U_F7CE +ENCODING 63438 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +C180 +C100 +A700 +A500 +B500 +9900 +9900 +C380 +ENDCHAR +STARTCHAR U_F7CF +ENCODING 63439 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +42 +42 +7E +42 +42 +42 +E7 +ENDCHAR +STARTCHAR U_F7D0 +ENCODING 63440 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +38 +44 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_F7D1 +ENCODING 63441 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +FE +44 +44 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F7D2 +ENCODING 63442 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 9 3 0 +BITMAP +70 +4C +44 +44 +78 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7D3 +ENCODING 63443 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 3 0 +BITMAP +28 +58 +80 +80 +80 +80 +48 +30 +ENDCHAR +STARTCHAR U_F7D4 +ENCODING 63444 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +FE +10 +10 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR U_F7D5 +ENCODING 63445 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +E7 +44 +24 +28 +18 +10 +20 +60 +ENDCHAR +STARTCHAR U_F7D6 +ENCODING 63446 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +08 +18 +08 +6E +99 +89 +89 +89 +89 +7E +08 +1C +ENDCHAR +STARTCHAR U_F7D7 +ENCODING 63447 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +24 +28 +10 +18 +24 +44 +E7 +ENDCHAR +STARTCHAR U_F7D8 +ENCODING 63448 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +EC +44 +44 +44 +44 +44 +44 +FC +ENDCHAR +STARTCHAR U_F7D9 +ENCODING 63449 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +8C +88 +88 +88 +F8 +08 +08 +1C +ENDCHAR +STARTCHAR U_F7DA +ENCODING 63450 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +ED80 +4900 +4900 +4900 +4900 +4900 +4900 +FF80 +ENDCHAR +STARTCHAR U_F7DB +ENCODING 63451 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 0 +BITMAP +ED80 +4880 +4880 +4880 +4880 +4880 +4880 +C880 +3740 +ENDCHAR +STARTCHAR U_F7DC +ENCODING 63452 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +F0 +20 +20 +38 +26 +22 +22 +7C +ENDCHAR +STARTCHAR U_F7DD +ENCODING 63453 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E380 +4100 +4100 +7100 +4D00 +4500 +4500 +FB80 +ENDCHAR +STARTCHAR U_F7DE +ENCODING 63454 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +E0 +40 +40 +70 +4C +44 +44 +F8 +ENDCHAR +STARTCHAR U_F7DF +ENCODING 63455 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +B0 +C8 +04 +3C +04 +84 +88 +70 +ENDCHAR +STARTCHAR U_F7E0 +ENCODING 63456 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E600 +5900 +5080 +7080 +5080 +5080 +4900 +E600 +ENDCHAR +STARTCHAR U_F7E1 +ENCODING 63457 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +3E +44 +44 +3C +44 +44 +44 +CE +ENDCHAR +STARTCHAR U_F7E2 +ENCODING 63458 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0400 +0A00 +1100 +2080 +4040 +F9E0 +0900 +0900 +0900 +0900 +0F00 +ENDCHAR +STARTCHAR U_F7E3 +ENCODING 63459 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 9 1 1 +BITMAP +FFE0 +0000 +7000 +6000 +5000 +0800 +0400 +0200 +0100 +ENDCHAR +STARTCHAR U_F7E4 +ENCODING 63460 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +9000 +B000 +FFC0 +B000 +9000 +0120 +01A0 +7FE0 +01A0 +0120 +ENDCHAR +STARTCHAR U_F7E5 +ENCODING 63461 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 4 0 +BITMAP +80 +80 +80 +40 +40 +40 +20 +20 +10 +0C +ENDCHAR +STARTCHAR U_F7E6 +ENCODING 63462 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +01 +06 +ENDCHAR +STARTCHAR U_F7E7 +ENCODING 63463 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +88 +88 +78 +ENDCHAR +STARTCHAR U_F7E8 +ENCODING 63464 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1000 +1F80 +2100 +4100 +8200 +0200 +0400 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_F7E9 +ENCODING 63465 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 11 4 -1 +BITMAP +10 +90 +90 +90 +90 +90 +90 +90 +90 +10 +70 +ENDCHAR +STARTCHAR U_F7EA +ENCODING 63466 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 6 +BITMAP +2100 +2200 +1400 +FFC0 +ENDCHAR +STARTCHAR U_F7EB +ENCODING 63467 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 -1 +BITMAP +0400 +0400 +2400 +2780 +2400 +2400 +5400 +8FC0 +ENDCHAR +STARTCHAR U_F7EC +ENCODING 63468 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FF80 +8080 +8280 +A480 +A480 +9880 +8880 +9480 +A380 +8080 +8180 +ENDCHAR +STARTCHAR U_F7ED +ENCODING 63469 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +A240 +A240 +9440 +8840 +9440 +A240 +8140 +FFC0 +8040 +ENDCHAR +STARTCHAR U_F7EE +ENCODING 63470 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 0 -1 +BITMAP +0400 +0C00 +1240 +2280 +E100 +2080 +2840 +3020 +ENDCHAR +STARTCHAR U_F7EF +ENCODING 63471 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +40 +C0 +40 +40 +4F +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7F0 +ENCODING 63472 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +E0 +82 +85 +E5 +12 +15 +15 +92 +60 +ENDCHAR +STARTCHAR U_F7F1 +ENCODING 63473 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +04 +6A +A6 +22 +4E +24 +2A +A4 +4A +04 +ENDCHAR +STARTCHAR U_F7F2 +ENCODING 63474 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +6000 +9000 +1000 +6000 +1780 +1000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F3 +ENCODING 63475 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +46 +A2 +14 +24 +66 +14 +14 +94 +64 +04 +06 +ENDCHAR +STARTCHAR U_F7F4 +ENCODING 63476 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +1000 +1000 +3000 +3000 +53C0 +5000 +F800 +1000 +3800 +ENDCHAR +STARTCHAR U_F7F5 +ENCODING 63477 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E000 +8000 +8000 +E000 +9780 +1000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F6 +ENCODING 63478 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +5000 +8000 +8000 +E000 +9780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F7 +ENCODING 63479 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 1 +BITMAP +20 +D6 +92 +92 +62 +D2 +92 +96 +60 +ENDCHAR +STARTCHAR U_F7F8 +ENCODING 63480 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +F000 +A000 +2000 +4000 +4780 +4000 +4000 +4000 +ENDCHAR +STARTCHAR U_F7F9 +ENCODING 63481 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +D000 +9000 +9000 +6000 +7780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7FA +ENCODING 63482 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E000 +9000 +9000 +9000 +7780 +1000 +A000 +E000 +ENDCHAR +STARTCHAR U_F7FB +ENCODING 63483 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +06 +F6 +A6 +26 +40 +42 +46 +46 +46 +06 +ENDCHAR +STARTCHAR U_F7FC +ENCODING 63484 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +22 +55 +85 +85 +E2 +97 +96 +92 +62 +02 +ENDCHAR +STARTCHAR U_F7FD +ENCODING 63485 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +E2 +94 +94 +96 +74 +14 +A4 +E4 +04 +06 +ENDCHAR +STARTCHAR U_F7FE +ENCODING 63486 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +EC +A4 +94 +94 +94 +94 +A6 +60 +ENDCHAR +STARTCHAR U_F7FF +ENCODING 63487 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +0E +CA +44 +48 +4E +44 +44 +44 +E4 +04 +04 +ENDCHAR +STARTCHAR U_F800 +ENCODING 63488 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +10 +16 +32 +52 +52 +92 +72 +13 +30 +ENDCHAR +STARTCHAR U_F801 +ENCODING 63489 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +D000 +9000 +9000 +2000 +4780 +4000 +8000 +F000 +ENDCHAR +STARTCHAR U_F802 +ENCODING 63490 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +E6 +84 +84 +E6 +12 +12 +92 +62 +02 +06 +ENDCHAR +STARTCHAR U_F803 +ENCODING 63491 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +F2 +A6 +22 +42 +42 +42 +46 +40 +ENDCHAR +STARTCHAR U_F804 +ENCODING 63492 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +15 +15 +33 +51 +56 +90 +76 +12 +36 +06 +02 +ENDCHAR +STARTCHAR U_F805 +ENCODING 63493 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +26 +D2 +94 +14 +26 +42 +42 +82 +F2 +02 +06 +ENDCHAR +STARTCHAR U_F806 +ENCODING 63494 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +25 +D5 +93 +11 +26 +42 +46 +84 +F6 +06 +02 +ENDCHAR +STARTCHAR U_F807 +ENCODING 63495 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +26 +52 +84 +84 +E6 +92 +92 +92 +62 +02 +06 +ENDCHAR +STARTCHAR U_F808 +ENCODING 63496 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +04 +CA +4A +4A +44 +44 +4A +44 +EA +0A +04 +ENDCHAR +STARTCHAR U_F809 +ENCODING 63497 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +04 +0A +C8 +4E +4A +44 +44 +4A +44 +E2 +0A +04 +ENDCHAR +STARTCHAR U_F80A +ENCODING 63498 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +26 +D4 +92 +16 +26 +46 +46 +84 +F2 +06 +ENDCHAR +STARTCHAR U_F80B +ENCODING 63499 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 0 +BITMAP +02 +44 +B4 +96 +26 +60 +10 +16 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80C +ENCODING 63500 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +14 +16 +35 +55 +52 +96 +72 +14 +33 +05 +02 +ENDCHAR +STARTCHAR U_F80D +ENCODING 63501 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +02 +E4 +86 +86 +E6 +10 +16 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80E +ENCODING 63502 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +24 +54 +86 +86 +E6 +90 +96 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80F +ENCODING 63503 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +06 +F4 +A6 +26 +42 +44 +46 +44 +42 +06 +ENDCHAR +STARTCHAR U_F810 +ENCODING 63504 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +20 +D3 +95 +94 +67 +75 +95 +93 +60 +ENDCHAR +STARTCHAR U_F811 +ENCODING 63505 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 0 +BITMAP +02 +04 +E4 +96 +96 +96 +76 +14 +24 +E2 +06 +ENDCHAR +STARTCHAR U_F812 +ENCODING 63506 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +0C +E8 +AE +9A +94 +94 +96 +A4 +62 +0A +04 +ENDCHAR +STARTCHAR U_F813 +ENCODING 63507 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +20 +D3 +95 +95 +62 +D5 +95 +93 +60 +ENDCHAR +STARTCHAR U_F814 +ENCODING 63508 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +6A +9A +96 +92 +74 +16 +94 +6A +0A +04 +ENDCHAR +STARTCHAR U_F815 +ENCODING 63509 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +60 +92 +95 +92 +95 +95 +92 +60 +ENDCHAR +STARTCHAR U_F816 +ENCODING 63510 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +6000 +9000 +9000 +9000 +9780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F817 +ENCODING 63511 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 3 2 6 +BITMAP +FF +01 +01 +ENDCHAR +STARTCHAR U_F818 +ENCODING 63512 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 -1 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F819 +ENCODING 63513 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 5 6 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_F81A +ENCODING 63514 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 4 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR U_F81B +ENCODING 63515 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +5540 +9520 +FFE0 +9120 +BFE0 +D120 +93A0 +9560 +5940 +4140 +ENDCHAR +STARTCHAR U_F81C +ENCODING 63516 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 9 0 0 +BITMAP +CE00 +4400 +6400 +54C0 +5520 +4D20 +4520 +E6C0 +0010 +ENDCHAR +STARTCHAR U_F81D +ENCODING 63517 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +F820 +A860 +2020 +2320 +24A0 +24A0 +27A0 +2420 +24A0 +7320 +ENDCHAR +STARTCHAR U_F900 +ENCODING 63744 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_F901 +ENCODING 63745 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +3FC0 +2240 +3FC0 +2240 +3FC0 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_F902 +ENCODING 63746 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F903 +ENCODING 63747 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3C80 +2780 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_F904 +ENCODING 63748 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +05C0 +8540 +5FE0 +3460 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_F905 +ENCODING 63749 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +0400 +FFE0 +8420 +FFE0 +8420 +0400 +0400 +ENDCHAR +STARTCHAR U_F906 +ENCODING 63750 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +7C40 +4440 +4440 +7C40 +4440 +0040 +0180 +ENDCHAR +STARTCHAR U_F907 +ENCODING 63751 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_F908 +ENCODING 63752 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_F909 +ENCODING 63753 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +1120 +7D20 +1220 +7CC0 +1400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_F90A +ENCODING 63754 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +20E0 +DF40 +0400 +7FC0 +2480 +1480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_F90B +ENCODING 63755 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FF20 +A4A0 +BFA0 +B5A0 +B5A0 +FFA0 +A4A0 +0E20 +1520 +24E0 +ENDCHAR +STARTCHAR U_F90C +ENCODING 63756 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A00 +3180 +CE60 +0000 +7FC0 +0400 +2480 +4460 +8C20 +ENDCHAR +STARTCHAR U_F90D +ENCODING 63757 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +3F40 +A9E0 +BEA0 +AAE0 +AAA0 +3EE0 +28A0 +3CE0 +2AC0 +2920 +ENDCHAR +STARTCHAR U_F90E +ENCODING 63758 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2520 +7FE0 +B520 +3FE0 +2D20 +57E0 +A620 +ENDCHAR +STARTCHAR U_F90F +ENCODING 63759 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2480 +4FE0 +F480 +47C0 +9480 +F7C0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_F910 +ENCODING 63760 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +2A80 +57E0 +FA80 +43E0 +FA80 +ABE0 +ENDCHAR +STARTCHAR U_F911 +ENCODING 63761 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FFE0 +ACA0 +AFE0 +A940 +FF80 +2120 +2FE0 +3AC0 +EDA0 +ENDCHAR +STARTCHAR U_F912 +ENCODING 63762 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2FC0 +7100 +AFE0 +2900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_F913 +ENCODING 63763 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0440 +EBE0 +3D40 +25E0 +2940 +2FE0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_F914 +ENCODING 63764 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F915 +ENCODING 63765 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8440 +5A80 +1100 +2280 +2FE0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_F916 +ENCODING 63766 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2A40 +B580 +A240 +AC20 +27C0 +3440 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_F917 +ENCODING 63767 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2640 +2980 +7240 +2420 +27C0 +3C40 +E440 +47C0 +0440 +ENDCHAR +STARTCHAR U_F918 +ENCODING 63768 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +8480 +5B80 +1440 +2FE0 +E440 +27C0 +2440 +ENDCHAR +STARTCHAR U_F919 +ENCODING 63769 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5340 +FC80 +A940 +DA20 +8FE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_F91A +ENCODING 63770 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +53E0 +7E20 +5140 +7C80 +5340 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_F91B +ENCODING 63771 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +FD00 +2900 +FD00 +A500 +FD00 +AD00 +9520 +AD20 +84E0 +ENDCHAR +STARTCHAR U_F91C +ENCODING 63772 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +9440 +D440 +B540 +94C0 +9440 +F440 +1540 +2480 +C400 +ENDCHAR +STARTCHAR U_F91D +ENCODING 63773 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6920 +AFE0 +AAA0 +2FE0 +2AA0 +2D60 +ENDCHAR +STARTCHAR U_F91E +ENCODING 63774 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5FE0 +4BA0 +8D60 +ENDCHAR +STARTCHAR U_F91F +ENCODING 63775 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +8A20 +FBE0 +FFE0 +AAA0 +BFA0 +9520 +A4E0 +ENDCHAR +STARTCHAR U_F920 +ENCODING 63776 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +50E0 +EE40 +4AE0 +BFA0 +2080 +3FE0 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_F921 +ENCODING 63777 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +4140 +5E40 +4440 +5F40 +5540 +5F40 +4560 +BEA0 +ENDCHAR +STARTCHAR U_F922 +ENCODING 63778 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +3480 +1EE0 +9300 +5E40 +3420 +5F00 +C000 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_F923 +ENCODING 63779 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +F9E0 +8A80 +FC40 +9000 +FFC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_F924 +ENCODING 63780 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4A80 +FFE0 +2900 +4F40 +5A20 +EF00 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_F925 +ENCODING 63781 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F800 +27E0 +2C40 +3440 +E280 +2280 +2280 +A100 +6FE0 +ENDCHAR +STARTCHAR U_F926 +ENCODING 63782 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5A80 +5540 +7FE0 +5AA0 +5FE0 +77C0 +5540 +57C0 +9540 +B7A0 +ENDCHAR +STARTCHAR U_F927 +ENCODING 63783 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +AFE0 +AAA0 +AFE0 +FD20 +2BA0 +2D60 +3BA0 +ED20 +ENDCHAR +STARTCHAR U_F928 +ENCODING 63784 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5EE0 +52A0 +5EA0 +52C0 +5EA0 +54E0 +9A80 +8080 +ENDCHAR +STARTCHAR U_F929 +ENCODING 63785 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +7D20 +45E0 +7D20 +4520 +7DE0 +5120 +4920 +F620 +4460 +ENDCHAR +STARTCHAR U_F92A +ENCODING 63786 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8440 +57C0 +1440 +27C0 +2520 +C540 +4580 +4640 +4420 +ENDCHAR +STARTCHAR U_F92B +ENCODING 63787 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2440 +57C0 +9440 +37C0 +5520 +9540 +1480 +7540 +2620 +ENDCHAR +STARTCHAR U_F92C +ENCODING 63788 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4540 +7D40 +4580 +7D40 +4120 +4920 +55E0 +E540 +4100 +ENDCHAR +STARTCHAR U_F92D +ENCODING 63789 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_F92E +ENCODING 63790 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8300 +4480 +0840 +3220 +2100 +4FC0 +C040 +4080 +4700 +4100 +0080 +ENDCHAR +STARTCHAR U_F92F +ENCODING 63791 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +B580 +A500 +5280 +8C40 +FFC0 +8840 +7F80 +1080 +2480 +C300 +ENDCHAR +STARTCHAR U_F930 +ENCODING 63792 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3AA0 +EBE0 +2AA0 +37E0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_F931 +ENCODING 63793 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_F932 +ENCODING 63794 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFE0 +AD40 +2FC0 +2D40 +4FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_F933 +ENCODING 63795 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FC0 +5460 +5FC0 +5240 +5FC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_F934 +ENCODING 63796 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +7E80 +0900 +FFC0 +0800 +1180 +3600 +D840 +1040 +0FC0 +ENDCHAR +STARTCHAR U_F935 +ENCODING 63797 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4420 +5FE0 +4A80 +5FC0 +5540 +9540 +FFE0 +ENDCHAR +STARTCHAR U_F936 +ENCODING 63798 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FE0 +5240 +7FE0 +5240 +7FE0 +4420 +B9C0 +ENDCHAR +STARTCHAR U_F937 +ENCODING 63799 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9240 +9640 +F180 +2240 +BFE0 +A240 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_F938 +ENCODING 63800 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F3C0 +9640 +F180 +2660 +BA40 +A3C0 +F240 +ENDCHAR +STARTCHAR U_F939 +ENCODING 63801 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +C440 +7FC0 +4440 +7FC0 +A0A0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_F93A +ENCODING 63802 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9680 +F140 +27E0 +AA40 +FFC0 +4080 +7FC0 +4080 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_F93B +ENCODING 63803 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F280 +2780 +2080 +7FE0 +D520 +51C0 +5340 +7520 +5920 +0300 +ENDCHAR +STARTCHAR U_F93C +ENCODING 63804 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F7C0 +1080 +27E0 +7120 +AD40 +2380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_F93D +ENCODING 63805 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5120 +ED40 +0380 +5540 +A920 +AF20 +ENDCHAR +STARTCHAR U_F93E +ENCODING 63806 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F00 +1100 +FFE0 +2440 +1680 +1D00 +2480 +CC60 +ENDCHAR +STARTCHAR U_F93F +ENCODING 63807 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7840 +27E0 +F880 +22A0 +A9C0 +72A0 +3CA0 +E180 +ENDCHAR +STARTCHAR U_F940 +ENCODING 63808 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_F941 +ENCODING 63809 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +FBA0 +0000 +FFE0 +0AA0 +FFE0 +9AA0 +FAA0 +9860 +ENDCHAR +STARTCHAR U_F942 +ENCODING 63810 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +53E0 +FC20 +8BE0 +EA00 +BBE0 +8A20 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F943 +ENCODING 63811 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +1100 +FFE0 +1100 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_F944 +ENCODING 63812 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9340 +FDE0 +2900 +FFE0 +4820 +7BE0 +4A00 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_F945 +ENCODING 63813 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2900 +FFE0 +4500 +7DC0 +4520 +FFE0 +1080 +1F80 +1080 +7FE0 +ENDCHAR +STARTCHAR U_F946 +ENCODING 63814 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8440 +2400 +3F80 +4400 +8400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_F947 +ENCODING 63815 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0000 +FBE0 +4100 +FBE0 +4920 +79E0 +ENDCHAR +STARTCHAR U_F948 +ENCODING 63816 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9680 +F100 +9280 +F460 +9FC0 +F440 +0440 +67C0 +9440 +ENDCHAR +STARTCHAR U_F949 +ENCODING 63817 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_F94A +ENCODING 63818 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F94B +ENCODING 63819 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A80 +7FE0 +4A40 +7FE0 +4480 +4880 +8700 +BCE0 +ENDCHAR +STARTCHAR U_F94C +ENCODING 63820 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2540 +FFE0 +2540 +3FE0 +6520 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_F94D +ENCODING 63821 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +5940 +2920 +2FE0 +C900 +4980 +5260 +6C20 +ENDCHAR +STARTCHAR U_F94E +ENCODING 63822 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +9800 +5FE0 +2900 +2FE0 +CDA0 +4B60 +5DA0 +4960 +ENDCHAR +STARTCHAR U_F94F +ENCODING 63823 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0900 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_F950 +ENCODING 63824 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4540 +FFE0 +2540 +5FE0 +F920 +0FE0 +5480 +AB80 +AE60 +ENDCHAR +STARTCHAR U_F951 +ENCODING 63825 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7E0 +A080 +A3E0 +AAA0 +CAA0 +AB60 +AA20 +AA20 +EA60 +8800 +8FE0 +ENDCHAR +STARTCHAR U_F952 +ENCODING 63826 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +73E0 +2120 +F920 +A920 +F920 +2220 +FCA0 +2440 +ENDCHAR +STARTCHAR U_F953 +ENCODING 63827 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4920 +4920 +7920 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_F954 +ENCODING 63828 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +5540 +1740 +1040 +3FC0 +C200 +7FE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_F955 +ENCODING 63829 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +4200 +1FE0 +2880 +5440 +CFA0 +5480 +4300 +4480 +7860 +ENDCHAR +STARTCHAR U_F956 +ENCODING 63830 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2240 +3520 +2BC0 +6540 +A880 +2340 +2C20 +ENDCHAR +STARTCHAR U_F957 +ENCODING 63831 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2440 +5A20 +EBC0 +0680 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_F958 +ENCODING 63832 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2880 +DF60 +2900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_F959 +ENCODING 63833 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9A20 +97C0 +FC80 +A300 +8480 +9860 +ENDCHAR +STARTCHAR U_F95A +ENCODING 63834 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_F95B +ENCODING 63835 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +4980 +2A60 +DF80 +0200 +3FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_F95C +ENCODING 63836 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F95D +ENCODING 63837 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0480 +F200 +0FE0 +F200 +07C0 +FC40 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_F95E +ENCODING 63838 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2900 +2500 +2100 +FFC0 +2100 +2100 +2100 +4700 +8200 +ENDCHAR +STARTCHAR U_F95F +ENCODING 63839 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8AA0 +AA60 +5F80 +0000 +3F80 +2A80 +FFE0 +0200 +1E00 +ENDCHAR +STARTCHAR U_F960 +ENCODING 63840 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA40 +4A40 +4A80 +3180 +2E60 +C000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_F961 +ENCODING 63841 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F962 +ENCODING 63842 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +1100 +FFC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_F963 +ENCODING 63843 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0920 +7940 +0980 +0900 +0900 +0900 +1920 +E920 +48E0 +ENDCHAR +STARTCHAR U_F964 +ENCODING 63844 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F520 +2340 +2FE0 +7340 +D520 +5FE0 +5520 +77E0 +5520 +07E0 +ENDCHAR +STARTCHAR U_F965 +ENCODING 63845 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +6FE0 +A920 +2FE0 +2500 +2200 +2500 +28E0 +ENDCHAR +STARTCHAR U_F966 +ENCODING 63846 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4C40 +97C0 +2440 +67C0 +A200 +27E0 +2A40 +2180 +2660 +ENDCHAR +STARTCHAR U_F967 +ENCODING 63847 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0200 +0400 +0D00 +1480 +2460 +4420 +8400 +0400 +0400 +ENDCHAR +STARTCHAR U_F968 +ENCODING 63848 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +8220 +5240 +1240 +2AA0 +2AA0 +D300 +4240 +4640 +49C0 +ENDCHAR +STARTCHAR U_F969 +ENCODING 63849 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +55E0 +FF40 +5540 +FD40 +9540 +FF40 +2880 +1940 +E620 +ENDCHAR +STARTCHAR U_F96A +ENCODING 63850 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8920 +3E00 +0840 +7FC0 +1520 +2480 +CC60 +ENDCHAR +STARTCHAR U_F96B +ENCODING 63851 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3E80 +5140 +FFC0 +2080 +CC60 +3300 +0C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_F96C +ENCODING 63852 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +1100 +2480 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F96D +ENCODING 63853 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1480 +2560 +C620 +1FC0 +3040 +DFC0 +1040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_F96E +ENCODING 63854 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FFE0 +2900 +2F00 +3FC0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_F96F +ENCODING 63855 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +07C0 +F440 +0440 +F7C0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_F970 +ENCODING 63856 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D9C0 +2140 +D940 +3260 +2800 +FBE0 +2140 +3140 +6880 +A540 +2220 +ENDCHAR +STARTCHAR U_F971 +ENCODING 63857 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A20 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_F972 +ENCODING 63858 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1140 +2100 +2100 +C100 +4320 +4520 +58E0 +ENDCHAR +STARTCHAR U_F973 +ENCODING 63859 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2BA0 +3000 +E7C0 +2440 +2440 +A7C0 +6440 +ENDCHAR +STARTCHAR U_F974 +ENCODING 63860 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1100 +FFC0 +1100 +0000 +FFC0 +1000 +3F80 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_F975 +ENCODING 63861 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +37C0 +E540 +2100 +2540 +A920 +7320 +ENDCHAR +STARTCHAR U_F976 +ENCODING 63862 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +AE40 +A980 +FA40 +AC20 +ABC0 +AA40 +FA40 +8BC0 +0240 +ENDCHAR +STARTCHAR U_F977 +ENCODING 63863 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8020 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_F978 +ENCODING 63864 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0400 +7FC0 +4440 +5540 +5540 +5540 +6EC0 +4440 +4440 +40C0 +ENDCHAR +STARTCHAR U_F979 +ENCODING 63865 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4000 +07C0 +2440 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_F97A +ENCODING 63866 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +A280 +4AC0 +2AA0 +D4A0 +4980 +5400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F97B +ENCODING 63867 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFE0 +2540 +37C0 +6D40 +AFE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F97C +ENCODING 63868 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4080 +7FA0 +4440 +4280 +4100 +4C80 +F060 +ENDCHAR +STARTCHAR U_F97D +ENCODING 63869 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0000 +F7C0 +0440 +F7C0 +0100 +F540 +9540 +F920 +9320 +ENDCHAR +STARTCHAR U_F97E +ENCODING 63870 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F97F +ENCODING 63871 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9480 +BE80 +ABE0 +BEA0 +AAA0 +FEA0 +CAA0 +FEA0 +C320 +C640 +ENDCHAR +STARTCHAR U_F980 +ENCODING 63872 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +4900 +1000 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_F981 +ENCODING 63873 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FFC0 +1200 +2200 +2200 +1400 +0E00 +1100 +6080 +ENDCHAR +STARTCHAR U_F982 +ENCODING 63874 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5240 +52A0 +57E0 +5540 +6FE0 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_F983 +ENCODING 63875 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +FBE0 +4440 +7B80 +4AA0 +4AC0 +4A80 +4A80 +6B40 +9220 +ENDCHAR +STARTCHAR U_F984 +ENCODING 63876 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +0FE0 +8A20 +4FE0 +2920 +2FE0 +C920 +57E0 +6D40 +47A0 +ENDCHAR +STARTCHAR U_F985 +ENCODING 63877 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA80 +4FE0 +4A80 +EFC0 +A940 +AFC0 +A940 +EFE0 +A960 +17A0 +ENDCHAR +STARTCHAR U_F986 +ENCODING 63878 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_F987 +ENCODING 63879 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +A000 +FEE0 +AAA0 +FFE0 +AAA0 +FFE0 +5AA0 +ABC0 +AAA0 +13E0 +ENDCHAR +STARTCHAR U_F988 +ENCODING 63880 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A40 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +6240 +BFA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_F989 +ENCODING 63881 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23E0 +FCA0 +20A0 +7520 +AAC0 +1500 +E5E0 +1E00 +3580 +CC60 +ENDCHAR +STARTCHAR U_F98A +ENCODING 63882 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_F98B +ENCODING 63883 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_F98C +ENCODING 63884 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_F98D +ENCODING 63885 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FBA0 +26C0 +FBA0 +AAC0 +FFE0 +A900 +FFE0 +2380 +F540 +2920 +ENDCHAR +STARTCHAR U_F98E +ENCODING 63886 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +4200 +8200 +3FC0 +2200 +2200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_F98F +ENCODING 63887 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +2A80 +BFE0 +AA80 +B260 +A840 +2FE0 +3140 +2BE0 +2440 +3840 +ENDCHAR +STARTCHAR U_F990 +ENCODING 63888 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +E0C0 +4FA0 +E0C0 +4F40 +AAA0 +0E00 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_F991 +ENCODING 63889 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2FE0 +2A80 +3540 +E540 +2A20 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_F992 +ENCODING 63890 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2880 +0BE0 +82A0 +5BE0 +2AA0 +2BE0 +C880 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_F993 +ENCODING 63891 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +BFE0 +AAA0 +A920 +2FE0 +2300 +5580 +4940 +9120 +ENDCHAR +STARTCHAR U_F994 +ENCODING 63892 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2AA0 +23E0 +7AA0 +2BE0 +2880 +3BE0 +E880 +5480 +23E0 +ENDCHAR +STARTCHAR U_F995 +ENCODING 63893 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +2480 +C560 +1E00 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F996 +ENCODING 63894 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_F997 +ENCODING 63895 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A440 +AAA0 +E440 +AAA0 +A660 +EAA0 +AAA0 +AEE0 +F280 +2C80 +ENDCHAR +STARTCHAR U_F998 +ENCODING 63896 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +5540 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F999 +ENCODING 63897 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4940 +EFC0 +2940 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_F99A +ENCODING 63898 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2540 +07C0 +E540 +27C0 +2100 +2FE0 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_F99B +ENCODING 63899 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2AA0 +FFE0 +2100 +AB80 +7540 +3920 +E100 +ENDCHAR +STARTCHAR U_F99C +ENCODING 63900 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2140 +2140 +3D40 +4540 +C540 +2940 +1140 +2040 +4040 +81C0 +ENDCHAR +STARTCHAR U_F99D +ENCODING 63901 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2500 +4480 +8140 +1E00 +E400 +3FC0 +0440 +0840 +1240 +E180 +ENDCHAR +STARTCHAR U_F99E +ENCODING 63902 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A920 +AFE0 +A920 +A920 +A9A0 +EA60 +AC20 +0FE0 +0820 +ENDCHAR +STARTCHAR U_F99F +ENCODING 63903 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2120 +3D20 +4920 +A920 +1120 +20E0 +C040 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_F9A0 +ENCODING 63904 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +7D20 +A920 +10E0 +2400 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_F9A1 +ENCODING 63905 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +07C0 +F440 +0440 +F7C0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_F9A2 +ENCODING 63906 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +4540 +7FE0 +4540 +5FC0 +4D80 +9540 +A520 +ENDCHAR +STARTCHAR U_F9A3 +ENCODING 63907 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2480 +C260 +3F80 +0100 +0200 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_F9A4 +ENCODING 63908 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2120 +2FC0 +3080 +E100 +2240 +2AA0 +AA60 +71C0 +ENDCHAR +STARTCHAR U_F9A5 +ENCODING 63909 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4280 +4440 +7FE0 +5000 +5EE0 +B2A0 +1EE0 +2440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_F9A6 +ENCODING 63910 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +4A00 +7FC0 +4A40 +7FE0 +4A40 +BFC0 +2A80 +CA60 +ENDCHAR +STARTCHAR U_F9A7 +ENCODING 63911 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8520 +5A40 +2520 +6FE0 +AAA0 +2FE0 +6DC0 +AB40 +2DC0 +EB40 +4D20 +ENDCHAR +STARTCHAR U_F9A8 +ENCODING 63912 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0C00 +1200 +2100 +4880 +8440 +7F80 +0100 +0200 +1C00 +0400 +0200 +ENDCHAR +STARTCHAR U_F9A9 +ENCODING 63913 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8A20 +9520 +E4E0 +9FA0 +8920 +8620 +8220 +FFE0 +8020 +ENDCHAR +STARTCHAR U_F9AA +ENCODING 63914 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8AA0 +AA60 +5F80 +0000 +3F80 +2A80 +FFE0 +0200 +1E00 +ENDCHAR +STARTCHAR U_F9AB +ENCODING 63915 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2100 +57C0 +AC40 +27C0 +FC40 +17C0 +A440 +47C0 +2820 +ENDCHAR +STARTCHAR U_F9AC +ENCODING 63916 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A440 +B920 +A080 +AFE0 +2040 +2280 +2100 +2080 +2080 +ENDCHAR +STARTCHAR U_F9AD +ENCODING 63917 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2A20 +7100 +2000 +27E0 +3840 +E280 +4100 +0080 +ENDCHAR +STARTCHAR U_F9AE +ENCODING 63918 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_F9AF +ENCODING 63919 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FA80 +2440 +2120 +F880 +27E0 +F840 +2380 +4080 +8040 +ENDCHAR +STARTCHAR U_F9B0 +ENCODING 63920 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD80 +4A40 +4A40 +7D20 +48A0 +7800 +4FE0 +4840 +F980 +0880 +0840 +ENDCHAR +STARTCHAR U_F9B1 +ENCODING 63921 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +8A20 +7D00 +2080 +F800 +23E0 +A820 +7140 +3880 +E040 +ENDCHAR +STARTCHAR U_F9B2 +ENCODING 63922 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0E00 +3180 +C460 +3F80 +0100 +0E00 +0300 +ENDCHAR +STARTCHAR U_F9B3 +ENCODING 63923 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_F9B4 +ENCODING 63924 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +3080 +4BE0 +A620 +13E0 +FA20 +0BE0 +5220 +23E0 +1240 +1420 +ENDCHAR +STARTCHAR U_F9B5 +ENCODING 63925 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +24A0 +2EA0 +72A0 +AAA0 +26A0 +22A0 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_F9B6 +ENCODING 63926 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FAA0 +1FE0 +2AA0 +7FE0 +A440 +27C0 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F9B7 +ENCODING 63927 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +F980 +8FE0 +ENDCHAR +STARTCHAR U_F9B8 +ENCODING 63928 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +77E0 +A940 +77C0 +0120 +FDC0 +2B40 +A520 +6320 +ENDCHAR +STARTCHAR U_F9B9 +ENCODING 63929 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_F9BA +ENCODING 63930 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0400 +0400 +0400 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_F9BB +ENCODING 63931 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4F80 +D8C0 +6F80 +4880 +4F80 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_F9BC +ENCODING 63932 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +FFE0 +5240 +3F80 +E0E0 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_F9BD +ENCODING 63933 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +2260 +3F40 +2680 +2A80 +5240 +AE20 +0400 +ENDCHAR +STARTCHAR U_F9BE +ENCODING 63934 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AA40 +7140 +2040 +FA40 +2140 +3060 +6BC0 +A040 +2040 +2040 +ENDCHAR +STARTCHAR U_F9BF +ENCODING 63935 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9C0 +ENCODING 63936 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +37C0 +2440 +27C0 +5540 +4920 +9320 +ENDCHAR +STARTCHAR U_F9C1 +ENCODING 63937 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +34A0 +6FC0 +B8A0 +2F80 +2580 +4940 +B320 +ENDCHAR +STARTCHAR U_F9C2 +ENCODING 63938 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2940 +18C0 +2E40 +F1E0 +1E00 +00C0 +1F00 +ENDCHAR +STARTCHAR U_F9C3 +ENCODING 63939 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2AA0 +07C0 +EC60 +37C0 +2440 +27C0 +2940 +5320 +8FE0 +ENDCHAR +STARTCHAR U_F9C4 +ENCODING 63940 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +45E0 +2820 +FFE0 +4500 +7DE0 +4500 +7DE0 +4520 +4DE0 +ENDCHAR +STARTCHAR U_F9C5 +ENCODING 63941 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2680 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F9C6 +ENCODING 63942 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A280 +9280 +9280 +F280 +A2A0 +84A0 +9860 +ENDCHAR +STARTCHAR U_F9C7 +ENCODING 63943 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE20 +8A20 +AAA0 +D6A0 +28A0 +FEA0 +10A0 +FEA0 +9220 +5420 +FEE0 +ENDCHAR +STARTCHAR U_F9C8 +ENCODING 63944 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2140 +2140 +37C0 +6A40 +A240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_F9C9 +ENCODING 63945 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +FAA0 +2AA0 +2AA0 +3AA0 +6EA0 +AAA0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_F9CA +ENCODING 63946 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8200 +5440 +1FA0 +2000 +2540 +C540 +4540 +4940 +5160 +ENDCHAR +STARTCHAR U_F9CB +ENCODING 63947 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +08A0 +9AA0 +5F20 +2140 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_F9CC +ENCODING 63948 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2900 +2240 +77A0 +2020 +2540 +3D40 +E540 +4540 +1960 +ENDCHAR +STARTCHAR U_F9CD +ENCODING 63949 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +8240 +9240 +EDC0 +0880 +7F80 +4880 +7F80 +4880 +7F80 +4080 +ENDCHAR +STARTCHAR U_F9CE +ENCODING 63950 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27C0 +7020 +D540 +5540 +5540 +7540 +5940 +1060 +ENDCHAR +STARTCHAR U_F9CF +ENCODING 63951 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5240 +F240 +2240 +57C0 +EA40 +0240 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_F9D0 +ENCODING 63952 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +7080 +23E0 +FA20 +73E0 +AA20 +23E0 +FA20 +23E0 +5140 +8E20 +ENDCHAR +STARTCHAR U_F9D1 +ENCODING 63953 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0800 +0400 +0400 +FFC0 +0000 +1200 +1100 +2080 +4040 +8040 +ENDCHAR +STARTCHAR U_F9D2 +ENCODING 63954 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +B520 +6D00 +B7E0 +3100 +4D20 +A140 +5480 +29A0 +1260 +EC20 +ENDCHAR +STARTCHAR U_F9D3 +ENCODING 63955 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A240 +9420 +9900 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_F9D4 +ENCODING 63956 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1380 +1440 +2BA0 +2000 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_F9D5 +ENCODING 63957 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +1B00 +EEE0 +0000 +7FC0 +4A40 +7FC0 +4A40 +40C0 +ENDCHAR +STARTCHAR U_F9D6 +ENCODING 63958 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5000 +2FE0 +2AA0 +CFE0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_F9D7 +ENCODING 63959 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +FBA0 +A800 +FFE0 +AAA0 +FFE0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_F9D8 +ENCODING 63960 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4FC0 +8240 +3FE0 +4240 +CFC0 +4200 +4FC0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_F9D9 +ENCODING 63961 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A100 +2FE0 +2100 +2380 +2560 +3920 +ENDCHAR +STARTCHAR U_F9DA +ENCODING 63962 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_F9DB +ENCODING 63963 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F9DC +ENCODING 63964 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +AC40 +C380 +AC60 +9500 +97E0 +F900 +A7C0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_F9DD +ENCODING 63965 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +F0A0 +10A0 +FEA0 +10A0 +38A0 +54A0 +92A0 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U_F9DE +ENCODING 63966 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0400 +7F80 +4480 +7F80 +4480 +1400 +0800 +3600 +C1C0 +ENDCHAR +STARTCHAR U_F9DF +ENCODING 63967 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2520 +29E0 +3520 +2BE0 +3A40 +4D80 +4940 +8E20 +ENDCHAR +STARTCHAR U_F9E0 +ENCODING 63968 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2000 +3FC0 +D240 +2240 +C440 +1980 +ENDCHAR +STARTCHAR U_F9E1 +ENCODING 63969 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1F80 +0100 +0240 +7FE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_F9E2 +ENCODING 63970 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F940 +1140 +FF40 +5540 +92C0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9E3 +ENCODING 63971 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +57E0 +1400 +2520 +2540 +C580 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_F9E4 +ENCODING 63972 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +2520 +27E0 +7520 +27E0 +2520 +3900 +E7C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_F9E5 +ENCODING 63973 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6E20 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +4420 +84E0 +ENDCHAR +STARTCHAR U_F9E6 +ENCODING 63974 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2280 +A7E0 +BC80 +A7E0 +2480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_F9E7 +ENCODING 63975 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_F9E8 +ENCODING 63976 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FD40 +17C0 +2D40 +77C0 +A900 +2FC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F9E9 +ENCODING 63977 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4480 +4480 +7F80 +4480 +7F80 +4480 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_F9EA +ENCODING 63978 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +FD40 +55E0 +6F40 +55E0 +7D40 +2140 +FDE0 +AD40 +B540 +8DE0 +ENDCHAR +STARTCHAR U_F9EB +ENCODING 63979 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +FF80 +9200 +FFC0 +8800 +9F00 +B100 +DF00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_F9EC +ENCODING 63980 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2220 +1EE0 +9080 +5EE0 +3220 +2AA0 +C660 +5BA0 +4220 +4CC0 +ENDCHAR +STARTCHAR U_F9ED +ENCODING 63981 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +2100 +1200 +0C00 +1200 +FFC0 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_F9EE +ENCODING 63982 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +B940 +A520 +2F40 +2940 +25E0 +5340 +45E0 +8840 +ENDCHAR +STARTCHAR U_F9EF +ENCODING 63983 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2540 +7920 +2540 +2FE0 +3B40 +E7E0 +4440 +1840 +ENDCHAR +STARTCHAR U_F9F0 +ENCODING 63984 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4920 +79E0 +4920 +7BE0 +5FA0 +5220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_F9F1 +ENCODING 63985 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +AFE0 +C540 +A920 +9440 +97E0 +F940 +ABE0 +8440 +9840 +ENDCHAR +STARTCHAR U_F9F2 +ENCODING 63986 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +53E0 +AA40 +AC40 +ENDCHAR +STARTCHAR U_F9F3 +ENCODING 63987 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +FDC0 +ABE0 +FCC0 +ADA0 +FD40 +ABE0 +BD40 +ABE0 +BA40 +2C40 +ENDCHAR +STARTCHAR U_F9F4 +ENCODING 63988 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FBE0 +1100 +1100 +3B80 +5540 +9520 +1920 +1100 +1100 +ENDCHAR +STARTCHAR U_F9F5 +ENCODING 63989 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +9FE0 +4880 +2D80 +3AC0 +2AA0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_F9F6 +ENCODING 63990 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +A7E0 +A800 +F3C0 +9240 +93C0 +F000 +AEE0 +AAA0 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_F9F7 +ENCODING 63991 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +7FC0 +0000 +2080 +2080 +1100 +1100 +1200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_F9F8 +ENCODING 63992 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +0400 +7FC0 +0100 +1100 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_F9F9 +ENCODING 63993 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2000 +FA40 +2240 +7140 +A980 +A880 +2080 +2FE0 +ENDCHAR +STARTCHAR U_F9FA +ENCODING 63994 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5180 +5140 +5FE0 +7100 +1100 +F100 +5100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_F9FB +ENCODING 63995 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +3100 +4A00 +2C00 +F480 +1500 +2A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_F9FC +ENCODING 63996 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFC0 +0AA0 +E480 +0FE0 +E080 +0EA0 +EAC0 +AEA0 +EB60 +AE20 +ENDCHAR +STARTCHAR U_F9FD +ENCODING 63997 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_F9FE +ENCODING 63998 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +C460 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9FF +ENCODING 63999 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +10A0 +FEA0 +92A0 +92A0 +96A0 +10A0 +3420 +5220 +9160 +ENDCHAR +STARTCHAR U_FA00 +ENCODING 64000 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +3920 +E120 +2120 +2920 +3220 +2220 +04A0 +0840 +ENDCHAR +STARTCHAR U_FA01 +ENCODING 64001 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4F80 +4000 +5FC0 +4880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_FA02 +ENCODING 64002 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2A00 +37E0 +EA20 +2220 +2220 +A3E0 +6220 +ENDCHAR +STARTCHAR U_FA03 +ENCODING 64003 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27E0 +FD40 +27C0 +7500 +AFE0 +A620 +2BE0 +3220 +ENDCHAR +STARTCHAR U_FA04 +ENCODING 64004 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +04C0 +0700 +7C00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_FA05 +ENCODING 64005 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1820 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_FA06 +ENCODING 64006 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_FA07 +ENCODING 64007 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +21C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_FA08 +ENCODING 64008 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2480 +2380 +2100 +ENDCHAR +STARTCHAR U_FA09 +ENCODING 64009 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A640 +C180 +A660 +9080 +97E0 +F480 +AFE0 +8080 +8080 +ENDCHAR +STARTCHAR U_FA0A +ENCODING 64010 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2A80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_FA0B +ENCODING 64011 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +52C0 +7EA0 +48A0 +7EE0 +8880 +9880 +ENDCHAR +STARTCHAR U_FA0C +ENCODING 64012 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +1200 +1200 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_FA0D +ENCODING 64013 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FD40 +8660 +FFC0 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_FA0E +ENCODING 64014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +FBE0 +4A40 +37E0 +2A40 +C3E0 +0000 +7FC0 +1080 +0F00 +70E0 +ENDCHAR +STARTCHAR U_FA0F +ENCODING 64015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +2100 +F280 +2440 +2820 +27C0 +3440 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_FA10 +ENCODING 64016 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F200 +2520 +2EC0 +3480 +CBC0 +06A0 +1880 +0300 +ENDCHAR +STARTCHAR U_FA11 +ENCODING 64017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2440 +AA80 +AFE0 +A840 +AF40 +BD40 +C740 +0040 +00C0 +ENDCHAR +STARTCHAR U_FA12 +ENCODING 64018 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97C0 +F100 +9FE0 +9440 +F7C0 +9440 +07C0 +04C0 +ENDCHAR +STARTCHAR U_FA13 +ENCODING 64019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2240 +75E0 +6C40 +A540 +24C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_FA14 +ENCODING 64020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F280 +2440 +6BA0 +7100 +A7C0 +2100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_FA15 +ENCODING 64021 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +64A0 +24A0 +6EA0 +AAE0 +AE80 +A480 +A4A0 +BEE0 +4A40 +9120 +ENDCHAR +STARTCHAR U_FA16 +ENCODING 64022 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8920 +57A0 +2140 +57E0 +9100 +33E0 +5620 +9BE0 +1220 +73E0 +2220 +ENDCHAR +STARTCHAR U_FA17 +ENCODING 64023 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +1100 +2080 +4040 +BFA0 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_FA18 +ENCODING 64024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +0200 +FA00 +2200 +2A00 +6A00 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_FA19 +ENCODING 64025 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +27E0 +34A0 +6FE0 +A4A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_FA1A +ENCODING 64026 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_FA1B +ENCODING 64027 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +F440 +17C0 +2000 +3FE0 +6920 +AFE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_FA1C +ENCODING 64028 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07C0 +9100 +5FE0 +5440 +3FC0 +E440 +47C0 +04C0 +ENDCHAR +STARTCHAR U_FA1D +ENCODING 64029 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +23C0 +F900 +27E0 +3440 +6FC0 +A440 +27C0 +24C0 +ENDCHAR +STARTCHAR U_FA1E +ENCODING 64030 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +EB20 +4920 +0820 +79E0 +1040 +ENDCHAR +STARTCHAR U_FA1F +ENCODING 64031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +4E20 +8BA0 +9860 +ENDCHAR +STARTCHAR U_FA22 +ENCODING 64034 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F7A0 +0240 +FFE0 +0100 +F3C0 +0640 +FBC0 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_FA23 +ENCODING 64035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1140 +7CC0 +1240 +FD40 +1040 +5CE0 +5340 +5040 +7040 +8FE0 +ENDCHAR +STARTCHAR U_FA24 +ENCODING 64036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2440 +2480 +05E0 +E420 +2540 +2480 +2940 +2A20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA25 +ENCODING 64037 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +2900 +1FC0 +EA40 +2FC0 +2340 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA26 +ENCODING 64038 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FD20 +2940 +FF40 +2180 +7D40 +C520 +7D20 +45E0 +7D40 +4500 +ENDCHAR +STARTCHAR U_FA2A +ENCODING 64042 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +AA00 +FBE0 +8A20 +FA20 +8B20 +FAC0 +9240 +ACA0 +CD20 +ENDCHAR +STARTCHAR U_FA2B +ENCODING 64043 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +ABA0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +92A0 +A820 +C8E0 +ENDCHAR +STARTCHAR U_FA2C +ENCODING 64044 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8A00 +FBC0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_FA2D +ENCODING 64045 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +53C0 +FA40 +53E0 +7A00 +53E0 +7AA0 +5560 +7D40 +ENDCHAR +STARTCHAR U_FA30 +ENCODING 64048 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1800 +27E0 +2520 +64A0 +AFE0 +2520 +24A0 +2FE0 +2020 +20C0 +ENDCHAR +STARTCHAR U_FA31 +ENCODING 64049 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2AA0 +6920 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_FA32 +ENCODING 64050 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3E00 +4400 +7F80 +C880 +4880 +7F80 +0C00 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_FA33 +ENCODING 64051 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +4BE0 +7CA0 +D4A0 +54A0 +7D20 +2A20 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_FA34 +ENCODING 64052 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +2880 +7FE0 +54A0 +54A0 +FEA0 +10A0 +7D20 +12A0 +FC40 +ENDCHAR +STARTCHAR U_FA35 +ENCODING 64053 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +4480 +7F80 +4480 +7F80 +1400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_FA36 +ENCODING 64054 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A400 +EFE0 +1920 +0AA0 +0F20 +00C0 +ENDCHAR +STARTCHAR U_FA37 +ENCODING 64055 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +A280 +A7C0 +A540 +AFE0 +E100 +AFE0 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_FA38 +ENCODING 64056 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0880 +FFE0 +4080 +FBE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_FA39 +ENCODING 64057 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +FE20 +2540 +27E0 +2540 +3FE0 +E940 +4A40 +1440 +ENDCHAR +STARTCHAR U_FA3A +ENCODING 64058 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +7FC0 +0400 +3F80 +0400 +FFE0 +5540 +BFA0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_FA3B +ENCODING 64059 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FC0 +5540 +5FC0 +4880 +4F80 +4880 +8F80 +ENDCHAR +STARTCHAR U_FA3C +ENCODING 64060 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +7FC0 +4440 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_FA3D +ENCODING 64061 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +B000 +AFC0 +A540 +A540 +3FE0 +2940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_FA3E +ENCODING 64062 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AA40 +BF40 +ABE0 +AA40 +2E40 +2AC0 +2D40 +2A40 +2460 +ENDCHAR +STARTCHAR U_FA3F +ENCODING 64063 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A920 +BAA0 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_FA40 +ENCODING 64064 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3500 +5FE0 +84A0 +3FA0 +64A0 +BE40 +24A0 +3F00 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_FA41 +ENCODING 64065 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +81E0 +7F40 +5540 +FF40 +5540 +5540 +FE80 +0540 +1A20 +ENDCHAR +STARTCHAR U_FA42 +ENCODING 64066 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4A80 +7A80 +4FE0 +7880 +5080 +4980 +56A0 +E4A0 +4860 +ENDCHAR +STARTCHAR U_FA43 +ENCODING 64067 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +0500 +FFE0 +0880 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_FA44 +ENCODING 64068 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +2540 +3540 +6FE0 +A540 +2540 +2FE0 +20C0 +ENDCHAR +STARTCHAR U_FA45 +ENCODING 64069 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +5FC0 +1940 +2FE0 +2A40 +C940 +4FE0 +4040 +4180 +ENDCHAR +STARTCHAR U_FA46 +ENCODING 64070 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +0240 +9FE0 +5200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_FA47 +ENCODING 64071 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +0FC0 +8A40 +5FC0 +2200 +2FC0 +C200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_FA48 +ENCODING 64072 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +4240 +4920 +8920 +ENDCHAR +STARTCHAR U_FA49 +ENCODING 64073 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +0380 +FC00 +4980 +2500 +2200 +ENDCHAR +STARTCHAR U_FA4A +ENCODING 64074 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +2220 +2640 +FB80 +2480 +2BC0 +22C0 +F4A0 +4CA0 +1320 +ENDCHAR +STARTCHAR U_FA4B +ENCODING 64075 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2520 +27E0 +7520 +D7E0 +5280 +5FE0 +7080 +5080 +0080 +ENDCHAR +STARTCHAR U_FA4C +ENCODING 64076 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0900 +17C0 +3100 +6900 +A900 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_FA4D +ENCODING 64077 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F500 +1500 +25E0 +3500 +6D00 +A500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_FA4E +ENCODING 64078 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2380 +FA00 +0A00 +13E0 +3240 +6A40 +AA40 +2440 +2440 +2840 +ENDCHAR +STARTCHAR U_FA4F +ENCODING 64079 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0900 +1200 +33E0 +6E20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_FA50 +ENCODING 64080 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +1440 +FC40 +1440 +27C0 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_FA51 +ENCODING 64081 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +0C40 +17C0 +3280 +6A80 +AA80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_FA52 +ENCODING 64082 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F5C0 +1540 +2FE0 +2820 +7BA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_FA53 +ENCODING 64083 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_FA54 +ENCODING 64084 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +73E0 +2220 +F940 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_FA55 +ENCODING 64085 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +9080 +2540 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FA56 +ENCODING 64086 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FDE0 +4520 +7D20 +4520 +7D20 +4920 +5560 +6500 +ENDCHAR +STARTCHAR U_FA57 +ENCODING 64087 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_FA58 +ENCODING 64088 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +5440 +FAA0 +2EE0 +5000 +EFE0 +0420 +57E0 +AC20 +AFE0 +ENDCHAR +STARTCHAR U_FA59 +ENCODING 64089 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +D540 +7E80 +5540 +7A20 +1F00 +0880 +7F40 +2480 +CC60 +ENDCHAR +STARTCHAR U_FA5A +ENCODING 64090 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0440 +3F80 +0500 +FFE0 +3040 +DFC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_FA5B +ENCODING 64091 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +7F40 +0480 +FFE0 +0400 +1FC0 +3040 +DFC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_FA5C +ENCODING 64092 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3E80 +2F80 +2080 +3F80 +0480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_FA5D +ENCODING 64093 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 3 +BITMAP +1200 +FFC0 +1200 +1200 +ENDCHAR +STARTCHAR U_FA5E +ENCODING 64094 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 3 +BITMAP +1200 +FFC0 +1200 +1200 +ENDCHAR +STARTCHAR U_FA5F +ENCODING 64095 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +7F80 +0500 +FFE0 +0880 +1F80 +7080 +1F80 +1080 +ENDCHAR +STARTCHAR U_FA60 +ENCODING 64096 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2CA0 +2560 +27A0 +2040 +ENDCHAR +STARTCHAR U_FA61 +ENCODING 64097 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +27C0 +7440 +AFC0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_FA62 +ENCODING 64098 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F200 +07E0 +FCA0 +9560 +F7A0 +90C0 +ENDCHAR +STARTCHAR U_FA63 +ENCODING 64099 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F100 +07C0 +F540 +0FE0 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_FA64 +ENCODING 64100 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2500 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_FA65 +ENCODING 64101 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +FFE0 +9AA0 +9FE0 +F000 +97C0 +F440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_FA66 +ENCODING 64102 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2000 +0000 +E000 +2000 +2000 +2000 +2000 +5020 +8FC0 +ENDCHAR +STARTCHAR U_FA67 +ENCODING 64103 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +2900 +1FC0 +EA40 +2FC0 +2340 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA68 +ENCODING 64104 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FE80 +53E0 +2680 +FBC0 +AA80 +FA80 +23C0 +FE80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_FA69 +ENCODING 64105 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +AEA0 +4AC0 +EEA0 +2AC0 +FFE0 +0900 +FFE0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_FA6A +ENCODING 64106 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FFE0 +1220 +57E0 +5A20 +93E0 +2140 +C620 +ENDCHAR + + +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR + + +STARTCHAR U_FE30 +ENCODING 65072 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 5 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FE31 +ENCODING 65073 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FE33 +ENCODING 65075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FE34 +ENCODING 65076 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 12 10 -1 +BITMAP +80 +40 +40 +80 +80 +40 +40 +80 +80 +40 +40 +80 +ENDCHAR +STARTCHAR U_FE35 +ENCODING 65077 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +1F00 +60C0 +8020 +ENDCHAR +STARTCHAR U_FE36 +ENCODING 65078 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +8020 +60C0 +1F00 +ENDCHAR +STARTCHAR U_FE37 +ENCODING 65079 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 1 +BITMAP +0400 +0A00 +71C0 +8020 +ENDCHAR +STARTCHAR U_FE38 +ENCODING 65080 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 5 +BITMAP +8020 +71C0 +0A00 +0400 +ENDCHAR +STARTCHAR U_FE39 +ENCODING 65081 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +3F80 +4040 +8020 +ENDCHAR +STARTCHAR U_FE3A +ENCODING 65082 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_FE3B +ENCODING 65083 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 0 +BITMAP +FFE0 +E0E0 +C060 +8020 +ENDCHAR +STARTCHAR U_FE3C +ENCODING 65084 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +8020 +C060 +E0E0 +FFE0 +ENDCHAR +STARTCHAR U_FE3D +ENCODING 65085 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 -1 +BITMAP +0400 +0A00 +3180 +C460 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FE3E +ENCODING 65086 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +C060 +3180 +0A00 +C460 +3180 +0A00 +0400 +ENDCHAR +STARTCHAR U_FE3F +ENCODING 65087 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +0E00 +3180 +C060 +ENDCHAR +STARTCHAR U_FE40 +ENCODING 65088 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +C060 +3180 +0E00 +ENDCHAR +STARTCHAR U_FE41 +ENCODING 65089 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 2 -1 +BITMAP +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_FE42 +ENCODING 65090 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +8000 +8000 +8000 +8000 +FF80 +ENDCHAR +STARTCHAR U_FE43 +ENCODING 65091 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 -1 +BITMAP +FF80 +8080 +FE80 +0280 +0280 +0380 +ENDCHAR +STARTCHAR U_FE44 +ENCODING 65092 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 1 4 +BITMAP +E000 +A000 +A000 +BF80 +8080 +FF80 +ENDCHAR +STARTCHAR U_FE49 +ENCODING 65097 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 9 +BITMAP +CCC0 +ENDCHAR +STARTCHAR U_FE4A +ENCODING 65098 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 1 0 9 +BITMAP +E4E0 +ENDCHAR +STARTCHAR U_FE4B +ENCODING 65099 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 7 +BITMAP +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_FE4C +ENCODING 65100 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 7 +BITMAP +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_FE4D +ENCODING 65101 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 -1 +BITMAP +CCC0 +ENDCHAR +STARTCHAR U_FE4E +ENCODING 65102 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 1 0 -1 +BITMAP +E4E0 +ENDCHAR +STARTCHAR U_FE4F +ENCODING 65103 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 2 0 8 +BITMAP +6640 +99A0 +ENDCHAR +STARTCHAR U_FE50 +ENCODING 65104 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 8 0 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FE51 +ENCODING 65105 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 3 7 0 +BITMAP +80 +60 +20 +ENDCHAR +STARTCHAR U_FE52 +ENCODING 65106 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 2 8 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_FE54 +ENCODING 65108 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 8 5 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FE55 +ENCODING 65109 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 5 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FE56 +ENCODING 65110 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +70 +88 +88 +08 +10 +10 +20 +00 +20 +20 +ENDCHAR +STARTCHAR U_FE57 +ENCODING 65111 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR U_FE59 +ENCODING 65113 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 8 7 1 +BITMAP +20 +40 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR U_FE5A +ENCODING 65114 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 8 3 1 +BITMAP +80 +40 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_FE5B +ENCODING 65115 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 9 7 0 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR U_FE5C +ENCODING 65116 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 9 3 0 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR U_FE5D +ENCODING 65117 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 8 0 +BITMAP +20 +40 +80 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR U_FE5E +ENCODING 65118 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 3 0 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_FE5F +ENCODING 65119 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR U_FE60 +ENCODING 65120 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +50 +50 +20 +5C +A8 +A8 +90 +48 +34 +ENDCHAR +STARTCHAR U_FE61 +ENCODING 65121 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 3 2 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR U_FE62 +ENCODING 65122 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 3 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR U_FE63 +ENCODING 65123 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 1 4 4 +BITMAP +F0 +ENDCHAR +STARTCHAR U_FE64 +ENCODING 65124 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 2 +BITMAP +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR U_FE65 +ENCODING 65125 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 2 +BITMAP +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR U_FE66 +ENCODING 65126 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 4 3 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR U_FE68 +ENCODING 65128 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +02 +ENDCHAR +STARTCHAR U_FE69 +ENCODING 65129 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 4 0 +BITMAP +20 +70 +A8 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR U_FE6A +ENCODING 65130 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 1 +BITMAP +42 +A4 +A8 +A8 +54 +2A +2A +4A +44 +ENDCHAR +STARTCHAR U_FE6B +ENCODING 65131 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +3C +42 +42 +95 +AD +A5 +AA +54 +42 +3C +ENDCHAR +STARTCHAR U_FF01 +ENCODING 65281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 3 -1 +BITMAP +40 +E0 +E0 +E0 +E0 +40 +40 +40 +00 +40 +40 +ENDCHAR +STARTCHAR U_FF02 +ENCODING 65282 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR U_FF03 +ENCODING 65283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +12 +12 +12 +7F +24 +24 +24 +FF +48 +48 +48 +ENDCHAR +STARTCHAR U_FF04 +ENCODING 65284 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 3 -1 +BITMAP +7C +D2 +92 +90 +50 +3E +11 +D1 +93 +7C +10 +ENDCHAR +STARTCHAR U_FF05 +ENCODING 65285 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 12 1 -1 +BITMAP +7000 +8820 +8840 +8880 +7100 +0200 +0400 +09C0 +1220 +2220 +4220 +81C0 +ENDCHAR +STARTCHAR U_FF06 +ENCODING 65286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3800 +4400 +4400 +4400 +2800 +3380 +5100 +8A00 +8440 +8A40 +7180 +ENDCHAR +STARTCHAR U_FF07 +ENCODING 65287 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 2 7 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF08 +ENCODING 65288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 7 -1 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR U_FF09 +ENCODING 65289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 3 -1 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR U_FF0A +ENCODING 65290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +10 +10 +D6 +38 +28 +44 +44 +ENDCHAR +STARTCHAR U_FF0B +ENCODING 65291 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_FF0C +ENCODING 65292 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 3 0 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF0D +ENCODING 65293 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 1 2 4 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_FF0E +ENCODING 65294 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_FF0F +ENCODING 65295 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +0040 +0080 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_FF10 +ENCODING 65296 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF11 +ENCODING 65297 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 10 3 -1 +BITMAP +20 +20 +E0 +20 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR U_FF12 +ENCODING 65298 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +78 +84 +84 +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR U_FF13 +ENCODING 65299 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +70 +88 +04 +08 +30 +08 +04 +04 +88 +70 +ENDCHAR +STARTCHAR U_FF14 +ENCODING 65300 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +08 +18 +28 +28 +48 +48 +88 +FE +08 +1C +ENDCHAR +STARTCHAR U_FF15 +ENCODING 65301 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +FC +80 +80 +B0 +C8 +84 +04 +04 +88 +70 +ENDCHAR +STARTCHAR U_FF16 +ENCODING 65302 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +80 +80 +B8 +C4 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF17 +ENCODING 65303 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +FC +84 +84 +08 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR U_FF18 +ENCODING 65304 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +44 +38 +44 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF19 +ENCODING 65305 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +82 +46 +3A +02 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF1A +ENCODING 65306 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 6 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FF1B +ENCODING 65307 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 8 6 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF1C +ENCODING 65308 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0180 +0600 +1800 +6000 +8000 +6000 +1800 +0600 +0180 +ENDCHAR +STARTCHAR U_FF1D +ENCODING 65309 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 4 1 2 +BITMAP +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_FF1E +ENCODING 65310 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +C000 +3000 +0C00 +0300 +0080 +0300 +0C00 +3000 +C000 +ENDCHAR +STARTCHAR U_FF1F +ENCODING 65311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +78 +CC +CC +0C +18 +30 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR U_FF20 +ENCODING 65312 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +1E00 +2100 +4C80 +9240 +A240 +A240 +A680 +5B00 +2080 +1F00 +ENDCHAR +STARTCHAR U_FF21 +ENCODING 65313 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +1400 +1400 +2200 +2200 +3E00 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_FF22 +ENCODING 65314 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +F8 +44 +42 +44 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_FF23 +ENCODING 65315 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +1D +23 +41 +80 +80 +80 +80 +41 +22 +1C +ENDCHAR +STARTCHAR U_FF24 +ENCODING 65316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FC +42 +41 +41 +41 +41 +41 +41 +42 +FC +ENDCHAR +STARTCHAR U_FF25 +ENCODING 65317 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FE +41 +40 +44 +7C +44 +40 +41 +41 +FE +ENDCHAR +STARTCHAR U_FF26 +ENCODING 65318 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FE +41 +40 +44 +7C +44 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF27 +ENCODING 65319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +3D00 +4300 +8100 +8000 +8000 +8F80 +8100 +8100 +4300 +3D00 +ENDCHAR +STARTCHAR U_FF28 +ENCODING 65320 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +4100 +7F00 +4100 +4100 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_FF29 +ENCODING 65321 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF2A +ENCODING 65322 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 11 2 -1 +BITMAP +1C +08 +08 +08 +08 +08 +08 +08 +08 +90 +60 +ENDCHAR +STARTCHAR U_FF2B +ENCODING 65323 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +EE +44 +48 +50 +60 +50 +48 +44 +42 +E7 +ENDCHAR +STARTCHAR U_FF2C +ENCODING 65324 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +41 +42 +FE +ENDCHAR +STARTCHAR U_FF2D +ENCODING 65325 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +C060 +4040 +60C0 +60C0 +5140 +5140 +4A40 +4A40 +4440 +E4E0 +ENDCHAR +STARTCHAR U_FF2E +ENCODING 65326 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +C7 +62 +52 +52 +4A +4A +46 +46 +42 +E2 +ENDCHAR +STARTCHAR U_FF2F +ENCODING 65327 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +1C00 +2200 +4100 +8080 +8080 +8080 +8080 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_FF30 +ENCODING 65328 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +F8 +44 +42 +42 +44 +78 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF31 +ENCODING 65329 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1C00 +2200 +4100 +8080 +8080 +8080 +9880 +4500 +2200 +1D40 +00C0 +ENDCHAR +STARTCHAR U_FF32 +ENCODING 65330 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FC00 +4200 +4100 +4200 +7C00 +4400 +4200 +4200 +4200 +E280 +0100 +ENDCHAR +STARTCHAR U_FF33 +ENCODING 65331 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +7A +86 +82 +40 +30 +08 +04 +82 +C2 +BC +ENDCHAR +STARTCHAR U_FF34 +ENCODING 65332 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_FF35 +ENCODING 65333 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +4100 +4100 +4100 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_FF36 +ENCODING 65334 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +2200 +2200 +2200 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR U_FF37 +ENCODING 65335 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EEE0 +4440 +4440 +4440 +2A80 +2A80 +2A80 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_FF38 +ENCODING 65336 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +2200 +1400 +0800 +0800 +1400 +2200 +4100 +E380 +ENDCHAR +STARTCHAR U_FF39 +ENCODING 65337 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +2200 +1400 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_FF3A +ENCODING 65338 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +3F80 +2100 +4200 +0400 +0800 +0800 +1000 +2080 +4080 +FF80 +ENDCHAR +STARTCHAR U_FF3B +ENCODING 65339 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 12 6 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR U_FF3C +ENCODING 65340 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +8000 +4000 +2000 +1000 +0800 +0400 +0200 +0100 +0080 +0040 +0020 +0010 +ENDCHAR +STARTCHAR U_FF3D +ENCODING 65341 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 12 2 -1 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR U_FF3E +ENCODING 65342 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 0 +BITMAP +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FF3F +ENCODING 65343 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 1 0 -1 +BITMAP +FFF0 +ENDCHAR +STARTCHAR U_FF40 +ENCODING 65344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 4 8 7 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR U_FF41 +ENCODING 65345 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 0 +BITMAP +70 +88 +38 +48 +88 +9A +64 +ENDCHAR +STARTCHAR U_FF42 +ENCODING 65346 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +58 +64 +42 +42 +42 +64 +58 +ENDCHAR +STARTCHAR U_FF43 +ENCODING 65347 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 2 -1 +BITMAP +38 +44 +80 +80 +80 +44 +38 +ENDCHAR +STARTCHAR U_FF44 +ENCODING 65348 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +0C +04 +04 +34 +4C +84 +84 +84 +4C +36 +ENDCHAR +STARTCHAR U_FF45 +ENCODING 65349 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 2 -1 +BITMAP +30 +48 +84 +FC +80 +44 +38 +ENDCHAR +STARTCHAR U_FF46 +ENCODING 65350 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 2 -1 +BITMAP +18 +24 +20 +F8 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR U_FF47 +ENCODING 65351 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +3A +44 +44 +38 +20 +7C +82 +7C +ENDCHAR +STARTCHAR U_FF48 +ENCODING 65352 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +58 +64 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_FF49 +ENCODING 65353 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +C0 +C0 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF4A +ENCODING 65354 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 2 -1 +BITMAP +18 +08 +00 +18 +08 +08 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR U_FF4B +ENCODING 65355 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +5C +48 +50 +70 +48 +44 +EE +ENDCHAR +STARTCHAR U_FF4C +ENCODING 65356 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF4D +ENCODING 65357 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 7 1 -1 +BITMAP +B300 +4C80 +4880 +4880 +4880 +4880 +DDC0 +ENDCHAR +STARTCHAR U_FF4E +ENCODING 65358 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +D8 +64 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_FF4F +ENCODING 65359 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF50 +ENCODING 65360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 8 2 -1 +BITMAP +F8 +44 +44 +44 +44 +78 +40 +E0 +ENDCHAR +STARTCHAR U_FF51 +ENCODING 65361 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +36 +4C +84 +84 +4C +34 +04 +0E +ENDCHAR +STARTCHAR U_FF52 +ENCODING 65362 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 -1 +BITMAP +D8 +64 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF53 +ENCODING 65363 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 3 -1 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR U_FF54 +ENCODING 65364 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 2 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +24 +18 +ENDCHAR +STARTCHAR U_FF55 +ENCODING 65365 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +EE +44 +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR U_FF56 +ENCODING 65366 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 7 1 -1 +BITMAP +E7 +42 +22 +24 +14 +18 +08 +ENDCHAR +STARTCHAR U_FF57 +ENCODING 65367 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 -1 +BITMAP +EEE0 +4440 +4440 +2A80 +2A80 +1100 +1100 +ENDCHAR +STARTCHAR U_FF58 +ENCODING 65368 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +EE +44 +28 +10 +28 +44 +EE +ENDCHAR +STARTCHAR U_FF59 +ENCODING 65369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +EE +44 +28 +28 +10 +10 +10 +60 +ENDCHAR +STARTCHAR U_FF5A +ENCODING 65370 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +7C +88 +10 +10 +22 +44 +FC +ENDCHAR +STARTCHAR U_FF5B +ENCODING 65371 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 12 7 -1 +BITMAP +20 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR U_FF5C +ENCODING 65372 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 11 6 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FF5D +ENCODING 65373 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 12 2 -1 +BITMAP +80 +40 +40 +40 +40 +20 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR U_FF5E +ENCODING 65374 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 3 0 3 +BITMAP +1C00 +6310 +80E0 +ENDCHAR +STARTCHAR U_FFE0 +ENCODING 65504 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +04 +3C +4A +88 +90 +90 +A2 +64 +58 +ENDCHAR +STARTCHAR U_FFE1 +ENCODING 65505 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0600 +0900 +0800 +0800 +0800 +FE00 +0800 +7040 +9C80 +6300 +ENDCHAR +STARTCHAR U_FFE3 +ENCODING 65507 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 1 0 10 +BITMAP +FFF0 +ENDCHAR +STARTCHAR U_FFE5 +ENCODING 65509 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +E380 +4100 +2200 +7F00 +1400 +7F00 +0800 +0800 +0800 +1C00 +ENDCHAR + +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/u8glib-bdf2u8g.patch b/buildroot/share/fonts/u8glib-bdf2u8g.patch new file mode 100644 index 0000000000..1201e99800 --- /dev/null +++ b/buildroot/share/fonts/u8glib-bdf2u8g.patch @@ -0,0 +1,32 @@ +178c178 +< fprintf(out_fp, "%d", data_buf[i]); +--- +> fprintf(out_fp, "0x%02x", data_buf[i]); +180c180 +< fprintf(out_fp, "%3d", data_buf[i]); +--- +> fprintf(out_fp, "0x%02x", data_buf[i]); +487c487,488 +< int bdf_delta_x; /* DWIDTH arg 1 */ +--- +> int bdf_delta_x_default = -1; +> int bdf_delta_x = -1; /* DWIDTH arg 1 */ +1097a1099,1114 +> else if ( strcmp(p_buf, "CHARS") == 0 ) +> { +> if (bdf_delta_x < 0) { +> bdf_delta_x = 0; +> } +> if (bdf_delta_x_default < 0) { +> bdf_delta_x_default = bdf_delta_x; +> } +> } +> else if ( strcmp(p_buf, "STARTCHAR") == 0 ) +> { +> if (bdf_delta_x_default < 0) { +> bdf_delta_x_default = 0; +> } +> bdf_delta_x = bdf_delta_x_default; +> } +1293d1309 +< fprintf(out_fp, "#include \"u8g.h\"\n"); diff --git a/buildroot/share/fonts/uxggenpages.md b/buildroot/share/fonts/uxggenpages.md new file mode 100644 index 0000000000..314b5d5c06 --- /dev/null +++ b/buildroot/share/fonts/uxggenpages.md @@ -0,0 +1,110 @@ +## Language engine and tools + +### Supported hardware + +Marlin supports HD44780 character LCD and 128x64 graphical LCD via U8GLIB. Because of the limitation of HD44780 hardwares, Marlin can only support three character sets for that hardware: Japanese (kana_utf8), Russian/Cyrillic (ru), or Western (Roman characters) + +For the graphical LCD modules, there's far less limitation. Users and language maintainers can easily change the language translation strings when saved with UTF-8 encoding. The only extra step is to regenerate the font data from an existing BDF font file. + +### How to support a new language? + +1. Prepare the translation source file + +You need to add a language header file `language_xx.h`, replacing xx with the language/country code. (e.g., "en" for English). You can start with a existing language file by copying it to a new location: + +```bash +cp language_zh_CN.h language_zh_TW.h +``` + +Then simply replace the strings inside the `_UxGT()` macros. + +Make sure the file is saved as UTF-8 encoded. + +2. Generate the font data file + +This step gathers the glyphs used in the language file from a 9pt bitmap font and saves the data in a language_data_xx.h file. So the font used for conversion should contain all the characters in your language file. + +The default bitmap font is WQY's 9pt bitmap font. + +Download from [here](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz), or to install in a Debian/Ubuntu system: + +``` +sudo apt-get install xfonts-wqy +``` + +You also need to compile the `bdf2u8g` binary to convert BDF font files into U8glib data structures: + +```bash +cd marlin-git/buildroot/share/fonts/ +./get-bdf2u8g.sh +``` + +The `genallfont.sh` script generates font data for all language translation files. + +You may specify a list of languages to process. For example: + +```bash +MARLIN_LANGS="zh_CN zh_TW" +``` + +and run the script to generate the font data (`language_data_xx.h`): + +```bash +cd marlin-git/Marlin/ +MARLIN_LANGS="zh_CN zh_TW" ../buildroot/share/fonts/genallfont.sh +``` + +3. Change the language settings + +To compile Marlin with your language, choose a language in `Configuration.h`. For Chinese (Taiwan) you would use: + +```cpp +#define LCD_LANGUAGE zh_TW +``` + +4. Compile and Upload the firmware + +Open `Marlin.ino` in your IDE and compile the firmware. Once the build succeeds, upload it to your board. + +### Update the language translation + +Whenever language files are changed, you need to run the script `genallfont.sh` again to update the font data file. + +### Use a cool font + +You may need to use a different font to support your own language, because the default 9pt font is not complete. (You may also support them by adding the missing glyphs to the font.) + +After you've prepared your font, specify the font file path as an argument to `genallfont.sh`, so that the font used for your language is your new font. For example, if your font is named `newfont.bdf` run the following command: + +```bash +cd Marlin/ +../buildroot/share/fonts/genallfont.sh ./newfont.bdf +``` + +...or to regenerate the language font data for a specific language: + +```bash +MARLIN_LANGS="zh_TW" ../buildroot/share/fonts/genallfont.sh ./newfont.bdf +``` + +### Suggestions for Maintainers + +The tool and the language engine can be easily updated. Since it uses common bitmap font files and UTF-8 text, the maintainer needs to confirm that the font contains the glyphs in the language files. + +At this time, the font file `marlin-6x12-3.bdf` is used to generate the font data. It combines all of Marlin's ISO10646-1 fonts and the WQY 9pt bitmap font. + +### Related resources + +#### Fonts + +- [WQY](http://wenq.org/) +- [WQY 9pt bitmap font](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz) +- [unifont (16x8 or 16x16)](http://unifoundry.com/unifont.html) + +Documents related to the old version of the language engine: + +- [Marlin Fonts Documentation](http://www.marlinfw.org/docs/development/fonts.html) +- [Marlin LCD Language](http://marlinfw.org/docs/development/lcd_language.html) +- [U8GLIB](https://github.com/olikraus/u8glib.git) +- [UTF-8 for U8GLIB](https://github.com/yhfudev/u8glib-fontutf8.git) +- [Standalone test project for the Marlin UTF-8 language engine](https://github.com/yhfudev/marlin-fontutf8.git) diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh new file mode 100644 index 0000000000..6cf6c49769 --- /dev/null +++ b/buildroot/share/fonts/uxggenpages.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash + +##################################################################### +# genpages.sh for u8g +# +# This script will generate u8g c files for specified fonts +# +# Copyright 2015-2018 Yunhui Fu +# License: GPL/BSD +##################################################################### + +my_getpath() { + local PARAM_DN="$1" + shift + + #readlink -f + local DN="${PARAM_DN}" + local FN= + if [ ! -d "${DN}" ]; then + FN=$(basename "${DN}") + DN=$(dirname "${DN}") + fi + cd "${DN}" > /dev/null 2>&1 + DN=$(pwd) + cd - > /dev/null 2>&1 + echo -n "${DN}" + [[ -z "$FN" ]] || echo -n "/${FN}" +} +#DN_EXEC=`echo "$0" | ${EXEC_AWK} -F/ '{b=$1; for (i=2; i < NF; i ++) {b=b "/" $(i)}; print b}'` +DN_EXEC=$(dirname $(my_getpath "$0") ) + +##################################################################### + +EXEC_GENPAGES=${DN_EXEC}/genpages +[ -x "${EXEC_GENPAGES}" ] || EXEC_GENPAGES="$(my_getpath ${DN_EXEC}/../../../genpages)" +[ -x "${EXEC_GENPAGES}" ] || EXEC_GENPAGES=$(which genpages) +[ -x "${EXEC_GENPAGES}" ] || { echo "Error: genpages not found!" ; exit 1; } +#echo "EXEC_GENPAGES=${EXEC_GENPAGES}" + +EXEC_BDF2U8G=${DN_EXEC}/bdf2u8g +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${DN_EXEC}/../../../bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G=$(which bdf2u8g) +[ -x "${EXEC_BDF2U8G}" ] || { echo "Error: bdf2u8g not found!" ; echo "Please compile u8glib/tools/font/bdf2u8g/bdf2u8g and link to it from here!"; exit 1; } + +DN_CUR=$(pwd) +DN_DATA=$(pwd)/datatmp +mkdir -p "${DN_DATA}" + +##################################################################### + +FONTHOME=/usr/share/fonts + +FN_FONT_BASE="marlin-6x12-3" +#FN_FONT_BASE=unifont +#FN_FONT_BASE=wenquanyi_12pt +#FN_FONT_BASE=wenquanyi_9pt + +FN_FONT="${1:-}" +DN_FONT0=`dirname ${FN_FONT}` +DN_FONT="$(my_getpath ${DN_FONT0})" +FN_FONT="$(my_getpath "${DN_FONT}")/"`basename ${FN_FONT}` +[ -z "${FN_FONT}" ] && FN_FONT=${DN_DATA}/../${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT=${DN_EXEC}/${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/wenquanyi/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/X11/misc/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/misc/${FN_FONT_BASE}.bdf" +#echo "uxggenpages.sh: FN_FONT=${FN_FONT}" + +if [ ! -f "${FN_FONT}" ]; then + FN_FONT_PCF="$FONTHOME/X11/misc/${FN_FONT_BASE}.pcf" + [ -f "${FN_FONT_PCF}" ] || FN_FONT_PCF="$FONTHOME/misc/${FN_FONT_BASE}.pcf" + [ -f "${FN_FONT_PCF}" ] || FN_FONT_PCF="$FONTHOME/wenquanyi/${FN_FONT_BASE}.pcf" + if [ -f "${FN_FONT_PCF}" ]; then + EXEC_PCF2BDF=$(which pcf2bdf) + if [ ! -x "${EXEC_PCF2BDF}" ]; then + echo "Error: not found pcf2bdf!" + echo " Please install pcf2bdf." + exit 1 + fi + FN_FONT="./${FN_FONT_BASE}.bdf" + echo ${EXEC_PCF2BDF} -o "${FN_FONT}" "${FN_FONT_PCF}" + ${EXEC_PCF2BDF} -o "${FN_FONT}" "${FN_FONT_PCF}" + fi +fi + +[ -f "${FN_FONT}" ] || { echo "Error: can't find font ${FN_FONT}!" ; exit 1; } + +##################################################################### + +#(cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) + +rm -f tmpa tmpb +touch tmpa tmpb +#rm -f ${DN_EXEC}/fontpage_*.h +rm -f fontpage_*.h + +cat << EOF >"proc.awk" +BEGIN { + cur_page=0; + val_begin=0; + val_pre=0; + utf8_pre=""; + utf8_begin=""; +}{ + page=\$1; + val_real=\$2; + utf8=\$3; + # assert (val_real < 128); + val=val_real + 128; + if (cur_page != page) { + if (cur_page != 0) { + if (val_begin != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } + } + cur_page=page; + val_begin=val; + val_pre=val; + utf8_begin=utf8; + utf8_pre=utf8; + } else { + if (val_pre + 1 != val) { + if (cur_page != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } + val_begin=val; + val_pre=val; + utf8_begin=utf8; + utf8_pre=utf8; + } else { + val_pre = val; + utf8_pre=utf8; + } + } +} END { + if (cur_page != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } +} +EOF + +grep -Hrn _UxGT . | grep '"' \ + | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ + | ${EXEC_GENPAGES} \ + | sort -k 1n -k 2n | uniq \ + | gawk -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ + | while read PAGE BEGIN END UTF8BEGIN UTF8END; do \ + if [ ! -f ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h ]; then \ + ${EXEC_BDF2U8G} -u ${PAGE} -b ${BEGIN} -e ${END} ${FN_FONT} fontpage_${PAGE}_${BEGIN}_${END} ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h > /dev/null 2>&1 ; + fi ; \ + grep -A 10000000000 u8g_fntpgm_uint8_t ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h >> tmpa ; \ + echo " FONTDATA_ITEM(${PAGE}, ${BEGIN}, ${END}, fontpage_${PAGE}_${BEGIN}_${END}), // '${UTF8BEGIN}' -- '${UTF8END}'" >> tmpb ;\ + done + +TMPA=$(cat tmpa) +TMPB=$(cat tmpb) + +EOL=$'\n' +[[ ! "$TMPA" == "" ]] && TMPA="$EOL$TMPA$EOL" +[[ ! "$TMPB" == "" ]] && TMPB="$EOL$TMPB$EOL" + +rm -f tmpa tmpb "proc.awk" + +cat <fontutf8-data.h +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include +$TMPA +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {$TMPB}; +EOF diff --git a/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino index 9702d9d91f..dc2ce41ce1 100644 --- a/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino +++ b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino @@ -10,7 +10,7 @@ void setup() { Serial.begin(9600); - Serial.println("PINs causing interrups are:"); + Serial.println("PINs causing interrupts are:"); for (int i = 2; i < NUM_DIGITAL_PINS; i++) { if (digitalPinToPCICR(i) || (int)digitalPinToInterrupt(i) != -1) { for (int j = 0; j < NUM_ANALOG_INPUTS; j++) { diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 2dc924f0b7..c223d2a063 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -9,7 +9,9 @@ # If no language codes are specified then all languages will be checked # -[ -d "Marlin" ] && cd "Marlin" +LANGHOME="Marlin/src/lcd/language" + +[ -d $LANGHOME ] && cd $LANGHOME FILES=$(ls language_*.h | grep -v -E "(_en|_test)\.h" | sed -E 's/language_([^\.]+)\.h/\1/') declare -A STRING_MAP diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index 50747949b5..2799e06a81 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -14,7 +14,7 @@ "folder_exclude_patterns": [ ".pio*", - "Marlin/lib", + "lib", "datatmp", "Marlin/*/src", ".vscode" diff --git a/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt b/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt new file mode 100644 index 0000000000..5853977911 --- /dev/null +++ b/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt @@ -0,0 +1,40 @@ +Overview: +1) Install Sublime +2) Install Deviot (?optional?) +3) Install WebDevShell (this will execute the auto-build script) +4) Copy the menu configuration to the proper Sublime directory +5) Add platformio to your path (usually not needed) + + +Sublime with autobuild + Tools + Install Package Control + Tools + Command Palette + Package Control: Install Package + type in deviot and click on it + Tools + Command Palette + Package Control: Install Package + type in WebDevShell and click on it + + in Sublime, open Marlin directory with "platformio.ini" in it + + starting in the top level directory, go to the folder "Buildroot/shared/Sublime" + copy the folder "auto_build_sublime_menu" and contents to: + Windows + \Users\your_user_name\AppData\Roaming\Sublime Text 3\Packages + Linux + /home/your_user_name/.config/sublime-text-3/Packages/User + macOS (Click on the Finder's 'Go' menu and hold down Option to open...) + ~/Library/Application Support/Sublime Text 3/Packages/User + +The menu should now be visible + +If you get an error message that says "file not found" and "subprocess.Popen(['platformio' ... " +then you'll need to add platformio to your path. + macOS + sudo nano /etc/paths + add these to the bottom + /Users/bob/.platformio + /Users/bob/.platformio/penv/bin diff --git a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu new file mode 100644 index 0000000000..b1c34930b4 --- /dev/null +++ b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu @@ -0,0 +1,66 @@ +[ + + { + "caption": "Auto Build", + "children": [ + { + "caption": "PIO Build", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py build" + } + }, + { + "caption": "PIO Clean", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py clean" + } + }, + { + "caption": "PIO Upload", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py upload" + } + }, + { + "caption": "PIO Upload (traceback)", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py traceback" + } + }, + { + "caption": "PIO Upload using Programmer", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py program" + } + }, + { + "caption": "PIO Test", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py test" + } + }, + { + "caption": "PIO Debug", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py debug" + } + }, + { + "caption": "PIO Remote", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/atom/auto_build.py remote" + } + } + ], + "id": "AutoBuild", + "mnemonic": "A" + } +] \ No newline at end of file diff --git a/docs/Bresenham.md b/docs/Bresenham.md new file mode 100644 index 0000000000..59a2150964 --- /dev/null +++ b/docs/Bresenham.md @@ -0,0 +1,269 @@ +On the Bresenham algorithm as implemented by Marlin: +(Taken from (https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html) + +The basic Bresenham algorithm: + +Consider drawing a line on a raster grid where we restrict the allowable slopes of the line to the range 0 <= m <= 1 + +If we further restrict the line-drawing routine so that it always increments x as it plots, it becomes clear that, having plotted a point at (x,y), the routine has a severely limited range of options as to where it may put the next point on the line: + +- It may plot the point (x+1,y), or: +- It may plot the point (x+1,y+1). + +So, working in the first positive octant of the plane, line drawing becomes a matter of deciding between two possibilities at each step. + +We can draw a diagram of the situation which the plotting program finds itself in having plotted (x,y). + +``` + y+1 +--------------* + | / + | / + | / + | / + | y+e+m*--------+- + | /| ^ | + | / | |m | + | / | | | + | / | v | + | y+e*----|----- |m+ε + | /| | ^ | + | / | | |ε | + | / | | | | + |/ | | v v + y *----+----+----------+-- + x x+1 +``` + +In plotting (x,y) the line drawing routine will, in general, be making a compromise between what it would like to draw and what the resolution of the stepper motors actually allows it to draw. Usually the plotted point (x,y) will be in error, the actual, mathematical point on the line will not be addressable on the pixel grid. So we associate an error, ε, with each y ordinate, the real value of y should be y+ε . This error will range from -0.5 to just under +0.5. + +In moving from x to x+1 we increase the value of the true (mathematical) y-ordinate by an amount equal to the slope of the line, m. We will choose to plot (x+1,y) if the difference between this new value and y is less than 0.5 + +``` +y + ε + m < y + 0.5 +``` + +Otherwise we will plot (x+1,y+1). It should be clear that by so doing we minimize the total error between the mathematical line segment and what actually gets drawn on the display. + +The error resulting from this new point can now be written back into ε, this will allow us to repeat the whole process for the next point along the line, at x+2. + +The new value of error can adopt one of two possible values, depending on what new point is plotted. If (x+1,y) is chosen, the new value of error is given by: + +``` +ε[new] = (y + ε + m) - y +``` + +Otherwise, it is: + +``` +ε[new] = (y + ε + m) - (y + 1) +``` + +This gives an algorithm for a DDA which avoids rounding operations, instead using the error variable ε to control plotting: + +``` + ε = 0, y = y[1] + for x = x1 to x2 do + Plot point at (x,y) + if (ε + m < 0.5) + ε = ε + m + else + y = y + 1, ε = ε + m - 1 + endif + endfor +``` + +This still employs floating point values. Consider, however, what happens if we multiply across both sides of the plotting test by Δx and then by 2: + +``` + ε + m < 0.5 + ε + Δy/Δx < 0.5 +2.ε.Δx + 2.Δy < Δx +``` + +All quantities in this inequality are now integral. + +Substitute ε' for ε.Δx . The test becomes: + +``` +2.(ε' + Δy) < Δx +``` + +This gives an integer-only test for deciding which point to plot. + +The update rules for the error on each step may also be cast into ε' form. Consider the floating-point versions of the update rules: + +``` +ε = ε + m +ε = ε + m - 1 +``` + + Multiplying through by Δx yields: + +``` +ε.Δx = ε.Δx + Δy +ε.Δx = ε.Δx + Δy - Δx +``` + +Which is in ε' form: + +``` +ε' = ε' + Δy +ε' = ε' + Δy - Δx +``` + +Using this new ``error'' value, ε' with the new test and update equations gives Bresenham's integer-only line drawing algorithm: + +``` +ε' = 0, y = y[1] +for x = x1 to x2 do + Plot point at (x,y) + if (2.(ε' + Δy) < Δx) + ε' = ε' + Δy + else + y = y + 1, ε' = ε' + Δy - Δx + endif +endfor +``` + +It is a Integer only algorithm - hence efficient (fast). And the Multiplication by 2 can be implemented by left-shift. 0 <= m <= 1 + +### Oversampling Bresenham algorithm: + +Even if Bresenham does NOT lose steps at all, and also does NOT accumulate error, there is a concept i would call "time resolution" - If the quotient between major axis and minor axis (major axis means, in this context, the axis that must create more step pulses compared with the other ones, including the extruder) + +Well, if the quotient result is not an integer, then Bresenham, at some points in the movement of the major axis, must decide that it has to move the minor axis. It is done in such way that after the full major axis movement has executed, it also has executed the full movements of the minor axis. And the minor axis steps were properly distributed evenly along the major axis movement. So good so far. + +But, as said, Bresenham has "discrete" decision points: It can only decide to move (or not to move) minor axis exactly at the moment the major axis moves. And that is not the ideal point (in time) usually. + +With slow movements that are composed of a similar, but not equal number of steps in all axes, the problem worsens, as the decision points are distributed very sparsely, and there are large delays between those decision points. + +It is nearly trivial to extend Bresenham to "oversample" in that situation: Let's do it: + +Assume that we want to use Bresenham to calculate when to step (move in Y direction), but we want to do it, not for integer increments of the X axis, rather than, for fractional increments. + +Let's call 'r' the count of subdivisions we want to split an integer increment of the X axis: + +``` +m = Δy/Δx = increment of y due to the increment of x1 +``` + +Every time we move `1/r` in the X axis, then the Y axis should move `m.1/r` + +But, as stated previously, due to the resolution of the screen, there are 2 choices: + +- It may plot the point `(x+(1/r),y)`, or: +- It may plot the point `(x+(1/r),y+1)`. + +That decision must be made keeping the error as small as possible: + +``` +-0.5 < ε < 0.5 +``` + +So, the proper condition for that decision is (`m/r` is the increment of y due to the fractional `1/r` increment of `x`): + +``` +y + ε + m/r < y + 0.5 +ε + m/r < 0.5 [1] +``` + +Once we did the decision, then the error update conditions are: + +Decision A: +``` +ε[new] = y + ε + m/r - y +ε[new] = ε + m/r [2] +``` + +Decision B: +``` +ε[new] = y + ε + m/r - (y+1) +ε[new] = ε + m/r - 1 [3] +``` + +We replace m in the decision inequality [1] by its definition: + +``` +ε + m/r < 0.5 +ε + ΔY/(ΔX*r) < 0.5 +``` + +Then, we multiply it by `2.Δx.r`: + +``` +ε + ΔY/(ΔX*r) < 0.5 +2.ΔX.ε.r + 2.ΔY < ΔX.r +``` + +If we define `ε' = 2.ε.ΔX.r` then it becomes: + +``` +ε' + 2.ΔY < ΔX.r [4] +``` + +Now, for the update rules, we multiply by 2.r.ΔX + +``` +ε[new] = ε + m/r +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.r.ΔX.ΔY/ΔX/r +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.ΔY +ε'[new] = ε' + 2.ΔY [6] +``` + +``` +ε[new] = ε + m/r - 1 +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.r.ΔX.ΔY/ΔX/r - 1 . 2.r.ΔX +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.ΔY - 2.ΔX.r +ε'[new] = ε' + 2.ΔY - 2.ΔX.r [7] +``` + +All expressions, the decision inequality [4], and the update equations [5] and [6] are integer valued. There is no need for floating point arithmetic at all. + +Summarizing: + +``` +Condition equation: + + ε' + 2.ΔY < ΔX.r [4] + +Error update equations: + + ε'[new] = ε' + 2.ΔY [6] + + ε'[new] = ε' + 2.ΔY - 2.ΔX.r [7] +``` + +This can be implemented in C as: + +```cpp + class OversampledBresenham { + private: + long divisor, // stepsX + dividend, // stepsY + advanceDivisor, // advanceX + advanceDividend; // advanceY + int errorAccumulator; // Error accumulator + + public: + unsigned int ticker; + + OversampledBresenhan(const long& inDividend, const long& inDivisor, int rate) { + ticker = 0; + divisor = inDivisor; + dividend = inDividend; + advanceDivisor = divisor * 2 * rate; + advanceDividend = dividend * 2; + errorAccumulator = -divisor * rate; + } + + bool tick() { + errorAccumulator += advanceDividend; + const bool over = errorAccumulator >= 0; + if (over) { + ticker++; + errorAccumulator -= advanceDivisor; + } + return over; + } + }; +``` diff --git a/frameworks/CMSIS/LPC1768/Re-ARM/LPC1768.ld b/frameworks/CMSIS/LPC1768/Re-ARM/LPC1768.ld new file mode 100644 index 0000000000..7236f04013 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/Re-ARM/LPC1768.ld @@ -0,0 +1,180 @@ +/* Linker script for mbed LPC1768 */ +MEMORY +{ + //FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K + FLASH (rx) : ORIGIN = 16K, LENGTH = (512K - 16K) + RAM (rwx) : ORIGIN = 0x100000C8, LENGTH = (32K - 0xC8) + + USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K + ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + Image$$RW_IRAM1$$Base = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + __bss_start__ = .; + *(.bss*) + *(COMMON) + __bss_end__ = .; + Image$$RW_IRAM1$$ZI$$Limit = . ; + } > RAM + + .heap : + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy : + { + *(.stack) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + PROVIDE(__heapLimit = __HeapLimit); + PROVIDE(__stackSize = __StackTop - __HeapLimit); + + /* Area of memory, heap and stack, to fill on startup - 8 bytes at a time. */ + __FillStart = ALIGN(__end__, 8); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Code can explicitly ask for data to be + placed in these higher RAM banks where + they will be left uninitialized. + */ + .AHBSRAM0 (NOLOAD): + { + Image$$RW_IRAM2$$Base = . ; + PROVIDE(__AHB0_block_start = .); + *(AHBSRAM0) + Image$$RW_IRAM2$$ZI$$Limit = .; + PROVIDE(__AHB0_dyn_start = .); + PROVIDE(__AHB0_end = ORIGIN(USB_RAM) + LENGTH(USB_RAM)); + } > USB_RAM + + .AHBSRAM1 (NOLOAD): + { + Image$$RW_IRAM3$$Base = . ; + PROVIDE(__AHB1_block_start = .); + *(AHBSRAM1) + Image$$RW_IRAM3$$ZI$$Limit = .; + PROVIDE(__AHB1_dyn_start = .); + PROVIDE(__AHB1_end = ORIGIN(ETH_RAM) + LENGTH(ETH_RAM)); + } > ETH_RAM +} diff --git a/frameworks/CMSIS/LPC1768/Re-ARM/system_LPC17xx.c b/frameworks/CMSIS/LPC1768/Re-ARM/system_LPC17xx.c new file mode 100644 index 0000000000..a4ab913a42 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/Re-ARM/system_LPC17xx.c @@ -0,0 +1,629 @@ +/**************************************************************************//** + * @file system_LPC17xx.c + * @brief CMSIS Cortex-M3 Device System Source File for + * NXP LPC17xx Device Series + * @version V1.11 + * @date 21. June 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#include +#include "LPC17xx.h" + + +/** @addtogroup LPC17xx_System + * @{ + */ + +/* +//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +*/ + +/*--------------------- Clock Configuration ---------------------------------- +// +// Clock Configuration +// System Controls and Status Register (SCS) +// OSCRANGE: Main Oscillator Range Select +// <0=> 1 MHz to 20 MHz +// <1=> 15 MHz to 25 MHz +// OSCEN: Main Oscillator Enable +// +// +// +// Clock Source Select Register (CLKSRCSEL) +// CLKSRC: PLL Clock Source Selection +// <0=> Internal RC oscillator +// <1=> Main oscillator +// <2=> RTC oscillator +// +// +// PLL0 Configuration (Main PLL) +// PLL0 Configuration Register (PLL0CFG) +// F_cco0 = (2 * M * F_in) / N +// F_in must be in the range of 32 kHz to 50 MHz +// F_cco0 must be in the range of 275 MHz to 550 MHz +// MSEL: PLL Multiplier Selection +// <6-32768><#-1> +// M Value +// NSEL: PLL Divider Selection +// <1-256><#-1> +// N Value +// +// +// +// PLL1 Configuration (USB PLL) +// PLL1 Configuration Register (PLL1CFG) +// F_usb = M * F_osc or F_usb = F_cco1 / (2 * P) +// F_cco1 = F_osc * M * 2 * P +// F_cco1 must be in the range of 156 MHz to 320 MHz +// MSEL: PLL Multiplier Selection +// <1-32><#-1> +// M Value (for USB maximum value is 4) +// PSEL: PLL Divider Selection +// <0=> 1 +// <1=> 2 +// <2=> 4 +// <3=> 8 +// P Value +// +//
+// +// CPU Clock Configuration Register (CCLKCFG) +// CCLKSEL: Divide Value for CPU Clock from PLL0 +// <1-256><#-1> +// +// +// USB Clock Configuration Register (USBCLKCFG) +// USBSEL: Divide Value for USB Clock from PLL0 +// <0-15> +// Divide is USBSEL + 1 +// +// +// Peripheral Clock Selection Register 0 (PCLKSEL0) +// PCLK_WDT: Peripheral Clock Selection for WDT +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_TIMER0: Peripheral Clock Selection for TIMER0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_TIMER1: Peripheral Clock Selection for TIMER1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_UART0: Peripheral Clock Selection for UART0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_UART1: Peripheral Clock Selection for UART1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_PWM1: Peripheral Clock Selection for PWM1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_I2C0: Peripheral Clock Selection for I2C0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_SPI: Peripheral Clock Selection for SPI +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_SSP1: Peripheral Clock Selection for SSP1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_DAC: Peripheral Clock Selection for DAC +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_ADC: Peripheral Clock Selection for ADC +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_CAN1: Peripheral Clock Selection for CAN1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// PCLK_CAN2: Peripheral Clock Selection for CAN2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// PCLK_ACF: Peripheral Clock Selection for ACF +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// +// +// Peripheral Clock Selection Register 1 (PCLKSEL1) +// PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_GPIO: Peripheral Clock Selection for GPIOs +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_I2C1: Peripheral Clock Selection for I2C1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_SSP0: Peripheral Clock Selection for SSP0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_TIMER2: Peripheral Clock Selection for TIMER2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_TIMER3: Peripheral Clock Selection for TIMER3 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_UART2: Peripheral Clock Selection for UART2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_UART3: Peripheral Clock Selection for UART3 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_I2C2: Peripheral Clock Selection for I2C2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_I2S: Peripheral Clock Selection for I2S +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_SYSCON: Peripheral Clock Selection for the System Control Block +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// PCLK_MC: Peripheral Clock Selection for the Motor Control PWM +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// +// +// Power Control for Peripherals Register (PCONP) +// PCTIM0: Timer/Counter 0 power/clock enable +// PCTIM1: Timer/Counter 1 power/clock enable +// PCUART0: UART 0 power/clock enable +// PCUART1: UART 1 power/clock enable +// PCPWM1: PWM 1 power/clock enable +// PCI2C0: I2C interface 0 power/clock enable +// PCSPI: SPI interface power/clock enable +// PCRTC: RTC power/clock enable +// PCSSP1: SSP interface 1 power/clock enable +// PCAD: A/D converter power/clock enable +// PCCAN1: CAN controller 1 power/clock enable +// PCCAN2: CAN controller 2 power/clock enable +// PCGPIO: GPIOs power/clock enable +// PCRIT: Repetitive interrupt timer power/clock enable +// PCMC: Motor control PWM power/clock enable +// PCQEI: Quadrature encoder interface power/clock enable +// PCI2C1: I2C interface 1 power/clock enable +// PCSSP0: SSP interface 0 power/clock enable +// PCTIM2: Timer 2 power/clock enable +// PCTIM3: Timer 3 power/clock enable +// PCUART2: UART 2 power/clock enable +// PCUART3: UART 3 power/clock enable +// PCI2C2: I2C interface 2 power/clock enable +// PCI2S: I2S interface power/clock enable +// PCGPDMA: GP DMA function power/clock enable +// PCENET: Ethernet block power/clock enable +// PCUSB: USB interface power/clock enable +// +// +// Clock Output Configuration Register (CLKOUTCFG) +// CLKOUTSEL: Selects clock source for CLKOUT +// <0=> CPU clock +// <1=> Main oscillator +// <2=> Internal RC oscillator +// <3=> USB clock +// <4=> RTC oscillator +// CLKOUTDIV: Selects clock divider for CLKOUT +// <1-16><#-1> +// CLKOUT_EN: CLKOUT enable control +// +// +// +*/ + + + +/** @addtogroup LPC17xx_System_Defines LPC17xx System Defines + @{ + */ + +#define CLOCK_SETUP 1 +#define SCS_Val 0x00000020 +#define CLKSRCSEL_Val 0x00000001 +#define PLL0_SETUP 1 // WARNING: NOT USED, see SystemInit() below + +# define PLL0CFG_Val 0x0000000B // WARNING: NOT USED, see SystemInit() below +# define PLL1_SETUP 0 // WARNING: NOT USED, see SystemInit() below +# define PLL1CFG_Val 0x00000000 // WARNING: NOT USED, see SystemInit() below +# define CCLKCFG_Val 0x00000002 // WARNING: NOT USED, see SystemInit() below +# define USBCLKCFG_Val 0x00000005 // WARNING: NOT USED, see SystemInit() below + +#define PCLKSEL0_Val 0x00000000 +#define PCLKSEL1_Val 0x00000000 +#define PCONP_Val 0x042887DE +#define CLKOUTCFG_Val 0x00000000 + + +/*--------------------- Flash Accelerator Configuration ---------------------- +// +// Flash Accelerator Configuration +// FLASHTIM: Flash Access Time +// <0=> 1 CPU clock (for CPU clock up to 20 MHz) +// <1=> 2 CPU clocks (for CPU clock up to 40 MHz) +// <2=> 3 CPU clocks (for CPU clock up to 60 MHz) +// <3=> 4 CPU clocks (for CPU clock up to 80 MHz) +// <4=> 5 CPU clocks (for CPU clock up to 100 MHz) +// <5=> 6 CPU clocks (for any CPU clock) +// +*/ +#define FLASH_SETUP 1 +#define FLASHCFG_Val 0x0000303A + +/* +//-------- <<< end of configuration section >>> ------------------------------ +*/ + +/*---------------------------------------------------------------------------- + Check the register settings + *----------------------------------------------------------------------------*/ +#define CHECK_RANGE(val, min, max) ((val < min) || (val > max)) +#define CHECK_RSVD(val, mask) (val & mask) + +/* Clock Configuration -------------------------------------------------------*/ +#if (CHECK_RSVD((SCS_Val), ~0x00000030)) + #error "SCS: Invalid values of reserved bits!" +#endif + +#if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2)) + #error "CLKSRCSEL: Value out of range!" +#endif + +#if (CHECK_RSVD((PLL0CFG_Val), ~0x00FF7FFF)) + #error "PLL0CFG: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PLL1CFG_Val), ~0x0000007F)) + #error "PLL1CFG: Invalid values of reserved bits!" +#endif + +#if (PLL0_SETUP) /* if PLL0 is used */ + #if (CCLKCFG_Val < 2) /* CCLKSEL must be greater then 1 */ + #error "CCLKCFG: CCLKSEL must be greater then 1 if PLL0 is used!" + #endif +#endif + +#if (CHECK_RANGE((CCLKCFG_Val), 2, 255)) + #error "CCLKCFG: Value out of range!" +#endif + +#if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F)) + #error "USBCLKCFG: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCLKSEL0_Val), 0x000C0C00)) + #error "PCLKSEL0: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCLKSEL1_Val), 0x03000300)) + #error "PCLKSEL1: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCONP_Val), 0x10100821)) + #error "PCONP: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF)) + #error "CLKOUTCFG: Invalid values of reserved bits!" +#endif + +/* Flash Accelerator Configuration -------------------------------------------*/ +#if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F07F)) + #error "FLASHCFG: Invalid values of reserved bits!" +#endif + + +/*---------------------------------------------------------------------------- + DEFINES + *----------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (12000000UL) /* Oscillator frequency */ +#define OSC_CLK ( XTAL) /* Main oscillator frequency */ +#define RTC_CLK ( 32000UL) /* RTC oscillator frequency */ +#define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */ + + +/* F_cco0 = (2 * M * F_in) / N */ +#define __M (((PLL0CFG_Val ) & 0x7FFF) + 1) +#define __N (((PLL0CFG_Val >> 16) & 0x00FF) + 1) +#define __FCCO(__F_IN) ((2ULL * __M * __F_IN) / __N) +#define __CCLK_DIV (((CCLKCFG_Val ) & 0x00FF) + 1) + +/* Determine core clock frequency according to settings */ + #if (PLL0_SETUP) + #if ((CLKSRCSEL_Val & 0x03) == 1) + #define __CORE_CLK (__FCCO(OSC_CLK) / __CCLK_DIV) + #elif ((CLKSRCSEL_Val & 0x03) == 2) + #define __CORE_CLK (__FCCO(RTC_CLK) / __CCLK_DIV) + #else + #define __CORE_CLK (__FCCO(IRC_OSC) / __CCLK_DIV) + #endif + #else + #if ((CLKSRCSEL_Val & 0x03) == 1) + #define __CORE_CLK (OSC_CLK / __CCLK_DIV) + #elif ((CLKSRCSEL_Val & 0x03) == 2) + #define __CORE_CLK (RTC_CLK / __CCLK_DIV) + #else + #define __CORE_CLK (IRC_OSC / __CCLK_DIV) + #endif + #endif + +/** + * @} + */ + + +/** @addtogroup LPC17xx_System_Public_Variables LPC17xx System Public Variables + @{ + */ +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __CORE_CLK;/*!< System Clock Frequency (Core Clock)*/ + +/** + * @} + */ + + +/** @addtogroup LPC17xx_System_Public_Functions LPC17xx System Public Functions + @{ + */ + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ + +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + /* Determine clock frequency according to clock register values */ + if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) { /* If PLL0 enabled and connected */ + switch (LPC_SC->CLKSRCSEL & 0x03) { + case 0: /* Int. RC oscillator => PLL0 */ + case 3: /* Reserved, default to Int. RC */ + SystemCoreClock = (IRC_OSC * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + case 1: /* Main oscillator => PLL0 */ + SystemCoreClock = (OSC_CLK * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + case 2: /* RTC oscillator => PLL0 */ + SystemCoreClock = (RTC_CLK * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + } + } else { + switch (LPC_SC->CLKSRCSEL & 0x03) { + case 0: /* Int. RC oscillator => PLL0 */ + case 3: /* Reserved, default to Int. RC */ + SystemCoreClock = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + case 1: /* Main oscillator => PLL0 */ + SystemCoreClock = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + case 2: /* RTC oscillator => PLL0 */ + SystemCoreClock = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + } + } +} + +// detect 17x[4-8] (100MHz) or 17x9 (120MHz) +static int can_120MHz() { + #define IAP_LOCATION 0x1FFF1FF1 + uint32_t command[1]; + uint32_t result[5]; + typedef void (*IAP)(uint32_t*, uint32_t*); + IAP iap = (IAP) IAP_LOCATION; + + command[0] = 54; + iap(command, result); + + return result[1] & 0x00100000; +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ +#if (CLOCK_SETUP) /* Clock Setup */ + LPC_SC->SCS = SCS_Val; + if (LPC_SC->SCS & (1 << 5)) { /* If Main Oscillator is enabled */ + while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ + } + + /* Periphral clock must be selected before PLL0 enabling and connecting + * - according errata.lpc1768-16.March.2010 - + */ + LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ + LPC_SC->PCLKSEL1 = PCLKSEL1_Val; + + /* + * PLL0 MUST be 275 - 550MHz + * + * PLL0 = Fin * M * 2 / N + * + * Fcpu = PLL0 / D + * + * PLL0CFG = (M - 1) + ((N - 1) << 16) + * CCLKCFG = D - 1 + * + * Common combinations (assuming 12MHz crystal): + * + * | Fcpu |--| Fin | M | N | PLL0 | D | PLL0CFG | CCLKCFG | + * 96MHz :2* 12MHz * 12 / 1 = 288MHz / 3 0x0000B 0x2 + * 100MHz :2* 12MHz * 25 / 2 = 300MHz / 3 0x10018 0x2 + * 120MHz :2* 12MHz * 15 / 1 = 360MHz / 3 0x0000E 0x2 + * + */ + + LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0 */ + + LPC_SC->CCLKCFG = 0x00000002; /* Setup CPU Clock Divider */ + + if(can_120MHz()) { + LPC_SC->PLL0CFG = 0x0000000E; /* configure PLL0 */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + } else { + LPC_SC->PLL0CFG = 0x00010018; // 100MHz + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + } + + LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */ + + LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */ + + /* + * USBCLK = Fin * M, where M is (1..32) + * + * we need a USBCLK of 48MHz, so given a 12MHz crystal, M must be 4 + * + * PLL1 = USBCLK * 2 * P, where P is one of (1, 2, 4, 8) + * + * PLL1 MUST be 156 to 320MHz. + * P=2 gives 192MHz, the only valid value within range + * + * PLL1CFG = (log2(P) << 5) + (M - 1) + * = (1 << 5) + 3 + * = 0x23 for a 12MHz crystal + */ + LPC_SC->PLL1CFG = 0x00000023; + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + + LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */ + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */ + + LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */ + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */ + + // this sets up {global uint32 SystemCoreClock} with the new speed + SystemCoreClockUpdate(); + + LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */ + + LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ +#endif + +#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */ + LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; +#endif + +} + +/** + * @} + */ + +/** + * @} + */ diff --git a/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c b/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c new file mode 100644 index 0000000000..62e9b00016 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c @@ -0,0 +1,306 @@ +/********************************************************************** +* $Id$ debug_frmwrk.c 2010-05-21 +* +* @file debug_frmwrk.c +* @brief Contains some utilities that used for debugging through UART +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +#include "debug_frmwrk.h" +#include "lpc17xx_pinsel.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ + #include "lpc17xx_libcfg.h" +#else + #include "lpc17xx_libcfg_default.h" +#endif + +#ifdef _DBGFWK + +/* Debug framework */ +static Bool debug_frmwrk_initialized = FALSE; + +void (*_db_msg)(LPC_UART_TypeDef *UARTx, const void *s) = UARTPuts; +void (*_db_msg_)(LPC_UART_TypeDef *UARTx, const void *s) = UARTPuts_; +void (*_db_char)(LPC_UART_TypeDef *UARTx, uint8_t ch) = UARTPutChar; +void (*_db_dec)(LPC_UART_TypeDef *UARTx, uint8_t decn) = UARTPutHex; +void (*_db_dec_16)(LPC_UART_TypeDef *UARTx, uint16_t decn) = UARTPutHex16; +void (*_db_dec_32)(LPC_UART_TypeDef *UARTx, uint32_t decn) = UARTPutHex32; +void (*_db_hex)(LPC_UART_TypeDef *UARTx, uint8_t hexn) = UARTPutDec; +void (*_db_hex_16)(LPC_UART_TypeDef *UARTx, uint16_t hexn) = UARTPutDec16; +void (*_db_hex_32)(LPC_UART_TypeDef *UARTx, uint32_t hexn) = UARTPutDec32; +uint8_t (*_db_get_char)(LPC_UART_TypeDef *UARTx) = UARTGetChar; + + +/*********************************************************************//** + * @brief Puts a character to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] ch Character to put + * @return None + **********************************************************************/ +void UARTPutChar(LPC_UART_TypeDef *UARTx, uint8_t ch) { + if (debug_frmwrk_initialized) + UART_Send(UARTx, &ch, 1, BLOCKING); +} + +/*********************************************************************//** + * @brief Get a character to UART port + * @param[in] UARTx Pointer to UART peripheral + * @return character value that returned + **********************************************************************/ +uint8_t UARTGetChar(LPC_UART_TypeDef *UARTx) { + uint8_t tmp = 0; + + if (debug_frmwrk_initialized) + UART_Receive(UARTx, &tmp, 1, BLOCKING); + + return(tmp); +} + +/*********************************************************************//** + * @brief Puts a string to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] str string to put + * @return None + **********************************************************************/ +void UARTPuts(LPC_UART_TypeDef *UARTx, const void *str) { + if (!debug_frmwrk_initialized) return; + + uint8_t *s = (uint8_t*)str; + while (*s) UARTPutChar(UARTx, *s++); +} + +/*********************************************************************//** + * @brief Puts a string to UART port and print new line + * @param[in] UARTx Pointer to UART peripheral + * @param[in] str String to put + * @return None + **********************************************************************/ +void UARTPuts_(LPC_UART_TypeDef *UARTx, const void *str) { + if (!debug_frmwrk_initialized) return; + + UARTPuts (UARTx, str); + UARTPuts (UARTx, "\n\r"); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec(LPC_UART_TypeDef *UARTx, uint8_t decnum) { + if (!debug_frmwrk_initialized) return; + + uint8_t c1 = decnum%10; + uint8_t c2 = (decnum / 10) % 10; + uint8_t c3 = (decnum / 100) % 10; + UARTPutChar(UARTx, '0'+c3); + UARTPutChar(UARTx, '0'+c2); + UARTPutChar(UARTx, '0'+c1); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec16(LPC_UART_TypeDef *UARTx, uint16_t decnum) { + if (!debug_frmwrk_initialized) return; + + uint8_t c1 = decnum%10; + uint8_t c2 = (decnum / 10) % 10; + uint8_t c3 = (decnum / 100) % 10; + uint8_t c4 = (decnum / 1000) % 10; + uint8_t c5 = (decnum / 10000) % 10; + UARTPutChar(UARTx, '0'+c5); + UARTPutChar(UARTx, '0'+c4); + UARTPutChar(UARTx, '0'+c3); + UARTPutChar(UARTx, '0'+c2); + UARTPutChar(UARTx, '0'+c1); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec32(LPC_UART_TypeDef *UARTx, uint32_t decnum) { + if (!debug_frmwrk_initialized) return; + + const uint8_t c1 = decnum % 10, + c2 = (decnum / 10) % 10, + c3 = (decnum / 100) % 10, + c4 = (decnum / 1000) % 10, + c5 = (decnum / 10000) % 10, + c6 = (decnum / 100000) % 10, + c7 = (decnum / 1000000) % 10, + c8 = (decnum / 10000000) % 10, + c9 = (decnum / 100000000) % 10, + c10 = (decnum / 1000000000) % 10; + UARTPutChar(UARTx, '0' + c10); + UARTPutChar(UARTx, '0' + c9); + UARTPutChar(UARTx, '0' + c8); + UARTPutChar(UARTx, '0' + c7); + UARTPutChar(UARTx, '0' + c6); + UARTPutChar(UARTx, '0' + c5); + UARTPutChar(UARTx, '0' + c4); + UARTPutChar(UARTx, '0' + c3); + UARTPutChar(UARTx, '0' + c2); + UARTPutChar(UARTx, '0' + c1); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutHex(LPC_UART_TypeDef *UARTx, uint8_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 1; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (16-bit long) + * @return None + **********************************************************************/ +void UARTPutHex16(LPC_UART_TypeDef *UARTx, uint16_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 3; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (32-bit long) + * @return None + **********************************************************************/ +void UARTPutHex32(LPC_UART_TypeDef *UARTx, uint32_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 7; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief print function that supports format as same as printf() + * function of library + * @param[in] None + * @return None + **********************************************************************/ +//void _printf (const char *format, ...) { +// static char buffer[512 + 1]; +// va_list vArgs; +// char *tmp; +// va_start(vArgs, format); +// vsprintf((char *)buffer, (char const *)format, vArgs); +// va_end(vArgs); +// +// _DBG(buffer); +//} + +/*********************************************************************//** + * @brief Initialize Debug frame work through initializing UART port + * @param[in] None + * @return None + **********************************************************************/ +void debug_frmwrk_init(void) { + UART_CFG_Type UARTConfigStruct; + PINSEL_CFG_Type PinCfg; + + #if (USED_UART_DEBUG_PORT==0) + /* + * Initialize UART0 pin connect + */ + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 2; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 3; + PINSEL_ConfigPin(&PinCfg); + + #elif (USED_UART_DEBUG_PORT==1) + /* + * Initialize UART1 pin connect + */ + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 15; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 16; + PINSEL_ConfigPin(&PinCfg); + #endif + + /* Initialize UART Configuration parameter structure to default state: + * Baudrate = 9600bps + * 8 data bit + * 1 Stop bit + * None parity + */ + UART_ConfigStructInit(&UARTConfigStruct); + + // Re-configure baudrate to 115200bps + UARTConfigStruct.Baud_rate = 115200; + + // Initialize DEBUG_UART_PORT peripheral with given to corresponding parameter + UART_Init((LPC_UART_TypeDef *)DEBUG_UART_PORT, &UARTConfigStruct); + + // Enable UART Transmit + UART_TxCmd((LPC_UART_TypeDef *)DEBUG_UART_PORT, ENABLE); + + debug_frmwrk_initialized = TRUE; +} + +#endif // _DBGFWK diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c new file mode 100644 index 0000000000..2b6574c39a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c @@ -0,0 +1,358 @@ +/********************************************************************** +* $Id$ lpc17xx_adc.c 2010-06-18 +*//** +* @file lpc17xx_adc.c +* @brief Contains all functions support for ADC firmware library on LPC17xx +* @version 3.1 +* @date 26. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup ADC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_adc.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _ADC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup ADC_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial for ADC + * + Set bit PCADC + * + Set clock for ADC + * + Set Clock Frequency + * @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC + * @param[in] rate ADC conversion rate, should be <=200KHz + * @return None + **********************************************************************/ +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate) +{ + uint32_t ADCPClk, temp, tmp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_RATE(rate)); + + // Turn on power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, ENABLE); + + ADCx->ADCR = 0; + + //Enable PDN bit + tmp = ADC_CR_PDN; + // Set clock frequency + ADCPClk = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_ADC); + /* The APB clock (PCLK_ADC0) is divided by (CLKDIV+1) to produce the clock for + * A/D converter, which should be less than or equal to 13MHz. + * A fully conversion requires 65 of these clocks. + * ADC clock = PCLK_ADC0 / (CLKDIV + 1); + * ADC rate = ADC clock / 65; + */ + temp = rate * 65; + temp = (ADCPClk * 2 + temp)/(2 * temp) - 1; //get the round value by fomular: (2*A + B)/(2*B) + tmp |= ADC_CR_CLKDIV(temp); + + ADCx->ADCR = tmp; +} + + +/*********************************************************************//** +* @brief Close ADC +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @return None +**********************************************************************/ +void ADC_DeInit(LPC_ADC_TypeDef *ADCx) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + if (ADCx->ADCR & ADC_CR_START_MASK) //need to stop START bits before DeInit + ADCx->ADCR &= ~ADC_CR_START_MASK; + // Clear SEL bits + ADCx->ADCR &= ~0xFF; + // Clear PDN bit + ADCx->ADCR &= ~ADC_CR_PDN; + // Turn on power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, DISABLE); +} + + +/*********************************************************************//** +* @brief Get Result conversion from A/D data register +* @param[in] channel number which want to read back the result +* @return Result of conversion +*********************************************************************/ +uint32_t ADC_GetData(uint32_t channel) +{ + uint32_t adc_value; + + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + + adc_value = *(uint32_t *)((&LPC_ADC->ADDR0) + channel); + return ADC_GDR_RESULT(adc_value); +} + +/*********************************************************************//** +* @brief Set start mode for ADC +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] start_mode Start mode choose one of modes in +* 'ADC_START_OPT' enumeration type definition, should be: +* - ADC_START_CONTINUOUS +* - ADC_START_NOW +* - ADC_START_ON_EINT0 +* - ADC_START_ON_CAP01 +* - ADC_START_ON_MAT01 +* - ADC_START_ON_MAT03 +* - ADC_START_ON_MAT10 +* - ADC_START_ON_MAT11 +* @return None +*********************************************************************/ +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_START_OPT(start_mode)); + + ADCx->ADCR &= ~ADC_CR_START_MASK; + ADCx->ADCR |=ADC_CR_START_MODE_SEL((uint32_t)start_mode); +} + + +/*********************************************************************//** +* @brief ADC Burst mode setting +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] NewState +* - 1: Set Burst mode +* - 0: reset Burst mode +* @return None +**********************************************************************/ +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + ADCx->ADCR &= ~ADC_CR_BURST; + if (NewState){ + ADCx->ADCR |= ADC_CR_BURST; + } +} + +/*********************************************************************//** +* @brief Set AD conversion in power mode +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] NewState +* - 1: AD converter is optional +* - 0: AD Converter is in power down mode +* @return None +**********************************************************************/ +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + ADCx->ADCR &= ~ADC_CR_PDN; + if (NewState){ + ADCx->ADCR |= ADC_CR_PDN; + } +} + +/*********************************************************************//** +* @brief Set Edge start configuration +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] EdgeOption is ADC_START_ON_RISING and ADC_START_ON_FALLING +* 0:ADC_START_ON_RISING +* 1:ADC_START_ON_FALLING +* @return None +**********************************************************************/ +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_START_ON_EDGE_OPT(EdgeOption)); + + ADCx->ADCR &= ~ADC_CR_EDGE; + if (EdgeOption){ + ADCx->ADCR |= ADC_CR_EDGE; + } +} + +/*********************************************************************//** +* @brief ADC interrupt configuration +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] IntType: type of interrupt, should be: +* - ADC_ADINTEN0: Interrupt channel 0 +* - ADC_ADINTEN1: Interrupt channel 1 +* ... +* - ADC_ADINTEN7: Interrupt channel 7 +* - ADC_ADGINTEN: Individual channel/global flag done generate an interrupt +* @param[in] NewState: +* - SET : enable ADC interrupt +* - RESET: disable ADC interrupt +* @return None +**********************************************************************/ +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_TYPE_INT_OPT(IntType)); + + ADCx->ADINTEN &= ~ADC_INTEN_CH(IntType); + if (NewState){ + ADCx->ADINTEN |= ADC_INTEN_CH(IntType); + } +} + +/*********************************************************************//** +* @brief Enable/Disable ADC channel number +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] Channel channel number +* @param[in] NewState Enable or Disable +* +* @return None +**********************************************************************/ +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(Channel)); + + if (NewState == ENABLE) { + ADCx->ADCR |= ADC_CR_CH_SEL(Channel); + } else { + if (ADCx->ADCR & ADC_CR_START_MASK) //need to stop START bits before disable channel + ADCx->ADCR &= ~ADC_CR_START_MASK; + ADCx->ADCR &= ~ADC_CR_CH_SEL(Channel); + } +} + +/*********************************************************************//** +* @brief Get ADC result +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] channel: channel number, should be 0...7 +* @return Data conversion +**********************************************************************/ +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel) +{ + uint32_t adc_value; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + + adc_value = *(uint32_t *) ((&ADCx->ADDR0) + channel); + return ADC_DR_RESULT(adc_value); +} + +/*********************************************************************//** +* @brief Get ADC Chanel status from ADC data register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] channel: channel number, should be 0..7 +* @param[in] StatusType +* 0:Burst status +* 1:Done status +* @return SET / RESET +**********************************************************************/ +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType)); + + temp = *(uint32_t *) ((&ADCx->ADDR0) + channel); + if (StatusType) { + temp &= ADC_DR_DONE_FLAG; + }else{ + temp &= ADC_DR_OVERRUN_FLAG; + } + if (temp) { + return SET; + } else { + return RESET; + } + +} + +/*********************************************************************//** +* @brief Get ADC Data from AD Global register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @return Result of conversion +**********************************************************************/ +uint32_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + return ((uint32_t)(ADCx->ADGDR)); +} + +/*********************************************************************//** +* @brief Get ADC Chanel status from AD global data register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] StatusType +* 0:Burst status +* 1:Done status +* @return SET / RESET +**********************************************************************/ +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType)); + + temp = ADCx->ADGDR; + if (StatusType){ + temp &= ADC_DR_DONE_FLAG; + }else{ + temp &= ADC_DR_OVERRUN_FLAG; + } + if (temp){ + return SET; + }else{ + return RESET; + } +} + +/** + * @} + */ + +#endif /* _ADC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c new file mode 100644 index 0000000000..be8b767cfd --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c @@ -0,0 +1,1936 @@ +/********************************************************************** +* $Id$ lpc17xx_can.c 2011-03-09 +*//** +* @file lpc17xx_can.c +* @brief Contains all functions support for CAN firmware library on LPC17xx +* @version 3.3 +* @date 09. March. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup CAN + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_can.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _CAN + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup CAN_Private_Variables CAN Private Variables + * @{ + */ + +FunctionalState FULLCAN_ENABLE; + + +/* Counts number of filters (CAN message objects) used */ +uint16_t CANAF_FullCAN_cnt = 0; +uint16_t CANAF_std_cnt = 0; +uint16_t CANAF_gstd_cnt = 0; +uint16_t CANAF_ext_cnt = 0; +uint16_t CANAF_gext_cnt = 0; + +/* End of Private Variables ----------------------------------------------------*/ +/** + * @} + */ + +/* Private Variables ---------------------------------------------------------- */ +static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate); + +/*********************************************************************//** + * @brief Setting CAN baud rate (bps) + * @param[in] CANx point to LPC_CAN_TypeDef object, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] baudrate: is the baud rate value will be set + * @return None + ***********************************************************************/ +static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate) +{ + uint32_t result = 0; + uint8_t NT, TSEG1, TSEG2, BRFail; + uint32_t CANPclk = 0; + uint32_t BRP; + CHECK_PARAM(PARAM_CANx(CANx)); + + if (CANx == LPC_CAN1) + { + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN1); + } + else + { + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN2); + } + result = CANPclk / baudrate; + /* Calculate suitable nominal time value + * NT (nominal time) = (TSEG1 + TSEG2 + 3) + * NT <= 24 + * TSEG1 >= 2*TSEG2 + */ + BRFail = 1; + for(NT=24;NT>0;NT=NT-2) + { + if ((result%NT)==0) + { + BRP = result / NT - 1; + NT--; + TSEG2 = (NT/3) - 1; + TSEG1 = NT -(NT/3) - 1; + BRFail = 0; + break; + } + } + if(BRFail) + while(1); // Failed to calculate exact CAN baud rate + /* Enter reset mode */ + CANx->MOD = 0x01; + /* Set bit timing + * Default: SAM = 0x00; + * SJW = 0x03; + */ + CANx->BTR = (TSEG2<<20)|(TSEG1<<16)|(3<<14)|BRP; + /* Return to normal operating */ + CANx->MOD = 0; +} +/* End of Private Functions ----------------------------------------------------*/ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup CAN_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize CAN peripheral with given baudrate + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] baudrate: the value of CAN baudrate will be set (bps) + * @return None + *********************************************************************/ +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate) +{ + uint16_t i; + CHECK_PARAM(PARAM_CANx(CANx)); + + if(CANx == LPC_CAN1) + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, ENABLE); + /* Set clock divide for CAN1 */ + } + else + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, ENABLE); + /* Set clock divide for CAN2 */ + } + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN1, CLKPWR_PCLKSEL_CCLK_DIV_2); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN2, CLKPWR_PCLKSEL_CCLK_DIV_2); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_ACF, CLKPWR_PCLKSEL_CCLK_DIV_2); + + CANx->MOD = 1; // Enter Reset Mode + CANx->IER = 0; // Disable All CAN Interrupts + CANx->GSR = 0; + /* Request command to release Rx, Tx buffer and clear data overrun */ + //CANx->CMR = CAN_CMR_AT | CAN_CMR_RRB | CAN_CMR_CDO; + CANx->CMR = (1<<1)|(1<<2)|(1<<3); + /* Read to clear interrupt pending in interrupt capture register */ + i = CANx->ICR; + CANx->MOD = 0;// Return Normal operating + + //Reset CANAF value + LPC_CANAF->AFMR = 0x01; + + //clear ALUT RAM + for (i = 0; i < 512; i++) { + LPC_CANAF_RAM->mask[i] = 0x00; + } + + LPC_CANAF->SFF_sa = 0x00; + LPC_CANAF->SFF_GRP_sa = 0x00; + LPC_CANAF->EFF_sa = 0x00; + LPC_CANAF->EFF_GRP_sa = 0x00; + LPC_CANAF->ENDofTable = 0x00; + + LPC_CANAF->AFMR = 0x00; + /* Set baudrate */ + can_SetBaudrate (CANx, baudrate); +} + +/********************************************************************//** + * @brief CAN deInit + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @return None + *********************************************************************/ +void CAN_DeInit(LPC_CAN_TypeDef *CANx) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + + if(CANx == LPC_CAN1) + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, DISABLE); + } + else + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, DISABLE); + } +} + +/********************************************************************//** + * @brief Setup Acceptance Filter Look-Up Table + * @param[in] CANAFx pointer to LPC_CANAF_TypeDef + * Should be: LPC_CANAF + * @param[in] AFSection the pointer to AF_SectionDef structure + * It contain information about 5 sections will be install in AFLUT + * @return CAN Error could be: + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available + * - CAN_AF_ENTRY_ERROR: table error-violation of ascending numerical order + * - CAN_OK: ID is added into table successfully + *********************************************************************/ +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection) +{ + uint8_t ctrl1,ctrl2; + uint8_t dis1, dis2; + uint16_t SID, ID_temp,i, count = 0; + uint32_t EID, entry, buf; + uint16_t lowerSID, upperSID; + uint32_t lowerEID, upperEID; + + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CANAFx->AFMR = 0x01; + +/***** setup FullCAN Table *****/ + if(AFSection->FullCAN_Sec == NULL) + { + FULLCAN_ENABLE = DISABLE; + } + else + { + FULLCAN_ENABLE = ENABLE; + for(i=0;i<(AFSection->FC_NumEntry);i++) + { + if(count + 1 > 64) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->FullCAN_Sec->controller; + SID = AFSection->FullCAN_Sec->id_11; + dis1 = AFSection->FullCAN_Sec->disable; + + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_ID_11(SID)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + entry = 0x00; //reset entry value + if((CANAF_FullCAN_cnt & 0x00000001)==0) + { + if(count!=0x00) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = (buf & 0xE7FF); //mask controller & identifier bits + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16)|(1<<27); + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; + LPC_CANAF_RAM->mask[count] |= entry; + CANAF_FullCAN_cnt++; + if(CANAF_FullCAN_cnt == AFSection->FC_NumEntry) //this is the lastest FullCAN entry + count++; + } + else + { + buf = LPC_CANAF_RAM->mask[count]; + ID_temp = (buf >>16) & 0xE7FF; + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0)|(1<<11); + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; + LPC_CANAF_RAM->mask[count]|= entry; + count++; + CANAF_FullCAN_cnt++; + } + AFSection->FullCAN_Sec = (FullCAN_Entry *)((uint32_t)(AFSection->FullCAN_Sec)+ sizeof(FullCAN_Entry)); + } + } + +/***** Setup Explicit Standard Frame Format Section *****/ + if(AFSection->SFF_Sec != NULL) + { + for(i=0;i<(AFSection->SFF_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->SFF_Sec->controller; + SID = AFSection->SFF_Sec->id_11; + dis1 = AFSection->SFF_Sec->disable; + + //check parameter + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_ID_11(SID)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + + entry = 0x00; //reset entry value + if((CANAF_std_cnt & 0x00000001)==0) + { + if(CANAF_std_cnt !=0 ) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = (buf & 0xE7FF); //mask controller & identifier bits + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16); + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; + LPC_CANAF_RAM->mask[count] |= entry; + CANAF_std_cnt++; + if(CANAF_std_cnt == AFSection->SFF_NumEntry)//if this is the last SFF entry + count++; + } + else + { + buf = LPC_CANAF_RAM->mask[count]; + ID_temp = (buf >>16) & 0xE7FF; + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0); + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; + LPC_CANAF_RAM->mask[count] |= entry; + count++; + CANAF_std_cnt++; + } + AFSection->SFF_Sec = (SFF_Entry *)((uint32_t)(AFSection->SFF_Sec)+ sizeof(SFF_Entry)); + } + } + +/***** Setup Group of Standard Frame Format Identifier Section *****/ + if(AFSection->SFF_GPR_Sec != NULL) + { + for(i=0;i<(AFSection->SFF_GPR_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->SFF_GPR_Sec->controller1; + ctrl2 = AFSection->SFF_GPR_Sec->controller2; + dis1 = AFSection->SFF_GPR_Sec->disable1; + dis2 = AFSection->SFF_GPR_Sec->disable2; + lowerSID = AFSection->SFF_GPR_Sec->lowerID; + upperSID = AFSection->SFF_GPR_Sec->upperID; + + /* check parameter */ + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_CTRL(ctrl2)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis2)); + CHECK_PARAM(PARAM_ID_11(lowerSID)); + CHECK_PARAM(PARAM_ID_11(upperSID)); + + entry = 0x00; + if(CANAF_gstd_cnt!=0) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = buf & 0xE7FF; + if((ctrl1 != ctrl2)||(lowerSID > upperSID)||(ID_temp > ((ctrl1<<13)|lowerSID))) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1 << 29)|(dis1 << 28)|(lowerSID << 16)| \ + (ctrl2 << 13)|(dis2 << 12)|(upperSID << 0); + LPC_CANAF_RAM->mask[count] = entry; + CANAF_gstd_cnt++; + count++; + AFSection->SFF_GPR_Sec = (SFF_GPR_Entry *)((uint32_t)(AFSection->SFF_GPR_Sec)+ sizeof(SFF_GPR_Entry)); + } + } + +/***** Setup Explicit Extend Frame Format Identifier Section *****/ + if(AFSection->EFF_Sec != NULL) + { + for(i=0;i<(AFSection->EFF_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + EID = AFSection->EFF_Sec->ID_29; + ctrl1 = AFSection->EFF_Sec->controller; + + // check parameter + CHECK_PARAM(PARAM_ID_29(EID)); + CHECK_PARAM(PARAM_CTRL(ctrl1)); + + entry = (ctrl1 << 29)|(EID << 0); + if(CANAF_ext_cnt != 0) + { + buf = LPC_CANAF_RAM->mask[count-1]; +// EID_temp = buf & 0x0FFFFFFF; + if(buf > entry) + { + return CAN_AF_ENTRY_ERROR; + } + } + LPC_CANAF_RAM->mask[count] = entry; + CANAF_ext_cnt ++; + count++; + AFSection->EFF_Sec = (EFF_Entry *)((uint32_t)(AFSection->EFF_Sec)+ sizeof(EFF_Entry)); + } + } + +/***** Setup Group of Extended Frame Format Identifier Section *****/ + if(AFSection->EFF_GPR_Sec != NULL) + { + for(i=0;i<(AFSection->EFF_GPR_NumEntry);i++) + { + if(count + 2 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->EFF_GPR_Sec->controller1; + ctrl2 = AFSection->EFF_GPR_Sec->controller2; + lowerEID = AFSection->EFF_GPR_Sec->lowerEID; + upperEID = AFSection->EFF_GPR_Sec->upperEID; + + //check parameter + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_CTRL(ctrl2)); + CHECK_PARAM(PARAM_ID_29(lowerEID)); + CHECK_PARAM(PARAM_ID_29(upperEID)); + + entry = 0x00; + if(CANAF_gext_cnt != 0) + { + buf = LPC_CANAF_RAM->mask[count-1]; +// EID_temp = buf & 0x0FFFFFFF; + if((ctrl1 != ctrl2) || (lowerEID > upperEID) || (buf > ((ctrl1 << 29)|(lowerEID << 0)))) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1 << 29)|(lowerEID << 0); + LPC_CANAF_RAM->mask[count++] = entry; + entry = (ctrl2 << 29)|(upperEID << 0); + LPC_CANAF_RAM->mask[count++] = entry; + CANAF_gext_cnt++; + AFSection->EFF_GPR_Sec = (EFF_GPR_Entry *)((uint32_t)(AFSection->EFF_GPR_Sec)+ sizeof(EFF_GPR_Entry)); + } + } + //update address values + LPC_CANAF->SFF_sa = ((CANAF_FullCAN_cnt + 1)>>1)<<2; + LPC_CANAF->SFF_GRP_sa = LPC_CANAF->SFF_sa + (((CANAF_std_cnt+1)>>1)<< 2); + LPC_CANAF->EFF_sa = LPC_CANAF->SFF_GRP_sa + (CANAF_gstd_cnt << 2); + LPC_CANAF->EFF_GRP_sa = LPC_CANAF->EFF_sa + (CANAF_ext_cnt << 2); + LPC_CANAF->ENDofTable = LPC_CANAF->EFF_GRP_sa + (CANAF_gext_cnt << 3); + + if(FULLCAN_ENABLE == DISABLE) + { + LPC_CANAF->AFMR = 0x00; // Normal mode + } + else + { + LPC_CANAF->AFMR = 0x04; + } + return CAN_OK; +} +/********************************************************************//** + * @brief Add Explicit ID into AF Look-Up Table dynamically. + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] id: The ID of entry will be added + * @param[in] format: is the type of ID Frame Format, should be: + * - STD_ID_FORMAT: 11-bit ID value + * - EXT_ID_FORMAT: 29-bit ID value + * @return CAN Error, could be: + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available + * - CAN_ID_EXIT_ERROR: ID exited in table + * - CAN_OK: ID is added into table successfully + *********************************************************************/ +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t id, CAN_ID_FORMAT_Type format) +{ + uint32_t tmp0 = 0; + uint32_t buf0=0, buf1=0; + int16_t cnt1=0, cnt2=0, bound1=0, total=0; + + + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(format)); + + if (CANx == LPC_CAN1) + { + tmp0 = 0; + } + else if (CANx == LPC_CAN2) + { + tmp0 = 1; + } + + /* Acceptance Filter Memory full - return */ + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + if (total >= 512){ //don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + +/*********** Add Explicit Standard Identifier Frame Format entry *********/ + if(format == STD_ID_FORMAT) + { + id &= 0x07FF; + id |= (tmp0 << 13); /* Add controller number */ + /* Move all remaining sections one place up + if new entry will increase FullCAN list */ + if ((CANAF_std_cnt & 0x0001) == 0) + { + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); + bound1 = total - cnt1; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + while(bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + if (CANAF_std_cnt == 0) + { + cnt2 = (CANAF_FullCAN_cnt + 1)>>1; + /* For entering first ID */ + LPC_CANAF_RAM->mask[cnt2] = 0x0000FFFF | (id << 16); + } + else if (CANAF_std_cnt == 1) + { + cnt2 = (CANAF_FullCAN_cnt + 1)>>1; + /* For entering second ID */ + if (((LPC_CANAF_RAM->mask[cnt2] >> 16)& 0xE7FF) > id) + { + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] >> 16) | (id << 16); + } + else + { + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] & 0xFFFF0000) | id; + } + } + else + { + /* Find where to insert new ID */ + cnt1 = (CANAF_FullCAN_cnt+1)>>1; + cnt2 = CANAF_std_cnt; + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); + while (cnt1 < bound1) + { + /* Loop through standard existing IDs */ + if (((LPC_CANAF_RAM->mask[cnt1] >> 16) & 0xE7FF) > id) + { + cnt2 = cnt1 * 2; + break; + } + + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000E7FF) > id) + { + cnt2 = cnt1 * 2 + 1; + break; + } + + cnt1++; + } + /* cnt1 = U32 where to insert new ID */ + /* cnt2 = U16 where to insert new ID */ + + if (cnt1 == bound1) + { + /* Adding ID as last entry */ + /* Even number of IDs exists */ + if ((CANAF_std_cnt & 0x0001) == 0) + { + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); + } + /* Odd number of IDs exists */ + else + { + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; + } + } + else + { + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + if ((cnt2 & 0x0001) == 0) + { + /* Insert new mask to even address*/ + buf1 = (id << 16) | (buf0 >> 16); + } + else + { + /* Insert new mask to odd address */ + buf1 = (buf0 & 0xFFFF0000) | id; + } + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1)-1; + /* Move all remaining standard mask entries one place up */ + while (cnt1 < bound1) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + } + + if ((CANAF_std_cnt & 0x0001) == 0) + { + /* Even number of IDs exists */ + LPC_CANAF_RAM->mask[cnt1+1] = (buf0 <<16) |(0x0000FFFF); + } + } + } + CANAF_std_cnt++; + //update address values + LPC_CANAF->SFF_GRP_sa +=0x04 ; + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + } + +/*********** Add Explicit Extended Identifier Frame Format entry *********/ + else + { + /* Add controller number */ + id |= (tmp0) << 29; + + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+(((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt); + cnt2 = 0; + while (cnt2 < CANAF_ext_cnt) + { + /* Loop through extended existing masks*/ + if (LPC_CANAF_RAM->mask[cnt1] > id) + { + break; + } + cnt1++;/* cnt1 = U32 where to insert new mask */ + cnt2++; + } + + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + LPC_CANAF_RAM->mask[cnt1] = id; /* Insert mask */ + + CANAF_ext_cnt++; + + bound1 = total; + /* Move all remaining extended mask entries one place up*/ + while (cnt2 < bound1) + { + cnt1++; + cnt2++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + /* update address values */ + LPC_CANAF->EFF_GRP_sa += 4; + LPC_CANAF->ENDofTable += 4; + } + if(CANAF_FullCAN_cnt == 0) //not use FullCAN mode + { + LPC_CANAF->AFMR = 0x00;//not use FullCAN mode + } + else + { + LPC_CANAF->AFMR = 0x04; + } + + return CAN_OK; +} + +/********************************************************************//** + * @brief Load FullCAN entry into AFLUT + * @param[in] CANx: CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] id: identifier of entry that will be added + * @return CAN_ERROR, could be: + * - CAN_OK: loading is successful + * - CAN_ID_EXIT_ERROR: ID exited in FullCAN Section + * - CAN_OBJECTS_FULL_ERROR: no more space available + *********************************************************************/ +CAN_ERROR CAN_LoadFullCANEntry (LPC_CAN_TypeDef* CANx, uint16_t id) +{ + uint32_t ctrl0 = 0; + uint32_t buf0=0, buf1=0, buf2=0; + uint32_t tmp0=0, tmp1=0, tmp2=0; + int16_t cnt1=0, cnt2=0, bound1=0, total=0; + + CHECK_PARAM(PARAM_CANx(CANx)); + + if (CANx == LPC_CAN1) + { + ctrl0 = 0; + } + else if (CANx == LPC_CAN2) + { + ctrl0 = 1; + } + + /* Acceptance Filter Memory full - return */ + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + //don't have enough space for this fullCAN Entry and its Object(3*32 bytes) + if ((total >=508)||(CANAF_FullCAN_cnt>=64)){ + return CAN_OBJECTS_FULL_ERROR; + } + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + + /* Add mask for standard identifiers */ + id &= 0x07FF; + id |= (ctrl0 << 13) | (1 << 11); /* Add controller number */ +// total = ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + /* Move all remaining sections one place up + if new entry will increase FullCAN list */ + if (((CANAF_FullCAN_cnt & 0x0001) == 0)&&(total!=0)) + { + //then remove remaining section + cnt1 = (CANAF_FullCAN_cnt >> 1); + bound1 = total; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + + while (bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + if (CANAF_FullCAN_cnt == 0) + { + /* For entering first ID */ + LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16); + } + else if (CANAF_FullCAN_cnt == 1) + { + /* For entering second ID */ + if (((LPC_CANAF_RAM->mask[0] >> 16)& 0xE7FF) > id) + { + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16); + } + else + { + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id; + } + } + else + { + /* Find where to insert new ID */ + cnt1 = 0; + cnt2 = CANAF_FullCAN_cnt; + bound1 = (CANAF_FullCAN_cnt - 1) >> 1; + while (cnt1 <= bound1) + { + /* Loop through standard existing IDs */ + if (((LPC_CANAF_RAM->mask[cnt1] >> 16) & 0xE7FF) > (id & 0xE7FF)) + { + cnt2 = cnt1 * 2; + break; + } + + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000E7FF) > (id & 0xE7FF)) + { + cnt2 = cnt1 * 2 + 1; + break; + } + + cnt1++; + } + /* cnt1 = U32 where to insert new ID */ + /* cnt2 = U16 where to insert new ID */ + + if (cnt1 > bound1) + { + /* Adding ID as last entry */ + /* Even number of IDs exists */ + if ((CANAF_FullCAN_cnt & 0x0001) == 0) + { + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); + } + /* Odd number of IDs exists */ + else + { + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; + } + } + else + { + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + if ((cnt2 & 0x0001) == 0) + { + /* Insert new mask to even address*/ + buf1 = (id << 16) | (buf0 >> 16); + } + else + { + /* Insert new mask to odd address */ + buf1 = (buf0 & 0xFFFF0000) | id; + } + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ + bound1 = CANAF_FullCAN_cnt >> 1; + /* Move all remaining standard mask entries one place up */ + while (cnt1 < bound1) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + } + + if ((CANAF_FullCAN_cnt & 0x0001) == 0) + { + /* Even number of IDs exists */ + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) + | (0x0000FFFF); + } + } + } + //restruct FulCAN Object Section + bound1 = CANAF_FullCAN_cnt - cnt2; + cnt1 = total - (CANAF_FullCAN_cnt)*3 + cnt2*3 + 1; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + buf2 = LPC_CANAF_RAM->mask[cnt1+2]; + LPC_CANAF_RAM->mask[cnt1]=LPC_CANAF_RAM->mask[cnt1+1]= LPC_CANAF_RAM->mask[cnt1+2]=0x00; + cnt1+=3; + while(bound1--) + { + tmp0 = LPC_CANAF_RAM->mask[cnt1]; + tmp1 = LPC_CANAF_RAM->mask[cnt1+1]; + tmp2 = LPC_CANAF_RAM->mask[cnt1+2]; + LPC_CANAF_RAM->mask[cnt1]= buf0; + LPC_CANAF_RAM->mask[cnt1+1]= buf1; + LPC_CANAF_RAM->mask[cnt1+2]= buf2; + buf0 = tmp0; + buf1 = tmp1; + buf2 = tmp2; + cnt1+=3; + } + CANAF_FullCAN_cnt++; + //update address values + LPC_CANAF->SFF_sa +=0x04; + LPC_CANAF->SFF_GRP_sa +=0x04 ; + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Load Group entry into AFLUT + * @param[in] CANx: CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] lowerID, upperID: lower and upper identifier of entry + * @param[in] format: type of ID format, should be: + * - STD_ID_FORMAT: Standard ID format (11-bit value) + * - EXT_ID_FORMAT: Extended ID format (29-bit value) + * @return CAN_ERROR, could be: + * - CAN_OK: loading is successful + * - CAN_CONFLICT_ID_ERROR: Conflict ID occurs + * - CAN_OBJECTS_FULL_ERROR: no more space available + *********************************************************************/ +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, \ + uint32_t upperID, CAN_ID_FORMAT_Type format) +{ + uint16_t tmp = 0; + uint32_t buf0, buf1, entry1, entry2, LID,UID; + int16_t cnt1, bound1, total; + //LPC_CANAF_RAM_TypeDef *AFLUTTest = LPC_CANAF_RAM; + + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(format)); + + if(lowerID > upperID) return CAN_CONFLICT_ID_ERROR; + if(CANx == LPC_CAN1) + { + tmp = 0; + } + else + { + tmp = 1; + } + + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + +/*********Add Group of Standard Identifier Frame Format************/ + if(format == STD_ID_FORMAT) + { + if ((total >= 512)){//don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + lowerID &=0x7FF; //mask ID + upperID &=0x7FF; + entry1 = (tmp << 29)|(lowerID << 16)|(tmp << 13)|(upperID << 0); + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1); + + //if this is the first Group standard ID entry + if(CANAF_gstd_cnt == 0) + { + LPC_CANAF_RAM->mask[cnt1] = entry1; + } + else + { + //find the position to add new Group entry + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt; + while(cnt1 < bound1) + { + //compare controller first + while((LPC_CANAF_RAM->mask[cnt1] >> 29)< (entry1 >> 29))//increase until meet greater or equal controller + cnt1++; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + if((LPC_CANAF_RAM->mask[cnt1] >> 29)> (entry1 >> 29)) //meet greater controller + { + //add at this position + LPC_CANAF_RAM->mask[cnt1] = entry1; + break; + } + else //meet equal controller + { + LID = (buf0 >> 16)&0x7FF; + UID = buf0 & 0x7FF; + if (upperID <= LID) + { + //add new entry before this entry + LPC_CANAF_RAM->mask[cnt1] = entry1; + break; + } + else if (lowerID >= UID) + { + //load next entry to compare + cnt1 ++; + } + else + return CAN_CONFLICT_ID_ERROR; + } + } + if(cnt1 >= bound1) + { + //add new entry at the last position in this list + buf0 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = entry1; + } + + //remove all remaining entry of this section one place up + bound1 = total - cnt1; + while(bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + CANAF_gstd_cnt++; + //update address values + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + } + + +/*********Add Group of Extended Identifier Frame Format************/ + else + { + if ((total >= 511)){//don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + lowerID &= 0x1FFFFFFF; //mask ID + upperID &= 0x1FFFFFFF; + entry1 = (tmp << 29)|(lowerID << 0); + entry2 = (tmp << 29)|(upperID << 0); + + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt + CANAF_ext_cnt; + //if this is the first Group standard ID entry + if(CANAF_gext_cnt == 0) + { + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[cnt1+1] = entry2; + } + else + { + //find the position to add new Group entry + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt \ + + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + while(cnt1 < bound1) + { + while((LPC_CANAF_RAM->mask[cnt1] >>29)< tmp) //increase until meet greater or equal controller + cnt1++; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + if((LPC_CANAF_RAM->mask[cnt1] >> 29)> (entry1 >> 29)) //meet greater controller + { + //add at this position + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + break; + } + else //meet equal controller + { + LID = buf0 & 0x1FFFFFFF; //mask ID + UID = buf1 & 0x1FFFFFFF; + if (upperID <= LID) + { + //add new entry before this entry + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + break; + } + else if (lowerID >= UID) + { + //load next entry to compare + cnt1 +=2; + } + else + return CAN_CONFLICT_ID_ERROR; + } + } + if(cnt1 >= bound1) + { + //add new entry at the last position in this list + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + } + //remove all remaining entry of this section two place up + bound1 = total - cnt1 + 1; + cnt1++; + while(bound1>0) + { + entry1 = LPC_CANAF_RAM->mask[cnt1]; + entry2 = LPC_CANAF_RAM->mask[cnt1+1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + LPC_CANAF_RAM->mask[cnt1+1] = buf1; + buf0 = entry1; + buf1 = entry2; + cnt1 +=2; + bound1 -=2; + } + } + CANAF_gext_cnt++; + //update address values + LPC_CANAF->ENDofTable +=0x08; + } + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Remove AFLUT entry (FullCAN entry and Explicit Standard entry) + * @param[in] EntryType: the type of entry that want to remove, should be: + * - FULLCAN_ENTRY + * - EXPLICIT_STANDARD_ENTRY + * - GROUP_STANDARD_ENTRY + * - EXPLICIT_EXTEND_ENTRY + * - GROUP_EXTEND_ENTRY + * @param[in] position: the position of this entry in its section + * Note: the first position is 0 + * @return CAN_ERROR, could be: + * - CAN_OK: removing is successful + * - CAN_ENTRY_NOT_EXIT_ERROR: entry want to remove is not exit + *********************************************************************/ +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position) +{ + uint16_t cnt, bound, total; + uint32_t buf0, buf1; + CHECK_PARAM(PARAM_AFLUT_ENTRY_TYPE(EntryType)); + CHECK_PARAM(PARAM_POSITION(position)); + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + total = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt + 1) >> 1) + \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + + +/************** Remove FullCAN Entry *************/ + if(EntryType == FULLCAN_ENTRY) + { + if((CANAF_FullCAN_cnt==0)||(position >= CANAF_FullCAN_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = position >> 1; + buf0 = LPC_CANAF_RAM->mask[cnt]; + bound = (CANAF_FullCAN_cnt - position -1)>>1; + if((position & 0x0001) == 0) //event position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + cnt++; + } + } + else //odd position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; + buf0 = buf1<<16; + cnt++; + } + } + if((CANAF_FullCAN_cnt & 0x0001) == 0) + { + if((position & 0x0001)==0) + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); + else + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; + } + else + { + //remove all remaining section one place down + cnt = (CANAF_FullCAN_cnt + 1)>>1; + bound = total + CANAF_FullCAN_cnt * 3; + while(bound>cnt) + { + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + //update address values + LPC_CANAF->SFF_sa -=0x04; + LPC_CANAF->SFF_GRP_sa -=0x04 ; + LPC_CANAF->EFF_sa -=0x04 ; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + CANAF_FullCAN_cnt--; + + //delete its FullCAN Object in the FullCAN Object section + //remove all remaining FullCAN Object three place down + cnt = total + position * 3; + bound = (CANAF_FullCAN_cnt - position + 1) * 3; + + while(bound) + { + LPC_CANAF_RAM->mask[cnt]=LPC_CANAF_RAM->mask[cnt+3];; + LPC_CANAF_RAM->mask[cnt+1]=LPC_CANAF_RAM->mask[cnt+4]; + LPC_CANAF_RAM->mask[cnt+2]=LPC_CANAF_RAM->mask[cnt+5]; + bound -=3; + cnt +=3; + } + } + } + +/************** Remove Explicit Standard ID Entry *************/ + else if(EntryType == EXPLICIT_STANDARD_ENTRY) + { + if((CANAF_std_cnt==0)||(position >= CANAF_std_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt+1)>>1)+ (position >> 1); + buf0 = LPC_CANAF_RAM->mask[cnt]; + bound = (CANAF_std_cnt - position - 1)>>1; + if((position & 0x0001) == 0) //event position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + cnt++; + } + } + else //odd position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; + buf0 = buf1<<16; + cnt++; + } + } + if((CANAF_std_cnt & 0x0001) == 0) + { + if((position & 0x0001)==0) + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); + else + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; + } + else + { + //remove all remaining section one place down + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1); + bound = total + CANAF_FullCAN_cnt * 3; + while(bound>cnt) + { + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + //update address value + LPC_CANAF->SFF_GRP_sa -=0x04 ; + LPC_CANAF->EFF_sa -=0x04 ; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + CANAF_std_cnt--; + } + } + +/************** Remove Group of Standard ID Entry *************/ + else if(EntryType == GROUP_STANDARD_ENTRY) + { + if((CANAF_gstd_cnt==0)||(position >= CANAF_gstd_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ position + 1; + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + } + CANAF_gstd_cnt--; + //update address value + LPC_CANAF->EFF_sa -=0x04; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + +/************** Remove Explicit Extended ID Entry *************/ + else if(EntryType == EXPLICIT_EXTEND_ENTRY) + { + if((CANAF_ext_cnt==0)||(position >= CANAF_ext_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + position + 1; + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + } + CANAF_ext_cnt--; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + +/************** Remove Group of Extended ID Entry *************/ + else + { + if((CANAF_gext_cnt==0)||(position >= CANAF_gext_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = total - (CANAF_gext_cnt<<1) + (position<<1); + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt] = LPC_CANAF_RAM->mask[cnt+2]; + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+3]; + cnt+=2; + } + } + CANAF_gext_cnt--; + LPC_CANAF->ENDofTable -=0x08; + } + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Send message data + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CAN_Msg point to the CAN_MSG_Type Structure, it contains message + * information such as: ID, DLC, RTR, ID Format + * @return Status: + * - SUCCESS: send message successfully + * - ERROR: send message unsuccessfully + *********************************************************************/ +Status CAN_SendMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t data; + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(CAN_Msg->format)); + if(CAN_Msg->format==STD_ID_FORMAT) + { + CHECK_PARAM(PARAM_ID_11(CAN_Msg->id)); + } + else + { + CHECK_PARAM(PARAM_ID_29(CAN_Msg->id)); + } + CHECK_PARAM(PARAM_DLC(CAN_Msg->len)); + CHECK_PARAM(PARAM_FRAME_TYPE(CAN_Msg->type)); + + //Check status of Transmit Buffer 1 + if (CANx->SR & (1<<2)) + { + /* Transmit Channel 1 is available */ + /* Write frame informations and frame data into its CANxTFI1, + * CANxTID1, CANxTDA1, CANxTDB1 register */ + CANx->TFI1 &= ~0x000F0000; + CANx->TFI1 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI1 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI1 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI1 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI1 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID1 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA1 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB1 = data; + + /*Write transmission request*/ + CANx->CMR = 0x21; + return SUCCESS; + } + //check status of Transmit Buffer 2 + else if(CANx->SR & (1<<10)) + { + /* Transmit Channel 2 is available */ + /* Write frame informations and frame data into its CANxTFI2, + * CANxTID2, CANxTDA2, CANxTDB2 register */ + CANx->TFI2 &= ~0x000F0000; + CANx->TFI2 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI2 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI2 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI2 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI2 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID2 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA2 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB2 = data; + + /*Write transmission request*/ + CANx->CMR = 0x41; + return SUCCESS; + } + //check status of Transmit Buffer 3 + else if (CANx->SR & (1<<18)) + { + /* Transmit Channel 3 is available */ + /* Write frame informations and frame data into its CANxTFI3, + * CANxTID3, CANxTDA3, CANxTDB3 register */ + CANx->TFI3 &= ~0x000F0000; + CANx->TFI3 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI3 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI3 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI3 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI3 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID3 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA3 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB3 = data; + + /*Write transmission request*/ + CANx->CMR = 0x81; + return SUCCESS; + } + else + { + return ERROR; + } +} + +/********************************************************************//** + * @brief Receive message data + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received + * message information such as: ID, DLC, RTR, ID Format + * @return Status: + * - SUCCESS: receive message successfully + * - ERROR: receive message unsuccessfully + *********************************************************************/ +Status CAN_ReceiveMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t data; + + CHECK_PARAM(PARAM_CANx(CANx)); + + //check status of Receive Buffer + if((CANx->SR &0x00000001)) + { + /* Receive message is available */ + /* Read frame informations */ + CAN_Msg->format = (uint8_t)(((CANx->RFS) & 0x80000000)>>31); + CAN_Msg->type = (uint8_t)(((CANx->RFS) & 0x40000000)>>30); + CAN_Msg->len = (uint8_t)(((CANx->RFS) & 0x000F0000)>>16); + + + /* Read CAN message identifier */ + CAN_Msg->id = CANx->RID; + + /* Read the data if received message was DATA FRAME */ + if (CAN_Msg->type == DATA_FRAME) + { + /* Read first 4 data bytes */ + data = CANx->RDA; + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8;; + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; + + /* Read second 4 data bytes */ + data = CANx->RDB; + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; + + /*release receive buffer*/ + CANx->CMR = 0x04; + } + else + { + /* Received Frame is a Remote Frame, not have data, we just receive + * message information only */ + CANx->CMR = 0x04; /*release receive buffer*/ + return SUCCESS; + } + } + else + { + // no receive message available + return ERROR; + } + return SUCCESS; +} + +/********************************************************************//** + * @brief Receive FullCAN Object + * @param[in] CANAFx: CAN Acceptance Filter register, should be: LPC_CANAF + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received + * message information such as: ID, DLC, RTR, ID Format + * @return CAN_ERROR, could be: + * - CAN_FULL_OBJ_NOT_RCV: FullCAN Object is not be received + * - CAN_OK: Received FullCAN Object successful + * + *********************************************************************/ +CAN_ERROR FCAN_ReadObj (LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t *pSrc, data; + uint32_t interrut_word, msg_idx, test_bit, head_idx, tail_idx; + + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + + interrut_word = 0; + + if (LPC_CANAF->FCANIC0 != 0) + { + interrut_word = LPC_CANAF->FCANIC0; + head_idx = 0; + tail_idx = 31; + } + else if (LPC_CANAF->FCANIC1 != 0) + { + interrut_word = LPC_CANAF->FCANIC1; + head_idx = 32; + tail_idx = 63; + } + + if (interrut_word != 0) + { + /* Detect for interrupt pending */ + msg_idx = 0; + for (msg_idx = head_idx; msg_idx <= tail_idx; msg_idx++) + { + test_bit = interrut_word & 0x1; + interrut_word = interrut_word >> 1; + + if (test_bit) + { + pSrc = (uint32_t *) (LPC_CANAF->ENDofTable + LPC_CANAF_RAM_BASE + msg_idx * 12); + + /* Has been finished updating the content */ + if ((*pSrc & 0x03000000L) == 0x03000000L) + { + /*clear semaphore*/ + *pSrc &= 0xFCFFFFFF; + + /*Set to DatA*/ + pSrc++; + /* Copy to dest buf */ + data = *pSrc; + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; + + /*Set to DatB*/ + pSrc++; + /* Copy to dest buf */ + data = *pSrc; + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; + /*Back to Dat1*/ + pSrc -= 2; + + CAN_Msg->id = *pSrc & 0x7FF; + CAN_Msg->len = (uint8_t) (*pSrc >> 16) & 0x0F; + CAN_Msg->format = 0; //FullCAN Object ID always is 11-bit value + CAN_Msg->type = (uint8_t)(*pSrc >> 30) &0x01; + /*Re-read semaphore*/ + if ((*pSrc & 0x03000000L) == 0) + { + return CAN_OK; + } + } + } + } + } + return CAN_FULL_OBJ_NOT_RCV; +} +/********************************************************************//** + * @brief Get CAN Control Status + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] arg: type of CAN status to get from CAN status register + * Should be: + * - CANCTRL_GLOBAL_STS: CAN Global Status + * - CANCTRL_INT_CAP: CAN Interrupt and Capture + * - CANCTRL_ERR_WRN: CAN Error Warning Limit + * - CANCTRL_STS: CAN Control Status + * @return Current Control Status that you want to get value + *********************************************************************/ +uint32_t CAN_GetCTRLStatus (LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_CTRL_STS_TYPE(arg)); + + switch (arg) + { + case CANCTRL_GLOBAL_STS: + return CANx->GSR; + + case CANCTRL_INT_CAP: + return CANx->ICR; + + case CANCTRL_ERR_WRN: + return CANx->EWL; + + default: // CANCTRL_STS + return CANx->SR; + } +} +/********************************************************************//** + * @brief Get CAN Central Status + * @param[in] CANCRx point to LPC_CANCR_TypeDef, should be: LPC_CANCR + * @param[in] arg: type of CAN status to get from CAN Central status register + * Should be: + * - CANCR_TX_STS: Central CAN Tx Status + * - CANCR_RX_STS: Central CAN Rx Status + * - CANCR_MS: Central CAN Miscellaneous Status + * @return Current Central Status that you want to get value + *********************************************************************/ +uint32_t CAN_GetCRStatus (LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg) +{ + CHECK_PARAM(PARAM_CANCRx(CANCRx)); + CHECK_PARAM(PARAM_CR_STS_TYPE(arg)); + + switch (arg) + { + case CANCR_TX_STS: + return CANCRx->CANTxSR; + + case CANCR_RX_STS: + return CANCRx->CANRxSR; + + default: // CANCR_MS + return CANCRx->CANMSR; + } +} +/********************************************************************//** + * @brief Enable/Disable CAN Interrupt + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] arg: type of CAN interrupt that you want to enable/disable + * Should be: + * - CANINT_RIE: CAN Receiver Interrupt Enable + * - CANINT_TIE1: CAN Transmit Interrupt Enable + * - CANINT_EIE: CAN Error Warning Interrupt Enable + * - CANINT_DOIE: CAN Data Overrun Interrupt Enable + * - CANINT_WUIE: CAN Wake-Up Interrupt Enable + * - CANINT_EPIE: CAN Error Passive Interrupt Enable + * - CANINT_ALIE: CAN Arbitration Lost Interrupt Enable + * - CANINT_BEIE: CAN Bus Error Interrupt Enable + * - CANINT_IDIE: CAN ID Ready Interrupt Enable + * - CANINT_TIE2: CAN Transmit Interrupt Enable for Buffer2 + * - CANINT_TIE3: CAN Transmit Interrupt Enable for Buffer3 + * - CANINT_FCE: FullCAN Interrupt Enable + * @param[in] NewState: New state of this function, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void CAN_IRQCmd (LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_INT_EN_TYPE(arg)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + { + if(arg==CANINT_FCE) + { + LPC_CANAF->AFMR = 0x01; + LPC_CANAF->FCANIE = 0x01; + LPC_CANAF->AFMR = 0x04; + } + else + CANx->IER |= (1 << arg); + } + else + { + if(arg==CANINT_FCE){ + LPC_CANAF->AFMR = 0x01; + LPC_CANAF->FCANIE = 0x01; + LPC_CANAF->AFMR = 0x00; + } + else + CANx->IER &= ~(1 << arg); + } +} + +/********************************************************************//** + * @brief Setting Acceptance Filter mode + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @param[in] AFMode: type of AF mode that you want to set, should be: + * - CAN_Normal: Normal mode + * - CAN_AccOff: Acceptance Filter Off Mode + * - CAN_AccBP: Acceptance Fileter Bypass Mode + * - CAN_eFCAN: FullCAN Mode Enhancement + * @return none + *********************************************************************/ +void CAN_SetAFMode (LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFMode) +{ + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CHECK_PARAM(PARAM_AFMODE_TYPE(AFMode)); + + switch(AFMode) + { + case CAN_Normal: + CANAFx->AFMR = 0x00; + break; + case CAN_AccOff: + CANAFx->AFMR = 0x01; + break; + case CAN_AccBP: + CANAFx->AFMR = 0x02; + break; + case CAN_eFCAN: + CANAFx->AFMR = 0x04; + break; + } +} + +/********************************************************************//** + * @brief Enable/Disable CAN Mode + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] mode: type of CAN mode that you want to enable/disable, should be: + * - CAN_OPERATING_MODE: Normal Operating Mode + * - CAN_RESET_MODE: Reset Mode + * - CAN_LISTENONLY_MODE: Listen Only Mode + * - CAN_SELFTEST_MODE: Self Test Mode + * - CAN_TXPRIORITY_MODE: Transmit Priority Mode + * - CAN_SLEEP_MODE: Sleep Mode + * - CAN_RXPOLARITY_MODE: Receive Polarity Mode + * - CAN_TEST_MODE: Test Mode + * @param[in] NewState: New State of this function, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_MODE_TYPE(mode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(mode) + { + case CAN_OPERATING_MODE: + CANx->MOD = 0x00; + break; + case CAN_RESET_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_RM; + else + CANx->MOD &= ~CAN_MOD_RM; + break; + case CAN_LISTENONLY_MODE: + CANx->MOD |=CAN_MOD_RM;//Enter Reset mode + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_LOM; + else + CANx->MOD &=~CAN_MOD_LOM; + CANx->MOD &=~CAN_MOD_RM;//Release Reset mode + break; + case CAN_SELFTEST_MODE: + CANx->MOD |=CAN_MOD_RM;//Enter Reset mode + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_STM; + else + CANx->MOD &=~CAN_MOD_STM; + CANx->MOD &=~CAN_MOD_RM;//Release Reset mode + break; + case CAN_TXPRIORITY_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_TPM; + else + CANx->MOD &=~CAN_MOD_TPM; + break; + case CAN_SLEEP_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_SM; + else + CANx->MOD &=~CAN_MOD_SM; + break; + case CAN_RXPOLARITY_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_RPM; + else + CANx->MOD &=~CAN_MOD_RPM; + break; + case CAN_TEST_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_TM; + else + CANx->MOD &=~CAN_MOD_TM; + break; + } +} +/*********************************************************************//** + * @brief Set CAN command request + * @param[in] CANx point to CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CMRType command request type, should be: + * - CAN_CMR_TR: Transmission request + * - CAN_CMR_AT: Abort Transmission request + * - CAN_CMR_RRB: Release Receive Buffer request + * - CAN_CMR_CDO: Clear Data Overrun request + * - CAN_CMR_SRR: Self Reception request + * - CAN_CMR_STB1: Select Tx Buffer 1 request + * - CAN_CMR_STB2: Select Tx Buffer 2 request + * - CAN_CMR_STB3: Select Tx Buffer 3 request + * @return CANICR (CAN interrupt and Capture register) value + **********************************************************************/ +void CAN_SetCommand(LPC_CAN_TypeDef* CANx, uint32_t CMRType) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CANx->CMR |= CMRType; +} + +/*********************************************************************//** + * @brief Get CAN interrupt status + * @param[in] CANx point to CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @return CANICR (CAN interrupt and Capture register) value + **********************************************************************/ +uint32_t CAN_IntGetStatus(LPC_CAN_TypeDef* CANx) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + return CANx->ICR; +} + +/*********************************************************************//** + * @brief Check if FullCAN interrupt enable or not + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @return IntStatus, could be: + * - SET: if FullCAN interrupt is enable + * - RESET: if FullCAN interrupt is disable + **********************************************************************/ +IntStatus CAN_FullCANIntGetStatus (LPC_CANAF_TypeDef* CANAFx) +{ + CHECK_PARAM( PARAM_CANAFx(CANAFx)); + if (CANAFx->FCANIE) + return SET; + return RESET; +} + +/*********************************************************************//** + * @brief Get value of FullCAN interrupt and capture register + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @param[in] type: FullCAN IC type, should be: + * - FULLCAN_IC0: FullCAN Interrupt Capture 0 + * - FULLCAN_IC1: FullCAN Interrupt Capture 1 + * @return FCANIC0 or FCANIC1 (FullCAN interrupt and Capture register) value + **********************************************************************/ +uint32_t CAN_FullCANPendGetStatus(LPC_CANAF_TypeDef* CANAFx, FullCAN_IC_Type type) +{ + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CHECK_PARAM( PARAM_FULLCAN_IC(type)); + if (type == FULLCAN_IC0) + return CANAFx->FCANIC0; + return CANAFx->FCANIC1; +} +/* End of Public Variables ---------------------------------------------------------- */ +/** + * @} + */ + +#endif /* _CAN */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c new file mode 100644 index 0000000000..4f518e15a8 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c @@ -0,0 +1,350 @@ +/********************************************************************** +* $Id$ lpc17xx_clkpwr.c 2010-06-18 +*//** +* @file lpc17xx_clkpwr.c +* @brief Contains all functions support for Clock and Power Control +* firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup CLKPWR + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_clkpwr.h" + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup CLKPWR_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Set value of each Peripheral Clock Selection + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @param[in] DivVal Value of divider, should be: + * - CLKPWR_PCLKSEL_CCLK_DIV_4 : PCLK_peripheral = CCLK/4 + * - CLKPWR_PCLKSEL_CCLK_DIV_1 : PCLK_peripheral = CCLK/1 + * - CLKPWR_PCLKSEL_CCLK_DIV_2 : PCLK_peripheral = CCLK/2 + * + * @return none + **********************************************************************/ +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal) +{ + uint32_t bitpos; + + bitpos = (ClkType < 32) ? (ClkType) : (ClkType - 32); + + /* PCLKSEL0 selected */ + if (ClkType < 32) + { + /* Clear two bit at bit position */ + LPC_SC->PCLKSEL0 &= (~(CLKPWR_PCLKSEL_BITMASK(bitpos))); + + /* Set two selected bit */ + LPC_SC->PCLKSEL0 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); + } + /* PCLKSEL1 selected */ + else + { + /* Clear two bit at bit position */ + LPC_SC->PCLKSEL1 &= ~(CLKPWR_PCLKSEL_BITMASK(bitpos)); + + /* Set two selected bit */ + LPC_SC->PCLKSEL1 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); + } +} + + +/*********************************************************************//** + * @brief Get current value of each Peripheral Clock Selection + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @return Value of Selected Peripheral Clock Selection + **********************************************************************/ +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType) +{ + uint32_t bitpos, retval; + + if (ClkType < 32) + { + bitpos = ClkType; + retval = LPC_SC->PCLKSEL0; + } + else + { + bitpos = ClkType - 32; + retval = LPC_SC->PCLKSEL1; + } + + retval = CLKPWR_PCLKSEL_GET(bitpos, retval); + return retval; +} + + + +/*********************************************************************//** + * @brief Get current value of each Peripheral Clock + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @return Value of Selected Peripheral Clock + **********************************************************************/ +uint32_t CLKPWR_GetPCLK (uint32_t ClkType) +{ + uint32_t retval, div; + + retval = SystemCoreClock; + div = CLKPWR_GetPCLKSEL(ClkType); + + switch (div) + { + case 0: + div = 4; + break; + + case 1: + div = 1; + break; + + case 2: + div = 2; + break; + + case 3: + div = 8; + break; + } + retval /= div; + + return retval; +} + + + +/*********************************************************************//** + * @brief Configure power supply for each peripheral according to NewState + * @param[in] PPType Type of peripheral used to enable power, + * should be one of the following: + * - CLKPWR_PCONP_PCTIM0 : Timer 0 + - CLKPWR_PCONP_PCTIM1 : Timer 1 + - CLKPWR_PCONP_PCUART0 : UART 0 + - CLKPWR_PCONP_PCUART1 : UART 1 + - CLKPWR_PCONP_PCPWM1 : PWM 1 + - CLKPWR_PCONP_PCI2C0 : I2C 0 + - CLKPWR_PCONP_PCSPI : SPI + - CLKPWR_PCONP_PCRTC : RTC + - CLKPWR_PCONP_PCSSP1 : SSP 1 + - CLKPWR_PCONP_PCAD : ADC + - CLKPWR_PCONP_PCAN1 : CAN 1 + - CLKPWR_PCONP_PCAN2 : CAN 2 + - CLKPWR_PCONP_PCGPIO : GPIO + - CLKPWR_PCONP_PCRIT : RIT + - CLKPWR_PCONP_PCMC : MC + - CLKPWR_PCONP_PCQEI : QEI + - CLKPWR_PCONP_PCI2C1 : I2C 1 + - CLKPWR_PCONP_PCSSP0 : SSP 0 + - CLKPWR_PCONP_PCTIM2 : Timer 2 + - CLKPWR_PCONP_PCTIM3 : Timer 3 + - CLKPWR_PCONP_PCUART2 : UART 2 + - CLKPWR_PCONP_PCUART3 : UART 3 + - CLKPWR_PCONP_PCI2C2 : I2C 2 + - CLKPWR_PCONP_PCI2S : I2S + - CLKPWR_PCONP_PCGPDMA : GPDMA + - CLKPWR_PCONP_PCENET : Ethernet + - CLKPWR_PCONP_PCUSB : USB + * + * @param[in] NewState New state of Peripheral Power, should be: + * - ENABLE : Enable power for this peripheral + * - DISABLE : Disable power for this peripheral + * + * @return none + **********************************************************************/ +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState) +{ + if (NewState == ENABLE) + { + LPC_SC->PCONP |= PPType & CLKPWR_PCONP_BITMASK; + } + else if (NewState == DISABLE) + { + LPC_SC->PCONP &= (~PPType) & CLKPWR_PCONP_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enter Sleep mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_Sleep(void) +{ + LPC_SC->PCON = 0x00; + /* Sleep Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Deep Sleep mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_DeepSleep(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x00; + /* Deep Sleep Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Power Down mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_PowerDown(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x01; + /* Power Down Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Deep Power Down mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_DeepPowerDown(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x03; + /* Deep Power Down Mode*/ + __WFI(); +} + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c new file mode 100644 index 0000000000..f13bf3b6a9 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c @@ -0,0 +1,151 @@ +/********************************************************************** +* $Id$ lpc17xx_dac.c 2010-05-21 +*//** +* @file lpc17xx_dac.c +* @brief Contains all functions support for DAC firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup DAC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_dac.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _DAC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup DAC_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial ADC configuration + * - Maximum current is 700 uA + * - Value to AOUT is 0 + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @return None + ***********************************************************************/ +void DAC_Init(LPC_DAC_TypeDef *DACx) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + /* Set default clock divider for DAC */ + // CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_DAC, CLKPWR_PCLKSEL_CCLK_DIV_4); + //Set maximum current output + DAC_SetBias(LPC_DAC,DAC_MAX_CURRENT_700uA); +} + +/*********************************************************************//** + * @brief Update value to DAC + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] dac_value : value 10 bit to be converted to output + * @return None + ***********************************************************************/ +void DAC_UpdateValue (LPC_DAC_TypeDef *DACx,uint32_t dac_value) +{ + uint32_t tmp; + CHECK_PARAM(PARAM_DACx(DACx)); + tmp = DACx->DACR & DAC_BIAS_EN; + tmp |= DAC_VALUE(dac_value); + // Update value + DACx->DACR = tmp; +} + +/*********************************************************************//** + * @brief Set Maximum current for DAC + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] bias : 0 is 700 uA + * 1 350 uA + * @return None + ***********************************************************************/ +void DAC_SetBias (LPC_DAC_TypeDef *DACx,uint32_t bias) +{ + CHECK_PARAM(PARAM_DAC_CURRENT_OPT(bias)); + DACx->DACR &=~DAC_BIAS_EN; + if (bias == DAC_MAX_CURRENT_350uA) + { + DACx->DACR |= DAC_BIAS_EN; + } +} + +/*********************************************************************//** + * @brief To enable the DMA operation and control DMA timer + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] DAC_ConverterConfigStruct pointer to DAC_CONVERTER_CFG_Type + * - DBLBUF_ENA : enable/disable DACR double buffering feature + * - CNT_ENA : enable/disable timer out counter + * - DMA_ENA : enable/disable DMA access + * @return None + ***********************************************************************/ +void DAC_ConfigDAConverterControl (LPC_DAC_TypeDef *DACx,DAC_CONVERTER_CFG_Type *DAC_ConverterConfigStruct) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + DACx->DACCTRL &= ~DAC_DACCTRL_MASK; + if (DAC_ConverterConfigStruct->DBLBUF_ENA) + DACx->DACCTRL |= DAC_DBLBUF_ENA; + if (DAC_ConverterConfigStruct->CNT_ENA) + DACx->DACCTRL |= DAC_CNT_ENA; + if (DAC_ConverterConfigStruct->DMA_ENA) + DACx->DACCTRL |= DAC_DMA_ENA; +} + +/*********************************************************************//** + * @brief Set reload value for interrupt/DMA counter + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] time_out time out to reload for interrupt/DMA counter + * @return None + ***********************************************************************/ +void DAC_SetDMATimeOut(LPC_DAC_TypeDef *DACx, uint32_t time_out) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + DACx->DACCNTVAL = DAC_CCNT_VALUE(time_out); +} + +/** + * @} + */ + +#endif /* _DAC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c new file mode 100644 index 0000000000..f0e4e4627e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c @@ -0,0 +1,963 @@ +/********************************************************************** +* $Id$ lpc17xx_emac.c 2010-05-21 +*//** +* @file lpc17xx_emac.c +* @brief Contains all functions support for Ethernet MAC firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup EMAC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_emac.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _EMAC + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup EMAC_Private_Variables EMAC Private Variables + * @{ + */ + +/* MII Mgmt Configuration register - Clock divider setting */ +const uint8_t EMAC_clkdiv[] = { 4, 6, 8, 10, 14, 20, 28, 36, 40, 44, 48, 52, 56, 60, 64}; + +/* EMAC local DMA Descriptors */ + +/** Rx Descriptor data array */ +static RX_Desc Rx_Desc[EMAC_NUM_RX_FRAG]; + +/** Rx Status data array - Must be 8-Byte aligned */ +#if defined ( __CC_ARM ) +static __align(8) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#elif defined ( __ICCARM__ ) +#pragma data_alignment=8 +static RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#elif defined ( __GNUC__ ) +static __attribute__ ((aligned (8))) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#endif + +/** Tx Descriptor data array */ +static TX_Desc Tx_Desc[EMAC_NUM_TX_FRAG]; +/** Tx Status data array */ +static TX_Stat Tx_Stat[EMAC_NUM_TX_FRAG]; + +/* EMAC local DMA buffers */ +/** Rx buffer data */ +static uint32_t rx_buf[EMAC_NUM_RX_FRAG][EMAC_ETH_MAX_FLEN>>2]; +/** Tx buffer data */ +static uint32_t tx_buf[EMAC_NUM_TX_FRAG][EMAC_ETH_MAX_FLEN>>2]; + +/** + * @} + */ + +/* Private Functions ---------------------------------------------------------- */ +static void rx_descr_init (void); +static void tx_descr_init (void); +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value); +static int32_t read_PHY (uint32_t PhyReg); + +static void setEmacAddr(uint8_t abStationAddr[]); +static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len); + + +/*--------------------------- rx_descr_init ---------------------------------*/ +/*********************************************************************//** + * @brief Initializes RX Descriptor + * @param[in] None + * @return None + ***********************************************************************/ +static void rx_descr_init (void) +{ + /* Initialize Receive Descriptor and Status array. */ + uint32_t i; + + for (i = 0; i < EMAC_NUM_RX_FRAG; i++) { + Rx_Desc[i].Packet = (uint32_t)&rx_buf[i]; + Rx_Desc[i].Ctrl = EMAC_RCTRL_INT | (EMAC_ETH_MAX_FLEN - 1); + Rx_Stat[i].Info = 0; + Rx_Stat[i].HashCRC = 0; + } + + /* Set EMAC Receive Descriptor Registers. */ + LPC_EMAC->RxDescriptor = (uint32_t)&Rx_Desc[0]; + LPC_EMAC->RxStatus = (uint32_t)&Rx_Stat[0]; + LPC_EMAC->RxDescriptorNumber = EMAC_NUM_RX_FRAG - 1; + + /* Rx Descriptors Point to 0 */ + LPC_EMAC->RxConsumeIndex = 0; +} + + +/*--------------------------- tx_descr_init ---- ----------------------------*/ +/*********************************************************************//** + * @brief Initializes TX Descriptor + * @param[in] None + * @return None + ***********************************************************************/ +static void tx_descr_init (void) { + /* Initialize Transmit Descriptor and Status array. */ + uint32_t i; + + for (i = 0; i < EMAC_NUM_TX_FRAG; i++) { + Tx_Desc[i].Packet = (uint32_t)&tx_buf[i]; + Tx_Desc[i].Ctrl = 0; + Tx_Stat[i].Info = 0; + } + + /* Set EMAC Transmit Descriptor Registers. */ + LPC_EMAC->TxDescriptor = (uint32_t)&Tx_Desc[0]; + LPC_EMAC->TxStatus = (uint32_t)&Tx_Stat[0]; + LPC_EMAC->TxDescriptorNumber = EMAC_NUM_TX_FRAG - 1; + + /* Tx Descriptors Point to 0 */ + LPC_EMAC->TxProduceIndex = 0; +} + + +/*--------------------------- write_PHY -------------------------------------*/ +/*********************************************************************//** + * @brief Write value to PHY device + * @param[in] PhyReg: PHY Register address + * @param[in] Value: Value to write + * @return 0 - if success + * 1 - if fail + ***********************************************************************/ +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value) +{ + /* Write a data 'Value' to PHY register 'PhyReg'. */ + uint32_t tout; + + LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; + LPC_EMAC->MWTD = Value; + + /* Wait until operation completed */ + tout = 0; + for (tout = 0; tout < EMAC_MII_WR_TOUT; tout++) { + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { + return (0); + } + } + // Time out! + return (-1); +} + + +/*--------------------------- read_PHY --------------------------------------*/ +/*********************************************************************//** + * @brief Read value from PHY device + * @param[in] PhyReg: PHY Register address + * @return 0 - if success + * 1 - if fail + ***********************************************************************/ +static int32_t read_PHY (uint32_t PhyReg) +{ + /* Read a PHY register 'PhyReg'. */ + uint32_t tout; + + LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; + LPC_EMAC->MCMD = EMAC_MCMD_READ; + + /* Wait until operation completed */ + tout = 0; + for (tout = 0; tout < EMAC_MII_RD_TOUT; tout++) { + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { + LPC_EMAC->MCMD = 0; + return (LPC_EMAC->MRDD); + } + } + // Time out! + return (-1); +} + +/*********************************************************************//** + * @brief Set Station MAC address for EMAC module + * @param[in] abStationAddr Pointer to Station address that contains 6-bytes + * of MAC address (should be in order from MAC Address 1 to MAC Address 6) + * @return None + **********************************************************************/ +static void setEmacAddr(uint8_t abStationAddr[]) +{ + /* Set the Ethernet MAC Address registers */ + LPC_EMAC->SA0 = ((uint32_t)abStationAddr[5] << 8) | (uint32_t)abStationAddr[4]; + LPC_EMAC->SA1 = ((uint32_t)abStationAddr[3] << 8) | (uint32_t)abStationAddr[2]; + LPC_EMAC->SA2 = ((uint32_t)abStationAddr[1] << 8) | (uint32_t)abStationAddr[0]; +} + + +/*********************************************************************//** + * @brief Calculates CRC code for number of bytes in the frame + * @param[in] frame_no_fcs Pointer to the first byte of the frame + * @param[in] frame_len length of the frame without the FCS + * @return the CRC as a 32 bit integer + **********************************************************************/ +static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len) +{ + int i; // iterator + int j; // another iterator + char byte; // current byte + int crc; // CRC result + int q0, q1, q2, q3; // temporary variables + crc = 0xFFFFFFFF; + for (i = 0; i < frame_len; i++) { + byte = *frame_no_fcs++; + for (j = 0; j < 2; j++) { + if (((crc >> 28) ^ (byte >> 3)) & 0x00000001) { + q3 = 0x04C11DB7; + } else { + q3 = 0x00000000; + } + if (((crc >> 29) ^ (byte >> 2)) & 0x00000001) { + q2 = 0x09823B6E; + } else { + q2 = 0x00000000; + } + if (((crc >> 30) ^ (byte >> 1)) & 0x00000001) { + q1 = 0x130476DC; + } else { + q1 = 0x00000000; + } + if (((crc >> 31) ^ (byte >> 0)) & 0x00000001) { + q0 = 0x2608EDB8; + } else { + q0 = 0x00000000; + } + crc = (crc << 4) ^ q3 ^ q2 ^ q1 ^ q0; + byte >>= 4; + } + } + return crc; +} +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup EMAC_Public_Functions + * @{ + */ + + +/*********************************************************************//** + * @brief Initializes the EMAC peripheral according to the specified +* parameters in the EMAC_ConfigStruct. + * @param[in] EMAC_ConfigStruct Pointer to a EMAC_CFG_Type structure +* that contains the configuration information for the +* specified EMAC peripheral. + * @return None + * + * Note: This function will initialize EMAC module according to procedure below: + * - Remove the soft reset condition from the MAC + * - Configure the PHY via the MIIM interface of the MAC + * - Select RMII mode + * - Configure the transmit and receive DMA engines, including the descriptor arrays + * - Configure the host registers (MAC1,MAC2 etc.) in the MAC + * - Enable the receive and transmit data paths + * In default state after initializing, only Rx Done and Tx Done interrupt are enabled, + * all remain interrupts are disabled + * (Ref. from LPC17xx UM) + **********************************************************************/ +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct) +{ + /* Initialize the EMAC Ethernet controller. */ + int32_t regv,tout, tmp; + + /* Set up clock and power for Ethernet module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, ENABLE); + + /* Reset all EMAC internal modules */ + LPC_EMAC->MAC1 = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX | EMAC_MAC1_RES_RX | + EMAC_MAC1_RES_MCS_RX | EMAC_MAC1_SIM_RES | EMAC_MAC1_SOFT_RES; + + LPC_EMAC->Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES | EMAC_CR_PASS_RUNT_FRM; + + /* A short delay after reset. */ + for (tout = 100; tout; tout--); + + /* Initialize MAC control registers. */ + LPC_EMAC->MAC1 = EMAC_MAC1_PASS_ALL; + LPC_EMAC->MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN; + LPC_EMAC->MAXF = EMAC_ETH_MAX_FLEN; + /* + * Find the clock that close to desired target clock + */ + tmp = SystemCoreClock / EMAC_MCFG_MII_MAXCLK; + for (tout = 0; tout < sizeof (EMAC_clkdiv); tout++){ + if (EMAC_clkdiv[tout] >= tmp) break; + } + tout++; + // Write to MAC configuration register and reset + LPC_EMAC->MCFG = EMAC_MCFG_CLK_SEL(tout) | EMAC_MCFG_RES_MII; + // release reset + LPC_EMAC->MCFG &= ~(EMAC_MCFG_RES_MII); + LPC_EMAC->CLRT = EMAC_CLRT_DEF; + LPC_EMAC->IPGR = EMAC_IPGR_P2_DEF; + + /* Enable Reduced MII interface. */ + LPC_EMAC->Command = EMAC_CR_RMII | EMAC_CR_PASS_RUNT_FRM; + + /* Reset Reduced MII Logic. */ +// LPC_EMAC->SUPP = EMAC_SUPP_RES_RMII; + + for (tout = 100; tout; tout--); + LPC_EMAC->SUPP = 0; + + /* Put the DP83848C in reset mode */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_RESET); + + /* Wait for hardware reset to end. */ + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_BMCR); + if (!(regv & (EMAC_PHY_BMCR_RESET | EMAC_PHY_BMCR_POWERDOWN))) { + /* Reset complete, device not Power Down. */ + break; + } + if (tout == 0){ + // Time out, return ERROR + return (ERROR); + } + } + + // Set PHY mode + if (EMAC_SetPHYMode(EMAC_ConfigStruct->Mode) < 0){ + return (ERROR); + } + + // Set EMAC address + setEmacAddr(EMAC_ConfigStruct->pbEMAC_Addr); + + /* Initialize Tx and Rx DMA Descriptors */ + rx_descr_init (); + tx_descr_init (); + + // Set Receive Filter register: enable broadcast and multicast + LPC_EMAC->RxFilterCtrl = EMAC_RFC_MCAST_EN | EMAC_RFC_BCAST_EN | EMAC_RFC_PERFECT_EN; + + /* Enable Rx Done and Tx Done interrupt for EMAC */ + LPC_EMAC->IntEnable = EMAC_INT_RX_DONE | EMAC_INT_TX_DONE; + + /* Reset all interrupts */ + LPC_EMAC->IntClear = 0xFFFF; + + /* Enable receive and transmit mode of MAC Ethernet core */ + LPC_EMAC->Command |= (EMAC_CR_RX_EN | EMAC_CR_TX_EN); + LPC_EMAC->MAC1 |= EMAC_MAC1_REC_EN; + + return SUCCESS; +} + + +/*********************************************************************//** + * @brief De-initializes the EMAC peripheral registers to their +* default reset values. + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_DeInit(void) +{ + // Disable all interrupt + LPC_EMAC->IntEnable = 0x00; + // Clear all pending interrupt + LPC_EMAC->IntClear = (0xFF) | (EMAC_INT_SOFT_INT | EMAC_INT_WAKEUP); + + /* TurnOff clock and power for Ethernet module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, DISABLE); +} + + +/*********************************************************************//** + * @brief Check specified PHY status in EMAC peripheral + * @param[in] ulPHYState Specified PHY Status Type, should be: + * - EMAC_PHY_STAT_LINK: Link Status + * - EMAC_PHY_STAT_SPEED: Speed Status + * - EMAC_PHY_STAT_DUP: Duplex Status + * @return Status of specified PHY status (0 or 1). + * (-1) if error. + * + * Note: + * For EMAC_PHY_STAT_LINK, return value: + * - 0: Link Down + * - 1: Link Up + * For EMAC_PHY_STAT_SPEED, return value: + * - 0: 10Mbps + * - 1: 100Mbps + * For EMAC_PHY_STAT_DUP, return value: + * - 0: Half-Duplex + * - 1: Full-Duplex + **********************************************************************/ +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState) +{ + int32_t regv, tmp; +#ifdef MCB_LPC_1768 + regv = read_PHY (EMAC_PHY_REG_STS); + switch(ulPHYState){ + case EMAC_PHY_STAT_LINK: + tmp = (regv & EMAC_PHY_SR_LINK) ? 1 : 0; + break; + case EMAC_PHY_STAT_SPEED: + tmp = (regv & EMAC_PHY_SR_SPEED) ? 0 : 1; + break; + case EMAC_PHY_STAT_DUP: + tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; + break; +#elif defined(IAR_LPC_1768) + /* Use IAR_LPC_1768 board: + * FSZ8721BL doesn't have Status Register + * so we read Basic Mode Status Register (0x01h) instead + */ + regv = read_PHY (EMAC_PHY_REG_BMSR); + switch(ulPHYState){ + case EMAC_PHY_STAT_LINK: + tmp = (regv & EMAC_PHY_BMSR_LINK_STATUS) ? 1 : 0; + break; + case EMAC_PHY_STAT_SPEED: + tmp = (regv & EMAC_PHY_SR_100_SPEED) ? 1 : 0; + break; + case EMAC_PHY_STAT_DUP: + tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; + break; +#endif + default: + tmp = -1; + break; + } + return (tmp); +} + + +/*********************************************************************//** + * @brief Set specified PHY mode in EMAC peripheral + * @param[in] ulPHYMode Specified PHY mode, should be: + * - EMAC_MODE_AUTO + * - EMAC_MODE_10M_FULL + * - EMAC_MODE_10M_HALF + * - EMAC_MODE_100M_FULL + * - EMAC_MODE_100M_HALF + * @return Return (0) if no error, otherwise return (-1) + **********************************************************************/ +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode) +{ + int32_t id1, id2, tout; + + /* Check if this is a DP83848C PHY. */ + id1 = read_PHY (EMAC_PHY_REG_IDR1); + id2 = read_PHY (EMAC_PHY_REG_IDR2); + +#ifdef MCB_LPC_1768 + if (((id1 << 16) | (id2 & 0xFFF0)) == EMAC_DP83848C_ID) { + switch(ulPHYMode){ + case EMAC_MODE_AUTO: + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); +#elif defined(IAR_LPC_1768) /* Use IAR LPC1768 KickStart board */ + if (((id1 << 16) | id2) == EMAC_KSZ8721BL_ID) { + /* Configure the PHY device */ + switch(ulPHYMode){ + case EMAC_MODE_AUTO: + /* Use auto-negotiation about the link speed. */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); +// write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_AN); +#endif + /* Wait to complete Auto_Negotiation */ + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + + } + break; + case EMAC_MODE_10M_FULL: + /* Connect at 10MBit full-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_10M); + break; + case EMAC_MODE_10M_HALF: + /* Connect at 10MBit half-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_10M); + break; + case EMAC_MODE_100M_FULL: + /* Connect at 100MBit full-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_100M); + break; + case EMAC_MODE_100M_HALF: + /* Connect at 100MBit half-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_100M); + break; + default: + // un-supported + return (-1); + } + } + // It's not correct module ID + else { + return (-1); + } + + // Update EMAC configuration with current PHY status + if (EMAC_UpdatePHYStatus() < 0){ + return (-1); + } + + // Complete + return (0); +} + + +/*********************************************************************//** + * @brief Auto-Configures value for the EMAC configuration register to + * match with current PHY mode + * @param[in] None + * @return Return (0) if no error, otherwise return (-1) + * + * Note: The EMAC configuration will be auto-configured: + * - Speed mode. + * - Half/Full duplex mode + **********************************************************************/ +int32_t EMAC_UpdatePHYStatus(void) +{ + int32_t regv, tout; + + /* Check the link status. */ +#ifdef MCB_LPC_1768 + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_STS); + if (regv & EMAC_PHY_SR_LINK) { + /* Link is on. */ + break; + } + if (tout == 0){ + // time out + return (-1); + } + } + /* Configure Full/Half Duplex mode. */ + if (regv & EMAC_PHY_SR_DUP) { + /* Full duplex is enabled. */ + LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; + LPC_EMAC->Command |= EMAC_CR_FULL_DUP; + LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; + } else { + /* Half duplex mode. */ + LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; + } + if (regv & EMAC_PHY_SR_SPEED) { + /* 10MBit mode. */ + LPC_EMAC->SUPP = 0; + } else { + /* 100MBit mode. */ + LPC_EMAC->SUPP = EMAC_SUPP_SPEED; + } +#elif defined(IAR_LPC_1768) + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_BMSR); + if (regv & EMAC_PHY_BMSR_LINK_STATUS) { + /* Link is on. */ + break; + } + if (tout == 0){ + // time out + return (-1); + } + } + + /* Configure Full/Half Duplex mode. */ + if (regv & EMAC_PHY_SR_FULL_DUP) { + /* Full duplex is enabled. */ + LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; + LPC_EMAC->Command |= EMAC_CR_FULL_DUP; + LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; + } else { + /* Half duplex mode. */ + LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; + } + + /* Configure 100MBit/10MBit mode. */ + if (!(regv & EMAC_PHY_SR_100_SPEED)) { + /* 10MBit mode. */ + LPC_EMAC->SUPP = 0; + } else { + /* 100MBit mode. */ + LPC_EMAC->SUPP = EMAC_SUPP_SPEED; + } +#endif + // Complete + return (0); +} + + +/*********************************************************************//** + * @brief Enable/Disable hash filter functionality for specified destination + * MAC address in EMAC module + * @param[in] dstMAC_addr Pointer to the first MAC destination address, should + * be 6-bytes length, in order LSB to the MSB + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + * + * Note: + * The standard Ethernet cyclic redundancy check (CRC) function is calculated from + * the 6 byte destination address in the Ethernet frame (this CRC is calculated + * anyway as part of calculating the CRC of the whole frame), then bits [28:23] out of + * the 32 bits CRC result are taken to form the hash. The 6 bit hash is used to access + * the hash table: it is used as an index in the 64 bit HashFilter register that has been + * programmed with accept values. If the selected accept value is 1, the frame is + * accepted. + **********************************************************************/ +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState) +{ + uint32_t *pReg; + uint32_t tmp; + int32_t crc; + + // Calculate the CRC from the destination MAC address + crc = emac_CRCCalc(dstMAC_addr, 6); + // Extract the value from CRC to get index value for hash filter table + crc = (crc >> 23) & 0x3F; + + pReg = (crc > 31) ? ((uint32_t *)&LPC_EMAC->HashFilterH) \ + : ((uint32_t *)&LPC_EMAC->HashFilterL); + tmp = (crc > 31) ? (crc - 32) : crc; + if (NewState == ENABLE) { + (*pReg) |= (1UL << tmp); + } else { + (*pReg) &= ~(1UL << tmp); + } + // Enable Rx Filter + LPC_EMAC->Command &= ~EMAC_CR_PASS_RX_FILT; +} + +/*********************************************************************//** + * @brief Enable/Disable Filter mode for each specified type EMAC peripheral + * @param[in] ulFilterMode Filter mode, should be: + * - EMAC_RFC_UCAST_EN: all frames of unicast types + * will be accepted + * - EMAC_RFC_BCAST_EN: broadcast frame will be + * accepted + * - EMAC_RFC_MCAST_EN: all frames of multicast + * types will be accepted + * - EMAC_RFC_UCAST_HASH_EN: The imperfect hash + * filter will be applied to unicast addresses + * - EMAC_RFC_MCAST_HASH_EN: The imperfect hash + * filter will be applied to multicast addresses + * - EMAC_RFC_PERFECT_EN: the destination address + * will be compared with the 6 byte station address + * programmed in the station address by the filter + * - EMAC_RFC_MAGP_WOL_EN: the result of the magic + * packet filter will generate a WoL interrupt when + * there is a match + * - EMAC_RFC_PFILT_WOL_EN: the result of the perfect address + * matching filter and the imperfect hash filter will + * generate a WoL interrupt when there is a match + * @param[in] NewState New State of this command, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState) +{ + if (NewState == ENABLE){ + LPC_EMAC->RxFilterCtrl |= ulFilterMode; + } else { + LPC_EMAC->RxFilterCtrl &= ~ulFilterMode; + } +} + +/*********************************************************************//** + * @brief Get status of Wake On LAN Filter for each specified + * type in EMAC peripheral, clear this status if it is set + * @param[in] ulWoLMode WoL Filter mode, should be: + * - EMAC_WOL_UCAST: unicast frames caused WoL + * - EMAC_WOL_UCAST: broadcast frame caused WoL + * - EMAC_WOL_MCAST: multicast frame caused WoL + * - EMAC_WOL_UCAST_HASH: unicast frame that passes the + * imperfect hash filter caused WoL + * - EMAC_WOL_MCAST_HASH: multicast frame that passes the + * imperfect hash filter caused WoL + * - EMAC_WOL_PERFECT:perfect address matching filter + * caused WoL + * - EMAC_WOL_RX_FILTER: the receive filter caused WoL + * - EMAC_WOL_MAG_PACKET: the magic packet filter caused WoL + * @return SET/RESET + **********************************************************************/ +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode) +{ + if (LPC_EMAC->RxFilterWoLStatus & ulWoLMode) { + LPC_EMAC->RxFilterWoLClear = ulWoLMode; + return SET; + } else { + return RESET; + } +} + + +/*********************************************************************//** + * @brief Write data to Tx packet data buffer at current index due to + * TxProduceIndex + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure + * data that contain specified information about + * Packet data buffer. + * @return None + **********************************************************************/ +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) +{ + uint32_t idx,len; + uint32_t *sp,*dp; + + idx = LPC_EMAC->TxProduceIndex; + sp = (uint32_t *)pDataStruct->pbDataBuf; + dp = (uint32_t *)Tx_Desc[idx].Packet; + /* Copy frame data to EMAC packet buffers. */ + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { + *dp++ = *sp++; + } + Tx_Desc[idx].Ctrl = (pDataStruct->ulDataLen - 1) | (EMAC_TCTRL_INT | EMAC_TCTRL_LAST); +} + +/*********************************************************************//** + * @brief Read data from Rx packet data buffer at current index due + * to RxConsumeIndex + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure + * data that contain specified information about + * Packet data buffer. + * @return None + **********************************************************************/ +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) +{ + uint32_t idx, len; + uint32_t *dp, *sp; + + idx = LPC_EMAC->RxConsumeIndex; + dp = (uint32_t *)pDataStruct->pbDataBuf; + sp = (uint32_t *)Rx_Desc[idx].Packet; + + if (pDataStruct->pbDataBuf != NULL) { + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { + *dp++ = *sp++; + } + } +} + +/*********************************************************************//** + * @brief Enable/Disable interrupt for each type in EMAC + * @param[in] ulIntType Interrupt Type, should be: + * - EMAC_INT_RX_OVERRUN: Receive Overrun + * - EMAC_INT_RX_ERR: Receive Error + * - EMAC_INT_RX_FIN: Receive Descriptor Finish + * - EMAC_INT_RX_DONE: Receive Done + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run + * - EMAC_INT_TX_ERR: Transmit Error + * - EMAC_INT_TX_FIN: Transmit descriptor finish + * - EMAC_INT_TX_DONE: Transmit Done + * - EMAC_INT_SOFT_INT: Software interrupt + * - EMAC_INT_WAKEUP: Wakeup interrupt + * @param[in] NewState New State of this function, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState) +{ + if (NewState == ENABLE) { + LPC_EMAC->IntEnable |= ulIntType; + } else { + LPC_EMAC->IntEnable &= ~(ulIntType); + } +} + +/*********************************************************************//** + * @brief Check whether if specified interrupt flag is set or not + * for each interrupt type in EMAC and clear interrupt pending + * if it is set. + * @param[in] ulIntType Interrupt Type, should be: + * - EMAC_INT_RX_OVERRUN: Receive Overrun + * - EMAC_INT_RX_ERR: Receive Error + * - EMAC_INT_RX_FIN: Receive Descriptor Finish + * - EMAC_INT_RX_DONE: Receive Done + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run + * - EMAC_INT_TX_ERR: Transmit Error + * - EMAC_INT_TX_FIN: Transmit descriptor finish + * - EMAC_INT_TX_DONE: Transmit Done + * - EMAC_INT_SOFT_INT: Software interrupt + * - EMAC_INT_WAKEUP: Wakeup interrupt + * @return New state of specified interrupt (SET or RESET) + **********************************************************************/ +IntStatus EMAC_IntGetStatus(uint32_t ulIntType) +{ + if (LPC_EMAC->IntStatus & ulIntType) { + LPC_EMAC->IntClear = ulIntType; + return SET; + } else { + return RESET; + } +} + + +/*********************************************************************//** + * @brief Check whether if the current RxConsumeIndex is not equal to the + * current RxProduceIndex. + * @param[in] None + * @return TRUE if they're not equal, otherwise return FALSE + * + * Note: In case the RxConsumeIndex is not equal to the RxProduceIndex, + * it means there're available data has been received. They should be read + * out and released the Receive Data Buffer by updating the RxConsumeIndex value. + **********************************************************************/ +Bool EMAC_CheckReceiveIndex(void) +{ + if (LPC_EMAC->RxConsumeIndex != LPC_EMAC->RxProduceIndex) { + return TRUE; + } else { + return FALSE; + } +} + + +/*********************************************************************//** + * @brief Check whether if the current TxProduceIndex is not equal to the + * current RxProduceIndex - 1. + * @param[in] None + * @return TRUE if they're not equal, otherwise return FALSE + * + * Note: In case the RxConsumeIndex is equal to the RxProduceIndex - 1, + * it means the transmit buffer is available and data can be written to transmit + * buffer to be sent. + **********************************************************************/ +Bool EMAC_CheckTransmitIndex(void) +{ + uint32_t tmp = LPC_EMAC->TxConsumeIndex; + if (LPC_EMAC->TxProduceIndex == ( tmp - 1 )) + { + return FALSE; + } + else if( ( tmp == 0 ) && ( LPC_EMAC->TxProduceIndex == ( EMAC_NUM_TX_FRAG - 1 ) ) ) + { + return FALSE; + } + else + { + return TRUE; + } +} + + + +/*********************************************************************//** + * @brief Get current status value of receive data (due to RxConsumeIndex) + * @param[in] ulRxStatType Received Status type, should be one of following: + * - EMAC_RINFO_CTRL_FRAME: Control Frame + * - EMAC_RINFO_VLAN: VLAN Frame + * - EMAC_RINFO_FAIL_FILT: RX Filter Failed + * - EMAC_RINFO_MCAST: Multicast Frame + * - EMAC_RINFO_BCAST: Broadcast Frame + * - EMAC_RINFO_CRC_ERR: CRC Error in Frame + * - EMAC_RINFO_SYM_ERR: Symbol Error from PHY + * - EMAC_RINFO_LEN_ERR: Length Error + * - EMAC_RINFO_RANGE_ERR: Range error(exceeded max size) + * - EMAC_RINFO_ALIGN_ERR: Alignment error + * - EMAC_RINFO_OVERRUN: Receive overrun + * - EMAC_RINFO_NO_DESCR: No new Descriptor available + * - EMAC_RINFO_LAST_FLAG: last Fragment in Frame + * - EMAC_RINFO_ERR: Error Occurred (OR of all error) + * @return Current value of receive data (due to RxConsumeIndex) + **********************************************************************/ +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType) +{ + uint32_t idx; + idx = LPC_EMAC->RxConsumeIndex; + return (((Rx_Stat[idx].Info) & ulRxStatType) ? SET : RESET); +} + + +/*********************************************************************//** + * @brief Get size of current Received data in received buffer (due to + * RxConsumeIndex) + * @param[in] None + * @return Size of received data + **********************************************************************/ +uint32_t EMAC_GetReceiveDataSize(void) +{ + uint32_t idx; + idx =LPC_EMAC->RxConsumeIndex; + return ((Rx_Stat[idx].Info) & EMAC_RINFO_SIZE); +} + +/*********************************************************************//** + * @brief Increase the RxConsumeIndex (after reading the Receive buffer + * to release the Receive buffer) and wrap-around the index if + * it reaches the maximum Receive Number + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_UpdateRxConsumeIndex(void) +{ + // Get current Rx consume index + uint32_t idx = LPC_EMAC->RxConsumeIndex; + + /* Release frame from EMAC buffer */ + if (++idx == EMAC_NUM_RX_FRAG) idx = 0; + LPC_EMAC->RxConsumeIndex = idx; +} + +/*********************************************************************//** + * @brief Increase the TxProduceIndex (after writting to the Transmit buffer + * to enable the Transmit buffer) and wrap-around the index if + * it reaches the maximum Transmit Number + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_UpdateTxProduceIndex(void) +{ + // Get current Tx produce index + uint32_t idx = LPC_EMAC->TxProduceIndex; + + /* Start frame transmission */ + if (++idx == EMAC_NUM_TX_FRAG) idx = 0; + LPC_EMAC->TxProduceIndex = idx; +} + + +/** + * @} + */ + +#endif /* _EMAC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c new file mode 100644 index 0000000000..805bee4b09 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c @@ -0,0 +1,171 @@ +/********************************************************************** +* $Id$ lpc17xx_exti.c 2010-06-18 +*//** +* @file lpc17xx_exti.c +* @brief Contains all functions support for External interrupt firmware +* library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup EXTI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_exti.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _EXTI + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup EXTI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial for EXT + * - Set EXTINT, EXTMODE, EXTPOLAR registers to default value + * @param[in] None + * @return None + **********************************************************************/ +void EXTI_Init(void) +{ + LPC_SC->EXTINT = 0xF; + LPC_SC->EXTMODE = 0x0; + LPC_SC->EXTPOLAR = 0x0; +} + + +/*********************************************************************//** +* @brief Close EXT +* @param[in] None +* @return None +**********************************************************************/ +void EXTI_DeInit(void) +{ + ; +} + +/*********************************************************************//** + * @brief Configuration for EXT + * - Set EXTINT, EXTMODE, EXTPOLAR register + * @param[in] EXTICfg Pointer to a EXTI_InitTypeDef structure + * that contains the configuration information for the + * specified external interrupt + * @return None + **********************************************************************/ +void EXTI_Config(EXTI_InitTypeDef *EXTICfg) +{ + LPC_SC->EXTINT = 0x0; + EXTI_SetMode(EXTICfg->EXTI_Line, EXTICfg->EXTI_Mode); + EXTI_SetPolarity(EXTICfg->EXTI_Line, EXTICfg->EXTI_polarity); +} + +/*********************************************************************//** +* @brief Set mode for EXTI pin +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @param[in] mode external mode, should be: +* - EXTI_MODE_LEVEL_SENSITIVE +* - EXTI_MODE_EDGE_SENSITIVE +* @return None +*********************************************************************/ +void EXTI_SetMode(EXTI_LINE_ENUM EXTILine, EXTI_MODE_ENUM mode) +{ + if(mode == EXTI_MODE_EDGE_SENSITIVE) + { + LPC_SC->EXTMODE |= (1 << EXTILine); + } + else if(mode == EXTI_MODE_LEVEL_SENSITIVE) + { + LPC_SC->EXTMODE &= ~(1 << EXTILine); + } +} + +/*********************************************************************//** +* @brief Set polarity for EXTI pin +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @param[in] polarity external polarity value, should be: +* - EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE +* - EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE +* @return None +*********************************************************************/ +void EXTI_SetPolarity(EXTI_LINE_ENUM EXTILine, EXTI_POLARITY_ENUM polarity) +{ + if(polarity == EXTI_POLARITY_HIGH_ACTIVE_OR_RISING_EDGE) + { + LPC_SC->EXTPOLAR |= (1 << EXTILine); + } + else if(polarity == EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE) + { + LPC_SC->EXTPOLAR &= ~(1 << EXTILine); + } +} + +/*********************************************************************//** +* @brief Clear External interrupt flag +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @return None +*********************************************************************/ +void EXTI_ClearEXTIFlag(EXTI_LINE_ENUM EXTILine) +{ + LPC_SC->EXTINT = (1 << EXTILine); +} + +/** + * @} + */ + +#endif /* _EXTI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c new file mode 100644 index 0000000000..0267de3d17 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c @@ -0,0 +1,463 @@ +/********************************************************************** +* $Id$ lpc17xx_gpdma.c 2010-03-21 +*//** +* @file lpc17xx_gpdma.c +* @brief Contains all functions support for GPDMA firmware +* library on LPC17xx +* @version 2.1 +* @date 25. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup GPDMA + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_gpdma.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _GPDMA + + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup GPDMA_Private_Variables GPDMA Private Variables + * @{ + */ + +/** + * @brief Lookup Table of Connection Type matched with + * Peripheral Data (FIFO) register base address + */ +//#ifdef __IAR_SYSTEMS_ICC__ +volatile const void *GPDMA_LUTPerAddr[] = { + (&LPC_SSP0->DR), // SSP0 Tx + (&LPC_SSP0->DR), // SSP0 Rx + (&LPC_SSP1->DR), // SSP1 Tx + (&LPC_SSP1->DR), // SSP1 Rx + (&LPC_ADC->ADGDR), // ADC + (&LPC_I2S->I2STXFIFO), // I2S Tx + (&LPC_I2S->I2SRXFIFO), // I2S Rx + (&LPC_DAC->DACR), // DAC + (&LPC_UART0->/*RBTHDLR.*/THR), // UART0 Tx + (&LPC_UART0->/*RBTHDLR.*/RBR), // UART0 Rx + (&LPC_UART1->/*RBTHDLR.*/THR), // UART1 Tx + (&LPC_UART1->/*RBTHDLR.*/RBR), // UART1 Rx + (&LPC_UART2->/*RBTHDLR.*/THR), // UART2 Tx + (&LPC_UART2->/*RBTHDLR.*/RBR), // UART2 Rx + (&LPC_UART3->/*RBTHDLR.*/THR), // UART3 Tx + (&LPC_UART3->/*RBTHDLR.*/RBR), // UART3 Rx + (&LPC_TIM0->MR0), // MAT0.0 + (&LPC_TIM0->MR1), // MAT0.1 + (&LPC_TIM1->MR0), // MAT1.0 + (&LPC_TIM1->MR1), // MAT1.1 + (&LPC_TIM2->MR0), // MAT2.0 + (&LPC_TIM2->MR1), // MAT2.1 + (&LPC_TIM3->MR0), // MAT3.0 + (&LPC_TIM3->MR1) // MAT3.1 +}; +//#else +//const uint32_t GPDMA_LUTPerAddr[] = { +// ((uint32_t)&LPC_SSP0->DR), // SSP0 Tx +// ((uint32_t)&LPC_SSP0->DR), // SSP0 Rx +// ((uint32_t)&LPC_SSP1->DR), // SSP1 Tx +// ((uint32_t)&LPC_SSP1->DR), // SSP1 Rx +// ((uint32_t)&LPC_ADC->ADGDR), // ADC +// ((uint32_t)&LPC_I2S->I2STXFIFO), // I2S Tx +// ((uint32_t)&LPC_I2S->I2SRXFIFO), // I2S Rx +// ((uint32_t)&LPC_DAC->DACR), // DAC +// ((uint32_t)&LPC_UART0->/*RBTHDLR.*/THR), // UART0 Tx +// ((uint32_t)&LPC_UART0->/*RBTHDLR.*/RBR), // UART0 Rx +// ((uint32_t)&LPC_UART1->/*RBTHDLR.*/THR), // UART1 Tx +// ((uint32_t)&LPC_UART1->/*RBTHDLR.*/RBR), // UART1 Rx +// ((uint32_t)&LPC_UART2->/*RBTHDLR.*/THR), // UART2 Tx +// ((uint32_t)&LPC_UART2->/*RBTHDLR.*/RBR), // UART2 Rx +// ((uint32_t)&LPC_UART3->/*RBTHDLR.*/THR), // UART3 Tx +// ((uint32_t)&LPC_UART3->/*RBTHDLR.*/RBR), // UART3 Rx +// ((uint32_t)&LPC_TIM0->MR0), // MAT0.0 +// ((uint32_t)&LPC_TIM0->MR1), // MAT0.1 +// ((uint32_t)&LPC_TIM1->MR0), // MAT1.0 +// ((uint32_t)&LPC_TIM1->MR1), // MAT1.1 +// ((uint32_t)&LPC_TIM2->MR0), // MAT2.0 +// ((uint32_t)&LPC_TIM2->MR1), // MAT2.1 +// ((uint32_t)&LPC_TIM3->MR0), // MAT3.0 +// ((uint32_t)&LPC_TIM3->MR1) // MAT3.1 +//}; +//#endif +/** + * @brief Lookup Table of GPDMA Channel Number matched with + * GPDMA channel pointer + */ +const LPC_GPDMACH_TypeDef *pGPDMACh[8] = { + LPC_GPDMACH0, // GPDMA Channel 0 + LPC_GPDMACH1, // GPDMA Channel 1 + LPC_GPDMACH2, // GPDMA Channel 2 + LPC_GPDMACH3, // GPDMA Channel 3 + LPC_GPDMACH4, // GPDMA Channel 4 + LPC_GPDMACH5, // GPDMA Channel 5 + LPC_GPDMACH6, // GPDMA Channel 6 + LPC_GPDMACH7 // GPDMA Channel 7 +}; +/** + * @brief Optimized Peripheral Source and Destination burst size + */ +const uint8_t GPDMA_LUTPerBurst[] = { + GPDMA_BSIZE_4, // SSP0 Tx + GPDMA_BSIZE_4, // SSP0 Rx + GPDMA_BSIZE_4, // SSP1 Tx + GPDMA_BSIZE_4, // SSP1 Rx + GPDMA_BSIZE_1, // ADC + GPDMA_BSIZE_32, // I2S channel 0 + GPDMA_BSIZE_32, // I2S channel 1 + GPDMA_BSIZE_1, // DAC + GPDMA_BSIZE_1, // UART0 Tx + GPDMA_BSIZE_1, // UART0 Rx + GPDMA_BSIZE_1, // UART1 Tx + GPDMA_BSIZE_1, // UART1 Rx + GPDMA_BSIZE_1, // UART2 Tx + GPDMA_BSIZE_1, // UART2 Rx + GPDMA_BSIZE_1, // UART3 Tx + GPDMA_BSIZE_1, // UART3 Rx + GPDMA_BSIZE_1, // MAT0.0 + GPDMA_BSIZE_1, // MAT0.1 + GPDMA_BSIZE_1, // MAT1.0 + GPDMA_BSIZE_1, // MAT1.1 + GPDMA_BSIZE_1, // MAT2.0 + GPDMA_BSIZE_1, // MAT2.1 + GPDMA_BSIZE_1, // MAT3.0 + GPDMA_BSIZE_1 // MAT3.1 +}; +/** + * @brief Optimized Peripheral Source and Destination transfer width + */ +const uint8_t GPDMA_LUTPerWid[] = { + GPDMA_WIDTH_BYTE, // SSP0 Tx + GPDMA_WIDTH_BYTE, // SSP0 Rx + GPDMA_WIDTH_BYTE, // SSP1 Tx + GPDMA_WIDTH_BYTE, // SSP1 Rx + GPDMA_WIDTH_WORD, // ADC + GPDMA_WIDTH_WORD, // I2S channel 0 + GPDMA_WIDTH_WORD, // I2S channel 1 + GPDMA_WIDTH_BYTE, // DAC + GPDMA_WIDTH_BYTE, // UART0 Tx + GPDMA_WIDTH_BYTE, // UART0 Rx + GPDMA_WIDTH_BYTE, // UART1 Tx + GPDMA_WIDTH_BYTE, // UART1 Rx + GPDMA_WIDTH_BYTE, // UART2 Tx + GPDMA_WIDTH_BYTE, // UART2 Rx + GPDMA_WIDTH_BYTE, // UART3 Tx + GPDMA_WIDTH_BYTE, // UART3 Rx + GPDMA_WIDTH_WORD, // MAT0.0 + GPDMA_WIDTH_WORD, // MAT0.1 + GPDMA_WIDTH_WORD, // MAT1.0 + GPDMA_WIDTH_WORD, // MAT1.1 + GPDMA_WIDTH_WORD, // MAT2.0 + GPDMA_WIDTH_WORD, // MAT2.1 + GPDMA_WIDTH_WORD, // MAT3.0 + GPDMA_WIDTH_WORD // MAT3.1 +}; + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup GPDMA_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize GPDMA controller + * @param None + * @return None + *********************************************************************/ +void GPDMA_Init(void) +{ + /* Enable GPDMA clock */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCGPDMA, ENABLE); + + // Reset all channel configuration register + LPC_GPDMACH0->DMACCConfig = 0; + LPC_GPDMACH1->DMACCConfig = 0; + LPC_GPDMACH2->DMACCConfig = 0; + LPC_GPDMACH3->DMACCConfig = 0; + LPC_GPDMACH4->DMACCConfig = 0; + LPC_GPDMACH5->DMACCConfig = 0; + LPC_GPDMACH6->DMACCConfig = 0; + LPC_GPDMACH7->DMACCConfig = 0; + + /* Clear all DMA interrupt and error flag */ + LPC_GPDMA->DMACIntTCClear = 0xFF; + LPC_GPDMA->DMACIntErrClr = 0xFF; +} + +/********************************************************************//** + * @brief Setup GPDMA channel peripheral according to the specified + * parameters in the GPDMAChannelConfig. + * @param[in] GPDMAChannelConfig Pointer to a GPDMA_CH_CFG_Type + * structure that contains the configuration + * information for the specified GPDMA channel peripheral. + * @return ERROR if selected channel is enabled before + * or SUCCESS if channel is configured successfully + *********************************************************************/ +Status GPDMA_Setup(GPDMA_Channel_CFG_Type *GPDMAChannelConfig) +{ + LPC_GPDMACH_TypeDef *pDMAch; + uint32_t tmp1, tmp2; + + if (LPC_GPDMA->DMACEnbldChns & (GPDMA_DMACEnbldChns_Ch(GPDMAChannelConfig->ChannelNum))) { + // This channel is enabled, return ERROR, need to release this channel first + return ERROR; + } + + // Get Channel pointer + pDMAch = (LPC_GPDMACH_TypeDef *) pGPDMACh[GPDMAChannelConfig->ChannelNum]; + + // Reset the Interrupt status + LPC_GPDMA->DMACIntTCClear = GPDMA_DMACIntTCClear_Ch(GPDMAChannelConfig->ChannelNum); + LPC_GPDMA->DMACIntErrClr = GPDMA_DMACIntErrClr_Ch(GPDMAChannelConfig->ChannelNum); + + // Clear DMA configure + pDMAch->DMACCControl = 0x00; + pDMAch->DMACCConfig = 0x00; + + /* Assign Linker List Item value */ + pDMAch->DMACCLLI = GPDMAChannelConfig->DMALLI; + + /* Set value to Channel Control Registers */ + switch (GPDMAChannelConfig->TransferType) + { + // Memory to memory + case GPDMA_TRANSFERTYPE_M2M: + // Assign physical source and destination address + pDMAch->DMACCSrcAddr = GPDMAChannelConfig->SrcMemAddr; + pDMAch->DMACCDestAddr = GPDMAChannelConfig->DstMemAddr; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize(GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize(GPDMA_BSIZE_32) \ + | GPDMA_DMACCxControl_DBSize(GPDMA_BSIZE_32) \ + | GPDMA_DMACCxControl_SWidth(GPDMAChannelConfig->TransferWidth) \ + | GPDMA_DMACCxControl_DWidth(GPDMAChannelConfig->TransferWidth) \ + | GPDMA_DMACCxControl_SI \ + | GPDMA_DMACCxControl_DI \ + | GPDMA_DMACCxControl_I; + break; + // Memory to peripheral + case GPDMA_TRANSFERTYPE_M2P: + // Assign physical source + pDMAch->DMACCSrcAddr = GPDMAChannelConfig->SrcMemAddr; + // Assign peripheral destination address + pDMAch->DMACCDestAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->DstConn]; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SI \ + | GPDMA_DMACCxControl_I; + break; + // Peripheral to memory + case GPDMA_TRANSFERTYPE_P2M: + // Assign peripheral source address + pDMAch->DMACCSrcAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->SrcConn]; + // Assign memory destination address + pDMAch->DMACCDestAddr = GPDMAChannelConfig->DstMemAddr; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DI \ + | GPDMA_DMACCxControl_I; + break; + // Peripheral to peripheral + case GPDMA_TRANSFERTYPE_P2P: + // Assign peripheral source address + pDMAch->DMACCSrcAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->SrcConn]; + // Assign peripheral destination address + pDMAch->DMACCDestAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->DstConn]; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_I; + break; + // Do not support any more transfer type, return ERROR + default: + return ERROR; + } + + /* Re-Configure DMA Request Select for source peripheral */ + if (GPDMAChannelConfig->SrcConn > 15) + { + LPC_SC->DMAREQSEL |= (1<<(GPDMAChannelConfig->SrcConn - 16)); + } else { + LPC_SC->DMAREQSEL &= ~(1<<(GPDMAChannelConfig->SrcConn - 8)); + } + + /* Re-Configure DMA Request Select for Destination peripheral */ + if (GPDMAChannelConfig->DstConn > 15) + { + LPC_SC->DMAREQSEL |= (1<<(GPDMAChannelConfig->DstConn - 16)); + } else { + LPC_SC->DMAREQSEL &= ~(1<<(GPDMAChannelConfig->DstConn - 8)); + } + + /* Enable DMA channels, little endian */ + LPC_GPDMA->DMACConfig = GPDMA_DMACConfig_E; + while (!(LPC_GPDMA->DMACConfig & GPDMA_DMACConfig_E)); + + // Calculate absolute value for Connection number + tmp1 = GPDMAChannelConfig->SrcConn; + tmp1 = ((tmp1 > 15) ? (tmp1 - 8) : tmp1); + tmp2 = GPDMAChannelConfig->DstConn; + tmp2 = ((tmp2 > 15) ? (tmp2 - 8) : tmp2); + + // Configure DMA Channel, enable Error Counter and Terminate counter + pDMAch->DMACCConfig = GPDMA_DMACCxConfig_IE | GPDMA_DMACCxConfig_ITC /*| GPDMA_DMACCxConfig_E*/ \ + | GPDMA_DMACCxConfig_TransferType((uint32_t)GPDMAChannelConfig->TransferType) \ + | GPDMA_DMACCxConfig_SrcPeripheral(tmp1) \ + | GPDMA_DMACCxConfig_DestPeripheral(tmp2); + + return SUCCESS; +} + + +/*********************************************************************//** + * @brief Enable/Disable DMA channel + * @param[in] channelNum GPDMA channel, should be in range from 0 to 7 + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void GPDMA_ChannelCmd(uint8_t channelNum, FunctionalState NewState) +{ + LPC_GPDMACH_TypeDef *pDMAch; + + // Get Channel pointer + pDMAch = (LPC_GPDMACH_TypeDef *) pGPDMACh[channelNum]; + + if (NewState == ENABLE) { + pDMAch->DMACCConfig |= GPDMA_DMACCxConfig_E; + } else { + pDMAch->DMACCConfig &= ~GPDMA_DMACCxConfig_E; + } +} +/*********************************************************************//** + * @brief Check if corresponding channel does have an active interrupt + * request or not + * @param[in] type type of status, should be: + * - GPDMA_STAT_INT: GPDMA Interrupt Status + * - GPDMA_STAT_INTTC: GPDMA Interrupt Terminal Count Request Status + * - GPDMA_STAT_INTERR: GPDMA Interrupt Error Status + * - GPDMA_STAT_RAWINTTC: GPDMA Raw Interrupt Terminal Count Status + * - GPDMA_STAT_RAWINTERR: GPDMA Raw Error Interrupt Status + * - GPDMA_STAT_ENABLED_CH:GPDMA Enabled Channel Status + * @param[in] channel GPDMA channel, should be in range from 0 to 7 + * @return IntStatus status of DMA channel interrupt after masking + * Should be: + * - SET: the corresponding channel has no active interrupt request + * - RESET: the corresponding channel does have an active interrupt request + **********************************************************************/ +IntStatus GPDMA_IntGetStatus(GPDMA_Status_Type type, uint8_t channel) +{ + CHECK_PARAM(PARAM_GPDMA_STAT(type)); + CHECK_PARAM(PARAM_GPDMA_CHANNEL(channel)); + + switch (type) + { + case GPDMA_STAT_INT: //check status of DMA channel interrupts + if (LPC_GPDMA->DMACIntStat & (GPDMA_DMACIntStat_Ch(channel))) + return SET; + return RESET; + case GPDMA_STAT_INTTC: // check terminal count interrupt request status for DMA + if (LPC_GPDMA->DMACIntTCStat & GPDMA_DMACIntTCStat_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_INTERR: //check interrupt status for DMA channels + if (LPC_GPDMA->DMACIntErrStat & GPDMA_DMACIntTCClear_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_RAWINTTC: //check status of the terminal count interrupt for DMA channels + if (LPC_GPDMA->DMACRawIntErrStat & GPDMA_DMACRawIntTCStat_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_RAWINTERR: //check status of the error interrupt for DMA channels + if (LPC_GPDMA->DMACRawIntTCStat & GPDMA_DMACRawIntErrStat_Ch(channel)) + return SET; + return RESET; + default: //check enable status for DMA channels + if (LPC_GPDMA->DMACEnbldChns & GPDMA_DMACEnbldChns_Ch(channel)) + return SET; + return RESET; + } +} + +/*********************************************************************//** + * @brief Clear one or more interrupt requests on DMA channels + * @param[in] type type of interrupt request, should be: + * - GPDMA_STATCLR_INTTC: GPDMA Interrupt Terminal Count Request Clear + * - GPDMA_STATCLR_INTERR: GPDMA Interrupt Error Clear + * @param[in] channel GPDMA channel, should be in range from 0 to 7 + * @return None + **********************************************************************/ +void GPDMA_ClearIntPending(GPDMA_StateClear_Type type, uint8_t channel) +{ + CHECK_PARAM(PARAM_GPDMA_STATCLR(type)); + CHECK_PARAM(PARAM_GPDMA_CHANNEL(channel)); + + if (type == GPDMA_STATCLR_INTTC) // clears the terminal count interrupt request on DMA channel + LPC_GPDMA->DMACIntTCClear = GPDMA_DMACIntTCClear_Ch(channel); + else // clear the error interrupt request + LPC_GPDMA->DMACIntErrClr = GPDMA_DMACIntErrClr_Ch(channel); +} + +/** + * @} + */ + +#endif /* _GPDMA */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c new file mode 100644 index 0000000000..8f0cd3953a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c @@ -0,0 +1,762 @@ +/********************************************************************** +* $Id$ lpc17xx_gpio.c 2010-05-21 +*//** +* @file lpc17xx_gpio.c +* @brief Contains all functions support for GPIO firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup GPIO + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_gpio.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _GPIO + +/* Private Functions ---------------------------------------------------------- */ + +static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum); +static GPIO_HalfWord_TypeDef *FIO_HalfWordGetPointer(uint8_t portNum); +static GPIO_Byte_TypeDef *FIO_ByteGetPointer(uint8_t portNum); + +/*********************************************************************//** + * @brief Get pointer to GPIO peripheral due to GPIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to GPIO peripheral + **********************************************************************/ +static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum) +{ + LPC_GPIO_TypeDef *pGPIO = NULL; + + switch (portNum) { + case 0: + pGPIO = LPC_GPIO0; + break; + case 1: + pGPIO = LPC_GPIO1; + break; + case 2: + pGPIO = LPC_GPIO2; + break; + case 3: + pGPIO = LPC_GPIO3; + break; + case 4: + pGPIO = LPC_GPIO4; + break; + default: + break; + } + + return pGPIO; +} + +/*********************************************************************//** + * @brief Get pointer to FIO peripheral in halfword accessible style + * due to FIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to FIO peripheral + **********************************************************************/ +static GPIO_HalfWord_TypeDef *FIO_HalfWordGetPointer(uint8_t portNum) +{ + GPIO_HalfWord_TypeDef *pFIO = NULL; + + switch (portNum) { + case 0: + pFIO = GPIO0_HalfWord; + break; + case 1: + pFIO = GPIO1_HalfWord; + break; + case 2: + pFIO = GPIO2_HalfWord; + break; + case 3: + pFIO = GPIO3_HalfWord; + break; + case 4: + pFIO = GPIO4_HalfWord; + break; + default: + break; + } + + return pFIO; +} + +/*********************************************************************//** + * @brief Get pointer to FIO peripheral in byte accessible style + * due to FIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to FIO peripheral + **********************************************************************/ +static GPIO_Byte_TypeDef *FIO_ByteGetPointer(uint8_t portNum) +{ + GPIO_Byte_TypeDef *pFIO = NULL; + + switch (portNum) { + case 0: + pFIO = GPIO0_Byte; + break; + case 1: + pFIO = GPIO1_Byte; + break; + case 2: + pFIO = GPIO2_Byte; + break; + case 3: + pFIO = GPIO3_Byte; + break; + case 4: + pFIO = GPIO4_Byte; + break; + default: + break; + } + + return pFIO; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup GPIO_Public_Functions + * @{ + */ + + +/* GPIO ------------------------------------------------------------------------------ */ + +/*********************************************************************//** + * @brief Set Direction for GPIO port. + * @param[in] portNum Port Number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits to set direction, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to set direction for bit 0 and bit 1. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + // Enable Output + if (dir) { + pGPIO->FIODIR |= bitValue; + } + // Enable Input + else { + pGPIO->FIODIR &= ~bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Set Value for bits that have output direction on GPIO port. + * @param[in] portNum Port number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits on GPIO to set, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to set bit 0 and bit 1. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_SetValue(uint8_t portNum, uint32_t bitValue) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + pGPIO->FIOSET = bitValue; + } +} + +/*********************************************************************//** + * @brief Clear Value for bits that have output direction on GPIO port. + * @param[in] portNum Port number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits on GPIO to clear, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to clear bit 0 and bit 1. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + pGPIO->FIOCLR = bitValue; + } +} + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * @param[in] portNum Port number to read value, in range from 0 to 4 + * @return Current value of GPIO port. + * + * Note: Return value contain state of each port pin (bit) on that GPIO regardless + * its direction is input or output. + **********************************************************************/ +uint32_t GPIO_ReadValue(uint8_t portNum) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + return pGPIO->FIOPIN; + } + + return (0); +} + +/*********************************************************************//** + * @brief Enable GPIO interrupt (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] bitValue Value that contains all bits on GPIO to enable, + * in range from 0 to 0xFFFFFFFF. + * @param[in] edgeState state of edge, should be: + * - 0: Rising edge + * - 1: Falling edge + * @return None + **********************************************************************/ +void GPIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState) +{ + if((portNum == 0)&&(edgeState == 0)) + LPC_GPIOINT->IO0IntEnR = bitValue; + else if ((portNum == 2)&&(edgeState == 0)) + LPC_GPIOINT->IO2IntEnR = bitValue; + else if ((portNum == 0)&&(edgeState == 1)) + LPC_GPIOINT->IO0IntEnF = bitValue; + else if ((portNum == 2)&&(edgeState == 1)) + LPC_GPIOINT->IO2IntEnF = bitValue; + else + //Error + while(1); +} + +/*********************************************************************//** + * @brief Get GPIO Interrupt Status (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] pinNum Pin number, should be: 0..30(with port 0) and 0..13 + * (with port 2) + * @param[in] edgeState state of edge, should be: + * - 0: Rising edge + * - 1: Falling edge + * @return Bool could be: + * - ENABLE: Interrupt has been generated due to a rising + * edge on P0.0 + * - DISABLE: A rising edge has not been detected on P0.0 + **********************************************************************/ +FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState) +{ + if((portNum == 0) && (edgeState == 0))//Rising Edge + return ((FunctionalState)(((LPC_GPIOINT->IO0IntStatR)>>pinNum)& 0x1)); + else if ((portNum == 2) && (edgeState == 0)) + return ((FunctionalState)(((LPC_GPIOINT->IO2IntStatR)>>pinNum)& 0x1)); + else if ((portNum == 0) && (edgeState == 1))//Falling Edge + return ((FunctionalState)(((LPC_GPIOINT->IO0IntStatF)>>pinNum)& 0x1)); + else if ((portNum == 2) && (edgeState == 1)) + return ((FunctionalState)(((LPC_GPIOINT->IO2IntStatF)>>pinNum)& 0x1)); + else + //Error + while(1); +} +/*********************************************************************//** + * @brief Clear GPIO interrupt (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] bitValue Value that contains all bits on GPIO to enable, + * in range from 0 to 0xFFFFFFFF. + * @return None + **********************************************************************/ +void GPIO_ClearInt(uint8_t portNum, uint32_t bitValue) +{ + if(portNum == 0) + LPC_GPIOINT->IO0IntClr = bitValue; + else if (portNum == 2) + LPC_GPIOINT->IO2IntClr = bitValue; + else + //Invalid portNum + while(1); +} + +/* FIO word accessible ----------------------------------------------------------------- */ +/* Stub function for FIO (word-accessible) style */ + +/** + * @brief The same with GPIO_SetDir() + */ +void FIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir) +{ + GPIO_SetDir(portNum, bitValue, dir); +} + +/** + * @brief The same with GPIO_SetValue() + */ +void FIO_SetValue(uint8_t portNum, uint32_t bitValue) +{ + GPIO_SetValue(portNum, bitValue); +} + +/** + * @brief The same with GPIO_ClearValue() + */ +void FIO_ClearValue(uint8_t portNum, uint32_t bitValue) +{ + GPIO_ClearValue(portNum, bitValue); +} + +/** + * @brief The same with GPIO_ReadValue() + */ +uint32_t FIO_ReadValue(uint8_t portNum) +{ + return (GPIO_ReadValue(portNum)); +} + +/** + * @brief The same with GPIO_IntCmd() + */ +void FIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState) +{ + GPIO_IntCmd(portNum, bitValue, edgeState); +} + +/** + * @brief The same with GPIO_GetIntStatus() + */ +FunctionalState FIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState) +{ + return (GPIO_GetIntStatus(portNum, pinNum, edgeState)); +} + +/** + * @brief The same with GPIO_ClearInt() + */ +void FIO_ClearInt(uint8_t portNum, uint32_t bitValue) +{ + GPIO_ClearInt(portNum, bitValue); +} +/*********************************************************************//** + * @brief Set mask value for bits in FIO port + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFFFFFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_SetMask(uint8_t portNum, uint32_t bitValue, uint8_t maskValue) +{ + LPC_GPIO_TypeDef *pFIO = GPIO_GetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue){ + pFIO->FIOMASK |= bitValue; + } + // Un-mask + else { + pFIO->FIOMASK &= ~bitValue; + } + } +} + + +/* FIO halfword accessible ------------------------------------------------------------- */ + +/*********************************************************************//** + * @brief Set direction for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set direction, + * in range from 0 to 0xFFFF. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordSetDir(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t dir) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Output direction + if (dir) { + // Upper + if(halfwordNum) { + pFIO->FIODIRU |= bitValue; + } + // lower + else { + pFIO->FIODIRL |= bitValue; + } + } + // Input direction + else { + // Upper + if(halfwordNum) { + pFIO->FIODIRU &= ~bitValue; + } + // lower + else { + pFIO->FIODIRL &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set mask value for bits in FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_HalfWordSetMask(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t maskValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue){ + // Upper + if(halfwordNum) { + pFIO->FIOMASKU |= bitValue; + } + // lower + else { + pFIO->FIOMASKL |= bitValue; + } + } + // Un-mask + else { + // Upper + if(halfwordNum) { + pFIO->FIOMASKU &= ~bitValue; + } + // lower + else { + pFIO->FIOMASKL &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set bits for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordSetValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + pFIO->FIOSETU = bitValue; + } + // lower + else { + pFIO->FIOSETL = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Clear bits for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to clear, + * in range from 0 to 0xFFFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordClearValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + pFIO->FIOCLRU = bitValue; + } + // lower + else { + pFIO->FIOCLRL = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * in halfword accessible style. + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @return Current value of FIO port pin of specified halfword. + * Note: Return value contain state of each port pin (bit) on that FIO regardless + * its direction is input or output. + **********************************************************************/ +uint16_t FIO_HalfWordReadValue(uint8_t portNum, uint8_t halfwordNum) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + return (pFIO->FIOPINU); + } + // lower + else { + return (pFIO->FIOPINL); + } + } + return (0); +} + + +/* FIO Byte accessible ------------------------------------------------------------ */ + +/*********************************************************************//** + * @brief Set direction for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set direction, + * in range from 0 to 0xFF. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if(pFIO != NULL) { + // Output direction + if (dir) { + if (byteNum <= 3) { + pFIO->FIODIR[byteNum] |= bitValue; + } + } + // Input direction + else { + if (byteNum <= 3) { + pFIO->FIODIR[byteNum] &= ~bitValue; + } + } + } +} + +/*********************************************************************//** + * @brief Set mask value for bits in FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set mask, + * in range from 0 to 0xFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_ByteSetMask(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t maskValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue) { + if (byteNum <= 3) { + pFIO->FIOMASK[byteNum] |= bitValue; + } + } + // Un-mask + else { + if (byteNum <= 3) { + pFIO->FIOMASK[byteNum] &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set bits for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteSetValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + pFIO->FIOSET[byteNum] = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Clear bits for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to clear, + * in range from 0 to 0xFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteClearValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + pFIO->FIOCLR[byteNum] = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * in byte accessible style. + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @return Current value of FIO port pin of specified byte part. + * Note: Return value contain state of each port pin (bit) on that FIO regardless + * its direction is input or output. + **********************************************************************/ +uint8_t FIO_ByteReadValue(uint8_t portNum, uint8_t byteNum) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + return (pFIO->FIOPIN[byteNum]); + } + } + return (0); +} + +/** + * @} + */ + +#endif /* _GPIO */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c new file mode 100644 index 0000000000..99b29e017c --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c @@ -0,0 +1,1344 @@ +/********************************************************************** +* $Id$ lpc17xx_i2c.c 2011-03-31 +*//** +* @file lpc17xx_i2c.c +* @brief Contains all functions support for I2C firmware +* library on LPC17xx +* @version 2.1 +* @date 31. Mar. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup I2C + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_i2c.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _I2C + + +/* Private Types -------------------------------------------------------------- */ +/** @defgroup I2C_Private_Types I2C Private Types + * @{ + */ + +/** + * @brief I2C device configuration structure type + */ +typedef struct +{ + uint32_t txrx_setup; /* Transmission setup */ + int32_t dir; /* Current direction phase, 0 - write, 1 - read */ +} I2C_CFG_T; + +/** + * @} + */ + +/* Private Variables ---------------------------------------------------------- */ +/** + * @brief II2C driver data for I2C0, I2C1 and I2C2 + */ +static I2C_CFG_T i2cdat[3]; + +static uint32_t I2C_MasterComplete[3]; +static uint32_t I2C_SlaveComplete[3]; + +static uint32_t I2C_MonitorBufferIndex; + +/* Private Functions ---------------------------------------------------------- */ + +/* Get I2C number */ +static int32_t I2C_getNum(LPC_I2C_TypeDef *I2Cx); + +/* Generate a start condition on I2C bus (in master mode only) */ +static uint32_t I2C_Start (LPC_I2C_TypeDef *I2Cx); + +/* Generate a stop condition on I2C bus (in master mode only) */ +static void I2C_Stop (LPC_I2C_TypeDef *I2Cx); + +/* I2C send byte subroutine */ +static uint32_t I2C_SendByte (LPC_I2C_TypeDef *I2Cx, uint8_t databyte); + +/* I2C get byte subroutine */ +static uint32_t I2C_GetByte (LPC_I2C_TypeDef *I2Cx, uint8_t *retdat, Bool ack); + +/* I2C set clock (hz) */ +static void I2C_SetClock (LPC_I2C_TypeDef *I2Cx, uint32_t target_clock); + +/*--------------------------------------------------------------------------------*/ +/********************************************************************//** + * @brief Convert from I2C peripheral to number + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return I2C number, could be: 0..2 + *********************************************************************/ +static int32_t I2C_getNum(LPC_I2C_TypeDef *I2Cx){ + if (I2Cx == LPC_I2C0) { + return (0); + } else if (I2Cx == LPC_I2C1) { + return (1); + } else if (I2Cx == LPC_I2C2) { + return (2); + } + return (-1); +} + +/********************************************************************//** + * @brief Generate a start condition on I2C bus (in master mode only) + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return value of I2C status register after generate a start condition + *********************************************************************/ +static uint32_t I2C_Start (LPC_I2C_TypeDef *I2Cx) +{ + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/********************************************************************//** + * @brief Generate a stop condition on I2C bus (in master mode only) + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + *********************************************************************/ +static void I2C_Stop (LPC_I2C_TypeDef *I2Cx) +{ + + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + { + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + } + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +/********************************************************************//** + * @brief Send a byte + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] databyte: number of byte + * @return value of I2C status register after sending + *********************************************************************/ +static uint32_t I2C_SendByte (LPC_I2C_TypeDef *I2Cx, uint8_t databyte) +{ + uint32_t CodeStatus = I2Cx->I2STAT & I2C_STAT_CODE_BITMASK; + + if((CodeStatus != I2C_I2STAT_M_TX_START) && + (CodeStatus != I2C_I2STAT_M_TX_RESTART) && + (CodeStatus != I2C_I2STAT_M_TX_SLAW_ACK) && + (CodeStatus != I2C_I2STAT_M_TX_DAT_ACK) ) + { + return CodeStatus; + } + + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + { + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + } + I2Cx->I2DAT = databyte & I2C_I2DAT_BITMASK; + + I2Cx->I2CONSET = I2C_I2CONSET_AA; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/********************************************************************//** + * @brief Get a byte + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[out] retdat pointer to return data + * @param[in] ack assert acknowledge or not, should be: TRUE/FALSE + * @return value of I2C status register after sending + *********************************************************************/ +static uint32_t I2C_GetByte (LPC_I2C_TypeDef *I2Cx, uint8_t *retdat, Bool ack) +{ + *retdat = (uint8_t) (I2Cx->I2DAT & I2C_I2DAT_BITMASK); + + if (ack == TRUE) + { + I2Cx->I2CONSET = I2C_I2CONSET_AA; + } + else + { + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + } + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/*********************************************************************//** + * @brief Setup clock rate for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] target_clock : clock of SSP (Hz) + * @return None + ***********************************************************************/ +static void I2C_SetClock (LPC_I2C_TypeDef *I2Cx, uint32_t target_clock) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + // Get PCLK of I2C controller + if (I2Cx == LPC_I2C0) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C0) / target_clock; + } + else if (I2Cx == LPC_I2C1) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C1) / target_clock; + } + else if (I2Cx == LPC_I2C2) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C2) / target_clock; + } + + /* Set the I2C clock value to register */ + I2Cx->I2SCLH = (uint32_t)(temp / 2); + I2Cx->I2SCLL = (uint32_t)(temp - I2Cx->I2SCLH); +} +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup I2C_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the I2Cx peripheral with specified parameter. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] clockrate Target clock rate value to initialized I2C + * peripheral (Hz) + * @return None + *********************************************************************/ +void I2C_Init(LPC_I2C_TypeDef *I2Cx, uint32_t clockrate) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + if (I2Cx==LPC_I2C0) + { + /* Set up clock and power for I2C0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C0, ENABLE); + /* As default, peripheral clock for I2C0 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C0, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else if (I2Cx==LPC_I2C1) + { + /* Set up clock and power for I2C1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C1, ENABLE); + /* As default, peripheral clock for I2C1 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C1, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else if (I2Cx==LPC_I2C2) + { + /* Set up clock and power for I2C2 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C2, ENABLE); + /* As default, peripheral clock for I2C2 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C2, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else { + // Up-Support this device + return; + } + + /* Set clock rate */ + I2C_SetClock(I2Cx, clockrate); + /* Set I2C operation to default */ + I2Cx->I2CONCLR = (I2C_I2CONCLR_AAC | I2C_I2CONCLR_STAC | I2C_I2CONCLR_I2ENC); +} + +/*********************************************************************//** + * @brief De-initializes the I2C peripheral registers to their + * default reset values. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_DeInit(LPC_I2C_TypeDef* I2Cx) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + /* Disable I2C control */ + I2Cx->I2CONCLR = I2C_I2CONCLR_I2ENC; + + if (I2Cx==LPC_I2C0) + { + /* Disable power for I2C0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C0, DISABLE); + } + else if (I2Cx==LPC_I2C1) + { + /* Disable power for I2C1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C1, DISABLE); + } + else if (I2Cx==LPC_I2C2) + { + /* Disable power for I2C2 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C2, DISABLE); + } +} + +/*********************************************************************//** + * @brief Enable or disable I2C peripheral's operation + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of I2Cx peripheral's operation + * @return none + **********************************************************************/ +void I2C_Cmd(LPC_I2C_TypeDef* I2Cx, en_I2C_Mode Mode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + if (NewState == ENABLE) + { + if(Mode != I2C_SLAVE_MODE) + I2Cx->I2CONSET = I2C_I2CONSET_I2EN; + else + I2Cx->I2CONSET = I2C_I2CONSET_I2EN | I2C_I2CONSET_AA; + } + else + { + I2Cx->I2CONCLR = I2C_I2CONCLR_I2ENC; + } +} + +/*********************************************************************//** + * @brief Enable/Disable interrupt for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of I2C peripheral interrupt in NVIC core + * should be: + * - ENABLE: enable interrupt for this I2C peripheral + * - DISABLE: disable interrupt for this I2C peripheral + * @return None + **********************************************************************/ +void I2C_IntCmd (LPC_I2C_TypeDef *I2Cx, Bool NewState) +{ + if (NewState) + { + if(I2Cx == LPC_I2C0) + { + NVIC_EnableIRQ(I2C0_IRQn); + } + else if (I2Cx == LPC_I2C1) + { + NVIC_EnableIRQ(I2C1_IRQn); + } + else if (I2Cx == LPC_I2C2) + { + NVIC_EnableIRQ(I2C2_IRQn); + } + } + else + { + if(I2Cx == LPC_I2C0) + { + NVIC_DisableIRQ(I2C0_IRQn); + } + else if (I2Cx == LPC_I2C1) + { + NVIC_DisableIRQ(I2C1_IRQn); + } + else if (I2Cx == LPC_I2C2) + { + NVIC_DisableIRQ(I2C2_IRQn); + } + } + return; +} + + +/*********************************************************************//** + * @brief Handle I2C Master states. + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] CodeStatus I2C state + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @return It can be + * - I2C_OK + * -I2C_BYTE_RECV + * -I2C_BYTE_SENT + * -I2C_SEND_END + * -I2C_RECV_END + * - I2C_ERR + * - I2C_NAK_RECV + **********************************************************************/ +int32_t I2C_MasterHanleStates(LPC_I2C_TypeDef *I2Cx, uint32_t CodeStatus, I2C_M_SETUP_Type *TransferCfg) +{ + uint8_t *txdat; + uint8_t *rxdat; + uint8_t tmp; + int32_t Ret = I2C_OK; + + //get buffer to send/receive + txdat = (uint8_t *) &TransferCfg->tx_data[TransferCfg->tx_count]; + rxdat = (uint8_t *) &TransferCfg->rx_data[TransferCfg->rx_count]; + + switch(CodeStatus) + { + case I2C_I2STAT_M_TX_START: + case I2C_I2STAT_M_TX_RESTART: + //case I2C_I2STAT_M_RX_START: + //case I2C_I2STAT_M_RX_RESTART + // Send data first + if(TransferCfg->tx_count < TransferCfg->tx_length) + { + /* Send slave address + WR direction bit = 0 ----------------------------------- */ + I2C_SendByte(I2Cx, (TransferCfg->sl_addr7bit << 1)); + Ret = I2C_BYTE_SENT; + } + else if (TransferCfg->rx_count < TransferCfg->rx_length) + { + /* Send slave address + RD direction bit = 1 ----------------------------------- */ + I2C_SendByte(I2Cx, ((TransferCfg->sl_addr7bit << 1) | 0x01)); + Ret = I2C_BYTE_SENT; + } + break; + case I2C_I2STAT_M_TX_SLAW_ACK: + case I2C_I2STAT_M_TX_DAT_ACK: + + if(TransferCfg->tx_count < TransferCfg->tx_length) + { + I2C_SendByte(I2Cx, *txdat); + + txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + else + { + I2C_Stop(I2Cx); + + Ret = I2C_SEND_END; + + } + break; + case I2C_I2STAT_M_TX_DAT_NACK: + I2C_Stop(I2Cx); + Ret = I2C_SEND_END; + break; + case I2C_I2STAT_M_RX_ARB_LOST: + //case I2C_I2STAT_M_TX_ARB_LOST: + I2Cx->I2CONSET = I2C_I2CONSET_STA|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + case I2C_I2STAT_M_RX_SLAR_ACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + Ret = I2C_BYTE_RECV; + break; + case I2C_I2STAT_M_RX_DAT_ACK: + if (TransferCfg->rx_count rx_length) + { + if (TransferCfg->rx_count < (TransferCfg->rx_length - 2)) + { + I2C_GetByte(I2Cx, &tmp, TRUE); + + Ret = I2C_BYTE_RECV; + } + else // the next byte is the last byte, send NACK instead. + { + I2C_GetByte(I2Cx, &tmp, FALSE); + Ret = I2C_BYTE_RECV; + } + *rxdat++ = tmp; + + TransferCfg->rx_count++; + } + else + { + Ret = I2C_RECV_END; + } + + break; + case I2C_I2STAT_M_RX_DAT_NACK: + I2C_GetByte(I2Cx, &tmp, FALSE); + *rxdat++ = tmp; + TransferCfg->rx_count++; + I2C_Stop(I2Cx); + Ret = I2C_RECV_END; + break; + case I2C_I2STAT_M_RX_SLAR_NACK: + case I2C_I2STAT_M_TX_SLAW_NACK: + case I2C_I2STAT_BUS_ERROR: + // Send STOP condition + I2C_Stop(I2Cx); + Ret = I2C_ERR; + break; + /* No status information */ + case I2C_I2STAT_NO_INF: + default: + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + } + + return Ret; +} + +/*********************************************************************//** + * @brief Handle I2C Slave states. + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] CodeStatus I2C state + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @return It can be + * - I2C_OK + * -I2C_BYTE_RECV + * -I2C_BYTE_SENT + * -I2C_SEND_END + * -I2C_RECV_END + * - I2C_ERR + * - I2C_NAK_RECV + **********************************************************************/ +int32_t I2C_SlaveHanleStates(LPC_I2C_TypeDef *I2Cx, uint32_t CodeStatus, I2C_S_SETUP_Type *TransferCfg) +{ + + int32_t Ret = I2C_OK; + uint8_t *txdat; + uint8_t *rxdat; + + //get buffer to send/receive + txdat = (uint8_t *) &TransferCfg->tx_data[TransferCfg->tx_count]; + rxdat = (uint8_t *) &TransferCfg->rx_data[TransferCfg->rx_count]; + + switch (CodeStatus) + { + /* Reading phase -------------------------------------------------------- */ + /* Own SLA+R has been received, ACK has been returned */ + case I2C_I2STAT_S_RX_SLAW_ACK: + + /* General call address has been received, ACK has been returned */ + case I2C_I2STAT_S_RX_GENCALL_ACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Arbitration has been lost in Slave Address + R/W bit as bus Master. General Call has + been received and ACK has been returned.*/ + case I2C_I2STAT_S_RX_ARB_LOST_M_GENCALL: + I2Cx->I2CONSET = I2C_I2CONSET_AA|I2C_I2CONSET_STA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Previously addressed with own SLA; + * DATA byte has been received; + * ACK has been returned */ + case I2C_I2STAT_S_RX_ARB_LOST_M_SLA: + case I2C_I2STAT_S_RX_PRE_SLA_DAT_ACK: + + /* + * All data bytes that over-flow the specified receive + * data length, just ignore them. + */ + if ((TransferCfg->rx_count < TransferCfg->rx_length) && (TransferCfg->rx_data != NULL)) + { + *rxdat++ = (uint8_t)I2Cx->I2DAT; + + TransferCfg->rx_count++; + + Ret = I2C_BYTE_RECV; + } + if(TransferCfg->rx_count == (TransferCfg->rx_length) ) { + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC|I2C_I2CONCLR_SIC; + Ret = I2C_BYTE_RECV; + } + else { + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + } + + break; + /* DATA has been received, Only the first data byte will be received with ACK. Additional + data will be received with NOT ACK. */ + case I2C_I2STAT_S_RX_PRE_GENCALL_DAT_ACK: + if ((TransferCfg->rx_count < TransferCfg->rx_length) && (TransferCfg->rx_data != NULL)) + { + *rxdat++ = (uint8_t)I2Cx->I2DAT; + + TransferCfg->rx_count++; + + Ret = I2C_BYTE_RECV; + } + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC|I2C_I2CONCLR_SIC; + break; + + /* Writing phase -------------------------------------------------------- */ + /* Own SLA+R has been received, ACK has been returned */ + case I2C_I2STAT_S_TX_SLAR_ACK: + + /* Data has been transmitted, ACK has been received */ + case I2C_I2STAT_S_TX_DAT_ACK: + /* + * All data bytes that over-flow the specified receive + * data length, just ignore them. + */ + if ((TransferCfg->tx_count < TransferCfg->tx_length) && (TransferCfg->tx_data != NULL)) + { + I2Cx->I2DAT = *txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Arbitration lost in Slave Address and R/W bit as bus Master. Own Slave Address + Read + has been received, ACK has been returned. */ + case I2C_I2STAT_S_TX_ARB_LOST_M_SLA: + if ((TransferCfg->tx_count < TransferCfg->tx_length) && (TransferCfg->tx_data != NULL)) + { + I2Cx->I2DAT = *txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + I2Cx->I2CONSET = I2C_I2CONSET_AA|I2C_I2CONSET_STA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + + case I2C_I2STAT_S_TX_LAST_DAT_ACK: + /* Data has been transmitted, NACK has been received, + * that means there's no more data to send, exit now */ + /* + * Note: Don't wait for stop event since in slave transmit mode, + * since there no proof lets us know when a stop signal has been received + * on slave side. + */ + case I2C_I2STAT_S_TX_DAT_NACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_SEND_END; + break; + + /* Previously addressed with own SLA; + * DATA byte has been received; + * NOT ACK has been returned */ + case I2C_I2STAT_S_RX_PRE_SLA_DAT_NACK: + + /* DATA has been received, NOT ACK has been returned */ + case I2C_I2STAT_S_RX_PRE_GENCALL_DAT_NACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_RECV_END; + break; + + /* + * Note that: Return code only let us know a stop condition mixed + * with a repeat start condition in the same code value. + * So we should provide a time-out. In case this is really a stop + * condition, this will return back after time out condition. Otherwise, + * next session that is slave receive data will be completed. + */ + + /* A Stop or a repeat start condition */ + case I2C_I2STAT_S_RX_STA_STO_SLVREC_SLVTRX: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_STA_STO_RECV; + break; + + /* No status information */ + case I2C_I2STAT_NO_INF: + /* Other status must be captured */ + default: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + + } + + return Ret; +} +/*********************************************************************//** + * @brief General Master Interrupt handler for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_MasterHandler(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t i2cId = I2C_getNum(I2Cx); + uint8_t returnCode; + I2C_M_SETUP_Type *txrx_setup; + int32_t Ret = I2C_OK; + + txrx_setup = (I2C_M_SETUP_Type *) i2cdat[i2cId].txrx_setup; + + returnCode = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + + // Save current status + txrx_setup->status = returnCode; + + Ret = I2C_MasterHanleStates(I2Cx, returnCode, txrx_setup); + + if(I2C_CheckError(Ret)) + { + if(txrx_setup->retransmissions_count < txrx_setup->retransmissions_max) + { + // Retry + txrx_setup->retransmissions_count ++; + txrx_setup->tx_count = 0; + txrx_setup->rx_count = 0; + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + return; + } + else + { + goto s_int_end; + } + } + else if (Ret & I2C_SEND_END) + { + // If no need to wait for data from Slave + if(txrx_setup->rx_count >= (txrx_setup->rx_length)) + { + goto s_int_end; + } + else // Start to wait for data from Slave + { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + return; + } + } + else if (Ret & I2C_RECV_END) + { + goto s_int_end; + } + else + { + return; + } + +s_int_end: + // Disable interrupt + I2C_IntCmd(I2Cx, FALSE); + + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC | I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + + I2C_MasterComplete[i2cId] = TRUE; + +} + + +/*********************************************************************//** + * @brief General Slave Interrupt handler for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_SlaveHandler (LPC_I2C_TypeDef *I2Cx) +{ + uint32_t i2cId = I2C_getNum(I2Cx); + uint8_t returnCode; + I2C_S_SETUP_Type *txrx_setup; + uint32_t timeout; + int32_t Ret = I2C_OK; + + txrx_setup = (I2C_S_SETUP_Type *) i2cdat[i2cId].txrx_setup; + +handle_state: + + returnCode = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + // Save current status + txrx_setup->status = returnCode; + + + Ret = I2C_SlaveHanleStates(I2Cx, returnCode, txrx_setup); + + if(I2C_CheckError(Ret)) + { + goto s_int_end; + } + else if (Ret & I2C_STA_STO_RECV) + { + // Temporally lock the interrupt for timeout condition + I2C_IntCmd(I2Cx, FALSE); + // enable time out + timeout = I2C_SLAVE_TIME_OUT; + while(1) + { + if (I2Cx->I2CONSET & I2C_I2CONSET_SI) + { + // re-Enable interrupt + I2C_IntCmd(I2Cx, TRUE); + goto handle_state; + } + else + { + timeout--; + if (timeout == 0) + { + // timeout occur, it's really a stop condition + txrx_setup->status |= I2C_SETUP_STATUS_DONE; + goto s_int_end; + } + } + } + } + else if(Ret &I2C_SEND_END) + { + goto s_int_end; + } + else + { + return; + } + +s_int_end: + // Disable interrupt + I2C_IntCmd(I2Cx, FALSE); + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC | I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + + I2C_SlaveComplete[i2cId] = TRUE; +} + +/*********************************************************************//** + * @brief Transmit and Receive data in master mode + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] TransferCfg Pointer to a I2C_M_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @param[in] Opt a I2C_TRANSFER_OPT_Type type that selected for + * interrupt or polling mode. + * @return SUCCESS or ERROR + * + * Note: + * - In case of using I2C to transmit data only, either transmit length set to 0 + * or transmit data pointer set to NULL. + * - In case of using I2C to receive data only, either receive length set to 0 + * or receive data pointer set to NULL. + * - In case of using I2C to transmit followed by receive data, transmit length, + * transmit data pointer, receive length and receive data pointer should be set + * corresponding. + **********************************************************************/ +Status I2C_MasterTransferData(LPC_I2C_TypeDef *I2Cx, I2C_M_SETUP_Type *TransferCfg, \ + I2C_TRANSFER_OPT_Type Opt) +{ + uint32_t i2cId = I2C_getNum(I2Cx); uint32_t CodeStatus; + int32_t Ret = I2C_OK; + + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + TransferCfg->status = 0; + + if (Opt == I2C_TRANSFER_POLLING) + { + /* First Start condition -------------------------------------------------------------- */ + TransferCfg->retransmissions_count = 0; +retry: + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + + // Start command + CodeStatus = I2C_Start(I2Cx); + + while(1) // send data first and then receive data from Slave. + { + Ret = I2C_MasterHanleStates(I2Cx, CodeStatus, TransferCfg); + if(I2C_CheckError(Ret)) + { + TransferCfg->retransmissions_count++; + if (TransferCfg->retransmissions_count > TransferCfg->retransmissions_max){ + // save status + TransferCfg->status = CodeStatus | I2C_SETUP_STATUS_NOACKF; + goto error; + } else { + goto retry; + } + } + else if( (Ret & I2C_BYTE_SENT) || + (Ret & I2C_BYTE_RECV)) + { + // Wait for sending ends + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + } + else if (Ret & I2C_SEND_END) // already send all data + { + // If no need to wait for data from Slave + if(TransferCfg->rx_count >= (TransferCfg->rx_length)) + { + break; + } + else + { + I2C_Start(I2Cx); + } + } + else if (Ret & I2C_RECV_END) // already receive all data + { + break; + } + CodeStatus = I2Cx->I2STAT & I2C_STAT_CODE_BITMASK; + } + return SUCCESS; +error: + return ERROR; + } + + else if (Opt == I2C_TRANSFER_INTERRUPT) + { + // Setup tx_rx data, callback and interrupt handler + i2cdat[i2cId].txrx_setup = (uint32_t) TransferCfg; + + // Set direction phase, write first + i2cdat[i2cId].dir = 0; + + /* First Start condition -------------------------------------------------------------- */ + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + I2C_IntCmd(I2Cx, TRUE); + + return (SUCCESS); + } + + return ERROR; +} + +/*********************************************************************//** + * @brief Receive and Transmit data in slave mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @param[in] Opt I2C_TRANSFER_OPT_Type type that selected for + * interrupt or polling mode. + * @return SUCCESS or ERROR + * + * Note: + * The mode of slave's operation depends on the command sent from master on + * the I2C bus. If the master send a SLA+W command, this sub-routine will + * use receive data length and receive data pointer. If the master send a SLA+R + * command, this sub-routine will use transmit data length and transmit data + * pointer. + * If the master issue an repeat start command or a stop command, the slave will + * enable an time out condition, during time out condition, if there's no activity + * on I2C bus, the slave will exit, otherwise (i.e. the master send a SLA+R/W), + * the slave then switch to relevant operation mode. The time out should be used + * because the return status code can not show difference from stop and repeat + * start command in slave operation. + * In case of the expected data length from master is greater than data length + * that slave can support: + * - In case of reading operation (from master): slave will return I2C_I2DAT_IDLE_CHAR + * value. + * - In case of writing operation (from master): slave will ignore remain data from master. + **********************************************************************/ +Status I2C_SlaveTransferData(LPC_I2C_TypeDef *I2Cx, I2C_S_SETUP_Type *TransferCfg, \ + I2C_TRANSFER_OPT_Type Opt) +{ + int32_t Ret = I2C_OK; + + uint32_t CodeStatus; + uint32_t timeout; + int32_t time_en; + uint32_t i2cId = I2C_getNum(I2Cx); + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + TransferCfg->status = 0; + + // Polling option + if (Opt == I2C_TRANSFER_POLLING) + { + /* Set AA bit to ACK command on I2C bus */ + I2Cx->I2CONSET = I2C_I2CONSET_AA; + + /* Clear SI bit to be ready ... */ + I2Cx->I2CONCLR = (I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC|I2C_I2CONCLR_STOC); + + time_en = 0; + timeout = 0; + + while (1) + { + /* Check SI flag ready */ + if (I2Cx->I2CONSET & I2C_I2CONSET_SI) + { + time_en = 0; + + CodeStatus = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + + Ret = I2C_SlaveHanleStates(I2Cx, CodeStatus, TransferCfg); + if(I2C_CheckError(Ret)) + { + goto s_error; + } + else if(Ret & I2C_STA_STO_RECV) + { + time_en = 1; + timeout = 0; + } + else if (Ret & I2C_SEND_END) + { + goto s_end_stage; + } + } + else if (time_en) + { + if (timeout++ > I2C_SLAVE_TIME_OUT) + { + // it's really a stop condition, goto end stage + goto s_end_stage; + } + } + } + +s_end_stage: + /* Clear AA bit to disable ACK on I2C bus */ + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + + // Check if there's no error during operation + // Update status + TransferCfg->status = CodeStatus | I2C_SETUP_STATUS_DONE; + return SUCCESS; + +s_error: + /* Clear AA bit to disable ACK on I2C bus */ + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + + // Update status + TransferCfg->status = CodeStatus; + return ERROR; + } + + else if (Opt == I2C_TRANSFER_INTERRUPT) + { + // Setup tx_rx data, callback and interrupt handler + i2cdat[i2cId].txrx_setup = (uint32_t) TransferCfg; + + // Set direction phase, read first + i2cdat[i2cId].dir = 1; + + // Enable AA + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + I2C_IntCmd(I2Cx, TRUE); + + return (SUCCESS); + } + + return ERROR; +} + +/*********************************************************************//** + * @brief Set Own slave address in I2C peripheral corresponding to + * parameter specified in OwnSlaveAddrConfigStruct. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] OwnSlaveAddrConfigStruct Pointer to a I2C_OWNSLAVEADDR_CFG_Type + * structure that contains the configuration information for the +* specified I2C slave address. + * @return None + **********************************************************************/ +void I2C_SetOwnSlaveAddr(LPC_I2C_TypeDef *I2Cx, I2C_OWNSLAVEADDR_CFG_Type *OwnSlaveAddrConfigStruct) +{ + uint32_t tmp; + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_I2C_SLAVEADDR_CH(OwnSlaveAddrConfigStruct->SlaveAddrChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(OwnSlaveAddrConfigStruct->GeneralCallState)); + + tmp = (((uint32_t)(OwnSlaveAddrConfigStruct->SlaveAddr_7bit << 1)) \ + | ((OwnSlaveAddrConfigStruct->GeneralCallState == ENABLE) ? 0x01 : 0x00))& I2C_I2ADR_BITMASK; + switch (OwnSlaveAddrConfigStruct->SlaveAddrChannel) + { + case 0: + I2Cx->I2ADR0 = tmp; + I2Cx->I2MASK0 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 1: + I2Cx->I2ADR1 = tmp; + I2Cx->I2MASK1 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 2: + I2Cx->I2ADR2 = tmp; + I2Cx->I2MASK2 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 3: + I2Cx->I2ADR3 = tmp; + I2Cx->I2MASK3 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + } +} + + +/*********************************************************************//** + * @brief Configures functionality in I2C monitor mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] MonitorCfgType Monitor Configuration type, should be: + * - I2C_MONITOR_CFG_SCL_OUTPUT: I2C module can 'stretch' + * the clock line (hold it low) until it has had time to + * respond to an I2C interrupt. + * - I2C_MONITOR_CFG_MATCHALL: When this bit is set to '1' + * and the I2C is in monitor mode, an interrupt will be + * generated on ANY address received. + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return None + **********************************************************************/ +void I2C_MonitorModeConfig(LPC_I2C_TypeDef *I2Cx, uint32_t MonitorCfgType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_I2C_MONITOR_CFG(MonitorCfgType)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + I2Cx->MMCTRL |= MonitorCfgType; + } + else + { + I2Cx->MMCTRL &= (~MonitorCfgType) & I2C_I2MMCTRL_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable I2C monitor mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable monitor mode. + * - DISABLE: Disable monitor mode. + * @return None + **********************************************************************/ +void I2C_MonitorModeCmd(LPC_I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + I2Cx->MMCTRL |= I2C_I2MMCTRL_MM_ENA; + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + } + else + { + I2Cx->MMCTRL &= (~I2C_I2MMCTRL_MM_ENA) & I2C_I2MMCTRL_BITMASK; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC | I2C_I2CONCLR_AAC; + } + I2C_MonitorBufferIndex = 0; +} + + +/*********************************************************************//** + * @brief Get data from I2C data buffer in monitor mode. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + * Note: In monitor mode, the I2C module may lose the ability to stretch + * the clock (stall the bus) if the ENA_SCL bit is not set. This means that + * the processor will have a limited amount of time to read the contents of + * the data received on the bus. If the processor reads the I2DAT shift + * register, as it ordinarily would, it could have only one bit-time to + * respond to the interrupt before the received data is overwritten by + * new data. + **********************************************************************/ +uint8_t I2C_MonitorGetDatabuffer(LPC_I2C_TypeDef *I2Cx) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + return ((uint8_t)(I2Cx->I2DATA_BUFFER)); +} + +/*********************************************************************//** + * @brief Get data from I2C data buffer in monitor mode. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + * Note: In monitor mode, the I2C module may lose the ability to stretch + * the clock (stall the bus) if the ENA_SCL bit is not set. This means that + * the processor will have a limited amount of time to read the contents of + * the data received on the bus. If the processor reads the I2DAT shift + * register, as it ordinarily would, it could have only one bit-time to + * respond to the interrupt before the received data is overwritten by + * new data. + **********************************************************************/ +BOOL_8 I2C_MonitorHandler(LPC_I2C_TypeDef *I2Cx, uint8_t *buffer, uint32_t size) +{ + BOOL_8 ret=FALSE; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + buffer[I2C_MonitorBufferIndex] = (uint8_t)(I2Cx->I2DATA_BUFFER); + I2C_MonitorBufferIndex++; + if(I2C_MonitorBufferIndex >= size) + { + ret = TRUE; + } + return ret; +} +/*********************************************************************//** + * @brief Get status of Master Transfer + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return Master transfer status, could be: + * - TRUE master transfer completed + * - FALSE master transfer have not completed yet + **********************************************************************/ +uint32_t I2C_MasterTransferComplete(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t retval, tmp; + tmp = I2C_getNum(I2Cx); + retval = I2C_MasterComplete[tmp]; + I2C_MasterComplete[tmp] = FALSE; + return retval; +} + +/*********************************************************************//** + * @brief Get status of Slave Transfer + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return Complete status, could be: TRUE/FALSE + **********************************************************************/ +uint32_t I2C_SlaveTransferComplete(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t retval, tmp; + tmp = I2C_getNum(I2Cx); + retval = I2C_SlaveComplete[tmp]; + I2C_SlaveComplete[tmp] = FALSE; + return retval; +} + + + +/** + * @} + */ + +#endif /* _I2C */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c new file mode 100644 index 0000000000..f57fd2f1be --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c @@ -0,0 +1,663 @@ +/********************************************************************** +* $Id$ lpc17xx_i2s.c 2010-09-23 +*//** +* @file lpc17xx_i2s.c +* @brief Contains all functions support for I2S firmware +* library on LPC17xx +* @version 3.1 +* @date 23. Sep. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup I2S + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_i2s.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _I2S + +/* Private Functions ---------------------------------------------------------- */ + +static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode); +static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode); + +/********************************************************************//** + * @brief Get I2S wordwidth value + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is the I2S mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return The wordwidth value, should be: 8,16 or 32 + *********************************************************************/ +static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + uint8_t value; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + value = (I2Sx->I2SDAO) & 0x03; /* get wordwidth bit */ + } else { + value = (I2Sx->I2SDAI) & 0x03; /* get wordwidth bit */ + } + switch (value) { + case I2S_WORDWIDTH_8: + return 8; + case I2S_WORDWIDTH_16: + return 16; + default: + return 32; + } +} + +/********************************************************************//** + * @brief Get I2S channel value + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is the I2S mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return The channel value, should be: 1(mono) or 2(stereo) + *********************************************************************/ +static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + uint8_t value; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + value = ((I2Sx->I2SDAO) & 0x04)>>2; /* get bit[2] */ + } else { + value = ((I2Sx->I2SDAI) & 0x04)>>2; /* get bit[2] */ + } + if(value == I2S_MONO) return 1; + return 2; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup I2S_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize I2S + * - Turn on power and clock + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_Init(LPC_I2S_TypeDef *I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + // Turn on power and clock + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, ENABLE); + LPC_I2S->I2SDAI = LPC_I2S->I2SDAO = 0x00; +} + +/********************************************************************//** + * @brief Configuration I2S, setting: + * - master/slave mode + * - wordwidth value + * - channel mode + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] ConfigStruct pointer to I2S_CFG_Type structure + * which will be initialized. + * @return none + *********************************************************************/ +void I2S_Config(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, I2S_CFG_Type* ConfigStruct) +{ + uint32_t bps, config; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + CHECK_PARAM(PARAM_I2S_WORDWIDTH(ConfigStruct->wordwidth)); + CHECK_PARAM(PARAM_I2S_CHANNEL(ConfigStruct->mono)); + CHECK_PARAM(PARAM_I2S_STOP(ConfigStruct->stop)); + CHECK_PARAM(PARAM_I2S_RESET(ConfigStruct->reset)); + CHECK_PARAM(PARAM_I2S_WS_SEL(ConfigStruct->ws_sel)); + CHECK_PARAM(PARAM_I2S_MUTE(ConfigStruct->mute)); + + /* Setup clock */ + bps = (ConfigStruct->wordwidth +1)*8; + + /* Calculate audio config */ + config = (bps - 1)<<6 | (ConfigStruct->ws_sel)<<5 | (ConfigStruct->reset)<<4 | + (ConfigStruct->stop)<<3 | (ConfigStruct->mono)<<2 | (ConfigStruct->wordwidth); + + if(TRMode == I2S_RX_MODE){ + LPC_I2S->I2SDAI = config; + }else{ + LPC_I2S->I2SDAO = config; + } +} + +/********************************************************************//** + * @brief DeInitial both I2S transmit or receive + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_DeInit(LPC_I2S_TypeDef *I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + // Turn off power and clock + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, DISABLE); +} + +/********************************************************************//** + * @brief Get I2S Buffer Level + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode Transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return current level of Transmit/Receive Buffer + *********************************************************************/ +uint8_t I2S_GetLevel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if(TRMode == I2S_TX_MODE) + { + return ((I2Sx->I2SSTATE >> 16) & 0xFF); + } + else + { + return ((I2Sx->I2SSTATE >> 8) & 0xFF); + } +} + +/********************************************************************//** + * @brief I2S Start: clear all STOP,RESET and MUTE bit, ready to operate + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_Start(LPC_I2S_TypeDef *I2Sx) +{ + //Clear STOP,RESET and MUTE bit + I2Sx->I2SDAO &= ~I2S_DAI_RESET; + I2Sx->I2SDAI &= ~I2S_DAI_RESET; + I2Sx->I2SDAO &= ~I2S_DAI_STOP; + I2Sx->I2SDAI &= ~I2S_DAI_STOP; + I2Sx->I2SDAO &= ~I2S_DAI_MUTE; +} + +/********************************************************************//** + * @brief I2S Send data + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] BufferData pointer to uint32_t is the data will be send + * @return none + *********************************************************************/ +void I2S_Send(LPC_I2S_TypeDef *I2Sx, uint32_t BufferData) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + I2Sx->I2STXFIFO = BufferData; +} + +/********************************************************************//** + * @brief I2S Receive Data + * @param[in] I2Sx pointer to LPC_I2S_TypeDef + * @return received value + *********************************************************************/ +uint32_t I2S_Receive(LPC_I2S_TypeDef* I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + return (I2Sx->I2SRXFIFO); + +} + +/********************************************************************//** + * @brief I2S Pause + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Pause(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO |= I2S_DAO_STOP; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_STOP; + } +} + +/********************************************************************//** + * @brief I2S Mute + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Mute(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO |= I2S_DAO_MUTE; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_MUTE; + } +} + +/********************************************************************//** + * @brief I2S Stop + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Stop(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO &= ~I2S_DAO_MUTE; + I2Sx->I2SDAO |= I2S_DAO_STOP; + I2Sx->I2SDAO |= I2S_DAO_RESET; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_STOP; + I2Sx->I2SDAI |= I2S_DAI_RESET; + } +} + +/********************************************************************//** + * @brief Set frequency for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] Freq is the frequency for I2S will be set. It can range + * from 16-96 kHz(16, 22.05, 32, 44.1, 48, 96kHz) + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return Status: ERROR or SUCCESS + *********************************************************************/ +Status I2S_FreqConfig(LPC_I2S_TypeDef *I2Sx, uint32_t Freq, uint8_t TRMode) { + + uint32_t i2s_clk; + uint8_t channel, wordwidth; + uint32_t x, y; + uint64_t divider; + uint16_t dif; + uint16_t x_divide, y_divide; + uint16_t err, ErrorOptimal = 0xFFFF; + + uint32_t N; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PRAM_I2S_FREQ(Freq)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + //Get the frequency of PCLK_I2S + i2s_clk = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_I2S); + + if(TRMode == I2S_TX_MODE) + { + channel = i2s_GetChannel(I2Sx,I2S_TX_MODE); + wordwidth = i2s_GetWordWidth(I2Sx,I2S_TX_MODE); + } + else + { + channel = i2s_GetChannel(I2Sx,I2S_RX_MODE); + wordwidth = i2s_GetWordWidth(I2Sx,I2S_RX_MODE); + } + + /* Calculate X and Y divider + * The MCLK rate for the I2S transmitter is determined by the value + * in the I2STXRATE/I2SRXRATE register. The required I2STXRATE/I2SRXRATE + * setting depends on the desired audio sample rate desired, the format + * (stereo/mono) used, and the data size. + * The formula is: + * I2S_MCLK = PCLK_I2S * (X/Y) / 2 + * In that, Y must be greater than or equal to X. X should divides evenly + * into Y. + * We have: + * I2S_MCLK = Freq * channel*wordwidth * (I2STXBITRATE+1); + * So: (X/Y) = (Freq * channel*wordwidth * (I2STXBITRATE+1))*2/PCLK_I2S + * We use a loop function to chose the most suitable X,Y value + */ + + /* divider is a fixed point number with 16 fractional bits */ + divider = (((uint64_t)Freq *channel*wordwidth * 2)<<16) / i2s_clk; + + /* find N that make x/y <= 1 -> divider <= 2^16 */ + for(N=64;N>0;N--){ + if((divider*N) < (1<<16)) break; + } + + if(N == 0) return ERROR; + + divider *= N; + + for (y = 255; y > 0; y--) { + x = y * divider; + if(x & (0xFF000000)) continue; + dif = x & 0xFFFF; + if(dif>0x8000) err = 0x10000-dif; + else err = dif; + if (err == 0) + { + y_divide = y; + break; + } + else if (err < ErrorOptimal) + { + ErrorOptimal = err; + y_divide = y; + } + } + x_divide = ((uint64_t)y_divide * Freq *(channel*wordwidth)* N * 2)/i2s_clk; + if(x_divide >= 256) x_divide = 0xFF; + if(x_divide == 0) x_divide = 1; + + if (TRMode == I2S_TX_MODE)// Transmitter + { + I2Sx->I2STXBITRATE = N-1; + I2Sx->I2STXRATE = y_divide | (x_divide << 8); + } else //Receiver + { + I2Sx->I2SRXBITRATE = N-1; + I2Sx->I2STXRATE = y_divide | (x_divide << 8); + } + return SUCCESS; +} + +/********************************************************************//** + * @brief I2S set bitrate + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] bitrate value will be set + * bitrate value should be in range: 0 .. 63 + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_SetBitRate(LPC_I2S_TypeDef *I2Sx, uint8_t bitrate, uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_BITRATE(bitrate)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if(TRMode == I2S_TX_MODE) + { + I2Sx->I2STXBITRATE = bitrate; + } + else + { + I2Sx->I2SRXBITRATE = bitrate; + } +} + +/********************************************************************//** + * @brief Configuration operating mode for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] ModeConfig pointer to I2S_MODEConf_Type will be used to + * configure + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_ModeConfig(LPC_I2S_TypeDef *I2Sx, I2S_MODEConf_Type* ModeConfig, + uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_CLKSEL(ModeConfig->clksel)); + CHECK_PARAM(PARAM_I2S_4PIN(ModeConfig->fpin)); + CHECK_PARAM(PARAM_I2S_MCLK(ModeConfig->mcena)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + I2Sx->I2STXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register + if (ModeConfig->clksel == I2S_CLKSEL_MCLK) { + I2Sx->I2STXMODE |= 0x02; + } + if (ModeConfig->fpin == I2S_4PIN_ENABLE) { + I2Sx->I2STXMODE |= (1 << 2); + } + if (ModeConfig->mcena == I2S_MCLK_ENABLE) { + I2Sx->I2STXMODE |= (1 << 3); + } + } else { + I2Sx->I2SRXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register + if (ModeConfig->clksel == I2S_CLKSEL_MCLK) { + I2Sx->I2SRXMODE |= 0x02; + } + if (ModeConfig->fpin == I2S_4PIN_ENABLE) { + I2Sx->I2SRXMODE |= (1 << 2); + } + if (ModeConfig->mcena == I2S_MCLK_ENABLE) { + I2Sx->I2SRXMODE |= (1 << 3); + } + } +} + +/********************************************************************//** + * @brief Configure DMA operation for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] DMAConfig pointer to I2S_DMAConf_Type will be used to configure + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_DMAConfig(LPC_I2S_TypeDef *I2Sx, I2S_DMAConf_Type* DMAConfig, + uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_DMA(DMAConfig->DMAIndex)); + CHECK_PARAM(PARAM_I2S_DMA_DEPTH(DMAConfig->depth)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_RX_MODE) { + if (DMAConfig->DMAIndex == I2S_DMA_1) { + LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 8; + } else { + LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 8; + } + } else { + if (DMAConfig->DMAIndex == I2S_DMA_1) { + LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 16; + } else { + LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 16; + } + } +} + +/********************************************************************//** + * @brief Enable/Disable DMA operation for I2S + * @param[in] I2Sx: I2S peripheral selected, should be: LPC_I2S + * @param[in] DMAIndex chose what DMA is used, should be: + * - I2S_DMA_1 = 0: DMA1 + * - I2S_DMA_2 = 1: DMA2 + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] NewState is new state of DMA operation, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void I2S_DMACmd(LPC_I2S_TypeDef *I2Sx, uint8_t DMAIndex, uint8_t TRMode, + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_I2S_DMA(DMAIndex)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_RX_MODE) { + if (DMAIndex == I2S_DMA_1) { + if (NewState == ENABLE) + I2Sx->I2SDMA1 |= 0x01; + else + I2Sx->I2SDMA1 &= ~0x01; + } else { + if (NewState == ENABLE) + I2Sx->I2SDMA2 |= 0x01; + else + I2Sx->I2SDMA2 &= ~0x01; + } + } else { + if (DMAIndex == I2S_DMA_1) { + if (NewState == ENABLE) + I2Sx->I2SDMA1 |= 0x02; + else + I2Sx->I2SDMA1 &= ~0x02; + } else { + if (NewState == ENABLE) + I2Sx->I2SDMA2 |= 0x02; + else + I2Sx->I2SDMA2 &= ~0x02; + } + } +} + +/********************************************************************//** + * @brief Configure IRQ for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] level is the FIFO level that triggers IRQ request + * @return none + *********************************************************************/ +void I2S_IRQConfig(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, uint8_t level) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + CHECK_PARAM(PARAM_I2S_IRQ_LEVEL(level)); + + if (TRMode == I2S_RX_MODE) { + I2Sx->I2SIRQ |= (level << 8); + } else { + I2Sx->I2SIRQ |= (level << 16); + } +} + +/********************************************************************//** + * @brief Enable/Disable IRQ for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] NewState is new state of DMA operation, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void I2S_IRQCmd(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, FunctionalState NewState) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (TRMode == I2S_RX_MODE) { + if (NewState == ENABLE) + I2Sx->I2SIRQ |= 0x01; + else + I2Sx->I2SIRQ &= ~0x01; + //Enable DMA + + } else { + if (NewState == ENABLE) + I2Sx->I2SIRQ |= 0x02; + else + I2Sx->I2SIRQ &= ~0x02; + } +} + +/********************************************************************//** + * @brief Get I2S interrupt status + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return FunctionState should be: + * - ENABLE: interrupt is enable + * - DISABLE: interrupt is disable + *********************************************************************/ +FunctionalState I2S_GetIRQStatus(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + if(TRMode == I2S_TX_MODE) + return ((FunctionalState)((I2Sx->I2SIRQ >> 1)&0x01)); + else + return ((FunctionalState)((I2Sx->I2SIRQ)&0x01)); +} + +/********************************************************************//** + * @brief Get I2S interrupt depth + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return depth of FIFO level on which to create an irq request + *********************************************************************/ +uint8_t I2S_GetIRQDepth(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + if(TRMode == I2S_TX_MODE) + return (((I2Sx->I2SIRQ)>>16)&0xFF); + else + return (((I2Sx->I2SIRQ)>>8)&0xFF); +} +/** + * @} + */ + +#endif /* _I2S */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c new file mode 100644 index 0000000000..f915f0c35e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c @@ -0,0 +1,308 @@ +/********************************************************************** +* $Id$ lpc17xx_iap.c 2012-04-18 +*//** +* @file lpc17xx_iap.c + * @brief Contains all functions support for IAP on lpc17xx +* @version 1.0 +* @date 18. April. 2012 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ +#include "lpc17xx_iap.h" +#include "system_LPC17xx.h" + +// IAP Command +typedef void (*IAP)(uint32_t *cmd,uint32_t *result); +IAP iap_entry = (IAP) IAP_LOCATION; +#define IAP_Call iap_entry + +/** @addtogroup IAP_Public_Functions IAP Public Function + * @ingroup IAP + * @{ + */ + + +/*********************************************************************//** + * @brief Get Sector Number + * + * @param[in] adr Sector Address + * + * @return Sector Number. + * + **********************************************************************/ + uint32_t GetSecNum (uint32_t adr) +{ + uint32_t n; + + n = adr >> 12; // 4kB Sector + if (n >= 0x10) { + n = 0x0E + (n >> 3); // 32kB Sector + } + + return (n); // Sector Number +} + +/*********************************************************************//** + * @brief Prepare sector(s) for write operation + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * + * @return CMD_SUCCESS/BUSY/INVALID_SECTOR. + * + **********************************************************************/ +IAP_STATUS_CODE PrepareSector(uint32_t start_sec, uint32_t end_sec) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_PREPARE; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + IAP_Call (&command.cmd, &command.status); // Call IAP Command + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Copy RAM to Flash + * + * @param[in] dest destination buffer (in Flash memory). + * @param[in] source source buffer (in RAM). + * @param[in] size the write size. + * + * @return CMD_SUCCESS. + * SRC_ADDR_ERROR/DST_ADDR_ERROR + * SRC_ADDR_NOT_MAPPED/DST_ADDR_NOT_MAPPED + * COUNT_ERROR/SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE CopyRAM2Flash(uint8_t * dest, uint8_t* source, IAP_WRITE_SIZE size) +{ + uint32_t sec; + IAP_STATUS_CODE status; + IAP_COMMAND_Type command; + + // Prepare sectors + sec = GetSecNum((uint32_t)dest); + status = PrepareSector(sec, sec); + if(status != CMD_SUCCESS) + return status; + + // write + command.cmd = IAP_COPY_RAM2FLASH; // Copy RAM to Flash + command.param[0] = (uint32_t)dest; // Destination Flash Address + command.param[1] = (uint32_t)source; // Source RAM Address + command.param[2] = size; // Number of bytes + command.param[3] = SystemCoreClock / 1000; // CCLK in kHz + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + return (IAP_STATUS_CODE)command.status; // Finished without Errors +} + +/*********************************************************************//** + * @brief Erase sector(s) + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * + * @return CMD_SUCCESS. + * INVALID_SECTOR + * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE EraseSector(uint32_t start_sec, uint32_t end_sec) +{ + IAP_COMMAND_Type command; + IAP_STATUS_CODE status; + + // Prepare sectors + status = PrepareSector(start_sec, end_sec); + if(status != CMD_SUCCESS) + return status; + + // Erase sectors + command.cmd = IAP_ERASE; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + command.param[2] = SystemCoreClock / 1000; // CCLK in kHz + IAP_Call (&command.cmd, &command.status); // Call IAP Command + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Blank check sector(s) + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * @param[out] first_nblank_loc The offset of the first non-blank word + * @param[out] first_nblank_val The value of the first non-blank word + * + * @return CMD_SUCCESS. + * INVALID_SECTOR + * SECTOR_NOT_BLANK + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE BlankCheckSector(uint32_t start_sec, uint32_t end_sec, + uint32_t *first_nblank_loc, + uint32_t *first_nblank_val) +{ + IAP_COMMAND_Type command; + + command.cmd = IAP_BLANK_CHECK; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == SECTOR_NOT_BLANK) + { + // Update out value + if(first_nblank_loc != NULL) + *first_nblank_loc = command.result[0]; + if(first_nblank_val != NULL) + *first_nblank_val = command.result[1]; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read part identification number + * + * @param[out] partID Part ID + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadPartID(uint32_t *partID) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_PART_ID; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(partID != NULL) + *partID = command.result[0]; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read boot code version. The version is interpreted as .. + * + * @param[out] major The major + * @param[out] minor The minor + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadBootCodeVer(uint8_t *major, uint8_t* minor) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_BOOT_VER; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(major != NULL) + *major = (command.result[0] >> 8) & 0xFF; + if(minor != NULL) + *minor = (command.result[0]) & 0xFF; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read Device serial number. + * + * @param[out] uid Serial number. + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadDeviceSerialNum(uint32_t *uid) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_SERIAL_NUMBER; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(uid != NULL) + { + uint32_t i = 0; + for(i = 0; i < 4; i++) + uid[i] = command.result[i]; + } + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief compare the memory contents at two locations. + * + * @param[in] addr1 The address of the 1st buffer (in RAM/Flash). + * @param[in] addr2 The address of the 2nd buffer (in RAM/Flash). + * @param[in] size Number of bytes to be compared; should be a multiple of 4. + * + * @return CMD_SUCCESS + * COMPARE_ERROR + * COUNT_ERROR (Byte count is not a multiple of 4) + * ADDR_ERROR + * ADDR_NOT_MAPPED + * + **********************************************************************/ +IAP_STATUS_CODE Compare(uint8_t *addr1, uint8_t *addr2, uint32_t size) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_COMPARE; + command.param[0] = (uint32_t)addr1; + command.param[1] = (uint32_t)addr2; + command.param[2] = size; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Re-invoke ISP. + * + * @param[in] None. + * + * @return None. + * + **********************************************************************/ +void InvokeISP(void) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_REINVOKE_ISP; + IAP_Call (&command.cmd, &command.status); // Call IAP Command +} + +/** + * @} + */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c new file mode 100644 index 0000000000..4f883e3077 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c @@ -0,0 +1,76 @@ +/********************************************************************** +* $Id$ lpc17xx_libcfg_default.c 2010-05-21 +*//** +* @file lpc17xx_libcfg_default.c +* @brief Library configuration source file (default), used to build +* library without examples +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Library group ----------------------------------------------------------- */ +/** @addtogroup LIBCFG_DEFAULT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_libcfg_default.h" + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup LIBCFG_DEFAULT_Public_Functions + * @{ + */ + +#ifndef __BUILD_WITH_EXAMPLE__ + +#ifdef DEBUG +/******************************************************************************* +* @brief Reports the name of the source file and the source line number +* where the CHECK_PARAM error has occurred. +* @param[in] file Pointer to the source file name +* @param[in] line assert_param error line source number +* @return None +*******************************************************************************/ +void check_failed(uint8_t *file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while(1); +} +#endif /* DEBUG */ + +#endif /* __BUILD_WITH_EXAMPLE__ */ + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c new file mode 100644 index 0000000000..cd9318b4fe --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c @@ -0,0 +1,509 @@ +/********************************************************************** +* $Id$ lpc17xx_mcpwm.c 2010-05-21 +*//** +* @file lpc17xx_mcpwm.c +* @brief Contains all functions support for Motor Control PWM firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup MCPWM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_mcpwm.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _MCPWM + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup MCPWM_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initializes the MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * Should be: LPC_MCPWM + * @return None + **********************************************************************/ +void MCPWM_Init(LPC_MCPWM_TypeDef *MCPWMx) +{ + + /* Turn On MCPWM PCLK */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCMC, ENABLE); + /* As default, peripheral clock for MCPWM module + * is set to FCCLK / 2 */ + // CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_MC, CLKPWR_PCLKSEL_CCLK_DIV_2); + + MCPWMx->MCCAP_CLR = MCPWM_CAPCLR_CAP(0) | MCPWM_CAPCLR_CAP(1) | MCPWM_CAPCLR_CAP(2); + MCPWMx->MCINTFLAG_CLR = MCPWM_INT_ILIM(0) | MCPWM_INT_ILIM(1) | MCPWM_INT_ILIM(2) \ + | MCPWM_INT_IMAT(0) | MCPWM_INT_IMAT(1) | MCPWM_INT_IMAT(2) \ + | MCPWM_INT_ICAP(0) | MCPWM_INT_ICAP(1) | MCPWM_INT_ICAP(2); + MCPWMx->MCINTEN_CLR = MCPWM_INT_ILIM(0) | MCPWM_INT_ILIM(1) | MCPWM_INT_ILIM(2) \ + | MCPWM_INT_IMAT(0) | MCPWM_INT_IMAT(1) | MCPWM_INT_IMAT(2) \ + | MCPWM_INT_ICAP(0) | MCPWM_INT_ICAP(1) | MCPWM_INT_ICAP(2); +} + + +/*********************************************************************//** + * @brief Configures each channel in MCPWM peripheral according to the + * specified parameters in the MCPWM_CHANNEL_CFG_Type. + * @param[in] MCPWMx Motor Control PWM peripheral selected + * should be: LPC_MCPWM + * @param[in] channelNum Channel number, should be: 0..2. + * @param[in] channelSetup Pointer to a MCPWM_CHANNEL_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM channel. + * @return None + **********************************************************************/ +void MCPWM_ConfigChannel(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CHANNEL_CFG_Type * channelSetup) +{ + if (channelNum <= 2) { + if (channelNum == 0) { + MCPWMx->MCTIM0 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER0 = channelSetup->channelPeriodValue; + MCPWMx->MCPW0 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 1) { + MCPWMx->MCTIM1 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER1 = channelSetup->channelPeriodValue; + MCPWMx->MCPW1 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 2) { + MCPWMx->MCTIM2 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER2 = channelSetup->channelPeriodValue; + MCPWMx->MCPW2 = channelSetup->channelPulsewidthValue; + } else { + return; + } + + if (channelSetup->channelType /* == MCPWM_CHANNEL_CENTER_MODE */){ + MCPWMx->MCCON_SET = MCPWM_CON_CENTER(channelNum); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_CENTER(channelNum); + } + + if (channelSetup->channelPolarity /* == MCPWM_CHANNEL_PASSIVE_HI */){ + MCPWMx->MCCON_SET = MCPWM_CON_POLAR(channelNum); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_POLAR(channelNum); + } + + if (channelSetup->channelDeadtimeEnable /* == ENABLE */){ + MCPWMx->MCCON_SET = MCPWM_CON_DTE(channelNum); + MCPWMx->MCDEADTIME &= ~(MCPWM_DT(channelNum, 0x3FF)); + MCPWMx->MCDEADTIME |= MCPWM_DT(channelNum, channelSetup->channelDeadtimeValue); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_DTE(channelNum); + } + + if (channelSetup->channelUpdateEnable /* == ENABLE */){ + MCPWMx->MCCON_CLR = MCPWM_CON_DISUP(channelNum); + } else { + MCPWMx->MCCON_SET = MCPWM_CON_DISUP(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Write to MCPWM shadow registers - Update the value for period + * and pulse width in MCPWM peripheral. + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum Channel Number, should be: 0..2. + * @param[in] channelSetup Pointer to a MCPWM_CHANNEL_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM channel. + * @return None + **********************************************************************/ +void MCPWM_WriteToShadow(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CHANNEL_CFG_Type *channelSetup) +{ + if (channelNum == 0){ + MCPWMx->MCPER0 = channelSetup->channelPeriodValue; + MCPWMx->MCPW0 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 1) { + MCPWMx->MCPER1 = channelSetup->channelPeriodValue; + MCPWMx->MCPW1 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 2) { + MCPWMx->MCPER2 = channelSetup->channelPeriodValue; + MCPWMx->MCPW2 = channelSetup->channelPulsewidthValue; + } +} + + + +/*********************************************************************//** + * @brief Configures capture function in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum MCI (Motor Control Input pin) number + * Should be: 0..2 + * @param[in] captureConfig Pointer to a MCPWM_CAPTURE_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM capture. + * @return + **********************************************************************/ +void MCPWM_ConfigCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CAPTURE_CFG_Type *captureConfig) +{ + if (channelNum <= 2) { + + if (captureConfig->captureFalling /* == ENABLE */) { + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_CAPMCI_FE(captureConfig->captureChannel, channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_CAPMCI_FE(captureConfig->captureChannel, channelNum); + } + + if (captureConfig->captureRising /* == ENABLE */) { + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_CAPMCI_RE(captureConfig->captureChannel, channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_CAPMCI_RE(captureConfig->captureChannel, channelNum); + } + + if (captureConfig->timerReset /* == ENABLE */){ + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_RT(captureConfig->captureChannel); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_RT(captureConfig->captureChannel); + } + + if (captureConfig->hnfEnable /* == ENABLE */){ + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_HNFCAP(channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_HNFCAP(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Clears current captured value in specified capture channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] captureChannel Capture channel number, should be: 0..2 + * @return None + **********************************************************************/ +void MCPWM_ClearCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t captureChannel) +{ + MCPWMx->MCCAP_CLR = MCPWM_CAPCLR_CAP(captureChannel); +} + +/*********************************************************************//** + * @brief Get current captured value in specified capture channel + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * Should be: LPC_MCPWM + * @param[in] captureChannel Capture channel number, should be: 0..2 + * @return None + **********************************************************************/ +uint32_t MCPWM_GetCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t captureChannel) +{ + if (captureChannel == 0){ + return (MCPWMx->MCCR0); + } else if (captureChannel == 1) { + return (MCPWMx->MCCR1); + } else if (captureChannel == 2) { + return (MCPWMx->MCCR2); + } + return (0); +} + + +/*********************************************************************//** + * @brief Configures Count control in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum Channel number, should be: 0..2 + * @param[in] countMode Count mode, should be: + * - ENABLE: Enables count mode. + * - DISABLE: Disable count mode, the channel is in timer mode. + * @param[in] countConfig Pointer to a MCPWM_COUNT_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM count control. + * @return None + **********************************************************************/ +void MCPWM_CountConfig(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + uint32_t countMode, MCPWM_COUNT_CFG_Type *countConfig) +{ + if (channelNum <= 2) { + if (countMode /* == ENABLE */){ + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_CNTR(channelNum); + if (countConfig->countFalling /* == ENABLE */) { + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_TCMCI_FE(countConfig->counterChannel,channelNum); + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_TCMCI_FE(countConfig->counterChannel,channelNum); + } + if (countConfig->countRising /* == ENABLE */) { + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_TCMCI_RE(countConfig->counterChannel,channelNum); + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_TCMCI_RE(countConfig->counterChannel,channelNum); + } + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_CNTR(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Start MCPWM activity for each MCPWM channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channel0 State of this command on channel 0: + * - ENABLE: 'Start' command will effect on channel 0 + * - DISABLE: 'Start' command will not effect on channel 0 + * @param[in] channel1 State of this command on channel 1: + * - ENABLE: 'Start' command will effect on channel 1 + * - DISABLE: 'Start' command will not effect on channel 1 + * @param[in] channel2 State of this command on channel 2: + * - ENABLE: 'Start' command will effect on channel 2 + * - DISABLE: 'Start' command will not effect on channel 2 + * @return None + **********************************************************************/ +void MCPWM_Start(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channel0, + uint32_t channel1, uint32_t channel2) +{ + uint32_t regVal = 0; + regVal = (channel0 ? MCPWM_CON_RUN(0) : 0) | (channel1 ? MCPWM_CON_RUN(1) : 0) \ + | (channel2 ? MCPWM_CON_RUN(2) : 0); + MCPWMx->MCCON_SET = regVal; +} + + +/*********************************************************************//** + * @brief Stop MCPWM activity for each MCPWM channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channel0 State of this command on channel 0: + * - ENABLE: 'Stop' command will effect on channel 0 + * - DISABLE: 'Stop' command will not effect on channel 0 + * @param[in] channel1 State of this command on channel 1: + * - ENABLE: 'Stop' command will effect on channel 1 + * - DISABLE: 'Stop' command will not effect on channel 1 + * @param[in] channel2 State of this command on channel 2: + * - ENABLE: 'Stop' command will effect on channel 2 + * - DISABLE: 'Stop' command will not effect on channel 2 + * @return None + **********************************************************************/ +void MCPWM_Stop(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channel0, + uint32_t channel1, uint32_t channel2) +{ + uint32_t regVal = 0; + regVal = (channel0 ? MCPWM_CON_RUN(0) : 0) | (channel1 ? MCPWM_CON_RUN(1) : 0) \ + | (channel2 ? MCPWM_CON_RUN(2) : 0); + MCPWMx->MCCON_CLR = regVal; +} + + +/*********************************************************************//** + * @brief Enables/Disables 3-phase AC motor mode on MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] acMode State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void MCPWM_ACMode(LPC_MCPWM_TypeDef *MCPWMx, uint32_t acMode) +{ + if (acMode){ + MCPWMx->MCCON_SET = MCPWM_CON_ACMODE; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_ACMODE; + } +} + + +/*********************************************************************//** + * @brief Enables/Disables 3-phase DC motor mode on MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] dcMode State of this command, should be: + * - ENABLE. + * - DISABLE. + * @param[in] outputInvered Polarity of the MCOB outputs for all 3 channels, + * should be: + * - ENABLE: The MCOB outputs have opposite polarity + * from the MCOA outputs. + * - DISABLE: The MCOB outputs have the same basic + * polarity as the MCOA outputs. + * @param[in] outputPattern A value contains bits that enables/disables the specified + * output pins route to the internal MCOA0 signal, should be: + - MCPWM_PATENT_A0: MCOA0 tracks internal MCOA0 + - MCPWM_PATENT_B0: MCOB0 tracks internal MCOA0 + - MCPWM_PATENT_A1: MCOA1 tracks internal MCOA0 + - MCPWM_PATENT_B1: MCOB1 tracks internal MCOA0 + - MCPWM_PATENT_A2: MCOA2 tracks internal MCOA0 + - MCPWM_PATENT_B2: MCOB2 tracks internal MCOA0 + * @return None + * + * Note: all these outputPatent values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_DCMode(LPC_MCPWM_TypeDef *MCPWMx, uint32_t dcMode, + uint32_t outputInvered, uint32_t outputPattern) +{ + if (dcMode){ + MCPWMx->MCCON_SET = MCPWM_CON_DCMODE; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_DCMODE; + } + + if (outputInvered) { + MCPWMx->MCCON_SET = MCPWM_CON_INVBDC; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_INVBDC; + } + + MCPWMx->MCCCP = outputPattern; +} + + +/*********************************************************************//** + * @brief Configures the specified interrupt in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + * + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntConfig(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType, FunctionalState NewState) +{ + if (NewState) { + MCPWMx->MCINTEN_SET = ulIntType; + } else { + MCPWMx->MCINTEN_CLR = ulIntType; + } +} + + +/*********************************************************************//** + * @brief Sets/Forces the specified interrupt for MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntSet(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + MCPWMx->MCINTFLAG_SET = ulIntType; +} + + +/*********************************************************************//** + * @brief Clear the specified interrupt pending for MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntClear(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + MCPWMx->MCINTFLAG_CLR = ulIntType; +} + + +/*********************************************************************//** + * @brief Check whether if the specified interrupt in MCPWM is set or not + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + **********************************************************************/ +FlagStatus MCPWM_GetIntStatus(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + return ((MCPWMx->MCINTFLAG & ulIntType) ? SET : RESET); +} + +/** + * @} + */ + +#endif /* _MCPWM */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c new file mode 100644 index 0000000000..3e01e47902 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c @@ -0,0 +1,148 @@ +/********************************************************************** +* $Id$ lpc17xx_nvic.c 2010-05-21 +*//** +* @file lpc17xx_nvic.c +* @brief Contains all expansion functions support for +* NVIC firmware library on LPC17xx. The main +* NVIC functions are defined in core_cm3.h +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup NVIC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_nvic.h" + + +/* Private Macros ------------------------------------------------------------- */ +/** @addtogroup NVIC_Private_Macros + * @{ + */ + +/* Vector table offset bit mask */ +#define NVIC_VTOR_MASK 0x3FFFFF80 + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup NVIC_Public_Functions + * @{ + */ + + +/*****************************************************************************//** + * @brief De-initializes the NVIC peripheral registers to their default + * reset values. + * @param None + * @return None + * + * These following NVIC peripheral registers will be de-initialized: + * - Disable Interrupt (32 IRQ interrupt sources that matched with LPC17xx) + * - Clear all Pending Interrupts (32 IRQ interrupt source that matched with LPC17xx) + * - Clear all Interrupt Priorities (32 IRQ interrupt source that matched with LPC17xx) + *******************************************************************************/ +void NVIC_DeInit(void) +{ + uint8_t tmp; + + /* Disable all interrupts */ + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0x00000001; + /* Clear all pending interrupts */ + NVIC->ICPR[0] = 0xFFFFFFFF; + NVIC->ICPR[1] = 0x00000001; + + /* Clear all interrupt priority */ + for (tmp = 0; tmp < 32; tmp++) { + NVIC->IP[tmp] = 0x00; + } +} + +/*****************************************************************************//** + * @brief De-initializes the SCB peripheral registers to their default + * reset values. + * @param none + * @return none + * + * These following SCB NVIC peripheral registers will be de-initialized: + * - Interrupt Control State register + * - Interrupt Vector Table Offset register + * - Application Interrupt/Reset Control register + * - System Control register + * - Configuration Control register + * - System Handlers Priority Registers + * - System Handler Control and State Register + * - Configurable Fault Status Register + * - Hard Fault Status Register + * - Debug Fault Status Register + *******************************************************************************/ +void NVIC_SCBDeInit(void) +{ + uint8_t tmp; + + SCB->ICSR = 0x0A000000; + SCB->VTOR = 0x00000000; + SCB->AIRCR = 0x05FA0000; + SCB->SCR = 0x00000000; + SCB->CCR = 0x00000000; + + for (tmp = 0; tmp < (sizeof(SCB->SHP) / sizeof(SCB->SHP[0])); tmp++) { + SCB->SHP[tmp] = 0x00; + } + + SCB->SHCSR = 0x00000000; + SCB->CFSR = 0xFFFFFFFF; + SCB->HFSR = 0xFFFFFFFF; + SCB->DFSR = 0xFFFFFFFF; +} + + +/*****************************************************************************//** + * @brief Set Vector Table Offset value + * @param offset Offset value + * @return None + *******************************************************************************/ +void NVIC_SetVTOR(uint32_t offset) +{ +// SCB->VTOR = (offset & NVIC_VTOR_MASK); + SCB->VTOR = offset; +} + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c new file mode 100644 index 0000000000..740c1eae99 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c @@ -0,0 +1,318 @@ +/********************************************************************** +* $Id$ lpc17xx_pinsel.c 2010-05-21 +*//** +* @file lpc17xx_pinsel.c +* @brief Contains all functions support for Pin connect block firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup PINSEL + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_pinsel.h" + +/* Public Functions ----------------------------------------------------------- */ + +static void set_PinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum); +static void set_ResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum); +static void set_OpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum); + +/*********************************************************************//** + * @brief Setup the pin selection function + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] funcnum Function number, + * should be one of the following: + * - PINSEL_FUNC_0 : default function + * - PINSEL_FUNC_1 : first alternate function + * - PINSEL_FUNC_2 : second alternate function + * - PINSEL_FUNC_3 : third alternate function + * + * @return None + **********************************************************************/ +static void set_PinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum) +{ + uint32_t pinnum_t = pinnum; + uint32_t pinselreg_idx = 2 * portnum; + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINSEL0; + + if (pinnum_t >= 16) { + pinnum_t -= 16; + pinselreg_idx++; + } + *(uint32_t *)(pPinCon + pinselreg_idx) &= ~(0x03UL << (pinnum_t * 2)); + *(uint32_t *)(pPinCon + pinselreg_idx) |= ((uint32_t)funcnum) << (pinnum_t * 2); +} + +/*********************************************************************//** + * @brief Setup resistor mode for each pin + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] modenum: Mode number, + * should be one of the following: + - PINSEL_PINMODE_PULLUP : Internal pull-up resistor + - PINSEL_PINMODE_TRISTATE : Tri-state + - PINSEL_PINMODE_PULLDOWN : Internal pull-down resistor + + * @return None + **********************************************************************/ +void set_ResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum) +{ + uint32_t pinnum_t = pinnum; + uint32_t pinmodereg_idx = 2 * portnum; + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE0; + + if (pinnum_t >= 16) { + pinnum_t -= 16; + pinmodereg_idx++ ; + } + + *(uint32_t *)(pPinCon + pinmodereg_idx) &= ~(0x03UL << (pinnum_t * 2)); + *(uint32_t *)(pPinCon + pinmodereg_idx) |= ((uint32_t)modenum) << (pinnum_t * 2); +} + +/*********************************************************************//** + * @brief Setup Open drain mode for each pin + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] modenum Open drain mode number, + * should be one of the following: + * - PINSEL_PINMODE_NORMAL : Pin is in the normal (not open drain) mode + * - PINSEL_PINMODE_OPENDRAIN : Pin is in the open drain mode + * + * @return None + **********************************************************************/ +void set_OpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum) +{ + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE_OD0; + + if (modenum == PINSEL_PINMODE_OPENDRAIN){ + *(uint32_t *)(pPinCon + portnum) |= (0x01UL << pinnum); + } else { + *(uint32_t *)(pPinCon + portnum) &= ~(0x01UL << pinnum); + } +} + +/* End of Public Functions ---------------------------------------------------- */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup PINSEL_Public_Functions + * @{ + */ +/*********************************************************************//** + * @brief Configure trace function + * @param[in] NewState State of the Trace function configuration, + * should be one of the following: + * - ENABLE : Enable Trace Function + * - DISABLE : Disable Trace Function + * + * @return None + **********************************************************************/ +void PINSEL_ConfigTraceFunc(FunctionalState NewState) +{ + if (NewState == ENABLE) { + LPC_PINCON->PINSEL10 |= (0x01UL << 3); + } else if (NewState == DISABLE) { + LPC_PINCON->PINSEL10 &= ~(0x01UL << 3); + } +} + +/*********************************************************************//** + * @brief Setup I2C0 pins + * @param[in] i2cPinMode I2C pin mode, + * should be one of the following: + * - PINSEL_I2C_Normal_Mode : The standard drive mode + * - PINSEL_I2C_Fast_Mode : Fast Mode Plus drive mode + * + * @param[in] filterSlewRateEnable should be: + * - ENABLE: Enable filter and slew rate. + * - DISABLE: Disable filter and slew rate. + * + * @return None + **********************************************************************/ +void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable) +{ + uint32_t regVal; + + if (i2cPinMode == PINSEL_I2C_Fast_Mode){ + regVal = PINSEL_I2CPADCFG_SCLDRV0 | PINSEL_I2CPADCFG_SDADRV0; + } + + if (filterSlewRateEnable == DISABLE){ + regVal = PINSEL_I2CPADCFG_SCLI2C0 | PINSEL_I2CPADCFG_SDAI2C0; + } + LPC_PINCON->I2CPADCFG = regVal; +} + + +/*********************************************************************//** + * @brief Configure Pin corresponding to specified parameters passed + * in the PinCfg + * @param[in] PinCfg Pointer to a PINSEL_CFG_Type structure + * that contains the configuration information for the + * specified pin. + * @return None + **********************************************************************/ +void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg) +{ + set_PinFunc(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Funcnum); + set_ResistorMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Pinmode); + set_OpenDrainMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->OpenDrain); +} + + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c new file mode 100644 index 0000000000..f52aa5ce85 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c @@ -0,0 +1,588 @@ +/********************************************************************** +* $Id$ lpc17xx_pwm.c 2011-03-31 +*//** +* @file lpc17xx_pwm.c +* @brief Contains all functions support for PWM firmware library on LPC17xx +* @version 2.1 +* @date 31. Mar. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup PWM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_pwm.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _PWM + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup PWM_Public_Functions + * @{ + */ + + +/*********************************************************************//** + * @brief Check whether specified interrupt flag in PWM is set or not + * @param[in] PWMx: PWM peripheral, should be LPC_PWM1 + * @param[in] IntFlag: PWM interrupt flag, should be: + * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0 + * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1 + * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2 + * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3 + * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4 + * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5 + * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6 + * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0 + * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1 + * @return New State of PWM interrupt flag (SET or RESET) + **********************************************************************/ +IntStatus PWM_GetIntStatus(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag)); + + return ((PWMx->IR & IntFlag) ? SET : RESET); +} + + + +/*********************************************************************//** + * @brief Clear specified PWM Interrupt pending + * @param[in] PWMx: PWM peripheral, should be LPC_PWM1 + * @param[in] IntFlag: PWM interrupt flag, should be: + * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0 + * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1 + * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2 + * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3 + * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4 + * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5 + * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6 + * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0 + * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1 + * @return None + **********************************************************************/ +void PWM_ClearIntPending(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag)); + PWMx->IR = IntFlag; +} + + + +/*****************************************************************************//** +* @brief Fills each PWM_InitStruct member with its default value: +* - If PWMCounterMode = PWM_MODE_TIMER: +* + PrescaleOption = PWM_TIMER_PRESCALE_USVAL +* + PrescaleValue = 1 +* - If PWMCounterMode = PWM_MODE_COUNTER: +* + CountInputSelect = PWM_COUNTER_PCAP1_0 +* + CounterOption = PWM_COUNTER_RISING +* @param[in] PWMTimerCounterMode Timer or Counter mode, should be: +* - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode +* - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode +* @param[in] PWM_InitStruct Pointer to structure (PWM_TIMERCFG_Type or +* PWM_COUNTERCFG_Type) which will be initialized. +* @return None +* Note: PWM_InitStruct pointer will be assigned to corresponding structure +* (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode. +*******************************************************************************/ +void PWM_ConfigStructInit(uint8_t PWMTimerCounterMode, void *PWM_InitStruct) +{ + PWM_TIMERCFG_Type *pTimeCfg; + PWM_COUNTERCFG_Type *pCounterCfg; + CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode)); + + pTimeCfg = (PWM_TIMERCFG_Type *) PWM_InitStruct; + pCounterCfg = (PWM_COUNTERCFG_Type *) PWM_InitStruct; + + if (PWMTimerCounterMode == PWM_MODE_TIMER ) + { + pTimeCfg->PrescaleOption = PWM_TIMER_PRESCALE_USVAL; + pTimeCfg->PrescaleValue = 1; + } + else if (PWMTimerCounterMode == PWM_MODE_COUNTER) + { + pCounterCfg->CountInputSelect = PWM_COUNTER_PCAP1_0; + pCounterCfg->CounterOption = PWM_COUNTER_RISING; + } +} + + +/*********************************************************************//** + * @brief Initializes the PWMx peripheral corresponding to the specified + * parameters in the PWM_ConfigStruct. + * @param[in] PWMx PWM peripheral, should be LPC_PWM1 + * @param[in] PWMTimerCounterMode Timer or Counter mode, should be: + * - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode + * - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode + * @param[in] PWM_ConfigStruct Pointer to structure (PWM_TIMERCFG_Type or + * PWM_COUNTERCFG_Type) which will be initialized. + * @return None + * Note: PWM_ConfigStruct pointer will be assigned to corresponding structure + * (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode. + **********************************************************************/ +void PWM_Init(LPC_PWM_TypeDef *PWMx, uint32_t PWMTimerCounterMode, void *PWM_ConfigStruct) +{ + PWM_TIMERCFG_Type *pTimeCfg; + PWM_COUNTERCFG_Type *pCounterCfg; + uint64_t clkdlycnt; + + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode)); + + pTimeCfg = (PWM_TIMERCFG_Type *)PWM_ConfigStruct; + pCounterCfg = (PWM_COUNTERCFG_Type *)PWM_ConfigStruct; + + + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, ENABLE); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_PWM1, CLKPWR_PCLKSEL_CCLK_DIV_4); + // Get peripheral clock of PWM1 + clkdlycnt = (uint64_t) CLKPWR_GetPCLK (CLKPWR_PCLKSEL_PWM1); + + + // Clear all interrupts pending + PWMx->IR = 0xFF & PWM_IR_BITMASK; + PWMx->TCR = 0x00; + PWMx->CTCR = 0x00; + PWMx->MCR = 0x00; + PWMx->CCR = 0x00; + PWMx->PCR = 0x00; + PWMx->LER = 0x00; + + if (PWMTimerCounterMode == PWM_MODE_TIMER) + { + CHECK_PARAM(PARAM_PWM_TIMER_PRESCALE(pTimeCfg->PrescaleOption)); + + /* Absolute prescale value */ + if (pTimeCfg->PrescaleOption == PWM_TIMER_PRESCALE_TICKVAL) + { + PWMx->PR = pTimeCfg->PrescaleValue - 1; + } + /* uSecond prescale value */ + else + { + clkdlycnt = (clkdlycnt * pTimeCfg->PrescaleValue) / 1000000; + PWMx->PR = ((uint32_t) clkdlycnt) - 1; + } + + } + else if (PWMTimerCounterMode == PWM_MODE_COUNTER) + { + CHECK_PARAM(PARAM_PWM_COUNTER_INPUTSEL(pCounterCfg->CountInputSelect)); + CHECK_PARAM(PARAM_PWM_COUNTER_EDGE(pCounterCfg->CounterOption)); + + PWMx->CTCR |= (PWM_CTCR_MODE((uint32_t)pCounterCfg->CounterOption)) \ + | (PWM_CTCR_SELECT_INPUT((uint32_t)pCounterCfg->CountInputSelect)); + } +} + +/*********************************************************************//** + * @brief De-initializes the PWM peripheral registers to their +* default reset values. + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @return None + **********************************************************************/ +void PWM_DeInit (LPC_PWM_TypeDef *PWMx) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + + // Disable PWM control (timer, counter and PWM) + PWMx->TCR = 0x00; + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, DISABLE); + +} + + +/*********************************************************************//** + * @brief Enable/Disable PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable PWM peripheral + * - DISABLE: Disable PWM peripheral + * @return None + **********************************************************************/ +void PWM_Cmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + PWMx->TCR |= PWM_TCR_PWM_ENABLE; + } + else + { + PWMx->TCR &= (~PWM_TCR_PWM_ENABLE) & PWM_TCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Counter in PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable Counter in PWM peripheral + * - DISABLE: Disable Counter in PWM peripheral + * @return None + **********************************************************************/ +void PWM_CounterCmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + if (NewState == ENABLE) + { + PWMx->TCR |= PWM_TCR_COUNTER_ENABLE; + } + else + { + PWMx->TCR &= (~PWM_TCR_COUNTER_ENABLE) & PWM_TCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Reset Counter in PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @return None + **********************************************************************/ +void PWM_ResetCounter(LPC_PWM_TypeDef *PWMx) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; +} + + +/*********************************************************************//** + * @brief Configures match for PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWM_MatchConfigStruct Pointer to a PWM_MATCHCFG_Type structure +* that contains the configuration information for the +* specified PWM match function. + * @return None + **********************************************************************/ +void PWM_ConfigMatch(LPC_PWM_TypeDef *PWMx, PWM_MATCHCFG_Type *PWM_MatchConfigStruct) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(PWM_MatchConfigStruct->MatchChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->IntOnMatch)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->ResetOnMatch)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->StopOnMatch)); + + //interrupt on MRn + if (PWM_MatchConfigStruct->IntOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } + + //reset on MRn + if (PWM_MatchConfigStruct->ResetOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } + + //stop on MRn + if (PWM_MatchConfigStruct->StopOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configures capture input for PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWM_CaptureConfigStruct Pointer to a PWM_CAPTURECFG_Type structure +* that contains the configuration information for the +* specified PWM capture input function. + * @return None + **********************************************************************/ +void PWM_ConfigCapture(LPC_PWM_TypeDef *PWMx, PWM_CAPTURECFG_Type *PWM_CaptureConfigStruct) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(PWM_CaptureConfigStruct->CaptureChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->FallingEdge)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->IntOnCaption)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->RisingEdge)); + + if (PWM_CaptureConfigStruct->RisingEdge == ENABLE) + { + PWMx->CCR |= PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } + + if (PWM_CaptureConfigStruct->FallingEdge == ENABLE) + { + PWMx->CCR |= PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } + + if (PWM_CaptureConfigStruct->IntOnCaption == ENABLE) + { + PWMx->CCR |= PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Read value of capture register PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] CaptureChannel: capture channel number, should be in + * range 0 to 1 + * @return Value of capture register + **********************************************************************/ +uint32_t PWM_GetCaptureValue(LPC_PWM_TypeDef *PWMx, uint8_t CaptureChannel) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(CaptureChannel)); + + switch (CaptureChannel) + { + case 0: + return PWMx->CR0; + + case 1: + return PWMx->CR1; + + default: + return (0); + } +} + + +/********************************************************************//** + * @brief Update value for each PWM channel with update type option + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] MatchChannel Match channel + * @param[in] MatchValue Match value + * @param[in] UpdateType Type of Update, should be: + * - PWM_MATCH_UPDATE_NOW: The update value will be updated for + * this channel immediately + * - PWM_MATCH_UPDATE_NEXT_RST: The update value will be updated for + * this channel on next reset by a PWM Match event. + * @return None + *********************************************************************/ +void PWM_MatchUpdate(LPC_PWM_TypeDef *PWMx, uint8_t MatchChannel, \ + uint32_t MatchValue, uint8_t UpdateType) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(MatchChannel)); + CHECK_PARAM(PARAM_PWM_MATCH_UPDATE(UpdateType)); + + switch (MatchChannel) + { + case 0: + PWMx->MR0 = MatchValue; + break; + + case 1: + PWMx->MR1 = MatchValue; + break; + + case 2: + PWMx->MR2 = MatchValue; + break; + + case 3: + PWMx->MR3 = MatchValue; + break; + + case 4: + PWMx->MR4 = MatchValue; + break; + + case 5: + PWMx->MR5 = MatchValue; + break; + + case 6: + PWMx->MR6 = MatchValue; + break; + } + + // Write Latch register + PWMx->LER |= PWM_LER_EN_MATCHn_LATCH(MatchChannel); + + // In case of update now + if (UpdateType == PWM_MATCH_UPDATE_NOW) + { + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; + } +} + +/********************************************************************//** + * @brief Update value for multi PWM channel with update type option + * at the same time + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] MatchStruct Structure that contents match value of 7 pwm channels + * @param[in] UpdateType Type of Update, should be: + * - PWM_MATCH_UPDATE_NOW: The update value will be updated for + * this channel immediately + * - PWM_MATCH_UPDATE_NEXT_RST: The update value will be updated for + * this channel on next reset by a PWM Match event. + * @return None + *********************************************************************/ +void PWM_MultiMatchUpdate(LPC_PWM_TypeDef *PWMx, PWM_Match_T *MatchStruct , uint8_t UpdateType) +{ + uint8_t LatchValue = 0; + uint8_t i; + + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_MATCH_UPDATE(UpdateType)); + + //Update match value + for(i=0;i<7;i++) + { + if(MatchStruct[i].Status == SET) + { + if(i<4) + *((volatile unsigned int *)(&(PWMx->MR0) + i)) = MatchStruct[i].Matchvalue; + else + { + *((volatile unsigned int *)(&(PWMx->MR4) + (i-4))) = MatchStruct[i].Matchvalue; + } + LatchValue |=(1<LER = LatchValue; + + // In case of update now + if (UpdateType == PWM_MATCH_UPDATE_NOW) + { + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; + } +} +/********************************************************************//** + * @brief Configure Edge mode for each PWM channel + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWMChannel PWM channel, should be in range from 2 to 6 + * @param[in] ModeOption PWM mode option, should be: + * - PWM_CHANNEL_SINGLE_EDGE: Single Edge mode + * - PWM_CHANNEL_DUAL_EDGE: Dual Edge mode + * @return None + * Note: PWM Channel 1 can not be selected for mode option + *********************************************************************/ +void PWM_ChannelConfig(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, uint8_t ModeOption) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_EDGE_MODE_CHANNEL(PWMChannel)); + CHECK_PARAM(PARAM_PWM_CHANNEL_EDGE(ModeOption)); + + // Single edge mode + if (ModeOption == PWM_CHANNEL_SINGLE_EDGE) + { + PWMx->PCR &= (~PWM_PCR_PWMSELn(PWMChannel)) & PWM_PCR_BITMASK; + } + // Double edge mode + else if (PWM_CHANNEL_DUAL_EDGE) + { + PWMx->PCR |= PWM_PCR_PWMSELn(PWMChannel); + } +} + + + +/********************************************************************//** + * @brief Enable/Disable PWM channel output + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWMChannel PWM channel, should be in range from 1 to 6 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable this PWM channel output + * - DISABLE: Disable this PWM channel output + * @return None + *********************************************************************/ +void PWM_ChannelCmd(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CHANNEL(PWMChannel)); + + if (NewState == ENABLE) + { + PWMx->PCR |= PWM_PCR_PWMENAn(PWMChannel); + } + else + { + PWMx->PCR &= (~PWM_PCR_PWMENAn(PWMChannel)) & PWM_PCR_BITMASK; + } +} + +/** + * @} + */ + +#endif /* _PWM */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c new file mode 100644 index 0000000000..01259ff686 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c @@ -0,0 +1,514 @@ +/********************************************************************** +* $Id$ lpc17xx_qei.c 2010-05-21 +*//** +* @file lpc17xx_qei.c +* @brief Contains all functions support for QEI firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup QEI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_qei.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _QEI + +/* Private Types -------------------------------------------------------------- */ +/** @defgroup QEI_Private_Types QEI Private Types + * @{ + */ + +/** + * @brief QEI configuration union type definition + */ +typedef union { + QEI_CFG_Type bmQEIConfig; + uint32_t ulQEIConfig; +} QEI_CFGOPT_Type; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup QEI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Resets value for each type of QEI value, such as velocity, + * counter, position, etc.. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulResetType QEI Reset Type, should be one of the following: + * - QEI_RESET_POS: Reset Position Counter + * - QEI_RESET_POSOnIDX: Reset Position Counter on Index signal + * - QEI_RESET_VEL: Reset Velocity + * - QEI_RESET_IDX: Reset Index Counter + * @return None + **********************************************************************/ +void QEI_Reset(LPC_QEI_TypeDef *QEIx, uint32_t ulResetType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_RESET(ulResetType)); + + QEIx->QEICON = ulResetType; +} + +/*********************************************************************//** + * @brief Initializes the QEI peripheral according to the specified +* parameters in the QEI_ConfigStruct. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] QEI_ConfigStruct Pointer to a QEI_CFG_Type structure +* that contains the configuration information for the +* specified QEI peripheral + * @return None + **********************************************************************/ +void QEI_Init(LPC_QEI_TypeDef *QEIx, QEI_CFG_Type *QEI_ConfigStruct) +{ + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_DIRINV(QEI_ConfigStruct->DirectionInvert)); + CHECK_PARAM(PARAM_QEI_SIGNALMODE(QEI_ConfigStruct->SignalMode)); + CHECK_PARAM(PARAM_QEI_CAPMODE(QEI_ConfigStruct->CaptureMode)); + CHECK_PARAM(PARAM_QEI_INVINX(QEI_ConfigStruct->InvertIndex)); + + /* Set up clock and power for QEI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCQEI, ENABLE); + + /* As default, peripheral clock for QEI module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_QEI, CLKPWR_PCLKSEL_CCLK_DIV_1); + + // Reset all remaining value in QEI peripheral + QEIx->QEICON = QEI_CON_RESP | QEI_CON_RESV | QEI_CON_RESI; + QEIx->QEIMAXPOS = 0x00; + QEIx->CMPOS0 = 0x00; + QEIx->CMPOS1 = 0x00; + QEIx->CMPOS2 = 0x00; + QEIx->INXCMP = 0x00; + QEIx->QEILOAD = 0x00; + QEIx->VELCOMP = 0x00; + QEIx->FILTER = 0x00; + // Disable all Interrupt + QEIx->QEIIEC = QEI_IECLR_BITMASK; + // Clear all Interrupt pending + QEIx->QEICLR = QEI_INTCLR_BITMASK; + // Set QEI configuration value corresponding to its setting up value + QEIx->QEICONF = ((QEI_CFGOPT_Type *)QEI_ConfigStruct)->ulQEIConfig; +} + + +/*********************************************************************//** + * @brief De-initializes the QEI peripheral registers to their +* default reset values. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return None + **********************************************************************/ +void QEI_DeInit(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + + /* Turn off clock and power for QEI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCQEI, DISABLE); +} + + +/*****************************************************************************//** +* @brief Fills each QIE_InitStruct member with its default value: +* - DirectionInvert = QEI_DIRINV_NONE +* - SignalMode = QEI_SIGNALMODE_QUAD +* - CaptureMode = QEI_CAPMODE_4X +* - InvertIndex = QEI_INVINX_NONE +* @param[in] QIE_InitStruct Pointer to a QEI_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void QEI_ConfigStructInit(QEI_CFG_Type *QIE_InitStruct) +{ + QIE_InitStruct->CaptureMode = QEI_CAPMODE_4X; + QIE_InitStruct->DirectionInvert = QEI_DIRINV_NONE; + QIE_InitStruct->InvertIndex = QEI_INVINX_NONE; + QIE_InitStruct->SignalMode = QEI_SIGNALMODE_QUAD; +} + + +/*********************************************************************//** + * @brief Check whether if specified flag status is set or not + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulFlagType Status Flag Type, should be one of the following: + * - QEI_STATUS_DIR: Direction Status + * @return New Status of this status flag (SET or RESET) + **********************************************************************/ +FlagStatus QEI_GetStatus(LPC_QEI_TypeDef *QEIx, uint32_t ulFlagType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_STATUS(ulFlagType)); + return ((QEIx->QEISTAT & ulFlagType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Get current position value in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current position value of QEI peripheral + **********************************************************************/ +uint32_t QEI_GetPosition(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEIPOS); +} + +/*********************************************************************//** + * @brief Set max position value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulMaxPos Max position value to set + * @return None + **********************************************************************/ +void QEI_SetMaxPosition(LPC_QEI_TypeDef *QEIx, uint32_t ulMaxPos) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->QEIMAXPOS = ulMaxPos; +} + +/*********************************************************************//** + * @brief Set position compare value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] bPosCompCh Compare Position channel, should be: + * - QEI_COMPPOS_CH_0: QEI compare position channel 0 + * - QEI_COMPPOS_CH_1: QEI compare position channel 1 + * - QEI_COMPPOS_CH_2: QEI compare position channel 2 + * @param[in] ulPosComp Compare Position value to set + * @return None + **********************************************************************/ +void QEI_SetPositionComp(LPC_QEI_TypeDef *QEIx, uint8_t bPosCompCh, uint32_t ulPosComp) +{ + uint32_t *tmp; + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_COMPPOS_CH(bPosCompCh)); + tmp = (uint32_t *) (&(QEIx->CMPOS0) + bPosCompCh * 4); + *tmp = ulPosComp; + +} + +/*********************************************************************//** + * @brief Get current index counter of QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current value of QEI index counter + **********************************************************************/ +uint32_t QEI_GetIndex(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->INXCNT); +} + +/*********************************************************************//** + * @brief Set value for index compare in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIndexComp Compare Index Value to set + * @return None + **********************************************************************/ +void QEI_SetIndexComp(LPC_QEI_TypeDef *QEIx, uint32_t ulIndexComp) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->INXCMP = ulIndexComp; +} + +/*********************************************************************//** + * @brief Set timer reload value for QEI peripheral. When the velocity timer is + * over-flow, the value that set for Timer Reload register will be loaded + * into the velocity timer for next period. The calculated velocity in RPM + * therefore will be affect by this value. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] QEIReloadStruct QEI reload structure + * @return None + **********************************************************************/ +void QEI_SetTimerReload(LPC_QEI_TypeDef *QEIx, QEI_RELOADCFG_Type *QEIReloadStruct) +{ + uint64_t pclk; + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_TIMERRELOAD(QEIReloadStruct->ReloadOption)); + + if (QEIReloadStruct->ReloadOption == QEI_TIMERRELOAD_TICKVAL) { + QEIx->QEILOAD = QEIReloadStruct->ReloadValue - 1; + } else { + pclk = (uint64_t)CLKPWR_GetPCLK(CLKPWR_PCLKSEL_QEI); + pclk = (pclk /(1000000/QEIReloadStruct->ReloadValue)) - 1; + QEIx->QEILOAD = (uint32_t)pclk; + } +} + +/*********************************************************************//** + * @brief Get current timer counter in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current timer counter in QEI peripheral + **********************************************************************/ +uint32_t QEI_GetTimer(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEITIME); +} + +/*********************************************************************//** + * @brief Get current velocity pulse counter in current time period + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current velocity pulse counter value + **********************************************************************/ +uint32_t QEI_GetVelocity(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEIVEL); +} + +/*********************************************************************//** + * @brief Get the most recently measured velocity of the QEI. When + * the Velocity timer in QEI is over-flow, the current velocity + * value will be loaded into Velocity Capture register. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return The most recently measured velocity value + **********************************************************************/ +uint32_t QEI_GetVelocityCap(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEICAP); +} + +/*********************************************************************//** + * @brief Set Velocity Compare value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulVelComp Compare Velocity value to set + * @return None + **********************************************************************/ +void QEI_SetVelocityComp(LPC_QEI_TypeDef *QEIx, uint32_t ulVelComp) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->VELCOMP = ulVelComp; +} + +/*********************************************************************//** + * @brief Set value of sampling count for the digital filter in + * QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulSamplingPulse Value of sampling count to set + * @return None + **********************************************************************/ +void QEI_SetDigiFilter(LPC_QEI_TypeDef *QEIx, uint32_t ulSamplingPulse) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->FILTER = ulSamplingPulse; +} + +/*********************************************************************//** + * @brief Check whether if specified interrupt flag status in QEI + * peripheral is set or not + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return New State of specified interrupt flag status (SET or RESET) + **********************************************************************/ +FlagStatus QEI_GetIntStatus(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + return((QEIx->QEIINTSTAT & ulIntType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Enable/Disable specified interrupt in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + * - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + * - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + * - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + * - QEI_INTFLAG_DIR_Int: Change of direction interrupt + * - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + * - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + * - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + * index count interrupt + * - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + * - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + * - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @param[in] NewState New function state, should be: + * - DISABLE + * - ENABLE + * @return None + **********************************************************************/ +void QEI_IntCmd(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) { + QEIx->QEIIES = ulIntType; + } else { + QEIx->QEIIEC = ulIntType; + } +} + + +/*********************************************************************//** + * @brief Sets (forces) specified interrupt in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return None + **********************************************************************/ +void QEI_IntSet(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + QEIx->QEISET = ulIntType; +} + +/*********************************************************************//** + * @brief Clear (force) specified interrupt (pending) in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return None + **********************************************************************/ +void QEI_IntClear(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + QEIx->QEICLR = ulIntType; +} + + +/*********************************************************************//** + * @brief Calculates the actual velocity in RPM passed via velocity + * capture value and Pulse Per Round (of the encoder) value + * parameter input. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulVelCapValue Velocity capture input value that can + * be got from QEI_GetVelocityCap() function + * @param[in] ulPPR Pulse per round of encoder + * @return The actual value of velocity in RPM (Round per minute) + **********************************************************************/ +uint32_t QEI_CalculateRPM(LPC_QEI_TypeDef *QEIx, uint32_t ulVelCapValue, uint32_t ulPPR) +{ + uint64_t rpm, clock, Load, edges; + + // Get current Clock rate for timer input + clock = (uint64_t)CLKPWR_GetPCLK(CLKPWR_PCLKSEL_QEI); + // Get Timer load value (velocity capture period) + Load = (uint64_t)(QEIx->QEILOAD + 1); + // Get Edge + edges = (uint64_t)((QEIx->QEICONF & QEI_CONF_CAPMODE) ? 4 : 2); + // Calculate RPM + rpm = ((clock * ulVelCapValue * 60) / (Load * ulPPR * edges)); + + return (uint32_t)(rpm); +} + + +/** + * @} + */ + +#endif /* _QEI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c new file mode 100644 index 0000000000..ab89ed3be3 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c @@ -0,0 +1,199 @@ +/********************************************************************** +* $Id$ lpc17xx_rit.c 2010-05-21 +*//** +* @file lpc17xx_rit.c +* @brief Contains all functions support for RIT firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup RIT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_rit.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _RIT + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup RIT_Public_Functions + * @{ + */ + +/******************************************************************************//* + * @brief Initial for RIT + * - Turn on power and clock + * - Setup default register values + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return None + *******************************************************************************/ +void RIT_Init(LPC_RIT_TypeDef *RITx) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRIT, ENABLE); + //Set up default register values + RITx->RICOMPVAL = 0xFFFFFFFF; + RITx->RIMASK = 0x00000000; + RITx->RICTRL = 0x0C; + RITx->RICOUNTER = 0x00000000; + // Turn on power and clock + +} +/******************************************************************************//* + * @brief DeInitial for RIT + * - Turn off power and clock + * - ReSetup default register values + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return None + *******************************************************************************/ +void RIT_DeInit(LPC_RIT_TypeDef *RITx) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + + // Turn off power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRIT, DISABLE); + //ReSetup default register values + RITx->RICOMPVAL = 0xFFFFFFFF; + RITx->RIMASK = 0x00000000; + RITx->RICTRL = 0x0C; + RITx->RICOUNTER = 0x00000000; +} + +/******************************************************************************//* + * @brief Set compare value, mask value and time counter value + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] time_interval: timer interval value (ms) + * @return None + *******************************************************************************/ +void RIT_TimerConfig(LPC_RIT_TypeDef *RITx, uint32_t time_interval) +{ + uint32_t clock_rate, cmp_value; + CHECK_PARAM(PARAM_RITx(RITx)); + + // Get PCLK value of RIT + clock_rate = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_RIT); + + /* calculate compare value for RIT to generate interrupt at + * specified time interval + * COMPVAL = (RIT_PCLK * time_interval)/1000 + * (with time_interval unit is millisecond) + */ + cmp_value = (clock_rate /1000) * time_interval; + RITx->RICOMPVAL = cmp_value; + + /* Set timer enable clear bit to clear timer to 0 whenever + * counter value equals the contents of RICOMPVAL + */ + RITx->RICTRL |= (1<<1); +} + + +/******************************************************************************//* + * @brief Enable/Disable Timer + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] NewState New State of this function + * -ENABLE: Enable Timer + * -DISABLE: Disable Timer + * @return None + *******************************************************************************/ +void RIT_Cmd(LPC_RIT_TypeDef *RITx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + //Enable or Disable Timer + if(NewState==ENABLE) + { + RITx->RICTRL |= RIT_CTRL_TEN; + } + else + { + RITx->RICTRL &= ~RIT_CTRL_TEN; + } +} + +/******************************************************************************//* + * @brief Timer Enable/Disable on debug + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] NewState New State of this function + * -ENABLE: The timer is halted whenever a hardware break condition occurs + * -DISABLE: Hardware break has no effect on the timer operation + * @return None + *******************************************************************************/ +void RIT_TimerDebugCmd(LPC_RIT_TypeDef *RITx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + //Timer Enable/Disable on break + if(NewState==ENABLE) + { + RITx->RICTRL |= RIT_CTRL_ENBR; + } + else + { + RITx->RICTRL &= ~RIT_CTRL_ENBR; + } +} +/******************************************************************************//* + * @brief Check whether interrupt flag is set or not + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return Current interrupt status, could be: SET/RESET + *******************************************************************************/ +IntStatus RIT_GetIntStatus(LPC_RIT_TypeDef *RITx) +{ + IntStatus result; + CHECK_PARAM(PARAM_RITx(RITx)); + if((RITx->RICTRL&RIT_CTRL_INTEN)==1) result= SET; + else return RESET; + //clear interrupt flag + RITx->RICTRL |= RIT_CTRL_INTEN; + return result; +} + +/** + * @} + */ + +#endif /* _RIT */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c new file mode 100644 index 0000000000..c47f938365 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c @@ -0,0 +1,783 @@ +/********************************************************************** +* $Id$ lpc17xx_rtc.c 2011-06-06 +*//** +* @file lpc17xx_rtc.c +* @brief Contains all functions support for RTC firmware library on LPC17xx +* @version 3.1 +* @date 6. June. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup RTC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_rtc.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _RTC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup RTC_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the RTC peripheral. + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + *********************************************************************/ +void RTC_Init (LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + /* Set up clock and power for RTC module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRTC, ENABLE); + + // Clear all register to be default + RTCx->ILR = 0x00; + RTCx->CCR = 0x00; + RTCx->CIIR = 0x00; + RTCx->AMR = 0xFF; + RTCx->CALIBRATION = 0x00; +} + + +/*********************************************************************//** + * @brief De-initializes the RTC peripheral registers to their +* default reset values. + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + **********************************************************************/ +void RTC_DeInit(LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->CCR = 0x00; + // Disable power and clock for RTC module + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRTC, DISABLE); +} + +/*********************************************************************//** + * @brief Reset clock tick counter in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + **********************************************************************/ +void RTC_ResetClockTickCounter(LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->CCR |= RTC_CCR_CTCRST; + RTCx->CCR &= (~RTC_CCR_CTCRST) & RTC_CCR_BITMASK; +} + +/*********************************************************************//** + * @brief Start/Stop RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] NewState New State of this function, should be: + * - ENABLE: The time counters are enabled + * - DISABLE: The time counters are disabled + * @return None + **********************************************************************/ +void RTC_Cmd (LPC_RTC_TypeDef *RTCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + RTCx->CCR |= RTC_CCR_CLKEN; + } + else + { + RTCx->CCR &= (~RTC_CCR_CLKEN) & RTC_CCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Counter increment interrupt for each time type + * in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] CntIncrIntType: Counter Increment Interrupt type, + * an increment of this type value below will generates + * an interrupt, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] NewState New State of this function, should be: + * - ENABLE: Counter Increment interrupt for this + * time type are enabled + * - DISABLE: Counter Increment interrupt for this + * time type are disabled + * @return None + **********************************************************************/ +void RTC_CntIncrIntConfig (LPC_RTC_TypeDef *RTCx, uint32_t CntIncrIntType, \ + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(CntIncrIntType)); + + if (NewState == ENABLE) + { + switch (CntIncrIntType) + { + case RTC_TIMETYPE_SECOND: + RTCx->CIIR |= RTC_CIIR_IMSEC; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->CIIR |= RTC_CIIR_IMMIN; + break; + case RTC_TIMETYPE_HOUR: + RTCx->CIIR |= RTC_CIIR_IMHOUR; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->CIIR |= RTC_CIIR_IMDOW; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->CIIR |= RTC_CIIR_IMDOM; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->CIIR |= RTC_CIIR_IMDOY; + break; + case RTC_TIMETYPE_MONTH: + RTCx->CIIR |= RTC_CIIR_IMMON; + break; + case RTC_TIMETYPE_YEAR: + RTCx->CIIR |= RTC_CIIR_IMYEAR; + break; + } + } + else + { + switch (CntIncrIntType) + { + case RTC_TIMETYPE_SECOND: + RTCx->CIIR &= (~RTC_CIIR_IMSEC) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->CIIR &= (~RTC_CIIR_IMMIN) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_HOUR: + RTCx->CIIR &= (~RTC_CIIR_IMHOUR) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->CIIR &= (~RTC_CIIR_IMDOW) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->CIIR &= (~RTC_CIIR_IMDOM) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->CIIR &= (~RTC_CIIR_IMDOY) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_MONTH: + RTCx->CIIR &= (~RTC_CIIR_IMMON) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_YEAR: + RTCx->CIIR &= (~RTC_CIIR_IMYEAR) & RTC_CIIR_BITMASK; + break; + } + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Alarm interrupt for each time type + * in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] AlarmTimeType: Alarm Time Interrupt type, + * an matching of this type value below with current time + * in RTC will generates an interrupt, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] NewState New State of this function, should be: + * - ENABLE: Alarm interrupt for this + * time type are enabled + * - DISABLE: Alarm interrupt for this + * time type are disabled + * @return None + **********************************************************************/ +void RTC_AlarmIntConfig (LPC_RTC_TypeDef *RTCx, uint32_t AlarmTimeType, \ + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(AlarmTimeType)); + + if (NewState == ENABLE) + { + switch (AlarmTimeType) + { + case RTC_TIMETYPE_SECOND: + RTCx->AMR &= (~RTC_AMR_AMRSEC) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->AMR &= (~RTC_AMR_AMRMIN) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_HOUR: + RTCx->AMR &= (~RTC_AMR_AMRHOUR) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->AMR &= (~RTC_AMR_AMRDOW) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->AMR &= (~RTC_AMR_AMRDOM) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->AMR &= (~RTC_AMR_AMRDOY) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_MONTH: + RTCx->AMR &= (~RTC_AMR_AMRMON) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_YEAR: + RTCx->AMR &= (~RTC_AMR_AMRYEAR) & RTC_AMR_BITMASK; + break; + } + } + else + { + switch (AlarmTimeType) + { + case RTC_TIMETYPE_SECOND: + RTCx->AMR |= (RTC_AMR_AMRSEC); + break; + case RTC_TIMETYPE_MINUTE: + RTCx->AMR |= (RTC_AMR_AMRMIN); + break; + case RTC_TIMETYPE_HOUR: + RTCx->AMR |= (RTC_AMR_AMRHOUR); + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->AMR |= (RTC_AMR_AMRDOW); + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->AMR |= (RTC_AMR_AMRDOM); + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->AMR |= (RTC_AMR_AMRDOY); + break; + case RTC_TIMETYPE_MONTH: + RTCx->AMR |= (RTC_AMR_AMRMON); + break; + case RTC_TIMETYPE_YEAR: + RTCx->AMR |= (RTC_AMR_AMRYEAR); + break; + } + } +} + + +/*********************************************************************//** + * @brief Set current time value for each time type in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] TimeValue Time value to set + * @return None + **********************************************************************/ +void RTC_SetTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype, uint32_t TimeValue) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(Timetype)); + + switch ( Timetype) + { + case RTC_TIMETYPE_SECOND: + CHECK_PARAM(TimeValue <= RTC_SECOND_MAX); + + RTCx->SEC = TimeValue & RTC_SEC_MASK; + break; + + case RTC_TIMETYPE_MINUTE: + CHECK_PARAM(TimeValue <= RTC_MINUTE_MAX); + + RTCx->MIN = TimeValue & RTC_MIN_MASK; + break; + + case RTC_TIMETYPE_HOUR: + CHECK_PARAM(TimeValue <= RTC_HOUR_MAX); + + RTCx->HOUR = TimeValue & RTC_HOUR_MASK; + break; + + case RTC_TIMETYPE_DAYOFWEEK: + CHECK_PARAM(TimeValue <= RTC_DAYOFWEEK_MAX); + + RTCx->DOW = TimeValue & RTC_DOW_MASK; + break; + + case RTC_TIMETYPE_DAYOFMONTH: + CHECK_PARAM((TimeValue <= RTC_DAYOFMONTH_MAX) \ + && (TimeValue >= RTC_DAYOFMONTH_MIN)); + + RTCx->DOM = TimeValue & RTC_DOM_MASK; + break; + + case RTC_TIMETYPE_DAYOFYEAR: + CHECK_PARAM((TimeValue >= RTC_DAYOFYEAR_MIN) \ + && (TimeValue <= RTC_DAYOFYEAR_MAX)); + + RTCx->DOY = TimeValue & RTC_DOY_MASK; + break; + + case RTC_TIMETYPE_MONTH: + CHECK_PARAM((TimeValue >= RTC_MONTH_MIN) \ + && (TimeValue <= RTC_MONTH_MAX)); + + RTCx->MONTH = TimeValue & RTC_MONTH_MASK; + break; + + case RTC_TIMETYPE_YEAR: + CHECK_PARAM(TimeValue <= RTC_YEAR_MAX); + + RTCx->YEAR = TimeValue & RTC_YEAR_MASK; + break; + } +} + +/*********************************************************************//** + * @brief Get current time value for each type time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @return Value of time according to specified time type + **********************************************************************/ +uint32_t RTC_GetTime(LPC_RTC_TypeDef *RTCx, uint32_t Timetype) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(Timetype)); + + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + return (RTCx->SEC & RTC_SEC_MASK); + case RTC_TIMETYPE_MINUTE: + return (RTCx->MIN & RTC_MIN_MASK); + case RTC_TIMETYPE_HOUR: + return (RTCx->HOUR & RTC_HOUR_MASK); + case RTC_TIMETYPE_DAYOFWEEK: + return (RTCx->DOW & RTC_DOW_MASK); + case RTC_TIMETYPE_DAYOFMONTH: + return (RTCx->DOM & RTC_DOM_MASK); + case RTC_TIMETYPE_DAYOFYEAR: + return (RTCx->DOY & RTC_DOY_MASK); + case RTC_TIMETYPE_MONTH: + return (RTCx->MONTH & RTC_MONTH_MASK); + case RTC_TIMETYPE_YEAR: + return (RTCx->YEAR & RTC_YEAR_MASK); + default: + return (0); + } +} + + +/*********************************************************************//** + * @brief Set full of time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * contains time value in full. + * @return None + **********************************************************************/ +void RTC_SetFullTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->DOM = pFullTime->DOM & RTC_DOM_MASK; + RTCx->DOW = pFullTime->DOW & RTC_DOW_MASK; + RTCx->DOY = pFullTime->DOY & RTC_DOY_MASK; + RTCx->HOUR = pFullTime->HOUR & RTC_HOUR_MASK; + RTCx->MIN = pFullTime->MIN & RTC_MIN_MASK; + RTCx->SEC = pFullTime->SEC & RTC_SEC_MASK; + RTCx->MONTH = pFullTime->MONTH & RTC_MONTH_MASK; + RTCx->YEAR = pFullTime->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Get full of time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * will be stored time in full. + * @return None + **********************************************************************/ +void RTC_GetFullTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + pFullTime->DOM = RTCx->DOM & RTC_DOM_MASK; + pFullTime->DOW = RTCx->DOW & RTC_DOW_MASK; + pFullTime->DOY = RTCx->DOY & RTC_DOY_MASK; + pFullTime->HOUR = RTCx->HOUR & RTC_HOUR_MASK; + pFullTime->MIN = RTCx->MIN & RTC_MIN_MASK; + pFullTime->SEC = RTCx->SEC & RTC_SEC_MASK; + pFullTime->MONTH = RTCx->MONTH & RTC_MONTH_MASK; + pFullTime->YEAR = RTCx->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Set alarm time value for each time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] ALValue Alarm time value to set + * @return None + **********************************************************************/ +void RTC_SetAlarmTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype, uint32_t ALValue) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + CHECK_PARAM(ALValue <= RTC_SECOND_MAX); + + RTCx->ALSEC = ALValue & RTC_SEC_MASK; + break; + + case RTC_TIMETYPE_MINUTE: + CHECK_PARAM(ALValue <= RTC_MINUTE_MAX); + + RTCx->ALMIN = ALValue & RTC_MIN_MASK; + break; + + case RTC_TIMETYPE_HOUR: + CHECK_PARAM(ALValue <= RTC_HOUR_MAX); + + RTCx->ALHOUR = ALValue & RTC_HOUR_MASK; + break; + + case RTC_TIMETYPE_DAYOFWEEK: + CHECK_PARAM(ALValue <= RTC_DAYOFWEEK_MAX); + + RTCx->ALDOW = ALValue & RTC_DOW_MASK; + break; + + case RTC_TIMETYPE_DAYOFMONTH: + CHECK_PARAM((ALValue <= RTC_DAYOFMONTH_MAX) \ + && (ALValue >= RTC_DAYOFMONTH_MIN)); + + RTCx->ALDOM = ALValue & RTC_DOM_MASK; + break; + + case RTC_TIMETYPE_DAYOFYEAR: + CHECK_PARAM((ALValue >= RTC_DAYOFYEAR_MIN) \ + && (ALValue <= RTC_DAYOFYEAR_MAX)); + + RTCx->ALDOY = ALValue & RTC_DOY_MASK; + break; + + case RTC_TIMETYPE_MONTH: + CHECK_PARAM((ALValue >= RTC_MONTH_MIN) \ + && (ALValue <= RTC_MONTH_MAX)); + + RTCx->ALMON = ALValue & RTC_MONTH_MASK; + break; + + case RTC_TIMETYPE_YEAR: + CHECK_PARAM(ALValue <= RTC_YEAR_MAX); + + RTCx->ALYEAR = ALValue & RTC_YEAR_MASK; + break; + } +} + + + +/*********************************************************************//** + * @brief Get alarm time value for each time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @return Value of Alarm time according to specified time type + **********************************************************************/ +uint32_t RTC_GetAlarmTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype) +{ + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + return (RTCx->ALSEC & RTC_SEC_MASK); + case RTC_TIMETYPE_MINUTE: + return (RTCx->ALMIN & RTC_MIN_MASK); + case RTC_TIMETYPE_HOUR: + return (RTCx->ALHOUR & RTC_HOUR_MASK); + case RTC_TIMETYPE_DAYOFWEEK: + return (RTCx->ALDOW & RTC_DOW_MASK); + case RTC_TIMETYPE_DAYOFMONTH: + return (RTCx->ALDOM & RTC_DOM_MASK); + case RTC_TIMETYPE_DAYOFYEAR: + return (RTCx->ALDOY & RTC_DOY_MASK); + case RTC_TIMETYPE_MONTH: + return (RTCx->ALMON & RTC_MONTH_MASK); + case RTC_TIMETYPE_YEAR: + return (RTCx->ALYEAR & RTC_YEAR_MASK); + default: + return (0); + } +} + + +/*********************************************************************//** + * @brief Set full of alarm time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * contains alarm time value in full. + * @return None + **********************************************************************/ +void RTC_SetFullAlarmTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->ALDOM = pFullTime->DOM & RTC_DOM_MASK; + RTCx->ALDOW = pFullTime->DOW & RTC_DOW_MASK; + RTCx->ALDOY = pFullTime->DOY & RTC_DOY_MASK; + RTCx->ALHOUR = pFullTime->HOUR & RTC_HOUR_MASK; + RTCx->ALMIN = pFullTime->MIN & RTC_MIN_MASK; + RTCx->ALSEC = pFullTime->SEC & RTC_SEC_MASK; + RTCx->ALMON = pFullTime->MONTH & RTC_MONTH_MASK; + RTCx->ALYEAR = pFullTime->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Get full of alarm time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * will be stored alarm time in full. + * @return None + **********************************************************************/ +void RTC_GetFullAlarmTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + pFullTime->DOM = RTCx->ALDOM & RTC_DOM_MASK; + pFullTime->DOW = RTCx->ALDOW & RTC_DOW_MASK; + pFullTime->DOY = RTCx->ALDOY & RTC_DOY_MASK; + pFullTime->HOUR = RTCx->ALHOUR & RTC_HOUR_MASK; + pFullTime->MIN = RTCx->ALMIN & RTC_MIN_MASK; + pFullTime->SEC = RTCx->ALSEC & RTC_SEC_MASK; + pFullTime->MONTH = RTCx->ALMON & RTC_MONTH_MASK; + pFullTime->YEAR = RTCx->ALYEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Check whether if specified Location interrupt in + * RTC peripheral is set or not + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] IntType Interrupt location type, should be: + * - RTC_INT_COUNTER_INCREASE: Counter Increment Interrupt + * block generated an interrupt. + * - RTC_INT_ALARM: Alarm generated an + * interrupt. + * @return New state of specified Location interrupt in RTC peripheral + * (SET or RESET) + **********************************************************************/ +IntStatus RTC_GetIntPending (LPC_RTC_TypeDef *RTCx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_INT(IntType)); + + return ((RTCx->ILR & IntType) ? SET : RESET); +} + + +/*********************************************************************//** + * @brief Clear specified Location interrupt pending in + * RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] IntType Interrupt location type, should be: + * - RTC_INT_COUNTER_INCREASE: Clear Counter Increment + * Interrupt pending. + * - RTC_INT_ALARM: Clear alarm interrupt pending + * @return None + **********************************************************************/ +void RTC_ClearIntPending (LPC_RTC_TypeDef *RTCx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_INT(IntType)); + + RTCx->ILR |= IntType; +} + +/*********************************************************************//** + * @brief Enable/Disable calibration counter in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] NewState New State of this function, should be: + * - ENABLE: The calibration counter is enabled and counting + * - DISABLE: The calibration counter is disabled and reset to zero + * @return None + **********************************************************************/ +void RTC_CalibCounterCmd(LPC_RTC_TypeDef *RTCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + RTCx->CCR &= (~RTC_CCR_CCALEN) & RTC_CCR_BITMASK; + } + else + { + RTCx->CCR |= RTC_CCR_CCALEN; + } +} + + +/*********************************************************************//** + * @brief Configures Calibration in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] CalibValue Calibration value, should be in range from + * 0 to 131,072 + * @param[in] CalibDir Calibration Direction, should be: + * - RTC_CALIB_DIR_FORWARD: Forward calibration + * - RTC_CALIB_DIR_BACKWARD: Backward calibration + * @return None + **********************************************************************/ +void RTC_CalibConfig(LPC_RTC_TypeDef *RTCx, uint32_t CalibValue, uint8_t CalibDir) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_CALIB_DIR(CalibDir)); + CHECK_PARAM(CalibValue < RTC_CALIBRATION_MAX); + + RTCx->CALIBRATION = ((CalibValue) & RTC_CALIBRATION_CALVAL_MASK) \ + | ((CalibDir == RTC_CALIB_DIR_BACKWARD) ? RTC_CALIBRATION_LIBDIR : 0); +} + + +/*********************************************************************//** + * @brief Write value to General purpose registers + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Channel General purpose registers Channel number, + * should be in range from 0 to 4. + * @param[in] Value Value to write + * @return None + * Note: These General purpose registers can be used to store important + * information when the main power supply is off. The value in these + * registers is not affected by chip reset. + **********************************************************************/ +void RTC_WriteGPREG (LPC_RTC_TypeDef *RTCx, uint8_t Channel, uint32_t Value) +{ + uint32_t *preg; + + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_GPREG_CH(Channel)); + + preg = (uint32_t *)&RTCx->GPREG0; + preg += Channel; + *preg = Value; +} + + +/*********************************************************************//** + * @brief Read value from General purpose registers + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Channel General purpose registers Channel number, + * should be in range from 0 to 4. + * @return Read Value + * Note: These General purpose registers can be used to store important + * information when the main power supply is off. The value in these + * registers is not affected by chip reset. + **********************************************************************/ +uint32_t RTC_ReadGPREG (LPC_RTC_TypeDef *RTCx, uint8_t Channel) +{ + uint32_t *preg; + uint32_t value; + + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_GPREG_CH(Channel)); + + preg = (uint32_t *)&RTCx->GPREG0; + preg += Channel; + value = *preg; + return (value); +} + +/** + * @} + */ + +#endif /* _RTC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c new file mode 100644 index 0000000000..a690b39fc9 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c @@ -0,0 +1,443 @@ +/********************************************************************** +* $Id$ lpc17xx_spi.c 2010-05-21 +*//** +* @file lpc17xx_spi.c +* @brief Contains all functions support for SPI firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SPI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_spi.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _SPI + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SPI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Setup clock rate for SPI device + * @param[in] SPIx SPI peripheral definition, should be LPC_SPI + * @param[in] target_clock : clock of SPI (Hz) + * @return None + ***********************************************************************/ +void SPI_SetClock (LPC_SPI_TypeDef *SPIx, uint32_t target_clock) +{ + uint32_t spi_pclk; + uint32_t prescale, temp; + + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if (SPIx == LPC_SPI){ + spi_pclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SPI); + } else { + return; + } + + prescale = 8; + // Find closest clock to target clock + while (1){ + temp = target_clock * prescale; + if (temp >= spi_pclk){ + break; + } + prescale += 2; + if(prescale >= 254){ + break; + } + } + + // Write to register + SPIx->SPCCR = SPI_SPCCR_COUNTER(prescale); +} + + +/*********************************************************************//** + * @brief De-initializes the SPIx peripheral registers to their +* default reset values. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return None + **********************************************************************/ +void SPI_DeInit(LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if (SPIx == LPC_SPI){ + /* Set up clock and power for SPI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, DISABLE); + } +} + +/*********************************************************************//** + * @brief Get data bit size per transfer + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return number of bit per transfer, could be 8-16 + **********************************************************************/ +uint8_t SPI_GetDataSize (LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + return ((SPIx->SPCR)>>8 & 0xF); +} + +/********************************************************************//** + * @brief Initializes the SPIx peripheral according to the specified +* parameters in the UART_ConfigStruct. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] SPI_ConfigStruct Pointer to a SPI_CFG_Type structure +* that contains the configuration information for the +* specified SPI peripheral. + * @return None + *********************************************************************/ +void SPI_Init(LPC_SPI_TypeDef *SPIx, SPI_CFG_Type *SPI_ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if(SPIx == LPC_SPI){ + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, ENABLE); + } else { + return; + } + + // Configure SPI, interrupt is disable as default + tmp = ((SPI_ConfigStruct->CPHA) | (SPI_ConfigStruct->CPOL) \ + | (SPI_ConfigStruct->DataOrder) | (SPI_ConfigStruct->Databit) \ + | (SPI_ConfigStruct->Mode) | SPI_SPCR_BIT_EN) & SPI_SPCR_BITMASK; + // write back to SPI control register + SPIx->SPCR = tmp; + + // Set clock rate for SPI peripheral + SPI_SetClock(SPIx, SPI_ConfigStruct->ClockRate); + + // If interrupt flag is set, Write '1' to Clear interrupt flag + if (SPIx->SPINT & SPI_SPINT_INTFLAG){ + SPIx->SPINT = SPI_SPINT_INTFLAG; + } +} + + + +/*****************************************************************************//** +* @brief Fills each SPI_InitStruct member with its default value: +* - CPHA = SPI_CPHA_FIRST +* - CPOL = SPI_CPOL_HI +* - ClockRate = 1000000 +* - DataOrder = SPI_DATA_MSB_FIRST +* - Databit = SPI_DATABIT_8 +* - Mode = SPI_MASTER_MODE +* @param[in] SPI_InitStruct Pointer to a SPI_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void SPI_ConfigStructInit(SPI_CFG_Type *SPI_InitStruct) +{ + SPI_InitStruct->CPHA = SPI_CPHA_FIRST; + SPI_InitStruct->CPOL = SPI_CPOL_HI; + SPI_InitStruct->ClockRate = 1000000; + SPI_InitStruct->DataOrder = SPI_DATA_MSB_FIRST; + SPI_InitStruct->Databit = SPI_DATABIT_8; + SPI_InitStruct->Mode = SPI_MASTER_MODE; +} + +/*********************************************************************//** + * @brief Transmit a single data through SPIx peripheral + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] Data Data to transmit (must be 16 or 8-bit long, + * this depend on SPI data bit number configured) + * @return none + **********************************************************************/ +void SPI_SendData(LPC_SPI_TypeDef* SPIx, uint16_t Data) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + SPIx->SPDR = Data & SPI_SPDR_BITMASK; +} + + + +/*********************************************************************//** + * @brief Receive a single data from SPIx peripheral + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return Data received (16-bit long) + **********************************************************************/ +uint16_t SPI_ReceiveData(LPC_SPI_TypeDef* SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return ((uint16_t) (SPIx->SPDR & SPI_SPDR_BITMASK)); +} + +/*********************************************************************//** + * @brief SPI Read write data function + * @param[in] SPIx Pointer to SPI peripheral, should be LPC_SPI + * @param[in] dataCfg Pointer to a SPI_DATA_SETUP_Type structure that + * contains specified information about transmit + * data configuration. + * @param[in] xfType Transfer type, should be: + * - SPI_TRANSFER_POLLING: Polling mode + * - SPI_TRANSFER_INTERRUPT: Interrupt mode + * @return Actual Data length has been transferred in polling mode. + * In interrupt mode, always return (0) + * Return (-1) if error. + * Note: This function can be used in both master and slave mode. + ***********************************************************************/ +int32_t SPI_ReadWrite (LPC_SPI_TypeDef *SPIx, SPI_DATA_SETUP_Type *dataCfg, \ + SPI_TRANSFER_Type xfType) +{ + uint8_t *rdata8; + uint8_t *wdata8; + uint16_t *rdata16; + uint16_t *wdata16; + uint32_t stat; + uint32_t temp; + uint8_t dataword; + + //read for empty buffer + temp = SPIx->SPDR; + //dummy to clear status + temp = SPIx->SPSR; + dataCfg->counter = 0; + dataCfg->status = 0; + + if(SPI_GetDataSize (SPIx) == 8) + dataword = 0; + else dataword = 1; + if (xfType == SPI_TRANSFER_POLLING){ + + if (dataword == 0){ + rdata8 = (uint8_t *)dataCfg->rx_data; + wdata8 = (uint8_t *)dataCfg->tx_data; + } else { + rdata16 = (uint16_t *)dataCfg->rx_data; + wdata16 = (uint16_t *)dataCfg->tx_data; + } + + while(dataCfg->counter < dataCfg->length) + { + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SPI_SendData(SPIx, 0xFF); + } else { + SPI_SendData(SPIx, 0xFFFF); + } + } else { + if (dataword == 0){ + SPI_SendData(SPIx, *wdata8); + wdata8++; + } else { + SPI_SendData(SPIx, *wdata16); + wdata16++; + } + } + // Wait for transfer complete + while (!((stat = SPIx->SPSR) & SPI_SPSR_SPIF)); + // Check for error + if (stat & (SPI_SPSR_ABRT | SPI_SPSR_MODF | SPI_SPSR_ROVR | SPI_SPSR_WCOL)){ + // save status + dataCfg->status = stat | SPI_STAT_ERROR; + return (dataCfg->counter); + } + // Read data from SPI dat + temp = (uint32_t) SPI_ReceiveData(SPIx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(rdata8) = (uint8_t) temp; + rdata8++; + } else { + *(rdata16) = (uint16_t) temp; + rdata16++; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->counter++; + } else { + dataCfg->counter += 2; + } + } + + // Return length of actual data transferred + // save status + dataCfg->status = stat | SPI_STAT_DONE; + return (dataCfg->counter); + } + // Interrupt mode + else { + + // Check if interrupt flag is already set + if(SPIx->SPINT & SPI_SPINT_INTFLAG){ + SPIx->SPINT = SPI_SPINT_INTFLAG; + } + if (dataCfg->counter < dataCfg->length){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SPI_SendData(SPIx, 0xFF); + } else { + SPI_SendData(SPIx, 0xFFFF); + } + } else { + if (dataword == 0){ + SPI_SendData(SPIx, (*(uint8_t *)dataCfg->tx_data)); + } else { + SPI_SendData(SPIx, (*(uint16_t *)dataCfg->tx_data)); + } + } + SPI_IntCmd(SPIx, ENABLE); + } else { + // Save status + dataCfg->status = SPI_STAT_DONE; + } + return (0); + } +} + + +/********************************************************************//** + * @brief Enable or disable SPIx interrupt. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] NewState New state of specified UART interrupt type, + * should be: + * - ENALBE: Enable this SPI interrupt. +* - DISALBE: Disable this SPI interrupt. + * @return None + *********************************************************************/ +void SPI_IntCmd(LPC_SPI_TypeDef *SPIx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SPIx->SPCR |= SPI_SPCR_SPIE; + } + else + { + SPIx->SPCR &= (~SPI_SPCR_SPIE) & SPI_SPCR_BITMASK; + } +} + + +/********************************************************************//** + * @brief Checks whether the SPI interrupt flag is set or not. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return The new state of SPI Interrupt Flag (SET or RESET) + *********************************************************************/ +IntStatus SPI_GetIntStatus (LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return ((SPIx->SPINT & SPI_SPINT_INTFLAG) ? SET : RESET); +} + +/********************************************************************//** + * @brief Clear SPI interrupt flag. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return None + *********************************************************************/ +void SPI_ClearIntPending(LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + SPIx->SPINT = SPI_SPINT_INTFLAG; +} + +/********************************************************************//** + * @brief Get current value of SPI Status register in SPIx peripheral. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return Current value of SPI Status register in SPI peripheral. + * Note: The return value of this function must be used with + * SPI_CheckStatus() to determine current flag status + * corresponding to each SPI status type. Because some flags in + * SPI Status register will be cleared after reading, the next reading + * SPI Status register could not be correct. So this function used to + * read SPI status register in one time only, then the return value + * used to check all flags. + *********************************************************************/ +uint32_t SPI_GetStatus(LPC_SPI_TypeDef* SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return (SPIx->SPSR & SPI_SPSR_BITMASK); +} + +/********************************************************************//** + * @brief Checks whether the specified SPI Status flag is set or not + * via inputSPIStatus parameter. + * @param[in] inputSPIStatus Value to check status of each flag type. + * This value is the return value from SPI_GetStatus(). + * @param[in] SPIStatus Specifies the SPI status flag to check, + * should be one of the following: + - SPI_STAT_ABRT: Slave abort. + - SPI_STAT_MODF: Mode fault. + - SPI_STAT_ROVR: Read overrun. + - SPI_STAT_WCOL: Write collision. + - SPI_STAT_SPIF: SPI transfer complete. + * @return The new state of SPIStatus (SET or RESET) + *********************************************************************/ +FlagStatus SPI_CheckStatus (uint32_t inputSPIStatus, uint8_t SPIStatus) +{ + CHECK_PARAM(PARAM_SPI_STAT(SPIStatus)); + + return ((inputSPIStatus & SPIStatus) ? SET : RESET); +} + + +/** + * @} + */ + +#endif /* _SPI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c new file mode 100644 index 0000000000..a5f0c645bd --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c @@ -0,0 +1,694 @@ +/********************************************************************** +* $Id$ lpc17xx_ssp.c 2010-06-18 +*//** +* @file lpc17xx_ssp.c +* @brief Contains all functions support for SSP firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SSP + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_ssp.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _SSP + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SSP_Public_Functions + * @{ + */ +static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock); + +/*********************************************************************//** + * @brief Setup clock rate for SSP device + * @param[in] SSPx SSP peripheral definition, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] target_clock : clock of SSP (Hz) + * @return None + ***********************************************************************/ +static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock) +{ + uint32_t prescale, cr0_div, cmp_clk, ssp_clk; + + CHECK_PARAM(PARAM_SSPx(SSPx)); + + /* The SSP clock is derived from the (main system oscillator / 2), + so compute the best divider from that clock */ + if (SSPx == LPC_SSP0){ + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP0); + } else if (SSPx == LPC_SSP1) { + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP1); + } else { + return; + } + + /* Find closest divider to get at or under the target frequency. + Use smallest prescale possible and rely on the divider to get + the closest target frequency */ + cr0_div = 0; + cmp_clk = 0xFFFFFFFF; + prescale = 2; + while (cmp_clk > target_clock) + { + cmp_clk = ssp_clk / ((cr0_div + 1) * prescale); + if (cmp_clk > target_clock) + { + cr0_div++; + if (cr0_div > 0xFF) + { + cr0_div = 0; + prescale += 2; + } + } + } + + /* Write computed prescaler and divider back to register */ + SSPx->CR0 &= (~SSP_CR0_SCR(0xFF)) & SSP_CR0_BITMASK; + SSPx->CR0 |= (SSP_CR0_SCR(cr0_div)) & SSP_CR0_BITMASK; + SSPx->CPSR = prescale & SSP_CPSR_BITMASK; +} + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SSP_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the SSPx peripheral according to the specified +* parameters in the SSP_ConfigStruct. + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] SSP_ConfigStruct Pointer to a SSP_CFG_Type structure +* that contains the configuration information for the +* specified SSP peripheral. + * @return None + *********************************************************************/ +void SSP_Init(LPC_SSP_TypeDef *SSPx, SSP_CFG_Type *SSP_ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if(SSPx == LPC_SSP0) { + /* Set up clock and power for SSP0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, ENABLE); + } else if(SSPx == LPC_SSP1) { + /* Set up clock and power for SSP1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, ENABLE); + } else { + return; + } + + /* Configure SSP, interrupt is disable, LoopBack mode is disable, + * SSP is disable, Slave output is disable as default + */ + tmp = ((SSP_ConfigStruct->CPHA) | (SSP_ConfigStruct->CPOL) \ + | (SSP_ConfigStruct->FrameFormat) | (SSP_ConfigStruct->Databit)) + & SSP_CR0_BITMASK; + // write back to SSP control register + SSPx->CR0 = tmp; + + tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK; + // Write back to CR1 + SSPx->CR1 = tmp; + + // Set clock rate for SSP peripheral + setSSPclock(SSPx, SSP_ConfigStruct->ClockRate); +} + +/*********************************************************************//** + * @brief De-initializes the SSPx peripheral registers to their +* default reset values. + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return None + **********************************************************************/ +void SSP_DeInit(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if (SSPx == LPC_SSP0){ + /* Set up clock and power for SSP0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, DISABLE); + } else if (SSPx == LPC_SSP1) { + /* Set up clock and power for SSP1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, DISABLE); + } +} + +/*****************************************************************************//** +* @brief Get data size bit selected +* @param[in] SSPx pointer to LPC_SSP_TypeDef structure, should be: +* - LPC_SSP0: SSP0 peripheral +* - LPC_SSP1: SSP1 peripheral +* @return Data size, could be: +* - SSP_DATABIT_4: 4 bit transfer +* - SSP_DATABIT_5: 5 bit transfer +* ... +* - SSP_DATABIT_16: 16 bit transfer +*******************************************************************************/ +uint8_t SSP_GetDataSize(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + return (SSPx->CR0 & (0xF)); +} + +/*****************************************************************************//** +* @brief Fills each SSP_InitStruct member with its default value: +* - CPHA = SSP_CPHA_FIRST +* - CPOL = SSP_CPOL_HI +* - ClockRate = 1000000 +* - Databit = SSP_DATABIT_8 +* - Mode = SSP_MASTER_MODE +* - FrameFormat = SSP_FRAME_SSP +* @param[in] SSP_InitStruct Pointer to a SSP_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void SSP_ConfigStructInit(SSP_CFG_Type *SSP_InitStruct) +{ + SSP_InitStruct->CPHA = SSP_CPHA_FIRST; + SSP_InitStruct->CPOL = SSP_CPOL_HI; + SSP_InitStruct->ClockRate = 1000000; + SSP_InitStruct->Databit = SSP_DATABIT_8; + SSP_InitStruct->Mode = SSP_MASTER_MODE; + SSP_InitStruct->FrameFormat = SSP_FRAME_SPI; +} + + +/*********************************************************************//** + * @brief Enable or disable SSP peripheral's operation + * @param[in] SSPx SSP peripheral, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of SSPx peripheral's operation + * @return none + **********************************************************************/ +void SSP_Cmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 |= SSP_CR1_SSP_EN; + } + else + { + SSPx->CR1 &= (~SSP_CR1_SSP_EN) & SSP_CR1_BITMASK; + } +} + +/*********************************************************************//** + * @brief Enable or disable Loop Back mode function in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of Loop Back mode, should be: + * - ENABLE: Enable this function + * - DISABLE: Disable this function + * @return None + **********************************************************************/ +void SSP_LoopBackCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 |= SSP_CR1_LBM_EN; + } + else + { + SSPx->CR1 &= (~SSP_CR1_LBM_EN) & SSP_CR1_BITMASK; + } +} + +/*********************************************************************//** + * @brief Enable or disable Slave Output function in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of Slave Output function, should be: + * - ENABLE: Slave Output in normal operation + * - DISABLE: Slave Output is disabled. This blocks + * SSP controller from driving the transmit data + * line (MISO) + * Note: This function is available when SSP peripheral in Slave mode + * @return None + **********************************************************************/ +void SSP_SlaveOutputCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 &= (~SSP_CR1_SO_DISABLE) & SSP_CR1_BITMASK; + } + else + { + SSPx->CR1 |= SSP_CR1_SO_DISABLE; + } +} + + + +/*********************************************************************//** + * @brief Transmit a single data through SSPx peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] Data Data to transmit (must be 16 or 8-bit long, + * this depend on SSP data bit number configured) + * @return none + **********************************************************************/ +void SSP_SendData(LPC_SSP_TypeDef* SSPx, uint16_t Data) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + SSPx->DR = SSP_DR_BITMASK(Data); +} + + + +/*********************************************************************//** + * @brief Receive a single data from SSPx peripheral + * @param[in] SSPx SSP peripheral selected, should be + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return Data received (16-bit long) + **********************************************************************/ +uint16_t SSP_ReceiveData(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + return ((uint16_t) (SSP_DR_BITMASK(SSPx->DR))); +} + +/*********************************************************************//** + * @brief SSP Read write data function + * @param[in] SSPx Pointer to SSP peripheral, should be + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] dataCfg Pointer to a SSP_DATA_SETUP_Type structure that + * contains specified information about transmit + * data configuration. + * @param[in] xfType Transfer type, should be: + * - SSP_TRANSFER_POLLING: Polling mode + * - SSP_TRANSFER_INTERRUPT: Interrupt mode + * @return Actual Data length has been transferred in polling mode. + * In interrupt mode, always return (0) + * Return (-1) if error. + * Note: This function can be used in both master and slave mode. + ***********************************************************************/ +int32_t SSP_ReadWrite (LPC_SSP_TypeDef *SSPx, SSP_DATA_SETUP_Type *dataCfg, \ + SSP_TRANSFER_Type xfType) +{ + uint8_t *rdata8; + uint8_t *wdata8; + uint16_t *rdata16; + uint16_t *wdata16; + uint32_t stat; + uint32_t tmp; + int32_t dataword; + + dataCfg->rx_cnt = 0; + dataCfg->tx_cnt = 0; + dataCfg->status = 0; + + + /* Clear all remaining data in RX FIFO */ + while (SSPx->SR & SSP_SR_RNE){ + tmp = (uint32_t) SSP_ReceiveData(SSPx); + } + + // Clear status + SSPx->ICR = SSP_ICR_BITMASK; + if(SSP_GetDataSize(SSPx)>SSP_DATABIT_8) + dataword = 1; + else dataword = 0; + + // Polling mode ---------------------------------------------------------------------- + if (xfType == SSP_TRANSFER_POLLING){ + if (dataword == 0){ + rdata8 = (uint8_t *)dataCfg->rx_data; + wdata8 = (uint8_t *)dataCfg->tx_data; + } else { + rdata16 = (uint16_t *)dataCfg->rx_data; + wdata16 = (uint16_t *)dataCfg->tx_data; + } + while ((dataCfg->tx_cnt < dataCfg->length) || (dataCfg->rx_cnt < dataCfg->length)){ + if ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt < dataCfg->length)){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SSP_SendData(SSPx, 0xFF); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, 0xFFFF); + dataCfg->tx_cnt += 2; + } + } else { + if (dataword == 0){ + SSP_SendData(SSPx, *wdata8); + wdata8++; + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, *wdata16); + wdata16++; + dataCfg->tx_cnt += 2; + } + } + } + + // Check overrun error + if ((stat = SSPx->RIS) & SSP_RIS_ROR){ + // save status and return + dataCfg->status = stat | SSP_STAT_ERROR; + return (-1); + } + + // Check for any data available in RX FIFO + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt < dataCfg->length)){ + // Read data from SSP data + tmp = SSP_ReceiveData(SSPx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(rdata8) = (uint8_t) tmp; + rdata8++; + } else { + *(rdata16) = (uint16_t) tmp; + rdata16++; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->rx_cnt++; + } else { + dataCfg->rx_cnt += 2; + } + } + } + + // save status + dataCfg->status = SSP_STAT_DONE; + + if (dataCfg->tx_data != NULL){ + return dataCfg->tx_cnt; + } else if (dataCfg->rx_data != NULL){ + return dataCfg->rx_cnt; + } else { + return (0); + } + } + + // Interrupt mode ---------------------------------------------------------------------- + else if (xfType == SSP_TRANSFER_INTERRUPT){ + + while ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt < dataCfg->length)){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SSP_SendData(SSPx, 0xFF); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, 0xFFFF); + dataCfg->tx_cnt += 2; + } + } else { + if (dataword == 0){ + SSP_SendData(SSPx, (*(uint8_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt))); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, (*(uint16_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt))); + dataCfg->tx_cnt += 2; + } + } + + // Check error + if ((stat = SSPx->RIS) & SSP_RIS_ROR){ + // save status and return + dataCfg->status = stat | SSP_STAT_ERROR; + return (-1); + } + + // Check for any data available in RX FIFO + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt < dataCfg->length)){ + // Read data from SSP data + tmp = SSP_ReceiveData(SSPx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(uint8_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint8_t) tmp; + } else { + *(uint16_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint16_t) tmp; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->rx_cnt++; + } else { + dataCfg->rx_cnt += 2; + } + } + } + + // If there more data to sent or receive + if ((dataCfg->rx_cnt < dataCfg->length) || (dataCfg->tx_cnt < dataCfg->length)){ + // Enable all interrupt + SSPx->IMSC = SSP_IMSC_BITMASK; + } else { + // Save status + dataCfg->status = SSP_STAT_DONE; + } + return (0); + } + + return (-1); +} + +/*********************************************************************//** + * @brief Checks whether the specified SSP status flag is set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] FlagType Type of flag to check status, should be one + * of following: + * - SSP_STAT_TXFIFO_EMPTY: TX FIFO is empty + * - SSP_STAT_TXFIFO_NOTFULL: TX FIFO is not full + * - SSP_STAT_RXFIFO_NOTEMPTY: RX FIFO is not empty + * - SSP_STAT_RXFIFO_FULL: RX FIFO is full + * - SSP_STAT_BUSY: SSP peripheral is busy + * @return New State of specified SSP status flag + **********************************************************************/ +FlagStatus SSP_GetStatus(LPC_SSP_TypeDef* SSPx, uint32_t FlagType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_STAT(FlagType)); + + return ((SSPx->SR & FlagType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Enable or disable specified interrupt type in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Interrupt type in SSP peripheral, should be: + * - SSP_INTCFG_ROR: Receive Overrun interrupt + * - SSP_INTCFG_RT: Receive Time out interrupt + * - SSP_INTCFG_RX: RX FIFO is at least half full interrupt + * - SSP_INTCFG_TX: TX FIFO is at least half empty interrupt + * @param[in] NewState New State of specified interrupt type, should be: + * - ENABLE: Enable this interrupt type + * - DISABLE: Disable this interrupt type + * @return None + * Note: We can enable/disable multi-interrupt type by OR multi value + **********************************************************************/ +void SSP_IntConfig(LPC_SSP_TypeDef *SSPx, uint32_t IntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if (NewState == ENABLE) + { + SSPx->IMSC |= IntType; + } + else + { + SSPx->IMSC &= (~IntType) & SSP_IMSC_BITMASK; + } +} + +/*********************************************************************//** + * @brief Check whether the specified Raw interrupt status flag is + * set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] RawIntType Raw Interrupt Type, should be: + * - SSP_INTSTAT_RAW_ROR: Receive Overrun interrupt + * - SSP_INTSTAT_RAW_RT: Receive Time out interrupt + * - SSP_INTSTAT_RAW_RX: RX FIFO is at least half full interrupt + * - SSP_INTSTAT_RAW_TX: TX FIFO is at least half empty interrupt + * @return New State of specified Raw interrupt status flag in SSP peripheral + * Note: Enabling/Disabling specified interrupt in SSP peripheral does not + * effect to Raw Interrupt Status flag. + **********************************************************************/ +IntStatus SSP_GetRawIntStatus(LPC_SSP_TypeDef *SSPx, uint32_t RawIntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTSTAT_RAW(RawIntType)); + + return ((SSPx->RIS & RawIntType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Get Raw Interrupt Status register + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return Raw Interrupt Status (RIS) register value + **********************************************************************/ +uint32_t SSP_GetRawIntStatusReg(LPC_SSP_TypeDef *SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + return (SSPx->RIS); +} + +/*********************************************************************//** + * @brief Check whether the specified interrupt status flag is + * set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Raw Interrupt Type, should be: + * - SSP_INTSTAT_ROR: Receive Overrun interrupt + * - SSP_INTSTAT_RT: Receive Time out interrupt + * - SSP_INTSTAT_RX: RX FIFO is at least half full interrupt + * - SSP_INTSTAT_TX: TX FIFO is at least half empty interrupt + * @return New State of specified interrupt status flag in SSP peripheral + * Note: Enabling/Disabling specified interrupt in SSP peripheral effects + * to Interrupt Status flag. + **********************************************************************/ +IntStatus SSP_GetIntStatus (LPC_SSP_TypeDef *SSPx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTSTAT(IntType)); + + return ((SSPx->MIS & IntType) ? SET :RESET); +} + +/*********************************************************************//** + * @brief Clear specified interrupt pending in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Interrupt pending to clear, should be: + * - SSP_INTCLR_ROR: clears the "frame was received when + * RxFIFO was full" interrupt. + * - SSP_INTCLR_RT: clears the "Rx FIFO was not empty and + * has not been read for a timeout period" interrupt. + * @return None + **********************************************************************/ +void SSP_ClearIntPending(LPC_SSP_TypeDef *SSPx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTCLR(IntType)); + + SSPx->ICR = IntType; +} + +/*********************************************************************//** + * @brief Enable/Disable DMA function for SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] DMAMode Type of DMA, should be: + * - SSP_DMA_TX: DMA for the transmit FIFO + * - SSP_DMA_RX: DMA for the Receive FIFO + * @param[in] NewState New State of DMA function on SSP peripheral, + * should be: + * - ENALBE: Enable this function + * - DISABLE: Disable this function + * @return None + **********************************************************************/ +void SSP_DMACmd(LPC_SSP_TypeDef *SSPx, uint32_t DMAMode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_DMA(DMAMode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->DMACR |= DMAMode; + } + else + { + SSPx->DMACR &= (~DMAMode) & SSP_DMA_BITMASK; + } +} + +/** + * @} + */ + +#endif /* _SSP */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c new file mode 100644 index 0000000000..bc10c1c6d5 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c @@ -0,0 +1,193 @@ +/********************************************************************** +* $Id$ lpc17xx_systick.c 2010-05-21 +*//** +* @file lpc17xx_systick.c +* @brief Contains all functions support for SYSTICK firmware library +* on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SYSTICK + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_systick.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _SYSTICK + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SYSTICK_Public_Functions + * @{ + */ +/*********************************************************************//** + * @brief Initial System Tick with using internal CPU clock source + * @param[in] time time interval(ms) + * @return None + **********************************************************************/ +void SYSTICK_InternalInit(uint32_t time) +{ + uint32_t cclk; + float maxtime; + + cclk = SystemCoreClock; + /* With internal CPU clock frequency for LPC17xx is 'SystemCoreClock' + * And limit 24 bit for RELOAD value + * So the maximum time can be set: + * 1/SystemCoreClock * (2^24) * 1000 (ms) + */ + //check time value is available or not + maxtime = (1<<24)/(SystemCoreClock / 1000); + if(time > maxtime) + //Error loop + while(1); + else + { + //Select CPU clock is System Tick clock source + SysTick->CTRL |= ST_CTRL_CLKSOURCE; + /* Set RELOAD value + * RELOAD = (SystemCoreClock/1000) * time - 1 + * with time base is millisecond + */ + SysTick->LOAD = (cclk/1000)*time - 1; + } +} + +/*********************************************************************//** + * @brief Initial System Tick with using external clock source + * @param[in] freq external clock frequency(Hz) + * @param[in] time time interval(ms) + * @return None + **********************************************************************/ +void SYSTICK_ExternalInit(uint32_t freq, uint32_t time) +{ + float maxtime; + + /* With external clock frequency for LPC17xx is 'freq' + * And limit 24 bit for RELOAD value + * So the maximum time can be set: + * 1/freq * (2^24) * 1000 (ms) + */ + //check time value is available or not + maxtime = (1<<24)/(freq / 1000); + if (time>maxtime) + //Error Loop + while(1); + else + { + //Select external clock is System Tick clock source + SysTick->CTRL &= ~ ST_CTRL_CLKSOURCE; + /* Set RELOAD value + * RELOAD = (freq/1000) * time - 1 + * with time base is millisecond + */ + maxtime = (freq/1000)*time - 1; + SysTick->LOAD = (freq/1000)*time - 1; + } +} + +/*********************************************************************//** + * @brief Enable/disable System Tick counter + * @param[in] NewState System Tick counter status, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void SYSTICK_Cmd(FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + //Enable System Tick counter + SysTick->CTRL |= ST_CTRL_ENABLE; + else + //Disable System Tick counter + SysTick->CTRL &= ~ST_CTRL_ENABLE; +} + +/*********************************************************************//** + * @brief Enable/disable System Tick interrupt + * @param[in] NewState System Tick interrupt status, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void SYSTICK_IntCmd(FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + //Enable System Tick counter + SysTick->CTRL |= ST_CTRL_TICKINT; + else + //Disable System Tick counter + SysTick->CTRL &= ~ST_CTRL_TICKINT; +} + +/*********************************************************************//** + * @brief Get current value of System Tick counter + * @param[in] None + * @return current value of System Tick counter + **********************************************************************/ +uint32_t SYSTICK_GetCurrentValue(void) +{ + return (SysTick->VAL); +} + +/*********************************************************************//** + * @brief Clear Counter flag + * @param[in] None + * @return None + **********************************************************************/ +void SYSTICK_ClearCounterFlag(void) +{ + SysTick->CTRL &= ~ST_CTRL_COUNTFLAG; +} +/** + * @} + */ + +#endif /* _SYSTICK */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c new file mode 100644 index 0000000000..0e697dc3e5 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c @@ -0,0 +1,609 @@ +/********************************************************************** +* $Id$ lpc17xx_timer.c 2011-03-10 +*//** +* @file lpc17xx_timer.c +* @brief Contains all functions support for Timer firmware library +* on LPC17xx +* @version 3.1 +* @date 10. March. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup TIM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_timer.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _TIM + +/* Private Functions ---------------------------------------------------------- */ + +static uint32_t getPClock (uint32_t timernum); +static uint32_t converUSecToVal (uint32_t timernum, uint32_t usec); +static uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx); + + +/*********************************************************************//** + * @brief Get peripheral clock of each timer controller + * @param[in] timernum Timer number + * @return Peripheral clock of timer + **********************************************************************/ +static uint32_t getPClock (uint32_t timernum) +{ + uint32_t clkdlycnt; + switch (timernum) + { + case 0: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER0); + break; + + case 1: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER1); + break; + + case 2: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER2); + break; + + case 3: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER3); + break; + } + return clkdlycnt; +} + + +/*********************************************************************//** + * @brief Convert a time to a timer count value + * @param[in] timernum Timer number + * @param[in] usec Time in microseconds + * @return The number of required clock ticks to give the time delay + **********************************************************************/ +uint32_t converUSecToVal (uint32_t timernum, uint32_t usec) +{ + uint64_t clkdlycnt; + + // Get Pclock of timer + clkdlycnt = (uint64_t) getPClock(timernum); + + clkdlycnt = (clkdlycnt * usec) / 1000000; + return (uint32_t) clkdlycnt; +} + + +/*********************************************************************//** + * @brief Convert a timer register pointer to a timer number + * @param[in] TIMx Pointer to LPC_TIM_TypeDef, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return The timer number (0 to 3) or 0xFFFF FFFF if register pointer is bad + **********************************************************************/ +uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx) +{ + uint32_t tnum = 0xFFFFFFFF; + + if (TIMx == LPC_TIM0) + { + tnum = 0; + } + else if (TIMx == LPC_TIM1) + { + tnum = 1; + } + else if (TIMx == LPC_TIM2) + { + tnum = 2; + } + else if (TIMx == LPC_TIM3) + { + tnum = 3; + } + + return tnum; +} + +/* End of Private Functions ---------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup TIM_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Get Interrupt Status + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return FlagStatus + * - SET : interrupt + * - RESET : no interrupt + **********************************************************************/ +FlagStatus TIM_GetIntStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + uint8_t temp; + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + temp = (TIMx->IR)& TIM_IR_CLR(IntFlag); + if (temp) + return SET; + + return RESET; + +} +/*********************************************************************//** + * @brief Get Capture Interrupt Status + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return FlagStatus + * - SET : interrupt + * - RESET : no interrupt + **********************************************************************/ +FlagStatus TIM_GetIntCaptureStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + uint8_t temp; + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + temp = (TIMx->IR) & (1<<(4+IntFlag)); + if(temp) + return SET; + return RESET; +} +/*********************************************************************//** + * @brief Clear Interrupt pending + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return None + **********************************************************************/ +void TIM_ClearIntPending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + TIMx->IR = TIM_IR_CLR(IntFlag); +} + +/*********************************************************************//** + * @brief Clear Capture Interrupt pending + * @param[in] TIMx Timer selection, should be + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return None + **********************************************************************/ +void TIM_ClearIntCapturePending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + TIMx->IR = (1<<(4+IntFlag)); +} + +/*********************************************************************//** + * @brief Configuration for Timer at initial time + * @param[in] TimerCounterMode timer counter mode, should be: + * - TIM_TIMER_MODE: Timer mode + * - TIM_COUNTER_RISING_MODE: Counter rising mode + * - TIM_COUNTER_FALLING_MODE: Counter falling mode + * - TIM_COUNTER_ANY_MODE:Counter on both edges + * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type or + * TIM_COUNTERCFG_Type + * @return None + **********************************************************************/ +void TIM_ConfigStructInit(TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) +{ + if (TimerCounterMode == TIM_TIMER_MODE ) + { + TIM_TIMERCFG_Type * pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; + pTimeCfg->PrescaleOption = TIM_PRESCALE_USVAL; + pTimeCfg->PrescaleValue = 1; + } + else + { + TIM_COUNTERCFG_Type * pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; + pCounterCfg->CountInputSelect = TIM_COUNTER_INCAP0; + } +} + +/*********************************************************************//** + * @brief Initial Timer/Counter device + * Set Clock frequency for Timer + * Set initial configuration for Timer + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] TimerCounterMode Timer counter mode, should be: + * - TIM_TIMER_MODE: Timer mode + * - TIM_COUNTER_RISING_MODE: Counter rising mode + * - TIM_COUNTER_FALLING_MODE: Counter falling mode + * - TIM_COUNTER_ANY_MODE:Counter on both edges + * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type + * that contains the configuration information for the + * specified Timer peripheral. + * @return None + **********************************************************************/ +void TIM_Init(LPC_TIM_TypeDef *TIMx, TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) +{ + TIM_TIMERCFG_Type *pTimeCfg; + TIM_COUNTERCFG_Type *pCounterCfg; + + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_MODE_OPT(TimerCounterMode)); + + //set power + + if (TIMx== LPC_TIM0) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, ENABLE); + //PCLK_Timer0 = CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER0, CLKPWR_PCLKSEL_CCLK_DIV_4); + } + else if (TIMx== LPC_TIM1) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, ENABLE); + //PCLK_Timer1 = CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER1, CLKPWR_PCLKSEL_CCLK_DIV_4); + + } + + else if (TIMx== LPC_TIM2) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, ENABLE); + //PCLK_Timer2= CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER2, CLKPWR_PCLKSEL_CCLK_DIV_4); + } + else if (TIMx== LPC_TIM3) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM3, ENABLE); + //PCLK_Timer3= CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER3, CLKPWR_PCLKSEL_CCLK_DIV_4); + + } + + TIMx->CCR &= ~TIM_CTCR_MODE_MASK; + TIMx->CCR |= TIM_TIMER_MODE; + + TIMx->TC =0; + TIMx->PC =0; + TIMx->PR =0; + TIMx->TCR |= (1<<1); //Reset Counter + TIMx->TCR &= ~(1<<1); //release reset + if (TimerCounterMode == TIM_TIMER_MODE ) + { + pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; + if (pTimeCfg->PrescaleOption == TIM_PRESCALE_TICKVAL) + { + TIMx->PR = pTimeCfg->PrescaleValue -1 ; + } + else + { + TIMx->PR = converUSecToVal (converPtrToTimeNum(TIMx),pTimeCfg->PrescaleValue)-1; + } + } + else + { + + pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; + TIMx->CCR &= ~TIM_CTCR_INPUT_MASK; + if (pCounterCfg->CountInputSelect == TIM_COUNTER_INCAP1) + TIMx->CCR |= _BIT(2); + } + + // Clear interrupt pending + TIMx->IR = 0xFFFFFFFF; + +} + +/*********************************************************************//** + * @brief Close Timer/Counter device + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return None + **********************************************************************/ +void TIM_DeInit (LPC_TIM_TypeDef *TIMx) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + // Disable timer/counter + TIMx->TCR = 0x00; + + // Disable power + if (TIMx== LPC_TIM0) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, DISABLE); + + else if (TIMx== LPC_TIM1) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, DISABLE); + + else if (TIMx== LPC_TIM2) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); + + else if (TIMx== LPC_TIM3) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); + +} + +/*********************************************************************//** + * @brief Start/Stop Timer/Counter device + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] NewState + * - ENABLE : set timer enable + * - DISABLE : disable timer + * @return None + **********************************************************************/ +void TIM_Cmd(LPC_TIM_TypeDef *TIMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + if (NewState == ENABLE) + { + TIMx->TCR |= TIM_ENABLE; + } + else + { + TIMx->TCR &= ~TIM_ENABLE; + } +} + +/*********************************************************************//** + * @brief Reset Timer/Counter device, + * Make TC and PC are synchronously reset on the next + * positive edge of PCLK + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return None + **********************************************************************/ +void TIM_ResetCounter(LPC_TIM_TypeDef *TIMx) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + TIMx->TCR |= TIM_RESET; + TIMx->TCR &= ~TIM_RESET; +} + +/*********************************************************************//** + * @brief Configuration for Match register + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] TIM_MatchConfigStruct Pointer to TIM_MATCHCFG_Type + * - MatchChannel : choose channel 0 or 1 + * - IntOnMatch : if SET, interrupt will be generated when MRxx match + * the value in TC + * - StopOnMatch : if SET, TC and PC will be stopped whenM Rxx match + * the value in TC + * - ResetOnMatch : if SET, Reset on MR0 when MRxx match + * the value in TC + * -ExtMatchOutputType: Select output for external match + * + 0: Do nothing for external output pin if match + * + 1: Force external output pin to low if match + * + 2: Force external output pin to high if match + * + 3: Toggle external output pin if match + * MatchValue: Set the value to be compared with TC value + * @return None + **********************************************************************/ +void TIM_ConfigMatch(LPC_TIM_TypeDef *TIMx, TIM_MATCHCFG_Type *TIM_MatchConfigStruct) +{ + + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_EXTMATCH_OPT(TIM_MatchConfigStruct->ExtMatchOutputType)); + + switch(TIM_MatchConfigStruct->MatchChannel) + { + case 0: + TIMx->MR0 = TIM_MatchConfigStruct->MatchValue; + break; + case 1: + TIMx->MR1 = TIM_MatchConfigStruct->MatchValue; + break; + case 2: + TIMx->MR2 = TIM_MatchConfigStruct->MatchValue; + break; + case 3: + TIMx->MR3 = TIM_MatchConfigStruct->MatchValue; + break; + default: + //Error match value + //Error loop + while(1); + } + //interrupt on MRn + TIMx->MCR &=~TIM_MCR_CHANNEL_MASKBIT(TIM_MatchConfigStruct->MatchChannel); + + if (TIM_MatchConfigStruct->IntOnMatch) + TIMx->MCR |= TIM_INT_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + //reset on MRn + if (TIM_MatchConfigStruct->ResetOnMatch) + TIMx->MCR |= TIM_RESET_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + //stop on MRn + if (TIM_MatchConfigStruct->StopOnMatch) + TIMx->MCR |= TIM_STOP_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + // match output type + + TIMx->EMR &= ~TIM_EM_MASK(TIM_MatchConfigStruct->MatchChannel); + TIMx->EMR |= TIM_EM_SET(TIM_MatchConfigStruct->MatchChannel,TIM_MatchConfigStruct->ExtMatchOutputType); +} +/*********************************************************************//** + * @brief Update Match value + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] MatchChannel Match channel, should be: 0..3 + * @param[in] MatchValue updated match value + * @return None + **********************************************************************/ +void TIM_UpdateMatchValue(LPC_TIM_TypeDef *TIMx,uint8_t MatchChannel, uint32_t MatchValue) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + switch(MatchChannel) + { + case 0: + TIMx->MR0 = MatchValue; + break; + case 1: + TIMx->MR1 = MatchValue; + break; + case 2: + TIMx->MR2 = MatchValue; + break; + case 3: + TIMx->MR3 = MatchValue; + break; + default: + //Error Loop + while(1); + } + +} +/*********************************************************************//** + * @brief Configuration for Capture register + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * - CaptureChannel: set the channel to capture data + * - RisingEdge : if SET, Capture at rising edge + * - FallingEdge : if SET, Capture at falling edge + * - IntOnCaption : if SET, Capture generate interrupt + * @param[in] TIM_CaptureConfigStruct Pointer to TIM_CAPTURECFG_Type + * @return None + **********************************************************************/ +void TIM_ConfigCapture(LPC_TIM_TypeDef *TIMx, TIM_CAPTURECFG_Type *TIM_CaptureConfigStruct) +{ + + CHECK_PARAM(PARAM_TIMx(TIMx)); + TIMx->CCR &= ~TIM_CCR_CHANNEL_MASKBIT(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->RisingEdge) + TIMx->CCR |= TIM_CAP_RISING(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->FallingEdge) + TIMx->CCR |= TIM_CAP_FALLING(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->IntOnCaption) + TIMx->CCR |= TIM_INT_ON_CAP(TIM_CaptureConfigStruct->CaptureChannel); +} + +/*********************************************************************//** + * @brief Read value of capture register in timer/counter device + * @param[in] TIMx Pointer to timer/counter device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] CaptureChannel: capture channel number, should be: + * - TIM_COUNTER_INCAP0: CAPn.0 input pin for TIMERn + * - TIM_COUNTER_INCAP1: CAPn.1 input pin for TIMERn + * @return Value of capture register + **********************************************************************/ +uint32_t TIM_GetCaptureValue(LPC_TIM_TypeDef *TIMx, TIM_COUNTER_INPUT_OPT CaptureChannel) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_COUNTER_INPUT_OPT(CaptureChannel)); + + if(CaptureChannel==0) + return TIMx->CR0; + else + return TIMx->CR1; +} + +/** + * @} + */ + +#endif /* _TIMER */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c new file mode 100644 index 0000000000..c7da45399a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c @@ -0,0 +1,1382 @@ +/********************************************************************** +* $Id$ lpc17xx_uart.c 2011-06-06 +*//** +* @file lpc17xx_uart.c +* @brief Contains all functions support for UART firmware library +* on LPC17xx +* @version 3.2 +* @date 25. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup UART + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_uart.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _UART + +/* Private Functions ---------------------------------------------------------- */ + +static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate); + + +/*********************************************************************//** + * @brief Determines best dividers to get a target clock rate + * @param[in] UARTx Pointer to selected UART peripheral, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] baudrate Desired UART baud rate. + * @return Error status, could be: + * - SUCCESS + * - ERROR + **********************************************************************/ +static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate) +{ + Status errorStatus = ERROR; + + uint32_t uClk; + uint32_t d, m, bestd, bestm, tmp; + uint64_t best_divisor, divisor; + uint32_t current_error, best_error; + uint32_t recalcbaud; + + /* get UART block clock */ + if (UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART0); + } + else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART1); + } + else if (UARTx == LPC_UART2) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART2); + } + else if (UARTx == LPC_UART3) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART3); + } + + + /* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers + * The formula is : + * BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL) + * It involves floating point calculations. That's the reason the formulae are adjusted with + * Multiply and divide method.*/ + /* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions: + * 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */ + best_error = 0xFFFFFFFF; /* Worst case */ + bestd = 0; + bestm = 0; + best_divisor = 0; + for (m = 1 ; m <= 15 ;m++) + { + for (d = 0 ; d < m ; d++) + { + divisor = ((uint64_t)uClk<<28)*m/(baudrate*(m+d)); + current_error = divisor & 0xFFFFFFFF; + + tmp = divisor>>32; + + /* Adjust error */ + if(current_error > ((uint32_t)1<<31)){ + current_error = -current_error; + tmp++; + } + + if(tmp<1 || tmp>65536) /* Out of range */ + continue; + + if( current_error < best_error){ + best_error = current_error; + best_divisor = tmp; + bestd = d; + bestm = m; + if(best_error == 0) break; + } + } /* end of inner for loop */ + + if (best_error == 0) + break; + } /* end of outer for loop */ + + if(best_divisor == 0) return ERROR; /* can not find best match */ + + recalcbaud = (uClk>>4) * bestm/(best_divisor * (bestm + bestd)); + + /* reuse best_error to evaluate baud error*/ + if(baudrate>recalcbaud) best_error = baudrate - recalcbaud; + else best_error = recalcbaud -baudrate; + + best_error = best_error * 100 / baudrate; + + if (best_error < UART_ACCEPTED_BAUDRATE_ERROR) + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN; + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor); + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor); + /* Then reset DLAB bit */ + ((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK; + ((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(bestm) \ + | UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK; + } + else + { + UARTx->LCR |= UART_LCR_DLAB_EN; + UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor); + UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor); + /* Then reset DLAB bit */ + UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK; + UARTx->FDR = (UART_FDR_MULVAL(bestm) \ + | UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK; + } + errorStatus = SUCCESS; + } + + return errorStatus; +} + +/* End of Private Functions ---------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup UART_Public_Functions + * @{ + */ +/* UART Init/DeInit functions -------------------------------------------------*/ +/********************************************************************//** + * @brief Initializes the UARTx peripheral according to the specified + * parameters in the UART_ConfigStruct. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] UART_ConfigStruct Pointer to a UART_CFG_Type structure +* that contains the configuration information for the +* specified UART peripheral. + * @return None + *********************************************************************/ +void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct) +{ + uint32_t tmp; + + // For debug mode + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits)); + CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits)); + CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity)); + +#ifdef _UART0 + if(UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, ENABLE); + } +#endif + +#ifdef _UART1 + if(((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, ENABLE); + } +#endif + +#ifdef _UART2 + if(UARTx == LPC_UART2) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE); + } +#endif + +#ifdef _UART3 + if(UARTx == LPC_UART3) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, ENABLE); + } +#endif + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* FIFOs are empty */ + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN \ + | UART_FCR_RX_RS | UART_FCR_TX_RS); + // Disable FIFO + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = 0; + + // Dummy reading + while (((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_RDR) + { + tmp = ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR; + } + + ((LPC_UART1_TypeDef *)UARTx)->TER = UART_TER_TXEN; + // Wait for current transmit complete + while (!(((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_THRE)); + // Disable Tx + ((LPC_UART1_TypeDef *)UARTx)->TER = 0; + + // Disable interrupt + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER = 0; + // Set LCR to default state + ((LPC_UART1_TypeDef *)UARTx)->LCR = 0; + // Set ACR to default state + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0; + // Set Modem Control to default state + ((LPC_UART1_TypeDef *)UARTx)->MCR = 0; + // Set RS485 control to default state + ((LPC_UART1_TypeDef *)UARTx)->RS485CTRL = 0; + // Set RS485 delay timer to default state + ((LPC_UART1_TypeDef *)UARTx)->RS485DLY = 0; + // Set RS485 addr match to default state + ((LPC_UART1_TypeDef *)UARTx)->ADRMATCH = 0; + //Dummy Reading to Clear Status + tmp = ((LPC_UART1_TypeDef *)UARTx)->MSR; + tmp = ((LPC_UART1_TypeDef *)UARTx)->LSR; + } + else + { + /* FIFOs are empty */ + UARTx->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS); + // Disable FIFO + UARTx->/*IIFCR.*/FCR = 0; + + // Dummy reading + while (UARTx->LSR & UART_LSR_RDR) + { + tmp = UARTx->/*RBTHDLR.*/RBR; + } + + UARTx->TER = UART_TER_TXEN; + // Wait for current transmit complete + while (!(UARTx->LSR & UART_LSR_THRE)); + // Disable Tx + UARTx->TER = 0; + + // Disable interrupt + UARTx->/*DLIER.*/IER = 0; + // Set LCR to default state + UARTx->LCR = 0; + // Set ACR to default state + UARTx->ACR = 0; + // Dummy reading + tmp = UARTx->LSR; + } + + if (UARTx == LPC_UART3) + { + // Set IrDA to default state + UARTx->ICR = 0; + } + + // Set Line Control register ---------------------------- + + uart_set_divisors(UARTx, (UART_ConfigStruct->Baud_rate)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + tmp = (((LPC_UART1_TypeDef *)UARTx)->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) \ + & UART_LCR_BITMASK; + } + else + { + tmp = (UARTx->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) & UART_LCR_BITMASK; + } + + switch (UART_ConfigStruct->Databits){ + case UART_DATABIT_5: + tmp |= UART_LCR_WLEN5; + break; + case UART_DATABIT_6: + tmp |= UART_LCR_WLEN6; + break; + case UART_DATABIT_7: + tmp |= UART_LCR_WLEN7; + break; + case UART_DATABIT_8: + default: + tmp |= UART_LCR_WLEN8; + break; + } + + if (UART_ConfigStruct->Parity == UART_PARITY_NONE) + { + // Do nothing... + } + else + { + tmp |= UART_LCR_PARITY_EN; + switch (UART_ConfigStruct->Parity) + { + case UART_PARITY_ODD: + tmp |= UART_LCR_PARITY_ODD; + break; + + case UART_PARITY_EVEN: + tmp |= UART_LCR_PARITY_EVEN; + break; + + case UART_PARITY_SP_1: + tmp |= UART_LCR_PARITY_F_1; + break; + + case UART_PARITY_SP_0: + tmp |= UART_LCR_PARITY_F_0; + break; + default: + break; + } + } + + switch (UART_ConfigStruct->Stopbits){ + case UART_STOPBIT_2: + tmp |= UART_LCR_STOPBIT_SEL; + break; + case UART_STOPBIT_1: + default: + // Do no thing + break; + } + + + // Write back to LCR, configure FIFO and Disable Tx + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR = (uint8_t)(tmp & UART_LCR_BITMASK); + } + else + { + UARTx->LCR = (uint8_t)(tmp & UART_LCR_BITMASK); + } +} + +/*********************************************************************//** + * @brief De-initializes the UARTx peripheral registers to their + * default reset values. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return None + **********************************************************************/ +void UART_DeInit(LPC_UART_TypeDef* UARTx) +{ + // For debug mode + CHECK_PARAM(PARAM_UARTx(UARTx)); + + UART_TxCmd(UARTx, DISABLE); + +#ifdef _UART0 + if (UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, DISABLE); + } +#endif + +#ifdef _UART1 + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, DISABLE); + } +#endif + +#ifdef _UART2 + if (UARTx == LPC_UART2) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, DISABLE); + } +#endif + +#ifdef _UART3 + if (UARTx == LPC_UART3) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, DISABLE); + } +#endif +} + +/*****************************************************************************//** +* @brief Fills each UART_InitStruct member with its default value: +* - 9600 bps +* - 8-bit data +* - 1 Stopbit +* - None Parity +* @param[in] UART_InitStruct Pointer to a UART_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct) +{ + UART_InitStruct->Baud_rate = 9600; + UART_InitStruct->Databits = UART_DATABIT_8; + UART_InitStruct->Parity = UART_PARITY_NONE; + UART_InitStruct->Stopbits = UART_STOPBIT_1; +} + +/* UART Send/Recieve functions -------------------------------------------------*/ +/*********************************************************************//** + * @brief Transmit a single data through UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] Data Data to transmit (must be 8-bit long) + * @return None + **********************************************************************/ +void UART_SendByte(LPC_UART_TypeDef* UARTx, uint8_t Data) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT; + } + else + { + UARTx->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT; + } + +} + + +/*********************************************************************//** + * @brief Receive a single data from UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Data received + **********************************************************************/ +uint8_t UART_ReceiveByte(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + return (((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT); + } + else + { + return (UARTx->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT); + } +} + +/*********************************************************************//** + * @brief Send a block of data via UART peripheral + * @param[in] UARTx Selected UART peripheral used to send data, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] txbuf Pointer to Transmit buffer + * @param[in] buflen Length of Transmit buffer + * @param[in] flag Flag used in UART transfer, should be + * NONE_BLOCKING or BLOCKING + * @return Number of bytes sent. + * + * Note: when using UART in BLOCKING mode, a time-out condition is used + * via defined symbol UART_BLOCKING_TIMEOUT. + **********************************************************************/ +uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf, + uint32_t buflen, TRANSFER_BLOCK_Type flag) +{ + uint32_t bToSend, bSent, timeOut, fifo_cnt; + uint8_t *pChar = txbuf; + + bToSend = buflen; + + // blocking mode + if (flag == BLOCKING) { + bSent = 0; + while (bToSend){ + timeOut = UART_BLOCKING_TIMEOUT; + // Wait for THR empty with timeout + while (!(UARTx->LSR & UART_LSR_THRE)) { + if (timeOut == 0) break; + timeOut--; + } + // Time out! + if(timeOut == 0) break; + fifo_cnt = UART_TX_FIFO_SIZE; + while (fifo_cnt && bToSend){ + UART_SendByte(UARTx, (*pChar++)); + fifo_cnt--; + bToSend--; + bSent++; + } + } + } + // None blocking mode + else { + bSent = 0; + while (bToSend) { + if (!(UARTx->LSR & UART_LSR_THRE)){ + break; + } + fifo_cnt = UART_TX_FIFO_SIZE; + while (fifo_cnt && bToSend) { + UART_SendByte(UARTx, (*pChar++)); + bToSend--; + fifo_cnt--; + bSent++; + } + } + } + return bSent; +} + +/*********************************************************************//** + * @brief Receive a block of data via UART peripheral + * @param[in] UARTx Selected UART peripheral used to send data, + * should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[out] rxbuf Pointer to Received buffer + * @param[in] buflen Length of Received buffer + * @param[in] flag Flag mode, should be NONE_BLOCKING or BLOCKING + + * @return Number of bytes received + * + * Note: when using UART in BLOCKING mode, a time-out condition is used + * via defined symbol UART_BLOCKING_TIMEOUT. + **********************************************************************/ +uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \ + uint32_t buflen, TRANSFER_BLOCK_Type flag) +{ + uint32_t bToRecv, bRecv, timeOut; + uint8_t *pChar = rxbuf; + + bToRecv = buflen; + + // Blocking mode + if (flag == BLOCKING) { + bRecv = 0; + while (bToRecv){ + timeOut = UART_BLOCKING_TIMEOUT; + while (!(UARTx->LSR & UART_LSR_RDR)){ + if (timeOut == 0) break; + timeOut--; + } + // Time out! + if(timeOut == 0) break; + // Get data from the buffer + (*pChar++) = UART_ReceiveByte(UARTx); + bToRecv--; + bRecv++; + } + } + // None blocking mode + else { + bRecv = 0; + while (bToRecv) { + if (!(UARTx->LSR & UART_LSR_RDR)) { + break; + } else { + (*pChar++) = UART_ReceiveByte(UARTx); + bRecv++; + bToRecv--; + } + } + } + return bRecv; +} + +/*********************************************************************//** + * @brief Force BREAK character on UART line, output pin UARTx TXD is + forced to logic 0. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return None + **********************************************************************/ +void UART_ForceBreak(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_BREAK_EN; + } + else + { + UARTx->LCR |= UART_LCR_BREAK_EN; + } +} + + +/********************************************************************//** + * @brief Enable or disable specified UART interrupt. + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] UARTIntCfg Specifies the interrupt flag, + * should be one of the following: + - UART_INTCFG_RBR : RBR Interrupt enable + - UART_INTCFG_THRE : THR Interrupt enable + - UART_INTCFG_RLS : RX line status interrupt enable + - UART1_INTCFG_MS : Modem status interrupt enable (UART1 only) + - UART1_INTCFG_CTS : CTS1 signal transition interrupt enable (UART1 only) + - UART_INTCFG_ABEO : Enables the end of auto-baud interrupt + - UART_INTCFG_ABTO : Enables the auto-baud time-out interrupt + * @param[in] NewState New state of specified UART interrupt type, + * should be: + * - ENALBE: Enable this UART interrupt type. +* - DISALBE: Disable this UART interrupt type. + * @return None + *********************************************************************/ +void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, FunctionalState NewState) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(UARTIntCfg){ + case UART_INTCFG_RBR: + tmp = UART_IER_RBRINT_EN; + break; + case UART_INTCFG_THRE: + tmp = UART_IER_THREINT_EN; + break; + case UART_INTCFG_RLS: + tmp = UART_IER_RLSINT_EN; + break; + case UART1_INTCFG_MS: + tmp = UART1_IER_MSINT_EN; + break; + case UART1_INTCFG_CTS: + tmp = UART1_IER_CTSINT_EN; + break; + case UART_INTCFG_ABEO: + tmp = UART_IER_ABEOINT_EN; + break; + case UART_INTCFG_ABTO: + tmp = UART_IER_ABTOINT_EN; + break; + } + + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + CHECK_PARAM((PARAM_UART_INTCFG(UARTIntCfg)) || (PARAM_UART1_INTCFG(UARTIntCfg))); + } + else + { + CHECK_PARAM(PARAM_UART_INTCFG(UARTIntCfg)); + } + + if (NewState == ENABLE) + { + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER |= tmp; + } + else + { + UARTx->/*DLIER.*/IER |= tmp; + } + } + else + { + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER &= (~tmp) & UART1_IER_BITMASK; + } + else + { + UARTx->/*DLIER.*/IER &= (~tmp) & UART_IER_BITMASK; + } + } +} + + +/********************************************************************//** + * @brief Get current value of Line Status register in UART peripheral. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Current value of Line Status register in UART peripheral. + * Note: The return value of this function must be ANDed with each member in + * UART_LS_Type enumeration to determine current flag status + * corresponding to each Line status type. Because some flags in + * Line Status register will be cleared after reading, the next reading + * Line Status register could not be correct. So this function used to + * read Line status register in one time only, then the return value + * used to check all flags. + *********************************************************************/ +uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + return ((((LPC_UART1_TypeDef *)LPC_UART1)->LSR) & UART_LSR_BITMASK); + } + else + { + return ((UARTx->LSR) & UART_LSR_BITMASK); + } +} + +/********************************************************************//** + * @brief Get Interrupt Identification value + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Current value of UART UIIR register in UART peripheral. + *********************************************************************/ +uint32_t UART_GetIntId(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + return (UARTx->IIR & 0x03CF); +} + +/*********************************************************************//** + * @brief Check whether if UART is busy or not + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return RESET if UART is not busy, otherwise return SET. + **********************************************************************/ +FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx) +{ + if (UARTx->LSR & UART_LSR_TEMT){ + return RESET; + } else { + return SET; + } +} + + +/*********************************************************************//** + * @brief Configure FIFO function on selected UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] FIFOCfg Pointer to a UART_FIFO_CFG_Type Structure that + * contains specified information about FIFO configuration + * @return none + **********************************************************************/ +void UART_FIFOConfig(LPC_UART_TypeDef *UARTx, UART_FIFO_CFG_Type *FIFOCfg) +{ + uint8_t tmp = 0; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_UART_FIFO_LEVEL(FIFOCfg->FIFO_Level)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_DMAMode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetRxBuf)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetTxBuf)); + + tmp |= UART_FCR_FIFO_EN; + switch (FIFOCfg->FIFO_Level){ + case UART_FIFO_TRGLEV0: + tmp |= UART_FCR_TRG_LEV0; + break; + case UART_FIFO_TRGLEV1: + tmp |= UART_FCR_TRG_LEV1; + break; + case UART_FIFO_TRGLEV2: + tmp |= UART_FCR_TRG_LEV2; + break; + case UART_FIFO_TRGLEV3: + default: + tmp |= UART_FCR_TRG_LEV3; + break; + } + + if (FIFOCfg->FIFO_ResetTxBuf == ENABLE) + { + tmp |= UART_FCR_TX_RS; + } + if (FIFOCfg->FIFO_ResetRxBuf == ENABLE) + { + tmp |= UART_FCR_RX_RS; + } + if (FIFOCfg->FIFO_DMAMode == ENABLE) + { + tmp |= UART_FCR_DMAMODE_SEL; + } + + + //write to FIFO control register + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK; + } + else + { + UARTx->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK; + } +} + +/*****************************************************************************//** +* @brief Fills each UART_FIFOInitStruct member with its default value: +* - FIFO_DMAMode = DISABLE +* - FIFO_Level = UART_FIFO_TRGLEV0 +* - FIFO_ResetRxBuf = ENABLE +* - FIFO_ResetTxBuf = ENABLE +* - FIFO_State = ENABLE + +* @param[in] UART_FIFOInitStruct Pointer to a UART_FIFO_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct) +{ + UART_FIFOInitStruct->FIFO_DMAMode = DISABLE; + UART_FIFOInitStruct->FIFO_Level = UART_FIFO_TRGLEV0; + UART_FIFOInitStruct->FIFO_ResetRxBuf = ENABLE; + UART_FIFOInitStruct->FIFO_ResetTxBuf = ENABLE; +} + + +/*********************************************************************//** + * @brief Start/Stop Auto Baudrate activity + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] ABConfigStruct A pointer to UART_AB_CFG_Type structure that + * contains specified information about UART + * auto baudrate configuration + * @param[in] NewState New State of Auto baudrate activity, should be: + * - ENABLE: Start this activity + * - DISABLE: Stop this activity + * Note: Auto-baudrate mode enable bit will be cleared once this mode + * completed. + * @return none + **********************************************************************/ +void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \ + FunctionalState NewState) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + tmp = 0; + if (NewState == ENABLE) { + if (ABConfigStruct->ABMode == UART_AUTOBAUD_MODE1){ + tmp |= UART_ACR_MODE; + } + if (ABConfigStruct->AutoRestart == ENABLE){ + tmp |= UART_ACR_AUTO_RESTART; + } + } + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + if (NewState == ENABLE) + { + // Clear DLL and DLM value + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN; + ((LPC_UART1_TypeDef *)UARTx)->DLL = 0; + ((LPC_UART1_TypeDef *)UARTx)->DLM = 0; + ((LPC_UART1_TypeDef *)UARTx)->LCR &= ~UART_LCR_DLAB_EN; + // FDR value must be reset to default value + ((LPC_UART1_TypeDef *)UARTx)->FDR = 0x10; + ((LPC_UART1_TypeDef *)UARTx)->ACR = UART_ACR_START | tmp; + } + else + { + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0; + } + } + else + { + if (NewState == ENABLE) + { + // Clear DLL and DLM value + UARTx->LCR |= UART_LCR_DLAB_EN; + UARTx->DLL = 0; + UARTx->DLM = 0; + UARTx->LCR &= ~UART_LCR_DLAB_EN; + // FDR value must be reset to default value + UARTx->FDR = 0x10; + UARTx->ACR = UART_ACR_START | tmp; + } + else + { + UARTx->ACR = 0; + } + } +} + +/*********************************************************************//** + * @brief Clear Autobaud Interrupt Pending + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] ABIntType type of auto-baud interrupt, should be: + * - UART_AUTOBAUD_INTSTAT_ABEO: End of Auto-baud interrupt + * - UART_AUTOBAUD_INTSTAT_ABTO: Auto-baud time out interrupt + * @return none + **********************************************************************/ +void UART_ABClearIntPending(LPC_UART_TypeDef *UARTx, UART_ABEO_Type ABIntType) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + UARTx->ACR |= ABIntType; + } + else + UARTx->ACR |= ABIntType; +} + +/*********************************************************************//** + * @brief Enable/Disable transmission on UART TxD pin + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] NewState New State of Tx transmission function, should be: + * - ENABLE: Enable this function + - DISABLE: Disable this function + * @return none + **********************************************************************/ +void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->TER |= UART_TER_TXEN; + } + else + { + UARTx->TER |= UART_TER_TXEN; + } + } + else + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK; + } + else + { + UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK; + } + } +} + +/* UART IrDA functions ---------------------------------------------------*/ + +#ifdef _UART3 + +/*********************************************************************//** + * @brief Enable or disable inverting serial input function of IrDA + * on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] NewState New state of inverting serial input, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return none + **********************************************************************/ +void UART_IrDAInvtInputCmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + UARTx->ICR |= UART_ICR_IRDAINV; + } + else if (NewState == DISABLE) + { + UARTx->ICR &= (~UART_ICR_IRDAINV) & UART_ICR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable or disable IrDA function on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] NewState New state of IrDA function, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return none + **********************************************************************/ +void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + UARTx->ICR |= UART_ICR_IRDAEN; + } + else + { + UARTx->ICR &= (~UART_ICR_IRDAEN) & UART_ICR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configure Pulse divider for IrDA function on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] PulseDiv Pulse Divider value from Peripheral clock, + * should be one of the following: + - UART_IrDA_PULSEDIV2 : Pulse width = 2 * Tpclk + - UART_IrDA_PULSEDIV4 : Pulse width = 4 * Tpclk + - UART_IrDA_PULSEDIV8 : Pulse width = 8 * Tpclk + - UART_IrDA_PULSEDIV16 : Pulse width = 16 * Tpclk + - UART_IrDA_PULSEDIV32 : Pulse width = 32 * Tpclk + - UART_IrDA_PULSEDIV64 : Pulse width = 64 * Tpclk + - UART_IrDA_PULSEDIV128 : Pulse width = 128 * Tpclk + - UART_IrDA_PULSEDIV256 : Pulse width = 256 * Tpclk + + * @return none + **********************************************************************/ +void UART_IrDAPulseDivConfig(LPC_UART_TypeDef *UARTx, UART_IrDA_PULSE_Type PulseDiv) +{ + uint32_t tmp, tmp1; + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_UART_IrDA_PULSEDIV(PulseDiv)); + + tmp1 = UART_ICR_PULSEDIV(PulseDiv); + tmp = UARTx->ICR & (~UART_ICR_PULSEDIV(7)); + tmp |= tmp1 | UART_ICR_FIXPULSE_EN; + UARTx->ICR = tmp & UART_ICR_BITMASK; +} + +#endif + + +/* UART1 FullModem function ---------------------------------------------*/ + +#ifdef _UART1 + +/*********************************************************************//** + * @brief Force pin DTR/RTS corresponding to given state (Full modem mode) + * @param[in] UARTx LPC_UART1 (only) + * @param[in] Pin Pin that NewState will be applied to, should be: + * - UART1_MODEM_PIN_DTR: DTR pin. + * - UART1_MODEM_PIN_RTS: RTS pin. + * @param[in] NewState New State of DTR/RTS pin, should be: + * - INACTIVE: Force the pin to inactive signal. + - ACTIVE: Force the pin to active signal. + * @return none + **********************************************************************/ +void UART_FullModemForcePinState(LPC_UART1_TypeDef *UARTx, UART_MODEM_PIN_Type Pin, \ + UART1_SignalState NewState) +{ + uint8_t tmp = 0; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_UART1_MODEM_PIN(Pin)); + CHECK_PARAM(PARAM_UART1_SIGNALSTATE(NewState)); + + switch (Pin){ + case UART1_MODEM_PIN_DTR: + tmp = UART1_MCR_DTR_CTRL; + break; + case UART1_MODEM_PIN_RTS: + tmp = UART1_MCR_RTS_CTRL; + break; + default: + break; + } + + if (NewState == ACTIVE){ + UARTx->MCR |= tmp; + } else { + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configure Full Modem mode for UART peripheral + * @param[in] UARTx LPC_UART1 (only) + * @param[in] Mode Full Modem mode, should be: + * - UART1_MODEM_MODE_LOOPBACK: Loop back mode. + * - UART1_MODEM_MODE_AUTO_RTS: Auto-RTS mode. + * - UART1_MODEM_MODE_AUTO_CTS: Auto-CTS mode. + * @param[in] NewState New State of this mode, should be: + * - ENABLE: Enable this mode. + - DISABLE: Disable this mode. + * @return none + **********************************************************************/ +void UART_FullModemConfigMode(LPC_UART1_TypeDef *UARTx, UART_MODEM_MODE_Type Mode, \ + FunctionalState NewState) +{ + uint8_t tmp; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_UART1_MODEM_MODE(Mode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(Mode){ + case UART1_MODEM_MODE_LOOPBACK: + tmp = UART1_MCR_LOOPB_EN; + break; + case UART1_MODEM_MODE_AUTO_RTS: + tmp = UART1_MCR_AUTO_RTS_EN; + break; + case UART1_MODEM_MODE_AUTO_CTS: + tmp = UART1_MCR_AUTO_CTS_EN; + break; + default: + break; + } + + if (NewState == ENABLE) + { + UARTx->MCR |= tmp; + } + else + { + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Get current status of modem status register + * @param[in] UARTx LPC_UART1 (only) + * @return Current value of modem status register + * Note: The return value of this function must be ANDed with each member + * UART_MODEM_STAT_type enumeration to determine current flag status + * corresponding to each modem flag status. Because some flags in + * modem status register will be cleared after reading, the next reading + * modem register could not be correct. So this function used to + * read modem status register in one time only, then the return value + * used to check all flags. + **********************************************************************/ +uint8_t UART_FullModemGetStatus(LPC_UART1_TypeDef *UARTx) +{ + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + return ((UARTx->MSR) & UART1_MSR_BITMASK); +} + + +/* UART RS485 functions --------------------------------------------------------------*/ + +/*********************************************************************//** + * @brief Configure UART peripheral in RS485 mode according to the specified +* parameters in the RS485ConfigStruct. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] RS485ConfigStruct Pointer to a UART1_RS485_CTRLCFG_Type structure +* that contains the configuration information for specified UART +* in RS485 mode. + * @return None + **********************************************************************/ +void UART_RS485Config(LPC_UART1_TypeDef *UARTx, UART1_RS485_CTRLCFG_Type *RS485ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoAddrDetect_State)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoDirCtrl_State)); + CHECK_PARAM(PARAM_UART1_RS485_CFG_DELAYVALUE(RS485ConfigStruct->DelayValue)); + CHECK_PARAM(PARAM_SETSTATE(RS485ConfigStruct->DirCtrlPol_Level)); + CHECK_PARAM(PARAM_UART_RS485_DIRCTRL_PIN(RS485ConfigStruct->DirCtrlPin)); + CHECK_PARAM(PARAM_UART1_RS485_CFG_MATCHADDRVALUE(RS485ConfigStruct->MatchAddrValue)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->NormalMultiDropMode_State)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->Rx_State)); + + tmp = 0; + // If Auto Direction Control is enabled - This function is used in Master mode + if (RS485ConfigStruct->AutoDirCtrl_State == ENABLE) + { + tmp |= UART1_RS485CTRL_DCTRL_EN; + + // Set polar + if (RS485ConfigStruct->DirCtrlPol_Level == SET) + { + tmp |= UART1_RS485CTRL_OINV_1; + } + + // Set pin according to + if (RS485ConfigStruct->DirCtrlPin == UART1_RS485_DIRCTRL_DTR) + { + tmp |= UART1_RS485CTRL_SEL_DTR; + } + + // Fill delay time + UARTx->RS485DLY = RS485ConfigStruct->DelayValue & UART1_RS485DLY_BITMASK; + } + + // MultiDrop mode is enable + if (RS485ConfigStruct->NormalMultiDropMode_State == ENABLE) + { + tmp |= UART1_RS485CTRL_NMM_EN; + } + + // Auto Address Detect function + if (RS485ConfigStruct->AutoAddrDetect_State == ENABLE) + { + tmp |= UART1_RS485CTRL_AADEN; + // Fill Match Address + UARTx->ADRMATCH = RS485ConfigStruct->MatchAddrValue & UART1_RS485ADRMATCH_BITMASK; + } + + + // Receiver is disable + if (RS485ConfigStruct->Rx_State == DISABLE) + { + tmp |= UART1_RS485CTRL_RX_DIS; + } + + // write back to RS485 control register + UARTx->RS485CTRL = tmp & UART1_RS485CTRL_BITMASK; + + // Enable Parity function and leave parity in stick '0' parity as default + UARTx->LCR |= (UART_LCR_PARITY_F_0 | UART_LCR_PARITY_EN); +} + +/*********************************************************************//** + * @brief Enable/Disable receiver in RS485 module in UART1 + * @param[in] UARTx LPC_UART1 (only) + * @param[in] NewState New State of command, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return None + **********************************************************************/ +void UART_RS485ReceiverCmd(LPC_UART1_TypeDef *UARTx, FunctionalState NewState) +{ + if (NewState == ENABLE){ + UARTx->RS485CTRL &= ~UART1_RS485CTRL_RX_DIS; + } else { + UARTx->RS485CTRL |= UART1_RS485CTRL_RX_DIS; + } +} + +/*********************************************************************//** + * @brief Send data on RS485 bus with specified parity stick value (9-bit mode). + * @param[in] UARTx LPC_UART1 (only) + * @param[in] pDatFrm Pointer to data frame. + * @param[in] size Size of data. + * @param[in] ParityStick Parity Stick value, should be 0 or 1. + * @return None + **********************************************************************/ +uint32_t UART_RS485Send(LPC_UART1_TypeDef *UARTx, uint8_t *pDatFrm, \ + uint32_t size, uint8_t ParityStick) +{ + uint8_t tmp, save; + uint32_t cnt; + + if (ParityStick){ + save = tmp = UARTx->LCR & UART_LCR_BITMASK; + tmp &= ~(UART_LCR_PARITY_EVEN); + UARTx->LCR = tmp; + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING); + while (!(UARTx->LSR & UART_LSR_TEMT)); + UARTx->LCR = save; + } else { + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING); + while (!(UARTx->LSR & UART_LSR_TEMT)); + } + return cnt; +} + +/*********************************************************************//** + * @brief Send Slave address frames on RS485 bus. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] SlvAddr Slave Address. + * @return None + **********************************************************************/ +void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr) +{ + UART_RS485Send(UARTx, &SlvAddr, 1, 1); +} + +/*********************************************************************//** + * @brief Send Data frames on RS485 bus. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] pData Pointer to data to be sent. + * @param[in] size Size of data frame to be sent. + * @return None + **********************************************************************/ +uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size) +{ + return (UART_RS485Send(UARTx, pData, size, 0)); +} + +#endif /* _UART1 */ + +#endif /* _UART */ + +/** + * @} + */ + +/** + * @} + */ +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c new file mode 100644 index 0000000000..39e0f9e682 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c @@ -0,0 +1,274 @@ +/********************************************************************** +* $Id$ lpc17xx_wdt.c 2010-05-21 +*//** +* @file lpc17xx_wdt.c +* @brief Contains all functions support for WDT firmware library +* on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup WDT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_wdt.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _WDT + +/* Private Functions ---------------------------------------------------------- */ + +static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout); + +/********************************************************************//** + * @brief Set WDT time out value and WDT mode + * @param[in] clk_source select Clock source for WDT device + * @param[in] timeout value of time-out for WDT (us) + * @return None + *********************************************************************/ +static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout) +{ + + uint32_t pclk_wdt = 0; + uint32_t tempval = 0; + + switch ((WDT_CLK_OPT) clk_source) + { + case WDT_CLKSRC_IRC: + pclk_wdt = 4000000; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + // Check if it valid + if (tempval >= WDT_TIMEOUT_MIN) + { + LPC_WDT->WDTC = tempval; + return SUCCESS; + } + + break; + + case WDT_CLKSRC_PCLK: + + // Get WDT clock with CCLK divider = 4 + pclk_wdt = SystemCoreClock / 4; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + // Get WDT clock with CCLK divider = 2 + pclk_wdt = SystemCoreClock / 2; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_2); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + // Get WDT clock with CCLK divider = 1 + pclk_wdt = SystemCoreClock; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_1); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + break ; + + + case WDT_CLKSRC_RTC: + pclk_wdt = 32768; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + // Check if it valid + if (tempval >= WDT_TIMEOUT_MIN) + { + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + break; + +// Error parameter + default: + break; +} + + return ERROR; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup WDT_Public_Functions + * @{ + */ + + +/*********************************************************************//** +* @brief Initial for Watchdog function +* Clock source = RTC , +* @param[in] ClkSrc Select clock source, should be: +* - WDT_CLKSRC_IRC: Clock source from Internal RC oscillator +* - WDT_CLKSRC_PCLK: Selects the APB peripheral clock (PCLK) +* - WDT_CLKSRC_RTC: Selects the RTC oscillator +* @param[in] WDTMode WDT mode, should be: +* - WDT_MODE_INT_ONLY: Use WDT to generate interrupt only +* - WDT_MODE_RESET: Use WDT to generate interrupt and reset MCU +* @return None + **********************************************************************/ +void WDT_Init (WDT_CLK_OPT ClkSrc, WDT_MODE_OPT WDTMode) +{ + CHECK_PARAM(PARAM_WDT_CLK_OPT(ClkSrc)); + CHECK_PARAM(PARAM_WDT_MODE_OPT(WDTMode)); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); + + //Set clock source + LPC_WDT->WDCLKSEL &= ~WDT_WDCLKSEL_MASK; + LPC_WDT->WDCLKSEL |= ClkSrc; + //Set WDT mode + if (WDTMode == WDT_MODE_RESET){ + LPC_WDT->WDMOD |= WDT_WDMOD(WDTMode); + } +} + +/*********************************************************************//** +* @brief Start WDT activity with given timeout value +* @param[in] TimeOut WDT reset after timeout if it is not feed +* @return None + **********************************************************************/ +void WDT_Start(uint32_t TimeOut) +{ + uint32_t ClkSrc; + + ClkSrc = LPC_WDT->WDCLKSEL; + ClkSrc &=WDT_WDCLKSEL_MASK; + WDT_SetTimeOut(ClkSrc,TimeOut); + //enable watchdog + LPC_WDT->WDMOD |= WDT_WDMOD_WDEN; + WDT_Feed(); +} + +/********************************************************************//** + * @brief Read WDT Time out flag + * @param[in] None + * @return Time out flag status of WDT + *********************************************************************/ +FlagStatus WDT_ReadTimeOutFlag (void) +{ + return ((FlagStatus)((LPC_WDT->WDMOD & WDT_WDMOD_WDTOF) >>2)); +} + +/********************************************************************//** + * @brief Clear WDT Time out flag + * @param[in] None + * @return None + *********************************************************************/ +void WDT_ClrTimeOutFlag (void) +{ + LPC_WDT->WDMOD &=~WDT_WDMOD_WDTOF; +} + +/********************************************************************//** + * @brief Update WDT timeout value and feed + * @param[in] TimeOut TimeOut value to be updated + * @return None + *********************************************************************/ +void WDT_UpdateTimeOut ( uint32_t TimeOut) +{ + uint32_t ClkSrc; + ClkSrc = LPC_WDT->WDCLKSEL; + ClkSrc &=WDT_WDCLKSEL_MASK; + WDT_SetTimeOut(ClkSrc,TimeOut); + WDT_Feed(); +} + + +/********************************************************************//** + * @brief After set WDTEN, call this function to start Watchdog + * or reload the Watchdog timer + * @param[in] None + * + * @return None + *********************************************************************/ +void WDT_Feed (void) +{ + // Disable irq interrupt + __disable_irq(); + LPC_WDT->WDFEED = 0xAA; + LPC_WDT->WDFEED = 0x55; + // Then enable irq interrupt + __enable_irq(); +} + +/********************************************************************//** + * @brief Get the current value of WDT + * @param[in] None + * @return current value of WDT + *********************************************************************/ +uint32_t WDT_GetCurrentCount(void) +{ + return LPC_WDT->WDTV; +} + +/** + * @} + */ + +#endif /* _WDT */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/LPC17xx.h b/frameworks/CMSIS/LPC1768/include/LPC17xx.h new file mode 100644 index 0000000000..2276260195 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/LPC17xx.h @@ -0,0 +1,1078 @@ +/**************************************************************************//** + * @file LPC17xx.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for + * NXP LPC17xx Device Series + * @version: V1.09 + * @date: 25. July. 2011 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef __LPC17xx_H__ +#define __LPC17xx_H__ + +/* + * ========================================================================== + * ---------- Interrupt Number Definition ----------------------------------- + * ========================================================================== + */ + +/** @addtogroup LPC17xx_System + * @{ + */ + +/** @brief IRQ interrupt source definition */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** LPC17xx Specific Interrupt Numbers *******************************************************/ + WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */ + TIMER0_IRQn = 1, /*!< Timer0 Interrupt */ + TIMER1_IRQn = 2, /*!< Timer1 Interrupt */ + TIMER2_IRQn = 3, /*!< Timer2 Interrupt */ + TIMER3_IRQn = 4, /*!< Timer3 Interrupt */ + UART0_IRQn = 5, /*!< UART0 Interrupt */ + UART1_IRQn = 6, /*!< UART1 Interrupt */ + UART2_IRQn = 7, /*!< UART2 Interrupt */ + UART3_IRQn = 8, /*!< UART3 Interrupt */ + PWM1_IRQn = 9, /*!< PWM1 Interrupt */ + I2C0_IRQn = 10, /*!< I2C0 Interrupt */ + I2C1_IRQn = 11, /*!< I2C1 Interrupt */ + I2C2_IRQn = 12, /*!< I2C2 Interrupt */ + SPI_IRQn = 13, /*!< SPI Interrupt */ + SSP0_IRQn = 14, /*!< SSP0 Interrupt */ + SSP1_IRQn = 15, /*!< SSP1 Interrupt */ + PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */ + RTC_IRQn = 17, /*!< Real Time Clock Interrupt */ + EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */ + EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */ + EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */ + EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */ + ADC_IRQn = 22, /*!< A/D Converter Interrupt */ + BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */ + USB_IRQn = 24, /*!< USB Interrupt */ + CAN_IRQn = 25, /*!< CAN Interrupt */ + DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */ + I2S_IRQn = 27, /*!< I2S Interrupt */ + ENET_IRQn = 28, /*!< Ethernet Interrupt */ + RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */ + MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */ + QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */ + PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */ + USBActivity_IRQn = 33, /*!< USB Activity Interrupt */ + CANActivity_IRQn = 34 /*!< CAN Activity Interrupt */ +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* Configuration of the Cortex-M3 Processor and Core Peripherals */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 1 /*!< Set to 1 if different SysTick Config is used */ + + +#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */ +#include "system_LPC17xx.h" /* System Header */ + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +/*------------- System Control (SC) ------------------------------------------*/ +/** @brief System Control (SC) register structure definition */ +typedef struct +{ + __IO uint32_t FLASHCFG; /* Flash Accelerator Module */ + uint32_t RESERVED0[31]; + __IO uint32_t PLL0CON; /* Clocking and Power Control */ + __IO uint32_t PLL0CFG; + __I uint32_t PLL0STAT; + __O uint32_t PLL0FEED; + uint32_t RESERVED1[4]; + __IO uint32_t PLL1CON; + __IO uint32_t PLL1CFG; + __I uint32_t PLL1STAT; + __O uint32_t PLL1FEED; + uint32_t RESERVED2[4]; + __IO uint32_t PCON; + __IO uint32_t PCONP; + uint32_t RESERVED3[15]; + __IO uint32_t CCLKCFG; + __IO uint32_t USBCLKCFG; + __IO uint32_t CLKSRCSEL; + __IO uint32_t CANSLEEPCLR; + __IO uint32_t CANWAKEFLAGS; + uint32_t RESERVED4[10]; + __IO uint32_t EXTINT; /* External Interrupts */ + uint32_t RESERVED5; + __IO uint32_t EXTMODE; + __IO uint32_t EXTPOLAR; + uint32_t RESERVED6[12]; + __IO uint32_t RSID; /* Reset */ + uint32_t RESERVED7[7]; + __IO uint32_t SCS; /* Syscon Miscellaneous Registers */ + __IO uint32_t IRCTRIM; /* Clock Dividers */ + __IO uint32_t PCLKSEL0; + __IO uint32_t PCLKSEL1; + uint32_t RESERVED8[4]; + __IO uint32_t USBIntSt; /* USB Device/OTG Interrupt Register */ + __IO uint32_t DMAREQSEL; + __IO uint32_t CLKOUTCFG; /* Clock Output Configuration */ + } LPC_SC_TypeDef; + +/*------------- Pin Connect Block (PINCON) -----------------------------------*/ +/** @brief Pin Connect Block (PINCON) register structure definition */ +typedef struct +{ + __IO uint32_t PINSEL0; + __IO uint32_t PINSEL1; + __IO uint32_t PINSEL2; + __IO uint32_t PINSEL3; + __IO uint32_t PINSEL4; + __IO uint32_t PINSEL5; + __IO uint32_t PINSEL6; + __IO uint32_t PINSEL7; + __IO uint32_t PINSEL8; + __IO uint32_t PINSEL9; + __IO uint32_t PINSEL10; + uint32_t RESERVED0[5]; + __IO uint32_t PINMODE0; + __IO uint32_t PINMODE1; + __IO uint32_t PINMODE2; + __IO uint32_t PINMODE3; + __IO uint32_t PINMODE4; + __IO uint32_t PINMODE5; + __IO uint32_t PINMODE6; + __IO uint32_t PINMODE7; + __IO uint32_t PINMODE8; + __IO uint32_t PINMODE9; + __IO uint32_t PINMODE_OD0; + __IO uint32_t PINMODE_OD1; + __IO uint32_t PINMODE_OD2; + __IO uint32_t PINMODE_OD3; + __IO uint32_t PINMODE_OD4; + __IO uint32_t I2CPADCFG; +} LPC_PINCON_TypeDef; + +/*------------- General Purpose Input/Output (GPIO) --------------------------*/ +/** @brief General Purpose Input/Output (GPIO) register structure definition */ +typedef struct +{ + union { + __IO uint32_t FIODIR; + struct { + __IO uint16_t FIODIRL; + __IO uint16_t FIODIRH; + }; + struct { + __IO uint8_t FIODIR0; + __IO uint8_t FIODIR1; + __IO uint8_t FIODIR2; + __IO uint8_t FIODIR3; + }; + }; + uint32_t RESERVED0[3]; + union { + __IO uint32_t FIOMASK; + struct { + __IO uint16_t FIOMASKL; + __IO uint16_t FIOMASKH; + }; + struct { + __IO uint8_t FIOMASK0; + __IO uint8_t FIOMASK1; + __IO uint8_t FIOMASK2; + __IO uint8_t FIOMASK3; + }; + }; + union { + __IO uint32_t FIOPIN; + struct { + __IO uint16_t FIOPINL; + __IO uint16_t FIOPINH; + }; + struct { + __IO uint8_t FIOPIN0; + __IO uint8_t FIOPIN1; + __IO uint8_t FIOPIN2; + __IO uint8_t FIOPIN3; + }; + }; + union { + __IO uint32_t FIOSET; + struct { + __IO uint16_t FIOSETL; + __IO uint16_t FIOSETH; + }; + struct { + __IO uint8_t FIOSET0; + __IO uint8_t FIOSET1; + __IO uint8_t FIOSET2; + __IO uint8_t FIOSET3; + }; + }; + union { + __O uint32_t FIOCLR; + struct { + __O uint16_t FIOCLRL; + __O uint16_t FIOCLRH; + }; + struct { + __O uint8_t FIOCLR0; + __O uint8_t FIOCLR1; + __O uint8_t FIOCLR2; + __O uint8_t FIOCLR3; + }; + }; +} LPC_GPIO_TypeDef; + +/** @brief General Purpose Input/Output interrupt (GPIOINT) register structure definition */ +typedef struct +{ + __I uint32_t IntStatus; + __I uint32_t IO0IntStatR; + __I uint32_t IO0IntStatF; + __O uint32_t IO0IntClr; + __IO uint32_t IO0IntEnR; + __IO uint32_t IO0IntEnF; + uint32_t RESERVED0[3]; + __I uint32_t IO2IntStatR; + __I uint32_t IO2IntStatF; + __O uint32_t IO2IntClr; + __IO uint32_t IO2IntEnR; + __IO uint32_t IO2IntEnF; +} LPC_GPIOINT_TypeDef; + +/*------------- Timer (TIM) --------------------------------------------------*/ +/** @brief Timer (TIM) register structure definition */ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + uint32_t RESERVED0[2]; + __IO uint32_t EMR; + uint32_t RESERVED1[12]; + __IO uint32_t CTCR; +} LPC_TIM_TypeDef; + +/*------------- Pulse-Width Modulation (PWM) ---------------------------------*/ +/** @brief Pulse-Width Modulation (PWM) register structure definition */ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + __I uint32_t CR2; + __I uint32_t CR3; + uint32_t RESERVED0; + __IO uint32_t MR4; + __IO uint32_t MR5; + __IO uint32_t MR6; + __IO uint32_t PCR; + __IO uint32_t LER; + uint32_t RESERVED1[7]; + __IO uint32_t CTCR; +} LPC_PWM_TypeDef; + +/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ +/** @brief Universal Asynchronous Receiver Transmitter (UART) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __I uint8_t FIFOLVL; +} LPC_UART_TypeDef; + +/** @brief Universal Asynchronous Receiver Transmitter 0 (UART0) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __I uint8_t FIFOLVL; +} LPC_UART0_TypeDef; + +/** @brief Universal Asynchronous Receiver Transmitter 1 (UART1) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[3]; + __IO uint8_t MCR; + uint8_t RESERVED2[3]; + __I uint8_t LSR; + uint8_t RESERVED3[3]; + __I uint8_t MSR; + uint8_t RESERVED4[3]; + __IO uint8_t SCR; + uint8_t RESERVED5[3]; + __IO uint32_t ACR; + uint32_t RESERVED6; + __IO uint32_t FDR; + uint32_t RESERVED7; + __IO uint8_t TER; + uint8_t RESERVED8[27]; + __IO uint8_t RS485CTRL; + uint8_t RESERVED9[3]; + __IO uint8_t ADRMATCH; + uint8_t RESERVED10[3]; + __IO uint8_t RS485DLY; + uint8_t RESERVED11[3]; + __I uint8_t FIFOLVL; +} LPC_UART1_TypeDef; + +/*------------- Serial Peripheral Interface (SPI) ----------------------------*/ +/** @brief Serial Peripheral Interface (SPI) register structure definition */ +typedef struct +{ + __IO uint32_t SPCR; + __I uint32_t SPSR; + __IO uint32_t SPDR; + __IO uint32_t SPCCR; + uint32_t RESERVED0[3]; + __IO uint32_t SPINT; +} LPC_SPI_TypeDef; + +/*------------- Synchronous Serial Communication (SSP) -----------------------*/ +/** @brief Synchronous Serial Communication (SSP) register structure definition */ +typedef struct +{ + __IO uint32_t CR0; + __IO uint32_t CR1; + __IO uint32_t DR; + __I uint32_t SR; + __IO uint32_t CPSR; + __IO uint32_t IMSC; + __IO uint32_t RIS; + __IO uint32_t MIS; + __IO uint32_t ICR; + __IO uint32_t DMACR; +} LPC_SSP_TypeDef; + +/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ +/** @brief Inter-Integrated Circuit (I2C) register structure definition */ +typedef struct +{ + __IO uint32_t I2CONSET; + __I uint32_t I2STAT; + __IO uint32_t I2DAT; + __IO uint32_t I2ADR0; + __IO uint32_t I2SCLH; + __IO uint32_t I2SCLL; + __O uint32_t I2CONCLR; + __IO uint32_t MMCTRL; + __IO uint32_t I2ADR1; + __IO uint32_t I2ADR2; + __IO uint32_t I2ADR3; + __I uint32_t I2DATA_BUFFER; + __IO uint32_t I2MASK0; + __IO uint32_t I2MASK1; + __IO uint32_t I2MASK2; + __IO uint32_t I2MASK3; +} LPC_I2C_TypeDef; + +/*------------- Inter IC Sound (I2S) -----------------------------------------*/ +/** @brief Inter IC Sound (I2S) register structure definition */ +typedef struct +{ + __IO uint32_t I2SDAO; + __IO uint32_t I2SDAI; + __O uint32_t I2STXFIFO; + __I uint32_t I2SRXFIFO; + __I uint32_t I2SSTATE; + __IO uint32_t I2SDMA1; + __IO uint32_t I2SDMA2; + __IO uint32_t I2SIRQ; + __IO uint32_t I2STXRATE; + __IO uint32_t I2SRXRATE; + __IO uint32_t I2STXBITRATE; + __IO uint32_t I2SRXBITRATE; + __IO uint32_t I2STXMODE; + __IO uint32_t I2SRXMODE; +} LPC_I2S_TypeDef; + +/*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/ +/** @brief Repetitive Interrupt Timer (RIT) register structure definition */ +typedef struct +{ + __IO uint32_t RICOMPVAL; + __IO uint32_t RIMASK; + __IO uint8_t RICTRL; + uint8_t RESERVED0[3]; + __IO uint32_t RICOUNTER; +} LPC_RIT_TypeDef; + +/*------------- Real-Time Clock (RTC) ----------------------------------------*/ +/** @brief Real-Time Clock (RTC) register structure definition */ +typedef struct +{ + __IO uint8_t ILR; + uint8_t RESERVED0[7]; + __IO uint8_t CCR; + uint8_t RESERVED1[3]; + __IO uint8_t CIIR; + uint8_t RESERVED2[3]; + __IO uint8_t AMR; + uint8_t RESERVED3[3]; + __I uint32_t CTIME0; + __I uint32_t CTIME1; + __I uint32_t CTIME2; + __IO uint8_t SEC; + uint8_t RESERVED4[3]; + __IO uint8_t MIN; + uint8_t RESERVED5[3]; + __IO uint8_t HOUR; + uint8_t RESERVED6[3]; + __IO uint8_t DOM; + uint8_t RESERVED7[3]; + __IO uint8_t DOW; + uint8_t RESERVED8[3]; + __IO uint16_t DOY; + uint16_t RESERVED9; + __IO uint8_t MONTH; + uint8_t RESERVED10[3]; + __IO uint16_t YEAR; + uint16_t RESERVED11; + __IO uint32_t CALIBRATION; + __IO uint32_t GPREG0; + __IO uint32_t GPREG1; + __IO uint32_t GPREG2; + __IO uint32_t GPREG3; + __IO uint32_t GPREG4; + __IO uint8_t RTC_AUXEN; + uint8_t RESERVED12[3]; + __IO uint8_t RTC_AUX; + uint8_t RESERVED13[3]; + __IO uint8_t ALSEC; + uint8_t RESERVED14[3]; + __IO uint8_t ALMIN; + uint8_t RESERVED15[3]; + __IO uint8_t ALHOUR; + uint8_t RESERVED16[3]; + __IO uint8_t ALDOM; + uint8_t RESERVED17[3]; + __IO uint8_t ALDOW; + uint8_t RESERVED18[3]; + __IO uint16_t ALDOY; + uint16_t RESERVED19; + __IO uint8_t ALMON; + uint8_t RESERVED20[3]; + __IO uint16_t ALYEAR; + uint16_t RESERVED21; +} LPC_RTC_TypeDef; + +/*------------- Watchdog Timer (WDT) -----------------------------------------*/ +/** @brief Watchdog Timer (WDT) register structure definition */ +typedef struct +{ + __IO uint8_t WDMOD; + uint8_t RESERVED0[3]; + __IO uint32_t WDTC; + __O uint8_t WDFEED; + uint8_t RESERVED1[3]; + __I uint32_t WDTV; + __IO uint32_t WDCLKSEL; +} LPC_WDT_TypeDef; + +/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ +/** @brief Analog-to-Digital Converter (ADC) register structure definition */ +typedef struct +{ + __IO uint32_t ADCR; + __IO uint32_t ADGDR; + uint32_t RESERVED0; + __IO uint32_t ADINTEN; + __I uint32_t ADDR0; + __I uint32_t ADDR1; + __I uint32_t ADDR2; + __I uint32_t ADDR3; + __I uint32_t ADDR4; + __I uint32_t ADDR5; + __I uint32_t ADDR6; + __I uint32_t ADDR7; + __I uint32_t ADSTAT; + __IO uint32_t ADTRM; +} LPC_ADC_TypeDef; + +/*------------- Digital-to-Analog Converter (DAC) ----------------------------*/ +/** @brief Digital-to-Analog Converter (DAC) register structure definition */ +typedef struct +{ + __IO uint32_t DACR; + __IO uint32_t DACCTRL; + __IO uint16_t DACCNTVAL; +} LPC_DAC_TypeDef; + +/*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/ +/** @brief Motor Control Pulse-Width Modulation (MCPWM) register structure definition */ +typedef struct +{ + __I uint32_t MCCON; + __O uint32_t MCCON_SET; + __O uint32_t MCCON_CLR; + __I uint32_t MCCAPCON; + __O uint32_t MCCAPCON_SET; + __O uint32_t MCCAPCON_CLR; + __IO uint32_t MCTIM0; + __IO uint32_t MCTIM1; + __IO uint32_t MCTIM2; + __IO uint32_t MCPER0; + __IO uint32_t MCPER1; + __IO uint32_t MCPER2; + __IO uint32_t MCPW0; + __IO uint32_t MCPW1; + __IO uint32_t MCPW2; + __IO uint32_t MCDEADTIME; + __IO uint32_t MCCCP; + __IO uint32_t MCCR0; + __IO uint32_t MCCR1; + __IO uint32_t MCCR2; + __I uint32_t MCINTEN; + __O uint32_t MCINTEN_SET; + __O uint32_t MCINTEN_CLR; + __I uint32_t MCCNTCON; + __O uint32_t MCCNTCON_SET; + __O uint32_t MCCNTCON_CLR; + __I uint32_t MCINTFLAG; + __O uint32_t MCINTFLAG_SET; + __O uint32_t MCINTFLAG_CLR; + __O uint32_t MCCAP_CLR; +} LPC_MCPWM_TypeDef; + +/*------------- Quadrature Encoder Interface (QEI) ---------------------------*/ +/** @brief Quadrature Encoder Interface (QEI) register structure definition */ +typedef struct +{ + __O uint32_t QEICON; + __I uint32_t QEISTAT; + __IO uint32_t QEICONF; + __I uint32_t QEIPOS; + __IO uint32_t QEIMAXPOS; + __IO uint32_t CMPOS0; + __IO uint32_t CMPOS1; + __IO uint32_t CMPOS2; + __I uint32_t INXCNT; + __IO uint32_t INXCMP; + __IO uint32_t QEILOAD; + __I uint32_t QEITIME; + __I uint32_t QEIVEL; + __I uint32_t QEICAP; + __IO uint32_t VELCOMP; + __IO uint32_t FILTER; + uint32_t RESERVED0[998]; + __O uint32_t QEIIEC; + __O uint32_t QEIIES; + __I uint32_t QEIINTSTAT; + __I uint32_t QEIIE; + __O uint32_t QEICLR; + __O uint32_t QEISET; +} LPC_QEI_TypeDef; + +/*------------- Controller Area Network (CAN) --------------------------------*/ +/** @brief Controller Area Network Acceptance Filter RAM (CANAF_RAM)structure definition */ +typedef struct +{ + __IO uint32_t mask[512]; /* ID Masks */ +} LPC_CANAF_RAM_TypeDef; + +/** @brief Controller Area Network Acceptance Filter(CANAF) register structure definition */ +typedef struct /* Acceptance Filter Registers */ +{ + __IO uint32_t AFMR; + __IO uint32_t SFF_sa; + __IO uint32_t SFF_GRP_sa; + __IO uint32_t EFF_sa; + __IO uint32_t EFF_GRP_sa; + __IO uint32_t ENDofTable; + __I uint32_t LUTerrAd; + __I uint32_t LUTerr; + __IO uint32_t FCANIE; + __IO uint32_t FCANIC0; + __IO uint32_t FCANIC1; +} LPC_CANAF_TypeDef; + +/** @brief Controller Area Network Central (CANCR) register structure definition */ +typedef struct /* Central Registers */ +{ + __I uint32_t CANTxSR; + __I uint32_t CANRxSR; + __I uint32_t CANMSR; +} LPC_CANCR_TypeDef; + +/** @brief Controller Area Network Controller (CAN) register structure definition */ +typedef struct /* Controller Registers */ +{ + __IO uint32_t MOD; + __O uint32_t CMR; + __IO uint32_t GSR; + __I uint32_t ICR; + __IO uint32_t IER; + __IO uint32_t BTR; + __IO uint32_t EWL; + __I uint32_t SR; + __IO uint32_t RFS; + __IO uint32_t RID; + __IO uint32_t RDA; + __IO uint32_t RDB; + __IO uint32_t TFI1; + __IO uint32_t TID1; + __IO uint32_t TDA1; + __IO uint32_t TDB1; + __IO uint32_t TFI2; + __IO uint32_t TID2; + __IO uint32_t TDA2; + __IO uint32_t TDB2; + __IO uint32_t TFI3; + __IO uint32_t TID3; + __IO uint32_t TDA3; + __IO uint32_t TDB3; +} LPC_CAN_TypeDef; + +/*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/ +/** @brief General Purpose Direct Memory Access (GPDMA) register structure definition */ +typedef struct /* Common Registers */ +{ + __I uint32_t DMACIntStat; + __I uint32_t DMACIntTCStat; + __O uint32_t DMACIntTCClear; + __I uint32_t DMACIntErrStat; + __O uint32_t DMACIntErrClr; + __I uint32_t DMACRawIntTCStat; + __I uint32_t DMACRawIntErrStat; + __I uint32_t DMACEnbldChns; + __IO uint32_t DMACSoftBReq; + __IO uint32_t DMACSoftSReq; + __IO uint32_t DMACSoftLBReq; + __IO uint32_t DMACSoftLSReq; + __IO uint32_t DMACConfig; + __IO uint32_t DMACSync; +} LPC_GPDMA_TypeDef; + +/** @brief General Purpose Direct Memory Access Channel (GPDMACH) register structure definition */ +typedef struct /* Channel Registers */ +{ + __IO uint32_t DMACCSrcAddr; + __IO uint32_t DMACCDestAddr; + __IO uint32_t DMACCLLI; + __IO uint32_t DMACCControl; + __IO uint32_t DMACCConfig; +} LPC_GPDMACH_TypeDef; + +/*------------- Universal Serial Bus (USB) -----------------------------------*/ +/** @brief Universal Serial Bus (USB) register structure definition */ +typedef struct +{ + __I uint32_t HcRevision; /* USB Host Registers */ + __IO uint32_t HcControl; + __IO uint32_t HcCommandStatus; + __IO uint32_t HcInterruptStatus; + __IO uint32_t HcInterruptEnable; + __IO uint32_t HcInterruptDisable; + __IO uint32_t HcHCCA; + __I uint32_t HcPeriodCurrentED; + __IO uint32_t HcControlHeadED; + __IO uint32_t HcControlCurrentED; + __IO uint32_t HcBulkHeadED; + __IO uint32_t HcBulkCurrentED; + __I uint32_t HcDoneHead; + __IO uint32_t HcFmInterval; + __I uint32_t HcFmRemaining; + __I uint32_t HcFmNumber; + __IO uint32_t HcPeriodicStart; + __IO uint32_t HcLSTreshold; + __IO uint32_t HcRhDescriptorA; + __IO uint32_t HcRhDescriptorB; + __IO uint32_t HcRhStatus; + __IO uint32_t HcRhPortStatus1; + __IO uint32_t HcRhPortStatus2; + uint32_t RESERVED0[40]; + __I uint32_t Module_ID; + + __I uint32_t OTGIntSt; /* USB On-The-Go Registers */ + __IO uint32_t OTGIntEn; + __O uint32_t OTGIntSet; + __O uint32_t OTGIntClr; + __IO uint32_t OTGStCtrl; + __IO uint32_t OTGTmr; + uint32_t RESERVED1[58]; + + __I uint32_t USBDevIntSt; /* USB Device Interrupt Registers */ + __IO uint32_t USBDevIntEn; + __O uint32_t USBDevIntClr; + __O uint32_t USBDevIntSet; + + __O uint32_t USBCmdCode; /* USB Device SIE Command Registers */ + __I uint32_t USBCmdData; + + __I uint32_t USBRxData; /* USB Device Transfer Registers */ + __O uint32_t USBTxData; + __I uint32_t USBRxPLen; + __O uint32_t USBTxPLen; + __IO uint32_t USBCtrl; + __O uint32_t USBDevIntPri; + + __I uint32_t USBEpIntSt; /* USB Device Endpoint Interrupt Regs */ + __IO uint32_t USBEpIntEn; + __O uint32_t USBEpIntClr; + __O uint32_t USBEpIntSet; + __O uint32_t USBEpIntPri; + + __IO uint32_t USBReEp; /* USB Device Endpoint Realization Reg*/ + __O uint32_t USBEpInd; + __IO uint32_t USBMaxPSize; + + __I uint32_t USBDMARSt; /* USB Device DMA Registers */ + __O uint32_t USBDMARClr; + __O uint32_t USBDMARSet; + uint32_t RESERVED2[9]; + __IO uint32_t USBUDCAH; + __I uint32_t USBEpDMASt; + __O uint32_t USBEpDMAEn; + __O uint32_t USBEpDMADis; + __I uint32_t USBDMAIntSt; + __IO uint32_t USBDMAIntEn; + uint32_t RESERVED3[2]; + __I uint32_t USBEoTIntSt; + __O uint32_t USBEoTIntClr; + __O uint32_t USBEoTIntSet; + __I uint32_t USBNDDRIntSt; + __O uint32_t USBNDDRIntClr; + __O uint32_t USBNDDRIntSet; + __I uint32_t USBSysErrIntSt; + __O uint32_t USBSysErrIntClr; + __O uint32_t USBSysErrIntSet; + uint32_t RESERVED4[15]; + + union { + __I uint32_t I2C_RX; /* USB OTG I2C Registers */ + __O uint32_t I2C_TX; + }; + __I uint32_t I2C_STS; + __IO uint32_t I2C_CTL; + __IO uint32_t I2C_CLKHI; + __O uint32_t I2C_CLKLO; + uint32_t RESERVED5[824]; + + union { + __IO uint32_t USBClkCtrl; /* USB Clock Control Registers */ + __IO uint32_t OTGClkCtrl; + }; + union { + __I uint32_t USBClkSt; + __I uint32_t OTGClkSt; + }; +} LPC_USB_TypeDef; + +/*------------- Ethernet Media Access Controller (EMAC) ----------------------*/ +/** @brief Ethernet Media Access Controller (EMAC) register structure definition */ +typedef struct +{ + __IO uint32_t MAC1; /* MAC Registers */ + __IO uint32_t MAC2; + __IO uint32_t IPGT; + __IO uint32_t IPGR; + __IO uint32_t CLRT; + __IO uint32_t MAXF; + __IO uint32_t SUPP; + __IO uint32_t TEST; + __IO uint32_t MCFG; + __IO uint32_t MCMD; + __IO uint32_t MADR; + __O uint32_t MWTD; + __I uint32_t MRDD; + __I uint32_t MIND; + uint32_t RESERVED0[2]; + __IO uint32_t SA0; + __IO uint32_t SA1; + __IO uint32_t SA2; + uint32_t RESERVED1[45]; + __IO uint32_t Command; /* Control Registers */ + __I uint32_t Status; + __IO uint32_t RxDescriptor; + __IO uint32_t RxStatus; + __IO uint32_t RxDescriptorNumber; + __I uint32_t RxProduceIndex; + __IO uint32_t RxConsumeIndex; + __IO uint32_t TxDescriptor; + __IO uint32_t TxStatus; + __IO uint32_t TxDescriptorNumber; + __IO uint32_t TxProduceIndex; + __I uint32_t TxConsumeIndex; + uint32_t RESERVED2[10]; + __I uint32_t TSV0; + __I uint32_t TSV1; + __I uint32_t RSV; + uint32_t RESERVED3[3]; + __IO uint32_t FlowControlCounter; + __I uint32_t FlowControlStatus; + uint32_t RESERVED4[34]; + __IO uint32_t RxFilterCtrl; /* Rx Filter Registers */ + __IO uint32_t RxFilterWoLStatus; + __IO uint32_t RxFilterWoLClear; + uint32_t RESERVED5; + __IO uint32_t HashFilterL; + __IO uint32_t HashFilterH; + uint32_t RESERVED6[882]; + __I uint32_t IntStatus; /* Module Control Registers */ + __IO uint32_t IntEnable; + __O uint32_t IntClear; + __O uint32_t IntSet; + uint32_t RESERVED7; + __IO uint32_t PowerDown; + uint32_t RESERVED8; + __IO uint32_t Module_ID; +} LPC_EMAC_TypeDef; + + +#if defined ( __CC_ARM ) +#pragma no_anon_unions +#endif + + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/* Base addresses */ +#define LPC_FLASH_BASE (0x00000000UL) +#define LPC_RAM_BASE (0x10000000UL) +#ifdef __LPC17XX_REV00 +#define LPC_AHBRAM0_BASE (0x20000000UL) +#define LPC_AHBRAM1_BASE (0x20004000UL) +#else +#define LPC_AHBRAM0_BASE (0x2007C000UL) +#define LPC_AHBRAM1_BASE (0x20080000UL) +#endif +#define LPC_GPIO_BASE (0x2009C000UL) +#define LPC_APB0_BASE (0x40000000UL) +#define LPC_APB1_BASE (0x40080000UL) +#define LPC_AHB_BASE (0x50000000UL) +#define LPC_CM3_BASE (0xE0000000UL) + +/* APB0 peripherals */ +#define LPC_WDT_BASE (LPC_APB0_BASE + 0x00000) +#define LPC_TIM0_BASE (LPC_APB0_BASE + 0x04000) +#define LPC_TIM1_BASE (LPC_APB0_BASE + 0x08000) +#define LPC_UART0_BASE (LPC_APB0_BASE + 0x0C000) +#define LPC_UART1_BASE (LPC_APB0_BASE + 0x10000) +#define LPC_PWM1_BASE (LPC_APB0_BASE + 0x18000) +#define LPC_I2C0_BASE (LPC_APB0_BASE + 0x1C000) +#define LPC_SPI_BASE (LPC_APB0_BASE + 0x20000) +#define LPC_RTC_BASE (LPC_APB0_BASE + 0x24000) +#define LPC_GPIOINT_BASE (LPC_APB0_BASE + 0x28080) +#define LPC_PINCON_BASE (LPC_APB0_BASE + 0x2C000) +#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x30000) +#define LPC_ADC_BASE (LPC_APB0_BASE + 0x34000) +#define LPC_CANAF_RAM_BASE (LPC_APB0_BASE + 0x38000) +#define LPC_CANAF_BASE (LPC_APB0_BASE + 0x3C000) +#define LPC_CANCR_BASE (LPC_APB0_BASE + 0x40000) +#define LPC_CAN1_BASE (LPC_APB0_BASE + 0x44000) +#define LPC_CAN2_BASE (LPC_APB0_BASE + 0x48000) +#define LPC_I2C1_BASE (LPC_APB0_BASE + 0x5C000) + +/* APB1 peripherals */ +#define LPC_SSP0_BASE (LPC_APB1_BASE + 0x08000) +#define LPC_DAC_BASE (LPC_APB1_BASE + 0x0C000) +#define LPC_TIM2_BASE (LPC_APB1_BASE + 0x10000) +#define LPC_TIM3_BASE (LPC_APB1_BASE + 0x14000) +#define LPC_UART2_BASE (LPC_APB1_BASE + 0x18000) +#define LPC_UART3_BASE (LPC_APB1_BASE + 0x1C000) +#define LPC_I2C2_BASE (LPC_APB1_BASE + 0x20000) +#define LPC_I2S_BASE (LPC_APB1_BASE + 0x28000) +#define LPC_RIT_BASE (LPC_APB1_BASE + 0x30000) +#define LPC_MCPWM_BASE (LPC_APB1_BASE + 0x38000) +#define LPC_QEI_BASE (LPC_APB1_BASE + 0x3C000) +#define LPC_SC_BASE (LPC_APB1_BASE + 0x7C000) + +/* AHB peripherals */ +#define LPC_EMAC_BASE (LPC_AHB_BASE + 0x00000) +#define LPC_GPDMA_BASE (LPC_AHB_BASE + 0x04000) +#define LPC_GPDMACH0_BASE (LPC_AHB_BASE + 0x04100) +#define LPC_GPDMACH1_BASE (LPC_AHB_BASE + 0x04120) +#define LPC_GPDMACH2_BASE (LPC_AHB_BASE + 0x04140) +#define LPC_GPDMACH3_BASE (LPC_AHB_BASE + 0x04160) +#define LPC_GPDMACH4_BASE (LPC_AHB_BASE + 0x04180) +#define LPC_GPDMACH5_BASE (LPC_AHB_BASE + 0x041A0) +#define LPC_GPDMACH6_BASE (LPC_AHB_BASE + 0x041C0) +#define LPC_GPDMACH7_BASE (LPC_AHB_BASE + 0x041E0) +#define LPC_USB_BASE (LPC_AHB_BASE + 0x0C000) + +/* GPIOs */ +#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000) +#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020) +#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040) +#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060) +#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080) + +/******************************************************************************/ +/* Peripheral declaration */ +/******************************************************************************/ +#define LPC_SC ((LPC_SC_TypeDef *) LPC_SC_BASE ) +#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) +#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) +#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) +#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) +#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE ) +#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE ) +#define LPC_TIM0 ((LPC_TIM_TypeDef *) LPC_TIM0_BASE ) +#define LPC_TIM1 ((LPC_TIM_TypeDef *) LPC_TIM1_BASE ) +#define LPC_TIM2 ((LPC_TIM_TypeDef *) LPC_TIM2_BASE ) +#define LPC_TIM3 ((LPC_TIM_TypeDef *) LPC_TIM3_BASE ) +#define LPC_RIT ((LPC_RIT_TypeDef *) LPC_RIT_BASE ) +#define LPC_UART0 ((LPC_UART_TypeDef *) LPC_UART0_BASE ) +#define LPC_UART1 ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE ) +#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE ) +#define LPC_PWM1 ((LPC_PWM_TypeDef *) LPC_PWM1_BASE ) +#define LPC_I2C0 ((LPC_I2C_TypeDef *) LPC_I2C0_BASE ) +#define LPC_I2C1 ((LPC_I2C_TypeDef *) LPC_I2C1_BASE ) +#define LPC_I2C2 ((LPC_I2C_TypeDef *) LPC_I2C2_BASE ) +#define LPC_I2S ((LPC_I2S_TypeDef *) LPC_I2S_BASE ) +#define LPC_SPI ((LPC_SPI_TypeDef *) LPC_SPI_BASE ) +#define LPC_RTC ((LPC_RTC_TypeDef *) LPC_RTC_BASE ) +#define LPC_GPIOINT ((LPC_GPIOINT_TypeDef *) LPC_GPIOINT_BASE ) +#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE ) +#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) +#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) +#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) +#define LPC_DAC ((LPC_DAC_TypeDef *) LPC_DAC_BASE ) +#define LPC_CANAF_RAM ((LPC_CANAF_RAM_TypeDef *) LPC_CANAF_RAM_BASE) +#define LPC_CANAF ((LPC_CANAF_TypeDef *) LPC_CANAF_BASE ) +#define LPC_CANCR ((LPC_CANCR_TypeDef *) LPC_CANCR_BASE ) +#define LPC_CAN1 ((LPC_CAN_TypeDef *) LPC_CAN1_BASE ) +#define LPC_CAN2 ((LPC_CAN_TypeDef *) LPC_CAN2_BASE ) +#define LPC_MCPWM ((LPC_MCPWM_TypeDef *) LPC_MCPWM_BASE ) +#define LPC_QEI ((LPC_QEI_TypeDef *) LPC_QEI_BASE ) +#define LPC_EMAC ((LPC_EMAC_TypeDef *) LPC_EMAC_BASE ) +#define LPC_GPDMA ((LPC_GPDMA_TypeDef *) LPC_GPDMA_BASE ) +#define LPC_GPDMACH0 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH0_BASE ) +#define LPC_GPDMACH1 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH1_BASE ) +#define LPC_GPDMACH2 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH2_BASE ) +#define LPC_GPDMACH3 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH3_BASE ) +#define LPC_GPDMACH4 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH4_BASE ) +#define LPC_GPDMACH5 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH5_BASE ) +#define LPC_GPDMACH6 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH6_BASE ) +#define LPC_GPDMACH7 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH7_BASE ) +#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE ) + +/** + * @} + */ + +#endif // __LPC17xx_H__ diff --git a/frameworks/CMSIS/LPC1768/include/arm_common_tables.h b/frameworks/CMSIS/LPC1768/include/arm_common_tables.h new file mode 100644 index 0000000000..d55c46349f --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/arm_common_tables.h @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 11. November 2010 +* $Revision: V1.0.2 +* +* Project: CMSIS DSP Library +* Title: arm_common_tables.h +* +* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* -------------------------------------------------------------------- */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern uint16_t armBitRevTable[256]; +extern q15_t armRecipTableQ15[64]; +extern q31_t armRecipTableQ31[64]; +extern const q31_t realCoefAQ31[1024]; +extern const q31_t realCoefBQ31[1024]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/frameworks/CMSIS/LPC1768/include/arm_math.h b/frameworks/CMSIS/LPC1768/include/arm_math.h new file mode 100644 index 0000000000..dc9acf670b --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/arm_math.h @@ -0,0 +1,7064 @@ +/* ---------------------------------------------------------------------- + * Copyright (C) 2010 ARM Limited. All rights reserved. + * + * $Date: 15. July 2011 + * $Revision: V1.0.10 + * + * Project: CMSIS DSP Library + * Title: arm_math.h + * + * Description: Public header file for CMSIS DSP Library + * + * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 + * + * Version 1.0.10 2011/7/15 + * Big Endian support added and Merged M0 and M3/M4 Source code. + * + * Version 1.0.3 2010/11/29 + * Re-organized the CMSIS folders and updated documentation. + * + * Version 1.0.2 2010/11/11 + * Documentation updated. + * + * Version 1.0.1 2010/10/05 + * Production release and review comments incorporated. + * + * Version 1.0.0 2010/09/20 + * Production release and review comments incorporated. + * -------------------------------------------------------------------- */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of modules each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transforms + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Processor Support + * + * The library is completely written in C and is fully CMSIS compliant. + * High performance is achieved through maximum use of Cortex-M4 intrinsics. + * + * The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, + * with the DSP intrinsics being emulated through software. + * + * + * Toolchain Support + * + * The library has been developed and tested with MDK-ARM version 4.21. + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Using the Library + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) + * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) + * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) + * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) + * - arm_cortexM0l_math.lib (Little endian on Cortex-M0) + * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or + * ARM_MATH_CM0 depending on the target processor in the application. + * + * Examples + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Building the Library + * + * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\DSP_Lib\Source\ARM folder. + * - arm_cortexM0b_math.uvproj + * - arm_cortexM0l_math.uvproj + * - arm_cortexM3b_math.uvproj + * - arm_cortexM3l_math.uvproj + * - arm_cortexM4b_math.uvproj + * - arm_cortexM4l_math.uvproj + * - arm_cortexM4bf_math.uvproj + * - arm_cortexM4lf_math.uvproj + * + * Each library project have differant pre-processor macros. + * + * ARM_MATH_CMx: + * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target + * and ARM_MATH_CM0 for building library on cortex-M0 target. + * + * ARM_MATH_BIG_ENDIAN: + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * ARM_MATH_MATRIX_CHECK: + * Define macro for checking on the input and output sizes of matrices + * + * ARM_MATH_ROUNDING: + * Define macro for rounding on support functions + * + * __FPU_PRESENT: + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries + * + * + * The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. + * + * Copyright Notice + * + * Copyright (C) 2010 ARM Limited. All rights reserved. + */ + + +/** + * @ingroup DSP_Functions + * @defgroup groupMath Basic Math Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + + +/** + * @ingroup DSP_Functions + * @defgroup groupFilters Filtering Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
+ *     typedef struct
+ *     {
+ *       uint16_t numRows;     // number of rows of the matrix.
+ *       uint16_t numCols;     // number of columns of the matrix.
+ *       float32_t *pData;     // points to the data of the matrix.
+ *     } arm_matrix_instance_f32;
+ * 
+ * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the #define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupTransforms Transform Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupController Controller Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupStats Statistics Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupSupport Support Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @ingroup DSP_Lib + * @defgroup groupExamples Examples + */ +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ + +#if defined (ARM_MATH_CM4) + #include "core_cm4.h" +#elif defined (ARM_MATH_CM3) + #include "core_cm3.h" +#elif defined (ARM_MATH_CM0) + #include "core_cm0.h" +#else +#include "ARMCM4.h" +#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." +#endif + +#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ +#include "string.h" + #include "math.h" +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#define PI 3.14159265358979f + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define TABLE_SIZE 256 +#define TABLE_SPACING_Q31 0x800000 +#define TABLE_SPACING_Q15 0x80 + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_status; + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ + typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + /** + * @brief definition to read/write two 16 bit values. + */ +#define __SIMD32(addr) (*(int32_t **) & (addr)) + +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + /** + * @brief definition to pack two 16 bit values. + */ +#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) + +#endif + + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) + +#endif + + + /** + * @brief Clips Q63 to Q31 values. + */ + static __INLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + static __INLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + static __INLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + static __INLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + + static __INLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y))); + } + + +#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) +#define __CLZ __clz +#endif + +#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) ) + + static __INLINE uint32_t __CLZ(q31_t data); + + + static __INLINE uint32_t __CLZ(q31_t data) + { + uint32_t count = 0; + uint32_t mask = 0x80000000; + + while((data & mask) == 0) + { + count += 1u; + mask = mask >> 1u; + } + + return(count); + + } + +#endif + + /** + * @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. + */ + + static __INLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + q31_t * pRecipTable) + { + + uint32_t out, tempVal; + uint32_t index, i; + uint32_t signBits; + + if(in > 0) + { + signBits = __CLZ(in) - 1; + } + else + { + signBits = __CLZ(-in) - 1; + } + + /* Convert input sample to 1.31 format */ + in = in << signBits; + + /* calculation of index for initial approximated Val */ + index = (uint32_t) (in >> 24u); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (q31_t) (((q63_t) in * out) >> 31u); + tempVal = 0x7FFFFFFF - tempVal; + /* 1.31 with exp 1 */ + //out = (q31_t) (((q63_t) out * tempVal) >> 30u); + out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1u); + + } + + /** + * @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. + */ + static __INLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + q15_t * pRecipTable) + { + + uint32_t out = 0, tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if(in > 0) + { + signBits = __CLZ(in) - 17; + } + else + { + signBits = __CLZ(-in) - 17; + } + + /* Convert input sample to 1.15 format */ + in = in << signBits; + + /* calculation of index for initial approximated Val */ + index = in >> 8; + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0; i < 2; i++) + { + tempVal = (q15_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFF - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + + } + + + /* + * @brief C custom defined intrinisic function for only M0 processors + */ +#if defined(ARM_MATH_CM0) + + static __INLINE q31_t __SSAT( + q31_t x, + uint32_t y) + { + int32_t posMax, negMin; + uint32_t i; + + posMax = 1; + for (i = 0; i < (y - 1); i++) + { + posMax = posMax * 2; + } + + if(x > 0) + { + posMax = (posMax - 1); + + if(x > posMax) + { + x = posMax; + } + } + else + { + negMin = -posMax; + + if(x < negMin) + { + x = negMin; + } + } + return (x); + + + } + +#endif /* end of ARM_MATH_CM0 */ + + + + /* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + + /* + * @brief C custom defined QADD8 for M3 and M0 processors + */ + static __INLINE q31_t __QADD8( + q31_t x, + q31_t y) + { + + q31_t sum; + q7_t r, s, t, u; + + r = (char) x; + s = (char) y; + + r = __SSAT((q31_t) (r + s), 8); + s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); + t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); + u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); + + sum = (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | + (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); + + return sum; + + } + + /* + * @brief C custom defined QSUB8 for M3 and M0 processors + */ + static __INLINE q31_t __QSUB8( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s, t, u; + + r = (char) x; + s = (char) y; + + r = __SSAT((r - s), 8); + s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; + t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; + u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; + + sum = + (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); + + return sum; + } + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + static __INLINE q31_t __QADD16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = __SSAT(r + s, 16); + s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + + } + + /* + * @brief C custom defined SHADD16 for M3 and M0 processors + */ + static __INLINE q31_t __SHADD16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) + (s >> 1)); + s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + + } + + /* + * @brief C custom defined QSUB16 for M3 and M0 processors + */ + static __INLINE q31_t __QSUB16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = __SSAT(r - s, 16); + s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + /* + * @brief C custom defined SHSUB16 for M3 and M0 processors + */ + static __INLINE q31_t __SHSUB16( + q31_t x, + q31_t y) + { + + q31_t diff; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) - (s >> 1)); + s = (((x >> 17) - (y >> 17)) << 16); + + diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return diff; + } + + /* + * @brief C custom defined QASX for M3 and M0 processors + */ + static __INLINE q31_t __QASX( + q31_t x, + q31_t y) + { + + q31_t sum = 0; + + sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + + clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); + + return sum; + } + + /* + * @brief C custom defined SHASX for M3 and M0 processors + */ + static __INLINE q31_t __SHASX( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) - (y >> 17)); + s = (((x >> 17) + (s >> 1)) << 16); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + + /* + * @brief C custom defined QSAX for M3 and M0 processors + */ + static __INLINE q31_t __QSAX( + q31_t x, + q31_t y) + { + + q31_t sum = 0; + + sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + + clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); + + return sum; + } + + /* + * @brief C custom defined SHSAX for M3 and M0 processors + */ + static __INLINE q31_t __SHSAX( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) + (y >> 17)); + s = (((x >> 17) - (s >> 1)) << 16); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + /* + * @brief C custom defined SMUSDX for M3 and M0 processors + */ + static __INLINE q31_t __SMUSDX( + q31_t x, + q31_t y) + { + + return ((q31_t)(((short) x * (short) (y >> 16)) - + ((short) (x >> 16) * (short) y))); + } + + /* + * @brief C custom defined SMUADX for M3 and M0 processors + */ + static __INLINE q31_t __SMUADX( + q31_t x, + q31_t y) + { + + return ((q31_t)(((short) x * (short) (y >> 16)) + + ((short) (x >> 16) * (short) y))); + } + + /* + * @brief C custom defined QADD for M3 and M0 processors + */ + static __INLINE q31_t __QADD( + q31_t x, + q31_t y) + { + return clip_q63_to_q31((q63_t) x + y); + } + + /* + * @brief C custom defined QSUB for M3 and M0 processors + */ + static __INLINE q31_t __QSUB( + q31_t x, + q31_t y) + { + return clip_q63_to_q31((q63_t) x - y); + } + + /* + * @brief C custom defined SMLAD for M3 and M0 processors + */ + static __INLINE q31_t __SMLAD( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y >> 16)) + + ((short) x * (short) y)); + } + + /* + * @brief C custom defined SMLADX for M3 and M0 processors + */ + static __INLINE q31_t __SMLADX( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y)) + + ((short) x * (short) (y >> 16))); + } + + /* + * @brief C custom defined SMLSDX for M3 and M0 processors + */ + static __INLINE q31_t __SMLSDX( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum - ((short) (x >> 16) * (short) (y)) + + ((short) x * (short) (y >> 16))); + } + + /* + * @brief C custom defined SMLALD for M3 and M0 processors + */ + static __INLINE q63_t __SMLALD( + q31_t x, + q31_t y, + q63_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y >> 16)) + + ((short) x * (short) y)); + } + + /* + * @brief C custom defined SMLALDX for M3 and M0 processors + */ + static __INLINE q63_t __SMLALDX( + q31_t x, + q31_t y, + q63_t sum) + { + + return (sum + ((short) (x >> 16) * (short) y)) + + ((short) x * (short) (y >> 16)); + } + + /* + * @brief C custom defined SMUAD for M3 and M0 processors + */ + static __INLINE q31_t __SMUAD( + q31_t x, + q31_t y) + { + + return (((x >> 16) * (y >> 16)) + + (((x << 16) >> 16) * ((y << 16) >> 16))); + } + + /* + * @brief C custom defined SMUSD for M3 and M0 processors + */ + static __INLINE q31_t __SMUSD( + q31_t x, + q31_t y) + { + + return (-((x >> 16) * (y >> 16)) + + (((x << 16) >> 16) * ((y << 16) >> 16))); + } + + + + +#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ + + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] *S points to an instance of the Q7 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] *S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + * @return none + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] *S points to an instance of the Q15 FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] *S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if + * numTaps is not a supported value. + */ + + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] *S points to an instance of the Q31 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] *S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return none. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] *S points to an instance of the floating-point FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] *S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return none. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + + } arm_biquad_casd_df1_inst_q15; + + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + + + } arm_biquad_casd_df1_inst_f32; + + + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] *S points to an instance of the floating-point Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @return none + */ + + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + + } arm_matrix_instance_q31; + + + + /** + * @brief Floating-point matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @param[in] *pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q31 matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix scaling. + * @param[in] *pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] *pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix scaling. + * @param[in] *pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix scaling. + * @param[in] *pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t *pData); + + /** + * @brief Q15 matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t *pData); + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t *pData); + + + + /** + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + #ifdef ARM_MATH_CM0 + q15_t A1; + q15_t A2; + #else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ + #endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + + } arm_pid_instance_q31; + + /** + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] *S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] *S is an instance of the floating-point PID Control structure + * @return none + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q31 PID Control structure + * @return none + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the q15 PID Control structure + * @return none + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; + float32_t x1; + float32_t xSpacing; + float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Q7 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + + /** + * @brief Processing function for the Q15 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Initialization function for the Q15 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Initialization function for the Q31 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point CFFT/CIFFT. + * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Initialization function for the floating-point CFFT/CIFFT. + * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + + + /*---------------------------------------------------------------------- + * Internal functions prototypes FFT function + ----------------------------------------------------------------------*/ + + /** + * @brief Core function for the floating-point CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to the twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier); + + /** + * @brief Core function for the floating-point CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @param[in] onebyfftLen value of 1/fftLen. + * @return none. + */ + + void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftSize length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. + * @param[in] *pBitRevTab points to the bit reversal table. + * @return none. + */ + + void arm_bitreversal_f32( + float32_t *pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q31 CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q31( + q31_t *pSrc, + uint32_t fftLen, + q31_t *pCoef, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q31 CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + q31_t * pCoef, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q15 CFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q15 CIFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint32_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint32_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + /** + * @brief Processing function for the Q15 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Initialization function for the Q15 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Initialization function for the Q31 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Initialization function for the floating-point RFFT/RIFFT. + * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point RFFT/RIFFT. + * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] *S points to an instance of the Q31 DCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] *S points to an instance of the Q15 DCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + /** + * @brief Floating-point vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_f32( + float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q31( + q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Dot product of floating-point vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + /** + * @brief Dot product of Q7 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q7( + q7_t * pSrcA, + q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + /** + * @brief Dot product of Q15 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + /** + * @brief Dot product of Q31 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_f32( + float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q7( + q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q15( + q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q31( + q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Convolution of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + +/** + * @brief Convolution of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Convolution of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Convolution of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + + } arm_fir_decimate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + + } arm_fir_decimate_instance_f32; + + + + /** + * @brief Processing function for the floating-point FIR decimator. + * @param[in] *S points to an instance of the floating-point FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR decimator. + * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_fast_q31( + arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] *S points to an instance of the floating-point FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] *S points to an instance of the filter data structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] *S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @return none + */ + + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] *S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] *S points to an instance of the Q15 FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] *S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] *S points to an instance of the Q31 FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] *S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] *S points to an instance of the floating-point FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] *S points to an instance of the floating-point IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] *S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t *pkCoeffs, + float32_t *pvCoeffs, + float32_t *pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] *S points to an instance of the Q31 IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] *S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t *pkCoeffs, + q31_t *pvCoeffs, + q31_t *pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] *S points to an instance of the Q15 IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + * @return none. + */ + + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t *pkCoeffs, + q15_t *pvCoeffs, + q15_t *pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to the coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to the coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + + } arm_lms_instance_q31; + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] *S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + /** + * @brief Correlation of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + /** + * @brief Correlation of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Correlation of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Correlation of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] *S points to an instance of the floating-point sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] *S points to an instance of the Q31 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] *S points to an instance of the Q15 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] *pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] *S points to an instance of the Q7 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] *pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /* + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] *pSinVal points to the processed sine output. + * @param[out] *pCosVal points to the processed cos output. + * @return none. + */ + + void arm_sin_cos_f32( + float32_t theta, + float32_t *pSinVal, + float32_t *pCcosVal); + + /* + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] *pSinVal points to the processed sine output. + * @param[out] *pCosVal points to the processed cosine output. + * @return none. + */ + + void arm_sin_cos_q31( + q31_t theta, + q31_t *pSinVal, + q31_t *pCosVal); + + + /** + * @brief Floating-point complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
+   *    A0 = Kp + Ki + Kd
+   *    A1 = (-Kp ) - (2 * Kd )
+   *    A2 = Kd  
+ * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup PID + * @{ + */ + + /** + * @brief Process function for the floating-point PID Control. + * @param[in,out] *S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + */ + + + static __INLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q31 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 64-bit accumulator. + * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + * Thus, if the accumulator result overflows it wraps around rather than clip. + * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ + + static __INLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31u); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using a 64-bit internal accumulator. + * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + * Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ + + static __INLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + + /* Implementation of PID controller */ + + #ifdef ARM_MATH_CM0 + + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0 )* in ; + + #else + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD(S->A0, in); + + #endif + + #ifdef ARM_MATH_CM0 + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0] ; + acc += (q31_t) S->A2 * S->state[1] ; + + #else + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = __SMLALD(S->A1, (q31_t)__SIMD32(S->state), acc); + + #endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @} end of PID group + */ + + + /** + * @brief Floating-point matrix inverse. + * @param[in] *src points to the instance of the input floating-point matrix structure. + * @param[out] *dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + + /** + * @ingroup groupController + */ + + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup clarke + * @{ + */ + + /** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @return none. + */ + + static __INLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); + + } + + /** + * @brief Clarke transform for Q31 version + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + + static __INLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + /** + * @} end of clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_clarke + * @{ + */ + + /** + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] *pIa points to output three-phase coordinate a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + */ + + + static __INLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; + + } + + /** + * @brief Inverse Clarke transform for Q31 version + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] *pIa points to output three-phase coordinate a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the subtraction, hence there is no risk of overflow. + */ + + static __INLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + + } + + /** + * @} end of inv_clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_q7_to_q15( + q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup park + * @{ + */ + + /** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] *pId points to output rotor reference frame d + * @param[out] *pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * The function implements the forward Park transform. + * + */ + + static __INLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + + } + + /** + * @brief Park transform for Q31 version + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] *pId points to output rotor reference frame d + * @param[out] *pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ + + + static __INLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + /** + * @} end of park group + */ + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q7_to_float( + q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_park + * @{ + */ + + /** + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + */ + + static __INLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + + } + + + /** + * @brief Inverse Park transform for Q31 version + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + + + static __INLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + + } + + /** + * @} end of Inverse park group + */ + + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_float( + q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
+   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
+   *       where x0, x1 are nearest values of input x
+   *             y0, y1 are nearest values to output y
+   * 
+ * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + + static __INLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x) + { + + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (x - S->x1) / xSpacing; + + if(i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if(i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues-1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i +1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)); + + } + + /* returns output value */ + return (y); + } + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] *pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + + + static __INLINE q31_t arm_linear_interp_q31(q31_t *pYData, + q31_t x, uint32_t nValues) + { + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20); + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t) (((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1u); + + } + + } + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] *pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + + + static __INLINE q15_t arm_linear_interp_q15(q15_t *pYData, q31_t x, uint32_t nValues) + { + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20u); + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (y >> 20); + } + + + } + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] *pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ + + + static __INLINE q7_t arm_linear_interp_q7(q7_t *pYData, q31_t x, uint32_t nValues) + { + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20u); + + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (y >> 20u); + + } + + } + /** + * @} end of LinearInterpolate group + */ + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + + float32_t arm_sin_f32( + float32_t x); + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + + q31_t arm_sin_q31( + q31_t x); + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + + q15_t arm_sin_q15( + q15_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + + float32_t arm_cos_f32( + float32_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + + q31_t arm_cos_q31( + q31_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + + q15_t arm_cos_q15( + q15_t x); + + + /** + * @ingroup groupFastMath + */ + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @addtogroup SQRT + * @{ + */ + + /** + * @brief Floating-point square root function. + * @param[in] in input value. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + + static __INLINE arm_status arm_sqrt_f32( + float32_t in, float32_t *pOut) + { + if(in > 0) + { + +// #if __FPU_USED + #if (__FPU_USED == 1) && defined ( __CC_ARM ) + *pOut = __sqrtf(in); + #else + *pOut = sqrtf(in); + #endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + + } + + + /** + * @brief Q31 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q31( + q31_t in, q31_t *pOut); + + /** + * @brief Q15 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q15( + q15_t in, q15_t *pOut); + + /** + * @} end of SQRT group + */ + + + + + + + /** + * @brief floating-point Circular write function. + */ + + static __INLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + static __INLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (int32_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + /** + * @brief Q15 Circular write function. + */ + + static __INLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief Q15 Circular Read function. + */ + static __INLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (q15_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + + static __INLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief Q7 Circular Read function. + */ + static __INLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (q7_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Mean value of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + /** + * @brief Mean value of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Mean value of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Mean value of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Floating-point complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + /** + * @brief Q31 complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + /** + * @brief Floating-point complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_q31( + q31_t * pSrcCmplx, + q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_t * index); + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[in] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[out] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + void arm_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[out] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + * @return none. + */ + void arm_float_to_q31( + float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + * @return none + */ + void arm_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + * @return none + */ + void arm_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_q15( + q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_float( + q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_q7( + q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
+   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
+   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
+   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
+   * 
+ * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + /** + * + * @brief Floating-point bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + + + static __INLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y) + { + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(xIndex < 0 || xIndex > (S->numRows-1) || yIndex < 0 || yIndex > ( S->numCols-1)) + { + return(0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex-1) * S->numCols ; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex-1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + + } + + /** + * + * @brief Q31 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y) + { + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20u); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20u); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return (acc << 2u); + + } + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return (acc >> 36); + + } + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return (acc >> 40); + + } + + /** + * @} end of BilinearInterpolate group + */ + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_MATH_H */ + + +/** + * + * End of file. + */ diff --git a/frameworks/CMSIS/LPC1768/include/core_cm3.h b/frameworks/CMSIS/LPC1768/include/core_cm3.h new file mode 100644 index 0000000000..76bf26f6e3 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cm3.h @@ -0,0 +1,1227 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + + +/** \ingroup CMSIS_Core + \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions + CMSIS violates following MISRA-C2004 Rules: + + - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_core_definitions CMSIS Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core + - Cortex-M core Revision Number + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + +/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + /* add preprocessor checks */ +#endif + +#include /*!< standard types definitions */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ +#include "core_cmFunc.h" /*!< Core Function Access */ + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200 + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +#ifdef __cplusplus + #define __I volatile /*!< defines 'read only' permissions */ +#else + #define __I volatile const /*!< defines 'read only' permissions */ +#endif +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + +/*@} end of group CMSIS_core_definitions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_core_register CMSIS Core Register + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE CMSIS Core + Type definitions for the Cortex-M Core Registers + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC CMSIS NVIC + Type definitions for the Cortex-M NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB CMSIS SCB + Type definitions for the Cortex-M System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB CMSIS System Control and ID Register not in the SCB + Type definitions for the Cortex-M System Control and ID Register not in the SCB + @{ + */ + +/** \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick CMSIS SysTick + Type definitions for the Cortex-M System Timer Registers + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM CMSIS ITM + Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_TXENA_Pos 3 /*!< ITM TCR: TXENA Position */ +#define ITM_TCR_TXENA_Msk (1UL << ITM_TCR_TXENA_Pos) /*!< ITM TCR: TXENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU CMSIS MPU + Type definitions for the Cortex-M Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug CMSIS Core Debug + Type definitions for the Cortex-M Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + @{ + */ + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions + @{ + */ + +/** \brief Set Priority Grouping + + This function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field + */ +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + This function gets the priority grouping from NVIC Interrupt Controller. + Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. + + \return Priority grouping field + */ +static __INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + This function enables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to enable + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + This function disables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to disable + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + This function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Number of the interrupt for get pending + \return 0 Interrupt status is not pending + \return 1 Interrupt status is pending + */ +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + This function sets the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for set pending + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + This function clears the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for clear pending + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + This function reads the active register in NVIC and returns the active bit. + \param [in] IRQn Number of the interrupt for get active + \return 0 Interrupt status is not active + \return 1 Interrupt status is active + */ +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + This function sets the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + Note: The priority cannot be set for every core interrupt. + + \param [in] IRQn Number of the interrupt for set priority + \param [in] priority Priority to set + */ +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + This function reads the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + The returned priority value is automatically aligned to the implemented + priority bits of the microcontroller. + + \param [in] IRQn Number of the interrupt for get priority + \return Interrupt Priority + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + This function encodes the priority for an interrupt with the given priority group, + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The returned priority value can be used for NVIC_SetPriority(...) function + + \param [in] PriorityGroup Used priority group + \param [in] PreemptPriority Preemptive priority value (starting from 0) + \param [in] SubPriority Sub priority value (starting from 0) + \return Encoded priority for the interrupt + */ +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + This function decodes an interrupt priority value with the given priority group to + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The priority value can be retrieved with NVIC_GetPriority(...) function + + \param [in] Priority Priority value + \param [in] PriorityGroup Used priority group + \param [out] pPreemptPriority Preemptive priority value (starting from 0) + \param [out] pSubPriority Sub priority value (starting from 0) + */ +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + This function initiate a system reset request to reset the MCU. + */ +static __INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + This function initialises the system tick timer and its interrupt and start the system tick timer. + Counter is in free running mode to generate periodical interrupts. + + \param [in] ticks Number of ticks between two interrupts + \return 0 Function succeeded + \return 1 Function failed + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ + + +/** \brief ITM Send Character + + This function transmits a character via the ITM channel 0. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \param [in] ch Character to transmit + \return Character to transmit + */ +static __INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ + (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + This function inputs a character via external variable ITM_RxBuffer. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \return Received character + \return -1 No character received + */ +static __INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + This function checks external variable ITM_RxBuffer whether a character is available or not. + It returns '1' if a character is available and '0' if no character is available. + + \return 0 No character available + \return 1 Character available + */ +static __INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/frameworks/CMSIS/LPC1768/include/core_cmFunc.h b/frameworks/CMSIS/LPC1768/include/core_cmFunc.h new file mode 100644 index 0000000000..e29757aef7 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cmFunc.h @@ -0,0 +1,609 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V2.10 + * @date 26. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +static __INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +static __INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +static __INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +static __INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +static __INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +static __INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +static __INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +static __INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +static __INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git a/frameworks/CMSIS/LPC1768/include/core_cmInstr.h b/frameworks/CMSIS/LPC1768/include/core_cmInstr.h new file mode 100644 index 0000000000..8ccd4fef1f --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cmInstr.h @@ -0,0 +1,586 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \ingroup CMSIS_Core + \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +static __INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +static __INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) static __INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) static __INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void) +{ + __ASM volatile ("clrex"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value) +{ + uint8_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h b/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h new file mode 100644 index 0000000000..dc3dfdace4 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h @@ -0,0 +1,80 @@ +/********************************************************************** +* $Id$ debug_frmwrk.h 2010-05-21 +*//** +* @file debug_frmwrk.h +* @brief Contains some utilities that used for debugging through UART +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ +#ifndef DEBUG_FRMWRK_H_ +#define DEBUG_FRMWRK_H_ + +//#include +#include "lpc17xx_uart.h" + +#define USED_UART_DEBUG_PORT 0 + +#if (USED_UART_DEBUG_PORT==0) +#define DEBUG_UART_PORT LPC_UART0 +#elif (USED_UART_DEBUG_PORT==1) +#define DEBUG_UART_PORT LPC_UART1 +#endif + +#define _DBG(x) _db_msg(DEBUG_UART_PORT, x) +#define _DBG_(x) _db_msg_(DEBUG_UART_PORT, x) +#define _DBC(x) _db_char(DEBUG_UART_PORT, x) +#define _DBD(x) _db_dec(DEBUG_UART_PORT, x) +#define _DBD16(x) _db_dec_16(DEBUG_UART_PORT, x) +#define _DBD32(x) _db_dec_32(DEBUG_UART_PORT, x) +#define _DBH(x) _db_hex(DEBUG_UART_PORT, x) +#define _DBH16(x) _db_hex_16(DEBUG_UART_PORT, x) +#define _DBH32(x) _db_hex_32(DEBUG_UART_PORT, x) +#define _DG _db_get_char(DEBUG_UART_PORT) +//void _printf (const char *format, ...); + +extern void (*_db_msg)(LPC_UART_TypeDef *UARTx, const void *s); +extern void (*_db_msg_)(LPC_UART_TypeDef *UARTx, const void *s); +extern void (*_db_char)(LPC_UART_TypeDef *UARTx, uint8_t ch); +extern void (*_db_dec)(LPC_UART_TypeDef *UARTx, uint8_t decn); +extern void (*_db_dec_16)(LPC_UART_TypeDef *UARTx, uint16_t decn); +extern void (*_db_dec_32)(LPC_UART_TypeDef *UARTx, uint32_t decn); +extern void (*_db_hex)(LPC_UART_TypeDef *UARTx, uint8_t hexn); +extern void (*_db_hex_16)(LPC_UART_TypeDef *UARTx, uint16_t hexn); +extern void (*_db_hex_32)(LPC_UART_TypeDef *UARTx, uint32_t hexn); +extern uint8_t (*_db_get_char)(LPC_UART_TypeDef *UARTx); + +void UARTPutChar (LPC_UART_TypeDef *UARTx, uint8_t ch); +void UARTPuts(LPC_UART_TypeDef *UARTx, const void *str); +void UARTPuts_(LPC_UART_TypeDef *UARTx, const void *str); +void UARTPutDec(LPC_UART_TypeDef *UARTx, uint8_t decnum); +void UARTPutDec16(LPC_UART_TypeDef *UARTx, uint16_t decnum); +void UARTPutDec32(LPC_UART_TypeDef *UARTx, uint32_t decnum); +void UARTPutHex (LPC_UART_TypeDef *UARTx, uint8_t hexnum); +void UARTPutHex16 (LPC_UART_TypeDef *UARTx, uint16_t hexnum); +void UARTPutHex32 (LPC_UART_TypeDef *UARTx, uint32_t hexnum); +uint8_t UARTGetChar (LPC_UART_TypeDef *UARTx); +void debug_frmwrk_init(void); + +#endif /* DEBUG_FRMWRK_H_ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h new file mode 100644 index 0000000000..777bbd503e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h @@ -0,0 +1,302 @@ +/********************************************************************** +* $Id$ lpc17xx_adc.h 2008-07-27 +*//** +* @file lpc17xx_adc.h +* @brief Contains the NXP ABL typedefs for C standard types. +* It is intended to be used in ISO C conforming development +* environments and checks for this insofar as it is possible +* to do so. +* @version 2.0 +* @date 27 Jul. 2008 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2008, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup ADC ADC (Analog-to-Digital Converter) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_ADC_H_ +#define LPC17XX_ADC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Private macros ------------------------------------------------------------- */ +/** @defgroup ADC_Private_Macros ADC Private Macros + * @{ + */ + +/* -------------------------- BIT DEFINITIONS ----------------------------------- */ +/*********************************************************************//** + * Macro defines for ADC control register + **********************************************************************/ +/** Selects which of the AD0.0:7 pins is (are) to be sampled and converted */ +#define ADC_CR_CH_SEL(n) ((1UL << n)) +/** The APB clock (PCLK) is divided by (this value plus one) +* to produce the clock for the A/D */ +#define ADC_CR_CLKDIV(n) ((n<<8)) +/** Repeated conversions A/D enable bit */ +#define ADC_CR_BURST ((1UL<<16)) +/** ADC convert in power down mode */ +#define ADC_CR_PDN ((1UL<<21)) +/** Start mask bits */ +#define ADC_CR_START_MASK ((7UL<<24)) +/** Select Start Mode */ +#define ADC_CR_START_MODE_SEL(SEL) ((SEL<<24)) +/** Start conversion now */ +#define ADC_CR_START_NOW ((1UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on P2.10/EINT0 */ +#define ADC_CR_START_EINT0 ((2UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on P1.27/CAP0.1 */ +#define ADC_CR_START_CAP01 ((3UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT0.1 */ +#define ADC_CR_START_MAT01 ((4UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT0.3 */ +#define ADC_CR_START_MAT03 ((5UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT1.0 */ +#define ADC_CR_START_MAT10 ((6UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT1.1 */ +#define ADC_CR_START_MAT11 ((7UL<<24)) +/** Start conversion on a falling edge on the selected CAP/MAT signal */ +#define ADC_CR_EDGE ((1UL<<27)) + +/*********************************************************************//** + * Macro defines for ADC Global Data register + **********************************************************************/ +/** When DONE is 1, this field contains result value of ADC conversion */ +#define ADC_GDR_RESULT(n) (((n>>4)&0xFFF)) +/** These bits contain the channel from which the LS bits were converted */ +#define ADC_GDR_CH(n) (((n>>24)&0x7)) +/** This bit is 1 in burst mode if the results of one or + * more conversions was (were) lost */ +#define ADC_GDR_OVERRUN_FLAG ((1UL<<30)) +/** This bit is set to 1 when an A/D conversion completes */ +#define ADC_GDR_DONE_FLAG ((1UL<<31)) + +/** This bits is used to mask for Channel */ +#define ADC_GDR_CH_MASK ((7UL<<24)) +/*********************************************************************//** + * Macro defines for ADC Interrupt register + **********************************************************************/ +/** These bits allow control over which A/D channels generate + * interrupts for conversion completion */ +#define ADC_INTEN_CH(n) ((1UL<>4)&0xFFF)) +/** These bits mirror the OVERRRUN status flags that appear in the + * result register for each A/D channel */ +#define ADC_DR_OVERRUN_FLAG ((1UL<<30)) +/** This bit is set to 1 when an A/D conversion completes. It is cleared + * when this register is read */ +#define ADC_DR_DONE_FLAG ((1UL<<31)) + +/*********************************************************************//** + * Macro defines for ADC Status register +**********************************************************************/ +/** These bits mirror the DONE status flags that appear in the result + * register for each A/D channel */ +#define ADC_STAT_CH_DONE_FLAG(n) ((n&0xFF)) +/** These bits mirror the OVERRRUN status flags that appear in the + * result register for each A/D channel */ +#define ADC_STAT_CH_OVERRUN_FLAG(n) (((n>>8)&0xFF)) +/** This bit is the A/D interrupt flag */ +#define ADC_STAT_INT_FLAG ((1UL<<16)) + +/*********************************************************************//** + * Macro defines for ADC Trim register +**********************************************************************/ +/** Offset trim bits for ADC operation */ +#define ADC_ADCOFFS(n) (((n&0xF)<<4)) +/** Written to boot code*/ +#define ADC_TRIM(n) (((n&0xF)<<8)) + +/* ------------------- CHECK PARAM DEFINITIONS ------------------------- */ +/** Check ADC parameter */ +#define PARAM_ADCx(n) (((uint32_t *)n)==((uint32_t *)LPC_ADC)) + +/** Check ADC state parameter */ +#define PARAM_ADC_START_ON_EDGE_OPT(OPT) ((OPT == ADC_START_ON_RISING)||(OPT == ADC_START_ON_FALLING)) + +/** Check ADC state parameter */ +#define PARAM_ADC_DATA_STATUS(OPT) ((OPT== ADC_DATA_BURST)||(OPT== ADC_DATA_DONE)) + +/** Check ADC rate parameter */ +#define PARAM_ADC_RATE(rate) ((rate>0)&&(rate<=200000)) + +/** Check ADC channel selection parameter */ +#define PARAM_ADC_CHANNEL_SELECTION(SEL) ((SEL == ADC_CHANNEL_0)||(ADC_CHANNEL_1)\ +||(SEL == ADC_CHANNEL_2)|(ADC_CHANNEL_3)\ +||(SEL == ADC_CHANNEL_4)||(ADC_CHANNEL_5)\ +||(SEL == ADC_CHANNEL_6)||(ADC_CHANNEL_7)) + +/** Check ADC start option parameter */ +#define PARAM_ADC_START_OPT(OPT) ((OPT == ADC_START_CONTINUOUS)||(OPT == ADC_START_NOW)\ +||(OPT == ADC_START_ON_EINT0)||(OPT == ADC_START_ON_CAP01)\ +||(OPT == ADC_START_ON_MAT01)||(OPT == ADC_START_ON_MAT03)\ +||(OPT == ADC_START_ON_MAT10)||(OPT == ADC_START_ON_MAT11)) + +/** Check ADC interrupt type parameter */ +#define PARAM_ADC_TYPE_INT_OPT(OPT) ((OPT == ADC_ADINTEN0)||(OPT == ADC_ADINTEN1)\ +||(OPT == ADC_ADINTEN2)||(OPT == ADC_ADINTEN3)\ +||(OPT == ADC_ADINTEN4)||(OPT == ADC_ADINTEN5)\ +||(OPT == ADC_ADINTEN6)||(OPT == ADC_ADINTEN7)\ +||(OPT == ADC_ADGINTEN)) + +/** + * @} + */ + + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup ADC_Public_Types ADC Public Types + * @{ + */ + +/*********************************************************************//** + * @brief ADC enumeration + **********************************************************************/ +/** @brief Channel Selection */ +typedef enum +{ + ADC_CHANNEL_0 = 0, /*!< Channel 0 */ + ADC_CHANNEL_1, /*!< Channel 1 */ + ADC_CHANNEL_2, /*!< Channel 2 */ + ADC_CHANNEL_3, /*!< Channel 3 */ + ADC_CHANNEL_4, /*!< Channel 4 */ + ADC_CHANNEL_5, /*!< Channel 5 */ + ADC_CHANNEL_6, /*!< Channel 6 */ + ADC_CHANNEL_7 /*!< Channel 7 */ +}ADC_CHANNEL_SELECTION; + +/** @brief Type of start option */ +typedef enum +{ + ADC_START_CONTINUOUS =0, /*!< Continuous mode */ + ADC_START_NOW, /*!< Start conversion now */ + ADC_START_ON_EINT0, /*!< Start conversion when the edge selected + * by bit 27 occurs on P2.10/EINT0 */ + ADC_START_ON_CAP01, /*!< Start conversion when the edge selected + * by bit 27 occurs on P1.27/CAP0.1 */ + ADC_START_ON_MAT01, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT0.1 */ + ADC_START_ON_MAT03, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT0.3 */ + ADC_START_ON_MAT10, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT1.0 */ + ADC_START_ON_MAT11 /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT1.1 */ +} ADC_START_OPT; + + +/** @brief Type of edge when start conversion on the selected CAP/MAT signal */ +typedef enum +{ + ADC_START_ON_RISING = 0, /*!< Start conversion on a rising edge + *on the selected CAP/MAT signal */ + ADC_START_ON_FALLING /*!< Start conversion on a falling edge + *on the selected CAP/MAT signal */ +} ADC_START_ON_EDGE_OPT; + +/** @brief* ADC type interrupt enum */ +typedef enum +{ + ADC_ADINTEN0 = 0, /*!< Interrupt channel 0 */ + ADC_ADINTEN1, /*!< Interrupt channel 1 */ + ADC_ADINTEN2, /*!< Interrupt channel 2 */ + ADC_ADINTEN3, /*!< Interrupt channel 3 */ + ADC_ADINTEN4, /*!< Interrupt channel 4 */ + ADC_ADINTEN5, /*!< Interrupt channel 5 */ + ADC_ADINTEN6, /*!< Interrupt channel 6 */ + ADC_ADINTEN7, /*!< Interrupt channel 7 */ + ADC_ADGINTEN /*!< Individual channel/global flag done generate an interrupt */ +}ADC_TYPE_INT_OPT; + +/** @brief ADC Data status */ +typedef enum +{ + ADC_DATA_BURST = 0, /*Burst bit*/ + ADC_DATA_DONE /*Done bit*/ +}ADC_DATA_STATUS; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup ADC_Public_Functions ADC Public Functions + * @{ + */ +/* Init/DeInit ADC peripheral ----------------*/ +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate); +void ADC_DeInit(LPC_ADC_TypeDef *ADCx); + +/* Enable/Disable ADC functions --------------*/ +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode); +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState); + +/* Configure ADC functions -------------------*/ +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption); +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState); + +/* Get ADC information functions -------------------*/ +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel); +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType); +uint32_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx); +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + +#endif /* LPC17XX_ADC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h new file mode 100644 index 0000000000..7739e05008 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h @@ -0,0 +1,872 @@ +/********************************************************************** +* $Id$ lpc17xx_can.h 2010-06-18 +*//** +* @file lpc17xx_can.h +* @brief Contains all macro definitions and function prototypes +* support for CAN firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup CAN CAN (Control Area Network) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_CAN_H_ +#define LPC17XX_CAN_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup CAN_Public_Macros CAN Public Macros + * @{ + */ +#define MSG_ENABLE ((uint8_t)(0)) +#define MSG_DISABLE ((uint8_t)(1)) +#define CAN1_CTRL ((uint8_t)(0)) +#define CAN2_CTRL ((uint8_t)(1)) +#define PARAM_FULLCAN_IC(n) ((n==FULLCAN_IC0)||(n==FULLCAN_IC1)) +#define ID_11 1 +#define MAX_HW_FULLCAN_OBJ 64 +#define MAX_SW_FULLCAN_OBJ 32 + +/** + * @} + */ + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup CAN_Private_Macros CAN Private Macros + * @{ + */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for CAN Mode Register + **********************************************************************/ +/** CAN Reset mode */ +#define CAN_MOD_RM ((uint32_t)(1)) +/** CAN Listen Only Mode */ +#define CAN_MOD_LOM ((uint32_t)(1<<1)) +/** CAN Self Test mode */ +#define CAN_MOD_STM ((uint32_t)(1<<2)) +/** CAN Transmit Priority mode */ +#define CAN_MOD_TPM ((uint32_t)(1<<3)) +/** CAN Sleep mode */ +#define CAN_MOD_SM ((uint32_t)(1<<4)) +/** CAN Receive Polarity mode */ +#define CAN_MOD_RPM ((uint32_t)(1<<5)) +/** CAN Test mode */ +#define CAN_MOD_TM ((uint32_t)(1<<7)) + +/*********************************************************************//** + * Macro defines for CAN Command Register + **********************************************************************/ +/** CAN Transmission Request */ +#define CAN_CMR_TR ((uint32_t)(1)) +/** CAN Abort Transmission */ +#define CAN_CMR_AT ((uint32_t)(1<<1)) +/** CAN Release Receive Buffer */ +#define CAN_CMR_RRB ((uint32_t)(1<<2)) +/** CAN Clear Data Overrun */ +#define CAN_CMR_CDO ((uint32_t)(1<<3)) +/** CAN Self Reception Request */ +#define CAN_CMR_SRR ((uint32_t)(1<<4)) +/** CAN Select Tx Buffer 1 */ +#define CAN_CMR_STB1 ((uint32_t)(1<<5)) +/** CAN Select Tx Buffer 2 */ +#define CAN_CMR_STB2 ((uint32_t)(1<<6)) +/** CAN Select Tx Buffer 3 */ +#define CAN_CMR_STB3 ((uint32_t)(1<<7)) + +/*********************************************************************//** + * Macro defines for CAN Global Status Register + **********************************************************************/ +/** CAN Receive Buffer Status */ +#define CAN_GSR_RBS ((uint32_t)(1)) +/** CAN Data Overrun Status */ +#define CAN_GSR_DOS ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status */ +#define CAN_GSR_TBS ((uint32_t)(1<<2)) +/** CAN Transmit Complete Status */ +#define CAN_GSR_TCS ((uint32_t)(1<<3)) +/** CAN Receive Status */ +#define CAN_GSR_RS ((uint32_t)(1<<4)) +/** CAN Transmit Status */ +#define CAN_GSR_TS ((uint32_t)(1<<5)) +/** CAN Error Status */ +#define CAN_GSR_ES ((uint32_t)(1<<6)) +/** CAN Bus Status */ +#define CAN_GSR_BS ((uint32_t)(1<<7)) +/** CAN Current value of the Rx Error Counter */ +#define CAN_GSR_RXERR(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Current value of the Tx Error Counter */ +#define CAN_GSR_TXERR(n) ((uint32_t)(n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Interrupt and Capture Register + **********************************************************************/ +/** CAN Receive Interrupt */ +#define CAN_ICR_RI ((uint32_t)(1)) +/** CAN Transmit Interrupt 1 */ +#define CAN_ICR_TI1 ((uint32_t)(1<<1)) +/** CAN Error Warning Interrupt */ +#define CAN_ICR_EI ((uint32_t)(1<<2)) +/** CAN Data Overrun Interrupt */ +#define CAN_ICR_DOI ((uint32_t)(1<<3)) +/** CAN Wake-Up Interrupt */ +#define CAN_ICR_WUI ((uint32_t)(1<<4)) +/** CAN Error Passive Interrupt */ +#define CAN_ICR_EPI ((uint32_t)(1<<5)) +/** CAN Arbitration Lost Interrupt */ +#define CAN_ICR_ALI ((uint32_t)(1<<6)) +/** CAN Bus Error Interrupt */ +#define CAN_ICR_BEI ((uint32_t)(1<<7)) +/** CAN ID Ready Interrupt */ +#define CAN_ICR_IDI ((uint32_t)(1<<8)) +/** CAN Transmit Interrupt 2 */ +#define CAN_ICR_TI2 ((uint32_t)(1<<9)) +/** CAN Transmit Interrupt 3 */ +#define CAN_ICR_TI3 ((uint32_t)(1<<10)) +/** CAN Error Code Capture */ +#define CAN_ICR_ERRBIT(n) ((uint32_t)((n&0x1F)<<16)) +/** CAN Error Direction */ +#define CAN_ICR_ERRDIR ((uint32_t)(1<<21)) +/** CAN Error Capture */ +#define CAN_ICR_ERRC(n) ((uint32_t)((n&0x3)<<22)) +/** CAN Arbitration Lost Capture */ +#define CAN_ICR_ALCBIT(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Interrupt Enable Register + **********************************************************************/ +/** CAN Receive Interrupt Enable */ +#define CAN_IER_RIE ((uint32_t)(1)) +/** CAN Transmit Interrupt Enable for buffer 1 */ +#define CAN_IER_TIE1 ((uint32_t)(1<<1)) +/** CAN Error Warning Interrupt Enable */ +#define CAN_IER_EIE ((uint32_t)(1<<2)) +/** CAN Data Overrun Interrupt Enable */ +#define CAN_IER_DOIE ((uint32_t)(1<<3)) +/** CAN Wake-Up Interrupt Enable */ +#define CAN_IER_WUIE ((uint32_t)(1<<4)) +/** CAN Error Passive Interrupt Enable */ +#define CAN_IER_EPIE ((uint32_t)(1<<5)) +/** CAN Arbitration Lost Interrupt Enable */ +#define CAN_IER_ALIE ((uint32_t)(1<<6)) +/** CAN Bus Error Interrupt Enable */ +#define CAN_IER_BEIE ((uint32_t)(1<<7)) +/** CAN ID Ready Interrupt Enable */ +#define CAN_IER_IDIE ((uint32_t)(1<<8)) +/** CAN Transmit Enable Interrupt for Buffer 2 */ +#define CAN_IER_TIE2 ((uint32_t)(1<<9)) +/** CAN Transmit Enable Interrupt for Buffer 3 */ +#define CAN_IER_TIE3 ((uint32_t)(1<<10)) + +/*********************************************************************//** + * Macro defines for CAN Bus Timing Register + **********************************************************************/ +/** CAN Baudrate Prescaler */ +#define CAN_BTR_BRP(n) ((uint32_t)(n&0x3FF)) +/** CAN Synchronization Jump Width */ +#define CAN_BTR_SJM(n) ((uint32_t)((n&0x3)<<14)) +/** CAN Time Segment 1 */ +#define CAN_BTR_TESG1(n) ((uint32_t)(n&0xF)<<16)) +/** CAN Time Segment 2 */ +#define CAN_BTR_TESG2(n) ((uint32_t)(n&0xF)<<20)) +/** CAN Sampling */ +#define CAN_BTR_SAM(n) ((uint32_t)(1<<23)) + +/*********************************************************************//** + * Macro defines for CAN Error Warning Limit Register + **********************************************************************/ +/** CAN Error Warning Limit */ +#define CAN_EWL_EWL(n) ((uint32_t)(n&0xFF)) + +/*********************************************************************//** + * Macro defines for CAN Status Register + **********************************************************************/ +/** CAN Receive Buffer Status */ +#define CAN_SR_RBS ((uint32_t)(1)) +/** CAN Data Overrun Status */ +#define CAN_SR_DOS ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status 1 */ +#define CAN_SR_TBS1 ((uint32_t)(1<<2)) +/** CAN Transmission Complete Status of Buffer 1 */ +#define CAN_SR_TCS1 ((uint32_t)(1<<3)) +/** CAN Receive Status */ +#define CAN_SR_RS ((uint32_t)(1<<4)) +/** CAN Transmit Status 1 */ +#define CAN_SR_TS1 ((uint32_t)(1<<5)) +/** CAN Error Status */ +#define CAN_SR_ES ((uint32_t)(1<<6)) +/** CAN Bus Status */ +#define CAN_SR_BS ((uint32_t)(1<<7)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_SR_TBS2 ((uint32_t)(1<<10)) +/** CAN Transmission Complete Status of Buffer 2 */ +#define CAN_SR_TCS2 ((uint32_t)(1<<11)) +/** CAN Transmit Status 2 */ +#define CAN_SR_TS2 ((uint32_t)(1<<13)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_SR_TBS3 ((uint32_t)(1<<18)) +/** CAN Transmission Complete Status of Buffer 2 */ +#define CAN_SR_TCS3 ((uint32_t)(1<<19)) +/** CAN Transmit Status 2 */ +#define CAN_SR_TS3 ((uint32_t)(1<<21)) + +/*********************************************************************//** + * Macro defines for CAN Receive Frame Status Register + **********************************************************************/ +/** CAN ID Index */ +#define CAN_RFS_ID_INDEX(n) ((uint32_t)(n&0x3FF)) +/** CAN Bypass */ +#define CAN_RFS_BP ((uint32_t)(1<<10)) +/** CAN Data Length Code */ +#define CAN_RFS_DLC(n) ((uint32_t)((n&0xF)<<16) +/** CAN Remote Transmission Request */ +#define CAN_RFS_RTR ((uint32_t)(1<<30)) +/** CAN control 11 bit or 29 bit Identifier */ +#define CAN_RFS_FF ((uint32_t)(1<<31)) + +/*********************************************************************//** + * Macro defines for CAN Receive Identifier Register + **********************************************************************/ +/** CAN 11 bit Identifier */ +#define CAN_RID_ID_11(n) ((uint32_t)(n&0x7FF)) +/** CAN 29 bit Identifier */ +#define CAN_RID_ID_29(n) ((uint32_t)(n&0x1FFFFFFF)) + +/*********************************************************************//** + * Macro defines for CAN Receive Data A Register + **********************************************************************/ +/** CAN Receive Data 1 */ +#define CAN_RDA_DATA1(n) ((uint32_t)(n&0xFF)) +/** CAN Receive Data 2 */ +#define CAN_RDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Receive Data 3 */ +#define CAN_RDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Receive Data 4 */ +#define CAN_RDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Receive Data B Register + **********************************************************************/ +/** CAN Receive Data 5 */ +#define CAN_RDB_DATA5(n) ((uint32_t)(n&0xFF)) +/** CAN Receive Data 6 */ +#define CAN_RDB_DATA6(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Receive Data 7 */ +#define CAN_RDB_DATA7(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Receive Data 8 */ +#define CAN_RDB_DATA8(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Frame Information Register + **********************************************************************/ +/** CAN Priority */ +#define CAN_TFI_PRIO(n) ((uint32_t)(n&0xFF)) +/** CAN Data Length Code */ +#define CAN_TFI_DLC(n) ((uint32_t)((n&0xF)<<16)) +/** CAN Remote Frame Transmission */ +#define CAN_TFI_RTR ((uint32_t)(1<<30)) +/** CAN control 11-bit or 29-bit Identifier */ +#define CAN_TFI_FF ((uint32_t)(1<<31)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Identifier Register + **********************************************************************/ +/** CAN 11-bit Identifier */ +#define CAN_TID_ID11(n) ((uint32_t)(n&0x7FF)) +/** CAN 11-bit Identifier */ +#define CAN_TID_ID29(n) ((uint32_t)(n&0x1FFFFFFF)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Data A Register + **********************************************************************/ +/** CAN Transmit Data 1 */ +#define CAN_TDA_DATA1(n) ((uint32_t)(n&0xFF)) +/** CAN Transmit Data 2 */ +#define CAN_TDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Transmit Data 3 */ +#define CAN_TDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Transmit Data 4 */ +#define CAN_TDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Data B Register + **********************************************************************/ +/** CAN Transmit Data 5 */ +#define CAN_TDA_DATA5(n) ((uint32_t)(n&0xFF)) +/** CAN Transmit Data 6 */ +#define CAN_TDA_DATA6(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Transmit Data 7 */ +#define CAN_TDA_DATA7(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Transmit Data 8 */ +#define CAN_TDA_DATA8(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Sleep Clear Register + **********************************************************************/ +/** CAN1 Sleep mode */ +#define CAN1SLEEPCLR ((uint32_t)(1<<1)) +/** CAN2 Sleep Mode */ +#define CAN2SLEEPCLR ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for CAN Wake up Flags Register + **********************************************************************/ +/** CAN1 Sleep mode */ +#define CAN_WAKEFLAGES_CAN1WAKE ((uint32_t)(1<<1)) +/** CAN2 Sleep Mode */ +#define CAN_WAKEFLAGES_CAN2WAKE ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for Central transmit Status Register + **********************************************************************/ +/** CAN Transmit 1 */ +#define CAN_TSR_TS1 ((uint32_t)(1)) +/** CAN Transmit 2 */ +#define CAN_TSR_TS2 ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status 1 */ +#define CAN_TSR_TBS1 ((uint32_t)(1<<8)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_TSR_TBS2 ((uint32_t)(1<<9)) +/** CAN Transmission Complete Status 1 */ +#define CAN_TSR_TCS1 ((uint32_t)(1<<16)) +/** CAN Transmission Complete Status 2 */ +#define CAN_TSR_TCS2 ((uint32_t)(1<<17)) + +/*********************************************************************//** + * Macro defines for Central Receive Status Register + **********************************************************************/ +/** CAN Receive Status 1 */ +#define CAN_RSR_RS1 ((uint32_t)(1)) +/** CAN Receive Status 1 */ +#define CAN_RSR_RS2 ((uint32_t)(1<<1)) +/** CAN Receive Buffer Status 1*/ +#define CAN_RSR_RB1 ((uint32_t)(1<<8)) +/** CAN Receive Buffer Status 2*/ +#define CAN_RSR_RB2 ((uint32_t)(1<<9)) +/** CAN Data Overrun Status 1 */ +#define CAN_RSR_DOS1 ((uint32_t)(1<<16)) +/** CAN Data Overrun Status 1 */ +#define CAN_RSR_DOS2 ((uint32_t)(1<<17)) + +/*********************************************************************//** + * Macro defines for Central Miscellaneous Status Register + **********************************************************************/ +/** Same CAN Error Status in CAN1GSR */ +#define CAN_MSR_E1 ((uint32_t)(1)) +/** Same CAN Error Status in CAN2GSR */ +#define CAN_MSR_E2 ((uint32_t)(1<<1)) +/** Same CAN Bus Status in CAN1GSR */ +#define CAN_MSR_BS1 ((uint32_t)(1<<8)) +/** Same CAN Bus Status in CAN2GSR */ +#define CAN_MSR_BS2 ((uint32_t)(1<<9)) + +/*********************************************************************//** + * Macro defines for Acceptance Filter Mode Register + **********************************************************************/ +/** CAN Acceptance Filter Off mode */ +#define CAN_AFMR_AccOff ((uint32_t)(1)) +/** CAN Acceptance File Bypass mode */ +#define CAN_AFMR_AccBP ((uint32_t)(1<<1)) +/** FullCAN Mode Enhancements */ +#define CAN_AFMR_eFCAN ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for Standard Frame Individual Start Address Register + **********************************************************************/ +/** The start address of the table of individual Standard Identifier */ +#define CAN_STT_sa(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for Standard Frame Group Start Address Register + **********************************************************************/ +/** The start address of the table of grouped Standard Identifier */ +#define CAN_SFF_GRP_sa(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for Extended Frame Start Address Register + **********************************************************************/ +/** The start address of the table of individual Extended Identifier */ +#define CAN_EFF_sa(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for Extended Frame Group Start Address Register + **********************************************************************/ +/** The start address of the table of grouped Extended Identifier */ +#define CAN_Eff_GRP_sa(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for End Of AF Table Register + **********************************************************************/ +/** The End of Table of AF LookUp Table */ +#define CAN_EndofTable(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for LUT Error Address Register + **********************************************************************/ +/** CAN Look-Up Table Error Address */ +#define CAN_LUTerrAd(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for LUT Error Register + **********************************************************************/ +/** CAN Look-Up Table Error */ +#define CAN_LUTerr ((uint32_t)(1)) + +/*********************************************************************//** + * Macro defines for Global FullCANInterrupt Enable Register + **********************************************************************/ +/** Global FullCANInterrupt Enable */ +#define CAN_FCANIE ((uint32_t)(1)) + +/*********************************************************************//** + * Macro defines for FullCAN Interrupt and Capture Register 0 + **********************************************************************/ +/** FullCAN Interrupt and Capture (0-31)*/ +#define CAN_FCANIC0_IntPnd(n) ((uint32_t)(1<=0)&&(data <= 0xFFFFFFFF)) + +/** Macro to check frequency value */ +#define PRAM_I2S_FREQ(freq) ((freq>=16000)&&(freq <= 96000)) + +/** Macro to check Frame Identifier */ +#define PARAM_ID_11(n) ((n>>11)==0) /*-- 11 bit --*/ +#define PARAM_ID_29(n) ((n>>29)==0) /*-- 29 bit --*/ + +/** Macro to check DLC value */ +#define PARAM_DLC(n) ((n>>4)==0) /*-- 4 bit --*/ +/** Macro to check ID format type */ +#define PARAM_ID_FORMAT(n) ((n==STD_ID_FORMAT)||(n==EXT_ID_FORMAT)) + +/** Macro to check Group identifier */ +#define PARAM_GRP_ID(x, y) ((x<=y)) + +/** Macro to check Frame type */ +#define PARAM_FRAME_TYPE(n) ((n==DATA_FRAME)||(n==REMOTE_FRAME)) + +/** Macro to check Control/Central Status type parameter */ +#define PARAM_CTRL_STS_TYPE(n) ((n==CANCTRL_GLOBAL_STS)||(n==CANCTRL_INT_CAP) \ +||(n==CANCTRL_ERR_WRN)||(n==CANCTRL_STS)) + +/** Macro to check CR status type */ +#define PARAM_CR_STS_TYPE(n) ((n==CANCR_TX_STS)||(n==CANCR_RX_STS) \ +||(n==CANCR_MS)) +/** Macro to check AF Mode type parameter */ +#define PARAM_AFMODE_TYPE(n) ((n==CAN_Normal)||(n==CAN_AccOff) \ +||(n==CAN_AccBP)||(n==CAN_eFCAN)) + +/** Macro to check Operation Mode */ +#define PARAM_MODE_TYPE(n) ((n==CAN_OPERATING_MODE)||(n==CAN_RESET_MODE) \ +||(n==CAN_LISTENONLY_MODE)||(n==CAN_SELFTEST_MODE) \ +||(n==CAN_TXPRIORITY_MODE)||(n==CAN_SLEEP_MODE) \ +||(n==CAN_RXPOLARITY_MODE)||(n==CAN_TEST_MODE)) + +/** Macro define for struct AF_Section parameter */ +#define PARAM_CTRL(n) ((n==CAN1_CTRL)|(n==CAN2_CTRL)) + +/** Macro define for struct AF_Section parameter */ +#define PARAM_MSG_DISABLE(n) ((n==MSG_ENABLE)|(n==MSG_DISABLE)) + +/**Macro to check Interrupt Type parameter */ +#define PARAM_INT_EN_TYPE(n) ((n==CANINT_RIE)||(n==CANINT_TIE1) \ +||(n==CANINT_EIE)||(n==CANINT_DOIE) \ +||(n==CANINT_WUIE)||(n==CANINT_EPIE) \ +||(n==CANINT_ALIE)||(n==CANINT_BEIE) \ +||(n==CANINT_IDIE)||(n==CANINT_TIE2) \ +||(n==CANINT_TIE3)||(n==CANINT_FCE)) + +/** Macro to check AFLUT Entry type */ +#define PARAM_AFLUT_ENTRY_TYPE(n) ((n==FULLCAN_ENTRY)||(n==EXPLICIT_STANDARD_ENTRY)\ +||(n==GROUP_STANDARD_ENTRY)||(n==EXPLICIT_EXTEND_ENTRY) \ +||(n==GROUP_EXTEND_ENTRY)) + +/** Macro to check position */ +#define PARAM_POSITION(n) (n<512) + +/** + * @} + */ + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup CAN_Public_Types CAN Public Types + * @{ + */ + +/** CAN configuration structure */ +/*********************************************************************** + * CAN device configuration commands (IOCTL commands and arguments) + **********************************************************************/ +/** + * @brief CAN ID format definition + */ +typedef enum { + STD_ID_FORMAT = 0, /**< Use standard ID format (11 bit ID) */ + EXT_ID_FORMAT = 1 /**< Use extended ID format (29 bit ID) */ +} CAN_ID_FORMAT_Type; + +/** + * @brief AFLUT Entry type definition + */ +typedef enum { + FULLCAN_ENTRY = 0, + EXPLICIT_STANDARD_ENTRY, + GROUP_STANDARD_ENTRY, + EXPLICIT_EXTEND_ENTRY, + GROUP_EXTEND_ENTRY +} AFLUT_ENTRY_Type; + +/** + * @brief Symbolic names for type of CAN message + */ +typedef enum { + DATA_FRAME = 0, /**< Data frame */ + REMOTE_FRAME = 1 /**< Remote frame */ +} CAN_FRAME_Type; + +/** + * @brief CAN Control status definition + */ +typedef enum { + CANCTRL_GLOBAL_STS = 0, /**< CAN Global Status */ + CANCTRL_INT_CAP, /**< CAN Interrupt and Capture */ + CANCTRL_ERR_WRN, /**< CAN Error Warning Limit */ + CANCTRL_STS /**< CAN Control Status */ +} CAN_CTRL_STS_Type; + +/** + * @brief Central CAN status type definition + */ +typedef enum { + CANCR_TX_STS = 0, /**< Central CAN Tx Status */ + CANCR_RX_STS, /**< Central CAN Rx Status */ + CANCR_MS /**< Central CAN Miscellaneous Status */ +} CAN_CR_STS_Type; + +/** + * @brief FullCAN Interrupt Capture type definition + */ +typedef enum{ + FULLCAN_IC0, /**< FullCAN Interrupt and Capture 0 */ + FULLCAN_IC1 /**< FullCAN Interrupt and Capture 1 */ +}FullCAN_IC_Type; + +/** + * @brief CAN interrupt enable type definition + */ +typedef enum { + CANINT_RIE = 0, /**< CAN Receiver Interrupt Enable */ + CANINT_TIE1, /**< CAN Transmit Interrupt Enable */ + CANINT_EIE, /**< CAN Error Warning Interrupt Enable */ + CANINT_DOIE, /**< CAN Data Overrun Interrupt Enable */ + CANINT_WUIE, /**< CAN Wake-Up Interrupt Enable */ + CANINT_EPIE, /**< CAN Error Passive Interrupt Enable */ + CANINT_ALIE, /**< CAN Arbitration Lost Interrupt Enable */ + CANINT_BEIE, /**< CAN Bus Error Inter rupt Enable */ + CANINT_IDIE, /**< CAN ID Ready Interrupt Enable */ + CANINT_TIE2, /**< CAN Transmit Interrupt Enable for Buffer2 */ + CANINT_TIE3, /**< CAN Transmit Interrupt Enable for Buffer3 */ + CANINT_FCE /**< FullCAN Interrupt Enable */ +} CAN_INT_EN_Type; + +/** + * @brief Acceptance Filter Mode type definition + */ +typedef enum { + CAN_Normal = 0, /**< Normal Mode */ + CAN_AccOff, /**< Acceptance Filter Off Mode */ + CAN_AccBP, /**< Acceptance Fileter Bypass Mode */ + CAN_eFCAN /**< FullCAN Mode Enhancement */ +} CAN_AFMODE_Type; + +/** + * @brief CAN Mode Type definition + */ +typedef enum { + CAN_OPERATING_MODE = 0, /**< Operating Mode */ + CAN_RESET_MODE, /**< Reset Mode */ + CAN_LISTENONLY_MODE, /**< Listen Only Mode */ + CAN_SELFTEST_MODE, /**< Seft Test Mode */ + CAN_TXPRIORITY_MODE, /**< Transmit Priority Mode */ + CAN_SLEEP_MODE, /**< Sleep Mode */ + CAN_RXPOLARITY_MODE, /**< Receive Polarity Mode */ + CAN_TEST_MODE /**< Test Mode */ +} CAN_MODE_Type; + +/** + * @brief Error values that functions can return + */ +typedef enum { + CAN_OK = 1, /**< No error */ + CAN_OBJECTS_FULL_ERROR, /**< No more rx or tx objects available */ + CAN_FULL_OBJ_NOT_RCV, /**< Full CAN object not received */ + CAN_NO_RECEIVE_DATA, /**< No have receive data available */ + CAN_AF_ENTRY_ERROR, /**< Entry load in AFLUT is unvalid */ + CAN_CONFLICT_ID_ERROR, /**< Conflict ID occur */ + CAN_ENTRY_NOT_EXIT_ERROR /**< Entry remove outo AFLUT is not exit */ +} CAN_ERROR; + +/** + * @brief Pin Configuration structure + */ +typedef struct { + uint8_t RD; /**< Serial Inputs, from CAN transceivers, should be: + ** For CAN1: + - CAN_RD1_P0_0: RD pin is on P0.0 + - CAN_RD1_P0_21 : RD pin is on P0.21 + ** For CAN2: + - CAN_RD2_P0_4: RD pin is on P0.4 + - CAN_RD2_P2_7: RD pin is on P2.7 + */ + uint8_t TD; /**< Serial Outputs, To CAN transceivers, should be: + ** For CAN1: + - CAN_TD1_P0_1: TD pin is on P0.1 + - CAN_TD1_P0_22: TD pin is on P0.22 + ** For CAN2: + - CAN_TD2_P0_5: TD pin is on P0.5 + - CAN_TD2_P2_8: TD pin is on P2.8 + */ +} CAN_PinCFG_Type; + +/** + * @brief CAN message object structure + */ +typedef struct { + uint32_t id; /**< 29 bit identifier, it depend on "format" value + - if format = STD_ID_FORMAT, id should be 11 bit identifier + - if format = EXT_ID_FORMAT, id should be 29 bit identifier + */ + uint8_t dataA[4]; /**< Data field A */ + uint8_t dataB[4]; /**< Data field B */ + uint8_t len; /**< Length of data field in bytes, should be: + - 0000b-0111b: 0-7 bytes + - 1xxxb: 8 bytes + */ + uint8_t format; /**< Identifier Format, should be: + - STD_ID_FORMAT: Standard ID - 11 bit format + - EXT_ID_FORMAT: Extended ID - 29 bit format + */ + uint8_t type; /**< Remote Frame transmission, should be: + - DATA_FRAME: the number of data bytes called out by the DLC + field are send from the CANxTDA and CANxTDB registers + - REMOTE_FRAME: Remote Frame is sent + */ +} CAN_MSG_Type; + +/** + * @brief FullCAN Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable; /**< Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t id_11; /**< Standard ID, should be 11-bit value */ +} FullCAN_Entry; + +/** + * @brief Standard ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable; /**< Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t id_11; /**< Standard ID, should be 11-bit value */ +} SFF_Entry; + +/** + * @brief Group of Standard ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller1; /**< First CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable1; /**< First Disable bit, should be: + - MSG_ENABLE: disable bit = 0) + - MSG_DISABLE: disable bit = 1 + */ + uint16_t lowerID; /**< ID lower bound, should be 11-bit value */ + uint8_t controller2; /**< Second CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable2; /**< Second Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t upperID; /**< ID upper bound, should be 11-bit value and + equal or greater than lowerID + */ +} SFF_GPR_Entry; + +/** + * @brief Extended ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint32_t ID_29; /**< Extend ID, shoud be 29-bit value */ +} EFF_Entry; + + +/** + * @brief Group of Extended ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller1; /**< First CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t controller2; /**< Second Disable bit, should be: + - MSG_ENABLE: disable bit = 0(default) + - MSG_DISABLE: disable bit = 1 + */ + uint32_t lowerEID; /**< Extended ID lower bound, should be 29-bit value */ + uint32_t upperEID; /**< Extended ID upper bound, should be 29-bit value */ +} EFF_GPR_Entry; + + +/** + * @brief Acceptance Filter Section Table structure + */ +typedef struct { + FullCAN_Entry* FullCAN_Sec; /**< The pointer point to FullCAN_Entry */ + uint8_t FC_NumEntry; /**< FullCAN Entry Number */ + SFF_Entry* SFF_Sec; /**< The pointer point to SFF_Entry */ + uint8_t SFF_NumEntry; /**< Standard ID Entry Number */ + SFF_GPR_Entry* SFF_GPR_Sec; /**< The pointer point to SFF_GPR_Entry */ + uint8_t SFF_GPR_NumEntry; /**< Group Standard ID Entry Number */ + EFF_Entry* EFF_Sec; /**< The pointer point to EFF_Entry */ + uint8_t EFF_NumEntry; /**< Extended ID Entry Number */ + EFF_GPR_Entry* EFF_GPR_Sec; /**< The pointer point to EFF_GPR_Entry */ + uint8_t EFF_GPR_NumEntry; /**< Group Extended ID Entry Number */ +} AF_SectionDef; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup CAN_Public_Functions CAN Public Functions + * @{ + */ + +/* Init/DeInit CAN peripheral -----------*/ +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate); +void CAN_DeInit(LPC_CAN_TypeDef *CANx); + +/* CAN messages functions ---------------*/ +Status CAN_SendMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg); +Status CAN_ReceiveMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg); +CAN_ERROR FCAN_ReadObj(LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg); + +/* CAN configure functions ---------------*/ +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, + FunctionalState NewState); +void CAN_SetAFMode(LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFmode); +void CAN_SetCommand(LPC_CAN_TypeDef* CANx, uint32_t CMRType); + +/* AFLUT functions ---------------------- */ +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection); +CAN_ERROR CAN_LoadFullCANEntry(LPC_CAN_TypeDef* CANx, uint16_t ID); +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t ID, + CAN_ID_FORMAT_Type format); +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, + uint32_t upperID, CAN_ID_FORMAT_Type format); +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position); + +/* CAN interrupt functions -----------------*/ +void CAN_IRQCmd(LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState); +uint32_t CAN_IntGetStatus(LPC_CAN_TypeDef* CANx); + +/* CAN get status functions ----------------*/ +IntStatus CAN_FullCANIntGetStatus (LPC_CANAF_TypeDef* CANAFx); +uint32_t CAN_FullCANPendGetStatus (LPC_CANAF_TypeDef* CANAFx, FullCAN_IC_Type type); +uint32_t CAN_GetCTRLStatus(LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg); +uint32_t CAN_GetCRStatus(LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_CAN_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h new file mode 100644 index 0000000000..a33ea60f2d --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h @@ -0,0 +1,406 @@ +/********************************************************************** +* $Id$ lpc17xx_clkpwr.h 2010-05-21 +*//** +* @file lpc17xx_clkpwr.h +* @brief Contains all macro definitions and function prototypes +* support for Clock and Power Control firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup CLKPWR CLKPWR (Clock Power) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_CLKPWR_H_ +#define LPC17XX_CLKPWR_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup CLKPWR_Public_Macros CLKPWR Public Macros + * @{ + */ + +/********************************************************************** + * Peripheral Clock Selection Definitions + **********************************************************************/ +/** Peripheral clock divider bit position for WDT */ +#define CLKPWR_PCLKSEL_WDT ((uint32_t)(0)) +/** Peripheral clock divider bit position for TIMER0 */ +#define CLKPWR_PCLKSEL_TIMER0 ((uint32_t)(2)) +/** Peripheral clock divider bit position for TIMER1 */ +#define CLKPWR_PCLKSEL_TIMER1 ((uint32_t)(4)) +/** Peripheral clock divider bit position for UART0 */ +#define CLKPWR_PCLKSEL_UART0 ((uint32_t)(6)) +/** Peripheral clock divider bit position for UART1 */ +#define CLKPWR_PCLKSEL_UART1 ((uint32_t)(8)) +/** Peripheral clock divider bit position for PWM1 */ +#define CLKPWR_PCLKSEL_PWM1 ((uint32_t)(12)) +/** Peripheral clock divider bit position for I2C0 */ +#define CLKPWR_PCLKSEL_I2C0 ((uint32_t)(14)) +/** Peripheral clock divider bit position for SPI */ +#define CLKPWR_PCLKSEL_SPI ((uint32_t)(16)) +/** Peripheral clock divider bit position for SSP1 */ +#define CLKPWR_PCLKSEL_SSP1 ((uint32_t)(20)) +/** Peripheral clock divider bit position for DAC */ +#define CLKPWR_PCLKSEL_DAC ((uint32_t)(22)) +/** Peripheral clock divider bit position for ADC */ +#define CLKPWR_PCLKSEL_ADC ((uint32_t)(24)) +/** Peripheral clock divider bit position for CAN1 */ +#define CLKPWR_PCLKSEL_CAN1 ((uint32_t)(26)) +/** Peripheral clock divider bit position for CAN2 */ +#define CLKPWR_PCLKSEL_CAN2 ((uint32_t)(28)) +/** Peripheral clock divider bit position for ACF */ +#define CLKPWR_PCLKSEL_ACF ((uint32_t)(30)) +/** Peripheral clock divider bit position for QEI */ +#define CLKPWR_PCLKSEL_QEI ((uint32_t)(32)) +/** Peripheral clock divider bit position for PCB */ +#define CLKPWR_PCLKSEL_PCB ((uint32_t)(36)) +/** Peripheral clock divider bit position for I2C1 */ +#define CLKPWR_PCLKSEL_I2C1 ((uint32_t)(38)) +/** Peripheral clock divider bit position for SSP0 */ +#define CLKPWR_PCLKSEL_SSP0 ((uint32_t)(42)) +/** Peripheral clock divider bit position for TIMER2 */ +#define CLKPWR_PCLKSEL_TIMER2 ((uint32_t)(44)) +/** Peripheral clock divider bit position for TIMER3 */ +#define CLKPWR_PCLKSEL_TIMER3 ((uint32_t)(46)) +/** Peripheral clock divider bit position for UART2 */ +#define CLKPWR_PCLKSEL_UART2 ((uint32_t)(48)) +/** Peripheral clock divider bit position for UART3 */ +#define CLKPWR_PCLKSEL_UART3 ((uint32_t)(50)) +/** Peripheral clock divider bit position for I2C2 */ +#define CLKPWR_PCLKSEL_I2C2 ((uint32_t)(52)) +/** Peripheral clock divider bit position for I2S */ +#define CLKPWR_PCLKSEL_I2S ((uint32_t)(54)) +/** Peripheral clock divider bit position for RIT */ +#define CLKPWR_PCLKSEL_RIT ((uint32_t)(58)) +/** Peripheral clock divider bit position for SYSCON */ +#define CLKPWR_PCLKSEL_SYSCON ((uint32_t)(60)) +/** Peripheral clock divider bit position for MC */ +#define CLKPWR_PCLKSEL_MC ((uint32_t)(62)) + +/** Macro for Peripheral Clock Selection register bit values + * Note: When CCLK_DIV_8, Peripheral�s clock is selected to + * PCLK_xyz = CCLK/8 except for CAN1, CAN2, and CAN filtering + * when �11�selects PCLK_xyz = CCLK/6 */ +/* Peripheral clock divider is set to 4 from CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_4 ((uint32_t)(0)) +/** Peripheral clock divider is the same with CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_1 ((uint32_t)(1)) +/** Peripheral clock divider is set to 2 from CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_2 ((uint32_t)(2)) + + +/******************************************************************** +* Power Control for Peripherals Definitions +**********************************************************************/ +/** Timer/Counter 0 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM0 ((uint32_t)(1<<1)) +/* Timer/Counter 1 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM1 ((uint32_t)(1<<2)) +/** UART0 power/clock control bit */ +#define CLKPWR_PCONP_PCUART0 ((uint32_t)(1<<3)) +/** UART1 power/clock control bit */ +#define CLKPWR_PCONP_PCUART1 ((uint32_t)(1<<4)) +/** PWM1 power/clock control bit */ +#define CLKPWR_PCONP_PCPWM1 ((uint32_t)(1<<6)) +/** The I2C0 interface power/clock control bit */ +#define CLKPWR_PCONP_PCI2C0 ((uint32_t)(1<<7)) +/** The SPI interface power/clock control bit */ +#define CLKPWR_PCONP_PCSPI ((uint32_t)(1<<8)) +/** The RTC power/clock control bit */ +#define CLKPWR_PCONP_PCRTC ((uint32_t)(1<<9)) +/** The SSP1 interface power/clock control bit */ +#define CLKPWR_PCONP_PCSSP1 ((uint32_t)(1<<10)) +/** A/D converter 0 (ADC0) power/clock control bit */ +#define CLKPWR_PCONP_PCAD ((uint32_t)(1<<12)) +/** CAN Controller 1 power/clock control bit */ +#define CLKPWR_PCONP_PCAN1 ((uint32_t)(1<<13)) +/** CAN Controller 2 power/clock control bit */ +#define CLKPWR_PCONP_PCAN2 ((uint32_t)(1<<14)) +/** GPIO power/clock control bit */ +#define CLKPWR_PCONP_PCGPIO ((uint32_t)(1<<15)) +/** Repetitive Interrupt Timer power/clock control bit */ +#define CLKPWR_PCONP_PCRIT ((uint32_t)(1<<16)) +/** Motor Control PWM */ +#define CLKPWR_PCONP_PCMC ((uint32_t)(1<<17)) +/** Quadrature Encoder Interface power/clock control bit */ +#define CLKPWR_PCONP_PCQEI ((uint32_t)(1<<18)) +/** The I2C1 interface power/clock control bit */ +#define CLKPWR_PCONP_PCI2C1 ((uint32_t)(1<<19)) +/** The SSP0 interface power/clock control bit */ +#define CLKPWR_PCONP_PCSSP0 ((uint32_t)(1<<21)) +/** Timer 2 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM2 ((uint32_t)(1<<22)) +/** Timer 3 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM3 ((uint32_t)(1<<23)) +/** UART 2 power/clock control bit */ +#define CLKPWR_PCONP_PCUART2 ((uint32_t)(1<<24)) +/** UART 3 power/clock control bit */ +#define CLKPWR_PCONP_PCUART3 ((uint32_t)(1<<25)) +/** I2C interface 2 power/clock control bit */ +#define CLKPWR_PCONP_PCI2C2 ((uint32_t)(1<<26)) +/** I2S interface power/clock control bit*/ +#define CLKPWR_PCONP_PCI2S ((uint32_t)(1<<27)) +/** GP DMA function power/clock control bit*/ +#define CLKPWR_PCONP_PCGPDMA ((uint32_t)(1<<29)) +/** Ethernet block power/clock control bit*/ +#define CLKPWR_PCONP_PCENET ((uint32_t)(1<<30)) +/** USB interface power/clock control bit*/ +#define CLKPWR_PCONP_PCUSB ((uint32_t)(1<<31)) + + +/** + * @} + */ +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup CLKPWR_Private_Macros CLKPWR Private Macros + * @{ + */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for Clock Source Select Register + **********************************************************************/ +/** Internal RC oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_IRC ((uint32_t)(0x00)) +/** Main oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_MAINOSC ((uint32_t)(0x01)) +/** RTC oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_RTC ((uint32_t)(0x02)) +/** Clock source selection bit mask */ +#define CLKPWR_CLKSRCSEL_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for Clock Output Configuration Register + **********************************************************************/ +/* Clock Output Configuration register definition */ +/** Selects the CPU clock as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_CPU ((uint32_t)(0x00)) +/** Selects the main oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_MAINOSC ((uint32_t)(0x01)) +/** Selects the Internal RC oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RC ((uint32_t)(0x02)) +/** Selects the USB clock as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_USB ((uint32_t)(0x03)) +/** Selects the RTC oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RTC ((uint32_t)(0x04)) +/** Integer value to divide the output clock by, minus one */ +#define CLKPWR_CLKOUTCFG_CLKOUTDIV(n) ((uint32_t)((n&0x0F)<<4)) +/** CLKOUT enable control */ +#define CLKPWR_CLKOUTCFG_CLKOUT_EN ((uint32_t)(1<<8)) +/** CLKOUT activity indication */ +#define CLKPWR_CLKOUTCFG_CLKOUT_ACT ((uint32_t)(1<<9)) +/** Clock source selection bit mask */ +#define CLKPWR_CLKOUTCFG_BITMASK ((uint32_t)(0x3FF)) + +/*********************************************************************//** + * Macro defines for PPL0 Control Register + **********************************************************************/ +/** PLL 0 control enable */ +#define CLKPWR_PLL0CON_ENABLE ((uint32_t)(0x01)) +/** PLL 0 control connect */ +#define CLKPWR_PLL0CON_CONNECT ((uint32_t)(0x02)) +/** PLL 0 control bit mask */ +#define CLKPWR_PLL0CON_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for PPL0 Configuration Register + **********************************************************************/ +/** PLL 0 Configuration MSEL field */ +#define CLKPWR_PLL0CFG_MSEL(n) ((uint32_t)(n&0x7FFF)) +/** PLL 0 Configuration NSEL field */ +#define CLKPWR_PLL0CFG_NSEL(n) ((uint32_t)((n<<16)&0xFF0000)) +/** PLL 0 Configuration bit mask */ +#define CLKPWR_PLL0CFG_BITMASK ((uint32_t)(0xFF7FFF)) + + +/*********************************************************************//** + * Macro defines for PPL0 Status Register + **********************************************************************/ +/** PLL 0 MSEL value */ +#define CLKPWR_PLL0STAT_MSEL(n) ((uint32_t)(n&0x7FFF)) +/** PLL NSEL get value */ +#define CLKPWR_PLL0STAT_NSEL(n) ((uint32_t)((n>>16)&0xFF)) +/** PLL status enable bit */ +#define CLKPWR_PLL0STAT_PLLE ((uint32_t)(1<<24)) +/** PLL status Connect bit */ +#define CLKPWR_PLL0STAT_PLLC ((uint32_t)(1<<25)) +/** PLL status lock */ +#define CLKPWR_PLL0STAT_PLOCK ((uint32_t)(1<<26)) + +/*********************************************************************//** + * Macro defines for PPL0 Feed Register + **********************************************************************/ +/** PLL0 Feed bit mask */ +#define CLKPWR_PLL0FEED_BITMASK ((uint32_t)0xFF) + +/*********************************************************************//** + * Macro defines for PLL1 Control Register + **********************************************************************/ +/** USB PLL control enable */ +#define CLKPWR_PLL1CON_ENABLE ((uint32_t)(0x01)) +/** USB PLL control connect */ +#define CLKPWR_PLL1CON_CONNECT ((uint32_t)(0x02)) +/** USB PLL control bit mask */ +#define CLKPWR_PLL1CON_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for PLL1 Configuration Register + **********************************************************************/ +/** USB PLL MSEL set value */ +#define CLKPWR_PLL1CFG_MSEL(n) ((uint32_t)(n&0x1F)) +/** USB PLL PSEL set value */ +#define CLKPWR_PLL1CFG_PSEL(n) ((uint32_t)((n&0x03)<<5)) +/** USB PLL configuration bit mask */ +#define CLKPWR_PLL1CFG_BITMASK ((uint32_t)(0x7F)) + +/*********************************************************************//** + * Macro defines for PLL1 Status Register + **********************************************************************/ +/** USB PLL MSEL get value */ +#define CLKPWR_PLL1STAT_MSEL(n) ((uint32_t)(n&0x1F)) +/** USB PLL PSEL get value */ +#define CLKPWR_PLL1STAT_PSEL(n) ((uint32_t)((n>>5)&0x03)) +/** USB PLL status enable bit */ +#define CLKPWR_PLL1STAT_PLLE ((uint32_t)(1<<8)) +/** USB PLL status Connect bit */ +#define CLKPWR_PLL1STAT_PLLC ((uint32_t)(1<<9)) +/** USB PLL status lock */ +#define CLKPWR_PLL1STAT_PLOCK ((uint32_t)(1<<10)) + +/*********************************************************************//** + * Macro defines for PLL1 Feed Register + **********************************************************************/ +/** PLL1 Feed bit mask */ +#define CLKPWR_PLL1FEED_BITMASK ((uint32_t)0xFF) + +/*********************************************************************//** + * Macro defines for CPU Clock Configuration Register + **********************************************************************/ +/** CPU Clock configuration bit mask */ +#define CLKPWR_CCLKCFG_BITMASK ((uint32_t)(0xFF)) + +/*********************************************************************//** + * Macro defines for USB Clock Configuration Register + **********************************************************************/ +/** USB Clock Configuration bit mask */ +#define CLKPWR_USBCLKCFG_BITMASK ((uint32_t)(0x0F)) + +/*********************************************************************//** + * Macro defines for IRC Trim Register + **********************************************************************/ +/** IRC Trim bit mask */ +#define CLKPWR_IRCTRIM_BITMASK ((uint32_t)(0x0F)) + +/*********************************************************************//** + * Macro defines for Peripheral Clock Selection Register 0 and 1 + **********************************************************************/ +/** Peripheral Clock Selection 0 mask bit */ +#define CLKPWR_PCLKSEL0_BITMASK ((uint32_t)(0xFFF3F3FF)) +/** Peripheral Clock Selection 1 mask bit */ +#define CLKPWR_PCLKSEL1_BITMASK ((uint32_t)(0xFCF3F0F3)) +/** Macro to set peripheral clock of each type + * p: position of two bits that hold divider of peripheral clock + * n: value of divider of peripheral clock to be set */ +#define CLKPWR_PCLKSEL_SET(p,n) _SBF(p,n) +/** Macro to mask peripheral clock of each type */ +#define CLKPWR_PCLKSEL_BITMASK(p) _SBF(p,0x03) +/** Macro to get peripheral clock of each type */ +#define CLKPWR_PCLKSEL_GET(p, n) ((uint32_t)((n>>p)&0x03)) + +/*********************************************************************//** + * Macro defines for Power Mode Control Register + **********************************************************************/ +/** Power mode control bit 0 */ +#define CLKPWR_PCON_PM0 ((uint32_t)(1<<0)) +/** Power mode control bit 1 */ +#define CLKPWR_PCON_PM1 ((uint32_t)(1<<1)) +/** Brown-Out Reduced Power Mode */ +#define CLKPWR_PCON_BODPDM ((uint32_t)(1<<2)) +/** Brown-Out Global Disable */ +#define CLKPWR_PCON_BOGD ((uint32_t)(1<<3)) +/** Brown Out Reset Disable */ +#define CLKPWR_PCON_BORD ((uint32_t)(1<<4)) +/** Sleep Mode entry flag */ +#define CLKPWR_PCON_SMFLAG ((uint32_t)(1<<8)) +/** Deep Sleep entry flag */ +#define CLKPWR_PCON_DSFLAG ((uint32_t)(1<<9)) +/** Power-down entry flag */ +#define CLKPWR_PCON_PDFLAG ((uint32_t)(1<<10)) +/** Deep Power-down entry flag */ +#define CLKPWR_PCON_DPDFLAG ((uint32_t)(1<<11)) + +/*********************************************************************//** + * Macro defines for Power Control for Peripheral Register + **********************************************************************/ +/** Power Control for Peripherals bit mask */ +#define CLKPWR_PCONP_BITMASK 0xEFEFF7DE + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup CLKPWR_Public_Functions CLKPWR Public Functions + * @{ + */ + +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal); +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType); +uint32_t CLKPWR_GetPCLK (uint32_t ClkType); +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState); +void CLKPWR_Sleep(void); +void CLKPWR_DeepSleep(void); +void CLKPWR_PowerDown(void); +void CLKPWR_DeepPowerDown(void); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_CLKPWR_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h new file mode 100644 index 0000000000..da8776f511 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h @@ -0,0 +1,154 @@ +/********************************************************************** +* $Id$ lpc17xx_dac.h 2010-05-21 +*//** +* @file lpc17xx_dac.h +* @brief Contains all macro definitions and function prototypes +* support for Clock and Power Control firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup DAC DAC (Digital-to-Analog Controller) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_DAC_H_ +#define LPC17XX_DAC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup DAC_Private_Macros DAC Private Macros + * @{ + */ + +/** After the selected settling time after this field is written with a +new VALUE, the voltage on the AOUT pin (with respect to VSSA) +is VALUE/1024 × VREF */ +#define DAC_VALUE(n) ((uint32_t)((n&0x3FF)<<6)) +/** If this bit = 0: The settling time of the DAC is 1 microsecond max, + * and the maximum current is 700 microAmpere + * If this bit = 1: The settling time of the DAC is 2.5 microsecond + * and the maximum current is 350 microAmpere */ +#define DAC_BIAS_EN ((uint32_t)(1<<16)) +/** Value to reload interrupt DMA counter */ +#define DAC_CCNT_VALUE(n) ((uint32_t)(n&0xffff)) + +/** DCAR double buffering */ +#define DAC_DBLBUF_ENA ((uint32_t)(1<<1)) +/** DCAR Time out count enable */ +#define DAC_CNT_ENA ((uint32_t)(1<<2)) +/** DCAR DMA access */ +#define DAC_DMA_ENA ((uint32_t)(1<<3)) +/** DCAR DACCTRL mask bit */ +#define DAC_DACCTRL_MASK ((uint32_t)(0x0F)) + +/** Macro to determine if it is valid DAC peripheral */ +#define PARAM_DACx(n) (((uint32_t *)n)==((uint32_t *)LPC_DAC)) + +/** Macro to check DAC current optional parameter */ +#define PARAM_DAC_CURRENT_OPT(OPTION) ((OPTION == DAC_MAX_CURRENT_700uA)\ +||(OPTION == DAC_MAX_CURRENT_350uA)) +/** + * @} + */ +/* Public Types --------------------------------------------------------------- */ +/** @defgroup DAC_Public_Types DAC Public Types + * @{ + */ + +/** + * @brief Current option in DAC configuration option */ +typedef enum +{ + DAC_MAX_CURRENT_700uA = 0, /*!< The settling time of the DAC is 1 us max, + and the maximum current is 700 uA */ + DAC_MAX_CURRENT_350uA /*!< The settling time of the DAC is 2.5 us + and the maximum current is 350 uA */ +} DAC_CURRENT_OPT; + +/** + * @brief Configuration for DAC converter control register */ +typedef struct +{ + + uint8_t DBLBUF_ENA; /**< + -0: Disable DACR double buffering + -1: when bit CNT_ENA, enable DACR double buffering feature + */ + uint8_t CNT_ENA; /*!< + -0: Time out counter is disable + -1: Time out conter is enable + */ + uint8_t DMA_ENA; /*!< + -0: DMA access is disable + -1: DMA burst request + */ + uint8_t RESERVED; + +} DAC_CONVERTER_CFG_Type; + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup DAC_Public_Functions DAC Public Functions + * @{ + */ + +void DAC_Init(LPC_DAC_TypeDef *DACx); +void DAC_UpdateValue (LPC_DAC_TypeDef *DACx, uint32_t dac_value); +void DAC_SetBias (LPC_DAC_TypeDef *DACx,uint32_t bias); +void DAC_ConfigDAConverterControl (LPC_DAC_TypeDef *DACx,DAC_CONVERTER_CFG_Type *DAC_ConverterConfigStruct); +void DAC_SetDMATimeOut(LPC_DAC_TypeDef *DACx,uint32_t time_out); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* LPC17XX_DAC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h new file mode 100644 index 0000000000..ebca02ce21 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h @@ -0,0 +1,711 @@ +/********************************************************************** +* $Id$ lpc17xx_emac.h 2010-05-21 +*//** +* @file lpc17xx_emac.h +* @brief Contains all macro definitions and function prototypes +* support for Ethernet MAC firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup EMAC EMAC (Ethernet Media Access Controller) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_EMAC_H_ +#define LPC17XX_EMAC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define MCB_LPC_1768 +//#define IAR_LPC_1768 + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup EMAC_Public_Macros EMAC Public Macros + * @{ + */ + + +/* EMAC PHY status type definitions */ +#define EMAC_PHY_STAT_LINK (0) /**< Link Status */ +#define EMAC_PHY_STAT_SPEED (1) /**< Speed Status */ +#define EMAC_PHY_STAT_DUP (2) /**< Duplex Status */ + +/* EMAC PHY device Speed definitions */ +#define EMAC_MODE_AUTO (0) /**< Auto-negotiation mode */ +#define EMAC_MODE_10M_FULL (1) /**< 10Mbps FullDuplex mode */ +#define EMAC_MODE_10M_HALF (2) /**< 10Mbps HalfDuplex mode */ +#define EMAC_MODE_100M_FULL (3) /**< 100Mbps FullDuplex mode */ +#define EMAC_MODE_100M_HALF (4) /**< 100Mbps HalfDuplex mode */ + +/** + * @} + */ +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EMAC_Private_Macros EMAC Private Macros + * @{ + */ + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM */ +#define EMAC_NUM_RX_FRAG 4 /**< Num.of RX Fragments 4*1536= 6.0kB */ +#define EMAC_NUM_TX_FRAG 3 /**< Num.of TX Fragments 3*1536= 4.6kB */ +#define EMAC_ETH_MAX_FLEN 1536 /**< Max. Ethernet Frame Size */ +#define EMAC_TX_FRAME_TOUT 0x00100000 /**< Frame Transmit timeout count */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for MAC Configuration Register 1 + **********************************************************************/ +#define EMAC_MAC1_REC_EN 0x00000001 /**< Receive Enable */ +#define EMAC_MAC1_PASS_ALL 0x00000002 /**< Pass All Receive Frames */ +#define EMAC_MAC1_RX_FLOWC 0x00000004 /**< RX Flow Control */ +#define EMAC_MAC1_TX_FLOWC 0x00000008 /**< TX Flow Control */ +#define EMAC_MAC1_LOOPB 0x00000010 /**< Loop Back Mode */ +#define EMAC_MAC1_RES_TX 0x00000100 /**< Reset TX Logic */ +#define EMAC_MAC1_RES_MCS_TX 0x00000200 /**< Reset MAC TX Control Sublayer */ +#define EMAC_MAC1_RES_RX 0x00000400 /**< Reset RX Logic */ +#define EMAC_MAC1_RES_MCS_RX 0x00000800 /**< Reset MAC RX Control Sublayer */ +#define EMAC_MAC1_SIM_RES 0x00004000 /**< Simulation Reset */ +#define EMAC_MAC1_SOFT_RES 0x00008000 /**< Soft Reset MAC */ + +/*********************************************************************//** + * Macro defines for MAC Configuration Register 2 + **********************************************************************/ +#define EMAC_MAC2_FULL_DUP 0x00000001 /**< Full-Duplex Mode */ +#define EMAC_MAC2_FRM_LEN_CHK 0x00000002 /**< Frame Length Checking */ +#define EMAC_MAC2_HUGE_FRM_EN 0x00000004 /**< Huge Frame Enable */ +#define EMAC_MAC2_DLY_CRC 0x00000008 /**< Delayed CRC Mode */ +#define EMAC_MAC2_CRC_EN 0x00000010 /**< Append CRC to every Frame */ +#define EMAC_MAC2_PAD_EN 0x00000020 /**< Pad all Short Frames */ +#define EMAC_MAC2_VLAN_PAD_EN 0x00000040 /**< VLAN Pad Enable */ +#define EMAC_MAC2_ADET_PAD_EN 0x00000080 /**< Auto Detect Pad Enable */ +#define EMAC_MAC2_PPREAM_ENF 0x00000100 /**< Pure Preamble Enforcement */ +#define EMAC_MAC2_LPREAM_ENF 0x00000200 /**< Long Preamble Enforcement */ +#define EMAC_MAC2_NO_BACKOFF 0x00001000 /**< No Backoff Algorithm */ +#define EMAC_MAC2_BACK_PRESSURE 0x00002000 /**< Backoff Presurre / No Backoff */ +#define EMAC_MAC2_EXCESS_DEF 0x00004000 /**< Excess Defer */ + +/*********************************************************************//** + * Macro defines for Back-to-Back Inter-Packet-Gap Register + **********************************************************************/ +/** Programmable field representing the nibble time offset of the minimum possible period + * between the end of any transmitted packet to the beginning of the next */ +#define EMAC_IPGT_BBIPG(n) (n&0x7F) +/** Recommended value for Full Duplex of Programmable field representing the nibble time + * offset of the minimum possible period between the end of any transmitted packet to the + * beginning of the next */ +#define EMAC_IPGT_FULL_DUP (EMAC_IPGT_BBIPG(0x15)) +/** Recommended value for Half Duplex of Programmable field representing the nibble time + * offset of the minimum possible period between the end of any transmitted packet to the + * beginning of the next */ +#define EMAC_IPGT_HALF_DUP (EMAC_IPGT_BBIPG(0x12)) + +/*********************************************************************//** + * Macro defines for Non Back-to-Back Inter-Packet-Gap Register + **********************************************************************/ +/** Programmable field representing the Non-Back-to-Back Inter-Packet-Gap */ +#define EMAC_IPGR_NBBIPG_P2(n) (n&0x7F) +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 1 */ +#define EMAC_IPGR_P2_DEF (EMAC_IPGR_NBBIPG_P2(0x12)) +/** Programmable field representing the optional carrierSense window referenced in + * IEEE 802.3/4.2.3.2.1 'Carrier Deference' */ +#define EMAC_IPGR_NBBIPG_P1(n) ((n&0x7F)<<8) +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 2 */ +#define EMAC_IPGR_P1_DEF EMAC_IPGR_NBBIPG_P1(0x0C) + +/*********************************************************************//** + * Macro defines for Collision Window/Retry Register + **********************************************************************/ +/** Programmable field specifying the number of retransmission attempts following a collision before + * aborting the packet due to excessive collisions */ +#define EMAC_CLRT_MAX_RETX(n) (n&0x0F) +/** Programmable field representing the slot time or collision window during which collisions occur + * in properly configured networks */ +#define EMAC_CLRT_COLL(n) ((n&0x3F)<<8) +/** Default value for Collision Window / Retry register */ +#define EMAC_CLRT_DEF ((EMAC_CLRT_MAX_RETX(0x0F))|(EMAC_CLRT_COLL(0x37))) + +/*********************************************************************//** + * Macro defines for Maximum Frame Register + **********************************************************************/ +/** Represents a maximum receive frame of 1536 octets */ +#define EMAC_MAXF_MAXFRMLEN(n) (n&0xFFFF) + +/*********************************************************************//** + * Macro defines for PHY Support Register + **********************************************************************/ +#define EMAC_SUPP_SPEED 0x00000100 /**< Reduced MII Logic Current Speed */ +//#define EMAC_SUPP_RES_RMII 0x00000800 /**< Reset Reduced MII Logic */ + +/*********************************************************************//** + * Macro defines for Test Register + **********************************************************************/ +#define EMAC_TEST_SHCUT_PQUANTA 0x00000001 /**< Shortcut Pause Quanta */ +#define EMAC_TEST_TST_PAUSE 0x00000002 /**< Test Pause */ +#define EMAC_TEST_TST_BACKP 0x00000004 /**< Test Back Pressure */ + +/*********************************************************************//** + * Macro defines for MII Management Configuration Register + **********************************************************************/ +#define EMAC_MCFG_SCAN_INC 0x00000001 /**< Scan Increment PHY Address */ +#define EMAC_MCFG_SUPP_PREAM 0x00000002 /**< Suppress Preamble */ +#define EMAC_MCFG_CLK_SEL(n) ((n&0x0F)<<2) /**< Clock Select Field */ +#define EMAC_MCFG_RES_MII 0x00008000 /**< Reset MII Management Hardware */ +#define EMAC_MCFG_MII_MAXCLK 2500000UL /**< MII Clock max */ + +/*********************************************************************//** + * Macro defines for MII Management Command Register + **********************************************************************/ +#define EMAC_MCMD_READ 0x00000001 /**< MII Read */ +#define EMAC_MCMD_SCAN 0x00000002 /**< MII Scan continuously */ + +#define EMAC_MII_WR_TOUT 0x00050000 /**< MII Write timeout count */ +#define EMAC_MII_RD_TOUT 0x00050000 /**< MII Read timeout count */ + +/*********************************************************************//** + * Macro defines for MII Management Address Register + **********************************************************************/ +#define EMAC_MADR_REG_ADR(n) (n&0x1F) /**< MII Register Address field */ +#define EMAC_MADR_PHY_ADR(n) ((n&0x1F)<<8) /**< PHY Address Field */ + +/*********************************************************************//** + * Macro defines for MII Management Write Data Register + **********************************************************************/ +#define EMAC_MWTD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Write Data register */ + +/*********************************************************************//** + * Macro defines for MII Management Read Data Register + **********************************************************************/ +#define EMAC_MRDD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Read Data register */ + +/*********************************************************************//** + * Macro defines for MII Management Indicators Register + **********************************************************************/ +#define EMAC_MIND_BUSY 0x00000001 /**< MII is Busy */ +#define EMAC_MIND_SCAN 0x00000002 /**< MII Scanning in Progress */ +#define EMAC_MIND_NOT_VAL 0x00000004 /**< MII Read Data not valid */ +#define EMAC_MIND_MII_LINK_FAIL 0x00000008 /**< MII Link Failed */ + +/* Station Address 0 Register */ +/* Station Address 1 Register */ +/* Station Address 2 Register */ + + +/* Control register definitions --------------------------------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Command Register + **********************************************************************/ +#define EMAC_CR_RX_EN 0x00000001 /**< Enable Receive */ +#define EMAC_CR_TX_EN 0x00000002 /**< Enable Transmit */ +#define EMAC_CR_REG_RES 0x00000008 /**< Reset Host Registers */ +#define EMAC_CR_TX_RES 0x00000010 /**< Reset Transmit Datapath */ +#define EMAC_CR_RX_RES 0x00000020 /**< Reset Receive Datapath */ +#define EMAC_CR_PASS_RUNT_FRM 0x00000040 /**< Pass Runt Frames */ +#define EMAC_CR_PASS_RX_FILT 0x00000080 /**< Pass RX Filter */ +#define EMAC_CR_TX_FLOW_CTRL 0x00000100 /**< TX Flow Control */ +#define EMAC_CR_RMII 0x00000200 /**< Reduced MII Interface */ +#define EMAC_CR_FULL_DUP 0x00000400 /**< Full Duplex */ + +/*********************************************************************//** + * Macro defines for Status Register + **********************************************************************/ +#define EMAC_SR_RX_EN 0x00000001 /**< Enable Receive */ +#define EMAC_SR_TX_EN 0x00000002 /**< Enable Transmit */ + +/*********************************************************************//** + * Macro defines for Transmit Status Vector 0 Register + **********************************************************************/ +#define EMAC_TSV0_CRC_ERR 0x00000001 /**< CRC error */ +#define EMAC_TSV0_LEN_CHKERR 0x00000002 /**< Length Check Error */ +#define EMAC_TSV0_LEN_OUTRNG 0x00000004 /**< Length Out of Range */ +#define EMAC_TSV0_DONE 0x00000008 /**< Tramsmission Completed */ +#define EMAC_TSV0_MCAST 0x00000010 /**< Multicast Destination */ +#define EMAC_TSV0_BCAST 0x00000020 /**< Broadcast Destination */ +#define EMAC_TSV0_PKT_DEFER 0x00000040 /**< Packet Deferred */ +#define EMAC_TSV0_EXC_DEFER 0x00000080 /**< Excessive Packet Deferral */ +#define EMAC_TSV0_EXC_COLL 0x00000100 /**< Excessive Collision */ +#define EMAC_TSV0_LATE_COLL 0x00000200 /**< Late Collision Occured */ +#define EMAC_TSV0_GIANT 0x00000400 /**< Giant Frame */ +#define EMAC_TSV0_UNDERRUN 0x00000800 /**< Buffer Underrun */ +#define EMAC_TSV0_BYTES 0x0FFFF000 /**< Total Bytes Transferred */ +#define EMAC_TSV0_CTRL_FRAME 0x10000000 /**< Control Frame */ +#define EMAC_TSV0_PAUSE 0x20000000 /**< Pause Frame */ +#define EMAC_TSV0_BACK_PRESS 0x40000000 /**< Backpressure Method Applied */ +#define EMAC_TSV0_VLAN 0x80000000 /**< VLAN Frame */ + +/*********************************************************************//** + * Macro defines for Transmit Status Vector 1 Register + **********************************************************************/ +#define EMAC_TSV1_BYTE_CNT 0x0000FFFF /**< Transmit Byte Count */ +#define EMAC_TSV1_COLL_CNT 0x000F0000 /**< Transmit Collision Count */ + +/*********************************************************************//** + * Macro defines for Receive Status Vector Register + **********************************************************************/ +#define EMAC_RSV_BYTE_CNT 0x0000FFFF /**< Receive Byte Count */ +#define EMAC_RSV_PKT_IGNORED 0x00010000 /**< Packet Previously Ignored */ +#define EMAC_RSV_RXDV_SEEN 0x00020000 /**< RXDV Event Previously Seen */ +#define EMAC_RSV_CARR_SEEN 0x00040000 /**< Carrier Event Previously Seen */ +#define EMAC_RSV_REC_CODEV 0x00080000 /**< Receive Code Violation */ +#define EMAC_RSV_CRC_ERR 0x00100000 /**< CRC Error */ +#define EMAC_RSV_LEN_CHKERR 0x00200000 /**< Length Check Error */ +#define EMAC_RSV_LEN_OUTRNG 0x00400000 /**< Length Out of Range */ +#define EMAC_RSV_REC_OK 0x00800000 /**< Frame Received OK */ +#define EMAC_RSV_MCAST 0x01000000 /**< Multicast Frame */ +#define EMAC_RSV_BCAST 0x02000000 /**< Broadcast Frame */ +#define EMAC_RSV_DRIB_NIBB 0x04000000 /**< Dribble Nibble */ +#define EMAC_RSV_CTRL_FRAME 0x08000000 /**< Control Frame */ +#define EMAC_RSV_PAUSE 0x10000000 /**< Pause Frame */ +#define EMAC_RSV_UNSUPP_OPC 0x20000000 /**< Unsupported Opcode */ +#define EMAC_RSV_VLAN 0x40000000 /**< VLAN Frame */ + +/*********************************************************************//** + * Macro defines for Flow Control Counter Register + **********************************************************************/ +#define EMAC_FCC_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter */ +#define EMAC_FCC_PAUSE_TIM(n) ((n&0xFFFF)<<16) /**< Pause Timer */ + +/*********************************************************************//** + * Macro defines for Flow Control Status Register + **********************************************************************/ +#define EMAC_FCS_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter Current */ + + +/* Receive filter register definitions -------------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Receive Filter Control Register + **********************************************************************/ +#define EMAC_RFC_UCAST_EN 0x00000001 /**< Accept Unicast Frames Enable */ +#define EMAC_RFC_BCAST_EN 0x00000002 /**< Accept Broadcast Frames Enable */ +#define EMAC_RFC_MCAST_EN 0x00000004 /**< Accept Multicast Frames Enable */ +#define EMAC_RFC_UCAST_HASH_EN 0x00000008 /**< Accept Unicast Hash Filter Frames */ +#define EMAC_RFC_MCAST_HASH_EN 0x00000010 /**< Accept Multicast Hash Filter Fram.*/ +#define EMAC_RFC_PERFECT_EN 0x00000020 /**< Accept Perfect Match Enable */ +#define EMAC_RFC_MAGP_WOL_EN 0x00001000 /**< Magic Packet Filter WoL Enable */ +#define EMAC_RFC_PFILT_WOL_EN 0x00002000 /**< Perfect Filter WoL Enable */ + +/*********************************************************************//** + * Macro defines for Receive Filter WoL Status/Clear Registers + **********************************************************************/ +#define EMAC_WOL_UCAST 0x00000001 /**< Unicast Frame caused WoL */ +#define EMAC_WOL_BCAST 0x00000002 /**< Broadcast Frame caused WoL */ +#define EMAC_WOL_MCAST 0x00000004 /**< Multicast Frame caused WoL */ +#define EMAC_WOL_UCAST_HASH 0x00000008 /**< Unicast Hash Filter Frame WoL */ +#define EMAC_WOL_MCAST_HASH 0x00000010 /**< Multicast Hash Filter Frame WoL */ +#define EMAC_WOL_PERFECT 0x00000020 /**< Perfect Filter WoL */ +#define EMAC_WOL_RX_FILTER 0x00000080 /**< RX Filter caused WoL */ +#define EMAC_WOL_MAG_PACKET 0x00000100 /**< Magic Packet Filter caused WoL */ +#define EMAC_WOL_BITMASK 0x01BF /**< Receive Filter WoL Status/Clear bitmasl value */ + + +/* Module control register definitions ---------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Interrupt Status/Enable/Clear/Set Registers + **********************************************************************/ +#define EMAC_INT_RX_OVERRUN 0x00000001 /**< Overrun Error in RX Queue */ +#define EMAC_INT_RX_ERR 0x00000002 /**< Receive Error */ +#define EMAC_INT_RX_FIN 0x00000004 /**< RX Finished Process Descriptors */ +#define EMAC_INT_RX_DONE 0x00000008 /**< Receive Done */ +#define EMAC_INT_TX_UNDERRUN 0x00000010 /**< Transmit Underrun */ +#define EMAC_INT_TX_ERR 0x00000020 /**< Transmit Error */ +#define EMAC_INT_TX_FIN 0x00000040 /**< TX Finished Process Descriptors */ +#define EMAC_INT_TX_DONE 0x00000080 /**< Transmit Done */ +#define EMAC_INT_SOFT_INT 0x00001000 /**< Software Triggered Interrupt */ +#define EMAC_INT_WAKEUP 0x00002000 /**< Wakeup Event Interrupt */ + +/*********************************************************************//** + * Macro defines for Power Down Register + **********************************************************************/ +#define EMAC_PD_POWER_DOWN 0x80000000 /**< Power Down MAC */ + +/* Descriptor and status formats ---------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for RX Descriptor Control Word + **********************************************************************/ +#define EMAC_RCTRL_SIZE(n) (n&0x7FF) /**< Buffer size field */ +#define EMAC_RCTRL_INT 0x80000000 /**< Generate RxDone Interrupt */ + +/*********************************************************************//** + * Macro defines for RX Status Hash CRC Word + **********************************************************************/ +#define EMAC_RHASH_SA 0x000001FF /**< Hash CRC for Source Address */ +#define EMAC_RHASH_DA 0x001FF000 /**< Hash CRC for Destination Address */ + +/*********************************************************************//** + * Macro defines for RX Status Information Word + **********************************************************************/ +#define EMAC_RINFO_SIZE 0x000007FF /**< Data size in bytes */ +#define EMAC_RINFO_CTRL_FRAME 0x00040000 /**< Control Frame */ +#define EMAC_RINFO_VLAN 0x00080000 /**< VLAN Frame */ +#define EMAC_RINFO_FAIL_FILT 0x00100000 /**< RX Filter Failed */ +#define EMAC_RINFO_MCAST 0x00200000 /**< Multicast Frame */ +#define EMAC_RINFO_BCAST 0x00400000 /**< Broadcast Frame */ +#define EMAC_RINFO_CRC_ERR 0x00800000 /**< CRC Error in Frame */ +#define EMAC_RINFO_SYM_ERR 0x01000000 /**< Symbol Error from PHY */ +#define EMAC_RINFO_LEN_ERR 0x02000000 /**< Length Error */ +#define EMAC_RINFO_RANGE_ERR 0x04000000 /**< Range Error (exceeded max. size) */ +#define EMAC_RINFO_ALIGN_ERR 0x08000000 /**< Alignment Error */ +#define EMAC_RINFO_OVERRUN 0x10000000 /**< Receive overrun */ +#define EMAC_RINFO_NO_DESCR 0x20000000 /**< No new Descriptor available */ +#define EMAC_RINFO_LAST_FLAG 0x40000000 /**< Last Fragment in Frame */ +#define EMAC_RINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */ +#define EMAC_RINFO_ERR_MASK (EMAC_RINFO_FAIL_FILT | EMAC_RINFO_CRC_ERR | EMAC_RINFO_SYM_ERR | \ +EMAC_RINFO_LEN_ERR | EMAC_RINFO_ALIGN_ERR | EMAC_RINFO_OVERRUN) + +/*********************************************************************//** + * Macro defines for TX Descriptor Control Word + **********************************************************************/ +#define EMAC_TCTRL_SIZE 0x000007FF /**< Size of data buffer in bytes */ +#define EMAC_TCTRL_OVERRIDE 0x04000000 /**< Override Default MAC Registers */ +#define EMAC_TCTRL_HUGE 0x08000000 /**< Enable Huge Frame */ +#define EMAC_TCTRL_PAD 0x10000000 /**< Pad short Frames to 64 bytes */ +#define EMAC_TCTRL_CRC 0x20000000 /**< Append a hardware CRC to Frame */ +#define EMAC_TCTRL_LAST 0x40000000 /**< Last Descriptor for TX Frame */ +#define EMAC_TCTRL_INT 0x80000000 /**< Generate TxDone Interrupt */ + +/*********************************************************************//** + * Macro defines for TX Status Information Word + **********************************************************************/ +#define EMAC_TINFO_COL_CNT 0x01E00000 /**< Collision Count */ +#define EMAC_TINFO_DEFER 0x02000000 /**< Packet Deferred (not an error) */ +#define EMAC_TINFO_EXCESS_DEF 0x04000000 /**< Excessive Deferral */ +#define EMAC_TINFO_EXCESS_COL 0x08000000 /**< Excessive Collision */ +#define EMAC_TINFO_LATE_COL 0x10000000 /**< Late Collision Occured */ +#define EMAC_TINFO_UNDERRUN 0x20000000 /**< Transmit Underrun */ +#define EMAC_TINFO_NO_DESCR 0x40000000 /**< No new Descriptor available */ +#define EMAC_TINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */ + +#ifdef MCB_LPC_1768 +/* DP83848C PHY definition ------------------------------------------------------------ */ + +/** PHY device reset time out definition */ +#define EMAC_PHY_RESP_TOUT 0x100000UL + +/* ENET Device Revision ID */ +#define EMAC_OLD_EMAC_MODULE_ID 0x39022000 /**< Rev. ID for first rev '-' */ + +/*********************************************************************//** + * Macro defines for DP83848C PHY Registers + **********************************************************************/ +#define EMAC_PHY_REG_BMCR 0x00 /**< Basic Mode Control Register */ +#define EMAC_PHY_REG_BMSR 0x01 /**< Basic Mode Status Register */ +#define EMAC_PHY_REG_IDR1 0x02 /**< PHY Identifier 1 */ +#define EMAC_PHY_REG_IDR2 0x03 /**< PHY Identifier 2 */ +#define EMAC_PHY_REG_ANAR 0x04 /**< Auto-Negotiation Advertisement */ +#define EMAC_PHY_REG_ANLPAR 0x05 /**< Auto-Neg. Link Partner Abitily */ +#define EMAC_PHY_REG_ANER 0x06 /**< Auto-Neg. Expansion Register */ +#define EMAC_PHY_REG_ANNPTR 0x07 /**< Auto-Neg. Next Page TX */ +#define EMAC_PHY_REG_LPNPA 0x08 + +/*********************************************************************//** + * Macro defines for PHY Extended Registers + **********************************************************************/ +#define EMAC_PHY_REG_STS 0x10 /**< Status Register */ +#define EMAC_PHY_REG_MICR 0x11 /**< MII Interrupt Control Register */ +#define EMAC_PHY_REG_MISR 0x12 /**< MII Interrupt Status Register */ +#define EMAC_PHY_REG_FCSCR 0x14 /**< False Carrier Sense Counter */ +#define EMAC_PHY_REG_RECR 0x15 /**< Receive Error Counter */ +#define EMAC_PHY_REG_PCSR 0x16 /**< PCS Sublayer Config. and Status */ +#define EMAC_PHY_REG_RBR 0x17 /**< RMII and Bypass Register */ +#define EMAC_PHY_REG_LEDCR 0x18 /**< LED Direct Control Register */ +#define EMAC_PHY_REG_PHYCR 0x19 /**< PHY Control Register */ +#define EMAC_PHY_REG_10BTSCR 0x1A /**< 10Base-T Status/Control Register */ +#define EMAC_PHY_REG_CDCTRL1 0x1B /**< CD Test Control and BIST Extens. */ +#define EMAC_PHY_REG_EDCR 0x1D /**< Energy Detect Control Register */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Control Register + **********************************************************************/ +#define EMAC_PHY_BMCR_RESET (1<<15) /**< Reset bit */ +#define EMAC_PHY_BMCR_LOOPBACK (1<<14) /**< Loop back */ +#define EMAC_PHY_BMCR_SPEED_SEL (1<<13) /**< Speed selection */ +#define EMAC_PHY_BMCR_AN (1<<12) /**< Auto Negotiation */ +#define EMAC_PHY_BMCR_POWERDOWN (1<<11) /**< Power down mode */ +#define EMAC_PHY_BMCR_ISOLATE (1<<10) /**< Isolate */ +#define EMAC_PHY_BMCR_RE_AN (1<<9) /**< Restart auto negotiation */ +#define EMAC_PHY_BMCR_DUPLEX (1<<8) /**< Duplex mode */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Status Status Register + **********************************************************************/ +#define EMAC_PHY_BMSR_100BE_T4 (1<<15) /**< 100 base T4 */ +#define EMAC_PHY_BMSR_100TX_FULL (1<<14) /**< 100 base full duplex */ +#define EMAC_PHY_BMSR_100TX_HALF (1<<13) /**< 100 base half duplex */ +#define EMAC_PHY_BMSR_10BE_FULL (1<<12) /**< 10 base T full duplex */ +#define EMAC_PHY_BMSR_10BE_HALF (1<<11) /**< 10 base T half duplex */ +#define EMAC_PHY_BMSR_NOPREAM (1<<6) /**< MF Preamable Supress */ +#define EMAC_PHY_BMSR_AUTO_DONE (1<<5) /**< Auto negotiation complete */ +#define EMAC_PHY_BMSR_REMOTE_FAULT (1<<4) /**< Remote fault */ +#define EMAC_PHY_BMSR_NO_AUTO (1<<3) /**< Auto Negotiation ability */ +#define EMAC_PHY_BMSR_LINK_ESTABLISHED (1<<2) /**< Link status */ + +/*********************************************************************//** + * Macro defines for PHY Status Register + **********************************************************************/ +#define EMAC_PHY_SR_REMOTE_FAULT (1<<6) /**< Remote Fault */ +#define EMAC_PHY_SR_JABBER (1<<5) /**< Jabber detect */ +#define EMAC_PHY_SR_AUTO_DONE (1<<4) /**< Auto Negotiation complete */ +#define EMAC_PHY_SR_LOOPBACK (1<<3) /**< Loop back status */ +#define EMAC_PHY_SR_DUP (1<<2) /**< Duplex status */ +#define EMAC_PHY_SR_SPEED (1<<1) /**< Speed status */ +#define EMAC_PHY_SR_LINK (1<<0) /**< Link Status */ + +#define EMAC_PHY_FULLD_100M 0x2100 /**< Full Duplex 100Mbit */ +#define EMAC_PHY_HALFD_100M 0x2000 /**< Half Duplex 100Mbit */ +#define EMAC_PHY_FULLD_10M 0x0100 /**< Full Duplex 10Mbit */ +#define EMAC_PHY_HALFD_10M 0x0000 /**< Half Duplex 10MBit */ +#define EMAC_PHY_AUTO_NEG 0x3000 /**< Select Auto Negotiation */ + +#define EMAC_DEF_ADR 0x0100 /**< Default PHY device address */ +#define EMAC_DP83848C_ID 0x20005C90 /**< PHY Identifier */ + +#define EMAC_PHY_SR_100_SPEED ((1<<14)|(1<<13)) +#define EMAC_PHY_SR_FULL_DUP ((1<<14)|(1<<12)) +#define EMAC_PHY_BMSR_LINK_STATUS (1<<2) /**< Link status */ + +#elif defined(IAR_LPC_1768) +/* KSZ8721BL PHY definition ------------------------------------------------------------ */ +/** PHY device reset time out definition */ +#define EMAC_PHY_RESP_TOUT 0x100000UL + +/* ENET Device Revision ID */ +#define EMAC_OLD_EMAC_MODULE_ID 0x39022000 /**< Rev. ID for first rev '-' */ + +/*********************************************************************//** + * Macro defines for KSZ8721BL PHY Registers + **********************************************************************/ +#define EMAC_PHY_REG_BMCR 0x00 /**< Basic Mode Control Register */ +#define EMAC_PHY_REG_BMSR 0x01 /**< Basic Mode Status Register */ +#define EMAC_PHY_REG_IDR1 0x02 /**< PHY Identifier 1 */ +#define EMAC_PHY_REG_IDR2 0x03 /**< PHY Identifier 2 */ +#define EMAC_PHY_REG_ANAR 0x04 /**< Auto-Negotiation Advertisement */ +#define EMAC_PHY_REG_ANLPAR 0x05 /**< Auto-Neg. Link Partner Abitily */ +#define EMAC_PHY_REG_ANER 0x06 /**< Auto-Neg. Expansion Register */ +#define EMAC_PHY_REG_ANNPTR 0x07 /**< Auto-Neg. Next Page TX */ +#define EMAC_PHY_REG_LPNPA 0x08 /**< Link Partner Next Page Ability */ +#define EMAC_PHY_REG_REC 0x15 /**< RXError Counter Register */ +#define EMAC_PHY_REG_ISC 0x1b /**< Interrupt Control/Status Register */ +#define EMAC_PHY_REG_100BASE 0x1f /**< 100BASE-TX PHY Control Register */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Control Register + **********************************************************************/ +#define EMAC_PHY_BMCR_RESET (1<<15) /**< Reset bit */ +#define EMAC_PHY_BMCR_LOOPBACK (1<<14) /**< Loop back */ +#define EMAC_PHY_BMCR_SPEED_SEL (1<<13) /**< Speed selection */ +#define EMAC_PHY_BMCR_AN (1<<12) /**< Auto Negotiation */ +#define EMAC_PHY_BMCR_POWERDOWN (1<<11) /**< Power down mode */ +#define EMAC_PHY_BMCR_ISOLATE (1<<10) /**< Isolate */ +#define EMAC_PHY_BMCR_RE_AN (1<<9) /**< Restart auto negotiation */ +#define EMAC_PHY_BMCR_DUPLEX (1<<8) /**< Duplex mode */ +#define EMAC_PHY_BMCR_COLLISION (1<<7) /**< Collision test */ +#define EMAC_PHY_BMCR_TXDIS (1<<0) /**< Disable transmit */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Status Register + **********************************************************************/ +#define EMAC_PHY_BMSR_100BE_T4 (1<<15) /**< 100 base T4 */ +#define EMAC_PHY_BMSR_100TX_FULL (1<<14) /**< 100 base full duplex */ +#define EMAC_PHY_BMSR_100TX_HALF (1<<13) /**< 100 base half duplex */ +#define EMAC_PHY_BMSR_10BE_FULL (1<<12) /**< 10 base T full duplex */ +#define EMAC_PHY_BMSR_10BE_HALF (1<<11) /**< 10 base T half duplex */ +#define EMAC_PHY_BMSR_NOPREAM (1<<6) /**< MF Preamable Supress */ +#define EMAC_PHY_BMSR_AUTO_DONE (1<<5) /**< Auto negotiation complete */ +#define EMAC_PHY_BMSR_REMOTE_FAULT (1<<4) /**< Remote fault */ +#define EMAC_PHY_BMSR_NO_AUTO (1<<3) /**< Auto Negotiation ability */ +#define EMAC_PHY_BMSR_LINK_STATUS (1<<2) /**< Link status */ +#define EMAC_PHY_BMSR_JABBER_DETECT (1<<1) /**< Jabber detect */ +#define EMAC_PHY_BMSR_EXTEND (1<<0) /**< Extended support */ + +/*********************************************************************//** + * Macro defines for PHY Identifier + **********************************************************************/ +/* PHY Identifier 1 bitmap definitions */ +#define EMAC_PHY_IDR1(n) (n & 0xFFFF) /**< PHY ID1 Number */ + +/* PHY Identifier 2 bitmap definitions */ +#define EMAC_PHY_IDR2(n) (n & 0xFFFF) /**< PHY ID2 Number */ + +/*********************************************************************//** + * Macro defines for Auto-Negotiation Advertisement + **********************************************************************/ +#define EMAC_PHY_AN_NEXTPAGE (1<<15) /**< Next page capable */ +#define EMAC_PHY_AN_REMOTE_FAULT (1<<13) /**< Remote Fault support */ +#define EMAC_PHY_AN_PAUSE (1<<10) /**< Pause support */ +#define EMAC_PHY_AN_100BASE_T4 (1<<9) /**< T4 capable */ +#define EMAC_PHY_AN_100BASE_TX_FD (1<<8) /**< TX with Full-duplex capable */ +#define EMAC_PHY_AN_100BASE_TX (1<<7) /**< TX capable */ +#define EMAC_PHY_AN_10BASE_T_FD (1<<6) /**< 10Mbps with full-duplex capable */ +#define EMAC_PHY_AN_10BASE_T (1<<5) /**< 10Mbps capable */ +#define EMAC_PHY_AN_FIELD(n) (n & 0x1F) /**< Selector Field */ + +#define EMAC_PHY_FULLD_100M 0x2100 /**< Full Duplex 100Mbit */ +#define EMAC_PHY_HALFD_100M 0x2000 /**< Half Duplex 100Mbit */ +#define EMAC_PHY_FULLD_10M 0x0100 /**< Full Duplex 10Mbit */ +#define EMAC_PHY_HALFD_10M 0x0000 /**< Half Duplex 10MBit */ +#define EMAC_PHY_AUTO_NEG 0x3000 /**< Select Auto Negotiation */ + +#define EMAC_PHY_SR_100_SPEED ((1<<14)|(1<<13)) +#define EMAC_PHY_SR_FULL_DUP ((1<<14)|(1<<12)) + +#define EMAC_DEF_ADR (0x01<<8) /**< Default PHY device address */ +#define EMAC_KSZ8721BL_ID ((0x22 << 16) | 0x1619 ) /**< PHY Identifier */ +#endif + +/** + * @} + */ + + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup EMAC_Public_Types EMAC Public Types + * @{ + */ + +/* Descriptor and status formats ---------------------------------------------- */ + +/** + * @brief RX Descriptor structure type definition + */ +typedef struct { + uint32_t Packet; /**< Receive Packet Descriptor */ + uint32_t Ctrl; /**< Receive Control Descriptor */ +} RX_Desc; + +/** + * @brief RX Status structure type definition + */ +typedef struct { + uint32_t Info; /**< Receive Information Status */ + uint32_t HashCRC; /**< Receive Hash CRC Status */ +} RX_Stat; + +/** + * @brief TX Descriptor structure type definition + */ +typedef struct { + uint32_t Packet; /**< Transmit Packet Descriptor */ + uint32_t Ctrl; /**< Transmit Control Descriptor */ +} TX_Desc; + +/** + * @brief TX Status structure type definition + */ +typedef struct { + uint32_t Info; /**< Transmit Information Status */ +} TX_Stat; + + +/** + * @brief TX Data Buffer structure definition + */ +typedef struct { + uint32_t ulDataLen; /**< Data length */ + uint32_t *pbDataBuf; /**< A word-align data pointer to data buffer */ +} EMAC_PACKETBUF_Type; + +/** + * @brief EMAC configuration structure definition + */ +typedef struct { + uint32_t Mode; /**< Supported EMAC PHY device speed, should be one of the following: + - EMAC_MODE_AUTO + - EMAC_MODE_10M_FULL + - EMAC_MODE_10M_HALF + - EMAC_MODE_100M_FULL + - EMAC_MODE_100M_HALF + */ + uint8_t *pbEMAC_Addr; /**< Pointer to EMAC Station address that contains 6-bytes + of MAC address, it must be sorted in order (bEMAC_Addr[0]..[5]) + */ +} EMAC_CFG_Type; + + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup EMAC_Public_Functions EMAC Public Functions + * @{ + */ +/* Init/DeInit EMAC peripheral */ +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct); +void EMAC_DeInit(void); + +/* PHY functions --------------*/ +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState); +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode); +int32_t EMAC_UpdatePHYStatus(void); + +/* Filter functions ----------*/ +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState); +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState); + +/* EMAC Packet Buffer functions */ +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct); +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct); + +/* EMAC Interrupt functions -------*/ +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState); +IntStatus EMAC_IntGetStatus(uint32_t ulIntType); + +/* EMAC Index functions -----------*/ +Bool EMAC_CheckReceiveIndex(void); +Bool EMAC_CheckTransmitIndex(void); +void EMAC_UpdateRxConsumeIndex(void); +void EMAC_UpdateTxProduceIndex(void); + +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType); +uint32_t EMAC_GetReceiveDataSize(void); +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_EMAC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h new file mode 100644 index 0000000000..5e5b8b87d6 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h @@ -0,0 +1,155 @@ +/********************************************************************** +* $Id$ lpc17xx_exti.h 2010-05-21 +*//** +* @file lpc17xx_exti.h +* @brief Contains all macro definitions and function prototypes +* support for External interrupt firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup EXTI EXTI (External Interrupt) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_EXTI_H_ +#define LPC17XX_EXTI_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EXTI_Private_Macros EXTI Private Macros + * @{ + */ +/*********************************************************************//** + * Macro defines for EXTI control register + **********************************************************************/ +#define EXTI_EINT0_BIT_MARK 0x01 +#define EXTI_EINT1_BIT_MARK 0x02 +#define EXTI_EINT2_BIT_MARK 0x04 +#define EXTI_EINT3_BIT_MARK 0x08 + +/** + * @} + */ + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EXTI_Public_Types EXTI Public Types + * @{ + */ + +/** + * @brief EXTI external interrupt line option + */ +typedef enum +{ + EXTI_EINT0, /*!< External interrupt 0, P2.10 */ + EXTI_EINT1, /*!< External interrupt 0, P2.11 */ + EXTI_EINT2, /*!< External interrupt 0, P2.12 */ + EXTI_EINT3 /*!< External interrupt 0, P2.13 */ +} EXTI_LINE_ENUM; + +/** + * @brief EXTI mode option + */ +typedef enum +{ + EXTI_MODE_LEVEL_SENSITIVE, /*!< Level sensitivity is selected */ + EXTI_MODE_EDGE_SENSITIVE /*!< Edge sensitivity is selected */ +} EXTI_MODE_ENUM; + +/** + * @brief EXTI polarity option + */ +typedef enum +{ + EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE, /*!< Low active or falling edge sensitive + depending on pin mode */ + EXTI_POLARITY_HIGH_ACTIVE_OR_RISING_EDGE /*!< High active or rising edge sensitive + depending on pin mode */ +} EXTI_POLARITY_ENUM; + +/** + * @brief EXTI Initialize structure + */ +typedef struct +{ + EXTI_LINE_ENUM EXTI_Line; /*!